LLM学习笔记
注意力机制
sequence to sequence (seq2seq)输入N个向量,输出任意可能数量的向量(由机器决定);如果输出N个向量的任务就叫做Sequence Labeling
李沐课程讲义:https://zh-v2.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.html
在注意力机制的背景下,自主性提示被称为查询(query)。 给定任何查询,注意力机制通过注意力汇聚(attention pooling) 将选择引导至感官输入(sensory inputs,例如中间特征表示)。 在注意力机制中,这些感官输入被称为值(value)。 更通俗的解释,每个值都与一个键(key)配对, 这可以想象为感官输入的非自主提示。 如 图10.1.3所示,可以通过设计注意力汇聚的方式, 便于给定的查询(自主性提示)与键(非自主性提示)进行匹配, 这将引导得出最匹配的值(感官输入)。
注意力分数是衡量 query 和 key 之间相似度的值。它表示在注意力机制中,模型应该“关注”哪些部分的信息。注意力分数越高,表示 query 和 key 之间的相关性越强。
注意力权重是注意力分数经过 softmax 函数归一化后的结果。softmax 将分数转换为概率分布,确保所有权重的总和为 1。注意力权重决定了每个 key 对最终输出的贡献程度。
两种常见的注意力分数计算方法
使用单层 MLP(多层感知机) (查询和键是不同长度的矢量时)
- 将 query 和 key 拼接起来,输入到一个单隐藏层的 MLP 中。
- MLP 输出一个标量值,作为 query 和 key 的注意力分数。
- 这种方法可以捕捉 query 和 key 之间的非线性关系
直接计算内积 (查询和键具有相同的长度)
- 直接计算 query 和 key 的内积(点积),作为注意力分数。
- 这种方法假设 query 和 key 在同一个向量空间中,内积越大表示相似度越高。
- 内积计算简单高效,常用于 Transformer 等模型中。
自注意力机制
有了注意力机制之后,我们将词元序列输入注意力池化中, 以便同一组词元同时充当查询 query、键key和值value(而将a变为q k v则需要Wq Wk Wv矩阵进行变换)。 具体来说,每个查询都会关注所有的键-值对并生成一个注意力输出。 由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention)
下图:首先使用q2和ki计算注意力分数(dot product点积或者加性),接着可以对注意力分数进行softmax归一化,得到α'。通过注意力权重α'和值向量vi进行加权求和,得到输出向量b2。表示模型在生成第 2 个位置的输出时,对所有输入位置的信息的加权整合。
只有Wq Wk Wv 未知,需要通过训练数据计算
多头自注意力机制(Multi-head Self-attention)
- 多头机制是指并行地使用多个自注意力机制(称为“头”),每个头学习不同的表示子空间。
- 不同的头可以关注输入序列中不同的部分,例如一个头关注局部信息,另一个头关注全局信息。
- 通过并行计算多个注意力头,模型可以学习到更丰富的特征表示。
得到b(i,1)和b(i,2)再进行矩阵连接传入到下一层。
位置编码 positional encoding
在处理词元序列时,循环神经网络是逐个的重复地处理词元的, 而自注意力则因为并行计算而放弃了顺序操作(对所有的输入操作,从而位置信息不重要了)。 为了使用序列的顺序信息,通过在输入表示中添加 位置编码(positional encoding)来注入绝对的或相对的位置信息。
自注意力机制失去了位置信息,如果位置信息比较重要,可以加入位置信息,只需要为每个位置添加一个位置向量e^i,输入变为:
在图像识别中,训练资料较少时CNN效果比较好,因为采用接受域,相较于全局计算的自注意力训练量较大;训练资料较大时自注意力效果更好
Transformer
基于编码器-解码器架构来处理序列对,纯基于self-attention的(没有RNN的)
Encoder:输入一个vector sequence,输出另外一个vector sequence
residual 残差(原输入加到输出上)
不能用Batch Norm 要用Layer Norm。
Batch Norm:对不同样本的同一维度特征进行正则化 ,不适合序列长度会变得NLP应用
Layter Norm:对同一样本的不同维度特征进行正则化
残差网络
- 残差网络(避免梯度消失w3(w2(w1x+b1)+b2)+b3,如果 w1,w2,w3 特别小,0.000000……1,x 就没了,所以改为【w3(w2(w1x+b1)+b2)+b3+x】)
- x1作为残差结构的直连向量,直接和 z1 相加,之后进行 Layer Norm 操作,得到浅粉色向量 z1,z1 经过前馈神经网络(Feed Forward)层,经过残差结构与自身z1相加,之后经过 LN 层,得到一个输出向量 r1;
- Add & Norm 就是 Residual残差网络和标准化
- 残差结构的作用:避免出现梯度消失的情况
- Layer Norm 的作用:为了保证数据特征分布的稳定性,并且可以加速模型的收敛
Decoder
Auto-Aggressive(自回归)
输入时加一个特殊的标志BEGIN符号。
V 是 中文词汇表,3000常用汉字,根绝Encoder中KQ输出的softmax函数的概率值,选择分数最高的对应汉字
Decoder接着会把自己的输出当做下一个输入。
Decoder中的Masked,即在算bi时,不考虑i之后的aj。这样更接近于decoder的运作方式。(在解码时候是a1 a2……一个一个产生的,要计算b2时,没有a3 a4)
Decoder如何决定输出序列的长度?
用特殊符号END表示"断"。让机器产生END的概率最大时表示结束。
AT VS NAT
Non-Auto-Aggressive(非自回归)
不依赖于之前生成的步骤,所有步骤可以并行生成。
NAT会给多个BEGIN,一次性生成完成完整的句子(注意位置嵌入的作用)。要由特殊方法判断终止。
NAT可以并行化,可以控制输出长度(在语音中可以据此控制说话速度)。但NAT质量通常不如AT。
- 自回归模型:
- 文本生成(如 GPT)、对话系统、长文本翻译。
- 非自回归模型:
- 实时翻译、语音合成、图像生成。
Decoder架构相较于Encoder就加了一块Cross attention模块。
Decoder中间的 Cross attention (交叉注意力机制)三个input,K和V来自于Encoder,Q来自于Decoder
如下图 Cross attention :可以理解为 Decoder 产生的Q 查询 从Encoder KV 键值对 里查询信息
How to train?
每产生一个字就是从几千个字中进行的分类问题。训练时希望所有的字(含END)的交叉熵 之和(cross entropy)最小。
训练的时候有正确答案ground truth
测试的时候没有正确答案
训练和测试不一致(Exposure Bias):
Exposure Bias 的定义
- 训练阶段:
- 自回归模型在训练时,通常使用 Teacher Forcing 方法,即每一步生成时,模型的输入是真实的上一时刻的目标词(Ground Truth)。
- 例如,生成句子 "I love you" 时,模型在生成 "love" 时,输入是真实的 "I"。
- 推理阶段:
- 在推理时,模型没有真实的目标词作为输入,只能使用自己生成的上一时刻的词作为输入。
- 例如,生成句子 "I love you" 时,模型在生成 "love" 时,输入是自己生成的 "I"。
- 问题:
- 如果模型在生成过程中出现错误(如生成一个不准确的词),这个错误会作为输入传递给下一步,导致错误累积,最终影响生成结果。
在训练的时候,给 Decoder 一些错误的信息,反倒会提升模型精确度。
这个方法叫 “Scheduled Sampling” 计划采样
- 在训练过程中,逐渐从使用真实数据(Ground Truth)过渡到使用模型生成的数据作为输入。
- 例如,训练初期使用 100% 的真实数据,后期逐渐增加使用模型生成数据的比例。