Transformer-code
简介
今天来读一下《Attention is All You Need》的代码,也就是 Transformer。pytorch 代码地址)。
目录结构
Transformer 文件夹下有以下文件:
- Constants.py:模型常量定义
- Layers.py:编码器和解码器层定义
- Models.py:模型定义
- Modules.py:工具模块
- Optim.py:优化模块
- SubLayer.py:多头注意力机制等子层
- Translator.py:翻译 beam search
顶层目录下有以下文件:
- train.py:训练入口,实例化模型、优化器等,进行优化迭代
- learn_bpe.py:bpe 学习词表
- apply_bpe.py:使用 bpe 得到的词表将文本进行编码
- translate.py:加载模型进行翻译
下面逐一进行分析模型相关文件,剩下的文件等到下次再读吧。
模型解析
下面按照依赖顺序对各文件进行解析。
Constants.py
文件内容非常简单,分别为填充、未知、起始、终止四种 token 的定义。
1 | PAD_WORD = '<blank>' # 填充token |
Modules.py
定义了标量化点乘注意力机制类。
1 | import torch |
SubLayers.py
多头注意力机制定义:
1 |
|
前馈神经网络子层、残差层定义:
1 | class PositionwiseFeedForward(nn.Module): |
Layers.py
编码器层类(非常简单,将多头注意力机制与前馈神经网络拼接起来即可):
1 | ''' Define the Layers ''' |
解码器层类:
1 | class DecoderLayer(nn.Module): |
Models.py
Models.py 是模型定义核心文件。
工具函数:
1 | def get_pad_mask(seq, pad_idx): # 获取序列的MASK(填充位置为0) |
位置编码:
1 | class PositionalEncoding(nn.Module): |
Transformer 编码器:
1 | class Encoder(nn.Module): |
Transformer 解码器:
1 | class Decoder(nn.Module): |
Transformer:
1 | class Transformer(nn.Module): |
Optim.py
一个简单封装的优化器类,用以动态调整学习率。
1 | '''A wrapper class for scheduled optimizer ''' |
总结
读一遍代码发现了论文中忽视的好几个点,例如嵌入向量放缩、dropout 等,读代码还是很有必要的。