機械学習プロジェクトの進め方：『Machine Learning Yearning』40-43章

現在、AIや機械学習界隈で最も有名なスタンフォード大学のAndrew Ng教授が、「Machine Learning Yearning」というオンライン書籍を執筆中です。2018年4月～に、そのドラフト版（1-50章）がオンラインで公開中です。この投稿では、いち早く翻訳を進めています。

http://www.mlyearning.org/
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/188414/741778bb-9523-9feb-736b-6bd5aedc42e6.png)

この本は、機械学習プロジェクトの構築方法を提供します。また、機械学習アルゴリズムを教えるのではなく、機械学習アルゴリズムが機能する方法に焦点を当てています。

本投稿は、**40-43章**の翻訳になります。少しづつ翻訳していきます。※翻訳違っていたらご指摘ください。
本書籍は、とても読みやすく、かつ各章短めに記載されています。

##### **1～39章までの翻訳**
https://qiita.com/Ishio



## **40. Generalizing from the training set to the dev set（トレーニングセットから、Devセットへの汎化）**
トレーニングセットとDev/テストセットが異なる分布を持つ設定で、機械学習を適用しているとします。つまり、トレーニングセットにはインターネット経由の画像とモバイルの画像が含まれていて、Dev/テストセットには、モバイル画像のみが含まれています。しかしながら、アルゴリズムはうまく働きません。あなたが望むよりはるかに高いDev/テストセットのエラーがあります。ここに、何か間違っている可能性がいくつかあります。

1. トレーニングセット上でうまく機能しない。これは、トレーニングセットの分布におけるハイバイアスの問題です。

2. トレーニングセット上でうまく機能する、しかしトレーニングセットと同じ分布から描かれた、新規データに対してうまく汎化できていない。これはハイバリアンスです。

3. トレーニングセットと同じ分布から描かれた、新たなデータに対してうまく汎化できているが、Dev/テストデータの分布から描かれたデータ二はうまくいかない。私たちはこの問題を**データのミスマッチ（Data mismatch）**と呼びます。これは、トレーニングデータがDev/テストセットのデータに合致しないために発生します。

例えば、人間が完璧に近いパフォーマンスをネコ認識タスクで達成したとします。あなたのアルゴリズムはこれらを達成します。

* トレーニングセット上に、1%のエラーを持つ。

* アルゴリズムが把握していないトレーニングセットと同じ分布から描かれたデータに1.5％のエラーがあります。
  
* Dev/テストセット上に10%のエラーが存在します。

この場合、明らかにデータミスマッチの問題があります。これに対処するために、トレーニングデータをDev/テストデータにもっと似るように作成してください。後でこのテクニックについて議論します。

アルゴリズムが1～3のどの問題に苦しんでいるかを診断するために、別のデータセットを利用することが有益です。具体的には、アルゴリズムに使用可能なトレーニングデータをすべて提供するのではなく、2つのサブデータに分割することができます。アルゴリズムが実際に訓練する「トレーニングセット」と訓練しない「トレーニングDevセット」と呼ばれるセットに分割します。

これで全部で次に示す4つのサブデータセットが作成されました。

* トレーニングセット：これはアルゴリズムが学習するデータです（インターネット画像＋モバイル画像）。私たちが本当に気にしている対象と同じ分布である必要があります（Dev/テストセットの分布）。

* トレーニングDevセット：このデータはトレーニングセットと同じ分布から描かれるデータです（インターネット画像＋モバイル画像）。これは一般的にトレーニングデータと比較して小さいサイズになります。学習アルゴリズムの進捗を評価して追跡するのに必要な量のデータで十分です。

* Devセット：これはテストセットと同じ分布で描かれ、最終的にうまく機能させたいデータの分布を反映しています（モバイル画像）。

* テストセット：これは、Devセットと同じ分布から描かれます（モバイル画像）。

これら4つの別々のデータセットを使用することで、次のことを評価できます。

* トレーニングエラー。これはトレーニングセット上で評価することにより得られます。

* トレーニングセットの分布から新しいデータに対して汎化するためのアルゴリズムの能力。これはトレーニングDevセット上で評価することで得られます。

* あなたが気にしているタスク上でのアルゴリズムのパフォーマンス。これは、Devセットもしくはテストセットで評価することにより得られます。

Devセットのサイズを選ぶための５～７章の多くのガイドラインはトレーニングDevセットにも当てはまります。

# **41. Identifying Bias, Variance, and Data Mismatch Errors(バイアスか、バリアンスか、データミスマッチかを識別する。)**

