本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习内容,尽在AI大模型技术社。
一、Transformer编码器整体结构
Transformer编码器由N个相同层堆叠而成,单层结构包含:
输入 → 多头自注意力 → 残差连接+层归一化 → 前馈网络 → 残差连接+层归一化 → 输出
二、核心技术解析与实现
1. 位置编码(Positional Encoding)
为什么需要:Self-Attention无法捕获序列顺序信息 解决方案:注入绝对/相对位置信息
正弦位置编码公式:
PE(pos,2i) = sin(pos / 10000^(2i/d_model))PE(pos,2i+1) = cos(pos / 10000^(2i/d_model))
其中pos=位置,i=维度索引,d_model=嵌入维度
import torchimport mathdef positional_encoding(max_len, d_model): pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len).unsqueeze(1) div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) return pe# 示例:生成长度100,维度512的位置编码pe = positional_encoding(100, 512)
2. 层归一化(Layer Normalization)
作用:稳定训练过程,加速收敛 与BatchNorm区别:对单个样本的所有特征做归一化
数学公式:
y = γ * (x - μ) / √(σ² + ε) + β
其中μ/σ为样本均值和标准差,γ/β为可学习参数
class LayerNorm(nn.Module): def __init__(self, features, eps=1e-6): super().__init__() self.gamma = nn.Parameter(torch.ones(features)) self.beta = nn.Parameter(torch.zeros(features)) self.eps = eps def forward(self, x): mean = x.mean(-1, keepdim=True) std = x.std(-1, keepdim=True) return self.gamma * (x - mean) / (std + self.eps) + self.beta
3. 前馈网络(Feed-Forward Network)
结构:两层的线性变换 + 非线性激活
FFN(x) = max(0, xW₁ + b₁)W₂ + b₂
class FeedForward(nn.Module): def __init__(self, d_model, d_ff=2048, dropout=0.1): super().__init__() self.linear1 = nn.Linear(d_model, d_ff) self.dropout = nn.Dropout(dropout) self.linear2 = nn.Linear(d_ff, d_model) def forward(self, x): return self.linear2(self.dropout(F.relu(self.linear1(x))))
4. 残差连接(Residual Connection)
作用:解决梯度消失,使深层网络可训练 实现方式:
子层输出 = LayerNorm(x + Sublayer(x))
代码实现关键:
# 以Transformer层为例class TransformerEncoderLayer(nn.Module): def __init__(self, d_model, nhead, dim_feedforward=2048): super().__init__() self.self_attn = nn.MultiheadAttention(d_model, nhead) self.linear1 = nn.Linear(d_model, dim_feedforward) self.norm1 = LayerNorm(d_model) self.norm2 = LayerNorm(d_model) self.ffn = FeedForward(d_model, dim_feedforward) def forward(self, src): # 残差连接1:注意力层 src2 = self.self_attn(src, src, src)[0] src = self.norm1(src + src2) # 残差连接2:前馈网络 src2 = self.ffn(src) src = self.norm2(src + src2) return src
三、关键设计思想图解
1.残差连接数据流
添加图片注释,不超过 140 字(可选)
2.层归一化作用域
添加图片注释,不超过 140 字(可选)
四、完整编码器实现
class TransformerEncoder(nn.Module): def __init__(self, num_layers, d_model, nhead, dim_feedforward): super().__init__() self.layers = nn.ModuleList([ TransformerEncoderLayer(d_model, nhead, dim_feedforward) for _ in range(num_layers) ]) def forward(self, src): for layer in self.layers: src = layer(src) return src
关键理解:Transformer通过残差连接保持梯度流,层归一化稳定特征分布,位置编码注入序列信息,前馈网络提供非线性变换能力。
本文代码参考PyTorch实现,完整训练代码需添加词嵌入层、解码器等模块。更多AI大模型应用开发学习内容和资料,尽在AI大模型技术社。