单词: 不能以文本形式直接输入到机器训练
-> 需要转换为向量的形式输入
- 简单的直接用one-hot 一个词一个编码
缺点: 随着词的数量增加维数越来越多,并且会很稀疏;
词之间没有联系 - word2vec
其实就是一个简化的神经网络,输入one hot vector,经过线性隐藏层,输出维度和输入一致,用的是softmax回归。然后以这个形式输入到机器进行后面的分类或其他训练预测。
这个模型的输入和输出的定义:一般使用CBOW(连续词袋) 或 skip-gram 两种模型来定义。
1)CBOW
输入:每个特征(target word,目标词/中间词,因为是根据它的左右也就是上下的词预测它而得名)的上下文词对应的词向量
输出:此特征(target word)的词向量
适合于:小型数据集
输入层:上下词的one-hot
采用的上下词的个数C由设置的窗口大小决定,而单词向量空间设为V维,那么输入的大小就是C*V-dim
=》所有one-hot分别乘以共享的输入权重矩阵W,这是个大小为V*N的矩阵,N由自己初始化
=》所得的向量相加求平均作为隐藏层向量,显然size为1N
=》乘以输出权重矩阵W‘
=》输出层
得到的是1N向量,经过激活函数处理得到V维的概率分布,概率最大的索引所指示的单词即为target word
需要定义损失函数:上面得到的target word对应的vector和真实label的one-hot做对比,误差越小越好
采用梯度下降更新W,W'
训练完毕后,输入层每个单词和最后的W相乘得到的向量就是我们所需的词向量(word embedding)。
2)Skip-Gram
输入:可以说是和CBOW相反,它是利用input word预测上下文。
输出:我们指定窗口大小(skip_window)的上下文词的数量
适合于:大型语料库
需要设置的参数:skip_window和num_skips
example:
skip_window表示从每个input word左右两侧各选取词的数量,
整个窗口大小为span= size(skip_window) * 2,
如果中心词左侧或者右侧的词数量< size(skip_window),
则窗口中的词(不包含input word时候)<span
num_skips 代表我们从窗口中选择多少个不同的的词作为output
也就是每个单词生成的样本数量,不能超过skip_window的两倍,并且必须是batch_size的整数倍
借用一个图:
蓝色代表input word,此图的skip_window就是设为2。如果我们的num_skips设为2,那么在input word 为“quick”的时候,我们会只得到两组(input,output)形式的training smaples。