當設計獎勵才是最難的部分
上一章裡,機器人靠試錯學習:它不斷嘗試,再由獎勵函數告訴它每次做得有多好。當你能把「好」用一個數字寫下來時,這套辦法非常漂亮。可是想想疊毛巾、擦掉灑出來的水,或者把一根線插進插孔。一條疊得整齊的毛巾該得多少分,疊得略歪的又該得多少分?親手設計這個分數,還要不斷打補丁、防止機器人鑽空子,往往比任務本身還難。
其實有個更友好的替代方案。你大概本來就會做這個任務——那就直接示範給機器人看。這正是模仿學習的核心思路:不必費心設計獎勵、再讓機器人慢慢摸索,而是直接給出你想要的行為示例,讓機器人學著重現。這種從人提供的示例中教機器人的更寬泛做法,叫作示範學習。
行為克隆:把示範當成習題
最簡單的模仿方式也最直接,它有個名字:行為克隆。訣竅在於意識到:一段示範其實就是一長串成對的例子。每一個瞬間,機器人都會看到某種情況——一幀攝影機畫面、各關節角度、夾爪的狀態——而人也做了某個動作——往這個方向移動、合上夾爪。把它們配成對,你就得到了一張張「情境 → 動作」的卡片,跟抽認卡一模一樣。
一旦這樣來看,學習問題就變成了普通的監督學習——和給照片打標籤所用的那種模式匹配如出一轍。輸入是情境,「正確答案」是人採取的動作,網路被訓練去預測那個動作。最終得到的是一個控制策略:一個把任意新情境映射到動作的函數。沒有獎勵,沒有探索——只是照著專家做的去做,並期望這些模式能推廣到與示範略有差異的情境。
for each demonstration:
for each moment t in the demonstration:
observation = what the robot saw at t (image, joint angles, ...)
action = what the human did at t (move, grasp, ...)
add (observation -> action) to dataset
train policy to predict action from observation # plain supervised learning示範從哪裡來
一個策略的好壞,取決於它學習所用的示例,所以下一個問題很實際:你要怎樣獲得成百上千條高品質的示範?最常見的答案是讓人直接操控機器人。人來引導真實的機械臂——或是握著它移動,或是用搖桿、資料手套、配套手柄來操控——與此同時,每一個觀測和指令都被記錄下來。這樣產生的記錄就叫遙操作示範資料。
正因如此,許多現代機器人學習都是從一個人花一下午時間遙操作幾十次抓取放置開始的,每一次都是一條新的示範。它的好處是:資料是在真實機器人、真實世界裡錄下來的,所以情境和動作天生就「說著機器人的語言」——同樣的攝影機,同樣的馬達。代價則是成本:得有人坐下來一遍遍示範,而且通常要積累許多多樣化的例子,策略才不再脆弱。
漂移問題:小錯滾成大錯
行為克隆有一個著名的弱點,在你信任一個克隆策略之前,值得先弄明白。訓練時,機器人只見過人去過的情境——而一個熟練的人總走在一條整潔的路徑上。可當策略自己執行時,它遲早會犯一個小錯:它停在了示範者從未到過的、偏左一公分的地方。此刻它面對的是一個略微偏離示範路徑的情境——一個它從未受訓過的情境——於是它的下一個猜測就更糟一點,把它推得更偏,錯誤層層累積。
想像你學開車,只靠觀看一位完美的司機,他永遠把車穩穩地開在車道正中。你從沒見過怎樣從偏向路肩中糾正回來——因為你的老師從不偏移。一旦你跑偏,就懵了,而每一次修正都是一個全新的猜測,還可能越修越糟。這種累積正是純行為克隆的核心風險:機器人可能漂移到沒有任何人示範過的狀態,在那裡它完全不知所措。
各種補救辦法都瞄準同一個目標:教機器人如何糾偏回正。你可以特意示範從偏離路徑的情境中如何糾正;可以讓策略自己執行,一旦它開始漂移就由人接手,這樣它自己的錯誤就被標註上了正確的修正;也可以退一步借助獎勵信號,在克隆從未覆蓋到的區域繼續練習。做得好時,獎勵塑形與模仿會相互增強——示範給出強力的起跑優勢,獎勵則填補空缺。