從零開始強化學習(三)——表格型方法

三. 表格型方法(Tabular Methods)

強化學習的三個重要的要素:狀態(tài)、動作和獎勵。強化學習智能體跟環(huán)境是一步一步交互的,就是先觀察一下狀態(tài),然后再輸入動作。再觀察一下狀態(tài),再輸出動作,拿到這些reward。它是一個跟時間相關的序列決策的問題

這樣的一個狀態(tài)轉移概率是具有馬爾可夫性質的(系統下一時刻的狀態(tài)僅由當前時刻的狀態(tài)決定,不依賴于以往任何狀態(tài))。因為這個狀態(tài)轉移概率,它是下一時刻的狀態(tài)是取決于當前的狀態(tài),它和之前的s_{t-1}s_{t-2}都沒有什么關系。然后再加上這個過程也取決于智能體跟環(huán)境交互的這個a_t,所以有一個決策的一個過程在里面,就稱這樣的一個過程為馬爾可夫決策過程(Markov Decision Process,MDP)

MDP就是序列決策這樣一個經典的表達方式。MDP也是強化學習里面一個非?;镜膶W習框架。狀態(tài)、動作、狀態(tài)轉移概率和獎勵(S,A,P,R),這四個合集就構成了強化學習MDP的四元組,后面也可能會再加個衰減因子構成五元組

3.1 無環(huán)境交互(model-base)

狀態(tài)轉移概率函數+獎勵函數=>已知的馬爾可夫決策過程(環(huán)境已知)=>策略迭代+價值迭代=>最佳策略

把可能的動作和可能的狀態(tài)轉移的關系畫成一個樹狀圖。它們之間的關系就是從s_ta_t,再到s_{t+1} ,再到a_{t+1},再到s_{t+2}這樣子的一個過程

跟環(huán)境交互,只能走完整的一條通路。這里面產生了一系列的一個決策的過程,就是跟環(huán)境交互產生了一個經驗。使用概率函數(probability function)獎勵函數(reward function)來去描述環(huán)境。概率函數就是狀態(tài)轉移的概率,概率函數實際上反映的是環(huán)境的一個隨機性。當知道概率函數和獎勵函數時,這個MDP就是已知的,可以通過策略迭代(policy iteration)價值迭代(value iteration)來找最佳的策略。如果知道這些狀態(tài)轉移概率和獎勵函數的話,就說這個環(huán)境是已知的,因為我們是用這兩個函數去描述環(huán)境的,如果是已知的話,其實可以用動態(tài)規(guī)劃去計算說,很多強化學習的經典算法都是model-free的,就是環(huán)境是未知的

3.2 有環(huán)境交互(model-free)

價值函數+Q函數=>評價=>選取最大獎勵的動作

在一個未知的環(huán)境里的,也就是這一系列的決策的概率函數和獎勵函數是未知的,這就是model-basedmodel-free的一個最大的區(qū)別。強化學習就是可以用來解決用完全未知的和隨機的環(huán)境。強化學習要像人類一樣去學習,人類學習的話就是一條路一條路地去嘗試一下,先走一條路,看看結果到底是什么。多試幾次,只要能活命的??梢月亓私饽膫€狀態(tài)會更好:

  • 用價值函數V(s)來代表這個狀態(tài)是好的還是壞的
  • Q函數來判斷說在什么狀態(tài)下做什么動作能夠拿到最大獎勵,用Q函數來表示這個狀態(tài)-動作值

3.3 model-base與model-free的本質區(qū)別

當使用概率轉移函數p[s_{t+1},r_t|s_t,a_t]和獎勵函數r[s_t,a_t]來描述環(huán)境

  • model-base

    • 當我們知道概率函數和獎勵函數時,馬爾可夫決策過程已知,可以采用策略迭代或價值迭代獲得智能體的最優(yōu)策略,這個過程Agent沒有與環(huán)境進行交互
    • 在很多實際的問題中,MDP的模型有可能是未知的,也有可能模型太大了,不能進行迭代的計算。比如Atari游戲、圍棋、控制直升飛機、股票交易等問題,這些問題的狀態(tài)轉移太復雜了
  • model-free

    • 當概率函數和獎勵函數時,處于未知的環(huán)境中,讓智能體與環(huán)境進行交互,采集很多軌跡數據,Agent從軌跡中獲取信息改進策略,從而獲得更多的獎勵,目前大部分領域的AI應用都是model-free模式

3.4 Q表格(Q-table)

