社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习会取代数学建模吗?让我们假设一个微积分落后但深度学习发达的文明社会……

程序猿 • 2 年前 • 290 次点击  

来自公众号:大数文摘出品

来源:andrewmellor

编译:高延、fuma、钱天培

对于那些擅长于用微分方程、概率论解决问题的数学家们来说,素有“黑盒子”之称机器学习往往是要被踢到鄙视链底端的。


但是,在与各行各业中,绝大多数公司(小到初创公司,大到国际巨鳄)都在寻求运用机器学习的方法。随着企业不断地将机器学习融入其文化与组织中,这事也变得越来越普遍。


有意思的是,在本科和硕士教育中,数学专业内部居然也都弥漫起了机器学习的热潮。举例说,牛津大学的“深度学习理论”硕士课程在其设立的第一年就被超额报名。


更惊人的是,很多数学博士生打算将机器学习嵌入到它们的研究课题中,从而形成将“传统”(ODE和PDE)和“现代”(深度学习)相结合和新型混合模型。


所以,机器学习是否会最终取代数学建模?


如果数学模型在科研领域无法突破,我们最终是否会使用机器学习的方法来获得建模上的进展呢?


当然不是!我认为,机器学习和数学模型应当是互补的关系——充分结合二者的力量一定会产生有趣的新模型。


为了说明我的观点,我构想了一个例子,让我们开启一趟科技文明之旅!在这个虚构的文明中,机器学习相当发达,然而这个文明的数学却糟糕得很,尤其是还不会微积分。


一个虚构的文明



假设我们正处于一个微积分落后但深度学习发达的科技文明中。


和大多数文明一样,它们都致力于用炮弹攻击自己的对手。两位来自同一阵营的科学家在对他们刚发行的大炮的攻击范围进行建模。


科学家可以控制下列因素:

  1. 大炮里装载的弹药总量(例如炮弹的发射速度)

  2. 大炮的角度

科学家可以测量下列内容:

  1. 弹丸从大炮中射出去的直线距离。


*假设地面完全水平。


从数学的角度上,他们希望找到一个模型/函数F,这个函数能基于所有速度v和角度θ进行预测。

s=F(v,θ)


使得这个结果接近于真实的行进距离。


由于没有炮弹在空中移动的相关知识储备,科学家们采用了数据驱动的方式。


数据采集


科学家们用一天的时间来以各种火力及角度进行大炮射击。每次他们点火发射,他们都会测量发射点和炮弹终点间的距离。但是,他们的测量结果并不完全精确,每次测量都会引入一些误差。


在那一天的时间中,他们打算发射1000次炮弹,产生1000个三元数组(vi,θi,si),其中θi是弧度制的。


这些数据点分布如下图所示:


不用模型的方法


解决问题的最简单方法就是不使用模型,因为数据就能化身为模型!在这种方法中,他们选用那些最接近于他们想预测的情景的历史数据,使用这些历史数据当作预测模型(即KNN模型)。例如:


这种纯数据驱动的方式有着明显的缺点。如果他们获得的数据不能覆盖所有的输入可能性,或者数据过于稀疏,这种方式就会产生问题。在这个例子中,如果要预测速度大于10的射击距离,没有模型的话他们就无法进行精准预测。



基于线性模型的方法


从数据看来,他们期望的函数是非线性的,而且线性模型不可能将结果预测得很准确。但是,线性模型并非完全没有价值,在很多应用场景下它是一种基础模型,所以这两位科学家决定先用个线性模型试试。


线性模型的数学表达如下:


在表达式中,wi∈R是权重,b∈R是偏移项,这些值都会被确定下来。我们用PyTorch实现线性模型,并使用随机随机梯度下降法(当然还有其他更好更简单的方法)寻找模型参数。




正如预期的那样,建模结果非常糟糕。


“黑盒”登场——深度神经网络


科学家们在机器学习研究和计算框架设计方面投入了大量资金,因此他们在面对问题时喜欢以深度神经网络的方式构想解决方案。说白了就是,他们喜欢使用多层感知器系统,它包含有多个线性层,层与层之间靠非线性激活函数相连。模型可以按如下形式描述:



我们用Adam optimizer对模型进行训练,结果如下:


对于在这方面没有经验的人,在看到神经网络的预测结果的时候,基本都会感到惊叹!至今为止,这也是深度学习流传盛广的主要原因——它不但有用,且效果显著。只是我们并不知道为什么。


用数学语言刻画“准线性方法”


