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