人間がほとんど完璧なパフォーマンス（≒０％エラー）をネコ検知のタスクで達成したとします、したがって、最適なエラー率は０％です。
また、以下を持っているとします。

* トレーニングセットで1％のエラー。
* トレーニングDevセットで5％のエラー。 
* devセットで5％のエラー。

これは、あなたに何を伝えますか？ここでは、あなたはハイバリアンスを持っています。依然に述べたバリアンスを減らすテクニックは、あなたのプロジェクトに進捗をもたらすはずです。
ここでは、あなたのアルゴリズムが次を達成したとします。

* トレーニングセットで10％のエラー。
* トレーニングDevセットで11％のエラー。
* devセットで12％のエラー。

これは、あなたがトレーニングセットに、回避可能なバイアスを持っていることを示しています。つまり、アルゴリズムはトレーニングセット上でうまく機能していません。バイアスを減らすテクニックが助けてくれるはずです。

上記の2つの例では、アルゴリズムは回避可能なハイバイアスまたはハイバリアンスしか苦しんでいません。アルゴリズムはサブセットの回避可能バイアス、ハイバリアンス、データミスマッチに苦しむ可能性があります。
例えば、以下の場合はどうでしょう。

* トレーニングセットで10％のエラー。
* トレーニングDevセットの11％のエラー。
* devセットで20％のエラー。

このアルゴリズムは、回避可能なハイバイアスとデータミスマッチに悩まされている。しかし、トレーニングセット分布上のハイバリアンスに悩まされているわけではありません。
異なるタイプのエラーが同相互に関連しているかを次の表のように描写させると理解が簡単かもしれません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/40909595-d35b-f3de-7dec-f21967fc1779.png)

ネコ画像の検知器の例を続けると、x軸には2つのデータ分布が存在することがわかります。y軸上には、3つのタイプのエラーがあります。ヒューマンレベルエラー、アルゴリズムがトレーニングしたサンプルエラー、アルゴリズムがトレーニングしていないサンプルのエラー。前章で特定した異なるエラータイプを、このボックス内に記入出来ます。
必要に応じて、この表に残された2つのボックスにも記入することが可能です。右の上段には、人間にモバイルの猫画像データを識別するように依頼することで、エラーを測定することができます。
【2つめの話は省略】。
これらの2つを記入することで、異なる2つの分布でアルゴリズムが何をしているかについての追加の洞察が得られることがあります。

アルゴリズムのエラーの種類を理解することで、バイアスを減らしたり、バリアンスを減らしたり、データミスマッチを減らすべきかを把握することに役立ちます。 

## **42 Addressing data mismatch(データミスマッチに対処する。)**

音声認識システムを開発しているとしましょう。そのシステムはトレーニングセット上でもトレーニングDevセット上でもうまく機能しています。しかし、Devセット上では不十分な状況です。あなたはデータミスマッチの問題を抱えています。どうすべきでしょうか。
あなたに次をお勧めします。

1. トレーニングセットとDevセットの分布間で、データの特性がどのように異なるかを理解してみる。

2. アルゴリズムが問題を抱えているDevセットのサンプルによりマッチするトレーニングデータを、よりたくさん見つけようとする。

例えば、音声認識システムのDevセット上でエラー分析を実行するとしましょう。あなたは手動で100件のサンプルをピックアップし、アルゴリズムがどこで誤りをおかしているかを理解しようとします。Devセットのオーディオクリップの大部分は、車の中で撮影されている一方、トレーニングセットのサンプルのほとんどは静かな背景のもとで録画されていたため、システムが不調となっていました。エンジンと道路のノイズは劇的にアルゴリズムのパフォーマンスを悪化させます。
この場合、車で撮影したオーディオクリップを含むトレーニングデータをさらに取得しようとする場合があります。エラー分析の目的は、何がデータミスマッチにつながっているのか、トレーニングとDevセット間の重要な違いを理解することです。
トレーニングセットとトレーニングDevセットに、車内で録音されたオーディオが含まれている場合、このデータのサブセットでシステムのパフォーマンスも再確認する必要があります。トレーニングセット上で車のデータがうまく機能し、トレーニングDevセット上でうまく機能しない場合、より多くの車内データを取得することが助けになるという仮説が検証されます。
このため、私たちはDev/テストセットと同じ分布からトレーニングセット上にいくつかのデータが含まれる可能性を議論しました。そうすることで、トレーニングセットの車内データのパフォーマンスとDev/テストセットのパフォーマンスを比較することができます。

