NLP算法(五)- transformer

本文介绍了Transformer模型,它是谷歌提出的seq2seq模型,相比LSTM、RNN和Seq2Seq+Attention可并行计算,提高效率。模型主要分Encoder和Decoder两部分,文章详细阐述了Encoder的位置编码、自注意力机制等模块,以及Decoder的Masked Multi-Head Self-Attention等模块。

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

1 背景

Transformer是谷歌大脑在2017年底发表的论文attention is all you need中所提出的 seq2seq 模型。现在已经取得了大范围的应用和扩展,而 BERT 就是从 Transformer 中衍生出来的预训练语言模型。

  • 相比于LSTM、RNN模型,这些模型是迭代的、串行的,必须等上一时刻计算过程完成才能进入下一时刻的计算。而Transformer则可做到并行计算,所有位置的字符是同时计算的,这样大大提高了计算效率。
  • 相比于Seq2Seq+Attention模型,Transformer与他们都具备Encoder和Decoder结构,但是后者Decoder模块的计算仍然无法做到并行计算。并且受限于文本长度,把源文本的所有语义信息全集中为一个Context Vector向量的做法是有缺陷的。
  • Transformer采用自注意力机制计算语义信息,同时添加位置编码来理解语言的顺序。

2 模型结构

与普通Seq2Seq模型一样,Transformer主要分为两大部分,EncoderDecoder。其模型结构如下图所示。
Transformer结构
Encoder 负责把输入(语言序列)隐射成隐藏层(下图中第 2 步用九宫格代表的部分),然后Decoder再把隐藏层映射为自然语言序列。

值得注意的是,Transformer的Encoder和Decoder不再是单层结构,数据将经过多层Encoder传递,得到的结果作为第一层Decoder的输入,再经过多层Decoder传递得到最终输出。

接下来文章将对图中的各子模块分别详细说明。

3 Encoder模块

Transformer含有多层结构相同的Encoder Block,单层Encoder Block结构如下所示。
Encoder结构

3.1 位置编码

由于Transformer模型采用的是并行计算的方式,不可避免地,各单词的语义顺序也即位置信息无法被保留。因此本文作者考虑为每个单词增加代表该单词位置的编码,进而与单词的词嵌入值相加作为模型的输入。

同时,Positianal Encoding的设计应考虑以下几个方面:

  • 不同位置对应不同的数值;
  • 距离相同的两个单词,其位置编码的差值也应当相等;
  • 它的值应当有上下限,且不能太大或太小,否则容易使模型忽视词嵌入部分数值的分量。

最终,作者为位置编码设计的公式为:
P E ( p o s , 2 i ) = s i n p o s ( 1 e 5 ) 2 i / d m o d e l PE(pos,2i) = sin \frac{pos}{(1e5)^{2i/d_{model}}} PE(pos,2i)=sin(1e5)2i/dmodelpos

P E ( p o s , 2 i + 1 ) = c o s p o s ( 1 e 5 ) 2 i / d m o d e l PE(pos,2i+1) = cos \frac{pos}{(1e5)^{2i/d_{model}}} PE(pos,2i+1)=cos(1e5)2i/dmodelpos

公式中

  • p o s pos pos 表示文本中单词的位置,取值范围是 [ 0 , m a x _ s e q _ l e n − 1 ] [0, max\_seq\_len-1] [0,max_seq_len1]
  • 2 i 2i 2i 2 i + 1 2i+1 2i+1 表示位置编码中对应的维度序号, 2 i 2i 2i 表示在偶数维度上采用正弦公式计算, 2 i + 1 2i+1 2i+1 表示在奇数维度上采用余弦公式计算。
  • d m o d e l d_{model} dmodel 等于Embedding层的维度。

根据这一公式, t t t 时刻某单词的位置编码 p ⃗ t \vec{p}_t p t 的表示为:
p ⃗ t = [ s i n ( w 0 ⋅ t ) c o s ( w 0 ⋅ t ) s i n ( w 1 ⋅ t ) c o s ( w 1 ⋅ t ) ⋮ s i n ( w d 2 − 1 ⋅ t ) c o s ( w d 2 − 1 ⋅ t ) ] d ∗ 1 \vec{p}_t = \left[ \begin{matrix} sin(w_0 \cdot t) \\ cos(w_0 \cdot t) \\ sin(w_1 \cdot t) \\ cos(w_1 \cdot t) \\ \vdots \\ sin(w_{\frac{d}{2}-1} \cdot t) \\ cos(w_{\frac{d}{2}-1} \cdot t) \\ \end{matrix} \right]_{d*1} p t=sin(w0t)cos(w0t)sin(w1t)cos(w1t)sin(w2d1t)cos(w2d1t)d1

