如何将树编码为神经网络的输入?

时间:2014-09-24 17:22:52

标签: machine-learning nlp neural-network stanford-nlp deep-learning

我有一棵树,特别是一个解析树,在节点上有标签,在树叶上有字符串/单词。我希望将这棵树作为输入传递到神经网络中,同时保留其结构。

目前的做法 假设我们有一些词典w1,w2 ..... wn 将解析树中出现的单词编码为n维二进制向量,只要解析树中的单词为wi,就会在第i个点出现1

现在树结构怎么样?对于出现在叶子上的n个单词,大约有2 ^ n个可能的父标签所以我们不能设置输入单词的最大长度,然后只是暴力列举所有树。

现在,我能想到的是通过选择叶子的直接父亲来近似树。这可以用二进制矢量表示,其尺寸等于不同类型标签的数量 - 我认为约为100。 我的输入是二维的。第一个是单词的向量表示,第二个是其父标记的向量表示

除了这将失去句子中的很多结构。是否有解决此问题的标准/更好方法?

3 个答案:

答案 0 :(得分:5)

您需要递归神经网络。请参阅此存储库以获取示例实现:https://github.com/erickrf/treernn

此图中显示了递归(非递归)神经网络的原理。

它学习每个叶子的表示,然后通过父母向上,最终构建整个结构的表示。 enter image description here

答案 1 :(得分:2)

使用(i)将其连接到根节点的节点序列和(ii)前面的叶节点的编码对每个叶节点进行编码。

对于(i),使用输入为标签的循环网络。将此RNN提供给根标记,第二级标记,...,最后输入父标记(或其嵌入)。将它与叶子本身(单词或其嵌入)结合起来。现在,您有一个描述叶子及其祖先的功能。

对于(ii),也使用经常性网络!首先,计算上面描述的最左侧叶子的特征,并将其馈送到第二个RNN。对从左到右移动的每片叶子继续这样做。在每一步中,第二个RNN将为您提供一个向量,该向量代表当前叶子及其祖先,它前面的叶子及其祖先。

可选地,做(ii)双向,你会得到一个包含整棵树的叶子特征!

答案 2 :(得分:1)

  1. 编码树结构:想想Recurrent Neural Network,你有一条链可以通过for循环构建。但在这里你有一棵树。所以你需要做一些带分支的循环。递归函数调用可能与一些Python开销一起使用。 我建议你用'define by run'框架(比如ChainerPyTorch)构建神经网络,以减少开销。因为您的树可能必须针对每个数据样本进行不同的重建,这需要重建计算图。 阅读Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks,使用原始的Torch7实施herePyTorch implementation,您可能会有一些理想的选择。

  2. 为了在节点处对标签进行编码,我认为最简单的方法就是使用word来编码它们。 例如,节点数据是[字矢量] [标签矢量]。如果节点是叶子,你有单词,但可能没有标签(你没有说叶子节点有标签),所以叶子数据表示是[单词] [零向量](或[单词向量] [标签向量] )。案例内部节点没有word => [零矢量] [标签矢量]。然后,您有内部节点和叶子具有相同的数据表示向量维度。你可以平等对待它们(或不是:3)