变压器自动回归实验

Open In Colab

这将训练一个在 NLP 自动回归任务(使用 Tiny Shakespeare 数据集)中引入的 “注意力就是你所需要的” 简单变压器。

16import torch
17from torch import nn
18
19from labml import experiment
20from labml.configs import option
21from labml_nn.experiments.nlp_autoregression import NLPAutoRegressionConfigs
22from labml_nn.transformers import TransformerConfigs, Encoder
23from labml_nn.transformers.utils import subsequent_mask

自回归模型

26class AutoregressiveTransformer(nn.Module):
30    def __init__(self, encoder: Encoder, src_embed: nn.Module, generator: nn.Module):
37        super().__init__()
38        self.src_embed = src_embed
39        self.encoder = encoder
40        self.generator = generator

掩码将在第一次调用时初始化

43        self.mask = None
45    def forward(self, x: torch.Tensor):

如果掩码未初始化或掩码大小不同,则创建后续掩码

48        if self.mask is None or self.mask.size(0) != len(x):

后续的掩码,将掩盖令牌以免看到未来的代币

50            self.mask = subsequent_mask(len(x)).to(x.device)

使用位置编码获取令牌嵌入

52        x = self.src_embed(x)

变压器编码

54        x = self.encoder(x, self.mask)

获取日志

56        x = self.generator(x)

返回结果(第二个值用于状态,因为我们的训练器也与 RNN 一起使用)

60        return x, None

配置

这继承自 NLPAutoRegressionConfigs

63class Configs(NLPAutoRegressionConfigs):

GPT 型号

72    model: AutoregressiveTransformer

变压器

74    transformer: TransformerConfigs

变压器配置

77@option(Configs.transformer, 'Transformer')
78def _transformer_configs(c: Configs):

我们使用我们的可配置变压器实现

85    conf = TransformerConfigs()

设置嵌入和生成 logit 的词汇量大小

87    conf.n_src_vocab = c.n_tokens
88    conf.n_tgt_vocab = c.n_tokens

90    conf.d_model = c.d_model

93    return conf

创建 GPT 模型并初始化权重

96@option(Configs.model)
97def _model(c: Configs):
101    m = AutoregressiveTransformer(c.transformer.encoder,
102                                  c.transformer.src_embed,
103                                  c.transformer.generator).to(c.device)
104
105    return m
108def main():

创建实验

110    experiment.create(name="transformer")

创建配置

112    conf = Configs()

覆盖配置

114    experiment.configs(conf, {

使用角色等级分词器

116        'tokenizer': 'character',

提示分隔符为空

118        'prompt_separator': '',

开始采样提示

120        'prompt': 'It is ',

使用小莎士比亚数据集

122        'text': 'tiny_shakespeare',

使用上下文大小为

125        'seq_len': 512,

训练 32 个时代

127        'epochs': 32,

批量大小

129        'batch_size': 16,

在训练和验证之间切换每个纪元的次数

132        'inner_iterations': 10,

型号尺寸

135        'd_model': 256,
136        'transformer.n_heads': 16,
137        'transformer.ffn.d_ff': 1024,

使用 Noam 优化器

140        'optimizer.optimizer': 'Noam',
141        'optimizer.learning_rate': 1.,
142    })

设置用于保存和加载的模型

145    experiment.add_pytorch_models({'model': conf.model})

开始实验

148    with experiment.start():

跑步训练

150        conf.run()

154if __name__ == '__main__':
155    main()