三. 表格型方法(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),它和之前的和
都沒有什么關系。然后再加上這個過程也取決于智能體跟環(huán)境交互的這個
,所以有一個決策的一個過程在里面,就稱這樣的一個過程為
馬爾可夫決策過程(Markov Decision Process,MDP)
MDP就是序列決策這樣一個經典的表達方式。MDP也是強化學習里面一個非?;镜膶W習框架。狀態(tài)、動作、狀態(tài)轉移概率和獎勵,這四個合集就構成了強化學習
MDP的四元組,后面也可能會再加個衰減因子構成五元組
3.1 無環(huán)境交互(model-base)
狀態(tài)轉移概率函數+獎勵函數=>已知的馬爾可夫決策過程(環(huán)境已知)=>策略迭代+價值迭代=>最佳策略
把可能的動作和可能的狀態(tài)轉移的關系畫成一個樹狀圖。它們之間的關系就是從到
,再到
,再到
,再到
這樣子的一個過程
跟環(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-based跟model-free的一個最大的區(qū)別。強化學習就是可以用來解決用完全未知的和隨機的環(huán)境。強化學習要像人類一樣去學習,人類學習的話就是一條路一條路地去嘗試一下,先走一條路,看看結果到底是什么。多試幾次,只要能活命的??梢月亓私饽膫€狀態(tài)會更好:
- 用價值函數
來代表這個狀態(tài)是好的還是壞的
- 用
Q函數來判斷說在什么狀態(tài)下做什么動作能夠拿到最大獎勵,用Q函數來表示這個狀態(tài)-動作值
3.3 model-base與model-free的本質區(qū)別
當使用概率轉移函數
和獎勵函數
來描述環(huán)境
-
model-base
- 當我們知道概率函數和獎勵函數時,馬爾可夫決策過程已知,可以采用策略迭代或價值迭代獲得智能體的最優(yōu)策略,這個過程
Agent沒有與環(huán)境進行交互 - 在很多實際的問題中,
MDP的模型有可能是未知的,也有可能模型太大了,不能進行迭代的計算。比如Atari游戲、圍棋、控制直升飛機、股票交易等問題,這些問題的狀態(tài)轉移太復雜了
- 當我們知道概率函數和獎勵函數時,馬爾可夫決策過程已知,可以采用策略迭代或價值迭代獲得智能體的最優(yōu)策略,這個過程
-
model-free
- 當概率函數和獎勵函數時,處于未知的環(huán)境中,讓智能體與環(huán)境進行交互,采集很多軌跡數據,
Agent從軌跡中獲取信息改進策略,從而獲得更多的獎勵,目前大部分領域的AI應用都是model-free模式
- 當概率函數和獎勵函數時,處于未知的環(huán)境中,讓智能體與環(huán)境進行交互,采集很多軌跡數據,
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)動作價值(未來的總收益)可使用折扣因子:考慮累積收益,并且對于未來的收益也做考慮,但是越后面的收益對當前價值影響越小,因此
| 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:
蒙特卡洛是用經驗平均回報(emmpirical mean return)的方法來估計的,即把每個軌跡的return進行平均,就可以知道某一個策略下面對應狀態(tài)的價值
算法步驟:
- 在時間步
,狀態(tài)
被訪問:
- 狀態(tài)s的訪問數增加1:
- 狀態(tài)s的總的回報
增加
:
- 通過回報的平均估計狀態(tài)s的價值:
假設現在有樣本,可以把經驗均值(empirical mean)轉換成
增量均值(incremental mean)的形式,如下式所示:
通過這種轉換,就可以把上一時刻的平均值跟現在時刻的平均值建立聯系,即:
其中:
-
是殘差
-
類似于
學習率(learning rate)
當得到,就可以用上一時刻的值來更新現在的值:
比較動態(tài)規(guī)劃法和蒙特卡洛方法的差異:

動態(tài)規(guī)劃法:通過上一時刻的值的值。不斷迭代,直到達到收斂:,動態(tài)規(guī)劃也是常用的估計價值函數的方法。在動態(tài)規(guī)劃里面,我們使用了
bootstrapping的思想。bootstrapping的意思就是基于之前估計的量來估計一個
蒙特卡洛方法:通過一個回合的經驗平均回報進行更新:,
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是無模型的,通過引導,從不完整的回合中學習,用一個估計來更新另一個估計。
目的:對于給定策略,在線地算出它的價值函數
,即對于某個給定的策略,在線(online)地算出它的價值函數:
最簡單的算法是TD(0),每往前走一步,就做一步bootstrapping,用得到的估計回報(estimated return)來更新上一時刻的值。估計回報被稱為
TD目標(TD target),TD目標是帶衰減的未來收益的總和。TD目標由兩部分組成:
- 走了某一步后得到的實際獎勵:
- 利用
bootstrapping的方法,通過之前的估計來估計,然后加了一個折扣系數,即
,具體過程如下式所示:
TD目標是估計有兩個原因:它對期望值進行采樣,并且使用當前估計而不是真實
TD誤差(TD error):
可以類比于Incremental Monte-Carlo的方法,寫出如下的更新方法:
時序差分目標是帶衰減的未來收益的總和。對于n步時序差分:
即當時,時序差分變成了蒙特卡羅
3.5.3 比較蒙特卡洛和時序差分法
蒙特卡洛增量式:
時序差分增量式:
時序差分可以在不完整的序列上學習,蒙特卡洛只能在完整的序列上學習
時序差分可以在連續(xù)的環(huán)境下(無終止)學習,蒙特卡洛只能在有終止的情況下學習
時序差分可以在線學習,每走一步就可以更新。蒙特卡洛必須等到序列結束才能學習
3.6 無模型交互控制(model-free comtrol)
把
policy iteration進行一個廣義的推廣,使它能夠兼容MC和TD的方法,即Generalized Policy Iteration(GPI) with MC and TD
策略迭代:

