最適化手法
勾配降下法
現実のモデル学習では、解析的に解を求めるのではなくアルゴリズムを用いて最適解を探索するというアプローチがとられます。勾配降下法は、モデルの性能を示す「損失(誤差)」を最小化するために、モデルのパラメータ(重みやバイアス)を調整する最適化アルゴリズムの総称です。
バッチ勾配降下法
全データを使って損失関数の勾配を計算し、一括でパラメータを更新します。
以下のような特徴があります。
- 安定した収束: すべてのデータを考慮するため、更新ごとの変動が少なく、滑らかに収束します。
- 計算コストが高い: データセット全体を処理するため、大規模データでは計算負荷が大きくなります。
- 局所最適解に陥る可能性: 非凸関数の場合、最適解ではなく局所最適解に収束する可能性があります。
確率的勾配降下法
確率的勾配降下法(Stochastic Gradient Descent, SGD)は、データを1つずつランダムに選びながらパラメータを更新する最適化手法です。以下のような特徴があります。
- 計算コストが低い: 1つのデータポイントごとに更新するため、大規模データセットでも高速に処理できます。
- 収束が不安定: 毎回異なるデータを使うため、更新の方向がばらつきやすく、振動しながら収束します。
- 局所最適解を回避しやすい: ランダム性があるため、局所最適解に陥るリスクを軽減できます。
ミニバッチ勾配降下法
ミニバッチ勾配降下法(Mini-Batch Gradient Descent)は、バッチ勾配降下法と確率的勾配降下法の中間に位置する手法です。データセットを小さなグループ(ミニバッチ)に分割し、それぞれのバッチ単位で勾配を計算してパラメータを更新します。以下のような特徴があります。
- 計算コストの安定性のバランス: バッチ勾配降下法ほど重くなく、確率的勾配降下法ほど不安定ではない。
- 収束の安定性: ミニバッチ単位で更新するため、確率的勾配降下法よりも収束がスムーズ。
- 並列処理が可能: GPUを活用して高速に計算できるため、ディープラーニングで広く使われる。
勾配降下法の問題と改善方法
学習率の調整
勾配降下法において、局所最適解に陥らずに、より良い(理想的には大域最適解に近い)最適解を見つけるための学習率の調整は、非常に重要な課題です。学習率の調整には、様々なアプローチがあります。
局所最適解と学習率の関係は以下のようになります。
- 学習率が大きすぎる場合: 損失関数の「谷」を飛び越してしまい、不安定な学習になったり、最適な点に収束しなかったりします。また、複数の「谷」がある場合に、深い谷を飛び越えて別の浅い谷に落ち着いてしまう可能性もあります。
- 学習率が小さすぎる場合: 学習の収束が非常に遅くなり、計算コストが増大します。また、比較的浅い局所最適解に「引っかかって」しまい、そこから抜け出せなくなる可能性が高まります。
学習率の調整には様々なアプローチがあります。
- AdaGrad (Adaptive Gradient Algorithm): これまでの勾配の二乗和に反比例するように学習率を調整します。頻繁に更新されるパラメータ(勾配が大きい)には小さな学習率を、あまり更新されないパラメータ(勾配が小さい)には大きな学習率を適用します。ただし、学習が進むと学習率が急速に小さくなりすぎて、更新が停止してしまう問題があります。
- RMSprop (Root Mean Square Propagation): AdaGradの学習率が急速に小さくなる問題を緩和したものです。勾配の二乗の移動平均を使用します。
- Adam (Adaptive Moment Estimation): 現在最も人気のある最適化アルゴリズムの一つです。勾配の一次モーメント(平均)と二次モーメント(分散)の両方を推定し、パラメータごとの適応的な学習率を提供します。モーメンタムの要素も組み込まれており、効率的かつ安定した学習が可能です。局所最適解に比較的陥りにくいとされます。
- Nadam (Nesterov-accelerated Adaptive Moment Estimation): AdamにNesterovの加速勾配を組み合わせたものです。
局所最適解に陥らずに最適解を見つけるための学習率の調整は、単一の手法に頼るのではなく、複数の戦略を組み合わせることが一般的です。
早期終了(early sopping)
モデルの学習を進めていくと、訓練データに対する損失は常に減少していきます。しかし、ある時点から、訓練データに対する性能は向上し続けても、未知のデータ(検証データ)に対する性能が悪化し始めることがあります。これが過学習の兆候です。
早期終了は、まさにこの過学習が始まる手前で学習を停止することで、最適なモデルの状態を捉えようとする手法です。極めてシンプルですが、非常に効果的であることが知られています。
ハイパーパラメーターの探索
ハイパーパラメータの探索(またはハイパーパラメータチューニング)は、ディープラーニングモデルの性能を最大化するために不可欠なプロセスです。モデルの学習が始まる前に設定されるハイパーパラメータは、モデルの構造や学習プロセスに大きな影響を与え、その結果としてモデルの最終的な性能を左右します。
以下のような探索手法があります。
グリッドサーチ(Grid Search)
- あらかじめ設定した範囲内で、すべての組み合わせを試す方法。
- 計算コストが高いが、最適なパラメータを確実に見つけられる。
ランダムサーチ(Random Search)
- 指定した範囲内でランダムにパラメータを選び、探索を行う。
- グリッドサーチより計算コストが低く、広い範囲を探索できる。
ベイズ最適化(Bayesian Optimization)
- 既存の探索結果をもとに、次に試すべきパラメータを予測しながら探索する。
- 計算コストを抑えつつ、効率的に最適解を見つけられる。
遺伝的アルゴリズム(Genetic Algorithm)
- 自然淘汰の原理を利用し、良いパラメータを選択・交叉・突然変異させながら探索する。
- 多様性を保ちつつ、最適解に近づく。
誤差逆伝播法
- 学習の基盤:
ディープラーニングモデルは、入力データから正しい出力を導き出すように学習します。この学習は、モデルの出力と正解との間の「誤差」を最小化することによって行われます。誤差逆伝播法は、この誤差を各層のニューロンの重みとバイアスにどのように「分配」すれば誤差が小さくなるかを効率的に計算する、つまり勾配を計算する役割を担います。 - 効率的な重み更新:
ディープラーニングモデルは数百万、時には数十億ものパラメータ(重みとバイアス)を持っています。これらのパラメータを一つ一つ調整して誤差を最小化するのは非現実的です。誤差逆伝播法は、連鎖律(chain rule)を利用して、出力層から入力層に向かって勾配を逆向きに伝播させることで、これらの膨大なパラメータの勾配を驚くほど効率的に計算します。この計算された勾配に基づいて、最適化アルゴリズム(例:SGD、Adamなど)がパラメータを更新し、モデルの性能を向上させます。 - 複雑なモデルの実現:
誤差逆伝播法がなければ、多層のニューラルネットワーク(ディープラーニングモデル)を効果的に学習させることは非常に困難です。このアルゴリズムの存在が、画像認識、自然言語処理、音声認識など、今日のディープラーニングが実現している様々な複雑なタスクを可能にしています。
具体的には以下のようなステップで構成されます。
- 誤差計算
ネットワークの出力と教師データ(目標値)との差を損失関数で評価し、誤差を定量化する。 - 逆伝播 (Backward Propagation)
出力層での誤差を起点に,チェインルール(連鎖律)を用いて,各層の重みやバイアスに対する誤差の感度を勾配として入力層方向へ伝搬させる。 - パラメータ更新
得られた勾配を用い,学習率 η を掛けた分だけパラメータを「勾配降下法」で修正する
活性化関数
シグモイド関数と勾配消失問題
シグモイド関数は、初期のニューラルネットワークで広く利用された活性化関数ですが、勾配消失問題 (Vanishing Gradient Problem) の主要な原因の一つとして知られています。
勾配消失問題とは、ディープラーニングモデル(多層ニューラルネットワーク)を誤差逆伝播法で学習させる際に、層が深くなるにつれて、初期層の重みに対する勾配が極端に小さくなり、その結果、初期層の重みがほとんど更新されず、学習が進まなくなる現象を指します。
シグモイド関数の導関数の値は、常に 0 から 0.25 の範囲に収まります。具体的には、x=0 のときに最大値 0.25 を取り、x の絶対値が大きくなるにつれて 0 に近づきます。
誤差逆伝播法では、出力層から入力層に向かって、各層の勾配を計算する際に、その層の活性化関数の導関数の値を掛け合わせていきます。層が深くなればなるほど、この 0 から 0.25 の間の小さな値を繰り返し掛け合わせることになります。
になってしまいます。勾配が 0 になると、重みの更新量が 0 に近づくため、ネットワークの初期層が学習しなくなり、全体の学習が停滞してしまうのです。これが、シグモイド関数が勾配消失問題を引き起こす主要なメカニズムです。
tanh関数
シグモイド関数が 0 から 1 の範囲で出力されるのに対し、tanh関数は −1 から 1 の範囲で出力され、その中心が 0 にあります。この「ゼロ中心」であるという性質は、勾配降下法による学習において非常に有利に働きます。なぜなら、出力が常に正であるシグモイド関数と異なり、tanh関数の出力は正負の両方の値を取り得るため、各層への勾配がより効率的に伝播し、学習の収束が速くなる傾向があるからです。ただし、入力が大きくなると勾配が小さくなり、勾配消失問題が起こりやすいという欠点もあります。
tanh関数はディープラーニングのブームで活性化関数が再びトピックとなる以前には、最も有力な活性化関数として知られていました。
シグモイド関数の改良版ですが、勾配消失問題を必ずしも解決したわけではありません。
ReLU関数
ReLU関数(Rectified Linear Unit)は、ディープラーニングで最も広く使われている活性化関数のひとつです。非常にシンプルな定義ながら、学習の効率と性能を大きく向上させる力を持っています。
その特徴は以下のようなものです。
- 勾配消失問題の軽減:
シグモイド関数やtanh関数が抱えていた最大の課題である勾配消失問題を大きく緩和します。
・x>0 の領域では、導関数は常に 1 となります。これにより、勾配が層を深く伝播しても小さくなりにくく、特に深いネットワークの学習を安定させ、高速化することができます。
・x≤0 の領域では、導関数は 0 となります。 - 計算効率の高さ:
ReLU関数の計算は、入力が 0 より大きいか小さいかを比較し、それに応じて x または 0 を出力するだけなので、指数関数や除算を含むシグモイド関数やtanh関数に比べて非常に高速です。これは、膨大な計算を必要とするディープラーニングにおいて、学習時間を大幅に短縮する上で重要です。 - スパースな活性化:
負の入力に対しては 0 を出力するため、ニューロンの一部が「非活性化」され、ネットワークの活性化がスパースになります。これにより、モデルの表現力が向上し、過学習を防ぐ効果も期待できます。
以下のような欠点もあります。
- Dead ReLU問題 (Dying ReLU Problem):
x≤0 の領域で導関数が常に 0 であるため、もしあるニューロンへの入力が常に負の値になってしまうと、そのニューロンは以降の学習で勾配を受け取ることができなくなり、重みが更新されなくなってしまいます。これを「Dead ReLU」と呼び、ネットワークの一部が学習に参加しなくなる可能性があります。 - ゼロ中心ではない出力:
シグモイド関数と同様に、出力が常に 0 以上であるため、出力がゼロ中心ではありません。これにより、勾配の計算において、わずかなバイアスが生じ、学習の収束が遅くなる可能性が指摘されています。しかし、この問題はバッチ正規化などの他の手法で対処されることが多いです。
コメント