かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

2022年を振り返る

お久しぶりです。 kaerururu です。

2022 年の振り返りをしようと思います。


kaggle

2022 年は ソロ金 1, チーム金 1, ソロ銀 1, ソロ銅 3 に加えて, kaggle days championship final 出場という戦績でした。 他にもメダルは取れなかったけどやりきったコンペが一つありました。(訳あって戦績からは抹消されていますが...)

2021 年末に掲げた ソロ金を獲る を達成できました。あと金メダル一枚で GM です。


PetFinder.my - Pawpularity Contest (5/3537)

  • result : 金
  • member : yuki-san, tommy-san, cpptake-san, shokupan-san
  • ジャンル : 画像
  • 通称 : Pet コンペ 2

保護動物の里親探しのサイト主催で, 与えられた犬猫画像に対して独自に定義された連続値である可愛さスコア(Pawpularity) を予測するコンペでした。

ターゲットがノイジーで同コンペで与えられた同一・類似画像で異なる値がついていたり, train データが 9900件程度しかないこともあり, 与えられた画像のみを Deep de pon するだけでは運要素の非常に強いコンペでした。

しかしながら, 過去コンペである pet1 コンペで与えられた画像との被りがあり, 類似度でマッチする過去コンペ画像に紐つくメタデータを特徴量に加えるとスコアが跳ね上がったり, 最終的に private 1st になったのは事前学習済みモデルから抽出した embedding を rapids の SVR で学習したモデルでした。

銅メダルをふらふらしていたところ上述の 4人のチームに誘われました。当時 public 2位で, 同ホストの前回コンペ 1st だったことを買ってもらったそうです。当時ソロ金のためにチームマージ縛りをしていたのですが, 欲に負けてお受けしました。(2位に声かけられたら断れない...)

チームマージしてから過去コンペで効いた特徴量を加えたりして public 1st まで登りつめました。最後 3週間くらいは stacking と blending を混ぜたり, 最終サブ選びについて考えたり, ひたすら shakedown 対策をしていたのですが, 最後の最後で shakedown して 5位で finish しました。

日本人大勢でわいわい取り組む久しぶりのコンペでした。


Jigsaw Rate Severity of Toxic Comments (95/2301)

  • result : 銅
  • member : ソロ
  • ジャンル : NLP
  • 通称 : jisgaw 4コンペ

与えられたテキストの毒性スコアを当てるコンペ。学習用データセットは与えられず, これまでに同ホストより開催された3回のコンペのテキストを使用することを指定されました。また正解データはスコアとしては与えられず, more toxic と less toxic のテキストのペアが与えられていました。このため pairwise 学習などの工夫の余地があり楽しそうなコンペでしたが, (記憶がほとんどないが) LB が壊れており, trust cv が求められたコンペでした。


BirdCLEF 2022 (68/807)

  • result : 銅
  • member : ソロ
  • ジャンル : 音
  • 通称 : 鳥コンペ3

ハワイに生息する鳥類の音声サンプルを使ってモデルを学習し、5sec clip の環境音サンプルに、それぞれの鳥類が鳴いてるかどうかを当てるコンペでした。

2021コンペで与えられた validation 用の環境音データがなく, さらに CV 計算用の関数が与えられず (強いて言えば macro F1 が近いよ!とのこと) 手元 CV が計算できない上に, class inbalance であったとても難しいコンペでした。

オチとして同ホストが鳥類の音声データで事前学習した(コンペデータは学習に使っていないらしい) BirdNet を使った solution が金圏 finish していました。

個人的には, transformer base の音声モデルを試したり, 鳥2までの延長線上の手法をポンしてスコアが伸び悩んで終わりました。

他にも少数サンプルデータをハンドメイドでアノテーションした解法が金圏 finish していたので次あったら試してみたいです。


Foursquare - Location Matching (76/1079)

  • result : 銅
  • member : ソロ
  • ジャンル : マッチング
  • 通称 : 4sq

位置情報サービス提供者がホストのコンペで与えられた地点データの中から同じ場所を表す地点をまとめるコンペでした。色々やらかしがあってとても賑わったコンペでしたが, knn や faiss などで候補集合を作成し, 決定木で同じか同じでないかの 2値分類問題を解くような多段アプローチが必要なコンペはあまり出たことがなかったので新鮮でした。(landmark はデータ重かったり TPU の学習コストが云々言い訳して避けてきました) またメモリ管理が難しくこのコンペの感想戦で教えてもらったメモリ管理手法は学びでした。


