微积分运算在机器学习领域扮演着至关重要的角色,
它不仅是许多基础算法和模型的核心,还深刻影响着模型的优化、性能评估以及新算法的开发。
掌握微积分,不仅让我们多会一种计算方式,也有助于理解各种机器学习算法和模型是如何寻找最优参数的。
也许有些人会觉得微积分很难,这大概是因为我们平时基本都是在计算固定的东西(用加减乘除就够了)。
比如:
而对于不断变化的事物,我们发现用传统的计算方式很难精确的描述,
比如:
微积分本质上就是一种运算方式(类似加减乘除,指数,对数等等运算),
与其他运算方式相比,它的优势在于可以精确的描述事物的变化。
微积分其实包括微分和积分两种运算,它们互为逆运算,就像加法与减法,乘法与除法。
微分研究函数在某一点附近的变化率,而积分研究函数在某一区间上的累积效应。
平时我使用较多的是微分,也被称为求导数。
微积分的诞生还有一段“斗争”,当年,牛顿和莱布尼茨都宣称自己先发明了微积分,虽然最终牛顿胜出,但二位都是非常伟大的科学家。
由此也可见当时欧洲的科技已经发展到相当的程度,才会在科研中迫切的需要微积分这种新的运算方式。
下面通过一个速度与时间关系的示例来看看最终微积分如何帮助我们精确计算变化的。
首先,对于两个匀速运动的物体,
时间(\(t\)) | 速度(\(v_1\)) | 速度(\(v_2\)) |
---|---|---|
0 | 5 | 8 |
1 | 5 | 8 |
3 | 5 | 8 |
5 | 5 | 8 |
10 | 5 | 8 |
匀速的情况下,速度不变,一眼就能看出谁快谁慢,并不需要微积分。
接下来,看看匀变速的情况:
时间(\(t\)) | 速度(\(v_1\)) | 速度(\(v_2\)) |
---|---|---|
0 | 0 | 0 |
1 | 2 | 3 |
3 | 6 | 9 |
5 | 10 | 15 |
10 | 20 | 30 |
其中\(v_1=2t\),\(v_2=3t\)。
在这种情况下,我们依然可以看出两个物体谁快谁慢,也可以计算出它们的加速度分别为2
和3
,不需要微积分。
最后,看看非匀变速的情况,这也是最接近实际的情况。
如果你有实际驾驶的经验就能理解,行驶过程中几乎不可能保持匀速或匀变速,影响车速的因素各种各样,你能控制的油门仅仅是其中之一。
模拟两个非匀变速的情况:
时间(\(t\)) | 速度(\(v_1\)) | 速度(\(v_2\)) |
---|---|---|
0 | 0 | 0 |
1 | 10 | 1 |
3 | 90 | 27 |
5 | 250 | 125 |
其中\(v_1=10t^2\),\(v_2=t^3\)。
这下,没那么容易看出哪个速度增加的快了吧?这两个物体在某一时刻的加速度也不是那么容易计算了吧?
从图中虽然可以看出,10秒之前,\(v_1\)比\(v_2\)快,10秒之后,\(v_2\)比\(v_1\)快。
但是\(v_1\)和\(v_2\)哪个增长的快?即使从上面的图中也不是那么容易看出。
这时,通过微积分就能看出谁变化的快了。
微分的计算规则下一节介绍,这里先看下微分的结果:\(v_1^{'} = 20t\);\(v_2^{'}=3t^2\)。
对速度微分的结果就是速度变化的情况:
微分之后,就能精确的看出2个速度的变化情况:
从上例可以看出,对于复杂的变化情况(非均匀变化),
通过微分可以快速找出变化的规律,从而可以精确的计算每个时间点的实际数值。
微分的计算虽然没有加减乘除那么直观,但是也不复杂。
对于多项式,微分的规律如下:其中\(a\)是常数;\(n\)是变量\(x\)的指数。
其他特殊的函数(比如三角函数,对数函数等等)可以参考维基百科的微分表:
https://en.wikipedia.org/wiki/Differentiation_rules
微分运算法则中,有一个很有用的特性,称为链式法则。
当需要计算嵌套函数的微分时,这个法则非常有用,比如:
一种方式是将\(y\)的多项式代入\(f\)函数中:
另一种方式就是链式法则,
函数\(f\)对\(x\)求导,可以转换为\(f\)对\(y\)求导与\(y\)对\(x\)求导的积。由此可得:
两种方式的计算结果是一样的,
不过,如果函数\(f\)和\(y\)都非常复杂的话,运用链式法则,可以极大的简化微分运算。
在机器学习的算法中,公式中不可能只有一个变量\(f(x)\),基本都是多个变量\(f(x_0,x_1,...,x_n)\)的情况。
在这种情况下,怎么计算函数\(f\)中各个变量的变化趋势呢?
这就用到了偏微分(也称为偏导数),也就是函数\(f\)对其中一个变量求导数。
了解了微分的计算方法,那么偏微分的计算就很简单了。比如一个含有两个变量的函数:
那么,对\(x_0\)和 \(x_1\)分别求导数的结果如下:
简单来说,对\(x_0\)求导数时,把\(x_1\)当成常数看待;对\(x_1\)求导数时,把\(x_0\)当成常数看待。
通过偏微分计算,我们就能发现哪个变量变化时对函数\(f\)的结果影响最大。
对应的场景就是机器模型(\(f\))中,哪个属性(\(x_0, x_1\))对模型的结果影响最大。
对于偏微分,也可以从图像上来看,不过超过3个维度的图像无法绘制,所以只能绘制带有2个参数的函数。
绘制上面示例中函数:\(f(x_0,x_1)=x_0^{2}+2x_0x_1+3\)
然后分别对\(x_0,x_1\)求偏微分,对\(x_0\)的偏微分为:\(f^{'}(x_0)=2x_0+2x_1\)
\(x_1\)取不同的值时,偏微分的图像为:
从图中可以看出,偏微分\(f^{'}(x_0)\)的变化率是线性增长的,\(x_1\)只是影响它的起始值。
如果把\(f(x_0,x_1)=x_0^{2}+2x_0x_1+3\)看成一个机器学习模型,
那么随着属性\(x_0\)的增大,\(x_0\)对模型的影响越来越大。
对\(x_1\)的偏微分为:\(f^{'}(x_1)=2x_0\),\(x_0\)取不同的值时,偏微分的图像为:
从图中可以看出,偏微分\(f^{'}(x_1)\)的变化率是固定的,\(x_0\)决定它的变化率是多少。
如果把\(f(x_0,x_1)=x_0^{2}+2x_0x_1+3\)看成一个机器学习模型,
那么随着属性\(x_1\)对模型影响的大小是稳定的,影响多大取决于\(x_0\)的取值。
我平时接触的机器学习算法中,微分使用的比较多,所以这里只介绍了微分的相关运算,积分是微分的逆运算,这里不再赘述。
对于复杂函数的积分,也有积分表可以查询(https://en.wikipedia.org/wiki/Lists_of_integrals)。
最后,总结下在哪些机器学习算法中会遇到微积分的运算。
PCA
)和线性判别分析(LDA
),微积分被用于计算数据的协方差矩阵、特征值、特征向量等,从而帮助识别出最重要的特征或降低数据的维度。