ジョイジョイジョイ

ジョイジョイジョイジョイジョイ

モデルパラメータの算術

深層モデルのパラメータを一列に並べてベクトルにします。このベクトルは大規模なモデルであれば何十億次元にもなります。一見、意味のない数値の羅列のようですが、このベクトルはベクトルとして深い意味があることが分かってきています。例えば、 \theta_1 \theta_2 を異なるパラメータベクトルとすると、

 \displaystyle \theta_3 = \frac{\theta_1 + \theta_2}{2}
 \displaystyle \theta_4 = 2 \theta_1 - \theta_2
をパラメータとして持つモデルはちゃんと機能します。本稿では、このようなモデルパラメータの算術を用いた手法とその背後にある理論について解説します。

モデルスープ

モデルスープ [Wortsman+ ICML 2022] は複数のモデルパラメータを平均することで性能を上げる手法です。事前学習モデル  \theta_0 \in \mathbb{R}^d からはじめて、様々なハイパーパラメータで訓練した結果のパラメータを  \theta_1, \theta_2, \ldots, \theta_n \in \mathbb{R}^d とします。これらを平均したベクトル

 \displaystyle \theta_{\text{unif}} = \frac{\theta_1 + \theta_2 + \ldots + \theta_n}{n}
は個々のモデルよりも性能が高く、分布のシフトにも頑健であることが分かっています。このように、様々なハイパーパラメータで訓練した結果のパラメータを平均して混ぜ合わせることをモデルスープといいます。

モデルスープの性能比較 [Wortsman+ ICML 2022]。横軸:通常の画像分類性能。縦軸:分布シフト下での画像分類性能。モデルスープは個々のモデルよりも高い性能を達成している。

典型的な訓練の手順では、様々なハイパーパラメータで訓練したあと、検証用データで性能を評価し、最も良かったモデルを残しそれ以外は破棄します。モデルスープは本来破棄していたはずのモデルも材料として活用して性能を上げられることが利点です。追加の訓練時間も必要ありません。また、検証用データセットが必要無い点も魅力的です。

モデルスープはアンサンブルと似ていますが、推論時間とデプロイの単純さの点で大きな違いがあります。 n 個のモデルをアンサンブルすると、推論時間は  n 倍になりますが、モデルスープでは通常のモデルと推論時間は変わりません。また、実環境にデプロイする際、アンサンブルでは複数のモデルを管理する点で煩雑になりますが、モデルスープでは単一のモデルに統合されているため、通常のモデルと同じようにデプロイできます。

上に述べた方法は一様スープと呼ばれる最も簡単なバージョンです。貪欲スープと呼ばれるバージョンでは、検証用データセットを用いて、モデルを検証性能の良い順番に並べ、一つずつスープ(集合)に追加していきます。最初は最も検証性能の良いモデルだけがスープに入っています。ここに検証性能の良い順にモデルを入れ、スープ内のパラメータの平均を取ったモデルの検証精度が上がるならば追加を正式に決定し、下がるならば追加するのを取りやめます。全てのモデルの処理が終わったあとの、スープ内のパラメータの平均を取ったものが最終的なモデルです。貪欲スープは検証用データが必要で、手順も少し複雑になりますが、一様スープよりも性能が良いことが確認されています。

モデルスープに加えられるモデルは全て同じ事前学習モデルからファインチューニングしたものであることに注意してください。一般に、異なるランダム初期化パラメータから始めて訓練したモデルどうしの平均を取っても良いモデルにはなりません。これは、直観的には、異なるランダム初期化パラメータではモードの整合性が無いため、単純に平均するとめちゃくちゃなことになるからです。具体的には、ニューラルネットワークの順列不変性が重要な役割を果たすことが知られています [Entezari+ ICLR 2022]。ニューラルネットワークニューロンは適当に並び替えてもモデルの関数としての振る舞いは変化しません(下図)。しかし、この並べ替えによりパラメータは次元が入れ替わり、ベクトルとしては全く別のものになります。異なるランダム初期化パラメータから始めたモデルではこの並び替え方が合っていないので、別の次元を別の次元と平均することになり、結果がめちゃくちゃになります。Git Re-Basin [Ainsworth+ ICLR 2023] という手法は、ニューロンのマッチング問題を解くことで、並び替え方が合っていないモデルどうしを整列します。異なるランダム初期化パラメータから始めたモデルでであっても、Git Re-Basin を行ってから平均を取ると、良いモデルになることが確認されています。

