本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习内容,尽在AI大模型技术社。
一、Transformer编码器整体结构
Transformer编码器由N个相同层堆叠而成,单层结构包含:
输入 → 多头自注意力 → 残差连接+层归一化 → 前馈网络 → 残差连接+层归一化 → 输出
二、核心技术解析与实现
1. 位置编码(Positional Encoding)
为什么需要:Self-Attention无法捕获序列顺序信息 解决方案:注入绝对/相对位置信息
正弦位置编码公式:
scss
PE(pos,2i) = sin(pos / 10000^(2i/d_model))
PE(pos,2i+1) = cos(pos / 10000^(2i/d_model))
其中pos=位置,i=维度索引,d_model=嵌入维度
arduino
import torch
import math
def 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区别:对单个样本的所有特征做归一化
数学公式:
ini
y = γ * (x - μ) / √(σ² + ε) + β
其中μ/σ为样本均值和标准差,γ/β为可学习参数
ini
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)
结构:两层的线性变换 + 非线性激活
scss
FFN(x) = max(0, xW₁ + b₁)W₂ + b₂
ruby
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)
作用:解决梯度消失,使深层网络可训练 实现方式:
scss
子层输出 = LayerNorm(x + Sublayer(x))
代码实现关键:
ini
# 以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 字(可选)
四、完整编码器实现
ruby
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大模型技术社。