勉強した動機
今まで、通常の機械学習で音声合成、音声認識、機械翻訳や画像キャプショニングで非自己回帰型のモデルについて学習を行い精度を測定しました。精度を上げるためには、学習データと学習パラメータを増やす方法が有効です。しかし、大企業や AI の有力スタートアップでもないかぎり、学習データ作成に投資したり、学習を行うマシンに投資したりすることはできません。そこで、メタ学習の少ないデータや少ない計算量で学習できるという特徴を確かめるべく、MAML を実装し、5-way 10-shot の画像分類について実際に学習を行い精度を測定しました。結果は、少ないデータ量、少ない計算量でそこそこの精度が得られました。
参考にさせていただいたページ
実装をするにあたり、勉強しました。インターネットページで勉強しました。特に、
のページ。この実装が置いてある
は、かなり参考になりました。この他に、
の実装を参考にさせていただきました。論文の解説は
を参考にさせていただきました。感謝いたします。
学習用データセット
データは、CIFAR100 から自前で学習用データセットを作りました。画像データは、[ outer_batch, num_task, inner_batch, N-way * k-shot, 3, 32, 32 ] の形で、ラベルデータは、[ outer_batch, num_task, inner_batch, N-way * k-shot ] の形で作るようにしました。 [ 3, 32, 32 ] は画像の次元です。
学習データは、CIFAR100 の学習用データのうち 10,000 データを用い、 outer_batch = 3, num_task = 20, inner_batch = 3, k_support=10, k_query=15, num_class = 5 としました。
学習結果
学習は 300 エポックで、train acc = 1.0, val acc = 0.63, test acc = 0.76 でした。学習にかかった時間は、RTX 6000 一枚で 30分程度、CPU でも3時間程度でした。
注意すべき点
pytorch の MAML でも、model パラメータを求めるのですが、validation や test を行うとき、保存した model パラメータで計算した loss と acc ではなく、保存したモデルパラメータについて、興味のある task を数回学習させてから、validation や test の loss と acc を計算するようです。
実装したプログラム
わたくしもそうだったのですが、ページであれこれ説明されても良く分からなかったです。分かるためには、実装したプログラムを使ってみて、自分が正しいと思うように修正すると分かったと思えました。ページ上で説明は控えさせていただき、理解したい方は、github のプログラムをダウンロードして使ってみて、自分なりに直してみてください。よろしくお願いいたします。
感情分析の MAML メタ学習プログラムも置いておきます。感情分析は、Transformer Encoder を使っています。<CLS>トークンは使わずに、テキストを tokeinze したあとの sequence の最大値を 128 として、Transformer Encoder の出力を [ batch, 128, 256] と固定しました。その結果、最終的な分類のための線形層を nn.Linear( 128*256, 2 )とすることができました。精度は train acc = 0.79, val acc = 0.74, test acc = 0.77 でした。学習にかかった時間は、300 epochs で RTX 6000 一枚で1時間程度でした。CPUでも3時間程度です。
このページを参考にしました。
感情分析について CLS トークンを用いたメタ学習も行ってみました。train acc = 0.72, val acc = 0.76, test acc = 0.70 でした。ソースを置いておきます。