Auxiliary lossについて(ISIC2024コンペ振り返り②)
ISIC2024コンペでは、画像モデルにAuxiliary lossを使っているチームがいくつかありました。僕もコンペ中に試しては見たのですが、どうも勘所がわからずあきらめていました。上位陣がどのようにAuxiliary lossを活用していたかまとめてみようと思います。
Auxiliary lossとは?
Auxiliary lossは、主損失(メインタスクの損失関数)に加えてモデルに導入される追加の損失関数です。通常、主タスクとは異なる補助的なタスクを学習するために使われ、主損失と補助損失を同時に最小化することで、モデルの学習をサポートします。Auxiliary lossを実装する場合、補助タスク用の追加のhead(出力層)を作り、主タスクと補助タスクの両方に対する損失を計算して最小化します。
Auxiliary lossの便利な点として、学習データのみに存在するメタデータも組み込めるという点です。というのも、テストデータのinferenceの際は主タスクの出力のみを使えばいいので、テストデータに無いデータでも気にせず学習に使うことができます。今回のISIC2024コンペでは学習データのみに存在するメタデータがいくつかあり、実際に上位陣の一部はそれらのメタデータをAuxiliary lossに活用していました。
上位陣のAuxiliary loss活用方法
今回のコンペの内容をざっくり説明しておくと、ほくろの画像から皮膚ガンの診断を行うというものでした。僕の確認した限りだと、上位陣でAuxiliary lossを使っていたのは以下の通りです。先に述べたように、学習データのみに存在するメタデータをAuxiliary lossによりうまく活用していたという印象です。
2位解法
iddx_full(その画像に対する病変診断の文字列。学習メタデータのみに存在)をtf-idfでベクトル化して、k-meansでクラスタリングし、クラスターの中心点からの距離をAuxiliary lossとして扱う。
5位解法
過去のISICコンペデータを学習データに含みつつ、それが過去コンペのデータか、もしくはlesion_id(一部の画像のみが持つid。このidを持つデータの一部が陽性。学習メタデータのみに存在)を持つデータかをAuxiliary lossとして扱う。
7位解法
lesion_idの有無をAuxiliary lossとして扱う。
11位解法
陽性データの分類(陽性の中でも分類があり、学習メタデータから判断可能)も含めたマルチクラスの分類をAuxiliary lossとして扱う。
Auxiliary lossの効果
7位解法が実装が一番簡単なので、実際に自分がコンペ中に作成した画像モデルに実装して試してみました。実装したコードは以下に公開しています。
CV平均(pAUC) | PublicLB(pAUC) | PrivateLB(pAUC) | |
---|---|---|---|
EffNetb0_aux0.3 | 0.1474 | 0.1299 | 0.1172 |
EffNetb0_aux無し | 0.1500 | 0.1357 | 0.1133 |
Swin_small_aux0.2 | 0.1584 | 0.1495 | 0.1393 |
Swin_small_aux無し | 0.1560 | 0.1554 | 0.1422 |
どうもパッとしないですね。これ以外にも試したのですが、あまり改善効果は見られませんでした。もう少しAuxiliary lossの割合やモデルのパラメータをいじった方がいいのかもしれません。
また、そもそもこのコンペにおける画像分類タスクは、のちのtreeモデルのための特徴抽出の意味合いが強かったので、分類精度というよりも特徴抽出の一つとしてAuxiliary lossの活用が有効だったという考え方もありそうです。
まとめ
上位の解法を見て、何となくAuxiliary lossの使いどころが分かった気がします。深層学習モデルにおいて、学習データのみに存在する有用なメタデータがあれば、Auxiliary lossの活用がよい選択肢になりそうです。
Discussion