自然界除了2D的图片数据之外,还有语音、文字,这些数据都有时间的先后顺序的。对于2D的图像的数据,可以用RGB值来表示像素的色彩度。语音可以用信号幅度值来表示,而Pytorch没有自带String支持,在表示文字之前需要进行Embedding。
没有String类型,采用embedding来进行表示——[seq_len, feature_len],第一个维度表示序列的长度(即单词的个数),第二个维度表示进行维度表示所需要的维度数。如[5, 1],表示一句话有5个单词,每个单词都用长度为1的向量进行表示;[5, 100],表示一句话有5个单词,每个单词都用长度为100的向量进行表示。[seq_len, feature_len]针对不同的用户场景有着不同的含义,看以下曲线——房价随月份的变化,[100,1]中的第一个维度表示的是月份,第二个维度表示的是表示该月份的房价用长度为1的向量进行表示。
文本信息的表达方式为[words, word_vec],第一个维度是单词数量,第二个维度区间于编码方式。编码方式可以采用独热编码。
one-hot编码非常系数,维度非常高,并且语言具有语义相关性(semantic similarity,通过计算余弦相似性),可以采用另外一种编码方式,本质上是对one-hot编码后的语义空间进行降维——word2vec(一种不存在激活函数的神经网络,相当于编词典)。
跟处理图片一样,处理序列也可以取几batch进行一起处理,这时候张量表示存在两种方式——[word_num, b, word_vec] 和 [b, word_num, word_vec]。
word_to_ix = {"hello":0, "world":1}
lookup_tensor = torch.tensor([word_to_ix["hello"]], dtype=torch.long)
# 2 words in vacab, 5 dimensional embeddings
embeds = nn.Embedding(2, 5)
hello_embed = embeds(lookup_tensor)
print(hello_embed)
tensor([[0.6614, 0.2669, 0.0617, 0.6213, -0.4519]], grad_fn=<EmbeddingBackward>)
直接使用GloVe方式(编码方式),直接输入单词既可以得到单词对应的向量。
from torchnlp.word_to_vector import GloVe
vectors = GloVe()
vectors['hello']