俵言

しがない社会人が書く、勉強とかのこと。最近は機械学習や kaggle 関連がメイン。

Kaggle と出会ってから Master になるまで、そしてこれから。

はじめに

以下の Tweet で言っている"長い旅路"の詳細です。完全にポエムかつ長文*1、しかも自己陶酔を多分に含んだ自分語りです。

暇かつ心に余裕があって何でも寛大に許せそうな場合にお読みください。


話をしよう。あれは2年... いや5年くらい前の話だったか...

といった感じの、むかーしむかしからの話*2。Kaggle と出会ってからの人生(の一部)の紹介みたいなものになっています。

※注意:この記事では主旨として重要なのもあって色々な方々をぼかした形あるいは by name (Twitter・Kaggle上に存在する方々のみ) で紹介しています。 もっとぼかして欲しいということがあれば言ってください。非常に内輪ネタ感がありますが、まあ個人のブログなので「誰やこいつ!?」てなってもお許しください🙇‍♂️

目次

Kaggle との出会い

 冒頭の Tweet や Kaggle acount の登録日の通り、僕が Kaggle に出会ったのは大体4年半前、学生時代(M2)まで遡ります。当時、データマイニングという言葉は頻繁に使うものの機械学習に関しては全く馴染みが無く、またこの時点だと研究室の先生方もあまり肯定的ではない感じでした*3

そんな中、 その前年に研究科に赴任された機械学習激つよ教授*4の開いた公開セミナーで以下の講演が行われます。


そう、Kaggler の皆さんご存知、日本を代表する Grand Master の一人である smly さん の講演でした。 といってもこの時点では僕はあまりそのすごさを認識しておらず、当時の Tweet を漁ってみるとこんな感じ。

(なんでこいつ上から目線なんや...) これがきっかけとなり、友人の誘いもあって Kaggle に登録したのでした。

 ただ、結局この時はちょろっとだけ触ってすぐ離れてしまいます。M2 で修論が差し迫っていたこと*5、そして当時は研究室の先輩の影響で競技プログラミングに熱心に取り組んでいたことが大きな理由でした。僕の Python (と C++) の標準ライブラリへの理解及びアルゴリズムの実装能力はほぼ全て競プロがベースとなっています。

tawara.hatenablog.com


M1の冬から始め、M2 の秋に目標としていた CODE FESTIVAL 本戦に無事参加( + どうにかこうにかパーカー獲得)、社会人になってからこれまたずっと目標にしていた Top Coder Div1 (青) 昇格を果たします。このあとも続けられたらよかったのですが、徐々に離れてしまってすっかりやらなくなってしまいました . . . 😞
因みに僕が一番競プロに熱中してたときって AtCoder のコンテスト参加者が 500 も行ってなかった時代で、今だとその10~20倍の参加者がいて本当にビックリします。今やったら青色なるの絶対無理だろうな...

そんなこんなで、ここから暫くコンテスト・コンペティションに関わりのない期間が続くのですが、とあるきっかけから分析コンペに徐々にのめり込んでいきます。

分析コンペ本格参戦前の話

先輩の誘いから始まるコンペ生活:ACM RecSys Challenge 2017

www.recsyschallenge.com

 とても気の合う職場の一つ上の先輩 と尊敬する大先輩*6 の誘いを受けて何かよくわからんまま参加しました。スコアが上がっていくのが楽しくて僕自身めっちゃ頑張り、先輩方と力を結集した結果 3位という僕にとって望外の素晴らしい結果が得られました。

XGBoost の使い方やこれを用いた(content-base の) cold start recommendation について学べたのは大きな経験となっていますが、なによりこの時から、「コンペで良い成績を取る」という快楽に徐々に染まっていきます。過去に取り組んでいた競プロには、難しい(と僕が感じた)問題が解けてACされたときやレートが上がったときに喜びを覚えて熱中していたわけで、素養は十二分にあったのでしょう。

初めてのソロコンペ:SIGNATE アップル引越し需要予測

signate.jp

 個人参加という意味では僕がちゃんと取り組むことが出来た最初のコンペでした。シンプルなデータかつカレンダー等とトレンドを考慮して予測という、当時の僕の仕事に近いのもあって頑張ってましたが 32 位という微妙な結果に終わってしまい残念。ただ、シンプルなデータなだけに色々試しやすかったので楽しんでいたように思います。

因みにあとから見返してみると、実はこのコンペは1位があの mamas 先生だったり、順位表にちらほら知っている kaggler が居たりとちょっと面白いです。

モチベーション↑↑:ステアラボ人工知能セミナー聴講

前者は smly さんが、後者は smly さんと iwiwi さん を含む speaker がご講演された、僕にとって最高のイベントでした。

競プロをやっていた僕からすると iwiwi さんは神に等しい存在なわけですが*7、初めて参加したコンペ、しかも初めて挑んだ画像コンペで solo gold を取られていて、その過程や失敗した部分もしっかりわかるめちゃくちゃありがたい発表でした。

smly さんの発表を聞いたとき「この内容どこかで... あれ?学生時代に聴いたことあるな?」と記憶が蘇ります。内容を全部理解できなくても smly さんがいかに Kaggle を好きかが伝わってくる発表で、今改めて見返してみると技術的な内容もだいぶ理解できるのでここは成長を感じるポイント。
また、(確か前者の講演のときだったと思うのですが、) 僕が「結構長期間の参加になると思うんですけど、どうやってモチベーションを保たれているんですか?」と質問したときに、

「順位表が一気に上がった瞬間、脳内物質がドバァと出る感覚がするんですよ。アレを一度知ってしまったらやみつきになって忘れられないんですよね。」