残念ながら、このプロセスにはうまくいく保証はありません。たとえば、Devセットデータとマッチさせる多くのトレーニングデータを得る方法がない場合、パフォーマンスを向上させるための明確な道筋はないかもしれません。

## **43. Artificial data synthesis(人工データの合成)**
あなたのスピーチシステムは、車の中から録音されたような音声データをより多く必要としています。運転中に大量のデータを集めるよりも、データを収集するより簡単な方法があります。人為的に合成することです。
車や道路のノイズが含まれたオーディオクリップを大量に取得したとします。いくつかのWebサイトからこのデータをダウンロードすることができます。あなたはまた、静かな部屋で話す人々の大量のトレーニングデータセットを持っているとします。会話のオーディオクリップを取得し、車／道路のノイズのオーディオクリップに「追加」すると、ノイズがある車の中で話している人のオーディオクリップを手に入れることができます。このプロセスを利用することで、あたかも車の中で収集されたかのように大量のデータを合成することができます。
さらに一般的には、人工データの合成により、Devセットと合理的にマッチする巨大なデータセットを作ることができるいくつかの環境があります。

ネコの画像検知を2つめの例に使いましょう。Devセットの画像の中に、被写体ぶれが多くあることに気づきます。これは携帯電話で撮影する際に、わずかに電話を動かしてしまうために発生します。あなたは、インターネット画像のトレーニングセットから、被写体ぶれがない画像を取得し、偽りの被写体ぶれを追加することができます。このように、Devセットにより類似するデータを作ることができます。

人工データの合成には難題があることを心にとどめておきましょう。ときに、簡単に合成データを作成できます。
コンピュータにとって現実的に見える合成データを作るよりも、人間にとって現実的に見える合成データを作る方が簡単な場合が時にあります。例えば、1,000時間の会話のトレーニングデータを持っていますが、車のノイズデータは1時間しかないとします。もし、1時間の車のノイズデータを繰り返し利用すると、同じ車のノイズが何度も繰り返される合成データセットになります。このオーディオを聴いている人は、ほとんどの場合、すべての車のノイズが同じように聞こえるかもしれませんが、学習アルゴリズムが1時間の車のノイズに「オーバーフィット」する可能性があります。したがって、車内のノイズが異なる新しいオーディオクリップに対して一般化することができません。
また、1000時間のユニークな車のノイズデータがあるとしましょう。しかしそのすべてが10つの異なる車から取得したとします。この場合、アルゴリズムはこれらの10台の車に "オーバーフィット"し、別の車のオーディオでテストすると性能が低下する可能性があります。残念なことに、これらの問題は見つけにくいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/a257353d-f816-a115-afec-d35fc7d1e8f9.png)

さらにもう1つ例を挙げます。車を認識するコンピュータビジョンのシステムを構築しているとしましょう。また、いくつかの車のコンピュータグラフィックのモデルを持っているビデオゲームの会社と提携しているとしましょう。アルゴリズムをトレーニングするために、車の合成画像を生成するためにそのモデルを利用します。
仮に合成画像がとても現実的なものとして見えたとしても、このアプローチはおそらくうまく機能しないでしょう。そのビデオゲームは、ビデオゲーム全体で最大で20台のカーデザインを持っているかもしれません。３Dカーのモデルを作るのは非常に高価です。もしゲームをしていたら、同じ車を何度も何度も見ていること、おそらく違った色しか塗られていないことの気づかないでしょう。つまり、このデータはあなたにとって非常に現実的に見えます。しかし、道路上の全ての車のセットと比較するとどうでしょう。20個の合成された車のセットは、世界の車の分布のごくわずかしか補足していません。したがって、10万のトレーニングサンプル画像がすべてこれらの20台の車から合成されてできている場合、あなたのシステムは、これらの20台の車のデザインにオーバーフィットし、他の車のデザインを含むDev/テストセットには一般化できません。

データを合成するとき、本当に代表的なデータを合成しているかどうかを考えます。 学習アルゴリズムが、合成サンプルと非合成サンプルを区別できるデータプロパティを与えないようにしてください。全て合成されたデータが20台の車の設計の1つから生成される場合や、合成されたすべての音声が1時間の車のノイズから生成される場合などです。個のアドバイスに従うのは難しいかもしれません。

データ合成を行う際、私のチームは時には合成データが大きな影響を及ぼす実際の分布に十分近い詳細データを作成するまで数週間かかることがありました。しかし、データの詳細を正しく理解できれば、以前よりもはるかに大きなトレーニングセットに突然アクセスすることができます。