知识分享|如何简单通俗理解Transformer

想要了解Transformer以及各种NLP基础知识?推荐一本开源书籍:Speech and Language Processing,由斯坦福Dan Jurafsky教授和科罗拉多大学教授James H. Martin合著,较为通俗且专业地解释了语言和语音处理领域的基础知识。

如果觉得全英文有点肝,再推荐一个笔者用于学习这本书以及相关知识的项目:

https://github.com/BUAADreamer/slpkillergithub.com/BUAADreamer/slpkiller

目前已经整理完了NLP基础知识部分的内容。本文整理自其中Transformer部分的内容

前言

词汇量可以被用于探究从文本中获取的知识量,成年人词汇量一般为30000-100000。成熟的演讲者在日常交流中使用的词汇,是在生命早期通过与照顾者和同伴的口语交流获得的,通常在开始正规学校教育之前,一般在2000左右,这部分定义为活跃词汇。正常小孩需要在20岁之前每天学习7-10个单词才可以达到正常的词汇量要求,这样的增长肯定不光来自课堂上的教授,因为效率很低,最可能的解释就是阅读带来了词汇量,一些研究证明了阅读时间和词汇多样性可能会带来合理的词汇增长速度

这些研究激发了分布假设distributional hypothesis——即使在现实世界中没有任何基础,也可以学习我们所说的词语含义,仅仅基于我们在生活中遇到的文本的内容。这样的知识基于词汇共现,也是词向量模型比如word2vec,glove以及BERT/GPT等Transformer的最基本原理。

预训练是指通过处理大量的文本来学习单词或句子的某种意义表示,这个过程得到预训练语言模型

自注意力网络:Transformers

Transformer将向量 ( x 1 , . . . , x N ) (x_1,...,x_N) (x1,...,xN) 映射到 ( y 1 , . . . , y N ) (y_1,...,y_N) (y1,...,yN) ,允许网络直接从任意长的上下文中提取和使用信息,而不需要像RNN通过中间循环连接传递信息。

首先介绍自注意力机制,自注意力有两个原则

  • 获得每个输出项时,模型可以获取当前和之前的所有输入项——可以用来构建语言模型和自回归生成
  • 每个输出项的计算和其他项的计算是独立的——可以在训练和推理模型时轻松并行

如下图所示,其中每个 x i , y i x_i,y_i xi,yi 都可以看成是一个 d d d 维度向量。Transformer每一层内,每个输出向量 y i y_i yi 由当前位置和之前所有位置的输入向量序列 x 1 , . . . , x i x_1,...,x_i x1,...,xi一起决定。比如对于下面的 y 3 y_3 y3 ,可以简单理解为 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 向量输入自注意力层得到的

img

基于注意力的方法核心

注意力的核心是将感兴趣的项其他项的集合进行比较,以揭示它们在当前上下文中的相关性

对于自注意力来说,对比的是给定序列中的其他元素,对比的结果被用来为当前输入计算输出。

最简单的例子:要计算 y 3 y_3 y3 ,计算三个分数 x 3 ⋅ x 1 , x 3 ⋅ x 2 , x 3 ⋅ x 3 x_3\cdot x_1, x_3\cdot x_2, x_3\cdot x_3 x3x1,x3x2,x3x3,之后将这三个分数softmax归一化得到权重 α i j \alpha_{ij} αij ,即每个输入与当前输入的相关性。最后利用这个权重对每个输入向量做加权计算得到输出,可以写为如下公式:
s c o r e ( x i , x j ) = x i ⋅ x j α i j = s o f t m a x ( s c o r e ( x i , x j ) )   ∀ j ≤ i y i = ∑ j ≤ i α i j x j score(\boldsymbol {x}_i,\boldsymbol {x}_j)=\boldsymbol {x}_i\cdot \boldsymbol {x}_j\\ \alpha_{ij}=softmax(score(\boldsymbol {x}_i,\boldsymbol {x}_j))\ \forall j\leq i\\ \boldsymbol y_i=\sum_{j\leq i}\alpha_{ij}\boldsymbol x_j score(xi,xj)=xixjαij=softmax(score(xi,xj)) jiyi=jiαijxj
注意力核心步骤:

  1. 通过上下文中相关元素的相互对比得到相关分数
  2. 分数标准化得到概率分布
  3. 利用概率分布计算加权和

Transformer对注意力的改进

考虑每个输入编码在注意力过程中发挥的不同作用

query:当前的注意力焦点,即 x 3 x_3 x3

key:将它作为先前输入的角色与当前的注意力焦点进行比较,即 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3

value:用于计算当前注意力焦点输出的值

为了捕捉这三种不同作用,引入三个权重矩阵 W Q , W K , W V W_Q,W_K,W_V WQ,WK,WV,用每个 x i x_i xi 分别和权重矩阵相乘就可以分别得到对应的query,key,value向量

