機械学習プロジェクトの進め方：『Machine Learning Yearning』36-39章（Training and testing on different distributions）

現在、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)

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

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

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

##**36. When you should train and test on different distributions(トレーニングデータとテストデータで異なる分布を持つとき、どうすべきか。)**

ネコ写真のアプリのユーザが10,000件の写真をアップロードしています。あなたは手作業でネコが含まれるかのラベル付けをします。あなたは次に、200,000件の写真をインターネットからダウンロードしたとします。どうやって、トレーニングセット、Devセット、テストセットを定義するべきですか？

10,000件のユーザがアップロードした写真は、あなたがうまく機能させたい実際のデータの確率分布を厳密に反映しているので、Devセットとテストセットで使うかもしれません。もしデータを欲しているディープラーニングアルゴリズムをトレーニングさせているなら、200,000件のインターネット経由の写真を追加することもできます。したがって、トレーニングセット、Devセット、テストセットは異なる確率分布からきます。あなたのタスクにどう影響するでしょうか。

トレーニング/Dev/テストセットに分割する代わりに、私たちが保持する210,000件の写真をランダムにシャッフルして、トレーニング/Dev/テストセットに含めることができます。この場合では、全てのデータは同じ分布に由来します。しかし、私はこの方法をお勧めしません。なぜなら、205,000/210,000 ≈ 97.6%のデータがインターネット経由の写真になります。これはあなたがうまく機能させたい実際の分布を反映していないです。

Devセットとテストセットを選択する方法は次の方法をお勧めします。

**あなたが将来的に得たい／機能させたいデータを反映するように、Devセットとテストセットを選択する。**

多くの機械学習に関する学術文献では、トレーニングセット、Devセット、テストセットはすべて同じ分布に由来することを想定しています。
機械学習の初期の段階では、データが不足していました。私たちは通常、いくつかの確率分布に由来する1つのデータセットだけを持っていました。そのため、無作為にデータをトレーニング/Dev/テストデータに分割し、全てのデータが同じソースからきているという仮定を満たしていました。

しかし、ビッグデータの時代には、ネコのインターネット画像のように大規模なトレーニングセットにアクセスするようになりました。トレーニングセットがDev/テストセットと比較して異なる分布に由来する場合でも、それが多くの情報を提供できるため、学習に利用したいと考えます。
ネコの検知器の例では、10,000件のユーザがアップロードした写真をDev/テストセットに含める代わりに、5,000件をDev/テストセットに含めるかもしれません。残りの5,000件のユーザアップロード写真をトレーニングデータに含めることができます。この方法は、トレーニングセットには205,000件のサンプルが含まれていますが、Dev/テストと同様の分布と200,000件のインターネット経由の画像が含まれます。後の章で、なぜこの方法が有用であるかを説明します。

2つ目の例を考えてみましょう。
モバイルのナビアプリで、住所を転記する音声認識システムを構築しているとしましょう。ユーザが道路の住所を話した20,000件のサンプルを持っています。しかし、あなたはまた他のトピックについて話している500,000サンプルの他のオーディオクリップを持っています。
あなたは道路住所に関する10,000サンプルをDev/テストセットにして、残りの10,000サンプルに500,000サンプルをトレーニングセットとして追加するかもしれない。Devデータとテストデータが、同じ分布に由来することを引き続き仮定します。しかし、重要なことは、異なるトレーニング/Dev/テストデータの分布はいくつかの特別なチャレンジとなることを理解することです。

##**37. How to decide whether to use all your data（全てのデータを使うべきかの判断）**
ネコ検出器のトレーニングセットに10,000件のユーザアップロード写真が含まれているとします。このデータは分割されたDev/テストデータと同じ分布に由来し、あなたが機能させたい分布を代表します。
また、追加で20,000件のインターネットでダウンロードしたデータを持っています。あなたはすべての30,000件（2万+1万）の画像データを学習アルゴリズムに提供するべきでしょうか。もしくは、20,000件のインターネット画像のバイアスを恐れるため、破棄するべきでしょうか。

初期世代の学習アルゴリズム（単純な線形回帰など）を使用すると、2つのデータを結合すると、パフォーマンス劣化を招く大きなリスクになります。したがって、一部のエンジニアは20,000件のインターネット画像を含めることに対して警告するでしょう。
しかし大規模ニューラルネットワークのような、現代の強力で柔軟な機械学習アルゴリズムでは、このリスクは大幅に減少しています。もし、十分に隠れ層ユニット/レイヤーを持つ大規模なニューラルネットワークを構築することができれば、安心して20,000件の画像をトレーニングセットに追加することができます。画像を追加することで、パフォーマンス改善につながる可能性があります。

この観察は、両方のデータタイプにとって、うまく機能する「xならばyである」というマッピングがあることに依存しています。言い換えれば、データソースを知らなくても、インターネット画像かモバイルアプリの画像をインプットして、確実に予測できるシステムが存在します。

追加の20,000画像を追加すると、次のような効果があります。

1. あなたのニューラルネットワークに、ネコに見えるもの/見えないもののサンプルを提供します。インターネット画像とユーザがアップロードしたモバイルアプリの画像には、いくつかの類似点を共有するため、手助けとなります。ニューラルネットワークは、インターネット画像から取得した知識の一部をモバイルアプリの画像に適用することができます。