如果Q表格是一張已經訓練好的表格的話,那這一張表格就像是一本生活手冊

這張表格里面Q函數的意義就是選擇了這個動作之后,最后面能不能成功,就是需要去計算在這個狀態(tài)下,選擇了這個動作,后續(xù)能夠一共拿到多少總收益。如果可以預估未來的總收益的大小,就知道在當前的這個狀態(tài)下選擇哪個動作,價值更高,選擇某個動作是因為未來可以拿到的那個價值會更高一點。所以強化學習的目標導向性很強,環(huán)境給出的獎勵是一個非常重要的反饋,它就是根據環(huán)境的獎勵來去做選擇

但有的時候把目光放得太長遠不好,因為如果事情很快就結束的話,考慮到最后一步的收益無可厚非。如果是一個持續(xù)的沒有盡頭的任務,即持續(xù)式任務(Continuing Task),把未來的收益全部相加,作為當前的狀態(tài)價值就很不合理

在這個環(huán)境當中,去計算狀態(tài)動作價值(未來的總收益)可使用γ折扣因子:考慮累積收益,并且對于未來的收益也做考慮,但是越后面的收益對當前價值影響越小,因此γ∈[0,1]

State Aciton 1 Aciton 2 Aciton 3 Aciton 4
(1,1) 0 0 0 0
(1,2) 0 0 0 0
(2,1) 0 0 0 0
(2,2) 0 0 0 0

類似于上表,最后我們要求解的就是一張Q表格

  • 它的行數是所有的狀態(tài)數量,一般可以用坐標來表示格子的狀態(tài),也可以用1、2、3、4、5、6、7來表示不同的位置
  • Q表格的列表示四個動作Action space

最開始這張Q表格會全部初始化為零,然后agent會不斷地去和環(huán)境交互得到不同的軌跡,當交互的次數足夠多的時候,就可以估算出每一個狀態(tài)下,每個行動的平均總收益去更新這個Q表格。怎么去更新Q表格就是接下來要引入的強化概念。

強化就是可以用下一個狀態(tài)的價值來更新當前狀態(tài)的價值,其實就是強化學習里面bootstrapping的概念。在強化學習里面,可以每走一步更新一下Q表格,然后用下一個狀態(tài)的Q值來更新這個狀態(tài)的Q值,這種單步更新的方法叫做時序差分

3.5 無模型交互預測(model-free Prediction)

在沒法獲取MDP的模型情況下,可以通過以下兩種方法來估計某個給定策略的價值:

  • (蒙特卡羅策略評估)Monte Carlo policy evaluation
  • (時序差分策略評估)Temporal Difference(TD) learning
3.5.1 蒙特卡羅(Monte-Carlo,MC)

思想:基于采樣的方法,通過讓agent跟環(huán)境進行交互,就會得到很多軌跡。每個軌跡都有對應的 return:
G_{t}=R_{t+1}+\gamma R_{t+2}+\gamma^{2} R_{t+3}+\ldots

蒙特卡洛是用經驗平均回報(emmpirical mean return)的方法來估計的,即把每個軌跡的return進行平均,就可以知道某一個策略下面對應狀態(tài)的價值

算法步驟:


  1. 在時間步t,狀態(tài)s被訪問:
  • 狀態(tài)s的訪問數增加1:N(s)=N(s)+1
  • 狀態(tài)s的總的回報S(s)增加G_tS(s)←S(s)+G_t
  1. 通過回報的平均估計狀態(tài)s的價值:v(s)=S(s)/N(s)

假設現在有樣本x_1,x_2,\cdots,可以把經驗均值(empirical mean)轉換成增量均值(incremental mean)的形式,如下式所示:
\begin{aligned} \mu_{t} &=\frac{1}{t} \sum_{j=1}^{t} x_{j} \\ &=\frac{1}{t}\left(x_{t}+\sum_{j=1}^{t-1} x_{j}\right) \\ &=\frac{1}{t}\left(x_{t}+(t-1) \mu_{t-1}\right) \\ &=\frac{1}{t}\left(x_{t}+t \mu_{t-1}-\mu_{t-1}\right) \\ &=\mu_{t-1}+\frac{1}{t}\left(x_{t}-\mu_{t-1}\right) \end{aligned}
通過這種轉換,就可以把上一時刻的平均值跟現在時刻的平均值建立聯系,即:
\mu_t = \mu_{t-1}+\frac{1}{t}(x_t-\mu_{t-1})
其中:

  • x_t- \mu_{t-1}是殘差
  • \frac{1}{t}類似于學習率(learning rate)

