可視化LSTM網絡:探索「記憶」的形成

在卷積神經網絡領域中有許多可視化方面的研究,但是對於 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 所示。

可視化LSTM網絡:探索「記憶」的形成

圖 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 單元的輸出激活向量進行訓練。然後這些激活向量被打亂,其中一些冗餘激活向量會被去除。冗餘激活向量指的是從每個手勢開始和結束中得到的矢量,其激活基本保持不變。

可視化LSTM網絡:探索「記憶」的形成

圖 2 自編碼器架構

自編碼器中的噪聲服從均值為 0 標準差為 0.1 的正態分佈,這些噪聲被添加到輸入向量當中。網絡使用 Adam 優化器進行訓練,來最小化均方誤差。

可視化

通過向自編碼器輸入對應於單個手勢的 LSTM 單元激活的序列,我們可以獲得瓶頸層上的激活。我們將這個低維瓶頸層激活序列作為一個樣本路徑。

在一些樣本的最後一步附近,我們給出了它所代表的手勢符號名稱。在圖 3 中,我們給出了訓練集樣本路徑的可視化結果。

可視化LSTM網絡:探索「記憶」的形成

可視化LSTM網絡:探索「記憶」的形成

圖 3 LSTM 激活時間演化的可視化

可視化圖中的每個點都代表一個時間步、一個樣本的自編碼器 2D 激活值。圖中點的顏色代表每個符號執行的時間步長(從 0 到 90),黑線連接單一樣本路徑的點。在可視化之前,每個點都由函數 lambda x: numpy.sign(x) * numpy.log1p(numpy.abs(x)) 進行轉換。這種轉換能夠讓我們更加仔細地觀察每條路徑的起始位置。

在圖 4 中,我們展示了每個訓練樣本最後一步的激活。這是輸入點到分類層的二維投影情況。

可視化LSTM網絡:探索「記憶」的形成

圖 4 LSTM 最後一層的激活

令人驚訝的是所有路徑看起來都非常平滑並且在空間上能很好地分離,因為實際上在訓練自編碼器前,每個時間步和樣本的所有激活操作都被打亂了。圖 4 中的空間結構解釋了為什麼我們的最後一個分類層在如此小的訓練集上(接近 2000 個樣本)能達到很高的準確率。

對於那些有興趣研究這個 2D 空間的讀者而言,我們已經在以下地址提供了圖 2 的大型版本:https://image.ibb.co/fK867c/lstm2d_BIG.png。

在圖 5 中,我們展示了三維 LSTM 激活的可視化結果。為了清晰起見,我們只標明瞭一部分點。出於數據分析的目的,我們在本文第二部分只關注 2D 可視化。

可視化LSTM網絡:探索「記憶」的形成

圖 5 LSTM 激活的 3D 可視化版本

分析

可視化看起來效果非常好,但是其中有沒有更有意義的東西呢?如果一些路徑距離很近,是否說明這些手勢符號更相似?

讓我們在考慮右手和雙手符號劃分(我們並未看到僅用左手的符號)的情況下看看這個空間吧。這種劃分是基於手持跟蹤器的信號可變性統計而來的,更詳細的信息參見 repo。

為了清晰起見,我們在圖 6 中繪製了不含點的路徑。右手手勢符號用青色表示,雙手手勢符號用洋紅色表示。我們可以清楚地看到,這兩種符號都佔用了空間的互補部分,並且很少彼此混淆。

可視化LSTM網絡:探索「記憶」的形成

圖 6 按照手的使用對激活路徑進行分類

現在讓我們先來看看 drink-danger 對。這兩者都是「青色」的手勢,卻佔據了圖 6 中間偏右側大部分洋紅色的部分。在我們的數據中,這兩個手勢都是單手的,但來自 Auslan signbank 的視頻解釋表明 danger 手勢顯然是雙手的。

