注意力机制与Transformer模型详解
立即解锁
发布时间: 2025-09-01 00:52:29 阅读量: 1 订阅数: 31 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)
```
这里实例化了三个子层实例(SublayerConnection类的实例),分别用于自注意力、编码器注意力和前馈网络(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)
```
`EncoderDecoder`类将编码器、解码器、源嵌入和目标嵌入组合在一起。`forward`方法将源序列输入到编码器中,然后解码器以先前输出步骤的结果(`x=self.target_embeddings(target)`)、编码器的状态(`encoder_states=encoder_output`)以及源和目标掩码作为输入,生成序列的下一个预测标记(单词),这也是`forward`方法的返回值。
### 1.3 构建完整的Transformer模型
接下来,我们实现`build_model`函数,该函数实例化所有已实现的类,以生成一个单一的Transformer实例:
```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 = MultiHeadedAttent
```
0
0
复制全文
相关推荐


