sam_yusukeの日記

機械学習について書きます。

よく知られた深層学習手法の独自アプリへの適用を目指して(Deep Learning Chapter 11)

この章では、機械学習を使ったシステムを構築する際のアプローチとテクニックを紹介しています。この記事は11章の内容を独自アプリ用にNNモデルを作ることをゴールにして、ざっくりまとめたものになります。

機械学習システム構築時のアプローチ(推奨)

  1. アプリのゴールに合わせて評価指標と指標の値のゴールを設定する
  2. データ収集から評価までのEndToEndのシステムを構築。(ベースラインとなる程度のアルゴリズム
  3. 内部の状態とか調査して、パフォーマンス上のボトルネックを探す
    • どのコンポーネントが期待以下か?
    • それは、データの問題?バグ?underfitting? overfitting?
  4. 上記の調査結果に基づき繰り返し改善の手を打っていく

どのプロセスも重要ですが、深層学習では学習に時間がかかったり、データ収集にも時間がかかります。どの改善の手をうつべきか見極める3, 4の質は最終性能に大きく影響を与えそうですし、1を正しく行わなければほしくないものができてしまいそうです。
(この記事では2までカバーしています)

パフォーマンス指標の決定

評価指標が機械学習のシステム構築における指針となります。ポイントは2つで、

  • 100%を目指すのは難しい
    • 例:確率的で本質的に100%の予測が不可能な問題
    • 例:部分的な情報から推測する場合
  • 指標と指標のゴールはアプリのゴールから作る
    • 安全性を満たせるライン、や顧客への魅力が出る最低ライン
  • 複数指標があれば、指標には優先度をつけてどれを始めに達成するか考える必要がある。(理由)

指標に関する知識が少ないうちは、似たような問題を説いていいる論文やブログ記事などを参考にして、基本そのまま使えばいいと思います。アプリのゴールに応じて指標と目標値は決めるために問題に対する様々な指標とその性質に対する理解を増やしていく必要があるでしょう。

  • 作成中:様々なパフォーマンス指標

ベースラインのモデルを使ったシステム構築

ベースラインのモデル構築時には次のようなことをします。

  • モデルの選択
    • NNを使うかシンプルな手法にするか決定
    • どのNNモデルを使うか選択
      • 例:CNN or FNN or LSTM or GRU???
    • CNNならLeaky ReLUs, PreLus, maxout、ReLUなどを使うところから始めるべき
  • 最適化手法の選択
    • 学習率DecayのモメンタムSGD
      • 指数関数Decay、線形Decay、ValidationError変化しないときに10分のDecay
    • Adam
    • 最適化に問題がありそうなら、BatchNormalizationはすぐに導入すべき
  • 正則化手法の選択
    • Early Stoppingは常に使うべき
    • Dropout, Batchnormalizationも有効
  • 非教師学習など、他の学習手法を使うか考える
  • よく知られた手法ならモデルをそのまま持ってきて高い性能がでるはず。また、学習済みモデルに対して転移学習するのはよくある話。

当面はCNNなど簡単なモデルを使って色々と試すのが良さそうです。並行して、LSTM、GRUなど他のモデルに対して理解を深めていって幅を増やすのがいい気がします。最適化、正則化手法はレパートリーは増やしていくとして、上で挙げられている基本的なものだけ抑えて、論文通りに実装する方針で行くといいでしょう。

  • 作成中:基本的な最適化、正則化
  • 作成中:様々なNNモデル
  • 作成中:最適化手法の種類
  • 作成中:正則化手法

デバッグ戦略

イメージ通りですが、NNを使ったシステムのデバッグは難しいです。
例えば、最適化実装で出力層のバイアスの更新にバグがある場合、データセットによっては出力層の重みがカバーしてしまいバグが隠れてしまうそうです。
また、私が実際に実装してみた結果、原因の切り分けも難しいと感じています。

デバッグの方針は

  • 単純なケースを使って期待どおりの結果になることを確認する
  • 部分部分に分けてテストする

となっていますが、中身の動作をきちんと理解していないと難しく思えます。

メモ

Visualize model in action
• See the result of task, output
• detect evaluation bug
最も悪いケースの可視化
• 分類が間違っており、間違ったクラスの値が1に近い(自身が高い)ケースを見ることで、データ自体の問題がわかることがある。

  • 学習損失と評価の損失を見る
    • 学習損失が低くて評価損失が高い
      • 評価の損失計算のバグか、overfitting
    • 学習も評価も損失が高い
      • 別の方法で調査
    • 学習と評価の損失が近い
      • underfittingか学習データになにか問題がある

小さいデータセットで実験して学習できることを確認
• 1個のデータセットor Sufficiently small Datasetsで学習してそれを分類できるようになるのは簡単
○ by settings biases of the output layer correctly
逆誤差伝搬の微分係数数値計算微分係数比較
活性と傾きを見る
• ユニットが飽和しているか確認
○ ReLU,tanh
• 勾配消失や勾配爆発の確認
○ Check weight magnitude and weight grad magnitude
○ grad should be around 1% of the weight
○ しかも、データが疎(例:NLP)だと挙動が異なる。
ディープラーニングで使うアルゴリズムは各イテレーションである保証がある
• 例えば、いくつかの最適化アルゴリズムでは、
○ 目的関数の値はステップごとに絶対増加しない
○ 変数の一部の勾配は各ステップごとにゼロになる
○ 収束時には全変数の勾配はゼロになる。

デバッグ手法は色々とあるが、これは深層学習関連のアルゴリズムなどを一通り理解していないと思いつかない。なので、使っているものの性質などを論文や他の文献から理解し、一つ一つチェックしていく必要がある。実装方法だけではなく、性質を理解しないとフルスクラッチの開発は困難そう。