PyTorch如何使用embedding對(duì)特征向量進(jìn)行嵌入
詞向量嵌入
在NLP中,一個(gè)最基本的問題就是如何在計(jì)算機(jī)中表示一個(gè)單詞。一般我們用含有N個(gè)單詞的詞匯表來對(duì)單詞進(jìn)行編碼,例如詞表{“hello”: 0, “world”: 1, “nice”:2, “to”:3, “see”:4, “you”:5 }中只有6個(gè)單詞,那么nice的編碼就是2,但是一篇文章有成百上千甚至更多的詞匯時(shí),這就需要embedding操作將詞向量進(jìn)行壓縮,用更小的維度去表示大量的詞匯空間。
根據(jù)語言學(xué)的單詞分布假說,出現(xiàn)在相似語境中的詞在語義上是相互關(guān)聯(lián)的。如果僅僅使用一個(gè)數(shù)字來表示一個(gè)單詞,孤立的對(duì)待每個(gè)單詞,就無法發(fā)現(xiàn)單詞之間的內(nèi)在聯(lián)系,無法表示向量之間的相似性,即語義相似度。而通過embedding編碼則可以挖掘出不同詞向量之間的相似性,并且根據(jù)已有的詞句對(duì)新的句子做出預(yù)測(cè)。
那么embedding是如何對(duì)一個(gè)詞匯進(jìn)行編碼的呢?它從語義屬性的角度考慮進(jìn)行編碼,例如有mathematicians 和physicists兩個(gè)詞匯,假設(shè)我們從奔跑能力can run、喜好咖啡程度like coffee、物理研究majored in physics等角度對(duì)兩個(gè)單詞作出平均,這樣就形成了描述兩個(gè)單詞的詞向量記作m=[2.3, 9.4, -5.5]、p=[2.5, 9.1, 6.4],那么接下來就可以通過夾角大小來表示兩個(gè)向量的相似度cosα=m·p / |m||p|,如果兩個(gè)向量越相似,其cosα值越接近1,反之趨于-1.這樣就用三維向量對(duì)單詞進(jìn)行了編碼并且挖掘出其內(nèi)在的語義相似性。
mathematician={ "can run" : 2.3, "likes coffee" : 9.4,"majored in Physics" : ?5.5,…} physicist={ "can run" : 2.5 "likes coffee" : 9.1,"majored in Physics" : 6.4,…}
但是我們可以用成千上萬種不同的方式對(duì)mathematicians 和physicists進(jìn)行描繪,我們應(yīng)該選取哪些值來表示不同的屬性呢?
與人為的定義屬性相比,深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)可以很好地進(jìn)行特征學(xué)習(xí),所以我們可以讓embedding在訓(xùn)練過程中自動(dòng)進(jìn)行訓(xùn)練和更新,指導(dǎo)找到合適的屬性來表示詞向量。
經(jīng)過訓(xùn)練之后的向量表示是沒有實(shí)際的語義屬性的,就像如果直接看m=[2.3, 9.4, -5.5],它只是由三個(gè)數(shù)字組成的向量,并沒有我們可以理解的意義。
綜上,我們可以看到PyTorch的embedding有三個(gè)特點(diǎn):可以將高維向量壓縮、發(fā)掘向量之間的聯(lián)系、可以在訓(xùn)練過程中自動(dòng)學(xué)習(xí)和更新。
Embedding函數(shù)
使用torch.nn庫的Embedding()
可以構(gòu)建embed模型,它需要傳入兩個(gè)參數(shù),輸入向量的類型數(shù)和輸出向量的維度,即向量共有多少種不同類型的取值、最后希望用幾個(gè)數(shù)來表示該向量。
需要注意的是,embedding的輸入向量必須為long類型的tensor。
如下所示,詞表word_to_ix
中共有6種不同的單詞,最后希望用一個(gè)2維向量表示每個(gè)單詞,那么模型的構(gòu)建就是Embedding(6, 2)。
假設(shè)我們要對(duì)“nice”進(jìn)行編碼,首先通過詞表找到其編號(hào)為2,得到其原始編碼lookup_tensor
,經(jīng)過embedding之后得到編碼為nice_embed
。
我們也可以一次輸入10個(gè)單詞,即tensor(10,),embedding會(huì)作用與每個(gè)向量并得到tensor(10,2)的結(jié)果。
import torch import torch.nn as nn word_to_ix = {"hello": 0, "world": 1, "nice": 2, "to": 3, "see": 4, "you": 5} embeds = nn.Embedding(6, 2) # 構(gòu)建模型 lookup_tensor = torch.tensor([word_to_ix["nice"]], dtype=torch.long) print(lookup_tensor) nice_embed = embeds(lookup_tensor) # 進(jìn)行編碼 print(nice_embed) ''' tensor([2]) tensor([[ 0.7950, -0.3999]], grad_fn=<EmbeddingBackward>) '''
一個(gè)具體例子
下面是一個(gè)使用embedding進(jìn)行模型訓(xùn)練的例子,首先給出的材料是一段莎士比亞的詩,訓(xùn)練模型根據(jù)前兩個(gè)單詞預(yù)測(cè)第三個(gè)單詞。
模型在將單詞進(jìn)行embedding編碼后送入兩個(gè)全連接層后輸出結(jié)果。
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim CONTEXT_SIZE = 2 EMBEDDING_DIM = 10 # 編碼向量的維度 test_sentence = """When forty winters shall besiege thy brow, And dig deep trenches in thy beauty's field, Thy youth's proud livery so gazed on now, Will be a totter'd weed of small worth held: Then being asked, where all thy beauty lies, Where all the treasure of thy lusty days; To say, within thine own deep sunken eyes, Were an all-eating shame, and thriftless praise. How much more praise deserv'd thy beauty's use, If thou couldst answer 'This fair child of mine Shall sum my count, and make my old excuse,' Proving his beauty by succession thine! This were to be new made when thou art old, And see thy blood warm when thou feel'st it cold.""".split() # 構(gòu)建訓(xùn)練集數(shù)據(jù) ([ 第一個(gè)單詞, 第二個(gè)單詞 ], 預(yù)測(cè)目標(biāo)) trigrams = [([test_sentence[i], test_sentence[i + 1]], test_sentence[i + 2]) for i in range(len(test_sentence) - 2)] # 構(gòu)建測(cè)試集數(shù)據(jù) vocab = set(test_sentence) word_to_ix = {word: i for i, word in enumerate(vocab)} # 定義模型 class NGramLanguageModeler(nn.Module): def __init__(self, vocab_size, embedding_dim, context_size): super(NGramLanguageModeler, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.linear1 = nn.Linear(context_size * embedding_dim, 128) self.linear2 = nn.Linear(128, vocab_size) def forward(self, inputs): embeds = self.embeddings(inputs).view((1, -1)) # 進(jìn)行embedding out = F.relu(self.linear1(embeds)) # 經(jīng)過第一個(gè)全連接層 out = self.linear2(out) # 經(jīng)過第二個(gè)全連接層 log_probs = F.log_softmax(out, dim=1) return log_probs # 進(jìn)行訓(xùn)練 losses = [] loss_function = nn.NLLLoss() model = NGramLanguageModeler(len(vocab), EMBEDDING_DIM, CONTEXT_SIZE) optimizer = optim.SGD(model.parameters(), lr=0.001) for epoch in range(10): total_loss = 0 for context, target in trigrams: # 準(zhǔn)備輸入模型的數(shù)據(jù) context_idxs = torch.tensor([word_to_ix[w] for w in context], dtype=torch.long) model.zero_grad() # 清零梯度緩存 # 進(jìn)行訓(xùn)練得到預(yù)測(cè)結(jié)果 log_probs = model(context_idxs) # 計(jì)算損失值 loss = loss_function(log_probs, torch.tensor([word_to_ix[target]], dtype=torch.long)) # 反向傳播更新梯度 loss.backward() optimizer.step() total_loss += loss.item() # 累計(jì)損失 losses.append(total_loss) print(losses)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)壓縮與解壓gzip大文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)壓縮與解壓gzip大文件的方法,分析了Python針對(duì)壓縮成gzip文件及解壓gzip文件的方法,并給出了相應(yīng)的封裝類,需要的朋友可以參考下2016-09-09用pushplus+python監(jiān)控亞馬遜到貨動(dòng)態(tài)推送微信
這篇文章主要介紹了用pushplus+python監(jiān)控亞馬遜到貨動(dòng)態(tài)推送微信的示例,幫助大家利用python搶購商品,感興趣的朋友可以了解下2021-01-01python中使用requests設(shè)置代理服務(wù)器
文章介紹了代理服務(wù)器的工作原理和使用方法,包括代理的概念、代理服務(wù)器的作用、如何在Python中設(shè)置代理以及代理的匿名度分類2024-11-11基于Python+Turtle實(shí)現(xiàn)繪制簡(jiǎn)易的大風(fēng)車
大風(fēng)車,吱呀吱呦呦地轉(zhuǎn),這里的風(fēng)景呀真好看!天好看,地好看……一首熟悉的歌曲,是否已經(jīng)把你拉回了童年?本文將用Turtle庫繪制簡(jiǎn)易的大風(fēng)車,需要的可以參考一下2022-06-06Python?Pygame實(shí)戰(zhàn)之紅心大戰(zhàn)游戲的實(shí)現(xiàn)
說起Windows自帶的游戲,相信許多80、90后的朋友都不陌生。本文就將利用Python中的Pygame模塊實(shí)現(xiàn)一下windows經(jīng)典游戲之一的紅心大戰(zhàn),需要的可以參考一下2022-02-02Python?SQLAlchemy與數(shù)據(jù)庫交互操作完整指南
SQLAlchemy 是一個(gè)強(qiáng)大的 Python 庫,用于數(shù)據(jù)庫操作,無論是簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)還是復(fù)雜的數(shù)據(jù)管理,SQLAlchemy 都提供了多種方法來處理數(shù)據(jù)庫,本文將全面介紹 SQLAlchemy的基本用法以及各種操作的示例代碼2024-01-01django基礎(chǔ)之?dāng)?shù)據(jù)庫操作方法(詳解)
下面小編就為大家?guī)硪黄猟jango基礎(chǔ)之?dāng)?shù)據(jù)庫操作方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Python編程實(shí)現(xiàn)的圖片識(shí)別功能示例
這篇文章主要介紹了Python編程實(shí)現(xiàn)的圖片識(shí)別功能,涉及Python PIL模塊的安裝與使用技巧,需要的朋友可以參考下2017-08-08