IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> NLP入门系列1:attention和transformer -> 正文阅读

[人工智能]NLP入门系列1:attention和transformer

本文参考来源:https://github.com/datawhalechina/Learn-NLP-with-Transformers
(教程里带的图片实在是太直观了,这里就照搬了)

1.Attention

1.1 Seq2Seq模型

Seq2Seq模型,从字面意思上很容易理解:序列to序列模型,接收的输入是一个(单词、字母、图像特征)序列,输出是另外一个序列。seq2seq模型结构在很多任务上都取得了成功,如:机器翻译、文本摘要、图像描述生成。
请添加图片描述
将上面的“蓝箱子”拆开,里面其实由编码器(Encoder)和解码器(Decoder)两部分组成:
请添加图片描述
下图展示了在“机器翻译”领域,编码器和解码器的工作流程。
在这里插入图片描述
值得注意的是,编码器是接收了所有的序列输入之后,生成一个整体的context,然后再传给解码器进行解码,解码器再逐项生成序列中的元素。

这种方式有一个很明显的问题,不论我们的输入序列有多大,编码器总是只会生成一个context,这样,序列中所有元素的信息都混合在了一起,并没有进行区分。直观的来理解,当序列较长时,该模型的效果并不会很好。这时候,另一个划时代的产品诞生了。

1.2 Attention

Attention is allllllllll you need!(破音)

参考来源:https://zhuanlan.zhihu.com/p/46990010

在 Bahdanau等2014发布的Neural Machine Translation by Jointly Learning to Align and Translate 和 Luong等2015年发布的Effective Approaches to Attention-based Neural Machine Translation提出了attention机制,2017 年,Google 机器翻译团队发表的《Attention is All You Need》中,完全抛弃了RNN和CNN等网络结构,而仅仅采用Attention机制来进行机器翻译任务,并且取得了很好的效果,注意力机制也成为了大家近期的研究热点。

一个注意力模型不同于经典的序列到序列(seq2seq)模型,主要体现在 2 个方面:

首先,编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个 hidden state(隐藏层状态)(对于上文的seq2seq模型来说,该hidden state就是encoder传递给decoder的整体的context):
请添加图片描述
第二,注意力模型的解码器在产生输出之前,做了一个额外的处理。为了把注意力集中在与该时间步相关的输入部分。解码器做了如下的处理:

  1. 查看所有接收到的编码器的 hidden state(隐藏层状态)。其中,编码器中每个 hidden state(隐藏层状态)都对应到输入句子中一个单词。
  2. 给每个 hidden state(隐藏层状态)一个分数(我们先忽略这个分数的计算过程)。
  3. 将每个 hidden state(隐藏层状态)乘以经过 softmax 的对应的分数,从而,高分对应的 hidden state(隐藏层状态)会被放大,而低分对应的 hidden state(隐藏层状态)会被缩小。
    请添加图片描述
    通过以上的处理步骤描述,我们很容易的理解"attention"的意思,就是把注意力集中在自己关心的地方,对于自己不关心的地方,毫不关心。反映在具体的过程中就是,对于自己相应位置的单词,给予了0.96的权重,剩余位置的权重为0.02和0.02。这就在数学上,完成了attention的计算。

下图,我们使用另一种方式来可视化注意力,看看在每个解码的时间步中关注输入句子的哪些部分:
请添加图片描述

关于word embedding和预训练的相关内容,可以参考:
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

当然,通过上图,我们很明显能发现另一个问题,待翻译句子是三个单词,但是翻译出来却是四个单词,如果模型只是简单的对单词进行一一对应,这个“a”的出现就比较奇怪。由此很容易的想到另一个问题,中文和英文不仅仅不是一一对应,甚至语序都会有变化,那么机器是怎么翻译的呢?

其实,注意力模型不是无意识地把输出的第一个单词对应到输入的第一个单词。实际上,它从训练阶段学习到了如何在两种语言中对应单词的关系(在我们的例子中,是法语和英语)。下图展示了注意力机制的准确程度(图片来自于上面提到的论文):
请添加图片描述

参考阅读:
Neural Machine Translation (seq2seq) Tutorial

2. Transformer

参考教程:
The Illustrated Transformer
中文版本:
The Illustrated Transformer【译】
(内心OS:网上教程上来就贴个transformer那个经典的结构图,也足够折磨人的,这次我打算一步步来,你们要不要看一下?)请添加图片描述
诺,就是这个。

在理解了attention之后,就可以开始学习transformer了,Transformer 依赖于 Self Attention 的知识。2017 年,Google 提出了 Transformer 模型,用 Self Attention 的结构,取代了以往 NLP 任务中的 RNN 网络结构,在 WMT 2014 Englishto-German 和 WMT 2014 English-to-French两个机器翻译任务上都取得了当时 SOTA( state-of-the-art ) 的效果。

