當前位置:
首頁 > 最新 > 使用CNN+Auto-Encoder 實現無監督Sentence Embedding

使用CNN+Auto-Encoder 實現無監督Sentence Embedding

前言

關於文本分類,我有一篇文章基於Spark /Tensorflow使用CNN處理NLP的嘗試, 今天的內容會涉及到上一篇關於卷積網路以及Word Embedding的部分。

這篇文章對應的完整代碼在這:autoencoder-sentence-similarity.py

基本思路是,通過編碼解碼網路(有點類似微軟之前提出的對偶學習),我們先對句子進行編碼,然後進行解碼,解碼後的語句要和原來的句子儘可能的接近。訓練完成後,我們就可以對任意一個句子進行編碼,也就是轉化為一個向量。之後我們就可以通過向量計算句子的相似度了。算是Sentence Embedding的一種新的實現。最大的好處是,我們無需標註語料,屬於無監督類學習。這次我還在編碼前引入卷積網路,不過效果有待驗證。

準備工作

我們假設大家已經準備了兩個數據集,具體可以參考上一篇文章的Spark預處理部分:

已經分好詞的語句

詞到vector的字典

然後我們使用一個函數:

def next_batch(batch_num, batch_size, word_vec_dict): with open(WORD_FILE) as wf: line_num = 0 start_line_num = batch_num * batch_size batch_counter = 0 result = [] for words in wf: result1 = [] line_num += 1 if line_num > start_line_num: batch_counter += 1 for word in words.split(" "): if word in word_vec_dict: result1.append(word_vec_dict[word]) if len(result1)

因為這次測試數據集有點大,所以沒辦法一次性載入到內存,只能分批了。缺點是,每一次都需要重新打開文件,為了減少打開文件次數,程序後半部分做了一些優化處理,基本方式為,一次性從文件里取batch_size 條數據,然後讓Tensorflow 再分 batch_size / mini_train_batch_size 次進行迭代。每次迭代給的樣本量還是比較影響效果的,4000和200比,有20%左右的差異。

構建模型

我嘗試了如下兩個拓撲,第一個是帶卷積的:

Input(段落) -> 卷積 -> 池化 -> 卷積 -> 池化 -> encoder -> encoder -> decoder -> decoder -> lost function (consine夾角)

第二個則是不帶卷積:

Input(段落) -> encoder -> encoder -> decoder -> decoder -> lost function (consine夾角)

基本上是兩層卷積,兩層編解碼器。

訓練完成後,就獲得編碼器的所有參數,利用encoder_op 對所有的語句進行編碼,從而實現所有語句得到一個唯一的向量(128維)表示。

大概準備了 60多萬條語句進行訓練,經歷了50*60輪迭代後,不帶卷積最後loss 大概是從1.1 下降到0.94的樣子。如果進行更多迭代,提供更多訓練數據,應該可以進一步降低。

帶卷積的收斂較快,loss 從0.5 經過3000輪迭代,可以下降到0.1 左右。

因為語料比較隱私,無法提供,但是可以描述下大致的結論,隨機找一段話,然後尋找相似的,目前來看,不帶卷積的效果非常好,帶卷積的因為卷積後信息損失太大,在encoder-decoder階段感覺無法訓練了,最後趨同,因此需要對卷積進行較大調整。關於NLP的卷積,其實我們不一定要保證卷積核的寬度或者高度保持和word embedding的size一樣,因為對兩個word截取其一般,我認為應該還是有一定的相似度的。

在訓練過程中,損失函數我嘗試了:

xent =tf.reduce_mean(tf.pow([y_true, y_pred],2), name="xent")

以及

consine = tf.div(tf.reduce_sum(tf.multiply(y_pred, y_true)), tf.multiply(tf.sqrt(tf.reduce_sum(tf.multiply(y_pred, y_pred))), tf.sqrt(tf.reduce_sum(tf.multiply(y_true, y_true))))) xent = tf.reduce_sum(tf.subtract(tf.constant(1.0), consine))

因為採用歐式距離,我們難以確定相似度的閾值,而cosine是一個比較容易衡量的值。所以這裡選擇了consine作為損失函數。我沒有找到Tensorflow的實現,所以完全根據consine公式自己實現了一個。

對於Optimizer,我嘗試了

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(xent)train_step = tf.train.RMSPropOptimizer(learning_rate).minimize(xent)

目前來看,RMSPropOptimizer效果好很多。

總結

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

用Instrumentation改良monkey工具實戰
理解高斯混合模型
PHP_設計模式
時下流行的側邊欄導航到底好不好用?
我來談談PHP和JAVA的區別

TAG:推酷 |

您可能感興趣

Wasserstein is all you need:構建無監督表示的統一框架
學界 | Wasserstein is all you need:構建無監督表示的統一框架
「Science重磅」DeepMind生成查詢網路GQN,無監督學習展現3D場景
大數據科普:神經網路入門-監督學習 Supervised Learning
無監督學習和transformers如何在OpenAI手裡玩出新花樣
Yann LeCun分享Facebook最新AI研發成果:AI變革的下一站是無監督學習
外媒:蘋果公司Bill Stasior不負責監督Siri工作
35億張圖像!Facebook基於弱監督學習刷新ImageNet基準測試記錄
微笑做回監督不再BP,原因在於上單Poss,Mystic成了第二個Rookie
下載 | 114頁自監督學習指南【PPT By Yann Lecun】
CVPR 2018:阿里提出應用 LocalizedGAN 進行半監督訓練
每類13張標註圖就可從頭學分類器,DeepMind新半監督超越AlexNet
Hinton老爺子CapsNet再升級,結合無監督,接近當前最佳效果
每類13張標註圖就可從頭學分類器,DeepMind新半監督模型超越AlexNet
尷尬!瑞士監管機構打臉Facebook,稱並未收到監督Libra的請求
DeepMind生成查詢網路GQN,無監督學習展現3D場景
Ian Goodfellow:我的失敗是用無監督解決計算機視覺監督學習問題
《最終幻想15》監督田畑端宣布已從Square Enix離職
Ian Goodfellow:我最大的失敗是用無監督解決計算機視覺的監督學習問題
Blossom,Faker賽後採訪:結束後監督進來說「奪冠了」