神经网络与深度学习第四周学习笔记
一、Transformer概述
1.1 诞生背景
2017年,Google团队发表论文《Attention Is All You Need》,提出了Transformer模型,完全摒弃了传统序列模型中的循环和卷积结构,仅基于注意力机制构建。
1.2 核心优势
相比之前主流的LSTM和GRU模型,Transformer具有两个显著优势:
- 高度并行化:可以同时处理序列中的所有token,充分利用GPU的并行计算能力,大幅提升训练速度
- 性能更优:在机器翻译等任务上取得了当时最好的效果
1.3 总体架构
Transformer采用经典的编码器-解码器(Encoder-Decoder)架构,整体分为四个部分:
- 输入部分:词嵌入 + 位置编码
- 编码器部分:N个相同的编码器块堆叠(原始论文中N=6)
- 解码器部分:N个相同的解码器块堆叠(原始论文中N=6)
- 输出部分:线性层 + Softmax层
二、输入部分
输入部分的核心是将文本序列转换为模型能够处理的向量表示,由词嵌入和位置编码两部分相加得到。
2.1 词嵌入(Word Embedding)
词嵌入的目标是将离散的单词转换为连续的低维向量表示,步骤如下:
- 分词:将输入文本以单词为单位切分,形成token序列
- 长度对齐:对不同长度的序列进行剪切或填充(padding),使所有样本长度一致
- 独热编码:将每个token转换为词汇表大小的独热向量
- 低维映射:通过可学习的映射矩阵,将高维独热向量映射为低维稠密向量(d << v,v为词汇表大小)
实现方式:可通过Word2Vec等预训练方法,或直接使用PyTorch中的nn.Embedding层。
2.2 位置编码(Positional Encoding)
由于Transformer没有循环结构,无法天然捕捉序列的位置信息,因此需要显式地为每个token添加位置编码。
正弦位置编码(原始论文采用):
- 偶数维度使用正弦函数,奇数维度使用余弦函数
- 公式:
PE(pos,2i)=sin(pos100002i/d)PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d}}\right)PE(pos,2i)=sin(100002i/dpos)
PE(pos,2i+1)=cos(pos100002i/d)PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d}}\right)PE(pos,2i+1)=cos(100002i/dpos)
其中,pos是token在序列中的位置,i是维度索引,d是模型维度
三、编码器部分
编码器的作用是将输入序列编码为上下文相关的特征表示。每个编码器块包含两个子层:多头自注意力层和前馈神经网络层,每个子层都采用"残差连接 + 层归一化"的结构。
3.1 自注意力机制(Self-Attention)
自注意力机制的核心是让每个token都能关注到序列中所有其他token的信息,从而生成上下文相关的表示。
计算步骤:
- 生成Q/K/V向量:将输入向量分别与三个可学习的权重矩阵相乘,得到查询向量Q、键向量K和值向量V
- 计算注意力得分:将查询向量Q与所有键向量K做点积
- 缩放:将得分除以dk\sqrt{d_k}dk(dkd_kdk是K向量的维度),防止点积结果过大导致softmax梯度消失
- Softmax归一化:将得分转换为0-1之间的权重,且权重和为1
- 加权求和:将值向量V与对应的权重相乘后求和,得到自注意力层的输出
公式:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dkQKT)V
3.2 多头自注意力机制(Multi-Head Attention)
多头自注意力机制是对自注意力机制的扩展,使用多组独立的Q/K/V矩阵并行计算多个注意力头,然后将结果拼接起来。
优势:扩展了模型专注于不同位置的能力,能够捕捉到更丰富的上下文信息。
计算步骤:
- 将输入向量分别输入到h个不同的注意力头中
- 每个注意力头独立计算自注意力输出
- 将所有注意力头的输出拼接起来
- 乘以一个可学习的权重矩阵WOW_OWO,得到最终的多头注意力输出
3.3 Add & Norm层
每个子层(自注意力层和前馈层)之后都有一个Add & Norm层,由两部分组成:
- Add(残差连接):将子层的输入与输出相加,解决深度网络中的梯度消失问题
- Norm(层归一化):对每一层的输入进行归一化处理,使均值为0、方差为1,加快模型收敛速度
公式:
LayerNorm(X+Sublayer(X))\text{LayerNorm}(X + \text{Sublayer}(X))LayerNorm(X+Sublayer(X))
3.4 前馈神经网络(Feed Forward)
前馈神经网络是一个简单的两层全连接网络:
- 第一层:线性变换 + ReLU激活函数
- 第二层:线性变换(无激活函数)
公式:
FFN(X)=max(0,XW1+b1)W2+b2\text{FFN}(X) = \max(0, XW_1 + b_1)W_2 + b_2FFN(X)=max(0,XW1+b1)W2+b2
四、解码器部分
解码器的作用是根据编码器的输出和已生成的序列,预测下一个token。每个解码器块包含三个子层:
- 掩码多头自注意力层
- 交叉注意力层
- 前馈神经网络层
4.1 掩码多头自注意力层
与编码器中的自注意力层类似,但增加了掩码(Mask)操作,目的是防止模型在预测时看到未来的token。
掩码原理:在计算注意力得分时,将当前位置之后的所有位置的得分设为-∞,经过Softmax后这些位置的权重变为0,从而不会对当前token的表示产生影响。
4.2 交叉注意力层(Cross-Attention)
交叉注意力层连接编码器和解码器:
- 查询向量Q来自解码器上一层的输出
- 键向量K和值向量V来自编码器的最终输出
通过交叉注意力,解码器能够关注到输入序列中与当前预测相关的信息。
五、输出部分
输出部分由线性层和Softmax层串联而成:
- 线性层:将解码器输出的d维向量转换为词汇表大小的向量
- Softmax层:将线性层的输出转换为概率分布,每个元素表示对应token的预测概率
最终选择概率最大的token作为当前位置的预测结果。
六、网络训练
6.1 训练过程(以机器翻译为例)
- 将源语言句子输入编码器,得到编码后的特征表示
- 在解码器输入端输入开始符
<sos> - 解码器根据编码器输出和已生成的序列,预测下一个token
- 将预测结果与真实标签比较,计算交叉熵损失
- 误差反向传播,更新模型参数
- 重复步骤2-5,直到生成结束符
<eos>或达到最大长度
6.2 训练数据与条件
- 数据集:WMT2014英语-德语(450万句对)、英语-法语(3600万句对)
- 硬件:8个NVIDIA P100 GPU
- 训练时长:基础模型训练10万步(约12小时),大模型训练30万步(约3.5天)
6.3 训练结果
在WMT2014翻译任务上,Transformer取得了当时最好的BLEU分数:
- 英语→德语:28.4
- 英语→法语:41.8
更多推荐





所有评论(0)