1.人工智能的数学基础
Posted data-master
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.人工智能的数学基础相关的知识,希望对你有一定的参考价值。
目录
这部分内容属于大学以及考研的数学基础,如果这部分有不了解的部分,可以先去b站听一些相关的基础课程,这边我只强调一些较为重要的部分。
1.高数
1.1梯度问题:
梯度和导数是密切相关的一对概念,实际上梯度是导数对多元函数的推广,它是多元函数对各个自变量求偏导形成的向量。中学时,我们接触“微分”这个概念是从“函数图像某点切线斜率”或“函数的变化率”这个认知开始的。梯度实际上就是多变量微分的一般化,例如:
对该函数求解微分,也就得到了梯度:
梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。用人话说,就是如果按照梯度方向变化,函数值变化最大,梯度下降就是按照这个原理来的。
1.2凸函数问题与梯度下降
优化问题可以分为凸优化问题和非凸优化问题,非凸优化问题相对凸优化问题来说要困难得多,一个问题如果可以表述为凸优化问题,很大程度上意味着这个问题可以被彻底解决,而非凸优化问题常常无法被解决。因此,凸优化在数学规划领域具有非常重要的地位。凸优化问题是指定义在凸集中的凸函数最优化的问题,它在机器学习领域有十分广泛且重要的应用,典型应用场景就是目标函数极值问题的求解。凸优化问题的求解目前已经较为成熟,所以当一个极值求解问题被归为凸优化问题时往往意味着该问题是可以被求解的。凸优化问题的局部最优解就是全局最优解,因此机器学习中很多非凸优化问题都需要被转化为等价凸优化问题或者被近似为凸优化问题。(啥叫凸优化,举个最简单的例子就是一个典型的 凸函数,可以找到最优解,找解的过程就是凸优化)
1.2.1凸集与凸函数
凸集表示一个欧几里得空间中的区域,这个区域具有如下特点:区域内任意两点之间的线段都包含在该区域内;更为数学化的表述为,集合C内任意两点间的线段也均在集合C内,则称集合C为凸集。
上图中a,b,c满足凸集要求,d不满足,d中并不是所有点的欧式距离都在都在被线段分割出来的集合当中。
那么啥是凸函数,先看一个冰冷的公式:
凸函数是一个定义在某个向量空间的凸子集C(区间)上的实值函数f,而且对于凸子集C中的任意两个向量,如果则f(x)是定义在凸子集C中的凸函数。实际上,如果某函数的上镜图(函数曲线上的点和函数曲线上方所有的点的集合)是凸集,那么该函数就是凸函数。为了方便快速理解直接上图。
a凸,b非凸
可以发现:凸函数图像任意两点连接而成的线段与函数没有交点。通常,我们可以考虑使用这条规则来快速判断函数是否为凸函数。从图中我们就可以看出凸函数的局部极小值就是全局最小值。这样,我们就可以利用这条性质快速找到问题的最优解。机器学习中有很多优化问题都要通过凸优化来求解,另外一些非凸优化问题也常常被转化为凸优化问题来求解。
a凸曲面,b非凸曲面
如果我们将一颗弹珠扔到曲面中,会出现不同的情况。当函数是凸函数时[(a)所示的凸曲面],无论弹珠起始位置在何处,弹珠最终都会落在曲面的最低点,而这个极小值恰好是全局最小值。当函数是非凸函数时[(b)所示的非凸曲面],弹珠仍然会落在曲面的某个低点,但这个极小值不能保证是全局最小值。
上述弹珠下降的过程跟梯度下降的最优化算法思想是类似的,这也正是我们“热爱”凸函数的原因。实际上,学术界对于非凸优化的优化问题也没有一个很好的通用解决方法,所以我们定义损失函数的时候尽量将其定义为凸优化问题或者转化为等价凸优化问题,这样有助于问题的求解。
1.2.2梯度下降
机器学习算法都可归结为凸优化问题的求解,梯度下降法是最简单、也是最常见的一种最优化问题求解方法。机器学习中一般将凸优化问题统一表述为函数极小值求解问题,即minf(x)。其中x是需要被优化的变量,f为目标函数。如果碰到极大值问题,则可以将目标函数加上负号,从而将其转换成极小值问题来求解。目标函数的自变量x往往受到各种约束,满足约束条件的自变量x的集合称为自变量的可行域。
梯度下降法是一种逐步迭代、逐步缩减损失函数值,从而使损失函数值最小的方法。如果把损失函数的值看作一个山谷,我们刚开始站立的位置可能是在半山腰,甚至可能是在山顶。但是,只要我们往下不断迭代、不断前进,总可以到达山谷,也就是损失函数的最小值处。例如,假设一个高度近视的人在山的某个位置上(起始点),需要从山上走下来,也就是走到山的最低点。这个时候,他可以以当前位置点(起始点)为基准,寻找这个位置点附近最陡峭的地方,然后朝着山的高度下降的方向走,如此循环迭代,最后就可以到达山谷位置。
首先,选取任意参数(ω和b)值作为起始值。刚开始,我们并不知道使损失函数取得最小值的参数(ω和b)值是多少,所以选取任意参数值作为起始值,从而得到损失函数的起始值。
其次,明确迭代方向,逐步迭代。我们站在半山腰或者山顶,环顾四周,找到一个最陡的方向下山,也就是直接指向山谷的方向下山,这样下山的速度是最快的。这个最陡在数学上的表现就是梯度,也就是说沿着负梯度方向下降能够最快到达山谷。
最后,确定迭代步长。下山的起始点知道了,下降的方向也知道了,还需要我们确定下降的步长。如果步长太大,虽然能够更快逼近山谷,但是也可能由于步子太大,踩不到谷底点,直接就跨过了山谷的谷底,从而造成来回振荡。如果步长太小,则延长了到达山谷的时间。所以,这需要做一下权衡和调试。(太短学的慢,太长容易跨过最优处)
上述梯度下降的过程中有个问题需要特别注意,就是当我们沿着负梯度方向进行迭代的时候“每次走多大的距离”,也就是“学习率”的大小是需要算法工程师去调试的;或者说,算法工程师的一项工作就是要调试合适的“学习率”,从而找到“最佳”参数。(学习率也被称为迭代的步长)
1.2.3梯度下降的参数求解
梯度下降是一种求解凸函数极值的方法,它以损失函数作为纽带,损失函数是模型预测值与训练集数据真实值的差距,它是模型参数(如ω和b)的函数。这里需要注意区分一个细节,损失函数有时候指代的是训练集数据中单个样本的预测值与真实值的差距,有时候指代的则是整个训练集所有样本的预测值与真实值的差距(也称为成本函数)。
例如训练集有100个样本,那么参数求解的过程中模型会对这100个样本逐一预测并与其真实值比较。根据损失函数可以求得每个样本的预测偏差值。有时候某组模型参数(如ω和b)使得其中某个样本(如1号样本)损失函数值最小,但可能导致其他样本(如2号样本、3号样本等)损失函数值很大,所以我们不能只看一部分样本的损失函数值就决定模型参数,而应该考虑总体情况。成本函数描述的就是样本总体的预测偏差情况,它可以是各个样本损失函数值之和,也可以是各个样本损失函数值之和的平均值。
所以损失函数描述的是个体预测值与真实值的差距,成本函数描述的是总体预测值与真实值的差距,但由于两者本质上一致且只在引入样本数据进行模型实际求解的时候才需要严格区分,因此大部分图书中并未严格区分两者,往往都是用损失函数来统一指代。
1.2.4梯度下降步骤
首先看一下梯度下降的迭代公式:
任意给定一组初始参数值,只要沿着损失函数J()的梯度下降方向前进一段距离a,就可以得到一组新的参数值。这里的和对应到机器学习中就是指模型参数(如ω和b)。
来看一个实际的案例:
根据微积分的知识很容易知道损失函数在点(0,0)处取得最小值。接下来,我们就通过该例子来体会梯度下降法如何一步一步找到(0,0)这个最佳参数值,从而使得损失函数在该点取得最小值。
假设参数的起始值:初始学习率为a=0.1
由此可以知道该点(4,-2)的函数梯度为:
开始迭代:
1.2.5迭代的终止条件
- 设置阈值。设置一个迭代结束的阈值,当两次迭代结果的差值小于该阈值时,迭代结束。(就是两者的函数值变化在阈值之内,变化很小可以认为基本趋向于极值)
- 设置迭代次数。设置一个迭代次数(如200),当迭代次数达到设定值,迭代结束。一般来说,只要这个迭代次数设置得足够大,损失函数最终都会停留在极值点附近。同时,采用这种方法我们也不用担心迭代次数过多会导致损失函数“跑过”极值点的情况,因为损失函数在极值点时函数梯度为0,一旦过了极值点函数梯度正负性就发生变化了,会使函数围绕极值点再次“跑回来”。所以,即使设置的迭代次数过大,最终结果也会在极值点处“徘徊”。(一般机器学习采取降低学习率,提高迭代次数来寻找最优解)
1.2.6代码实现
一元函数:
梯度为:
代码:暂时略
多元函数:
梯度为:f'(x)=2x,f'(y)=2y
代码:暂时略
1.3求最优解的方法
1.3.1梯度下降法
一,批量梯度下降(Batch Gradient Descent,BGD)
为了方便理解,我们用一个线性回归举例子:
其中 i=1,2,...,m表示样本数。
我们将损失函数设置为(此处可能有人会疑惑为什么是2m,主要方便后面求导):
对于批梯度下降来说,就是在更新每一参数时都使用所有的样本来进行梯度更新(准确来说是样本的均值)。下面看一下梯度更新的公式:
这时候就会有问题了,有些博主不知道怎么互相抄抄,然后不说明是怎么回事,此处令j=0时,,当j=1时,由具体值由具体样本确定。
每次迭代用所有样本对参数进行更新:(可能有小可爱会问,为什么是参数更新,因为这里用的是参数值减去梯度学习值进行参数更新,反映到中相当于进行了目标函数式梯度下降)
看到上面的累加公式了吗,把所有样本点的梯度值累加起来用于参数更新,这样可以求解得到整体的最优解。
优点:
(1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。
(2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
缺点:
(1)当样本数目 m很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
从迭代的次数上来看,BGD迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下(抄的网图,看一下,大致理解什么意思就可以了):
二,随机梯度下降(Stochastic Gradient Descent,SGD)
随机梯度下降法不同于批量梯度下降,随机梯度下降是每次迭代使用一个样本来对参数进行更新。使得训练速度加快。对于一个样本的目标函数为(损失函数):
对损失函数进行求偏导:
对参数进行更新:
同上面的批量梯度下降:此处令j=0时,,当j=1时,由具体值由具体样本确定。(还是拿刚才那个线性回归举例子,但是别死记这个公式)
如果我们的数据集很大,比如几亿条数据,我们的迭代次数(这个迭代的次数其实就是随机样本数,我们再说的通俗点,就是取的个数,每次迭代结束都有一个最优的解,在进行第二次迭代)基本上设置1,2,(10以内的就足够了)就可以。但是SGD也有缺点,因为每次只用一个样本来更新参数,会导致不稳定性大些(可以看下图(图片来自ng deep learning 课),每次更新的方向,不想batch gradient descent那样每次都朝着最优点的方向逼近,会在最优点附近震荡)。因为每次训练的都是随机的一个样本,会导致导致梯度的方向不会像BGD那样朝着最优点。
优点:
(1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
缺点:
(1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
(2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
(3)不易于并行实现。
三,小批量梯度下降(Mini-Batch Gradient Descent, MBGD)
我们知道经典梯度下降虽然稳定性比较强,但是大样本情况下迭代速度较慢;随机梯度下降虽然每一步迭代计算较快,但是其稳定性不太好,而且实际使用中,参数的调整往往更加麻烦。所以,为了协调稳定性和速度,小批量梯度下降应运而生啦。其实很简单,小批量梯度下降法和前面两种梯度下降的主要区别就是每一步迭代过程中目标函数的选择不同。小批量梯度下降是从m个样本中随机且不重k个进行损失函数的求和。下面看个公式:
对损失函数进行求偏导:(其他参数条件同上)
参数更新:
每次用一部分样本来更新参数,即batch_size。因此,若batch_size=1即k,则变成了SGD,若batch_size=m则变成了batch gradient descent。batch_size通常设置为2的幂次方,通常设置2,4,8,16,32,64,128,256,512(很少设置大于512)。因为设置成2的幂次方,更有利于GPU加速。现在深度学习中,基本上都是用 mini-batch gradient descent,(在深度学习中,很多直接把mini-batch gradient descent(a.k.a stochastic mini-batch gradient descent)简称为SGD,所以当你看到深度学习中的SGD,一般指的就是mini-batch gradient descent)。
优点:
(1)通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
(2)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(比如样本的数据为30W,设置batch_size=100时,需要迭代3000次,远小于SGD的30W次)
(3)可实现并行化。
缺点:
(1)batch_size的不当选择可能会带来一些问题。
batcha_size的选择带来的影响:
(1)在合理地范围内,增大batch_size的好处:
a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
(2)盲目增大batch_size的坏处:
a. 内存利用率提高了,但是内存容量可能撑不住了。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
1.3.2牛顿法
1.3.3拟牛顿法
1.3.4启发式优化方法
1.3.5EM算法
2.线代
3.概率论
参考书籍:从零开始:机器学习的数学原理和算法实践 ISBN:978-7-115-55696
参考博文:
批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解 - EEEEEcho - 博客园 (cnblogs.com)
浅谈随机梯度下降&小批量梯度下降 - 知乎 (zhihu.com)
以上是关于1.人工智能的数学基础的主要内容,如果未能解决你的问题,请参考以下文章
[Python系列-13]:人工智能 - 数学基础 -3- 数组元素的统计
优化求解基于matlab禁忌搜索算法求解函数极值问题含Matlab源码 1204期