maruyama
参加者の皆様お疲れ様でした。また、運営の方々、本コンペを開催してくださりありがとうございました。
Private LB 2位の解法を共有します。https://github.com/mtmaru/probspace-kiva2021
コンペお疲れ様でした。 早速、解法とコードを読ませて頂きました。共有ありがとうございます。
3点ほど、ご教授頂きたく、よろしくお願いいたします。
①モデルとしてオリジナルのニューラルネットを使用されているように見えたのですが、その意図をお伺いしてもよろしいでしょうか?
②テキストの埋め込みでroberta-baseとdeberta-baseを選択された意図をお伺いしてもよろしいでしょうか?
③アンサンブルが効いたという印象ですが、アンサンブルする上で大切にしたことなどお伺いしてもよろしいでしょうか?
お手数をおかけしますが、よろしくお願いいたします。
ご質問いただき、ありがとうございます。あまり深いことは考えていなかったというのが正直な回答ではありますが (笑)、改めて振り返ると以下のようなことを考えて解法を組みました。
① (「オリジナルのニューラルネット」がModelクラスを指している、という理解で回答します) マルチモーダルなデータの特徴抽出器 (BERT、ResNet、Embeddingレイヤーなど) のファインチューニングと予測器 (最後のDenseレイヤーのブロック) の学習を一気通貫で行うためです。各モジュールを組み合わせて一つのモデルとして学習できるようにする必要があったため自作しました。一気通貫で学習できるようにすると、例えば予測に効く特徴量を抽出できるよう学習済みモデルが微調整されたり、テキストと画像の交互作用を捉えた特徴量を抽出できるようになったりすることが期待できます。
②-1 モデルの中からRoBERTaとDeRERTaを選んだのは、Kaggleでよく見かけるからです。largeではなくbaseを選んだのは、学習時間を節約するためです。largeとbaseの精度を比べたところあまり変わらなかったため、小さいモデルを選びました。②-2 学習済みモデルの中からHugginfaceの"roberta-base"と"microsoft/deberta-v3-base"を選んだのは、よく使われている汎用的な学習済みモデルだと思ったからです。クラファンに特化したデータセットで学習させたモデルも探しましたがなさそうだったので、できるだけ汎用的な学習済みモデルを選びました。
③ 精度が極端に悪いモデルはアンサンブルから外しました。例えば、損失関数を対数変換+MSELossからHuberLossに変えて学習させてみたりもしましたが280くらいだったのでアンサンブルからは外しました。あとは、できるだけ違うモデル同士をアンサンブルしたほうが精度が上がることを経験的に知っていたので、終盤のテキストメインのモデルと、序盤に作った画像も使ったモデルを積極的に選んでアンサンブルするようにしました。
詳細なご回答感謝いたします。とても勉強になります。
マルチモーダルなデータを一気通貫で学習するという視点は斬新でした。
また、特徴量のDescriptionは通貨ごとに共通の記載フォーマットがあるなど予測に効いていた印象なので、 より精度が出ると考えられたroberta-baseとdeberta-baseは自分でも試してみます。
最後に特徴量を変えたモデルでここまでアンサンブルが効いたのは勉強になりました。 モデルを変えたアンサンブルのイメージが強かったので。
追加の質問で申し訳ございません。 損失関数にL1Loss(MAELoss)ではなくMSELossを選択されたのは以下のトピックを参考にされたのでしょうか? https://comp.probspace.com/competitions/kiva2021/discussions/bananabanana-Post0ffc6825f7398136a1bf
そのトピックに相当するのは、上の回答に書いたHuberLossですね。MSELoss (正確には対数変換+MSELoss) を使ったのは、コンペで勝つためというよりも納得感のあるモデルを作るためです。MAE (MSEでもいいですが) を最適化すると例えば、10,000ドルの案件を9,500ドルと予測してしまう事例、1,000ドルの案件を500ドルと予測してしまう事例、それぞれを「誤差500ドルの事例」として等しく扱うことになりますが、明らかに前者は誤差で後者は致命傷ですよね。クラファンの特性上、許容できる誤差は一定ではなく目的変数の大きさに応じて変わるはずなので、正解と予測の差を最小化するのではなく正解と予測の比を1に近づけるよう最適化するほうが実用的なモデルになると考え対数変換をかませました。MAEの最小化を目指さない時点で損失関数をMAEに寄せる必要もないので、一般的に使われているMSELossを使いました。
アンサンブルが効いたのも、もしかしたら対数変換のせいかもしれません。対数変換すると金額の大きな案件は大きく外すことを許容することになるので、モデルによって金額の大きな案件の予測結果が数千ドルレベルで変わってきます。そのあたりがアンサンブルで均されて、MAEが改善したのかなと……
疑問がすべて解消されました。 よく考えて取り組みされているなと感服いたしました。 お時間いただき、ありがとうございました。 そして、2位おめでとうございます!
maruyama様
ProbSpace運営です。ソリューションの公開、ありがとうございました。オープンレビュー期間については、2/21までと設定させていただきます。
質疑対応につきまして、お手数おかけいたしますが、どうぞよろしくお願いいたします。