上面列举的这个图,只不过是吧transformer的结构拆解开来了,我们从transformer的整体开始一步步来拆解该模型,就好理解许多。以机器翻译的例子,从总体来看一下transformer。我们把待翻译的句子输入transformer,然后就输出了翻译结果,这和我们平时使用机器翻译的流程是一样的。
请添加图片描述
把中间这个transformer拆解开来,会发现,它是由encoders(编码器)和decoders(解码器)组成。
请添加图片描述
然后,机智的同学已经发现了,这个encoders是带s的,这个名字当然不是随便取的,因为encoders和decoders里包含了很多个encoder和decoder。(Transformer 的论文中使用了 6 层编码器,这里的层数 6 并不是固定的,你也可以根据实验效果来修改层数)。同理,解码部分也是由多层的解码器(Decoder)组成(论文里也使用了 6 层的解码器)。
请添加图片描述
接下来我们拆解单个encoder。每个encoder可以分为两层,分别为:

  • Self-Attention Layer
  • Feed Forward Neural Network(前馈神经网络,缩写为 FFNN)
    请添加图片描述

输入编码器的文本数据,首先会经过一个 Self Attention 层,这个层处理一个词的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息(可以理解为:当我们翻译一个词的时候,不仅会只关注当前的词,也会关注这个词的上下文的其他词的信息,如何使用的方法会在拆解Self Attention的时候具体介绍 )。

接下来,Self Attention 层的输出会经过前馈神经网络(FFNN)。

同理,解码器也具有这两层,但是这两层中间还插入了一个 Encoder-Decoder Attention 层,这个层能帮助解码器聚焦于输入句子的相关部分(Encoder的输出便是直接输入该层,该结构也会在后面详细展示,由于transformer的细节很多,在拆解的过程中,很容易失去整体性,建议在拆解完成后,再看一下transformer介绍开头的结构图,会有豁然开朗的感觉)。
请添加图片描述
编码器(Encoder)接收的输入都是一个向量列表,输出也是大小同样的向量列表,然后接着输入下一个编码器。第一个Encoder的输入是词向量,而后面的Encoder的输入是上一个编码器的输出。
把encoder再细化一下,看看词向量在编码器里是如何流动的。
请添加图片描述
每个单词转换成一个向量之后,进入self-attention层,每个位置的单词得到新向量,然后再输入FFN神经网络。
请添加图片描述
至此,对encoder的拆解到此结束,不妨回头看看整体的结构图,是不是清楚一些呢?下面,我们深入self-attention看一下。

2.1 Self-Attention

2.1.1 Self-Attention的作用

假设我们想要翻译的句子是:

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

这个句子中的 it 是一个指代词,那么 it 指的是什么呢?它是指 animal 还是street?这个问题对人来说,是很简单的,但是对算法来说并不是那么容易。当模型在处理(翻译)it 的时候,Self Attention机制能够让模型把it和animal关联起来。

同理,当模型处理句子中的每个词时,Self Attention机制使得模型不仅能够关注这个位置的词,而且能够关注句子中其他位置的词,作为辅助线索,进而可以更好地编码当前位置的词。请添加图片描述
如上图可视化图所示,当我们在第五层编码器中(编码部分中的最后一层编码器)编码“it”时,有一部分注意力集中在“The animal”上,并且把这两个词的信息融合到了"it"这个单词中。

2.1.2 Self-Attention的具体结构

Attention Score计算
计算 Self Attention 的第 1 步是:对输入编码器的每个词向量,都创建 3 个向量,分别是:Query 向量,Key 向量,Value 向量。这 3 个向量是词向量分别和 3 个矩阵相乘得到的,而这个矩阵是我们要学习的参数。

注意,这 3 个新得到的向量一般比原来的词向量的长度更小。假设这 3 个向量的长度是 d k e y d_{key} dkey?,而原始的词向量或者最终输出的向量的长度是 512(这 3 个向量的长度,和最终输出的向量长度,是有倍数关系的)。本例是只有一个 head 的 Self-Attention计算过程。
请添加图片描述
上图中,有两个词向量:Thinking 的词向量 X 1 X_1 X1?? 和 Machines 的词向量 X 2 X_2 X2??。以 X 1 X_1 X1?? 为例, X 1 X_1 X1?? 乘 W Q W^Q WQ? 得到 q 1 q_1 q1??, q 1 q_1 q1?? 就是 X 1 X_1 X1??对应的 Query 向量。同理, X 1 X_1 X1??乘 W K W^K WK?得到 k 1 k_1 k1??, k 1 k_1 k1??是 X 1 X_1 X1?? 对应的 Key 向量; X 1 X_1 X1?? 乘 W V W^V WV?得到 v 1 v_1 v1??, v 1 v_1 v1?? 是 X 1 X_1 X1??对应的 Value 向量。

Query 向量,Key 向量,Value 向量是什么含义呢?
参考阅读:深度学习attention机制中的Q,K,V分别是从哪来的?

接下来,我们要使用这三个向量计算每个单词的注意力分数(attention score),这里有个小tip:每个单词都有需要计算一个注意力分数。假设我们现在计算第一个词 Thinking 的 Attention Score(注意力分数),需要根据 Thinking 这个词,对句子中的其他每个词都计算一个分数。这些分数决定了我们在编码Thinking这个词时,需要对句子中其他位置的每个词放置多少的注意力。

