怎么样训练自己的口才(你们都是怎么训练自己的口才的)
972
2022-05-30
Transformer学习
细抠Transformer
Self-Attention详解
如何计算encoder self attention?
muti-headed attention
用位置编码表示句子的序列中词的顺序
残差
Decoder 部分
最后的Linear和softmax层
基础:Attention model
A High-Level Look
模型如何运作?
细抠Transformer
基础:Attention model
attention model是从输入句
输入句中的每个文字是由一系列成对的
上图(左)中Query和各个Key的相似性是score e_{ij}= Similarity(Query, Key_{i}),计算方法是内积,我们通过softmax算出Softmax(sim_{i})=a_{i}得到attention score a_{i},然后透过attention score a_{i}乘上Value_{i}的序列和加总所得 = Attention(Query, Source)。
A High-Level Look
首先把模型看做一个黑箱子:
在机器翻译任务中,就是输入一个语言的一句话,输出另一语言对应的翻译。
把黑箱子打开看:
我们可以看到一个编码组件、一个解码组件,和它俩之间的链接。
编码组件就是一堆编码器的堆叠(论文中用了6个),同样解码组件就是6个解码器堆叠在一起。
编码器之间参数不共享,每个编码器可分解为两层:
输入数据首先流向一个自注意力层-这一层的作用是通过句子中的其他单词,针对某个特定的词进行编码,自注意力层的输出流入一个前馈的神经网络,所以这样每一个编码器都重点关注输入的句子中的某个词。
一个decoder是在自注意力层和前馈网络层中间再加一个attention layer
模型如何运作?
首先我们把输入的单词转为词向量。
编码之后的词向量再分别的流向encoder里面的两层网络。
Self-Attention详解
我们输入一句话:”The animal didn’t cross the street because it was too tired”。
“it”是指什么?动物?街道?自注意力机制的作用就是把“it”和“animal”联系起来;
当模型处理每个词的时候,自注意力机制将句子中的其他词作为线索,针对某个特定的词进行更好的编码,所以自注意力机制其实就是通过句子中的其他单词去理解某一个单词的方法。
如何计算encoder self attention?
第一步是创造三个encoder的输入向量Q,K,V,举例来说,“Are you very big?”中的每一个字的隐向量都有各自的Q,K,V,是通过词向量乘一个初始化矩阵得到,论文中是512维。Q,K,V的维数都比词向量要小,论文中是64维。
第二步通过内积计算score
第三步是将算出的分数除以根号d_{k},论文中是64,目的是避免内积过大时,softmax產出的结果非0即1。然后第四步就是通过softmax得出attention score,表示在这个位置上我们应该放多少注意力。
第五步是用value vector乘以上面算出的softmax注意力得分,目的是保留我们集中注意力的单词的value,同时稀释那些不相关的词的value。
第六步就是把上一步加权的value加总,得到自注意力层的输出值z。
在实际操作中,是直接将每个文字同时处理,因此会变成一个矩阵,而非单一词向量,计算后的结果attention vector也会变成attention matrix Z:
6. 计算Query, Key, and Value 矩阵:把通过训练得到的权重矩阵(WQ, WK, WV)和词向量X相乘
使用矩阵乘法,我们就能把前面计算self-attention的六步合并成一步:
muti-headed attention
论文在自注意力机制的基础上又加了一个多头注意力机制,这个机制从两个方面增强了注意力层的表现:
增加了模型将注意力集中在多个不同位置的能力
muti-headed attention可以使我们拥有多组的 Query/Key/Value 权重矩阵(论文中是8组)。每一组都随机初始化经过训练之后,能够将输入的词向量转化为具有不同代表意义的子空间(different representation subspace)
通过将词向量与8个不同的权重矩阵相乘,我们得到的事8个不同的Z矩阵
然而前馈层只处理一个矩阵而不是8个,所以我们要把8个压缩成1个,方法就是再创造一个权重矩阵WO:
所以multi-headed attention整个流程串起来就是:
那么不同的attention head的注意力都集中在什么地方呢? 我们先看一个例子:
给“it”编码时,一个attention head集中在“animal”,另一个集中在“tired”
但是当我们把全部的attention head都加上时,却变得难以解释:
用位置编码表示句子的序列中词的顺序
Transformer 给每个输入的词向量又加了一个向量,这些向量的作用的定义每个词在句子中的位置以及不同词之间的距离:
假设位置向量是4维的,那么例子中的位置向量就长这样:
那么为什么长这样呢?
下图中每行都代表一个字的位置向量,那么第一行就是位置中的第一个词,每行是512维的向量,每个值都是-1-1之间。 可以看到在一半的位置(第255维左右),图被劈了一半,因为左半边的值是sine算的,右半边用cosine算的;具体的可以自己看论文,代码get_timing_signal_1d():
残差
对于每个encoder里面的每个sub-layer,它们都有一个残差的连接(不懂?),而且每个sub-layer后面还有一步 layer-normalization(不懂,以后再看)。
具体长这样(不懂):
对于decoder模块也是一样的操作:
Decoder 部分
encoder部分说完了,decoder怎么工作也有了大致的了解,那么它俩是怎么一起工作的呢?
最后一层encoder的输出会被转化为一组attention vector:K和V。 然后这一组attention vector会再decoder层的encoder-decoder attention层被用到,目的是帮助decoder专注在输入序列中合适的位置:
接着重复上面的步骤,直到decoder全部输出完成
decoder中的self-attention layer和encoder中的有一点区别:在decoder中,自注意力层只能处理输出序列中当前词之前的序列,做法是在计算softmax之前把后面的词都设成 -inf。
“Encoder-Decoder Attention”层就和multiheaded self-attention的运作方式一样。
最后的Linear和softmax层
Linear层就是一个全连接网络,作用是把decoder输出的向量映射到一个大很多的logits 向量上。
比如模型从训练集中学会10,000个英文单词,那么logits vector就是10000维的,没一维对应一个词,记过softmax计算后输出分数最高的那个词就是这一步的输出
相关Transformer必读文章一:https://www.cnblogs.com/huangyc/p/9813907.html
相关Transformer必读文章二:https://www.jianshu.com/p/feaf7138c847
相关Transformer必读文章三(与本文区别):https://blog.csdn.net/qq_41664845/article/details/84969266
相关Transformer详细原理必读文章四:https://blog.csdn.net/randompeople/article/details/90651250
相关Transformer必读文章五:https://blog.csdn.net/weixin_40005743/article/details/85460869
人工智能 AI
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。