順列不変性の分かりやすい図 [Chijiwa 2023]。ニューロンを入れ替え、伴って接続する重みの次元を入れ替えると、パラメータベクトルしては全く異なるが関数としては同じモデルが得られる。

確率的重み平均 (stochastic weight averaging; SWA) [Izmailov+ UAI 2018] もモデルスープと同様に、パラメータの平均を取ることで性能を上げる手法です。確率的重み平均では、学習後にある程度大きな学習率で SGD を走らせ、モデルパラメータの列  \theta_1, \theta_2, \ldots, \theta_n \in \mathbb{R}^d を得て、これらを平均します。1 回の学習パスで作れるお手軽なモデルスープと見なすこともできます。

モデルスープはアンサンブルの近似と見なすことも可能です。 f(\cdot; \theta) をモデルの表現する関数とします。アンサンブルは

 \displaystyle f_{\text{ens}}(x) = \frac{1}{n} \sum_{i = 1}^n f(x; \theta_i)
というように、関数空間で平均を取ります。ここで、 f \theta = \theta_{\text{unif}} の周りで  \theta についてテイラー展開すると、
 \displaystyle f(x; \theta_i) = f(x; \theta_{\text{unif}}) + (\theta_i - \theta_{\text{unif}})^\top \nabla_{\theta} f(x; \theta_{\text{unif}}) + O(\|\theta_i - \theta_{\text{unif}}\|^2)
となります。これをアンサンブルの式に代入すると、
 \displaystyle f_{\text{ens}}(x) - f(x; \theta_{\text{unif}}) = \frac{1}{n} \sum_{i = 1}^n (\theta_i - \theta_{\text{unif}})^\top \nabla_{\theta} f(x; \theta_{\text{unif}}) + O(\|(\theta_i - \theta_{\text{unif}})\|^2)
となります。ここで、 \theta_{\text{unif}} の定義より
 \displaystyle \frac{1}{n} \sum_{i = 1}^n (\theta_i - \theta_{\text{unif}}) = 0
に注意すると、モデルスープとアンサンブルの差は
 \displaystyle f_{\text{ens}}(x) - f(x; \theta_{\text{unif}}) = \frac{1}{n} \sum_{i = 1}^n O(\|(\theta_i - \theta_{\text{unif}})\|^2)
となります。すなわち、モデルスープとアンサンブルの差は二次以下となります。事前学習モデルからファインチューニングした場合、パラメータの変化量は小さく、 \|(\theta_i - \theta_{\text{unif}})\| も小さく、一様モデルスープとアンサンブルは関数としても近いと考えられます。前述のように、アンサンブルでは推論の計算時間が  n 倍になり、デプロイも煩雑になるのに対し、一様モデルスープは同等の効果を単一のモデルで達成することができます。

タスクベクトル

タスクベクトル [Ilharco+ ICLR 2023] は、タスクの学習を表すベクトルです。タスクの学習や忘却 (unlearning) をタスクベクトルの算術により実現できます。

タスクベクトルの概要 [Ilharco+ ICLR 2023]。タスクベクトルの加算・減算により、そのタスクを学習・忘却することができる。

事前学習モデル  \theta_0 \in \mathbb{R}^d からはじめて、タスク A のデータセットでファインチューニングした結果を  \theta_1 としたとき、 \tau_A = \theta_1 - \theta_0 をタスク A のタスクベクトルといいます。

タスクベクトルの算術により学習や忘却が実現できることが知られています。例えば、パラメータ  \theta_0 + \tau_A + \tau_B が表すモデルは、タスク A と B の両方の性能が高くなります。また、事前学習モデルを言語モデル、タスク C を悪口をいうタスクとし、悪口から構成されるテキストコーパスで学習をしてタスクベクトル  \tau_C を得たとき、パラメータ  \theta_0 - \tau_C が表す言語モデルは悪口を言わないモデルになります。

