1. 程式人生 > >DQN(Deep Q-learning)入門教程(二)之最優選擇

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

在上一篇部落格:[DQN(Deep Q-learning)入門教程(一)之強化學習介紹](https://www.cnblogs.com/xiaohuiduan/p/12945449.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]$ - 動作價值函式:$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)](https://www.cnblogs.com/pinard/p/9426283.html) ## 最優策略 首先,我們知道“**好的策略產生好的價值**”,因此策略的好壞可以通過價值的大小來比較。我們定義最佳的策略是 $\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') $$ ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151935724-589208573.png) 實際上,尋找最優策略的過程就是尋找最優動作的過程:選取一個$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](https://www.davidsilver.uk/wp-content/uploads/2020/03/MDP.pdf)強化強化學習課程的一個例項,黃色圓圈的開始狀態,紅色方塊的是結束狀態。$R$代表reward,每一個狀態可以執行的action為紅色字型(例如Facebook,Study等等),其中黑色的點分支對應的數字代表執行這個action之後的狀態轉移概率。 ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151936421-1090703986.png) 我們設衰減因子:$\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$。 ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151936931-477164609.jpg) 上面是我們固定了策略$\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 ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151937957-1721095013.png) 求解過程如下所示,過程稍微有點多,實在是不好使用Latex進行說明,就使用草稿紙進行推導了。 ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151940002-703040984.png) 上面的部分是我們人為的推導方法 ,電腦肯定沒有我們這麼聰明,那麼對於電腦來說,應該怎麼進行推導呢? ## 求解方法 求解方法有很多種,下面將介紹一種最基本的動態規劃演算法。 ### 動態規劃 當問題具有下列兩個性質時,通常可以考慮使用動態規劃來求解: 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)求解](https://www.cnblogs.com/pinard/p/9463815.html) 首先假設我們已知第$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](https://www.davidsilver.uk/wp-content/uploads/2020/03/DP.pdf)中的一個例子:我們有一個4x4的宮格。只有左上和右下的格子是終止格子。該位置的價值固定為0,個體如果到達終止格子,則停止移動。個體在16宮格其他格的每次移動,得到的即時獎勵$R$都是-1,若往邊界走,則會返回到原來的位置(也就是下一個狀態還是原來的地方)。個體只能上下左右移動,每次移動一個位置。衰減因子$\gamma = 1$,$P=1$。給定的策略是隨機策略,每個方向的移動概率是$0.25$。 ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151941645-1376886917.png) - 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} $$ 然後我們一直這樣迭代下去,直到每個格子的價值的變化小於某一個閾值時,我們會停止迭代。 因此最終的得到結果如下: ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151942258-1161793476.png) 求解的過程並不複雜,當然,如果我們的資料很多的話,那麼需要的迭代的次數也會增多。 #### 策略迭代求解控制問題 針對於第二個控制問題,我們可以基於一種初始化策略,然後得到狀態價值,然後在基於狀態價值來及時的調整我們的策略,這個方法就叫做策略迭代(Policy Iteration)。過程示意圖如下: ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151942872-583894858.png) 其中調整的方法是貪婪法。個體在某個狀態下選擇的行為是其能夠到達後續所有可能的狀態中狀態價值最大的那個狀態。演算法的流程如下: ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151944306-237324039.jpg) 從演算法中來看,實際上需要耗費的步驟還是挺多的。先進行價值迭代,然後又進行策略迭代,然後不符合的話又重複操作,一直迭代到價值和策略收斂才可以。 #### 價值迭代求解控制問題 上述的策略迭代還有有一點問題,比如說上述的格子問題,實際上在$k=3$的時候就已經得到最優動作策略了: ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151945330-805682661.png) 為了解決策略迭代出現的步驟多的問題,一個特殊的改進就是當策略評估僅進行一次更新的時候就停止。也就是說兩者的區別如下: 1. 策略迭代:策略更新計算的是每一個狀態$s$和**各個行為**$a$的**期望值**,然後進行更新舊值,直到$v - V(s)$小於某個閾值。然後在從其中選擇最好的$a$。 2. 價值迭代:直迭代就是用某個行為 $a$ 得到的最大的狀態價值函式,來更新原來的狀態價值函式,最後得到$a$。 演算法的流程如下: ![](https://img2020.cnblogs.com/blog/1439869/202005/1439869-20200527151945843-1205058206.jpg) 不過值得注意的是,以上動態規劃得到的策略解$\pi_*$不一定是全域性最優解,只是區域性最優解。因此我們還需要使用探索率$\epsilon$,來跳出區域性最優解。 ## 總結 關於最佳策略的求解方法還有很多,比如說MC方法,時序差分方法等等,但是因為這個系列部落格主要是為了快速入門到入土,就不那麼詳細的講解了。如果想了解更多可以看看**劉建平Pinard**的[強化學習](https://www.cnblogs.com/pinard/category/1254674.html)。 在下一個篇部落格中,將介紹Q-learning。 ### 參考 - [強化學習(二)馬爾科夫決策過程(MDP)](https://www.cnblogs.com/pinard/p/9426283.html) - [強化學習(三)用動態規劃(DP)求解](https://www.cnblogs.com/pinard/p/9463815.html) - [強化學習 - 動態規劃(Dynamic Programming)](https://zhuanlan.zhihu.com/p/72360992) - [Planning by Dynamic Programming](https://www.davidsilver.uk/wp-content/uploads/2020/03