機械学習プロジェクトの進め方：『Machine Learning Yearning』50-52章（End-to-end deep learning）

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

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

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

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



## **50. Choosing pipeline components: Data availability（パイプラインコンポーネントの選択：データ可用性）**
非end-to-endパイプランのシステムを構築している場合には、何がパイプラインのコンポーネントの候補となるでしょうか。
パイプラインの設計方法は、システム全体のパフォーマンスに大きな影響を与えます。重要なポイントの１つは、各コンポーネントを訓練するために、「データを容易に収集できるかどうか」です。
例えば、次の自律走行のアーキテクチャを考えてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/a41375cb-bc51-767d-b23b-732605c54836.png)
機械学習を利用して、車と歩行者を検知することはできます。さらに、これらのデータを取得することは難しくありません。というのも、車と歩行者のラベルが付いた巨大なコンピュータビジョンのデータセットがあります。クラウドソーシング（Amazon Mechanical Turkなど）を利用して、大規模なデータセットを手に入れることもできます。このように比較的容易に、車や歩行者の検知器を構築するための訓練データを手に入れることができます。

対照的に、純粋なend-to-endのアプローチを考えてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/344362d9-b384-b747-dad4-6fc88f62ca27.png)
このシステムを訓練するために、大規模なペア（画像／操縦方向両方）のデータセットが必要です。運転を行いつつ、データを収集し操縦方向を記録することは、とても時間がかかり、費用を伴います。あなたは特別な装置を装備した自動車の車隊と、可能なシナリオを広範囲でカバーするための大量の運転が必要になります。
これは、end-to-endシステムを訓練することが困難です。大規模なラベル付きの車や歩行者の画像データセットを取得する方がずっと簡単です。
さらに一般的には、パイプラインの「中間モジュール」（自動車検出器や歩行者検出器）を訓練に利用できるデータが大量にある場合、複数ステージを持つパイプラインを使用することを検討するでしょう。この構造は、利用可能なデータ全てを利用して中間モジュールを訓練できる点で優れているといえます。より多くのend-to-end データが利用可能になるまでは、非end-to-end アプローチは自律走行運転においては非常に有望であると思います。そのアーキテクチャーは、データの可用性の観点で適しています。

## **51. Choosing pipeline components: Task simplicity（パイプラインコンポーネントの選択：タスクの簡素化）**
データの可用性以外にも、パイプラインのコンポーネントを選ぶ際の第2の要素を考えるべきです。それは、個々のコンポーネントによって、どれくらいそのタスクがシンプルになるか、ということです。
ここに容易に構築し、学習できるパイプラインのコンポーネントを選択するようにするべきです。しかし、学習が「容易」とは、いったいどういう意味でしょうか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/6a45464e-6f4d-23d0-65b0-b7c0b971ea99.png)
難易度の高い順に、機械学習のタスクを列挙します。

1. 画像が（上記の画像の例のように）露出過度であるかどうかを分類する。
2. 画像が屋内か屋外かを分類する。
3. 画像にネコが含まれるか分類する。
4. 画像に黒と白両方の毛をもつネコが含まれているか分類する。
5. 画像にシャムネコ（=特定の品種）が含まれているかどうかを分類する。

これらは画像のバイナリ（2値）分類タスクです。画像を入力し、0か1を出力しなくてはなりません。しかし、リストの初期のタスクは、ニューラルネットワークで学習すれば「より簡単に」実行できるように見えます。少数の訓練データのサンプルで、「より簡単に」タスクを学習することができるでしょう。
機械学習は、タスクを容易にするか、困難にするかという正式な定義はまだありません。
ディープラーニングと多層ニューラルネットワークの登場により、もし少ない計算ステップ（浅いNN）で実行することができれば、1つのタスクは「容易」であり、多くの計算ステップ（より深いNN）が必要とされる場合には、「困難」であると、時に言うでしょう。しかし、これらは非公式の定義です。
もし複雑なタスクを実行して、より簡単なサブタスクに分割できれば、サブタスクのステップを明示的にコーディングすることによって、タスク全体をより効率的に学習するのに役立つ事前知識をアルゴリズムに与えていることになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/06f08be2-e451-585c-9d79-f63b165d212d.png)
あなたがシャムネコの検出器を構築しているとします。 これは完全なend-to-endのアーキテクチャです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/6dc1577f-9830-ea78-5f2e-74502e0b5837.png)
対照的に、代わりに2ステップでパイプラインを使用することもできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/de740ff1-786f-acf9-45ed-e83700519fbb.png)
最初のステップ（ネコ検出器）は、画像内のすべてのネコを検出します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/bcb3ce59-ac9d-112f-9f4d-5cea65c36af0.png)
次に、検出された各ネコが切り抜かれた画像をネコの種別分類器に渡し、検出されたネコがシャムネコである場合には、最終的に1を出力する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/1405281e-6697-3d07-ac38-200473beaf98.png)
0/1ラベルだけを利用した純粋なend-to-end分類器を訓練するのと比較し、パイプライン上の2つのコンポーネント（ネコ検出器とネコ品種分類器）は、はるかに学習しやすく、要求されるデータは少なくなります。

最後の1つの例として、自律走行のパイプラインを再訪します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/8fa97b5e-d445-cbc2-aee2-8a12ef8c612e.png)
このパイプラインを利用することで、アルゴリズムには3つのキーステップがあります。（１）他の車の検出、（２）歩行者の検出、（３）車の進路計画、です。さらに、これら各コンポーネントは、比較的シンプルな機能です。そして、純粋なend-to-endシステムと比較して、より少ないデータで学習することができます。
要約すると、パイプラインのコンポーネントを決定する場合には、各コンポーネントが比較的シンプルな機能、すなわち僅かなデータ量から学習が可能であるパイプラインを構築してみてください。

## **52 Directly learning rich outputs（リッチな出力を直接学習する）**
画像分類アルゴリズムは画像xを入力し、カテゴリを示す整数を出力します。代わりに、画像について記述した文章をアルゴリズムが出力することはできるでしょうか？

例えば、以下のようなイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/dd522a89-e145-e426-3818-340e2d369691.png)

教師あり学習の伝統的なアプリケーションは、関数h:X→​Yを学習した。ここで、出力yは通常整数もしくは実数である。例えば、次のイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/c8870426-59f7-be29-7963-a3db3c96a4a4.png)
end-to-endの深層学習における最もエキサイティングな開発の1つは,、数字よりもさらに複雑な出力yを直接学習させることです。
上記の画像キャプションの例では、ニューラルネットワークに画像（x）を入力し、直接キャプション（y）を出力します。

さらに例を挙げます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/bbda4339-d8ce-635f-0138-1a9fdf8bfb19.png)
この例は深層学習における機運の高まりです。正しい（入力、出力）のラベルペアがある場合、出力が文章、画像、オーディオ、その他の単一数字よりも複雑な何かであっても、end-to-endで学習することができます。