GPT模型

张开发
2026/5/17 23:40:28 15 分钟阅读
GPT模型
一、定义GPT (Generative Pre-trained Transformer) 生成式预训练只用作 Transformer 架构的解码器 Decoder堆叠多层二、GPT机制1. 掩码多头注意力Masked Multi-Head Attention掩码多头注意力多头注意力一个上三角掩码矩阵因果掩码因果掩码禁止模型看到 “未来” 的词只能看 “过去” 和 “当前”。因果 只能由过去决定未来因果掩码矩阵左下三角全 0可见右上三角全 -∞不可见比如假设序列长度 4词[我爱学习]行 当前词列 能看到的词0 能看见-∞ 看不见被遮住第 1 行第 1 个词我[0, −∞, −∞, −∞]只能看第 1 个词第 2 行第 2 个词爱[0, 0, −∞, −∞] 能看第 1、2 个词第 3 行第 3 个词学[0, 0, 0, −∞] 能看第 1、2、3 个词第 4 行第 4 个词习[0, 0, 0, 0] 能看全部前面三、GPT预训练任务1.自回归语言模型Autoregressive Language ModelARLM①定义自回归 自己生成的词会变成下一次的输入即用已经生成的内容去预测下一个内容②特点从左到右单向生成每一步只看左边不看右边自己生成的词会喂给自己 → 所以叫 “自回归”必须靠因果掩码Causal Mask来保证看不到未来③搜索策略beam search自回归生成中每一步保留概率最高的前 k 个候选序列kbeam width持续扩展直到结束最终选择全局概率最大的完整序列。Beam Search 属于贪心类算法1.核心符号beam width / beam size k每一步保留 k 条候选每一步不只选 1 个词而是保留 k 条序列目标最大化 整句概率而非每一步最优2.算法步骤初始时刻只有输入 input。对当前k 条候选序列分别预测下一个 token得到 k×V 个新序列。对所有 k×V 个序列按概率排序只保留概率最高的 k 条。重复步骤 2–3直到生成eos 结束符。从 k 条完整序列中选总概率最大的一条作为输出。直观理解k2 第1步 [A, B] # 保留 top2 第2步 A→A, A→B, A→C B→A, B→B, B→C 全部排序 → 再保留 top2 → 比如 [A→B, B→A] 第3步 A→B→... B→A→... 再保留 top2 ... 最后选整条最好的。四、GPT的输入Token Embedding词向量Positional Encoding位置向量编码器的输入[CLS]的向量 ————注意编码器的输入在一轮多头掩码注意力之后其中Input EmbeddingToken Embedding Positional Encoding五、GPT的预训练流程1.分词GPT 系列统一使用Byte-Pair Encoding (BPE字节对编码)它是一种子词分词算法。核心特点不是按单词拆分也不是按单个字符拆分而是从语料中学习把高频出现的字符组合成固定子词tokenGPT分词流程预处理把文本转成 UTF-8 字节再映射成可见字符比如空格变成Ġ递归分词用预训练好的 BPE 词表从长到短匹配子词输出 token ID每个子词对应一个 ID送入模型例如输入文本我喜欢ChatGPT分词结果示意我喜欢ChatGPT每个 token 对应一个 ID比如我1234喜欢5678Chat9012GPT34562.多头掩码自注意力1. 输入向量 Embeedding 经过3个分别的全连接线性变换得到Query(Q)、Key(K)、Value(V)2.计算多头注意力把 Q/K/V 分成多个头每个头独立计算注意力分数注意最后拼接起来3.注意力分数加上掩码masked_scores scores M4.执行Softmaxattention_weights Softmax (masked_scores)5.加权求和并拼接多头输出的向量维度和输入保持一致还是7683.Add Norm残差连接与层归一化第1次1.Add残差连接把「多头注意力的输出」和「原始输入向量」直接相加2.Norm层归一化对相加后的结果做层归一化稳定分布结果输出的向量维度和输入保持一致还是768作为下一层的输入4.编码器传入与自传入编码器对输入序列编码后得到的向量比如Bert的[CLS]的向量会被直接作为 Key 和 Value喂给解码器的交叉注意力层。解码器自己上一层的输出作为 Query进入交叉注意力层。5.多头掩码自注意力解码器自己上一层的输出作为 Query 并分别与编码器的 Key 相乘之后经过 Softmax 得到注意力分数注意力分数与对应 Value 相乘得到输出结果输出的向量维度和输入保持一致还是768作为下一层的输入6.前馈神经网络Feed Forward这是一个两层的全连接网络 LinearBERT 里的标准结构是第一层Linear(768 → 3072)然后加激活函数GELU第二层Linear(3072 → 768)恢复维度作用对每个位置的向量做非线性变换提取更复杂的语义特征7.Add Norm残差连接与层归一化第2次Add把「前馈网络的输出」和「前馈网络的输入」直接相加Norm对相加后的结果做层归一化稳定分布结果输出的向量维度和输入保持一致还是768传给下一层8. 全连接输入输出每个位置的隐向量维度是d_model比如 50257作用把隐向量的维度映射到和词表大小Vocab Size相同的维度上。本质给每个词表中的 token 打一个 “原始分数”logits表示模型认为这个位置接下来出现该 token 的 “原始置信度”。9. Softmax 层输入Linear 层输出的 logits每个 token 的原始分数。作用把这些分数转换成概率分布所有 token 的概率加起来等于 1。输出每个 token 的出现概率也就是图里的Output Probabilities。10.查词表输出

更多文章