一次竞赛案例的分享——基于正则表达式的深度学习应用
本文由北郵@愛可可-愛生活?老師推薦,阿里云云棲社區(qū)組織翻譯。
以下為譯文:
最近我決定參加CrowdAnalytix主辦的 Extraction of product attribute values競賽,在這個網(wǎng)站上公司可以將數(shù)據(jù)處理的問題以外包的方式交給有能力處理的人。一直以來,我擅長的是圖像和視頻數(shù)據(jù)處理,而這次,我嘗試著處理文本。 問題是從不同長度的產(chǎn)品標(biāo)題和產(chǎn)品描述中提取出制造商零件編號(MPN),這是一個標(biāo)準(zhǔn)的正則表達(dá)式問題。在簡單瀏覽數(shù)據(jù)之后,我發(fā)現(xiàn)大約有54000個訓(xùn)練樣本。因此,我決定使用深度學(xué)習(xí)的方法。在這我公布我在排行榜上排名第四的方法。
免責(zé)申明
由于這是一個盈利的方案,根據(jù)CrowdAnalytix的條款,我只能將方法的大致思想分享出來。
問題
在競賽的網(wǎng)站上,賽題是這樣的“請使用正則表達(dá)式從產(chǎn)品標(biāo)題或產(chǎn)品描述中提取出制造商零件編號”。雖然我不知道需要什么樣的正則規(guī)則,但是我知道是從長文本中提取數(shù)據(jù)。以下就是一個標(biāo)題的樣例:
EVGA NVIDIA GeForce GTX 1080 Founders Edition 8gb Gddr5x 08GP46180KR
接下來我只是想從產(chǎn)品標(biāo)題和描述中提取出MPN “08GP46180KR”
下圖是一個匹配郵箱的案例,使用正則表達(dá)式的要旨其實(shí)就是對想要找的文本按照一定規(guī)則硬編碼,然后再去匹配。
在這里,正則表達(dá)式圍繞的預(yù)定義字符是“@”和“.”。而深度學(xué)習(xí)的魅力則是經(jīng)過大量的訓(xùn)練,我們可以學(xué)習(xí)出正則表達(dá)式,而不是硬編碼,這也是我采取的方法。
數(shù)據(jù)設(shè)置
用來訓(xùn)練的54000條數(shù)據(jù)有一下的參數(shù)[id,產(chǎn)品標(biāo)題,產(chǎn)品描述,mpn]。用來測試的數(shù)據(jù)除了沒有mpn屬性,其他和訓(xùn)練集一樣。通過對數(shù)據(jù)的檢查,我發(fā)現(xiàn)在大多數(shù)情況下,MPN要么存在于產(chǎn)品標(biāo)題中,要么存在于產(chǎn)品描述中。數(shù)據(jù)中的干擾是數(shù)據(jù)處理過程中的一大難題,這些干擾往往和MPN很像,比如在顯卡單元中,Gddr5x看起來就很像MPN。因?yàn)閱栴}是提取MPN,我設(shè)置的輸入包括產(chǎn)品名稱、描述,設(shè)定的輸出為MPN。
現(xiàn)在我已經(jīng)知道輸入輸出是什么了,我需要決定一些映射來使用神經(jīng)網(wǎng)絡(luò)。由于MPN 、HTML片段以及其他一些奇怪字符的出現(xiàn),這不是一個常規(guī)的自然語言處理問題。因此,像word2vec 類似的解決方案是不合適的(如果我錯了,請糾正我)。我很幸運(yùn)有一個攀巖的朋友,Joseph Prusa,一直與性格和情感分析工作(Prusa和khoshgoftaar,2014)。他非常親切地分享了他的代碼,并針對我的問題做了一些訂制。于是,我整合出了我的解決方案。
映射的過程將每一個字符變換成一個8位的向量。舉個例子,“EVGA NVIDIA GeForce GTX 1080 Founders Edition 8gb Gddr5x 08GP46180KR”可以用下圖表示:
另外一個問題是,輸入(標(biāo)題和描述)的長度是各不相同的。因此我需要采取一些方法,使得它們長度統(tǒng)一,這樣才能輸入到網(wǎng)絡(luò)中。我的第一步是可視化的所有輸入的長度分布。
基于這個分布,我設(shè)置最大長度為2000,因?yàn)樗ù蠖鄶?shù)的情況。并避免了很長的異常值。首先,我將輸入按照上面說的方法進(jìn)行處理,如果長度不夠兩千的,后面會被補(bǔ)上0。在輸入的長度大于2000的情況,如果MPN在前2000中,則不會造成影響,而如果不是這樣,則MPN會丟失(在數(shù)據(jù)集中非常不常見)。這樣一來,每一個輸入都被歸一化成了8*2000的圖。
問題構(gòu)想
如果我們要用神經(jīng)網(wǎng)絡(luò)的向后傳播算法,接下來的問題就是什么是合適的輸出和損失函數(shù)。最自然的選擇似乎是輸出向量格式的MPN。一般來說以Mean-Squared Error 作為損失函數(shù)是無監(jiān)督學(xué)習(xí)生成模型的常規(guī)做法。而且這么做在技術(shù)上沒有難度。
但是,我決定采用一個不同的方式。我把輸出定義為兩個獨(dú)熱二進(jìn)制向量,每一個的長度是最大長度(2000)。其中第一個向量表示MPN的開始索引,第二個向量表示MPN的結(jié)束索引。然后損失是兩個向量分類交叉熵的總和。
給出輸出之后,后臺會運(yùn)行一個輔助方法。該方法使用之前的索引作為輸入,提取出MPN的向量表現(xiàn)形式,然后將向量轉(zhuǎn)化為字符串表示形式,這也就是最終的輸出。如果MPN不存在,結(jié)果就是兩個向量最后的那個。
模型結(jié)構(gòu)
既然數(shù)據(jù)設(shè)置完了,目標(biāo)也明確了,接下來要做的事情就是構(gòu)建一個模型來完成之前設(shè)計(jì)的任務(wù)。我嘗試了包括深度卷積神經(jīng)網(wǎng)絡(luò)在內(nèi)的許多種神經(jīng)網(wǎng)絡(luò)。這些方法效果都不錯,但是并不能達(dá)到我的預(yù)期。
幸運(yùn)的是 Google DeepMind剛發(fā)表了一篇文章,介紹了他們的新模型WaveNet ,這個模型正是我想要的。這樣的模型因其使用多層的卷積操作且沒有進(jìn)行池化而有趣。由于每一個隨后的層都使用了擴(kuò)張操作,該模型在保證參數(shù)數(shù)量在合理的范圍內(nèi)的同時能得到有巨大容納域的濾波器(請參考下圖的紅色部分,圖片來自 Neural Machine Translation in Linear Time)。
我最終模型思想是從輸入提取一組基本特征,通過一系列擴(kuò)大的卷積,然后用softmax激活函數(shù)分支兩個卷積過濾器,最終預(yù)測預(yù)測開始和結(jié)束索引。更詳細(xì)地,該模型如下:
- 使用1D卷積來從不同長度的數(shù)據(jù)中提取基本特征。這些展現(xiàn)不同長度的單字符到多字符的轉(zhuǎn)換。這些都被串起來輸送給下一層網(wǎng)絡(luò)。
- 接下來,這些表示形式被送到一個個塊中處理。這些塊用Batch Normalization, Rectified Linear Units來處理。這允許網(wǎng)絡(luò)基于由于擴(kuò)大的卷積而覆蓋幾乎整個輸入的范圍來選擇最佳匹配的開始和結(jié)束索引。
- 最后,兩個使用softmax激活函數(shù)的1D卷積濾波器在剩余輸出上執(zhí)行。最大參數(shù)表示開始和結(jié)束位置的最高概率的索引。
模型架構(gòu)如下圖所示,顯示了模型的主要特征:
性能
訓(xùn)練完之后,模型在訓(xùn)練集上展現(xiàn)出了近乎完美的表現(xiàn),對于驗(yàn)證集達(dá)到了90%的準(zhǔn)確率!在排行榜上也達(dá)到了84%的準(zhǔn)確率。
當(dāng)我準(zhǔn)備提交的時候,我發(fā)現(xiàn)由于樣本數(shù)量太少模型以非??斓乃俣冗^擬合數(shù)據(jù)。我知道,對于54000個樣本來說,從中學(xué)習(xí)是非常困難的。但是我對我的模型有信心,如果有幾十萬條數(shù)據(jù),我的解決方案會有更高的排名。由于競賽我遲到了,所以在最后的提交中,我選擇了較低的學(xué)習(xí)率,也只進(jìn)行幾輪學(xué)習(xí)。如果還有時間的話,我會嘗試去探索數(shù)據(jù)增強(qiáng)和模型規(guī)則化技術(shù)來讓模型更完善,同時也可以防止過擬合。此外,訓(xùn)練其他文本可能是一個成功的策略。暴力法會使最大長度參數(shù)略有增加,這可能會給我們帶來一些邊際的改進(jìn),但代價是非常高的計(jì)算成本。
結(jié)論
考慮到以前我從來沒有遇到這樣類型的問題,本次的競賽是令人滿意且充滿挑戰(zhàn)的。首先要說一聲抱歉,因?yàn)槲乙獮樯疃葘W(xué)習(xí)打廣告了。看起來好像這個領(lǐng)域和深度學(xué)習(xí)沒太多關(guān)系,但是應(yīng)用深度學(xué)習(xí)確實(shí)非常有趣而且效果不錯。這也體現(xiàn)了深度學(xué)習(xí)應(yīng)用的普適性。希望這次分享能幫助到遇到類似問題的童鞋。
引用
Prusa, J. D., & Khoshgoftaar, T. M. (2014). Designing a Better Data Representation for Deep Neural Networks and Text Classification.
數(shù)十款阿里云產(chǎn)品限時折扣中,趕緊點(diǎn)擊領(lǐng)劵開始云上實(shí)踐吧!
文章原標(biāo)題《Deep Learning for RegEx》,作者:Daniel C. LaCombe, Jr
文章為簡譯,更為詳細(xì)的內(nèi)容,請查看原文
總結(jié)
以上是生活随笔為你收集整理的一次竞赛案例的分享——基于正则表达式的深度学习应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElasticSearch搜索实例含高亮
- 下一篇: Java Master-Worker模式