# 李宏毅_ATDL_Lecture_18 ###### tags: `Hung-yi Lee` `NTU` `Advance Topics in Deep Learning` [課程撥放清單](https://www.youtube.com/channel/UC2ggjtuuWvxrHHHiaDH1dlQ/playlists) ## Imitation Learning [課程連結](https://www.youtube.com/watch?v=rOho-2oJFeA&list=PLJV_el3uVTsPMxPbjeX7PicgWbY7F8wW9&index=18) ### Introduction ![](https://i.imgur.com/0iuINuO.png) Imitation Learning有人又稱為apprenticeship learning、learning by demonstration,但又有人覺得只有Inverse Reinforcement Learning才能稱為apprenticeship learning。learning by demonstration就是人類示範給機器,讓機器去模仿學習。 不同於Reinforcement Learning,Imitation Learning中,機器可以與環境互動,但並不會得到Reward,因此,Imitation Learning並非受到Reward影響,主要還是受到Expert Demonstrates啟發。 使用Imitation Learning主要幾點原因: 1. Reward不好定義 2. 如果Hand-crafted reward可能會造成無法控制的行為,考試要100分是目標,那機器可能學到的是作弊就能100分。 Imitation Learning有三種方法: 1. Behavior Cloning 2. Inverse Reinforcement Learning 3. Generative Adversarial network ### Behavior Cloning ![](https://i.imgur.com/PIMWja8.png) 直觀來看,就是要機器複製專家(Expert)的行為,以自駕車為例,我們要搜集很多人類駕駛的行為,可以從行車記錄器取得資料。 訓練資料集的標記自然就是observation所對應的當下行為,上圖為例,人類在看到那種observation的情況下會向前,機器就是學著向前就可以,因此模型Actor(`nn`)的輸入就是observation,輸出就是採取的行為action。 這,就是supervised learning。 ### Behavior Cloning ![](https://i.imgur.com/xg31gv5.png) Behavior Cloning會遇到一個問題,就是Expert的samples有限,這會造成遇到非訓練資料中狀況的時候機器的表現不佳。舉例來說,Expert示範轉彎是順順的右轉,但是當初始位置是在過彎一半的地方時機器就會不知道該怎麼做。 一種作法就是給更多資料,給Expert一些平常不會遇到的observation(states),問他該如何處理,這種作法稱為Dataset Aggregation。 ### Behavior Cloning ![](https://i.imgur.com/frMEeO1.png) Dataset Aggregation具體範例說明: 假設現在有一個actor-$\pi_1$,並且用它與環境(environment)互動,如上圖所標示,目前$pi_1$在這個環境中預計走綠色的路線,而車上有一位expert會同時標記這種情況下他會怎麼做。 但是要注意到的是,expert是告訴機器,下一次遇到這種狀況的時候要怎麼走,因此,利用新標記的資料再訓練得到actor-$\pi_2$。 這種作法在自駕車上也許不佳,但其它狀況下或許可行。 ### Behavior Cloning ![](https://i.imgur.com/InQr40e.png) [參考影片](https://www.youtube.com/watch?v=j2FSB3bseek) Actor在不考慮overfitting情況下完全複製Expert是可以的,但是比較擔心的是Actor的capacity是有限的,有限的情況下對Actor應該學Expert的那一部份所造成的後面結果是影響很大的。 如果有看影片的話,影片中謝爾頓在學中文,他不只說,還學了手勢,但如果他只學到手勢,而忘了怎麼說,那就差異很大了。 這一點在Behavior Cloning中並沒有考慮到,解決這問題的一個方法就是給予不同的錯誤不同的權重,但這部份如果用Supervisor Learning來train Behavior Cloning的話比較難以定義。 ### Mismatch ![](https://i.imgur.com/s7YT18M.png) 在Behavior Cloning中,你的訓練與測試資料的分佈有可能是不一致的,舉例來說,在Behavior Cloning內,Supervisor learning很簡單的就是輸入$o$,輸出$a$,**但你會看到怎麼樣的Observation是取決於Actor本身的參數**,而actor在學習expert不完全情況下,就會造成兩個Observation的distribution不同。 或許兩個distribution相近,但Observation差異很大,又或許兩個distribution差異甚大,但Observation又相似,這很難判定,也因此另一種方式就出現了,即IRL,Inverse Reinforcement Learning。 ### Inverse Reinforcement Learning ![](https://i.imgur.com/NN2u8Oy.png) ![](https://i.imgur.com/kKtnIEu.png) Inverse Reinforcement Learning又稱『Inverse Optimal Control』或『Inverse Optimal Planning』,但都是相同的。 名稱上直觀來看,就是將Reinforcement Learning反過來。 RL原始作法: 有一個Agent會與Environment互動,透過互動會得到Reward-$R(\tau)$,$\tau$是環境給的,不是我們所定義的。而$P(s'|s,a)$也是由Environment所提供,在某一個state決定那一個action之後會得到的下一個state。再利用Policy-$\widehat {\pi}$最佳化得到的Reward。 IRL的話則反過來: 我們有一個Policy-$\widehat{\pi}$<sub>(課程中提到的Policy即Actor)</sub>,也許是一個很會玩遊戲的人,但實際上我們並不知道Policy的參數是長什麼樣子,我們唯一知道的是state與action的對應關係,即$\hat{\tau}$。 從$\hat{\tau}$可以看的出來人類專家在看到什麼樣的state會有什麼樣的action,我們希望這用些資料來反推Reward,這個行為就是Inverse Reinforcement Learning。 Environment Dynamics依然是一個input,它會知道Expert在什麼state會有怎麼樣的action,但不同的是它並不知道採取的action會有多少的Reward。 要注意,它是反推,而不是模仿,根據IRL找出一個Reward function-$R(\tau)$之後,再利用它來找出Policy-$\pi^*$。一個簡單的Reward function就可能可以導致actor有非常複雜的行為,因此,Model Reward function或許會比Model actor還要容易。 IRL就是先推出Reward function,再根據這個Reward function來推出Policy。 ### Inverse Reinforcement Learning ![](https://i.imgur.com/nKSKwHl.png) 這邊快速複習原始RL的作法: * 給定一個Reward function-$R(\tau)$,裡面有著每一個state對應的action,即$R(\tau)=\sum_{t=1}^Tr(s_t,a_t)$ * $r(s_t,a_t)$即記錄在什麼狀態下有怎麼樣的action會有多少的Reward * 把整場遊戲所有時間點得到的Reward總合就是$R(\tau)$ * 初始化actor-$\pi$ * 迭代 * 以$\pi$與Environment互動N次,得到N個$\tau$ * $\tau=\{s_1,a_1,r_1,s_2,a_2,r_2...s_T,a_T,r_T\}$ * $R(\tau)=\sum_{t=1}^Tr^T$ * 每次玩可能結果都不一樣,因此取平均,即$\bar{R}_\pi\approx \dfrac{1}{N}\sum_{n=1}^NR(\tau)$ * 更新$\pi$,讓$\bar{R}_\pi$最大化。 * 利用Policy Gradient * 最終得到可以最大化Reward的$\hat{\pi}$ ### Inverse Reinforcement Learning ![](https://i.imgur.com/9zKt94m.png) 我們沒有Reward function,手上有的就是$\hat{\pi}$跟拿$\hat{\pi}$玩遊戲的trajectories<sub>(歷程)</sub>,大致流程說明如下: * 手上擁有$R(\tau)$或者是$r(s, a)$ * 給定一個$\hat{\pi}$,裡面有玩N次遊戲的記錄 * 假設手上的$\hat{\pi}$是可以得到最大化Reward的Policy * 尋找一個Reward function滿足上面的假設 * 即$\bar{R_{\hat{\pi}}}>\bar{R_{\pi}}$ ### Ring a bell in your mind? ![](https://i.imgur.com/AYTJgDz.png) IRL在某種意涵來說跟Structured Learning相似,以IRL來說,我們要找一個Reward function,其條件為$\bar{R_{\hat{\pi}}}>\bar{R_{\pi}}$,找到Reward function之後再找出Policy讓Reward最大。 在Structured Learning中,我們要找一個evaluation function-$F(x,y)$,input為$x,y$的pair,其$F(x,\hat{y})$是大過所有x,y組成的pair。測試的時候再給定所有的$x,y$看那一組可以讓$F$最大化。 註:$\hat{y}$為實際標記資料 ### Review: Structured Perceptron ![](https://i.imgur.com/lbah6YN.png) 這邊快速的回顧Structured Learning,假設其evaluation function為$F(x,y)=w\cdot\phi(x,y)$: * 迭代 * 每次sample一筆資料,看那一個$\widetilde{y}^r$可以讓$F(x,y)$最大 * 如果$\widetilde{y}^r\neq\hat{y}^r$,那就更新參數,以此增加正確的$\hat{y}^r$的evaluation function的值,也減少錯誤的$\widetilde{y}^r$的值。 ### IRL v.s. Structured Perceptron ![](https://i.imgur.com/jbbHVN1.png) Structured Perceptron中我們假設$F(x, y)$是linear,為$w\cdot\phi(x,y)$,如果在IRL中也可以用相同的定義$\bar{R}_\pi=w\cdot\phi(\pi)$,那就可以用解Structured Perceptron的方式來解IRL。 解法如下: 1. 我們有一個$\tau$,記錄歷程 2. $\bar{R}_\theta$為N個trajectories的平均,即$\dfrac{1}{N}\sum^N_{n=1}R(\tau^n)$ 3. 每一個trajectory的Reward為每一個time step的reward總合,因此$R(\tau^n)$可以寫為$\sum_{t=1}^Tr_t$ * 每一個trajectory的長度可能不一樣。 * IRL中,$r_t$我們並不知道,這是由模型參數所決定,被找出來的。 4. 為了讓IRL與Structured Perceptron有關聯,我們定義$r_t=w\cdot f(s_t,a_t)$ * $r_t$為參數vector-$w$與feature vector的內積。 * 參數vector-$w$是我們要解的 * feature vector-$f(s_t,a_t)$是從state與action中抽出vector * 部份paper並未將$a_t$放在feature vector內,認為只有state與reward有關,與action無關,這由個人定義即可。 5. 將$r_t$帶入,得到$w\cdot\dfrac{1}{N}\sum_{n=1}^N\sum_{t=1}^Tf(s_t,a_t)$ * 參數-$w$在所有的時間點都是一致的,因此放在最外面 * 對所有的trajectory的每一個時間點都抽出一個feature vector,接著平均它們得到一個feature vector再跟參數-$w$做inner product就可以得到我們預期的Reward-$\bar{R}_\pi$<sub>(簡報為$\theta$,課程中說明應該為$\pi$)</sub> 6. feature vector取決於actor,不同的actor得到的feature vector就不一樣,因此對所有的trajectory的每一個時間點抽出一個feature vector做平均就可以視為對你現在的actor抽一個feature,為$\phi(\pi)$,因此整個數學式可以調整為$w\cdot\phi(\pi)$ 7. 接下來就是解argmax的問題,IRL中就是找一個$\pi$讓Reward最大,解法就是利用RL,這意味著每一次迭代你都要做一次RL,因此運算量是非常大的。 ### Framework of IRL ![](https://i.imgur.com/pqdNVR2.png) 實際作法如下: 1. 初始化一個隨機Reward function 2. 依據Reward function找出一個actor-$\pi$ * 因為是隨機生成,因此很笨 * 以RL求解,因此計算量甚大 3. 以actor-$\pi$與Environment互動$N$次,得到trajectory-$\tau_1....\tau_N$ 4. Expert-$\hat{\pi}$也與Environment互動$N$次,得到trajectory-$\hat{\tau}_1...\hat{\tau}_N$ * 如果是自駕車,就是記錄人類駕駛在不同情況下有的不同反應 * 如果是機械手臂的話,那就是記錄人抓著手臂去做某一件事情 5. 更新Reward-function,我們希望Expert所期望的Reward是大過現在的actor所期望的Reward,即$\bar{R}_\hat{\pi}>\bar{R}_\pi$ * $\bar{R}_\pi=w\cdot\phi(\pi)$ * 根據$\pi$,把所有trajectory內的state與action成對的取出並計算平均,就可以得到$\phi(\pi)$,再乘上Weight-$w$。 * $r_t=w\cdot f(s_t,a_t)$ * 更新的方式與Structure Perceptron一樣,原始的$w$加上正確的feature-$\phi(\hat{\pi})$並減掉錯誤的feature-$\phi(\pi)$ 這邊並非只能帶入Structured Perceptron的概念,如果想要也可以利用Structured SVM。 ### GAN v.s. Imitation Learning ![](https://i.imgur.com/E47cQ20.png) GAN也可以結合Imitation Learning,本質上GAN就是要找一個Generator,這個Generator產生的distribution與實際資料的distribution愈接近愈好。 現在假設我們有一個Expert Polyci-$\hat{\pi}$,它與環境互動的時候會產生一堆的trajectory-$\hat{\tau}$,它也是一個distribution。 現在要做的是,訓練一個actor-$\pi$來與環境互動,也會得到trajectory-$\tau$,我們希望actor所output的distribution與$\hat{\tau}$的distribution愈接近愈好。$\tau$可以形成distribution的原因在於environment是有隨機性的,舉例來說,遊戲中相同的畫面你相同的動作,下一步敵人的反應是可能不一樣的。又或者actor本身也可能擁有隨機性。 而我們希望,actor所產生的distribution-$\tau$與expert所產生的distribution-$\hat{\tau}$愈接近愈好。 ### GAN for Imitation Learning ![](https://i.imgur.com/v0C1XIA.png) 實作說明如下: 1. 有一個Expert-$\hat{\pi}$ * 以GAN的角度來看,就當它是實際資料,好比我們用GAN生成影像的時候所擁有的REAL DATA。 * REAL DATA: $\hat{\tau}$ 2. 有一個Actor-$\pi$ * 隨機初始,與環境互動得到一堆$\tau$ * 以GAN的角度來看,就是一開始很鳥的Generator,不同的是並非生成很多影像資料,而是生成$\tau$ 3. 有一個Discriminator-$D$ * 以trajectory判斷是Expert或是Machine所出的資料 4. 以GAN的方式訓練更新Discriminator * WGANs也可以 5. 更新Actor的參數 * 即更新Generator的參數來騙過Discriminator ### GAN for Imitation Learning ![](https://i.imgur.com/DKvwElg.png) trajectory-$\tau$是sequence,裡面記錄著每一個state對應的action,然後利用RNN來讀取之後output得分即可。 但實務上可能因為$\tau$的數目較少,因此如果直接將每一個$\tau$都視為一個資料的話會容易造成overfitting,常見作法如下: 1. 將$D(\tau)$拆解為很多$d$的合,即$D(\tau)=\dfrac{1}{T}\sum^T_{t=1}d(s_t,a_t)$ * 每一個$d$也都是一個funtion,input即為一個state與action,而非整個trajectory,僅為trajectory的一個時間點。 * 它判斷在時間點$t$所看到的$s_t$所做的$a_t$所得到的值有多像或多不像Expert的行為 2. 有一個Local Discriminator-$d$ * 它只判斷整個trajectory的某一個時間點 * 把整個trajectory的state、action加總起來,就可以得到$D(\tau)$ 3. 判斷$d(s,a)$是否為expert所做,是的話就拉高它的機率,如果是actor的話就降低它的機率 ### GAN for Imitation Learning ![](https://i.imgur.com/OTSzTsk.png) 理論上,只要計算actor的參數對$D(\tau)$期望值的gradient,就可以用這個gradient來更新actor的參數<sub>(policy gradient)</sub>,actor就會讓$D(\tau)$的期望值變大: * $\theta^\pi \leftarrow\theta^\pi + \eta\sum^N_{i=1}D(\tau_i)\nabla_{\theta^\pi}logP(\tau_i\vert\pi)$ * $\sum_{i=1}^N$:加總N個目前sample到的trajectory * $D(\tau_i)$:以Discriminator計算每一個trajectory的$D(\tau_i)$ * $\Delta_{\theta^\pi}logP(\tau_i\vert\pi)$:把$D(\tau_i)$乘上現在的參數對$logP(\tau_i\vert\pi)$的gradient * $P(\tau_i\vert\pi)$:在actor-$\pi$產生$\tau_i$的機率 * 再把gradient做加總來更新參數 直觀來看,你有一個Discriminator,它會告訴你這個$\tau$是expert還是actor做的,如果discriminator覺得這個$tau$是expert做的,那就增加它未來出現的機率,如果discriminator覺得是actor做的,那就降低它出現的機率。 ### Algorithm ![](https://i.imgur.com/I2WVrpi.png) 以GAN實作Imitation Learning總結: 1. 有一個trajectories-expert-$\hat{\tau}$ 2. 初始化Discriminator與actor-$\pi$ 3. 每次迭代中: * 以actor與環境互動N次得到trajectories-$\tau_1...\tau_N$ * 更新discriminator,增加$D(\hat{\tau}_i)$出現的機率並降低$D(\tau_i)$出現的機率 * discriminator定義為$D(\tau)=\dfrac{1}{T}\sum^T_{i=1}d(s_t,a_t)$ * 你也可以自己定義 * 這與IRL中Reward function相同。 * 更新actor * $\theta^\pi \leftarrow\theta^\pi + \eta\sum^N_{i=1}D(\tau_i)\nabla_{\theta^\pi}logP(\tau_i\vert\pi)$ * 這與IRL中每次都要做一個RL相同 直觀來看,以GAN實作Imitation Learning跟IRL其實說的是同一件事,只是換一個說法而以。 ### Recap: Sentence Generation & Chat-bot ![](https://i.imgur.com/iEhC5Fc.png) 之前提過的Sentence Generation & Chat-bot,雖然課程中沒有提到,但事實上它們就是一個解Imitation learning的問題。 以唐詩三百首為例,在Sentence Generation來看: 1. Expert trajectory指的就是詩人所吟的詩,課程範例為床前明月光。 2. trajectory記錄著: * $(o_1,a_1)$:(\"BOS\",\"床\") * $(o_2,a_2)$::(\"床\",\"前\") * $(o_3,a_3)$::(\"床前",\"明\") Imitation Learning中我們並不知道每一個action會有多少reward,我們唯一知道的就是expert是對的,跟著做就是,因此生成的時候我們不需要考慮到reward。 Chat-bot也是類似想法,Expert trajectory中有著對話記錄,state的部份包含著問句-input與每一個state的action。 如果是以Maximum likelihood的話,那實作就是behavior cloning,這會有很多問題,因此現在都以SeqGAN來實作。 ### Robot ![](https://i.imgur.com/1SeOPtl.png) 影片:http://rll.berkeley.edu/gcl/ ### Parking Lot Navigation ![](https://i.imgur.com/RfcArCx.png) ![](https://i.imgur.com/SsgPiHL.png) 自駕車如果以RL的做法,對於它的Reward function非常難以定義,倒車要不要扣分?前進、後退的切換要不要扣分?沒延線走要不要扣分?急轉要不要扣分? 因此可以採用Imitation Learning的方法來教導機器。 附圖二是論文的結果,研究題目是停車: 1. 最上面是好的停車路線,四個trajectories(藍線),最右邊(紅線)是機器執行的結果。 * 結果來看車子停的不錯,雖然車子應該可以從下面直接去停車格,但它尊循expert的作法。 2. 中間是抄捷徑的作法 * 結果可以看的出來機器也學到抄捷徑 3. 最下面是教機器倒車 註:即使是用RL,遲早還是可以將車子停好。 ### Path Planning ![](https://i.imgur.com/52CHiPx.png) 這是指導機器如何規劃行走的路線,以IRL訓練,兩點之間告訴機器如何行走。 上排範例是告訴機器走正確的道路(上排左圖),機器會知道走在黑路的道路上(上排中間圖)所得的Reward較大,因此機器規劃的時候可以看的到它是延著道路的。(上排右圖) 下排範例是告訴機器走森林(下排左圖),因此機器在規劃路線的時候就是往森林走(下排右圖)。 我們可以看的到,相同的圖給機器不同的指導就會得到不同的規劃。 ### Third Person Imitation Learning ![](https://i.imgur.com/RglD3WE.png) 先前提到拿著機器人的手教導機器人的時候,這時候的機器是第一人稱視角,有人提出了讓機器人以第三人稱視角來訓練。但這會有一個問題,因為機器在看的時候是第三人稱視角,而實際操作的時候是第一人稱視角,這會造成訓練上的困難。 ### Third Person Imitation Learning ![](https://i.imgur.com/pA3VKNj.png) 論文引入了domain adversarial training的概念: 1. Discriminator有兩個input,$O_t,O_{t+4}$, * $O_{t+4}$可以看成是action * $O_t$為observation 2. discriminator判斷在這個observation下所採取的action到底是expert還是machine。 * 在Third Person Imitation Learning中,machine與expert所做的本來就差很多 3. 訓練一個`nn`來判斷observation的視角是machine或是expert。 * 得到Domain Label 4. Feature Extractor的中間的某一個hidden layer會往Domain classifier去。 * 決定現在看到的observation是expert或是machine的視角 Feature Extractor一方面希望可以讓discriminator正確的判斷現在這個action是machine所採取的還是expert所採取的,另一方面同時希望騙過domain classifier,讓兩個不同視角的資料通過Feature Extractor的時候可以結合在一起。 :::info Note: 藍色區塊:Feature Extractor 紅色區塊:Domain Classifier 綠色區塊:Discriminator ::: :::info domain adversarial training: 如果有data是來自兩個不同的domain,有一種類似gan的方式可以將兩個不同domain的feature給map在一起。 可參考[上學期課程筆記_ML Lecture 19: Transfer Learning](https://hackmd.io/@shaoeChen/BJKNpmoJN?type=view#Domain-adversarial-training) ::: ### Third Person Imitation Learning ![](https://i.imgur.com/12keLjr.png) 上排是機器觀察時候的視角,下排是機器實際操作的視角。 ### Third Person Imitation Learning ![](https://i.imgur.com/87LhZI4.png) 兩張圖是玩兩個不同的遊戲,橫座標是訓練迭代次數,不同色的線代表不同方式訓練。