當得到x_t,就可以用上一時刻的值來更新現在的值:
v(s_t)\leftarrow v(s_{t-1})+\alpha(G_t-v(s_{t-1}))
比較動態(tài)規(guī)劃法和蒙特卡洛方法的差異

動態(tài)規(guī)劃法:通過上一時刻的值的值。不斷迭代,直到達到收斂:v_t(s) \leftarrow \sum\limits_{a \in A} \pi(a|s)(R(s,a)+\gamma \sum\limits_{s' \in S}P(s'|s,a)v_{i-1}(s')),動態(tài)規(guī)劃也是常用的估計價值函數的方法。在動態(tài)規(guī)劃里面,我們使用了bootstrapping的思想。bootstrapping的意思就是基于之前估計的量來估計一個

蒙特卡洛方法:通過一個回合的經驗平均回報進行更新:v(s_t)\leftarrow v(s_{t-1})+\alpha(G_t-v(s_{t-1})),MC是通過empirical mean return(實際得到的收益)來更新它,對應樹上面藍色的軌跡,得到是一個實際的軌跡,實際的軌跡上的狀態(tài)已經是決定的,采取的行為都是決定的。MC得到的是一條軌跡,這條軌跡表現出來就是這個藍色的從起始到最后終止狀態(tài)的軌跡?,F在只是更新這個軌跡上的所有狀態(tài),跟這個軌跡沒有關系的狀態(tài)都沒有更新

結論

  • 蒙特卡洛可以在未知環(huán)境中使用,而動態(tài)規(guī)劃是model-based
  • 蒙特卡洛只需要更新一條軌跡的狀態(tài),動態(tài)規(guī)劃需要更新所有的狀態(tài)。狀態(tài)數量很多的時候,DP這樣去迭代的話,速度是非常慢的。這也是sample-based的方法MC相對于DP的優(yōu)勢
3.5.2 時序差分學習(Temporal-Difference Learning,TD)

思想:時序差分(TD)學習是蒙特卡洛思想和動態(tài)規(guī)劃思想的完美結合。一方面,像蒙特卡洛方法一樣,時序差分不需要知道環(huán)境的動力學模型,可以從經歷的回合中直接學習;另一方面,像動態(tài)規(guī)劃一樣,時序差分更新估計值基于部分已知的估計值,不需要等到最后的結果(完整的回合),這就是引導bootstrapping的思想。因此,TD是無模型的,通過引導,從不完整的回合中學習,用一個估計來更新另一個估計。

目的:對于給定策略\pi,在線地算出它的價值函數v^\pi,即對于某個給定的策略,在線(online)地算出它的價值函數:
v(s_t)←v(s_t)+α(G_t^n?v(s_t))
最簡單的算法是TD(0),每往前走一步,就做一步bootstrapping,用得到的估計回報(estimated return)來更新上一時刻的值。估計回報R_{t+1}+\gamma v(S_{t+1})被稱為 TD目標(TD target),TD目標是帶衰減的未來收益的總和。TD目標由兩部分組成:

  • 走了某一步后得到的實際獎勵:R_{t+1}
  • 利用bootstrapping的方法,通過之前的估計來估計v(S_{t+1}),然后加了一個折扣系數,即\gamma v(S_{t+1}),具體過程如下式所示:

\begin{aligned} v(s)&=\mathbb{E}\left[G_{t} \mid s_{t}=s\right] \\ &=\mathbb{E}\left[R_{t+1}+\gamma R_{t+2}+\gamma^{2} R_{t+3}+\ldots \mid s_{t}=s\right] \\ &=\mathbb{E}\left[R_{t+1}|s_t=s\right] +\gamma \mathbb{E}\left[R_{t+2}+\gamma R_{t+3}+\gamma^{2} R_{t+4}+\ldots \mid s_{t}=s\right]\\ &=R(s)+\gamma \mathbb{E}[G_{t+1}|s_t=s] \\ &=R(s)+\gamma \mathbb{E}[v(s_{t+1})|s_t=s]\\ \end{aligned}

TD目標是估計有兩個原因:它對期望值進行采樣,并且使用當前估計v而不是真實v_{\pi}

TD誤差(TD error)\delta=R_{t+1}+\gamma v(S_{t+1})-v(S_t)

可以類比于Incremental Monte-Carlo的方法,寫出如下的更新方法:
v\left(S_{t}\right) \leftarrow v\left(S_{t}\right)+\alpha\left(R_{t+1}+\gamma v\left(S_{t+1}\right)-v\left(S_{t}\right)\right)
時序差分目標是帶衰減的未來收益的總和。對于n步時序差分:
G_t^1=R_{t+1}+γv(S_{t+1})\\ G_t^2=R_{t+1}+γR_{t+2}+γv(S_{t+2})\\ ?\\ G_t^n=R_{t+1}+γR_{t+2}+?+γ^{n?1}R_{t+n}+γ^nv(S_{t+n})
即當n\rightarrow \infty時,時序差分變成了蒙特卡羅

3.5.3 比較蒙特卡洛和時序差分法
  • 蒙特卡洛增量式:
    v(s_t) \leftarrow v(s_t)+\alpha(G_t-v(s_t))\\ G_t = R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^k R_{t+1+k}

  • 時序差分增量式:
    v(s_t) \leftarrow v(s_t)+\alpha(G_t^n-v(s_t)) \\ TD(0): G_t^0=R_{t+1}+\gamma v(s_{t+1}) \\ TD(n):G_t^n = R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^{n-1} R_{t+n}+\gamma^n v(s_{t+n})

時序差分可以在不完整的序列上學習,蒙特卡洛只能在完整的序列上學習

時序差分可以在連續(xù)的環(huán)境下(無終止)學習,蒙特卡洛只能在有終止的情況下學習

時序差分可以在線學習,每走一步就可以更新。蒙特卡洛必須等到序列結束才能學習

3.6 無模型交互控制(model-free comtrol)

policy iteration進行一個廣義的推廣,使它能夠兼容MCTD的方法,即Generalized Policy Iteration(GPI) with MC and TD

策略迭代:

Policy iteration由兩個步驟組成:

  • 根據給定的當前的policy \pi來估計價值函數
  • 得到估計的價值函數后,通過greedy的方法來改進它的算法

這兩個步驟是一個互相迭代的過程,由于不知道獎勵函數和狀態(tài)轉移,無法使用策略迭代進行優(yōu)化。因此我們引入廣義策略迭代的方法

廣義策略迭代(蒙特卡洛估計Q函數):

  • 用蒙特卡洛方法代替動態(tài)規(guī)劃估計Q函數Q(s_t,a_t) \leftarrow Q(s_t,a_t)-\frac{1}{N(s_t,a_t)}(G(t)-Q(s_t,a_t))
  • 假設每一個回合都有一個探索性開始\ \epsilon,保證所有的狀態(tài)和動作都在無限步的執(zhí)行后能被采樣到

蒙特卡洛求Q表的過程

在每一個策略迭代回合中

  • 采用蒙特卡洛策略估計
    • 首先采集數據,獲得一條新的軌跡,計算軌跡上各個狀態(tài)的真實回報G(t)=R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^k R_{t+1+k}
    • 采用增量的方法更新Q:Q(s_t,a_t) \leftarrow Q(s_t,a_t)-\frac{1}{N(s_t,a_t)}(G(t)-Q(s_t,a_t))
  • 基于貪心思想進行策略更新:
    • \pi(s)=\arg \max\limits_a q(s,a)
  • 一個策略迭代回合結束,采樣數據進入新的一回合。當Q函數趨于收斂后,迭代過程結束,即獲得了每個狀態(tài)的Q函數
3.6.1 基于ε-貪心探索的蒙特卡羅算法(ε-greedy)

ε-貪心(ε-greedy)搜索:有1-ε的概率會按照Q-function來決定action,通常ε就設一個很小的值,1-ε可能是90%,也就是90%的概率會按照Q-function來決定action,但是有10%的機率是隨機的。通常在實現上ε會隨著時間遞減。在最開始的時候。因為還不知道那個action是比較好的,所以會花比較大的力氣在做exploration。接下來隨著訓練的次數越來越多。已經比較確定說哪一個Q是比較好的。就會減少exploration,把ε的值變小,主要根據Q-function來決定action,比較少做random,這是ε-greedy

算法流程如下:

因為時序差分相比于蒙特卡洛方法有如下優(yōu)勢:低方差,能夠在線學習,能夠從不完整序列中學習。因此可以把時序差分放到控制循環(huán)中估計Q表格,再采用ε-greedy改進探索

3.6.2 同策略時序差分控制(Sarsa)
  • 特點

    將時序差分更新V的過程,變成了更新Q:

Q(s_t,a_t) \leftarrow Q(s_t,a_t)+\alpha[R_{t+1}+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)]

每次更新值函數都需要知道當前狀態(tài)、當前動作、獎勵、下一步狀態(tài)、下一步動作A’,即(s_t,a_t,R_{t+1},s_{t+1},a_{t+1})之后,就可以做一次更新。A’是下一步驟一定會執(zhí)行的動作

  • 更新公式
    單步更新法:
    每執(zhí)行一個動作,就會更新以此價值和策略。單步Q收獲為:
    q_t=R_{t+1}+\gamma Q(s_{t+1},a_{t+1})
    其中a_{t+1}為下一步驟一定會執(zhí)行的動作。單步Sarsa更新公式為:
    Q(s,a) \leftarrow Q(s,a)+\alpha[R_{t+1}+\gamma Q(s',a')-Q(s,a)]

n步Sarsa(n-step Sarsa):
在執(zhí)行n步之后再來更新Q函數和策略。n步Q收獲為:
q_t^n=R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^{n-1}R_{t+n}+\gamma^n
如果給q_t^{(n)}加上折扣因子\gamma并進行求和,即可得到Sarsa(λ)Q收獲
q_t^\lambda=(1-\lambda)\sum_{n=1}^\infty \lambda^{n-1}q_t^{(n)}
綜上所述,將Q收獲帶入增量公式可得,n步Sarsa(λ)更新公式為:
Q(s_t,a_t) \leftarrow Q(s_t,a_t)+\alpha(q_t^\lambda-Q(s_t,a_t))

  • Sarsa所作出的改變很簡單,就是將原本TD更新V的過程,變成了更新Q,就是說可以拿下一步的Q值Q(S_{t+_1},A_{t+1})更新這一步的Q值Q(S_t,A_t)。Sarsa是直接估計Q-table,得到Q-table后,就可以更新策略。該算法由于每次更新值函數需要知道當前的狀態(tài)(state)、當前的動作(action)、獎勵(reward)、下一步的狀態(tài)(state)、下一步的動作(action),(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})這幾個值 ,由此得名Sarsa算法。它走了一步之后,拿到了(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})之后,就可以做一次更新

