ZENKEI AI ポッドキャスト、シーズン26は2022年2月23日に開催した ZOOMライブの模様です。
この日のテーマは「祝日も AI やるよ!」です。
エピソード4は、メインの第2部「ArcFace - 難しい画像分類への応用として」です。
当日の市來の発表資料
zenkei-ai-podcast-20220223-04_q100.m4a
ビデオ見れる人はこちらからご覧ください。
(以下は、OpenAI の Whisper を使って文字起こししたものを修正したものです。)
** 注:以下は未編集の草稿です **
で、文明コネやっぱ僕は画像分類をやりたいんだっていう腹でいるときに難しい画像分類をどうやって解くんだと画像分類、難しい画像分類にどういう技術が助けになるんだっていうようなセンスで考えていてそれでARCFESっていう風に捉えたいとメトリックラーニングってねなんか特にサヤミーズの古川さんの説明とか聞いたりとかしてた時もなんかピンとこなかったんだよねピンとこない理由はあれなんですよ、画像分類のタスクになってないっていうか違う枠組みでアプローチしてるような説明になってて古川さんの説明だねそれサヤミーズが少なくてでも、やっぱりでも僕が解きたいのは画像分類なんださっき言ったようにねハーバリアムだったり今回のホエールだったりクラス数がでかいとかクラス数がでかいだけじゃなくて違いが同じクジラなんだけども今回のコンペで面白い投稿してる人がいてクジラとドルフィンがいるんだけども全員に名前つけちゃえって言って勝手につけてるよねあれねでも多分それコンペで投稿してるからもうみんなその名前で多分呼ぶノリになってるようななってるのかな、分かんないけどもエマちゃんとなんとかちゃんみたいなそうすると画像的にはイメージネット的にはホエールなんだけどホエールエマとホエールなんとかドロシーとみたいな違いが今回の少なくとも個体識別ですよねそういう時に細かい違いでもなんだけどでもそれって分類じゃんっていうのはねそうメトリックラーニングっていうフレームワークが僕はまだ理解できてないからなんですねでも今回ArcFaceを使うっていうセンスで色々なものを見てたら結局分類タスクにどうアプローチするかっていうふうなことなんだよっていうふうに見えるので技術性プログラム的にはそうやって理解してまずやってみようっていうのが今回の趣旨ですてか僕の学びの方向性ですでそういう視点で改めて今ぺぺぺって上の方で挙げた回答ですねソリューションを眺め直してみるとハバリアムの1位もここにArcFace使ってますよって書いてあったハンバックホエールコンペの2位の人のGitHubのページに行ってこういうアーキテクチャで読きましたありますがこれ色んなロスを使ってますがその中の一つにArcFace真ん中にドーンとありますねもう一個3つあるのでTripletロスっていうのも使いつつFocalロスっていうのも使いつつっていうなんかハイブリッドなことをやってるみたいですけどもで3位はArcFaceを使ってるっていう風にモデルのところにも書いてあったようにArcFaceがキーワードだとわかったとそれぐらい重要なんだがこれをマスターすればきっとホエールドルフィンは行けるだろうっていう話ですねはいで今までの教訓からただ使うだけっていうセンスでやったって結果は簡単に出てこないっていうのはもうね前期AIフォーラムの過去のビデオを見ればわかるともう僕の歴史はその歴史ですからね今回は論文きちんと読もうかなと思ったんですが思ったんですがって言ってるように時間切れでちょっと読めなかったんだけどまずでもきちんと論文を押さえておかなきゃいけないダウンロードはしました偉い2018年ねそんなにほやほやっていう話ではないしアークフェイスっていうのがわーって話題になったのがこのコンピ自体が3年前とかの話ですからね今トランスフォーマーはーって言ってるのは時間的に新しい話ですけどアークフェイスってそんなに新しい話ではない枯れてると枯れてるけども枯れてるがゆえに重要なものとして残ってるっていうのは重要だろうっていうんで学ぶ時間を投資する価値はあるでしょうはいで論文PDF出しましたとで見るとねこういう風になんかねそうメトリックラーニングの説明を書いてあるページとかに行くとなんかこういう風にね近いけども遠くにするみたいな絵の描き方がしてあってねなんかようわからんなーっていう絵がどーんと出てますけどもでねこの論文のFigure2Figure2ねにこう結構視差的な図が出てますしアルゴリズムも簡単に書いてありますで何をやってるのかっていうのを簡単に説明されてるんですがここにねFigure2Figure2っていうのがここに入ってくるんだけどもこれがこの左側に普通のCNNがあるとレズネットがあるとかエフィシャンネットがあるとか思ってないんですね画像を送ってガガガってやってFigure2になったやつをに対してどういう風にプロバビリティまで持ってくんだとつまりロジットを計算普通ねレズネットの一番終端はロジットですよとソフトマックス込みでクロスエントロピーを計算するのがパイトーチなんで大体モデルっていうのはロジットのところまでが一区切りなんだけどもっていう世界になってるで普通は最終端のフィーチャーテンソルがでクラスの数にリニアレイヤーかましてロジットになりますねっていうだけなんだけどもその過程の中にゴニョゴニョゴニョっといろいろ入れるのがArc, Face, Lossっていうものらしいそのアルゴリズムはっていうとインプットはフィーチャーでこいつに対してどういう処理をしてアウトプットのプロバビリティを出すんだよっていうことを書いてあるんですねそれを図示したのがこれだとなるほどとなるほどっていうのは僕の頭の中ではこれ全体をブラックボックスだと思えば結局プロバビリティでクロスエントロピーでっていう意味でクラシフィケーションですねっていう話でOKそういうことなんやねっていうことが分かったと画像分類の分脈できちんと落とし込む景色になってるなっていうんですねで注意点はただしここの中のプロセスにGround Truthラベルの情報がここのマージンペナルティ導入されるんですがそれが肝なんですがそこを計算するときにラベルの情報が必要になってくるっていう意味で普通モデルの中はねロースの計算にラベルを使うけどもモデルのペンペンペンペンペンってテンソルをずっと計算するときには入力出力入力出力ってやるだけなんだけどもこのレイヤーに関してはラベルが必要ですよっていうのが注意点なのでなのでっていうかそういうことだなっていうことですねでえーっとその結果この余分な手間は何のためにしてるんだっていうのこの論文の図3に書いてある左側は普通のあのゴシャゴシャっていうんじゃなくて普通に直接的にソフトマックスかけてプロバビリティ出して学習したときはこれで間ゴシャゴシャっていうペナリティ化してっていうふうにやったらこうなるっていう絵スキマティックに書いてあるんだと思うんですがでハイパースペース上にベクトルが分布してて各クラスがこういうふうにきちんと分離できてるっていうのが普通の分類タスクを解いたときなんだけどもArcFaceっていうロスあのレイヤーを使ったもので計算すると各カテゴリーが分離してマージンをきちんと取るようにいうふうになるそのための細工らしいっていう説明が図と簡単図のキャプションを読んだぐらいだったらなるほどと分かった分かった分かってないですけどねって言ってで困ったときにね分かりやすい解説を見るためには聞いたをググったら聞いたりするんですねあと実際に古川さんの2020年12月の全景アイフォーラムの発表時にもですねスライド1枚ArcFaceに対して当ててますがこの中でもU4Uさんモダンな真相集集法っていうページが実際に言及されてます僕もここに行き当たりましたので眺めてみましたとこれをすごく分かりやすく書いていて今の論文を分かりやすくきちんとロジカルに説明してありましたすごく参考になりました一番でも刺さったのはここですね19年の聞いたの記事ですけどもこの時点でこの時点ではそれまでの知識としてトリプレットロスとかそういうのが確立してる技術だと思ってたところなんだけどもよくよく調べてみるとArcFaceみたいなのが出てきてそういう新しいのが出てきてるこれ勉強しなきゃいけないっていう認識を持った実際にこれ上に書いてあるクジラコンペに使ったらしいんですねU4Uさん内田さんですね18位だから多分この辺トリプレットロスとか上にも言及されてましたがそいつよりもいいんだとこれを見て思ったんで僕が今学ぶべきはつまりクジラとドルフィンの攻略するために学ぶべきはArcFaceなんだなと思ったっていうことなんですがあとねそこにも書いてあったように結局普通の分類タスクをやってるモデルの終端のレイヤーにマージンレイヤーを突っ込むことでArcFaceが導入できるらしいんですねこの実装もGitHubにこの方のコードがあってこれがPyTorchの実装があってこれ結構デファクトスタンダードみたいですいろんなノート見てたんですけどもだいたいレイヤー自体がそんな難しくなくてノーマライズしてなんとかしてっていうもんなんでそんな変わりようがないんですが基本的にここのコードベースじゃないかなと思うようなコードをみんな使ってるカグルではなのでここをこれを使えるようになればいいんです実際に聞いた内田さん言ってるように実際に使いたいだけだったらこのGitHubのこのプロジェクトは一通りメインのモデルまで含まれてますがArcFaceのあそこの計算だけやりたいんだったらmetrixっていうファイルだけあればよくてしかもそれのArcFaceだけ使いたかったらここの部分今これスクショを撮りましたけどもここの部分だけピッてJupyterノートブックにコピーしてそのレイヤーを使えば多分良さそうだっていうことが分かりましたただねそれでやってみようと思っていくつかこれを使ってベクトルTensorだけじゃなくて処理をするときにラベルの情報も必要になってくるんですねなのでここのForward関数Forward関数にこれ拡大したいOK?Forward関数ねこれclassArcMarginProductってレイヤーがこれを使ってこれを使ってこれを使ってこれを使ってこれを使ってこれを使ってこれを使ってこれを使ってこれを使ってラベルからOneHotを計算してここのここは計算できないんですねなるほどとトレーニングはOK?ロスを計算する前にモデルの方にもラベルを渡しとけばいい分かったこれTが抜けてるなインフェランス時あるいはバリデーションの時にも計算するときには正解が分からないシチュエーションで計算したり計算する場合にこれってどうしていいのかなと思って色々調べてましたが多分これまだきちんと弱いのは論文をきちんと隅から隅までまだ読めてないんで弱いんですけども多分これの前段で計算してるcosをロジットとして×sをして返せばいいのかなとそうやってる人がかぐりにいたのでそれでいいのかなと思ってそういう風な形で僕はとりあえず使ってみましたっていうことをやってみましたで、分類課題なので分類課題がArcFaceによって改善する!してほしい!っていうモチベーションのもとにいつもTemplateで使ってる五郎島の問題にArcFaceを使ってみましたどう使ったかっていうとさっきのクラスをコピペしてきてコピペしてきてさっき、今説明したようにForwardのラベルを渡さなきゃいけないんだけどこれをオプショナルにしといてValidation時はラベルを渡さないようにしてTraining時はラベルを渡すようにするっていう形にしといてこれがいいのかどうか分かんないですよ今これで走らしてるラベルが与えられなかったらこれをつけてリターンするっていうコードのレイヤーを準備しといてResNet-18まずテストはデカいモデルは遅いんでResNet-18いつも僕使ってますがそれの最終端を-1でリニアレイヤーを落としてArcMarginProductに置き換えてここもトレーニングループを書き換えておいてValidationの時はラベルを与えないTrainingの時は与えるっていう風にしとくことによってこういう風に返すようなモデルを作って五郎島をトレーニングさせましたトレーニングループの修正っていうのは元々トレーニングループは入力を与えて出力を計算するだけだったんだけど今はラベルも出力を計算するために必要だからっていうのが面倒くさいんですねで、ググったら世間の人たちの半分くらいはArcFaceの処理っていうのはロスの計算として扱ってっていう風な実装・アプローチをしてる人たちもいますねその場合はしかし、モデルの外側に学習しなければいけない変数が入ってくるのでOptimizerにはその余分のArcFaceに関係するWeightを追加するようにしとかなきゃいけないそっちに修正を加えるかトレーニングループのここに修正を加えるかっていう二通りの現実的なチョイスがあって僕はこっちをとりあえず選択してるってことですで、えっとこれ、あ、これ順番あれだなはい、説明の都合ですけどもはい、で、実際にそしたら、あとは普通に走りますとで、LRFinderでLearningRateはこの辺かなーっていって20エポック回したら結果がですね94.8%っていうのは悪くないが抜きに出てもいないえっと、State of the Artは95点いくつなんですねなので20エポックもっと回したらもうちょっと行きそうか?って言われたら行きそうかもしれないねもうちょっと試してみようかねでも、言っちゃ悪いですけども8クラス、高高8クラスの分類タスクでArcFaceがっていう話じゃないかもしれないなっていうのは頭の片隅にありますねでも少なくともコードは動いてるのかなっていう気がしますってことでその2その2っていうかね雑談ね雑談です、皆さん雑談として聞いてくださいデータセットはあるので同じ五郎島に使った同じモデルで普通に素朴にArcFaceをこのデータセットに使ってみたで、高々20エポックかな?ぐらいかな?これも回したんですけどもなんかねこれ見てわかる?これ見方あれですけども左がロスで右がアキュラシーなんですねで、オレンジ色がどっち?オレンジ色がトレーニングで赤がバリデーションなんですけどもトレーニングっていうのはArcFaceのレイヤーが有効な有効なっていうか入ってるシチュエーションでの結果ですね精度、正解してるものがこの20エポックの後でずーっとぺたーんとゼロでロスもこんな感じになんか停滞してるんでごろじまうまくいったんだけどなんか失敗してんのかな?なぜならば素朴にデータセットクラススベラボでサンプル数もすごい偏っててタフなんだけども普通にクロセントロピーだけで20エポックか同じぐらい回したらこんな感じになったんですね正解の精度ですねバリデーションアキルシーが13とか4とかなんであれ?ArcFaceの使い方俺間違っとんのかな?っていう気がしてるので曖昧なまま突き進んでもよくないので確認しようとなんでこっからは雑談じゃなくて安全な話してるし僕だからカグルのルールきちんと分かってなかったのかな?クジラコンペね3年前のクジラコンペの3位のソリューションがArcFaceを使ってますよっていうのでGitHubにコードも出てたんでそれを実際に回してどういう風に学習が進むのかを確認しとこうと思ってやってみたんですねそれが昨日とか今日とかの話ですけどもGitHubからクローンしてコードがあるんでクローンしてローカルに展開しといてんで学習のプログラムはプログラムは独立のPythonコードになってますがそれをJupyter NoteにノートブックにコピペしてJupyter Notebookでうまく動くようにごちょごちょとしといてメイン関数を実行しましたそしたら動いて学習を開始しました3年前のコードなのでバージョンとか変なエラーがいっぱい出ていろいろ修正が必要でしたけども大きなところはSciPyのIMLeadを使っているコードになっていて今の最新のSciPyはこいつはディプリケーティットしたみたいでImageIOを使えとか言われたり古いバージョンのSciPyを使うっていうオプションがあったんだけどインストールに失敗してっていう話なので素直に新しいImageIOを使うようにしてとか細かい話がありますがとりあえず動くようになって動かし始めた結果ですねこれDensnetベースのモデルで学習するようなモデルになってますがこれは終わったクジラコンペの話ねスタート時の位置に何エポック?エポック数のカウントでよく分かんないんだけど最初の方はトレーニングの方のスコアは0スタートで多分これDevって書いてあるのにバリデーションはこっちなんだろうと思いますがバリデーションの方は70%出てるのにトレーニングの方は0スタートでゆっくりに立ち上がってやっと0.06とか始まってるんで最終的にっていうかまだ裏で計算進行中ですがバリデーションの方は94%くらいまで上がった段階でトレーニングの方は36%くらいまでいってるんでつまりこの挙動はね希望的観測によればもうちょっとグイーンと上がったらこっちもグイーンと上がってくるそれの前兆なんだろうっていう風なことかもしれないただしコードベース全然別なのでこの後コードの中身をねもうちょっと勉強しようかなと思ってますっていうことで結局骨のある話は今日もなくてやるやる詐欺の拡大版みたいな公園になりましたが公園になりましたが今日のアークフェイスね総目次に行こうOK今日のコンテンツこういう話をしましたどうかなでクジライルカコンペはまだあと2ヶ月あってハーバリアムあったら3ヶ月あってねあのあと多分ねアークフェイスを使うときのもう一つのポイントはこれクジラコンペでもそうですけどもそのプリプロセッシング画像全体をネットモデルに食わせてっていうのは甘いとクジラコンペだったらクジラをオブジェクトディテクションのモデルをかましといてバウンディングボックスでクジラセンターでクロッピングしといたものにて学習させるっていうふうなのが一手間みんな使ってるみたいですねでそんな面倒くさいことやんなきゃいけないのっていう気がでも考えたら僕たちも僕たちもっていうかねチーム全景も崩し仕込んぺんねそういうことやってましたからねあのそれをこういうタスクでもやればいいやんなきゃいけないそういう世の中になったもう2015年6年7年15年ってことはないな2017年8年ぐらいの牧歌的なディープラーニングの世界じゃなくても2022年ですよとそうしたらもうそれぐらいの手間をかけなさいっていうことなんでしょうねなんでそっちはそっちでまた調査して勉強していきたいなと思いますが頑張るぜということですっていうことですとっていうのが今日の祝日記念全景AIフォーラムでしたが皆さんいかがだったでしょうか皆さんどういう祝日を過ごされましたかね僕はもうAIフォーラムで今日の祝日は終わりました昼間も朝からずっと準備してましたまだ足りてなかったもんね数1の部分の説明もうちょっときちんとしなきゃすげえかっこ悪い発表になってしまったなと思って後悔してますがでも言ったようにねカッコつけるのが人生じゃないんだっていうのを示してるんですよ開きながらですっていうことで今日はそういうお話でした今日の終わりにですね次回は今日ね2月は早短いですよねっていうのは最初に言った通りで23日が最終水曜日ということで今日が発表だったんですが3月の最終水曜日は3月30日しばらく先になりますが開催予定です最初にちらっと言いましたが今回は次回はゲストスピーカー内定1名しておりますので楽しみにしてます仮タイトルとかは何個かもらってるんですが正式に決まってない段階で僕が勝手に口走るのもよくないので皆さんお楽しみにしてくださいっていうこととその他にも全景AIフォーラムここで講演したい方絶賛台募集中です大は大きいの大に変わりましたちゃんと修正されました募集中ですあと全景AIマガジンの方も随時執筆者を募集しておりますあのね雑誌作成って結構楽しいと思うんですよ一人でやってるとね結構煮詰まってくるのでみんなとやりたいなと思ってるんで参加者募集大募集中ですよろしくお願いしますっていう感じでなんかそろそろ終わりかなと思ったらYouTubeに人が今なんかちょこちょこって増えましたが皆さんこんばんはですもうね今日発表する内容は終わっちゃったんですよ今日は前座の前座から始まってですね前座が2つテーマがあって第1部は軽めにね終わっちゃったんですが第2部も内容をさらっと触っただけなんでこういう発表が続いてますが次っていうかねこのコンペが終わる頃には今度こそちゃんと成果がですねアークフェイスを使ってみたいなねきちんと発表できたらいいなというモチベーションのもとにですねやっていきたいなと思いますということであコメントありがとうそうなんですよまあいいですこれが俺の生き様だぜっていう感じでね格好つけないっていう格好つけ方をしてるなっていうのは認識してるんですけどねこういう格好のつけ方を俺はしてるんだなっていうのは分かっているんですが格好つけるっていうこと自体が良くないどう悟るかっていう話ですけどありがとうございますね大島さんごめんなさいねきちんと雑誌の形にまとめて出したいとは思ってますのでPodcastは復活するって宣言してきちんと復活できたのでZAMもきちんと復活してます本田さんなんか大変そうですけども今日雪で大変だったんじゃないですかっていう話ですけどねお大事にしてくださいてかこっちに戻ってきてる感じなのかなまたぜひ参加してくださいで、もうネタ終わっちゃったんで締めに入りますありがとうございました終わります終わります終わりますなんかタイプしとこはいなんか何か最近早めが多いですがもうネタ切れですよろしくお願いしますよろしくよろしくありがとうございましたとありがとうございましたということで8時40分9時まであと20分もありますが今日はこれで終わりにしたいとお開きにしたいと思います3月も皆さんよろしくお願いします3月30日ですということで雪もこれで最後になってほしいなあとコロナも収まってほしいな世界も平和になってほしいな僕ねあのね終わるって言っといた話が金沢に戻る前に僕はカナダに住んでたんですがカナダの職場っていうのは研究者ですね研究所に勤めてましたがカナダで所属してた国立研究所に所属してましたがそこの研究室でっかい研究所の中のに研究室がもちろんいくつもいくつもあって僕が所属してた研究室っていうのは研究者のほとんども半分くらいかな半分くらいかなウクライナ系の方だったんですよなので複雑な気持ちはねウクライナってあれですね、キエフね物理強いんですよやっぱりチェルノブイリじゃないですけどねランダムインシティテュートはウクライナウクライナは旧ロシアですからねウクライナにあったんだっけ?僕は教養のない人間なんであれなんですけどもでも物理強いんですよでウクライナカナダは結構ねウクライナの人結構いてそれっていうのはやっぱ国際情勢ね大変なところっていうのはカナダは移民たくさん受け入れてますからね人道的にねいろいろ複雑な思いがありますけどもいや大変だなと思いますね彼らはまあまあいいやだから若いことのようにですねちなみにその方々はですね日本も研究者としていたっていうそういうゆかりもあってですねいろいろいろいろね世界は平和になってほしいなと思いますねオリンピックをやってる今っていうのはねなんかこの世の中どうなっとるんだろうなっていう気がしますけどもどういう顔してみんなオリンピックやってんの?僕はオリンピックはもう全てのオリンピックをボイコットしてますからね先進上的にそれより平和は本当の平和が大事だろうっていう気持ちでですね生きてますけどもあのピースを心に祈りながらすいませんなふと思い出して話しましたがはいあのみんな祝福と幸せに生きていきましょうでは終わりにしたいと思いますありがとうございました終了します皆さんお体にお気をつけて