你好。

只是一个探索编程广阔世界的学生,对AI着迷,这点燃了我的旅程。目前在学习大语言模型(LLM)。是一个安静的学习者,喜欢技术讨论。

LLM NOTE CHAPTER 03

第三章:编码注意力机制 代码仓库: rasbt/LLMs-from-scratch 本章探讨自注意力机制的基本原理及其在自然语言处理中的实现,从简单注意力逐步推进到多头注意力。我们将通过Python代码一步步实现这些概念。 1. 通过自注意力关注输入的不同部分 自注意力机制允许模型根据输入序列中各部分的关联性动态调整关注焦点。以下是一个简易实现的步骤分解。 1.1 简单注意力机制 简单注意力机制通过三个步骤计算上下文向量:输入嵌入到注意力得分,注意力得分到注意力权重,再到上下文向量。 步骤 1:输入嵌入 -> ω (注意力得分) 目标:通过点积计算查询(Query)与每个输入token的相关性得分(ω)。 实现: 输入是一个嵌入矩阵inputs,形状为(num_tokens, d_in)。 对每个token,计算其与查询向量的点积。 方法: 手动实现:使用for循环,计算torch.dot(inputs[i], query)。 示例代码(假设query已定义): omega = torch.zeros(num_tokens) for i in range(num_tokens): omega[i] = torch.dot(inputs[i], query) 步骤 2:ω (注意力得分) -> α (注意力权重) 目标:将注意力得分归一化,使其和为1,得到注意力权重(α)。 目的:防止数值过大,提高数值稳定性。 实现: 手动计算:alpha = omega / omega.sum()。 推荐方法:使用torch.softmax(omega, dim=0)自动归一化。 代码: attn_weights = torch.softmax(omega, dim=0) 步骤 3:α (注意力权重) -> z (上下文向量) 目标:根据注意力权重对输入token进行加权求和,生成上下文向量(z)。 实现: 手动实现:使用for循环计算加权和。 示例代码: context_vec = torch.zeros(d_in) for i in range(num_tokens): context_vec += attn_weights[i] * inputs[i] 1.2 为所有输入token计算注意力权重 为了提高效率,我们可以一次性计算所有token的注意力权重,避免逐个计算。 ...

三月 25, 2025 · 3 分钟

LLM 日记第二章

数据准备阶段流程解析 代码仓库: rasbt/LLMs-from-scratch 本章节主要讲解了数据准备阶段的完整流程: 原始文本 → token → token ID → 向量 以下将逐步拆解每个阶段的核心内容。 1. 原始文本 → token 阶段 描述 在这一阶段,通过正则表达式将原始文本分割为 token(词或符号)。随后,使用 set 去重并通过 sorted() 排序,构建完整的词汇列表。 2. token → token ID 阶段 描述 通过 enumerate 结合字典推导式生成词表: vocab = {token: integer for integer, token in enumerate(all_words)} 注意事项 手动构建词表时,通常需要加入特殊 token,例如: <|unk|>:表示不在词表中的未知词。 <|endoftext|>:标记文本结束。 这些特殊 token 用于避免模型在遇到词表外的 OOV(out-of-vocabulary)token 时出错。 而像 BPE(Byte Pair Encoding) 这样的分词算法则不需要 <|unk|>,因为它会将不认识的词拆分为更小的子词单位,确保所有内容都能映射到词表中。 2.1 BPE 简介 描述 BPE 是一种子词级别的分词算法。其核心思想是将不认识的 token 拆分为更小、更常见的子 token,从而全部映射到词表中。在项目中,我们通过以下代码使用 GPT-2 的 BPE 分词器: tokenizer = tiktoken.get_encoding("gpt2") 这里的 gpt2 是基于 BPE 算法构建的分词器。 ...

三月 23, 2025 · 2 分钟