といったこと*8をおっしゃっており、まさに今の僕がこの状態です😅 もう逃れることはできない...
知らなかった分析知見やアプローチの仕方が得られるのも Kaggle の重要なファクターであり取り組む理由ですが、コンペとしては順位が劇的に上がったときの興奮は快楽であり麻薬です。

 こういった発表を何度かお聞きする機会はありましたが、「画像コンペ...やってみたいけど深層学習よくわからん上にGPUも要るし使い方もよくわからんし...」と当時は完全に及び腰でした。いつだったか Kaggle のコンペ一覧を見て画像コンペばっかだったときに「うげっ... テーブル無いの~?」ってなった記憶があります。
逆に今は画像コンペばっかだと「オラ、ワクワクすっぞ~!」となるのでこれも成長ポイントですかね。

後輩との挑戦:PAN Author Profiling Task 2018

pan.webis.de

 上記の先輩*9と一つ下の後輩と組んで参加した、とあるヨーロッパの会議の WS でのコンペです。お題は Text x Image のマルチモーダルタスクであり、後輩が NLP を専門としていたので、「じゃあ僕が画像勉強します!」って手を上げて画像認識 by Deep Learning への初挑戦となりました。
二人がそれぞれ Text / Image だけで学習させたモデルを pre-trained model として multi-modal model を学習、(参加チームはそんな多くないですが) 結果として総合1 位を獲得という、ちょっと熱い展開でした*10


 とはいえ、どうにかこうにか実装 & 学習・推論することに成功したものの、実はこの時点の僕はそもそも画像認識のテクニック、例えば Data Augmentation を全然活用できておらず、既にResNet 全盛期だったにも関わらず VGG16 を使ってたりました。今同じタスクやったらもっと性能出せるんじゃないかなって思います。

ところで:Kaggle はやってなかったの?

 自分自身の Kaggle acount の履歴を見てみると実は少しだけやろうとした形跡があります。Instacart Market Basket AnalysisMercari Price Suggestion Challenge なんかがそうです。でも sample submission に毛の生えたようなものを初期にちょこっと出しただけで、どちらも長続きしていません。

何となくですが、この時点の僕にとって Kaggle はとても遠いものだったんだと思います。 友人に「Discussion とか参考になる情報沢山あるから読むだけでも勉強になるよ」って言われてちょっと読んだりもしてみたんですが、あくまで勉強資料として読んでいるだけで"参加"はしてなかったんですよね。コンペやりたいと思いつつも、まだ Kaggle というコミュニティの内側に(実態としても気持ちとしても)入れて無かったんだと思います。英語なのも少し抵抗感を上げていた部分なのかも。

RecSys Challenge や PAN Author Profiling Task は先輩や後輩と組んで出ていたからちゃんと取り組めていたんだと思います。引っ越し需要予測は色々シンプルだからこそ長続きした感じ。でも Kaggle は... これはどげんとせんといかんというわけで、一人で分析コンペに挑める力を身に着けたいと思うようになりました。

分析コンペ本格参戦を決意してからの話

背水の陣を敷け:まずは買ったぞオンプレマシン

 分析コンペにプライベートで本格参戦したいと思ったのは、上で言っていたようにコンペに自分自身の力で挑めるようになりたいというのと、仕事だけでは扱うデータの範囲が狭く、もっと広い範囲・異なる業種のデータを扱う経験をしなければならないという思いからでした。

とはいえ「やりたい!やりたい!」と言うだけでは前述した Instacart や Mercari の二の舞(三の舞?)になってしまう可能性があります。そこで考えました、「環境を用意してしまって "使わないのが勿体ない"と自分に思わせればよい」と。

f:id:Tawara:20200323060359p:plain
マシン構成


合計(本体 + GTX1080ti x 1) で40万弱*11 ... ちょうど出たばかりの夏のボーナスをほぼ全額突っ込んでおり、冷静に考えると頭のおかしい行為だったかもしれません。パーツをバラで買って自作した方が安いとは思いますが、それでトラブってコンペに中々参加できないよりはある程度お金を払った方が良いだろうという判断でした*12

一応ですが分析コンペ専用のつもりはなく、そもそも家にまともな計算資源が無くて困ることが多々あったのもあって買った面もあります*13


 後から思うと、このマシンのおかげで挑むことが出来た台風コンペはその後画像コンペに取り組む上での土台となりましたし、そして最終的にこのマシンで学習させたモデルが...

先行投資としてはもう十二分に回収できてると思います。やっぱりこのマシンを買ったことは間違いでは無かった、というか間違いにならないように僕自身が頑張ったわけですが... 作戦は大成功ということでしょう🙌

閾値でイケイケ😎ドンドン💀 : SIGNATE 台風コンペ

Public 5th → Private 最下位

tawara.hatenablog.com

 「GPU も買ったし、プライベートで画像コンペ、やるぞ~!」と最初に取り組んだのがこちらです。結果はご覧の通り💀

プライベートで最初に出た純粋な画像コンペがこの台風コンペだったのは、指標問題を除けば、画像コンペ初心者の僕にとって本当に幸運だったと思います。画像サイズが 64 x 64 だったことから色んな試行が短いスパンで出来たのもそうですし、また pre-trained model が少し使いにくいお題・サイズ感であったことから、自分で一から 画像 CNN を実装する経験を積めたことです*14。この時に ResNet 系の論文をいくつか読みこんで、構造がどうなっているかとか、学習率とか学習 iteration 数の規模とか scheduling がどんなもんか調べまくったのは地味にですが後々に活きていると思います。僕が SGD with NesterovAG 教に入信したのもこのときです*15

このコンペでCNNを実装する上で最も参考にしたのはメテオサーチチャレンジの優勝者のスライドなのですが、


