数学基础
程序员学习人工智能,绕不开的第一道坎就是数学。
最美欧拉恒等式人工智能(机器学习)是一个非常大的领域,那就代表每个人在其中的分工各不相同:有人负责开发模型做优化,那自然对数学要求较高;有人负责产品落地,更多的时间都在处理数据及调用现成的API。
不要把自己埋到无边无际的数学海洋里面去,人生苦短。
本文不打算全面系统地介绍机器学习中的数学知识和概念。只介绍最少的,能够支持机器学习入门的数学知识和概念,更多的数学请在入门后自行恶补。
1. 线性代数
机器学习中大量的用到线性代数,如向量、矩阵计算等。
1.1 标量
一个标量就是一个单独的数,一般用小写的的变量名称表示。
1.2 向量
一个向量就是一列数,这些数是有序排列的。通过序列中的索引,我们可以确定每个单独的数。通常会赋予向量粗体的小写名称。当我们需要明确表示向量中的元素时,我们会将元素排列成一个方括号包围的纵柱。我们可以把向量看作空间中的点,每个元素是不同的坐标轴上的坐标。
向量1.3 矩阵
矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。我们通常会赋予矩阵粗体的大写变量名称,比如A。
矩阵矩阵这东西在机器学习中实在是太重要了!实际上,如果我们现在有N个用户的数据,每条数据含有M个特征,那其实它对应的就是一个N*M的矩阵;再比如,一张图由16*16(256个)的像素点组成,那这就是一个16*16的矩阵了。
N个用户M个特征,也可以说是一张有N行M列的数据库(用户)表。
1.4 张量
线性代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。
例如,可以将任意一张彩色图片表示成一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。将这张图用张量表示出来,就是最下方的那张表格:
图片张量其中表的横轴表示图片的宽度值,这里只截取0~319;表的纵轴表示图片的高度值,这里只截取0~4;表格中每个方格代表一个像素点,比如第一行第一列的表格数据为[1.0,1.0,1.0],代表的就是RGB三原色在图片的这个位置的取值情况(即R=1.0,G=1.0,B=1.0)。
当然我们还可以将这一定义继续扩展,即:我们可以用四阶张量表示一个包含多张图片的数据集,这四个维度分别是:图片在数据集中的编号,图片高度、宽度,以及色彩数据。
张量在深度学习中是一个很重要的概念,因为它是一个深度学习框架中的一个核心组件,TensorFlow的所有运算和优化算法几乎都是基于张量进行的。
2. 微积分
微积分在机器学习中也是无处不在的。
2.1 导数
导数(Derivative)是微积分中的重要基础概念。当函数y=f(x)的自变量x在一点x0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在x0处的导数,记作f'(x0)或df(x0)/dx。
导数简单点说,就是函数的斜率。比如说y=x这个函数,图像你应该很清楚吧,虽然y是随着x的正加而增大的,但是其变化率也就是斜率是一直不变的。那么你能猜出来y=x的导数是多少么?
y=x的导数y'=1,同理y=2x时,则y'=2,这是最简单的。
当函数是2次函数的时候,其斜率会忽大忽小,甚至忽正忽负,这时y'不再是一个固定的数,而是一个根据x值变化的数(说白了也是一个函数)。
不确切的说,导数是变化率、是切线的斜率、是速度、是加速度。
2.2 梯度
在一元函数中,导数就是函数随自变量的变化率。一般一元函数的自变量使用字母x,那么函数f(x)的导数其实就是它在x轴上的变化率。
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。
在多元函数中,自变量是多个标量,或者理解成一个多维的向量。那么,函数随自变量的变化怎么刻画呢?一个方法,就是衡量函数在给定方向上的变化率,这就是方向导数。方向导数的特例,就是函数随各个自变量(标量)的变化率,即函数的偏导数,也就是函数沿各个坐标轴正方向的方向导数。
假如一个多元函数是可微的,它在各个方向上都有方向导数。那么,函数可能在一些方向上增长的快(方向导数的值比较大),一些方向上增长的慢。所有这些方向中,会有一个增长最快的。梯度就是一个向量,其模为这个增长最快的速率(方向导数值),其方向为这个最快增长方向。
3. 损失函数
损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的效果就越好。
例如,线性回归算法用到的平方损失函数。
损失函数4. 凸函数
凸函数就是一个定义域在某个向量空间的凸子集C上的实值函数。
凸函数如果一个函数是凸函数,则其局部最优点就是它的全局最优点。这个性质在机器学习算法优化中有很重要的应用,因为机器学习模型最后就是在求某个函数的全局最优点,一旦证明该函数(机器学习里面叫“损失函数”)是凸函数,那相当于我们只用求它的局部最优点了。
5. 凸优化
机器学习中的大多数问题可以归结为最优化问题。
人在面临选择的时候重视希望自己能够做出“最好”的选择,如果把它抽象成一个数学问题,那么“最好的选择”就是这个问题的最优解。优化问题,就是把你考虑的各个因素表示成为一组函数(代价函数),解决这个问题就是在一集备选解中选择最好的解。
那么,为什么我们要讨论凸优化而不是一般的优化问题呢?那时因为凸优化问题具有很好的性质——局部最优就是全局最优,这一特性让我们能够迅速有效的求解问题。
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。
另外还有牛顿法和拟牛顿法。
5.1 梯度下降
首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
梯度下降本文不对梯度下降做进一步的讲解。
5.2 最小二乘法
最小二乘法,又称最小平方法,是一种数学优化技术。
它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
线性回归所有实际值与预测值(拟合曲线上的点)差的平方求和,越小越好。
最小二乘损失函数5.3 牛顿法
牛顿法的基本思想是利用迭代点处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断重复这一过程,直至求得满足精度的近似极小值。
牛顿法的速度相当快,而且能高度逼近最优值。
牛顿法分为基本的牛顿法和全局牛顿法。
5.3.1 基本牛顿法
基本牛顿法是一种是用导数的算法,它每一步的迭代方向都是沿着当前点函数值下降的方向。
5.3.2 全局牛顿法
牛顿法最突出的优点是收敛速度快,具有局部二阶收敛性,但是,基本牛顿法初始点需要足够“靠近”极小点,否则,有可能导致算法不收敛。这样就引入了全局牛顿法。
5.4 拟牛顿法
拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。
5.5 凸优化小结
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)
从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
6. 继续前行
初步认识上面的概念后,就可以开始机器学习的学习了。
调包侠:现有机器学习算法已经有大量的实现,在工作中,普通程序员只需要在理解概念的情况下调用其提供的API,俗称调包侠。
在后续的学习和工作中,对数学会越来越有感觉,就可以再进一步的根据需要深入学习,以加深对机器学习的理解。
Kevin,2018年4月24日,成都。