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):
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)
最終的な埋め込みを正規化するには
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,
145 })
保存および読み込み用のモデルを設定する
148 experiment.add_pytorch_models({'model': conf.model})
実験を始める
151 with experiment.start():
トレーニングを実行
153 conf.run()
157if __name__ == '__main__':
158 main()