汎化性能向上のためのテクニック

0.章の概要

この章では、機械学習モデルの汎化性能を向上させるための重要なテクニックを紹介します。過学習を防ぎ、モデルが新しいデータに対しても高い精度を保つために、データ集合の拡張、正規化、アンサンブル手法、ハイパーパラメータの選択といった方法を深堀りし、それぞれの効果と実践的な活用法を学びます。

1.データ集合の拡張

学習キーワード: ノイズ付与(Gaussian Filter)、Rnadom Flip・Erase・Crop・Contrast・Brightness・Rotate、RandAugument、MixUp、EDA、MixUp、ノイズ付与(Gaussian Noise)、ボリューム変更、ピッチシフト、MixUp、SpecAugment

概要

データ集合の拡張は、機械学習モデルの汎化性能を向上させるために、既存のデータに変換や加工を加えて新しいデータを生成する手法ですデータ集合の拡張により、モデルの過学習を防ぎ、汎化性能を向上させることができます。また現在では、以下に説明する手法は機械学習ライブラリで簡単に実装することができるようになっています。


画像のデータ拡張

画像のデータ拡張には、以下のような手法があります。

ノイズ付与(Gaussian Filter)

画像のピクセルに対して平滑化(スムージング)を施す手法で、各ピクセルの周囲のピクセル値をガウス分布に基づいて平均化することで、ぼやけた画像を作ります。ガウシアンノイズは、平均 0、分散 \(σ^2\) の正規分布に従うランダム変数です。

gaussian_filter
Random Flip

水平方向や垂直方向に画像をランダムに反転させます。物体の位置や向きに対してモデルが不変性を持つようにするために有効ですが、手書き文字など、反転することで意味合いが大きく異なる場合には注意が必要です。(6を上下反転すると9になってしまう)

flip
Random Erase

画像内のランダムな領域をマスクすることで、部分的な情報が欠けた状態で学習させる手法です。これにより、モデルは部分的な情報からも推論する力が養われます。

erase
Random Crop

画像のランダムな位置から一定の範囲を切り取ることで、モデルに異なるフレームからの学習をさせます。サイズや配置の変動に対応するモデルの能力を向上させます。

crop
Random Contrast

コントラストをランダムに変更することで、異なるコントラストでも頑健に推論できるようにモデルを強化します。

contrast
Random Brightness

明るさをランダムに変更することで、異なる照明条件下でも頑健に推論できるようにモデルを強化します。

brightness
Random Rotate

画像をランダムな角度で回転させることにより、回転に対するモデルの不変性を高めます。

rotate
RandAugument

さまざまなデータ拡張手法(回転、ぼかし、色変更など)を組み合わせ、最適な拡張方法を自動的に選択するアルゴリズムです。多様な変換の組み合わせを試し、モデルがさまざまな変化に対応できるようにします。

rand_augment
MixUp

異なる2つの画像を混合して新しい画像を生成する手法です。ラベルも同様に混合され、出力は2つのサンプルの中間的なものとなります。データ分布を広げてモデルの汎化性能を高めます。

以下の例では、元画像とその反転画像をMixUpしています。

mix_up

自然言語のデータ拡張

自然言語のデータ拡張には、以下のような手法があります。

MixUp

2つの異なる文章を混合することで、新しい文章を生成します。

具体例:例えば、以下のように2つの異なる文章を組み合わせます。

  • 文章1:「今日は天気が良いですね。」
  • 文章2:「明日は雨が降りそうです。」

これらを MixUp の手法で組み合わせると、次のような新しい文章が生成されます。

  • 「今日は天気が降りそうです。」
  • 「明日は天気が良いですね。」
EDA (Easy Data Augmentation)

単語の挿入・削除・置換・シャッフルなどを行い、データの多様性を高める方法です。

具体例:「今日は天気が良いですね。」という文章に対して、以下のような操作を行います。

  • ランダム削除: 「今日は天気がですね。」または「天気が良いですね。」
  • ランダム入れ替え: 「良い天気が今日はですね。」や「天気が今日は良いですね。」
  • ランダム挿入: 「今日は天気が良い天気がですね。」や「今日は天気が良いですね良い。」
  • 同義語置換(簡易): 「今日は気天が良いですね。」や「今日は天気がい良ですね。」

音声のデータ拡張

音声のデータ拡張には、以下のような手法があります。

ノイズ付与(Gaussian Noise)

Gaussian Noise(ガウシアンノイズ)は、音声データにガウス分布に従うノイズを付加する手法です。特にホワイトノイズを用いてデータの多様性を高め、モデルが雑音環境でも安定した性能を発揮できるようにします。

ボリューム変更

