強化学習(Q_Learning)を勉強しました

#今回は何をするの？
###最近いいサイトを見つけました。
>つかえる知識をともに学べる場所
>現役エンジニアによる「業務で活かせる」実用的なレシピを見つけよう!
>https://axross-recipe.com/recipes

利用には登録が必要なので、利用するかどうか判断はお任せします。
今回は、上記のサイト様から
>強化学習 QーLearningを実装して宝探しロボットを構築するレシピ | Jolibee 
>https://axross-recipe.com/recipes/36 

こちらを利用させてもらい、学習を行わせていただきました。

#さて、本題です
###まず、強化学習について
>強化学習は、システム自身が試行錯誤しながら、最適なシステム制御を実現する機械学習手法の一つです。

###強化学習手法の一つ、[Q_Learning]
>Q_Learningとは、ある状態の時にとったある行動の価値を、Qテーブルと呼ばれるテーブルを管理し、***行動する毎に値を更新していく強化学習の手法です。***

###どうすると、Qテーブルになるの？
>学習時にはQテーブルを更新していくことで、学習済みモデルはQテーブルとなります。

###Q_Learningはどんな時に不向きなの？
>Q_Learningは、単純な仕組みで動く強化学習の手法ですが、連続的な状態が続く場合は、Qテーブルが膨大な計算量になってしまうため不向きです。

#Q_Learningを理解する
###Q_Learningを例に挙げると？
>Q_Learningは意思決定プロセスです。道があるとして、安全な右を選ぶか、危険な左を選ぶか。どちらかを選択する意思決定プロセスと似ています。(参考にさせていただいているものとは説明がかなり違います)

例に挙げたものだと、「安全な右」を選ぶか、「危険な左」かの二つの選択肢があります。最初は特に危険もなくただ進んでいるだけなので、リスク(自分の死、不利益など)はありません。もちろん別れ道の先は「安全」か「危険」かは最初のうちはわかりません。
なので、別れ道で「危険な左」を選んだとしても、すぐに「進む」という報酬は得られます。ですが、途中で「危険が伴います」これはリスクを被ったということで、記憶に深く残ります。「進む中で、危険な道(左)」を進むという行為は「ネガティブな行為」として脳内にインプットされます。

###決定の仕方
別れ道に入る前の状態を現在の状態として仮定します。これを(s1)とします。次に、「安全な道(a1)」と「危険な道(a2)」、二つのアクションがあります。
先ほどの例の経験によれば、s1の状態では、a1を選択することで潜在的な報酬は、a2よりも大きくなる。

数字に置き換えると、Q(s1,a2)= -2、Q(s1,a1)= +1。したがって、次にアクションとしてa1を選択する。

これで、状態がs2に更新されます。その時点も同じ2つのアクション オプションがあります。上記のプロセスを繰り返して、Q(s2, a1)とQ(s2, a2)の値が計算され、その中で大きい方を選択します。次に、状態s3も同じ様に続きます。Q-Learningはこの方法で意思決定を行います。

###結論、Qテーブルって何？
このように、Q(s,a)を一つテーブルにまとめて、そのテーブルを「Qテーブル」と呼びます。

#Qテーブルがどのように更新されるの？
###Qテーブルの更新
先ほどの例に戻ります。例えば、今はs1の状態にあります。その時Q(s1,a1)の方が大きいため、a1のアクションを選択します。続いて、状態はs2に移動しました。そして、意思決定用のQテーブルの更新が始まります。

その更新は、s2の状態からs3の状態へ移動はしません(実際のアクション選択は行いません)。
ただし、s2の状態で全てのアクションが実行されることを想像します。どのアクションからの報酬が最も大きいかを確認します。

例えば、Q(s2,a1)はQ(s2,a2)より大きいので、Q(s2,a1)に減衰係数γ(gamma)を掛け算して、プラスs2に到達する時の報酬R(移動が終わっていないため、その時のR=0)。

その報酬Rが確実にもらえるため、そのRをQ(s1,a1)の現実値とします。そして、先ほどのQテーブル上のQ(s1,a1)から推定した値を予測値とします。現実値と予測値の差、掛ける学習率α(alpha)、プラスQ(s1,a1)までの報酬、その計算結果が新しい値として更新されます。

注意：先のプロセスは全部想像で行っているので、s2の状態からまだアクションを選択していません。s2更新が全部終わったら、アクション選択を開始します。

これは、off-policyのQ-Learningの意思決定方法です。

#まとめ
###式を確認してみる
![スクリーンショット 2020-09-26 14.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666895/5384d7d8-af06-3e5e-6d1d-71adeaf643a4.png)
上記の画像より、式をまとめてみましょう。
*r+γmaxα'Q(s',α') => Q(s1,s2)* :現実値
*Q(s,a) => Q(s1,a1)* :予測値
*ε-greedy* => アクション選択用のハイパーパラメータ
*ε* = 0.9の時、90%は貪欲法でアクション中の最大値を選択する、10%はランダムでアクションを選択する。
*a* => 学習率(現実値と予測値の誤差からどのくらい次のステップに影響するか)

###これにより、考えると
>Q(s1)の式を置き換えてみると、*Q(s1)=r2+γr3+γ2r4+γ3r5+γ4r6+...*。
ここの*γ=1*の時、s1の状態から終了まで全ての報酬を全部見えて、このステップのアクションに大きく影響を与えます。反対に、*γ=0*の場合、今目先の報酬しか見えない、この先の報酬がどのように高くても、今の意思決定には影響しません。

###細かい補足
今回勉強させていただいたものを自分なりにまとめるために作成しましたが、例にあげたものがあまり具体的ではないので今後修正する可能性があります。

・*ε-greedy*
>貪欲法(*greedy algorithm*)は、アルゴリズムの一種、欲張り法(よくばりほう)、グリーディ算法(グリーディさんぽう)ともいう。
>貪欲法は局所探索法と並んで、近似アルゴリズムの最も基本的な考え方の一つである。
>https://ja.wikipedia.org/wiki/%E8%B2%AA%E6%AC%B2%E6%B3%95

※読み返して修正することがあります。ご容赦ください。

#最後に挨拶
どうも、組込みエンジニアとして、とある企業におります粉です。

・では、組込みエンジニアですがAIエンジニア、機械学習エンジニアとして転職したいので、自身でいろいろと勉強を行っております。

・さて、なんでAIエンジニアや機械学習エンジニアになりたいの？と疑問をもたれる方も多いと思いますので、簡単に説明させていただきます。
１、元はAIを作ってみたい、社会問題、労働に関してもっと働きやすい環境が必要なのではないか？と考えたため様々な課題をAIなどの先端技術でアプローチをかけてみたいと思い、AIエンジニアを目指しました。
２、ですが、今やっているのは組込みエンジニアのため、使用する技術、言語が違うといったことから、独学でやってみようと思いまして、最近勉強をはじめました。
３、転職を目指す、自身の夢を叶えたいという願いもありますので、こうやって学んだことを記事しています。

・いろいろとお話ししましたが、まずは、私よりも知識、技術が豊富な先輩方から多くのことを意見、修正点、アドバイスをいただけることを楽しみにしています。

・まだまだ新参者、理解が足りていない部分もあるので記事を書きながら、修正を繰り返して理解を深めれればと思っております。(AIを研究している企業や研究機関に転職したいです。

・こんな手法もあるぞ、やり方はこうだ！！などの意見も募集しております。