上一節(jié)中我們介紹了LSTM如何處理圖像分類問題,本質(zhì)上是將圖像看成一個序列做處理偷线,但是RNN的長處并不是做圖像分類磨确,而是做自然語言處理,所以這一節(jié)我們將講一下pytorch下RNN如何做自然語言處理声邦。
Word Embedding
在自然語言處理中詞向量是很重要的乏奥,首先介紹一下詞向量。
之前做分類問題的時候大家應(yīng)該都還記得我們會使用one-hot編碼亥曹,比如一共有5類邓了,那么屬于第二類的話恨诱,它的編碼就是(0, 1, 0, 0, 0),對于分類問題骗炉,這樣當(dāng)然特別簡明照宝,但是對于單詞,這樣做就不行了句葵,比如有1000個不同的詞厕鹃,那么使用one-hot這樣的方法效率就很低了,所以我們必須要使用另外一種方式去定義每一個單詞乍丈,這就引出了word embedding剂碴。
我們可以先舉三個例子,比如
- The cat likes playing ball.
- The kitty likes playing wool.
- The dog likes playing ball.
- The boy likes playing ball.
假如我們使用一個二維向量(a, b)來定義一個詞诗赌,其中a汗茄,b分別代表這個詞的一種屬性,比如a代表是否喜歡玩飛盤铭若,b代表是否喜歡玩毛線洪碳,并且這個數(shù)值越大表示越喜歡,這樣我們就可以區(qū)分這三個詞了叼屠,為什么呢瞳腌?
比如對于cat,它的詞向量就是(-1, 4)镜雨,對于kitty嫂侍,它的詞向量就是(-2, 5),對于dog荚坞,它的詞向量就是(3, -2)挑宠,對于boy,它的詞向量就是(-2, -3)颓影,我們怎么去定義他們之間的相似度呢各淀,我們可以通過他們之間的夾角來定義他們的相似度。
上面這張圖就顯示出了不同的詞之間的夾角诡挂,我們可以發(fā)現(xiàn)kitty和cat是非常相似的碎浇,而dog和boy是不相似的。
而對于一個詞璃俗,我們自己去想它的屬性不是很困難嗎奴璃,所以這個時候就可以交給神經(jīng)網(wǎng)絡(luò)了,我們只需要定義我們想要的維度城豁,比如100苟穆,然后通過神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí)它的每一個屬性的大小,而我們并不用關(guān)心到底這個屬性代表著什么,我們只需要知道詞向量的夾角越小鞭缭,表示他們之間的語義更加接近剖膳。
下面我們使用pytorch來實(shí)現(xiàn)一個word embedding
Code
在pytorch里面word embedding實(shí)現(xiàn)是通過一個函數(shù)來實(shí)現(xiàn)的nn.Embedding
word_to_ix = {'hello': 0, 'world': 1}
embeds = nn.Embedding(2, 5)
hello_idx = torch.LongTensor([word_to_ix['hello']])
hello_idx = Variable(hello_idx)
hello_embed = embeds[hello_idx]
print(hello_embed)
這就是我們輸出的hello這個詞的word embedding魏颓,下面我們一步一步來解釋一下代碼
首先我們需要word_to_ix = {'hello': 0, 'world': 1}
岭辣,每個單詞我們需要用一個數(shù)字去表示他,這樣我們需要hello的時候甸饱,就用0來表示它沦童。
接著就是word embedding的定義nn.Embedding(2, 5)
,這里的2表示有2個詞叹话,5表示5維偷遗,其實(shí)也就是一個2x5的矩陣,所以如果你有1000個詞驼壶,每個詞希望是100維氏豌,你就可以這樣建立一個word embedding,nn.Embedding(1000, 100)
热凹。如何訪問每一個詞的詞向量是下面兩行的代碼泵喘,注意這里的詞向量的建立只是初始的詞向量,并沒有經(jīng)過任何修改優(yōu)化般妙,我們需要建立神經(jīng)網(wǎng)絡(luò)通過learning的辦法修改word embedding里面的參數(shù)使得word embedding每一個詞向量能夠表示每一個不同的詞纪铺。
hello_idx = torch.LongTensor([word_to_ix['hello']])
hello_idx = Variable(hello_idx)
接著這兩行代碼表示得到一個Variable,它的值是hello這個詞的index碟渺,也就是0鲜锚。這里要特別注意一下我們需要Variable,因?yàn)槲覀冃枰L問nn.Embedding里面定義的元素苫拍,并且word embeding算是神經(jīng)網(wǎng)絡(luò)里面的參數(shù)芜繁,所以我們需要定義Variable。
hello_embed = embeds(hello_idx)
這一行表示得到word embedding里面關(guān)于hello這個詞的初始詞向量绒极,最后我們就可以print出來骏令。
以上我們介紹了word embeding在pytorch里面是如何實(shí)現(xiàn)的,下一節(jié)我們將介紹如何用word embedding結(jié)合n gram模型進(jìn)行簡單的預(yù)測集峦。
本文代碼已經(jīng)上傳到了github上
歡迎查看我的知乎專欄伏社,深度煉丹
歡迎訪問我的博客