再举一个复杂一点的例子,这样一个偏微分表达式:
用树的形式表示,就是:
采用树的形式,就能消除运算顺序的歧义,照顾优先级和关联性,并且省去了括号。
在没有空格、标点符号、多余的括号这样的无意义符号的情况下,不同的表达式会生成不同的树。表达式和树之间是一一对应的。
第二步,引入seq2seq模型。
seq2seq模型具有两种重要特性:
输入和输出序列都可以具有任意长度,并且长度可以不同。
输入序列和输出序列中的字词不需要一一对应。
因此,seq2seq模型非常适合求解微积分的问题。
使用seq2seq模型生成树,首先,要将树映射到序列。
使用前缀表示法,将每个父节点写在其子节点之前,从左至右列出。
比如 2 3 * (5 2),表示为树是:
表示为序列就是 [ 2 * 3 5 2]。
树和前缀序列之间也是一一映射的。
第三步,生成随机表达式。
要创建训练数据,就需要生成随机数学表达式。前文已经介绍了数据集的生成策略,这里着重讲一下生成随机表达式的算法。
使用n个内部节点对表达式进行统一采样并非易事。比如递归这样的方法,就会倾向于生成深树而非宽树,偏左树而非偏右树,实际上是无法以相同的概率生成不同种类的树的。
所以,以随机二叉树为例,具体的方法是:从一个空的根节点开始,在每一步中确定下一个内部节点在空节点中的位置。重复进行直到所有内部节点都被分配为止。