强化学习:函数逼近思想
在開始這一篇內容之前,讓我們先回顧一下前8篇所提及的內容。概括地說,前八篇所講到的各種強化學習方法(DP、MC、TD等),有一個共同套路:即采用數據表存儲每一個狀態(state)的價值量(value),然后用不同的方式更新這些狀態的value,直至收斂;最后根據每個狀態下不同動作(action)對應的value,決定應該選擇哪個狀態,也就是確定了策略(policy)。盡管不同的方法之間有些小的差異,但是從本質上看是相似的。
但是從本篇開始提及的“函數近似”方法,卻在本質上有了幾個重大改變,也因此有了一些突出的特點。首先要說明的是:“函數近似”更像是一種思想,包含一類方法,從后面的章節就能看出來,基于這個思想,可以衍生出很多不同類型的方法。同時,該方法也正式把強化學習和機器學習聯系起來,讓我們可以互相借鑒兩個領域的一些優勢。
那么,函數近似這類方法,有什么改變?第一、對狀態的價值量(value)的存儲使用函數來表征,不再用數據表。第二、采用機器學習中流行的有監督訓練方式來更新函數的固有參數,直至函數收斂。一旦函數訓練完成,我們就自然得到了“狀態x”--“狀態價值量y”之間的映射關系,然后由狀態價值決定策略就是順理成章的事了。這兩個改變也相應帶來了顯著的特點:第一、函數近似方法不需要大量的存儲空間來存狀態,因為函數的參數個數通常遠遠少于環境狀態的數量(深度神經網絡也許是個例外);第二、訓練出來的函數具備一定的泛化特性(這也是機器學習方法的常見特性),可以應對部分可觀測的環境,這對在實際問題中應用強化學習方法是個好事,因為很多時候我們是無法窮盡所有狀態的。
下面開始正式介紹這一類方法。
1. 函數近似思想
1.1 什么是“函數近似”思想?
采用某種函數(線性函數或者非線性函數等等),基于小部分訓練樣本,來擬合價值函數的真值,比如 或 ,使之在較大規模的測試樣本上同樣適用。這種思想的主要任務就是求該函數的最優參數。
1.2 為什么引進“函數近似”思想?
(1)數據表形式的價值函數有缺陷。
到目前為止,我們對強化學習問題的討論,都局限于tabular的形式,也就是采用一張表來存儲當前任務的價值函數。這張表,可以理解成python里面的字典結構,任務中所有的“狀態/狀態-動作”作為keys,每個“狀態/狀態-動作”的價值作為values。為什么這種數據表形式的強化學習會限制強化學習問題的規模呢?有如下兩個原因:1、內存空間。當問題規模超大時,存儲這么一張表需要的內存空間是巨大的。2、計算時間和所需數據量。當問題規模變大后,再想準確地計算這張表中的每個值,需要的時間開銷是巨大的;同時,在很多實際任務中,有些狀態和動作是永遠不會出現的,這就導致價值函數很難準確計算。
上面這番文字提到的問題,簡單總結后,就是四個字:泛化問題,即在小規模數據上獲得的經驗,怎么才能夠在大規模的數據上也適用?
(2)參數方程形式的價值函數可以解決上述泛化問題
使用函數近似的思想,我們只需找到一組最優的參數,也就確定了最優的擬合函數。這個擬合函數既不需要存儲大量的狀態價值信息,也不要求看到整個狀態-動作空間。只要它的參數包含了整個狀態-動作空間背后的規律,那么它就可以在任何情況下都表現良好,也就是泛化能力好。
1.3 需要注意的問題
函數近似思想來源于傳統的機器學習問題。將這種思想移植到強化學習問題中,自然會帶來一些問題。這是因為強化學習中存在很多傳統機器學習沒有的特點,比如:非穩定性(包括狀態分布和獎勵分布的不穩定性),自舉性(bootstrapping),目標的延后性。在將函數逼近思想融合到強化學習的過程中,這些問題都要考慮到并做出相應改進。
1.4 如何用函數近似思想解決on-policy prediction問題?
我們知道強化學習中存在on-policy和off-policy之分,也存在prediction和control問題之分。事實上,on-policy和off-policy的本質區別在于,更新某狀態的價值量時,所使用的方法是沿用既定的策略(on-policy)還是使用新策略(off-policy)。而prediction和control問題的本質區別在于所估計的是狀態價值函數 ,還是動作價值函數 。其實這就是幾種相似但又有少許不同的問題,我們本篇就從on-policy的prediction問題入手,看看函數近似思想怎么應用。
既然函數近似思想來源于傳統機器學習,那么其主要步驟也跑不了機器學習那一套。在函數近似思想的定義中我們提到“這種思想的主要任務就是求該函數的參數”,如何求?分為以下三個步驟:
- 確定價值函數的擬合模型
- 確定待優化的目標函數
- 確定參數的更新算法
這三個環節層層遞進,初步給出我們解決on-policy prediction問題的框架,下面分別討論。
?
2. 確定價值函數的擬合模型
2.1 價值函數的參數方程表示
在前面幾章,價值函數都是采用數據表的形式存儲,一個蘿卜一個坑。從這一章開始,我們開始采用參數方程的形式表示價值函數,寫法: 。該寫法表示當權重向量為 時,狀態s的價值近似值。比如: 可以是關于狀態特征的線性函數, 的每個元素表示每個特征的權重; 還可以是通過神經網絡建模得到的非線性函數, 表示神經網絡中神經元之間的連接權值。通過改變 ,我們可以得到各種各樣的擬合函數。一般來說, 的元素個數遠遠少于狀態的數量。每改變 的任意一個元素,都會影響很多狀態價值的估計量。
2.2 確定訓練樣本
既然“函數近似”屬于監督學習的技巧,那么必然需要構造訓練樣本,包括輸入和輸出。回憶一下我們之前在處理prediction問題時,總是會提到“反向更新”這個詞,也就是backups。比如在蒙特卡洛算法中,backup過程是 ,也就是說,狀態 的value向著 的方向更新, 叫做 ,也叫做target;同理在TD(0)算法中,反向更新過程是: 。
于是我們自然就想到,可否把反向更新中的 作為一條訓練樣本的input和output。這種形式的樣本表明狀態s的價值估計應該更傾向于v,而我們最終想要得到的擬合函數,其特點也應該是傾向于把狀態s的價值估計為v。因此我們確定將反向更新中的 作為訓練樣本。
2.3 擬合模型的選擇
確定了訓練樣本之后,原則上我們可以選擇任何類型的監督學習模型來擬合訓練樣本。但是并非所有模型都合適,為什么呢?這就需要我們研究一下強化學習任務的特點。
強化學習問題的上述兩個特點和傳統機器學習問題有所不同,因此我們選擇的函數擬合模型必須得能夠應付這兩個特點的任務。
我們在這里先不提出具體的模型,只說明模型的必要特點,在下一篇第二部分中會討論具體的模型。
?
3. 確定待優化的目標函數
3.1 為什么建立目標函數
我們知道,在機器學習中,為了得到一個準確的模型,需要時刻監控該模型的訓練演化過程,確保模型往好的方面進化。什么是好的方面?怎么確保呢?通常都是針對具體的任務,建立合適的目標函數(有時也叫損失函數),通過保證模型的更新始終朝著使損失函數不斷減小的方向,最終可以得到一組滿意的模型參數。
之所以之前我們從沒設立過明確的目標函數,是因為采用數據表存儲價值函數時,不需要這么一個目標函數,因為價值函數經過不斷學習迭代,最終可以自動趨于收斂,得到真實值。此外,數據表存儲方式下,每個狀態的價值更新過程呈相互解耦關系:即A狀態的價值更新后,并不影響B、C狀態的價值,因為數據表的每個區域是相互隔離的。
但是,通過函數近似思想進行價值函數的估計時,這種解耦關系被打破了:A狀態的價值更新后,會導致模型參數 發生變化,從而間接影響其他狀態的價值,因此不再有可能使所有狀態的價值都達到真實值。
所以,需要制定一個目標函數,這個目標函數,決定哪些狀態我們更在乎,哪些狀態我們不在乎。更在乎的狀態,適當提高它的價值估計精確度;不在乎的狀態,適當降低它的價值估計精確度。
3.2 確定目標函數
用數學語言做上面那件事,就是定義一個概率分布 ,表示對每個狀態價值準確度的在乎程度。同時我們用價值近似值 和真值 的均方差作為誤差的定義。結合這兩部分,我們定義目標函數如下:
MSVE全稱“Mean Squared Value Error”,均方價值誤差。
這里再說一下 的數學含義:通常 表示在目標策略 下,花在狀態s上的時間占總時間的比例。這時 叫做“on-policy distribution”。在離散序列任務中, 略有不同,不能嚴格地叫做“概率分布”,因為離散任務中初始狀態的選擇會對該分布造成一些影響。因此我們也給出離散序列任務下的 定義:
其中h(s)表示狀態s被選中作為初始狀態的概率分布。
需要提醒大家的是,MSVE并不一定是最好的評價指標,因為我們最終的目的是利用價值函數的估計值找到最優的policy,而滿足這個目的并非一定需要最小化MSVE。但是目前也并不清楚有啥更好的指標,因此還是繼續選用MSVE。
3.3 求解目標函數
既然目標函數是某種誤差,那么求解該函數,就是使其值變得越小越好。為了最小化MSVE,其實我們要做的就是找到全局最優解,也就是找到一個特定的 ,使其滿足:
值得注意的是,對于簡單的線性模型,這個 或許容易找到,但是對于復雜的非線性模型,比如神經網絡或者決策樹,這個 很難得到。因此在復雜非線性模型中常用的替代方案是“尋找局部最優解”,也就是找到一個 ,使其滿足:
至此,我們介紹了基于函數近似思想擬合價值函數,進而解決強化學習問題的大框架。
從下一節開始,我們開始討論具體的參數更新算法。這些方法主要是基于梯度下降理論。
?
4. 確定參數更新算法
為了找到最優的參數 ,需要從一開始的初始值向著最優值不斷迭代更新。有哪些迭代更新的算法可以采用呢?
4.1 隨機梯度方法
接下來我們要討論的參數更新算法主要基于隨機梯度下降理論(SGD)。SGD方法在參數更新中的運用極其廣泛,并且這類方法恰好也很適合實時在線的強化學習任務。
在梯度下降理論中, ,價值擬合函數 是定義在 上,關于 的光滑可微函數。我們會在整個訓練過程中的每個離散時間點上更新 ,因此我們需要一個新符號 表明在每一個時間點t上的 。
接下來,假定在我們的訓練樣本中的狀態分布和上一節在MSVE那里定義的分布 相同?,F在我們開始著手更新 ,很明顯的一個方法就是在觀測到的訓練樣本上盡可能地減小誤差。SGD方法會在每個隨機訓練樣本上按照MSVE誤差減小的方向更新 。這里我們會用到常見的梯度運算符,關于梯度的含義我在此就不贅述了,可以查看大學數學課本。
總之, 的更新如下式:
從上式可以看出, 的更新量方向是沿著MSVE誤差的負梯度方向的,根據梯度的定義,這個方向也是誤差下降最快的方向。另外 表示步長參數,控制著每次更新的幅度。
可能讀者會有疑問,為什么要SGD每次沿誤差方向更新一小步,而不是直接徹底消除誤差呢?原因是:我們既不想要也不期待最終的價值函數能在所有狀態上的誤差全部為0。我們想要的是價值函數可以在不同狀態的誤差幅度之間獲得某種平衡。如果我們在每一個觀測到的狀態上都徹底消除誤差,那么就會發現 會不斷震蕩,永遠也找不到局部最優 了。事實上,根據第二篇提到的“標準隨機近似條件”,步長參數 需要隨著時間而不斷減小的,只有滿足了“標準隨機近似條件”(見第二章多臂賭博機下 2.5部分),梯度下降法才能保證收斂到局部最優解。
現在我們要討論一個很重要的問題:訓練樣本的output部分,即 中的 ,如果不是真實值,怎么辦?這在實際任務中很常見,因為 很可能是被噪聲影響的真實值 ,或者是其他狀態反向更新后的某個 。這時候,上述 的更新公式就要改成如下所示,用 代替 :
如果 是 的無偏估計值,即 ,那么根據“標準隨機近似條件”, 依然可以收斂(保證步長參數 需要隨著時間而不斷減小)。如果 不是 的無偏估計值,那么 就不能保證收斂。
作為 的無偏估計值的一個典型案例是蒙特卡羅算法的target value: 。還記得 代表啥么? 表示狀態 對應的return,即獎勵值的總和(也可以是discounted sum)。因為 是 的無偏估計,因此梯度下降版本的蒙特卡洛價值函數估計算法是可以確定找到局部最優解的。
下面給出的是將傳統蒙特卡洛算法改造成梯度下降版本蒙特卡洛算法的偽代碼:
?
4.2 半梯度方法
說完了收斂性質特別棒的蒙特卡洛算法的target value,也就是訓練樣本的output,我們要來說幾個收斂性質不樂觀的target:就是采用自舉法(bootstrapping)估計得到價值估計值。
大家想一下有哪幾個算法采用自舉法進行價值函數的估計?這里有兩個:
- TD(λ)前向視角的target value:TD(λ)的前向視角采用λ-return,所以其target value是 。然而,當λ<1時, 不是 的無偏估計,因此該方法的梯度下降版本無法找到局部最優解。
- DP的target value: 。同樣,DP中也采用了bootstrapping,它的target value也不是 的無偏估計,因此該方法的梯度下降版本無法找到局部最優解。
為什么采用自舉法進行價值函數估計得到的target value收斂性質不好呢?因為從 的梯度更新公式可以看出,target需要和 相互獨立,互不影響。而這個條件一旦用了自舉法就無法被滿足(看下式標紅部分):
這一類target代入梯度更新公式后,得到的只是部分梯度的下降,而不是真正的梯度下降,因此把這類梯度更新方法叫做:半梯度方法(semi-gradient methods)。
我們可以看到,半梯度下降算法和梯度下降算法的形式是一樣的,只是target的特點不一樣。區分這兩種參數更新算法的唯一指標,就是看target,即訓練樣本的output,是否是input(狀態)真實價值的無偏估計。
半梯度方法雖然收斂性質不如真正的梯度下降方法,但是它有自己的優點:
這里給出一個半梯度方法的典型案例:semi-gradient TD(0)
總結
以上是生活随笔為你收集整理的强化学习:函数逼近思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1953年克里克和沃森发现DNA双螺旋结
- 下一篇: 浏览器伪装成linux,Firefox修