Master に昇格した報告を Twitter に投稿したときにお祝いコメントをもらって、めっちゃ感慨深いものがありました。


ブログ中に登場するように、このコンペは Data Augmentation の大切さを僕に教えてくれたコンペでもあります*16RandomErasing はこのときから僕にとっての強力な相棒であり、画像認識のコンペで絶対に使用する Augmentation となりました。

 また、もう一つ得たものがあります。このコンペには専業 Kaggler*17であるカレーちゃんさんなど、この後も別のコンペだったり Kaggle 関連イベント等でお会いする方々が参加していたことです。この時点でカレーちゃんさんは Gold を持っていたので僕よりずっと先を行っていましたが、頭の中では無意識にライバルリスト的なやつに入っていたと思います笑

このあたりから徐々にですが Kaggle 関係での交流をするようになり、コミュニティへの参加みたいなのを意識するようになったような気がします。

運よく参加😄 全然わからん😇 : Kaggle Tokyo Meetup #5

connpass.com

 当時はメダルを持っていなかったのでかなり倍率が厳しかったのですが、Twitter 廃人なおかげで Threecourse さんTweet にいち早く気付くことが出来、15/70 の狭き門に入ることに成功。ただ参加できたのはよかったものの、当時の僕にとっては発表ひとつひとつのレベルが高すぎて*18知識を吸収しようと必死でした。

この中で、特に画像関連で持ち帰れたものは二つあります。一つは Cosine Annealing です。PFDet チーム が使っていたのを知り「よっしゃ次のコンペで使うぞ!」と意気込んで帰ってから実装しました。こいつも RandomErasing 同様に画像コンペにおいて頼れる相棒となっていて、画像コンペで使わなかったことはありません*19

もう一つは、ちょっとメタですが「画像モデルの backbone の構造は徒に弄らない」という知見です。僕が何度も読んでいる畳み込みニューラルネットワークの研究動向で触れられている bn - conv - relu の順番の闇を見ればわかるように、めっちゃ細かい修正で性能が上がる場合があることが知られています。ここらへん気になっていて、基本的になんでも強い、医学系 Kaggler である osciiart さん*20 に思い切って聞いてみた*21ところ、回答は「そこらへんはあまり気にしすぎない方が良い」ということでした。

もちろん理由があって変えるなら話は別*22なのですが、何かようわからんまま順番を入れ替えたりして性能を上げようとする行為は不毛だということです。これは構造以外にも言える話だと思っていて、例えば画像の性質を一切考慮せずに Augmentation を試しまくるような行為*23は、性能が向上する可能性はゼロでないですがかなりの時間と労力を要します。

 この会話がきっかけとなって、自分の中である程度のルールを持ってシンプルにモデルを作るという思想が固まって行きます。実装の方でも「画像認識モデルは backbone → global pooling → classifier head として実装し、backbone は特別な事情(e.g. チャネル数が pretrained と違う)が無い限り弄らない」という方針が固まりました。モデルの細かいところを弄るよりもデータとタスクをしっかり理解し、それに合わせた学習や処理を行った方が良い*24というのは全てのコンペにおいて言えることだと思います。

 また、この会は台風コンペ被災者の会が開催されたり、u++さんの LT(kaggler-ja driven learning) を聴いて kaggler-ja slack に参加して質問するようになるなど、コミュニティへの参加がまた一つ進んだ会であったように思います*25

初めてのマルチラベル分類 : Human Proteins Atras Image Classification

Public 57th → Private 21st🥈

ここで、何を思ったか社長は「計画中の農薬開発プロジェクトに使えそうなネタだし Human Protein Atlas Image Classification やるお」 とkaggle への投入を決意(※これ聞いたとき「マジかよ...」って正直思いました)。協力者を募って AgroDesign が生まれました。

kaggle で初めてメダル(silver) を取ったものの、お詫びせざるを得ない件 - 俵言

AWS 使い放題という魔力には勝てなかったよ...*26

 またもや先輩の誘いにより、先輩の知り合いの、農薬ベンチャー アグロデザイン・スタジオの社長 & 別のベンチャーのエンジニアのお二人(sheldon さん, agrwhy さん) と組んで画像コンペに出るという面白い経験でした。

ここでは不均衡データでの multi-label classification を扱い、後々僕が涙を呑むことになる iMet Collection 2019 で役に立つ知見が色々得られました。バリバリのドメイン知識所持者(社長)と画像をバリバリやってるベンチャー社員のお二人と一緒に参加できたのも良かったです。

最終モデルは僕が作ったモデルになりましたが、社長から「そもそも着色は慣例で決まっていて、自然に存在するRGBとは全く違うんですよ」とか「このクラスは人間でも識別が困難なんですよね~」みたいな重要知見を得られたり、ディスカッションの調査・カーネルの追試・外部データの準備を分担したりなど、チームとしては結構うまくやれていたんじゃないかと思います。

そして、このコンペで初めて僕は Cosine Annealing & Snapshot Ensemble を使用しています。まだ Stacking をどうやっていいのかよくわかっていなかったのもあり試してみたというのが背景です。結果として Snapshot Ensemble と K-Fold Averaging が大幅に Score を伸ばすと共に shakeup に貢献し、このときの成功体験もやはり後々に活きることになります。

 ただ Snapshot Ensemble は学習を長く回す必要があって、それなりに時間コストがかかります。ちょっと前にカレーちゃんさんと kaggler-ja slack で議論になったのですが、「まあ普通のデータなら K-Fold Averaging した時点で多様性も出てるし並列で学習回せるから良さそうだなー」というのがそのときの僕の見解でした。特殊なケース、例えば GM takuoko さんRSNA でやっていたような、データが多すぎて K-Fold Split するよりも 違うモデルを複数学習させた方が良いというケースなら、1 cycle でも追加すると汎化性能が向上するような気がします。

