これは、トランスフォーマーで使用される位置単位フィードフォワードネットワークのPyTorch実装です。
FFN は、完全に接続された 2 つのレイヤーで構成されています。隠しレイヤーの次元数は、通常、トークン埋め込みの約4倍に設定されます。そのため、エクスパンド・コントラクト・ネットワークと呼ばれることもあります
。隠れ層にアクティベーションがあり、通常はReLU (Rectified Linear Unit) アクティベーションに設定されています。
つまり、FFN 関数は、、、、、は学習可能なパラメーターです。
ReLU の代わりに GELU (ガウス誤差線形単位) アクティベーションが使用されることもあります。どこ
これは、ゲートリニアユニット (GLU) を含むさまざまなバリアントをサポートする一般的な実装です。また、以下の実験も行っています
。38import torch
39from torch import nn as nn
40
41from labml_helpers.module import Module
44class FeedForward(Module):
d_model
トークン埋め込みに含まれる機能の数d_ff
は FFN の隠れレイヤーにあるフィーチャの数ですdropout
は隠れ層のドロップアウト確率ですis_gated
隠れレイヤーをゲートするかどうかを指定しますbias1
最初の完全接続層に学習可能なバイアスを付けるかどうかを指定しましたbias2
2 番目の完全接続層に学習可能なバイアスを付けるかどうかを指定しましたbias_gate
ゲートの全接続層に学習可能なバイアスを設けるべきかどうかを指定49 def __init__(self, d_model: int, d_ff: int,
50 dropout: float = 0.1,
51 activation=nn.ReLU(),
52 is_gated: bool = False,
53 bias1: bool = True,
54 bias2: bool = True,
55 bias_gate: bool = True):
65 super().__init__()
重みとバイアスでパラメータ化されたレイヤー 1
67 self.layer1 = nn.Linear(d_model, d_ff, bias=bias1)
重みとバイアスでパラメータ化されたレイヤー 1
69 self.layer2 = nn.Linear(d_ff, d_model, bias=bias2)
隠しレイヤーのドロップアウト
71 self.dropout = nn.Dropout(dropout)
アクティベーション機能
73 self.activation = activation
ゲートがあるかどうか
75 self.is_gated = is_gated
76 if is_gated:
ゲートがある場合は、入力を変換してゲートを掛け、ウェイトとバイアスをパラメータ化して入力を変換する線形レイヤー
79 self.linear_v = nn.Linear(d_model, d_ff, bias=bias_gate)
81 def forward(self, x: torch.Tensor):
83 g = self.activation(self.layer1(x))
ゲートされている場合、
85 if self.is_gated:
86 x = g * self.linear_v(x)
それ以外の場合
88 else:
89 x = g
ドロップアウトを適用
91 x = self.dropout(x)
ゲート付きか否かによるけど
94 return self.layer2(x)