transformer 解码器
时间: 2024-12-28 21:16:43 浏览: 7
### Transformer 解码器的工作原理
在Transformer模型中,解码器由多个相同的层堆叠而成。每一层主要包含两个子层:多头自注意力机制(Multi-head Self-Attention)和前馈神经网络(Feed Forward Neural Network)。此外,在这两个子层之间还存在一个编码器-解码器注意力机制(Encoder-Decoder Attention),用于捕捉输入序列与目标序列之间的依赖关系[^1]。
#### 多头自注意力机制
该部分允许解码器关注到目前为止已生成的目标序列中的不同位置,从而预测下一个词。为了防止解码器看到未来的信息,在计算自注意力时会应用掩码操作,即Masked Multi-head Self-Attention。通过这种方式,可以确保当前时刻只能够访问之前的位置信息[^2]。
```python
import torch.nn as nn
class MaskedSelfAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
self.multihead_attn = nn.MultiheadAttention(d_model, num_heads)
def forward(self, query, key, value, mask=None):
attn_output, _ = self.multihead_attn(query, key, value, attn_mask=mask)
return attn_output
```
#### 编码器-解码器注意力机制
此模块接收来自最后一个编码器层的输出作为键(key)和值(value),并将解码器自身的隐藏状态作为查询(query)来获取上下文向量。这有助于解码器理解源语言句子的内容并据此生成翻译后的单词[^3]。
```python
class EncoderDecoderAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
self.multihead_attn = nn.MultiheadAttention(d_model, num_heads)
def forward(self, query, encoder_outputs, src_mask=None):
context_vector, _ = self.multihead_attn(query=query,
key=encoder_outputs,
value=encoder_outputs,
key_padding_mask=src_mask)
return context_vector
```
#### 前馈神经网络
最后是一个简单的线性变换加上ReLU激活函数组成的两层全连接网络。这个结构在整个解码过程中保持不变,并应用于每一个时间步上产生的特征表示之上[^4]。
```python
class PositionwiseFeedForward(nn.Module):
def __init__(self, d_model, d_ff):
super().__init__()
self.fc1 = nn.Linear(d_model, d_ff)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(d_ff, d_model)
def forward(self, x):
return self.fc2(self.relu(self.fc1(x)))
```
阅读全文