Feedback Prize - Predicting Effective Arguments (136/1557)

  • result : 銅
  • member : ソロ
  • ジャンル : NLP
  • 通称 : FB2

アメリカの学生が書いた小論文を discourse elements ごとに Ineffective, Adequate, Effective の項目ごとにスコアリングするコンペでした。

deberta-v3 family が強いことや tokenizer に独自トークンを追加したりする手法などを学びました。


Feedback Prize - Predicting Effective Arguments (13/2654)

  • result : 金
  • member : ソロ
  • ジャンル : NLP
  • 通称 : FB3

アメリカの学生が書いた小論文を cohesion, syntax, vocabulary, phraseology, grammar, conventions の項目ごとにスコアリングするコンペでした。

与えられた学習データが 4000件程度だったり, 6項目の RMSE の平均が評価指標だったりただでさえ shaky な要素が揃っていたのですが, その上 public LB の表示桁数が小数点下2桁まで + ハイスコア public notebook の存在で public LB が信用ならない状況でした。

コンペ終了10日前くらいに金圏に到達し, 最後までボーダーラインをふらふらしていたのですが, shake しないように diversity 確保と trust cv に全振りしました。その甲斐あって public, private 両方とも金圏に残ってのソロ金獲得できました。

前回コンペのソリューションや, 同じテキストの回帰問題であった commonlit コンペのソリューションを片っ端から試したり, kaggle notebook 環境のメモリ管理のため個別の script で実行するなど, 過去参加した全てのコンペでの学びを発揮できたコンペでした。

また, コンペ中に TitanRTX を増設し VRAM 64GB を手にしました。


DFL - Bundesliga Data Shootout (-/530)

  • result : -
  • member : ソロ
  • ジャンル : 動画
  • 通称 : DLF

ドイツのサッカーリーグ主催で動画データ内の特定のプレーとその発生時点を予測するコンペでした。

今まで取り組んだことがなかった動画データのコンペであったのと LB 公開が待てなくて参加していなかった 2stage 制のコンペであったことからチャレンジしてみたのですが, げきつよ公開notebook に蹂躙され銀圏にも残れなかった上に, 学習済みの重みを全て消してしまい rerun 時に落ちてスコアが出ない結果となりました。(無念)

散々な結果でしたが EDA でサッカーのプレイ動画を見るのは楽しかったので類似コンペがあったらチャレンジしたいです。


Kaggle championship final

昨年参加した予選で参加資格を得たので決勝大会参加のためスペインのバルセロナに行ってきました。コンペ自体は 11h で同時に 2コンペ開催というハードなものだったのと盛大な shakedown で残念な結果でしたが, 初海外に行けたのは思い出深かったです。チームメイトだった takuoko-san, upura-san, ynktk-san には感謝です。


仕事

2年3ヶ月お世話になった六本木の web 系企業を退職し, 11月から下町のベンチャー企業に転職しました。その会社では 4月半ばから半年にかけて業務委託として参画させてもらい正社員になったらどんな人とどのように一緒に働くことになるのか具体的なイメージを持って転職することができました。

自分のキャリアで全く関わってこなかったドメイン知識を必要とする会社ですが, 尊敬できる同僚に囲まれながら日々楽しくコードを書いています。


その他

昨年の抱負でも書きました仮想通貨 bot 作成に 2ヶ月くらいチャレンジしました。 ネットで拾ったり自分でアイデアを出して取引戦略を立てる, その取引戦略で実際に勝てるのか時系列でデータを分割し, シミュレーションを実施する。 その取引戦略に基づいて 取引所の API を使用し注文を出し実際に市場でトレードするというところまではできました。

金融のドメイン知識を獲得し, より複雑なアルゴリズムの構築にチャレンジすることやクラウドインスタンスを建てて取引ログを DB に保存するといったシステム構築までやってみたかったのですがのめり込めず途中でやめてしまいました。


来年の抱負

最後に来年の抱負も書いておきます。

  • 金メダルを獲得し, Competition GM になる
  • チームマージをして色々な人とコンペに参加する
  • やった事ないコンペにも参加し, コード資産を拡充する
  • テストコードを個人開発で書く習慣をつける
  • OSS にコミットする

以上です。

ありがとうございました。