這可能是由標籤錯誤引起的。請注意,dangerous 肯定是單手的,而且 drink 也類似(至少在手勢的第一部分)。因此,我們認為標籤 danger 實際上就是 dangerous。我們在圖 7 中繪製了這兩個手勢。

可視化LSTM網絡:探索「記憶」的形成

圖 7 標籤 drink 和 danger 的 LSTM 激活值

在圖 8 中,Who 和 soon 手勢的情況很類似。手套中只有一個彎曲追蹤器,且手指彎曲測量不是很精確。這也就是這兩種手勢在圖 8 中看起來比視頻中更類似的原因。

可視化LSTM網絡:探索「記憶」的形成

圖 8 who 和 soon 標籤的 LSTM 激活值

Crazy 和 think 符號的樣本路徑佔據了圖 9 中的相同空間區域。然而,think 看起來像是稍長的 crazy 手勢的一個主要部分。當我們查看 Auslan signbank 中的視頻時,我們發現這種關係是正確的,而且 crazy 符號看起來就像是 think 符號再加上手掌打開的過程。

可視化LSTM網絡:探索「記憶」的形成

圖 9 think 和 crazy 的 LSTM 激活值

在圖 10 中,雖然當我們看 you 這個符號時我們發現這個符號與 crazy、think、sorry(以及其他在這裡沒有展示出來的手勢)相互垂直,但我們在 signbank 中比較它們的視頻時,我們並不能發現這些符號和 you 之間的任何相似之處。

可視化LSTM網絡:探索「記憶」的形成

圖 10 think/crazy/sorry/you 的 LSTM 激活值

我們應該記住,每一個 LSTM 單元的狀態會記住它自己之前的狀態,它在每一個時間步都由相應的輸入序列饋送進來,並且在路徑佔據相同空間時可能會存在時間演化上的不同。因此,除了我們在分析中考慮的因素,實際上有更多變量會決定路徑的形狀。這可能解釋了為什麼在我們無法觀察到符號間視覺相似性時,卻能發現部分樣本路徑之間有交叉關係。

從可視化結果得到的部分緊密聯繫被證明有誤。一些聯繫在自編碼器再訓練的間隔中(或 LSTM 單元再訓練之後)會發生變化;有些聯繫則不會變化,可能代表真正的相似之處。舉例而言,God 和 Science 有時在 2D 空間中共享相似的路徑,有的時候又會彼此遠離。

錯誤分類的樣本

最後,讓我們來看看錯誤分類的樣本。在圖 11、12 和 13 中,我們分別對在訓練集、驗證集和測試集中錯誤分類的樣本進行了可視化。錯誤分類樣本上面的藍色標籤是它們真實的類別。在其下方是模型選擇的標籤,用紅色標記。

對於訓練樣本,只有三個樣本被錯誤標記了,而且其中的兩個(hurt-all 和 thank-hot)在二維空間中非常接近。Thank-hot 在視頻中也很接近,但 Hurt-all 並非如此。

可視化LSTM網絡:探索「記憶」的形成

圖 11 訓練集中錯誤分類的樣本

正如我們所料,驗證集和測試集中都有更多分類錯誤的樣本,但是這些錯誤在投影空間更接近的手勢當中更常發生。

可視化LSTM網絡:探索「記憶」的形成

圖 12 驗證集中錯誤分類的樣本

可視化LSTM網絡:探索「記憶」的形成

圖 13 測試集中錯誤分類的樣本

小結

我們將激活值的 100 維向量投影到低維空間。這種投影看上去很有意思,它似乎保留了很多(但並非全部)符號之間的關係。這些關係似乎與我們在觀察現實生活中手勢所感知到的關係相類似,但是在沒有實際匹配手勢視頻來分析的情況下,我們無法確定這一點。

這些工具可以在一定程度上用於觀察 LSTM 表徵的結構。並且,相比與使用原始輸入,它可以作為查找樣本關係的更好工具。


分享到:


相關文章: