DeepCoder追実装記録 (2)
データセット生成の高速化
方法
入力の型(e.g., [Int], [List], [Int, List, List])ごとに別スレッドでdfsすることで高速化
- 入力の型が異なるプログラム同士はequivalenceの判定を省いているので、データ競合なく並列化が可能
- CPUでenumerateすることを考えたら、並列度を高くするよりはこの程度のほうが良いという判断
結果
コミットログによれば、20000件ほどのデータセット生成に1100secかかっていたのが、238secになったらしい(確かCore i5-5200U上)
学習
現状
学習データを200000件に増やして、再度学習させている。しかし、やはり過学習起こしているように見える。
モデルをシンプルにすると、(E=8
, K=128
, 変数の意味は元論文参照)lossが0.15あたりでとまってしまう。従って、モデルが複雑すぎるというよりデータがまだ少ないのかなという印象を持っている。
その他
学習には、g2.2xlargeインスタンスをスポットインスタンスで利用し、alpha=0.0001
としたAdamをOptimizerに、epoch=2500~5000
、バッチサイズ500~1000
で行っている。
今後
- N=100万くらいのデータセットを用意し、そこで学習データさせてみる
- 適当なプログラムで評価
- 元論文みたいな真面目な評価をする気はまったくない
ARC078 D: Fennec VS. Snuke
ARC078 C: Splitting Pile
解き方
- カードに書かれている数字の和を求めるのは
O(n)
- 上から1枚取る場合、2枚取る場合、と順々に
x
とy
を求めるのは、それぞれO(1)
でできる - 全部計算してminを求める
ハマったところ
x
をi32で宣言していてオーバーフロー- 定数項を作るときはauto使わないほうが良いかもしれない。
活動記録(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
解き方
- 一つ前のマスより小さくなるマスの数を固定して,その条件のもと達成できるか判定,これを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の紹介をしつつ,実装の愚痴を喋った.