如何将树结构编码成神经网络的输入?

29

我有一棵树,具体来说是带有节点标签和叶子字符串/单词的解析树。我想将这棵树作为输入传递给神经网络,同时保持其结构。

当前方法 假设我们有一些单词字典 w1,w2.....wn 将在解析树中出现的单词编码为n维二进制向量,当解析树中的单词为wi时,在第i个位置上会出现1

那么树的结构怎么办呢?对于n个叶节点单词,大约有2^n种可能的父标签,所以我们不能设定最大输入单词长度,然后强行枚举所有树。

现在我能想到的方法就是通过选择一个叶子结点的直接父节点来近似表示该树。同样,这也可以用二进制向量来表示,其维度等于不同类型标签的数量 - 大约是 ~100。 我的输入是二维的。第一维只是单词的向量表示,第二维是其父标签的向量表示。

但是这样会失去很多句子的结构。是否有标准/更好的方法来解决这个问题呢?


1
神经网络的目标是什么?NN是否需要生成任何输出? - Matthew Spencer
它基本上从英语输入生成第二种语言,因此目标是尽可能忠实地表示输入中的解析树。 - wemadeit
看起来我计算节点数量时出了错,它是叶子节点数量的线性,所以也许可以采用设置最大树词数的方法,但对于小输入来说效率会非常低下。 - wemadeit
我不知道这个解决方案的所有细节,所以我不会回答,但它可能有所帮助:你可以将k元树编码为数组,这意味着你也可以将它们编码为特征向量。问题在于一般情况下句子长度不固定,因此天真地使用变量维度FV是行不通的。你能否谈谈你正在尝试解决什么问题和/或网络的输出? - Ben Allison
3个回答

5
您需要使用递归神经网络。请参考此存储库的示例实现:https://github.com/erickrf/treernn 递归(而非循环)神经网络的原理如下图所示。它学习每个叶子的表示,然后通过父节点向上移动,最终构建整个结构的表示。enter image description here

2
使用以下方法对每个叶节点进行编码:(i)使用连接它与根节点的节点序列和(ii)前面的叶节点的编码。
对于(i),使用一个循环神经网络,其输入为标签。将根标记、第二级标记等依次馈送到RNN中,最后是父标记或它们的嵌入。将此与叶本身(单词或其嵌入)相结合。现在,您有一个描述叶及其祖先的特征。
对于(ii),也使用一个递归神经网络!从最左边的叶子开始计算上述描述的特征,并将其馈送到第二个RNN中。按从左到右的顺序处理每个叶子。在每个步骤中,第二个RNN将提供代表当前叶子及其祖先、出现在它之前的叶子及其祖先的向量。
可选地,对(ii)进行双向处理,您将获得包含整个树的叶特征!

2
  1. 树形结构编码:可以将其视为递归神经网络,其中一个链可以由for循环构建。但在这里你有一棵树。因此,您需要使用分支进行某种循环。递归函数调用可能会带来一些Python开销。我建议您使用“定义运行”框架(如ChainerPyTorch)构建神经网络以减少开销。因为您的树可能需要针对每个数据样本重新构建,这需要重新构建计算图。阅读Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks,原始的Torch7实现在这里PyTorch实现,您可能会有一些理想。

  2. 对于节点上的标记编码,最简单的方法是像处理单词一样进行编码。例如,节点数据是[单词向量][标记向量]。如果节点是叶子节点,则有单词,但可能没有标记(您没有说叶子节点上有标记),因此叶子数据表示是[单词][零向量](或[单词向量][标记向量])。不具有单词的内部节点的情况=> [零向量][标记向量]。然后,您拥有具有相同数据表示向量维数的内部节点和叶子节点。您可以将它们平等对待(也可以不对待)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接