2. ニューラルネットワークが、インターネット画像特有の特性について学習する能力に費やすようになります（高解像度、画像フレームの異なる分布など）。
これらの特性が、モバイルアプリの画像と大きく異なる場合、ニューラルネットワークの代表的な能力を使い切ってしまうでしょう。したがって、本来心配しているモバイルアプリの写真に由来するデータの認識能力が低くなります。理論的には、これはアルゴリズムのパフォーマンスを損なう可能性を示しています。

2つ目の効果を別の言葉で説明すると、架空のキャラクター「シャーロックホームズ」に置き換えることができます。彼は、あなたの脳は限られたスペースしか持たない屋根裏のようだと言っています。
彼は次のように述べています。「知識が増えるごとに、依然知っていたことは忘れてしまいます。それゆえ、有用な事実を究明するに役立たない知識を極力持たないことが重要です。」。
幸いにも、十分な大きさのニューラルネットワークを構築するために必要な計算能力があれば、それは深刻な問題ではありません。2種類のデータが競合することなく、インターネットとモバイルアプリの画像両方を学習する十分な容量があります。あなたのアルゴリズムの「脳」は十分な大きさなので、屋根裏部屋が不足する心配はありません。

しかし、十分な大きさのニューラルネットワーク（または非常に柔軟な学習アルゴリズム）でなければ、Dev/テストセットの分布に合わせてトレーニングデータにもっと注意を払う必要があります。
利益がないデータがあると思う場合は、計算上の理由からそのデータを除外してください。たとえば、Dev/テストセットが主に人、場所、ランドマーク、動物のカジュアルな写真を含んでいるとします。また、大量スキャンされた履歴文書を収集したとします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/01382c61-a0f8-65ac-237d-bae5235473ff.png)

これらの文書には、ネコに似たものは含まれていません。また、Dev/テストセットの分布とは完全に異なっているようです。 1つ目の効果による影響は無視できるため、ネコに似ていない例としてこのデータを含める要素はありません。Dev/テストセットの分布に適用できるニューラルネットワークはほとんどありません。それらを含めることは、ニューラルネットワークの計算資源およびや表現力を無駄にするでしょう。

## **38. How to decide whether to include inconsistent data（一貫性のないデータを含めるべきかの判断）**
ニューヨークの住宅価格を予測するために、学習したいとします。ここでは、住宅の大きさが与えられ（入力する特徴量x）、価格を予測したい（ターゲットラベルy）。
ニューヨークの住宅価格はとても高い。デトロイト、ミシガンの住宅価格を2つ目のデータセットとして持っているとしよう。これらの都市の住宅価格はとても低いです。これらのデータをテストセットに含めるべきでしょうか。

同じ住宅サイズxが与えられ、住宅価格yは都市に依存し、大きく異なります。もし、ニューヨークの住宅価格だけを予測する場合には、2つのデータセットを結合することはパフォーマンス悪化に繋がるでしょう。この場合では、一貫性がないデトロイトのデータを除外する方が良いでしょう。

このニューヨークvsデトロイトはインターネット画像vsモバイルアプリの画像とどう違うのでしょうか。

入力画像xが与えられると、画像がインターネット画像かモバイルアプリ画像かを知らなくても、猫が存在するかどうかを示すラベルyを確実に予測することができます。そのため、ネコ画像の例とは異なります。このように、インターネット画像からの認識タスクは、モバイルアプリ画像からの認識タスクと「一貫（consistent）」しています。これは、全てのデータを含むことに（計算コストを除いて）わずかな欠点といくつかの潜在的な可能性があることを示しています。対照的に、ニューヨークとデトロイト、ミシガンのデータは一貫性がありません。同じx（住宅サイズ）を与えると、その家の場所によって、価格が大きく異なります。

## **39. Weighting data(重み付けデータ)**
インターネット経由の200,000件の画像とモバイルアプリ経由の5,000件の画像を持っているとしよう。データセットのサイズは40:1の比率があります。理論的には、巨大なニューラルネットワークを構築し、205,000件全ての画像を十分な時間学習させる限り、インターネット画像とモバイルアプリ画像の両方でアルゴリズムをうまく実行しようとすることへの弊害はありません。
しかし実際問題として、モバイルアプリ画像の40倍のインターネット画像を持つことは、5,000件の画像だけを訓練した場合と比べて、両方をモデル化するために40倍（またはそれ以上）の計算リソースを費やす必要があることを意味します。
巨大な計算リソースがなければ、インターネット画像に低い重みを与えることができます。
例えば、最適化の目的が二乗誤差であるとします（これは分類タスクには適していませんが、説明を簡単にします）。したがって、学習アルゴリズムは次のように最適化しようとします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/a3bc22f4-51e8-095d-1035-aa1391d98bc7.png)

上記の式の最初のSUMは5,000件のモバイル画像に対応し、2つ目のSUMは200,000件のインターネット画像に対応します。代わりに、パラメータβを加えて最適化をすることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/30d7f308-52d4-91a0-923d-761de7887744.png)

もし、β＝1/40を設定すると、アルゴリズムは5,000件のモバイル画像と200,000件のインターネット画像に対して、同一の重みを与えるでしょう。また、Devセットをチューニングすることで、パラメータβに違う値を設定することもできます。
追加のインターネット画像を低く重みづけすることにより、両タイプのタスクがうまく機能するアルゴリズムとなるように、大規模なニューラルネットワークとして構築する必要はありません。
この再重み付けは追加のデータがDev/テストセットと比較し、非常に異なる分布をである場合、もしくは追加データが、同じ分布のDev/テストセットとても大規模である場合に必要とされます。