补全llm知识体系的地基:Transformer

Transformer模型结构:

示例:输入“我爱你”,输出“I love you”
第一步:分词,将序列变为一个个token组成的向量,形状:[seq_len,]。本步涉及tokenizer相关技术
 

 第二步:input embedding,将分词结果中的每一个token,编码成一个固定维数的embedding。输出维度:[seq_len, embedding_len]

第三步:positional encoding,对于embedding矩阵,按照相对位置和在embedding_len中的位置,生成一个由正余弦函数表示的位置编码。正余弦函数可以使得在固定offset下,不同位置的位置编码是线性关系,便于学习不同token间的相对位置(若删去该部分,则Transformer将无法区分输入各token间的位置关系,相当于作为一个无序的set进行处理)输出维度:[seq_len, embedding_len](输入和生成位置编码维度完全一致)

 第四步:Multi-Head Attention
1. multi head:一种并行化策略,将输入的[seq_len, embedding_len]在embedding维度上切分为[seq_len, embedding_len / head],在完成注意力的计算之后,再重新concate回来,有利于并行和模型捕捉长距离特性
2. QKV:

  • Q(query):输入序列,尺寸为[seq_len, embedding_len],通常由上一步输入乘以一个WeightQ矩阵得到。(实际操作中,可能是过一个线性层)
  • K(Key):键值,描述了要学习的映射的输入,通常由上一步输入乘以一个WeightK矩阵得到。和query具有相同的宽度,可以有不同的序列长度。
  • V(Value):值,描述了要学习的映射的输出,通常由上一步输入乘以一个WeightK矩阵得到。和key具有完全相同的序列长度,可以有不同的宽度
  • 如果QKV都是同一个矩阵,就是自注意力机制(self-Attention)

3. 缩放点积注意力:即矩阵形式的加权平均,权是Q、K矩阵中两行的相似度。公式:

  • QKT: 尺寸为[seq_len, seq_len],表示不同token编码后的相似度
  • scale:除以编码长度的开方,如果QK的每一行(即embedding结果)都符合0均值1方差的正态分布,那除以编码长度的开方能使得由相互独立的QK内积的结果仍符合0均值1方差的正态分布,避免其数值过大,落在softmax较为平缓、梯度消失的数值区间内
  • 注意,该softmax为对每行进行的
  • mask:在训练时,mask掉后续token对此前token的Attention,以符合生成规律。具体来说,设为一个非常大的负数
    •   所以,在生成时,最后一个token对应的hidden_states,就是包含了前述所有token语义的,可以作为语义的一个简单embedding最后输出的尺寸:[seq_len_q, embedding_len_v]

 

4. 拼接:每个模块输出了一个[seq_len, embedding_len / head]的矩阵,是包含了上下文信息的embedding。再concate成[seq_len, embedding_len]。拼接之后通过一个线性层,将信息进行融合,尺寸不变。

5. Add and Norm:残差连接,解决梯度消失问题。之后进行归一化(LayerNorm、BatchNorm、RMSNorm),确保均值方差稳定在0、1,提高泛化能力

6. FFN:线性+ReLU+线性,隐藏层2048维(即:权重矩阵[embedding_len, 2048(hidden_size))

7. 解码器:

  • 输入时,解码器的第一个字符是表示句子开始的特殊字符 BOS
  • 第二个MHA:使用编码器的KV和解码器的Q
  • 解码器输出通过线性层和softmax映射到概率分布,线性层输出维数为词表大小,即[seq_len, voca_size],表明每个位置上为某个词的概率

训练过程:

  • 编码器输入:我爱你
  • 解码器输入:BOS I love you
  • label:I love you EOS
  • 可能的输出(未训练好)I love it EOS,和label计算loss
  • mask:注意解码器的因果mask,保证在生成该词时,其注意力不会放在本词上(右移一位的效果)
    •   例如,输入BOS I love you,希望输出是I love you EOS,mask掉之后,在生成第三个词you时,看不到位于输入序列中第四个的“标准答案 you”

推理过程:

  • 编码器输入“我爱你”(一次即可)
  • 解码器输入 BOS,使得所有结果右移一位
  • 解码器输出 输出序列中的一个词(BOS -> I, [BOS] I -> I love,以此类推),输出中不含BOS而是包含一个新词
    • Transformer解码器输入序列多长,输出序列就多长
  • 在输出的头部加上BOS,总长度延长一位,重复前两步,直到输出EOS为止
  • mask:推理时没有后续标准答案,但也要开mask
    • 保持和训练设置一致
    • 保持每生成一个token时,在下一轮预测中,不会计算之前的token和上一轮新生成token的Attention,这样,本轮预测的“上一轮新生成token”就能保持完全不变

 Padding:

  • 在batch时,要把短句子补到最长句子的长度,就是用padding标记补齐
  • 不需要计算padding相关的注意力
  • bert encoder only一般right padding(因为要获取[cls] token),大模型decoder-only更多left padding保持语句连续性

 Encoder-only、Encoder-Decoder和Decoder-only

  • Bert等是Encoder-only,擅长文本分析(也需要下游文本微调)
  • ChatGLM和Transformer原作都是Encoder-Decoder
  • LLaMa等大部分大模型是Decoder-only,擅长文本生成
    • 只使用了解码器部分,并且删去了encoder-decoder的cross attention
    • 预训练过程是无监督的,即没有label,只学习如何进行next token prediction
    • 利于利用非结构化文本和大规模并行、支持复用KV Cache
    • 输入作为解码器输入的开头

 

 from https://www.zhihu.com/question/588325646/answer/3357252612)

 

 

 (from https://www.zhihu.com/question/588325646/answer/2940298964 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值