DQN(Deep Q-learning)入門教程(二)之最優選擇

在上一篇博客:DQN(Deep Q-learning)入門教程(一)之強化學習介紹中有三個很重要的函數:html

  • 策略:\(\pi(a|s) = P(A_t=a | S_t=s)\)算法

  • 狀態價值函數:\(v_\pi(s)=\mathbb{E}\left[R_{t+1}+\gamma \left(S_{t+1}\right) | S_{t}=s\right]\)app

  • 動做價值函數:\(q_{\pi}(s,a) = \mathbb{E}_{\pi}(R_{t+1} + \gamma q_{\pi}(S_{t+1},A_{t+1}) | S_t=s, A_t=a)\)函數

兩個價值函數分別表明了某個狀態的價值,和在狀態\(s_t\)下作某個action的價值。而策略函數就是咱們須要進行求解的。由於對於咱們來講,確定是但願某個策略可以獲得最大的價值。好比說,你會選擇努力學習而不是去網吧,以得到棒棒糖的獎勵。學習

通常來講,比較難去找到一個最優策略,可是能夠經過比較若干不一樣策略的優劣來肯定一個較好的策略,也就是局部最優解。字體

​ ——強化學習(二)馬爾科夫決策過程(MDP)ui

最優策略

首先,咱們知道「好的策略產生好的價值」,所以策略的好壞能夠經過價值的大小來比較。咱們定義最佳的策略是 \(\pi_*\) ,而咱們的目的就是爲了尋找這個 \(\pi_*\)lua

  1. 最優狀態價值函數:表明全部策略下產生的不一樣狀態的狀態的價值函數中的最大值spa

    \[v_{*}(s) = \max_{\pi}v_{\pi}(s) \]

  2. 最優動做價值函數:表明全部策略下產生衆多動做價值函數中的最大值3d

    \[q_{*}(s,a) = \max_{\pi}q_{\pi}(s,a) \]

    怎麼理解這個最優動做(行爲)價值函數呢?我的以爲(若是有錯的話,歡迎在評論區留言告訴我)

應該是這樣的:

目前咱們有一個最好的策略 \(\pi_*\),它必定可以保證咱們得到最好的分數。咱們在\(t\)時刻執行的動做是\(a\),而後在接下來的時刻,執行的策略都是 \(\pi_*\) ,所以\(q_*(s,a)\) 必定是在當前狀態\(s\)下可以執行\(a\)可以得到最好的分數了。那麼,他有什麼含義呢?它能夠表明在當前狀態執行\(a\) 動做好很差。好比說\(q_*(s,a_1) > q_*(s,a_2)\) 則就表明\(a_1\)\(a_2\)好,由於它可以得到更多的獎勵分數。

  1. 兩個之間的關係:

結合下圖,咱們能夠知道:

\[v_{*}(s) = \max_{\pi}v_{\pi}(s) = \max_{a}q_{*}(s,a) \\ q_{*}(s,a) = \max_{\pi}q_{\pi}(s,a) = R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{*}(s') \]

實際上,尋找最優策略的過程就是尋找最優動做的過程:選取一個\(a\)使得\(q_{\pi}(s,a)\)最大。針對於最優策略,基於動做價值函數咱們能夠定義爲:

\[\pi_{*}(a|s)= \begin{cases} 1 & {if\;a=\arg\max_{a \in A}q_{*}(s,a)}\\ 0 & {else} \end{cases} \]

最優策略實例

下圖是UCL強化強化學習課程的一個實例,黃色圓圈的開始狀態,紅色方塊的是結束狀態。\(R\)表明reward,每個狀態能夠執行的action爲紅色字體(例如Facebook,Study等等),其中黑色的點分支對應的數字表明執行這個action以後的狀態轉移機率。

咱們設衰減因子:\(\gamma = 1\),由於每個state都只對應2個action,所以,咱們設初始策略\(\pi(a|s) = 0.5\)。其終點(也就是\(s_5\))沒有下一個狀態,同時也沒有相應的動做,由於咱們定義其價值爲\(v_5 =0\)

這裏復說一下狀態價值函數的定義:\(v_{\pi}(s) = \sum\limits_{a \in A} \pi(a|s)(R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{\pi}(s'))\)

  1. 針對於\(v_1\)\(v_1 = 0.5*(-1+v_1) +0.5*(0+v_2)\)
  2. 針對於\(v_2\)\(v_2 = 0.5*(-1+v_1) +0.5*(-2+v_3)\)
  3. 針對於\(v_3\)\(v_3 = 0.5*(-2+v_4) +0.5*(0+v_5)\)
  4. 針對於\(v_4\)\(v_4 = 0.5*(10+v_5) +0.5*(1+0.2*v_2+0.4*v_3+0.4*v_4)\)

解得方程組爲:\(v_1=-2.3, v_2=-1.3, v_3=2.7, v_4=7.4\)

上面是咱們固定了策略\(\pi(a,s) = 0.5\)獲得得每個狀態得價值函數,所以上面的到的\(v\)極可能不是最大的價值函數,由於這個策略不是最好的策略。

尋求最佳策略就是尋找最佳得動做價值函數,所以咱們若是可以獲得最優動做價值函數,也就獲得了策略 \(\pi_*\)

仍是以上面得那個例子爲例,經過求解每個action對應得\(q_*(s,a)\)。而後就能夠獲得最優策略。(策略即爲\(s_2 \rarr s_3 \rarr s_4 \rarr s_5\)

下圖中的9.4應該爲8.4

求解過程以下所示,過程稍微有點多,實在是很差使用Latex進行說明,就使用草稿紙進行推導了。

上面的部分是咱們人爲的推導方法 ,電腦確定沒有咱們這麼聰明,那麼對於電腦來講,應該怎麼進行推導呢?

求解方法

求解方法有不少種,下面將介紹一種最基本的動態規劃算法。

動態規劃

當問題具備下列兩個性質時,一般能夠考慮使用動態規劃來求解:

  1. 一個複雜問題的最優解由數個小問題的最優解構成,能夠經過尋找子問題的最優解來獲得複雜問題的最優解
  2. 子問題在複雜問題內重複出現,使得子問題的解能夠被存儲起來重複利用,也就是說子問題之間存在遞推關係,經過較小的子問題狀態遞推出較大的子問題的狀態。

而強化學習恰好知足這個。爲何呢?由於bellman方程:

\[\begin{equation} v_\pi(s) =\mathbb{E}\left[R_{t+1}+\gamma v\left(S_{t+1}\right) | S_{t}=s\right] \\ v_{\pi}(s)=\sum_{a \in A} \pi(a | s)\left(R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} v_{\pi}\left(s^{\prime}\right)\right) \end{equation} \]

咱們能夠將求解每個狀態的價值函數定義爲子問題,由於遞推的關係,咱們可使用上一此迭代獲得的價值函數來更新此時的價值函數。(妙哉!!!)

強化學習有兩個基本問題:

  1. 預測(Prediction):對給定策略(\(\pi\)),獎勵(Reward),狀態集(S),動做集(A),和狀態轉化該機率(P),衰減因子(\(\gamma\)),目標是求解基於該策略的價值函數 \(v_{\pi}\)
  2. 控制(Control):尋找一個最優策略的過程(實際上就是尋找最優的價值函數)。對給定獎勵(Reward),狀態集(S),動做集(A),和狀態轉化該機率(P),衰減因子(\(\gamma\)),求解最優價值函數 \(v_*\) 和最優策略 \(\pi_*\)

策略評估求解預測問題

首先,咱們來看如何使用動態規劃來求解強化學習的預測問題,即求解給定策略的狀態價值函數的問題。這個問題的求解過程咱們一般叫作策略評估(Policy Evaluation)。

策略評估的基本思路是從任意一個狀態價值函數開始,依據給定的策略,結合貝爾曼指望方程、狀態轉移機率和獎勵同步迭代更新狀態價值函數,直至其收斂,獲得該策略下最終的狀態價值函數。

—— 強化學習(三)用動態規劃(DP)求解

首先假設咱們已知第\(k\) 輪的狀態價值函數,那麼咱們就能夠獲得第\(k+1\)輪的狀態價值函數:

\[v_{k+1}(s) = \sum\limits_{a \in A} \pi(a|s)(R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{k}(s')) \]

同時又能夠簡化爲:

\[\begin{equation}\mathbf{v}^{k+1}=\mathcal{R}^{\pi}+\gamma \mathcal{P}^{\pi} \mathbf{v}^{k}\end{equation} \]

這裏引用Planning by Dynamic Programming中的一個例子:咱們有一個4x4的宮格。只有左上和右下的格子是終止格子。該位置的價值固定爲0,個體若是到達終止格子,則中止移動。個體在16宮格其餘格的每次移動,獲得的即時獎勵\(R\)都是-1,若往邊界走,則會返回到原來的位置(也就是下一個狀態仍是原來的地方)。個體只能上下左右移動,每次移動一個位置。衰減因子\(\gamma = 1\)\(P=1\)。給定的策略是隨機策略,每一個方向的移動機率是\(0.25\)

  • K=1時:

    第一行第二個:

    \[\begin{equation}\begin{aligned} v^{(1,2)} &= 0.25[(R +v^{1,0}) + (R +v^{1,1}) + (R +v^{1,2}) + (R +v^{2,1})] \\&= 0.25\times[(-1 + 0) + (-1 + 0) + (-1 + 0) + (-1 + 0)] \\&= -1 \end{aligned}\end{equation} \]

    其餘同理,結果如圖所示。

  • K=2時:

    第一行第二個:

    \[\begin{equation}\begin{aligned} v^{(1,2)} &= 0.25[(R +v^{1,0}) + (R +v^{1,1}) + (R +v^{1,2}) + (R +v^{2,1})] \\ &= 0.25\times[(-1 + 0) + (-1 + -1) + (-1 + -1) + (-1 + -1)] \\ &= \frac{7}{4} \\ &\approx-1.7 \end{aligned}\end{equation} \]

    而後咱們一直這樣迭代下去,直到每一個格子的價值的變化小於某一個閾值時,咱們會中止迭代。

    所以最終的獲得結果以下:

求解的過程並不複雜,固然,若是咱們的數據不少的話,那麼須要的迭代的次數也會增多。

策略迭代求解控制問題

針對於第二個控制問題,咱們能夠基於一種初始化策略,而後獲得狀態價值,而後在基於狀態價值來及時的調整咱們的策略,這個方法就叫作策略迭代(Policy Iteration)。過程示意圖以下:

其中調整的方法是貪婪法。個體在某個狀態下選擇的行爲是其可以到達後續全部可能的狀態中狀態價值最大的那個狀態。算法的流程以下:

從算法中來看,實際上須要耗費的步驟仍是挺多的。先進行價值迭代,而後又進行策略迭代,而後不符合的話又重複操做,一直迭代到價值和策略收斂才能夠。

價值迭代求解控制問題

上述的策略迭代還有有一點問題,好比說上述的格子問題,實際上在\(k=3\)的時候就已經獲得最優動做策略了:

爲了解決策略迭代出現的步驟多的問題,一個特殊的改進就是當策略評估僅進行一次更新的時候就中止。也就是說二者的區別以下:

  1. 策略迭代:策略更新計算的是每個狀態\(s\)各個行爲\(a\)指望值,而後進行更新舊值,直到\(v - V(s)\)小於某個閾值。而後在從其中選擇最好的\(a\)
  2. 價值迭代:直迭代就是用某個行爲 \(a\) 獲得的最大的狀態價值函數,來更新原來的狀態價值函數,最後獲得\(a\)

算法的流程以下:

不過值得注意的是,以上動態規劃獲得的策略解\(\pi_*\)不必定是全局最優解,只是局部最優解。所以咱們還須要使用探索率\(\epsilon\),來跳出局部最優解。

總結

關於最佳策略的求解方法還有不少,好比說MC方法,時序差分方法等等,可是由於這個系列博客主要是爲了快速入門到入土,就不那麼詳細的講解了。若是想了解更多能夠看看劉建平Pinard強化學習

在下一個篇博客中,將介紹Q-learning。

參考

相關文章
相關標籤/搜索