PbRL | Christiano 2017 年的開山之作,以及 Preference PPO / PrefPPO

MoonOut發表於2024-11-20

PrefPPO 首次(?)出現在 PEBBLE,作為 pebble 的一個 baseline,是用 PPO 復現 Christiano et al. (2017) 的 PbRL 演算法。

For evaluation, we compare to Christiano et al. (2017), which is the current state-of-the-art approach using the same type of feedback. The primary differences in our method are (1) the introduction of unsupervised pre-training, (2) the accommodation of off-policy RL, and (3) entropy-based sampling. We re-implemented Christiano et al. (2017) using the state-of-the-art on-policy RL algorithm: PPO (Schulman et al., 2017). We use the same reward learning framework and ensemble disagreement-based sampling as they proposed. We refer to this baseline as Preference PPO.

Christiano et al. (2017) 這篇文章的題目是 Deep reinforcement learning from human preferences,發表在 NeurIPS 2017;arxiv:https://arxiv.org/abs/1706.03741 ,GitHub:https://github.com/mrahtz/learning-from-human-preferences(用 TensorFlow 實現的)。

01 論文閱讀:Deep reinforcement learning from human preferences

1.1 intro

intro:

  • 大規模應用 RL 的限制是,許多工涉及複雜、定義不明確或難以指定的目標。(舉了一些例子)
  • 如果有人類 demo(專家資料),可以 inverse RL 或 behavior cloning,但是很多工難以給出人類 demo,比如控制奇形怪狀的 跟人類很不像的機器人。
  • 我們的 PbRL 思路:從 human feedback 中學習 reward model,當作 RL 中的獎勵函式。這可以解決上面的兩個問題,允許 non-expert user 來給 feedback,並且(據論文說)可以節省一個數量級的 feedback 數量。
  • human feedback 的形式:讓 human 看兩段 video,指出哪一段更好(即 preference)。

Related Work:

  • 列舉了很多從 human 打分或排序中學 RL 的工作。還有一些工作在 RL 之外的 setting 使用 preference。
  • Akrour 2012 和 2014 年的工作,貌似也算是 PbRL,但他們的方法是在整個 trajectory 上打 preference,不像我們只需要比較兩個較短的 video segment。
    • Akrour 2012:April: Active preference learning-based reinforcement learning. Joint European Conference on Machine Learning and Knowledge Discovery in Databases(好像是 ECML PKDD,不知道是什麼概念)2012。
    • Akrour 2014:Programming by feedback. ICML 2014。
  • 從 feedback 裡學 reward model 的方法,貌似跟 Wilson et al. (2012)工作比較像。
    • Wilson et al. (2012):A Bayesian approach for policy learning from trajectory preference queries. NeurIPS 2012。

1.2 Method

首先介紹了一下 PbRL 的 setting:

  • 定義 segment \(\sigma = ((s_0, a_0), ... (s_{k-1}, a_{k-1}))\) ,是長為 k 的軌跡段。
  • 定義 preference \(\sigma_0\succ\sigma_1\) 表示軌跡段 σ0 比 σ1 更好。接下來,我們用這些 preference 資料學出 reward model。

然後是 method:(發現這篇文章好像沒給虛擬碼)

  • 我們要維護一個 reward model \(\hat r\),和一個 policy \(\pi\)
  • 大概重複這樣的過程:
    • 用目前的 policy \(\pi\) 生成 query \((\sigma_0,\sigma_1)\)
    • 把 query 給 human 比較得到 preference 資料;
    • 用新 preference 資料學 reward model;
    • 把 reward model 當作獎勵函式,去學 RL、更新 policy \(\pi\)

① 把 reward model 當作獎勵函式,去學 RL、更新 policy \(\pi\)

  • 論文聲稱 \(\hat r\) 可能是非平穩的(因為 reward model 一直在更新),所以他們想用 policy gradient 方法,因為 policy gradient 方法對獎勵函式具有魯棒性。
  • 他們用 A2C(advantage actor-critic)做 Atari,用 TRPO 做 MuJoco。調整了 TRPO 的 entropy bonus,MuJoCo 的 swimmer 任務使用 0.001 的 entropy bonus,其他任務使用 0.01 的 entropy bonus。
  • 把 reward model 產生的 \(\hat r\) 歸一化到 0 均值 1 標準差。

② 用目前的 policy \(\pi\) 生成 query \((\sigma_0,\sigma_1)\)

  • preference 資料的形式是 \((\sigma_0,\sigma_1, p)\),其中 p 是一個 {0,1} 上的分佈。
  • 如果 human 能打出 preference,那麼 p = 0 或 1。如果 human 分不出來,則 p 是 01 上的均勻分佈。如果 human 感覺 query 是不可比的,那麼不會使用這個 query 學 reward model。

