Magicode logo
Magicode
2

ゼロから作るDeepLearning4をRustで書きながらさっくり学んでいく[1章]

cover

今回使用する参考書

はじめに

2022年4月6日にO'reilly Japanより「ゼロから作るDeepLearning4強化学習編」が発売されました。 そこで人気シリーズの第4段のこの本をRustで再実装しながら読み進めていきます。こまかい内容はぜひ購入して確認してください。 ※zennで投稿したものと同内容です。

強化学習とは(mathworks.com)

1章: バンディット問題

エージェントと環境が相互作用しながらデータを集めながら報酬を得る方法を学習する強化学習。その強化学習の中で最もシンプル、簡単な具体例であるバンディット問題を解くことで、強化学習の特徴を学んでいきます。

バンディット問題

バンディット問題とは、バンディットというある確率でコインを排出する複数のマシンにおいて、どのマシンをプレイすることが最もコインを多く獲得できるのかを探る問題のことです。今回は一定の確率でコインを1枚だけ排出するマシンが複数並んでいることとします。

バンディットアルゴリズムの実装

今回バンディット問題を解くためのアルゴリズム、バンディットアルゴリズムを実装していきます。実装するstructは大きく分けて2つ、バンディットマシン(環境)であるBanditとプレイヤーであるAgentです。

使用するクレート

  • rand: 乱数生成
  • plotters: Pythonのmatplotlibに相当するグラフ描画

struct Banditの実装

今回はコインを排出する確率がそれぞれ乱数によって決定する10台のマシンを想定します。このstructでは事前に乱数によって設定された各スロットの排出率rateとスロットをプレイした際に生成した乱数を比較しプレイした際の乱数が大きければ1を、そうでない場合は0を返すものです。

struct Agentの実装

以下の3種類の変数を有したstruct Agentを実装します。

Qs: 各マシンの価値の推定値を格納する1次元x10の配列(0で初期化) ns: 各マシンをプレイした回数を格納する1次元x10の配列(0で初期化) epsilon: ε-greedy法に則ってランダムなプレイを行う確率を格納する変数

実行&描画を行うmain関数の実装

描画結果

rates
ch01/output/bandit/rates.png

total_reward
ch01/output/bandit/total_reward.png

非定常問題

ここまでは報酬の確率が常に一定でした。これを定常問題といいます。一方で確率が動的に変動する問題を非定常問題といいます。ここからは非定常問題に取り組んでいきます。

struct NonStatBanditの実装

非定常問題を解くにあたってstruct Banditからの変更点は報酬に重み付けをして古い報酬ほど重み付けを小さくするようにすることです。

struct AlphaAgentの実装

struct Agentとの違いは固定値alphaによる更新を行う機能の追加をするだけです。

おわりに

この記事は1章を読んだ段階で書きました。今後も書く章のコードを書いたら次を更新しようと思います。なぜRustで実装するのかって?趣味です。

今回使用したクレート

Discussion

コメントにはログインが必要です。