Deep Reinforcement Learning強化學習是一種探索式的學習方法核畴,通過不斷 “試錯”來得到改進膝但。不同于監(jiān)督學習的地方是,強化學習本身沒有 Label谤草,每做出一個Action之后它無法得到明確的反饋跟束,而監(jiān)督學習每一步都能與真實Label進行對比莺奸。
它有四個要素:Agent,Environment泳炉,Actions憾筏,Rewards。
對象(Agent):也就是我們的智能主題花鹅,比如 AlphaGo。
環(huán)境(Environment):Agent 所處的場景枫浙。比如下圍棋的棋盤刨肃,以及其所對應的狀態(tài)(State)。Agent 需要從 Environment 感知來獲取反饋箩帚。
動作(Actions):在每個State下可以采取什么行動真友,針對每一個 Action 分析其影響。
獎勵(Rewards):執(zhí)行 Action 之后紧帕,得到的獎勵或懲罰盔然,Reward 是通過對環(huán)境的觀察得到。
通過強化學習是嗜,我們得到的輸出就是:Next Action愈案。其數(shù)學實質(zhì)是一個馬爾可夫決策過程。
要解決的問題是:讓agent學習在一個環(huán)境中的做出怎樣的行為(action)可獲得最大的獎勵值總和(reward)鹅搪。這個獎勵值一般與agent定義的任務目標關聯(lián)站绪。
agent需要的主要學習內(nèi)容:第一是行為策略(action policy), 第二是規(guī)劃(planning)丽柿。其中恢准,行為策略的學習目標是最優(yōu)策略, 也就是使用這樣的策略甫题,可以讓agent在特定環(huán)境中的行為獲得最大的獎勵值馁筐,從而實現(xiàn)其任務目標。
行為(action)可以簡單分為:
- 連續(xù)值:如賽車游戲中的方向盤角度坠非、油門敏沉、剎車控制信號,機器人的關節(jié)伺服電機控制信號麻顶。
- 離散值:如圍棋赦抖、貪吃蛇游戲。Alpha Go就是一個典型的離散行為agent辅肾。
On-policy & Off-policy:
On-Policy Temporal Difference methods learn the value of the policy that is used to make decisions. The value functions are updated using results from executing actions determined by some policy. These policies are usually "soft" and non-deterministic. The meaning of "soft" in this sense, is that it ensures there is always an element of exploration to the policy. The policy is not so strict that it always chooses the action that gives the most reward. Three common policies are used,
-soft,
-greedy and softmax. .
Off-Policy methods can learn different policies for behaviour and estimation. Again, the behaviour policy is usually "soft" so there is sufficient exploration going on. Off-policy algorithms can update the estimated value functions using hypothetical actions, those which have not actually been tried. This is in contrast to on-policy methods which update value functions based strictly on experience. What this means is off-policy algorithms can separate exploration from control, and on-policy algorithms cannot. In other words, an agent trained using an off-policy method may end up learning tactics that it did not necessarily exhibit during the learning phase.
Q Learning:
它屬于Off-policy队萤。
Q Learning選擇Q(S,A)用了greedy方法,而計算A(S',A')時用的是max方法矫钓,而真正選擇的時候又不一定會選擇max的行動要尔。
Sarsa:
名字根據(jù)Q(s, a, r, s', a')而來舍杜。它類似Q Learning但是它有兩次Action選擇,下一步的Action是基于確定original action的policy得到的赵辕。它屬于On-policy既绩。
Sarsa Lambda:
[圖片上傳失敗...(image-51f3bd-1555074641848)]
Deep - Q - Network (DQN):
DQN基于Q Learning。在普通的Q-learning中还惠,當狀態(tài)和動作空間是離散且維數(shù)不高時可使用Q-Table儲存每個狀態(tài)動作對的Q值饲握,而當狀態(tài)和動作空間是高維連續(xù)時,使用Q-Table不現(xiàn)實蚕键。
Experience Replay:
- store all game experiences during the episode inside a "replay memory"
then during training we will take random mini-batches of this memory.
Double DQN:
DQN基于Q Learning救欧,其中Qmax會導致Q現(xiàn)實的overestimate。在實際問題中锣光,如果輸出你的 DQN 的 Q 值可能會發(fā)現(xiàn)Q 值都超級大笆怠,這就是出現(xiàn)了overestimate。DQN的神經(jīng)網(wǎng)絡可以看作一個最新的神經(jīng)網(wǎng)絡+老神經(jīng)網(wǎng)絡誊爹,它們有相同的結構但內(nèi)部的參數(shù)更新有時差蹬刷。
Q現(xiàn)實是這樣的:
因為神經(jīng)網(wǎng)絡預測Qmax
有誤差,每次都是向著最大誤差的Q現(xiàn)實
改進神經(jīng)網(wǎng)絡频丘,就是因為合格Qmax
導致overestimate办成,所以Double DQN的想法就是引入另一個神經(jīng)網(wǎng)絡來打消最大的誤差影響。
所以我們用Q估計
的神經(jīng)網(wǎng)絡估計Q現(xiàn)實
中的Qmax(s',a')
的最大動作值椎镣,然后用這個被Q估計
估計出來的動作來選擇Q現(xiàn)實
中的Q(s')
诈火。
兩個神經(jīng)網(wǎng)絡:Q_eval(Q估計),Q_next(Q現(xiàn)實)
把原來的
Q_next=max(Q_next(s', a_all))
更新到Double DQN中的Q_next = Q_next(s', argmax(Q_eval(s', a_all)))
状答。也就是
從TensorBoard看Double DQN和Natural DQN的圖可以看到冷守,它們的結構是一模一樣的,但在計算 q_target
時惊科,方法是不同的拍摇。
另外還需要記錄選擇動作時的Q值。
Prioritized Experience Replay:
按照memory樣本優(yōu)先級進行抽樣馆截,更有效找到需要學習的樣本充活。
優(yōu)先級的評定可以使用TD-error,也就是Q現(xiàn)實-Q估計
蜡娶,如果TD-error越大混卵,代表預測精度還有很多上升空間,優(yōu)先級p越高窖张。
如果每次抽樣都要針對p對所有樣本排序這樣會非常消耗計算能力幕随,所以我們使用一種叫SumTree的方法。
SumTree時一種樹形結構宿接,每片樹葉存儲每個樣本的優(yōu)先級p赘淮,每個樹枝節(jié)點只有兩個分叉辕录,節(jié)點的值是兩個分叉的和,SumTree的根節(jié)點是所有p的和梢卸。
抽樣時走诞,我們將p的總和除以batch size,(n=sum(p)/batch_size)蛤高。
現(xiàn)在我們假設sum(p)=42蚣旱,我們抽6個樣本,這時區(qū)間擁有的 priority 可能是這樣:
[0-7], [7-14], [14-21], [21-28], [28-35], [35-42]
在每個區(qū)間里隨機選取一個數(shù)戴陡,比如在 [21-28]
里選到了24姻锁,就按照這個 24 從最頂上的42開始向下搜索。首先看到最頂上 42
下面有兩個 child nodes套菜,拿著手中的24對比左邊的 child 29
典挑,如果左邊的 child 比自己手中的值大,那我們就走左邊這條路,接著再對比 29
下面的左邊那個點 13
群嗤,這時手中的 24 比 13
大,那我們就走右邊的路壳坪,并且將手中的值根據(jù) 13
修改一下午磁,變成 24-13 = 11。接著拿著 11 和 13
左下角的 12
比懊昨,結果 12
比 11 大窄潭,那我們就選 12 當做這次選到的 priority,并且也選擇 12 對應的數(shù)據(jù)酵颁。
使用TensorBoard我們會發(fā)現(xiàn)DQN with Prioritized replay多了一個 ISWeights (Importance-Sampling Weights)
嫉你,用來恢復被 Prioritized replay 打亂的抽樣概率分布。
Prioritized replay可以高效利用不常拿到的獎勵并好好學習它們躏惋,所以 Prioritized replay 會更快結束每個 episode幽污,很快到達目標。
Dueling DQN:
將每個動作的 Q 拆分成了 state 的 Value加上每個動作的Advantage簿姨。
DQN 直接輸出每個動作的 Q值距误,而 Dueling DQN每個動作的 Q值由下式確定:
Policy Gradient:
強化學習是一種通過獎懲來學習正確行為的機制。學習高價值行為的有Q Learning和DQN扁位,也有不通過分析獎勵值直接輸出的Policy Gradient准潭,這樣的好處是可以在連續(xù)區(qū)間挑選動作,而基于值的Q Learning如果在無窮多的動作中計算價值再選擇行為會消耗太大域仇。
Policy Gradient不輸出action的value刑然,而直接輸出具體的action,跳過了value這個階段殉簸。
輸出的action可以是連續(xù)的值闰集,之前那些value-based的方法輸出不連續(xù)的值沽讹,然后選值最大的action,而Policy Gradient可以在連續(xù)分布上選取action武鲁。
Policy Gradient是一種基于整條回合數(shù)據(jù)的更新爽雄,也叫Reinforce方法。
delta(log(Policy(s,a))*V)
表示在 狀態(tài) s
對所選動作 a
的吃驚度沐鼠。如果 Policy(s,a)
概率越小挚瘟,反向的 log(Policy(s,a))
(即 -log(P)
) 反而越大。如果在 Policy(s,a)
很小的情況下饲梭,
拿到了一個 大的 R
乘盖,也就是 大的 V
,那 -delta(log(Policy(s, a))*V)
就更大憔涉,表示更吃驚订框。比如選了一個不常選的動作,發(fā)現(xiàn)它能得到了一個好的 reward兜叨,那么對這次的參數(shù)進行一個大幅修改穿扳,這就是吃驚度的物理意義。
選行為的時候不是根據(jù)Q value而是根據(jù)概率国旷。生成action的過程矛物,本質(zhì)上是一個隨機過程。最后學習到的策略跪但,也是一個隨機策略(stochastic policy)履羞。
Actor Critic:
結合值和概率的一種算法。
Actor依據(jù)Policy Gradient基于概率選行為屡久,Critic依據(jù)Q Learning等以值為基礎的學習方法忆首。
Critic基于Actor的行為評判行為的得分,Actor根據(jù)Critic的評分修改選行為的概率涂身。
Policy Gradient屬于回合更新雄卷,這樣降低了學習效率。Critic學習獎懲機制蛤售,使得Actor每一步都能更新丁鹉,而不是Policy Gradient等到回合結束菜更新。
Actor Critic涉及兩個神經(jīng)網(wǎng)絡悴能,而且每次都在連續(xù)狀態(tài)中更新參數(shù)揣钦,每次參數(shù)更新前后都有相關性,導致神經(jīng)網(wǎng)絡只能片面看待問題漠酿,甚至學不到東西冯凹,于是Google DeepMind改進了這個方法。
Deterministic Policy Gradient (DPG):
確定性的行為策略,每一步的行為通過函數(shù)μ直接獲得確定的值宇姚,不再是一個需要采樣的隨機策略匈庭。
因為PG學到隨機策略后每一步行為都對最優(yōu)策略概率分布進行采樣才能獲得action具體值,而action通常是高維向量浑劳,在高維空間頻繁采樣影響計算能力阱持。
Deep Deterministic Policy Gradient (DDPG):
Actor-Critic + DQN = Deep Deterministic Policy Gradient
Deterministic 就改變了輸出動作的過程,在連續(xù)動作上輸出一個動作值魔熏。
DDPG是針對連續(xù)行為的策略學習方法衷咽。在RL領域,DDPG主要從:PG -> DPG -> DDPG 發(fā)展而來蒜绽。
Code:
實現(xiàn)強化學習的代碼主要分為三個部分:
- 環(huán)境腳本 (env.py)
- 強化學習腳本 (rl.py)
- 主循環(huán)腳本 (main.py)
根據(jù)不同的學習方法镶骗,每個環(huán)節(jié)有一些基本的function和變量:
- rl.py
- rl.choose_action(s)
- rl.store_transition(s, a, r, s_)
- rl.learn()
- check_state_exist(self, state)
- rl.memory_full
- env.py
- env.reset()
- env.render()
- env.step(a)
- env.state_dim
- env.action_dim
- env.action_bound
框架大致如下:
# main.py
# 導入環(huán)境和學習方法
from env import Env
from rl import RL
# 設置全局變量
MAX_EPISODES = 500
MAX_EP_STEPS = 200
# 設置環(huán)境
env = Env()
s_dim = env.state_dim
a_dim = env.action_dim
a_bound = env.action_bound
# 設置學習方法
rl = RL(a_dim, s_dim, a_bound)
# 開始訓練
for i in range(MAX_EPISODES):
s = env.reset() # 初始化回合設置
for j in range(MAX_EP_STEPS):
env.render() # 環(huán)境的渲染
a = rl.choose_action(s) # RL選擇動作
s_, r, done = env.step(a) # 在環(huán)境中進行動作
# 存放記憶庫
rl.store_transition(s, a, r, s_)
if rl.memory_full:
rl.learn() # 記憶庫滿了, 開始學習
s = s_ # 變?yōu)橄乱换睾?
# env.py
class Env(object):
def __init__(self):
pass
def step(self, action):
pass
def reset(self):
pass
def render(self):
pass
# rl.py
class RL(object):
def __init__(self, a_dim, s_dim, a_bound,):
pass
def choose_action(self, s):
pass
def learn(self):
pass
def store_transition(self, s, a, r, s_):
pass