Word2Vec笔记

来源:互联网 发布:数学建模 知乎 编辑:程序博客网 时间:2024/06/05 04:13

NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。从很大的词库corpus里选V个频率最高的词(忽略其他的) ,V一般比较大,比如V=10W,固定这些词的顺序,然后每个词就可以用一个V维的稀疏向量表示了,这个向量只有一个位置的元素是1,其他位置的元素都是0。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。例如:“话筒”表示为 [0 00 1 0 0 0 0 0 0 0 0 0 0 0 0 …]

这种 One-hotRepresentation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。

缺点:存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的,光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难;‚造成维数灾难;ƒ实践上看,高维的特征如果要套用 DeepLearning,其复杂度几乎是难以接受的。

Deep Learning 中一般用DistributedRepresentation分布式词向量,表示的一种低维实数向量,通常被称为“WordRepresentation”或“WordEmbedding”。这种向量一般长成这个样子:[0.792,−0.177, −0.107, 0.109, −0.542, …]。分布式词向量是一个固定大小的实数向量,事前确定它的大小比如N=300维或者N=1000维,每个元素都是一个实数,实数的具体值是词库里面每个词通过不同的贡献得来的,所以叫分布式的。而word2vec就是一种学习这个分布式词向量的算法。。优点:让相关或者相似的词,在距离上更接近

CBOW也是统计语言模型的一种,顾名思义就是根据某个词前面的C个词或者前后C个连续的词,来计算某个词出现的概率。Skip-Gram Model相反,是根据某个词,然后分别计算它前后出现某几个词的各个概率。

Word2Vec:结构就是一个三层网络——输入层、隐层(也可称为映射层),输出层。利用神经网络为单词寻找一个连续向量空间中的表示

其基本思想是 通过训练将每个词映射成 K 维实数向量(K 一般为模型中的超参数),通过词之间的距离(比如cosine 相似度、欧氏距离等)来判断它们之间的语义相似度。

以“我爱北京天安门”这句话为例。假设我们现在关注的词是“爱”,C=2时它的上下文分别是“我”,“北京天安门”。CBOW模型就是” “北京天安门onehot表示方式作为输入,也就是C1xV的向量,分别跟同一个VxN的大小的系数矩阵W1相乘得到C个1xN的隐藏层hiddenlayer,然后C个取平均所以只算一个隐藏层。这个过程也被称为线性激活函数(这也算激活函数?分明就是没有激活函数了)。然后再跟另一个NxV大小的系数矩阵W2相乘得到1xV的输出层,这个输出层每个元素代表的就是词库里每个词的事后概率。输出层需要跟groundtruth也就是“爱”的onehot形式做比较计算loss。这里需要注意的就是V通常是一个很大的数比如几百万,计算起来相当费时间,除了“爱”那个位置的元素肯定要算在loss里面,word2vec就用基于huffman编码的Hierarchicalsoftmax筛选掉了一部分不可能的词,然后又用nagetivesamping再去掉了一些负样本的词所以时间复杂度就从O(V)变成了O(logV)。Skipgram训练过程类似,只不过输入输出刚好相反。

训练完成后对于某个词就可以拿出它的1xN的隐藏层作为词向量,就可以w2v(中国)-w2v(北京)=w2v(法国)-w2v(巴黎)了。

由于是用向量表示,而且用较好的训练算法得到的词向量的向量一般是有空间上的意义的,也就是说,将所有这些向量放在一起形成一个词向量空间,而每一向量则为该空间中的一个点,在这个空间上的词向量之间的距离度量也可以表示对应的两个词之间的距离。所谓两个词之间的距离,就是这两个词之间的语法,语义之间的相似性。

Skip-gram模型

在已知当前词的情况下预测上下文。

Skip-gram模型的神经网络结构设计如下:

输入层:w的词向量v(w)

投影层:依然是v(w),就是一个形式

输出层:和CBOW一样的霍夫曼树

CBOW(ContinuousBag-of-Words Model)模型

是在已知当前词的上下文的前提下预测当前词

下图所示:第一层,也就是最上面的那一层可以称为输入层,输入的是若干个词的词向量;中间那个层可以成为隐层,是输入的若干个词向量的累加和,注意是向量的累加和,结果是一个向量;第三层是方框里面的那个二叉树,可以称之为输出层,隐层的那个节点要跟输出层的那个二叉树的所有非叶节点链接。

第三层的这个二叉树是一个霍夫曼树,每个非叶节点也是一个向量,但是这个向量不代表某个词,代表某一类别的词;每个叶子节点代表一个词向量,为了简单只用一个w表示,没有下标。另外要注意的是,输入的几个词向量其实跟这个霍夫曼树中的某几个叶子节点是一样的,当然输入的那几个词跟它们最终输出的到的那个词未必是同一个词,而且基本不会是同一个词,只是这几个词跟输出的那个词往往有语义上的关系。 霍夫曼树的所有叶子节点就代表了语料库里面的所有词,而且是每个叶子节点对应一个词,不重复。 

这个神经网络最重要的是输出层的那个霍夫曼树的叶子节点上的那些向量,那些向量被称为词向量。

word2vec就是用一个一层的神经网络(CBOW的本质)one-hot形式的词向量映射到分布式形式的词向量,为了加快训练速度,用了Hierarchicalsoftmaxnegative sampling trick

CBOW模型的神经网络结构设计如下:

输入层:词w的上下文一共2c个词的词向量

投影层:将输入层的2c个向量做求和累加

输出层:一个霍夫曼树,其中叶子节点是语料中出现过的词,权重是出现的次数

 

优点:Word2vec利用了词的上下文,语义信息更加地丰富。词与词之间的向量操作还能和语义相对应。

N-gram模型:

N-gram就是只管这个词前面的n-1个词,加上它自己,总共n个词。据大牛们的核算,n2效果都还凑合,n3就相当不错了,n4就顶不住了。看下面的一些数据,假设词表中词的个数 |V| = 20,000 词,那么有下面的一些数据。


1n不能取太大,取大了语料库经常不足,所以基本是用降级的方法

2、无法建模出词之间的相似度,就是有两个词经常出现在同一个context后面,但是模型是没法体现这个相似性的。

3、有些n元组(n个词的组合,跟顺序有关的)在语料库里面没有出现过,对应出来的条件概率就是0,这样一整句话的概率都是0了,这是不对的,解决的方法主要是两种:平滑法(基本上是分子分母都加一个数)和回退法(利用n-1的元组的概率去代替n元组的概率)

 

原创粉丝点击