代碼演示:

class Sarsa(object):
    def __init__(self, n_actions,cfg,):
        self.n_actions = n_actions  
        self.lr = cfg.lr  
        self.gamma = cfg.gamma  
        self.sample_count = 0 
        self.epsilon_start = cfg.epsilon_start
        self.epsilon_end = cfg.epsilon_end
        self.epsilon_decay = cfg.epsilon_decay 
        self.Q  = defaultdict(lambda: np.zeros(n_actions)) # Q table
    def choose_action(self, state):
        self.sample_count += 1
        self.epsilon = self.epsilon_end + (self.epsilon_start - self.epsilon_end) * math.exp(-1. * self.sample_count / self.epsilon_decay) # The probability to select a random action, is is log decayed
        best_action = np.argmax(self.Q[state])
        action_probs = np.ones(self.n_actions, dtype=float) * self.epsilon / self.n_actions
        action_probs[best_action] += (1.0 - self.epsilon)
        action = np.random.choice(np.arange(len(action_probs)), p=action_probs) 
        return action
    def predict_action(self,state):
        return np.argmax(self.Q[state])
    def update(self, state, action, reward, next_state, next_action,done):
        Q_predict = self.Q[state][action]
        if done:
            Q_target = reward  # terminal state
        else:
            Q_target = reward + self.gamma * self.Q[next_state][next_action] 
        self.Q[state][action] += self.lr * (Q_target - Q_predict) 
