強化學習離軌策略:從失敗中獲得成功經驗 - 以追女孩為例 | 取樣率的數學意義
簡介:我一個朋友小拍,姐妹眾多,穩如老狗。姐妹們常疑惑:小拍同學 會吃會玩會聊天,上知美妝,下知韓綜,中曉穿搭,做事靠譜,為人頗有原則 ,竟然沒追成過一個女孩?要我說,這其實沒什麼可大驚小怪的,我剛認識小拍那陣子,他還是個鋼鐵小直男呢。 用強化學習的角度看,小拍在這幾年做了很好的離軌策略(off-policy)學習,即從自己和別人“追女生”這個過程中學習經驗,無論結果成敗,都能有效地學到東西。 本文我們就以“追女孩”為例,討論離軌策略,進而引申出“重要度取樣比”/“取樣率”的數學意義解釋(主要引用臺灣大學李巨集毅老師的觀點)。
本文目錄:
- 離軌策略:從失敗與別人的經驗中學習
- 重要度取樣比:修正“理解”的偏差
離軌策略:從失敗與別人的經驗中學習
在強化學習中, 我們要學到的/收斂逼近的控制策略,一定是最優的。 以追女生為例,小拍心裡的目的只有一個:用最好的方式追成功。
很顯然, 我們要學習的策略,一定是一個“能讓我們成功的策略” ,但問題是:
- 小拍 自己從未成功過,只有失敗的經驗 ,他可以從中學到什麼嗎?
- 別人的經驗或是成功的、或是失敗的,但 小拍不可能完全複製下來 ,小拍可以從中學到什麼嗎?
對於強化學習學習來講,上述兩個問題的答案都是 肯定 的。
在 Sutton 的經典書籍中,在 第五章第五節 首次提到 “離軌策略(off-policy)” 這個概念。
雖然第五章才被介紹,但 “離軌策略” 這個概念,卻幾乎是 強化學習實踐 中最為重要的概念之一,因為:
- 強化學習的 資料往往只能通過與環境互動得出 ,這造成了其資料獲取成本過大,且少之又少;
- 而書中 5.5 節前的簡單直接的迭代式,只能 一邊使用當前控制策略,一邊改進當前控制策略(同軌策略,on-policy) ,這容易造成一些沒有被探索過的方法,永遠都不被嘗試(固步自封),也會 導致我們無法使用之前的、別人的資料 。
小拍親口為我們做了類比:
- 同軌策略: 這次失敗了,這個方法不好,嗯,把這個方法改進一下,下次嘗試!
- 離軌策略: 我使用的方法,並不一定是我目前認為最好的方法;或者說,不管我用什麼方法,我都能從中學到東西,並且自我提升,尋找我的最優方法。如果別人有經驗,我也可以從中有所收穫!
或許你已經可以看出, 同軌策略是離軌策略的一種特殊形式 ,在設計演算法時, 如果其可以滿足離軌策略要求,其一定可以進行同軌策略的學習。
且在實踐中,我們 很難不使用 離軌策略:
- 在與環境的互動中,我們儘量不要使用當前的最優策略 (同軌策略學習方式) ,因為這樣我們會“謹小慎微”,不敢做出有創意的嘗試;
- 之前的資料要被複用,而之前的資料也是在不同於當前策略的策略下產生的。
重要度取樣比:修正“理解”的偏差
在 離軌策略 下,我們 不能使用“想當然”的迭代辦法,因為這會造成數學理論上的偏差 ,最終得到不良的學習效果。在使用不同於當前策略的策略獲取到的資料時,為了防止“理解”有偏差,我們需要用取樣率公式修正。
如果你更喜歡嚴謹的數學推導,可以檢視 Sutton 的《Reinforcement Learning: An Introduction Second Edition》。但是說實話,我今年一月份第一次學習這部分時,不是很懂 off-policy 與重要度取樣比
這個概念。
如上,我在 CSDN 找到了我關於這部分的筆記,現在看來, 只是寫到了效果,當時還是沒有寫到“為什麼”。
後來學習了 李巨集毅老師的深度學習課程 ,李老師略帶著講了一些強化學習:李老師連 MDP 這個基礎假設都沒介紹,但是其一些關於強化學習的觀點卻讓我眼前一亮,尤其是 在介紹 PPO 前對取樣率從分佈角度上的介紹。
這裡,我們僅從 資料取樣 角度討論取樣率。
如上,簡單的推導後,我們找到了 p 取樣與 q 取樣的聯絡,且可以通過 E_{x~q}
輕易地得到 E_{x~p}
。而那個分式,不就是我們的取樣率嘛!
下面 從分佈例項 具體解釋一下。
如上,f(x) 的值在資料分佈上用紅線
表示。我們可以看出:如果基於 p(x) 對 f(x) 進行取樣,那最後得到的期望值應該是負值,因為 p(x) 總是傾向於在 f(x) 左側取樣(圖中的藍線,在左側很高)。
但是,我們目前只能基於 q(x) 取樣得到資料,而 q(x) 總是傾向於在 f(x) 右側取樣(圖中的綠線,在右側很高)。這就導致了取樣到的 f(x) 資料都是正的。 如果不加取樣率,我們會錯誤的認為: p(x) 下采樣的 f(x) 期望是某個正值。
如何消除這種偏差呢? 足夠多的取樣+取樣率公式 。
如上,當我們進行了足夠多的取樣後: 儘管 q(x) 下很小的概率在左側獲取資料,但一旦我們獲取到,我們將通過取樣率“很好地”對其進行利用。
如上圖中左側的綠點,因為 q(x) 在左側值很小,而 p(x) 在左側值很大,則根據取樣率公式,我們給左側的資料一個很大的權重,這樣,我們便“修正了”偏差。在 足夠的取樣+取樣率 的加持下,我們可以正確地估計出: p(x) 下采樣的 f(x) 期望是某個負值。
我很重視我文章的正確性,有不同意見,歡迎給我發郵件: [email protected] 。
後記:這篇文章原本的標題是
如何理解強化學習中『離軌策略的取樣率』?讓我們做一個簡單的推導
,但後來成文時我靈光乍現: 離軌策略是從非最優中學習最優策略,這不正是從失敗中學習成功經驗嘛! 結合我朋友小拍的個人經歷(有哪件事是我朋友一直在失敗,但卻一直在進步來著?) ...因此從強化學習的角度看,追過那麼多女孩,四捨五入小拍也算談過戀愛吧!不多說了兄弟姐妹們,關注公眾號「Piper蛋窩」點個在看再走吧~
- 為什麼在 Windows 下用 Ctrl Z 退出 Python 而 Linux 下用 Ctrl D 呢?
- 為什麼在 Windows 下用 Ctrl Z 退出 Python 而 Linux 下用 Ctrl D 呢?
- 資源彙總 | 雲”技術科 & 你也可以動手在 Azure 訓練自己的人工智慧
- 講座預告 | 人人都可以在微軟Azure上訓練屬於自己的人工智障
- C || 一個簡單的 ::std::sort 怎麼就能造成堆溢位呢?
- 為什麼是 0x3f ?
- 數字、字元、字串? | C 與 python 中的常用轉換函式
- 如果我去參加前端面試,我應該能做出大聖老師的這道題...
- 痛苦調優10小時,我把 Spark 指令碼執行時間從15小時縮短到12分鐘!
- 分形之城:遞迴超典型例題,還沒明白?手把手畫給你看!
- 如何優雅地實現瀏覽器相容與CSS規則回退
- 巧技拾遺 | JavaScript 中 Array.every 和 Array.map 的巧妙結合
- 【吐血經驗】在 windows 上安裝 spark 遇到的一些坑 | 避坑指南
- 給 Python 新增進度條 | 給小白的 tqdm 精煉例項!
- @wraps 修飾器:讓你的 Python 程式碼更加簡短可愛 | 從簡單例項來認識它
- 併發和並行 | Python中實現多執行緒 threading 和多程序 multiprocessing
- Python格式化字串字面值 | 被官方文件稱之為『漂亮』的輸出格式
- Python 新增型別標註 | 散發著自由鬆散氣息的程式碼
- 我是如何高效錄製出那麼多高質量 gif 動圖的呢?
- 『力薦彙總』這些 VS Code 快捷鍵太好用,忍不住錄了這34張gif動圖