JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

特徵與線性方法

把原始狀態變成特徵向量,做個加權和,你就得到了強化學習中最可靠的近似器。這篇教你怎麼造特徵。

對權重而言是線性的

線性函數近似(linear function approximation)把價值寫成內積:v̂(s, w) = wᵀx(s),其中 x(s) 是描述狀態的特徵向量,而 w 是每個特徵上可學習的權重。「線性」指的是對權重而言,而非對狀態——特徵本身可以是原始狀態極為非線性的函數。這跟用工程化特徵做線性回歸是同一招。

\hat{v}(s,\mathbf{w}) = \mathbf{w}^{\top}\mathbf{x}(s) = \sum_{i} w_i\, x_i(s)

線性價值估計就是權重向量與狀態特徵向量的點積。

既然有神經網路,為何要從線性開始?因為線性方法有單一、被透徹理解的最佳解,在明確條件下收斂,更新便宜,而且——如後續篇章所示——它是致命三元組(deadly triad)中安全的那個角落。只要有好特徵可用,它就仍是對的工具,也是理解所有可能出錯之處最乾淨的起點。

特徵建構的藝術

用線性方法時,所有的建模能力都住在特徵裡。特徵建構(feature construction)問的是:關於狀態的哪些數字,能讓一個加權和把價值表達得好?好的特徵讓「價值相近」的狀態在「特徵空間中也相近」,於是在某一點的學習能有益地溢散到鄰居身上——這種受控的溢散就是泛化(generalization)

全部表達能力都在特徵裡:價值就是特徵向量的加權和,也就是一個點積。

把點積視為相似度的示意圖:a·b 等於兩個向量模長之積乘以它們夾角的餘弦。

三大經典家族主宰了實務上的線性強化學習,全都是同一個想法的變體:用一堆互相重疊的感受野(receptive field)鋪滿狀態空間,並讓狀態的特徵記錄它落在哪些野裡。我們將依平滑度遞增的順序介紹它們。

粗編碼:重疊的斑塊

粗編碼(coarse coding)把一堆重疊的區域——想像成圓圈——撒滿狀態空間。若狀態落在某區域內,對應特徵為 1,否則為 0。因為圓圈重疊,每個狀態會激活好幾個特徵,而兩個相近的狀態共享其中大部分。更新一個狀態,每個與它共享某圓圈的狀態都會跟著移動。圓圈的大小決定泛化寬度:大圓把學習散得遠卻模糊細節;小圓保持銳利卻幾乎不泛化——跟狀態聚合是同一個刻度,只是現在變平滑了。

瓦片編碼:主力工具

瓦片編碼(tile coding)是把粗編碼變得又快又整齊的版本。在狀態空間上鋪好幾層格網(「瓦片組」tilings),每一層相對其他層稍微偏移。一個狀態在每一層瓦片組中剛好落在一個瓦片裡,所以它的特徵向量是二元的、每個瓦片組剛好一個「1」——計算便宜、更新也便宜。瓦片組之間的偏移帶來平滑的泛化;瓦片組的數量決定解析度。因為只有少數幾個特徵被激活,內積就是幾個權重的快速加總。

徑向基函數:柔性歸屬

瓦片特徵是 0/1——狀態要嘛在瓦片內、要嘛不在。徑向基函數(radial basis functions, RBF)把它柔化成漸進的歸屬度:每個特徵是一個以某處為中心的高斯凸包,當狀態靠近中心時回傳接近 1 的值,遠離時平滑地衰減到 0。結果是一個連續、可微分的特徵向量,能以更少的特徵表示平滑變化的價值——代價是要調整每個凸包的寬度,並選擇中心的位置。

x_i(s) = \exp\!\left(-\frac{\lVert s - c_i \rVert^{2}}{2\sigma_i^{2}}\right)

徑向基特徵是以 cᵢ 為中心的高斯凸包,給出隨距離衰減的漸變隸屬度。

注意這個遞進:聚合(一個硬桶)→ 粗編碼(重疊的硬斑塊)→ 瓦片編碼(結構化的硬瓦片)→ RBF(柔性的高斯斑塊)。每一步都用一點速度與簡潔,換取更平滑的泛化。無論你選哪一個,學習權重的規則都一樣——而那條規則就是下一篇。