当前位置:   article > 正文

Transformer入门笔记_transfermers支持has no attribute logits

transfermers支持has no attribute logits

参考链接:https://blog.csdn.net/longxinchen_ml/article/details/86533005


相关知识:

  • 谷歌退出的BERT 模型去到了NLP任务的SOTA,关键成功因素是Transformer

  • Transformer最早是用于机器翻译任务。

  • Transformer的优点:

    1. 改进了RNN训练慢的缺点,具体来说,是利用self-attention机制实现快速并行。
    2. Transformer可以把神经网络的深度加深,充分发挥DNN的优势。
  • Transformer是在论文《Attention is All You Need》(https://arxiv.org/abs/1706.03762)中提出了,这里推荐阅读。

宏观看Transformer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编码器

单个编码器由 一个自注意力 和一个前馈神经网络 组成。

  • 自注意力(self-attention):这层帮助编码器在对每个单词编码时关注输入句子的其他单词
  • 前馈神经网络(feed-forword):每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)

解码器

  • 自注意力

  • 编码-解码注意力层:用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。

  • 前馈神经网络

在这里插入图片描述

张量引入

  • 词转换为词向量。 每个词维度为512
    在这里插入图片描述
  • 所有的编码器都有一个相同的特点,即它们接收一个向量列表,列表中的每个向量大小为512维。
  • 向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度。
    在这里插入图片描述

接下来我们看看Transformer的一个核心特性,在这里输入序列中每个位置的单词都有自己独特的路径流入编码器。在自注意力层中,这些路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。

例句:

The animal didn’t cross the street because it was too tired

当模型处理这个单词“it”的时候,自注意力机制会允许“it”与“animal”建立联系。

如何维持隐藏层:

  • RNN:将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来
  • 自注意力机制:会将所有相关单词的理解融入到我们正在处理的单词中。

微观看自注意力机制

计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。这三个向量有助于计算和理解注意力机制的抽象概念。

  • 查询向量
  • 键向量
  • 值向量

在这里插入图片描述

X1与WQ权重矩阵相乘得到q1

计算自注意力的第二步是计算得分。
假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。
在这里插入图片描述
这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。

第三步是将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),
第四步通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。
在这里插入图片描述
这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。

第五步是将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。

第六步是对加权值向量求和(译注:自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。),然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。
在这里插入图片描述

实际中,这些计算是以矩阵形式完成的,以便算得更快。那我们接下来就看看如何用矩阵实现的。

矩阵运算实现自注意力机制

步骤2到步骤6合并为一个公式来计算自注意力层的输出。

多头怪

通过增加一种叫做**“多头”注意力(“multi-headed” attention)的机制**,论文进一步完善了自注意力层,并在两方面提高了注意力层的性能:

  • 它扩展了模型专注于不同位置的能力。
  • 它给出了注意力层的多个 “表示子空间”(representation subspaces)

如果我们做与上述相同的自注意力计算,只需八次不同的权重矩阵运算,我们就会得到八个不同的Z矩阵。
在这里插入图片描述

前馈层不需要8个矩阵,它只需要一个矩阵(由每一个单词的表示向量组成)。所以我们需要一种方法把这八个矩阵压缩成一个矩阵。

直接把这些矩阵拼接在一起,然后用一个附加的权重矩阵WO与它们相乘。
在这里插入图片描述

在这里插入图片描述

位置编码表示序列的顺序

到目前为止,我们对模型的描述缺少了一种理解输入单词顺序的方法。

为了解决这个问题,Transformer为每个输入的词嵌入添加了一个向量。
在这里插入图片描述

为了让模型理解单词的顺序,我们添加了位置编码向量,这些向量的值遵循特定的模式。

如果我们假设词嵌入的维数为4,则实际的位置编码如下:

在这里插入图片描述

尺寸为4的迷你词嵌入位置编码实例
在下图中,每一行对应一个词向量的位置编码,所以第一行对应着输入序列的第一个词。每行包含512个值,每个值介于1和-1之间。我们已经对它们进行了颜色编码,所以图案是可见的。
在这里插入图片描述
20字(行)的位置编码实例,词嵌入大小为512(列)。你可以看到它从中间分裂成两半。这是因为左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们拼在一起而得到每一个位置编码向量。 //为什么要用两个函数生成呢?

