经典论文阅读---NNLM
- NNLM,是非常经典的NLP论文,这是第一篇将神经网络引入nlp的论文,应该反复咀嚼文中的思想
- 下面以翻译的形式慢慢解读
介绍
1 | A fundamental problem that makes language modeling and other learning problems difficult is thecurse of dimensionality. |
- 上面提到了对语言模型建模的困难:维数灾难
- 文中给出的例子是:假设我们的字典有10万个词语,现在需要对10个词语进行建模,那么这10个词语的概率就是$100000^{10}-1=10^{50} - 1$个参数
- 10个词语,理解为十个盒子,每个盒子放进一个词语,有10万种情况;每个情况,都是一个概率值,也就是参数
1 | First, it is not taking into account contexts farther than 1 or 2 words, |
- 所以以往的模型通常会有上面两个问题,即不关心一两个词的作用、不关心词与词之间的关系
怎么解决维数灾难
- 整篇文章所提出的方法思想
1 | 1. associate with each word in the vocabulary a distributed word feature vector (a real valued vector in Rm), |
- 将每个word(词语),用一个实数的向量来表示,这个向量就是一个
distributed word feature
- 用序列中的特征向量来表示,序列中的词的联合概率
- 同时学习特征向量,概率方程的参数
- 最重要的是:这些特征向量,代表了向量空间中的一个点
- 这里的变化就是,原来的每个词,都是一个$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
- 本文在上述的公式中,分解成两个部分
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.
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负责的参数
未来的发展
- 文中在最后提到了以下几个地方需要改进
- 将网络分解成几个子网络
- 用树结构来表示条件概率,神经网络应用到每个结点上,结点代表给定文章的情况下,词语的类别的概率(应该说,这个词是字典中某个词的概率);叶子代表,给定文章的情况下,词语的概率(没看懂是什么意思)
- 只从输出词语的子集传播梯度,也没看懂这是啥意思
- 使用先验信息,咋用?
- 使用更高的维度($m$增大),来表示词语的信息
- 多义词的问题,本文的想法是,每个词都是连续的语义空间中的一个点;但是一个词会有多种意思啊,怎么表达呢?这里bert做得比较好,结合上下文,进行微调。