前回の記事で紹介した通り、OSIC Pulmonary Fibrosis Progressionというコンペ1にて2位を獲得しました。Kaggleでは上位入賞をすると賞金をもらえる代わりに、ソースコードやドキュメントの提出に加え、多くの場合Winner's Callと呼ばれるホストとのWEB会議を行う必要があります。賞金の額や上位入賞者の責務はコンペによって様々ですが、詳細は各コンペの「Overview」や「Rules」ページに記載されているかと思います。OSICコンペにおいては「Rules」中の「11. WINNERS OBLIGATIONS.」「12. PRIZES.」項にて賞金受領に関する規約が書かれておりました。Winner's Callの話ってあまりネットに転がっていないので、今回は結果発表から賞金受領までの流れを共有できたらと思います。

1. 結果発表から賞金受領までの流れ

まずコンペ終了から賞金の受け取りまでの大まかな流れは次のとおりでした。なお、日程に関しては日本時間表記です。

10月6日 結果発表(暫定)
10月7日 順位確定
10月8日 Kaggle運営の人から賞金受領までの流れに関するメールを受信
10月8日 フォームの記入と賞金支払いサイトの登録
10月15日 モデルやドキュメントの提出
10月17日 提出コードに関する質問メールを受信
10月21日 提出締め切り
10月23日 Winner's Callの案内メールを受信
11月6日 Winner's Call実施
11月17日 賞金受領完了

それでは順を追って説明していきます。

2.結果発表と順位確定について

 ご存知かとは思いますが、コンペが終了しますと、「Private LB」が開示され、自身の暫定順位が発表されます。ここで不正やルール違反がないかのチェックが行われるため、最終的に順位が確定するまでに一定時間を要するのが一般的です。ここで自分より上の順位の人が失格となることで少しだけ順位が上がることもあります。OSICコンペでは約1日で順位が確定し、「気付かないところでルール違反をしていたらどうしよう・・・」という不安から開放されました。この順位確定にかかる時間もコンペによってまちまちで、最近私が参加したMechanisms of Action (MoA) Predictionコンペ2では、終了から5日程経った今も順位が確定しておりません。上位入賞者なんかは特にソワソワすることになるとは思いますが気長に待ちましょう。

3.提出書類の準備

 順位が確定した翌朝(10月8日)にKaggle運営の人から賞金受領までの流れに関するメールを受け取りました。内容としては大体次のようなことが書かれておりました。

  • メールに返信して賞金受領とwinners' obligationsについて同意してください(10月9日(多分UTC23:59)まで)

  • モデルやドキュメントの提出を行ってください(10月21日9時まで)

  • Winner’s Informationに関するフォームの記入を行ってください(10月21日9時まで)

 要するに賞金受領の意思確認を行った上で、2週間以内に必要書類を提出してくださいということです。提出するモデルやドキュメントにはソースコードだけでなく、モデルの重みや説明資料等も含まれ、 https://www.kaggle.com/WinningModelDocumentationGuidelines からフォーマットを参照することができます。基本的には次の3つの資料を用意することになります。

  • Model Summary

  • Submission Model

  • Kaggle Winner Presentation

フォームの記入

 フォームの記入は https://www.kaggle.com/competition-close から行えます。詳細はページを見ていただいた方がわかりやすいと思いますが、名前や賞金の分け方、Winner's Callのスケジュールに関する事前確認的な内容を記入します。ここで「Payoneer」というサイト3のアカウントを要求されるのですが、未登録の人はアカウントを作った上で記入します。これについては賞金受領のところで説明します。フォームの記入は私は即日実施いたしました。

Model Summary

 モデルの要約を作成します。私はワードを用いて、先程のページに記載されている内容に沿って作成いたしました。全てをテンプレート通りに作成する必要はないかもしれません。「90-95%ほどの精度になる代わりにもっとシンプルなモデルはないか?」みたいな設問もあり、私の場合はLate Submit等を駆使しながら、軽量モデルを用意しました。要約の作成はそこそこ大変。

Submission Model

入賞した解法をホストが再現できるよう、ソースコードやモデルの提出を行う必要があります。ここでは最終スコアと同様の結果が得られるソースコードの提出が求められており、コンペ参加時から再現性のあるコードを作成しておく必要があります。ちなみに、TensorFlowでは一般的なseed固定だけではGPU計算における再現性の確保ができず、私のコードでは実行の度にほんの少しだけ結果が異なっておりました。「TensorFlowの仕様の関係で実行の度にこれぐらいはスコアが異なるのだが、それでも大丈夫か」というメールを送ったところ、「それぐらいであれば問題ない」との返信が来ました。不安なことがあればすぐにメールした方が良いと思います。

ソースコードは単純なリファクタリングだけでなく、I/O処理に必要なパスをjson形式で指定する必要があったりするため、少々コードの書き換えが必要になってきます。訓練パートと推論パートを分けて提出するのが理想ですが、私の場合はメタデータの訓練はPrivateテストデータの特徴量も含めて行う必要があったため、それらを完全に分離することはできませんでした。Script形式ではなくNotebook形式でコードを記述していたこともあり、全てのドキュメントをテンプレート通りに作成したわけではないのですが、問題ありませんでした。少し大変。

