Reinforcement Learning


https://www.bilibili.com/video/av9770302/?p=24

https://www.bilibili.com/video/av24724071/?p=3

https://zhuanlan.zhihu.com/p/25239682

 

強化學習概覽

分為幾個要素,

首先我們可以觀察到state,observation

然后我們采取Action

環境會對我們采取的Action,給與Reward,由此可以知道action的效果的好壞

最終我們學習的目的是,policy,即state和action的匹配關系

 

那么強化學習和傳統的supervised learning有啥區別,為什么需要強化學習

傳統supervised learning的場景,是人可以知道明確答案的,比如圖片分類等,這樣才能訓練集去supervise機器

但是有些問題,人也無法決定如何做事正確答案,比如玩游戲,這是就需要強化學習,通過經驗去試錯

 

用video game來舉例看下,實際的強化學習的過程,

每次看到游戲畫面observation就是state
采取的actions,包含左移,右移,fire
殺死外星人就可以得到一定的reward

游戲從開始玩到gameove,稱為一個episode,我們的目標,就是在一個episode中得到盡可能多的reward

 

強化學習,可以這樣分類,

首先是Model-based和model-free,
model-based就是對環境有先驗知識,比如下圍棋,你讀過棋譜,知道規則,那么你可以對環境后續的變化做出預判
model-free就是比較盲目的,不了解環境,只能試錯

顯然model-based的效率要好,但是很多場景沒辦法model-based,因為你確實也沒有先驗知識

在Model-free里面,又分成Policy-based和Value-based

我們上面說強化學習的目標,就是學習policy,即即state和action的匹配關系

所以Policy-based的方法,是比較直接的方法,我把Actor/policy作為一個function,那么只要學習出這個function,問題就解決了

在Policy-based里面又可以分成on-policy和off-policy,一般看到的都是on-policy,就是和環境互動的agent就是學習agent本身
off-policy,和環境互動的agent和學習agent分開,不是同一個

 

而Value-based的方法,比較曲折,直接學習出policy function比較抽象,換個思路,學習一個critic,它會評價在某個state下的每個action

如果能學習出critic,那我們就可以通過他的評價,來選擇最好的action,這個問題也就解決了

Q-learning就是典型的Value-based的方法,它是根據之前所有的經驗來統計出當前state選擇某個action,會得到的最終的Reward;但這種方法,缺乏泛化能力,對於沒見過的case,無法處理,所以出現DQN用nn來擬合critic

 

Policy-based Actor

由於policy-based是比較新的技術,也是當前比較主流的技術,所以先介紹policy-based的方法,

Policy-based的方法,可以分成三步,

第一步先定義一個function,那么這里就用nn來作為一個actor

輸入是游戲畫面,輸出是每個actions的probability,一般在選擇action的時候要加入random,否則會缺乏exploration的能力,即每次相同選擇,沒有機會發現新大陸

 

第二步,怎么判斷function的好壞?

判斷一次episode的好壞,就是這個過程中獲得的reward和
那么一個actor,會產生很多各種各樣的episode,或trajectory,只要算出所有episode的R的期望,就可以用來衡量actor function的好壞

而期望實際上算不出來,所以用sample來近似,最終得到了右邊的結果

 

第三步,如何找到其中最好的actor function

答案就是用Gradient Asent,來得到最優的actor function

那么下面就是對R的期望求gradient的問題,

 最終R期望的梯度公式如下,

 

Tips

但這樣的問題在於,比如對於游戲它的R可能都是正的,這樣b, c會被sample到,那么他們的概率會被放大,而a其實reward比c大,但是由於沒有被sample到,所以概率反而會被減小

所以增加一個baseline,大於這個baseline的reward才認為是正向reward,小於就認為是負向的reward 

上面的算法還有一個明顯的問題,我們在考慮一個action是正向還是負向的時候,考慮的是整個episode的reward和

很直覺的想法就是,最終的結果是正向的,並不代表過程中的所有action都是正向的,比如下左圖,R=3基本都是由於a1這個action的reward,而a2,a3沒有啥貢獻,甚至產生負的reward

那么這個情況當sample足夠多的情況下,是可以克服的,但是普通情況下sample都是不足夠的

所以一個想法,當前的action只會對它后面的reward有作用,並且越靠近的reward受到的影響應該越大

