语义分析的一些方法(下篇)
3 圖片語義分析
3.1 圖片分類
圖片分類是一個最基本的圖片語義分析方法。
基于深度學(xué)習(xí)的圖片分類
傳統(tǒng)的圖片分類如下圖所示,首先需要先手工提取圖片特征,譬如SIFT, GIST,再經(jīng)由VQ coding和Spatial pooling,最后送入傳統(tǒng)的分類模型(例如SVM等)。
圖23. 傳統(tǒng)圖片分類流程圖
傳統(tǒng)方法里,人工特征提取是一個巨大的消耗性工作。而隨著深度學(xué)習(xí)的進(jìn)展,不再需要人工特征,通過深度學(xué)習(xí)自動提取特征成為一種可能。接下來主要講述卷積神經(jīng)網(wǎng)絡(luò)在圖片分類上的使用。
下圖是一個經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)模型圖,由Hinton和他的學(xué)生Alex Krizhevsky在ILSVRC(Imagenet Large Scale Visual Recognition Competition) 2012中提出。 整個網(wǎng)絡(luò)結(jié)構(gòu)包括五層卷積層和三層全連接層,網(wǎng)絡(luò)的最前端是輸入圖片的原始像素點(diǎn),最后端是圖片的分類結(jié)果。一個完整的卷積層可能包括一層convolution,一層Rectified Linear Units,一層max-pooling,一層normalization。
圖24. 卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
對于每一層網(wǎng)絡(luò),具體的網(wǎng)絡(luò)參數(shù)配置如下圖所示。InputLayer就是輸入圖片層,每個輸入圖片都將被縮放成227*227大小,分rgb三個顏色維度輸入。Layer1~ Layer5是卷積層,以Layer1為例,卷積濾波器的大小是11*11,卷積步幅為4,本層共有96個卷積濾波器,本層的輸出則是96個55*55大小的圖片。在Layer1,卷積濾波后,還接有ReLUs操作和max-pooling操作。Layer6~ Layer8是全連接層,相當(dāng)于在五層卷積層的基礎(chǔ)上再加上一個三層的全連接神經(jīng)網(wǎng)絡(luò)分類器。以Layer6為例,本層的神經(jīng)元個數(shù)為4096個。Layer8的神經(jīng)元個數(shù)為1000個,相當(dāng)于訓(xùn)練目標(biāo)的1000個圖片類別。
圖25. CNN網(wǎng)絡(luò)參數(shù)配置圖
基于Alex Krizhevsky提出的cnn模型,在13年末的時候,我們實(shí)現(xiàn)了用于廣點(diǎn)通的圖片分類和圖片檢索(可用于廣告圖片作弊判別),下面是一些示例圖。
圖片分類示例:
圖26. 圖片分類示例圖
圖片檢索示例:
圖27. 圖片檢索示例圖
圖片分類上的最新進(jìn)展
在ILSVRC 2012中,Alex Krizhevsky基于GPU實(shí)現(xiàn)了上述介紹的,這個有60million參數(shù)的模型(簡稱為AlexNet),贏得了第一名。這個工作是開創(chuàng)性的,它引領(lǐng)了接下來ILSVRC的風(fēng)潮。2013年,Clarifai通過cnn模型可視化技術(shù)調(diào)整網(wǎng)絡(luò)架構(gòu),贏得了ILSVRC。2014年,google也加入進(jìn)來,它通過增加模型的層數(shù)(總共22層),讓深度更深[48],并且利用multi-scale data training,取得第一名。baidu最近通過更加“粗暴”的模型[44],在GooLeNet的基礎(chǔ)上,又提升了10%,top–5錯誤率降低至6%以下。具體結(jié)果如下圖所示。
圖28. ImageNet Classification Result
先簡單分析一下“GoogLeNet”[48,51]所采用的方法:
- 大大增加的網(wǎng)絡(luò)的深度,并且去掉了最頂層的全連接層:因?yàn)槿B接層(Fully Connected)幾乎占據(jù)了CNN大概90%的參數(shù),但是同時又可能帶來過擬合(overfitting)的效果。
- 模型比以前AlexNet的模型大大縮小,并且減輕了過擬合帶來的副作用。Alex模型參數(shù)是60M,GoogLeNet只有7M。
- 對于google的模型,目前已有開源的實(shí)現(xiàn),有興趣請點(diǎn)擊Caffe+GoogLeNet。
再分析一下“Deep Image by baidu[44]”所采用的方法:
- Hardware/Software Co-design。baidu基于GPU,利用36個服務(wù)節(jié)點(diǎn)開發(fā)了一個專為深度學(xué)習(xí)運(yùn)算的supercompter(名叫Minwa,敏媧)。這臺supercomputer具備TB級的host memory,超強(qiáng)的數(shù)據(jù)交換能力,使能訓(xùn)練一個巨大的深層神經(jīng)網(wǎng)絡(luò)成為可能。而要訓(xùn)練如此巨大的神經(jīng)網(wǎng)絡(luò),除了硬件強(qiáng)大外,還需要高效的并行計(jì)算框架。通常而言,都要從data-parallelism和model-data parallelism兩方面考慮。
- data-parallelism:訓(xùn)練數(shù)據(jù)被分成N份。每輪迭代里,各個GPU基于各自的訓(xùn)練數(shù)據(jù)計(jì)算梯度,最后累加所有梯度數(shù)據(jù)并廣播到所有GPU。
- model-data parallelism:考慮到卷積層參數(shù)較少但消耗計(jì)算量,而全連接層參數(shù)相對比較多。所以卷積層參數(shù)以local copy的形式被每個GPU所持有,而全連接層的參數(shù)則被劃分到各個CPU。每輪迭代里,卷積層計(jì)算可以由各個GPU獨(dú)立完成,全連接層計(jì)算需要由所有GPU配合完成,具體方法請參考[46]。
- Data augmentation。訓(xùn)練一個如此巨大的神經(jīng)網(wǎng)絡(luò)(100billion個參數(shù)),如果沒有充分的訓(xùn)練數(shù)據(jù),模型將很大可能陷入過擬合,所以需要采用眾多data augmentation方法增加訓(xùn)練數(shù)據(jù),例如:剪裁,不同大小,調(diào)亮度,飽和度,對比度,偏色等(color casting, vignetting, lens distortion, rotation, flipping, cropping)。舉個例子,一個彩色圖片,增減某個顏色通道的intensity值,就可以生成多張圖片,但這些圖片和原圖的類目是一致的,相當(dāng)于增加了訓(xùn)練數(shù)據(jù)。
- Multi-scale training:訓(xùn)練不同輸入圖片尺度下(例如512*512,256*256)的多個模型,最后ensemble多個模型的輸出結(jié)果。
3.2 Image2text,Image2sentence
上面講述的圖片分類對圖片語義的理解比較粗粒度,那么我們會想,是否可以將圖片直接轉(zhuǎn)化為一堆詞語或者一段文本來描述。轉(zhuǎn)化到文本后,我們積累相對深的文本處理技術(shù)就都可以被利用起來。
Image2text
首先介紹一種樸素的基于卷積神經(jīng)網(wǎng)絡(luò)的image to text方法。
- 首先它利用深度卷積神經(jīng)網(wǎng)絡(luò)和深度自動編碼器提取圖片的多層特征,并據(jù)此提取圖片的visual word,建立倒排索引,產(chǎn)生一種有效而準(zhǔn)確的圖片搜索方法。
- 再充分利用大量的互聯(lián)網(wǎng)資源,預(yù)先對大量種子圖片做語義分析,然后利用相似圖片搜索,根據(jù)相似種子圖片的語義推導(dǎo)出新圖片的語義。
其中種子圖片,就是可以覆蓋所有待研究圖片的行業(yè),但較容易分析語義的圖片集。這種方法產(chǎn)生了更加豐富而細(xì)粒度的語義表征結(jié)果。雖說簡單,但效果仍然不錯,方法的關(guān)鍵在于種子圖片。利用比較好的種子圖片(例如paipai數(shù)據(jù)),簡單的方法也可以work得不錯。下圖是該方法的效果圖。
圖29. 圖片語義tag標(biāo)注示例圖
上面的baseline方法,在訓(xùn)練數(shù)據(jù)優(yōu)質(zhì)且充分的情況下,可以取得很不錯的圖片tag提取效果,而且應(yīng)用也非常廣泛。但上面的方法非常依賴于訓(xùn)練數(shù)據(jù),且不善于發(fā)現(xiàn)訓(xùn)練數(shù)據(jù)之外的世界。
另一個直觀的想法,是否可以通過word embedding建立image與text的聯(lián)系[26]。例如,可以先利用CNN訓(xùn)練一個圖片分類器。每個類目label可以通過word2vec映射到一個embedding表示。對于一個新圖片,先進(jìn)行分類,然后對top-n類目label所對應(yīng)的embedding按照權(quán)重(這里指這個類目所屬的概率)相加,得到這個圖片的embedding描述,然后再在word embedding空間里尋找與圖片embedding最相關(guān)的words。
Image detection
接下來再介紹下image detection。下圖是一個image detection的示例,相比于圖片分類,提取到信息將更加豐富。
圖30. 圖片detection示例
目前最先進(jìn)的detection方法應(yīng)該是Region-based CNN(簡稱R-CNN)[75],是由Jeff Donahue和Ross Girshick提出的。R-CNN的具體想法是,將detection分為尋找object和識別object兩個過程。在第一步尋找object,可以利用很多region detection算法,譬如selective search[76],CPMC,objectness等,利用很多底層特征,譬如圖像中的色塊,圖像中的邊界信息。第二步識別object,就可以利用“CNN+SVM”來做分類識別。
圖31. Image detection系統(tǒng)框圖
- 給定一張圖片,利用selective search方法[76]來產(chǎn)生2000個候選窗口。
- 然后利用CNN進(jìn)行對每一個候選窗口提取特征(取全連接層的倒數(shù)第一層),特征長度為4096。
- 最后用SVM分類器對這些特征進(jìn)行分類(每一個目標(biāo)類別一個SVM分類器),SVM的分類器的參數(shù)個數(shù)為:4096*N,其中N為目標(biāo)的類別個數(shù),所以比較容易擴(kuò)展目標(biāo)類別數(shù)。
這里有R-CNN的實(shí)現(xiàn),請點(diǎn)擊rcnn code
Image2sentence
那能否通過深度學(xué)習(xí)方法,直接根據(jù)image產(chǎn)生sentence呢?我們先看一組實(shí)際效果,如下圖所示(copy from 文獻(xiàn)[43])。
圖32. image2sentence示例圖
關(guān)于這個方向,最近一年取得了比較大的突破,工業(yè)界(Baidu[77],Google[43],Microsoft[80,81]等)和學(xué)術(shù)界(Stanford[35],Borkeley[79],UML[19],Toronto[78]等)都發(fā)表了一系列論文。
簡單歸納一下,對這個問題,主要有兩種解決思路:
- Pipeline方法。這個思路相對直觀一點(diǎn),先學(xué)習(xí)到image中visual object對應(yīng)的word(如上一節(jié)image detection所述),再加上language model,就可以生成sentence。這種方法各個模塊可以獨(dú)立調(diào)試,相對來說,更靈活一點(diǎn)。如下圖所示,這是microsoft的一個工作[81],它分為三步:(1)利用上一節(jié)提到的思路detect words;(2)基于language model(RNN or LSTM)產(chǎn)生句子;(3)利用相關(guān)性模型對句子打分排序。
圖33. “pipeline” image captioning
- End-to-end方法,即通過一個模型直接將image轉(zhuǎn)換到sentence。google基于CNN+RNN開發(fā)了一個Image Caption Generator[43]。這個工作主要受到了基于RNN的機(jī)器翻譯[27][42]的啟發(fā)。在機(jī)器翻譯中,“encoder” RNN讀取源語言的句子,將其變換到一個固定長度的向量表示,然后“decoder” RNN將向量表示作為隱層初始值,產(chǎn)生目標(biāo)語言的句子。那么一個直觀的想法是,能否復(fù)用上面的框架,考慮到CNN在圖片特征提取方面的成功應(yīng)用,將encoder RNN替換成CNN,先利用CNN將圖片轉(zhuǎn)換到一個向量表示,再利用RNN將其轉(zhuǎn)換到sentence。可以通過圖片分類提前訓(xùn)練好CNN模型,將CNN最后一個隱藏層作為encoder RNN的輸入,從而產(chǎn)生句子描述。如下圖所示。
圖34. “CNN+LSTM” Image Caption Generator
Li-Feifei團(tuán)隊(duì)在文獻(xiàn)[35]也提到一種image2sentence方法,如下圖所示。與google的做法類似,圖片的CNN特征作為RNN的輸入。
圖35. “CNN+RNN”生成圖片描述
此方法有開源實(shí)現(xiàn),有興趣請參考:neuraltalk
3.3 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的tricks
考慮到圖片語義分析的方法大部分都是基于深度學(xué)習(xí)的,Hinton的學(xué)生Ilya Sutskever寫了一篇深度學(xué)習(xí)的綜述文章[47],其中提到了一些訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的tricks,整理如下:
- 保證訓(xùn)練數(shù)據(jù)的質(zhì)量
- 使訓(xùn)練數(shù)據(jù)各維度數(shù)值的均值為0,方差為一個比較小的值
- 訓(xùn)練時使用minbatch,但不要設(shè)得過大,在合理有效的情況下,越小越好。
- 梯度歸一化,將梯度值除于minbatch size。
- 設(shè)置一個正常的learning rate,validation無提升后,則將原learning rate除于5繼續(xù)
- 模型參數(shù)隨機(jī)初始化。如果是深層神經(jīng)網(wǎng)絡(luò),不要設(shè)置過小的random weights。
- 如果是在訓(xùn)練RNN or LSTM,對梯度設(shè)置一個限值,不能超過15 or 5。
- 注意檢查梯度計(jì)算的正確性
- 如果是訓(xùn)練LSTM,initialize the biases of the forget gates of the LSTMs to large values
- Data augmentation很實(shí)用。
- Dropout在訓(xùn)練時很有效,不過記得測試時關(guān)掉Dropout。
- Ensembling。訓(xùn)練多個神經(jīng)網(wǎng)絡(luò),最后計(jì)算它們的預(yù)測值的平均值。
4 總結(jié)
4.1 語義分析方法在實(shí)際業(yè)務(wù)中的使用
前面講述了很多語義分析方法,接下來我們看看如何利用這些方法幫忙我們的實(shí)際業(yè)務(wù),這里舉一個例子,用戶廣告的語義匹配。
在廣點(diǎn)通系統(tǒng)中,用戶與廣告的關(guān)聯(lián)是通過定向條件來匹配的,譬如某些廣告定向到“北京+男性”,那么當(dāng)“北京+男性”的用戶來到時,所有符合定向的廣告就將被檢索出,再按照“ecpm*quality”排序,將得分最高的展示給用戶。但是憑借一些人口屬性,用戶與廣告之間的匹配并不精確,做不到“廣告就是想用戶所想”,所以用戶和廣告的語義分析就將派上用場了,可以從這樣兩方面來說明:
- 特征提取。基于上面介紹的方法,提取用戶和廣告的語義特征。
- 用戶語義特征。可以從用戶的搜索,購物,點(diǎn)擊,閱讀記錄中發(fā)現(xiàn)用戶興趣。考慮到最終的用戶描述都是文本,那么文本topic分析,文本分類,文本keyword提取,文本核心term提取都可以運(yùn)用起來,分析出用戶的語義屬性,還可以利用矩陣分解和文本分類找到相似用戶群。
- 廣告語義特征。在廣點(diǎn)通里,廣告可以從兩個維度來描述,一方面是文本,包括廣告title和landing page,另一方面是廣告展示圖片。利用文本和圖片的語義分析方法,我們可以提取出廣告的topic,類目,keyword,tag描述。
- 語義匹配。提取到相應(yīng)的語義特征之后,怎么用于改善匹配呢?
- 用戶-廣告的語義檢索。基于keyword、類目以及topic,對廣告建立相應(yīng)的倒排索引,直接用于廣告檢索。
- 用戶-廣告的語義特征。分別提取用戶和廣告的語義特征,用于計(jì)算用戶-廣告的relevance,pctr,pcvr,達(dá)到精確排序。
4.2 Future
對于文本和圖片的語義分析,可以看到:最近幾年,在某些任務(wù)上,基于深度學(xué)習(xí)的方法逐漸超過了傳統(tǒng)方法的效果。但目前為止,對于深度學(xué)習(xí)的發(fā)掘才剛剛開始,比較驚艷的神經(jīng)網(wǎng)絡(luò)方法,也只有有限幾種,譬如CNN,RNN,RBM等。
上文只是介紹了我們在工作中實(shí)踐過的幾個小點(diǎn),還有更多方法需要我們?nèi)ネ诰?#xff1a;
- Video。Learn about 3D structure from motion。如文獻(xiàn)[19]所示,研究將視頻也轉(zhuǎn)換到自然語言。
- Deep Learning + Structured Prediction,用于syntactic representation。
4.3 總結(jié)
上文主要從文本、圖片這兩方面講述了語義分析的一些方法,并結(jié)合個人經(jīng)驗(yàn)做了一點(diǎn)總結(jié)。
原本想寫得更全面一些,但寫的時候才發(fā)現(xiàn)上面所述的只是滄海一粟,后面還有更多語義分析的內(nèi)容之后再更新。另外為避免看到大篇理論就頭痛,文中盡可能不出現(xiàn)復(fù)雜的公式和理論推導(dǎo)。如果有興趣,可以進(jìn)一步閱讀參考文獻(xiàn),獲得更深的理解。謝謝。
總結(jié)
以上是生活随笔為你收集整理的语义分析的一些方法(下篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语义分析的一些方法(中篇)
- 下一篇: 机器学习性能改善备忘单