q i = W Q x i ; k i = W K x i ; v i = W V x i \boldsymbol q_i=\boldsymbol {W^Qx}_i;\boldsymbol k_i=\boldsymbol {W^Kx}_i;\boldsymbol v_i=\boldsymbol {W^Vx}_i qi=WQxi;ki=WKxi;vi=WVxi
定义:所有的单个输入输出向量都是 1 × d 1\times d 1×d,权重矩阵为 d × d k d\times d_k d×dk d × d v d\times d_v d×dv,key和query的维度 d k d_k dk,value的维度 d v d_v dv,对于单头注意力来说, d k = d v = d = 1024 d_k = d_v = d =1024 dk=dv=d=1024

则注意力分数和最终的输出可以写为

s c o r e ( x i , x j ) = q i ⋅ k j y i = ∑ j ≤ i α i j v j score(\boldsymbol {x}_i,\boldsymbol {x}_j)=\boldsymbol {q}_i\cdot \boldsymbol {k}_j\\ \boldsymbol y_i=\sum_{j\leq i}\alpha_{ij}\boldsymbol v_j score(xi,xj)=qikjyi=jiαijvj
可以看到和刚刚简单的注意力区别仅在于:将用于计算分数的向量从相同的 x i , x j x_i,x_j xi,xj 改为了不同矩阵映射得到的 q i , k j q_i,k_j qi,kj,简单注意力相当于Transformer注意力的一个特例

计算过程如下图所示

img

点积结果可能很大或很小,导致出现数值溢出问题,因此需要被约束,从而分数计算函数改写为:

s c o r e ( x i , x j ) = q i ⋅ k j d k score(\boldsymbol {x}_i,\boldsymbol {x}_j)=\frac {\boldsymbol {q}_i\cdot \boldsymbol {k}_j} {\sqrt{d_k}} score(xi,xj)=dk qikj
由于每个输出的计算相互独立,我们可以将向量拼接为 N × d N\times d N×d 的矩阵 X , Q , K , V X,Q,K,V X,Q,K,V,从而自注意力过程可以写为更简单的形式

Q = X W Q ; K = X W K ; V = X W V S e l f 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 \boldsymbol Q=\boldsymbol {XW^Q};\boldsymbol K=\boldsymbol {XW^K};\boldsymbol V=\boldsymbol {XW^V}\\ SelfAttention(\boldsymbol Q,\boldsymbol K,\boldsymbol V)=softmax(\frac {\boldsymbol {QK^T}}{\sqrt{d_k}})\boldsymbol V Q=XWQ;K=XWK;V=XWVSelfAttention(Q,K,V)=softmax(dk QKT)V
下图展示了GPT在做自注意力计算时的注意力矩阵,可以看到上三角是被用负无穷mask掉了,从而不参与向量计算,和公式保持了一致。

img

可以发现计算过程是 O ( N 2 ) O(N^2) O(N2)的,因此需要约束上下文长度

Transformer块

先来看看Attention is All you Need中的编码器解码器架构:

img

本文主要围绕decoder-only(GPT)结构进行讲解,如下图所示:

img

上述架构可以写为简单的公式:

z = L a y e r N o r m ( x + S e l f A t t e n t i o n ( x ) ) y = L a y e r N o r m ( z + F F N ( z ) ) \boldsymbol z=LayerNorm(\boldsymbol x+SelfAttention(\boldsymbol x))\\ \boldsymbol y=LayerNorm(\boldsymbol z+FFN(\boldsymbol z)) z=LayerNorm(x+SelfAttention(x))y=LayerNorm(z+FFN(z))
分几个部分介绍一下主要组件

前馈神经网络FFN:一个全连接层,后一个激活函数,再过一个全连接层,再过一个全连接层,可以写成如下的 Q , K , V Q,K,V Q,K,V形式(神奇的是这部分也和QKV思想对上了):
a = A c t i v a t i o n ( q ⋅ K + b k ) F F N ( q ) = a ⋅ V + b v \boldsymbol a=Activation(\boldsymbol q\cdot \boldsymbol K+\boldsymbol {b}_k)\\ FFN(\boldsymbol q)=\boldsymbol a\cdot \boldsymbol V+\boldsymbol b_v a=Activation(qK+bk)FFN(q)=aV+bv
残差块:在深度网络中,残差连接是指将信息从较下层直接传递到较高层不通过中间层的连接。允许激活的信息向前和向后传播时跳过一个层,可以提升学习效果,并让高层直接访问来自低层的信息。在Transformer中其实就体现为 x + S e l f A t t e n t i o n ( x ) x+SelfAttention(x) x+SelfAttention(x) 以及 z + F F N ( z ) z+FFN(z) z+FFN(z) 这两处,即 f ( x ) = x + g ( x ) f(x)=x+g(x) f(x)=x+g(x) 的形式

