Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

GPTの実装

参考:Python(PyTorch)で自作して理解するTransformer(Encoder-Decoder方式のTransformer)

Maskについて

Masked Self-Attention:自己回帰生成(順に要素を予測していくタスク)などに用いられる場合、Self-Attentionの各要素が自身より未来の要素を参照できないようにする必要がある。このため、Attention Matrixに三角状のマスクを適用し、各要素が未来の要素にアクセスできないようにすることで、過去と現在の情報のみから未来の情報を予測できるように学習させる。

30分で完全理解するTransformerの世界

tensor([[[[1., 0., 0., 0., 0.], [1., 1., 0., 0., 0.], [1., 1., 1., 0., 0.], [1., 1., 1., 1., 0.], [1., 1., 1., 1., 1.]]]])
tensor([[[[1., 0., 0.], [1., 1., 0.], [1., 1., 1.]]]])

Model

GPT( (tok_embed): Embedding(10, 768) (dropout): Dropout(p=0.1, inplace=False) (blocks): Sequential( (0): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (1): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (2): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (3): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (4): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (5): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (6): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (7): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (8): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (9): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (10): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) (11): Block( (ln1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (ln2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): MultiheadAttention( (key): Linear(in_features=768, out_features=768, bias=True) (value): Linear(in_features=768, out_features=768, bias=True) (query): Linear(in_features=768, out_features=768, bias=True) (proj): Linear(in_features=768, out_features=768, bias=True) (attn_dropout): Dropout(p=0.1, inplace=False) (proj_dropout): Dropout(p=0.1, inplace=False) ) (ff): Sequential( (0): Linear(in_features=768, out_features=3072, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=3072, out_features=768, bias=True) (3): Dropout(p=0.1, inplace=False) ) ) ) (ln): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (fc): Linear(in_features=768, out_features=10, bias=True) )