モデルパラメータとは、学習済みモデル内に保存され、入力を出力へ変換する方法を決定する数値です。ニューラルネットワークでは通常、重みとバイアスが含まれます。これらの値は学習中に決められ、モデルが予測を行う際に再利用されます。
役立つ捉え方
モデルのアーキテクチャを、番号の付いた空のスロットを持つ方程式の集合だと考えてみましょう。アーキテクチャは、スロットの配置と接続方法を決めます。パラメータとは、そのスロットに入れられる数値です。
この区別は重要です。同じアーキテクチャを持つ2つのモデルでも、パラメータの値が異なるために挙動が異なる場合があります。学習前は、スロットに初期化された値が入っています。学習では、データを使ってその一部またはすべてが調整されます。推論中、モデルは通常これらの値を固定したまま、得られた計算を新しい入力に適用します。
パラメータは、ユーザーがリクエストごとに操作するつまみではありません。モデルそのものの一部です。
パラメータの働き
ニューラルネットワークの層では、一般に次の形の計算が行われます。
[
\text{output} = f(\text{input} \times \text{weight matrix} + \text{bias vector})
]
重み行列とバイアスベクトルにはパラメータが含まれます。関数 (f) はアーキテクチャの一部であり、それ自体にはパラメータが含まれない場合があります。
アーキテクチャによって、パラメータテンソルの形状が決まります。2つの入力値を3つの出力値に接続する層では、重み行列に6個のスカラー要素が必要です。
2 inputs ──> [2 × 3 weight matrix] ──> 3 outputs
+
[3-value bias vector]独立して保存される各スカラー要素を、1つのパラメータとして数えます。モデルは、処理するすべての例に対して同じ要素を使います。あるパラメータを100万回適用しても、それが100万個のパラメータになるわけではありません。
学習中、オプティマイザは、各学習可能パラメータをわずかに変更したときにモデルの誤差がどう変化するかについての情報を受け取ります。そして値を更新します。この処理を繰り返すことで、新しい入力を有用な出力に対応付けるパラメータの集合が得られます。
「学習可能」という言葉には注意が必要です。特定の学習実行で更新されないように、パラメータを凍結することができます。それでも、そのパラメータはモデルの学習済み状態の一部です。フレームワークは、計算に影響するもののパラメータとは扱わない別の状態も保存します。PyTorchではこのような状態をバッファと呼び、Kerasではより広い「重み」コレクションに含め、学習可能な重みと学習不可能な重みに分けます。
パラメータ数の計算例
2つの入力値、3つの出力を持つ1つの隠れ層、そして1つの最終出力からなる小さなネットワークを考えます。
最初の層には次のものがあります。
- (2 \times 3 = 6) 個の重み
- 3個のバイアス
- 合計9個のパラメータ
最終層には次のものがあります。
- (3 \times 1 = 3) 個の重み
- 1個のバイアス
- 合計4個のパラメータ
ネットワーク全体では、(9 + 4 = 13) 個のパラメータになります。
入力値は例ごとに変わるため、パラメータには数えません。中間出力も同様に数えません。これらは一時的な結果です。この例の活性化関数はパラメータを追加しません。数に寄与するのは、重み行列とバイアスベクトルに独立して保存された値だけです。
この形状に基づく方法は、より大きなモデルにも適用できます。各パラメータテンソルのスカラー要素を数えて合計します。パラメータが共有されている場合は、モデル内で使用される場所ごとではなく、保存されている値を一度だけ数えます。
パラメータ数が重要な理由
パラメータ数は、モデルが学習した数値状態の規模を表します。これは、実用上のいくつかの特性に影響します。
第一に、保存されたパラメータはメモリを消費します。必要な量は、パラメータ数と各値の表現方法によって異なります。16ビット表現では、パラメータ以外の状態やファイルのオーバーヘッドを考慮する前の段階で、保存されるスカラー1つにつき2バイトを使います。
第二に、パラメータは計算に関与します。パラメータが多いほど算術演算が増えることが多いものの、アーキテクチャ、パラメータ共有、そしてモデルのどの部分が有効になっているかによって、その関係は変わります。
第三に、パラメータ数は、モデルがパターンに適合する能力を説明するのに役立ちます。ただし、その能力がどれだけうまく使われたかを測るものではありません。学習データ、目的関数、アーキテクチャ、最適化、評価のすべてが重要です。パラメータの多いモデルが、自動的により正確、より知識豊富、またはより有用になるわけではありません。
パラメータ数には、何を数えたのかを示すラベルも必要です。ツールや論文は、総パラメータ数、現在学習可能としてマークされているパラメータだけの数、または埋め込みを除外した数を報告することがあります。これらの数値は異なる問いに答えるものであり、同一のものとして比較すべきではありません。
よくある誤解
パラメータはハイパーパラメータではない
パラメータは、モデルの一部として適合される値です。ハイパーパラメータは、モデルまたは学習プロセスを設定します。学習率やバッチサイズは一般的なハイパーパラメータです。これらは学習の進み方に影響しますが、完成したモデル内部で学習された値ではありません。
パラメータと重みは完全な同義語ではない
重みは主要なパラメータの一種であるため、両者の言葉はしばしば同じ意味で使われます。しかし、バイアスもパラメータであり、一部の正規化層で学習されるスケール値やオフセット値もパラメータです。また、「重み」はフレームワーク固有の、より広い意味を持つこともあります。パラメータ数を読む際は、その数値を生成したツールまたはモデル提供者が定義した内容を確認するのが最も安全です。
1つのパラメータが1つの事実を表すわけではない
学習済みモデルの挙動は、多数のパラメータ値が協調して働くことで生じます。通常、1つの値だけが「パリはフランスの首都である」といった自然言語の意味を持つわけではありません。情報は多数の値に分散しており、1つの値が多くの出力に影響することもあります。
パラメータが多いほど優れたモデルになるわけではない
パラメータ数は量を測るものであり、質を測るものではありません。アーキテクチャ、データ、学習が効果的に活用されれば、容量を増やすことで性能が向上する場合があります。一方で、メモリや計算を浪費したり、望ましくないパターンに適合したりすることもあります。性能は、重要なタスク上で測定する必要があります。
保存されたすべての値が必ずしもパラメータとは限らない
モデルは、パラメータとともに、実行中の統計量、キャッシュ、その他の状態を保持する場合があります。フレームワークによって、この状態の分類は異なります。正確な数を求めるには、チェックポイント内のすべてのテンソルのサイズではなく、フレームワークのパラメータ列挙機能を使ってください。
パラメータとモデルの関係
The ニューラルネットワークのアーキテクチャは、演算とパラメータテンソルの形状を決定します。初期化によって、これらのテンソルに開始値が与えられます。学習によって、学習可能な値が変化します。チェックポイントには、得られた値が、多くの場合追加の状態とともに保存されます。推論ではそれらを読み込み、出力の計算に使用します。
したがって、パラメータはモデル全体でも、単なるモデル仕様でもありません。利用可能な学習済みモデルは、アーキテクチャと特定のパラメータ値を組み合わせたものです。
次に読むもの
ニューラルネットワークのパラメータの大部分を構成する乗数の役割については、モデルの重みとは?を読んでください。続いて、2つの用語の正確な境界については、モデルパラメータとモデルの重みの違いを参照してください。