一、认识Transformer模型
Transformer模型是一种在自然语言处理(NLP)领域中革命性的架构,它首次出现在2017年的论文《Attention is All You Need》中。这个模型设计用于序列到序列的任务,如机器翻译,但其影响远远超出了这个范围,现在被广泛应用于各种NLP任务和其他序列建模场景。
1. 基本组成部分
编码器(Encoder)
编码器由多个相同的层堆叠组成,每一层通常包含两个子层:
- 多头自注意力机制(Multi-head Self-Attention):这个机制允许模型同时关注输入的不同部分,即在不同的“注意力头”中进行并行处理,这增强了模型捕获不同粒度信息的能力。
- 前馈神经网络(Feed Forward Network):这是一个简单的全连接神经网络,用于进一步处理自注意力层的输出。
解码器(Decoder)
解码器也有多个相同的层,每层包括三个子层:
- 掩码的多头自注意力机制(Masked Multi-head Self-Attention):在解码器中,为了保证预测的顺序性,使用掩码机制来阻止当前位置访问未来位置的信息。
- 多头注意力机制(Multi-head Attention):这部分允许解码器关注编码器的输出,实现编码器和解码器之间的交互。
- 前馈神经网络:与编码器相同,用于进一步处理信息。
位置编码(Positional Encoding)
因为Transformer没有内置的顺序概念(不像RNN那样有时间步的概念),所以需要添加位置编码来让模型理解输入序列中每个词的位置。位置编码通常是一个固定的函数,能够为序列中的每个位置生成一个唯一的向量。
下面给出构建模型的示例代码。
class PositionalEncoding(nn.Module):
def __init__(self, d_model, dropout=0.1, max_len=5000):
super(PositionalEncoding, self).__init__()
self.dropout = nn.Dropout(p=dropout)
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
div_term = torch.e