今週からGUI操作のプログラミングを始めている。
今週やったこと
結局、機械にGUIを直接いじってもらうのがわかりやすいなという考えになって、GUIを操作させるプログラムを書いている。
当面の目標としては「スクリーンショットを入力、マウス操作を出力としたできるだけEnd-to-Endなニューラルネットワークで将棋所を直接操作して指し、強化学習をしてランダム指しエージェントに勝つ」になるかと考えている。これを向こう1,2年くらいで達成できれば。
GUI操作のプログラム自体は、UbuntuのC++ならxlibを使えばそこまで大変でもなかった。ただ、学習がとことん大変に思えるのでまだまだ将棋をやる段階ではないと思い、まずはSiv3Dでマウス操作を必要とする簡単なタスクを実装して、それを強化学習で解かせるところから始めている。
【タスク】ランダム位置に出現する青い丸の中をクリックすると報酬が得られる。1回青い丸をクリックすると別のランダム位置に飛ぶ。(なんかFPSのエイム練習みたいだ。最初はもっと小さい丸にするつもりだったが、あまりにもランダムエージェントが報酬を得られないので丸がどんどん大きくなってきた……)
ちゃんと方策勾配ベースの強化学習を実装したのは初めてなので、わりと苦労している。今はなんとかギリギリ学習できたような気配があるという段階。
方策勾配だけでなく、今回エピソードという区切りを設けていないので非エピソディックな設定というのも初めてになっている。報酬に割引が必要というのをようやく実感した。将棋みたいなエピソード区切りが明確なゲームだと割引を考える必然性はあまりないからなぁ。
今は離散行動で学習させているが、本当はカーソル移動を連続値にしたい。その他やりたいことはポツポツと。
Pythonが全然好きになれなくて、こういうプログラムでもC++を担ぎ出してくることになるのは結局良くないのではないかという気はしている。今後「なんらかの学習済みパラメータを元にして学習を始める」ということをやりたくなったときにかなり面倒くさそう。このあたりどうするか。
競技プログラミング
- ARC:パフォーマンス1356 レート1680(-31)
- とうとう1600台まで落ちてきた。直近6コンテスト連続でマイナス!
- ABC:unratedにならなければ久しぶりにプラスになりそう。E問題で詰まったときわりと早めにF問題読みにいったのが良かった
- AHC:理由は自分でもよくわからないが、全くやる気が出なかった。
その他
少しずつ、休日に自分のやりたいプログラミングができる状態になってきている。強化学習の勘所をもっと理解したいと思いつつ、でもやっぱり強化学習って本当に効率良いのかなという疑いも強い。まぁいろいろ見つつですか。