位置別フィードフォワードネットワーク (FFN)

これは、トランスフォーマーで使用される位置単位フィードフォワードネットワークの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

FFN モジュール

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)