Tensorflow機(jī)器學(xué)習(xí)--圖文理解Word2Vec

由于本人初學(xué)機(jī)器學(xué)習(xí)&Tensorflow蠢笋,文章中若有錯(cuò)誤,希望評論指出鳞陨,不勝感謝昨寞。

一、Word2Vec問題是什么?

Word2Vec 即 Word to vector厦滤,詞匯轉(zhuǎn)向量编矾。
我們希望詞義相近的兩個(gè)單詞,在映射之后依然保持相近馁害,詞義很遠(yuǎn)的單詞直接則保持很遠(yuǎn)的映射距離:如下圖所示窄俏,這里介紹到了 t-SNE 方法可以很好的達(dá)到效果:
關(guān)于t-SNE這里推薦一篇文章:
http://bindog.github.io/blog/2016/06/04/from-sne-to-tsne-to-largevis

416BA7CE-4342-4835-85DA-D0789F3A25D7.png

二、從實(shí)例代碼中學(xué)習(xí)

起初看了網(wǎng)上很多資料碘菜,關(guān)于 Word2Vec 真心學(xué)的云里霧里凹蜈。在 Tensorflow 中 Vector Representations of Words 字詞的向量表示這一章卡了很久。于是我嘗試看 word2vec_basic.py 的源碼來理解一下Word2Vec最簡單的實(shí)現(xiàn)忍啸。
看完200多行的源碼仰坦, Tensorflow 自身的注釋 就關(guān)于Word2Vec實(shí)例總結(jié)為6步:

  1. 下載數(shù)據(jù)
  2. 將原詞匯數(shù)據(jù)轉(zhuǎn)換為字典映射
  3. 為 skip-gram模型 建立一個(gè)掃描器
  4. 建立并訓(xùn)練 skip-gram 模型
  5. 開始訓(xùn)練模型
  6. 結(jié)果可視化

這里忽視第六步,從第1步到第5步计雌,我將使用圖片和一些代碼來貫通Word2Vec整個(gè)過程悄晃。
首先打開下載進(jìn)來的word詞匯數(shù)據(jù),由于是無監(jiān)督學(xué)習(xí)凿滤,并沒有標(biāo)簽妈橄,就只是整整100M大小文本數(shù)據(jù)。
這是第一步下載得到的數(shù)據(jù):


0A4FB7AE-6C56-4960-97EC-86948F7613EF.png

然后開始第二步將原詞匯數(shù)據(jù)轉(zhuǎn)換為字典映射翁脆,比如我取出這段文本的頭一句眷蚓,它會(huì)進(jìn)行如下變換:

01E9A1B7-D990-4298-A303-967415F420FC.png

現(xiàn)在我們的詞匯文本變成了用數(shù)字編號替代的格式以及詞匯表和逆詞匯表。逆詞匯只是編號為key,詞匯為value反番。
接著開始第三步沙热,為skip-gram 模型建立一個(gè)掃描器,首先看一下掃描器函數(shù):

def generate_batch(batch_size, num_skips, skip_window):

batch_size是指一次掃描多少塊,skip_window為左右上下文取詞的長短罢缸,num_skips輸入數(shù)字的重用次數(shù)篙贸。假設(shè)我們的掃描器先掃這大段文字的前8個(gè)單詞,左右各取1個(gè)單詞枫疆,重用次數(shù)為2次爵川。我們就會(huì)觀察到如下結(jié)果:

D309AA22-D064-48F9-8D36-B285A6BA4331.png

現(xiàn)在通過上面一步,我們構(gòu)造出了input和label养铸,就可以進(jìn)行監(jiān)督學(xué)習(xí)雁芙,下面

B26EC656-C5FA-4E6E-80C4-2B47B7509C08.png

什么是NCE Loss呢轧膘?這里為什么不用更為常見的Softmax + Cross-Entropy 呢?

19DB34BA-EF80-4902-B710-11CAAC8DA122.png

因?yàn)槿绻谶@里使用Softmax + Cross-Entropy作為損傷函數(shù)會(huì)有一個(gè)問題兔甘,Softmax當(dāng)有幾萬+的分類時(shí)谎碍,速率會(huì)大大下降。

其速度對比如下:
10000 個(gè)類洞焙,Softmax每秒處理 10000 個(gè)樣本蟆淀,NCE每秒處理 30000 個(gè)樣本
100000 個(gè)類,Softmax每秒處理 1000 個(gè)樣本澡匪,NCE每秒處理 20000 個(gè)樣本
此實(shí)驗(yàn)結(jié)論由其他同學(xué)得出熔任,給出實(shí)驗(yàn)鏈接:https://zhuanlan.zhihu.com/p/21642643

