zuminote

個人的な勉強記録

PythonとKerasによるディープラーニング 第4章

機械学習における基本的なテクニックを確認する。

ここでの学び:

  • 過学習を防ぐための方策
  • 正則化について、コスト…?と思ってたけどイメージが分かった(損失関数の誤差をとにかく大きくしたくないという気持ちにつけこむ)

  • 機械学習の一般的なワークフロー

github.com

機械学習モデルの評価

過学習が起きてないか確認するために、validデータをとっておいて汎化性能を評価することが必要。

また、前章で見たK分割交差検証の注意点は以下。

  • train, valのデータ比率に気をつける。
    • たとえば、trainがラベル0〜7,valが8〜9のデータしか含んでない、みたいな状態にならないようにする。
    • そのために、データをシャッフルしておくこと(あとたぶんstratify Kfoldで解決するはず)
  • 過去に基づいて未来を予測する時系列データ解析ではデータをシャッフルしてはならない。
    • 時間の漏れができてしまい、事実上未来のデータで学習を行うことになってしまう。
    • テストデータセットの全データが、訓練データセットよりも新しいものになるようにすること。
  • 訓練データと検証データは独立にする
    • 重複があると検証の意味がなくなる。

データ前処理

  • ベクトル化:ニューラルネットワークモデルに入力するためにベクトル化する。(one-hot化)
  • 値の正規化
    • データの数値が大きいと勾配を更新するための値が大きくなり、ネットワークが収束しなくなる。
    • 0〜1の範囲の、小さな値にする。複数の特徴量は同じ範囲に収める。
    • より厳格な正規化として、平均0,標準偏差1にする。
  • 欠損値処理
    • 一般に、ニューラルネットワークでは欠損値は0にするのが安全。ただし、0がすでに意味のある値として使用されていないことが前提。
    • また、欠損値を含まないデータで学習したモデルに、欠損値を含むデータを入力するとうまく予測できないので、欠損値を擬似的につくって学習させる(か、予測に使うデータのほうを欠損値埋めする)

特徴エンジニアリング

特徴量をより単純な方法で表現することで、問題を容易にする。

例:時計の画像そのまま使うよりも、数字や針の角度を使う

ディープラーニングではモデルが勝手に学習してくれるが、良い特徴量があれば学習が楽になる。

(あるいは、ディープラーニングを使わなくても解けるかもしれない)

過学習と学習不足

過学習を抑制して汎化性能を上げたい!(ディープラーニングの本当の課題は、適合ではなく「汎化」!!

  • 最善策:訓練データを増やす
  • そうできない場合:「正則化
    • モデルに格納できる情報の量を調整する
    • モデルに格納できる情報の種類に制限を課す

具体的方法

  • ネットワークのサイズを削減する(学習可能なパラメータの数を減らす)
    • 適切な層数やサイズを割り出す魔法の公式はないので、試行錯誤しかない
    • 少ない層数・サイズから始めて、validデータセットで損失値を評価して、次の手を考える
  • 重みを正則化する
    • 単純なモデルのほうが、過学習しにくい。
    • 単純なモデル=パラメータの値の分布に関するエントロピーが小さいモデル
    • つまり、パラメータの数が少ないモデル
    • ネットワークの重みに小さい値だけが設定されるようにすることで、ネットワークの複雑さに歯止めをかける。
    • 重みの正則化大きな重みを使用する場合のコストをネットワークの損失関数に追加する。
      • L1正則化:重み係数の絶対値(重みのL1ノルム)に比例するコストを追加
      • L2正則化(=荷重減衰):重み係数の値の二乗(重みのL2ノルム)に比例するコストを追加
    • つまり、重みを大きくしすぎるとそれだけ損失関数の誤差が広がりやすくなるので、モデルのお気持ちとしてはあんまり大きな重みを使いたくなくなる。(ってことでいい?)
  • ドロップアウトを追加する

機械学習の一般的なワークフロー

  1. 問題定義、データセット作成
  2. 成功の指標を選択する(ROC, AUC, 適合率、再現率……)
  3. データを準備する(前処理、特徴エンジニアリング)
  4. ベースラインを超える性能のモデルを開発する(統計的検出力を持つ=ランダムシャッフルによるまぐれ当たりよりも良い精度を出す モデルを作る)
  5. スケールアップ:過学習するモデルの開発
    • 層を追加する
    • 層を大きくする
    • 訓練のエポック数を増やす
  6. モデルの正則化とハイパーパラメータのチューニング
    • ドロップアウト追加、層の追加削除、L1/L2正則化、層のハイパーパラメータを変える(ユニット数や学習率など)、必要に応じて特徴エンジニアリング