所以這里會用action之后的reward和來替換整個episode的reward和,並且要乘上discount factor,讓action的影響遞減

替換部分稱為advantage function,這個在后面的A3C算法中會看到

 

PPO (Proximal Policy Optimization) 

前面的policy的方法都是on-policy的方法,下面介紹的PPO,當前是OpenAI的默認RL算法,是一種off-policy的方法

off-policy,就是和環境互動的agent和我訓練的agent是兩個不同的agent

為什么要用off-policy這么trick的方法?

因為on-policy,每次收集和環境互動得到的data,然后更新參數,更新完參數后,之前收集的data就沒法繼續用了,需要再和環境互動收集新的data

這樣非常耗費時間

如果我們有個一個agent,它的參數是fix的,專門去和環境交互並收集data,然后用這些data去訓練我們的當前的agent,這些收集的data就是可以被重用的

這個方法類比,你看別人打球,或下棋,然后從你觀察到數據來用於自己學習

具體怎么做,這個首先基於一個理論,importance sampling,

如果我們要算一個分布P中x,對於f(x)的期望,如果不能直接求解,我們用的方式就是sample,在P中sample n個x,然后算平均

那么如果我們這時沒法在P中做sample,我們有任意一個分布Q,我們在Q中做sample,仍然能算出f(x)在P上的期望

這個感覺很神奇,但是上面的推導確實給出公式 

用這個理論還是有些問題的,

問題在於這個理論保證期望不變,但是方差是變化的,所以如果兩個分布相差太遠,方差會有較的差異

比較形象的例子,右圖,如果P,Q的分布式相反的,這樣去sample會導致,如果在P中sample那么絕大部分情況會集中在左邊,而在Q中sample會集中在右邊

這樣會導致得到的期望完全不一樣,當然如果sample足夠多,這個問題是可以被克服的,因為小概率事件還是有可能會發生的,你在Q中也是有小概率會sample到左邊的點

現在回到off-policy,我們要做的就是,用在一個agent上sample的數據,來計算在另一個agent上的reward和的期望

上面說到過,這里會用advantage function來優化這個R

第二步做的就是importance sampling的轉換

第三步假設不同agent出現某個state的概率相同,所以把這項消掉,因為state和你選擇啥policy沒關系,也說的通

第四步得到off-policy的目標函數

這個算法就稱為PPO,但是上面說了兩個agent的分布如果差的很遠會影響算法效果

所以一般會加上一個正則項,即兩個分布的KL,這樣會讓兩個分布盡可能的接近

 

這個PPO算法的問題是實現比較麻煩,尤其后面的那個KL

所以出現PPO2,這里去掉了KL,但是用clip來限制兩個分布不相差太遠

如果A是正向的,那么我們要盡可能增加學習agent的state|action的概率,但是當逼近和環境交互的agent的概率,就會停止,因為min會限制住它

如果A是負向的,反之盡量降低這個概率,但是同樣只能逼近另一個概率

 

 Value-based Critic

Critic不決定采取什么action,而只是評價actor好壞

對於Critic,就是要訓練一個function V,輸入是某個actor和state,輸出是從state到episode結束的reward總和

那么如何訓練Critic?

兩種方法,

Monte-carlo方法,直覺的方法,V不就是要擬合整個episode的reward嗎,那就對於該actor和一個state,會得到實際的reward G,那么V只要去逼近G就可以完成訓練

Temporal-difference方法,這個就有些trick,兩個相鄰狀態V應該相差這步的reward,那么就用這個差值來擬合V,這個方法的好處就是不需要等episode結束,每一步都可以train

兩個方法的不同,

MC方法的varianc會比較大,因為每次從Sa出發,最終得到的結果G可能會有很大的差異,因為環境和model都有隨機性,而G是多步疊加的結果,所以Var會很大

TD方法,因為r只是一小步的reward,所以這個Var就會相對比較小,但是TD,根據一步訓練,所以會有偏差

Q-learning 

上面學習到V,只是知道當前state下最終會得到的reward是多少,但是並沒有辦法根據V去選擇action

所以我們需要一種新的Critic,Q,給出在當前state下,選取某個action得到的reward和

如果我們得到Q,那么就很容易選擇下一步的action,選reward最大的好

這樣就不需要訓練單獨的actor和policy,因為通過Q可以推導出policy,這就是Q-learning