残差模块

编码器架构中的一个细节:在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都跟随着一个**“层-归一化”步骤**。

层-归一化:https://arxiv.org/abs/1607.06450
在这里插入图片描述

解码组件

编码器通过处理输入序列开启工作。顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 。

每个步骤的输出在下一个时间步被提供给底端解码器,并且就像编码器之前做的那样,这些解码器会输出它们的解码结果 。
另外,就像我们对编码器的输入所做的那样,我们会嵌入并添加位置编码给那些解码器,来表示每个单词的位置。

最终的线性变换和Softmax层

解码组件最后会输出一个实数向量。
线性变换层要做的工作是 , 将一个浮点数变为一个单词。
线性变换层之后就是softmax层。
线性变换层是一个全连接神经网络,将解码器产生的向量投射到一个比它大的多的,被称为 对数几率logits的向量里面。

不妨假设我们的模型从训练集中学习一万个不同的英语单词(我们模型的“输出词表”)。因此对数几率向量为一万个单元格长度的向量——每个单元格对应某一个单词的分数。

接下来的Softmax 层便会把那些分数变成概率(都为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间步的输出。
在这里插入图片描述

训练部分总结

但目标输出的编码:
在这里插入图片描述

损失函数

我们可以用真实的输出来比较它,然后用反向传播算法来略微调整所有模型的权重,生成更接近结果的输出。
常用的概率分布方法:

  • 交叉熵:https://colah.github.io/posts/2015-09-Visual-Information/

  • KL散度:https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained

我们期望训练过后,模型会输出正确的翻译。当然如果这段话完全来自训练集,它并不是一个很好的评估指标

因为这个模型一次只产生一个输出,不妨假设这个模型只选择概率最高的单词,并把剩下的词抛弃。这是其中一种方法(叫贪心解码)。另一个完成这个任务的方法是留住概率最靠高的两个单词(例如I和a),那么在下一步里,跑模型两次:其中一次假设第一个位置输出是单词“I”,而另一次假设第一个位置输出是单词“me”,并且无论哪个版本产生更少的误差,都保留概率最高的两个翻译结果。然后我们为第二和第三个位置重复这一步骤。这个方法被称作集束搜索(beam search)。在我们的例子中,**集束宽度是2(**因为保留了2个集束的结果,如第一和第二个位置),并且最终也返回两个集束的结果(top_beams也是2)。这些都是可以提前设定的参数。

再进一步
我希望通过上文已经让你们了解到Transformer的主要概念了。如果你想在这个领域深入,我建议可以走以下几步:阅读Attention Is All You Need,Transformer博客和Tensor2Tensor announcement,以及看看Łukasz Kaiser的介绍,了解模型和细节。

Attention Is All You Need:https://arxiv.org/abs/1706.03762

Transformer博客:https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html

Tensor2Tensor announcement:https://ai.googleblog.com/2017/06/accelerating-deep-learning-research.html

Łukasz Kaiser的介绍:https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb

接下来可以研究的工作:

Depthwise Separable Convolutions for Neural Machine Translation

https://arxiv.org/abs/1706.03059

One Model To Learn Them All

https://arxiv.org/abs/1706.05137

Discrete Autoencoders for Sequence Models

https://arxiv.org/abs/1801.09797

Generating Wikipedia by Summarizing Long Sequences

https://arxiv.org/abs/1801.10198

Image Transformer

https://arxiv.org/abs/1802.05751

Training Tips for the Transformer Model

https://arxiv.org/abs/1804.00247

Self-Attention with Relative Position Representations

https://arxiv.org/abs/1803.02155

Fast Decoding in Sequence Models using Discrete Latent Variables

https://arxiv.org/abs/1803.03382

Adafactor: Adaptive Learning Rates with Sublinear Memory Cost

https://arxiv.org/abs/1804.04235

注:
本文系大数据文摘与百度NLP联合出品系列文章第一篇。百度NLP以“理解语言,拥有智能,改变世界”为使命,开展包括自然语言处理、机器学习、数据挖掘在内的技术研究和产品应用工作,引领着人工智能技术的发展。
————————————————
版权声明:本文为CSDN博主「龙心尘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/longxinchen_ml/article/details/86533005

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/906623
推荐阅读
相关标签
  

闽ICP备14008679号