メタ学習入門
メタ学習は一般化された機械学習です
メタ学習は、問題を完全に解決するのではなく、学習自体のプロセスを改善することを目的とします。認知科学の観点からは魅力的です。パターンを理解するために必要な例はディープネットよりもはるかに少なく、特定の目標をより自己認識的かつ意図的に達成すると、新しいスキルや習慣をより早く習得できることができます。
少ない実例でのより高い精度
通常の深層学習では、トレーニングの例に最急降下法を適用して、特定のタスクに最適なパラメーターを学習します(動物の写真を5つの可能な種の1つに分類するなど)。メタ学習では、タスク自体がトレーニングの例になります。特定の問題タイプに最適なパラメーターを学習するために、多くのタスクに学習アルゴリズムを適用します(たとえば、写真をNクラスに分類する)。ICML 2017のディープネットワークの高速適応のためのモデルにとらわれないメタ 学習では、メタ学習アルゴリズムはエレガントに最急降下法であり、それ自体が最急降下法でトレーニングされているすべての内部モデルタイプで機能します(したがって、「モデルにとらわれない」)。Finn、Abbeel、およびLevineは、これを分類、回帰、強化学習の問題に適用し、わずかな例(2〜20クラスの場合はクラスあたり1〜5)で新しいタスクをすばやく学習できるメタモデル(外部モデル)を調整します(1〜10の勾配更新)。これは実際にどの程度うまく機能し、メタモデルを新しいデータセットに最適に適用するにはどうすればよいでしょうか。
mini-ImageNet(MIN)での数ショット分類
このレポートでは、論文のオリジナルコードを計測して、数ショットの画像分類のためのMAMLに焦点を当てます。以下は、mini-ImageNet(MIN)データセットからのいくつかの例であり、ラベル(実際にはより具体的またはより一般的なカテゴリである可能性があります)に関する私の最善の推測です。これは、主に画像中央をクロップと厳密で直感的ではない定義と結合されたターゲットオブジェクトの画像とビューの多様性、ImageNetを表しています(たとえば、「wolf」と「bird」のクラスは特定の種をより狭く意図する可能性があります)。
N-way、Kショット画像分類
MAML論文より:「従来の用語によると、Kショット分類タスクは、各クラスからのK個の入力/出力ペアを使用して、N方向分類用の合計NKデータポイントを使用します。」
提供されたコードの関連する設定(引数フラグ)は次のとおりです。
num_classes
: Nは、N方向の分類と同様に、各タスクで学習しているさまざまな画像クラスの数です。update_batch_size
:Kは、Kショット学習と同様に、タスク固有のモデルの内部勾配を更新するために各クラスで見られる例の数です。
したがって、5ウェイ1ショットMINは、5つのクラスのそれぞれから1つのラベル付き画像(合計5つの画像)を考慮します。5ウェイ、5ショットMINは、5つのクラスのそれぞれからの5つのラベル付き画像(合計25の画像)を考慮します。いくつかのシナリオ例を以下に示します。特定のN-wayタスクのクラスの多様性がどの程度変化する可能性があるかに注意してください。似たような犬の異なる種や「口紅」を表すために使用される視覚の範囲は、学ぶのがはるかに難しいかもしれません。
ダイナミクスをトレーニングするための他の重要なフラグ
meta_batch_size
外部モデル/メタトレーニングループのメタパラメーターを更新する前にサンプリングされたタスクの数です。num_updates
は、トレーニング中に内部勾配/内部モデルを更新する回数です。metatrain_iterations
は、モデルに表示されるサンプルタスクの総数です。コードでは、MINに60,000を推奨しています。私は最終的に効率のためにデフォルトの15,000に切り替えました
最初の観察
ここでは、クラスの数(num_classes
)、内部勾配の更新の数(num_updates
)、有効なバッチサイズ、および学習したフィルターの数を変えながら、メタ学習の実行をK=1のショット学習(クラスごとに1つの例)と比較します。すべてのチャートは平滑化0.8で示されています。
- Nが低いほど簡単です。直感的には、区別するクラスが少ないほど、モデルのパフォーマンスが向上します。グラフ全体で、赤(2方向)の精度が青(5方向)よりもオレンジ(3方向)よりも高いことがわかります。
- 5を超える内部勾配更新の数はそれほど重要ではありません。ステップ10での更新後の精度は、ステップ5からあまり変化しません(ステップ5とステップ10のラベル付き曲線がほぼ完全に重なっている最初の行の右側のグラフを参照してください)
- 有効なバッチサイズが小さいほど、トレーニングは速くなり、わずかに悪化します。元のコードは、不思議なことにバッチサイズに15を追加します。これを元に戻し、有効バッチサイズを4に設定すると、パフォーマンスがわずかに低下するだけで、Kとの整合性が高くなります。メタ学習の従来の定義による有効バッチサイズは、N(K+15)ではなく、NKである必要があります。
- フィルターの数を2倍にすると、パフォーマンスがわずかに向上します。予想どおり、学習能力が向上します。64個のフィルター(接尾辞「fs64」)を使用したミディアムブルーの実行と、32個のフィルターを使用したライトブルーおよびダークブルーの実行を比較します。
3つのリポジトリとGistを使用します
- 元のリポジトリは、mini-ImageNetデータセットがRavi&Larochelle'17から入手可能であると述べています。これは、ICLR2017の少数ショット学習のモデルとしての最 適化という論文と、train/val/test画像のこの正規のcsv分割 に対応しています。
- 実際の画像は、別のリポジトリ、つまり.pkl形式のfew-shot-ssl-publicで入手できます。この��ポジトリは、数ショットの分類を、ラベルのない例や、ディストラクタ(以前は見られなかった)クラスを使用したより困難なタスクからの学習に拡張します(半教師あり少数ショット分類のメタ学習、Ren等、ICLR 2018)。
- このgist は、画像を抽出してMAMLでのトレーニングに備えるために作成しました。Pythonos.system("mv...")コマンドでファイルを移動する代わりに、各画像ファイルを正しい場所に直接保存するため、データ抽出プロセスが大幅に高速化されました。
トレーニングデータの設定
mini-ImageNet(MIN)の場合、データはトレイン(64クラス)、検証(16クラス)、およびテスト(20クラス)に分割されます。各クラスには、それぞれ84x84ピクセルの600枚の画像が含まれています。メインリポジトリのdata_generator.py
は、クラスをランダムに選択し、モード(トレーニング、評価、またはテスト)に応じて、適切な分割からクラスごとに適切な数のサンプル(Kショット学習ではK)をランダムに選択します。紛らわしい詳細の1つは、トレーニングデータを生成するときにソースコードが内部バッチサイズKを15ずつインクリメントすることです。これは、画像シャッフルの正確さに影響を与える可能性があります。私は、その影響と必要性を分離することを試みるために、この変更の有無にかかわらずいくつかを訓練しました。
次の実験
- Nを修正し、Kを変更します。これは精度にどのように影響しますか?
- omniglotのトレーニング:キャラクター分類と自然画像のダイナミクスはどのように同じ、または異なりますか?
- 回帰と分類、そして潜在的にRLを組み合わせる:OmniglotでトレーニングしてMINで微調整することはできますか、またはその逆はできますか?3つの問題タイプすべてにわたって学習できる一般的なモデルはありますか?
- メタトレーニングハイパーパラメータ:メタトレーニングループの多くのハイパーパラメータを調べたことがありません
- メタトレーニングの更新の数に対するテストとメタテストの精度:これらのトレーニング済みモデルのテストの精度とメタテストの精度を調べます。メタバルの精度とどのように相関しますか?メタトレーニングの更新の数はこれにどのように影響しますか?まったく新しい画像データセットで最良の結果を得るには、メタテストの精度が最も高いモデルを選択してください。
- 更新前と更新後のダイナミクス:更新前の指標を直感的に理解するにはどうすればよいですか?メタトレーニングの更新ステップの数はどのくらい重要ですか(meta_batch_sizeを変更します)?更新間の損失の変化を比較することは理にかなっていますか?
- 内部勾配ダイナミクス:多くの場合、内部検証がランダムな偶然に飽和するのはなぜですか?損失後の平均が損失前の平均よりも高いのはなぜですか?
Gotchas
- 一部のトレーニング構成はメモリ制限に達します。たとえば、次のように10ウェイ、10ショットの分類エラーが発生します。
File "/home/stacey/.pyenv/versions/mm/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1950, in __init__
"Cannot create a tensor proto whose content is larger than 2GB.")
- Kのデフォルトは5であり、内部ループ内のすべてのクラスについて、update_batch_size/例の数を制御しているように見えます。ただし、コメント/TODOによると、元のコードはMINデータを生成するために15を追加し、おそらく「imagenetに15valの例を使用する」とされています。コードの後半で、トレーニングデータはtf.slice()と正しい未変更のupdate_batch_sizeを使用して生成されますが、これにより、クラスごとのトレーニングデータの複雑な並べ替えが確実に維持されるとは断定できません...