层规范化:将隐藏层的值保持在有利于基于梯度训练的范围内,可以写为如下公式:
μ = 1 d h ∑ i = 1 d h x i σ = 1 d h ∑ i = 1 d h ( x i − μ ) 2 x ^ = x − μ σ L a y e r N o r m ( x ) = γ x ^ + β ( γ 和 β 为可学习参数 ) \mu=\frac 1 {d_h}\sum_{i=1}^{d_h}x_i\\ \sigma=\sqrt{\frac 1 {d_h}\sum_{i=1}^{d_h}(x_i-\mu)^2}\\ \hat {\boldsymbol x}=\frac {\boldsymbol x-\mu} {\sigma}\\ LayerNorm(\boldsymbol x)=\gamma \hat {\boldsymbol x}+\beta(\gamma和\beta为可学习参数) μ=dh1i=1dhxiσ=dh1i=1dh(xiμ)2 x^=σxμLayerNorm(x)=γx^+β(γβ为可学习参数)

多头注意力

一句话中每个词可能和其他的词在不同方面相关,比如不同的句法关系语义关系语篇关系。因此Transformer提出了用同一层中多个自注意力块来学习不同的关系,每个自注意力块是一个

假设有 h h h 个头,现在每一层得到了 h h h 个形状为 N × d v N\times d_v N×dv 的矩阵( N N N为token数量,即输入向量数量),将这些矩阵第二个维度上拼接得到 N × h d v N\times hd_v N×hdv 大矩阵,之后使用一个 h d v × d hd_v\times d hdv×d 形状的线性投射层将这个大矩阵转换为原来的输出矩阵大小即 N × d N\times d N×d

这部分内容可以写为公式:

img

多头注意力可以用下图演示:

img

建模词序:位置编码

目前的架构中,对于每个注意力焦点来说,前面词的词序对结果没有任何影响,而这显然不太合理

最简单的方式是对每个位置的输入编码加上一个和位置相关的编码

一种方法:像对待每个词语一样给每个位置一个初始随机编码用于后续训练。但可能会出现初始位置和后续位置出现次数不一致,导致训练不平衡

因此使用静态函数可能更好。初始Transformer论文中使用了**三角函数的组合,**这里就不赘述了,可以自行查看开山文章 Attention is All you Need

Transformer作为语言模型

介绍了Transformer的原理,简单看一下如何应用,即进行下一词预测(GPT)

训练时使用强制教学思想,每次使用真实的过去token序列进行下一词预测。具体预测过程是先计算出待预测的下一个时间步 t + 1 t+1 t+1 前最后一个时间步 t t t 位置的输出向量 y t y_t yt ,将这个输出向量和词表向量矩阵做点积,选取相似度最高的词语作为预测的下一词。

img

img

Transformer从<s>开始,不断地根据概率分布选择下一词,再根据之前做出的选择选择新的词,直到达到了设置的句子长度上限或者遇到了</s>,这也叫做自回归生成因果性语言模型生成(autoregressive generation or causal LM generation)

其他诸如Beam Search,温度采样等都属于是推理时的技巧,可以自行了解。如果想要简单理解Transformer,本文可以作为一个基础。


大家好,我是NLP研究者BrownSearch,如果你觉得本文对你有帮助的话,不妨点赞收藏支持我的创作,您的正反馈是我持续更新的动力!如果想了解更多LLM/检索的知识,记得关注我!

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通俗来说,Transformer是一种用于自然语言处理(NLP)任务的深度学习模型。它被广泛应用于机器翻译、摘要生成、对话系统等任务中。 传统的序列模型(如循环神经网络)在处理长距离依赖时存在一些问题,而Transformer通过引入自注意力机制来解决这个问题。自注意力机制允许模型在生成输出时同时考虑输入序列中的不同位置,而不仅仅是依赖于顺序。 Transformer由编码器和解码器两部分组成。编码器负责将输入序列编码为特征表示,解码器负责基于编码器的输出生成目标序列。它们都由多层的自注意力和前馈神经网络组成。 具体来说,编码器中的每个层都包含一个多头自注意力机制和一个前馈神经网络。自注意力机制通过计算输入序列中不同位置之间的相关性来生成特征表示。前馈神经网络则进一步处理这些特征。多头自注意力机制可以并行计算多个注意力表示,从而提高模型的表达能力和泛化能力。 解码器在每个时间步生成目标序列的一个元素,它也包含一个多头自注意力机制和一个编码器-解码器注意力机制,用于引入输入序列的信息。解码器还包含一个前馈神经网络,用于处理生成的特征表示。 Transformer的优点是能够处理长距离依赖关系,同时充分并行计算,加快了训练和推理速度。它在NLP领域取得了很大的突破,并成为了许多重要任务的基础模型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值