transformer

参考链接:https://blog.csdn.net/weixin_37947156/article/details/90112176
https://blog.csdn.net/weixin_37947156/article/details/90112176

先放一个整体的图
在这里插入图片描述
Embedding的来源:word2vec
https://blog.csdn.net/weixin_40771521/article/details/103893982
首先对单词进行one-hot编码。比如单词库里面有1W个单词。one-hot编码的维度就是V = 1*1W。训练的时候利用前后两个单词作为上下文来预测当前单词。
在这里插入图片描述
所以一般训练时输入是:4V,输出是softmax得到的一个概率矩阵,维度是1V,对于的label就是当前要预测的单词的one-hot编码,维度也是1V。
在这里插入图片描述
C= 4,也就是上下文的4个单词,维度是1
V。先随机初始化一个权重矩阵 W,维度是VN。类似于卷积计算里面的一个filter,这个矩阵W跟C个输入向量分别做矩阵乘法,得到c1、c2、c3、c4,然后把这四个加起来求平均值,就是除以4,就这么简单。得到一个隐藏层,维度位1N。然后再乘以一个NV的权重矩阵W2,得到一个1V的输出,再经过softmax,然后跟label对比。就这么简单。
这个过程其实最重要的是要得到第一个权重矩阵W,维度是VN。某个单词的one-hot编码为[0,0,1,0…0],那么这个单词的向量表示就是W[2,:],这个就是embedding。所以输入是matX:10N
接下来就是上一篇文章讲到的,sefl-attention。训练的时候是一句话,人为设定这句话只有10个单词(更多也行,其实就是类似于CNN里面的batchsize),不足的补0,多的就删掉,放到下个句子里面。transformer不像RNN那样是一个个单词串行的,而是利用self-attention并行的。这里就有一个问题,self-attention是单词顺序无关的,也就是A单词在B单词前后都无所谓,类似于CNN一个batch有8张图片,这个8张图片顺序无所谓。但是NLP里面,上线问信息,也就是这种顺序是很重要的,怎么办?所以上面那张图,引入了Positional encoding。
详细的解释可以参考:https://zhuanlan.zhihu.com/p/166244505
总结一下位置编码的要求:
1、需要体现同一单词在不同位置的区别。
2、需要体现一定的先后次序,并且在一定范围内的编码差异不应该依赖于文本的长度,具有一定的不变性。
3、需要有值域的范围限制。
这时候的一个思路就是有界周期函数。比如sin、cos。为什么选两种结合,从积化和差公式的角度来讲:
在这里插入图片描述
这里的d_model 就是N。sin、cos都是周期性函数,所以下面那一部分,代表时钟频率,就是每个多久就会重复。这里i不一样,所以一行,也就是512个里面时钟频率都不一样,这就相当于不一样的编码方式,就能区分开。
在这里插入图片描述
embedding和位置编码就是简单的相加。

muti-attention计算过程:
假设上面提到的N为512,此时的三个输入,分别为V,K,Q,此处V=K=Q=matEnc,维度都是10512。下面那个linear就是一个线性变换,也就是一个单层的神经网络,激活函数是relu。输出的新的V_,K_,Q_还是10512。
在这里插入图片描述
muti-attention,其实就是对向量进行切分,有点类似于CNN里面的group 卷积。
在这里插入图片描述
Q_矩阵相乘 K_的转置(对最后2维),生成结果记为outputs,然后对outputs 进行scale一次更新为outputs;此次矩阵相乘是计算词与词的相关性,切成多个num_heads进行计算是为了实现对词与词之间深层次相关性进行计算;
在这里插入图片描述
对outputs进行softmax运算,更新outputs,即outputs=softmax(outputs);最新的outputs(即K和Q的相关性) 矩阵相乘 V_, 其值更新为outputs;
在这里插入图片描述
最后将outputs在axis=0维上切分为num_heads段,然后在axis=2维上合并, 恢复原来Q的维度;
在这里插入图片描述
这里muti-attention就算完成了。后面的Add操作类似于resnet,就是把输入的embedding和output想加:
在这里插入图片描述
Norm:就是outputs对最后一维计算均值和方差,用outputs减去均值除以方差+spsilon得值更新为outputs,然后变量gammaoutputs+变量beta;
Feedback:
3.4.1 对outputs进行第一次卷积操作,结果更新为outputs(卷积核为1
1,每一次卷积操作的计算发生在一个词对应的向量元素上,卷积核数目即最后一维向量长度,也就是一个词对应的向量维数),对最新outputs进行第二次卷积操作,卷积核仍然为1*1,卷积核数目为N。
在这里插入图片描述
Add&norm : 和3.3相同,经过以上操作后,此时最新的output和matEnc的shape相同;令matEnc=outputs, 完成一次循环,然后返回到3.2开始第二次循环;共循环Nx(自定义;每一次循环其结构相同,但对应的参数是不同的,即是独立训练的);完成Nx次后,模型的编码部分完成,仍然令matEnc=outputs,准备进入解码部分;
所以从上面的过程来看,transformer的一个很大的好处就是把只能串行计算的RNN这种基于序列的变成了可以并行计算的,变成了一种”卷积“计算过程了。

解码
首先说解码过程,encoder阶段是10512,也就是10个单词一块儿并行计算。但是测试的时候就是一个RNN的结构。就是把上一个输出,当做当前的输入。
参考这里的解释:
https://zhuanlan.zhihu.com/p/358572901
decoder解码并不是一步到位的,而是通过一个for循环,每次解码出一个单词(teacher forcing)。比如句子"我爱机器学习’‘的英文是‘’i love maching learning’’,那么 解码器的第一个输入是开始符 <\s>,得到的第一个输出 输出是 “I” ,然后将 <\s> 和 “I” 一起 当作输入第二次送入到 解码器,得到 第二个输出“love”,然后再将 <\s>和 “i” 和“love ” 一起送到 解码器得到第三个输出 maching 依次类推,直到解码器的输出是停止符号<eos>。
所以,解码第一个单词的时候,输入的维度是1
512。但是,不影响啊。按照上面的矩阵维度的转换过程。self-attention之后 的维度位N512,水平切分–>N864,然后再竖轴方向连接–>Q_ = 8N64。K位encoder的输出:81064,然后算相似度的时候,会按照后两个维度相乘,并且乘上K的转置:N64 · 6410 = N10,然后跟V相乘:N * 10 · 1064 = N64,然后拼接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值