機械学習プロジェクトの進め方：『Machine Learning Yearning』44-46章（最適化検証テスト）

現在、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～43章までの翻訳**
https://qiita.com/Ishio



## **44. The Optimization Verification test（最適化検証テスト）**

音声認識システムを構築しているとします。あなたのシステムはオーディオクリップAを入力し、文章SごとにScoreA(S)を計算することによって動作します。
例えば、入力オーディオAが与えられたときに、正しい転写の出力が文章Sである確率は、ScoreA(S) = P(S|A)のように推定するでしょう。

ScoreA(S)を計算する方法が与えられると、それを最大化する英語の文章Sを見つける必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/3cf17918-e9c3-4411-67f8-6674894fd12b.png)

上記の"arg max"はどのように計算されるでしょうか。もし英語の言語が50,000語であるならば、長さNの場合50,000のN乗の文章が可能性として考えられます。すべてを列挙するには膨大すぎます。したがって、ScoreA(S)を最適化（＝最大化）する値Sを見つけるために、最近傍探索（approximate search algorithm）を適用する必要があります。
探索アルゴリズムの1つの例として、ビームサーチ（beam search）があります。これは、検索プロセスの間にK個のトップ候補のみを保持します（この章の目的のために、ビームサーチの詳細の理解をする必要はありません。）。このようなアルゴリズムはScoreA(S)を最大化する値Sを見つけることが保証されていません。

オーディオクリップAが“I love machine learning.”と誰かが言った録音であるとしましょう。しかし正しい転写の出力の代わりに、あなたのシステムは正しくない“I love robots.”を出力します。うまく動作しなかった原因としては、以下2つが考えられます。

1. **探索アルゴリズムの問題**：最近傍探索（ビームサーチ）がScoreA(S)を最大化する値Sの探索に失敗した。

2. **目的関数（スコアリング関数）の問題**：ScoreA(S) = P(S|A)の推定値が正確でない。特に、ScoreA（S）の選択は、“I love machine learning”が正しい転記であることを認識できなかった。

これらのどの失敗が原因出会ったかに応じて、あなたの努力の優先順位を変えるべきです。もし1つ目の問題であるならば、探索アルゴリズムを改善する必要があります。
2つ目の問題である場合、ScoreA(S)を正しく推定するアルゴリズムを実行するべきです。
このような状況に直面し、一部の研究者は探索アルゴリズムに無作為に実行しようとします。他方では、ScoreA(S)の値をより良く学習する方法に無作為に取り組むでしょう。エラーの根本原因がどちらであるかわからない限り、あなたの努力は無駄になる可能性があります。どのようにして、体系的に取り組む内容を決定すべきでしょうか。

S_outを転写の出力（“I love robots”）とします。
S*を正しい転写の出力（“I love machine learning”）とします。上述の1と2のどちらの原因が問題であるかを理解するために、最適化検証テストを実行することができます。
まず、ScoreA(S*) とScoreA(S_out)を計算します。
次に、ScoreA(S*)  > ScoreA(S_out)であるかどうかを確認します。2つの可能性があります。

##### ケース1：ScoreA(S*)  > ScoreA(S_out)
このケースの場合、アルゴリズムはS*に対してS_outより高いスコアを正しく与えています。
それにもかかわらず、最近傍探索アルゴリズムはS*よりもS_outを選択しました。これは、最近傍探索アルゴリズムはScoreA(S)の最大値を取得することに失敗していることを示しています。この場合、最適化検証テストは、最近傍探索アルゴリズムの問題であり、それに焦点を充てる必要があります。例えば、ビームサーチであれば、探索の幅を広げる等の対策を行います。

##### ケース2: ScoreA(S*) ≤ ScoreA(S_out)
このケースでは、ScoreA(.) を計算する方法が間違っていることを意味します。誤った転写S_outより、正しい転写S*に高いスコアを与えることに失敗しています。
最適化検証テストでは、目的関数に問題があることがわかります。したがって、文章Sに対してScoreA(S)を学習またが近似する方法の改善に焦点を充てる必要があります。
ここでは、単一の問題に議論を絞りました。実際に最適化検証テストを適用する場合には、検証セット上でエラー検査を行うべきです。各エラーにおいて、ScoreA(S*) > ScoreA(S_out)かどうかをテストするでしょう。
この不等式が成立する各検証セットのサンプルは、最適化アルゴリズムによって引き起こされるエラーとしてマークします。他方の場合には、ScoreA(.)を計算する方法の誤りとしてカウントされます。

例えば、95%のエラーがスコアリング関数ScoreA(.)の問題であり、残り5%は探索アルゴリズムの問題であるとします。今なら、どれだけ最適化の手順を改善しても5%しかエラーを排除できないことがわかりました。したがって、ScoreA(.)の推定方法に焦点を当てるべきです。


## **45. General form of Optimization Verification test（最適化検証テストの一般的な形式）**

いくつかの入力xが与えられたときに、入力xに対する応答yの推定値を示すScore_x(y) の計算方法を把握している場合に、最適化検証テストを実施することができます。
さらにいうと、Scorex(y)を最大化する近似アルゴリズムを利用しているが、探索アルゴリズムが時々最大化に失敗していると疑われることがあります。以前に挙げた音声認識の例では、x=Aがオーディオクリップであり、y=Sは出力の転写でした。

y*は正しい出力だが、アルゴリズムがy_outを代わりに出力するとします。テストの重要なポイントは、Scorex(y*) > Scorex(y_out)かどうかを測定することです。
もし不等式が成り立つ場合、最適化アルゴリズムを疑います。この論理の背景については、以前の章を参照してください。不等式が成り立たない場合には、Scorex(y)の計算自体を疑います。

