一文读懂Transformer!小白速进!

我在学习Transformer时,想要更快地学会,所以先在CSDN上搜博客看,有的讲的太冗杂不够精简透彻啥都讲讲抓不住重点,有的又看不太懂,后来去看了李沐老师的讲解,感觉非常到位,但中间还是有一些疑问,发这篇博客是想整理一下Transformer的学习过程,以及记录一下产生的疑问和学习。

整篇博客是参考沐神讲Transformer,按照 Attention Is All You Need 的结构写的,省去了实验和分析部分。

参考论文:Attention Is All You Need

摘要

提出了一种新的简单网络架构——Transformer,它完全基于注意力机制,而不使用循环或者卷积神经网络,并且在机器翻译任务上取得了更好的性能。

1.导言

  • 主流的序列模型:RNN、LSTM、GRU,它们存在问题:

    • 历史信息是一步一步向后传递的,当时序比较长时,早期的时序信息在后面的时候可能会被丢掉(长期依赖问题)。

    • 当前时刻的隐藏状态 h_t 依赖于上一时刻的隐藏状态 h_{t-1} 和当前输入 x

                -> 计算 h_t 的时候需要保证 h_{t-1} 输入完成

                -> 无法并行

                -> 计算性能差      

  • 注意力机制备受瞩目,但更多是与RNN结合使用,使encoder的输出有效的传递给decoder 。

  • Transformer完全基于注意力机制,具有较高的并行度,能在较短的时间内获得更好的结果。

2.相关工作

  • CNN替代RNN处理时序的问题

    • 缺点:感受野小,难以对长序列建模。

    • 优点:有多个输出通道,提取不同特征。

对于缺点:

Transformer的注意力机制每次可以看到整个序列。

对于优点:

Transformer中用Multi-Head Attention。

取其精华,弃其糟粕!

3.模型架构

这块是重中之重。

3.1Encoder-Decoder结构

Encoder-Decoder 结构不是一种算法,而是一种框架。

Encoder

将输入 (x_1,...,x_m) 编码成 z=(z_1,...,z_m)

Decoder

利用编码器的输出 z 生成输出序列 (y_1,...,y_n)

解码器这里还有一个自回归性(auto-regressive)

过去时刻的输出当做当前时刻的输入

z \leftarrow y_1

y_1 \leftarrow y_2

...以此类推

这里有两个小点需要注意:

  1. 编码器输入序列和解码器输出序列长度不行一定相等。

  2. 解码器的词是一个一个生成的,而在编码器中一次性能看全整个句子。

Transformer 使用 encoder-decoder 结构。

3.2Tranformer结构

下图为 Transformer 的模型架构

接下来就一点点阐述每个模块都是干什么的。

3.2.1Encoder和Decoder块

Encoder

Encoder 部分由 N=6 个一模一样的层组成,其中每个层包含两个子层,第 1 个子层是多头注意力机制,第 2 个子层是 MLP 。对每一个子层使用残差连接,最后使用 LayerNorm 。

是不是有人不懂什么是多头注意力机制?没关系,这里只是让你对大概得模型架构有个认识,后面会仔细讲每一个小模块的。

每一个子层可以概括为:

LayerNorm(x+Sublayer(x))

d_{model}=512

LayerNorm() 指的就是图里的Add&Norm中的Norm, x+Sublayer(x) 指的是图里的Add&Norm中的Add, Sublayer(x) 在第 1 层指的就是 Multi-Head Attetion ,在第二层指的就是 Feed Forward ,这样用公式表达,整个 Encoder 的结构就变得很清楚了。

Decoder

Decoder由 N=6 个一模一样的层组成,其中每个层包含三子层,第 2 层和第 3 层与编码器的 1、2 层相同。在解码器预测的时候 t 时刻的输出不应该看到 t 时刻之后的输出,为了保证自回归特性,解码器的第 1 层是一个带掩码的多头注意力机制。

我看到这里时就产生了疑问,不是做预测吗,为什么解码器会看到之后的信息?

训练:在训练时,解码器的输入是完整的正确的翻译后的句子,比如:“I love China forever.”的翻译是“我永远爱中国。”,那么编码器的输入是“I love China forever.”,而解码器的输入是“我永远爱中国。”,如果想要预测“永远”,那么解码器的输入就不应该有“爱中国”,所以需要掩码。在Transformer的训练阶段,只会根据已知信息预测下一个词而不是一整句话,通过对比预测的词和应该翻译成的词的差距更新参数。

推理:而在推理时,还以刚刚的例子为例,解码器从<start>开始逐步生成,第一步生成“我”,第二步基于“我”生成“永远”,第三步基于“我 永远”生成“爱”......以此类推。

3.2.2注意力机制

Scaled Dot-Product Attention

再学习这个部分之前,先来了解三个向量:

  • Q(Query)查询向量:Query 是用于查找相关信息的向量。在自注意力机制中,Query向量来自输入序列中的某个词表示。

  • K(Key)键向量:Key 是与Query进行相似性比较的向量。每个输入序列中的词都有一个Key向量,表示该词在输入序列中的特征。

  • V(Value)值向量:Value 是最终将被加权并用于生成输出的表示向量。每个词对应一个Value向量,它代表了输入词的内容或特征。