ボリューム変更は、音声データの音量を増減させることでデータを拡張する方法です。小さな音量から大きな音量まで幅広い音量のデータを学習させることで、異なる音量条件に対するモデルの対応力を高めます。

ピッチシフト

ピッチシフトは、音声の高さ(ピッチ)を上げたり下げたりして、声のトーンを変更するデータ拡張手法です。異なる話者の声質に近づける効果があるため、様々な音声特性に対応するデータを作成できます。

音声の基本周波数 \(F_0\) を変化させて、元の音声の長さを保ったまま音の高さを上げ下げします。たとえば、半音単位でピッチを調整し、男性の音声を女性の音声に近づけることも可能です。

MixUp

音声データでも MixUp を適用することが可能です。これは、2つの異なる音声データを重ねて新しい音声データを生成し、ラベルもそれぞれの音声ラベルを組み合わせたものにします。視覚的には複数の話者が重なった音声データを作り出します。MixUpにより、異なる音声が混ざった状況でもモデルが音声を認識できるようになり、ノイズに強い音声認識モデルを構築できます。

SpecAugment

SpecAugmentは、音声データのスペクトログラムに対して拡張処理を行う手法です。スペクトログラムの一部をマスクすることにより、異なる周波数や時間位置のデータが欠損した状態での学習を通じてモデルの頑健性を高めます。(SpecAugmentの論文はこちらから)

2.正規化

学習キーワード: Batch Normalization、Layer Normalization、Instance Normalization、Group Normalization

概要

正規化(Normalization)は、深層学習モデルの学習を安定化させ、勾配消失や勾配爆発を防ぐために使われる手法です。ここでは、代表的な4つの正規化手法を紹介します。


Batch Normalization

Batch Normalizationでは、バッチごとに各特徴量の分布を標準化することで、勾配の安定化と学習の収束を速めます。(NNの中間層の出力に対して行うことが多い。)

手法の概要:バッチ内の各特徴に対しての平均と分散から正規化を行い、その後、学習可能なパラメータでスケールとシフトを行います。

batch_normalization
  1. ミニバッチの平均と分散を計算します。
    \(\mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i, \quad \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2\)

    ここで、\( m \) はバッチサイズ(サンプル数)、\( x_i \) はバッチ内の各サンプルの入力データです。

  2. 入力データを正規化します。
    \(\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}\)

    \(\epsilon\) は数値安定化のための微小な定数です。

  3. スケールとシフトを行います。
    \(\ y_i = \gamma \hat{x}_i + \beta\)

    \( \gamma \) と \( \beta \) は学習可能なパラメータで、それぞれスケールとシフトの役割を持ちます。

テスト時にはミニバッチを取得できないので、データセット全体から決定しておいた平均・分散を使って正規化を行います。


Layer Normalization

Layer Normalizationでは、レイヤーごとに各特徴量の分布を標準化することで、入力スケール変化に対するモデルの頑健性を高めます。主に、TransformerやRNNなどで用いられます。(CNNにはあまり適さないと言われています。)

手法の概要:各サンプル(データ点)内のすべての特徴に対して平均と分散を計算し、正規化します。

layer_normalization

自然言語モデルでは各サンプルごと(文章ごと)にの長さが違うため、バッチ方向で正規化すると平均・分散を計算する際の分母(データ数)が変わってしまいます。その点、Layer Normalizationではレイヤーごとに各特徴量の分布を標準化することで、入力のスケール変化に対するモデルの頑健性を高めました。


Instance Normalization

Instance Normalizationは、各インスタンスごと(画像1枚単位で、チャンネルごと)に正規化を行うことで、各画像の特徴を保ちながら統計的均一化を行います。主にGANなどの画像生成の分野で用いられます。(RNNにはあまり適さないと言われています。)

手法の概要:画像の各チャネル内で平均と分散を計算し、それを使って正規化します。

instance_normalization

Group Normalization

Group Normalizationは、特徴量を複数のグループに分け、それぞれのグループごとに正規化を行うことで、バッチサイズに依存しない安定した正規化を実現しました。

手法の概要:特徴マップをいくつかのグループに分け、各グループごとに平均と分散を計算して正規化します。

group_normalization

関連用語の補足
  • チャネル:画像の各色成分(RGBなど)を示す。
  • \(\gamma\), \(\beta\):正規化後にスケールとシフトを行う学習可能なパラメータ。
  • \(\epsilon\):数値的に安定化させるための微小な定数。

3.アンサンブル手法

学習キーワード: バギング、ブースティング、ブートストラップ、スタッキング

概要

アンサンブル手法は、複数のモデルを組み合わせて予測精度や汎化性能を向上させる技術です。アンサンブル学習では、「バイアスとバリアンスの両方が低い」状態を目指します(バイアスとアンサンブルについての解説はこちら)。ここでは、代表的な技術である、バギングブースティングブートストラップスタッキングの4つを解説していきます。


