はじめに
この記事は、 Kaggle Advent Calendar 2024 の 23 日目の記事です。先日ブルガリアで開催された第 1 回 International Olympiad in Artificial Intelligence ( 以下 IOAI ) に日本代表として参加しました。 IOAI は今年から始まった高校生向け国際大会で、 AI に関する知識、技能を各国から選出されたチーム同士で(注 : 来年以降は形式が変更になり、個人戦になります)競い合います。詳しくは ホームページ を見てください。大会前~終了までの間に(僕視点で)何が起きていたのか、その時何を考えていたのかを書き記そうと思います。
これまで部活等で機械学習関連の様々なことを教えてくださった方々、この分野に没頭するきっかけを作ってくれた kaggle コミュニティ、 IOAI と日本での選考に関わった全ての方々にこの場を借りてお礼申し上げます。貴重な体験をさせていただき本当にありがとうございました。
TL;DR
- IOAI 2024 に参加して practical round で銅メダルを取りました
- scientific round の競技性は少し思うところがあります。日本選手団はそれが原因で不利な影響を受けましたが 10-0 で運営が悪いとは言えない状況だと思います(あくまで個人的な認識です)
- 競技部分以外は最高でした
- 来年も代表として出て、今度こそは金メダルを取れるように頑張ります
About IOAI 、用語集
- IOAI ... International Olympiad in Artificial Intelligence のこと。 AI に関する知識や思考力を世界中からの参加者で、チーム戦で競い合う。今年は scientific round と practical round の 2 つの部門があった。来年以降は今年で言う scientific x2 でメダルを決めるそうです。
- scientific round ... IOI などに近い形式で、ある問題に対して実装をして、 ML, CV, NLP という 3 つのタスクそれぞれのスコアの合計値で競い合う。
- ML ... Machine Learning の略。(恐らく今後もだが)深層学習ではない機械学習に関連するタスクが出される。 今回は特徴量エンジニアリングを競い合った。
- CV ... Computer Vision の略。画像や動画を扱うタスク。今回は画像生成に関するタスクが出された。
- NLP ... Natural Language Processing の略。自然言語処理関連のタスクが出た。
- practical round ... scientific round は Python で実際に実装するタスクだったが、このラウンドは実際に使う側としての技量を競い合おう、というモチベーションの競技。今回はある曲が与えられて、その曲のジャケット写真を適当なサービスで生成 & MV を、画像とプロンプトから動画化するサービスで作る、というタスクだった。来年からはメダルの対象から外されるらしい。
~選ばれるまで
以下日記形式?です。起こったことを時系列順に雑にまとめてます。
機械学習は高 1 の夏くらいから学び始めた。精進時間が確保出来なかったこともあり競プロで実力が頭打ちになってしまったこと、また、他の同期が強すぎたことで競プロ以外の事にも挑戦してみようと思っていた。丁度部誌で競馬予想をしたいと考えていたため、機械学習の勉強をした。その一環として機械学習コンペに出たところ、思ったよりも面白くてのめり込んで行った。翌年の春に初めて kaggle でメダルを取った。
IOAI は 12 月頃に SNS の噂で知って、こまめに情報をチェックしていた。機械学習にハマったタイミングでこのような大会が出てきたのは本当にラッキーだったと思う。 1 月頃に日本委員会のホームページが出来たがそこから暫く動きがなかった。 4 月に入ってようやく選考方法が発表され、今年は一次で書類選考 + 二次で面接だという事が分かった。JOI 等とは少し違う選び方なので書類選考の段階で落とされるのではないかと思ったが、なんとか通ってくれた。面接は補欠決めだろうと思って受かる気満々で行った。結果的に本代表として選出された。後から面接で補欠にすらなれず落とされた人がいるという情報を聞いてヒヤッとした。~ 6/30 (at-home 到着前 )
選ばれた直後に discord サーバーが作られ、他の代表と会話をした。 4/28 に機械学習の勉強会の食事会があり、そこで他の代表 1 人と初めて顔合わせをした。とりあえずエッセイ採点コンペという kaggle のコンペにチームで出て雰囲気とかを確認しよう、ということになった。 5 月は特記事項はなし。
6 月から対面勉強会が始まった。まず全員と顔合わせをした。その後はサンプル問題を解いたり、論文読み会をしたり、各々調べてきた内容で LT をしたりした。大体毎週オフラインで勉強会だった(その後次第にオンラインに移行していった)。7/1 以降(事前課題期間)
7/1-7
1 日に問題が届いた。問題を見ると ML,NLP,CV の構成で驚いた(予想は NLPx2, ML だった)。 自信のある CV が diffusion モデルのファインチューニングで、 kaggle っぽいタスクではなかったので、意表を突かれる形だった。次に見た ML は得意そうな形だった。最後に NLP を見ると、未知言語の文章を匿名化されたクラスに分類をしよう、みたいな話だった。とりあえずパット見の難易度は ML<NLP<<<<CV 。夜に会議をして現状を確認した。
5 日は関西 kaggler 会に参加した。とても楽しかったしためになった。色んな人から日本代表として認識されてしまった(?)ので絶対に金メダルを取って帰ろうと思った。
6 日の午前に東京に戻って、二日連続で勉強会。コーチのありがたい講義を聞いたり、問題の詳細な方針について話したり、 ML のスコアを上げたりした。
7/8-14
担当が ML になった。個人的には ML しかできてない罪悪感があったが、結果的に 1 問 1 人 + 2 問 3 人の形になり、 CV と NLP につぎ込む戦力が多くなったので正解だったと思う。 ML で用いた特徴量は波形データのようなものだったのだが、これの加減乗除などをとりあえず試していた(伏線 1 )。が、上手くいかなかった。一番進捗が出てなかった時期。
14 日に chizuchizu 大先輩が atmacup の類似コンペ と、提出解でスコアに大いに貢献した 上位解法 を発見した。とりあえずこれを実装してみようという話になった。
7/15-21
savgol_filter を波形データに対してかけた後に特徴量を取るとスコアが上がることが分かった。基本的に毎日何らかのアイデアは試していた。あまり記憶にない。
19 日に当面の目標であった簡単な方の小課題で AUC 0.9 を達成した。もう片方も当面の目標であった AUC 0.85 を超えたため、後は最終目標のそれぞれ 0.95, 0.90 を目指すのみとなった。この地点で、他国のスコアこそ見られないものの上位争いには絡んでいることをかなり確信していた。しかし、心の何処かで自分だけ気付いてないマジックがあり、それのせいで負けるのではないか、とも思っていた。
7/22-28
†夏期講習†を受けていた。起床 ->塾行く -> 4h 夏期講習 -> 3h 塾の課題や IOAI -> 3.5h 通常授業 -> 帰宅 -> IOAI、という夏休み感の全くない生活だった。 24 日に practical ラウンドの仕様変更が通達された(え?)。どうやらスポンサーのサービスを使わなければいけないらしい。ワクワク要素が増えた。
ここらへんはもう LB がないのでひたすら己と己のメンタルとの戦いだった。
7/29 - 8/6
ラストスパート。出来ることは全てやりつくす事を目標にしていた。最終盤は、スコアを狙いつつレポートも書かなくてはいけない + 提出用にコードを整形しなければいけないのでそれもやった。 huggingface にモデルを公開設定で提出しているチームが何カ国かあって面白かった。 3 日は関東 kaggler 会に行った。色々なアドバイスや応援をもらえたのでとても気合が入った。他のチームメイト 1 名も一緒だったので現状と残り期間でできることについて話した。
8/4 提出 1 日前。この日は軽い事件が起こった。 ML で pseudo labeling を実験がてら実装したところ
この後ルールを確認したところちゃんとルールに抵触していたため没に。悲しい。最後の実験を回して、提出用ファイルの作成とレポート作成に取り掛かった。この日は深夜までレポート作成をしていた。
8/5 提出日。21 時が締め切り。最後は確認作業をずっとしていた。 NLP はかなりギリギリまで色々試行錯誤していた。 16 時 20 分頃にレポート提出。その後は塾に行った。帰ってくる時に IAIO というパチモンが生えているという話を聞いた。 SNS で知り合った他国の代表と軽く探り合いをしたが、とりあえずどの問題も大きな見落としはないだろうという結論に至った。
本番期間 (8/7 - 8/16)
day0
集まって事前課題の振り返り & 作戦会議をした。具体的には、現状の 3 タスクの立ち位置予想、残りの colab クレジット確認、本番の立ち回りの考案、コードをきれいにしてライブラリ化、延長コードの確認 etc... をしていた。夜は日本食が恋しくなるだろうということで何人かでなか卯を食べた。親子丼が美味しかった。緊張して全然寝付けなかった。
day1
8 時頃起床。二度寝しようと思ったが緊張でできなかった。仕方なく諸々の作業をしながら時間を潰す。 pao さんからありがたい短期コンペのコツのメッセージが来ていたので読み込んだ。
15 時ごろに ML の特徴量抽出をライブラリとして整備したコードの実行をかけて、シャワーを浴びた。シャワーから帰ってきたところ、事前課題で使った google アカウントが運営側で通知無しで止められててびっくりした。
羽田空港には 17 時頃に到着。その後はチームメンバーと引率の委員会の人と合流した後出国ゲートを通過した。出国の手続きが思ったよりあっさりとしてて驚いた。六厘舎のつけ麺を食べて気合を入れた後飛行機に乗った。機内食を食べた後はかがみの孤城の映画を見ていた。物心ついてから初めての海外ということもあり全然寝付けなかった。
day2
着陸前に起床。機内食の朝食がうどんだった。イスタンブール空港からチャーターしたバスでブルガスに向かった。昼頃にホテルに着いた。気候的には東京より涼しくてとても過ごしやすかった(とはいえ、昼間に運動すると汗ばむ暑さではあった)。参加記念のお土産は変換コンセント + T シャツ + リュックサックだった。特に変換コンセントはとてもいいアイデアだと思った。その後は昼食をブラジル代表と食べてブラジルについての知見を得たり、スタバに行ってマン島代表とエンカウントしたり、オランダ代表に部屋に乱入されたりした。時差ボケを直すために早めに寝た。
day3
6 時頃起床。この日の予定は写真撮影をしてから開会式までは何もなかったので近くのスーパーに買い出しに行った。他の代表はホテル併設のジムで筋トレをしていたらしい。空いた時間は at-home task の振り返りをしていた。
開会式はいい感じの劇場で開催された。後ろのアメリカ代表がうるさかった。大学の履修登録の話をしていたっぽい。あとシンガポール代表はずっとゲームをしていた。開会式っぽい事が終わった後に at-home のスコアの分布だけ開示された(自分たちがどこにいるかはわからない)。自分の担当した ML は想定よりも 90/100 を超えているチームが多くて驚いた。その後は、ルールに関する質問コーナーがあったが、そもそものルールが曖昧な上にそれすら把握してない代表団が複数いて会が長引いた。他の日本代表と日本語で愚痴を言っていた。生まれて初めて日本語話者であることに感謝したかもしれない。
day4 - 競技パート
scientific round があった。この競技でメダルを取ることが日本代表の最大級の目標と言えるだろう。制限時間は 8 時間で 3 問の事前課題を発展させたタスクを 4 人で解く、という競技だ。
朝食を食べて会場に移動した。競技が始まるまでの間に at-home task の結果がメールで届いた。 ML 7 位というのを見た瞬間におや?と思った。とはいえ点数換算で 90/100 を超えていたのでまあまあ問題ないと思った。問題は NLP が 15-20 位くらい、 CV が 20 位以下だったこと。これに関しては CV の戦略が弱点のあるものでそこを明確に突かれた感じだった。我々の想定よりもかなり低かったため焦ったが、ルール違反のチームが罰せられていないという欠陥のあるランキングだったため、それが罰せられていたらまた別の結果になっていたかもしれない。 at-home の総合順位は 18 位だった。
競技開始。とりあえず全問見る。
ML は与えられる特徴量の次元が一つ増えただけ。 at-home 同様高得点が狙えそう。
NLP を見る。 at-home と同様のタスクでクラス数が増えているが、 mBERT の学習が許されないらしい。え??
CV を見る。text to image のモデルで、 text に牛が含まれていたら自動的に消火栓を表示させなければいけないタスクらしい。が、案の定というべきか、 model の training は許可されておらず、いじれるのは latent と text embedding だけ。
とりあえず 3 問とも at-home task の延長線上にあるとはあまり言えない状況であった 。
正直ここから何時頃に何がおきたかははっきりとは覚えてないのでそこまで信頼しないでほしい。大体の時系列と起こった事件は恐らく合っているはず。
とりあえず ML で 1 台、その他で 1 台でパソコンを配分した。しかし、開始から 3 時間程たっても目立った進歩が見られなかった。自分は at-home 同様 ML を実装していたが、ずっと誤読をしていた上に、実装にバグを埋め込んでいた。そのため、一旦台を譲って頭を冷やした。その地点で NLP も CV も方針を探りながら実装していたが、 NLP は試そうとした方法を聞けば何でもルールに抵触しているとして禁止される、 CV は全然アイデアもなくスコアも伸びない(この時は知る由もないが 7 割以上のチームがベースラインを超えられない問題であり、個人的には悪問だったと思う)、という状況でかなりチームとしても焦りが出てきた。
5 時間くらい経過したところで、とりあえずの ML のベースラインが出来た。ところが、 LB と CV のスコアに大きな乖離があり困惑した。とはいえ、ベースラインができて一安心して少しずつ焦りが無くなっていった。全問の進捗を一回チームで確認したうえで、 ML はラスト 30-60 分くらいで仕上げる、それまでは CV と NLP で 2 台使おうという話になった。
結局ラスト 1h くらいで ML を仕上げた気がする。手元のスコアを信じて提出した。 CV(Computer Vision problem) はあまり改善しないまま提出することになった。 ML が仕上がったその頃、 NLP の担当者のほうが何やら騒がしかった。どうやら次元削減アルゴリズムをデータに施しててその特徴量を RandomForest に入れると信じられないくらいスコアが上がった、というものだった。CV 0 点がほぼ明らかでありメダル戦略的には多少のグレーゾーンは攻める必要があった上に、勢いもあったため止まること無くそのまま提出した。
day4 - その後
バスに乗って他の代表と話したりルールをもう一回振り返ったりすると、他のチームとルールの解釈が違うことが分かってきた。しかし、チームによって質問の回答が違ったり、ルールの曖昧さで解釈が分かれたり、アナウンスのタイミングが全然違ったり、チームごとに開始時間がバラバラだったり、試験監督が談笑して仕事をしていなかったりと、中々に運営もまずいということが分かってきた(書いた地点でかなり記憶を喪失しているのでまだまだあると思う)。あと問題が良くないという意見も参加者で一致していた。 1 回目ということを差し引いても、である。
とりあえずで部屋に帰ってからは CV のスコアのショックや問題解釈への不安で布団にこもっていた。その後、やけ食いをするために近くのマックに行って持ち帰りをした(伏線 2 )。とにかく自分がもっと声を上げていれば、もっと ML で稼いだり CV で天才アイデアを閃いたりしていれば、という自責の念にかられていて日本に帰りたくなかった。
day5
この日は講演会 + アクティビティだった。講演会はあまり内容を覚えていない(ごめんなさい!)。補欠のうちの 1 人が腹痛で早めにホテルに帰っていた。他国の代表もかなりの人数が腹痛で帰っていた。どうやら前日の夕食の肉が生焼けだったらしい。幸い代表 4 人はマックのお陰で助かった(伏線 2 回収)。
期待していた競技がかなり期待外れで、チーム全員謎テンションだったので、アクティビティのビーチ観光の前半部分で海鮮を食べに行った。その後は普通に海水浴をした(僕は泳いでいない)。ホテルに帰って食事と翌日の作戦会議をして就寝。
day6
practical round があった。 2+2 で別れて、僕は MV 側に配属された。相方がめちゃくちゃ英語ができる人だったのでその人にプロンプトを任せて、自分は適当にアドバイスとかをしていた。 scientific に比べたら圧倒的に仕事をしていない......基準をチェックして得点になりそうなポイントを押さえていった。正直 scientific よりルールが明確でやりやすかった。
競技が終わった後はホテルに一旦帰った後、海沿いの観光施設に行った。夜までパーティーが開かれていた。
ブルガリアの伝統舞踊を見たり、 DJ の音楽に合わせて人々が踊ったりしてた。疲れ果てて他の代表より早く 1:30 に就寝。他の代表は 5:30 くらいに寝たらしい。
day7
午前はアクティビティだった。 city quest (町めぐり)をしていた。他の代表は夜更かしの影響で一部のメンツが来てなかった。ブルガスめっちゃ異国情緒あふれる街だなーと思った。
午後は閉会式だった。 scientific round の得点分布が発表された時は流石に悲しい気持ちになった。また、問題の解説もされた。 ML はデータの加減乗除を brute force すればいい感じの特徴量を引き当てられたらしい。えぇ......(伏線 1 回収)。その後、 scientific round でメダルを取れなかったことが分かった瞬間もとても悲しい気持ちになった。ここらへんから腹痛がかなりきつかった。
practical round の銅メダル発表のところで日本が呼ばれたときは嬉しかったが、腹痛とメダルの色、 scientific round 等々、心の底から喜べる感じではなかったし実感もあまり湧かなかった。そのためか、写真で一人だけ顔が笑ってない感じになってしまった(悲しい)。ともかく、どんな形にせよ第 1 回大会で頑張ってきたメンバーでメダルが取れたというのはとても嬉しかったし、ほっとした。
【#IOAI2024JAPAN 結果速報】
— IOAI JAPAN 国際人工知能オリンピック日本委員会 (@ioai_japan) August 14, 2024
8/9-15 に🇧🇬ブルガリア・ブルガスで開催された第1回国際人工知能オリンピック #IOAI2024 で、🇯🇵日本代表が Practical Round で銅賞🥉を受賞しました! pic.twitter.com/ObZ2Iehs2v
↑右の四人の中で一番腹痛を堪えてそうな顔をしているのが僕です。
また、翌年の開催地が中国だということが発表された。来年代表としていけたらアクティビティ面とか食事とか楽しみだと思った。その後は腹痛と戦いながら適当に海辺で写真撮影をした。ホテルに帰ってすぐにチームで一人だけすぐ寝落ちしてしまった。他国の代表と部屋でボードゲームをする約束をしてしまったので少し申し訳ない気持ちになった(この代表は結局日本代表の部屋に入ってボードゲームをしていたらしい。僕の寝顔の動画が翌朝贈られてきていた)。
day8
5:30 起床、慌てて荷造りをして他の代表を叩き起こして出発した。他の代表は 5:00 くらいまで遊んでたらしい。ほぼ予定通り 6:30 にホテルを出て 12 時頃にイスタンブール空港についた。出国審査後に空港内のフードコートで食事をしたがこれがとても高かった。台風で飛ばなかったらイスタンブール観光!みたいな話をしていたが普通に飛んだ。飛行機のディスプレイに付いている謎ゲームをして、かがみの孤城の続きを見て寝た。行きよりもぐっすり寝られた。
day9
ダイバートせず、普通に成田に着陸した。親と合流して帰宅、流石に疲れ果てたのでゆっくり休んだ。向こうの食事は単調だったので日本食に感動した。あと全体的に清潔感があって感動した。
その後何をしていたか
塾の模試、文化祭、学校の課題研究 etc... をしていたらこんな時期になりました。公開するのが遅くなってしまい申し訳ございません!最近は諸事情で kaggle をする時間がまたちょっとずつ増えてきたのでやりたいです
来年以降に向けて、その他
交流が楽しかったのはそうなんですけど、自分の英語力不足とかを痛感しましたしそこを治したいです。そして、交流と競技は違う向きのベクトルだと思うので、きっちり切り離して考えて、反省するところは反省して、教訓として得られたことはしっかり今後に活かしていきたいと思っています。来年の日本代表の選考形式がどうなるかまだわかりませんが、チャンスが有ればまた日本代表として出たいと思っています。
物心ついてから初めての海外だったこともあり、明確に視野が広がったな、という感覚はあります。とても貴重な体験でした。
終わりに
最後まで駄文を読んでくださりありがとうございました。 at-home 部分と競技部分は来年以降も大事になると思うので多めに書きました。色々ありましたが振り返ると刺激的で楽しかったイベントだと思います。ただ悔しさも忘れてないのでしっかりと来年借りを返したいです。
初回大会ということで色々運営に不備はあったと思います。おそらく scientific round で NN の学習を禁止した理由もモデルの学習時間が競技時間では十分ではない、という意図があってのことでしょう。来年以降どのような傾向になるのかわかりませんが、個人的にはそこの戦略も含めて競技にしたほうが良かったのかな、と思います。先日来年の形式の発表があったのですが、今年よりも問題のチェック体制がしっかりしていそうでしたし、 scientific っぽいラウンド x2 の個人戦でメダルが決まるそうなので、運営と問題に期待しましょう!
問題の公募 がされていたり、 IOAI 日本委員会の委員募集 があったりと、競技者として参加できない人でも IOAI に関わる機会が出てきたので、興味のある方は是非申し込んでみてください!また、競技者として参加してみたい高校生も僕 ( twitter : @onnoboru_ml) に声をかけてくれれば色々話とか対策とかができると思います!ホームページ によると来年は 8 人派遣予定なので今年よりも枠は広いと思います!機械学習、人工知能に強い高校生で来年こそは金メダルを取りましょう!
最後にはなりますが、共に戦ったチームメイト、引率してくださった委員会の方、支えてくださった家族、応援してくれた友人や kaggle コミュニティの方々に心より感謝申し上げます。本当にありがとうございました!