由於Q-learning,每步需要找出最大的Q,所以如果action是連續的,就會比較麻煩,需要gradient descend;但是對於離散的action就會很簡單,窮舉就好

這里形式化的表達,只需要每一步state都選取最大的Q,我就可以得到一個更好的actor

這是非常直覺的一個事情,如果我通過Q可以知道選取哪個action可以得到更大的reward,那么當然應該選擇該action

這里給出形式化證明,

Q-learning算法

那現在的問題就是如何學習Q?訓練的時候有一些tips

Target Network

你可以用TD的方法,仍然是兩部之間差一個rt

實現的時候,這里有兩個Q,雖然參數上應該是一樣的,但是訓練的時候會fix住一個的參數,稱為TargetNetwork,讓另一個去逼近;然后再把參數同步過去,再去逼近,這樣實現更容易些

Exploration

增強學習的時候,要去嘗試新的選擇,因為保守的選取之前嘗試過的case,可能會錯過最優解

基本策略是加入隨機性,比如大概率選MaxQ,但有小概率會random;在訓練的前期,exploration比較關鍵,而到了后期,你已經嘗試過所有case的情況下,exploration就沒有那么關鍵了,所以這個概率可以隨着學習的過程decay

Replay Buffer

不光當前policy actor和環境交互的數據被記錄下來,之前的actor和環境交互的數據也會被記錄下來

訓練的時候從buffer中選取一個batch,這個里面有可能包含一些其他actor的交互數據,這樣訓練的魯棒性會比較強,而且大大節約actor的交互時間

 

加上這些tips,典型的Q-learning算法,

兩個Q,一個作為target network
在和環境互動的時候,加入epsilon greedy,增加exploration的能力
將互動得到的數據放入buffer,然后從buffer中隨機sample一批數據作為訓練數據去計算target network Q^
不斷的讓Q去逼近這個Q^,n部后,把Q的參數同步給Q^

 

 

Adanced Q-learning

Double DQN

DQN有個問題,就是Q的value會被over estimate

因為Q一定是有誤差的,或大或小,但是由於訓練過程中總是選Max Q,所以會總是選到被高估的action

Double DQN,就是用兩個Q函數而不是一個,這樣一個Q決定如何選擇action,另一個Q用於計算reward,這樣只要不是兩個Q都over estimate某一個action,就不會有太大的問題

 

Dueling DQN

這個方法其實就是改了下網絡結構,加了一層,但是這樣為何就比原來的好?

右圖,這個方法會通過加約束,讓算法傾向於修改Vs,而不是A,這樣通過sample到case的學習的結果,就可以影響到未sample到的case

 

Prioritized Reply

從buffer里面sample測試集的時候,不是隨機的sample,而是挑選那些在上一次training中TD error比較大的data

 

Multi-step

MC是整個完整的episode做完后,才能train
而TD是完成一步以后就可以train

自然的想法是balance一下,mini-batch,若干步后用TD training

 

Noisy Net

增加noise是為了增加模型的exploration能力
之前的方法是noise on action,即選擇action的時候,會小概率加入隨機action
當前的方法稱為noise on parameter,即在episode開始的時候,在Q的nn的參數上加入一定的noise

這樣做的好處見右圖,noise action不確定性太大

 

Distributional Q-function

原先Q,是一個期望,在s狀態,采取a后,得到的reward總和的期望,平均值

但平均值不能很好的反應出數據,左圖中兩個分布的平均值一樣,但是分布相差很遠

所以對於Q我們不光只輸出一個期望值,而是輸出一個期望的分布,比如右圖,對於每個action,輸出5個值,表示不同期望區間的概率分布

那么這些技術tips的效果到底如何?

Rainbow是結合所有的tips所達到的效果,可以看到還是非常不錯的

其他的線表示單獨加上一種tip時候,對性能的影響

右圖,是反映在rainbow中,去掉某一種tip時的效果,可以看到去掉multi-step或priority時,性能會下降很大

 

Continuous Action

Q-learing對於離散的action是比較好處理的,如果是連續的action應該如果去做
Sample是比較簡單的方法,但是不准確;gradient asent太費了
第三種方法,比較匪夷所思,設計一種網絡Q,讓他比較容易算出max,如下圖定義Q(s,a),當a=u(s),第一項為0,整個就取到max值

 

A3C

A3C,一共3個A,一個C

其中一個A和C,表示同時使用Actor和Critic,即policy-based和value-based

