除了自然語(yǔ)言處理,你還可以用詞嵌入(Word2Vec)做這個(gè)
當(dāng)使用機(jī)器學(xué)習(xí)方法來(lái)解決問(wèn)題的時(shí)候,擁有合適的數(shù)據(jù)是非常關(guān)鍵的。不幸的是,通常情況下的原始數(shù)據(jù)是「不干凈」的,并且是非結(jié)構(gòu)化的。自然語(yǔ)言處理(NLP)的從業(yè)者深諳此道,因?yàn)樗麄兯玫臄?shù)據(jù)都是文本的。由于大多數(shù)機(jī)器學(xué)習(xí)算法不接受原始的字符串作為輸入,所以在輸入到學(xué)習(xí)算法之前要使用詞嵌入的方法來(lái)對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換。但這不僅僅存在于文本數(shù)據(jù)的場(chǎng)景,它也能夠以分類(lèi)特征的形式存在于其他標(biāo)準(zhǔn)的非自然語(yǔ)言處理任務(wù)中。事實(shí)上,我們很多人都在苦苦研究這種分類(lèi)特征過(guò)程,那么詞嵌入方法在這種場(chǎng)景中有什么作用呢?
這篇文章的目標(biāo)是展示我們?nèi)绾文軌蚴褂靡环N詞嵌入方法,Word2Vec(2013,Mikolov 等),來(lái)把一個(gè)具有大量模態(tài)的分類(lèi)特征轉(zhuǎn)換為一組較小的易于使用的數(shù)字特征。這些特征不僅易于使用,而且能夠成功學(xué)習(xí)到若干個(gè)模態(tài)之間的關(guān)系,這種關(guān)系與經(jīng)典詞嵌入處理語(yǔ)言的方式很相似。
Word2Vec
觀其伴,知其意。(Firth, J. R. 1957.11)
上述內(nèi)容準(zhǔn)確地描述了 Word2Vec 的目標(biāo):它嘗試通過(guò)分析一個(gè)詞的鄰詞(也稱(chēng)作語(yǔ)境)來(lái)確定該詞的含義。這個(gè)方法有兩種不同風(fēng)格的模型:CBOW 模型和 Skip-Gram 模型。在給定語(yǔ)料庫(kù)的情況下,模型在每個(gè)語(yǔ)句的詞上循環(huán),要么根據(jù)當(dāng)前單詞來(lái)預(yù)測(cè)其鄰詞(語(yǔ)境),要么根據(jù)當(dāng)前的語(yǔ)境來(lái)預(yù)測(cè)當(dāng)前的詞,前者所描述的方法被稱(chēng)作「Skip-Gram」,后者被稱(chēng)作「連續(xù)性詞包,continuous bag of words(CBOW)」。每個(gè)語(yǔ)境中單詞數(shù)目的極限是由一個(gè)叫做「窗大小,Window Size」的參數(shù)來(lái)決定的。
因此,如果你選擇了 Skip-Gram 方法,Word2Vec 就會(huì)使用一個(gè)淺層的神經(jīng)網(wǎng)絡(luò),也就是說(shuō),用一個(gè)只具有一個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò)來(lái)學(xué)習(xí)詞嵌入。網(wǎng)絡(luò)首先會(huì)隨機(jī)地初始化它的權(quán)重,然后使用單詞來(lái)預(yù)測(cè)它的語(yǔ)境,在最小化它所犯錯(cuò)誤的訓(xùn)練過(guò)程中去迭代調(diào)整這些權(quán)重。有望在一個(gè)比較成功的訓(xùn)練過(guò)程之后,能夠通過(guò)網(wǎng)絡(luò)權(quán)重矩陣和單詞的 one-hot 向量的乘積來(lái)得到每一個(gè)單詞的詞向量。
注意:除了能夠允許將文本數(shù)據(jù)進(jìn)行數(shù)字表征之外,結(jié)果性嵌入還學(xué)習(xí)到了單詞之間的而一些有趣的關(guān)系,可以被用來(lái)回答類(lèi)似于下面的這種問(wèn)題:國(guó)王之于王后,正如父親之于......?
如果你想了解更多的關(guān)于 Word2Vec 的細(xì)節(jié)知識(shí),你可以看一下斯坦福大學(xué)的課程(https://www.youtube.com/watch?v=ERibwqs9p38),或者 TensorFlow 的相關(guān)教程(https://www.tensorflow.org/tutorials/word2vec)。
應(yīng)用
我們?cè)?nbsp;Kwyk 平臺(tái)上(https://www.kwyk.fr/)上提供在線的數(shù)學(xué)練習(xí)。老師給他們的學(xué)生布置作業(yè),每次練習(xí)完成的時(shí)候都會(huì)有一些數(shù)據(jù)被存儲(chǔ)下來(lái)。然后,我們利用收集到的數(shù)據(jù)來(lái)評(píng)價(jià)每個(gè)學(xué)生的水平,并且給他們量身制作對(duì)應(yīng)的復(fù)習(xí)來(lái)幫助他們進(jìn)步。對(duì)于每一個(gè)被解答的練習(xí)作業(yè),我們都保存了一系列的標(biāo)識(shí)符來(lái)幫助我們區(qū)分以下信息:這是什么練習(xí)?作答的學(xué)生是誰(shuí)?屬于哪一個(gè)章節(jié)?....... 除此之外,我們還會(huì)根據(jù)學(xué)生是否成功地解答了這個(gè)題目來(lái)保存一個(gè)分?jǐn)?shù),要么是 0,要么是 1。然后,為了評(píng)價(jià)學(xué)生的分?jǐn)?shù),我們必須預(yù)測(cè)這個(gè)分?jǐn)?shù),并且從我們的分類(lèi)器中得到學(xué)生成功的概率。
正如你所看到的,我們的很多特征都是可以分類(lèi)的。通常情況下,當(dāng)模態(tài)的數(shù)目足夠小的時(shí)候,你可以簡(jiǎn)單地將 n 模態(tài)的分類(lèi)特征轉(zhuǎn)換為 n-1 維的啞變量,然后用它們?nèi)ビ?xùn)練。但是當(dāng)模態(tài)是成千上萬(wàn)級(jí)別的時(shí)候——就像在我們應(yīng)用中的一些情況一樣——依靠啞變量就顯得沒(méi)有效率并且不切實(shí)際。
為了解決這個(gè)問(wèn)題,我們通過(guò)一個(gè)小技巧采用 Word2Vec 把分類(lèi)特征轉(zhuǎn)換為數(shù)量相當(dāng)少的可用連續(xù)特征。為了闡述這個(gè)想法,我們以「exercise_id」為例來(lái)說(shuō)明:exercise_id 是一個(gè)分類(lèi)特征,它能夠告訴我們被解答過(guò)的練習(xí)題是哪一個(gè)。為了能夠使用 Word2Vec,我們提供一個(gè)語(yǔ)料庫(kù),也就是將要輸入到我們的算法中的一系列句子。然而,原始的特征只是一個(gè) ID 的列表而已,它本質(zhì)上并不是語(yǔ)料庫(kù):它的順序完全是隨機(jī)的,相近的 ID 也并沒(méi)有攜帶著其相鄰的 ID 任何信息。我們的技巧包括把某個(gè)老師布置的一次作業(yè)看做一個(gè)「句子」,也就是一連串的 exercise_id。結(jié)果就是,所有的 ID 會(huì)很自然地以等級(jí)、章節(jié)等標(biāo)簽被收集在一起,然后 Word2Vec 可以直接在這些句子上面開(kāi)始學(xué)習(xí)練習(xí)的嵌入(exercise embedding,對(duì)應(yīng)于 Word embedding)。
事實(shí)上,正是由于這些人為的句子我們才得以使用 Word2Vec,并得到了很漂亮的結(jié)果:
如我們所看到的的,結(jié)果性嵌入是有結(jié)構(gòu)的。事實(shí)上,練習(xí)的 3D 投影云是螺旋形的,高級(jí)別的練習(xí)緊跟在較低級(jí)別的后面。這也意味著嵌入成功地學(xué)會(huì)了區(qū)分不同級(jí)別的練習(xí)題目,并且把練習(xí)題目重新分組,具有相似級(jí)別的被放在了一起。但是這還不是全部,使用非線性的降維技術(shù)之后,我們可以將整個(gè)嵌入降維成一個(gè)具有相同特征的實(shí)值變量。換句話(huà)說(shuō),我們得到了一個(gè)關(guān)于練習(xí)復(fù)雜度的特征,6 年級(jí)(6th)最小,隨著練習(xí)越來(lái)越復(fù)雜,這個(gè)變量越來(lái)越大,直到 12 年級(jí)達(dá)到該變量的***值。
更有甚者,正如 Mikolov 在英語(yǔ)單詞上做到的一樣,嵌入還習(xí)得了練習(xí)之間的關(guān)系:
上圖展示了我們的嵌入能夠?qū)W習(xí)到的關(guān)系的一些實(shí)例。所以當(dāng)我們問(wèn)「一個(gè)數(shù)字相加的練習(xí)之于一個(gè)數(shù)字相減的練習(xí),正如一個(gè)時(shí)間相加的練習(xí)之于......?」之后,嵌入給出了如下的答案:「一個(gè)時(shí)間相減的練習(xí)」。具體而言,這意味著如果我們提出這個(gè)問(wèn)題:嵌入 [減(數(shù)字)Substract(Numbers)] --嵌入 [加(數(shù)字),Add(Numbers)],并把它添加到學(xué)生練習(xí)的嵌入中,其中學(xué)生被要求來(lái)做時(shí)間的加法(例如,小時(shí)、分鐘等等),那么與之最接近的一個(gè)嵌入就是包含時(shí)間減法的練習(xí)。
結(jié)論
總之,詞嵌入技術(shù)在將文本數(shù)據(jù)轉(zhuǎn)換成便于機(jī)器學(xué)習(xí)算法直接使用的實(shí)值向量時(shí)是有用的,盡管詞嵌入技術(shù)主要用在自然語(yǔ)言處理的應(yīng)用中,例如機(jī)器翻譯,但是我們通過(guò)給出特定的用在 Kwyk 中的例子展示了這些技術(shù)在分類(lèi)特征處理中也有用武之地。然而,為了使用諸如 Word2Vec 這樣的技術(shù),你必須建立一個(gè)語(yǔ)料庫(kù)——也就是說(shuō),一組句子,其中的標(biāo)簽已經(jīng)被排列好了,所以其語(yǔ)境也是已經(jīng)隱式創(chuàng)建好了。上述實(shí)例中,我們使用在網(wǎng)站上給出的作業(yè)來(lái)創(chuàng)建練習(xí)的「句子」,并且學(xué)習(xí)練習(xí)嵌入。結(jié)果就是,我們能夠得到新的數(shù)字特征,這些特征能夠成功地學(xué)習(xí)練習(xí)之間的關(guān)系,比它們被打上的那組原始標(biāo)簽更加有用。
向 Christophe Gabar 致謝,他是我們 Kwyk 的開(kāi)發(fā)人員之一,他提出了把 word2vec 用在分類(lèi)特征上的思想。
原文鏈接:https://medium.com/towards-data-science/a-non-nlp-application-of-word2vec-c637e35d3668