這是我參與8月更文挑戰的第9天,活動詳情查看: 8月更文挑戰html
天然界中,除了2D、3D的圖片、視頻駛距之外,更多的是一些相似於序列的數據,好比語音、文字,這些數據都是有時間前後順序的python
如今就有這樣一個問題,對於一個2D圖片順序,咱們用一個像素點的RGB值來表示這個像素的色彩度。可是對於語音、文字該如何表示呢?markdown
語音在某一個時間段會產生一段波形,這段波形中波峯值就能夠表示此刻聲音的強度。對於一段文字中的字符也能夠表示。可是在PyTorch中是沒有string類型的,咱們必需要把string類型表示爲另一種數值類型。如何進行時間序列的表示(Representation),如何進行時間序列的**信息提取(Information Extraction )**就成了時間序列研究的關鍵問題app
假設一句話有5個單詞,那麼 ,而 取決於你的應用場景,比方說每一個單詞用一個1維向量來表示,那麼 ,若是每一個單詞用一個100維向量來表示,那麼 函數
例以下圖的歷史房價圖,所採用的表示方式就是[100,1]post
一般咱們會使用one-hot Encoding的方式對文字進行編碼,看下面的一個例子ui
假設有下面的兩句話:編碼
這兩句話共有5個詞彙,因而能夠用 表示,其中 。由於有5個詞彙,因此每一個詞彙都用一個5維的向量進行表示,以下所示:spa
但這麼作有如下的缺點:3d
上面one-hot Encoding存在不少問題,那麼應該如何修改呢?咱們能夠用另外一種方式去定義每個單詞——word embedding。下面這句話解釋word embedding很合適
Word embeddings embed meaning of text in a vector space.(把文本的意思嵌入到向量空間中)
有一些詞的詞性是相近的,好比「love」和「like」,對於這種詞性相近的詞,咱們須要他們的向量表示也能相近,如何度量和定義向量之間的類似程度呢?很是簡單,就是使用兩個向量的夾角,夾角越小,越相近。舉個例子,下面有4段話
這裏面有4個詞,分別是cat,kitty,dog和boy。下面咱們使用一個二維的詞向量 來表示每個詞,其中a和b分別表明着這個詞的一種屬性,好比a表明是否喜歡玩球,b表明是否喜歡玩毛線,數值越大表示越喜歡,那麼咱們就能用數值來定義每個單詞
對於cat,咱們能夠定義他的word embedding爲(-1, 4),由於它不喜歡玩球,喜歡玩毛線;kitty爲(-2, 5);dog爲(3, -2);boy爲(-2,-3)。把這四個向量在座標系中表示出來
從上圖就能明顯看出kitty和cat的夾角比較小,因此它們比較類似,dog和boy之間的夾角很大,因此它們不類似
下面說一下具體公式。對於向量 ,它們的餘弦類似度是它們之間夾角的餘弦值
在PyTorch中Word Embedding是經過一個函數來實現的nn.Embedding
import torch
import torch.nn as nn
word_to_idx = {"hello": 0, "world": 1} # 給每一個詞打上索引
lookup_tensor = torch.tensor([word_to_idx["hello"]], dtype=torch.long) # 取出"hello"對應的索引
embeds = nn.Embedding(2, 5) # 2 words in vocab, 5 dimensional embeddings
hello_embed = embeds(lookup_tensor) # 傳入索引
print(hello_embed)
複製代碼
輸出
tensor([[-1.2999, 2.2142, 0.2436, -1.9585, 0.8714]],
grad_fn=<EmbeddingBackward>)
複製代碼
稍微解釋下這幾行代碼,首先由於每一個單詞都須要用一個數字去表示,因此咱們要構建一個單詞-數字之間的映射
而後是nn.Embedding(2, 5)
,2表示有2個詞,5表示5維,其實也就是個2×5的矩陣。因此若是你有1000個詞,每一個詞但願是100維,你就能夠這樣寫這行代碼nn.Embedding(1000, 100)