# 強化学習やってみた [53代アドベントカレンダー](https://adventar.org/calendars/3260)も10日目となりました。担当しますのは、53代TNKです。今回のテーマは強化学習です。強化学習にも、いくつかアルゴリズムがあるんですが、今回はQ学習というものをやってみました。 ## CartPole問題を解いてみる  CartPole問題とは、ざっくり言うと「小学生が掃除の時間にやってる、ほうきを手に持ってバランスをとって、できるだけ長くバランスを保つ遊び」です。それを単純化すると、以下のようになります。重力などの力が働く二次元平面上に、動く点があって、その上に棒が乗っています。点をうまく動かすことで、どれだけ長い時間棒を倒さずにいられるかというのが、CartPole問題です。 ## 使ったもの python3.7 openAI gym 他、物理演算や描画のライブラリ openAI gymには、チュートリアル?なのか、CartPole問題の環境が初めから入っていて、簡単に実行することができます。 ## 実行結果 ![](https://i.imgur.com/E9th6hB.png) ググってもらえれば動画はでてくるので、動画は載せませんが、雰囲気は上の画像の感じです。始めはすぐ倒れてしまうんですが、学習が進むと倒れないようになります。学習成功ですね。 ## 仕組みとかざっくり解説 これもググってもらった方が良いと思うんですが、初心者の視点からかいてみます。(誤りがございましたらご指摘いただけたら感謝します)。Q学習っていうのは、これまたざっくり言いますと、「何度も試行を繰り返す中で、良い結果につながった行動に報酬を与える、というのを繰り返すことで、最終的に良い結果ににつながる行動が選択されるようになる」って感じの方法です。なんのこっちゃって感じですよねw。順を追って説明します。  まず、「行動」ってのをどうやって表現するかです。結論からいうと、配列で表します。実はあと一つ、「状況」ってのが必要です。「行動」と「状況」の組に対して、「報酬(Q値といいいます)」を対応させれば、行動と結果のつながりを表現できます。つまり、行動と結果で表を作って、表のマス目にQ値を書き込んで、そのQ値を更新していけばよいのです。では「行動」から。今回だと、「棒を載せている物体を左右方向にどのように動かすか」が「行動」に相当しますよね。表は無限にはつくれないので、「右に速く動かす」、「右に遅く動かす」、「左に速く動かす」、「左に遅く動かす」というように、適当に離散化して表現します。「状況」も同様に、「棒が右に少し傾いた」、「棒が右に大きく傾いた」、(以下略)というように、離散化して表します。そうすると、以下のような表をQ値で埋めていくことになります | 行動\状況 | 右に少し | 右に大きく | 左に少し| 左に大きく| | -------- | -------- | -------- |-|-| | 右速 | -100| | || | 右遅 ||||| | 左速 ||||| | 左遅 ||||| これで、「OOのとき、OOする」というのを表すことができました。例えば一番左上のマスに入るQ値は、「右に少し傾いている」状況のときには「右に速く動かす」という行動をしたときの報酬を表します。  次に、Q値をどうやって更新していくかです。例によってざっくりと。↓の式にしたがって更新します。(丸投げ) Q[s, a] = Q[s, a] + a * (r + γ * max(Q[s_next, a_next] ) - Q[s, a]) sはsituation(状況)、aはaction(行動)です。aとγは、定数です。うまく決めましょう。rは、その行動をしたときにもらえる報酬です。つまり、単に報酬rを足してるわけじゃないってことですね。γは、割引率と呼ばれる定数です。γがかかっているのは、次の状況になったとき最も良い行動をしたときのQ値ですね。これはどういうことか説明します。ある状況sにおいてある行動aをしたら、良い結果になったとします。もちろんそこには報酬を与えますよね。でも、良い結果をもたらしたのはその行動だけではないですよね。もちろん、状況sになる前の、状況(s-1)での行動(a-1)も良い結果に寄与しているはずです。これにも一部報酬を与えましょう([s,a]の報酬のγ倍)をいうことです。もちろんγは0以上1以下の値です。  こんな感じで、Q値の表(Qテーブル)の更新を繰り返していけば、良い行動に高いQ値がつくようになるというわけです。拙い文章ですが、少しでも理解の役に立てたら幸いです。 ## 次回予告 次回は、53代はしどい君の「絶対入れろ!AviUtl外部スクリプト8選」です。AviUtlってのは動画編集ソフトですねー。私はややこしくて今まであまり触ってこなかったので、とても楽しみにしております。では、また明日ー!