3.6.3 Q學習(Q-Learing)

Sarsa是一種同策略on-policy策略。Sarsa優(yōu)化的是它實際執(zhí)行的策略,它直接拿下一步會執(zhí)行的action來去優(yōu)化Q表格,所以on-policy在學習的過程中,只存在一種策略,它用一種策略去做action的選取,也用一種策略去做優(yōu)化。所以Sarsa知道下一步的動作有可能會跑到懸崖那邊去,所以它就會在優(yōu)化它自己的策略的時候,會盡可能的離懸崖遠一點。這樣子就會保證說,它下一步哪怕是有隨機動作,它也還是在安全區(qū)域內

異策略off-policy在學習的過程中,有兩種不同的策略:

  • 第一個策略是需要去學習的策略,即target policy(目標策略),一般用\pi來表示,target policy就像根據自己的經驗來學習最優(yōu)的策略,不需要去和環(huán)境交互
  • 另外一個策略是探索環(huán)境的策略,即behavior policy(行為策略),一般用\mu來表示。\mu可以大膽地去探索到所有可能的軌跡,然后把采集到的數據喂給target policy去學習。而且喂給目標策略的數據中并不需要A_{t+1},而Sarsa是要有A_{t+1}的。Behavior policy可以在環(huán)境里面探索所有的動作、軌跡和經驗,然后把這些經驗交給目標策略去學習。比如目標策略優(yōu)化的時候,Q-learning不會管你下一步去往哪里探索,它就只選收益最大的策略

