【Pytorch神经网络理论篇】 19 循环神经网络训练语言模型:语言模型概述+NLP多项式概述
1 語言模型
循環(huán)神經(jīng)網(wǎng)絡(luò)模型可以對序列片段進(jìn)行學(xué)習(xí),找到樣本間的順序特征。這個(gè)特性非常適合運(yùn)用在語言處理方向。
1.1 語言模型簡介
語言模型包括文法語言模型和統(tǒng)計(jì)語言模型,一般指統(tǒng)計(jì)語言模型。
1.1.1 統(tǒng)計(jì)語言模型
統(tǒng)計(jì)語言模型是指:把語言(詞的序列)看成一個(gè)隨機(jī)事件,并賦予相應(yīng)的概率來描述其屬于某種語言集合的可能性,衡量一個(gè)句子的合理性,概率越高,說明這個(gè)句子越像是自然句子。
統(tǒng)計(jì)語言模型的作用是,為一個(gè)長度為m的字符串確定一個(gè)概率分布P(w1,w2,...,wm),表示其存在的可能性。其中,”w1~wm”依次表示這段文本中的各個(gè)詞,用這種模型通過這些方法可以保留一定的詞序信息,獲得一個(gè)詞的上下文信息。
2 詞表與詞向量
2.1 詞表與詞向量
? ? 詞表是指給每個(gè)單詞(或字)編碼,即用數(shù)字來表示單詞(或字),這樣才能將句子輸入到神經(jīng)網(wǎng)絡(luò)中進(jìn)行處理。
? ? 比較簡單的詞表是為每個(gè)單詞(或字)按順序進(jìn)行編號,或?qū)⑦@種編號用one_hot編碼來表示。但是,這種簡單的編號方式只能描述不同的單詞(或字),無法將單詞(或字)的內(nèi)部含義表達(dá)出來。
于是人們開始用向量來映射單詞(或字),可以表達(dá)更多信息,這種用來表示每個(gè)詞的向量就稱為詞向量(也稱詞嵌入)。詞向量可以理解為one-hot編碼的升級版,它使用多維向量更好地描述詞與詞之間的關(guān)系。
2.2 詞向量的原理與實(shí)現(xiàn)
詞向量的最大優(yōu)勢在于可以更好地表示上下文語義。
2.2.1 詞向量的含義
詞向量表示詞與詞之間的遠(yuǎn)近關(guān)系映射為向量間的距離,從而最大限度地保留了單詞(或字)原有的特征,建立在分布假說(distributional hypothesis)基礎(chǔ)上的,即假設(shè)詞的語義由其上下文決定,上下文相似的詞,其語義也相似。
2.2.2 詞向量的組成
(1)選擇一種方式描述上下文;
(2)選擇一種模型刻畫某個(gè)目標(biāo)詞與其上下文之間的關(guān)系。
2.3 詞向量的原理與實(shí)現(xiàn)
? one_hot編碼的映射方法本質(zhì)上也屬于詞向量,即把每個(gè)字表示為一個(gè)很長的向量,這個(gè)向量的維度是詞表大小,并且只有一個(gè)維度的值為1,其余的維度都為0。這個(gè)為1的度就代表了當(dāng)前的字。
? ? one_hot編碼與詞向量的唯一區(qū)別就是僅僅將字符號化,不考慮任何語義信息。如one_hot編碼每一個(gè)元素由整型改為浮點(diǎn)型,同時(shí)再將原來稀疏的巨大維度壓縮嵌入到人更小維度的空間,那么它就等同于詞向量。
?2.4 詞向量的實(shí)現(xiàn)
在神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)中,詞向量更多地被稱為詞嵌入(word embedding),具體做法是將二維的張量映射到多維空間,即embedding中的元素將不再是、個(gè)字,而變成了字所轉(zhuǎn)化的多維向量,所有向量之間是有距離遠(yuǎn)近關(guān)系的。
3 NLP中多項(xiàng)式的分布
在自然語言中,一句話中的某個(gè)詞并不是唯一的。例如,“代碼醫(yī)生工作室真棒”這句話中的最后一個(gè)字“棒”,也可以換成“好”,不會影響整句話的語義。
3.1 RNN模型中存在的問題
在RNN模型中,將一個(gè)使用語言樣本訓(xùn)練好的模型用于生成文本時(shí),會發(fā)現(xiàn)模型總會將在下一時(shí)刻出現(xiàn)概率最大的那個(gè)詞取出,即僅僅實(shí)現(xiàn)一種語言的設(shè)計(jì),這種生成文本的方式失去了語言本身的多樣性。
3.2 解決方案
為了解決這個(gè)問題,將RNN模型的最終結(jié)果當(dāng)成一個(gè)多項(xiàng)式分布(multinomialdistribution),以分布取樣的方式預(yù)測出下一序列的詞向量。用這種方法所生成的句子更符合語言的特性。
3.2.1 多項(xiàng)式分布
多項(xiàng)式分布多項(xiàng)式分布是二項(xiàng)式分布的拓展。
二項(xiàng)式分布的典型例子是“扔硬幣”:硬幣正面朝上的概率為P,重復(fù)扔n次硬幣,所得到k次正面朝上的概率即為一個(gè)二項(xiàng)式分布概率。把二項(xiàng)式分布公式拓展至多種狀態(tài),就得到了多項(xiàng)式分布。
3.2.2 多項(xiàng)式分布在RNN模型中的應(yīng)用
多項(xiàng)式分布在RNN模型中的應(yīng)用在RNN模型中,預(yù)測的結(jié)果不再是下一個(gè)序列中出現(xiàn)的具體某一個(gè)詞,而是這個(gè)詞的分布情況,這便是在RNN模型中使用多項(xiàng)式分布的核心思想。在獲得該詞的多項(xiàng)式分布之后,便可以在該分布中進(jìn)行采樣操作,獲得具體的詞,這種方式更符合NLP任務(wù)中語言本身的多樣性,即一個(gè)句子中的某個(gè)詞并不是唯一的。
3.2.3 RNN模型中的實(shí)現(xiàn)步驟
? ? (1)將RNN模型預(yù)測的結(jié)果通過全連接或卷積,變成與字典維度相同的數(shù)組。
? ? (2)用該數(shù)組代表模型所預(yù)測結(jié)果的多項(xiàng)式分布。
? ? (3)用torch.multinomial()函數(shù)從預(yù)測結(jié)果中采樣,得到真正的預(yù)測結(jié)果。
3.3 torch.multinomial()
torch.multinomial(input, num_samples,replacement=False, out=None) → LongTensor- 函數(shù)作用:對input的每一行做n_samples次取值,輸出的張量是每一次取值時(shí)input張量對應(yīng)行的下標(biāo)。輸入是一個(gè)input張量,一個(gè)取樣數(shù)量,和一個(gè)布爾值replacement。
- input:張量可以看成一個(gè)權(quán)重張量,每一個(gè)元素代表其在該行中的權(quán)重。如果有元素為0,那么在其他不為0的元素,被取干凈之前,這個(gè)元素是不會被取到的。
- n_samples:是每一行的取值次數(shù),該值不能大于每一樣的元素?cái)?shù),否則會報(bào)錯(cuò)。
- replacement:指的是取樣時(shí)是否是有放回的取樣,True是有放回,False無放回。
3.3.1 代碼實(shí)現(xiàn)(每次多想次分布采樣的結(jié)果均不同)
import torch # 生成一串0-1的隨機(jī)數(shù) data = torch.rand(2,4) print("生成的數(shù)據(jù)列表",data) #生成的數(shù)據(jù)列表 tensor([[0.8998, 0.6512, 0.9156, 0.8575],[0.8455, 0.4838, 0.6859, 0.2629]]) a = torch.multinomial(data,1) print("第一次采樣結(jié)果:",a) # 第一次采樣結(jié)果: tensor([[0],[0]]) b = torch.multinomial(data,1) print("第二次采樣結(jié)果:",b) # 第二次采樣結(jié)果: tensor([[0],[1]])4 循環(huán)神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)
?4.1 RNN的底層類
torch.nn.LSTM類與torch..nn.GRU類并不屬于單層的網(wǎng)絡(luò)結(jié)構(gòu),它本質(zhì)上是對RNNCell的二次封裝,將基本的RNN Cell按照指定的參數(shù)連接起來,形成一個(gè)完整的RNN。
在torch.nn.LSTM類與torch.nn.GRU類的內(nèi)部還會分別調(diào)用torch.nn.LSTMCel類與torch.nn.GRUCell類進(jìn)行具體實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 19 循环神经网络训练语言模型:语言模型概述+NLP多项式概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ImageNet Classificat
- 下一篇: 【Pytorch神经网络理论篇】 18