短期参戦で無事死亡😇: 電線 & Pet

 タンパク質コンペのあと、別のコンペやろうと思いつつもすぐ取り組めず気付けばあとちょっとしか時間がない、というのが2回もありました*27。毎度毎度「short-term challenge はもう二度とやらない!」って宣言するんですけど、 学習しないな~ホント😇*28

short-term challenge の唯一の利点は、private LB 公開のお祭りに参加できること...ではなくて、データをちゃんと見た上で submission までたどり着ければ、そのコンペで特に重要だった知見が短期間で手に入るということです。僕にとっては PetFinder がこれでした。

VSB Power Line Fault Detection (1 Day)

Public 1323rd → Private 1267th

  • 1D-Conv を実装してみたかったのでやってみたものの全然 Score が出ず死亡
  • ナニモワカラナカッタ...

PetFinder.my Adoption Prediction (1 Day)

Public ???th → Private 678th

  • ??? なのは、2nd stage 制だったために元の順位がわからなくなったため(覚えていない)。
  • Group K-fold の重要性を理解することが出来ました。ただそんなに Score は出なかった(完)
  • NN を本番の学習に使わずともマルチモーダル情報で予測を行うテクニック*29があるのを知ることが出来ました

ソロでの画像コンペ再び👊:iMetCollection2019 - FGVC6

Public 18th → Private Lost

www.kaggle.com

 色んな意味で僕にとっての一つの転機となったコンペです。最も長期間 solo で取り組んだコンペであり、人生初の EDA カーネルや Starter カーネルを上げたり、Discussion にも参加したりと、「Kaggle やっていくぞ!💪」と気合が入りまくっていたコンペでした。


出来る限りのことをして上位まで来れて満足!の筈でしたが...


正直今でも思い出すとつらいです*30。本当にこのコンペは全力で頑張っただけに、自分のミスとはわかってはいても 2nd stage で落ちてしまったのが悲しかった😭

 ただ、やって良かったことは solution を残したことでした。そうしないと、2nd stage で落ちたせいでシステム上は参加していなかったことになっていることに、とてもとても耐えられなかったんです。2ヶ月以上頑張った証を残したい...。


これによって色んな人に solution を見てもらえましたし、順位は残らなかったものの開催中にずっと頑張っていたおかげで、YKさんphalanx さんtakuoko さんAppian さんowruby さんRK さんCamaroさん ... などなどの、日本の錚々たる画像つよつよ勢*31と同じページで競い合えました。solution の冒頭にも書いているようにとても素晴らしい経験で何より楽しかったです。X5?リーク?知らない子ですね....

そして solution をしっかり書いて自分の証を残したからこそ、次のコンペに繋がるのでした。

祈りよ届け🙏 : Instant Gratification (1 week)

Public 66th→ Private 12th🥇

 壺ショックから立ち直れていない中、 lost place solution と「kerneler ちょっとだけやってみようかな...」という僕の Tweet を見た gege さん が誘ってくれたことで JTC Kagglers season2 が誕生します。

霜降り肉を投げたらメンバーが増えた。

ここに tamref さんDoraconda さん も加わり、JTC Kagglers season 2 は完全体となって動き始めました。

1 week だし行けるとこまで行きましょうという軽いノリだった...筈なのですが、画像しかやって無かった僕が中々進捗を産めない一方で皆さんが進捗を出しまくるのでめちゃくちゃ焦ります。


また、このコンペは Miyatti さんが牧場*32主候補になるか否かの瀬戸際でした。


中々進捗を出せなかったのは辛かったですが1週間楽しくて、iMet2019 の辛さが少しづつ和らいだように思います(チームメイトの皆さん本当にありがとうございました🙏 )。最終的に僕もどうにかこうにかまともなサブを作ることが出来て Public Score を更新し、submission の一つに選んでもらうことになりました(もう一つはLocal CVが最大のサブ)。

さて、あとは祈るだけでしたが...


f:id:Tawara:20200325044149p:plain
hope...

            .
            .
            .
            .
            .
            .


f:id:Tawara:20200323224752p:plain
hope... comes true!!!

これが「特技:お祈り」の所以だったりします。


皆がそれぞれ違う方針でサブを作った上で Public と Local CV の高いものを 1つづつ選び、片方が金圏に入りました。完全にチームでの勝利だったと思います😎

 因みにこの後色々バタバタしたせいで solution を書けなかったのですが、せっかくなのでここで軽く紹介します。僕の作ったサブは複数種の n_component を使って GMM を fitting していくつかの GMM features を作り、これらを特徴量に用いた Logistic Regression で予測を行うというものでした。
gege さんによって n_component が 3 っぽいということは既に判明していたのですが、 いずれかの example のラベルがランダムにフリップされているので、feature にわざとブレ要素を入れたらいい感じにならんかな~とやってみたのがうまく行ったというのが事の顛末です。結果的にはこのやり方のサブのほとんどが金圏に入ってたので、何か良かったっぽい(あまり深く説明できない)。

 またこのコンペは、日本を代表する GM の一人である Jack さん が 5枚目の solo gold*33 を獲得して Grand Master に上がられたコンペでもありました。僕が問題の本質を理解し切れていなかったのに対し、本質をちゃんと理解した上で、めちゃくちゃシンプルな手法で勝つという姿勢は本当に憧れるもので、smly さん同様にかなり影響を受けている kaggler です。

そんなわけで、かなりギリギリでしたが Kaggle Tokyo Meetup #6 の確定参加権を得たのでした。

