日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

改进版的CBOW模型

發布時間:2025/3/12 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 改进版的CBOW模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

復習

首先復習一下之前的CBOW筆記。

采用推理的方法認知單詞、CBOW模型這里面主要是:

CBOW模型的核心思路:給出周圍的單詞(上下文)時,預測目標詞處會出現什么單詞。

要用神經網絡處理單詞,需要先將單詞轉化為固定長度的向量,這就引出了單詞的表示。

單詞的表示:將單詞轉化為固定長度的向量(one-hot 表示),神經網絡的輸入層的神經元個數就可以固定下來。

CBOW模型:它是根據上下文預測目標詞的神經網絡。模型的輸入是上下文。大致結構如下。

上圖中的Win和Wout都是矩陣,也就是說,全連接層變換可以看作是輸入層與矩陣相乘。由此引出矩陣乘積層(MatMul)的實現,這里面:

提到了反向傳播:

拿下圖舉例子,反過來的箭頭指向的那個心是2.2,意思就是,如果jym用心程度增加1,那么jym就能多獲得2.2×1=2.2個npy。也就是說,反向傳播目的就是看出輸入的變化對輸出有何影響(偏導)。

乘法節點的反向傳播示意圖如下,可以看出乘法節點的反向傳播,將上游傳過來的導數(1.1)乘正向傳播的翻轉值,然后傳給下游。jym的心獲得的反向傳播的值是:1.1乘正向傳播的y的2=2.2。

由上面類比得到x、y、z是矩陣的情況下的反向傳播,如下圖。

接下來,需要對語料庫進行數據的預處理。預處理究竟處理的什么,關鍵就在于下面這張圖。首先從語料庫生成上下文和目標詞,然后把上下文和目標詞轉化為 one-hot 表示。

然后就繼續去實現一下普通的CBOW模型類。

整體大致是下面這個情況(里面有的是簡寫,反向傳播還得乘前面傳來的偏導數)。

但是這個模型有兩個問題,第一個問題就是:對于輸入層來說,one-hot表示占用內存過多,計算one-hot表示與權重矩陣的乘積,需要花費大量時間。解決這個問題,就需要增加一個Embedding層。也就是說,將原來CBOW模型中輸入側的MatMul層換成Embedding層。

解決這個問題的核心思路就是:計算one-hot 表示矩陣和權重矩陣的乘積,其實就是將權重矩陣的某個特定的行取出來。

Embedding 層:一個從權重矩陣中抽取單詞ID對應行(向量)的層。

Embedding 層的正向傳播:從權重矩陣W中提取特定的行,并將特定行的神經元原樣傳給下一層。

Embedding 層的反向傳播:上一層傳來的梯度會被應用到權重梯度dW的特定行(idx)。

第二個問題是:中間層的神經元和權重矩陣的乘積、Softmax層的計算需要花費很多計算時間。

解決方法就是使用 Negative Sampling (負采樣) 替代 Softmax。也就是用二分類擬合多分類。

二分類問題:處理答案為是或否的問題,比如目標詞是 say 嗎。讓神經網絡來回答:當上下文是 you 和 goodbye 時,目標詞是 say 嗎?這時輸出層只需要一個神經元,神經元輸出的是 say 的得分。

輸出側的權重矩陣中保存了各個單詞ID對應的單詞向量,提取目標詞的單詞向量,再求這個向量和中間層神經元的內積,就是最終的得分。示意圖如下。

Embedding Dot 層合并Embedding 層和 dot 運算(內積運算),優化后的CBOW模型如下。

其中向Sigmoid with Loss 層輸入正確解標簽1,表示現在正在處理的問題的答案是Yes。當答案是No時,向 Sigmoid with Loss 層輸入0。

下圖是進一步說明:

目前,只是對正例say進行了二分類,如果此時模型有好的權重,則Sigmoid層的輸出概率將接近1。

