ディープラーニング
多層ネットワークをどう構築し学習するか。連鎖律としての誤差逆伝播法、初期化と正規化による勾配の健全化、そして最適化器、学習率スケジュール、正則化の選択を解説します。
概要
ディープラーニングとは、単純な微分可能演算を何層も重ねたモデルを、勾配降下法でエンドツーエンドに学習する機械学習です。層は全結合、畳み込み、再帰、注意機構ベースのいずれでもかまいませんが、学習の仕組みは共通です。順伝播で損失を計算し、自動微分でその損失のすべてのパラメータに関する勾配を計算し、最適化器がパラメータを更新します。トランスフォーマー、画像、音声のすべてがこの土台の上に載っています。
このハブが現場のエンジニアにとって重要なのは、学習の失敗の大半がアーキテクチャではなくこの仕組みの失敗だからです。ステップ300でNaNになる損失、60%まで学習して止まるモデル、エポック4の後に上向く検証曲線。それぞれに考えられる原因の短いリストがあり、そのリストがこのページの内容です。
重要な考え方
ネットワークは単純な関数の合成
多層パーセプトロンは、行列乗算を行い、バイアスを加え、結果をReLUなどの非線形関数に通し、これを繰り返します。非線形関数がなければ、積み重ねは1つの行列に潰れてしまいます。非線形関数があれば、ほどほどの幅のネットワークでも原理的には任意の連続関数を近似できますが、実際に近似を安上がりにするのは深さです。各層は前の層の特徴量から特徴量を作ります。パラメータ数は重み行列の合計なので、1,024ユニットから1,024ユニットへの層は約1 Mパラメータで、トランスフォーマーブロックはそうした層が数個と、その間の構造からなります。
誤差逆伝播法は、整理された連鎖律
損失は最後の層の出力に依存し、それはその前の層に依存し、入力まで遡ります。誤差逆伝播法は損失から逆向きに連鎖律を適用し、各層の勾配を再利用して下の層の勾配を計算するので、パラメータがいくつあっても完全な勾配のコストは順伝播の約2倍です。PyTorchとJAXは順伝播の計算をグラフとして記録し、逆順に再生します。代償はメモリです。すべての中間活性化は逆伝播が使い終わるまで保持されるので、モデルがGPUに収まるかどうかを決めるのはパラメータ数だけでなく、バッチサイズと系列長です。勾配チェックポインティングは、そのメモリを再計算と引き換えにします。
信号を健全に保つ
50層を通過する勾配は50個の因子の積です。各因子が1より少し大きければ勾配は爆発し、少し小さければ消失し、どちらにせよ下位の層は学習を止めます。因子を1の近くに保つ習慣が3つあります。活性化関数に合ったスケールで重みを初期化すること。ReLUならKaimingの方式、tanhならXavierの方式です。ネットワーク内部で活性化を正規化すること。バッチ正規化はミニバッチの統計量を使い畳み込みネットワークに向き、層正規化は例ごとの統計量を使いトランスフォーマーに向き、RMSNormは速度のために平均の減算を省きます。残差接続を加えて、各ブロックがまったく新しい表現ではなく入力への補正を学ぶようにすること。これが2015年以降、20層を超えるネットワークが学習可能になった理由です。勾配クリッピングは、これらでカバーできない場合の安全網です。
最適化器、スケジュール、正則化
モーメンタム付きSGDは基準となる最適化器で、多くの畳み込みネットワークでは今でも最良の選択です。Adamは勾配の平均と分散の移動推定からパラメータごとにステップを適応させ、より広い範囲の学習率に耐え、トランスフォーマーの既定です。AdamWは重み減衰を勾配更新から切り離したもので、使うべきはこちらの形です。学習率は最適化器より重要です。他の何かに触れる前に、10の冪をいくつか試してスイープしてください。最初の数百ステップは小さな値からウォームアップし、その後は減衰させます。通常はコサインスケジュールでピークの10分の1または100分の1まで下げます。
正則化は分散と戦います。重み減衰はパラメータを縮め、ドロップアウトは学習中にランダムな活性化をゼロにし評価時にはオフになり、データ拡張はデータセットを大きく見せ、検証損失での早期終了は最も安価です。混合精度(bfloat16で計算し、float32のマスター重みを保持)は正則化ではありませんが同じチェックリストに属します。最新のGPUとApple Siliconでは、精度をほぼ損なわずにメモリを半減させ、スループットをおよそ2倍にするからです。
どこから始めるか
まず学習ループを読んでください。勾配降下法を手で書くレッスンです。次にPyTorchで最初のニューラルネットワークで、勾配をautogradに任せます。PyTorch学習ループのリファレンスはコードを書く間ずっと開いておくページで、テンソルの形状とブロードキャストはエラーメッセージを説明します。MNIST CNNプロジェクトは、スケジュールと検証曲線を備えた最初の本格的な学習実行です。
ツールとプラットフォーム
| ツール | 用途 | ライセンス | プラットフォーム |
|---|---|---|---|
| PyTorch | autograd、モジュール、最適化器。研究と本番の既定フレームワーク | BSD-3 | PyTorch |
| JAX with Flax and Optax | 関数型の変換、TPU対応、合成可能な最適化器 | Apache-2.0 | JAX |
| Keras 3 | PyTorch、JAX、TensorFlow上の高水準API | Apache-2.0 | |
| PyTorch Lightning | 学習ループの定型処理、チェックポイント、マルチGPU | Apache-2.0 | オープンソース |
| MLX | ユニファイドメモリをもつApple Silicon向け配列フレームワーク | MIT | Apple |
| TensorBoard | 損失曲線、ヒストグラム、エンベディング | Apache-2.0 | |
| Weights and Biases | ホスト型の実験管理とスイープ | プロプライエタリなサービス、クライアントはMIT | オープンソース |
よくある間違い
optimizer.zero_grad()を忘れ、勾配がステップをまたいで蓄積して損失がさまよう。- モデルを学習モードのまま評価する。ドロップアウトが有効なままで、バッチ正規化がバッチ統計量を使うので、数値が間違っていてノイズも多くなります。
- スイープせずに学習率を選ぶ。高すぎる症状は損失のスパイクやNaN、低すぎる症状はデータの問題に見える平坦な曲線です。
- バイアスと正規化パラメータに重み減衰をかける。ほとんどの参照実装はこれらを除外しています。
- 遅いデータローダーでGPUを飢えさせ、モデルが遅いと結論づける。何かを変える前に1ステップをプロファイルしてください。
- おもちゃのデータセットを過学習させてアーキテクチャが動くと宣言する。1バッチの過学習は有用なスモークテストですが、汎化については何も語りません。
さらに深く
- Goodfellow, Bengio and Courville, Deep Learning, 2016。オンラインで無料公開されています。
- He et al., Delving Deep into Rectifiers, 2015。Kaiming初期化の論文です。およびDeep Residual Learning for Image Recognition, 2015。
- Ioffe and Szegedy, Batch Normalization, 2015。および Ba, Kiros and Hinton, Layer Normalization, 2016。
- Loshchilov and Hutter, Decoupled Weight Decay Regularization, 2017。AdamWの論文です。
- PyTorchのautogradの仕組みと自動混合精度に関するノート。