『NLP学习笔记』Transformer技术详细介绍
Transformer技术详细介绍! |
文章目录
- 一. 整体结构图
- 二. 输入部分
- 2.1. 词向量
- 2.2. 位置编码
- 三. 注意力机制
- 3.1. 注意力机制的本质
- 3.2. 举例说明
- 3.3. Transformer中的注意力
- 四. 残差和layerNormal
- 4.1. Layer Normalization
- 五. 前馈神经网络
- 六. Decoder
- 6.1. 掩盖多头注意力机制
- 6.2. 交互层
- 七. 参考
一. 整体结构图
- TRM在做一个什么事情?
![](/assets/blank.gif)
- 细化
![](/assets/blank.gif)
- 再细化
![](/assets/blank.gif)
- 原论文图:
![](/assets/blank.gif)
- 单个Encoder可以分为如下3个部分:
![](/assets/blank.gif)
二. 输入部分
- 首先说输入部分: 1. Embedding;2. 位置嵌入。 两者相加,如下图所示
![](/assets/blank.gif)
2.1. 词向量
- 例如:下面的4个英文单词,经过Word2Vec分别得到的词向量长度是4。
![](/assets/blank.gif)
- 再比如 :输入是
我爱你......12个字
,我按字切分,每个字定义一个512维度的字向量(原论文就是512),对于字向量这里可以使用Word2Vec或者随机初始化[如果数据量非常大,这2个差别不大,可以忽略]
。下面的词向量长度就是512。
![](/assets/blank.gif)
2.2. 位置编码
- 可以参考大佬的文章:Sinusoidal 位置编码追根溯源:https://wmathor.com/index.php/archives/1541/
- 苏剑林大佬的文章:Transformer升级之路-Sinusoidal位置编码追根溯源:https://www.spaces.ac.cn/archives/8231
- 不同于RNN、CNN等模型,对于Transformer模型来说,位置编码的加入是必不可少的,因为纯粹的Attention模块是无法捕捉输入顺序的,即无法区分不同位置的Token。让研究人员绞尽脑汁的Transformer位置编码
- 从RNN说下为什么需要位置编码,对于RNN的一个共识,但是很多人会忽略。RNN的参数U,输入参数W,隐层参数V,输出参数。这是一套参数,所有RNN的time steps都共享一套参数(例如有100个词,100个字都是一套参数)。为了更好的理解,按照时间线展开,比如输入我爱你。RNN这种展开的结构,天然的时序关系很符合的,先处理某些东西,后处理某些东西。但是对于Transformer来讲,看刚才的图,多头注意力机制那里,处理的时候是可以并行的,一句话所有单词可以同时处理。不是像RNN输入一个我等处理完我再处理爱…。Transformer是一起处理的,这样做增快了速度,但是忽略了单词之间的序列关系,或者说先后关系。
- 所以Transformer相比于RNN就缺少了某种东西,告诉模型某些我是在前面的,你是在后面的,爱是在中间的。
![](/assets/blank.gif)
- 原论文位置编码公式: 如何理解呢?pos单词或者字的位置 2i2i2i 代表偶数位,2i+12i+12i+1 代表奇数位。它如果针对512个维度的位置编码(下图)。
PE(pos,2i)=sin(pos100002i/dmodel )(1)\begin{aligned} \text {PE}_{(\text {pos}, 2 i)} &=\sin \left(\frac{\text {pos} }{10000^{2 i / d_{\text {model }}}}\right)\tag{1} \end{aligned} PE(pos,2i)=sin(100002i/dmodelpos)(1) PE(pos,2i+1)=cos(pos100002i/dmodel )(2)\begin{aligned} \text {PE}_{(\text {pos}, 2 i+1)} &=\cos \left(\frac{\text {pos} }{10000^{2 i / d_{\text {model }}}}\right)\tag{2} \end{aligned} PE(pos,2i+1)=cos(100002i/dmodelpos)(2)- 其中 pos表示某个词在句子序列中的实际位置,也可以理解为某个token,iii 表示词向量的第 iii 个维度,dmodeld_{model}dmodel是位置向量的维度
- 由于 sin(α+β)=sinαcosβ+cosαsinβ\sin (\alpha+\beta)=\sin \alpha \cos \beta+\cos \alpha \sin \betasin(α+β)=sinαcosβ+cosαsinβ 以及 cos(α+β)=cosαcosβ−sinαsinβ\cos (\alpha+\beta)=\cos \alpha \cos \beta-\sin \alpha \sin \betacos(α+β)=cosαcosβ−sinαsinβ,这表明位置 α+β\alpha+\betaα+β 的向量可以表示成位置 α\alphaα 和位置 β\betaβ 的向量组合,这提供了表达相对位置信息的可能性。但很奇怪的是,现在我们很少能看到直接使用这种形式的绝对位置编码的工作,原因不详。
![](/assets/blank.gif)
- 得到上面的位置编码之后: 我们将位置编码512维度和词向量512维度或者字向量512维度相加,得到的结果作为最终Transformer的输入。
![](/assets/blank.gif)
- 这里还想引申一下为什么位置嵌入会有用, 公式2可以利用三角函数的性质得到公式3。注意看公式3,我们依第1行为例,比如pos位置代表我,pos+k代表你,k代表爱。也就是我爱你中的你可以用pos我和k爱两者线性组合起来,这样的线性组合意味着位置向量中蕴含了相对位置信息。但还有一个注意的点,这种相对位置信息会在注意力机制那里消失。
![](/assets/blank.gif)
import numpy as np
import matplotlib.pyplot as pltnp.set_printoptions(formatter={'float': '{: 0.4f}'.format})def plotPE(numw, dmodel, width=5, height=5):# dmodel = 512# numw = 20pematrix = np.zeros((numw, dmodel))for pos in range(0, numw): # 20 wordsfor i in range(0, dmodel): # 512-dimensionif i % 2 == 0:p = np.sin(pos / np.power(10000.0, i / dmodel))else:p = np.cos(pos / np.power(10000.0, (i - 1) / dmodel))pematrix[pos][i] = pplt.figure(figsize=(width, height))print(pematrix)plt.imshow(pematrix)# plt.colorbar(label='points')plt.show()plotPE(8, 16)
- 在下图中,每行对应一个向量的位置编码。因此,第一行将是我们要添加到输入序列中第一个单词的嵌入的向量。每行包含16个值-每个值都在1到-1之间。我们已经对它们进行了颜色编码,因此图案可见。
三. 注意力机制
3.1. 注意力机制的本质
![](/assets/blank.gif)
- Transformer原论文中注意力机制的公式:
Attention(Q,K,V)=softmax(QK⊤dk)V(3)\operatorname{Attention}(\boldsymbol Q, \boldsymbol K, \boldsymbol V)=\operatorname{softmax}\left(\frac{\boldsymbol Q \boldsymbol K^{\top}}{\sqrt{d_{k}}}\right) \boldsymbol V\tag{3} Attention(Q,K,V)=softmax(dkQK⊤)V(3)- 其中 Q,K,V\boldsymbol {Q, K, V}Q,K,V 是3个矩阵(向量),首先 Q和K\boldsymbol {Q 和 K}Q和K 先做一个点乘,softmax经过之后得到的是一个相似度的向量,再乘以V\boldsymbol VV 矩阵得到一个加权和。
3.2. 举例说明
- 举例子说明: 首先query和key做点乘(这里说一下为什么做点乘,其实做相似度计算有3种方式:点乘、MLP多层网络、余弦相似度)。单独说一下点乘,它反应的是一个向量在另一个向量上投影的长度,a∙b=∣a∥b∣cosθa \bullet b=|a \| b| \cos \thetaa∙b=∣a∥b∣cosθ,也就是两个向量越相似它的点乘结果就越大。
- 这里例子中婴儿和左上、左下、右上、右下点乘之后,要判断是婴儿和这4个区域哪一个点乘结果越大,说明越相似,就是越关注。
![](/assets/blank.gif)
- NLP中的例子: 这里输入的Query是爱,输入的是我不爱你4个key1、key2、key3、key4向量,Value1、Value2、Value3、Value4是对应的向量。
![](/assets/blank.gif)
- 具体如下:首先计算query爱和我、不、爱、你4个key向量计算F函数(就是刚才说的3种相似性方法,这里是点乘)、得到结果s1、s2、s3、s4,然后做一个softmax函数归一化,得到a1、a2、a3、a4,它们结果是相似度,比如0.7、0.1、0.1、0.1,结果相加为1。
- 注意看value上面的箭头,先和a相乘,再相加一起得到attention value。
![](/assets/blank.gif)
3.3. Transformer中的注意力
- 比如现在Thinking和Machines两个词,对应的向量是 x1\boldsymbol x_1x1 和 x2\boldsymbol x_2x2,当然是加上位置编码之后的向量(4维)。如何获取到 Q,K,V\boldsymbol {Q, K, V}Q,K,V 这3个向量,很简单:
- x1\boldsymbol x_1x1 乘以一个WQ\boldsymbol W^QWQ 的矩阵得到 q1\boldsymbol q_1q1;x1\boldsymbol x_1x1 乘以一个WK\boldsymbol W^KWK 的矩阵得到 k1\boldsymbol k_1k1;x1\boldsymbol x_1x1 以一个WV\boldsymbol W^VWV 的矩阵得到 v1\boldsymbol v_1v1:
q1=x1WQ,(x1∈R1×E×WQ∈RE×H⇒Q∈R1×H)k1=x1WK,(x1∈R1×E×WK∈RE×H⇒K∈R1×H)v1=x1WV,(x1∈R1×E×WV∈RE×H⇒V∈R1×H)(4)\begin{aligned} \boldsymbol q_1 &=\boldsymbol x_1 \boldsymbol{W}^{Q}, \left(\boldsymbol x_1\in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{Q} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{Q} \in \mathbb{R}^{ 1 \times H}\right) \\ \boldsymbol k_1 &=\boldsymbol x_1 \boldsymbol{W}^{K}, \left(\boldsymbol x_1\in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{K} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{K} \in \mathbb{R}^{1 \times H}\right) \\ \boldsymbol v_1 &=\boldsymbol x_1 \boldsymbol{W}^{V}, \left(\boldsymbol x_1\in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{V} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{V} \in \mathbb{R}^{1 \times H}\right)\tag{4} \end{aligned} q1k1v1=x1WQ,(x1∈R1×E×WQ∈RE×H⇒Q∈R1×H)=x1WK,(x1∈R1×E×WK∈RE×H⇒K∈R1×H)=x1WV,(x1∈R1×E×WV∈RE×H⇒V∈R1×H)(4) 其中每个词的Embedding 的维度为EEE(也就是这里的4),每个注意力头的输出维度为HHH(也就是这里的3)。- 同理:使用的是同一套参数,相应的 X2\boldsymbol X_2X2 也是一样,如下:
q2=x2WQ,(x2∈R1×E×WQ∈RE×H⇒Q∈R1×H)k2=x2WK,(x2∈R1×E×WK∈RE×H⇒K∈R1×H)v2=x2WV,(x2∈R1×E×WV∈RE×H⇒V∈R1×H)(5)\begin{aligned} \boldsymbol q_2 &=\boldsymbol x_2 \boldsymbol{W}^{Q}, \left(\boldsymbol x_2 \in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{Q} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{Q} \in \mathbb{R}^{ 1 \times H}\right) \\ \boldsymbol k_2 &=\boldsymbol x_2 \boldsymbol{W}^{K}, \left(\boldsymbol x_2 \in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{K} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{K} \in \mathbb{R}^{1 \times H}\right) \\ \boldsymbol v_2 &=\boldsymbol x_2 \boldsymbol{W}^{V}, \left(\boldsymbol x_2 \in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{V} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{V} \in \mathbb{R}^{1 \times H}\right)\tag{5} \end{aligned} q2k2v2=x2WQ,(x2∈R1×E×WQ∈RE×H⇒Q∈R1×H)=x2WK,(x2∈R1×E×WK∈RE×H⇒K∈R1×H)=x2WV,(x2∈R1×E×WV∈RE×H⇒V∈R1×H)(5)
- 为了并行化处理: 用矩阵 X\boldsymbol XX 表示向量 x1,x2\boldsymbol x_1, \boldsymbol x_2x1,x2 按行组成的矩阵,维度是 X∈R2×E\boldsymbol X \in \mathbb{R}^{ 2 \times E}X∈R2×E(下图中 E=4E=4E=4)。
Q=XWQ,(X∈R2×E×WQ∈RE×H⇒Q∈R2×H)K=XWK,(X∈R2×E×WK∈RE×H⇒K∈R2×H)V=XWV,(X∈R2×E×WV∈RE×H⇒V∈R2×H)(6)\begin{aligned} \boldsymbol Q &=\boldsymbol X \boldsymbol{W}^{Q}, \left(\boldsymbol X \in \mathbb{R}^{2 \times E}\times \boldsymbol{W}^{Q} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{Q} \in \mathbb{R}^{ 2 \times H}\right) \\ \boldsymbol K &=\boldsymbol X \boldsymbol{W}^{K}, \left(\boldsymbol X \in \mathbb{R}^{2 \times E}\times \boldsymbol{W}^{K} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{K} \in \mathbb{R}^{2 \times H}\right) \\ \boldsymbol V &=\boldsymbol X \boldsymbol{W}^{V}, \left(\boldsymbol X \in \mathbb{R}^{2 \times E}\times \boldsymbol{W}^{V} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{V} \in \mathbb{R}^{2 \times H}\right)\tag{6} \end{aligned} QKV=XWQ,(X∈R2×E×WQ∈RE×H⇒Q∈R2×H)=XWK,(X∈R2×E×WK∈RE×H⇒K∈R2×H)=XWV,(X∈R2×E×WV∈RE×H⇒V∈R2×H)(6)
![](/assets/blank.gif)
- 在上述变换基础上进行如下计算,得到输入中 每个词和自身及其他词之间的关系权重:
S=softmax(QK⊤dk)(7)\boldsymbol S=\operatorname{softmax}\left(\frac{\boldsymbol Q \boldsymbol K^{\top}}{\sqrt{d_{k}}}\right) \tag{7} S=softmax(dkQK⊤)(7)- 计算相似度,得到attention值。 得到 Q,K,V\boldsymbol {Q, K, V}Q,K,V 这3个矩阵之后,计算 Q和K\boldsymbol Q和\boldsymbol KQ和K 的相似性,得到score,然后除以 dk\sqrt{d_{k}}dk(为什么要除以它呢?QK⊤\boldsymbol Q \boldsymbol K^{\top}QK⊤ 相乘之后得到的值非常大,值很大的情况下,softmax在反向传播的过程中梯度很小,容易发生梯度消失的现象。除以dk\sqrt{d_{k}}dk 而不除以别的值是为了保持方差控制为1,更具体的参考Dasou的公众号《NLP从入门到放弃》)
![](/assets/blank.gif)
- 因此有 S∈R2×2\boldsymbol S \in \boldsymbol R^{2 \times 2}S∈R2×2,该矩阵表示输入数据中每个词和自身及其他词的关系权重,每一行的得分之和为1。基于该得分即可得到,每个词在当前上下文下的新的向量表示,公式如下:
Z=Attention(Q,K,V)=SV(8)\boldsymbol Z = \operatorname{Attention}(\boldsymbol Q, \boldsymbol K, \boldsymbol V)=\boldsymbol S \boldsymbol V\tag{8} Z=Attention(Q,K,V)=SV(8)- 得到向量 Z\boldsymbol ZZ 向量之后,它会被送到Encoder的下一个模块,即前馈神经网络,这个全连接有2层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:
FFN=max(0,ZW1+b1)W2+b2(9)\mathrm{FFN}=\max \left(0, \boldsymbol {Z} \boldsymbol {W}_{1}+\boldsymbol{b}_{1}\right) \boldsymbol{W}_{2}+\boldsymbol{b}_{2}\tag{9} FFN=max(0,ZW1+b1)W2+b2(9) 论文中两层全连接的中间隐层单元数都为2048
![](/assets/blank.gif)
- 实际操作中使用矩阵的运算,方便并行,计算速度更快! 还有一个细节点,在实际操作叫多头,这里我们只用了一套参数WQ\boldsymbol W^QWQ、WK\boldsymbol W^KWK、WV\boldsymbol W^VWV。多头其实就是用了多套参数,分别得到各自的Q,K,V\boldsymbol Q, K, VQ,K,V,如下图2,多了一套参数。 可以这样理解,多头注意力机制相当于把原始信息打到不同的空间(不一套参数)。
![](/assets/blank.gif)
- 多个头就会有多个输出,最后需要合在一起输出,如下面是2个头。
![](/assets/blank.gif)
- 多头注意力机制: 相当于 hhh 个不同的自注意力的集成(ensemble)(如上图中2个,下图中8个),在这里我们以 h=8h=8h=8 举例说明。多头注意力机制的输出分成3步:
- ① 将数据 X\boldsymbol XX 分别输入到下图所示的8个自注意力的中,得到8个加权后的特征矩阵 Zi∈R2×3,i∈{1,2,…,8}\boldsymbol Z_i \in \boldsymbol R^{2 \times 3}, i \in\{1,2, \ldots, 8\}Zi∈R2×3,i∈{1,2,…,8}。
![](/assets/blank.gif)
- ② 将8个Zi∈R2×3,i∈{1,2,…,8}\boldsymbol Z_i \in \boldsymbol R^{2 \times 3}, i \in\{1,2, \ldots, 8\}Zi∈R2×3,i∈{1,2,…,8} 按列拼成一个大的特征矩阵 Ztmp∈R2×24\boldsymbol Z_{\text {tmp}} \in \boldsymbol R^{2 \times 24}Ztmp∈R2×24,可以看下面第二个图;
![](/assets/blank.gif)
- ③ 特征矩阵经过 一层全连接 后得到最终输出 Z=ZtmpWo\boldsymbol Z=\boldsymbol Z_{\text {tmp}} \boldsymbol W^oZ=ZtmpWo,其中Ztmp∈R2×24,Wo∈R24×4\boldsymbol Z_{\text {tmp}} \in \boldsymbol R^{2\times 24}, \boldsymbol W^o\in \boldsymbol R^{24\times 4}Ztmp∈R2×24,Wo∈R24×4。
![](/assets/blank.gif)
- 具体多头注意力机制全过程如下:
![](/assets/blank.gif)
- 注意: 同self-attention一样,multi-head attention也加入了short-cut机制。
四. 残差和layerNormal
- 首先说一下 残差和LayerNormal 大致情况。首先看输入 x1\boldsymbol x_1x1 和 x2\boldsymbol x_2x2 代表词向量,然后碰到位置编码进行对位相加,得到新的 x1\boldsymbol x_1x1 和 x2\boldsymbol x_2x2,然后经过self-attention层得到输出结果 z1\boldsymbol z_1z1 和 z2\boldsymbol z_2z2,现在将 z1\boldsymbol z_1z1 和 z2\boldsymbol z_2z2 变为一个矩阵 Z\boldsymbol ZZ,将原始输入直接拿过来变为 X\boldsymbol XX,然后和 Z\boldsymbol ZZ 对位相加作为残差的输出结果,然后经过LayerNormal。
![](/assets/blank.gif)
4.1. Layer Normalization
- 经典的面试题:为什么这里使用Layer Normalization而不是Batch Normalization?
- NLP中所有任务不止Transformer,大家很少用BN,基本都用LN操作。
- 说一下BN操作,特征处理的时候Feature scaling就是为了消除量纲的影响,使模型收敛的更快。李宏毅老师课件链接
![](/assets/blank.gif)
- BN理解的重点在于:针对整个batch中的样本同一纬度进行处理。 下图中 X1,...,XR\boldsymbol X^1, ..., \boldsymbol X^RX1,...,XR 不同的样本。例如代表不同的人,第1行身高,第2行体重,…。在做的BN的时候,我是针对一个batch种所有的样本人的每一个特征做BN,比如体重维度做BN,身高维度做BN…。
- 所以做BN的时候很容易理解,但是如果BN用在NLP中有一个很大的问题。
![](/assets/blank.gif)
- BN的优点:
- 第一个就是可以解决内部协变量偏移。
- 第二个优点就是缓解了梯度饱和问题(如果使用sigmoid激活函数的话),加快收敛。
- BN的缺点:
- 第一个,batch_size较小的时候,效果差(这个batch中计算出来的均值和方差不能代表全部数据的均值和方差)。
- 第二个,缺点就是 BN 在RNN中效果比较差。这一点和第一点原因很类似,不过我单挑出来说。
- 第二个的例子:一个batch长度为10,前9个样本的句子长度是5个单词,1个样本的句子长度是20个单词,那么我再输入的时候,前5个单词的均值和方差可以用10个样本计算出来,但是第6个单词到第20个单词的均值和方差怎么计算呢?前9个没有,只有最后一个有。回到了第一个问题中batch很小的时候,效果很差,这就是BN在RNN中效果不好的原因。RNN的输入是动态的。
![](/assets/blank.gif)
- 为什么使用layer-norm? 比如还是上面例子,最后1个句子是20个单词,LN做的就是针对这20个单词进行缩放,去做它的均值和方差。而BN做的是针对第一1行单词做方差,第2行单词做方差。
- 理解:为什么LayerNorm单独对一个样本的所有单词做缩放可以起到效果。
- 看下面这张图:同一个位置的做均值和方差,比如我和今做方差,ai和天做方差,默认假设我和今代表同样的语义信息,ai和天代表同样的语音信息。大家想想是不是这样,看上面的图BN的时候,身高做方差,体重做方差,都是代表相同的语音信息。而LN做的是针对所有单词我爱中国共产党所有单词做均值和方差,它的假设是我爱中国共产党在同一个语义信息里。也可以这样理解,在获取我爱中国共产党这个句向量的时候,一个常规的做法是做加权词向量,加权词向量基本假设认为我爱中国共产党这句话中的所有词是在一个语义信息里面的,所以才认为是可以理解的。
![](/assets/blank.gif)
五. 前馈神经网络
- 前馈神经网络就是这个图中最上面的,这里是两层的全连接,然后再过一个残差和Normalization。以上所有的都是Encoder的过程。
- 如果我们可视化向量、layer-norm以及前馈神经网络操作,将如下所示:
![](/assets/blank.gif)
- 在解码器中也是如此,假设两层编码器+两层解码器组成Transformer,其结构如下:
![](/assets/blank.gif)
- 注意(下面也有介绍,这里强调一下):在解码器中,Transformer block比编码器中多了个Encoder-Decoder Attention。在Encoder-Decoder Attention中,Q\boldsymbol QQ 来自于解码器的上一个输出, K\boldsymbol KK 和 V\boldsymbol VV 则来自于与编码器的输出。其计算方式完全和图10的过程相同。
六. Decoder
- 现在我们已经了解了编码器侧的大部分概念,也基本了解了解码器的工作方式,下面看下他们是如何共同工作的。
- 编码器从输入序列的处理开始,最后的编码器的输出被转换为 K\boldsymbol KK 和 V\boldsymbol VV,它俩被每个解码器的"Encoder-Decoder Atttention"层来使用,帮助解码器集中于输入序列的合适位置。看上一节中的图。
![](https://jalammar.github.io/images/t/transformer_decoding_1.gif)
- 下面的步骤一直重复直到一个特殊符号出现表示解码器完成了翻译输出。每一步的输出被喂到下一个解码器中。正如编码器的输入所做的处理,对解码器的输入增加位置向量。
![](https://jalammar.github.io/images/t/transformer_decoding_2.gif)
- 下面是Decoder部分,重点讲解一下1(掩盖多头注意力机制)和2(交互层,比encoder多了1层)两部分。
![](/assets/blank.gif)
6.1. 掩盖多头注意力机制
- 由于在机器翻译中,解码过程是一个顺序操作的过程,也就是当解码第 kkk 个特征向量时,我们只能看到第 k−1k-1k−1 及其之前的解码结果,论文中把这种情况下的注意力机制叫做 掩盖多头注意力机制(masked multi-head attention)。
- 从代码层面上讲,需要对当前单词和之后的单词做mask,都抹掉,不让看到。
- 为什么需要mask? 举例:看下面S代表输入的开始start,真正的句子的I love you now。
![](/assets/blank.gif)
- S\text SS 输入,输出 I\text II,然后做一个teacher for thing,把 I\text II 作为下一个时刻的输入得到 LOVE\text {LOVE}LOVE,依次,…,这是一个机器翻译的过程。 为什么需要mask? 输入 LOVE\text{LOVE}LOVE 的时候,输出的是 YOU\text{YOU}YOU,如果decoder的输入是没有mask,只是经过和Encoder一样的,那么从 Start 的 S\text SS 开始,I love you now 这些词都为生成you这个预测结果都会提供信息。因为在预测阶段,比如预测YOU,是没有后面这个ground truth(没有YOU NOW)这个词,模型看不到未来的这个单词。如果不mask掉you和now,这个模型训练的时候和预测的时候存在gap,也就是说训练的时候可以看到这2个单词,预测的时候看不到这2个单词,这个模型的效果肯定就不好,所以就需要mask。把you和now给的信息抹掉,这样和预测就保持了一致。
![](/assets/blank.gif)
6.2. 交互层
- 从图中可以看到这是一个典型的多头注意力机制,是怎么操作的呢?看下图:所有encoder输出和每一个Decoder做交互。
![](/assets/blank.gif)
- 具体交互操作看下图:比如现在有2个encoder,输出的这个值得到 K,V\boldsymbol {K, V}K,V 矩阵,一定要注意Encoder生成的是 K,V\boldsymbol {K, V}K,V 矩阵,Decoder生成的是 Q\boldsymbol QQ 矩阵,多头注意力机制一定有 Q,K,V\boldsymbol {Q, K, V}Q,K,V 三个矩阵,在交互的时候利用 Q,K,V\boldsymbol {Q, K, V}Q,K,V 进行交互,生成多头注意力机制。
![](/assets/blank.gif)
- 再简单梳理一下整个过程,虚线代表 K,V\boldsymbol {K, V}K,V 矩阵的输出,看下面这条在第一个decoder中在做多头注意力机制的时候,和Decoder中的 Q\boldsymbol QQ 做一个交互。第二个Decoder也是一样的。
![](/assets/blank.gif)
七. 参考
- 主要参考dasou博主的视频:https://www.bilibili.com/video/BV1Ey4y1874y?p=6&spm_id_from=pageDriver
- 国外大神,精美图分析,英文:https://jalammar.github.io/illustrated-transformer/
- 国外大神,精美图分析,中文:https://blog.csdn.net/yujianmin1990/article/details/85221271
- Transformer简要介绍: https://blog.csdn.net/weixin_43199584/article/details/104721196
- Transformer论文 + PyTorch源码解读: https://www.pianshen.com/article/3013330708/
- 详解Transformer (Attention Is All You Need):https://zhuanlan.zhihu.com/p/48508221
『NLP学习笔记』Transformer技术详细介绍相关推荐
- 『NLP学习笔记』BERT文本分类实战
BERT技术详细介绍! 文章目录 一. 数据集介绍 二. 数据读取 三. 训练集和验证集划分 四. 数据分词tokenizer 五. 定义数据读取(继承Dataset类) 六. 定义模型以及优化方法 ...
- 『NLP学习笔记』TextCNN文本分类原理及Pytorch实现
TextCNN文本分类原理及Pytorch实现 文章目录 一. TextCNN网络结构 1.1. CNN在文本分类上得应用 1.2. 回顾CNN以及Pytorch解析 1.2.1. CNN特点 1.2 ...
- 『NLP学习笔记』长短期记忆网络LSTM介绍
长短期记忆网络LSTM介绍 文章目录 一. 循环神经网络 二. 长期依赖问题 三. LSTM 网络 四. LSTM 背后的核心理念 4.1 忘记门 4.2 输入门 4.3 输出门 五. LSTM总结( ...
- 『NLP学习笔记』Cross Entropy Loss 的硬截断、软化到 Focal Loss
Cross Entropy Loss 的硬截断.软化到 Focal Loss 文章目录 一. 二分类模型 二. 修正的交叉少损失(硬截断) 2.1. 引入 2.1. 实现代码 三. 软化Loss 四. ...
- 『NLP学习笔记』HugeGraph套件安装与使用指南
HugeGraph套件安装与使用指南! 文章目录 一. 平台概述 二. HugeGraph-Server环境配置 2.1. 对应版本 2.2. 环境依赖 1. 安装JDK-1.8 2. 安装 GCC- ...
- 『NLP学习笔记』Sklearn计算准确率、精确率、召回率及F1 Score
Sklearn计算准确率.精确率.召回率及F1 Score! 文章目录 一. 混淆矩阵 1.1. 混淆矩阵定义 1.2. 例子演示 二. 准确率 2.1. 准确率定义 2.2. 例子演示 三. 精确率 ...
- 『NLP学习笔记』工业级自然语言处理spaCy开源库的使用
工业级自然语言处理spaCy开源库的使用 文章目录 一. spaCy介绍 1.1. 什么是spaCy 1.2. spaCy的优势 1.3. spaCy的处理过程(Processing Pipeline ...
- 『NLP学习笔记』Triton推理服务器加速模型推理
Triton推理服务器加速模型推理! 文章目录 一. Triton简要介绍 二. Triton Inference Server安装与使用 2.1. 安装Triton Docker镜像 2.2. 创建 ...
- Linux学习笔记 文件服务Vsftp详细介绍
Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...
最新文章
- 无线基站侧的信令风暴根因——频繁的释放和连接RRC产生大量信令、设备移动导致小区重选信令增加、寻呼信令多...
- Linux Kernel系列一:开篇和Kernel启动概要
- Android Toolbar样式定制详解
- java游戏暂停_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...
- VS2010_release_exe生成
- 学计算机的能看出批图吗,高手教你:如何看出一张图有没有被 P 过?
- Linux进程状态(ps stat)之R、S、D、T、Z、X 转:http://blog.csdn.net/huzia/article/details/18946491...
- Codeforces Round #277 (Div. 2)
- python之路_保留原搜索页面条件
- html5-微格式-时间的格式
- Linux操作系统之常用快捷键汇集
- LAMP架构简介与概述 及服务安装
- 达摩达兰论估价pdf_故事与估值epub+azw3+mobi文字版pdf+txt多看word魔鸠搜雅书屋
- 关于使用实验室服务器的GPU以及跑上TensorFlow代码
- 《软件工程》课程获奖感言
- 【2】模块参数与模块之间的通信
- GitHub 上传大小限制 大文件无法上传问题!
- 深度分析小熊电器的爆红逻辑
- Flutter集成测试
- 2014年中南大学研究生复试机试题(字符串、基础dp、最短路)
热门文章
- Qt在高分屏上显示不全的问题解决办法
- 丰胸产品排行榜第一丰乳健胸精油
- 如何恢复回收站删除文件?
- c# 软件皮肤自定义
- Bentley MicroStation (*.dgn) 模型 一键输出 3D Tiles 和 glTF/glb
- 《Mybatis 手撸专栏》第8章:把反射用到出神入化
- 字节跳动经典算法题:给定一个数n如23121;给定一组数字a如[2 4 9]求由a中元素组成的小于n的最大数
- MySQL锁分析之可重复读级别
- CAD二次开发--如何获取图面“组”对象及其内部实体(以南方CASS居民地-房屋为例)
- 怎么画思维导图?用MindNow思维导图准没错