目录
基本结构
1.输入部分包含:
2. 编码器部分:
2.1 掩码张量
学习并实现了生成向后遮掩的掩码张量函数: subsequent_mask
2.2 注意力机制
2.3 多头注意力机制
3. 解码器部分:
4. 输出部分包含:
- 三类应用
- 机器翻译类应用-Encoder和Decoder共同使用
- 只使用Encoder端-文本分类BERT和图片分类VIT
- 只使用Decoder端-生成类模型
笔记参考b站视频:2.3.1掩码张量-part1_哔哩哔哩_bilibili
基本结构
Transformer总体架构可分为4个部分:
- 输入部分
- -输出部分
- -编码器部分
- -解码器部分
1.输入部分包含:
- 原文本嵌入层(Input embedding)及其位置编码(position encoding)
- 目标文本嵌入层及其位置编码器
- 文本嵌入层的作用:
无论是源文本嵌入还是目标文本嵌入,都是为了将文本中词汇的数字表示(word to index)转变为向量(eg. one-hot,但这里不是)表示,希望在这样的高维空间捕捉词汇间的关系。
- 位置编码器的作用:
因为在Transformer的编码器结构中,并没有针对词汇位置信息的处理,因此需要在Embedding层后加入位置编码器,将词汇位置不同可能会产生不同语义的信息加入到词嵌入张量中,以弥补位置信息的缺失。
2. 编码器部分:
- 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成
- 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
- 第二个子层连接结构包括一个前馈全连接子层(Linear)和规范化层以及一个残差连接
2.1 掩码张量
什么事掩码张量:
掩代表遮掩,码就是我们张量中的数值,它的尺寸不定,里面一般只有1和0的元素,代表位置被遮掩或者不被遮掩,至于是0位置被遮掩还是1位置被遮掩可以自定义,因此它的作用就是让另外一个张量中的一些数值被遮掩,也可以说被替换,它的表现形式是一个张量。
掩码张量的作用:
在transformer中,掩码张量的主要作用在应用attention(将在下一小节讲解)时,有一些生成的attention张量中的值计算有可能已知了未来信息而得到的,未来信息被看到是因为训练时会把整个输出结果都一次性进行Embedding,但是理论上解码器的的输出却不是一次就能产生最终结果的,而是一次次通过上一次结果综合得出的,因此,未来的信息可能被提前利用。所以,我们会进行遮掩。关于解码器的有关知识将在后面的章节中讲解。
学习并实现了生成向后遮掩的掩码张量函数: subsequent_mask
它的输入是size,代表掩码张量的大小.
它的输出是一个最后两维形成1方阵的下三角阵.
最后对生成的掩码张量进行了可视化分析,更深一步理解了它的用途.
# np.triu 演示
>>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], k=-1) #k=-1表示主对角线(1,5,9)的元素往下移动一个后下放的元素全为0
array([[ 1, 2, 3],[ 4, 5, 6],[ 0, 8, 9],[ 0, 0, 12]])>>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], k=0) #k=0,表示主对角线元素及其往下的元素都为0
array([[1, 2, 3],[0, 5, 6],[0, 0, 9],[0, 0, 0]])>>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], k=1) #k=1,表示主对角线元素往上移一步后以下的元素都为0
array([[0, 2, 3],[0, 0, 6],[0, 0, 0],[0, 0, 0]])
2.2 注意力机制
- 什么是注意力:
我们观察事物时,之所以能够快速判断―种事物(当然允许判断是错误的),是因为我们大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断,而并非是从头到尾的观察一遍事物后,才能有判断结果.正是基于这样的理论,就产生了注意力机制。
- 我们这里使用的注意力的计算规则:
- Q,K,V的比喻解释:
假如我们有一个问题:给出一段文本,使用一些关键词对它进行描述!
为了方便统一正确答案,这道题可能预先已经给大家写出了一些关键词作为提示。其中这些给出的提示就可以看作是key,而整个的文本信息就相当于是query,value的含义则更抽象,可以比作你看到这段文本信息后,脑子里浮现的答案信息,,这里我们又假设大家最开始都不是很聪明,第一次看到这段文本后脑子里基本上浮现的信息就只有提示这些信息,因此key与value基本是相同的,但是随着我们对这个问题的深入理解,通过我们的思考脑子里想起来的东西原来越多,并且能够开始对我们query也就是这段文本,提取关键信息进行表示.这就是注意力作用的过程,通过这个过1我们最终脑子里的value发生了变化,
根据提示key生成了query的关键词表示方法,也就是另外一种特征表示方法.
刚刚我们说到key和value一般情况下默认是相同,与query是不同的,这种是我们一般的注意力输入形式,但有一种特殊情况,就是我们query与key和value相同,这种情况我们称为自注意力机制,就如同我们的刚刚的例子。使用一般注意力机制,是使用不同于给定文本的关键词表示它.而自注意力机制,需要用给定文本自身来表达自己,也就是说你需要从给定文本中抽取关键词来表述它,相当于对文本自身的一次特征提取。
简单的:
- Q:我们要查询的信息,eg, 高领男士毛衣(查询和别人的关系)
- K:正在被查询的信息,eg,高龄,男士,毛衣(身份证)
- v:被查询的内容(特征表示)
或者理解:
- Q是一段准备被概括的文本;
- K是给出的提示;
- V是大脑中的对提示K的延伸.。
当Q=K=V时,称作自注意力机制。(给你一篇文章提主旨,你说需要给个参考,结果“没参考”,即给你的参考是和原文一模一样的文章)
- 什么是注意力机制:
注意力机制是注意力计算规则能够应用的深度学习网络的载体,除了注意力计算规则外,还包括一些必要的全连接层以及相关张量处理,使其与应用网络融为一体。使用自注意力计算规则的注意力机制称为自注意力机制。
- 注意力机制在网络中实现的图形表示:
- 注意力计算规则的函数: attention
- 它的输入就是Q,K,V以及mask和dropout, mask用于掩码, dropout用于随机置0。
- 它的输出有两个,query的注意力表示(词嵌入的维度)以及注意力张量。
mask-fill演示:
2.3 多头注意力机制
- 什么是多头注意力机制:
从多头注意力的结构图中,貌似这个所谓的多个头就是指多组线性变换层,其实并不是,我只有使用了一组线性变化层,即三个变换张量对Q,K,V分别进行线性变换,这些变换不会改变原有张量的尺寸,因此每个变换矩阵都是方阵,得到输出结果后,多头的作用才开始显现,每个头开始从词义层面分割输出的张量,也就是每个头都想获得一组Q,K,v进行注意力机制的计算,但是句子中的每个词的表示只获得一部分,也就是只分割了最后一维的词嵌入向量.这就是所谓的多头,将每个头的获得的输入送到注意力机制中,就形成多头注意力机制。
- 多头注意力机制结构图:
- 多头注意力机制的作用:
这种结构设计能让每个注意力机制去优化每个词汇的不同特征部分,从而均衡同一种注意力机制可能产生的偏差,让词义拥有来自更多元的表达,实验表明可以从而提升模型效果。
3. 解码器部分:
- 由N个解码器层堆叠而成 每个解码器层由三个子层连接结构组成
- 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
- 第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接
- 第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接
4. 输出部分包含:
- 线性层(得到output size)
- softmax处理器(找到最大概率)
- 就是重新组合各大输入向量,得到更完美的特征。
参考:Vision Transformer 超详细解读 (原理分析+代码解读) (一) - 知乎 (zhihu.com)
输入序列x1,x2,x3,x4,对x1~x4提取特征。探究x1,x2,x3,x4之间的关系,利用3个辅助向量Q,K,V。
每一个token对应3个向量Q,K,V;
Q:查一查自己与别人的关系
K:自己是被查对象,身份证的key
V:特征表达(x1用v1表达,后面与x1则没关系了,用v1代替)
通过这个操作得到一个权重项,再把特征进行重新组合。