GloVe:Global Vectors for Word Representation
論文總體結構:
一、摘要
? ? ? 主要提出新的詞向量學習方法glove,利用全局統計信息和局部上下文信息學習
? ? ? 1、當前詞向量學習模型能夠通過向量的算數計算捕捉之間語法和語意規律,但是背后的規律依舊不可解釋
? ? ? ?2、經過仔細分析,發現了一種有助于這種洗向量規律的特性,并基于詞提出了一種新的對數雙線性回歸模型,該模型利用矩陣分解和局部上下文的有點來學習詞向量
? ? ? ?3、模型通過只在共現矩陣非0位置訓練達到高效訓練的目的
? ? ? ?4、模型在詞對推理任務上75%的準確率并且在多個任務上得到最優結果
二、Introduction
? ? ?講解之前的相關方法-矩陣分解和word2vec各有優勢? ?
? ? ?矩陣分解方法(Matrix Factorization Methods)
? ? ? ? ?詞共現矩陣-窗口window=1
? ? ? ? ? ?1.? I enjoy flying
? ? ? ? ? ?2.? I like NLP.
? ? ? ? ? ?3. I like deep learning.
? ? ? ? ? ?I? ?like? enjoy? deep? learning? NLP? flying? ?.
? ? ? ? I? ? 0? ? 2? ? 1? ? ? 0? ? ? 0? ? ? 0? ? ? 0? ? ? 0?
? ? like? ?2? ? 0? ? 0? ? ? 1? ? ? 0? ? ? 1? ? ? 0? ? ? 0
? enjoy? 1? ? 0? ? 0? ? ? 0? ? ? 0? ? ? 0? ? ? 1? ? ? 0?
? ?deep??0? ? 1? ? 0? ? ? 0? ? ? 1? ? ? 0? ? ? 0? ? ? 0?
learning? 0? ? 0? ? 0? ? ?1? ? ? 0? ? ? 0? ? ? 0? ? ? 1
? ? NLP? ?0? ? 1? ? 0? ? ?0? ? ? 0? ? ? 0? ? ? 0? ? ? 1?
? ? flying? 0? ? 0? ? 1? ? ?0? ? ? 0? ? ? 0? ? ? 0? ? ? 1
? ? ? ?.? ??? 0? ? 0? ? ?0? ? ?0? ? ?1? ? ? 1? ? ? 1? ? ? 0
詞表大小 |V|, x.size = |v| * |v|
缺點: 詞對推理效果比較差,沒有學習到語意信息
?
基于上下文的向量學習方法(shallow window-based methods)
word2vec缺點: 只使用窗口內上下文信息,沒有使用全局統計信息
三、相關工作
? ? ?介紹矩陣分解和word2vec相關方法
四、glove model
? ? ? 介紹glove推導過程,glove與其它模型聯系,復雜度分析
注:i、j相當于共現矩陣的索引,wi、wj表示詞向量,學習的就是這個參數,bi、bj相當于i和j的偏置、目標就是(i、j)位置出現的個數的對數,相當于一個回歸問題,構建方程,損失函數相當于之間的差值,模型訓練的過程就是loss減小的過程。
五、實驗分析
? ? ? ?模型實驗結果和超參數分析
? ? ? ?詞對推理實驗結果
? ? ? ?命名實體識別實驗結果
? ? ? ?向量長度和窗口大小超參分析
? ? ? ?語料大小超參分析
? ? ? ? word2vec對比實驗
六、總結
? ? ? 關鍵點:
? ? ? ? 1、矩陣分解的詞向量學習方法
? ? ? ? 2、基于上下文的詞向量學習方法
? ? ? ? 3、預訓練詞向量
? ? ? 創新點:
? ? ? ? 1、提出一種新的詞向量訓練模型-Glove
? ? ? ? 2、在多個任務上取得最好的結果
? ? ? ? 3、公布了一系列預訓練的詞向量
? ? ?啟發點:
? ? ? ? 1、相對原始的概率,概率的比值更能夠區分相關的詞和不相關的詞并且能夠區分兩種相關的詞
? ? ? ? ?2、提出一種新的對數雙線性回歸模型,這種模型結合全局矩陣分解和局部上下文的優點
七、代碼實現
# ****** 數據處理部分 ******# encoding = 'utf-8'from torch.utils import data import os import numpy as np import picklemin_count = 50 # 設置最小詞頻數data = open("./data/text8.txt").read() data = data.split()# 構建詞頻去掉低頻詞word2freq = {}for word in data:if word2freq.get(word)!=None:word2freq[word] += 1else:word2freq[word] = 1word2id = {} for word in word2freq:if word2freq[word] < min_count:continueelse:if word2id.get(word) == None:word2id[word] = len(word2id)# 構建共現矩陣vocab_size = len(word2id) comat = np.zeros((vocab_size,vocab_size))window_size = 2 # 設置滑動窗口大小for i in range(len(data)):if i%1000000==0:print(i,len(data))if word2id.get(data[i]) == None:continuew_index = word2id[data[i]]for j in range(max(0,i-window_size),min(len(data),i+window_size+1)):if word2id.get(data[j]) == None or i==j:continueu_index = word2id[data[j]]comat[w_index][u_index] += 1coocs = np.transpose(np.nonzero(comat)) # 提取非零數據# 生成訓練集labels = []for i in range(len(coocs)):if i%1000000==0:print(i,len(coocs))labels.append(comat[coocs[i][0]][coocs[i][1]])labels = np.array(labels)np.save("./data/data.npy",coocs) np.save('./data/label.npy',labels) pickle.dump(word2id,open("./data/word2id",'wb'))?
# ***** 模型構建部分 *****import torch import torch.nn as nnclass glove_model(nn.Module):def __init__(self, vocab_size, embed_size, x_max, alpha):super(glove_model, self).__init__()self.vocab_size = vocab_sizeself.embed_size = embed_sizeself.x_max = x_maxself.alpha = alphaself.w_embed = nn.Embedding(self.vocab_size,self.embed_size).type(torch.float64) # 中心詞詞向量self.w_bias = nn.Embedding(self.vocab_size,1).type(torch.float64) # 中心詞biasself.v_embed = nn.Embedding(self.vocab_size,self.embed_size).type(torch.float64) # 周圍詞詞向量self.v_bias = nn.Embedding(self.vocab_size,1).type(torch.float64) # 周圍詞biasdef forward(self, w_data, v_data, labels):w_data_embed = self.w_embed(w_data)w_data_bias = self.w_bias(w_data)v_data_embed = self.v_embed(v_data)v_data_bias = self.v_bias(v_data)weights = torch.pow(labels/self.x_max,self.alpha) # 權重生成weights[weights>1] = 1loss = torch.mean(weights*torch.pow(torch.sum(w_data_embed * v_data_embed,1) + w_data_bias + v_data_bias - torch.log(labels),2))return lossdef save_embedding(self, word2id, file_name):embedding_1 = self.w_embed.weight.data.cpu().numpy()embedding_2 = self.v_embed.weight.data.cpu().numpy()embedding = (embedding_1 + embedding_2)/2fout = open(file_name, 'w')fout.write("%d %d\n" %(len(word2id),self.embed_size))for w,wid in word2id.items():e = embedding[wid]w = ' '.join(map(lambda x:str(x), e))fout.write('%s %s\n' %(w,e))model = glove_model(100,100,100,0.75) word2id = dict()for i in range(100):word2id[str(i)] = iw_data = torch.Tensor([0,0,1,1,1]).long() v_data = torch.Tensor([1,2,0,2,3]).long() labels = torch.Tensor([1,2,3,4,5]) model.forward(w_data,v_data,labels)embedding_1 = model.w_embed.weight.data.cpu().numpy()?
# ***** 模型訓練部分 *****from data import Wiki_Dataset from model import glove_model import torch import numpy as np import torch.optim as optim from tqdm import tqdm import config as argumentparserconfig = argumentparser.ArgumentParser()if config.cuda and torch.cuda.is_available():torch.cuda.set_device(config.gpu)torch.cuda.is_available()wiki_dataset = Wiki_Dataset(min_count=config.min_count,window_size = config.window_size)training_iter = torch.utils.data.DataLoader(dataset=wiki_dataset,batch_size=config.batch_size,shuffle=True,num_workers=2)model = glove_model(len(wiki_dataset.word2id),config.embed_size,config.x_max,config.alpha)if config.cuda and torch.cuda.is_available():torch.cuda.set_decvice(config.gpu)model.cuda()optimizer = optim.Adam(model.parameters(),lr=config.learning_rate)loss = -1for epoch in range(config.epoch):process_bar = tqdm(training_iter)print(process_bar)for data,label in process_bar:w_data = torch.Tensor(np.array([sample[0] for sample in data])).long()v_data = torch.Tensor(np.array([sample[1] for sample in data])).long()if config.cuda and torch.cuda.is_available():w_data = w_data.cuda()v_data = v_data.cuda()label = label.cuda()loss_now = model(w_data,v_data,label)if loss == -1:loss = loss_now.data.item()else:loss = 0.95*loss + 0.05 *loss_now.data.item()process_bar.set_postfix(loss=loss)process_bar.update()optimizer.zero_grad()loss_now.backward()optimizer.step()model.save_embedding()具體代碼詳見:https://github.com/wangtao666666/NLP/tree/master/Glove
總結
以上是生活随笔為你收集整理的GloVe:Global Vectors for Word Representation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word2Vec(Efficient E
- 下一篇: Convolutional Neural