Kaggle/MAPコンペ振り返り
MAP - Charting Student Math Misunderstandings | Kaggle
初心者ながら出てみよう、勤勉さで銅いけたらいいんじゃないか? という見立てだった
実際は途中で忙しくなりあんまり作業できねえなとなって諦め
記念受験 1sub で終了、1291th/1982
jhu-clsp/ettin-encoder-1b · Hugging Face 小さいながら良好なスコアを出す Encoder に分類ヘッドを付けてチューニング
流れ
baseline として Qwen3-8B を LoRA で train
is_correct を使っても世間のようなスコアが出ない
RAdamScheduleFree を試すがあまりうまくいかない、adamw_torch_fused に戻る
all-linear, r や alpha 調整してもあんまり変わらない
選択肢を列挙してプロンプトに入れる → 変わらない
これ見切るのは早すぎた感、小数点下2桁以下で争ってるんだから、ちゃんと比較しないとわからないはずだった
prompt 調整 & TeX 記法剥がす
Category での Stratified 5 Fold で CV 試す 0.8185±0.0033
ettin-encoder-1b に変えてマシに
0.9424±0.0004
このモデルで sub 試して Public LB 0.938、そのまま終了して Private 0.935
1B は 2epoch が20分程度で回るので気が楽だった
アイデア自体は色々出したけど全然消化できていなかった
学んだ
RunPod
いろいろなノウハウ溜めれた
S3 エンドポイントでモデル送っておくケチテク、セットアップスクリプトなど
Kaggle コードコンペ依存の管理
offline でコードコンペ提出するのよくわかっていなかったが1度やってみたらまあ分かる
uv で wheel 書き出し全置き & インストールはうまくいかず結局必要なものだけを選択的に whl で install した
kaggle notebook kernel の transformer やら CUDA やらとうまく動いていなかった
次回までに解決する
初 sub でエラー出ずちゃんと LB まで行けたのは偉いね
hydra
当初は「自分の規模だと 1 notebook = 1 実験で直接パラメータ書いてたらよくね?」 と思いつつ使ってみたらちょお便利
とはいえじんわり複雑、まあ
あと ConfigClass にメソッド書きたいんだが...
CVモデルのアンサンブルにするか全データの full-train にするか
huggingface/transformers
AutoModelForSequenceClassification づかい
アンサンブルしてないので pipeline で top_k 取れて楽
情報収集テク
@pokutuna/mcp-chrome-tabs - npm と claude-code の slash-command で気になる discussion や notebook をどんどん集めてまとめる & 読む
まだわかっていない
いい感じの train スクリプトに至っていない
あまり抽象度上げず、実験セットごとにコピペで作る程度でよいのだが、しっくり来ていない
hydra で色々可変にしつつ、提出モデルでは CV せずフルデータで学習するのを切り替えたり
OOF で評価した結果を書き出して集めていい感じにするフローなども
実験コードの管理
notebooks/000-name/ 以下に色々置いていく
src/ 以下に共通実装、前処理やら、プロンプトテンプレートやら提出用コードを置く
deps kernel で依存書き出しつつ uv build で自作 whl も配置 ← このへんはよかった
まあ探り探りやったのでカスっぽいが次はもうちょいマシになるだろう
Meta Kaggle をいい感じに AI から読ませて関連資料を集める & 発見を得る
Kaggle過去コンペ上位解法をAIエージェントでレポートする - Speaker Deck
参加中 & 関連性の高いやつだけシュッと引っ張ってきて読みたい
kaggle での dataset, model, kernel 周りのノウハウ
vllm でいい感じに分類問題解く
1B だったので要らなかった
soft label でやる云々
T4x2 活用テク
solutions
Neither へのノイズの対策をどうするか? というのがみんなのアプローチの見どころかな?
→ soft label, label smoothing
soft label みんなどう作っているのか?
OOF の確率を使う / 複数のモデルでの平均
各モデルの異なる間違え方を相殺する?
CausalML がやや多い? → 6/10
なるほど CausalLM だと vLLM にしやすいのか
まあそうか分類ヘッドつきのものを vLLM で使う方法確立されてなさそう?
Classification — vLLM あるっぽいが pooling runner で動くものでないといけないかな?
decode の時に label を制限しやすい?
1st Place Solution | Kaggle
ちょうど期間中に tascj/offload_adam の発表資料が流れてきて見てたんだよな...CV
FlexAttention 知らない
multi-seed emsemble
5-fold x 5-seed で実験、3-seed esemble が安定していることを確認
同じデータに対し異なる seed でモデルを作るってことかな?
初期に CV で全体像把握 & multi-seed ensemble の効果を確認
難しい 1fold で試行錯誤
提出は全データで Qwen/Qwen3-32B & zai-org/GLM-Z1-32B-0414 のアンサンブル
追うべき CV 定めるところにこれだけ手かけているのがすごい、Private LB を射抜ける CV を作る
MAP2025_Private&Public 2nd | Kaggle
SFTChoiceTraner 実装
データ拡張 & soft label
A, B, C ... のようなラベルで回答させている
hard loss + soft loss のところ こういうの全然わかってない
labels_target = inputs['soft_label'].to(outputs.logits.device)
soft_loss = F.cross_entropy(logits_target, labels_target)
3rd place (Public 1st) solution : monsaraida & Masaya | Kaggle
bf16 で学習して T4 では float16 にしている
短いので padding=False
14B/32B で推論 → top1 の確率が低いもののみ 72B
4th Place Solution (single model pb 0.948 lb 0.951) | Kaggle
CV スコアが低い fold を使っている
Pointwise Ranker
問題ごとの候補ラベル 4~6 個に対して当てはまる確率を返して並び替え
CoT や関連性の高い説明を追加は効果なかった
5th place solution | Kaggle
作戦の考え方パートが良い
データ拡張
学生の回答は正しいが説明が誤っているケース → 回答だけ正しい値に変えて True_Misconception:XXX にする
6モデルアンサンブル
Private 7th (Public 10th) Place Solution | Kaggle
Rather than using the added special tokens, the existing tokens are used as the correct answers.(CV+0.005, LB+0.005)
A, B, C ... 的なラベルでやるってことかな?
Instead of using the checkpoint with the lowest eval_loss, use a slightly later checkpoint.(CV+0.008,LB+0.007)
ほう
#kaggle