NLP学习笔记——Transformer模型

NLP学习笔记——Transformer模型

1.概述

《Attention Is All You Need》是Google在2017年提出的一篇将Attention思想发挥到极致的论文。该论文提出的Transformer模型,基于encoder-decoder架构,抛弃了传统的RNN、CNN模型,仅由Attention机制实现,并且由于encoder端是并行计算的,训练时间大大缩短

Transformer模型广泛应用于NLP领域,机器翻译、文本摘要、问答系统等等,目前火热的Bert模型就是基于Transformer模型构建的。

2.模型特点

传统seq2seq最大的问题在于将Encoder端的所有信息压缩到一个固定长度的向量中,并将其作为Decoder端首个隐藏状态的输入,来预测Decoder端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入Decoder端,Decoder端不能够关注到其想要关注的信息。并且模型计算不可并行,计算隐层状态 h t h_t ht依赖于 h t − 1 h_{t-1} ht1以及状态 t t t时刻的输入,因此需要耗费大量时间。

Transformer优点:transformer架构完全依赖于Attention机制,解决了输入输出的长期依赖问题,并且拥有并行计算的能力,大大减少了计算资源的消耗。self-attention模块,让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的embedding表示所蕴含的信息更加丰富,而且后续的FFN层也增强了模型的表达能力。Muti-Head Attention模块使得Encoder端拥有并行计算的能力

3.模型原理

3.1 总体结构

transformer采用encoder-decoder架构,如下图所示。Encoder层和Decoder层分别由6个相同的encoder和decoder堆叠而成,模型架构更加复杂。其中,Encoder层引入了Muti-Head机制,可以并行计算,Decoder层仍旧需要串行计算

在这里插入图片描述

Encoder层和Decoder层内部结构如下图所示。

  1. Encoder具有两层结构,self-attention和前馈神经网络。self-attention计算句子中的每个词都和其他词的关联,从而帮助模型更好地理解上下文语义,引入Muti-Head attention后,每个头关注句子的不同位置,增强了Attention机制关注句子内部单词之间作用的表达能力。前馈神经网络为encoder引入非线性变换,增强了模型的拟合能力。
  2. Decoder接受output输入的同时接受encoder的输入,帮助当前节点获取到需要重点关注的内容

在这里插入图片描述

3.2 Multi-Head Attention

Multi-Head Attention 计算过程如下图,在讲解Multi-Head Attention之前,我们需要了解self-attention。

在这里插入图片描述

self-attention 机制用于计算句子中当前词与其他词的联系,举个例子:

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

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

两句话中的单词 it 指代不同,第一句话 it 指代 animal 而第二句指代 street。对于我们来说能很简单的判断出来,但是对于机器来说,是很难判断的,尤其是相对于传统seq2seq模型。两句话在单词 it 之前的内容是一样的,传统seq2seq模型encoder的顺序输入导致模型无法区分这种差别。而self-attention机制通过计算单词it与其他词之间的联系得知it的具体指代,最终结果如下图所示。

在这里插入图片描述

那么具体的计算过程是怎样的呢,我们先上公式,然后一步步拆解:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V

其实attention可以有很多种计算方式,加性attention,点积attention等等,论文中采用的是点积attention。公式如上

对于这个公式,我们首先进行一个大致的理解:Q,K,V是三个矩阵,分别是Query Key Value的缩写,Query与Key作用得到attention的权值,之后这个权值作用在Value上得到attention值。

在这里插入图片描述

举一个具体的例子:

  1. X X X 是我们的输入句子Embedding后的结果, X 1 X_1 X1 X 2 X_2 X2 是其前两个单词。算法的第一步需要计算 q q q$ k$ v v v 向量。这三个向量是 X X X 分别于其权重矩阵 W Q W^Q WQ W K W^K WK W V W^V WV相乘得到,如下图所示

在这里插入图片描述

  1. 计算self-attention的分数值,该分数值决定了当我们在某个位置encode一个词时,对输入句子的其他部分的关注程度。这个分数值的计算方法是Query与Key做点乘,以下图为例,首先我们需要针对Thinking这个词,计算出其他词对于该词的一个分数值,首先是针对于自己本身即q1·k1,然后是针对于第二个词即q1·k2。在这里插入图片描述

  2. 接下来,把点成的结果除以一个常数,这里我们除以8,这个值一般是采用上文提到的矩阵的第一个维度的开方即64的开方8,当然也可以选择其他的值,然后把得到的结果做一个softmax的计算。得到的结果即是每个词对于当前位置的词的相关性大小,当然,当前位置的词相关性肯定会会很大。在这里插入图片描述

  3. 下一步就是把Value和softmax得到的值进行相乘,并相加,得到的结果即是self-attetion在当前节点的值。

在这里插入图片描述

为了方便理解,例子中都是通过向量进行计算,实际情况下为了提高计算速度,我们采用的是矩阵的方式。即embedding 后的输入矩阵 X X X ,与权重矩阵 W Q W^Q WQ W K W^K WK W V W^V WV得到 Q Q Q K K K V V V 矩阵,之后通过上述公式计算出attention值。

这种通过 query 和 key 的相似性程度来确定 value 的权重分布的方法被称为scaled dot-product attention。

  • 【一个小问题】为什么有缩放因子 1 d k \frac{1}{\sqrt{d_k}}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值