word2vec
word embedding
要将自然语言交给机器学习算法来处理,通常需要首先将语言数学化,词向量就是用来将语言中的词进行数学化的一种方式。关于词向量工作原理的理解
word vector
词向量,word embedding中的word是一个向量形式,才是计算机识别的形式
把word 用向量来表示,比如one-hot encoding形式,只有该词对应的位置是1
one-hot encoding
它也是一个词袋模型,不考虑词之间的顺序,假设词之间相互独立,得到一个离散的稀疏矩阵
但是文中词之间是有顺序的,词之间也不是相互独立的,
这里讲一下独热编码的作用和缺点
- 作用是能将样本特征转化为计算机识别的形式,也就是能够处理离散特征
- 缺点是比如全世界地名这个特征,如果用one-hot处理,那处理完了之后,每个地名对应的位置是1,那最后得到的稀疏矩阵就会非常的大,此时维度爆炸了。。
于是大神们想出了一个办法,来把维度缩小。小声bb一句:大神们的脑子都是怎么长的呢?
Dristributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间(每个向量可以视为空间中的一个点),进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。jianshu
在映射过程中需要哦满足以下条件
- 这个映射是单设(不懂的概念自行搜索);
- 映射之后的向量不会丢失之前的那种向量所含的信息。
一个简单的栗子
假设在二维平面上分布有 N 个不同的点,给定其中的某个点,现在想在平面上找到与这个点最相近的一个点,我们是怎么做的呢?首先,建立一个直角坐标系,基于该坐标系,其上的每个点就唯一地对应一个坐标 (x,y);接着引入欧氏距离;最后分别计算这个词与其他 N-1 个词之间的距离,对应最小距离值的那个词便是我们要找的词了。
上面的例子中,坐标(x,y) 的地位就相当于词向量,它用来将平面上一个点的位置在数学上作量化。坐标系建立好以后,要得到某个点的坐标是很容易的。然而,在 NLP 任务中,要得到词向量就复杂得多了,而且词向量并不唯一,其质量依赖于训练语料、训练算法和词向量长度等因素。关于词向量工作原理的理解
单设这个我还不懂
这个训练是什么?
训练就是神经网络训练
词向量的维度自己指定的时候有什么标准嘛?
word embedding
ok word embedding的概念就是将高维的词向量变成一个低维的词向量(空间)==降维
说了这么多就是降维😢
想要得到一个词的词向量,那么在训练的过程中要考语义,也就是要考虑词的上下文
那么训练出来的时候两个近义词的词向量就会非常的相近
word2vec
word2vec模型其实就是简单化的神经网络。
图片来自jianshu
输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐藏层的权重矩阵。jianshu
下面就解释了为啥要得到hide层的权重矩阵
CBOW
Continuous Bag-of-Words)
输入词的上下文,来预测该词,比较适用于小的语料库,但是这里大和小的阈值是啥呢?
我的简单理解:
1.通过输入层输入上下文词向量的one-hot
2.通过神经网络反向传播不断的训练hide层权重w和u',最后得到概率最大的index的word就是我们要预测的target(w是输入层的权重矩阵)
3.反向 传播采用梯度下降不断训练w和u,嗯,这里就是神经网络的基本内容,我最好再去熟悉一下
4.最后训练出来的交叉熵最小的w(输入层权重)就是我们需要的参数
输入层的每个单词与矩阵w相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。jianshu
这里的栗子讲的很清楚jianshu
Skip-Gram
与CBO相反,输入word预测上下文
这个比较CBOW来说训练模型的时候训练的参数稍微有点多
训练数据获取:假如有一个句子“The quick brown fox jumps over lazy dog”。
jianshu
对于输入为'the'时,训练时的一个batch会有两个输入(the, quick)和(the, brown)
负采样
负采样(negative sampling)
训练一个神经网络意味着要输入训练样本并且不断调整神经元的权重,从而不断提高对目标的准确预测。每当神经网络经过一个训练样本的训练,它的权重就会进行一次调整。
正如我们上面所讨论的,vocabulary的大小决定了我们的Skip-Gram神经网络将会拥有大规模的权重矩阵,所有的这些权重需要通过我们数以亿计的训练样本来进行调整,这是非常消耗计算资源的,并且实际中训练起来会非常慢。
负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。
当我们用训练样本 ( input word: "fox",output word: "quick") 来训练我们的神经网络时,“ fox”和“quick”都是经过one-hot编码的。如果我们的vocabulary大小为10000时,在输出层,我们期望对应“quick”单词的那个神经元结点输出1,其余9999个都应该输出0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们称为“negative” word。
当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的“positive” word进行权重更新(在我们上面的例子中,这个单词指的是”quick“)。
在论文中,作者指出指出对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。
回忆一下我们的隐层-输出层拥有300 x 10000的权重矩阵。如果使用了负采样的方法我们仅仅去更新我们的positive word-“quick”的和我们选择的其他5个negative words的结点对应的权重,共计6个输出神经元,相当于每次只更新[公式]个权重。对于3百万的权重来说,相当于只计算了0.06%的权重,这样计算效率就大幅度提高。
n-gram
reference
1.https://www.cnblogs.com/peghoty/p/3857839.html
2.https://www.jianshu.com/p/471d9bfbd72f
3.https://blog.csdn.net/songbinxu/article/details/80209197
4.https://www.jianshu.com/p/af8f20fe7dd3