transformer解码器输入
时间: 2024-12-28 16:16:21 浏览: 6
### Transformer 解码器输入格式与要求
Transformer架构中的解码器接收特定格式的数据作为输入,这些数据对于实现有效的序列到序列学习至关重要[^1]。
#### 输入嵌入(Input Embeddings)
解码器的第一个输入是目标序列的词嵌入。每个时间步的目标单词被映射成固定维度的向量表示。这种转换通常由预训练好的词表完成,其中包含了词汇表中所有可能单词对应的密集向量。
```python
import torch.nn as nn
embedding_layer = nn.Embedding(vocab_size, d_model)
target_sequence_ids = ... # 目标语言句子token ID列表
embedded_inputs = embedding_layer(target_sequence_ids)
```
#### 位置编码(Positional Encoding)
为了引入顺序信息,解码器还需要添加位置编码至上述得到的词嵌入上。这允许模型区分相同词语的不同排列组合所带来的语义差异。
```python
def get_positional_encoding(max_len, embed_dim):
pe = torch.zeros(max_len, embed_dim)
position = torch.arange(0., max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0., embed_dim, 2) * -(math.log(10000.0) / embed_dim))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
return pe.unsqueeze(0)
positional_encodings = get_positional_encoding(seq_length, d_model)
decoder_input_with_pos = embedded_inputs + positional_encodings[:,:seq_length,:]
```
#### 自注意力掩蔽(Masked Self-Attention)
由于解码过程中不允许当前时刻看到未来的信息,在计算自注意分数时会对未来的 token 施加掩膜处理。这意味着当预测第 t 步的结果时,只考虑前 t−1 步的内容;而对于后续部分,则设置为无穷小值使得softmax后的概率接近于零。
```python
def create_look_ahead_mask(size):
mask = (torch.triu(torch.ones((size, size))) == 0).transpose(0, 1)
return mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0))
lookahead_mask = create_look_ahead_mask(decoder_seq_len)
attention_output = multi_head_attention(query=decoder_input_with_pos,
key=encoder_outputs,
value=encoder_outputs,
attention_mask=lookahead_mask)
```
#### 编码器-解码器注意力机制(Encoder-Decoder Attention)
除了自身的自注意力层外,解码器还会利用来自编码器的最后一层输出来构建跨模态连接。此过程涉及查询(encoder outputs)-键(key)/值(value)匹配操作,从而让解码侧能够聚焦源端的关键特征并据此生成更合理的翻译或合成图像等下游任务所需的输出。
```python
cross_attn_output = cross_multi_head_attention(query=attention_output,
key=encoder_final_state,
value=encoder_final_state)
```
阅读全文