また、面白いことに、単語ベクトルと同じようにタスクベクトルもタスクの類推処理ができます。単語ベクトルでは、king - man + woman ≈ queen となることが知られていますが、これと同様のことがタスクベクトルでもできるのです。例えば、タスク A を Amazon レビューの言語モデリング、タスク B を Yelp レビューの言語モデリング、タスク C を Amazon の感情分析とすると、パラメータ  \theta_0 + \tau_C + (\tau_B - \tau_A) が表すモデルは Yelp レビューの感情分析で良い性能を達成します。他にも、タスク A を犬の写真データ、タスク B をライオンの写真データ、タスク C を犬のイラストデータとすると、パラメータ  \theta_0 + \tau_C + (\tau_B - \tau_A) が表すモデルはライオンのイラストを正しく分類できます。このように、所望のタスクのデータを全く、あるいは少量しか持ち合わせてない場合にも、異なるドメインのデータにより構成したタスクベクトルの演算により、所望のタスクを解けるようになるのです。

モデルパラメータとニューラルタンジェントカーネル

このようなモデルパラメータの算術はニューラルタンジェントカーネル (Neural Tangent Kernel; NTK) を考えると見通しが良くなります [Ortiz-Jimenez+ NeurIPS 2023]。

事前学習モデルのパラメータを  \theta_0 \in \mathbb{R}^d としたとき、このモデルで定義されるニューラルンタンジェントカーネル  K とは、

\begin{align}K(x, x') &\stackrel{\text{def}}{=} \phi(x)^\top \phi(x') \\ \phi(x) &\stackrel{\text{def}}{=} \nabla_{\theta} f(x; \theta) \in \mathbb{R}^d \end{align}
のことです。これは、 \phi(x) を特徴ベクトルとし、内積により類似度を測定していると解釈できます。ニューラルンタンジェントカーネルが大きい  x, x' は似ていると見なします。(なお、タンジェント (tangent) とは接線・接平面のことです。勾配  \phi(x) = \nabla_{\theta} f(x; \theta)接平面を表します。)

確率的勾配降下法 (SGD) によりファインチューニングを行い、

 \displaystyle \theta_{i + 1} = \theta_i + \alpha_i \nabla_{\theta} f(x_i; \theta_i)
と更新していきます。ここで、 \alpha_i \in \mathbb{R} は関数出力についての損失の勾配  \frac{\partial L}{\partial f} と学習率の積です(一般性を失うことなく  f の出力は一次元であると仮定しています。)学習率は小さい正の値であり、  \frac{\partial L}{\partial f} の正負は損失関数によって異なります。その訓練サンプルにとって、出力を大きくするべきであれば  \alpha_i は正の値を取り、出力を小さくするべきであれば  \alpha_i は負の値を取ります。ファインチューニングによりパラメータ  \theta_n が得られたとします。

訓練の過程であまりパラメータが動かなかったとし、 \theta = \theta_0 の周りの  \theta についてのテイラー展開により一時近似すると、パラメータ  \theta_n が表す関数は

\begin{align} f(x; \theta_n) &\approx f(x; \theta_0) + (\theta_n - \theta_0)^\top \nabla_\theta f(x; \theta_0) \\ &= f(x; \theta_0) + (\theta_n - \theta_0)^\top \phi(x) \end{align}
と表されます。つまり、事前学習時からの差は、 \phi(x) を特徴抽出器とする線形モデルであると見なすことができます。

また、モデルパラメータ更新の履歴を展開すると、

