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

wem*_*eit 24 nlp machine-learning stanford-nlp neural-network deep-learning

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

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

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

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

除此之外,在句子中会失去很多结构.是否有解决此问题的标准/更好方法?

Dav*_*ale 5

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

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

它学习每个叶子的表示,然后通过父母向上,最终构建整个结构的表示. 在此输入图像描述


Hah*_*pro 2

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

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