这是我参与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)