もう1つの例を見てみましょう。中国語から英語への機械学習翻訳システムを構築しているとします。あなたのシステムは中国語の文章Cを入力し、各翻訳結果Eに対応したScoreC(E)を計算することによって動作します。例えば、入力文章Cが与えられた状況での翻訳結果Eの確率は、ScoreC(E) =P(E|C)として利用されるでしょう。

あなたのアルゴリズムは、下記計算を試みることで文章を翻訳します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/a9e00913-6d2c-c30c-c963-386ec0d230a4.png)

しかし、すべての考えうる英語の文章のセットは大きすぎるので、ヒューリスティックな探索アルゴリズムに依存します。
アルゴリズムが、正しい翻訳E*よりもむしろ正しくない翻訳E_outを出力しているとします。
次に最適化検証テストでは、ScoreC(E*) > ScoreC(E_out)かどうかを計算します。もし、この不等式が成り立つ場合、ScoreC(.)は正確にE*をE_outより優れた出力として認識しています。したがって、このエラーは最近傍検索アルゴリズムの問題であると結論付けます。それ以外の場合には、このエラーがScoreC(.)の計算自体に問題があると結論付けます。

AIでの最も一般的な「デザインパターン」は、まず最近傍スコアリング関数Score_x(.)を学習し、次に最近傍最大化アルゴリズムを使用します。このパターンを特定することができれば、エラー原因の理解に最適化検証テストを利用できるでしょう。

## **46. Reinforcement learning example（強化学習の例）**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/c153ef0e-c5cc-e747-4c60-1d165b6d0a38.png)

複雑な操作で飛ぶ方法をヘリコプターに教えるために機械学習を使用しているとします。上の写真は、エンジンをオフにした着陸の実行をコンピュータが制御しているヘリコプターのタイムラプス写真です。これは、「オートローテーション」と呼ばれます。ヘリコプターが予期せず故障しても着陸することができます。人間のパイロットはトレーニングの一環としてこの操縦を行います。
あなたの目標は、安全に着陸を終える軌道Tを経由するヘリコプターを飛ばすために学習アルゴリズムを利用することです。

強化学習を適用するには、各軌道Tの良さを測定するスコアを計算する報酬関数R(.)を開発する必要があります。例えば、軌道Tのヘリコプターが墜落した場合、ひょっとしたら報酬関数R(T)＝－1,000、すなわち巨大な負の報酬となるでしょう。安全な着陸をもたらす軌道Tは、着陸の滑らかさに応じた正確な値を有する正のR(.)をもたらすでしょう。報酬関数R(.)は、典型的には、各軌道Tがどの程度望ましいかを定量化するために選択される。それは着陸がいかに不規則であったか、ヘリコプターが目的の場所に正確に着陸したか、乗客にとって乗り心地が粗かったか、などが含まれなくてはなりません。良い報酬関数を設計することは容易ではありません。

報酬関数R(.)が与えられるとき、強化学習の仕事は、軌道Tの報酬関数R(T)の最大化を達成するように、ヘリコプターを制御することである。しかしながら、強化学習のアルゴリズムは多くの近似を作り、この最大化が成功しない可能性がある。
いくつかの報酬関数R(.)を選択し、学習アルゴリズムを実行したとします。しかしながら、そのパフォーマンスは、人間のパイロットよりもはるかに悪いように見えます。着陸は不規則で、人間のパイロットが達成するよりも安全性が低いように見えます。障害が（軌道Tの報酬関数Rを最大化しようと実行を試みる）強化学習アルゴリズムであるか、それとも（乗り心地と着陸地点の正確さの理想的なトレードオフを特定するように測定している）報酬関数であるかどうか理解できるでしょうか。

最適化検証テストを検証するために、下記のように定義します。
* T_human：人間が達成した軌道
* T_out：アルゴリズムが達成した軌道

上記の私の説明によれば、T_humanはT_outよりも優れています。したがって、重要なテストは、次の通りです。**R(T_human) > R(T_out)は成り立つか？**

**Case 1：**この不等式が成立する場合、報酬関数R(.)はT_outより優れているT_humanを正しく評価している。しかし我々の強化学習アルゴリズムは、劣っているT_outを見つけることがある。これは、強化学習アルゴリズムが改善する価値があることを示唆している。

**Case 2：**この不等式は成り立たない。R(T_human) ≦ R(T_out)である。これは、R(.) が優れた軌道であるにもかかわらず、T_humanに悪いスコアを割り当てていることを意味します。R(.)の改善に取組むべきです。

多くの機械学習アプリケーションは、近似探索アルゴリズムを使用して、近似スコア関数Score_x(.)の最適化するパターンを持つ。ときどき、入力xはない場合もあるので、ただScore(.)だけになるときもあります。

上記の例では、スコア関数は報酬関数Score(T)=R(T)であり、最適化アルゴリズムはより良い軌道Tの実行を試みる強化学習アルゴリズムでした。
この例と以前の例の違いの1つは、"最適な"出力と比較するのではなく、人間レベルのパフォーマンスであるT_humanと比較をしていることです。

私たちは、例え最適ではなくとも、T_humanがかなり良いと仮定しました。一般的には、現在の学習アルゴリズムのパフォーマンスよりも優れた出力であるy*（この例ではT_human）がある限り、最適な出力でないとしても、最適化検証テストは、最適化アルゴリズムもしくはスコア関数の改善することが有益であるかどうかを示すことができます。