頑張ってLTに挑戦 : Kaggle Tokyo Meetup #6

tawara.hatenablog.com

 滑り込みで参加確定した2回目の Kaggle Tokyo Meetup です。詳細についてはブログ記事にまとめてるのと、発表者の方々がスライドを公開して下さっているのでそちらをご確認ください。この半年前に参加した#5 に比べると、(特にNN系は)大分内容を理解できるようなったと思います。これもまた成長したということにしたい。

因みにこのイベントでは色々刺さった言葉があって、

phalanx さん「学習回してる間暇だとか言って Twitter をしないこと。論文を読みましょう」

うっ...耳が痛い... 肝に銘じます... 。phalanx さんの画像コンペに対するアプローチの仕方とストイックさ見習いたい部分が沢山あり*34とても参考になる発表でした。

smly さん 「アンサンブルしないと勝てないというのは甘え」

強い。こういうの本当に憧れますよね😄
Jack さんといい、日本の上位 kaggler はシンプルかつエレガントな手法を好みます。見習いたいなあと常々思っている点です。

 僕のLT は「Neural Network 素人なんだけど何とかご機嫌取りをしたい」 という、当時の僕の悩みがそのまんま現れている内容でした。自己顕示欲が抑えきれなくて自分語り (+ 前座)が長すぎたように思うので、この点は、Threecourse さん、本当にすみませんでした😇

内容としては当時の僕がかなり頑張って作ったもので、今見返しても割と「お、そうだったな」ってなります。 ここに書いている Batch Size を決める → LR-RangeTest → Cosine (Annealing) Scheduling は僕が画像コンペに取り組む上での基本的な流れであり今も変わっていません。本当に最適な値かというとそうではないかもしれませんが、学習率をさっと決めてしまえるのはとっても楽です*35

 前回の#5 では元々知り合いだった人 + α と交流できたくらいでしたが、LT をしたのと lost place solution を公開したおかげで、多くの人に「あ、あの謎の魔法陣書いてた人ですよね!」と言って頂けて、会話のきっかけになったりしていました。たとえ順位を失ったとしても、自分の solution をちゃんと公開して本当に良かったと思います。コミュニティへの貢献 + 自分の存在を示すという意味でとても重要でした。

さて Kaggle Tokyo Meetup 終わったし、次のコンペへ...となると思いきや少し休止してしまいます。

ちょっと一休み : 4か月ぐらい

 理由としては偶然にも金メダルが取れてしまってちょっとほっとしてしまったとか、当時仕事と人生について悩み出してしまってとかまあ色々です。タンパク質のときのチームで Recursion に出ようとしたら速攻でリークが発生して出鼻を挫かれてしまい「えぇ...」ってなったり。とにかくしばらくコンペに submission していませんでした。

じゃあこの間何もしていなかったかというと、そうでもなくて、何やかんや論文読んだり実装したり、あるいは他の Kaggler と交流したりしてました。ちょっとこの期間より前のものも含めて振り返ってみます。

 例えば、僕は iMet2019 に参加してる期間あるいはその後も、いくつかの Kaggle もくもく会 に参加していました。

ailounge.connpass.com

globis.connpass.com

もくもく会の場でまたお会いしたカレーちゃんさんと何かしら議論したり、実は取り組み始めた時期的には結構同期みたいな感じのチーム Shirogane(Kurogane) の御三方(アライさんuratatsu さん🐸さん)、hakubishin さん と初めて顔を合わせたりと、沢山の Kaggler*36 と交流する機会になりました。こういったときにも、普段ブログとかで何かしら発信してたりするのがかなり役に立っていたように思います。

 論文に関しては、コンペのために画像系の論文を読んでは外部の論文紹介 LT 会に参加するのを何回かやってました。iMet2019 の序盤ぐらいから僕の TL 上でよく見かけるようになった、チョコミントアイスを好きそうな女の子*37の皮を被った医療画像つよつよエンジニアである ふぁむたろうさん*38が主催するLT会です。彼は医療画像系コンペでメダルを短期間に立て続けにとって Master となり、完全に先を越されてしまいました。

tawara.hatenablog.com

参加した感想を書くたびに毎回言ってたんですけど、この LT 会は 僕みたいなコンペに参加する人、医療関係者、理論つよつよ勢などのバラエティに富んだ参加者が気軽に*39論文紹介をする、論文を読むモチベにするにはとても良い会でした。因みにここに貼っているのは Kaggle Master(4人) の侵略を受けた会です笑

 上に挙げたようなイベントには出向くんだけど、何もないときは本当に土日寝てるだけみたいな、かなりヤバい状態に陥っていた時期がありました。この状況を打破したもの、それは ... SPA です。

平日忙しくて「土日になったら kaggle するんだ...」って思ってたのに、土曜になったら「なんかダルイなー、kaggle 進めなきゃなー」とか思いながらダラダラして一日が終わってしまう方、どうせなら SPA でダラダラしませんか? kaggle したいけど元気がないときに一旦気持ちを完全リセットして「ちょっとやるかー」という気分になれる点で SPA は良いのではないかと考えています。

SPAでKaggleするために回った施設を独断と偏見で紹介する - 俵言

この言葉は自分自身に向けたもので、実際家で土日寝たきりになるよりは外出の機会も増えて、徐々にですがいい方向に向かっていたように思います。まあ SPA でなくても良いんですけどなにかしら違う環境(できればリラックスできる)に身を置いてリセットするのは良いことですよね。

因みにその後も温泉好きなのは変わらずで、後に合宿したりもしました。

tawara.hatenablog.com

 その他、カレーちゃんさんを始めとするかぐるーどの皆さん (wakame さんtakapy さんsinchir0 さん)が開催した分析 LT 会に参加したりもしました。

