強化學習的知識儲備【更新完成】


都為筆者自己理解,加上筆者剛接觸這個領域不久,因此可能存在理解偏差,希望可以和大家多多討論,寫這個知識儲備的目的就是記錄一下自己常用的知識,便於回顧以及查找。畢竟自己記錄的知識,回顧起來自己寫的什么意思最容易理解。

本文中的圖片都源於百度AI studio課程: 強化學習7日打卡營-世界冠軍帶你從零實踐

Behavior Policy(行為策略 )和Target Policy(目標策略)

Behavior Policy: 行為策略是用來與環境互動產生數據的策略 , 即在訓練過程中做決策 。例如智能體不斷的與環境交互,更新Q表格中的Q值。

Target Policy: 在行為策略產生的數據中不斷學習、優化,即學習訓練完畢后拿去應用的策略。 也就是智能體根據Q表格中的數據進行學習,判斷在每個狀態下發起什么動作。

exploitation(利用) 和 exploration (探索)

exploitation:利用就是根據已有的經驗去取得最大回報。比如,附近有十家餐館,你已經去過里邊的七家了,你知道這七家中紅燒排骨最好吃,所以你會根據已有經驗去吃紅燒排骨,也不會去嘗試另外的三家餐館。這樣是局部最優解。

exploration:探索是指做你以前從來沒有做過的事情,以期望獲得更高的回報。 這時候你就要去嘗試剩下的三家餐館,看看有沒有更好吃的菜,去尋找全局最優解。

貪婪策略和e-greedy貪婪策略

貪婪策略:是一個確定性的策略,每一次都選擇回報價值最大的那個策略。

\[\pi (a|s)= \begin{cases} 1, & \text if \ a = max_a Q(s,a) \\ 0, & \text{otherwise} \end{cases} \]

e-greedy貪婪策略:是一個不確定性的策略,平衡了利用和探索,其中選取動作值函數最大的部分為利用,仍有概率去尋找全局最優解為探索部分。令e=0.1,也就是有1-0.1=0.9的概率是利用,有0.1的概率是探索。

也就是選擇當前最大回報的概率是0.9,去尋找全局最優解進行探索的概率是0.1.

\[\pi (a|s)= \begin{cases} 1-e, & \text if \ a = max_a Q(s,a) \\ e, & \text{otherwise} \end{cases} \]

On-Policy(Sarsa)&Off-Policy(Q-learning)

On-Policy:典型的算法就是Sarsa,獲取數據的動作和最終策略的動作是一致的。只有一個策略π,使用策略π去與環境產生經驗,使用策略π去學習,因為需要兼顧利用與探索,因此策略π並不穩定。

# Sarsa 算法
initialize Q(s,a) randomly
for each episode:
    initialize state s;
    choose action a from s using ε-greedy strategy;
    while s is not terminal:
        observe reward r and next state s';
        choose a' from s' using ε-greedy strategy;
        Q(s,a) = Q(s,a) + α[r + γ*Q(s',a') - Q(s,a)];
        s = s', a = a';

Off-Policy : 典型的算法就是Q-learning,獲取數據的動作和最終策略的動作不一定一致,是因為有一個隨機的概率去選擇探索全局最優解。有兩個策略,一個目標策略π,一個行為策略μ,目標策略π用來學習最優策略,行為策略μ更具有探索性,與環境交互產生經驗。

# Q-learning 算法
initialize Q(s,a) randomly
for each episode:
    initialize state s;
    while s is not terminal:
        choose action a from s using ε-greedy strategy;
        observe reward r and next state s';
        Q(s,a) = Q(s,a) + α[r + γ*maxQ(s',a') - Q(s,a)];
        s = s';

總結:兩個算法的主要區別就是在倒數第二行Q值更新那里,還有Sarsa算法直接將a‘的值賦給a,也就是Sarsa是直接選擇下個動作去執行。Q-learning在計算下一狀態的預期收益時利用了max操作,也就是直接選擇下一狀態的最優動作,獲取最大回報。但是實際過程中因為有e-greedy策略,有小概率選擇探索,不會去選擇當前最優的動作,所以學習時的policy(行為策略)和生成樣本的policy(目標策略)不一定相同,為off-policy算法。Sarsa則是直接選擇下一次動作去執行,它只有一種策略,用同種策略去做選取,去做優化。就算下一步是選擇探索,並且掉進了懸崖(迷宮問題,掉進懸崖就給一個負的reward),它也會去執行,會把懸崖附近的Q值更新為負的,因此在迷宮問題中,它會離懸崖遠遠的。因為學習時的policy和預測時的policy一致,因此為on-policy

軟更新和硬更新

軟更新應該是指每次更新參數的時候利用一個衰減的比例

硬更新則是指每隔一定步數完全Copy參數

DQN=神經網絡+Q-learning,兩大創新點:經驗回放,固定Q目標

