本文主要介紹深度強化學習在任務型對話上的應用,兩者的結合點主要是將深度強化學習應用于任務型對話的策略學習上
來源:騰訊技術工程微信號
背景
本文主要介紹深度強化學習在任務型對話上的應用,兩者的結合點主要是將深度強化學習應用于任務型對話的策略學習上,目前工業界普遍使用的策略都是基于規則的,顯然基于規則的方法有人力成本高、泛化能力差等缺點,而強化學習恰好能解決這些問題,而且強化學習只需要一些目標,無需大量的訓練語料,避免了深度學習的一大缺點。
首先簡單介紹一下強化學習和對話系統,然后再具體介紹一下深度強化學習在任務型對話中是怎么應用的,最后給出訓練的結果和總結。以下舉例部分都會以訂餐場景為準。
強化學習
強化學習系統由智能體(Agent)、狀態(state)、獎賞(reward)、動作(action)和環境(Environment)五部分組成。
Agent:智能體是整個強化學習系統核心。它能夠感知環境的狀態(State),并且根據環境提供的獎勵信號(Reward),通過學習選擇一個合適的動作(Action),來最大化長期的Reward值。簡而言之,Agent就是根據環境提供的Reward作為反饋,學習一系列的環境狀態(State)到動作(Action)的映射,動作選擇的原則是最大化未來累積的Reward的概率。選擇的動作不僅影響當前時刻的Reward,還會影響下一時刻甚至未來的Reward,因此,Agent在學習過程中的基本規則是:如果某個動作(Action)帶來了環境的正回報(Reward),那么這一動作會被加強,反之則會逐漸削弱,類似于物理學中條件反射原理。
Environment:環境會接收Agent執行的一系列的動作(Action),并且對這一系列的動作的好壞進行評價,并轉換成一種可量化的(標量信號)Reward反饋給Agent,而不會告訴Agent應該如何去學習動作。Agent只能靠自己的歷史(History)經歷去學習。同時,環境還像Agent提供它所處的狀態(State)信息。
Reward:環境提供給Agent的一個可量化的標量反饋信號,用于評價Agent在某一個時間步所做action的好壞。強化學習就是基于一種最大化累計獎賞假設:強化學習中,Agent進行一系列的動作選擇的目標是最大化未來的累計獎賞。
State:狀態指Agent所處的環境信息,包含了智能體用于進行Action選擇的所有信息,它是歷史(History)的一個函數:St = f(Ht)。
可見,強化學習的主體是Agent和環境Environment。Agent為了適應環境,做出的一系列的動作,使最終的獎勵最高,同時在此過程中更新特定的參數。實際上可以把強化學習簡單理解成是一種循環,具體的工作方式如下:
智能體從環境中獲取一個狀態St;
智能體根據狀態St采取一個動作at;
受到at的影響,環境發生變化,轉換到新的狀態St+1;
環境反饋給智能體一個獎勵(正向為獎勵,負向則為懲罰)。
對話系統
對話系統是為了某種目的設計的用以與人類對話的機器,這種目的可以是為了特定的任務,也可以是簡單的與人聊天,前者就是任務型對話,后者為非任務型對話系統。
任務型的對話主要為了一個特定的目標進行對話,比如常見的訂飛機票、訂餐等。對于任務型對話工業界主要實現方案還是為pipeline的方式,即按照SLU、DST、DPL和NLG的方式組織整個對話系統,在學術界上end-to-end的方式也越來越受到關注,與pipeline不同,end-to-end模型使用一個模塊,并與結構化的外部數據庫交互。
非任務型的對話則類似于微軟小冰和人進行一些聊天。非任務型的對話主流實現方案有兩種:生成式和檢索式。隨著seq2seq模型的越來越成熟,生成式方案也越來越受到關注,這種方法是把對話任務看成是一種翻譯任務,認為Q(人說的話)和A(機器的回復)是兩種語言。檢索式則是系統有很多訓練數據,其中包括擴展問題(每個問題都對應一個標準問)、答案(每個標準問對應一個答案),當用戶說一句話時,則系統用這句話作為query在訓練集中進行檢索和排序得到匹配的問題,最后根據這個問題的標準問查詢答案。當然也有這兩種方式的結合,即使用生成式生成候選的答案,再使用檢索式進行匹配和排序得到精準回答。
DQN+任務型對話
DQN
Q-learning是強化學習中的一種,在Q-learning中,我們維護一張Q值表,表的維數為:狀態數S * 動作數A,表中每個數代表在態s下可以采用動作a可以獲得的未來收益的折現和——Q值。我們不斷的迭代我們的Q值表使其最終收斂,然后根據Q值表我們就可以在每個狀態下選取一個最優策略。由于這里主要介紹強化學習的在任務型對話中的應用,不進行詳細的介紹,具體的可參照《極簡Qlearning教程》
DQN是深度學習與強化學習的結合,即使用神經網絡代替Q-learning中Q表。在普通的Q-learning中,當狀態和動作空間是離散且維數不高時可使用Q-Table儲存每個狀態動作對的Q值,但是當狀態和動作空間是高維或者連續時,使用Q-Table不現實,而神經網絡恰好擅長于此。因此將Q-Table的更新問題變成一個函數擬合問題,相近的狀態得到相近的輸出動作。具體來說,比如我們現在還有一個Q值表,神經網絡的作用就是給定一個狀態s和動作a,預測對應的Q值,使得神經網絡的結果與Q表中的值接近。不過DQN的方式肯定不能繼續維護一個Q表,所以將上次反饋的獎勵作為逼近的目標,如下式,通過更新參數 θ 使Q函數逼近最優Q值 。因此,DQN就是要設計一個神經網絡結構,通過函數來擬合Q值,即:
當然這也會帶來一些問題:
神經網絡需要大量帶標簽的樣本進行監督學習,但是強化學習只有reward返回值,如何構造有監督的數據成為第一個問題,而且伴隨著噪聲、延遲(過了幾十毫秒才返回)、稀疏(很多State的reward是0)等問題;
神經網絡的前提是樣本獨立同分布,而強化學習前后state狀態和反饋有依賴關系——馬爾科夫決策;
神經網絡的目標分布固定,但是強化學習的分布一直變化,比如你玩一個游戲,一個關卡和下一個關卡的狀態分布是不同的,所以訓練好了前一個關卡,下一個關卡又要重新訓練;
過往的研究表明,使用非線性網絡表示值函數時出現不穩定等問題。
針對以上問題的具體解決方案如下:
構造標簽:通過Q-Learning使用reward來構造標簽(對應問題1),如上所述,用神經網絡來預測reward,將問題轉化為一個回歸問題;
經驗回放:通過experience replay(經驗池)的方法來解決相關性及非靜態分布問題(對應問題2、3);
雙網絡結構:使用一個神經網絡產生當前Q值,使用另外一個神經網絡產生Target Q值(對應問題4)。
構造標簽
對于函數優化問題,監督學習的一般方法是先確定Loss Function,然后求梯度,使用隨機梯度下降等方法更新參數。DQN則基于Q-Learning來確定Loss Function。我們想要使q-target值和q-eval值相差越小越好。DQN中的損失函數是:
這里yi先可以認為是狀態s和動作a對應的標準Q值,實際根據后面的雙網絡結構,yi是根據上一個迭代周期或者說target-net網絡的參數計算出的q-target值,跟當前網絡結構中的參數無關,yi的計算如下,然后整個目標函數就可以通過隨機梯度下降方法來進行優化
經驗回放
經驗池的功能主要是解決相關性及非靜態分布問題。具體做法是把每個時間步agent與環境交互得到的轉移樣本 (st, at, rt, st+1) 儲存到回放記憶單元,要訓練時就隨機拿出一些(minibatch)來訓練。(其實就是將對話的過程打成碎片存儲,訓練時隨機抽取就避免了相關性問題),上面的代碼是將每次神經網絡預測的結果保存在經驗池中,下面則是在每次訓練的時候從經驗池中隨機取出一個batch進行訓練。
雙網絡結構
雙網絡結構即構建兩個神經網絡:target_net和eval_net,eval_net用來進行參數訓練和預測Q值,而target_net是eval_net的一個副本,這個網絡使用來預測目標Q值(構造標簽中的yi),相當于監督訓練中的label。target_net是每隔一定時間更新為eval_net的參數,這樣在一段時間里目標Q值使保持不變的,一定程度降低了當前Q值和目標Q值的相關性,提高了算法穩定性。
任務型對話
任務型對話的主要目標是完成一個任務如訂餐、訂票等,在這種場景下僅僅給用戶一個回答是遠遠不夠的,還需要真正的理解一個用戶的意圖,以及這個意圖相關的信息,如果一個用戶想訂餐,那么需要知道用戶的就餐具體日期、用餐人數等等,所以就需要進行槽提取等等,同時還需要關注當前的獲取的信息量以及未獲取的信息等。
SLU:語言理解,把用戶的自然語言表述的文本處理成預先設計好的機器能夠理解的形式,通常為意圖和槽值對。如用戶輸入“我想訂一個明天的位子”,則SLU的輸出應該是intent=訂餐,slot=date:明天(實際中提取出的槽值需要做標準化處理)。這個部分意圖識別可作為分類任務或者檢索任務,而槽提取一般可用作為NER問題。
DST:對話狀態跟蹤,根據對話歷史管理每一輪對話的輸入,并且預測當前對話的狀態。比如使用規則的方法:有哪些槽已經填充,哪些未填充等、哪些已經問過usr、問過多少次等等。
DPL,對話策略學習,根據當前對話狀態做出下一步的反應。比如根據DST知道有哪些槽未填充,用規則的方法選取一個優先級最高的槽提問。DPL的任務是一個序列決策的過程,因此常用的方法有規則方法、CRF,以及本文的重點:強化學習方法。
NLG,自然語言生成,根據系統得到的動作生成客戶易理解的自然語言文本。這個很容易理解,如果DPL的動作是問用戶就餐人數,在系統里面可能是類似request{“num”:“UNK”},NLG的作用就是把這個轉換成“請問有幾個人就餐呢”。
應用
將強化學習應用于任務型對話的主要是把強化學習應用于DPL學習對話的動作決策,即強化學習中的Action對應于對話中的下一步動作,比如是回答用戶的某個問題還是問用戶下一個槽相關的問題等等。用強化學習的一個好處就是不需要訓練數據,因為訓練過程中只需要Simulator根據設置的goal進行回答和提問就可以了。實際應用中將DM作為強化學習中的Agent,反饋一些信息給用戶。DQN中的reward是根據對話的結果進行提供,分為兩個階段,一個是在對話未完成的時候,每增加一輪對話就給一個-1的獎勵,另外就是在對話完成時,如果完成任務則給一個(max_turn-turn)的獎勵,否則獎勵為-(2* max_turn)。
另外,在訓練強化學習的過程中,實際上并不需要用到SLU和NLG,在Agent和User Simulator之間只需要通過結構化的數據進行交流,而不需要轉換成自然語言,比如:
表示“2019年2月18日和2019年2月19還有空位置”:
則表示“我想訂一個5人的位子,什么時間有空位子?”。
Simulator:模擬用戶行為,Simulator的主要做法就是針對Agent反饋的信息,結合自身的goal進一步與Agent進行交互,比如是回答Agent問題,還是進行反問,是完成goal結束對話,還是拒絕。這相當于使用的是規則的方式,不過也有使用模型的方式構建一個world model來模型用戶。
Goal:任務的目標,在訂餐任務中我們設置的目標形式如下圖。強化學習能夠很好的應用于任務型對話的一大原因就是這些goal本身并不需要人為一個個編寫,只需要根據業務需求根據各個槽完成生成即可,這就避免了大量的訓練預料。
除了以上,還需要根據實際的情況虛構一個數據庫以模擬實際使用中的數據查詢,如餐廳在某些條件下是不是有剩余位子等。
效果
成功率
獎勵
對話輪數
舉例(此處不考慮SLU和NLG,在真正訓練過程中都是使用了結構化的數據),假設我們的goal如下:
使用強化學習的的結果如下:
人工翻譯過來(其實就是基于模板方法的NLG)如下:
上面的結果還是很好的,與針對這個場景精心設計的規則的方法基本上能保持一致:
總結
可以加入額外懲罰和獎勵,加快收斂,比如上一章節中的效果是不加任何額外懲罰和獎勵,可以看出大概在5000個epoch的時候就已經收斂,但是如果加入一些答非所問、回答重復問題等懲罰則不到1000個epoch就會收斂,另外加入這些懲罰和獎勵也會讓網絡朝著我們想要的方向進行訓練,得到更好的結果。
目前我們主要在訂餐的任務上進行了試驗,這個任務還比較簡單,需要找一個更為復雜的場景進行驗證。
訓練過程中只是使用了slot是否填充等,對于已經填充的slot未利用slot的值,對此需要進一步探究slot的值對于DPL的決策是否有影響。
一旦在線上使用的槽的個數需要發生變化就必須重新進行訓練,非常耗時。
Goal和Simulator還是一種比較“僵硬”的做法,需要在實際線上的使用過程中不斷訓練,這樣可以使得對話決策更智能更符合用戶預期。
-
人工智能
+關注
關注
1791文章
47183瀏覽量
238247 -
強化學習
+關注
關注
4文章
266瀏覽量
11246
發布評論請先 登錄
相關推薦
評論