tawara.hatenablog.com

この会の「気軽なアウトプットの場を作る」という主旨はとても良くて、こういう会が増えるといいなと思いました。僕自身、出したアウトプットのおかげで認知してもらえたり、会話や議論のきっかけになるケースは沢山ありましたし、また自分の思考を整理するうえでも大事です。 そういえば、今後 #2 は開催されるのでしょうか👀

復活のきっかけ : Kaggle Days Tokyo

kaggledays.com

 早めに申し込んだおかげで無事に参加することが出来ました。流石にここでは詳細を省くのですが*40、様々な知見を一気に得られるとても刺激的な二日間だったと思います!Kaggle へのモチベーションが無限に高まっていく😆

二日目の オンサイトコンペティションでは gege さん、uratatsu さんとチームを組み、JTC Kagglers season3 が誕生します。

結果的には Public 34th → Private 33th でした。僕が「Table NN*41 担当します!」って豪語してたのに家のマシンが落ちて*42、ただの hand-crafted feature 製造機になっていた件は本当にすみませんでした😇 また、僕がもっと早くそしてうまく meta data を処理できていれば ... という後悔もあったり。 でも一緒に参加したのはとても楽しかったです。ありがとうございました😄

 懇親会では日本中の Kaggler、あるいはイタリアから里帰りがてら参戦した Jun Coda さん みたいに海外から帰って来た日本人 Kaggler、わざわざ日本まで来てくれた海外の Kaggler の皆さんなど、様々な人々との交流の機会でした。
さて、ここで僕は Kaggle Days Tokyo での個人的裏ミッションを果たしに行きます。

特に最後にサインをもらった Maxwell さん が僕の iMet2019 の lost place solution のことを覚えてくれていて、「これからも頑張って」と言ってもらえたのがめちゃくちゃ嬉しかったです*43

そんなわけで「また Kaggle やっていくぞ💪」とやる気ゲージが MAX になりました。

おみくじ引いて運だめし🙏 : ASHRAE - Great Energy Predictor III (2 Hours)

Public 1158th → Private 227th🥉

厳密に言うとコンペ開催直後にやろうとしてちょっとだけ EDA とかしていたのですが、リークが発覚してやる気を失い放置していました。

今だから言うのですが、締め切りの朝に「まあ絶対 shake するだろうし適当なやつ投げてみるか」と公開カーネルを大量に集めて blending(というか単純な averaging) して提出しました。本当はめっちゃ落ちるか微妙な結果に終わって「まあそうだよね~」ってなるのを想定していたですが、思った以上に Shakeup してしまった。何てこったい...

一応の方針として、leak validation をしてないやつだけ(確か9個か10 個)集めてきて averaging をしました。文字通り運試しだったわけですが、この後のことを示唆していたのかも知れません。

念願の Solo Medal 😄 : 2019 Data Science Bowl

Public 701th → Private 198th🥉

tawara.hatenablog.com

 Kaggle Days Tokyo のオンサイトコンペでチームメイトに頼りっきりだった反省から、log data (event data) の扱いを実践でしっかり学ぼうと思って参戦しました。最後の最後でやらかしたものの、しっかり取り組んだ上での初めての Solo Medal *44 を獲得という嬉しい結果でした。

「お前、あれほどメモリエラーには気を付けろと...」いや気を付けてはいたんです!ただ pandas とか GroupbyAgg でのメモリ消費の動きを把握し切れていなかったという。でも late sub をしてみると、実は最後の 5 sub にはメダル圏の sub が無かったんですよね。人生は何があるかわからないもの。

umi-log.com

真面目に取り組んでいたおかげで参加できた反省会も、いろんな知見(e.g. lightgbm の weight とか、2nd チームの meta feature の詳細とか) を得られてよかったです!

因みに順序ロジットモデルの追実験はずっと前に終わってるのですが、時間が無くてブログ書けてないのでもうちょっとお待ちください🙏

Shakeup 力を頂けた? : AtmaCup#3

Public 31st → Private 27th

atma.hatenablog.com

developers.cyberagent.co.jp

ニューヨーカーGOTO さんの主催する、前々からずっと参加したかった atmaCup に参戦。結果としては自分の手の遅さを実感することとなりました。これからも精進します。

このとき、直前に DSB2019 で見事 Solo Gold を獲得された pao さん と何となく同じテーブルで作業していて*45、pao さんはここでも見事な shake control で 3位となり、僕は 27位という微妙な結果でした。

pao さんといえば以下の Tweet が有名ですよね。

このときに shakeup ぢからを頂いた... というのは流石に冗談ですが、DSB2019反省会で共有してもらった、マルウェア以降病的なまでに Shake について考えていた 話は本当に参考になっていて、「validation set をちゃんと作るのはめちゃくちゃ重要」と改めて認識させてもらった瞬間でした。

ちなみに pao さんは atmaCup#4 では Public 1st → Private 1st で、もはや王者の風格が漂い始めている...

苦脳し続けた 4 Days😇 / Solo Gold への 4 Days🙏 : Bengali.AI Handwritten Grapheme Classification

Public 124th → Private 10th🥇

www.kaggle.com

 人生何があるかわからないなと実感しました。このパートだけ、ちょっと詳しく時系列で紹介します。

4 days とは言っているものの、自分の手元のマークダウン*46 を見返してみると、構想を立て始めたのは deadline から一ヶ月ぐらい前の 2020-02-15 となっていました。ところが勉強のためのブログ書いてたり DSB の 追実験やったりしてるうちにみるみる時間が無くなり、気づいたら一週間前くらいになってましたね*47。以下はその時に書いたと思われる文章です。