先說一下Q-learning算法,在Q-learning中我們有一個Q(s,a)函數,用來通過輸入狀態s,和動作a,來得到獎勵回報reward

\[Q^*:state+action\to reward \]

我們在特定狀態下,采取獎勵回報最高的動作,那么我們可以構建一個最大化回報的策略:

\[\pi ^* (s)=argmax_a Q^* (s,a) \]

對於我們的訓練規則,當前的總獎勵Qπ(這個是預測的總獎勵)就等於當前動作的回報r加上衰減因子gamma乘上未來的總獎勵。假設我們的策略的Q函數都遵循貝爾曼方:

\[Q^\pi(s,a)=r+\gamma Q^\pi(s^\prime,\pi(s^\prime)) \]

等式兩邊的差異,稱為時間差異:

\[loss=Q^\pi(s,a)-(r+\gamma Q^\pi(s^\prime,\pi(s^\prime)) \]

我們就來降低這個時間差異,讓預測的獎勵盡可能的接近

經驗回放:優點1:打亂樣本關聯性,對於神經網絡輸入的樣本都是獨立的,各個樣本之間沒有什么關聯性。因為強化學習是一個i訓練決策的過程,所以前后的狀態是相互影響,相互關聯的,所以打斷樣本之間的關聯性,才會更好的使用神經網絡,DQN就是利用了Q-learning的off-policy 的特點,它設置一個經驗池,先存取一批的經驗數據,然后隨機從經驗池里選取一個batch數據,來更新網絡。還可以提高數據利用率,因為經驗池中的數據可能會多次被抽取,因為智能體與環境交互拿到的數據量是比較少的,通過經驗池這樣存起來,多用幾次,就不會浪費。(就像現實環境中,有些事情會多次學習一樣)

固定Q目標 :解決了算法更新不平穩的問題,在監督學習中,預測的真實值是固定不變的,因此逼近的時候,也比較穩定,但是在DQN中,Q_target是由下一步的(s',a')不斷更新的,想要讓Q_predict值逼近Q_target值,但是Q_target又一直變換,因為造成了不穩定的結果。DQN就提出了使用一個臨時的Q_temp來固定一下Q_target的值,然后隔段時間再將Q_temp更新為Q_target的值,這樣每隔一段時間更新Q_temp值為Q_target的值,就達到了穩定的效果。

Value-based 和 policy-based

Value-based:先學習動作價值函數,訓練的目的是為了將Q值迭代更新到最優,然后再根據每一步的價值選擇最優的動作。1. 先優化Q值,然后選擇Q值最大的那個action。2. 是一個確定性的策略,到達最優之后,參數就固定下來了,那么輸入一樣的狀態的話,得到的action是一樣的。

policy-based :直接學習動作概率,動作的選擇不再依賴於價值函數,而是根據一個策略走到底,看最后的總收益來判斷這個策略是好還是壞。1. 直接一步到位,神經網絡直接輸出action。2. 得到的是動作的概率,是一個隨機的策略,假設一共三種動作,可能a1的概率 p(a1|s) = 0.3,a2的概率 p(a2|s) = 0.6,a3的概率p(a3|s) = 0.1。那么根據概率隨機的采樣一個動作輸出,一般會在最后選擇action之前加入一個softmax激活函數,softmax函數講解在這里:點擊跳轉

value-based模型步驟:

首先我們基於狀態s1,用 e-greedy法選擇到動作a1,然后執行動作a1 ,得到獎勵R1 ,並進入狀態s2 ;然后基於狀態s2 ,使用貪婪法選擇 a2,也就是說,選擇使 Q(s2,a)最大的 a作為 a2來更新價值函數。用數學公式表示就是:

\[Q(s,a)=Q(s,a)+\alpha(R+\gamma max_aQ(s',a)-Q(s,a)) \]

經過上邊的公式,不斷的更新Q表格(Q表格:一共有len(state)行,len(action)列,對應的是每個狀態下選擇某個動作,所獲得的Q值)。在訓練時,會有e-greedy概率,去選擇探索,但在最終測試時,所有的動作都選擇利用,這樣才能利用已知經驗獲得最佳效果,利用和探索在上邊講解了,一定要好好理解啊,用到的非常多。

policy-based模型步驟:

\[\pi_{\theta}(a|s):狀態s下有多大的概率選擇動作a \]

\[p(s'|s,a):狀態s下選擇動作a后,有多大幾率到達s’ \]

從第一個狀態,選擇動作,到下一個狀態,在選擇動作,再到下一個狀態,如此循環,不斷的交互,等交互終止了之后,我們就稱我們完成了一個episode,這樣一場游戲結束,我們把這一整個episode里邊所有的s和a串起來的集合就叫一個episode的軌跡,Trajectory:

\[\tau=\{s_1,a_1,s_2,a_2...s_T,a_T\} \]

有了這條軌跡,那么我們就可以計算這條軌跡發生的概率,也就是把里邊的每一個概率都連乘起來:

\[p_\theta(\tau)=p(s_1)\pi_\theta(a_1|s_1)p(s_2|s_1,a_1)\pi_\theta(a_2|s_2)p(s_3|s_2,a_2)... \]

還可以計算這條軌跡的總回報:每一個step的回報累加起來。

\[R(\tau)=\sum_{t=1}^T r_t \]

π(a|s)的期望回報:所有episode的平均回報,但是很多環境中軌跡有無數條,不可能窮舉每一個episode,所以我們求N個episode,然后求平均,當N足夠大的時候,我們就可以用后邊的近似的去擬合Rθ,這個過程我們稱之為采樣,采樣N個episode來計算我們的期望回報。

\[\bar{R_\theta}=\sum_\tau R(\tau)p_\theta(\tau)\approx\frac{1}{N}\sum_{n=1}^NR(\tau) \]

這個期望回報就是我們能夠用來優化策略函數的目標。

Value-based 和 policy-based的優化策略函數比較:

Value-based:一般采用時序差分的優化方式優化目標:優化兩者之間的差值,越小越好。

\[MSE(Q預測,Q_{target}),Q_{target}=r+\gamma Q' \]

policy-based:一般采用蒙特卡洛策略梯度的優化方式優化目標:優化期望回報,希望越大越好,梯度上升。

\[j(\theta)=\bar{R_\theta} \]

蒙特卡洛(MC) 和 時序差分 (TD)

蒙特卡洛:是回合更新,當進行完整個回合后,才會進行一次更新,所以更新速度比較慢。

時序差分 :單步更新,沒走一步,都進行一次更新,所以更新頻率比較高。

利用交叉熵優化Policy Gradient:梯度上升
  • 交叉熵就是一個可以用來計算兩個分布之間的差值的方法。

如圖,在狀態st下,有三個動作,a1概率為0.02,a2概率為0.08,a3概率為0.9,可以看出來a3的概率最大,也是Gt最大的,得到的回報最高,因此我們就越需要優化a3,右邊one-hot編碼中的at只是執行的action,是真實的action,但不一定是正確的action,不能作為一個正確的標簽來知道我們的神經網絡朝着正確的方向去更新。所以我們在這里需要乘以一個獎勵回報,這個獎勵回報相當於對右邊這個真實的action 的一個評價,Gt越大,未來的總收益越大,就說明當前選擇的這個action就越好。那我這個loss就越需要重視,如果Gt很小,那么就說明有點這個真實的action並沒有那么好,那我的loss 的權重就小一點,優化的力度就小一點。我們是想我們的期望回報越高越好,也就是梯度上升的方式,因為框架中優化器都是以梯度下降的方式優化的,所以我們在公式前邊加上一個負號。

REINFORCE模型:

REINFORCE模型的流程圖:

  • 更新的過程如下:

    智能體先選擇action去和環境交互,然后環境反饋給智能體s,r,這樣就得到了(s,a,r)這樣的字典。

    然后將每一個reward轉化成后綴和形式,計算后綴和Gt的代碼實現如下:

    # 計算后綴和
    def suffix_sum(reward_list,gamma=1.0):
        """
        range(4,-1,-1):
        (4,3,2,1,0)
        """
        for i in range(len(reward_list)-2,-1,-1):
            """
            r[4]+=γr[5]
            r[3]+=γr[4]
            r[2]+=γr[3]
            r[1]+=γr[2]
            r[0]+=γr[1]
            """
            reward_list[i]+=gamma*reward_list[i+1]
        return np.array(reward_list)
    

    計算完后綴和后就有了一個這樣的數據,每一個狀態下的動作,對應的后邊的總回報,也就是流程圖中的Episode data。

    \[reward\_list=\{(s_1,a_1,G_1),(s_2,a_2,G_2),(s_3,a_3,G_3)...\} \]

    到了這一步后,我們現在就可以先從神經網絡中拿到某個狀態下每個action的概率,然后上邊reward_list就是我們實際的action(實際的action但不一定是正確的action),把這個action轉換成one-hot向量,然后根據下式去learn(),來計算兩個分布之間的Loss

    \[Loss=-G_t \ \ \ \ *\underbrace{[0,1,0,0,0,0]}_{\rm 實際的action,但不一定是正確的action}* \ \ \ \ \ \ \ \ \underbrace{log[0.2,0.5,0.05,0.1,0.05,0.1]}_{\rm經過神經網絡最后的softmax后的\pi(a|s,\theta)} \]

    得到這個Loss后,就可以用來去更新模型中的策略π。

離散動作和連續動作

離散動作:就是action的數量是可數的,例如迷宮問題里的action就只有上下左右。

離散動作的隨機性策略πθ(at|st),通過輸入狀態s,在神經網絡的最后邊加入一層softmax層,得到選擇每個action的概率。

連續動作:action的數量是不可數的,例如無人駕駛中,汽車方向盤轉動的角度等等。

連續動作的確定性策略μθ(st),就是輸入同樣的狀態s,輸出同樣的action,通過輸入狀態s,在神經網絡最后邊加入一層tanh層,將輸出的action縮放到 [-1,1],然后再進行一個scale(縮放)過程,把action縮放到指定的范圍內,例如小車的一個速度問題,在狀態s下,經過tanh層后得到一個action=0.9,假設小車的速度是 [-5,5],然后經過一個scale方法,將action=0.9*5=4.5,假設action是小車的速度,就讓小車的速度設置為4.5。

DDPG( Deep Deterministic Policy Gradient ):DQN的升級版,用來接觸連續動作

DQN:是在Q-learning的基礎上,加入了一個Q網絡,Q網絡主要的作用就是,通過輸入狀態s,然后來求得Q預測,也就是Q_w(s,a)。

Q網絡輸出的Q預測,我們用環境反饋的reward和下一步的Q預測來去擬合未來的收益,未來的收益也就是Q_target,然后讓Q網絡的輸出Q估計去靠近Q_target。最后通過計算Q估計和Q_target之間的均方差Loss,來優化Q網絡:

\[\begin{align}\\Q估計\to Q_{target}(未來收益)\\Q_{target}\approx r+\gamma Q’\\Loss=MSE(Q估計,Q_{target})\end{align} \]

DDPG:因為要處理連續的動作,所以DDPG是在DQN的基礎上,再加入了一個策略網絡,策略網絡就是通過輸入狀態s然后來求得動作a=μθ(s) ,再把a交給Q網絡,然后Q網絡有了 (s,a),就來計算Q預測,也就是Q_w(s,a)。DDPG的這種結構稱為actor-critic結構,策略網絡就是扮演的actor的角色,用來對外輸出動作,然后Q網絡就是扮演的critic,用來給actor所輸出的動作打分,而環境的反饋reward,來用評估critic的打分策略,簡單來說就是環境反饋reward優化Q網絡,Q網絡優化策略網絡。剛開始的時候Q網絡和策略網絡都是隨機的,然后因為有環境的反饋reward,所以critic的打分會越來越准確,然后也會帶着actor的表現越來越好。

在DDPG中我們有兩個網絡需要優化,一個是策略網絡,一個是Q網絡,這兩個網絡我們分別用兩個參數來表示要優化的內容,優化策略網絡(參數θ),優化Q網絡(參數w),具體看下圖。

  • 優化策略網絡中,策略網絡的目標就是選擇一個最優的action,然后讓Q_w(s,a)越大越好,通過策略網絡求出a=μθ(s),然后用Loss=-Q_w(s,a)來計算損失,也就是然后放到優化器里,讓優化器自動用梯度下降的方法來進行優化,優化器優化Loss越低,也就是Q_w(s,a)越大,與目標是一樣的。

  • 優化Q網絡中,Q網絡的目標是讓Q預測逼近Q_target。

    \[\begin{align}& Q預測 =Q_w(s,a)\\& Q_{target}=r+\gamma Q_{\bar w}(s',a')\\Loss & =MSE[Q預測,Q_{target}]\\& =MSE[Q_w(s,a),r+\gamma Q_{\bar w}(s',a')]\end{align} \]

DDPG代碼模型的總體架構:

DDPG中的固定Q目標和經驗回放ReplayMemory

固定Q目標:在DQN中,因為每一個狀態下,每個動作的Q_target是變化的,這樣你如果用Q預測去靠近一個變化的Q_target,那就不容易收斂,因此我們就用一個臨時的Q_temp來固定一下Q_target,然后每隔一段時間,再去更新Q_temp的值為Q_target,在DDPG中,我們同樣也是需要固定Q_target,因為Q_target是由a'來求得的,而a'是我們用策略網絡求得的,a'在每一個狀態轉變的過程中也是變化的,所以我們還需要固定一下a', 我們分別在target網絡中的參數上加一個橫杠,來區分開來。target_Q和target_P我們統稱為target網絡。

經驗回放:參考DQN,和DQN中的內容一樣。

最后是后續學習的資料推薦,包括理論,動手實踐,進階論文,前沿研究方向,強化學習道阻且長,最后再強調一遍,本文中的圖片都源於百度AI studio課程: 強化學習7日打卡營-世界冠軍帶你從零實踐 ,講課很棒,讓我對強化學習的入門有了一個清楚的認識,PPT做的也很好,結合PPT的講解,能讓人更加理解,不理解的地方,多看兩邊,然后動手把她說的話打一遍,再看看,就能理解了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM