1.损失函数
模型的学习,实际上就是对参数的学习,而参数学习的过程需要一系列的约束,这个约束就是损失函数。
模型一开始什么也不知道,我们要给它更多的数据。模型每次拿到数据都要将自己的输出和真实的结果进行比较,如果偏差很大,它就要对这个偏差进行反馈,想办法减少这种偏差,也就是学习更多的特征,直到学会如何对输入数据进行正确的判断。
假设真实函数为F(x),拟合出来得函数式为f(x),对于每一个样本点,真实值和拟合值之间就存在了一个误差。通过一个公式来表示这个误差,下面这个函数就称为损失函数,用来表示用拟合函数来表示真实函数时,表示效果的好坏。损失函数越小,拟合函数就能越好的拟合真实函数。
2.代价函数
但在实际中,我们手上的样本点还是挺多的,所有样本点构成一个训练集,我们将训练集上所有的点拟合误差做一个平均,可以用如下的函数进行表示,这个函数称为代价函数。
训练集数据的平均损失称为经验风险。同样,如果将经验风险最小化,那么拟合出来的函数就越接近于实际的函数。一般来说损失函数是针对一个样本,而代价函数是针对一个数据集,也就是所有样本点。
3.目标函数
当我们把经验风险最小化的同时,就意味着我们要尽力照顾到所有的样本点,那么就容易产生过拟合现象,像下面的函数一样,
我们要考虑如何尽可能地减少参数以及不要产生过拟合。如果在损失函数后面加上一个能够衡量模型复杂度的函数,则可以避免过拟合。之前我们学到L1范数可以实现权值稀疏,L2范数则用来防止过拟合。那么可以在损失函数后面加上度量模型复杂度的函数J(f),称作正则化。度量模型的复杂度函数称为结构风险。
3.1 0-1损失函数
如果模型预测对了,认为损失函数的值为0,如果模型预测错了就给出1。
但是0-1损失函数不能求导,故0-1损失函数不能用于反向传播。
3.2 平方损失函数
3.3 均方误差损失函数
均方误差是回归损失函数中最常用的误差,它是预测值与目标值之间差值的平方和。
S为目标值的向量表示,y为预测值的向量表示
3.4交叉熵损失函数
交叉熵损失函数实际上就是通过缩小两个概率分布的差异,使预测的概率分布尽可能达到真实的概率分布。一般多用于分类问题。
3.5 Softmax损失函数
Softmax函数可以把输入的几个数映射为0-1之间的实数,并且归一化后仍能够保证几个数的和为1,它的公式表示如下,假设一个数组有T个元素,其中第j个元素的Softmax值就可以用下面的公式得到,即该元素的值与所有元素指数和的比值。
Softmax损失函数,它是交叉熵损失函数的一个特例,一般也用于分类问题。
4. 优化方法之梯度下降法
模型根据约束来学习,而学习又要使用到优化方法,也就是模型如何进行学习和更新。
优化算法做的是如何在模型表征的空间中找到模型评估效果指标最好的模型的过程。
假定我们有一个函数f(x),我们需要找到一组参数权重,使f(x)的值最小。常见的优化方法包括梯度下降法、牛顿法和拟牛顿法、共轭梯度法等。
梯度向量的方向即为函数值增长最快的方向,这个结论实际应用之一就是梯度下降法。具体来说在一个三维空间,任何一个点我们都能找到一个与之相切的平面,这个平面上有很多方向,但是只有一个方向是曲线下降最快的梯度,每次优化都沿着最快梯度下降的方向进行,这就是梯度下降。下山的过程中方向很关键,但是步子大小同样很重要,步子太大就可能跑到别的山谷中,也有可能永远走不到饭店。最后反反复复地在接近和远离饭店的路上大踏步地走动,在模型训练中,这种反复称为“震荡”。但步子太小就要计算很多次,还没走到人就饿死了。这个步子的大小在算法中就是参数的学习率。绝大多数下,由于步长的存在,我们不可能走到最精确的最低点,最后会在最小值的某个区域内反复的震荡。这个误差我们是可以接受的。
5.批量梯度下降法(BGD)
对J(θ)中每个θ求偏导数,这样就可以求得每个θ对应的梯度,
得到了每个θ对应的梯度之后,就可以按照下降的方式更新每个θ,公式如下,
这个方法可以得到全局的最优解,因为每次都会使用所有的m个样本,在数据量大的场合我们一般不推荐使用批量梯度下降法。
6.随机梯度下降法(SGD)
每次只选择一个随机选择的样本来更新θ,则更新过程变成了如下,SGD在每轮迭代中会根据随机选择的一条数据对应的函数值来优化,这样一来即便样本数据值很大,每个过程只需要其中的一部分数据就可以完成更新了,每一轮参数的更新速度能大大加快,能快速的得到最优解。
但是SGD带来便捷的同时也带来一些风险,比如我们的数据中不可避免的会出现一些错误样本,即噪声数据。如果在一次更新中使用了噪声数据,就会造成一定程度的准确度的下降。
每次只用一个样本进行优化,可能会收敛到局部最优。SGD用损失很小一部分的精确度和增加一定数量的迭代次数为代价换取了最终总体的优化效率的提高。
7.小批量梯度下降法(MBGD)
是随机梯度下降法的折中,MBGD的方法每次使用一个固定数量的数据进行优化,这个固定数量就是Batch Size。该方法每次选择一个Batch进行优化,这会显著减少每次计算的数量,提高收敛的速度。Batch Size 也是一个不断尝试的参数,过大过小都不好。