天天看点

递归神经网络 cs224n

语言模型:

词袋模型(BoW)-简单:

一篇文本(文章)被表示成"装着词的袋子",也就是说忽略文章的词序和语法,句法;将文章看做词的组合,文中出现的每个词都是独立的,不依赖于其他词.虽然这个事实上并不成立,但是在实际工作中,效果很好.

如下,在词袋模型BoW中,每个词的数量表示有多种方法:可以表示为0-1(在这篇文章中,这个词出现了没有–词集模型),词频(在这篇文章中,这个词出现了多少次),也可以用tf-idf.

递归神经网络 cs224n

词袋模型在较小数据集上有一定优势,深度学习模型在较大数据库上取得更好的效果。

发现两者其实是极为相似的.在词袋模型中,对底层特征进行特征编码的过程,实际上近似等价于卷积神经网络中的卷积层,而汇聚层所进行的操作也与词袋模型中的汇聚操作一样。不同之处在于,词袋模型实际上相当于只包含了一个卷积层和一个汇聚层,且模型采用无监督方式进行特征表达学习,而卷积神经网络则包含了更多层的简单、复杂细胞,可以进行更为复杂的特征变换,并且其学习过程有监督过程。

短语结构树-复杂:

额外再标注一些诸如指代、语义等标签。

语义合成性

snowboarder 《==》people on the snowboard

就算一个人没见过snowboarder这个单词,他也能明白这与下面这个短语是同一个意思。人们可以用更大颗粒度的文本来表达自己的意思,而不仅仅是词袋中的某个单词。有什么模型可以做到这一点呢?

它希望通过同时学习句法树和复合性向量表示,能够达到将短语映射到词向量空间(这不可能说用vocabulary dict去学习,因为短语的组合是无穷的)

递归神经网络 cs224n

递归神经网络(recursive neural network)

得到一个向量表示,以及得到一个结构得分

最简单的Recursive Neural Network

利用单层的神经网络作为组合函数,向量内积作为打分函数,马上就可以得到一个最简单的RNN:

递归神经网络 cs224n

用RNN分析句子

计算任意两个单词合并的得分(虽然下图是相邻两个,但我觉得那只是绘图方便;就算是我第一次写的玩具级别的依存句法分析器,也是任意两个单词之间计算):

递归神经网络 cs224n

然后贪心地选择得分最大的一对合并:

递归神经网络 cs224n

重复这一过程

递归神经网络 cs224n

直到得到根节点:

递归神经网络 cs224n

Recursive vs. recurrent neural networks

递归神经网络 cs224n

两者都是递归神经网络,只不过前者在空间上递归,后者在时间上递归。中文有时会把后者翻译为“循环神经网络”,但这明显混淆了等级,令人误解。

它们各有各的优缺点,Recursive neural net需要分析器来得到句法树,而Recurrent neural net只能捕捉“前缀”“上文”无法捕捉更小的单位。

但人们还是更倾向于用后者,LSTM之类。因为训练Recursive neural net之前,你需要句法树;句法树是一个离散的决策结果,无法连续地影响损失函数,也就无法简单地利用反向传播训练Recursive neural net。另外,复杂的结构也导致Recursive neural net不易在GPU上优化。

Recursive vs. convolution neural networks

RNN只会为满足语法的短语计算向量,而CNN为每个可能的短语计算向量。从语言学和认知科学的角度来讲,CNN并不合理。甚至recurrent neural network也比tree model和CNN更合理。

两者的关系可以这样想象,RNN将CNN捕捉的不是短语的部分删除了:

递归神经网络 cs224n

得到:

递归神经网络 cs224n

更强的递归神经网络:

  • 改进不同短语结构学习不同的组合函数的神经网络
  • 改进向量为矩阵的神经网络

    详情还是看

    http://www.hankcs.com/nlp/cs224n-tree-recursive-neural-networks-and-constituency-parsing.html

    https://blog.csdn.net/sscc_learning/article/details/78856375

递归神经网络的缺点:

  • 树状的结构,是离散的,每一个节点分离的地方都有可能造成误差传播
  • 尽管递归神经网络具有更为强大的表示能力,但是在实际应用中并不太流行。其中一个主要原因是,递归神经网络的输入是树/图结构,而这种结构需要花费很多人工去标注。想象一下,如果我们用循环神经网络处理句子,那么我们可以直接把句子作为输入。然而,如果我们用递归神经网络处理句子,我们就必须把每个句子标注为语法解析树的形式,这无疑要花费非常大的精力。很多时候,相对于递归神经网络能够带来的性能提升,这个投入是不太划算的。