真正要做的事是,對于正例say,使Sigmoid層的輸出接近1;對于負例(say 以外的單詞),使Sigmoid層的輸出接近0。

所以,接下來引出二分類負采樣方法。主要內容如下:

負采樣方法:求正例作為目標詞時的損失,同時采樣(選出)若干個負例,對這些負例求損失。然后,將正例和采樣出來的負例的損失加起來,作為最終的損失。

抽取負例:讓語料庫中常出現的單詞易被抽到,不常出現的單詞難被抽到。

基于頻率的采樣方法:計算語料庫中各個單詞的出現次數,并將其表示為概率分布,然后使用這個概率分布對單詞進行采樣。負采樣通過僅關注部分單詞的方法實現了計算的高速化

至此,就通過畫圖梳理的方法,串聯起之前寫的筆記的整體脈絡,把CBOW模型復習完了。

接下來需要做的是,把改進后的CBOW模型實現出來,然后在PTB數據集上進行學習。

改進版的CBOW模型

CBOW類如下:

參數:vocab_size詞匯量,hidden_size中間層的神經元個數,corpus單詞ID列表,window_size上下文的大小。

import sys sys.path.append('..') from common.np import * # import numpy as np from common.layers import Embedding from negative_sampling_layer import NegativeSamplingLossclass CBOW:def __init__(self, vocab_size, hidden_size, window_size, corpus):V, H = vocab_size, hidden_size# 初始化權重W_in = 0.01 * np.random.randn(V, H).astype('f')W_out = 0.01 * np.random.randn(V, H).astype('f')# 生成層self.in_layers = []for i in range(2 * window_size):layer = Embedding(W_in) # 使用Embedding層self.in_layers.append(layer)self.ns_loss = NegativeSamplingLoss(W_out, corpus, power=0.75, sample_size=5)# 將所有的權重和梯度整理到列表中layers = self.in_layers + [self.ns_loss]self.params, self.grads = [], []for layer in layers:self.params += layer.params#存神經網絡里面的參數self.grads += layer.grads#存神經網絡里面的梯度# 將單詞的分布式表示設置為成員變量self.word_vecs = W_indef forward(self, contexts, target):#contexts是上下文,target是目標詞,這里是單詞ID形式的h = 0for i, layer in enumerate(self.in_layers):h += layer.forward(contexts[:, i])#contexts是二維數組h *= 1 / len(self.in_layers)loss = self.ns_loss.forward(h, target)#target是一維數組return lossdef backward(self, dout=1):dout = self.ns_loss.backward(dout)dout *= 1 / len(self.in_layers)for layer in self.in_layers:layer.backward(dout)return None

CBOW模型的學習:

import sys sys.path.append('..') from common import config# 開GPU config.GPU = Truefrom common.np import * import pickle from common.trainer import Trainer from common.optimizer import Adam from cbow import CBOW from skip_gram import SkipGram from common.util import create_contexts_target, to_cpu, to_gpu from dataset import ptb# 設定超參數 window_size = 5 hidden_size = 100 batch_size = 100 max_epoch = 10# 讀入數據 corpus, word_to_id, id_to_word = ptb.load_data('train') vocab_size = len(word_to_id)contexts, target = create_contexts_target(corpus, window_size) if config.GPU:contexts, target = to_gpu(contexts), to_gpu(target)# 生成模型等 model = CBOW(vocab_size, hidden_size, window_size, corpus) # model = SkipGram(vocab_size, hidden_size, window_size, corpus) optimizer = Adam() trainer = Trainer(model, optimizer)# 開始學習 trainer.fit(contexts, target, max_epoch, batch_size) trainer.plot()# 保存必要數據,以便后續使用,取出輸入側得權重和單詞與單詞ID之間轉化得字典 word_vecs = model.word_vecs if config.GPU:word_vecs = to_cpu(word_vecs) params = {} params['word_vecs'] = word_vecs.astype(np.float16) params['word_to_id'] = word_to_id params['id_to_word'] = id_to_word pkl_file = 'cbow_params.pkl' # or 'skipgram_params.pkl' with open(pkl_file, 'wb') as f:pickle.dump(params, f, -1)

