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