西宁网站建设费用,应用商店aso,阿里云做的网站,专业郑州做网站的公司前言
前一篇我们一起读了Transformer的论文《Attention Is All You Need》#xff0c;不知道大家是否真的理解这个传说中的神#xff08;反正俺是没有~#xff09;
这两天我又看了一些视频讲解#xff0c;感谢各位大佬的解读#xff0c;让我通透了不少。
这篇文章就和…
前言
前一篇我们一起读了Transformer的论文《Attention Is All You Need》不知道大家是否真的理解这个传说中的神反正俺是没有~
这两天我又看了一些视频讲解感谢各位大佬的解读让我通透了不少。
这篇文章就和大家分享一下我的理解 前期回顾 【Transformer系列1】encoder编码器和decoder解码器 【Transformer系列2】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解 【Transformer系列3】 《Attention Is All You Need》论文超详细解读翻译精读 目录
前言
一、Transformer 整体结构
二、编码器Encoder 2.1输入
2.1.1词嵌入Word Embedding层
2.1.2位置编码器Position Embedding层 2.2注意力机制
2.2.1自注意力机制Self-Attention
2.2.2多头注意力机制Multi-Head Attention
2.3残差连接
2.4LN和BN
2.5前馈神经网络FeedForward
三、解码器Decoder 3.1第一个 Multi-Head Attention
3.1.1掩码Mask
3.1.2具体实现步骤 3.2第二个 Multi-Head Attention 3.3Linear和softmax
一、Transformer 整体结构 首先我们回顾一下这个神图 这张图小白刚看时会觉得很复杂有木有其实Transformer主要就做了这件事 可以看到 Transformer 由 Encoder 和 Decoder 两个部分组成Encoder把输入读进去Decoder得到输出 Encoder 和 Decoder 都包含 6 个 block。这6个block结构相同但参数各自随机初始化。
Encoder和Decoder不一定是6层几层都可以原论文里采用的是6层。 二、编码器Encoder Encoder由三个部分组成输入、多头注意力、前馈神经网络。 2.1输入
Transformer 中单词的输入表示 x由 Word Embedding 和 Position Embedding相加得到。 2.1.1词嵌入Word Embedding层
词嵌入层 负责将自然语言转化为与其对应的独一无二的词向量表达。将词汇表示成特征向量的方法有多种
1One-hot编码 One-hot编码使用一种常用的离散化特征表示方法在用于词汇向量表示时向量的列数为所有单词的数量只有对应的词汇索引为1其余都为0。
举个栗子“我爱我的祖国”这句话总长为6但只有5个不重复字符用One-hot表示后为6*5的矩阵如图所示 但是这种数据类型十分稀疏即便使用很高的学习率依然不能得到良好的学习效果。
2数字表示
数字表示是指用整个文本库中出现的词汇构建词典以词汇在词典中的索引来表示词汇。所以与其叫做“数字表示”还不如叫“索引表示”。
举个栗子还是“我爱我的祖国”这句话就是我们整个语料库那么整个语料库有5个字符假设我们构建词典{我:0, 爱:1, 的:2, 祖:3, :4}“我爱我的祖国”这句话可以转化为向量[0, 1, 0, 2, 3, 4]。如图所示。这种方式存在的问题就是词汇只是用一个单纯且独立的数字表示难以表达出词汇丰富的语义。 2.1.2位置编码器Position Embedding层
Transformer 中除了Word Embedding还需要使用Position Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构而是使用全局信息因此是无法捕捉到序列顺序信息的例如将K、V按行进行打乱那么Attention之后的结果是一样的。但是序列信息非常重要代表着全局的结构因此必须将序列的分词相对或者绝对position信息利用起来。
Position Embedding 用 PE表示PE 的维度与Word Embedding 是一样的。PE 可以通过训练得到也可以使用某种公式计算得到。在 Transformer 中采用了后者计算公式如下 其中 pos 表示positionindex i 表示dimension index。 2.2注意力机制 我们再来看一下这个图图中红色圈中的部分为 Multi-Head Attention是由多个 Self-Attention组成的可以看到 Encoder 包含一个 Multi-Head Attention而 Decoder 包含两个 Multi-Head Attention (其中有一个用到 Masked)。
Multi-Head Attention 上方还包括一个 Add Norm 层
Add 表示残差连接 (Residual Connection) 用于防止网络退化Norm 表示 Layer Normalization用于对每一层的激活值进行归一化 2.2.1自注意力机制Self-Attention
自注意力机制是注意力机制的变体其减少了对外部信息的依赖更擅长捕捉数据或特征的内部相关性。自注意力机制的关键点在于Q、K、V是同一个东西或者三者来源于同一个X三者同源。通过X找到X里面的关键点从而更关注X的关键信息忽略X的不重要信息。不是输入语句和输出语句之间的注意力机制而是输入语句内部元素之间或者输出语句内部元素之间发生的注意力机制。
如何运用自注意力机制
第1步得到QKV的值
对于每一个向量x分别乘上三个系数 得到的QK和V分别表示querykey和value 【注意】三个W就是我们需要学习的参数。
第2步Matmul
利用得到的Q和K计算每两个输入向量之间的相关性一般采用点积计算为每个向量计算一个scorescore q · k 第3步ScaleSoftmax
将刚得到的相似度除以再进行Softmax。经过Softmax的归一化后每个值是一个大于0且小于1的权重系数且总和为0这个结果可以被理解成一个权重矩阵。 第4步Matmul
使用刚得到的权重矩阵与V相乘计算加权求和。 以上是对Thinking Machines这句话进行自注意力的全过程最终得到z1和z2两个新向量。
其中z1表示的是thinking这个词向量的新的向量表示通过thinking这个词向量去查询和thinking machine这句话里面每个单词和thinking之间的相似度。
也就是说新的z1依然是 thinking 的词向量表示只不过这个词向量的表示蕴含了 thinking machines 这句话对于 thinking 而言哪个更重要的信息 。 2.2.2多头注意力机制Multi-Head Attention
与其只使用单独一个注意力汇聚 我们可以用独立学习得到的h组一般h8不同的线性投影来变换Q、K和V。
然后这h组变换后的Q、K和V将并行地送到注意力汇聚中。 最后将这h个注意力汇聚的输出拼接在一起 并且通过另一个可以学习的线性投影进行变换 以产生最终输出。 这种设计被称为多头注意力multihead attention。 如何运用多头注意力机制
第1步定义多组W生成多组Q、K、V
刚才我们已经理解了Q、K、V是输入向量X分别乘上三个系数 分别相乘得到的 是可训练的参数矩阵。
现在对于同样的输入X我们定义多组不同的 比如、、、、每组分别计算生成不同的Q、K、V最后学习到不同的参数。 第2步定义8组参数
对应8组 再分别进行self-attention就得到了- 第3步将多组输出拼接后乘以矩阵以降低维度 首先在输出到下一层前我们需要将-concat到一起乘以矩阵做一次线性变换降维得到Z。 完整流程图如下感谢翻译的大佬 【注意】对于上图中的第2步当前为第一层时直接对输入词进行编码生成词向量X当前为后续层时直接使用上一层输出。 2.3残差连接
每个编码器的每个子层Self-Attention 层和 FFN 层都有一个残差连接再执行一个层标准化操作。 把得到的两个词的Attention值摞在一起后将“加入位置编码后的词向量X”与“摞在一起后输出的Attention值Z” 相加。残差连接减小了梯度消失的影响。加入残差连接就能保证层次很深的模型不会出现梯度消失的现象。 2.4LN和BN
LNLayer NormalizationLN是“横”着来的对同一个样本不同的特征做归一化。BNBatch NormalizationBN是“竖”着来的对不同样本同一特征做归一化。
二者提出的目的都是为了加快模型收敛减少训练时间。 【注意】在NLP任务中一般选用的都是LN不用BN。因为句子长短不一每个样本的特征数很可能不同造成很多句子无法对齐所以不适合用BN。 2.5前馈神经网络FeedForward
在进行了Attention操作之后Encoder和Decoder中的每一层都包含了一个全连接前向网络对每个position的向量分别进行相同的操作包括两个线性变换和一个ReLU激活输出 假设多头注意力部分有两个头那么输出的两个注意力头Zi分别通过两个Feed Forward然后接一个残差连接即Zi和Feed Forward的输出Add对位相加。最后把相加的结果进行一次LN标准化。 三、解码器Decoder 上图红色框框为 Transformer 的 Decoder 结构与 Encoder 相似但是存在一些区别。
Decoder 包含两个 Multi-Head Attention 层。
第一个 Multi-Head Attention 层采用了 Masked 操作。第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算而Q使用上一个 Decoder的输出计算。最后有一个 Softmax 层计算下一个翻译单词的概率。 3.1第一个 Multi-Head Attention 3.1.1掩码Mask
Mask 表示掩码它对某些值进行掩盖使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask分别是 Padding Mask 和 Sequence Mask。其中Padding Mask 在所有的 scaled dot-product attention 里面都需要用到而 Sequence Mask 只有在 Decoder 的 Self-Attention 里面用到。 为什么需要Mask 有一些生成的attention张量中的值计算有可能已知了未来信息而得到的未来信息被看到是因为训练时会把整个输出结果都一次性进行Embedding但是理论上解码器的的输出却不是一次就能产生最终结果的而是一次次通过上一次结果综合得出的因此未来的信息可能被提前利用。所以Attention中需要使用掩码张量掩盖未来信息。 我们可以这么来理解Mask的作用我们建模目的就是为了达到预测的效果所谓预测就是利用过去的信息(此前的序列张量)对未来的状态进行推断如果把未来需要进行推断的结果共同用于推断未来那叫抄袭不是预测。当然这么做的话训练时模型的表现会很好但是在测试(test)时模型表现会很差。 换句话说我们是用一句话中的前N − 1 个字预测第N 个字那么我们在预测第N 个字时就不能让模型看到第N个字之后的信息所以这里们把预测第N 个字时第N 包括)个字之后的字都Masked掉。
我们来举个栗子 如果像Encoder的注意力机制那里一样没有Mask那么在训练Decoder时如果要生成预测结果you就需要用到下面整个句子的所有词s,I,Love,You,Now。但是在真正预测的时候并看不到未来的信息即还轮不到You和Now呢。
所以在预测阶段预测的第一步生成第一个词I的时候用起始词start做self-attention然后预测的第二步生成第二个词Love的时候就做start和I两个词的self-attention后面的词被掩盖了。以此往复预测的每一步在该层都有一个输出QQ要送入到中间的Multi-Head Attention层和encoder部分输出的KV做attention。 3.1.2具体实现步骤
第一步是 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 Start I Love You Now (0, 1, 2, 3, 4) 五个单词的表示向量Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息而单词 1 可以使用单词 0, 1 的信息即只能使用之前的信息。 输入矩阵与 Mask 矩阵 第二步接下来的操作和之前的 Self-Attention 一样通过输入矩阵X计算得到Q,K,V矩阵。然后计算Q和的乘积。 Q乘以K的转置 第三步在得到 之后需要进行 Softmax计算 attention score我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息遮挡操作如下 Softmax 之前 Mask 得到 Mask 之后在 Mask 上进行 Softmax每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。
第四步使用 Mask 与矩阵 V相乘得到输出 Z则单词 1 的输出向量 Z1 是只包含单词 1 信息的。 Mask 之后的输出 第五步通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵Zi 然后和 Encoder 类似通过 Multi-Head Attention 拼接多个输出Zi然后计算得到第一个 Multi-Head Attention 的输出ZZ与输入X维度一样。 3.2第二个 Multi-Head Attention 其实这块与上文 Encoder 中 的 Multi-Head Attention 具体实现细节上完全相同区别在于Encoder的多头注意力里的Q、K、V是初始化多个不同的矩阵得到的。而Decoder的K、V是来自于Encoder的输出Q是上层Masked Self-Attention的输出。
Encoder 中 的 Multi-Head Attention只有一个输入把此输入经过三个linear映射成Q 、K 、V 而这里的输入有两个
一个是Decoder的输入经过第一个大模块传过来的值一个是Encoder最终结果
是把第一个值通过一个linear映射成了Q然后通过两个linear把第二个值映射成K、V 其它的与上文的完全一致。这样做的好处是在 Decoder 的时候每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。 3.3Linear和softmax
Decoder最后会输出一个实数向量。那我们如何把浮点数变成一个单词这便是线性变换层Linear层要做的工作它之后就是Softmax层。
Linear层是一个简单的全连接神经网络它可以把Decoder产生的向量投射到一个比它大得多的、被称作对数几率logits的向量里。 不妨假设我们的模型从训练集中学习一万个不同的英语单词我们模型的“输出词表”。因此对数几率向量为一万个单元格长度的向量——每个单元格对应某一个单词的分数。
接下来的Softmax 层便会把那些分数变成概率都为正数、上限1.0。概率最高的单元格被选中并且它对应的单词被作为这个时间的输出。 这张图片从底部以解码器组件产生的输出向量开始。之后它会转化出一个输出单词。 以上就是Transformer模型结构的全部解读了~
在这里如果想更清楚的了解推荐大家看看大佬的讲解感谢各位大佬阿里嘎多
b站【Transformer从零详细解读(可能是你见过最通俗易懂的讲解)】
知乎Transformer模型详解图解最完整版 - 知乎 (zhihu.com)