🐡

Auxiliary lossについて(ISIC2024コンペ振り返り②)

2024/09/16に公開

ISIC2024コンペでは、画像モデルにAuxiliary lossを使っているチームがいくつかありました。僕もコンペ中に試しては見たのですが、どうも勘所がわからずあきらめていました。上位陣がどのようにAuxiliary lossを活用していたかまとめてみようと思います。

https://www.kaggle.com/competitions/isic-2024-challenge


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位解法が実装が一番簡単なので、実際に自分がコンペ中に作成した画像モデルに実装して試してみました。実装したコードは以下に公開しています。
https://www.kaggle.com/code/takeshimorimura/images-val4-effnetb0-ema-aux

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