一、問題提出

slot filling(槽填充):智慧客服、智慧訂票系統中往往需要自動將詞匯與slot對應。


把詞匯用向量表示。

多加一個other維度,不在詞典中就歸類到other。
也可以用一個詞匯的字母的n-gram,如apple中包含app、ppl、ple。

把這個vector放進network,得到的輸出是input屬於每個slot的幾率。

第二句話輸出的taipei是出發地而不是目的地。我們希望network能記得上下文,根據不同的上下文產生不同的output。
二、RNN

每次隱藏層的neural產生output時,都會存到memory中,下一次如果有input,這些neural不會只考慮input,還會考慮存在memory中的值。

所有的weight都設為1,memory給起始值0 0,第一個1 1,輸出2 2,2 2存到memory。

輸入有四個1 1 2 2,輸出12 12。

就算給一模一樣的input,output也不一樣,因為存在memory中的值不一樣。
RNN會考慮input的順序,調換順序得到的結果不同。

輸入同樣的詞,得到不同的output。


Jordan network可以得到比較好的performance,因為隱藏層沒有target比較難控制。

RNN還可以是雙向的,好處是每個output都看過了整個input sequence。
三、LSTM

輸入門打開時,其它neural才能把寫入memory cell,什么時候打開關閉是network自己學的。
輸出門決定neural能不能把值讀出來,什么時候打開關閉也是network自己學的。
遺忘門決定什么時候把過去記得的東西忘掉(format),什么時候format也是network自己學的。
整個LSTM可以看成有四個input(想要存進去的值和操控三個門的信號),一個output。

操控gate的z也是一個數值,通過sigmoid function(0-1)代表被門打開的程度。
輸入的值z經過激活函數,再乘以輸入門的信號值經過激活函數,g(z)f(zi)。
把存在memory中的值c,乘上f(zf),將兩項相乘的結果加起來c'=g(z)f(zi)+cf(zf)。
c'就是新的存在memory中的值。
輸出信號通過激活函數,再與h(c')相乘,得到輸出a。


輸入門平常是-10,x2=1時為100,打開輸入門;
遺忘門平常是10,x2=-1時為-100,打開遺忘門;


跟原來神經網絡有什么關系呢?


把memory cell想成一個neural,這個neural需要4個input,才能夠產生一個output。
neural相同的情況下,LSTM需要的參數量是一般network的4倍。

每個cell存了一個scalar,把這些scalar接起來就得到了一個vector,記作c^{t-1}。
在時間點t輸入一個vector x^t,vector會乘上一個matrix變成z,vector z的每個維度表示操控每個LSTM的input。
同樣也可以得到另外三個z,操控輸入門、輸出門、遺忘門。


這個計算過程反復進行。

minimize 交叉熵計算損失。

參數更新:梯度下降原理一樣,為了提高計算效率使用反向傳播的進階版BPTT,考慮了時間信息。
四、RNN的問題


error surface會非常平坦或非常陡峭。clipiping:不讓梯度大於某個值,防止踩到懸崖飛出去。
為什么RNN會有這種特性呢?問題不是出於激活函數,RNN的激活函數一般都用sigmoid,換成ReLU的話performance會變差。

1輸進去,得到的output是w^999。為了知道w的梯度變化,我們來試驗改變w的值,可以發現w很小的變化對output影響很大。
RNN的問題在於同樣的w在不同的時間點都被反復使用,w只要一有變化,有可能完全沒有造成任何影響,也有可能造成很大影響。

LSTM解決了梯度消失的問題,但是不能解決梯度爆炸的問題。
因為有遺忘門:memory和input是相加的,除非遺忘門決定要把memory中的值清洗,不然每次都只會有新的值加進來,不會讓原來的值消失。
LSTM就是為了解決梯度消失的問題,遺忘門常被設特別大的閾值,確保多數情況是開啟的,只有少數情況會被format。
另外一個用gate操控memory cell的是GRU,GRU的gate只有兩個,需要的參數量少,所以也不容易overfitting。

還有一些其他的技術幫助解決梯度消失或者梯度爆炸的問題。
五、其他應用

5.1、情感分析、文章關鍵詞

評論的正負情感分析:input是一個character sequence,在最后一個時間點output,再通過幾個transform,得到結果vector。

給機器看一篇文章,機器預測其中關鍵詞:輸入document words sequence,通過embedding layer,用RNN讀一次,把出現在最后一個時間點的output拿過來做attention,再把重要的信息抽出來,丟進前饋網絡,得到最后的output。
5.2、語音辨識

輸出比輸入短,如語音辨識:每個vector都輸出一個字,然后再做trimming(去重)。但是這樣不能把“好棒”和“好棒棒”分開。

CTC:多output一個null符號

不知道每個字對應哪幾個frame,就窮舉所有的情況,全部當做是正確的。

不用告訴機器his friends是兩個單詞,它會自己學到這件事,因此CTC可以辨識人名、地名等,是現在主流的方法。
5.3、機器翻譯

不確定輸入輸出的長短,如機器翻譯:最后一個時間點,memory存了input的整個sequence的信息。


然后讓機器吐一個character,再output下一個的時候把之前的當做input。

為了阻止機器不斷產生詞匯,需要多加一個symbol “===”。

輸入語音直接輸出翻譯后的文字。
5.4、sequence-to-sequence

句法分析樹:過去用structure learning才能解決,現在有了sequence-to-sequence技術,只要把這個樹狀圖描述成一個sequence。
LSTM有記憶力,不會忘記加上右括號。

詞袋模型往往會忽略掉單詞順序信息。

想要在考慮word sequence order的情況下,把一個document變成一個vector。
輸入一個word sequence,通過一個RNN,把它變成一個embedding的vector,再把這個embedding vector當做decoder的輸入,讓decoder變回一模一樣的句子。
這個過程RNN能做到的話,就說明這個vector能夠代表word sequence重要的咨詢。這個train不需要label,收集大量的文章直接train就好。
還有另外一個版本skip-thought,output target是下一個句子。如果要得到語義的意思,用skip-thought會得到比較好的結果。

還可以每一個句子先得到一個vector,再把這些vector變成high-lever vector,再把整個的vector產生一串句子的vector,再根據每個句子的vector解回word sequence。


聲音訊號變成vector,可以拿來做語音搜索。

先把audio segment抽成acoustic feature sequence,然后放進RNN(encoder),最后一個時間點存在memory里面的值就代表了聲音信息,就是我們想要的vector。

還需要train decoder,訓練target是希望y1和x1越接近越好。


decoder輸出的值是應答的內容。
六、attention-based model


機器也可以有很大的記憶容量,DNN/RNN會操控一個讀寫頭,決定reading head放的位置,機器再從這個位置讀取數據,產生最后的output。

進階版,還可以把發現的東西寫進memory,這個就是neural turing machine。

讀取過程可以是重復的,並不會只從一個地方讀取。

從哪個位置讀是由機器自己學習的。


用CNN把每一塊region用vector表示,問題輸入后同樣由reading head controller來決定要讀取的咨詢位置。

機器了解了問題的語義和audio story的語義,就可以做attention,找出哪些部分和問題有關。
將答案與其它選項計算相似度。
七、對比







