• NNLM,是非常经典的NLP论文,这是第一篇将神经网络引入nlp的论文,应该反复咀嚼文中的思想
  • 下面以翻译的形式慢慢解读

介绍

1
2
3
4
5
6
A fundamental problem that makes language modeling and other learning problems difficult is thecurse of dimensionality. 

It is particularly obvious in the case when one wants to model the joint
distribution between many discrete random variables

(such as words in a sentence, or discrete attributes in a data-mining task).
  • 上面提到了对语言模型建模的困难:维数灾难
  • 文中给出的例子是:假设我们的字典有10万个词语,现在需要对10个词语进行建模,那么这10个词语的概率就是$100000^{10}-1=10^{50} - 1$个参数
    • 10个词语,理解为十个盒子,每个盒子放进一个词语,有10万种情况;每个情况,都是一个概率值,也就是参数
1
2
First, it is not taking into account contexts farther than 1 or 2 words,
second it is not taking into account the “similarity” between words.
  • 所以以往的模型通常会有上面两个问题,即不关心一两个词的作用、不关心词与词之间的关系

怎么解决维数灾难

  • 整篇文章所提出的方法思想
1
2
3
4
5
1. associate with each word in the vocabulary a distributed word feature vector (a real valued vector in Rm),
2. express the joint probability function of word sequences in terms of the feature vectors
of these words in the sequence, and
3. learn simultaneously the word feature vectors and the parameters of that probability
function.
  1. 将每个word(词语),用一个实数的向量来表示,这个向量就是一个distributed word feature
  2. 用序列中的特征向量来表示,序列中的词的联合概率
  3. 同时学习特征向量,概率方程的参数
  • 最重要的是:这些特征向量,代表了向量空间中的一个点
  • 这里的变化就是,原来的每个词,都是一个$V$维的向量,现在变成了$m$维的向量
    • 注意通常情况下,$m$远远小于$V$,比如bert里面是$m = 712$,但字典是$V = 21128$
    • 这里就起到了降维的作用
    • 换句话说,这里的$m$越大,代表了参数空间越大,那么每个词在空间中的距离会越远,也就是越能区分出每个词,所以在bert的embedding size越大的时候,效果越好
    • 那么问题来了:$m$大到什么时候,效果见顶?
  • 每个向量,都代表了一个词语;那么,其实每个向量都用先验知识来初始化
    • 这里,主流的模型都是随机初始化的,放弃了先验知识
    • 比如word2vec的向量去初始化bert的词向量,效果不佳,这是为什么呢?
  • 相似的词语,会用相似的向量

神经网络的设定

  • 文章中假定序列为$w_1 \dots w_T$,其中每个$w_t$都是字典$V$的词语。这个词典很大,但是都是有限的集合
  • 通常来说,我们是要学习$f(w_t, \dots, w_{t-n+1}) = \hat{P}(w_t | w_{1}^{t-1})$,在这个意义上,给出了很高的似然
    • 文中的话是,it gives high out-of-sample likelihood
    • 个人的理解是,这个方程在样本外(测试集的意思?)上,给出了很高的可能性,就是在测试集上的输出的序列,很有可能是正确的
  • 文章用ppl来衡量,就是$1 / \hat{P}\left(w_{t} \mid w_{1}^{t-1}\right)$,即概率的倒数,概率越大,ppl越小
  • 对于上面的公式,唯一的限制就是,概率和要为1
  • 本文在上述的公式中,分解成两个部分
  1. A mapping $C$ from any element $i$ of $V$ to a real vector $C(i) \in \mathbb{R}^{m} .$ It represents the distributed feature vectors associated with each word in the vocabulary. In practice, $C$ is represented by a $|V| \times m$ matrix of free parameters.

  2. The probability function over words, expressed with $C:$ a function $g$ maps an input sequence of feature vectors for words in context, $\left(C\left(w_{t-n+1}\right), \cdots, C\left(w_{t-1}\right)\right)$, to a conditional probability distribution over words in $V$ for the next word $w_{t} .$ The output of $g$ is a vector whose $i$ -th element estimates the probability $\hat{P}\left(w_{t}=i \mid w_{1}^{t-1}\right)$ as in Figure 1 .

  • 上面的分解可以用下面的公式表达
  • 上面的$i$是指,序列中第$i$个位置;本文的分解,将$f$分成了两个$g$和$C$
  • figure 1长下面这样

  • 这里要弄懂公式建模的含义
  • 这里是长度为$n$的句子,每个词为$z_i$,有的地方会用$w_i$来表示,都是一样的含义
  • 上面的公式的意思是:
    • 整个句子的概率,$P(z_1, \dots, z_n)$
    • 可以写成条件概率的乘积
    • 注意这里的条件概率,只用到了$z_i$之前的词语

模型结果

  • 模型公式:
  • 公式中的$x$就是词向量矩阵,输入一个词$w$,通过look-up table(就是embbeding)得到词向量
  • 将词向量拼接在一起,经过一个线性变换$H$,维度为$h\times(n-1)m$
  • 最后输出的向量,经过tanh激活函数,再通过一个线性变换,输出每个词的概率
  • $U$的维度为,$|V| \times h$
  • 注意公式中还有一个$W$,这个权重可以为0,所以上面的图中,有虚线

细节

  • weight decay
  • 层次softmax
  • 使用了schedule,公式为$\mathcal{E}_{t}=\frac{\varepsilon_{o}}{1+r t}$,其中$\varepsilon$是学习率,$t$是某个step,$r=10^{-8}$,$r$只是一个控制学习率的参数

  • 对oov的做法:假设在序列中,刚好第$n$个词是OOV的

    • 文章中的做法是,计算出这个词,前面几个词的概率$\hat{P}\left(i \mid w_{t-n+1}^{t-1}\right)$
    • 使用这几个词的概率来初始化新词,$C(j) \leftarrow \sum_{i \in V} C(i) \hat{P}\left(i \mid w_{t-n+1}^{t-1}\right)$
    • 意思就是,用上面的网络计算出前面几个词的概率,把概率当成权重,把词向量加权作为新词的向量

并行处理

  • 没想到03年就已经使用了CPU并行处理
  • 文中提到了n-gram模型更容易计算,是因为计算概率$P\left(w_{t} \mid w_{t-1}, \ldots, w_{t-n+1}\right)$的时候,不需要计算字典中每个词的概率,只需要线性组合相关的频率(这是什么意思,怎么组合?)
  • 本文中的计算瓶颈在于,输出层的激活这部分
  • 文中使用了共享内存的并行机制,即每个processor(进程的意思)处理不同的子数据;每个进程计算各自样本的梯度,使用随机梯度来更新参数;这些参数存储在共享内存中
  • 最开始使用了synchronization,即同步命令,但是这个发现大部分时间都花在了,等待最后一个processor上
  • 继而使用了asynchronous implementation,异步措施:每个processor都可以在任意时间,往共享内存中写数据。这里会有问题,即更新参数时,某些processor的参数会被重复写入,但是这个影响不大(没看懂)
  • 后面又用了parameter-parallel processing的做法:每个CPU只负责计算输出的一部分,并只更新该CPU负责的参数

未来的发展

  • 文中在最后提到了以下几个地方需要改进
  1. 将网络分解成几个子网络
  2. 用树结构来表示条件概率,神经网络应用到每个结点上,结点代表给定文章的情况下,词语的类别的概率(应该说,这个词是字典中某个词的概率);叶子代表,给定文章的情况下,词语的概率(没看懂是什么意思)
  3. 只从输出词语的子集传播梯度,也没看懂这是啥意思
  4. 使用先验信息,咋用?
  5. 使用更高的维度($m$增大),来表示词语的信息
  6. 多义词的问题,本文的想法是,每个词都是连续的语义空间中的一个点;但是一个词会有多种意思啊,怎么表达呢?这里bert做得比较好,结合上下文,进行微调。