循環:觀察、行動、獲得獎勵、重複
想像一下,你要教一個人騎自行車,卻從不解釋該怎麼騎——你只是讓他踩車、看他搖晃,並在他多撐一會兒時喊一聲「好!」。試得多了,他的身體自然就摸索出了其餘的訣竅。這正是強化學習(RL)的精神:與其一步步地給機器人寫程式,不如讓它從自身行動的後果中學習。
整個過程是一個不斷重複的緊密循環。機器人先觀察自己的處境(關節在哪裡、身體傾倒得有多快),再透過向馬達發送指令來行動,然後獲得獎勵——一個表示那一刻好壞的數字。接著它再次觀察,循環繼續轉動。每一圈都是一次微小的實驗。
在每個觀察下決定採取哪個行動的,是控制策略——可以把它想成機器人的「反射」。一開始,這套策略是隨機而笨拙的。獎勵訊號會慢慢重塑它:帶來更高獎勵的行動變得更可能被採用,其餘的則逐漸淡出。
實例演練:四足機器人學走路
我們用一台四足機器人把這件事講具體些——一台狗一般大小、正在嘗試四足運動的機器。我們希望它能平穩地向前走而不摔倒。我們不會手工編寫步態,而是讓強化學習自己「長」出一種步態。前面提到的兩樣原料——獎勵與策略——現在合到了一起。
一切都取決於獎勵函數。我們對向前移動給予正獎勵,對動作生硬或浪費能量給予小懲罰,對摔倒給予大懲罰。這一套配方被運用上百萬次,便「教會」了行走——沒有人去描述一步該怎麼邁。
- 觀察:把關節角度、身體傾角和速度讀入策略。
- 行動:策略為全部十二個腿部關節輸出目標力矩。
- 評分:獎勵函數把此刻的前進量減去各項懲罰後加總。
- 更新:微調策略,讓高獎勵的行動更可能出現;然後重複。
起初,機器人會不停地撲倒、絆跤——這沒關係。摔跤就是資料。整個訓練過程被一種核心張力所塑造:探索與利用的權衡。機器人既要不斷嘗試新奇的動作(探索)以發現更好的做法,又要依靠已經奏效的方式(利用)。任何一端偏得太多,學習都會停滯。
課程式學習:先易後難,逐步加碼
這裡有個陷阱。如果你一上來就把未經訓練的機器人高速扔到崎嶇地形上,它每一次都會摔倒。獎勵永遠糟糕透頂,因此無從學起——每次嘗試看起來都一樣爛,策略始終找不到立足點。訓練還沒開始就停滯了。
解決辦法是課程式學習:像一位好教練那樣,按由易到難的順序來教。先在平地上以較慢的目標速度起步,這樣即使是笨拙的嘗試,偶爾也能掙到一點獎勵。等機器人站穩了,再溫和地提高難度——更快的速度,然後是斜坡,再然後是碎石。每一階段都能從上一階段夠得著,於是策略身邊總有一個「稍微更好」的動作可抓。
這和我們先教孩子加法、再教代數是同一個道理。技能是層層疊加的。一台先在平地上掌握了平衡的機器人,會把這份平衡帶進更崎嶇的世界——地面一變就得重新學怎麼站穩的窘境,它不會再遇到。
為什麼不直接在真機上學?
到這裡,一個顯而易見的問題浮現出來:既然試錯管用,何不就在真機上跑那上百萬次嘗試?老實說,在真實硬體上純靠試錯,既慢得讓人心疼,又確實很危險。
慢,是因為真實世界只能以「每秒一秒」的速度運行——幾百萬次嘗試可能要花上數月。危險,是因為正在學習的機器人會「故意」失敗:它會摔倒、猛撞自己的關節、扯拽線纜。真實馬達會過熱,齒輪會磨損,而早期的策略可能猛地一竄,損壞機器人或傷到旁人。物理過程沒法快進,而壞掉的硬體很貴。
正因如此,如今大多數機器人強化學習都在機器人模擬器裡進行——那是一款物理「電子遊戲」,上千個虛擬機器人可以並行地跌跌撞撞,比真實時間還快,且沒有任何零件會損壞。難處在於,模擬器永遠不是現實的完美複製,所以一套在模擬裡走得漂漂亮亮的策略,到了真機上可能踉踉蹌蹌。彌合這道鴻溝,正是從模擬到現實的遷移要解決的問題,也是下一篇指南的主題。