那么直接用policy-based,有啥不好?

可以看到policy-based做梯度上升的時候,是需要用到G,即整個episode的reward和

這樣要求一個episode結束后才能開始訓練,並且這個G的variance是非常大的,就是非常不穩定

 

 

那么既然現在我們有一個critic,而critic可以預測出G的期望,那么是否可以用來替換G?這樣就可以做到每一步都能訓練,並且提供穩定性

如下左圖,G的期望就等價於Q,而baseline,我們用V來替換,因為V表示在狀態St所得到的reward期望,而我們采取的action a時,所得到的reward要高於這個才是有價值的

但是這樣,我們要同時訓練Q和V兩個function,所以Advantage Actor-Critic,所做的是用V來近似表示Q,這樣我們只需要訓練V這一個function,

Advantage Function的定義也很直覺,后面括號中的部分是用Critic預測走這一步所會得到的reward,這個可以看做是一個baseline

如果我們實際這一步得到的reward大於baseline,那么我們就認為這步是正向的,否則是負向的

 

A3C設計的Tips,

首先actor和critic可以共享部分網絡,這個是顯然的,因為輸入都是s,比如游戲畫面,輸出雖然有不同,但是前面大部分的網絡可以共享

用output entropy作為Actor輸出的正則項,即Actor會有機會傾向於去嘗試不確定的action,這樣模型會比較好的泛化能力

 

最后一個A,異步,這個比較工程的想法,就是用多組actor-critic同時來訓練和更新參數,更快的收斂

 

 

Pathwise derivative policy gradient

本身Q-learning得到的Q,就可以決定選擇哪個action,前面說了這樣對於連續性的action就很麻煩

這個方法說,不,critic只能評價,不能直接決定action

還是要訓練一個actor決定采取什么樣的action

這時其實是把Q作為supervisor

訓練的方式就是把actor和Q連成一個大的nn,固定住訓練好的Q的參數,訓練actor的參數,使得最終的輸出最大化

然后再用更新過的actor和環境互動,進一步去訓練Q,周而復始

最終使用的時候,直接用actor就可以,不用管Q

這個方法的最大價值,是它可以類比GAN,

Actor是generator,Q是Discriminator,很有意思

這里有兩個tips,

第一個,replay buffer,即在訓練Q的時候,會把所有actor和環境的互動的過程都記錄下來,用於訓練Q,這樣更加robust

第二個,actor的輸出要加隨機noise,泛化和exploration的能力

 

這里給出一個實際的算法實現對比,左邊是經典的Q-learning,右邊通過4步的變化,成為Pathwise Derivative Policy Gradient

第一步,用actor π來覺得采取什么action,而不是用Q
第二步,用target actor π^的輸出作為Q^的輸入
第三步,Fix住Q,調整actor π的參數,使得Q最大化
第四步,更新π^,Q^

 

 

Imitation learning

有些場景下,不太好定義出reward

比如說自動駕駛或chatbot

如果不能明確定義出reward function,我們就無法用RL去訓練

這時的思路,就是imitation learning,意思是用expert的示范來告訴你應該怎么做,比如比較典型的是自動駕駛,通過看大量人類駕駛的錄影來學習

這里最直觀的就behavior cloning,即expert怎么做,你照搬就好,這就是典型的supervised學習

這個方法的缺點,就是會有盲區,如果沒有看到過這個場景的例子,機器會不知道該怎么辦,比如人開車很少會撞牆,所以機器當快撞牆時,就沒有經驗可以借鑒

第二個缺點,就是expert並不是所有的行為都是有用的,或有益的,而單純的clone這些行為是沒有意義的

所以比較科學的方法,加做Inverse Reinforcement Learning

普通的RL,是通過定義reward function,來訓練出actor

而如果我們不知道reward function,就需要先通過一堆demonstration來找到真正的reward function

 

如何找?

類似GAN的過程,

我們用Expert的一堆操作作為positive的例子,而隨機產生一個actor的操作作為negative的例子,這里actor是一個nn,可以看成generator

我們來訓練一個Reward function,也是一個nn,使得它能分辨出expert的操作優於actor的操作,可以看出Discriminator

然后我們用新的reward function來訓練一個新的actor,再用新actor產生的操作作為negative例子,進一步的去更新reward function。。。。。。

 


免責聲明!

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



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