這里再整理出其他同學(xué)關(guān)于 NCE LOSS 源碼的理解,下面就是一段 NCE LOSS 的實(shí)現(xiàn)代碼唁情,但不得而知 Tensorflow 是否使用該NCE LOSS的實(shí)現(xiàn)疑苔。


def nce_loss(data, label, label_weight, embed_weight, vocab_size, num_hidden, num_label):
    label_embed = mx.sym.Embedding(data = label, input_dim = vocab_size,
                                   weight = embed_weight,
                                   output_dim = num_hidden, name = 'label_embed')
    label_embed = mx.sym.SliceChannel(data = label_embed,
                                      num_outputs = num_label,
                                      squeeze_axis = 1, name = 'label_slice')
    label_weight = mx.sym.SliceChannel(data = label_weight,
                                       num_outputs = num_label,
                                       squeeze_axis = 1)
    probs = []
    for i in range(num_label):
        vec = label_embed[i]
        vec = vec * data
        vec = mx.sym.sum(vec, axis = 1)
        sm = mx.sym.LogisticRegressionOutput(data = vec,
                                             label = label_weight[i])
        probs.append(sm)
    return mx.sym.Group(probs)

NCE的主要思想是,對于每一個(gè)樣本甸鸟,除了本身的label惦费,同時(shí)采樣出N個(gè)其他的label,從而我們只需要計(jì)算樣本在這N+1個(gè)label上的概率抢韭,而不用計(jì)算樣本在所有l(wèi)abel上的概率薪贫。而樣本在每個(gè)label上的概率最終用了Logistic的損失函數(shù)。

80229FA5-A268-4923-B2ED-24B6F8EFAA37.png

這里可謂是整個(gè) Word2Vec 的關(guān)鍵刻恭。
至此瞧省,已經(jīng)搭建好訓(xùn)練模型,然后便可以進(jìn)行分批次的訓(xùn)練即可鳍贾。那么下一個(gè)問題是完成訓(xùn)練后鞍匾,我們?nèi)绾闻袛鄡蓚€(gè)詞匯的相似度?


4B22A93C-0BAD-496D-B735-5DC021172302.png

這里我們使用 cos 來表示相似度會(huì)比使用 l2 向量差值會(huì)好一些贾漏。
這是根據(jù)訓(xùn)練方式所決定的候学,因?yàn)橄蛄康拈L度與分類無關(guān),

 norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
 normalized_embeddings = embeddings / norm
 valid_embeddings = tf.nn.embedding_lookup(
      normalized_embeddings, valid_dataset)
 similarity = tf.matmul(
      valid_embeddings, normalized_embeddings, transpose_b=True)

參考自Udacity中文本和序列的深度模型一課:https://classroom.udacity.com/courses/ud730/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纵散,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隐圾,更是在濱河造成了極大的恐慌伍掀,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暇藏,死亡現(xiàn)場離奇詭異蜜笤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盐碱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門把兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪伙,“玉大人,你說我怎么就攤上這事县好∥穑” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵缕贡,是天一觀的道長翁授。 經(jīng)常有香客問我,道長晾咪,這世上最難降的妖魔是什么收擦? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮谍倦,結(jié)果婚禮上塞赂,老公的妹妹穿的比我還像新娘。我一直安慰自己昼蛀,他們只是感情好宴猾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹洽,像睡著了一般鳍置。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上送淆,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天税产,我揣著相機(jī)與錄音,去河邊找鬼偷崩。 笑死辟拷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阐斜。 我是一名探鬼主播衫冻,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谒出!你這毒婦竟也來了隅俘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤笤喳,失蹤者是張志新(化名)和其女友劉穎为居,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杀狡,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒙畴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呜象。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳凝。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碑隆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬音,到底是詐尸還是另有隱情上煤,我是刑警寧澤攘滩,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布杉畜,位于F島的核電站樱拴,受9級特大地震影響售担,放射性物質(zhì)發(fā)生泄漏蛉艾。R本人自食惡果不足惜丈钙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一陈惰、第九天 我趴在偏房一處隱蔽的房頂上張望疏咐。 院中可真熱鬧扬舒,春花似錦阐肤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晨炕,卻和暖如春衫画,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓮栗。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工削罩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人费奸。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓弥激,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愿阐。 傳聞我的和親對象是個(gè)殘疾皇子微服,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容