Transformer
Transformer
wuan1.特点
使用==注意力==来提高这些模型训练速度的模型
(最大的好处源于The Transformer如何使自己适合并行化)
2.介绍
Transformer抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。
RNN计算限制:
1.简介
RNN算法只能从左向右依次计算
2.问题
–时间t依赖t-1时刻的计算结果,这样限制了模型的并行能力;
–顺序计算的过程信息会丢失,尽管LSTM(长短时记忆网络)(这是一种改进后的循环神经网络,能够解决RNN无法处理长距离依赖的问题 通过引入三个门(遗忘门、输出门和输出门)来控制信息的流动,从而更好地处理序列中的长期依赖关系 )一定程度上缓解了长期依赖的问题,但是对于长期依赖现象,LSTM依旧无能为力。
Transformer的好处(也就是解决方法)
–使用了attention机制,将序列中任意两个位置的距离缩小为一个常量
–不是RNN的顺序结构,因此具有很好的并行性
==Transformer结构==:
1.输入–小黑盒–输出
2.小黑盒:
Encoders + Decoders
Encoder编码组件是一堆编码器(论文上将六个堆在一起–数字6并没有什么神奇之处)。解码组件是一堆相同数量的解码器。
3.Encoder编码器:
self-attention —-Feed Forward Neural Network(前馈神经网络)
过程:
self-attention:这层帮助编码器在对特定单词进行编码时查看输入句子中的其他句子。
自注意力层的输出被馈送到Feed Forward Neural Network.(完全相同的前馈网络独立应用于每个位置)
4.Decoder解码器
解码器具有三个层,比encoder编码器多一个Encoder-Decoder Attention,
作用是帮助机器专注于句子输入句子的相关部分
输入编码的详细过程:
1.Embedding嵌入算法将每个输入单词转换为向量
(每个单词都嵌入到大小为512的向量中)
Embedding嵌入仅发生在最底部的编码器中。
所有编码器共有的抽象是它们接受一个大小为512的向量列表–在编码器中,这将是嵌入。
(但是在其他编码器中就是输入–直接在下方的编码器中输出)
这个列表的大小是我们可以设置的超参数-–%% 基本上它是我们训练数据集中最长句子的长度。 %%
//在自注意力层Self-Attention中,这些路径之间存在依赖关系。然而,Feed Forward前馈层没有这些依赖关系。—因此各种路径可以在流过前馈层的同时并行执行
Transformer模型
Tensor2Tensor 简介 - Colab — Tensor2Tensor Intro - Colab
self-attention具体步骤:
question:如何使用向量计算自注意力
-1.从每个编码器的输入向量创建三个向量Q,K,V
- (Q是查询向量,K是键向量,V是一个值向量)
- –1.从每个编码器的输入向量创建三个向量Q,K,V(在这种情况下,每个词的嵌入)
- –2.这些向量是通过嵌入乘以我们在训练过程中训练的三个矩阵来创建的
- –3.新向量Q,K,V的维度小于嵌入向量,维度为64,它们不必更小,这是使多头注意力(大部分)的计算保持不变的架构选择。
- (嵌入和编码器输入/输出向量维数为512)
现在可能有一个问题就是你并没有理解查询Q,键K,值V向量
==其实它们就是计算和思考注意力的抽象概念==
-2.
第二步是计算一个分数
-3.4.将分数除以8,然后通过softmax操作传递结果
(Softmax将分数归一化,因此它们都是正数并且加起来为1)
%% Softmax分数:决定了每个单词在这个位置上的表达量。显然,这个位置的单词具有最高的softmax分数,但有时关注与当前单词相关的另一个单词很有用 %%
-5.将每个值向量乘以softmax分数
(这里的直觉是保持我们想要关注的单词的值不变,并淹没不相关的单词
-6.对加权值向量求和。
(这会在这个位置产生自注意力层的输出)
question:自注意力的矩阵计算
-1.计算查询Q,键K和值V矩阵
(通过将嵌入打包到矩阵X中,并将乘以我们训练的权重矩阵来做到这一点)
==多头注意力机制==
好处:进一步完善了自注意力层self-attention
[!NOTE]
它扩展了模型关注不同位置的能力。是的,在上面的示例中,z1 包含一点其他编码,但它可能由实际单词本身主导。如果我们要翻译“The animal didn’t cross the street because it was too tired”这样的句子,那么知道“it”指的是哪个词会很有用。
它为注意力层提供了多个“表示子空间”。正如我们接下来将看到的,使用多头注意力,我们不仅有一个,而且还有多组查询/键/值权重矩阵(Transformer 使用八个注意力头,所以我们最终每个编码器/解码器都有八个集合) . 这些集合中的每一个都是随机初始化的。然后,在训练之后,每个集合用于将输入嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。
解码器堆栈输出一个浮点向量。
question:如何变成一个词
(这是最后一个线性层的工作,后面一个是softmax层)
线性层:
是一个简单的全连接神经网络,它将解码器堆栈产生的向量投影到一个更大的向量(logits向量)中
**残差(**The Residuals Network)
编码器架构中的一个细节是每个编码器中的每个子层在其周围都有一个残差连接,然后是一个层归一化的步骤
解码器端(The Decoder Side)
解码器首先处理输入序列。然后将顶部编码器的输出转换成一组注意向量K和V。这些将由每个解码器在其“编码器-解码器”层使用,这有助于解码器将注意力集中在输入序列的适当位置。
以下步骤重复该过程,直到出现特殊到达符号表示变压器解码器已完成其输出。每一步的输出在下一步被亏送到底部的解码器,解码器就像编码器一样冒泡它们的解码结果。就像我们对编码器输入所做的那样,我们将位置编码嵌入并添加到这些解码器输入中,以指示每个单词的位置。
解码器中的自注意力层的操作方式与编码器中的方式略有不同:
在解码器中,自注意力层只允许关注==输出序列中较早的位置==。这是通过在 self-attention 计算中的 softmax 步骤之前masking屏蔽未来位置(将它们设置为 )来完成的。
“Encoder-Decoder Attention”层的工作方式与多头自注意力相似,不同之处在于它从==其下方的层创建其查询矩阵==,并从编码器堆栈的输出中获取 Keys 和 Values 矩阵。
中间省略了使用位置编码表示序列的顺序
本文章参照
翻译: 详细图解Transformer多头自注意力机制 Attention Is All You Need-CSDN博客
我希望您发现这是一个有用的地方,可以开始使用 Transformer 的主要概念打破僵局。如果您想更深入,我建议您执行以下步骤:
观看原作的视频:https://youtu.be/-QH8fRhqFHM
阅读Attention Is All You Need论文、Transformer 博客文章(Transformer: A Novel Neural Network Architecture for Language Understanding)和Tensor2Tensor 公告。
观看Łukasz Kaiser 的演讲,了解模型及其细节
使用作为 Tensor2Tensor 存储库的一部分提供的Jupyter Notebook
探索Tensor2Tensor repo。
参考
https://arxiv.org/abs/1706.03762
https://jalammar.github.io/illustrated-transformer/
https://zhuanlan.zhihu.com/p/48508221




![[object Object]](https://img.090227.xyz/file/ae62475a131f3734a201c.png)