一記一遊ブログ

大学生活の中で起こった日々の出来事を日記形式で書き溜めていくブログ。現在1回生。

「方策反復」をプログラミング! 前編

今日は大学の課題を空きコマの時間にやっていた。情報系の授業で出た課題で、「方策反復」をやってみるというもの。方策反復とは、と一言で説明するのは難しいのだが、いくつかの行動と、それをした時の結果と報酬が設定されているモデルで、どのように行動を選択すると報酬が1番大きくなる可能性が高いのかを、報酬を計算し、ちょっとずつ選択の仕方を修正してはまた報酬を計算し直すことで求めるというもの。

自分で言っててわけが分からないのでもう少し噛み砕いてみる。まずは、状況として、例えば「右に向かう」と「左に向かう」の2種類の行動パターンが用意されていて、そして選んだ行動によって次の自分の状態が決まる、つまり「自分の現在地」が決まり、その現在地の変化によって設定されていた報酬が与えられるというモデルが与えられているのをイメージしてほしい。数直線上を自分が右に左に動く感じかな。その時に、「もし◯%の確率で右を選択したら」報酬の期待値はどのぐらいになるのかを計算し、◯%の部分をちょっとずつ変えていき、報酬の期待値が最大となる◯%を求めるのが「方策反復」というわけだ。「方策」つまり行動の選択の仕方を変えながら「反復」するってことだな。機械学習的な感じなのかな? 知らんけど。

報酬を求める式や行動のパターンは問題で与えられていたので、それをプログラムで実装して値を実際に求めるのが今回の課題だ。なるほど。やることは明確だ。

言語はpythonを使う。プログラミング入門という講義で勉強している言語であり、僕が今使えるのはこれしかない。割とルールが緩めで、多少雑な書き方をしてもうまく言語側が判断して良い感じにしてくれるのが特徴。あとは、関数などが大量に作られていて、必要に応じて取り込めば数学の計算なども簡単に行えるため、機械学習などでもよく使われている言語なのだとか。

今回はnumpyというライブラリ(関数のセット)を使う。ルートや行列といった数学の演算をできるので便利。問題で与えられた式を、この中の関数を使って再現する。

ここで、問題で設定された報酬の大きさは「現在地」と「とった行動」の2つのパラメータによって変化するものだったため、それをどうやって式に落とし込むか少し悩んだのだが、行列の行と列にそれぞれのパラメータを当てはめ、「現在地が0番地」で「とった行動が1番」なら行列の(0,1)のところに入れてある数を報酬として取り出すという方法にした。こうすることで、直感的に値を指定して報酬を呼び出せるようになるというわけだ。

プログラムが完成したのでいざ、計算。反復と名を打っているぐらいだから1000回ぐらい計算を繰り返して値を求めるのかなと思っていたが、やってみると「計算回数2回」とかの結果が出て、かなり不安になった。まあでも何回やっても同じ結果が出るから大丈夫だよな…。

今回の問題設定が、確率が関与する要素がほぼ無くしてあった簡単なものだったので、そんなにややこしい計算にならなかったというものが真実っぽい。出来上がったら提出用にコードのありとあらゆる部分にコメントをつけまくってその部分で何をしているのか分かりやすくしていく。こういう努力は大事。プログラミングって自分が書いたやつでも後から見ると「ここで何をしてるんだっけ?」と分からなくなるからね。

そうしてコードを見直しているとあることに気づいた。

(後編に続く)

sota9ris.hatenablog.com