3.2 自注意力机制

经过Word Embedding和Positional Encoding后,模型Encoder的输入记为 X X X,其维度为 s e q _ l e n ∗ e m b e d _ s i z e seq\_len*embed\_size seq_lenembed_size

接着定义三个矩阵 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV,使用这三个矩阵对输入 X X X 进行线性变换,得到查询矩阵 Q Q Q, 键矩阵 K K K, 值矩阵 V V V

最终Encoder单层的输出为:
Z = s o f t m a x ( Q K T d ) V Z = softmax(\frac{QK^T}{\sqrt d}) V Z=softmax(d QKT)V

3.3 多头注意力

每组 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 可以产生一个输出 Z Z Z,那么定义多组 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 则可以得到多组输出矩阵 Z Z Z

多头注意力的思想类似CNN中使用多层卷积核,将模型分为多个头、形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。

3.4 Layer Normalization

沿Embedding方向对数据进行标准化处理的过程,即为Layer Normalization。

  • 沿Embedding方向而不是Sequence方向,是因为不同句子的长度不一样,经过Padding补充的0的个数也不一样,沿Sequence方向标准化其结果不具有统一性。
  • Layer Normalization的作用是加快模型训练速度、加速参数收敛。

3.5 Encoder整体结构

总结一下,每层Encoder Block的计算步骤包括:
(1) 对位置编码和词嵌入进行相加
X = E m b e d ( i n p u t ) + P E ( i n p u t ) X = Embed(input)+PE(input) X=Embed(input)+PE(input)

(2) 自注意力计算
Q = X W Q T K = X W K T V = X W V T Q = XW_Q^T \quad K = XW_K^T \quad V = XW_V^T Q=XWQTK=XWKTV=XWVT

Z = s o f t m a x ( Q K T d ) V Z = softmax(\frac{QK^T}{\sqrt{d}})V Z=softmax(d QKT)V

(3) Add & LayerNorm
X a t t n = L a y e r N o r m ( X + Z ) X_{attn} = LayerNorm(X + Z) Xattn=LayerNorm(X+Z)

(4) Feed Forward Network
X h i d d e n = L i n e a r ( R e l u ( L i n e a r ( X a t t n ) ) ) X_{hidden} = Linear(Relu(Linear(X_{attn}))) Xhidden=Linear(Relu(Linear(Xattn)))

(5) Add & LayerNorm
X o u t p u t = L a y e r N o r m ( X a t t n + X h i d d e n ) ∈ R b a t c h _ s z ∗ s e q _ l e n ∗ h i d d e n _ s z X_{output} = LayerNorm(X_{attn} + X_{hidden}) \in R^{batch\_sz*seq\_len*hidden\_sz} Xoutput=LayerNorm(Xattn+Xhidden)Rbatch_szseq_lenhidden_sz

4 Decoder模块

Decoder结构
Transformer的Decoder模块,主要包含三个部分:

  1. Masked Multi-Head Self-Attention
  2. Multi-Head Encoder-Decoder Attention
  3. Feed Forwad Netwok

与Encoder层一样,以上每个子模块的输出均会通过一个Add&Layer进行残差连接与特征标准化。

4.1 Masked Multi-Head Self-Attention

在传统Seq2Seq模型中,Decoder模块使用的是RNN模型。因此在训练过程中输入 t t t 时刻单词,模型看不到未来时刻的单词。

但Transformer Decoder抛弃了RNN,使用Self-Attention机制,因此我们需要对Decoder的输入进行Mask处理。其具体实现过程如下所示。

  1. Masked Scores
    为了使Attention计算时模型仅知晓当前时刻与之前时刻的单词,可定义一下三角全为 0 0 0、上三角全为 − i n f -inf inf 的矩阵。计算时将该矩阵与原Scaled Scores矩阵相加即可。
    Masked Scores

  2. Masked-Softmax
    利用 e − i n f = 0 e^{-inf} = 0 einf=0 的性质,因此设计Mask矩阵时将上三角定义为 − i n f -inf inf。如此在做Softmax时,上三角部分的概率被转化为0。
    Masked Softmax

4.2 Multi-Head Encoder-Decoder Attention

这一部分的计算流程与Masked Self-Attention唯一的区别在于,使用Encoder模块的输出作为该模块 K , V K,V K,V 的输入、使用Masked Self-Attention模块的输出作为该模块 Q Q Q 的输入。

5 总结

到此为止,Transformer的内容已经介绍完了,我们用一张图展示其完整结构。
Transformer整体框架

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anycall201

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值