構造を整理しろ. 何故もっと早く始めなかった...この承認欲求の塊めが...

さて、あと一週間も無いので「次の画像コンペに備えた src code 整理 & Kaggle に上げての submission が出来ればいいかなあ」ぐらいの気持ちで、でも取り組むのは全力で、という感じでした。そこから src code の整理に3日ほどかかり*48、5日間を切っている状態での最初の submission が以下です。


solution にも書いているように graphme を group と見なした multi-label stratified group k-fold で split して validation をし、validation したハイパラで最後に 全データ学習 + snapshot ensemble が当初の計画でした。ところが、ある一つの graphme にしか存在しないような component があったりして学習がうまく行かず、計画が早い段階で頓挫してしまいます。

後に知るのですが、これに関しては 1st の deoxy さん が discussion に書いてくださっていたやり方がとても賢くて、これを思いついていればなあという感じです。


ただ開催期間中はこれを思いつかず、上がらない validation score にずっと四苦八苦してました。


Tweet を見て振り返るとわかるのですが、段々とあきらめの境地に入っていきます。


何かもう別の観点で自己肯定して現実逃避し始めてるし。


でも、やっぱり諦めきれませんでした。だから最後の賭けに出ることにしたというわけです。

validation score がちゃんと出せていない上での全データ学習。epoch 数は 終了 3時間前に終わるようにして submission と 選択が出来るようにかつ、3以上の snapshot が取れるように(本当は4行きたかった) 35epoch x 3 に決定という、かなりひどい、分の悪い賭けでした。

Discussion を見る限り train に overfit しても public score はそれなりに出そうだったので、Shake down してもいいから public だけでも上げるかあーという気持ちもあって最後の学習を始めます。

submit (cycle 1).

submit (cycle 2).

submit (cycle 3).


何か思ったより score が上がってきて、荒んだ心が回復してきました。もちろん public が上がっただけですが、元々は学習がうまくできなくて 1700 位とかに居たわけで、それを考えると「良かった~😂」って感じ。こんなこと(↓)を言うくらいには心の余裕が戻りました。

submit (Snapshot Ensemble)

まあそんなこんなで、4日間にしては頑張った方だろうということでかなり気楽な気持ちで private LB の公開を待ちます。「あと24位上がれば銀圏であわよくば Master に...いやでも Validation 出来てないしな😅」ってわけで、まあ銅メダル取れれば御の字かな~という気持ちだったのを覚えています。


実はこの時点で僕自身の結果への興味をほとんど失っていたので、金圏間近に居たいくつかの日本人チームの反応を見たいのと、もし shakeup して金圏に入られたらお祝いしようということで TL に待機してました。そしたら...
            .
            .
            .
            .
            .
            .

... は? 何を... 何を言って...?

いや、でも、流石にあり得ないやろ。と思いつつ LB を見に行くと、
            .
            .
            .
            .
            .
            .


正直訳が分かりませんでした。この時は嬉しさというかショックというかとにかく心の余裕がなくなり、同じく大幅に shakeup した ねずみさんくまさん チームのことに気付けずお祝いするのが遅れたくらいです。

 まだ検証中ですが、要因としては、モデル的な意味では sSE-Pooling と Data Augmentation の仕方が肝だったようで、コンペ的な意味では思ったよりも多くのチームが unseen grapheme をガン無視していたということでした。以下は ねじゅみさんによる解説です。


僕は unseen grapheme 専用に何かしたわけでは無いですが、 seen grapheme に overfit していたわけでもないので生き残ったってことだったみたいです。Data のページに 「test set は unseen grapheme 含んでるよ」って書かれてるんですけど、「流石にここまで public と private で unseen の比率に差があるとは...」というのが参加した Kaggler の気持ちだと思います。

というわけで、長い長い旅路はここに終わり、遂に Kaggle Master になったのでした。

まとめ

 至極当たり前のことを再認識したのですが、僕は僕が積み重ねたもので出来ています。最後の Bengali で用いた手法はどれもこれも過去のコンペで学んだものであり、それが活きてあの順位が取れました。もちろん上位陣が unseen grapheme への対策を怠っていなければ金圏まで上がることは無かったんですけど、純粋にあのスコアを取ることが出来たのは僕自身が積み重ねてきたものによるものです。
 因みに唯一初めて使ったものは sSE Module ですが、実は画像論文 LT 会で知り合ったとある GAN 世界の住人のブログ*49で知ったものです。読んだときは「まあこのモデルの pre-trained があったら使うかもしれんけど、自分で scratch での学習はしないだろうな」と思ってました。知識ってそのとき役に立たないと思ったとしても思わぬところで役立つ場合が往々にしてあって、今回もそうだったというわけです。

 僕が こうやって Kaggle にモチベーション高く打ち込めたのは kaggler-ja のコミュニティのおかげでもあります。本格参戦前の Instacart や Mercari の話であったように、コンペは孤独に参加するのは非常に辛いものがあって、チームを組まないにしても具体的な競い合う相手が居ることはとても重要です。僕の場合、同時期に始めた Kaggler の方々が結構いらっしゃったおかげでお互いに切磋琢磨することが出来たと思っています。
 もう一つコミュニティで本当にありがたかったのは初心者の質問にも丁寧に答えてくださる上位者の存在で、NNの学習関連など非常にお世話になりました。Kaggle Tokyo Meetup #6 の懇親会で、お聞きしたいことがあって smly さんと話したときは「あれ今僕 smly さんと話してるよな?」と結構不思議な気持ちになりました*50。Kaggle Tokyo Meetup は「レベルを問わず Kaggle を楽しむ」という趣旨で開催されており、 kaggler-ja も方針としては同じだと思います。垣根無く交流できると言うのは本当に素晴らしいことです。

 最後に改めて思うことは Twitter でもブログでも Kaggle Discussion でもいいので自分から情報を発信することの重要性です。情報が整理されるというのありますし、自分のことを知ってもらえることで競い合う相手が具体的に見えてきたり、相手からも有用な情報をもらえたりして、非常に良い循環を作ることが出来ます。