Kaggle Winner Presentation

 Winner's Callのプレゼン資料です。先程のページにテンプレートが載っておりますが、実際にWinner's Callで用いるテンプレートがまた別に用意されたため、実は提出から発表当日までの間に再度作り直しました。微妙に縦横比が違ったりしましたが、コンペによってこの辺の都合は異なるかと思います。解法のキーとなる部分がしっかり伝えられる内容であれば、テンプレート通りでなくても良さそうな感じはしました。そこそこ大変でした。

モデル・ドキュメントのアップロード

 最終的に次のファイルをzipでまとめ、Kaggleのサイト上でアップロードしました。

  • 訓練コード(一部)

  • 訓練・推論コード

  • コードの実行に必要なinputデータ(コンペの公式データを除く)

  • Final Submissionで用いたモデルの重み

  • Final Submissionにおけるsubmission.csv

  • settings.json(I/O処理用のパス一覧)

  • requirements.txt(パッケージ情報一覧)

  • Model Summary

  • Winner's Callのプレゼン資料

ちなみにアップロードはコンペページのteamタブ上で行うことができ、入賞するとアップロードフォームが現れます。チームマージした経験がないので、普段目にしないページですが、恐らく入賞した時しか見ることができないフォームなんじゃないかと思います。アップロード完了後、メールでもその旨を伝え締め切りまでにモデルの提出を無事終えることができました。モデルについてメールで少しだけ質問が届きましたが、特に大きな問題はなかったです。

4.Winner's Call

案内メール

 締切から数日経ってから、Winner's Callの案内メールが届きました。メールには主に次のような内容が書かれていました。

  • Winner's Callの簡単な流れ

  • プレゼン資料の用意をしてほしい

  • スケジュールはこの日時を予定しているが大丈夫か

Winner's Callについては1時間の枠で行うようで、スケジュールについてはホストの都合からか、ピンポイントでこの時間と指定されていました。結局、当日の朝延期になったことが伝えられ、リスケジュールが行われました。プレゼン資料についてはドキュメント作成時に提出しておりましたが、その時に使用したテンプレートとは別のテンプレートが添付されており、念の為同じ内容の資料を新しいテンプレートに移植する形で修正しました。

Winner's Call本番

 最終的に11月6日の夜にWinner's Callを行うことが決まり、ZoomのURLが送られてきました。最初はGoogle Hangoutを利用すると聞かされていましたが、結局Zoomを利用することになりました。Winner's Callについてはどこまで触れて良いのかわからないため、ざっくりとしたことしか書きませんが、ホスト側から20名ほど参加されており、イントロダクションや発表、質疑応答を含め1時間しっかり行いました。質疑応答の時間が最も長く、30分から40分ほど行ったのではないでしょうか。私の場合は、事前に質問があれば送ってほしいと伝えていたため、その際に送られてきた20個近い質問に沿った内容がほとんどでした。会議終了の際に、「残りの入賞者のWinner's Callが終わったら賞金を振り込むので楽しみにしててね」と伝えられ、お礼を言って終了しました。

5.賞金の受領

前述の通り、賞金の受領はPayoneerと呼ばれるプラットフォーム上で行われるのですが、源泉徴収の免除申請のために必要な書類をウェブ上で提出する必要があります。個人か法人かによって記入するフォーマットが異なるのですが、私は個人で受領するため「W-8BEN」と呼ばれる書式のものを記入しました。実はWinner's Callよりももっと早い段階でこの記入を済ませ、実際にPayoneerの方から確認メールまで届いていたのですが、なぜか「未提出だから記入してくれ」とのメールが送られてきました。申請書類の書き方はネットで調べればいくつか出てきますが、ここで免税率やその根拠の提示が求められます。これについては、各国間で結ばれている租税条約と照らし合わせ、今回受領するお金が何と引き換えに発生する利益なのかを記す必要があります。これを調べるのが結構大変でした。ホストの所属国やコンペの目的によって、「賞金」の扱いが異なる可能性があるため、詳しくはご自身で調べていただくかメールで問い合わせるのが良いかと思います。

最終的に11月17日に賞金が指定した口座に振り込まれて、本当の意味でOSICコンペが終了しました。ちなみに仲介手数料等は取られず、当時の為替レートに合わせた額が振り込まれていました。アメリカの大統領選挙のせいでドル円の動きが激しく、地味にヒヤヒヤしましたが、悪くないタイミングのレートが適用されたため良かったです。

6.まとめ

以上、賞金受領までの流れでした。コンペによってはWinner's Callがなかったりすることもあるみたいですが、大体は上記の流れになるのではないかと思います。ソロ参加だったこともあり、仕事もしながら、これらの準備をするのはそこそこ大変でしたが、もらえる額も額ですし、めったにない機会でしたので、良い経験になったかと思います。また賞金獲得できるよう頑張りたいと思います。