transformer相关的代码,参考了视频 手搓Transformer第六集:整合篇_哔哩哔哩_bilibili
多头注意力------masked
多头注意力机制:
目的:通过输入多组WK,WQ,WV来得到多个K Q V,从而实现从不同纬度,不同角度提取出的上下文信息,最终通过一个concat进行拼接,得到最终的上下文矩阵,让模型能从不同角度理解输入序列
通俗理解:多个专家会诊
想象你生病了去医院:
单头注意力:只看一个专家医生。这位专家可能擅长内科,但对外科不太了解。他的诊断可能不够全面。
多头注意力:组织一个专家会诊团队:
内科专家:关注你的体温、血压(整体状况)
外科专家:关注你的伤口、疼痛位置(局部问题)
影像专家:关注CT、X光片(深层结构)
化验专家:关注血液指标(微观数据)
每个专家从不同角度分析你的病情,最后综合所有专家的意见,得出更全面、更准确的诊断。
多头注意力 = 多个专家从不同角度同时看问题
多头注意力就是把自注意力复制多份并行运行,每份从不同角度分析输入,
最后综合各方观点,让模型对上下文的理解更全面、更细腻——就像请多个专
家会诊,而不是只听一个医生的意见。
计算:
多头注意力是多个并行的注意力
其实就是对于输入x矩阵
对于w0,用于把多头的拼接转换为融合,把纬度拉回方便后续网络能用。
注意:之前的误解
假设一个输入
X为3 * 512纬度的
有8个头
那么计算过程:
残差连接和层归一化
残差连接:
经过自注意力进制后,得到了需要关于这样词语的新的含义,但是新的含义可能会淹没原来词的意思,所以需要做一次残差处理,确保原来的词义仍然保留,仅仅是做了丰富。
类比:
相当于做笔记一样,学习过程中,会对原来的知识点有更进一步的理解,残差连接让做笔记过程中,新的理解只是以批注的形式存在,而不是替代原来的含义
层归一化:
LN层:对同一个样本的输入对应的输出,会有多个值,对这些值进行归一化操作,
y和bei ta通过反向传播进行调整的
其实的操作就是 :
layerNorm(x) = (x-均值) / 方差 *gamma + beta
层归一化的计算:
假设一个向量为x
- x = 词1: [0.5, 1.2, -0.3, 0.8]
- 计算标准差
注意:归一化时,是每个词向量内部求均值,求方差,然后最终 0 用公式做计算
feed-forward
也叫做MLP
全连接层,在模型中引入非线性,使得模型可以模拟如何一种曲线
Feed Forward 层 = 对每个 token 单独做 “特征提纯 / 非线性变换”
- 不跟别的 token 交互
- 只强化、提纯当前 token 自己的信息
就是说每次词(token)单调处理,让这个词自己思考,不与其他词交互
交叉注意力
Q:解码器输入
K:编码器输出
V:编码器输出
这里面的意思是,
q来自解码器(需要乘wq)得到Q
kv来自编码器(需要乘wk,wv)得到K,V
然后再用这些东西做计算
masked:
训练时,mask加入到的是
QKT/根号dk后面,加入的都是负无穷
masked实现实际是通过让不想被看到的词attention-scroe=0(单个元素)
mask是训练时为了让并行计算模拟串行生成而设计的"作弊防止器",推理时串行生成自然满足因果性。
transformer架构
训练过程:
假设做的是机器翻译任务: 我 是 一个 学生 ----》 i am a student
首先把 我是一个学生 转换为词向量输入编码器,编码器给出一个K和V
然后把 i am a student 作为输入全部传给解码器(注意:传给解码器的正确的标签,而非是解码器的输出),然后训练时使用到时masked的多头注意力机制,会在训练时,只让模型看到左边的label,而不能看正确答案,然后得到输出,计算输出和正确答案的loss,然后进行反向传递进而更新编码器和解码器的参数
推理过程:
区别:
训练过程是并行的
推理过程是串行的
Transformer每层输入输出理解!!!
用来加深对transformer架构的理解
0.分词层
输入一句话,然后分词层把他转换为一个一个的token,然后查询词表,最终得到一个id(索引)
,然后把所有输入到token词嵌入层中
1.token词嵌入层
输入:一个词id,也可以是一句话(呢就是一堆的词id)
输出:这个词在查询表中对应词向量(512纬度),(如果是一句话,呢就输出一个类似矩阵)
2.postional编码层
输入:输入的就是词向量矩阵的形状
有多少句话,这句话有多少个词,每个词的纬度
输出:输出的是对应形状的向量序列
3.总的词嵌入层
输入:一句话
输出:词向量矩阵
这个词向量矩阵 = 词义矩阵 + 位置信息矩阵
把这个句子当做x,输入到多头注意力机制中
4.多头注意力机制层
输入:词向量矩阵x
输出:词向量矩阵z,这个z包含了多角度的上下文信息,句法信息
5.全连接层
输入:是经过注意力+残差连接+归一化后的向量,三维的,多层堆叠的二维矩阵
输出:同形状,提纯后的向量
6.层归一化和残差连接
输入:3纬向量
输出:同形状归一化后的结果
层归一化:对每个词向量做归一化,即同一个句子中的每个512纬词向量做归一化
多句话,每句话多个字,每个字512纬
7.总的编码器层
输入:多句话
输出:对应的3纬张量,包含了位置信息,句法信息的词向量二维数组
8.mased的所有注意力层
输入:
输出:
9.交叉注意力层
输入:q(来自解码器的输出),k(来做编码器输出),v(来自编码器输出)
输出:新的上下文矩阵z
10.Linear层
输入:
输出:
11.总的解码器层
输入:
输出:
12.编码器和解码器数据交互、
总体理解如何实现机器翻译
训练时:给编码层输入一个 我 爱 你
给解码器输入一个 i love you
然后让模型学习和预测,预测出一个英文字母,然后和答案做loss
使用梯度下降一直给模型调参和纠正错误,一步一步的学习,最终实现效果
类似于让模型学骑自行车,旁边有人一直扶着他并给他纠错,最终学习下实现可以单独骑自行车的效果