Policy iteration由兩個步驟組成:
- 根據給定的當前的policy
來估計價值函數
- 得到估計的價值函數后,通過
greedy的方法來改進它的算法
這兩個步驟是一個互相迭代的過程,由于不知道獎勵函數和狀態(tài)轉移,無法使用策略迭代進行優(yōu)化。因此我們引入廣義策略迭代的方法
廣義策略迭代(蒙特卡洛估計Q函數):
- 用蒙特卡洛方法代替動態(tài)規(guī)劃估計
Q函數: - 假設每一個回合都有一個探索性開始
,保證所有的狀態(tài)和動作都在無限步的執(zhí)行后能被采樣到
蒙特卡洛求Q表的過程:
在每一個策略迭代回合中
- 采用蒙特卡洛策略估計
- 首先采集數據,獲得一條新的軌跡,計算軌跡上各個狀態(tài)的真實回報
- 采用增量的方法更新Q:
- 首先采集數據,獲得一條新的軌跡,計算軌跡上各個狀態(tài)的真實回報
- 基于貪心思想進行策略更新:
- 一個策略迭代回合結束,采樣數據進入新的一回合。當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:
每次更新值函數都需要知道當前狀態(tài)、當前動作、獎勵、下一步狀態(tài)、下一步動作A’,即之后,就可以做一次更新。A’是下一步驟一定會執(zhí)行的動作
-
更新公式
單步更新法:
每執(zhí)行一個動作,就會更新以此價值和策略。單步Q收獲為:
其中為下一步驟一定會執(zhí)行的動作。單步Sarsa更新公式為:
n步Sarsa(n-step Sarsa):
在執(zhí)行n步之后再來更新Q函數和策略。n步Q收獲為:
如果給加上折扣因子
并進行求和,即可得到
的
Q收獲:
綜上所述,將Q收獲帶入增量公式可得,n步更新公式為:
- Sarsa所作出的改變很簡單,就是將原本
TD更新V的過程,變成了更新Q,就是說可以拿下一步的Q值來
更新這一步的Q值。Sarsa是
直接估計Q-table,得到Q-table后,就可以更新策略。該算法由于每次更新值函數需要知道當前的狀態(tài)(state)、當前的動作(action)、獎勵(reward)、下一步的狀態(tài)(state)、下一步的動作(action),即這幾個值 ,由此得名
Sarsa算法。它走了一步之后,拿到了之后,就可以做一次更新

代碼演示:
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(目標策略),一般用來表示,
target policy就像根據自己的經驗來學習最優(yōu)的策略,不需要去和環(huán)境交互 - 另外一個策略是探索環(huán)境的策略,即
behavior policy(行為策略),一般用來表示。
可以大膽地去探索到所有可能的軌跡,然后把采集到的數據喂給
target policy去學習。而且喂給目標策略的數據中并不需要,而
Sarsa是要有的。
Behavior policy可以在環(huán)境里面探索所有的動作、軌跡和經驗,然后把這些經驗交給目標策略去學習。比如目標策略優(yōu)化的時候,Q-learning不會管你下一步去往哪里探索,它就只選收益最大的策略
Off-policy learning有很多好處:
- 可以利用
exploratory policy來學到一個最佳的策略,學習效率高 - 可以學習其他
agent的行為,學習人或者其他agent產生的軌跡 - 重用老的策略產生的軌跡。探索過程需要很多計算資源,這樣的話,可以節(jié)省資源。
Q-learning有兩種policy:behavior policy和target policy:
- Target policy
直接在
Q-table上取greedy,就取它下一步能得到的所有狀態(tài),如下式所示:
- Behavior policy
可以是一個隨機的policy,但采取 ε-greedy,讓
behavior policy不至于是完全隨機的,它是基于Q-table逐漸改進的
于是可以構造Q-learning target,Q-learning的next action都是通過argmax操作來選出來的,于是可以代入argmax操作,可以得到下式:
接著可以把Q-learning更新寫成增量學習的形式,TD target就變成max的值,即

代碼演示:
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
- 使用同一策略
學習和與環(huán)境進行交互
- 兼顧探索和利用
- 膽小的,策略不穩(wěn)定
- 使用同一策略
-
異策略off-policy
- 分離了目標策略
和行為策略
- 不需要兼顧探索和利用
- 激進的
- 分離了目標策略
總結:
