Coursera Deep Learning専門講座の受講メモ (コース3 - Structuring Machine Learning Projects - Week 2)

この記事のまとめ:

コース3:Structuring Machine Learning Projectsについて

このコースでは、Andrew Ng先生の長年のディープラーニングにおける経験を基にしたベストプラクティスがさまざまな観点でまとまったコースです。自らディープラーニングの開発、コーディングをしなくとも、ディープラーニングのプロジェクトをマネージメントをする方にも重要な内容ではないかと思います。内容についてはあまり体系的にまとまっていない感もありますが、非常に見ごたえのある内容です。

2週間の内容は次の通りです。

Week 2の概要

このコースのWeek 2では、下記のことついて学びます。

  • マルチタスク学習と転送学習が何かを理解する
  • バイアス、分散、データ不整合を実装したアルゴリズムにおけるTrain/Dev/Testデータセットのパフォーマンスを見ることで認識する
分析手法
マニュアル分析

ディープラーニングの結果を分析する際、地道にマニュアルで分析する必要があります。マニュアル分析の方法として、次のように実施します。

  • アルゴリズムが誤ってラベリングした対象を100サンプル取り出す
  • ひとつひとつ誤った要因をカウントする
  • 最も誤りが多かった要因に対して優先的に対策する
データセットのラベリングの間違いの対処方法

マニュアル分析を行っていくと、データセットとしてラベリングが間違っていることがあります。その場合の対処についてのガイドラインとして次のように述べられています。

  • Dev/Testデータセットのラベリングの間違いを修正する(このときDevデータセットとTestデータセットの分布が同じかどうかに注意する)
  • Trainingデータセットについては、ランダムエラー程度の割合である場合、数が多いため無視して問題ない
  • Dev/Testデータセットをもし修正した場合にはTrainingデータセットとDev/Testデータセットの分布がわずかに異なる可能性があることを認識する
素早く作って繰り返す

ディープラーニングの開発を行う場合、開発を行う前に設計やデータ取得のために時間をかけるよりも、まずは最初のシステムを作ってみて次の一手を考えた方がよいです。もちろん、最低限やらなければならないことがありますので、それらを含めた手順は次の通りです。

  1. Dev/Testセットを用意する
  2. 評価指標を決める
  3. 最初のシステムを素早く作る
  4. 次のステップで何をするかを決めるためにバイアスや分散、誤差分析をする
データセットの使い方

ディープラーニングの開発を行う際に、ユーザーが使用するであろうデータの分布と、同様のアプリケーションとして一般的な用意できるデータの分布が異なり、開発用に用意できる前者のデータセットの数が後者に比べて少ない場合、前者のデータセットをDev/Testデータセットに使用するべきです。決してTrainindデータセットとDev/Testデータセットとをシャッフルして使用すべきではありません。この場合、TrainingデータセットとDev/Testデータセットの分布は異なります。

こういう場合には、Training-Devデータセットを用意します。Trainingデータセットを一部切り出し、訓練の評価を行うためにこのTraining-Devデータセットを作ります。つまり、TrainingデータセットとTraining-Devデータセットは同じ分布で、DevデータセットとTestデータセットは同じ分布ですが、Training/Training-DevデータセットとDev/Testデータセットは異なる分布です。

これらのことから次のような誤差分析ができます。

  • 人間レベルのパフォーマンス
    • ↕ 除去可能なバイアス
  • Trainingデータセットの誤差
    • ↕ 分散 (Variance)
  • Training-Devデータセットの誤差
    • ↕ データ不整合
  • Devデータセットの誤差
    • ↕ 開発データセットに対する過学習 (Overfitting)
  • Testデータセットの誤差
データ不整合への対処

データ不整合が発生している場合、Trainingデータとして、Devデータセットの分布に近いデータセットを人口的に作り出すことを考えます。

例えば、画像であれば、人口的にノイズを載せる、回転、ブレを載せることもできますし、CGを使うこともできます。 音声であれば、同様に人工的にノイズを載せるなどができます。

転送学習とマルチタスク学習
転送学習 (Transfer Learning)

タスクAで学習した内容を別のタスクBで使うことを転送学習といいます。 転送学習は次のような場合に有効です。

  • タスクAとタスクBのインプットが同じ場合
  • タスクAのデータセットがタスクBよりもはるかに多い
  • タスクAの低レベルfeatureはタスクBでも有効である
マルチタスク学習

ひとつのディープニューラルネットワークで複数の処理を同時に行うことをマルチタスク学習といいます。例えば、一つの画像データから複数の物体の検出をするような学習をしたい場合にマルチタスク学習を使います。 マルチタスク学習では、次のように損失関数を定義します。

同様に、コスト関数は次のように定義します。

なお、訓練に用いるデータセットのうち、ラベルYは必ずしもすべてのタスクに対して1/0のラベルを付ける必要がありません。1/0のラベルがついているタスクのみ対応する訓練データセットから訓練し、同じデータでもラベルされていないタスクについては使用しないようにすることもできます。

End-to-End Deep Learning

非常に複雑な問題を扱う場合、従来では複数の処理をひとつのパイプラインとして扱っていましたが、大量にデータセットがある場合には、End-to-endでディープラーニングによって問題を扱うことができるようになってきました。 例えば、従来機械翻訳を行う場合には機械翻訳を行うための様々なステップの中の一部の処理としてディープラーニングが使われていましたが、大量のデータがある場合には、すべてのステップをなくして、ディープラーニングのみで機械翻訳を行った方が精度が高くなることがわかっています。このように、従来いくつかのステップに分けて処理が行われていたタスクをEnd-to-endでディープラーニングのみを使ってタスクをこなすことをEnd-to-end Deep Learningといいます。

ただし、これができるのは大量のデータがあるときのみです。


今回は以上です。 最後まで読んでいただき、ありがとうございます。
CourseraのDeep Learning専門講座の他のコースの受講メモ

コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法