这些分数,是通过计算 “Thinking” 对应的 Query 向量和其他位置的每个词的 Key 向量的点积,而得到的。如果我们计算句子中第一个位置单词的 Attention Score(注意力分数),那么第一个分数就是 q 1 q_1 q1??和 k 1 k_1 k1??的内积,第二个分数就是 q 1 q_1 q1?? 和 k 2 k_2 k2?? 的内积。请添加图片描述
之后,把每个分数除以 ( d k e y ) \sqrt(d_{key}) ( ?dkey?) d k e y d_{key} dkey?是 Key 向量的长度)。你也可以除以其他数,除以一个数是为了在反向传播时,求取梯度更加稳定。接着把这些分数经过一个 Softmax 层,Softmax可以将分数归一化,这样使得分数都是正数并且加起来等于 1。这些分数决定了在编码当前位置(这里的例子是第一个位置)的词时,对所有位置的词分别有多少的注意力。

得到每个位置的分数后,将每个分数分别与每个位置词的 Value 向量相乘。对于分数高的位置,相乘后的值就越大,我们把更多的注意力放到了它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大的,这样我们就忽略了这些位置的词。一个显而易见的结果是,thinking肯定对自己添加了更多注意力,但是,在例子“The animal didn’t cross the street because it was too tired”中的"it",就是在animal中添加了更多的注意力。
请添加图片描述
最后,把上一步得到的向量相加,就得到了 Self Attention 层在这个词位置(这里的例子是第一个位置)的输出,得到的分数,会接着输入到FFNN中。

以下,是一个head的self-attention的完整计算过程。
请添加图片描述
但这样每次只能计算一个位置的输出向量,在实际的代码实现中,Self Attention 的计算过程是使用矩阵来实现的,这样可以加速计算,一次就得到所有位置的输出向量。下面让我们来看,如何使用矩阵来计算所有位置的输出向量。

用矩阵计算 Attention Score
第一步是计算 Query,Key,Value 的矩阵。首先,我们把所有词向量放到一个矩阵 X 中,然后分别和3 个权重矩阵 W Q , W K W V W^Q, W^K W^V WQ,WKWV 相乘,得到 Q,K,V 矩阵。
请添加图片描述

请添加图片描述

然后,我们可以将上述的一个head的self-attention的计算过程压缩为一步来处理
请添加图片描述

2.2 multi-head attention(多头注意力机制)

Transformer 的论文通过增加多头注意力机制(一组注意力称为一个 attention head),进一步完善了 Self Attention 层。这种机制从如下两个方面增强了 attention 层的能力:

  • 它扩展了模型关注不同位置的能力。在上面的例子中,第一个位置的输出 z1 包含了句子中其他每个位置的很小一部分信息,但 z1 可能主要是由第一个位置的信息决定的。当我们翻译句子:The animal didn’t cross the street because it was too tired时,我们想让机器知道其中的it指代的是什么。这时,多头注意力机制会有帮助。
  • 多头注意力机制赋予 attention 层多个“子表示空间”。多头注意力机制会有多组 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV 的权重矩阵(在 Transformer 的论文中,使用了 8 组注意力(attention heads)。因此,接下来我也是用 8 组注意力头 (attention heads))。每一组注意力的 的权重矩阵都是随机初始化的。经过训练之后,每一组注意力 W Q , W K W V W^Q, W^K W^V WQ,WKWV 可以看作是把输入的向量映射到一个“子表示空间”。
    请添加图片描述
    在多头注意力机制中,每组注意力维护单独的 W Q , W K , W V W^Q, W^K ,W^V WQ,WK,WV权重矩阵。将输入 X 和每组注意力的 W Q , W K , W V W^Q, W^K ,W^V WQ,WK,WV相乘,得到 8 组 Q, K, V 矩阵。可以直观的理解为,由于 W Q , W K W V W^Q, W^K W^V WQ,WKWV矩阵不同,所以每个head的每个词的attention分数都不同,意味着每个head,都会注意到不同的词。而后,我们在将这些head拼接在一起的过程中,给予不同的head不同的权重,就可以得到我们想要的attention分数。

接着,我们把每组 K, Q, V 计算得到每组的 Z 矩阵,就得到 8 个 Z 矩阵。请添加图片描述
接下来把矩阵拼接起来,然后和另一个权重矩阵 W Q W^Q WQ相乘,得到整体输出Z矩阵。
请添加图片描述先把 8 个矩阵 {Z0,Z1…,Z7} 拼接起来,把拼接后的矩阵和 W Q W^Q WQ权重矩阵相乘,得到最终的矩阵 Z,这个矩阵包含了所有 attention heads(注意力头) 的信息。这个矩阵会输入到 FFNN (Feed Forward Neural Network)层。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:04:06  更:2021-08-19 12:06:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 19:55:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码