\begin{align} f(x; \theta_n) &\approx f(x; \theta_0) + (\theta_n - \theta_0)^\top \nabla_\theta f(x; \theta_0) \\ &= f(x; \theta_0) + (\theta_n - \theta_0)^\top \phi(x) \\ &= f(x; \theta_0) + \left(\sum_{i = 0}^{n - 1} \theta_{i + 1} - \theta_i \right)^\top \phi(x) \\ &= f(x; \theta_0) + \left(\sum_{i = 0}^{n - 1} \alpha_i \nabla_{\theta} f(x_i; \theta_i) \right)^\top \phi(x) \\ &\stackrel{\text{(a)}}{\approx} f(x; \theta_0) + \left(\sum_{i = 0}^{n - 1} \alpha_i \phi(x_i) \right)^\top \phi(x) \\ &= f(x; \theta_0) + \sum_{i = 0}^{n - 1} \alpha_i K(x_i, x) \end{align}
となります。ここで、(a) では  f(x_i; \theta_i) \approx  f(x_i; \theta_0) と近似しました。どの訓練データ  x_i とも似ていないテストデータについては、二項目のカーネルの値がゼロになるので、事前学習モデルの出力と等しくなります。ある訓練データ  x_i と似ている場合は、 (\theta_{i + 1} - \theta_i)^\top \phi(x) \approx \alpha_i K(x_i, x) の項が非ゼロとなり、事前学習モデルにその訓練データの学習分が加わったものが出力となります。複数の訓練データと似ている場合にはそれらの学習分すべてが加わることになります。その訓練サンプルにとって、出力を大きくするべきであれば  \alpha_i は正の値を取り、出力を小さくするべきであれば  \alpha_i は負の値を取ることを思い起こしてください。似ている訓練サンプル  x_i にとって出力を大きくするべきであれば  \alpha_i K(x_i, x) は正であり、出力を小さくするべきであれば  \alpha_i K(x_i, x) は負となり、これらの影響を累積したものがファインチューニングモデルの出力になります。

特定のテストサンプル  x についての議論ではなく、関数

\begin{align} f_{\text{diff}}(x) \stackrel{\text{def}}{=} \sum_{i = 0}^{n - 1} \alpha_i K(x_i, x) \end{align}
をパルツェン窓による関数表現だと見なすとより分かりやすくなります。訓練データは自身の周囲に  K(x_i, x) というパルツェン窓を通して影響を及ぼします。

パルツェン窓(この図は正のみであるが、関数を小さくするべきときには  \alpha_i は負の値もとる。)

ここまでくると、(1) 訓練データ、(2) モデルパラメータ、(3) モデルが表す関数、の関係が明瞭になります。訓練データは  (\theta_{i + 1} - \theta_i) \approx \alpha_i \phi(x_i) という項を通じて、モデルパラメータに影響を与えます。これは、関数値を変化させるべき量に応じて、訓練パラメータにそのサンプルのニューラルタンジェントカーネル特徴量  \phi(x_i) を足し合わせることに対応しています。また、これはモデルが表す関数という観点では、カーネル \alpha_i \phi(x_i)^\top \phi(x) = \alpha_i K(x_i, x) に応じて値を上下させていることに対応しています。

タスク A の訓練データ  D_A で訓練したモデルパラメータ  \theta_A には、 D_A 中の訓練データのニューラルタンジェントカーネル特徴量が加えられています。タスク A のタスクベクトルは、ニューラルタンジェントカーネル特徴量の重み付き和になります。

タスクベクトルの和の直感的な説明 [Ortiz-Jimenez+ NeurIPS 2023]。ファインチューニングをすることは、訓練データ集合によるパルツェン窓を追加していると解釈できる。タスクどうしに関連がない場合には、タスクベクトルを足し引きすることで、関数空間内でそれぞれ独立にタスクの効果を追加削除できる。

タスク A のタスクベクトルとタスク B のタスクベクトルの和は、タスク A のデータセットとタスク B のデータセットのニューラルタンジェントカーネル特徴量の和集合が加えられていることになります。これが、タスクベクトルの和により学習が起こる直観的な説明になります。

また、モデルスープについても、スープにニューラルタンジェントカーネル特徴量を追加していっていると見なすことができます。訓練データは同じなので、これでは恩恵は説明しきれていませんが、直観的にはハイパーパラメータ毎に少し異なる角度で特徴量が足し合わされるためにロバストに類似度を測れるようになっていると考えることができます。

おわりに

深層モデルのパラメータは意味のない数値の羅列のように考えがちですが、よく分析すると理論的にも実験的にも深い意味があるというのはとても面白いと思いました。ここ 1~2 年で急速に発展が進んだトピックであり、今後も面白い研究結果がどんどん出てきそうに思います。

連絡先: @joisino_ / https://joisino.net