目录
Transformer-XL 概述
Transformer-XL是对Transformer的改进,主要是解决长序列的问题。同时结合了RNN序列建模和Transformer自注意力机制的优点,引入循环机制(Recurrence Mechanism)和相对位置编码(Relative Positional Encoding),在输入数据的每个段上使用Transformer的注意力模块,并使用循环机制来学习连续段之间的依赖关系。并成功在enwik8、text8等语言建模数据集上取得SoTA效果。
论文: Dai Z, Yang Z, Yang Y, et al. Transformer-xl: Attentive language models beyond a fixed-length context[J]. arXiv preprint arXiv:1901.02860, 2019.
模型架构
Transformer-XL主干结构为Transformer,在原有基础上加入了循环机制(Recurrence Mechanism)和相对位置编码(Relative Positional Encoding)
数据集
以下四个数据集包含训练数据集和评估数据集
所用数据集包括enwik8和text8,其中enwik8包含了100MB未处理的Wikipedia的文本。与enwiki8相似text8同样包含了100MB的Wikipedia文本,区别在于移除了26个字母和空格以外的其他字符。
环境要求
- 硬件(Ascend处理器)
- 框架
- 如需查看详情,请参见如下资源:
快速入门
数据集准备完成后,请按照如下步骤开始训练和评估:
# 对参数进行微调: 在default_config.yaml中对超参数进行调整
# 运行训练示例
bash scripts/run_enwik8_base.sh train [DEVICE_ID]
# 运行分布式训练示例
bash scripts/run_enwik8_base.sh train [DEVICE_NUM]
# 运行评估示例
bash scripts/run_enwik8_base.sh eval [DEVICE_ID]
脚本说明
脚本和样例代码
.
└─Transformer-XL
├─README.md
├─scripts
└─run_enwik8_base.sh
├─src
├─callback
├─eval.py
├─flag.py
└─log.py
├─common
└─ops.py
├─loss_fn
└─ProjectedAdaptiveLogSoftmaxLoss.py
├─metric
└─calc.py
├─model
├─attn.py
├─dataset.py
├─embedding.py
├─layer.py
├─mem_transformer.py
├─positionwiseFF.py
└─vocabulary.py
├─model_utils
├─config.py
├─device_adapter.py
├─local_adapter.py
└─moxing_adapter.py
├─utils
├─additional_algorithms.py
├─dataset_util.py
├─nnUtils.py
├─default_config.yaml
├─hccl_tools.py
├─getdata.sh
├─eval.py
└─train.py
脚本参数
训练脚本参数
用法:
train.py [--ascend] [--data DATA_PATH]
[--dataset NAME] [--optim adam]
options:
--ascend 使用Ascend
--data_path 数据集路径: PATH
--data 数据集名称: enwik8
--optim 优化器选择, 默认值是 adam
网络参数
数据集和网络参数(训练/微调/评估):
n_layer 网络层数: N, 默认值为 12
d_model 模型维度, 默认值为 512
n_head 总的注意力头数, 默认值为 8
d_head 注意力头的维度, 默认值为 64
d_inner 前馈网络的维度, 默认值为 2048
dropout 输出层的随机失活概率: Q, 默认值是 0.1
dropatt 注意力层的随机失活概率: Q, default is 0.0
max_step 迭代次数: N, 默认值为 400000
tgt_len 标签特征维度大小, 默认值为 512
mem_len 记忆特征维度大小, 默认值为 512
eval_tgt_len 迭代任务中标签特征维度大小, 默认值为 128
batch_size 输入数据集的批次大小: N, 默认值是 22
学习率参数:
lr 学习率: Q, 默认值为 0.00025
warmup_step 热身学习率步数: N, 默认值为 0
准备数据集
训练过程
-
在default_config.yaml
中设置选项,包括loss_scale、学习率和网络超参数。
-
运行run_enwik8_base.sh
,进行Transformer-XL模型的非分布式训练。
bash scripts/run_enwik8_base.sh train [DEVICE_ID]
-
运行run_enwik8_base.sh
,进行Transformer-XL模型的分布式训练。
bash scripts/run_enwik8_base.sh train [DEVICE_NUM]
评估过程
-
在default_config.yaml
中设置选项。确保已设置了 'data' 文件路径。
-
运行eval.py
,评估Transformer-XL模型。
bash scripts/run_enwik8_base.sh eval [DEVICE_ID]
模型描述
性能
训练性能
参数 |
Ascend |
资源 |
Ascend 910;系统 Euler2.8 |
上传日期 |
2022-03-18 |
MindSpore版本 |
1.6.0 |
数据集 |
enwik8 |
训练参数 |
max_step=400000, batch_size=22 |
优化器 |
Adam |
损失函数 |
Softmax Cross Entropy |
BPC分数 |
enwik8数据集上bpc为1.11,pytorch版本1.11 |
速度 |
enwik8数据集上平均为30ms/batch,pytorch平均为30ms/batch |
损失 |
enwik8数据集上loss为0.78,pytorch版本0.78 |
参数 (K) |
15.33 |
推理检查点 |
1.45G(.ckpt文件) |
脚本 |
Transformer-XL script |
评估性能
参数 |
Ascend |
资源 |
Ascend 910;系统 Euler2.8 |
上传日期 |
2022-03-18 |
MindSpore版本 |
1.6.0 |
数据集 |
enwik8 |
batch_size |
22 |
输出 |
损失loss |
损失loss |
0.78 |
BPC分数 |
1.11 |
随机情况说明
以下三种随机情况:
train.py已经设置了一些种子,避免数据集轮换和权重初始化的随机性。若需关闭随机失活,将default_config.yaml中相应的dropout_prob参数设置为0。
ModelZoo主页
请浏览官网主页。