搜狐黨磊:深度學習在短文本分類中的應用
本文根據【創客168】第12期現場演講嘉賓黨磊老師分享內容整理而成。錄音整理及文字編輯@IT168許真真。
講師介紹
黨磊,搜狐視頻高級工程師。2015年研究生畢業後加入搜狐視頻,曾負責短視頻推薦的召回模型、排序模型、短視頻播放質量評價體系、短視頻分類等項目,目前主要研究方向為將深度學習演算法應用到視頻推薦系統中。
正文
大家下午好,我是來自搜狐視頻的黨磊,接下來為大家介紹深度學習在搜狐短視頻、短文本分類上的應用。
我今天的分享主要包括項目需求、可選擇解決方案以及模型訓練部署三部分。
需求及方案
該項目的需求是搜狐視頻會要求出品人上傳新視頻時為視頻綁定一個原生分類,如果出品人分類綁定錯誤,會對後期的個性化推薦造成一定干擾,以下是反例:
比如第一個,從視頻標題看其本身是一個娛樂性內容,但因為有「傅園慧」三個字被綁定到運動領域。如果靠人工審核,視頻數量較多的情況下,分類效率會非常低下,所以需要訓練一個模型對視頻分類自動識別並進行一定程度的修正。在該項目中,我們抽取視頻標題作為項目的原始數據,下面介紹一下項目最終的整體架構。
首先抽取短視頻標題數據,通過分詞庫對標題進行分詞,分詞訓練完成後會用Word2vec演算法對分詞訓練,將分詞轉換成詞向量。一切就緒之後,開始人工篩選分類正確的樣本作為訓練樣本,利用提前訓練好的詞向量將樣本數據(視頻標題關鍵詞集合)轉換成模型需要的數據格式(詞向量矩陣,一個樣本一個小矩陣)進行訓練。如果模型預測準確率較好的話,會將模型保存到分散式系統HDFS上,當線上實時預測的時候,會從HDFS載入模型,最終利用模型對上傳視頻進行預測,從而給出視頻的預測分類。
選擇解決方案
由於短視頻的標題文本信息太少,字數又在三十以內,要實現短視頻分類自動化,可選方案一般是傳統的機器學習:Bag of Words方法將視頻標題轉換成一個向量,選擇SVM/樹模型等分類模型訓練。還有一些深度學習方案:word2ve訓練詞向量,分類模型可選卷積神經網路CNN,或者長短期記憶網路LSTM等。
(一)詞向量
首先要說Bag of Words演算法。以下表的前兩行--兩個視頻標記分詞完成之後的結果,為例。假如我有AB兩個標題文檔,我需要把這些文檔的非重複片語成一個詞典,詞典中每個詞有一個對應的索引,索引上對應位置的值是該詞在其對應文檔中出現的次數。在該例子中,最後有九個詞,所以將AB兩個數據各自轉化成一個9維的向量。
我們來看一下A樣本最後轉化成的向量。因為張繼科的索引是1,在A裡面出現的次數是1,所以他的位置上的值是1,其它詞處理方法相同。Bag of words演算法實現簡單,該方法的向量容易稀疏存儲,如果向量里只有一些簡單的非零值,我們只存儲非零值就可以了。這個方法的缺點是它認為文檔里的詞是完全獨立的,單詞之間沒有語法、句法以及前後關聯,這樣就不能很好的刻畫詞語之間的相似性。例如電腦和筆記本,該方法認為二者是不一樣的,而且差異很大,但實際上它們在語意上是很相似的。另外一個缺點是隨著詞典的擴大,容易造成維度災難。
下面再說Word2vec。Word2vec演算法認為處於相同上下文環境的詞語在語意上是相似的。它的優點是相似詞的詞向量在空間上也是接近的,Word2vec另一個優點是在詞向量的維度可指定成固定大小,詞向量維度不受詞典大小的限制。
上圖是轉換以後在向量空間上的典型例子,圖上面的那條線上的兩個字man和woman,下面是king和queen。在空間上,man和king是比較相近的,woman和queen也是相近的,man的詞向量減去woman的詞向量得到的值和king減去queen的詞向量得到的值是相似的。
(二)分類模型
下面是常用的機器學習流程,下圖左邊是全部數據,每一行代表一個視頻標題向量。大家可以這樣理解——全部數據作為一個分類模型輸入,SVM支持向量機是分類模型,訓練完SVM模型可以對每個樣本進行預測,這是傳統機器學習的方式。
下圖是利用深度學習裡面比較經典的神經網路CNN對短文本(視頻標題)分類的大體流程。圖中最左側矩陣數據代表一個標題,每一行是一個分詞對應的word2vec詞向量。如果一個視頻標題有十個分詞,那最左邊矩陣的行就等於10,矩陣列是分詞詞向量的長度,例如300維。用該小矩陣代表每個視頻,作為CNN模型的一次輸入。
接下來是卷積層和池化層。
卷積層的作用是對視頻標題進行高級特徵提取。一般每個卷積層會有多個不同大小的卷積核(可以理解為一個小矩陣),然後用卷積核對輸入矩陣進行卷積操作,最後會獲得多個新的矩陣,例如下面圖中藍黃綠三個n*1大小的向量。
下面介紹一下池化層。我們最終選擇的池化是max-pooling,把經過卷積操作後獲取的每一個列向量里的最大值提取出來,這就是最大池化。池化操作可以理解為進一步提取高級特徵,然後將提取的特徵拼接成一個向量,最後用一個Softmax多分類器進行處理。Softmax最後會給出一個樣本屬於每一個類別的概率,這樣我們就可以選擇一個概率最大的類別作為該樣本的預測。這就是用CNN處理短文本分類時的常見思路。當然卷積可以是多層的,每一層可以有多個卷積核,池化層也可以對應多個。
我們還嘗試了另一個模型—循環神經網路RNN,RNN認為一句話的詞是有先後順序的,訓練的時候能夠更好地捕捉句子單詞的上線文信息,用來進行文本分類也會獲得不錯的效果。
RNN認為標題的詞是有前後序列的,W1可以看作是一個詞,W2是第二個詞。RNN在處理時,模型隱含節點裡的值不僅僅依賴於當前輸入,還依賴於上一時刻隱含節點的值,經過有序列的處理,最後會得到一個向量,然後將這個向量表示這個樣本,最後再把向量給Softmax多分類器,對樣本類別進行預測。
模型訓練和部署
前面選擇了什麼模型對訓練集進行訓練,那麼接下來就是是選擇高效的平台去驗證,上面這幅圖的內容是一些比較流行的深度學習處理平台,我們最終選擇的是TensorFlow。感興趣的可以自行到Github上查看。TensorFlow是由谷歌推出的,業界用的比較多,建立模型的時候比較快速,一些底層的演算法已經實現,可以理解為模塊化拼裝想要的模型。TensorFlow也支持各種流行的語言比如Java和Python,這是我們最終選擇TensorFlow的原因。
接下來是訓練和部屬。從上面的圖中,可以看出目前tensorflow平台用的最廣泛,所以我們也選擇TensorFlow。在TensorFlow上,可以選擇Python對模型建模,快速訓練驗證。當訓練好模型後,可用tf.train.Saver()函數將模型保存到本地文件中。但是該函數默認會將模型分開保存,例如下圖中「.data」為後綴的文件保存的是模型訓練好的參數,而以「.meta」為後綴的文件保存的模型的網路結構和各種常量以及訓練的各種操作。因為目前我們線上的開發環境是java,但是TensorFlow的Java API支持較少,沒有類似於tf.train.Saver()的函數。所以若想將模型順利部署到線上,需要對這個模型進行freeze(固化)操作,該操作會將把變數參數值轉換成常量值,然後融合到模型里,最終整合成一個文件,例如下圖中的freeze_model.pb。然後我們就可以利用TensorFLow目前支持的JavaAPI—importGraphDef將模型載入成功,最後就可以順利的利用模型實時預測視頻的分類。
下圖是各個模型的預測效果對比。我們當時選擇人工抽查,主觀判斷的方式去檢驗模型對測試樣本的預測是否準確有效。
(1)針對原本綁定分類正確的測試樣本,會以指標「準確率」的高低去判斷模型的好壞。
(2)針對原本綁定分類錯誤的測試樣本,就不能以「準確率」判斷模型的好壞,而是人為主觀判斷預測的分類和視頻的標題所表達的意思是否一致。比如從一個視頻標題上看,這個視頻應該和娛樂有關,但是卻被綁定到運動分類下,那麼假如模型預測的類別是娛樂,我們就可以認為模型的這一次預測是有效正確的,其預測類別是對該視頻類別的一次正確修正。
以修正率指標判斷的話,總體來說SVM模型的優勢不大。
我們最終選擇的是CNN,因為輸入數據快。LSTM訓練的時間長,速度不太快,GRU雖然比LSTM快一點,但是也沒有CNN好,所以我們最終選擇了CNN。LSTM 模型效果最好,GRU次之,但是考慮到模型訓練時間的話,LSTM>GRU>CNN,所以結合我們自己的業務,最終選擇了CNN模型作為預測視頻分類的模型。
前面的內容,就是我們整個項目大體流程:從句子標題分詞,詞向量的表示,再到模型的選擇和訓練、上線部署。今天的分享到此結束,謝謝大家!


※還有用Eclipse的嗎?這有一個圖形編輯框架,據說很厲害!
※王小川:搜狗不上市不找女朋友!這下,搜狗真要上市了!
TAG:IT168企業級 |
※年度最精闢短文
※全球最佳短文:《活下去》
※經典短文:品德與結果
※優美短文分享
※經典英語短文美文精選推薦
※有意思的四篇短文
※很精闢的短文,生活大道均在其中
※最精闢短文
※轟動全球的一篇短文:《年輕》
※年度最精闢短文(受益匪淺!)
※轟動全球的短文《年輕》
※影響全球的一篇短文:年輕
※全球最佳短文:活下去
※年度最精闢短文!
※世界上最經典的短文:妙!
※年度最精闢短文(看完,受益匪淺!)
※賈平凹經典散文《落葉》,關於生命與輪迴,值得一看的短文
※年度最精闢短文,看完受益匪淺
※中華精短文學學會遼寧會刊第6期
※中國歷史文化名鎮——古鎮九峰的3篇短文