Off-policy learning有很多好處:

  • 可以利用exploratory policy來學到一個最佳的策略,學習效率高
  • 可以學習其他agent的行為,學習人或者其他agent產生的軌跡
  • 重用老的策略產生的軌跡。探索過程需要很多計算資源,這樣的話,可以節(jié)省資源。

Q-learning有兩種policy:behavior policytarget policy

  • Target policy \pi直接在Q-table上取greedy,就取它下一步能得到的所有狀態(tài),如下式所示:

\pi\left(S_{t+1}\right)=\underset{a^{\prime}}{\arg \max}~ Q\left(S_{t+1}, a^{\prime}\right)

  • Behavior policy \mu可以是一個隨機的policy,但采取 ε-greedy,讓behavior policy不至于是完全隨機的,它是基于Q-table逐漸改進的

于是可以構造Q-learning target,Q-learning的next action都是通過argmax操作來選出來的,于是可以代入argmax操作,可以得到下式:
\begin{aligned} R_{t+1}+\gamma Q\left(S_{t+1}, A^{\prime}\right) &=R_{t+1}+\gamma Q\left(S_{t+1},\arg \max ~Q\left(S_{t+1}, a^{\prime}\right)\right) \\ &=R_{t+1}+\gamma \max _{a^{\prime}} Q\left(S_{t+1}, a^{\prime}\right) \end{aligned}
接著可以把Q-learning更新寫成增量學習的形式,TD target就變成max的值,即
Q\left(S_{t}, A_{t}\right) \leftarrow Q\left(S_{t}, A_{t}\right)+\alpha\left[R_{t+1}+\gamma \max _{a} Q\left(S_{t+1}, a\right)-Q\left(S_{t}, A_{t}\right)\right]

代碼演示:

class QLearning(object):
    def __init__(self,n_states,
                 n_actions,cfg):
        self.n_actions = n_actions 
        self.lr = cfg.lr  # 學習率
        self.gamma = cfg.gamma  
        self.epsilon = 0 
        self.sample_count = 0  
        self.epsilon_start = cfg.epsilon_start
        self.epsilon_end = cfg.epsilon_end
        self.epsilon_decay = cfg.epsilon_decay
        self.Q_table  = defaultdict(lambda: np.zeros(n_actions)) # 用嵌套字典存放狀態(tài)->動作->狀態(tài)-動作值(Q值)的映射,即Q表
    def choose_action(self, state):
        self.sample_count += 1
        self.epsilon = self.epsilon_end + (self.epsilon_start - self.epsilon_end) * \
            math.exp(-1. * self.sample_count / self.epsilon_decay) # epsilon是會遞減的,這里選擇指數遞減
        # e-greedy 策略
        if np.random.uniform(0, 1) > self.epsilon:
            action = np.argmax(self.Q_table[str(state)]) # 選擇Q(s,a)最大對應的動作
        else:
            action = np.random.choice(self.n_actions) # 隨機選擇動作
        return action
    def predict(self,state):
        action = np.argmax(self.Q_table[str(state)])
        return action
    def update(self, state, action, reward, next_state, done):
        Q_predict = self.Q_table[str(state)][action] 
        if done: # 終止狀態(tài)
            Q_target = reward  
        else:
            Q_target = reward + self.gamma * np.max(self.Q_table[str(next_state)]) 
        self.Q_table[str(state)][action] += self.lr * (Q_target - Q_predict)
3.6.4 同策略on-policy和異策略off-policy的區(qū)別
  • 同策略on-policy
    • 使用同一策略\pi學習和與環(huán)境進行交互
    • 兼顧探索和利用
    • 膽小的,策略不穩(wěn)定
  • 異策略off-policy
    • 分離了目標策略\pi和行為策略\mu
    • 不需要兼顧探索和利用
    • 激進的

總結:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容