更别致的词向量模型(五):有趣的结果
By 苏剑林 | 2017-11-19 | 88894位读者 |最后,我们来看一下词向量模型$(15)$会有什么好的性质,或者说,如此煞费苦心去构造一个新的词向量模型,会得到什么回报呢?
模长的含义 #
似乎所有的词向量模型中,都很少会关心词向量的模长。有趣的是,我们上述词向量模型得到的词向量,其模长还能在一定程度上代表着词的重要程度。我们可以从两个角度理解这个事实。
在一个窗口内的上下文,中心词重复出现概率其实是不大的,是一个比较随机的事件,因此可以粗略地认为
\[P(w,w) \sim P(w)\tag{24}\]
所以根据我们的模型,就有
\[e^{\langle\boldsymbol{v}_{w},\boldsymbol{v}_{w}\rangle} =\frac{P(w,w)}{P(w)P(w)}\sim \frac{1}{P(w)}\tag{25}\]
所以
\[\Vert\boldsymbol{v}_{w}\Vert^2 \sim -\log P(w)\tag{26}\]
可见,词语越高频(越有可能就是停用词、虚词等),对应的词向量模长就越小,这就表明了这种词向量的模长确实可以代表词的重要性。事实上,$-\log P(w)$这个量类似IDF,有个专门的名称叫ICF,请参考论文《TF-ICF: A New Term Weighting Scheme for Clustering Dynamic Data Streams》。
然后我们也可以从另一个角度来理解它,先把每个向量分解成模长和方向
\[\boldsymbol{v}=\Vert\boldsymbol{v}\Vert\cdot\frac{\boldsymbol{v}}{\Vert\boldsymbol{v}\Vert}\tag{27}\]
其中$|\boldsymbol{v}|$模长是一个独立参数,方向向量$\boldsymbol{v}/\Vert\boldsymbol{v}\Vert$是$n-1$个独立参数,$n$是词向量维度。由于参数量差别较大,因此在求解词向量的时候,如果通过调整模长就能达到的,模型自然会选择调整模长而不是拼死拼活调整方向。而根据$(15)$,我们有
\[\log\frac{P(w_i,w_j)}{P(w_i)P(w_j)}=\langle \boldsymbol{v}_i, \boldsymbol{v}_j\rangle=\Vert\boldsymbol{v}_i\Vert\cdot \Vert\boldsymbol{v}_i\Vert\cdot \cos\theta_{ij}\tag{28}\]
对于像“的”、“了”这些几乎没有意义的词语,词向量会往哪个方向发展呢?前面已经说了,它们的出现频率很高,但本身几乎没有跟谁是固定搭配的,基本上就是自己周围逛,所以可以认为对于任意词$w_i$,都有
\[\log\frac{P(w_i,\text{的})}{P(w_i)P(\text{的})}\approx 0\tag{29}\]
为了达到这个目的,最便捷的方法自然就是$\Vert\boldsymbol{v}_{\text{的}}\Vert\approx 0$了,调整一个参数就可以达到,模型肯定乐意。也就是说对于频数高但是互信息整体都小的词语(这部分词语通常没有特别的意义),模长会自动接近于0,所以我们说词向量的模长能在一定程度上代表词的重要程度。
在用本文的模型和百度百科语料训练的一份词向量中,不截断权重,把词向量按照模长升序排列,前50个的结果是
\[\begin{array}{|c|c|c|c|c|c|c|c|c|c|}
\hline
\text{。} & \text{,} & \text{的} & \text{和} & \text{同样} & \text{也} & \text{1} & \text{3} & \text{并且} & \text{另外} \\
\hline
\text{同时} & \text{是} & \text{2} & \text{6} & \text{总之} & \text{在} & \text{以及} & \text{5} & \text{因此} & \text{4} \\
\hline
\text{7} & \text{8} & \text{等等} & \text{又} & \text{并} & \text{;} & \text{与此同时} & \text{然而} & \text{当中} & \text{事实上}\\
\hline
\text{显然} & \text{这样} & \text{所以} & \text{例如} & \text{还} & \text{当然} & \text{就是} & \text{这些} & \text{而} & \text{因而} \\
\hline
\text{此外} & \text{)} & \text{便是} & \text{即使} & \text{比如} & \text{因为} & \text{由此可见} & \text{一} & \text{有} & \text{即}
\\
\hline
\end{array}\]
可见这些词确实是我们称为“停用词”或者“虚词”的词语,这就验证了模长确实能代表词本身的重要程度。这个结果与是否截断权重有一定关系,因为截断权重的话,得到的排序是
\[\begin{array}{|c|c|c|c|c|c|c|c|c|c|}
\hline
\text{。} & \text{,} & \text{总之} & \text{同样} & \text{与此同时} & \text{除此之外} & \text{当中} & \text{便是} & \text{显然} & \text{无论是} \\
\hline
\text{另外} & \text{不但} & \text{事实上} & \text{由此可见} & \text{即便} & \text{原本} & \text{先是} & \text{其次} & \text{后者} & \text{本来}
\\
\hline
\text{原先} & \text{起初} & \text{为此} & \text{另一个} & \text{其二} & \text{值得一提} & \text{看出} & \text{最初} & \text{或是} & \text{基本上}
\\
\hline
\text{另} & \text{从前} & \text{做为} & \text{自从} & \text{称之为} & \text{诸如} & \text{现今} & \text{那时} & \text{却是} & \text{如果说}
\\
\hline
\text{由此} & \text{的确} & \text{另一方面} & \text{其后} & \text{之外} & \text{在内} & \text{当然} & \text{前者} & \text{之所以} & \text{此外}
\\
\hline
\end{array}\]
两个表的明显区别是,在第二个表中,虽然也差不多是停用词,但是一些更明显的停用词,如“的”、“是”等反而不在前面,这是因为它们的词频相当大,因此截断造成的影响也更大,因此存在拟合不充分的可能性(简单来说,更关注了低频词,对于高频词只是“言之有理即可”。)。那为什么句号和逗号也很高频,它们又上榜了?因为一句话的一个窗口中,出现两次句号“。”的概率远小于出现两次“的”的概率,因此句号“。”的使用更加符合我们上述推导的假设,而相应地,由于一个窗口也可能出现多次“的”,因此“的”与自身的互信息应该更大,所以模长也会偏大。
词类比实验 #
既然我们号称词类比性质就是本模型的定义,那么该模型是否真的在词类比中表现良好?我们来看一些例子。
\[\begin{array}{c|c}
\hline
A + B - C& D \\
\hline
机场 + 火车 - 飞机 & 火车站、直达、东站、高铁站、南站、客运站 \\
\hline
国王 + 女人 - 男人& 二世、一世、王后、王国、三世、四世\\
\hline
北京 + 英国 - 中国& 伦敦、巴黎、寓所、搬到、爱丁堡、布鲁塞尔\\
\hline
伦敦 + 美国 - 英国& 纽约、洛杉矶、伦敦、芝加哥、旧金山、亚特兰大\\
\hline
广州 + 浙江 - 广东& 杭州、宁波、嘉兴、金华、湖州、上海\\
\hline
广州 + 江苏 - 广东& 常州、无锡、苏州、南京、镇江、扬州\\
\hline
中学 + 大学生 - 大学& 中学生、中小学生、青少年、电子设计、村官、二中\\
\hline
人民币 + 美国 - 中国& 美元、港币、约合、美金、贬值、万美元\\
\hline
兵马俑 + 敦煌 - 西安& 莫高窟、卷子、写本、藏经洞、精美绝伦、千佛洞\\
\hline
\end{array}\]
这里还想说明一点,词类比实验,有些看起来很漂亮,有些看起来不靠谱,但事实上,词向量反映的是语料的统计规律,是客观的。而恰恰相反,人类所定义的一些关系,反而才是不客观的。对于词向量模型来说,词相近就意味着它们具有相似的上下文分布,而不是我们人为去定义它相似。所以效果好不好,就看“相似的上下文分布 ⇆ 词相近”这一观点(跟语料有关),跟人类对相近的定义(跟语料无关,人的主观想法)有多大差别。当发现实验效果不好时,不妨就往这个点想想。
相关词排序 #
留意式$(15)$,也就是两个词的互信息等于它们词向量的内积。互信息越大,表明两个词成对出现的几率越大,互信息越小,表明两个词几乎不会在一起使用。因此,可以用内积排序来找给定词的相关词。当然,内积是把模长也算进去了,而刚才我们说了模长代表的是词的重要程度,如果我们不管重要程度,而是纯粹地考虑词义,那么我们会把向量的范数归一后再求内积,这样的方案更加稳定:
\[\cos\theta_{ij}=\left\langle \frac{\boldsymbol{v}_i}{|\boldsymbol{v}_i|}, \frac{\boldsymbol{v}_j}{|\boldsymbol{v}_j|}\right\rangle\tag{30}\]
根据概率论的知识,我们知道如果互信息为0,也就是两个词的联合概率刚好就是它们随机组合的概率,这表明它们是无关的两个词。对应到式$(15)$,也就是两个词的内积为0,而根据词向量的知识,两个向量的内积为0,表明两个向量是相互垂直的,而我们通常说两个向量垂直,表明它们就是无关的。所以很巧妙,两个词统计上的无关,正好对应着几何上的无关。这是模型形式上的美妙之一。
需要指出的是,前面已经提到,停用词会倾向于缩小模长而非调整方向,所以它的方向就没有什么意义了,我们可以认为停用词的方向是随机的。这时候我们通过余弦值来查找相关词时,就有可能出现让我们意外的停用词了。
重新定义相似 #
注意上面我们说的是相关词排序,相关词跟相似词不是一回事!!比如“单身”、“冻成”都跟“狗”很相关,但是它们并不是近义词;“科学”和“发展观”也很相关,但它们也不是近义词。
那么如何找近义词?事实上这个问题是本末倒置的,因为相似的定义是人为的,比如“喜欢”和“喜爱”相似,那“喜欢”和“讨厌”呢?如果在一般的主题分类任务中它们应当是相似的,但是在情感分类任务中它们是相反的。再比如“跑”和“抓”,一般情况下我们认为它们不相似,但如果在词性分类中它们是相似的,因为它们具有相同的词性。
回归到我们做词向量模型的假设,就是词的上下文分布来揭示词义。所以说,两个相近的词语应该具有相近的上下文分布,前面我们讨论的“机场-飞机+火车=火车站”也是基于同样原理,但那里要求了上下文单词一一严格对应,而这里只需要近似对应,条件有所放宽,而且为了适应不同层次的相似需求,这里的上下文也可以由我们自行选择。具体来讲,对于给定的两个词$w_i,w_j$以及对应的词向量$\boldsymbol{v}_i,\boldsymbol{v}_j$,我们要算它们的相似度,首先我们写出它们与预先指定的$N$个词的互信息,即
\[\langle\boldsymbol{v}_i,\boldsymbol{v}_1\rangle,\langle\boldsymbol{v}_i,\boldsymbol{v}_2\rangle,\dots,\langle\boldsymbol{v}_i,\boldsymbol{v}_N\rangle\tag{31}\]
和
\[\langle\boldsymbol{v}_j,\boldsymbol{v}_1\rangle,\langle\boldsymbol{v}_j,\boldsymbol{v}_2\rangle,\dots,\langle\boldsymbol{v}_j,\boldsymbol{v}_N\rangle\tag{32}\]
这里的$N$是词表中词的总数。如果这两个词是相似的,那么它们的上下文分布应该也相似,所以上述两个序列应该具有线性相关性,所以我们不妨比较它们的皮尔逊积矩相关系数:
\[\frac{\sum_{k=1}^N \Big(\langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle - \overline{\langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle}\Big)\Big(\langle\boldsymbol{v}_j,\boldsymbol{v}_k\rangle - \overline{\langle\boldsymbol{v}_j,\boldsymbol{v}_k\rangle}\Big)}{\sqrt{\sum_{k=1}^N \Big(\langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle - \overline{\langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle}\Big)^2}\sqrt{\sum_{k=1}^N \Big(\langle\boldsymbol{v}_j,\boldsymbol{v}_k\rangle - \overline{\langle\boldsymbol{v}_j,\boldsymbol{v}_k\rangle}\Big)^2}}\tag{33}\]
其中$\overline{\langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle}$是$\langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle$的均值,即
\[\overline{\langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle}=\frac{1}{N}\sum_{k=1}^N \langle\boldsymbol{v}_i,\boldsymbol{v}_k\rangle=\left\langle\boldsymbol{v}_i,\frac{1}{N}\sum_{k=1}^N \boldsymbol{v}_k\right\rangle = \langle\boldsymbol{v}_i,\bar{\boldsymbol{v}}\rangle\tag{34}\]
所以相关系数公式可以简化为
\[\frac{\sum_{k=1}^N \langle\boldsymbol{v}_i,\boldsymbol{v}_k-\bar{\boldsymbol{v}}\rangle\langle\boldsymbol{v}_j,\boldsymbol{v}_k-\bar{\boldsymbol{v}}\rangle}{\sqrt{\sum_{k=1}^N \langle\boldsymbol{v}_i,\boldsymbol{v}_k-\bar{\boldsymbol{v}}\rangle^2}\sqrt{\sum_{k=1}^N \langle\boldsymbol{v}_j,\boldsymbol{v}_k-\bar{\boldsymbol{v}}\rangle^2}}\tag{35}\]
用矩阵的写法(假设这里的向量都是行向量),我们有
\[\begin{aligned}&\sum_{k=1}^N \langle\boldsymbol{v}_i,\boldsymbol{v}_k-\bar{\boldsymbol{v}}\rangle\langle\boldsymbol{v}_j,\boldsymbol{v}_k-\bar{\boldsymbol{v}}\rangle\\
=&\sum_{k=1}^N \boldsymbol{v}_i (\boldsymbol{v}_k-\bar{\boldsymbol{v}})^{\top}(\boldsymbol{v}_k-\bar{\boldsymbol{v}})\boldsymbol{v}_j^{\top}\\
=&\boldsymbol{v}_i \left[\sum_{k=1}^N (\boldsymbol{v}_k-\bar{\boldsymbol{v}})^{\top}(\boldsymbol{v}_k-\bar{\boldsymbol{v}})\right]\boldsymbol{v}_j^{\top}\end{aligned}\tag{36}\]
方括号这一块又是什么操作呢?事实上它就是
\[\boldsymbol{V}^{\top}\boldsymbol{V},\,\boldsymbol{V}=\begin{pmatrix}\boldsymbol{v}_1-\bar{\boldsymbol{v}}\\ \boldsymbol{v}_2-\bar{\boldsymbol{v}}\\ \vdots \\ \boldsymbol{v}_N-\bar{\boldsymbol{v}}\end{pmatrix}\tag{37}\]
也就是将词向量减去均值后排成一个矩阵$\boldsymbol{V}$,然后算$\boldsymbol{V}^{\top}\boldsymbol{V}$,这是一个$n\times n$的实对称矩阵,$n$是词向量维度,它可以分解(Cholesky分解)为
\[\boldsymbol{V}^{\top}\boldsymbol{V}=\boldsymbol{U}\boldsymbol{U}^{\top}\tag{38}\]
其中$\boldsymbol{U}$是$n\times n$的实矩阵,所以相关系数的公式可以写为
\[\frac{\boldsymbol{v}_i \boldsymbol{U}\boldsymbol{U}^{\top}\boldsymbol{v}_j^{\top}}{\sqrt{\boldsymbol{v}_i \boldsymbol{U}\boldsymbol{U}^{\top}\boldsymbol{v}_i^{\top}}\sqrt{\boldsymbol{v}_j \boldsymbol{U}\boldsymbol{U}^{\top}\boldsymbol{v}_j^{\top}}}=\frac{\langle\boldsymbol{v}_i \boldsymbol{U},\boldsymbol{v}_j \boldsymbol{U}\rangle}{\Vert\boldsymbol{v}_i \boldsymbol{U}\Vert \times \Vert\boldsymbol{v}_j \boldsymbol{U}\Vert}\tag{39}\]
我们发现,相似度还是用向量的余弦值来衡量,只不过要经过矩阵$\boldsymbol{U}$的变换之后再求余弦值。
最后,该怎么选择这$N$个词呢?我们可以按照词频降序排列,然后选择前$N$个,如果$N$选择比较大(比如$N=10000$),那么得到的是一般场景下语义上的相关词,也就是跟前一节的结果差不多;如果$N$选择比较小,如$N=500$,那么得到的是语法上的相似词,比如这时候“爬”跟“掏”、“捡”、“摸”都比较接近。
关键词提取 #
跟《【不可思议的Word2Vec】 3.提取关键词》一文一样,所谓关键词,就是能概括句子意思的词语,也就是说只看关键词也大概能猜出句子的整体内容。假设句子具有$k$个词$w_1,w_2,\dots,w_k$,那么关键词应该要使得
\[P(w_1,w_2,\dots,w_k|w)\sim \frac{P(w_1,w_2,\dots,w_k;w)}{P(w_1,w_2,\dots,w_k)P(w)}\tag{40}\]
最大,说白了,就是用词来猜句子的概率最大,而因为句子是预先给定的,因此$P(w_1,w_2,\dots,w_k)$是常数,所以最大化上式左边等价于最大化右边。继续使用朴素假设,根据式$(6)$有
\[\frac{P(w_1,w_2,\dots,w_k;w)}{P(w_1,w_2,\dots,w_k)P(w)}=\frac{P(w_1,w)}{P(w_1)P(w)}\frac{P(w_2,w)}{P(w_2)P(w)}\dots \frac{P(w_k,w)}{P(w_k)P(w)}\tag{41}\]
代入我们的词向量模型,就得到
\[e^{\langle\boldsymbol{v}_1,\boldsymbol{v}_w\rangle}e^{\langle\boldsymbol{v}_2,\boldsymbol{v}_w\rangle}\dots e^{\langle\boldsymbol{v}_k,\boldsymbol{v}_w\rangle}=e^{\left\langle\sum_i \boldsymbol{v}_i, \boldsymbol{v}_w\right\rangle}\tag{42}\]
所以最后等价于最大化
\[\left\langle\sum_i \boldsymbol{v}_i, \boldsymbol{v}_w\right\rangle\tag{43}\]
现在问题就简单了,进来一个句子,把所有词的词向量求和得到句向量,然后句向量跟句子中的每一个词向量做一下内积(也可以考虑算cos得到归一化的结果),降序排列即可。简单粗暴,而且将原来应该是$\mathcal{O}(k^2)$效率的算法降到了$\mathcal{O}(k)$。效果呢?下面是一些例子。
句子:中央第二环境保护督察组督察浙江省工作动员会在杭州召开。从8月11日开始到9月11日结束,中央环境保护督察组正式入驻浙江展开工作。这也预示着浙江所有的企业将再接下来的一个月内,全部面对中央环境保护督查组的环保督查,也就意味着即将面临被限产、停产、关停的风险。
关键词排序:督察组、限产、督查组、动员会、关停、督查、停产、预示、环境保护、即将句子:浙江省义乌市环保局表示,因合金原材料镉含量普遍较高,为控制镉污染,现责令本市部分电镀企业实施停产整治的通知,被通知企业即日起停产整治。据悉,义乌低温锌合金(锌镉合金)基本停产,另外,温州市瓯海区的未经验收的电镀企业也接到通知,自8月18日起无条件停止生产,在验收后方准予生产。新一轮的环保在浙江锌下游企业展开。
关键词排序:锌合金、环保局、停产、瓯海区、准予、镉、电镀、责令、义乌市、原材料句子:勃艮第炖牛肉是一道经典的法国名菜,被称为“人类所能烹饪出的最美味的牛肉”。这道菜酒香浓郁,色泽诱人,制作过程也不算麻烦。它的背后有着什么样的故事?怎样做出美味的勃艮第炖牛肉?
关键词排序:炖牛肉、酒香、名菜、美味、诱人、勃艮第、浓郁、菜、烹饪、一道句子:天文专家介绍,今年该流星雨将于18日零时30分前后迎来极大,每小时天顶流量在10颗左右,不乏明亮的火流星,我国各地乃至北半球大部分地区都可凭借肉眼观测到。今年最佳观测时间在17日至19日凌晨,幸运的是,届时没有月光干扰,利于观测。
关键词排序:流星雨、火流星、北半球、天顶、观测、零时、肉眼、届时、颗、凌晨
可以发现,哪怕是对于长句,这个方案还是挺靠谱的。值得注意的是,虽然简单粗暴,但这种关键词提取方案可不是每种词向量都适用的,glove词向量就不行,因为它的停用词模长更大,所以glove的结果刚刚是相反的:内积(或cos)越小才越可能是关键词。
句子的相似度 #
让我们再看一例,这是很多读者都会关心的句子相似度问题,事实上它跟关键词提取是类似的。
两个句子什么时候是相似的甚至是语义等价的?简单来说就是看了第一个句子我就能知道第二个句子说什么了,反之亦然。这种情况下,两个句子的相关度必然会很大。设句子$S_1$有$k$个词$w_1,w_2,\dots,w_k$,句子$S_2$有$l$个词$w_{k+1},w_{k+2},\dots,w_{k+l}$,利用朴素假设并根据式$(6)$得到
\[\frac{P(S_1,S_2)}{P(S_1)P(S_2)}=\prod_{i=1}^k\prod_{j=k+1}^{k+l} \frac{P(w_i,w_j)}{P(w_i)P(w_j)}\tag{44}\]
代入我们的词向量模型,得到
\[\begin{aligned}\frac{P(S_1,S_2)}{P(S_1)P(S_2)}=&\prod_{i=1}^k\prod_{j=k+1}^{k+l} \frac{P(w_i,w_j)}{P(w_i)P(w_j)}\\
=&e^{\sum_{i=1}^k\sum_{j=k+1}^{k+l}\langle\boldsymbol{v}_i,\boldsymbol{v}_j\rangle}\\
=&e^{\left\langle\sum_{i=1}^k\boldsymbol{v}_i,\sum_{j=k+1}^{k+l}\boldsymbol{v}_j\right\rangle} \end{aligned}\tag{45}\]
所以最后等价于排序
\[\left\langle\sum_{i=1}^k\boldsymbol{v}_i,\sum_{j=k+1}^{k+l}\boldsymbol{v}_j\right\rangle\tag{46}\]
最终的结果也简单,只需要将两个句子的所有词相加,得到各自的句向量,然后做一下内积(同样的,也可以考虑用cos得到归一化的结果),就得到了两个句子的相关性了。
句向量 #
前面两节都暗示了,通过直接对词向量求和就可以得到句向量,那么这种句向量质量如何呢?
我们做了个简单的实验,通过词向量(不截断版)求和得到的句向量+线性分类器(逻辑回归),可以在情感分类问题上得到81%左右的准确率,如果中间再加一个隐层,结构为输入128(这是词向量维度,句向量是词向量的求和,自然也是同样维度)、隐层64(relu激活)、输出1(2分类),可以得到88%左右的准确率,相比之下,LSTM的准确率是90%左右,可见这种句向量是可圈可点的。要知道,用于实验的这份词向量是用百度百科的语料训练的,也就是说,本身是没有体现情感倾向在里边的,但它依然成功地、简明地挖掘了词语的情感倾向。
同时,为了求证截断与否对此向量质量的影响,我们用截断版的词向量重复上述实验,结果是逻辑回归最高准确率为82%,同样的三层神经网络,最高准确率为89%,可见,截断(也就是对高频词大大降权),确实能更好地捕捉语义。
import pandas as pd
import jieba
pos = pd.read_excel('pos.xls', header=None)
neg = pd.read_excel('neg.xls', header=None)
pos[1] = pos[0].apply(lambda s: jieba.lcut(s, HMM=False))
neg[1] = neg[0].apply(lambda s: jieba.lcut(s, HMM=False))
pos[2] = pos[1].apply(w2v.sent2vec) #这个w2v.sentvec函数请参考下一篇
neg[2] = neg[1].apply(w2v.sent2vec)
pos = np.hstack([np.array(list(pos[2])), np.array([[1] for i in pos[2]])])
neg = np.hstack([np.array(list(neg[2])), np.array([[0] for i in neg[2]])])
data = np.vstack([pos, neg])
np.random.shuffle(data)
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(64, input_shape=(w2v.word_size,), activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
batch_size = 128
model.fit(data[:16000,:w2v.word_size], data[:16000,[w2v.word_size]],
batch_size=batch_size,
epochs=100,
validation_data=(data[16000:,:w2v.word_size], data[16000:,[w2v.word_size]]))
转载到请包括本文地址:https://kexue.fm/archives/4677
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Nov. 19, 2017). 《更别致的词向量模型(五):有趣的结果 》[Blog post]. Retrieved from https://kexue.fm/archives/4677
@online{kexuefm-4677,
title={更别致的词向量模型(五):有趣的结果},
author={苏剑林},
year={2017},
month={Nov},
url={\url{https://kexue.fm/archives/4677}},
}
January 3rd, 2018
V⊤V=UU⊤ 公式38,请问这里为什么要用U矩阵变换,而不直接用V矩阵呢?
从计算上是没问题的,但是维度会大很多。矩阵$\boldsymbol{V}$也就是词向量表减去总体的均值,大小为$|\boldsymbol{V}|\times d$,$|\boldsymbol{V}|$是词汇数,$d$是词向量维度。
这样一来直接合并的话$\boldsymbol{V}\boldsymbol{v}^{\top}$就得到一个$|\boldsymbol{V}|$维的向量,显然化简为繁了。
November 19th, 2018
大神您好,不知百度百科训练的词向量模型可以分享下吗?非常感谢!
请把整个系列看完。
https://kexue.fm/archives/4681
March 10th, 2019
博主你好,我有两个疑惑想问一下:
1.为什么衡量句子相似度直接用相关度而衡量词相似度使用皮尔逊相关系数?比如衡量句子相似度的时候是否可以把所有候选句子列出来,然后用皮尔逊相关系数?
2.两个词$v_i$,$v_j$具有相同语义的话,那么$\langle v_i,v_1\rangle...\langle v_i,v_n\rangle$与$\langle v_j,v_1\rangle...\langle v_j,v_n\rangle$应该几乎相同,而皮尔逊相关系数却允许他们相差一个线性变换,所以使用皮尔逊相关系数的原因是为什么?
1、句子的相似度是通过词来发现的,而词已经是最小颗粒,所以词的相似度只能通过与其他词的相关性来比较。你说的“衡量句子相似度的时候是否可以把所有候选句子列出来,然后用皮尔逊相关系数”,如果是模仿词的思路来做,原则上是没有问题,但实际上,词可以那样做,是因为词理论上可以枚举完的,所以能得到一个有限长的向量。如果是句子的话,几乎是无限的...
2、因为我们只是度量两个词的相似性,比如通常word2vec中我们用cos度量相似性,而皮尔逊相关系数不过是cos的一个变种。相似性不要求严格相等。当然,其实也没有什么严格的数学推导,也就是一种假设罢了。如果希望严格相等,你也可以用欧氏距离来度量,但实际中cos值比欧氏距离体验好些,所以就用cos值罢了。
April 3rd, 2019
“在一个窗口内的上下文,中心词重复出现概率其实是不大的,是一个比较随机的事件,因此可以粗略地认为 P(w,w)∼P(w)”
我的理解:P(w,w)=P(w) 等价于 P(w|w)=1,也就是w为中心词的窗口中w作为context出现的概率是1,但这与原文矛盾了,请问苏神我这么理解错在哪里啊?
$\sim$是“正比于”、“相当于”的意思,不是等于,也不是严格的约等于。
当然,你理解为等于也没什么毛病,$P(w|w)=1$有什么严重的矛盾嘛?
从物理意义上来看,“中心词重复出现是一个比较随机的事件"的意思应该是:中心词和其窗口上下文中出现该中心词是比较独立的,也就是P(w|w)=P(w)或者P(w|w)~P(w). 而P(w,w)~P(w)应该是说(w,w)配对出现的概率与w单独出现的分布是一致的,比如“哈哈”。因为“哈”几乎都是连用的,所以P(“哈哈”)~P(“哈”)。我其实想说的是苏神文字表达的意思是P(w|w)~P(w),但公式是P(w,w)~P(w),之间不一致啊。能不能加个具体的例子来解释一下这个粗略估计啊。多谢啦!
我的意思就是$P(w,w)\sim P(w)$而不是$P(w|w)\sim P(w)$。
我的意思就是“同一个窗口内,某个词重复出现的概率几乎为0”,所以在统计一个窗口内的“上下文词-中心词”词对时(上下文包括中心词本身),词对$(w, w)$只能出现一次。
这样一来,在整个语料中,近似地:$(w,w)$的频数 = 词$w$的频数。所以$P(w,w)\sim P(w)$。这里$\sim$是正比的关系,不是约等于,因为尽管它们的频数(分子)相同,但是总频数(分母)不一定相同。
July 17th, 2019
关于模长的意义,语义最少的应该是UNK,但是在你的结果里没有看到,不知道是实验时没有UNK 还是结果里UNK靠后呢?(我的结果里是UNK靠后)
为什么语义最少是UNK?是你觉得它语义最少,还是你从理论上严格证明了它语义最少?
May 20th, 2020
苏神,想问一下公式(25)里面的假设是如何得出的呢?为何词向量内积可以转化为概率?
这篇文章介绍的是称为simpler glove的词向量模型,请阅读完整个系列来理解,而不要只阅读本篇。
August 25th, 2020
既然中心词重复出现的概率是不大的,为什么不是$P(w, w)\approx 0$,而是$P(w,w)\approx P(w)$呢?
是重复出现的概率不大,但是自身的概率依然存在啊,自身与自身的共现概率不就是$P(w)$(可能还要加个常数倍)了么?
December 10th, 2020
苏神,这里有两个问题:
1、在实际运用过程中,尤其是长文本,用句向量求和或平均来作为文章向量,不管是获得句子与文章的相似度还是词与文章的相似度,从效果上来看很不好(主要是每篇文章平均或者求和后都非常相似)还不如普通的lcs等结合效果好。
2、高频词在实际运用中都不是关键词(代表文章含义的),主要是因为实际的文章有非常多的噪音(文章结尾很多都是冗余、中间的页眉标题等)且没有规律可训,这样的情况怎么做能够有效的提取出关键词信息?你有什么思路么?非常感谢指点(一直遇到这个问题,只能通过数据预处理过滤一部分。)
你这两个问题都是NLP的难题,都是NLPer的工作重点所在,具体问题具体人工分析,并不是一两个模型就能通解的。
是的呀,绞尽脑汁也没有想到除了在数据预处理阶段操作以外的通用方法,至少让结果‘看起来正确’一些,但是还是很局限;场景数据也是个大杂烩,还拿不到真实的数据o(╥﹏╥)o。我再思考思考,感谢呀~~
August 21st, 2021
苏神,请问下,相关词排序这部分,用两个词的向量范数归一化之后求内积,作为两词的相关性,这是您的 simple_glove 训练出来的词向量的用法吗? 那么原始的 Glove 训出来的词向量可以用这种方式求相关性吗?我理解应该不行,因为要考虑偏置项 $b$ 的影响,不知道这么理解对不对?
理论上推不出来,但其实吧,就算你直接套,也能得到一个类似的结果,不会有什么绝对不可用的可能。