embedding词向量的使用
什么是PyTorch?
PyTorch是一个基于Python的科学计算库,它有以下特点:
- 类似于NumPy,但是它可以使用GPU
- 可以用它定义深度学习模型,可以灵活地进行深度学习模型的训练和使用
Tensors(高维的矩阵就是Tensor)
Tensor类似与NumPy的ndarray,唯一的区别是Tensor可以在GPU上加速运算。
这个是两层的神经网络,分别是1000维,100维,10维。h是中间神经元的个数。
pytorch基本上做的事情:
- 定义输入输出
- 定义模型
- 拿到模型,定义一个loss function
- 把model交给optimizer做优化
- 进入训练,不停地拿训练数据x预测y,并计算loss,计算backward pass
- 优化
学习词向量的概念
1,词典表示: 词典包含10个单词,每个单词有唯一索引
缺点: 在词典中的顺序和在句子中的顺序没有关联
2,one-hot表示: 和词典表示没有任何区别,只是把数字表示变成用向量表示而已。所以如果有个五万词语的词典,就会有五万维的向量。
缺点: 和词典也是一样的问题。
3 ,Bag of Words 词袋
可以将每个单词出现了多少次加入向量。文档的向量表示可以直接将各词的词向量表示加和甚至可以加入词权重 TF-IDF&Binat weighting
缺点: 但是单词的顺序和语义信息也没有被考虑。
4,Bi-gram & N-gram 将多个单词拼成多个单词再加入单词表
缺点: 数据稀疏问题,很难捕捉文本的含义
词表维度随着语料库增长迅速膨胀
而且还是没有解决最根本的问题:无法衡量词向量之间的关系
词编码需要保证词的相似性!最终词向量表示需要作为深度学习的输入和表示空间!
5 ,分布式表示:用一个词附近的词语来表示这个单词
- Word2Vec: Skip-Gram模型 用中心词表示周围词
Skip-gram模型应用这个假想:用一个词附近的词语来表示这个单词。
目标函数:
概率密度:
分数越高同时出现的概率越大
Skip-gram的损失函数: 但是非常慢
Embedding
词嵌入在 pytorch 中非常简单,只需要调用 torch.nn.Embedding(m, n) 就可以了,m 表示单词的总数目,n 表示词嵌入的维度,其实词嵌入就相当于是一个大矩阵,矩阵的每一行表示一个单词。
emdedding初始化
默认是随机初始化的
import torch
from torch import nn
from torch.autograd import Variable
# 定义词嵌入
embeds = nn.Embedding(2, 5) # 2 个单词,维度 5
# 得到词嵌入矩阵,开始是随机初始化的
torch.manual_seed(1)
embeds.weight
# 输出结果:
Parameter containing:
-0.8923 -0.0583 -0.1955 -0.9656 0.4224
0.2673 -0.4212 -0.5107 -1.5727 -0.1232
[torch.FloatTensor of size 2x5]
如果从使用已经训练好的词向量,则采用
pretrained_weight = np.array(args.pretrained_weight)
# 已有词向量的numpy
self.embed.weight.data.copy_(torch.from_numpy(pretrained_weight))
embed的读取
读取一个向量。
注意参数只能是LongTensor型的
# 访问第 50 个词的词向量
embeds = nn.Embedding(100, 10)
embeds(Variable(torch.LongTensor([50])))
# 输出:
Variable containing:
0.6353 1.0526 1.2452 -1.8745 -0.1069 0.1979 0.4298 -0.3652 -0.7078 0.2642
[torch.FloatTensor of size 1x10]
读取多个向量
输入为两个维度(batch的大小,每个batch的单词个数),输出则在两个维度上加上词向量的大小。
- Input: LongTensor (N, W), N = mini-batch, W = number of indices to
extract per mini-batch - Output: (N, W, embedding_dim)