在这里,我们训练一个在前馈网络中使用模糊平铺激活的变压器。我们用它来制作语言模型,然后在 Tiny Shakespeare 数据集上训练它进行演示。
但是,这可能不是自由贸易协定的理想任务,我们认为自由贸易协定更适合使用连续变量对数据进行建模。
22import copy
23
24import torch
25import torch.nn as nn
26
27from labml import experiment
28from labml.configs import option
29from labml_helpers.module import Module
30from labml_nn.activations.fta import FTA
31from labml_nn.experiments.nlp_autoregression import NLPAutoRegressionConfigs
32from labml_nn.transformers import MultiHeadAttention, TransformerLayer
33from labml_nn.transformers.utils import subsequent_mask36class FeedForwardFTA(nn.Module):d_model
是令牌嵌入中的要素数量d_ff
是 FFN 隐藏层中的要素数量activation
是 FTA 激活模块dropout
是隐藏层的丢失概率41    def __init__(self, d_model: int, d_ff: int,
42                 activation: FTA,
43                 dropout: float = 0.1):50        super().__init__()第一层按权重和偏差进行参数化
52        self.layer1 = nn.Linear(d_model, d_ff)第二层按权重和偏差进行参数化
54        self.layer2 = nn.Linear(d_ff * activation.expansion_factor, d_model)隐藏图层丢失
56        self.dropout = nn.Dropout(dropout)激活功能
58        self.activation = activation60    def forward(self, x: torch.Tensor):62        x = self.activation(self.layer1(x))申请退学
64        x = self.dropout(x)66        return self.layer2(x)69class AutoregressiveTransformer(Module):n_tokens
是词汇表中代币的数量d_model
是嵌入的大小n_layers
是变压器层的数量layer
是层。我们在变压器上使用这个n_layers
副本。77    def __init__(self, n_tokens: int, d_model: int, n_layers: int, layer: TransformerLayer):84        super().__init__()带n_layers
层的变压器
86        self.transformer_layers = nn.ModuleList([copy.deepcopy(layer) for _ in range(n_layers)])令牌嵌入层
89        self.emb = nn.Embedding(n_tokens, d_model)读出层
91        self.readout = nn.Linear(d_model, n_tokens)掩码将在第一次调用时初始化
94        self.mask = Nonex
是形状的输入标记[seq_len, batch_size]
96    def forward(self, x: torch.Tensor):创建自动回归遮罩
101        if self.mask is None or self.mask.size(0) != len(x):后续的掩码,将掩盖令牌以免看到未来的代币
103            self.mask = subsequent_mask(len(x)).to(x.device)获取令牌嵌入
106        x = self.emb(x)变压器编码
108        for layer in self.transformer_layers:
109            x = layer(x=x, mask=self.mask)获取日志
111        x = self.readout(x)返回结果
114        return x, None117class Configs(NLPAutoRegressionConfigs):型号
126    model: AutoregressiveTransformer层数
129    n_layers: int = 4对于 DeepNorm
132    deep_norm_alpha: float
133    deep_norm_beta: float关注的头部数量
136    n_heads: int = 4嵌入大小
138    d_model: int = 256每个注意头的大小
140    d_k: int = 16前馈图层大小
142    d_ff: int = 256自贸区
145    fta_lower_limit: float = -1.
146    fta_upper_limit: float = +1.
147    fta_delta: float = 0.2
148    fta_eta: float = 0.05151@option(Configs.model)
152def _model(c: Configs):创建 FTA 激活模块
158    fta = FTA(c.fta_lower_limit, c.fta_upper_limit, c.fta_delta, c.fta_eta)创建变压器。我们重复使用TransformerLayer
和MultiHeadAttention
实现。
162    m = AutoregressiveTransformer(c.n_tokens, c.d_model, c.n_layers,
163                                  TransformerLayer(d_model=c.d_model,
164                                                   feed_forward=FeedForwardFTA(d_model=c.d_model,
165                                                                               d_ff=c.d_ff,
166                                                                               activation=fta,
167                                                                               dropout=0.1),
168                                                   self_attn=MultiHeadAttention(c.n_heads, c.d_model,
169                                                                                dropout_prob=0.0),
170                                                   dropout_prob=0.0))移到设备
173    return m.to(c.device)176def main():创建实验
181    experiment.create(name="fta", writers={'screen',  'comet', 'labml'})创建配置
183    conf = Configs()覆盖配置
185    experiment.configs(conf, {使用角色等级分词器
187        'tokenizer': 'character',提示分隔符为空
189        'prompt_separator': '',开始采样提示
191        'prompt': 'It is ',使用小莎士比亚数据集
193        'text': 'tiny_shakespeare',使用上下文大小为
196        'seq_len': 256,训练 32 个时代
198        'epochs': 32,批量大小
200        'batch_size': 16,在训练和验证之间切换每个纪元的次数
202        'inner_iterations': 10,没有预热的 Adam 优化器
205        'optimizer.optimizer': 'Adam',
206        'optimizer.learning_rate': 3e-4,
207    })设置用于保存和加载的模型
210    experiment.add_pytorch_models({'model': conf.model})开始实验
213    with experiment.start():跑步训练
215        conf.run()219if __name__ == '__main__':
220    main()