演講嘉賓介紹
報告導讀
對話系統一般可以分為兩種,即任務型對話系統(也稱作目標導向型對話系統)和閒聊對話系統。本講習班主要介紹任務型對話系統,其多用於垂直領域業務助理系統,如微軟小娜、百度度祕、阿里小蜜以及我們研發的對話技術平臺(DTP)等。這類系統具有明確需要完成的任務目標,如訂餐、訂票等。我們將首先介紹任務型對話系統的背景和定義,然後依次介紹其中的關鍵技術,包括自然語言理解(包括領域意圖的識別和語義槽的填充)、對話管理(包括對話狀態跟蹤和對話策略優化)以及自然語言生成;接著介紹任務型對話系統的評價方法和國內外相關技術評測任務;最後對任務型對話系統的技術和應用趨勢進行展望。
報告內容
整個的任務型對話的框圖裡面,除了輸入之外,除了語音訊號和文字之外,比較大的三個模組就是自然語言理解,對話管理和自然語言生成。對話管理和語言生成的過程當中會遇到知識庫和APIs。APIs在實際的應用過程中,可能會調一些查天氣和地理位置的APIs,這些都可以被包含在任務型對話資源裡面。
文字輸入的句子,通過語義槽的填充之後,就識別出這樣一個結果。輸入的語言理解的狀態,經過中間的對話管理的處理之後,得出來一個對話的動作(action)。比如,我們得出來一個動作是詢問出發地,這個詢問出發地的對話動作就會輸入給自然語言生成的模組,自然語言生成模組就根據這個動作產生一個自然語言文字的回覆“請問您從哪裡出發”。
對話策略抽象一下,就是以對話的狀態為輸入,通過一個π函式來產生這樣一個動作。怎麼給它形式化呢,對話狀態是序列的,開始的狀態到結束的狀態,整個對話的狀態就是一個序列化的狀態。根據這樣一個狀態集合,這個動作集合也是有窮的,在集合中可以列舉的。在這樣一個對話狀態的空間和對話狀態的輸入過程中,想建立起一個對應的關係。通過這樣的對應關係,估計出來多輪對話的過程中,每一個自然語言的背後都有相應的動作與之對應。
對話策略模型的輸出就是這樣一個動作的序列。整個的對話策略學習的目的或者輸出大家都瞭解了,看一下怎麼做這件事情,怎麼樣決策,根據一個狀態產生什麼樣的動作。其實最簡單的就是MIT提出來的類似於規則的對話狀態控制流程。比如,在這個裡面對話動作和對話狀態繫結在一起,從最開始的地方接受一個輸入,接受了輸入以後就更新了對話的歷史,以及對話的狀態,我們就去判斷。當然這個判斷過程也是對話狀態自動處理的部分,我們判斷是不是模糊的查詢,是不是包含著不確定性的,這個有一個判斷機制。如果是非常模糊的話,就回去問使用者,讓使用者重新輸入。如果不是模糊的話,就有一系列的對話動作的處理模組,每處理一塊就產生一個對話狀態的維度和特徵。最後的時候,判斷是否需要回退到系統,需要的話產生一個系統的回覆,再更新對話的歷史和對話狀態。如果是不能由機器或者模型產生後續的回覆或者結果的話,我們還是回退到最開始的部分,採用一種澄清的方式讓使用者確認輸入。
可以看到整個的方式其實就是一個比較偏向於規則的對話控制流程。在特定的領域或者特定比較小的任務上面,效果比較好。而且系統比較穩定,規定了這樣的流程,規定了狀態的轉移的過程,就做的比較好;劣勢也比較明顯,動作狀態序列都是固定的。演算法與對話過程繫結,修改演算法即修改對話過程。然後必須規規矩矩地按照系統的提示回答問題,否則流程就無法響應我們的需求。
這個是最開始的MIT做的工作,當然這個ATIS的對話系統儘管比較早,對後面的影響比較大。另外一個比較早期的,基於有限狀態自動機的對話測錄。比如,說在搭建工業級或者對話流程控制沒有那麼複雜的場景下,有窮狀態自動機的對話策略現在還在廣泛的應用。整個過程就是把對話和對話狀態之間的轉移過程看成有限狀態自動機,可以轉換成一個樹形結構。這種有窮狀態自動機有什麼好處呢?狀態轉移很容易設定,有狀態轉型的圖模型,就轉成樹形的結構。整個系統是可預測的,適應用樹狀的策略決策模式。劣勢也是比較顯而易見的,跟ATIS沒有特別大的區別,完全是系統主導的,人要配合系統,對話的狀態不是特別靈活,使用者沒有回退的機制。
後面就出現了基於表格的對話策略。這種對話策略跟現在的策略比較相似了,有點類似於語音提取資訊的方式,就用表格的形式表示對話的資訊。整個過程有一個好處,我們人和機器可以混合主導,我們可以問機器一些問題,機器在這個過程當中也會問人的問題。不斷地維護、更新表格的資訊。表格上的資訊有一個好處,我們可以更新。假如說這一輪說錯了,下一輪還可以更新出來,這個更新的就在條目上。首先是混合主導,再就是容錯性比較好且可更新。劣勢是整個過程需要一個預設的指令碼,就像我們說的系統生成的話都是預設的。根據什麼樣的上半句,拼接後半句,也不夠靈活。
還有一個把指令碼用到了對話策略的例子。MIT的Galaxy2是通過指令碼流控制的,表格的形式沒有一個明確的結構的過程,是通過不斷地更新的過程,最終找到上面還有什麼資訊,缺什麼資訊,更新了什麼資訊,最後給你什麼資訊。但是這個Galaxy2有一個明顯的自頂向下的規劃結構,把這個大的Domain意圖當成server,然後把Domain下面的一些意圖當成Program。對每一個下面的這些語義槽當成更下層的規則。最後針對每一個槽或者針對每一個意圖規定了一些若干個操作,比如有輸入操作,有檢索操作,有儲存操作,有輸出操作。一個指令碼化或者流化的對話控制就是這樣一個過程。我們看每一個節點都是對話的動作,但是這種對話動作序列的過程不是自動化生成的過程,而是由指令碼控制的。這個也是一樣的,下邊四個變數,rule是什麼樣的,Input、output怎麼實現的。它的優勢就是任務擴充套件方便。多層的結構有點像現在的層次化或者是Domain到意圖再到槽的自頂向下的構架,邏輯比較清晰,任務擴充套件相對方便一些。劣勢就是這些規則都是手工定義的,對話流控制需要預設,也沒有可學習的過程。
總結一下上面介紹的。無論是基於規則的也好,還是基於流控制的,還是有限自動機的。對話的動作之間是獨立或區域性依賴,以及不能對整體的動作序列進行建模,只能一個動作一個動作進行建模。另外就是對話策略的輸出是一個確定的,就是下一個動作,而不是下一個動作在所有的動作空間上面的概率分佈,這也是目前已有的之前講過方法的幾個不足的地方。
後面就是基於規劃的方法。什麼叫基於規劃的方法?Wasson在1990年的時候給規劃進行了一個定義,通過建立一個動作序列來實現某個目標的求解方法,並嘗試預測執行該規劃的效果。建立一個動作序列就是人機對話中的若干問題和若干回覆,最終實現的目標是幫人完成相應的任務,後面的人就想能不能通過規劃的方法來做對話策略的學習,也就是後面的基於規劃的方法來求解對話策略學習的過程。
當然這個規劃也有兩種:一種就是相對來說會比較固定,就是人寫這個規劃庫。比如,我們知道已有的資料裡面,動作的序列是什麼樣的,就一條一條的把動作序列寫出來,相對來說這種就比較的簡單。當然如果寫的規劃庫的數量足夠多的話,其實魯棒性還行。我們希望系統能夠自動化一點,這裡面考慮到動態的規劃,不是動態規劃演算法。動態的規劃就是給定這樣一個輸入的序列,希望是一個整體的考慮,是建模聯合分佈,但是實際的過程中,我們其實可以進行Markov的假設,動態規劃的過程就是給定若干個前續的動作序列,預測後續的動作序列是什麼樣的。這個過程就是通過規劃的方式進行進行求解對話的過程。
除了剛才的靜態或者說規劃庫的方法和動態的規劃之後,還有層次化規劃的方法。這個可以看成是基於層次化的對話策略學習的,在規劃版本上的擴充套件。把這個任務自頂向下做一個分解,這個裡面涉及到了一個事兒,我要告訴有一個A同學,在寢室樓下阿姨這裡來了一個電話,正好A的同寢的人來了,阿姨就說你告訴A同學說有電話找他。這個B同學就要做幾件事情,第一件事情要知道A到底是在寢室,在洗澡間還是在廁所。知道A的位置之後就要走到A這塊,說你有一個電話在樓下找你,就把這樣整個任務分成了三個子任務。總體來說,這種層次化的方法,一方面有一個比較清晰脈絡的邏輯。整個規劃的方法從上層大的任務分解到子任務,子任務分解到操作,每一個都有相應的屬性,跟之前的層次化的方法特別的像。這樣的方法還是存在一定的問題,首先對系統的錯誤比較敏感,魯棒性比較差。對話策略清晰歸清晰,但是相對固定,靈活性不夠。第三是策略和任務繫結,很難在任務間遷移,策略決策過程是和任務和領域是強相關的。
上個世紀或者是本世紀初這一段時間,2000年到2010年之前大家都在想,固定的不行就搞概率的。能不能使用概率對話模型估計從對話狀態到動作序列的對應關係,只不過方式就變成了學概率,求解整個對話狀態序列和動作序列概率矩陣。每一個矩陣上面的相應位置的元素就對應著給當前狀態下給A的狀態是什麼樣的。學習對話策略的過程,其實就是在策略矩陣上面不斷優化的過程。
最簡單的一種方式,或者能夠比較自然地應用這種策略矩陣求解概率化的方式就是強化學習。強化學習的框架也比較簡單,主要有對話的Agent,這個裡面有對話狀態跟蹤和對話學習兩塊。這個裡面有Action,在對話裡面就是對話的動作,這個對話的動作是問使用者一個問題,或者跟使用者確認一下資訊,或者向使用者展示一個資訊。
動作之後,還有就是使用者會針對對話管理系統給出的動作進行一部分反饋,有的人把這塊表示成大的就叫環境(Environment),也有的人把這塊表示成Interpreter和一個Environment,這裡面表示這兩種形式都可以。但是這裡面其實不光是Environment,還要對對話產生的動作進行一個表示,表示之後產生一個對話的獎勵,回饋給對話系統。整個過程之中,除了Interpreter的獎勵之外,還會產生對使用者輸入的識別以及對話狀態的建模。Agent這邊對話管理的動作實際是到Environment這塊,出口是從Interpreter出去的。
我們把強化學習的比較粗的框架和我們的任務型對話的策略學習相關聯的。Action就是對話的動作,系統產生什麼樣的話。針對使用者產生的話,我產生什麼反應,我是接受還是反饋,有一個相應的reward。整個對話管理對應著對話策略的優化過程。已有的基於強化學習的對話策略學習或者對話管理這個部分都完成哪些事呢?針對不同型別的,如果是閒聊的,問答的和任務型的,在強化學習框架下面,它的狀態、動作、獎勵都不大一樣。
比如,任務型的bot在強化學習的框架之下,這個對話狀態就是使用者當前的輸入以及歷史對話的上下文。這裡面不一定是這種純文字的方式,包括了前面的對話狀態追蹤過程當中對話的表示。這些動作其實剛才給大家解釋地比較清楚了,系統採取什麼樣的方式回覆,以及裡面到底是否包含確認的話。例如,我跟使用者確認是不是要訂12月16日的航班,這是典型的確認的動作,這裡還包含了12月16日資訊槽的資訊。整個動作之中,還包含著若干個對話的值,這個過程之中調一些API過來,這些都是一部分。
我們從系統中已經拿到了這樣一個動作之後,我們會給動作打一個分,或者系統會評論一個值,但是任務中,第一個事就是經過這樣系統的反饋之後,我們對話到底成沒成功,我幫你完沒完成具體的任務,這個是指示性的訊號,要麼是0,要麼是1。當然這個輪次要儘量的少,所以我們整個在任務型對話之中的狀態、動作和獎勵函式表達的是什麼意思,我給大家簡單的解釋一下。
我們關注的就是對話管理這一塊,對話管理這一塊我們主要關注於對話策略學習的過程。這裡面涉及到怎麼樣去收集或者定義reward,怎麼樣優化狀態和動作之間的關係,當然現在通常來說用的都是Q函式。
我們說基於強化學習的對話管理,通常來說有兩個比較重要的過程。一個是我們怎麼樣讓使用者能夠參與到整個系統的構建的過程中,現在比較火的就是叫Human-in-the-loop。當然這種方式有一種不好,就是確實耗時耗力,那我們不用它的話,初始系統化又不是太好。所以現在比較大的方向就是要有一定人的參與,但是又不能太耗費人力。另外就是怎麼樣定義對話獎勵函式,兩個方面,儘可能提高完成的任務成功率和儘可能的減少平均對話的函式。
如果用形式化的方式表示,這也是現在比較多的任務型對話獎勵的形式,我們完成任務對話的之中,我們設定系統輪次最大值。我們給系統20輪機會,20輪之後再無法完成使用者的任務就把你停掉,這個就是Nmax,取值就是0和1。這個N是我當前進行任務型對話的過程之中,我實際已經進行了多少輪,我們看什麼時候是0呢?雖然最終成功了,達到了輪次,也是最大的輪次,這個時候20-20就是0。如果你用20輪,我只用10輪就搞定了,而且還成功了,這個R就是10,是比較大的數值。當然最好的就是1輪,但是這個不太可能。
通過獎勵函式的定義,就可以大概知道整個系統優化的方向是什麼樣的方向。最簡單的方式,剛才也說整個大的背景就是概率的策略學習的框架下,採用強化學習的方式去做策略的估計和學習。最簡單的方式我們就假設一下,好的方式是我們給定之前所有對話狀態的聯合分佈和估計後面對話動作的分佈。但是實際不大可能,因為計算量太大了,通常就會採用Markov假設,假設下一輪的動作只跟當前的對話狀態有關係。這種情況下,自然而然地就用MDP的方式進行建模。
MDP建模對話策略的過程分為三個部分。這個策略矩陣就是對話狀態和對話動作之間概率的對應關係。上面是轉移函式,根據給定對話狀態和給定這樣當前輪次的對話輪次的動作,產生下一次對話狀態是什麼樣的。我們可以看成是當前狀態和下一個狀態的轉移過程。如果A有所有的對話空間的話,實際上就是一個分佈,或者說我們可以把它取成一個從某一個對話狀態所有的可能動作的估計。
最後是比較重要的獎勵函式,通常來說,這個獎勵函式都被估計成所有的獎勵。在所有的動作狀態空間之上,再估計的時候就是動作期望的值。後面的獎勵函式就不那麼簡單了,是一個期望概率的估計值。這裡面實際上策略矩陣就是對話策略,獎勵函式就是對話策略學習優化的目標函式。
整個過程也比較簡單,目標就是用MDP的方式給定對話狀態序列,優化對話獎勵函式。整個過程就是要建模期望,這個期望就是整個基於值迭代方式的這後半部分。這部分可以認為是獎勵,這部分可以認為是狀態轉移的函式。
整個過程可以採取值函式的方式,更自然的方式是採用Q函式的方式。最重要優化的方式就是用Q值來模擬給定當前的狀態和當前的動作,然後求解能夠使Q函式達到最大值A的過程。其實這整個過程跟我們對話策略優化的根本目標是一致的,根據這個狀態求取這樣一個對話動作,決策下一步回覆給使用者什麼內容。
大家可能覺得這個對話狀態可能是有窮的,對話動作也是有窮的,為什麼要進行策略優化。比如,做好之後就查那個表,給定一個狀態之後就查表裡面哪一個動作的概率最大。但是通常來說不這麼做,通常來說少量資料的情況下表是不準的。所以我們只能不斷地訓練去更新那個表,當然訓練好了之後,實際應用過程中可以進行查表的,怎麼樣取樣,怎麼樣變得更好。在實際的更新或者是學習過程中,這個對話狀態和動作的組合空間是非常大的。
所有的問題都在於現在的空間大,精確估計轉移函式非常難,要求期望的一部分,第一項就是轉移函式的T,我們沒有精確地估計這個轉移函式,為什麼呢?假如說有這樣四個動作,這四個Action每一個slot,假如說這個slot有四個槽,這四個槽上面,每一個槽認為有多種取值,在日常中這是非常常見的。確認與否的有4個確認的動作,每一個動作的值上面也是已確認和不確認兩種。這438也可以看成是438種情況,在這種動作和空間中組合一下看對話策略有多少種。這個狀態空間就是2的8次方×438就是112128。也不要被理論上的狀態空間嚇倒,其實很多是無效的,通過預測的剪枝,大大縮小這個狀態空間。但是仍然非常巨大,所以整個對話策略需要進行優化的。
比較簡單的方式就是我們用動態規劃的方式。這有一個好處,大家學過演算法都知道,動態規劃有一個好處就是算過的東西不用再算了,下一次直接拿過來就行了。基本思想就是給定一個初始的對話策略,假如說每一個都是均勻分佈的,都是1/N,給定一個初始化的狀態之後,掃描整個對話狀態和動作空間,從而遞迴地估計值函式。典型的方式就是值迭代的方式,通過後一個狀態的值,定義前一個值,這種方法也是往前看一步,儘管當前的值不知道怎麼回事,但是可以往前看。真正選擇下一個狀態的時候,遞迴往回帶的時候,可以選擇下一個狀態裡面值最大的狀態把它帶回去。當值函式被替代之後,不斷地重複,直到把對話狀態都計算一遍。
這裡面還有一個問題,就是動態規劃的方式,儘管可以通過策略縮小狀態空間,緩解對話狀態和動作空間巨大的事情。但是基本假設其實還是掃描整個的空間,可以通過剪枝,可以通過什麼樣的規則預先制定對話狀態和動作之間的衝突方式,縮小這個狀態空間。不管縮到多小,這種方法的特點就是要掃描整個狀態空間。那能不能通過取樣的方式部分的估計,通過部分的樣本估計整個樣本的分佈。訓練深度學習也會使用取樣的方式,包括以前做LDA也是取樣的方式估計的。
自然而然就想到能不能取樣一下,不一定每一次都求全域性最優解,就求最近的最優解就可以了。比如說利用隨機的策略,隨機的初始化對話的策略,我們用π表示對話的策略函式,對於序列中出現的訓練資料中的(s,a)對,就是狀態和動作之間的組合對,然後更新Q函式。這裡面a*表示的是當前使得這個Q函式達到最大值的動作狀態的A是什麼樣的。我們當前選擇到A等於最優狀態A的時候,我們就以這樣對話的方式更新已有的矩陣。總之這是一種比較簡單的方式,這種方式叫做epsilon-soft policy。大家更多的聽見的是叫epsilon-greedy,但是這個epsilon-greedy跟這個類似。
如果看epsilon-soft policy的更新策略,如果讓這個epsilon趨近於0,就變成了什麼呢?當a使得這個Q最大的時候,就讓整個的動作對話狀態是1,否則就是0。如果是採用這種方式,其實就不是概率性的空間,就是確定的。假如還是對話策略矩陣的話,本身能看到基本上都是經過行列交換,總能換出來若干個單位變向量組成的矩陣。當epsilon-soft policy趨近於0的時候,就是一個相對的對話策略。
剛才提到了我們要求當前的狀態,求一個當前的Q函式值最大的動作。怎麼樣進行Q函式的更新,兩種方式,也是通過取樣的方式,第一種方式就是通過Monte Carlo取樣的方式。這裡面先查數,看這個已有的訓練資料裡面當前給定的狀態和動作出現多少次,出現次數越多,當前給出這個動作的可能性就越大,執行度就越高。另外一個是實際上給定這樣一個動作和這樣一個狀態之後,產生一個即時獎勵是什麼樣的。這個即時獎勵不是說往後看,不是像Alpha go似的,下一步棋看最終的勝利是多少,而是當前下一步棋,吃了你幾個子,我就可以拿到一個reward,或者叫即時的reward。
更新的過程就是一個平均取樣的過程,因為除了一下當前的(s,a)出現對數的總和,我們Q函式的更新策略就是算一下當前的Q值得到了多少的獎勵,然後把所有可能性都加到一起,再除以所有的可能性,整個Q就是更新的過程。另外一種更新的過程,當前的這一步的決策,不足以支撐我們選擇最優的Q函式,再往後看一個狀態,看一個動作,我們讓這個動作和當前的Q函式之間的差值加上一個相應的因子,加上一個相應的引數再乘以相應的因子,更新這樣的Q值。這個裡面的α就是一個learning rate,是當時可調的引數,這裡面的r就是給定當前動作的即時獎勵。這裡面最大的差別要麼只看當前,要麼我們往下看一下,差別就在這裡。
剛才講到動態規劃方法掃描動態空間比較費事,雖然達到全域性的最優,後面取樣的方法也可以達到一定的近似的解。這裡面有人對比一下基於動態規劃的方法和取樣的方法。
其實這裡面可以看到,動態規劃的方法,要訪問到很大很大的狀態空間才能夠準確地估計出規劃策略的值。基於取樣的方式我們就這麼多對話狀態和動作的空間之後,我們可能進行一個值估計,等到訪問到的對話狀態的空間到了動態規劃初始空間的時候,取樣的方式基本上達到最優了。整個取樣的方式相對於動態規劃的方式來講還是比較高效的,能夠在一個相對少的訪問的對話狀態和對話空間之上達到比較優化的方式。
總結一下對話策略學習的方式有哪些優缺點。首先DP動態規劃的演算法要搜尋整個狀態空間,效率比較低,但是通常來說能夠達到最優解。取樣的方式不一定能夠達到最優解,通過實際的圖也可以看到實際的效果還成。另外取樣的方法在通常的實際的過程中,不是一次取樣就結束,需要多次取樣的方式。如果這樣取樣的方式把人融合進來的話,或者拿到真實使用者反饋情況的話,多次取樣也不是很實際的。每次取樣儘管比動態規劃的方式訪問的空間低,但是也有很大的狀態空間,不能拿這樣的狀態空間進行反饋。所以我們說整個的實際理論上有真實使用者參與學習的方式下,這種取樣的方式也不是特別實際。有沒有相對來說不需要人介入那麼多,還能在整個過程當中比較實際應用起來的呢?既然真實的使用者用不起來,我可以用一個模型進行左右互博來學習。這種方式,如果大家對阿爾法的演算法有所瞭解,媒體上也宣傳AlphaGo左右互博自我更新的過程,就是說的使用者模擬器的過程。整個使用者模擬器的動機就是沒有辦法用大量的人,即使是取樣也沒有辦法進行線上的對話策略學習,產生對話狀態你就給我一個分數,不切實際,成本比較高。
能不能用簡單的方式訓練一個模擬器,模擬器再去訓對話模型。在整個過程中,相當於一個模型訓另外一個模型。資料庫有多少個空間,多少個槽的範圍,通常來說對話的模型是知道的。這個模型就是所說的使用者模擬的過程,懷揣著這樣的意圖,人的意圖也可以通過這種方式告訴模型,如果用使用者模擬器的話,就可以用最簡單的方式,每一次都用熵值最大的槽,用這種方式不斷地訓對話模型,試錯成本特別低。AlphaGo一晚上要下幾萬盤棋,而且它能夠探索到很大的範圍。我們說動態規劃方式可以探索對話狀態的空間,取樣的方式沒有辦法探測整個空間。使用者模擬的方式可以用低成本的方式去試,同時可以把整個的空間試到,不需要那麼多人蔘與。講了相對比較基礎的對話策略基本的做法,以及我們怎麼樣去把人的因素考慮進來,怎麼樣讓對話模型自己訓練自己。
通過剛才的介紹,看到有幾方面。首先就是怎麼樣定義,或者怎麼樣初始化,怎麼樣更新這個對話的策略,以及採用什麼樣的Q函式去學習。我們有沒有更優化一點的Q函式的學習方式?還有沒有更客觀的,就拿任務完成的方式和對話輪次的方式定義這個獎勵函式,有沒有更好一點的。比如說你同樣是兩個系統,以同樣的任務完成率完成一個任務,使用者就是喜歡用你的,但是已有的獎勵函式就沒有定義,所以我們想優化的方向,其中一個方向就是能不能夠更好地定義更客觀的一個獎勵函式。最後一個方向,就是我們剛才說的對話模擬,我們怎麼樣讓這個對話模擬器更接近於人。最簡單的實現方式就是用這種有限狀態自動機的方式去訓練模擬器,用模擬器訪問資料庫,不斷地問模型這個問題,整個過程中提升模型跟人的互動的能力。最後一個就是可能優化的方向,也是最近有進展的方向,就是能不能有更真實的對話模擬器。
接下來就是分四個工作分別介紹一下四個方向的進展。第一個進展就是更簡單的對話策略學習的方式。現在隨著2014年深度學習火起來,大家就給出一大套對話策略估計的方式,有深度學習,深度神經網路。能不能用深度神經網路的東西做這個事情,一個想法就是用單層的神經網路結構的對話策略學習器。最開始就是Policy network的方式,這個也是非常的純粹,輸入就是對話狀態,輸出就是對話動作,所有的智慧都是引數裡面蘊含著,整個架構就是這樣的架構。然後我們忽略上面的NLG的過程,實際它的輸入就是state,輸出就是Act。每一個階段是總歸有少量的或者上千條的人人對話資料對,我拿它做一個初始化,初始化的過程中是有監督的學習,我們通過這種方式來學習到對話的動作的分佈是什麼樣的,當前的Query裡面蘊含著哪些slot也是用這個估計的,以及需要問使用者哪些問題,每一個過程都是一個獨立的二分類的過程,通過這樣的方式先訓練一下。再一個過程之中就有Policy的強化學習和方式,不斷探索這個策略空間,就是初始化加上後學習的內容。
更優化的Q值函式,這個深度Q值網路,最深的時候就是AlphaGo的時候,這個Q函式之前的方式可以用值迭代的方式更新。但是有一個問題,我們怎麼樣來估計下一個狀態S和給定這個A,下一個動作A1的獎勵值。傳統的方法可以用Bernoulli方程的方式去求解,但是時間複雜度特別高。深度神經網路出來之後,就想反正輸入是一個狀態和動作,你就要估計一個Q值,我用一個MLP行不行,就把這個對話策略學習形式變化一個前饋全連線網路,從而變得更加簡單,不管什麼引數都蘊含在W矩陣裡面。當然這個訓練過程中還是取樣的方式,採用取樣的方式,去更新那個π函式,我們說用Monte Carlo的方式來更新所有W的引數,這種方式也是後面提到的微軟2018年發表的BBQ-learning的方式。
更加客觀的獎勵函式上面的進展。現在定義的獎勵函式特別剛性,要麼成功,要麼不成功。同樣成功的情況下,使用者對哪一個系統更滿意不知道。一個簡單的方式就是把使用者的滿意度,用變數的方式,比如定五檔,從1-5,5是最滿意的,1是不那麼滿意的,2可能是稍微滿意一點,3是滿意,4是很滿意,5是特別滿意。把使用者的成功率轉化成滿意度的方式,離散化的取值範圍弄到獎勵函式裡面,這個獎勵函式是原始沒有變過獎勵函式的變化形式,把原來的用對話成功率的方式建模,變成滿意度的建模方式的時候,相對來說客觀一點的獎勵函式的時候,是可以通過這個方式是近似的。
更加真實的一個使用者模擬器方面,也是微軟提出來這樣一個模型。原來要麼是機器人,要麼是人跟NLU,要麼就是這個機器人,就叫對話模擬器,根據dialogue corpus去學,學完了之後不斷地去訓練dialogue model,人蔘與度不高。在整個框架下,分成左右兩部分,第一部分是人教Simulator,整個過程中,投入很小的精力初始化,初始化之後就跟這邊去學。人看到有一些狀態和動作之間的轉移方式不對,再去糾正它,再去訓練它。通過這種分時分階段的對話的模擬,能夠訓練更好的,就是Simulator和這個人越來越像。
對於任務型對話系統,在對話管理之後,就是對話生成的過程。對話生成的過程,也是在這樣一個整體框圖下面,這個對話管理之後已經產生了一個動作。假如說這個動作就是我們期望的動作,根據這個動作怎麼樣產生一個類似於人一樣的回覆呢?這種方式可以簡單,也可以複雜。簡單的方式,我們說可以整個從對話的動作到自然語言語句的過程任務是非常明確的。以前主要的步驟分為三步,一個是文字規劃,生成句子的語義幀序列,再就是生成關鍵詞、句法等結構資訊,最後就是表層規劃,生成輔助詞及完整的句子。這個裡面自然語言的生成不特指對話系統的自然語言生成,NLU那是一個大概念,只不過我們在對話系統裡管的第一步也叫NLU。同樣NLG也是比較大,生成新聞、評論,生成高考作文、公文、假新聞,這都是自然語言生成的過程。
還有比這個更簡單的方法,是什麼方法呢?就是寫文字,反正對話動作是有限,詢問出發地或者確認目的地,僱兩個人寫一條給一塊錢,你就寫吧,詢問出發地。一個人寫“您從哪裡出發”,另一個同學寫“請問您從哪裡出發”,確認目的地還是兩個人分別去寫,當然這個裡面會把相應的目的地的槽空出來。總之我們僱了一些人,就能夠實現我們這個目的,假如對話系統夠簡單,我們再用比較簡單的策略選擇的過程的話,搭起任務型對話系統挺簡單的,特點就是簡單、機械,成本有點高,你得給標註者一定的錢,有多少人工就有多少智慧。
其實通常來說,我們都不會這麼做,最簡單的方式就是流水線式規劃生成自然語言生成。通過這種Dialogue manager已經產生了對話的動作,然後還是“三步走”,第一步生成一個語義幀的序列,這種序列裡面包含著我要生成什麼樣的句子。我現在就要生成一個確認句子,確認句子之後,要生成一定的句法、關鍵詞和結構化的成分,這個部分相當於把句子主幹拼出來了。然後往這個裡面塞助詞、標點符號、感嘆號,最終通過這個“三步走”的方式,把自然語言的句子分出來了。當然如果是一個語音對話系統,最後還要把文字轉化成語音播出去,如果是文字的話,直接把完整句子反饋給使用者就完事了。除了流水線式的規劃的方式之外,因為我們說這是2001年左右的工作,後面到了2002年我們能不能用一些統計學習的方式代替一下部分的流水線的規劃方法的某一個模組,就出現了這種方式。
統計學習方法能夠事先決策。句子生成過程中,規劃多少屬性,以及屬性的空間裡面,我們要規劃了若干個屬性之後,具體挑哪幾個進行規劃的生成。整個過程有一個表層規劃的過程,就是句子規劃、表層規劃和句子生成的過程。流程沒有太大的變化,還是規劃的“三步走”。但是表層規劃上面,用統計語言模型進行訓練之後,就變成了用n-gram的方式去訓練,這是傳統的統計模型。我們再用基於語言模型句子生成的方式,比如說這裡面“吃蘋果”就比“吃太陽”的概率高,我們在規劃過程中生成“吃蘋果”的概率就比較高。
最後再若干個生成。不止生成一個,有若干個候選。我們有一套規則生成若干個候選進行打分,這個規則包括但不限於:句子長度。包含的語義槽有合理的取值。如果生成的語義槽不給一個合適的值,你生成的句子是不完整的句子,可能也不太有特別高的分值。還有生成的語義槽是否是需要的,我最開始規劃的屬性你生成出來沒有,或者你生出來不是規劃範圍之內,我們就可以認為你這個槽是不需要的。最終通過這種方式得到完整的自然語言的句子。
後面到了深度學習的時代,這是2015年的時候,很自然的方式就是統計語言模型可能有一個區域性的相關性。我們用RNN的方式建模整體的特性,用雙向的RNN做了一下,整個過程分為兩步走,跟規劃的方式前兩步捏在一起,前兩步捏在一起之後,有一個去詞彙化的過程,把這個槽和值抽出來,抽出來這樣一個方式,抽成slot name和slot food這樣的方式。通過這樣的方式之後RNN建模,等到最後形式的時候,其實跟上一個自然語言生成的方式有點像,只不過最終用RNN生成模板,再通過對話已有的狀態和對話採集到的語義槽的值,生成自然語言句子的時候,把值填進去。這個過程跟之前比較相似,但是比較好的就是採取了雙向RNN的模式進行的語言模型的生成。
這個是雙向的RNN,但是這個裡面的每一個unit替換成了LSTM,加入了Domain Act,就是對話動作的資訊。除了對話動作的資訊,還加入了槽值對的資訊,整個過程還是用雙向的LSTM生成句子。把DA訊號加進去主要加的是這部分。這個就是自然語言生成這部分,這部分沒有特別多的工作,大家可能大部分的工作集中在NLU和DM方面。
隨著技術發展的過程,把這種Pipeline的方式從頭到尾的生成,走了一圈的技術模組把回覆返回給使用者。這個過程中有一個問題,在語音識別和自然理解過程當中有錯誤,這個錯誤傳到DM這塊就會疊加,DM再傳到自然語言生成還會疊加,自然語言生成再往語音合成還會有錯誤,這就是錯誤累積的過程。能不能聯合學習的方式,整個的錯誤累積的過程能不能用神經網路優化方式取代這種人工接待的方式。研究端到端學習的人就開始做工作了,端到端成為一個黑盒,整個系統不要那麼多步驟。
實際的狀態就是端到端的生成式對話模型,最開始可以看到的不是任務型的對話,是開放域的對話,是2016年蒙特利爾大學他們提出的模型叫做HRED的模型,這樣一句話建模的時候,你可以從第一個詞建模到最後一個詞。如果你說給你一個對話歷史,建模多輪的情況下,建模整個的對話歷史,建立多輪的形式下,給我一個合理的回覆,怎麼樣建立對話歷史。他們就提出一個簡單粗暴的方式,句子和句子之間也用RNN去Encoder。
HRED不是針對任務型對話做的,出來以後在開放域對話的表現還可以,沒有那麼多詬病,其實更好一點的方式不是以那種粗暴的建模方式去建。既然現在的深度學習發展的這麼好,我們能不能用深度學習把Pipeline保留,但是我把Pipeline中的每一個部分都用深度神經網路去代替,比如說NLU用資料標註的方式去識別,用MLP的方式去識別意圖,填充槽。整個的Policy network這塊因為也提出來過基於深度學習,對話策略學習的方式。自然語言生成的方式也可以用RNN的方式學習。可以串聯在一起,雖然不是完完整整的端到端的過程,但是每一個過程都是端到端。當然用的就是CNN+RNN的方式。這個句子模板也是用Attention-based RNN實現的。
除了深度學習之外,大家也知道這個強化學習,能不能用Pipeline的方式在結合過程當中,錯誤累積儘可能的少。微軟他們提出來的工作框架比較好,唯一的不好在於所有的工作都是拿已有的工作做的。這個是模板+生成的方式,這個是基於LSTM的序列標註模型,這個是符號化輸出,這個是基於規則初始化的多層感知機,這個工作唯一的創新就是提出了強化學習的框架,但是裡面任何的東西都是用的別人的。整合到一起也是不錯的方式,第一次實現了除了模組內部是端到端可學習的過程之外,把若干個模組之間用強化模式串聯起來了。
為了想做到完全的端到端,Eric和Manning提出了一個完整的端到端模型和相關的資料集。這種模型不把語義槽東西顯式建模,把任務型拆成若干個單輪對話。問你一個問題回答一個槽,把整個過程當中一個一個離散化,變成了用Seq2Seq的模型一步一步的生成。生成過程之中會用注意力的機制,在解碼過程中會選當前的輸出。因為有一個資料庫,這個資料可以認為是所有的任務型對話的資料,無論是狀態還是取值的可能性,都包含在資料表達裡面。解碼的時候就想,解碼這句話的時候究竟是從使用者輸入的詞裡面拷貝,還是在給定的候選的資料庫裡面揪一個詞出來的過程。整個過程就變成了一個Seq2Seq的過程,生成的話還是像任務型的這種方式。
後續的能不能不採用這種方式去決策,每一個過程當中到底是拷貝值還是生成值。資料庫裡面的詞是有限的,把那些詞都拿出來,解碼的過程中,每生成一個詞看解碼,是從正常的詞表中做decoder,如果判斷出來是在後面資料中的詞做decoder,實際上就把整個任務型問使用者槽的特徵加入到了這樣一個回覆之中,也是關鍵詞的方式進行的一個生成過程。
既然有若干個資料庫裡面的值,能不能採用一種更有意思的方式,先把使用者輸入表示成一個對話的狀態。當然我們說這個裡面可以考慮更長的上下文,整個任務型對話進行了10輪了,我們把10輪對話的歷史表示成對話的狀態,對話建模的過程可以用Seq2Seq的方式建模。表示成對話狀態的分佈之後,我們把可能用到的資料庫裡面的unit的值拿出來進行表示。表示成之後,進行一個聯合的拼接,拼接了之後,加入了decoder的也包含了可能用到的資料庫裡面的Unit的值。利用檢索的方式,結合Seq2Seq的方式建立多輪的對話。
這個不足就在於可能對於檢索回來的Unit的裡面值,一個unit對應一個entry,有一個問題,解碼出來的值。儘管對應的是這樣的條目,但是我們解碼中,因為我們是一個unit一個unit去建模的,因為建模了所有的unit,解碼這個東西的時候,不一定真正的能把它拿出來,在解碼具體值的時候,就用錯相應的資料裡面的值,對於我們生成的過程是有問題的。整個這個過程,我們在資料庫或者Interpreter建模之下,我們加一個約束。只讓它在確定的某一行之後,在這一行裡面決定用哪一個Unit的值參與到解碼過程之中。這個工作的模型圖就是這樣的。整個過程採用的訓練方式就是知識庫檢索部分是採用無標註的訓練資料,我們檢索出來哪一個是知識庫需要的資料不一定。採用兩種訓練的方式,第一種就是規則式的訓練方式,用檢索模型去檢索,檢索最多的,每一次檢索的時候都有幾列,如果整個佇列出來比較多的列,我搜尋十次有五次就對應到其中一個列,我們就認為這個列就是我們當前的Query對應的結果,通過這種方式就實現了無標註。除了這種方式之外,我們假如檢索了10次,有5次就是同一個,那那個就是1,上面的就是0,這種1、0的這種方式就導致了訓練過程中不可微的問題,比較簡單的解決方法就是把1、0的方式進行建模。建模的方式就變成了5次是相應的過程定義成0.9,的剩下五次定義成0.002的方式,通過這種Gumbel-Softmax的方式進行連續化的表示,使之變成了可微的過程。通過這種方式,看到都能提升一定的效果,利用這個Gumbel-Softmax的方式會提升更高。
最後總結一下端到端任務型對話系統的狀態。任務型對話系統整體的基本框架還是沒有變。但是在端到端這塊的努力,最有效的嘗試就是在每一個過程當中用一個端到端的模型去訓練,但是整體上面要麼用Pipeline的方式,要麼用強化學習串起來,每一個模組都進行統計化、學習化,模組之間的聯絡仍然存在而且必要。
任務型對話系統這麼多模組,怎麼去評價是另一方面。第一方面就是評價什麼,這個任務型對話系統中哪些需要評價,其實每一個過程都需要評價。這裡面就涉及到整體和部分之間評價的關係,整體上面其實我們也之前也說到了,整個任務型對話系統優化兩個大的方向,一個是對話成功率,一個是平均對話輪數。其實整個過程之中,既然有這樣優化的目標,相對來說就有一個這樣的客觀評價的指標。
這個就是我們對話獎勵優化的目標和方向,這兩個就是一個客觀的指標。我們也說了更優的獎勵函式是考慮到主觀指標就是人的使用者滿意度,把使用者滿意度離散化,離散成若干值,這個使用者滿意度就是剛才所列的互動的質量,就是IQ的值。我們說使用者滿意度可以是一個連續值,也可以是一個離散的值,我們如果把它弄成離散的1-5的值,跟客觀的指標有對應的關係,能夠建立不同的使用者滿意度的不同的獎勵函式。
介紹完整體的評價之後,介紹分佈的評價,這個NLU就是為了得到語義幀,意圖也有相應的識別,語義槽也有相應的識別,整體的評判可以在Frame Acc過程裡面做。DM的過程,對話管理分成兩個大的部分,一個是對話狀態追蹤,一個是對話策略優化,對話狀態識別包括這個裡面有主題的對話行為和對話型別的識別。對話策略優化,優化的還是兩個部分,最終的對話成功率,因為沒有單獨的對話獎勵函式的方向進行評價。
自然語言生成這塊,就是NLG也有一定評價的方式。但是NLG看成語言模型的方式,評價指標可以採用語言模型的評價指標,這裡面用的比較多的有幾個統計的指標,包括字串級別的,還有語義級別的。這個也有一個問題,這裡面所有的字串級別的評價指標是從機器翻譯和文件文摘摘要借鑑過來的,是否適合對話生成這樣的任務,我們值得商榷。當然也有人討論過,如何不用這個評價指標來評價,他們覺得這些指標和人主觀評價指標相關性比較差。更合理的方式就是用主觀的方式叫幾個人過來打分,這種方式比較費時費力,目前來說生成式的對話評價比較難,當然這一塊也是持續可以做的方向。
最後我們給一些對話技術評測的介紹,每一個相應的評測都有相應的資料集,如果感興趣的話可以下載這樣的資料集做做這樣的任務。
最後介紹一下我們中文人機對話技術評測,我們舉辦第三年了,聯合了科大訊飛和華為。這裡面有幾個任務,每一年推出兩個任務。第一個就是使用者意圖分類,對於一個對話系統或者任務型對話系統來說,不可能就處理一個領域的事,手機上的Siri可以讓它查天氣,可以搜尋,還可以問有沒有日曆或者資訊的需求。我們認為每一個東西都是一個Domain。Siri要做的第一件事就是我們要分到哪一個Domain去處理,如果查天氣一定不能弄到定鬧鐘那裡去,我們就想做這個任務。科大訊飛第一次給我們的資料,相對來說比較簡單,我們有31個類。兩個大類要麼是聊天,要麼是任務類。任務類下面細分為30個垂直領域,你給我講一個笑話,還是講一個故事都算是一個垂直的領域。實際上這個任務就是做31分類的任務。
第二個就是比較難,讓你搭一個完整的對話系統。我們評測的過程都是由科大訊飛語音資源部的人員評測,真的是人工的評測,哪一個任務型對話系統比較好。然後我們給定了大概三個領域,機票、火車票和酒店。給它已有的訊飛的資料庫,資料庫裡面包含很多酒店、機票和火車票的資訊。評價的難點在於給定相同的輸入的時候,即使是同一個人,跟不同的系統聊的時候,系統的反饋不一樣,很難在兩個對話片斷上通過客觀的方式上判斷哪一個好,哪一個不好。只能使用人工評價,這就是用了大量的人力來做這個事,就是為了保證整個評測資料比較客觀。
資料也是提供完整的使用者意圖,描述事例和靜態的資料集、資料庫。我們這裡面也設定了最大的輪數50輪,即Nmax我們設定成50。對參賽隊伍的容忍度還是很高的,一般都是設20,我們是設50。另外一個評價指標除了客觀的對話輪數和完成度之外,我們還有四個指標。第一個指標是使用者的滿意度,還有一個是回覆語言的自然度。另外我們問到了你這個資料庫裡面沒有的值,或者沒有的領域之後,你整個對話系統能不能夠合理的引導或者拒絕我這個問題,這個也是一個評價的指標。
我們今年換了兩個任務,提升了任務的難度,任務1不再是領域分類,而是要做領域、意圖、語義槽的識別。這個特別難,跟我們以前說的任務1來說任務增加了很多的難度,我們評測的指標也比較嚴苛,要讓這些全做對才叫對。最終我們看一下指標,出門問問在Domain上面刷了到了0.9分,全體的ACC能達到0.61,這個是整個參賽隊伍整體的排名。
任務二是閒聊的專案,我們前兩屆都沒有引入閒聊的專案。這屆我們想能不能引入一個開放域對話的任務,這裡面引入了一個個性化對話生成的任務。這個任務就是我們給定一個人與人之間對話的資料片斷,給出兩個使用者,這兩個人若干屬性的屬性值。你拿這個做一個訓練資料,測試的時候給你一個屬性的值的時候,你要能夠生成和屬性值不矛盾或者一致的對話。這就是考驗對話系統,通過顯式的對話的個性資訊來建模生成符合屬性資訊對話的能力。這個也比較難,從頭到尾大系統都比較難,最後成功提交有5家。
最後對我們今天講的任務型對話做一個總結和展望可能的趨勢。我們今天從自然語言理解講到對話管理和對話狀態追蹤,也說到了多領域和多語言的趨勢,這個也是特別重要的。我從對話策略開始講,從規則到規劃到概率再到神經網路的方式。我們也給了自然語言生成和端到端的進展,緊接著講了評價的方式。最後我們給出一些展望,自然語言理解有多工學習的方式,融合外部知識,知識的引入,另外還有就是結合上下文自然語言理解的推斷。對話狀態跟蹤這一塊都是神經網路的方式,但是除了單獨的技術發展趨勢之外,NLU和DST聯合建模的時候也有。對話策略學習這塊, BBQ-learning怎麼取樣,怎麼更新的,用什麼樣的方式去做這個事情。除了本領域以外,一個Domain之內可以進行一個跨領域、跨任務的學習,包括策略學習和端到端自然語言的生成的結合。整個的發展趨勢,從流程優化到模型泛化再到端到端是一個大的趨勢,但是端到端不是那麼自然的。先是NLU與DST的結合,然後是PL與NLG的聯合。