活動記録(2017/7/17-7/23)

競技プログラミング

AGC018

結果 525th, 1269->1305 (パフォーマンス 1526)

Aしか解けなかったし、Aも不完全な考察で出したが、レートは1300超えた。Bは解けてもおかしくはなかったなぁ、といった感じ。

実装

DeepCoder

g2インスタンスでの学習の結果、データセットを増やさないと駄目なのではないかという結論に達した。 大きいサイズのデータセットを作成させようとしたところ、バグを踏んだのでデバッグ中。半日ちょっとで100万くらいのデータセットは作れそうな雰囲気。

DeepCoder追実装記録 (2)

前回: mhiroaki.hatenablog.com

データセット生成の高速化

方法

入力の型(e.g., [Int], [List], [Int, List, List])ごとに別スレッドでdfsすることで高速化

  • 入力の型が異なるプログラム同士はequivalenceの判定を省いているので、データ競合なく並列化が可能
  • CPUでenumerateすることを考えたら、並列度を高くするよりはこの程度のほうが良いという判断

結果

コミットログによれば、20000件ほどのデータセット生成に1100secかかっていたのが、238secになったらしい(確かCore i5-5200U上)

学習

現状

学習データを200000件に増やして、再度学習させている。しかし、やはり過学習起こしているように見える。

f:id:mhiroaki0000:20170723141839p:plain:w300

モデルをシンプルにすると、(E=8, K=128, 変数の意味は元論文参照)lossが0.15あたりでとまってしまう。従って、モデルが複雑すぎるというよりデータがまだ少ないのかなという印象を持っている。

f:id:mhiroaki0000:20170723141832p:plain:w300

その他

学習には、g2.2xlargeインスタンスをスポットインスタンスで利用し、alpha=0.0001としたAdamをOptimizerに、epoch=2500~5000、バッチサイズ500~1000で行っている。

今後

  • N=100万くらいのデータセットを用意し、そこで学習データさせてみる
  • 適当なプログラムで評価
    • 元論文みたいな真面目な評価をする気はまったくない

ARC078 D: Fennec VS. Snuke

arc078.contest.atcoder.jp

解き方

  • 1から`N`へのパス上をまず塗り、その後残りを塗るのが最適解
  • 1Nからの距離でそのマスが黒か白か決まる
    • 1Nの2箇所から幅優先探索して、黒白それぞれの塗られる数を探索

ハマったところ

  • Nヶ所から幅優先探索する方法を思い浮かばなかった
  • パス(サイズO(n))を保存するDFS、BFSはO(N^2)

github.com

ARC078 C: Splitting Pile

arc078.contest.atcoder.jp

解き方

  • カードに書かれている数字の和を求めるのはO(n)
  • 上から1枚取る場合、2枚取る場合、と順々にxyを求めるのは、それぞれO(1)でできる
  • 全部計算してminを求める

ハマったところ

  • xをi32で宣言していてオーバーフロー
    • 定数項を作るときはauto使わないほうが良いかもしれない。

github.com

活動記録(2017/7/10-7/16)

競技プログラミング

ARC 078

結果: 624th, 1280 -> 1269 (パフォーマンス: 1224)

初のレートマイナス.C問題を1回ミス(オーバーフロー見逃し)が直接的な要因.ただ,より根本的にはDを思いつかなかった事の方が問題. アルゴリズムはやはり要勉強.

実装

スポットインスタンス

スポットインスタンスを利用して,

  • ジョブの実行
  • 中断時の状態保存
  • 再開時の状態復元
  • 終了時の自動終了

あたりをできるようにした.

DeepCoder

GPUインスタンス (g2.2xlarge)を試用.c4.xlargeで2時間ほどの学習が15分位になった. 最終的にはスポットインスタンス上でパラメータチューニングするが,いくつかまだ実装がバグっている.

その他

ラップトップの再セットアップ中.

AGC017 B: Moderate Differences

agc017.contest.atcoder.jp

解き方


  • 一つ前のマスより小さくなるマスの数を固定して,その条件のもと達成できるか判定,これをN回繰り返す

ハマった所


  • どれかの値を固定することで高速に判定し,それをn回繰り返す,って発想が出づらい

活動記録(2017/7/3-7/9)

競技プログラミング

ARC 077 (D)

コンテスト中に解けなかったので復習. 10^9+7でmodをとる系統の問題への知識不足がある程度あったし,組み合わせを高速に計算できなかったのも知識不足が主因かなぁ. n!をメモ化する方法は確かに思い付けなくもなさそうだけど,実際コンテスト中に0から作り出せるかと言われると厳しい.

AGC 017

結果: 704th, 1268->1280 (パフォーマンス: 1372)

爆死したがレートは上がった.Bで手を動かすのを躊躇してCの部分点を狙い,そこにも失敗した. BもCも要復習

実装

DeepCoder

OptimzierをSGDからAdamに変えたところ,長さ1のプログラムに対しては上手くいくようになった. 長さ2以上のプログラムに対して学習させるとover fittingしていそうなので今後確認の必要あり.

その他

SIGPX 2.5

DeepCoderの紹介をしつつ,実装の愚痴を喋った.