Transformer 是一种基于自注意力机制的神经网络架构,由Vaswani等人在2017年提出(论文《Attention is All You Need》)。
Transformer模型结构Transformer是一个编码器-解码器(Encoder-Decoder)架构,但也可单独使用编码器(如BERT)或解码器(如GPT)。
编码器(Encoder):
包含N个相同的层,每层由多头自注意力(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Network, FFN)组成。残差连接(Residual Connection)和层归一化(Layer Normalization)应用于每个子层。解码器(Decoder):
同样包含N个层,每层在编码器结构基础上增加编码器-解码器注意力(Encoder-Decoder Attention)。使用掩码自注意力(Masked Self-Attention)防止信息泄漏。
Transformer模型
核心组件自注意力机制(Self-Attention)
目的:捕捉序列中各个位置间的依赖关系,无论距离远近。计算步骤:将输入转换为查询(Query)、键(Key)、值(Value)矩阵。计算注意力分数:缩放因子用于防止点积过大导致梯度消失。1.将输入序列中的每个词转换为向量表示
2.通过线性变换将输入嵌入转换为三个矩阵:查询矩阵 Q、键矩阵 K 和值矩阵 V
3.使用点积计算 Q 和 K 之间的相似度得分
4.对得分进行缩放(通常除以 √d,其中 d 是键向量的维度)并应用 softmax 函数得到注意力权重
5.将注意力权重与 V 相乘,得到每个位置的输出
多头注意力(Multi-Head Attention)
动机:并行学习不同子空间的注意力模式,增强模型表达能力。实现:将Q、K、V投影到h个不同的子空间,分别计算注意力后拼接结果。这样就在不同的表示子空间里捕捉到不同的关系。位置编码(Positional Encoding)
作用:为序列注入位置信息(通过正弦和余弦函数生成),弥补对顺序不敏感的问题。公式:class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len=5000): super().__init__() pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) self.register_buffer('pe', pe.unsqueeze(0)) # [1, max_len, d_model] def forward(self, x): return x + self.pe[:, :x.size(1)]前馈神经网络(Feed-Forward Network)结构:两层全连接层,中间使用ReLU激活。公式:class FeedForward(nn.Module): def __init__(self, d_model, d_ff=2048): super().__init__() self.linear1 = nn.Linear(d_model, d_ff) self.linear2 = nn.Linear(d_ff, d_model) self.dropout = nn.Dropout(0.1) def forward(self, x): return self.linear2(self.dropout(F.relu(self.linear1(x))))残差连接与层归一化
缓解梯度消失,帮助深层网络的训练。对所有特征进行归一化,有利于稳定训练过程。