新聞中心
本文介紹了如何利用隱藏表示可視化來更加直觀地理解神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程。本文使用的工具是 Neural Embedding Animator,大家可以利用該工具更好地理解模型行為、理解訓(xùn)練過程中數(shù)據(jù)表示的變化、對(duì)比模型、了解此詞嵌入的變化。

成都創(chuàng)新互聯(lián)公司專注于花山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供花山營(yíng)銷型網(wǎng)站建設(shè),花山網(wǎng)站制作、花山網(wǎng)頁設(shè)計(jì)、花山網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造花山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供花山網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
詞嵌入的交互式可視化
將神經(jīng)網(wǎng)絡(luò)可視化是非常有趣的。對(duì)于監(jiān)督學(xué)習(xí)而言,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程可以看做是學(xué)習(xí)如何將一組輸入數(shù)據(jù)點(diǎn)轉(zhuǎn)換為可由線性分類器進(jìn)行分類的表示。本文我想利用這些(隱藏)表示進(jìn)行可視化,從而更加直觀地了解訓(xùn)練過程。這種可視化可以為神經(jīng)網(wǎng)絡(luò)的性能提供有趣的見解。
我聯(lián)想到很多想法,最終從 Andrej Karpathy 的研究(t-SNE visualization of CNN codes)中獲得了理論支持。
這個(gè)想法很簡(jiǎn)單,可以由以下步驟簡(jiǎn)單說明:
- 訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)。
- 一旦經(jīng)過訓(xùn)練,網(wǎng)絡(luò)可為驗(yàn)證/測(cè)試數(shù)據(jù)中的每個(gè)數(shù)據(jù)點(diǎn)生成最終的隱藏表示 (嵌入)。這個(gè)隱藏表示基本上就是神經(jīng)網(wǎng)絡(luò)中***一層的權(quán)重。該表示近似于神經(jīng)網(wǎng)絡(luò)對(duì)數(shù)據(jù)的分類。
- 為便于可視化,需要將權(quán)重降維到二維或三維。然后,在散點(diǎn)圖上可視化這些點(diǎn)以觀察它們是如何在空間中分離的。有一些比較流行的降維技術(shù),如 T-SNE 或 UMAP。
盡管上述步驟是對(duì)訓(xùn)練完成后的數(shù)據(jù)點(diǎn)進(jìn)行可視化,但我認(rèn)為可以實(shí)現(xiàn)一個(gè)有趣的拓展,即在訓(xùn)練過程中在多個(gè)時(shí)間點(diǎn)進(jìn)行可視化。這樣我們就可以單獨(dú)觀察每一個(gè)可視化,對(duì)事物如何變化產(chǎn)生一些見解。例如,我們可以在每一個(gè) epoch 后進(jìn)行可視化直到訓(xùn)練完成,然后對(duì)它們進(jìn)行對(duì)比。它的進(jìn)一步擴(kuò)展是生成可視化動(dòng)畫。這可以通過這些靜態(tài)可視化圖和它們之間的插入控制點(diǎn)來實(shí)現(xiàn)——從而實(shí)現(xiàn)逐點(diǎn)轉(zhuǎn)換。
這個(gè)想法讓我很興奮。為了生成這些可視化,我開發(fā)了基于 D3.js 的 Javascript 工具。它能產(chǎn)生靜態(tài)可視化圖和動(dòng)圖。對(duì)于動(dòng)態(tài)圖,我們需要上傳兩個(gè)我們想要進(jìn)行對(duì)比的 csv 文件,這些文件包含隱藏表示。該工具能使文件中的點(diǎn)動(dòng)起來。我們也可以控制動(dòng)畫,以便觀察一組特定的點(diǎn)在訓(xùn)練過程中的移動(dòng)軌跡。本文開頭有一個(gè)例子,讀者可以去試一下。
- 工具(Neural Embedding Animator)地址:https://bl.ocks.org/rakeshchada/raw/43532fc344082fc1c5d4530110817306/
- README:https://bl.ocks.org/rakeshchada/43532fc344082fc1c5d4530110817306
這絕對(duì)不是個(gè)復(fù)雜的工具。我只是想把我的設(shè)想付諸實(shí)踐。
但是,該動(dòng)畫方法有一個(gè)問題:在 T-SNE/UMAP 完成后,每個(gè) 2D/3D 表示存在不一致性。首先,設(shè)置超參數(shù)和隨機(jī)種子的時(shí)候要格外小心。其次,據(jù)我所知,T-SNE 只是嘗試以這種方式嵌入:使相似的對(duì)象靠近,而不同的對(duì)象遠(yuǎn)離。所以當(dāng)我們基于兩個(gè)可視化圖制作動(dòng)畫時(shí),比如 epoch1 和 2,我們可能很難區(qū)分由純粹隨機(jī)性引起的運(yùn)動(dòng)和神經(jīng)網(wǎng)絡(luò)實(shí)際學(xué)習(xí)過程中的權(quán)重變化。也就是說,在我的實(shí)驗(yàn)中,我有時(shí)能夠創(chuàng)作出合理的動(dòng)畫,幫助我得到一些有趣的結(jié)論。
動(dòng)圖一覽:
這個(gè)可視化框架有很多有趣的應(yīng)用。以下是分類問題的一些例子:
- 更好地了解關(guān)于數(shù)據(jù)的模型行為
- 理解神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中數(shù)據(jù)表示的變化
- 在給定數(shù)據(jù)集上對(duì)比模型——包括超參數(shù)更改,甚至架構(gòu)更改
- 了解訓(xùn)練過程中詞嵌入的變化(當(dāng)調(diào)整時(shí))
下文將用具體的實(shí)際例子對(duì)上述情況進(jìn)行說明。
一、更好地理解關(guān)于數(shù)據(jù)的模型行為
1. 惡意評(píng)論分類任務(wù)
我們?cè)谶@里使用的***個(gè)例子是 Kaggle 的一項(xiàng)有趣的自然語言處理競(jìng)賽:惡意評(píng)論分類,當(dāng)時(shí)我正在開發(fā)這個(gè)工具。該競(jìng)賽的目標(biāo)是將文本評(píng)論分為不同類別:toxic、obscene、threat、insult 等。這是一個(gè)多標(biāo)簽分類問題。
在神經(jīng)網(wǎng)絡(luò)模型中,我嘗試了幾種架構(gòu),從最簡(jiǎn)單的(沒有卷積/循環(huán)的前饋神經(jīng)網(wǎng)絡(luò))到更復(fù)雜的架構(gòu)。我在神經(jīng)網(wǎng)絡(luò)的***一層使用了二進(jìn)制交叉熵?fù)p失和 sigmoid 激活函數(shù)。這樣,它只為每個(gè)標(biāo)簽輸出兩個(gè)概率,從而實(shí)現(xiàn)多標(biāo)簽分類。為得到演示結(jié)果,我們使用來自雙向 LSTM 的隱藏表示,該 LSTM 使用未調(diào)優(yōu)的預(yù)訓(xùn)練詞嵌入進(jìn)行初始化。
所以我采取了上述相同的步驟,從***一層提取驗(yàn)證集中每個(gè)文本評(píng)論的隱藏表示,執(zhí)行 T-SNE/UMAP 操作將它們降維到 2 維,并使用該工具進(jìn)行可視化。在早停之前,訓(xùn)練進(jìn)行了 5 個(gè) epoch。使用 UMAP 的一個(gè)優(yōu)點(diǎn)是它的速度提高了一個(gè)數(shù)量級(jí),并且仍能有高質(zhì)量的表現(xiàn)。谷歌最近發(fā)布了實(shí)時(shí) TSNE,但我還沒去研究。
這是第 5 個(gè) epoch 結(jié)束時(shí)可視化的放大版本。接受可視化的類別是 insult,所以紅點(diǎn)是_insult_s,綠點(diǎn)是_non-insult_s。
讓我們看一下上圖藍(lán)色箭頭指向的兩個(gè)點(diǎn)。其中一個(gè)是 insult,另一個(gè)不是。那文本說的什么意思呢?
- Text1(帶藍(lán)箭頭的綠點(diǎn)):「廢話廢話廢話廢話廢話廢話」
- Text2(帶藍(lán)箭頭的紅點(diǎn)):「我討厭你我討厭你我討厭你我討厭你我討厭你我討厭你」
有趣的是,模型怎么將兩個(gè)重復(fù)的文本放在一起的呢?而且這里 insult 的意味似乎比較微弱!
我也很好奇紅色點(diǎn)簇中心的一些綠點(diǎn)。為什么模型會(huì)分不清它們?他們的文本是什么樣的?例如,這是上圖中黑色箭頭指向的點(diǎn)的文本:
「不要喊我麻煩制造者,你和 XYZ 一樣是種族主義右翼」(我對(duì)原文進(jìn)行了一些稍微改動(dòng),包括名稱代指)。
嗯,這似乎是 insult——所以它算一個(gè)錯(cuò)誤的標(biāo)簽!這里應(yīng)該是一個(gè)紅點(diǎn)!
可能并非所有被錯(cuò)誤放置的點(diǎn)都是錯(cuò)誤標(biāo)簽,但按照上述步驟通過可視化進(jìn)行深入挖掘,可能會(huì)發(fā)現(xiàn)數(shù)據(jù)的所有特征。
我也認(rèn)為這有助于我們揭示分詞/預(yù)處理等操作對(duì)模型性能的影響。在上面的 Text2 中,標(biāo)點(diǎn)符號(hào)正確(可能是在每次「我討厭你」之后用一個(gè)句號(hào))可能對(duì)模型有所幫助。還有其他一些例子,我認(rèn)為大寫可能有所幫助。
2. Yelp 評(píng)論情感分類任務(wù)
我還想在不同的數(shù)據(jù)集上嘗試這種方法。所以我選擇了 Kaggle 的 Yelp 評(píng)論數(shù)據(jù)(https://www.kaggle.com/yelp-dataset/yelp-dataset),并決定實(shí)現(xiàn)一個(gè)簡(jiǎn)單的情感分類器。我將***評(píng)分轉(zhuǎn)換為二進(jìn)制——這樣更容易操作。所以 -1、2 和 3 星是消極的,4 星、5 星是積極的評(píng)論。同樣,我用一個(gè)簡(jiǎn)單的前饋神經(jīng)網(wǎng)絡(luò)架構(gòu)處理嵌入,壓縮嵌入,然后輸入全連接層并輸出概率。這是 NLP 分類任務(wù)的非常規(guī)架構(gòu),但我很想知道它是如何做的。在早停之前,訓(xùn)練進(jìn)行 10 個(gè) epoch。
這是***一個(gè) epoch 結(jié)束時(shí)的可視化內(nèi)容:
黑色箭頭所指的點(diǎn)的文本是:
「每次去這里,食物都很美味。不幸的是服務(wù)不太好(not very good),我只為我喜歡的食物而來?!?/p>
這是個(gè)中立的評(píng)論,可能更傾向于積極的一面。因此,對(duì)于模型而言,將這一點(diǎn)放在積極的點(diǎn)簇中還算差強(qiáng)人意。此外,這個(gè)模型單獨(dú)處理單詞(沒有 n-gram),這解釋了漏掉上面文本「not very good」中的「not」這類現(xiàn)象。以下是與上圖消極點(diǎn)最接近的積極點(diǎn)的文本。
「喜歡這個(gè)地方。雖然基本菜單就是拉面,但味道很好,而且服務(wù)很好。價(jià)格合理,氛圍優(yōu)美。絕對(duì)是 neighborhood gem?!?/p>
模型將上面的兩個(gè)文本置于空間中非常接近的位置,這可能再次證實(shí)了該模型的局限性(諸如不捕捉 n-gram)。
我有時(shí)會(huì)想,這樣的分析可以幫助我們理解哪個(gè)例子對(duì)模型來說是「難」或者「簡(jiǎn)單」。這可以通過觀察相鄰的被錯(cuò)誤分類的點(diǎn)來理解。一旦我們理解這些,就可以利用這些知識(shí)來增加更多的人工提取特征以幫助模型更好地理解這些示例,或者更改模型的架構(gòu),以便更好地理解那些「難」的示例。
二、理解神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中數(shù)據(jù)表示的變化
我們將使用動(dòng)畫來理解這一點(diǎn)。我理解動(dòng)畫可視化的方式通常是選擇一個(gè)點(diǎn)的子集,并觀察其鄰域在訓(xùn)練過程中如何發(fā)生變化。當(dāng)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)時(shí),該鄰域在分類任務(wù)中越來越有代表性。換句話說,如果我們定義分類任務(wù)的相似性,那么當(dāng)網(wǎng)絡(luò)學(xué)習(xí)時(shí),相似的點(diǎn)將在空間中更加接近。前面提到的 Neural Embedding Animator 工具中的滑塊可以幫助我們控制動(dòng)畫,并持續(xù)關(guān)注這一組點(diǎn)。
下圖是一個(gè)動(dòng)畫,展示了數(shù)據(jù)的隱藏表示在用于惡意評(píng)論分類任務(wù)的 4 個(gè) epoch 中的演化過程(第 2 個(gè) epoch 到第 5 個(gè) epoch)。我選擇了一小組點(diǎn),以便更容易地觀察它們的移動(dòng)過程。綠點(diǎn)代表無惡意,紅點(diǎn)代表惡意類別。
有一些成對(duì)的點(diǎn)移動(dòng)時(shí)相距范圍變化較大(F 和 G 或 C 和 I),也有一些點(diǎn)始終接近(D 和 K 或 N 和 O)。
因此,當(dāng)我手動(dòng)查看與這些點(diǎn)相對(duì)應(yīng)的句子時(shí),我可以了解到當(dāng)前 epoch 的神經(jīng)網(wǎng)絡(luò)可能學(xué)到了什么。如果我看到兩個(gè)完全不相關(guān)的句子挨在一起(例如,epoch2 中的 E 和 F),那么我會(huì)認(rèn)為模型仍需學(xué)習(xí)。有時(shí)我也會(huì)看到神經(jīng)網(wǎng)絡(luò)將相似的句子放在一起,而整個(gè)句子的含義并不同。隨著訓(xùn)練的進(jìn)行(驗(yàn)證損失減少),這種影響會(huì)逐漸消失。
正如文章開頭所說,這種行為并不能保證一致性。有時(shí)候一個(gè)(些)點(diǎn)的鄰域根本沒有任何意義。但我確實(shí)希望,通過制作這些動(dòng)畫,觀察點(diǎn)運(yùn)動(dòng)軌跡的顯著變化,我們能夠得出一些有用的見解。
我還使用 yelp 數(shù)據(jù)集重復(fù)了相同的實(shí)驗(yàn),并有相同發(fā)現(xiàn)。
以下是該神經(jīng)網(wǎng)絡(luò)在經(jīng)過一個(gè) epoch 的訓(xùn)練后的結(jié)果:
這兩個(gè)類之間有很多重疊,網(wǎng)絡(luò)沒有真正學(xué)習(xí)到類別間的清晰邊界。
以下是經(jīng)過 5 個(gè) epoch 的訓(xùn)練后的表示演變動(dòng)畫:
你可以看到兩個(gè)簇在各自的類上變得更密集,并且網(wǎng)絡(luò)在分離這兩個(gè)類方面做得更好。
注:我正在為這些 epoch 間的表示變化制作動(dòng)畫。所有人都應(yīng)該更加細(xì)化這些內(nèi)容——比如 mini-batch 或 half-epoch 或者其他。這可能有助于發(fā)現(xiàn)更細(xì)微的變化。
三、模型對(duì)比
這做起來非常直觀。我們只需在想要對(duì)比的模型的***一個(gè) epoch 結(jié)束時(shí)選擇表示,并將它們插入到工具即可。
這里我比較的兩個(gè)模型是簡(jiǎn)單的前饋神經(jīng)網(wǎng)絡(luò)(沒有卷積或循環(huán))和雙向 LSTM。它們都使用預(yù)訓(xùn)練的詞嵌入進(jìn)行初始化。
因此,對(duì)于惡意評(píng)論分類挑戰(zhàn),以及 obscene 類,下圖展示了模型之間的表示變化。
所有紅點(diǎn)代表 obscene 類,綠點(diǎn)代表非 non-obscene 類。
你可以看到,BiLSTM 在分離兩個(gè)類別方面表現(xiàn)更好。
四、詞嵌入可視化
我喜歡詞嵌入,在任何 NLP 相關(guān)的分析中都會(huì)嘗試詞嵌入。這個(gè)框架應(yīng)該特別適合詞嵌入。那么讓我們看看可以用它來理解什么吧。
這是一個(gè)示例動(dòng)畫,說明在 yelp 任務(wù)上調(diào)整模型時(shí)詞嵌入的變化。它們用 50 維 Glove 詞向量進(jìn)行初始化。下圖與本文開頭的動(dòng)圖相同。為了便于說明,我們將顏色去掉并將標(biāo)簽添加到了幾個(gè)數(shù)據(jù)點(diǎn)上。
有趣的是,當(dāng)我們對(duì)嵌入進(jìn)行調(diào)整時(shí),最初單詞「food」與「ramen」(拉面)、「pork」(豬肉)等食物內(nèi)含類別的空間距離相距甚遠(yuǎn),然后它們之間的距離逐漸接近。所以這個(gè)模型可能學(xué)習(xí)到「ramen」、「pork」等都屬于食物。同樣,我們也看到「table」靠近「restaurant」等等。該動(dòng)畫可以很容易地發(fā)現(xiàn)這些有趣的模式。
另一個(gè)可嘗試的有趣事情是對(duì)該工具進(jìn)行反向工程并進(jìn)行一些自定義分析。例如,我很好奇惡意評(píng)論分類任務(wù)中惡意詞的嵌入如何發(fā)生變化。我在上述惡意評(píng)論分類任務(wù)中創(chuàng)建了一個(gè)模型,從頭開始學(xué)習(xí)嵌入(因此沒有使用預(yù)訓(xùn)練嵌入進(jìn)行權(quán)重初始化)。給定的數(shù)據(jù)量可能會(huì)對(duì)模型造成困難,但值得一試。該架構(gòu)與 BiLSTM 相同。因此,我只是將所有惡意詞匯變成紅色并在動(dòng)畫中追蹤它們。下圖展示了詞嵌入的變化軌跡:(PG-13 提示!)
這看起來是不是很吸引人?該模型將臟話(表達(dá)惡意的單詞)很好地分到一個(gè)集群中。
我希望這篇文章能讓大家了解以不同的方式可視化數(shù)據(jù)點(diǎn)的隱藏表示,以及它們?nèi)绾螌?duì)模型提供有用解讀。我期待將這些分析應(yīng)用到越來越多的機(jī)器學(xué)習(xí)問題上。希望其他人也會(huì)這么想,并從中獲得一些價(jià)值。我相信它們將有助于減少機(jī)器學(xué)習(xí)模型的黑盒子!
PS:我嘗試使用 PCA 將隱藏表示減少到兩個(gè)維度,然后從中生成動(dòng)畫。PCA 的一個(gè)好處是它不是概率形式的,因此最終的表示是一致的。然而,PCA 中的局部鄰域可能不像 T-SNE 那樣具有可解釋性。所以這是一種權(quán)衡,但是如果有人對(duì)同時(shí)利用兩種方法的優(yōu)勢(shì)有些想法,就太棒了!
參考原文:https://rakeshchada.github.io/Neural-Embedding-Animation.html
【本文是專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)文章,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】
戳這里,看該作者更多好文
網(wǎng)站題目:通過可視化隱藏表示,更好地理解神經(jīng)網(wǎng)絡(luò)
鏈接URL:http://www.5511xx.com/article/dhepepj.html


咨詢
建站咨詢
