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

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

  • 策略:\(\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]\)

  • 動作價值函數:\(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)

最優策略

首先,我們知道“好的策略產生好的價值”,因此策略的好壞可以通過價值的大小來比較。我們定義最佳的策略是 \(\pi_*\) ,而我們的目的就是爲了尋找這個 \(\pi_*\)

  1. 最優狀態價值函數:代表所有策略下產生的不同狀態的狀態的價值函數中的最大值

    \[v_{*}(s) = \max_{\pi}v_{\pi}(s) \]
  2. 最優動作價值函數:代表所有策略下產生衆多動作價值函數中的最大值

    \[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。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章