注意力机制与Transformer模型详解
立即解锁
发布时间: 2025-09-01 00:55:12 阅读量: 5 订阅数: 28 AIGC 

# 注意力机制与Transformer模型详解
## 1. 构建Transformer模型
### 1.1 解码器实现
解码器的实现遵循编码器块的模式,但进行了适配。除了自注意力(self_attn),还引入了编码器注意力(encoder_attn)。以下是解码器块的核心代码:
```python
x = self.sublayers[0](x, lambda x: self.self_attn(x, x, x, target_mask))
x = self.sublayers[1](x, lambda x: self.encoder_attn(x, encoder_states, encoder_states, source_mask))
return self.sublayers[2](x, self.ffn)
```
这里实例化了三个子层实例,分别用于自注意力、编码器注意力和前馈网络(FFN)。在`DecoderBlock.forward`方法中,我们可以看到多种注意力机制的组合。编码器注意力`encoder_attn`以先前解码器块的输出`x`作为查询,以编码器的输出`encoder_states`作为键值对;而自注意力`self_attn`则将`x`同时用作查询、键和值。
### 1.2 构建完整的编码器 - 解码器模型
将编码器和解码器组合在`EncoderDecoder`类中:
```python
class EncoderDecoder(torch.nn.Module):
def __init__(self,
encoder: Encoder,
decoder: Decoder,
source_embeddings: torch.nn.Sequential,
target_embeddings: torch.nn.Sequential):
super(EncoderDecoder, self).__init__()
self.encoder = encoder
self.decoder = decoder
self.source_embeddings = source_embeddings
self.target_embeddings = target_embeddings
def forward(self, source, target, source_mask, target_mask):
encoder_output = self.encoder(
x=self.source_embeddings(source),
mask=source_mask)
return self.decoder(
x=self.target_embeddings(target),
encoder_states=encoder_output,
source_mask=source_mask,
target_mask=target_mask)
```
`forward`方法接收源序列,将其输入编码器,然后解码器根据编码器的输出、目标嵌入以及源和目标掩码生成序列的下一个预测标记(单词)。
### 1.3 构建模型的函数
以下是构建单个Transformer实例的`build_model`函数:
```python
def build_model(source_vocabulary: int,
target_vocabulary: int,
N=6, d_model=512, d_ff=2048, h=8, dropout=0.1):
c = copy.deepcopy
attn = MultiHeadedAttention(h, d_model)
ff = PositionwiseFFN(d_model, d_ff, dropout)
position = PositionalEncoding(d_model, dropout)
model = EncoderDecoder(
encoder=Encoder(
EncoderBlock(d_model, c(attn), c(ff), dropout), N),
decoder=Decoder(
DecoderBlock(d_model, c(attn), c(attn), c(ff), dropout), N, target_vocabulary),
source_embeddings=torch.nn.Sequential(
Embeddings(d_model, source_vocabulary), c(position)),
target_embeddings=torch.nn.Sequential(
Embeddings(d_model, target_vocabulary), c(position)))
# Initialize parameters with random weights
for p in model.parame
```
0
0
复制全文
相关推荐








