~前回までのあらすじ~
コンテスト中に最終順位を推定したくなり、それをするにはコンテスト中にDiffを推定すればよいことが分かった。
先行研究
コンテスト中にdiffを推定するということ自体は、すでにいくつかの先行研究がある。本項では、DEIM2020にて発表のあった「競技プログラミングコンテストにおけるタスクの難易度のリアルタイム推定*1」という論文で取られている手法の一つを紹介し、それの改善点について考察をする。
手法
まず、正解率pをレートとdifficultyの関係より導出される式 より定めた。
そして、「時間毎に各参加者が提出を行い、確率で正答を得る。また、コンテスト参加者があるタスクに自分の解答を繰り返し提出し,正答であるという判定を得るまでにかかる時間が指数分布に従う。」というモデルを基に推定を行っていた。この場合の尤度関数は、指数分布の確率密度関数を用いて
と定められる。これの最大化については、尤度関数の対数を取り
とした関数を最大化することと同じになる。これは、について偏微分した
が0となるようなを離散的な各について求め、それによってを求めることで擬似的に実現できる。
そのようなは
と表せるので、(1)式は
と表すことができる。
問題点
このモデルの問題点について考察する。
まず、各人がコンテストを通して解答できる時間の期待値をとしているが、それの根拠となる仮定である「時間毎に提出して確率で正答を得る」という点について。を算出するのに用いているdifficultyの定義は「全体で正答できる確率が50%になるようなレート」であるが、この仮定の下では全体での正答確率がとならないため、これは定義を満たしていない。
また、確率分布が以上の仮定に従うとすると離散的な指数分布を取ると考えられるが、その仮定とは別に指数分布となるモデルを考えているため、複数のモデルが並立していることになっている。
また、レート毎の解答時間の分布に指数分布を用いているが、レート毎の解答時間の分布は対数正規分布になることが観察と考察によって確かめられる。
よって、本記事では対数正規分布を解答時間の分布として用いて推定を行ってみたいと思う。
正規分布による推定
difficultyの定義より、レートの人が難易度の問題を終了時刻において正答できている確率は
と表せる。
ここで、あるレートにおいて正答を得られるまでの時間は対数正規分布に依り、すべてのについて対数スケールでの分散が一定であると仮定する。
そのため、あるレートに対して対数スケールでの解答時間の中央値が、同じく分散がのとき、時間に対する確率密度関数は
となる。
ここで、正規分布は尺度のロジスティック分布に近似できるため、そのような近似を用いてをの式で表すことを考える。この,は、時間に対する対数ロジスティック分布の累積分布関数とレートあたりの正答率の式(2)より、
という式に従う。
以上より、をに対する式として表すと、
となる。ここで、簡便のためにとする。
これを時間に対する確率密度関数に代入すると、
となる。上式より、尤度関数を
と定める。対数を取ると、
となる。について偏微分すると、
となり、上式の偏微分が0になるためにが満たすべき条件は
である。これを満たすようなを離散的な各について求め、それぞれについてを求めた後、これが最大値をとるを擬似的な最尤推定量とする。
についての項はとしか出てこないことから、実装においては非負と仮定しても結果は変化しないことを利用すると良い。
実装,性能評価
以上のモデルを既存手法とともにC#にて実装をし、比較をした。実装は以下のリンクよりgistにて閲覧できる。
AtCoderからのデータ取得周りは外部の自作ライブラリに依存してるのでこれ単体では動かないです · GitHub
ABC170 | 旧モデル | 提案モデル | difficulty |
---|---|---|---|
A | -163 | -1000 | -3425.5 |
B | 14 | -792 | -872.4 |
C | 233 | -414 | -166 |
D | 274 | 323 | 1033.5 |
E | 625 | 805 | 1466.4 |
F | -240 | 1261 | 1913.6 |
ABC171 | 旧モデル | 提案モデル | difficulty |
---|---|---|---|
A | -205 | -985 | -2837.3 |
B | -77 | -1000 | -1340.5 |
C | -261 | 119 | 466.3 |
D | 38 | 115 | 422.3 |
E | -1000 | 308 | 733.7 |
F | 614 | 1035 | 1721.5 |
ABC172 | 旧モデル | 提案モデル | difficulty |
---|---|---|---|
A | -167 | -1000 | -7393.8 |
B | -60 | -1000 | -1410.4 |
C | 704 | 347 | 877.7 |
D | 17 | 351 | 944.7 |
E | 710 | 961 | 1877.9 |
F | 553 | 1368 | 2158.5 |
旧モデルは収束するのは低難度帯に限られるが収束は早い。一方、提案モデルでは難易度によらず推定を行えているが収束はあまりしているようには見えない。
また、提案モデルでは解がほぼ確実に下方向にズレているのが課題である。そのため、どの程度ズレているのかを確かめてみた。
すると、新ABCに限ってサンプリングしたデータではあるが、実データと推定データが比例しているという傾向が全diffについて見られた。つまり、最終推定値に1次関数による補正をかけたらこのモデルはそこそこな精度になるということである。
ここまで綺麗なズレが観測されるとなると、ここには何らかのモデル自体の欠陥が絡んできているのではないか?と思えてしまう。そのため、ズレがどこから来ているのかということを今後調べていきたいと思っている。
また、ABC/AGC/ARCそれぞれについて同様に調べてみると、グラフのかたむきは0.72程で変わらずに切片のみが変化していることが分かった。
おわりに
尤度関数と偏微分の式変形がかなり美しい結果に落ち着いたので、かなり満足しています。ただ、実装してみた結果うまく行かなかったので、とりあえず進捗を書くだけ書いておいて本業(競プロ)をしようという不純なモチベーションより筆を取り始めました。しかし、その途中で気まぐれでデータを比較してみるとかなり綺麗なズレが観測できたのでもう一歩な気もしてきました。もう少し頑張ってみます…