在上述的黑匣子模型中,科学家们有一个能够准确预测大炮射击距离的模型,但顾名思义,他们对模型的形式没有直观理解。科学家们热衷于在使用机器学习方法的同时恢复这种直观理解,并重新使用线性模型。


我们高中的时候都学过三角函数,科学家们认为这个问题可能会涉及一些三角函数与速度的乘积。于是他们把模型写成非线性基函数的线性组合:




把非线性嵌入到线性模型之后,模型可以像线性模型一样计算参数。优化后,模型为:


在这种情况下,除了sin(2θ)的参数,优化将其他所有参数归零


将F与数据进行比较,他们发现模型非常具有预测性。不仅如此,模型的公式短小精练!当然,他们能选中三角函数也是非常“幸运”了。


数学方法——无数据模型


很多年后,微积分终于被发现了!于是,两位老科学家开始重新审视这个问题。


1.假设方程


低速炮弹的物理模型非常简单。炮弹有垂直向下的重力加速度,恒定为-g。由于在x方向上没有作用在射弹上的力,它始终保持其初始速度。该模型可以写成二阶微分方程组:


初值条件为:


后两个方程式描述了炮弹最初发射时的速度的水平和垂直分量。这些方程描述了系统,但如何解决这些问题呢?


2.数值积分


通常在数学中,写下微分方程是一个简单的部分,大部分时间都花在试图解决它们上面!


他们写出了该问题的一阶常微分方程(ODE):


初值条件为:


易证这两个方程相同。


积分在数学中无处不在,有多种方法来进行数值积分。最简单和最直观的方法是欧拉方程,它从初始点开始,并在该点的梯度方向上走一小步,即:


使用数值积分,可以准确地预测炮弹的整个轨迹。


着陆点的位置是x(t*),它们可以从预测的轨迹中提取。


相比于机器学习模型,这一数学模型的一个明显优势是,我们可以很轻易地解决更复杂的问题——例如不平坦的地面,或者从塔上发射炮弹(y(0)≠0)


3.直接求解


最后,两位科学家使用了积分来求解,事实证明问题并非如此困难。x和y的方程可以独立求解。通过求解每个方程(并应用初始条件)给出。


他们以x和y坐标作为时间的函数。什么时候射弹击中了地面呢?当y=0时!即:


求解t*=0(大炮射击之前),并求解t*=2vsinθg(当它击中地面时)。将第二个t*值插入到x的等式中,得到最终的行进距离,等于:


那么他们的最终预测模型就是


他们发现这与准线性方法吻合。实际上,准线性方法也给出了他们对引力常数的估计。


神经常微分方程方法-学习动力系统


最后,假设他们不知道物理模型,只有一个常微分方程系统


其中f1和f2是未知的(为简洁起见省略虚拟变量)。


NIPS最近发表的一篇论文(https://papers.nips.cc/paper/7892-neural-ordinary-differential-equations)提出了一种学习常微分系统的方法。简而言之,它通过用神经网络替换f1,f2并数值积分神经网络来获得轨迹来实现这一点。学习可以正常进行,因为数值积分方法具有明确定义的梯度。在他们的例子中,如果科学家可以随时间跟踪炮弹的位置,即数据(xi,yi,ti),那么他们原则上可以恢复物理模型并了解物体随着时间的推移而下降加速。这是一个令人兴奋的深度学习新应用,它开启了学习系统行为的可能性,而不是简单地学习它们的输出。


我们学到了什么?


我们生活在一个幸运的年代,可以通过数百种不同的方式解决一个简单的问题。此外,在上述“黑盒”方法中,我们也可以将神经网络换成其他模型,并用上其他的优化方法。这突出了机器学习在数学中的作用——它是我们用以理解世界和做出预测的许多强大工具之一。


数学家对数学模型是可解释的,是直观的,而深度学习模型正好相反。在我举的例子中,构建数学模型并用机器学习填补空白(比如估测引力常数)可以带来更好的准确性和更快的计算。


如果我们能够尽可能多地融入物理理论,并利用机器学习来填补我们的知识空白,那么我们就有机会解决更复杂的问题。通常机器学习用于参数拟合,但在混合模型中,我们也可以用它来预测更复杂系统中的函数组成部分。


我相信,随着理论和技术的进步,我们将在未来看到许多混合模型。因此,数学建模和机器学习建模也应当是“合作关系”,而非“竞争关系”。


相关链接:

https://andrewmellor.co.uk/blog/articles/2019/05/09/machine-learning/



--- EOF ---


推荐↓↓↓
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/119733
 
290 次点击