Model Weights
モデルの重みは、ネットワークの入力を予測に変換する学習済みの数値です。学習による重みの決定方法、重みファイル、圧縮について解説します。
モデルの重みとは、ニューラルネットワーク内にある学習可能な数値で、入力を予測値に変換します。各重みは、2つのユニット間を流れる信号をスケーリングするか、畳み込みフィルターの1つの値を形成します。重み全体が連携して、モデルがトレーニングデータから学習した内容をすべて表現します。この用語は、「事前学習済み重み」や「オープンウェイトモデル」のように、バイアスや正規化値を含むモデルの学習済みパラメーター全体を指す意味で、広く使われることがあります。重みの数には桁違いの幅があります。ResNet-50のパラメーター数は約2,560万個ですが、大規模言語モデルでは数十億個に達します。
トレーニングによる重みの設定#
新しいネットワークは、He初期化などの手法で生成した小さなランダム重みから始まります。これらの手法では、各レイヤーのサイズに合わせてランダム値をスケーリングし、多数のレイヤーを通過しても信号が消失したり爆発したりしないようにします。この時点で、モデルの予測はノイズにすぎません。トレーニングでは、データの各バッチについて、次のサイクルを繰り返します。フォワードパスで予測を生成し、損失関数で予測誤差を評価し、誤差逆伝播で各重みが誤差にどれだけ寄与したかを計算し、最適化アルゴリズムが各重みを調整して誤差を減らします。最適化アルゴリズムには、確率的勾配降下法(SGD)やAdamオプティマイザーなどがあります。こうした小さな更新を何百万回も繰り返すと、正確な予測を生み出す値に重みが落ち着き、推論中は固定されます。
重みと関連用語の比較#
- バイアス:
y = Wx + bを計算するレイヤーでは、重みWが入力に乗算され、バイアスbがオフセットとして加算されます。これにより、ユニットの活性化関数のしきい値を移動でき、すべての入力がゼロの場合でもゼロ以外の出力を生成できます。どちらもトレーニング中に学習されます。 - ハイパーパラメーター: 学習率やバッチサイズなど、トレーニング前に設定し、重みの学習方法を制御する値です。勾配降下法では更新されません。
- 活性化: 特定の入力に対してネットワークが計算する中間出力です。重みはすべての入力で同じですが、活性化は入力ごとに再計算されます。
- Weights & Biases: 2種類のパラメーターにちなんで名付けられた、実験追跡プラットフォームです。
重みの保存と読み込み#
学習済みの重みはファイルに保存され、再読み込みして推論に使用したり、共有したり、転移学習の開始点として使用したりできます。PyTorchでは、モデルの重みはstate_dictに格納され、通常は .ptファイルに保存されます。これらのファイルはPythonのpickle形式を使用します。読み込み時にコードが実行される可能性があるため、PyTorch 2.6以降ではtorch.loadの既定値がweights_only=Trueになっています。safetensors形式は生のテンソルのみを格納するため、コード実行のリスクがなく、メモリーマップによる高速な読み込みも可能です。また、Hugging Faceの標準形式です。ONNXファイルは、重みと計算グラフをまとめて格納し、他のランタイムでモデルを実行できるようにします。
Ultralytics YOLO26の.ptチェックポイントには、ステップごとのノイズを平滑化する重みの指数移動平均(EMA)に加えて、トレーニング引数とエポックごとの結果が保存されます。また、各トレーニング実行では、weightsフォルダーにbest.ptとlast.ptが書き込まれます。学習済み重みの有無で同じアーキテクチャを読み込むと、モデルの知識がどこにあるかがわかります。
from ultralytics import YOLO
# Same YOLO26n architecture with two different sets of weights
trained = YOLO("yolo26n.pt") # weights learned on COCO
untrained = YOLO("yolo26n.yaml") # randomly initialized weights
for name, model in [("trained", trained), ("untrained", untrained)]:
results = model("https://ultralytics.com/images/bus.jpg")
print(f"{name}: {len(results[0].boxes)} objects detected")学習済み重みを使うと画像内のバスと人々を検出できますが、同一のネットワークをランダムに初期化したものでは何も検出されません。
デプロイに向けた重みの圧縮#
重みの精度は、モデルのファイルサイズとメモリーフットプリントを決めるため、エッジAIデバイスでは特に重要です。モデル量子化では、重みをより低い精度で格納します。32ビット浮動小数点数から8ビット整数に移行すると、重みのサイズは4分の1になり、整数演算に対応するハードウェアでは推論も高速化します。プルーニングでは出力への寄与が小さい重みを取り除き、知識蒸留では大きなモデルの動作を模倣するよう小さなモデルをトレーニングします。規模の目安として、70億パラメーターの言語モデルでは、32ビットの重みに約28 GB、16ビットでは14 GB、4ビットでは3.5 GBが必要です。