運行情況如下:

CBOW模型評價:

def most_similar(query, word_to_id, id_to_word, word_matrix, top=5):'''相似單詞的查找:param query: 查詢詞:param word_to_id: 從單詞到單詞ID的字典:param id_to_word: 從單詞ID到單詞的字典:param word_matrix: 匯總了單詞向量的矩陣,假定保存了與各行對應的單詞向量:param top: 顯示到前幾位''' import sys sys.path.append('..') from common.util import most_similar, analogy import picklepkl_file = 'cbow_params.pkl' # pkl_file = 'skipgram_params.pkl'with open(pkl_file, 'rb') as f:params = pickle.load(f)word_vecs = params['word_vecs']word_to_id = params['word_to_id']id_to_word = params['id_to_word']# most similar task querys = ['you', 'year', 'car', 'toyota'] for query in querys:most_similar(query, word_to_id, id_to_word, word_vecs, top=5)# analogy task print('-'*50) analogy('king', 'man', 'queen', word_to_id, id_to_word, word_vecs) analogy('take', 'took', 'go', word_to_id, id_to_word, word_vecs) analogy('car', 'cars', 'child', word_to_id, id_to_word, word_vecs) analogy('good', 'better', 'bad', word_to_id, id_to_word, word_vecs)

輸出:從結果看出,CBOW 模型獲得的單詞的分布式表示具有良好的性質。而且,不僅可以將近似單詞聚在一起,還可以通過向量的加減法來解決類推問題,比如man : woman = king : ?

而且結果說明,單詞的分布式不僅限于捕獲單詞的含義,它也捕獲了語法中的模式。

遷移學習:在某個領域學到的知識可以被應用于其他領域。一般先在大規模語料庫上學習,然后將學習好的分布式表示應用于某個單獨的任務。

單詞的分布式表示的優點是可以將單詞或文檔轉化為固定長度的向量。如果可以將自然語言轉化為向量,就可以使用常規的機器學習方法。將這個向量作為其他機器學習系統的輸入,利用常規的機器學習框架輸出目標答案。比如,將向量化的郵件及其情感標簽輸入某個情感分類系統(SVM 或神經網絡等)進行學習。大系統由:生成單詞的分布式表示的系統(word2vec)、對特定問題進行分類的系統(比如進行情感分類 的 SVM 等)組成。

分布式表示的評價方法:單詞的分布式表示的評價往往與實際應用分開進行,經常使用的評價指標有相似度和類推問題。

[query] youwe: 0.73095703125i: 0.70703125your: 0.6103515625they: 0.59375anybody: 0.58740234375[query] yearmonth: 0.8505859375week: 0.77392578125summer: 0.7568359375spring: 0.75390625decade: 0.69873046875[query] carluxury: 0.603515625window: 0.59375cars: 0.58349609375auto: 0.580078125truck: 0.5771484375[query] toyotamarathon: 0.65087890625nissan: 0.6455078125honda: 0.6357421875seita: 0.630859375minicomputers: 0.6005859375 --------------------------------------------------[analogy] king:man = queen:?carolinas: 5.26953125woman: 5.11328125a.m: 5.08203125downside: 4.90234375mother: 4.65234375#下面說明單詞的分布式表示編碼了時態相關的信息 [analogy] take:took = go:?went: 4.53125goes: 4.44921875were: 4.32421875was: 4.2421875came: 4.15234375[analogy] car:cars = child:?a.m: 6.54296875rape: 5.8046875children: 5.453125daffynition: 4.91796875women: 4.8984375[analogy] good:better = bad:?rather: 6.36328125less: 5.24609375more: 5.17578125greater: 4.2265625fewer: 3.80859375

總結

以上是生活随笔為你收集整理的改进版的CBOW模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。