我直接就把这个部分的公式甩出来:

Attetion(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

然后再一点点讲这个公式在做什么。

先对注意力机制有个大概的认知。前一段网上不是有个特别火的挑战,就是一个人让另一个人看一段视频,然后问她一个特别不起眼的东西,基本上是不会有人回答出来的,因为人的注意力总是放在更突出的地方。注意力机制就是模拟人的注意力,权重会更多地分配给跟查询向量强相关的向量,而分配更小的权重给跟查询向量不那么相关的向量。

QK^T 表示的就是 QK 中每个词(这里说每个词是便于理解,实际上是向量)的相关性,\sqrt{d_k} 后面再解释,加上 softmax() 之后就表示权重,最后再乘 V ,这样下来注意力就分配完成了。

现在解决两个疑问:

点积为什么能表示相似度?

余弦相似度:cos(\theta)=\frac{a·b}{|a||b|}

a·b=|a|×|b|×cos(\theta)

  • \theta=0^{\circ} 时,两个向量方向完全相同,点积达到最大值,说明这两个向量非常相似。

  • \theta=90^{\circ} 时,两个向量正交,点积为零,表示它们没有相似性。

  • \theta=180^{\circ} 时,两个向量方向完全相反,点积为负,表示它们极不相似。

因此,点积可以用来衡量两个向量的方向相似性,方向越接近,相似度越高。

为什么要除以\sqrt{d_k}?

d_k 比较大的时候,两个向量做点积的值也可能会比较大,此时点积值之间的差距可能会比较大,导致值最大的经过softmax后更加接近 1 ,而剩下的值更加接近 0 ,此时梯度值比较小,可能会导致不再更新。

不知道大家注意到没,Scaled Dot-Product Attention图中还有一个叫“Mask”的块,前面已经讲过为什么要有Mask,下面就讲讲Mask到底是怎么做的。

Mask对于 Q_tK_t 及其之后的值换成非常大的负数,经 softmax 之后权重就会变成 0 ,这样就不会将注意力放在它们身上。

Multi-Head Attention

我们来看一下 Multi-Head Attention 在做什么。

h 次 Scaled Dot-Product Attention 后合并在一起再做一次线性投影。

MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O

where   head_i=Attention(QW_i^Q,KW_i^K,VW_i^V)

作者选择 h=8 ,那么 d_k=d_v=d_{model}/h=64

为什么用Multi-Head Attention?

Scaled Dot-Product Attention没有可学习的参数。

我的理解是 h 层就像 h 个卷积核,不同卷积核学习的特征不一样, h 层每一层学习的特征也不一样。

Transformer结构中的注意力机制

  • 在编码器的sub-layer1中

  • 在解码器的sub-layer1中

  • 在解码器的sub-layer2中:Key和Value来自编码器的输出,Query来自输入解码器后经过一个带掩码的注意力机制(自注意力机制)后的输出。

到这里,比较困难的地方就结束啦。

3.2.3Position-wise Feed-Forward Networks

这部分其实就是把一个MLP对每一个词作用一次,对每一个词作用的是同一个MLP。

FFN(x)=max(0,xW_1+b_1)W_2+b_2

维度从512 -> 2048 -> 512。

3.2.4Embeddings and Softmax

Embeddings将输入的一个一个词转换成向量,Softmax就不多赘述了。

3.2.5Positional Encoding

注意力机制不会考虑序列信息,意味着给一句话,把词的顺序任意打乱最后输出的结果都是一样的,所以需要添加时序信息。

到这里我就梳理完了,肯定还是有些地方没说清楚,欢迎评论区讨论!

拜拜拜拜啦。

Transformer模型是一种基于自注意力机制(Self-Attention)的深度学习架构,最初由Google的团队在2017年提出的论文《Attention Is All You Need》中详细介绍[^4]。它的核心思想是让模型能够并行地处理序列中的每个位置,而不是像RNN那样顺序依赖。 **原理概述**[^4]: 1. **自注意力机制**: Transformer通过计算查询(query)、键(key)和值(value)之间的相似度来建立元素间的直接联系。这个过程不依赖于先前的状态,而是考虑整个输入序列。 2. **多头注意力(Multi-head Attention)**: 分成多个子层执行注意力操作,每个子层有自己独立的权重参数,可以捕获不同抽象层次的关系。 3. **位置编码(Positional Encoding)**: 对于缺少循环结构的Transformer来说,引入了位置信息到输入,以捕捉词语之间的相对顺序。 4. **残差连接和层归一化**: 残差网络允许信息在网络的不同层之间自由流动,而层归一化则有助于加速训练。 5. **自回归性与掩码(Masking)**: 对于生成任务,为了保持预测的顺序性,模型会限制前向传播时对未来的访问。 要深入理解Transformer的工作原理,你可以从以下几个方面入手: - **Transformer架构示意图**: 查看其标准的encoder-decoder结构[^4]。 - **注意力机制的数学公式**: 学习softmax加权求和的实现细节[^5]。 - **实际代码实现**: 参考开源库如Hugging Face Transformers[^6]中的代码,通过实践构建一个简单的Transformer模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值