文本分类问题不需要ResNet?小夕解析DPCNN设计原理(下)
哎呀呀,說好的不拖稿的又拖了兩天T_T,小夕過一陣子分享給你們這兩天的開心事哦。后臺催稿調(diào)參系列的小伙伴們不要急,下一篇就是第二篇調(diào)參文啦。
好啦,接著上一篇文章,直接搬來DPCNN、ShallowCNN、ResNet的對比圖。
從圖中的a和c的對比可以看出,DPCNN與ResNet差異還是蠻大的。同時DPCNN的底層貌似保持了跟TextCNN一樣的結(jié)構(gòu),這里作者將TextCNN的包含多尺寸卷積濾波器的卷積層的卷積結(jié)果稱之為Region embedding,意思就是對一個文本區(qū)域/片段(比如3gram)進行一組卷積操作后生成的embedding。
對一個3gram進行卷積操作時可以有兩種選擇,一種是保留詞序,也就是設(shè)置一組size=3*D的二維卷積核對3gram進行卷積(其中D是word embedding維度);還有一種是不保留詞序(即使用詞袋模型),即首先對3gram中的3個詞的embedding取均值得到一個size=D的向量,然后設(shè)置一組size=D的一維卷積核對該3gram進行卷積。顯然TextCNN里使用的是保留詞序的做法,而DPCNN使用的是詞袋模型的做法,DPCNN作者argue前者做法更容易造成過擬合,后者的性能卻跟前者差不多(其實這個跟DAN網(wǎng)絡(luò)(Deep averaging networks)中argue的原理和結(jié)論差不多,有興趣的可以下拉到下一部分的知乎傳送門中了解一下)。
產(chǎn)生region embedding后,按照經(jīng)典的TextCNN的做法的話,就是從每個特征圖中挑選出最有代表性的特征,也就是直接應(yīng)用全局最大池化層(max-over-time-pooling layer),這樣就生成了這段文本的特征向量(假如卷積濾波器的size有3,4,5這三種,每種size包含100個卷積核,那么當(dāng)然就會產(chǎn)生3*100幅特征圖,然后將max-over-time-pooling操作應(yīng)用到每個特征圖上,于是文本的特征向量即3*100=300維)。
?
但是顯然TextCNN這樣做會有很嚴(yán)重的問題誒,這樣做的意義本質(zhì)上與詞袋模型(含ngram)+weighting+NB/MaxEnt/SVM的經(jīng)典文本分類模型沒本質(zhì)區(qū)別,只不過one-hot表示到word embedding表示的轉(zhuǎn)變避免了詞袋模型遭遇的數(shù)據(jù)稀疏問題罷了。可以說,TextCNN本質(zhì)上收益于詞向量的引入帶來的“近義詞有相近向量表示”的bonus,同時TextCNN恰好可以較好的利用詞向量中的知識(近義關(guān)系)罷了。這意味著,經(jīng)典模型里難以學(xué)習(xí)的遠(yuǎn)距離信息(如12gram)在TextCNN中依然難以學(xué)習(xí)。那么這些長距離復(fù)雜模式如何讓網(wǎng)絡(luò)學(xué)習(xí)到呢?
?
顯然,要么加深全連接層,要么加深卷積層。加深哪個更好呢?小夕埋下了一個伏筆哦,答案就在小夕這個知乎回答里:
傳送門:?https://www.zhihu.com/question/270245936
在得到Region embedding后,為了避免后續(xù)想象太抽象,我們不妨還是把Region embedding看成word embedding,假想為交給網(wǎng)絡(luò)后面的就是word embedding序列哦。
首先交代一下卷積的一個基本概念——等長卷積。我們在文本分類里最常用的可能是窄卷積,輸入序列長度為seq_len,卷積核大小為n的話,窄卷積后的輸出序列的長度就是seq_len-n+1。而等長卷積顧名思義就是輸出序列的長度等于輸入序列長度seq_len。沒有想像出來的同學(xué)自行Google一下哦,就不展開講啦。
那么對文本,或者說對word embedding序列進行等長卷積的意義是什么呢?
既然輸入輸出序列的位置數(shù)一樣多,我們將輸入輸出序列的第n個embedding稱為第n個詞位,那么這時size為n的卷積核產(chǎn)生的等長卷積的意義就很明顯了,那就是將輸入序列的每個詞位及其左右((n-1)/2)個詞的上下文信息壓縮為該詞位的embedding,也就是說,產(chǎn)生了每個詞位的被上下文信息修飾過的更高level更加準(zhǔn)確的語義。
好,回到DPCNN上來。我們想要克服TextCNN的缺點,捕獲長距離模式,顯然就要用到深層CNN啦。那么直接等長卷積堆等長卷積可不可以呢?
顯然這樣會讓每個詞位包含進去越來越多,越來越長的上下文信息,但是這樣效率也太低了喂,顯然會讓網(wǎng)絡(luò)層數(shù)變得非常非常非常深,這樣笨拙的操作怎么能有呢哼。不過,既然等長卷積堆等長卷積會讓每個詞位的embedding描述語義描述的更加豐富準(zhǔn)確,那么當(dāng)然我們可以適當(dāng)?shù)亩褍蓪觼硖岣咴~位embedding的表示的豐富性。
所以region embedding層(這里假想為word embedding層,對應(yīng)序列為“小娟 姐姐 帶來 的 抹茶 青團 好 好吃 哦”)之上就可以如圖2這樣設(shè)計啦:
圖2 (轉(zhuǎn)載該圖請后臺告知小夕噢)
在表示好每個詞位的語義后,其實很多鄰接詞或者鄰接ngram的詞義是可以合并的,例如“小娟 姐姐 人 不要 太好”中的“不要”和“太好”雖然語義本來離得很遠(yuǎn),但是作為鄰接詞“不要太好”出現(xiàn)時其語義基本等價為“很好”,這樣完全可以把“不要”和“太好”的語義進行合并哇。同時,合并的過程完全可以在原始的embedding space中進行的,畢竟原文中直接把“不要太好”合并為“很好”是很可以的哇,完全沒有必要動整個語義空間。
而實際上,相比圖像中這種從“點、線、弧”這種low-level特征到“眼睛、鼻子、嘴”這種high-level特征的明顯層次性的特征區(qū)分,文本中的特征進階明顯要扁平的多,即從單詞(1gram)到短語再到3gram、4gram的升級,其實很大程度上均滿足“語義取代”的特性。而圖像中就很難發(fā)生這種”語義取代“現(xiàn)象(例如“鼻子”的語義可以被”弧線“的語義取代嘛?)。
因此(劃重點),DPCNN與ResNet很大一個不同就是,在DPCNN中固定死了feature map的數(shù)量,也就是固定住了embedding space的維度(為了方便理解,以下簡稱語義空間),使得網(wǎng)絡(luò)有可能讓整個鄰接詞(鄰接ngram)的合并操作在原始空間或者與原始空間相似的空間中進行(當(dāng)然,網(wǎng)絡(luò)在實際中會不會這樣做是不一定的哦,只是提供了這么一種條件)。也就是說,整個網(wǎng)絡(luò)雖然形狀上來看是深層的,但是從語義空間上來看完全可以是扁平的。而ResNet則是不斷的改變語義空間,使得圖像的語義隨著網(wǎng)絡(luò)層的加深也不斷的跳向更高level的語義空間。
好啦,所以提供了這么好的合并條件后,我們就可以用pooling layer進行合并啦。每經(jīng)過一個size=2,?stride=2(大小為2,步長為2)的池化層(以下簡稱1/2池化層),序列的長度就被壓縮成了原來的一半(請自行腦補)。這樣同樣是size=3的卷積核,每經(jīng)過一個1/2池化層后,其能感知到的文本片段就比之前長了一倍。
例如之前是只能感知3個詞位長度的信息,經(jīng)過1/2池化層后就能感知6個詞位長度的信息啦,這時把1/2池化層和size=3的卷積層組合起來如圖3所示。
圖3?(轉(zhuǎn)載該圖請后臺告知小夕噢)
好啦,看似問題都解決了,目標(biāo)成功達成。剩下的我們就只需要重復(fù)的進行等長卷積+等長卷積+1/2池化就可以啦,也就是重復(fù)如圖4的Block:
圖4
但是!如果問題真的這么簡單的話,深度學(xué)習(xí)就一下子少了超級多的難點了。
首先,由于我們在初始化深度CNN時,往往各層權(quán)重都是初始化為一個很小的值,這就導(dǎo)致最開始的網(wǎng)絡(luò)中,后續(xù)幾乎每層的輸入都是接近0,這時網(wǎng)絡(luò)的輸出自然是沒意義的,而這些小權(quán)重同時也阻礙了梯度的傳播,使得網(wǎng)絡(luò)的初始訓(xùn)練階段往往要迭代好久才能啟動。
同時,就算網(wǎng)絡(luò)啟動完成,由于深度網(wǎng)絡(luò)中仿射矩陣(每兩層間的連接邊)近似連乘,訓(xùn)練過程中網(wǎng)絡(luò)也非常容易發(fā)生梯度爆炸或彌散問題(雖然由于非共享權(quán)重,深度CNN網(wǎng)絡(luò)比RNN網(wǎng)絡(luò)要好點)。
當(dāng)然,上述這兩點問題本質(zhì)就是梯度彌散問題。那么如何解決深度CNN網(wǎng)絡(luò)的梯度彌散問題呢?當(dāng)然是膜一下何愷明大神,然后把ResNet,DenseNet的精華拿來用啦~DPCNN里用的是ResNet的方案。
ResNet中提出的shortcut connection (skip-connection)就是一種非常簡單、合理、有效的解決方案??粗鴪D4想一下,既然每個block的輸入在初始階段容易是0而無法激活,那么直接用一條線把region embedding層連接到每個block的輸入乃至最終的池化層/輸出層不就可以啦!
想象一下,這時的shortcut connection由于連接到了各個block的輸入(當(dāng)然為了匹配輸入維度,要事先經(jīng)過對應(yīng)次數(shù)的1/2池化操作),這時就相當(dāng)于一個短路連接,即region embedding直接短路連接到了最終的池化層或輸出層。等等,這時的DPCNN不就退化成了TextCNN嘛。深度網(wǎng)絡(luò)不好訓(xùn)練,就一層的TextCNN可是異常容易訓(xùn)練的。這樣模型的起步階段就是從TextCNN起步了,自然不會遭遇前面說的深度CNN網(wǎng)絡(luò)的冷啟動問題了。
同樣的道理,有了shortcut后,梯度就可以忽略卷積層權(quán)重的削弱,從shortcut一路無損的傳遞到各個block手里,直至網(wǎng)絡(luò)前端,從而極大的緩解了梯度消失問題。
所以DPCNN里的Block里加上了shortcut connection后,就完美多啦。即設(shè)計出了如下最終版的網(wǎng)絡(luò)形態(tài):
最后點一下題目,由于前面所述的1/2池化層的存在,文本序列的長度會隨著block數(shù)量的增加呈指數(shù)級減少,即
這導(dǎo)致序列長度隨著網(wǎng)絡(luò)加深呈現(xiàn)金字塔形狀:
最最后,我猜你們肯定會好奇文章里的小娟姐姐是誰,以后告訴你們咯( ̄? ̄)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的文本分类问题不需要ResNet?小夕解析DPCNN设计原理(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谁说发 paper 一定要追快打新?20
- 下一篇: 李宏毅《机器学习》作业班+带打比赛