③ 用新 preference 資料學 reward model:

  • 我們使用 Bradley-Terry model 來建模 \(\hat r\) 和 preference 之間的關係:

  • \[\hat P[\sigma_0\succ \sigma_1] = \frac{\exp\sum\hat r(s_t^0,a_t^0)} {\exp\sum\hat r(s_t^0,a_t^0) + \exp\sum\hat r(s_t^1,a_t^1)} ~~. \tag{1} \]

  • 然後,我們去最佳化 cross-entropy loss:

  • \[L(\hat r) = -\sum_{(\sigma_0,\sigma_1,p)} \left( p(0)\log \hat P[\sigma_0\succ \sigma_1] + p(1)\hat P[\sigma_1\succ \sigma_0]\right) \tag{2} \]

  • (以上流程已經變成經典的 PbRL 做法)

  • 他們還加了三個小 trick:

    • 對 reward model 進行 ensemble,學 n 個獨立的 reward model,用它們每個人單獨歸一化後的值 取平均 作為 \(\hat r\) 的值。
    • 把一部分 preference 資料拿出來做驗證集,以調整神秘的 L2 正則化的權重引數,並新增神秘 dropout,以避免 reward model 過擬合(?)
    • label smoothing(?)貌似是當 human 打出 p = 0 的時候,認為 p = 0 的機率是 0.95,p = 1 的機率是 0.05。

query selection:

  • 即,我們現在有很多 trajectory,要從裡面截出 segment、組成 segment pair,作為 query 送給人去比較。應該如何選取 segment pair 作為 query?
  • 這裡使用了基於 disagreement 的 query selection,貌似是讓每個 reward model 給出 \(\hat P[\sigma_0\succ \sigma_1]\) 的值,計算這些值的方差,然後選一個方差最大的 query。

1.3 實驗結果

演算法是在 TensorFlow 中寫的。Github:https://github.com/mrahtz/learning-from-human-preferences(貌似不是官方程式碼…)

  • preference 一些是人類打的,另一些是 scripted teacher 打的。
    • Appendix B 中有讓人類打 preference 的一些 prompt,感覺很有趣。
    • scripted teacher:上面公式 (1) 中用任務的真 reward 替換 \(\hat r\),反向生成 preference。
  • MuJoCo 實驗中,分別使用真 reward、1400 700 350 個 scripted teacher queries、和 750 個 human queries。
    • (個人理解,這裡的 750 human queries 包含的 label 少於 750 個,因為人類認為不可比的 query 應該會直接扔掉)
    • MuJoCo 實驗中,很多 task 都做了 1e7 步,相比 pebble 來說學的很慢;pebble 1e6 步就能學出來。
  • Atari 實驗中,分別使用真 reward、10k 5.6k 3.3k 個 scripted teacher queries、和 5.5k 個 human queries。(好多 human label…… 這要打好久好久;如此充足的實驗,真是 solid work 呀)
  • 這些實驗沒有得出 human label 比 scripted teacher 好用的結論,論文說,可能是因為 human 犯錯、不同 human 的打標籤準則不一樣等原因。
  • 一些 Appendix A 裡的實驗細節:
    • 有些環境會提前結束 episode,比如當 agent 倒下、死亡或到達目的地(?)他們聲稱這種 done 訊號可能會提供 task 資訊,因此魔改了環境,規避掉了 episode 長度可變的情況(?)使得 agent 死亡時得到一個大懲罰,或者 agent 到達目的地的時候直接 reset env 而不 done(?)
    • 在 MuJoCo 中,在實驗開始前直接用隨機 policy 打 25% 的 queries,然後以一個隨時間遞減的 rate 來打 preference;segment length = 15 - 60,取決於具體 task。
    • 在 Atari 中,reward model 和 policy 的輸入是一樣的,都是一個處理影像的卷積網路(無端聯想,聽說 DPO 的主要貢獻是可以省掉 LLM RLHF 的 reward model,因為 reward model 應該跟 policy 一樣大,所以省掉它可以節約很多視訊記憶體)。
    • Atari 其實跑的是 A3C,在實驗開始前打 500 個 query,segment length = 25。
  • 3.2 節還在 MuJoCo 裡學習了 hopper 後空翻的 novel behavior,據文章說,可以保證後空翻後 hopper 腳著地。使用 900 個 human query 學習的。3.2 節還有其他的 novel behavior。
  • 3.3 節做了非常充分的 ablation study。發現 segment 長度 = 1 貌似會效能變差,reward model 不加正則化影響不大,把 query selection 改成隨機好像也影響不大,以及,最好邊更新 policy 邊拿最新軌跡打 preference。

02 PEBBLE 中的 PrefPPO 實現

PEBBLE 中的 PrefPPO 實現,直接魔改了 stable_baselines3 的 PPO 模型;他們寫了一個叫做 PPO_REWARD 的新類,把所有跟 reward model 的互動都封裝到 model.learn() 函式里了。

2.1 reward model 如何構建

跟 pebble 的 reward model 一樣。

如果 state 和 action 都是了連續的(比如普通的 cheetah walker),那麼就把 state 和 action concat 起來,作為 reward model 的輸入。

如果 state 是影像,action 是離散的(比如 Christiano 2017 論文中的 Pong 環境),那麼(按照 Christiano 2017 復現程式碼),…… 好像直接拿 state 影像來算 reward 了,沒有 concat 一個 one-hot action 或者數值 action。

2.2 PPO_REWARD 的 model.learn()

PPO 的大概流程:收集 rollout → 計算 rollout 的 advantage 之類 → 計算 loss 並 backward → 收集新 rollout…

在收集 rollout 的過程中,PrefPPO 把要收集的真實 task reward 替換成了 \(\hat r\) ,並把 rollout 資料都新增到 query 的備選中。

在收集 rollout 前後,貌似都有呼叫 learn_reward() 函式來訓練 reward model,這個函式首先收集 query,然後拿收集的 query 學習 reward model。跟 pebble 基本一樣。



相關文章