在卷積神經網路領域中有許多視覺化方面的研究,但是對於 LSTM 卻沒有足夠的類似工具。LSTM 網路的視覺化能帶來很有意思的結果,由於其包含時間相關性,我們除了可以在視覺化影像的空間維度上探索資料之間的關聯,還可以在時間維度上探索關聯的穩健性。
GitHub 地址:https://github.com/asap-report/lstm-visualisation
資料集地址https://archive.ics.uci.edu/ml/datasets/Australian+Sign+Language+signs
對於長序列建模而言,長短期記憶(LSTM)網路是當前最先進的工具。然而,理解 LSTM 所學到的知識並研究它們犯某些特定錯誤的原因是有些困難的。在卷積神經網路領域中有許多這方面的文章和論文,但是對於 LSTM 我們卻沒有足夠的工具可以對它們進行視覺化和除錯。
在這篇文章中,我們試圖部分填補這個空白。我們從澳大利亞手語(Auslan)符號分類模型中對 LSTM 網路的啟用行為進行視覺化,透過在 LSTM 層的啟用單元上訓練一個降噪自編碼器來實現。透過使用密集的自編碼器,我們將 LSTM 啟用值的 100 維向量投影到 2 維和 3 維。多虧了這一點,我們在一定程度上能夠視覺化地探索啟用空間。我們對這個低維空間進行分析,並試圖探索這種降維操作如何有助於找到資料集中樣本之間的關係。
Auslan 符號分類器
本文是 Miroslav Bartold 工程論文(Bartołd,2017)的擴充套件。該論文中使用的資料集來自(Kadous,2002)。該資料集由 95 個 Auslan 手語符號組成,是使用帶高質量位置追蹤器的手套捕獲而來的。然而,因為其中一個符號的資料檔案存在問題,剩下 94 個類可用。每個符號由當地手語使用者重複 27 次,且每個時間步使用 22 個數字(每隻手 11 個數字)進行編碼。在資料集中,最長序列的長度為 137,但由於長序列數量很少,因此我們將長度保留 90 位,並在較短序列的前端填充零序列。
Miroslav 的論文測試了幾種分類器,它們全都基於 LSTM 架構,分類的準確率在 96%左右。
如果你對 LSTM 不甚熟悉,你可以看看 Christopher Olah 的部落格,上面有關於 LSTM 網路非常好的解釋:http://colah.github.io/posts/2015-08-Understanding-LSTMs/。或者機器之心的文章:在呼叫 API 之前,你需要理解的 LSTM 工作原理。
在這項研究中,我們將重點關注一種具有 100 個 LSTM 單元單隱層的架構。該架構最後的分類層有 94 個神經元。其輸入是具有 90 個時間步的 22 維序列。我們使用了 Keras 函式式 API,其網路架構如圖 1 所示。
圖 1:模型架構
圖 1 所示的 Lambda 元素從完整的啟用序列中提取了最後一層啟用(因為我們將 return_sequences=True 傳給了 LSTM)。對於實現過程中的細節,我們希望大家檢視我們的 repo。
首次嘗試瞭解 LSTM 網路的內部結構
受到《Visualizing and Understanding Recurrent Networks》(Karpathy, 2015) 的啟發,我們試圖將一些對應易識別子手勢的神經元局域化(並在不同的符號之間共享),例如握緊拳頭或用手畫圈。但是,這種想法失敗了,這主要有下列五個原因:
來自定位追蹤器的訊號不足以完全重建手部的運動。
手勢在追蹤器和真實空間中的表徵差異明顯。
我們只有來自 http://www.auslan.org.au 的手勢影片,卻沒有資料集中符號的實際執行的影片。
資料集以及影片中的語彙來自不同的方言,所以可能會出現同義詞。
100 個神經元和 94 個符號對於人類理解而言是非常大的空間。
因此,我們只關注視覺化技術,希望這能幫助我們揭開關於 LSTM 單元和資料集的一些奧秘。
去噪自編碼器
為了將所有手勢的 LSTM 輸出啟用序列視覺化,我們將嘗試在每一個時間步利用去噪自編碼器將表徵啟用值的 100 維向量降為 2-3 維的向量。我們的自編碼器由 5 個全連線層組成,其中第三層是具有線性啟用函式的瓶頸層。
如果你對上面說的主題不甚熟悉,你可以在這裡學習更多有關自編碼器的知識:http://ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/。
為了使得影像清晰易讀,線性啟用函式被證明是最佳的啟用函式。對於所有被測試的啟用函式,所有樣本路徑(example path,該術語將會在下一部分中解釋)都從圖的(0,0)點附近開始。對於非奇對稱函式 (ReLU 和 sigmoid) 而言,所有樣本路徑都在座標系的第一象限。而對於奇函式而言(例如 tanh 和線性函式),所有路徑在所有象限都大致是均勻分佈的。但是,tanh 函式將路徑壓縮到 -1 和 1 附近(這使得影像太過失真),而線性函式沒有這個問題。如果你對其他型別啟用函式的視覺化感興趣,你可以在 repo 找到程式碼實現。
在圖 2 中,我們展示了 2D 自編碼器的架構。3D 自編碼器與之幾乎完全相同,不過它在第三個 Dense 層中有 3 個神經元。
在每個手勢實現的所有單個時間步中,自編碼器使用 LSTM 單元的輸出啟用向量進行訓練。然後這些啟用向量被打亂,其中一些冗餘啟用向量會被去除。冗餘啟用向量指的是從每個手勢開始和結束中得到的向量,其啟用基本保持不變。
圖 2 自編碼器架構
自編碼器中的噪聲服從均值為 0 標準差為 0.1 的正態分佈,這些噪聲被新增到輸入向量當中。網路使用 Adam 最佳化器進行訓練,來最小化均方誤差。
視覺化
透過向自編碼器輸入對應於單個手勢的 LSTM 單元啟用的序列,我們可以獲得瓶頸層上的啟用。我們將這個低維瓶頸層啟用序列作為一個樣本路徑。
在一些樣本的最後一步附近,我們給出了它所代表的手勢符號名稱。在圖 3 中,我們給出了訓練集樣本路徑的視覺化結果。
圖 3 LSTM 啟用時間演化的視覺化
視覺化圖中的每個點都代表一個時間步、一個樣本的自編碼器 2D 啟用值。圖中點的顏色代表每個符號執行的時間步長(從 0 到 90),黑線連線單一樣本路徑的點。在視覺化之前,每個點都由函式 lambda x: numpy.sign(x) * numpy.log1p(numpy.abs(x)) 進行轉換。這種轉換能夠讓我們更加仔細地觀察每條路徑的起始位置。
在圖 4 中,我們展示了每個訓練樣本最後一步的啟用。這是輸入點到分類層的二維投影情況。
圖 4 LSTM 最後一層的啟用
令人驚訝的是所有路徑看起來都非常平滑並且在空間上能很好地分離,因為實際上在訓練自編碼器前,每個時間步和樣本的所有啟用操作都被打亂了。圖 4 中的空間結構解釋了為什麼我們的最後一個分類層在如此小的訓練集上(接近 2000 個樣本)能達到很高的準確率。
對於那些有興趣研究這個 2D 空間的讀者而言,我們已經在以下地址提供了圖 2 的大型版本:https://image.ibb.co/fK867c/lstm2d_BIG.png。
在圖 5 中,我們展示了三維 LSTM 啟用的視覺化結果。為了清晰起見,我們只標明瞭一部分點。出於資料分析的目的,我們在本文第二部分只關注 2D 視覺化。
圖 5 LSTM 啟用的 3D 視覺化版本
分析
視覺化看起來效果非常好,但是其中有沒有更有意義的東西呢?如果一些路徑距離很近,是否說明這些手勢符號更相似?
讓我們在考慮右手和雙手符號劃分(我們並未看到僅用左手的符號)的情況下看看這個空間吧。這種劃分是基於手持跟蹤器的訊號可變性統計而來的,更詳細的資訊參見 repo。
為了清晰起見,我們在圖 6 中繪製了不含點的路徑。右手手勢符號用青色表示,雙手手勢符號用洋紅色表示。我們可以清楚地看到,這兩種符號都佔用了空間的互補部分,並且很少彼此混淆。
圖 6 按照手的使用對啟用路徑進行分類
現在讓我們先來看看 drink-danger 對。這兩者都是「青色」的手勢,卻佔據了圖 6 中間偏右側大部分洋紅色的部分。在我們的資料中,這兩個手勢都是單手的,但來自 Auslan signbank 的影片解釋表明 danger 手勢顯然是雙手的。
這可能是由標籤錯誤引起的。請注意,dangerous 肯定是單手的,而且 drink 也類似(至少在手勢的第一部分)。因此,我們認為標籤 danger 實際上就是 dangerous。我們在圖 7 中繪製了這兩個手勢。
圖 7 標籤 drink 和 danger 的 LSTM 啟用值
在圖 8 中,Who 和 soon 手勢的情況很類似。手套中只有一個彎曲追蹤器,且手指彎曲測量不是很精確。這也就是這兩種手勢在圖 8 中看起來比影片中更類似的原因。
圖 8 who 和 soon 標籤的 LSTM 啟用值
Crazy 和 think 符號的樣本路徑佔據了圖 9 中的相同空間區域。然而,think 看起來像是稍長的 crazy 手勢的一個主要部分。當我們檢視 Auslan signbank 中的影片時,我們發現這種關係是正確的,而且 crazy 符號看起來就像是 think 符號再加上手掌開啟的過程。
圖 9 think 和 crazy 的 LSTM 啟用值
在圖 10 中,雖然當我們看 you 這個符號時我們發現這個符號與 crazy、think、sorry(以及其他在這裡沒有展示出來的手勢)相互垂直,但我們在 signbank 中比較它們的影片時,我們並不能發現這些符號和 you 之間的任何相似之處。
圖 10 think/crazy/sorry/you 的 LSTM 啟用值
我們應該記住,每一個 LSTM 單元的狀態會記住它自己之前的狀態,它在每一個時間步都由相應的輸入序列饋送進來,並且在路徑佔據相同空間時可能會存在時間演化上的不同。因此,除了我們在分析中考慮的因素,實際上有更多變數會決定路徑的形狀。這可能解釋了為什麼在我們無法觀察到符號間視覺相似性時,卻能發現部分樣本路徑之間有交叉關係。
從視覺化結果得到的部分緊密聯絡被證明有誤。一些聯絡在自編碼器再訓練的間隔中(或 LSTM 單元再訓練之後)會發生變化;有些聯絡則不會變化,可能代表真正的相似之處。舉例而言,God 和 Science 有時在 2D 空間中共享相似的路徑,有的時候又會彼此遠離。
錯誤分類的樣本
最後,讓我們來看看錯誤分類的樣本。在圖 11、12 和 13 中,我們分別對在訓練集、驗證集和測試集中錯誤分類的樣本進行了視覺化。錯誤分類樣本上面的藍色標籤是它們真實的類別。在其下方是模型選擇的標籤,用紅色標記。
對於訓練樣本,只有三個樣本被錯誤標記了,而且其中的兩個(hurt-all 和 thank-hot)在二維空間中非常接近。Thank-hot 在影片中也很接近,但 Hurt-all 並非如此。
圖 11 訓練集中錯誤分類的樣本
正如我們所料,驗證集和測試集中都有更多分類錯誤的樣本,但是這些錯誤在投影空間更接近的手勢當中更常發生。
圖 12 驗證集中錯誤分類的樣本
圖 13 測試集中錯誤分類的樣本
小結
我們將啟用值的 100 維向量投影到低維空間。這種投影看上去很有意思,它似乎保留了很多(但並非全部)符號之間的關係。這些關係似乎與我們在觀察現實生活中手勢所感知到的關係相類似,但是在沒有實際匹配手勢影片來分析的情況下,我們無法確定這一點。
這些工具可以在一定程度上用於觀察 LSTM 表徵的結構。並且,相比與使用原始輸入,它可以作為查詢樣本關係的更好工具。
原文地址:https://medium.com/asap-report/visualizing-lstm-networks-part-i-f1d3fa6aace7