生成AI資格対策(生成AIパスポート+G検定)
勾配降下法
正解の重みは、誰も教えてくれない
モデルの中には調整すべき重みが並んでいますが、どの値が正解なのかを教えてくれる人はいません。分かるのは、今の重みで予測させたときにどれだけ外れたか、という結果だけです。
その外れ具合を1つの数値にまとめたものが損失関数(誤差関数)です。回帰なら平均二乗誤差、分類なら交差エントロピー誤差がよく使われます。学習とは、この損失が最も小さくなる重みを探す作業にほかなりません。
重みが2つしかない場合を想像すると、損失は谷や山のある地形として描けます。やりたいのは、この地形の最も低い場所へ降りることです。ただし全体を見渡すことはできず、分かるのは足元の傾きだけです。勾配とは、その地点で損失が最も急に増える方向を指します。したがって降りたいなら、勾配の逆向きへ重みを動かします。これが勾配降下法という名前の由来で、覚えるべきはこの一点です。
歩幅は、大きすぎても小さすぎても進まない
一歩でどれだけ動かすかを決める値が学習率です。ここが試験でも実務でも最重要になります。
- 学習率が大きすぎると、谷を通り越して反対側の斜面へ飛んでしまい、行ったり来たりを繰り返して損失が減らない、あるいは値が発散します
- 学習率が小さすぎると、降りてはいくものの一歩が小さすぎて、収束するまでに膨大な回数がかかります
大きければ速い、小さければ確実、という単純な話ではなく、両側に失敗があると押さえてください。
もう一つの難所が局所最適解です。地形に浅いくぼみがあると、そこで傾きがほぼゼロになり、全体で最も低い大域最適解に届かないまま止まってしまいます。高次元では、ある方向には下り坂で別の方向には上り坂という鞍点の周辺で更新が進まなくなる現象のほうが、より深刻な足止めの原因になると考えられています。
何件ずつ使って一歩進むか
1回の更新に使うデータ量で呼び名が変わります。全データを使うのが最急降下法(バッチ)で、更新は安定しますが1回が重く、局所解に捕まりやすくなります。1件ずつ使うのが確率的勾配降下法(SGD)で、更新が軽く揺れが大きい代わりに、その揺れが局所解からの脱出を助けます。数十から数百件ずつ使うミニバッチ勾配降下法が両者の中間で、実務ではこれが標準です。
あわせて、エポックは学習データ全体を1周すること、バッチサイズは1回の更新に使うデータ件数、イテレーションは更新の回数を指します。学習データが1000件でバッチサイズが100なら、1エポックは10イテレーションです。この関係は簡単な計算問題として出ます。
素の勾配降下法を改良する工夫も名前で問われます。モーメンタムはこれまで進んできた向きの勢いを加えて揺れを抑えます。AdaGrad はよく更新されたパラメータの歩幅を自動的に小さくしますが、学習率が下がり続けて動けなくなる弱点があり、それを直したのが RMSProp です。Adam は、モーメンタムの勢いと RMSProp の歩幅調整を組み合わせた手法で、最初に試す既定の選択肢として広く使われています。
試験ではこう問われる
- 「勾配は損失が増える方向なので、その逆へ進む」という理屈をそのまま問う正誤問題が出ます。「勾配の方向に進む」は誤りです
- 「学習率を大きくしすぎるとどうなるか」は発散が答えです。「学習が遅くなる」は小さすぎる場合で、入れ替えた誤答が必ず並びます
- データ件数とバッチサイズを与えて、1エポックあたりのイテレーション数を計算させる問題が出ます
- モーメンタム、AdaGrad、RMSProp、Adam は「Adam は何と何を組み合わせたか」という形で問われます
- 局所最適解と鞍点は、どちらも勾配がほぼゼロで学習が止まる点が似ているため、説明文の入れ替えに注意します
復習ミニクイズ
学習データが2000件、バッチサイズが50でミニバッチ学習を行うとき、1エポックあたりのイテレーション数はいくつですか。