Transformer算法是基于attention算法改造的,它去掉了attention算法的rnn操作从而实现了并行化操作。所以要先从attention算法说起。
本文参考:/%E7%AF%87%E7%AB%A02-Transformer%E7%9B%B8%E5%85%B3%E5%8E%9F%E7%90%86/2.2-%E5%9B%BE%E8%A7%A3transformer.md
Attention算法最主要的用途是seq2seq场景,也就是从一个文本序列得到另一个文本序列。最初的seq2seq是基于rnn算法的,rnn的过程说明如下:
输入input#1 和hidden state#0两类信息,输出output#1 和 hidden state#1两类信息。基于RNN的seq2seq整体动态过程如下:
静态效果如下:
Seq2seq以机器翻译为例描述为:seq2seq分为encoder和decoder两个部分。
在encoder阶段,根据输入的单词的embedding信息,rnn的每个时间点会输出hidden state。然后将该hidden state与下一个时间点的输入再输入rnn模型继续生成新的hidden state,直到输出最后一个hidden state,我们称该hidden state为context,因为它汇总了所有输入单词的信息。
穿插机器翻译的特殊符号:<bos>句子的开始,<eos>句子的结尾,<pad>填充字符。
在decoder阶段,将<bos>的embedding和context输入rnn模型得到hidden state,hidden state可以通过fc映射到voc上的概率分布,然后取argmax上的单词为第一个预测单词。接着将上一步的hidden state和context再输入rnn模型继续得到下一步的hidden state,同时可以预测出第二个翻译单词。该过程直到预测出的单词为<eos>为止。
Seq2seq的瓶颈:
attention算法的编码器会把更多的数据传递给解码器,它会把所有时间步的hidden state传递给解码器,而不是只传递最后一个hidden state。
Context每一步也不一样了,解码器根据输入的所有hidden state计算每步的context操作如下:
具体过程如下:
解码器整个过程如下:
每层编码器网络结构是一样的,每层解码器网络结构也是一样的。不同层编码器和解码器结构不共享参数。
单层编码器由2部分组成:
Self-Attention层处理一个词向量的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息,它的输入输出维度保持不变。
将输入文本序列的每个词转换为一个词向量,再加上位置向量来得到该词的最终向量。
加:并非concat的方式,而是直接数值相加。
假设一句话输入两个单词:Thinking Machines。
第1步,对输入编码器的词向量进行线性变换:Query向量q1和q2,Key向量k1和k2,value向量v1和v2。这3个向量是词向量分别和3个参数矩阵相乘得到的,而这个矩阵也是模型要学习的参数。
穿插:Query向量、key向量、value向量其实只是3个向量,给他们加上一个名称而已。Query和key计算得到attention得分,然后根据attention得分对value进行加权求和。
第2步,计算attention分数。Query向量和其他位置的每次词的key向量进行点积得到。
第3步,把每个分数除以sqrt(dk),dk是key向量的维度。除以一个数是为了在反向传播时,求梯度更加稳定。
第4步,把这些分数经过一个softmax函数
第5步,得到每个词向量的分数后,将分数分别与对应的value向量相乘。对于分数高的位置,相乘后的值就越大,我们把更多的注意力放到了它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大的。
第6步,把第5步得到的value向量相加,就得到了self attention在当前位置(比如第1个位置)对应的输出。
它增强了attention层的能力。
在多头注意力机制中,为每组注意力设定单独的WQ,WK,WV参数矩阵,将输入X和每组注意力的WQ,WK,WV相乘,得到8组Q,K,V矩阵。接着,把每组K,Q,V计算得到每组的Z矩阵,就得到8个Z矩阵。
由于前馈神经网路层接收的是1个矩阵,而不是8个矩阵,所以把8个子矩阵拼接成一个大的矩阵,然后和另一个权重矩阵WO相乘做一次变换,映射到前馈神经网络所需要的维度。
整个多头注意力机制的流程放到一张图中如下:
编码器一般有多层,第一个编码器的输入是一个序列文本,最后一个编码器输出是一组序列的向量,这组序列向量会作为解码器的K、V输入,其中K=V=解码器输出的序列向量表示。
解码阶段的每一个时间步都输出一个翻译后的单词,解码器当前时间步的输出又重新作为Q和编码的输出K、V共同作为下一个时间步解码器的输入。然后重复整个过程,直到输出一个结束符。
解码器的self attention和编码器的self attention层的区别:
线性层是一个普通的全连接神经网络,把解码器输出的向量,映射到一个更大的向量。假设模型有10000个英语单词,此向量便会有10000个数字,每个数表示一个单词的分数。
然后,softmax层会把这些分数转换为概率。然后选择最高概率的那个数字对应的词,就是整个时间步的输出单词。
交叉熵,使得输出概率分布和目标概率分布接近一致。
本文发布于:2024-01-28 21:49:04,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170644974710512.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |