Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch

时间:2022-09-10 22:10:25

        本篇文章针对多种自然语言处理的任务:part-of-speech tagging, chunking, named entity recognition, semantic role labeling 建立了一个统一的模型以及相应的学习算法。模型抛弃了原来那种 man-made 的输入特征以及忽略掉了很多的先验知识,而是从大量的无标签的训练数据中学习到更加本质的特征。

        试想,如果我们能有效地将一段文本表示成一种数据结构(尽管这种数据结构的形式并没有一个定论),那么就可以较为容易地从中提取出更为简洁的表示。“These representations can also be motivated by our belief that they capture something more general about language.” 它们能够更好地表示语法和语义的信息。尽管原来那种 ad-hoc 的表示方法尽管在效果上还不错,但是它并不能为我们的目标带来更多的信息。

        “Text corpora have been manually annotated with such data structures in order to compare the performance of various systems. The availability of standard benchmarks has simulated research in NLP and effective systems have been designed for all these tasks.” 本篇文章的方法就是建立在这些任务之上的,为什么没有针对某个单个任务呢,文章中是这样描述的:“Instead we use a single learning system able to discover adequate internal of the internal vrepresentations. In fact we view the benchmarks as indirect measurements of the relevance intermediate representations are more general than any of the benchmarks.” 而且从最后的实验结果来看,文章中的方法在这几个任务上都取得了不错的效果。

        这里引入一些题外话,作者在介绍他们试验中所对比的那些方法中提到了,对于简单的任务来说,在处理方法中添加的人工特征就越少。随着任务难度的不断增加,人工特征的比重会越来越大,同时也变得更加复杂。这也给了我们一些提示,对于那些我们还没有解决的复杂问题,就应该使用一些更复杂的特征。但真的是这样吗?

        整个模型使用的是神经网络,其中第一层的作用是提取出每个单词的特征。之后就是提取出更高层次的特征,这里使用了两种方式,一种就是滑动窗口的方法,另一种就是将整个句子作为输入,两种方法就分别对应着局部和全局的特征。两种结构如下图所示:

Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch         Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch

        在将训练数据中的单词用其对应的词向量替换之后,我们需要将这些特征再进行组合,来为单词打上标签。如何来处理长度不定的序列,这在机器学习中是很常见的问题。这里文章使用了两种方式来解决这一问题:window approach,和 sentence approach。

        window approach 是根据某一个单词以及其附近固定长度范围内的单词对应的词向量来为该单词赋予标签。但这个方法有一个缺点就是,当我们在处理一个句子开始或是结尾部分的单词时,其向前或是向后的窗口中可能并不包含有单词。这时我们就需要利用到填充技术,为其前面或是后面填充上象征开始或是结束的符号。在将特征向量组合完成之后,将其作为输入,输入到神经网络中去。一开始的网络使用的是线性的激活函数,Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch。这种线性网络可能会使用若干层。最后一层网络,会使用非线性激活函数。否则就只是在对特征进行线性变换,这对结果并不会有大的提升。本篇文章中使用的非线性激活函数是:

Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch

最后网络的输出维数与分类的维数是相同的,每一维表示该单词属于该类的可性能。

        window approach 在大多数情况下都能很好地解决问题,但是如果碰到的任务是非常依赖上下文的某一个单词,且该单词并没有出现在窗口范围内,那么该方法就不能取得很好的效果。这里,我们就需要使用到 sentence approach 的方法了。“When using neural networks, the natural choice to tackle this problem becomes a convolutional approach, first introduced by Waibel and also called Time Delay Neural Networks (TDNNs) in the literature.” 这里所使用的卷积操作与卷积神经网络中的卷积操作大同小异。卷积过程如下式所示:

Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch

t 表示需要对句子中的每一个单词进行一次卷积操作,Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch表示卷积窗口的大小。这里也会同样遇到我们在 window approach 中所讨论的那个问题。解决方法还是同样使用填充技术。之后还有一个池化的过程,这里选择的是最大池化。因为句子中大部分的单词对于给定单词的语义是没有任何影响的。将池化过程的输出结果输入到 window approach 中介绍过的线性神经网络中去。

        对于网络的学习,文章中使用的方法是利用随机梯度下降法极大化训练数据的似然函数。在 sentence approach 中,由于使用了最大池化的方法,导致目标函数在某一些点并不可导。我们只需要忽略掉这些不可导的点即可,算法同样还是能够收敛的。在选择模型隐层的单元数时,作者针对不同的任务,以不同隐层数目的模型做了实验,观察其结果,最终“we choose the smallest network achieving "reasonable" performance, rather than picking the network achieving the top performance obtained on a single run.”

        为了使词向量能够包含更多的语义和语法的信息,从而提升其的表达能力,文章使用了大量的无标签数据来提升模型的性能。这里,文章使用了一种称作 pairwise ranking approach 的方法,希望寻找到一种神经网络的结构能够在给出一个合法的序列时获得一个较高的评分,一个不合法的序列则对应着一个较低的得分。“Because the ranking literature often deals with information retrieval applications, many authors define complex ranking criteria that give more weight to the ordering of thr best ranking instances. However, in our case, we don not want to emphasize the most common phrase over the rare but legal phrases.” 以 window approach 这一方法为例,模型的目标函数就变为:

Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch

这里Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch表示在训练数据中,长度为Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch的窗口能够覆盖的所有可能的文本。Deep Learning 读书笔记(十四):Natural Language Processing (almost) from Scratch则表示将窗口中的中心词替换为w。整个式子的含义是希望替换前与替换后的文本的得分差距至少是1。

        采用以上方法来完成整个训练过程可能需要花费数个星期的时间。对于通过“try many combinations of hyperparameters”的方式来加速训练过程显然是不太现实的。当然,可以通过逐步增加字典规模的方式来减少训练时间。因为这样可以使用之前网络的参数来进行初始化,同样也可以使用之前就训练好的词向量。这里在对模型的参数选择时使用了称为“breeding”的方式。假设模型中有k个参数需要被选择,那就建立k个模型,每一个模型使用之前模型的k-1个参数,再重新选择一个参数的值。同时训练这k个模型,再在验证集上进行测试,选择k个参数的最优值。再开始下一轮“breeding”过程。

        文章之后还提到了使用 multi-task learning 的方式将这几个任务放在一起进行学习,对这个并不是特别感兴趣,就不再细说了。