词向量的维度大概多少才够?先说结论,苏剑林大佬给出的估算结果是
$$ n > 8.33 \log N \tag{1} $$
更简约的话可以直接记$n > 8\log N$,其中$N$是词表的大小,$n$是词向量的维度。当$n$超过这个阈值时,就说明模型有足够的容量容纳这$N$个词(当然$n$越大过拟合风险也越大)。这样一来,当$N=100000$时,得到的$n$大约是96,所以对于10万个词的词向量模型来说,维度选择96就足够了;如果要容纳500万个词,那么$n$大概就是128
选择最佳的词向量维度应该是靠反复实验来确定的,所以不能指望理论分析给出非常精确的答案,我们平时用到的词向量维度一般有64、128、256等,不同的维度只见效果差别其实并不大,所以本文仅仅只希望从最简洁直观的方式推导一下一般词向量模型所需要的维度量级
最小熵
我们的出发点是信息熵,我们知道,熵是不确定性的度量,语言本身具有一定的不确定性,而我们在用向量编码词语时,编码结果应该要等于甚至小于这种不确定性,才能保证这种编码是有效的、能充分保留原来语言的信息。所以,我们要消除不确定性,也就是要最小熵
要注意的是,词向量是基于Skip Gram模型的,所以我们要计算的不是词平均熵,而是整个Skip Gram模型的平均熵。假设词对$(w_i, w_j)$的频率是$\tilde{p}(w_i,w_j)$,那么可以估算它的熵为
$$ \tilde{H}=-\sum_{i,j}\tilde{p}(w_i,w_j)\log \tilde{p}(w_i,w_j) \tag{2} $$
不同词向量训练目标也有所差异,有些是在拟合联合概率$p(w_i,w_j)$,有些是在拟合条件概率$p(w_j\mid w_i)$,但这差别不大,前面说了,本文只是想得到一个概数。所以这里统一假设词向量模型为
$$ p(w_i, w_j) = \frac{e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}}{Z},\quad Z = \sum_{i,j}e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle} \tag{3} $$
其中$\boldsymbol{u},\boldsymbol{v}$代表两套不同的词向量(中心词向量、上下文词向量),$\boldsymbol{u}_i$代表词$w_i$,$\boldsymbol{v}_j$代表词$w_j$。这时候它的信息熵是
$$ H=-\sum_{i, j} p(w_i, w_j)\log p(w_i, w_j)=\log Z-\frac{1}{Z}\sum_{i, j} e^{\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle} \langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle \tag{4} $$
$$ \begin{aligned} -\sum_{i, j} p(w_i, w_j)\log p(w_i, w_j)&=-\sum_{i,j} \frac{e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}}{Z}(\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle-\log Z)\\ &= \sum_{i,j} \frac{e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}}{Z}(\log Z-\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle)\\ &= \sum_{i,j} \frac{e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}}{Z}(\log Z - \frac{Z}{Z} \langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle)\\ &= \sum_{i,j} \frac{e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}}{Z}(\log Z - \frac{1}{Z} \sum_{i,j}e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle)\\ &= \log Z - \frac{1}{Z} \sum_{i,j}e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle \end{aligned} $$
近似采样
为了计算上式的近似,我们将求和用采样近似,例如
$$ Z = \sum_{i,j}e^{\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle} = N^2 \times \frac{1}{N^2} \sum_{i,j}e^{\langle \boldsymbol{u}_i,\boldsymbol{v}_j \rangle}\approx N^2 \mathbb{E}_{\boldsymbol{u}_i,\boldsymbol{v}_j}\left[ e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\right] \tag{5} $$
为什么最后会得到一个期望呢,回想一下期望计算的定义,期望等于值乘以对应的概率。这里我们假设每一项$e^{\langle \boldsymbol{u}_i, \boldsymbol{v}_j \rangle}$的概率都是均等的,一共有$N^2$项,所以
$$ \begin{aligned} \frac{1}{N^2} \sum_{i,j}e^{\langle \boldsymbol{u}_i,\boldsymbol{v}_j \rangle} &= \sum_i \frac{1}{N}\sum_j \frac{1}{N} e^{\langle \boldsymbol{u}_i,\boldsymbol{v}_j \rangle}\\ &= \sum_i \frac{1}{N} \mathbb{E}_{\boldsymbol{v}_j} \left[ e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\right]\\ &= \mathbb{E}_{\boldsymbol{u}_i,\boldsymbol{v}_j}\left[ e^{\langle\boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\right] \end{aligned} $$
这里的$N$是词表大小。同理
$$ \sum_{i,j} e^{\langle \boldsymbol{u}_i,\boldsymbol{v}_j\rangle} \langle \boldsymbol{u}_i,\boldsymbol{v}_j\rangle \approx N^2 \mathbb{E}_{\boldsymbol{u}_i,\boldsymbol{v}_j} \left[e^{\langle \boldsymbol{u}_i, \boldsymbol{v}_j \rangle} \langle \boldsymbol{u}_i, \boldsymbol{v}_j \rangle\right] \tag{6} $$
所以我们有近似
$$ H \approx \log N^2 + \log \mathbb{E}_{\boldsymbol{u}_i, \boldsymbol{v}_j}\left[e^{\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\right] - \frac{\mathbb{E}_{\boldsymbol{u}_i, \boldsymbol{v}_j}\left[e^{\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle\right]}{\mathbb{E}_{\boldsymbol{u}_i, \boldsymbol{v}_j}\left[e^{\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle}\right]}\tag{7} $$
分布假设
观察已有的词向量模型,我们可以发现每个维度的数值有正有负,绝对值大小一般也比较均匀。在此,我们不妨假设每个元素的绝对值大概为1,那么每个词向量的模长大致就为$\sqrt{n}$($n$是词向量的维度,也就是我们要估算的目标,如果觉得这个近似不够精确,也可以自行调整),并且进一步假设所有的词向量均匀分布在半径为$\sqrt{n}$的$n$维超球面上,那么$\langle \boldsymbol{u}_i, \boldsymbol{v}_j\rangle=n\cos \theta$,$\theta$是它们的夹角,所以
$$ H\approx \log N^2 + \log \mathbb{E}_{\theta}\left[ e^{n\cos \theta}\right]-\frac{\mathbb{E_{\theta}}[e^{n\cos \theta}n \cos \theta]}{\mathbb{E}_{\theta}[e^{n\cos \theta}]}\tag{8} $$
现在$\theta$相当于$n$维空间中任意两个向量的夹角,而$n$维空间下两个随机向量夹角的分布为
$$ p_n(\theta) = \frac{\Gamma(\frac{n}{2})}{\Gamma(\frac{n-1}{2})\sqrt{\pi}}\sin^{n-2}\theta \tag{9} $$
既然概率密度函数都确定了,那么对于给定的$n$和$N$,近似式(8)是完全可以数值计算出来的,而由$\tilde{H}>H$便可以解出对应的$n$
结果对比
首先我们数值计算出$h_n=\log \mathbb{E}_{\theta} [e^{n\cos \theta}]-\frac{\mathbb{E_{\theta}}[e^{n\cos \theta}n \cos \theta]}{\mathbb{E}_{\theta}[e^{n\cos \theta}]}$的一些结果:
$$ \begin{array}{c|cccccc} \hline n & 32 & 64 & 96 & 128 & 256 & 512\\ \hline h_n & -7.77471 & -15.4734 & -23.1726 & -30.8718 & -61.6692 & -123.264\\ \hline \end{array} $$
那么比如$n=64,N=100000$,就有$H\approx \log 100000^2-15.4734=7.55245$。读者可能会觉得奇怪,当$n=128,N=100000$时,$H$不就是负数了?事实上,这是因为我们在前面的推导过程中,使用了采样近似和精确积分相结合的方式,当空间维数$n$足够大时,就算你采样几十万个样本也不一定能准确估计一些统计量,所以近似采样这一步带来了误差
不过这倒是给我们另外一个确定$n$的思路:当出现$H<0$时,说明$N$个样本已经无法对统计量做很好地估计了,那么反过来说就是此时的$n$维空间要容纳$N$个样本是绰绰有余的。因此,我们可以用$H<0$简单确定一个边界,而不需要去估算$\tilde{H}$(或者从另一个角度想:$\tilde{H}$一定是大于0的,因此$H<0$是$H<\tilde{H}$的充分条件)
最后,我们看到$h_n$关于$n$大概是线性的,$h_n/n\approx -0.24$,因此$H\approx \log N^2 -0.24n$,令$H<0$,我们就可以解出公式(1)了