而且,据说算法很快就要开源了:
到时候让付费软件怎么办?
巨大数据集的生成姿势
要训练模型做微积分题目,最重要的前提就是要有大大大的数据集。
这里有,积分数据集和常微分方程数据集的制造方法:
函数,和它的积分
首先,就是要做出“一个函数&它的微分”这样的数据对。团队用了三种方法:
第一种是正向生成 (Fwd) ,指生成随机函数 (最多n个运算符) ,再用现成的工具求积分。把工具求不出的函数扔掉。
第二种是反向生成 (Bwd) ,指生成随机函数,再对函数求导。填补了第一种方法收集不到的一些函数,因为就算工具求不出积分,也一定可以求导。
第三种是用了分部积分的反向生成 (Ibp) 。前面的反向生成有个问题,就是不太可能覆盖到f(x)=x3sin(x)的积分:
F(x)=-x3cos(x) 3x2sin(x) 6xcos(x)-6sin(x)
因为这个函数太长了,随机生成很难做到。
另外,反向生成的产物,大多会是函数的积分比函数要短,正向生成则相反。
为了解决这个问题,团队用了分部积分:生成两个随机函数F和G,分别算出导数f和g。
如果fG已经出现在前两种方法得到的训练集里,它的积分就是已知,可以用来求出Fg:
∫Fg=FG-∫fG
反过来也可以,如果Fg已经在训练集里,就用它的积分求出fG。
每求出一个新函数的积分,就把它加入训练集。
如果fG和Fg都不在训练集里,就重新生成一对F和G。
如此一来,不借助外部的积分工具,也能轻松得到x10sin(x)这样的函数了。
一阶常微分方程,和它的解
从一个二元函数F(x,y)说起。
有个方程F(x,y)=c,可对y求解得到y=f(x,c)。就是说有一个二元函数f,对任意x和c都满足:
再对x求导,就得到一个微分方程:
fc表示从x到f(x,c)的映射,也就是这个微分方程的解。
这样,对于任何的常数c,fc都是一阶微分方程的解。
把fc替换回y,就有了整洁的微分方程: