ホームページ > 記事 > テクノロジー周辺機器 > 大規模な言語モデルがアクティベーション関数として SwiGLU を使用するのはなぜですか?
如果你一直在关注大型语言模型的架构,你可能会在最新的模型和研究论文中看到“SwiGLU”这个词。SwiGLU可以说是在大语言模型中最常用到的激活函数,我们本篇文章就来对它进行详细的介绍。SwiGLU其实是2020年谷歌提出的激活函数,它结合了SWISH和GLU两者的特点。 SwiGLU的中文全称是“双向门控线性单元”,它将SWISH和GLU两种激活函数进行了优化和结合,以提高模型的非线性表达能力。SWISH是一种非常普遍的激活函数,它在大语言模型中得到广泛应用,而GLU则在自然语言处理任务中表现出色。 SwiGLU的优点在于它能够同时获取SWISH的平滑特性和GLU的门控特性,从而在模型的非线性表达上更加
我们一个一个来介绍:
Swish是一个非线性激活函数,定义如下:
Swish(x) = x*sigmoid(ßx)
其中,ß 为可学习参数。Swish 可以比ReLU激活函数更好,因为它给予了更平滑的转换,这可以带来更好的优化。
GLU(Gated Linear Unit)定义为两个线性变换的分量积,其中一个线性变换由sigmoid激活。
GLU(x) = sigmoid(W1x+b)⊗(Vx+c)
GLU模块可以有效地捕获序列中的远程依赖关系,同时避免了LSTM和GRU等其他门控机制相关的一些梯度消失问题。
我们已经说过SwiGLU是两者的结合。它是一个GLU,但不是将sigmoid作为激活函数,而是使用ß=1的swish,因此我们最终得到以下公式:
SwiGLU(x) = Swish(W1x+b)⊗(Vx+c)
我们用SwiGLU函数构造一个前馈网络
FFNSwiGLU(x) = (Swish1(xW)⊗xV)W2
如果上面的数学原理看着比较麻烦枯燥难懂,我们下面直接使用代码解释。
class SwiGLU(nn.Module): def __init__(self, w1, w2, w3) -> None:super().__init__()self.w1 = w1self.w2 = w2self.w3 = w3 def forward(self, x):x1 = F.linear(x, self.w1.weight)x2 = F.linear(x, self.w2.weight)hidden = F.silu(x1) * x2return F.linear(hidden, self.w3.weight)
コードで使用されている F.silu 関数は、ß=1 の場合の swish と同じであるため、それを直接使用します。
コードからわかるように、活性化関数にはトレーニング可能な 3 つの重みがあり、これらは GLU 式のパラメーターです。
SwiGLU を他の GLU バリアントと比較すると、SwiGLU が両方の事前トレーニング期間で良好なパフォーマンスを発揮していることがわかります。より良い。
#下流タスク
効果は最高です。そのため、現在、LLAMA、OLMO、PALM などの llm はすべて実装で SwiGLU を使用しています。しかし、なぜ SwiGLU が他のものよりも優れているのでしょうか?
この論文では、テスト結果のみが示されており、その理由については説明されていません。代わりに、次のように書かれています。なぜこれらのアーキテクチャが機能するように見えるのかについては、他のすべてと同様に、それらの成功も神の慈悲によるものだと考えています。
しかし、今は 2024 年なので、それを強く説明できます:著者は、錬金術は成功したと言いました。
#1. 負の値に対する Swish の反応は比較的小さいです。一部のニューロンの出力が常にゼロになるという ReLU の欠点を克服します
#2. GLU のゲート特性、つまりどの情報を通過させ、どの情報を通過させるかを決定できる入力状況に応じて情報をフィルタリングする必要があります。このメカニズムにより、ネットワークは有用な表現をより効果的に学習できるようになり、モデルの汎化能力の向上に役立ちます。大規模な言語モデルでは、これは長距離の依存関係を持つ長いテキスト シーケンスを処理する場合に特に役立ちます。
3. SwiGLU のパラメータ W1、W2、W3、b1、b2、b3 W1、W2、W3、b1、b2、b3 はトレーニングを通じて学習できるため、モデルはデータセットを使用してこれらのパラメータを動的に調整すると、モデルの柔軟性と適応性が向上します。
4. 計算効率は、より複雑な活性化関数 (GELU など) よりも高く、良好なパフォーマンスを維持します。これは、大規模な言語モデルのトレーニングと推論にとって重要な考慮事項です。
大規模言語モデルのアクティベーション関数として SwiGLU を選択します。主な理由は、SwiGLU が非線形機能、ゲート特性、勾配の安定性、学習可能なパラメーターの利点を組み合わせているからです。 SwiGLU は、言語モデルにおける複雑な意味関係や長い依存関係の問題を処理する上で優れたパフォーマンスを発揮し、トレーニングの安定性と計算効率を維持できるため、広く採用されています。
#紙のアドレス
#https://www.php.cn/link/86e33d550dc162366a02003089ab9894
以上が大規模な言語モデルがアクティベーション関数として SwiGLU を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。