分层转换器是更有效的语言模型实验

这是一项带注释的 PyTorch 实验,用于训练沙漏

这是基于简单变换器自回归 NLP 任务的训练循环和配置

14import math
15from typing import List
16
17import torch
18from torch import nn
19
20from labml import experiment
21from labml.configs import option
22from labml_helpers.module import Module
23from labml_nn.experiments.nlp_autoregression import NLPAutoRegressionConfigs
24from labml_nn.transformers.hour_glass import HourGlass
25from labml_nn.transformers.positional_encoding import PositionalEncoding

自回归语言模型

28class AutoregressiveTransformer(Module):
  • n_tokens 词汇量是多少
  • d_model 是令牌嵌入的大小
  • dropout 是辍学概率
  • hour_glass沙漏型号吗
33    def __init__(self, n_tokens: int, d_model: int, dropout: float, hour_glass: HourGlass):
40        super().__init__()

令牌嵌入

42        self.embedding = nn.Embedding(n_tokens, d_model)
48        self.pos_embedding = PositionalEncoding(d_model, dropout)
50        self.hour_glass = hour_glass

规范化最终嵌入

52        self.norm = nn.LayerNorm([d_model])

嵌入大小

54        self.d_model = d_model

预测对数的最终线性层

56        self.output = nn.Linear(d_model, n_tokens)
  • x 是令牌索引为形状的张量[seq_len, batch_size]
58    def __call__(self, x: torch.Tensor):

获取嵌入

63        x = self.embedding(x)

添加位置嵌入

66        if self.pos_embedding is not None:
67            x = self.pos_embedding(x * math.sqrt(self.d_model))

沙漏

70        x = self.hour_glass(x)

获取日志

73        output = self.output(self.norm(x))

返回日志

76        return output, None
79class Configs(NLPAutoRegressionConfigs):

型号

87    model: AutoregressiveTransformer

注意头数量

89    n_heads: int = 8

辍学概率

91    dropout: float = 0.1

前馈隐藏层的大小

93    d_ff: int = 512

令牌嵌入大小

95    d_model: int = 256

缩短因素

97    shortening_factors: List[int] = [8, 4]

创建模型

100@option(Configs.model)
101def _model(c: Configs):

创建沙漏模型

107    hour_glass = HourGlass(c.n_heads, c.d_model, c.dropout, c.d_ff, c.shortening_factors)

创建自动回归封装

109    m = AutoregressiveTransformer(c.n_tokens, c.d_model, c.dropout, hour_glass).to(c.device)

112    return m
115def main():

创建实验

117    experiment.create(name="hour_glass")

创建配置

119    conf = Configs()

覆盖配置

121    experiment.configs(conf, {

使用角色等级分词器

123        'tokenizer': 'character',

提示分隔符为空

125        'prompt_separator': '',

开始采样提示

127        'prompt': 'It is ',

使用小莎士比亚数据集

129        'text': 'tiny_shakespeare',

使用上下文大小为

132        'seq_len': 256,

时代而训练

134        'epochs': 128,

批量大小

136        'batch_size': 32,

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

139        'inner_iterations': 10,

使用 Noam 优化器

142        'optimizer.optimizer': 'Noam',
143        'optimizer.learning_rate': 1.,

145    })

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

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

开始实验

151    with experiment.start():

跑步训练

153        conf.run()

157if __name__ == '__main__':
158    main()