以上が、Kaggle に出会ってから 5年弱の人生で思ったことです。特にコミュニティに本当に助けられたと思っています。ありがとうございました!

これからも Kaggle するの?

します。

もし仮に今回の Bengali で Silver を取って Master になってしまった場合はちょっとトーンダウンしたんじゃないかなーと思うのですが、想定外なことに Solo Gold を手に入れてしまいました。これは Grand Master への道が開いてしまったということです。要するに逃げられない。
それに今回のコンペでも僕は、またもや劇的な shakeup と良い成績を取るという中毒物質を摂取してしまいました。まだまだコンペをやることになるでしょう。

てわけで今後は、いつ始まるかわからない iMet2020 へのリベンジと、

sites.google.com

M5 の Uncertainty への挑戦をしようと思っています。

www.kaggle.com

前者は完全に趣味 & 去年のリベンジで、後者は実務的な観点で是非取り組みたいと思っていた内容です。不確実性をテーマとして取り組めるコンペがあるのはめちゃくちゃありがたい🙏

ここまで読んでくださった方々、(この記事の)長い長い旅路お疲れ様でした & ありがとうございました。 Kaggler の皆様、これからも対戦よろしくお願いします!!!

*1:文字数的な意味でも a long long journey になってしまった...

*2:一年くらい前にも一度昔話ポエムを書きましたが、それよりはずっとずっと明るい話です

*3:これは非常にまっとうな話で、特にうちの研究室が応用分野だっただけに、ただ学習・予測するだけでは研究としてダメだろうということです。どのような知見を得るかやどんなコンセプトを示せたかが重要。

*4:https://hkashima.github.io/index.html

*5:このときにご迷惑をかけた先生方、研究室の皆様、本当に申し訳ありません。大変お世話になりました。

*6:https://dl.acm.org/doi/10.1145/3298689.3347018 の First Author。めちゃすごい人。

*7:蟻本にもめっちゃお世話になりました

*8:表現は多少違っているかもしれないですが大意は合っていると思います。

*9:ただし当時途中から海外に行ってしまったのでアドバイザ的役割

*10:因みに結果発表が丁度JSAI2018に参加しているときで、発表を聴きながらめっちゃニヤニヤしてる怪しいおっさんだったと思います。

*11:当時メモリが高かったせいもあって少し高め

*12:たまに使うタクシーみたいな感じ

*13:結局分析コンペ専用になってますが。

*14:ChainerCV のレポジトリとかめっちゃお世話になった

*15:とある結構年上の画像に強い先輩社員の「Adam は Loss を歪める...」というお言葉が未だに頭から離れない...

*16:実装ミスで途中まで Data Augmentation が動いていなかった

*17:もうすぐ就職する

*18:テーブルコンペ、特に Home Credit がえぐかった

*19:もちろんこれは好みの問題で、ReduceLRonPlateu とかを愛用してる方もたくさんいらっしゃいます

*20:国家試験合格おめでとうございます!

*21:コミュ障なので割と強引だったと思います。すみません...

*22:例えば画像サイズが小さいなら、Feature Map が小さくなりすぎるのを防ぐために ResNet の first-conv or その後の max-pool を変更するなど

*23:人力 AutoAugment かな?

*24:もちろんモデルを弄る場合もありますが、タスクに合うようにやりましょうということです。

*25:偶然にも、このとき喋った人の一人は後にチームを組む tamref さんだったりする。

*26:そしてこのあたりから、オンプレマシンがへそを曲げたのか調子が悪くなりだします

*27:バカかな?

*28:この後も懲りずに 3 回ほどやってしまうことになります

*29:e.g. 学習済みモデルで分散表現に落とす → SVD などで圧縮

*30:ちょっと涙ぐむくらい。このパートを書くのが一番しんどかった。

*31:他にもまだまだいらっしゃったんですがスペースの都合上割愛。

*32:最近ちょっとづつ死語になって来てますね。

*33:しかもほぼほぼラップトップ環境で獲得。完全にレジェンド。

*34:autophalanx は真似できる気がしないですが。

*35:ただ最近の論文読んでないので、もっと良いやり方が出ているかもしれないです。

*36:ここも実際はもっと沢山の方々と交流してますが割愛。

*37:琴葉姉妹は良いぞ

*38:実は割と同時期に分析コンペを始めていたみたいです:https://fam-taro.hatenablog.com/entry/2019/11/23/175328

*39:しかしながら参加者のモチベが高いため質が高い

*40:検索すれば様々な方の参加記が出てくるので是非ご覧下さい!

*41:SPA で実装を進めていたものの一つ。

*42:この時点ではまだ調子が悪かった。

*43:この3カ月後くらいに同じページに並ぶことになるとは思いもしませんでしたが笑

*44:え?「ASHRAE は?」って?あれは完全にノーカウントです。実力じゃないので。

*45:チームを組んでいたわけでは無い

*46:イデアとかを振り返れるようにコンペごとに日付と何をやったかの日記みたいなのをつけるようにしています

*47:一応 Discussion とかはチラチラ見てた

*48:ただしやる価値は十分ありました

*49:https://blog.shikoan.com/concurrent_spatial_and_channel_squeeze_and_excitation/

*50:流石に気恥ずかしいので「あなたがきっかけで Kaggle を始めました」とは言いませんでしたが