バギング

バギング(Bagging、Bootstrap Aggregating)は、複数のモデルを並行して訓練し、それらの出力を平均化することで予測精度を高めるアンサンブル手法です。

手順:

  1. 元のデータセットから複数のサンプルデータセットをブートストラップ法(ランダムな標本を抽出することにより標本分布を推定する統計手法)で作成する。
  2. それぞれのサンプルデータセットを使って、複数のモデル(同一アルゴリズムが多い)を訓練する。
  3. 各モデルの予測結果を平均(回帰)または多数決(分類)で集約し、最終的な予測を得る。

特徴:

  • 各モデルの独立性が高く、作成された学習器は、それぞれ並列で計算できる。
  • 汎化性能が向上する(バリアンスを下げることができる)。

代表的な手法としてランダムフォレストがあります。(ランダムフォレストの解説はこちら


ブースティング

ブースティング(Boosting)は、弱い学習器を順次追加し、前のモデルが間違えたデータに重みを置いて訓練することで、より強力なモデルを構築する手法です。

手順:

  1. 最初のモデルを訓練し、誤ったサンプルに対して高い重みを与える。
  2. その重みを考慮して次のモデルを訓練する。
  3. 各モデルの予測結果を重み付き平均または投票で統合し、最終予測を行う。

特徴:

  • バギングと比較して精度が高いとされている。
  • バイアスは下がりやすい反面、過学習が起きやすい。
  • 計算量が多く、学習時間に時間がかかる。

代表的な手法としてAdaBoostGradient Boostingがあります。(Gradient Boostingの解説はこちら


スタッキング

スタッキング(Stacking)は、異なる種類のモデルを組み合わせることで予測精度を高めるアンサンブル手法です。

手順:

  1. 複数のモデルを「レイヤー」として配置し、各モデルの予測結果を次の層に渡す。(※できるだけ多くのモデルを作成した方が精度の向上に繋がります。)
  2. 最終的な層(メタモデル)で各レイヤーの出力を統合し、最終予測を行う。

特徴:

  • 異なるアルゴリズムの長所を活かして予測精度を向上させる。
  • モデル間の相関が低い場合に特に効果的。

※厳密なアルゴリズムは難しいですが、バギングやブ―スティングに比べて重要度は劣るので、概要を把握しておけばOKです。

関連用語の補足
  • ブートストラップ:データセットから一部をランダムに抽出することで複数のデータセットを生成し、それを利用してモデルを訓練する手法です。

4.ハイパーパラメータの選択

学習キーワード: 学習率、隠れ層の数 (レイヤー層数)、ユニット数、ドロップアウトの割合、バッチサイズ、正則化項の係数、グリッドサーチ、ランダムサーチ、ベイズ最適化

概要

ハイパーパラメータ調整は、モデルの性能を最適化し、過学習や計算効率を向上させるための重要な工程です。ここでは、基本的なハイパーパラメータについて、その役割や調整のポイントを解説します。

※以下では各項目ごとに調整方法の例を挙げていますが、深層学習では「どのモデルでも高精度を出すハイパーパラメータ値」は基本的に存在しません。モデルごとにチューニングは必須ですので、あくまでも過去の代表的モデルの参考例としてご理解下さい。


基本的なハイパーパラメータ調整
学習率(Learning Rate)

学習率は、各ステップでモデルのパラメータをどの程度更新するかを決定する重要な値です。

  • 高すぎる学習率:収束せず、精度が不安定になり、場合によっては発散することもある。
  • 低すぎる学習率:収束は安定するが、計算時間が長くなり、局所最適解に陥る可能性がある。

調整方法の例:0.001や0.0001などの小さい値から始め、訓練状況に応じて少しずつ調整します。学習の途中で学習率を減少させる「学習率スケジューリング」や「Adam」などの適応型オプティマイザも効果的です。


隠れ層の数(レイヤー層数)

隠れ層の数は、ニューラルネットワークの深さを決めるパラメータで、モデルの表現力に直接影響します。

  • 少ない層数:単純な問題には適するが、複雑なデータには表現力が不足する可能性がある。
  • 多い層数:表現力が高まり複雑なパターンを学習できるが、過学習のリスクや計算コストが増える。

調整方法の例:中間層の数に決まりはなく、扱う情報にあわせた設定が必要です。シンプルな問題は1〜3層、複雑な問題は5層以上から始め、データの量や複雑さに合わせて調整します。


ユニット数(Units per Layer)

各隠れ層のユニット数は、層の表現力を調整するパラメータで、複雑なパターンの学習に影響します。

  • 少ないユニット数:計算コストが低くなるが、データの複雑なパターンを学習しにくい。
  • 多いユニット数:表現力が高まり複雑なパターンを学習しやすくなるが、過学習や計算コストが高くなる。

調整方法の例:32, 64, 128, 256などの2のべき乗から始め、データや問題の複雑さに応じて増減します。


ドロップアウトの割合(Dropout Rate)

ドロップアウトは、訓練時にランダムにユニットを無効化して過学習を防ぐ手法です。

  • 低いドロップアウト率(0.1以下):過学習の防止効果が弱い。
  • 高いドロップアウト率(0.5以上):過剰にユニットが無効化され学習が進まない場合がある。

調整方法の例:一般的には0.2〜0.5の範囲で試すことが多いので、まず0.3程度から始めてみて、過学習が発生する場合に徐々にドロップアウト率を増やします。


バッチサイズ(Batch Size)

バッチサイズは、モデルのパラメータを更新する際に使うデータの数を指し、計算効率や収束速度に影響します。

  • 小さいバッチサイズ:メモリ負担が小さく計算安定性が高まるが、計算時間が増加する可能性がある。
  • 大きいバッチサイズ:計算効率が上がるが、メモリ消費が大きく局所的な最適解に陥る可能性がある。

調整方法の例:32や64の2のべき乗から始め、メモリや訓練速度のバランスを考慮して調整します。


正則化項の係数(Regularization Coefficient)

正則化はモデルの複雑さを抑えるため、損失関数にペナルティを加え、過学習を防ぐための手法です。

  • 低い係数:ペナルティがかからず、過学習しやすくなる。
  • 高い係数:モデルが単純化され、訓練データのパターンを学習しきれない場合がある。

調整方法の例:0.01や0.001のような小さな値から始め、過学習の有無を確認しつつ調整します。代表的な正則化手法として、L1正則化とL2正則化があります。(L1正則化とL2正則化の解説はこちら


ハイパーパラメータの最適化

ハイパーパラメータの最適化は、モデルのパフォーマンスを最大化するために重要です。以下の方法で最適化を行います。

グリッドサーチ(Grid Search)

グリッドサーチは、すべてのパラメータの組み合わせを網羅的に試す手法です。計算コストが高くなることがありますが、全ての組み合わせを試すことで最適なハイパーパラメータを見つけやすいです。

グリッドサーチ

ランダムサーチ(Random Search)

ランダムサーチは、指定された範囲からランダムにハイパーパラメータの組み合わせを選ぶ方法です。

ランダムサーチ

ベイズ最適化(Bayesian Optimization)

ベイズ最適化は、過去の探索結果をもとに次に試すべきパラメータを予測し、少ない試行回数で最適なパラメータを見つける手法です。 特に計算リソースを効率的に使いたい場合に有効です。

以下に大まかな流れを示します。

  1. 目的関数の定義: 最適化したい評価指標(例えば、精度や損失など)を目的関数として定義します。
  2. 初期探索: 少数のランダムなパラメータを選んで目的関数を評価します。
  3. モデルの構築: ガウス過程回帰(GP)などの確率的モデルを使用して、目的関数の予測モデルを構築します。このモデルは、未評価のパラメータの予測と不確実性を提供します。
  4. 獲得関数の導入: 獲得関数は、次にどのパラメータを試すべきかを決定するための指標です。過去の評価結果を基にして、探索空間で次に評価すべきパラメータを選定するために使用します。これにより、最も効率的に最適解に近づくことができます。
  5. 獲得関数の最大化: 獲得関数を最大化することで、次に試すべきパラメータを決定し、目的関数を再評価します。
  6. 繰り返し: 新しい結果を基にモデルを更新し、次のパラメータを選んで繰り返します。

各手法の比較
手法 特徴 適用例
グリッドサーチ 網羅的に組み合わせを試すが計算コストが大きい パラメータ数が少なく、小規模データセット向け
ランダムサーチ ランダムに探索し、コストを抑えつつ良好な結果 試行回数が限られる場合や、広範囲なパラメータ探索
ベイズ最適化 逐次的に効率良く探索し、最適解を見つけやすい 高次元問題や、大規模データセットに最適

キーワードまとめ

ノイズ付与(Gaussian Filter)、Rnadom Flip・Erase・Crop・Contrast・Brightness・Rotate、RandAugument、MixUp、EDA、MixUp、ノイズ付与(Gaussian Noise)、ボリューム変更、ピッチシフト、MixUp、SpecAugment、Batch Normalization、Layer Normalization、Instance Normalization、Group Normalization、バギング、ブースティング、ブートストラップ、スタッキング、学習率、隠れ層の数 (レイヤー層数)、ユニット数、ドロップアウトの割合、バッチサイズ、正則化項の係数、グリッドサーチ、ランダムサーチ、ベイズ最適化