本系列為深度學習課程筆記,課程網址在http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS17.html
深度學習的基本步驟:定義模型-->定義損失函數-->找到優化方法
課程大綱
1、熟悉定義符號(略過)
2、RNN
簡單地說就是
RNN可以看做是一個function反復迭代。
為什么不用feedFord network,因為我們輸入的sequence可能會比較長,這樣的話feedFord network可能就會參數很多,容易導致過擬合。
RNN的一個好處是參數少,有可能比較難train,但是你一旦在training data上獲得比較好的結果,在testing data上的效果通常也不會差。
Deep RNN要注意到一點是 f1的輸出和f2的輸入的維度必須一致,這樣才好拼接到一起。
雙向RNN。就是要加入一個f3,將f1的輸出和f2的輸出整合在一起。至於f1和f2不必一樣,你可以隨便設計。
下面介紹一些具體的應用
這個是直接用sqe2sqe的語音識別。第一層是bi-rnn,第二層是將若干第一層的輸出(合起來)作為輸出,也是bi-rnn,后面都這樣下去。這種結夠比單純的深度bi-rnn更容易訓練。第二層block雖然需要處理若干第一層block的輸出,但是這種法有利於做並行加速。RNN很難做並行,因為下一個節點必須得等第一個節點的輸出才能進行,而pyramidal rnn里高層的block,序列變短了,每個block中雖然運算量較大,但是可以用並行運算加速。
最簡單的RNN運算如上圖。
C變化較慢,可以記住時間比較久的信息。
也可以把C拿下來一塊運算。一般W中對應於C的參數都是對角矩陣。
然后如下運算
z_i是輸入門,決定了z的哪些信息流入,z_f是遺忘門,決定c_t-1的哪些信息遺忘。
然后就可以反復這個步驟。,以上粗箭頭表示乘以一個矩陣,細箭頭表示啥也沒做。
使用例子(下面是一些煉丹心得,詳細了解需要認真去讀原論文)
簡化版的語音識別任務,每一段聲音識別成一個因素即可,多分類問題。
使用單項RNN有一個有效的trick是 Target Delay
在原始聲音信號(frame)右端補若干個零(圖中是3個),在識別時標簽向后延后若干位開始做識別。
以上任務在若干種方法的實驗效果
縱軸是分類正確率,橫軸Window size是(如果是MLP)是指:如果input是一排frame(每個frame的聲音信號可能只有0.01秒),每次判斷時將前后若干frame拼接起來作為一個比較長的vector去判斷中間一個frame的標簽是什么。圖中MLP方法的Window size為10時效果最好。
橫軸target delay是(如果是RNN或LSTM)是指label往右shift幾個frame。
上面這個圖的橫軸是訓練的輪數,從圖中可以看出LSTM的訓練速度比RNN更快
下面這個圖是LSTM的各種架構跑的結果。論文名字叫LSTM 漫游。嘗試了各種各樣的LSTM架構和參數。
橫軸是錯誤率,縱軸是訓練時間。不同的顏色代表不同的LSTM架構,相同的顏色不同的點代表同樣的架構,不同的參數。
后面三個MUT1、MUT2、MUT3使用基因演算法去尋找最佳的RNN結構,使用LSTM和GRU的結構為初始基因,使用不同的組合去找。
還有一個比較經典的RNN結構,普通的RNN受輸入長度的限制。輸入過長時,內存或顯存放不下。而下面這個結構Stack RNN輸入可以無限長,它是將輸入每N個取出來放到一個function里輸出需要存儲的information同時輸出push、pop、nothing操作。具體詳見論文吧。