- 我们知道神经网络是一种非线性模型,激活函数就是用来映射为非线性的,激活函数是保证神经网络非线性的关键。但是模型的参数我们如何求得最优组合呢?用什么评价标准呢?
1. 经验风险,期望风险,结构风险
如何选择最优参数和评价一组参数是最优的,这就是机器学习中的策略,也就是性能度量P,在李航的《统计学习方法》和周志华的《机器学习》中开篇都曾讲过,这里不再详细介绍。传统的机器学习的策略采用经验风险 最小化原则。要降低经验风险,就要提升模型的复杂度,但是回导致 VC 维很高(如果人类的智商水平可以用大脑的脑细胞数来衡量,那么机器的智商水平就可以用VC维比喻来衡量)。VC维高,置信风险越高,所以结构风险也就高。这就产生了过拟合现象,因此我们针对不同的问题选择不同的策略,使结构风险最小化。
损失函数(Loss Function)是一种用来估算实际值与模型的预测值之间的不一样程度的函数式。通常,它是一种非负值的函数,其值越小,鲁棒性就越好,模型就越稳定。损失函数是针对一个样本而言的,通过损失函数,只能知道模型的决策函数对单个样本的预测能力,但是我们要知道其对整个训练集的预测能力,甚至对新数据的预测能力。如果想知道对整个训练集的预测能力,只需要对训练样本分别损失函数的值,然后进行累加,最后求一个均值即可。这就是经验风险。
经验风险越小,说明模型对训练集拟合的效果好,但是对测试集(新数据)的拟合效果如何,有待商榷。那我们如何去衡量所有样本(训练集,测试集,及后期线上产生的数据)的拟合效果呢?从概率论,我们首先想到的是使用期望风险,即假设 和服从联合分布,期望风险的数学公式为:,其中;;。
期望风险是全局的概念,而经验风险是局部的概念。理想的模型希望期望风险最小化,但是期望风险往往不可以得到(未知的数据具有不确定性), 和的联合分布函数不易得到。为了期望风险最小化,我们采用局部最优代替全局最优的思想,这是因为训练数据足够大,根据大数定理,经验风险应该接近期望风险,这也是经验风险最小化的理论基础。
如果只考虑经验风险,大多数出现过拟合的现象,考虑到期望风险,但是未知的数据不易得到和存在不确定性。两者不能兼顾也,这时该怎么办呢?这就引出了结构风险。结构风险是经验风险加上置信风险,其中置信风险是指模型对未知样本预测的误差。我们知道SVM能够在小样本上优于其他算法,就在于其优化策略使结构风险最小。
置信风险的影响因素有两个:训练样本数量和模型的VC维。训练样本的数量越多,置信风险就越小;模型的VC维越大,模型的假设空间就越大,模型解的种类就越多,拟合能力就越差,置信风险就越大。因此我们增加训练集的数据量和降低模型的VC维,才能降低置信风险,从而使结构风险降低。通常降低模型的VC维的做法是模型加入一个正则化项(惩罚项)。这也是为什么我们建立的模型往往要加入L1,L2范式了。
为了同时保证经验风险和置信风险都达到最小化,这时将两项通过一个权重系数,融合为一个式子,通过调节超参数的值,来平衡经验风险和置信风险,使结构风险最小。
-
上面说那么多,总结起来就是下面几句:
- 经验风险是局部的。损失函数基于训练数据最小化;
- 期望风险是全局的。损失函数基于训练数据+测试数据最小化;
- 置信风险是损失函数基于未知样本最小化,通常增加训练数据量和加入正则化项;
- 结构风险是经验风险+置信风险。
我们知道了结构风险的概念,但是我们的目的是使结构风险最小,如何让结构风险最小呢?通常我们使用目标函数,让目标函数最小化。目标函数的一般形式是,其中L是损失函数,
2. 损失函数
- 有上面的知识,我们知道要建立一个很好的模型,需要损失函数。损失函数多种多样,但是一定满足两个原则。
- 非负性;
- 当预测值与真实值接近时,损失函数趋于0。
2.1 0-1 损失函数
假设在二分类问题中,正类 ,负类 ,对于一个二分类模型。
-
定义 0-1 损失函数:
-
另一种形式:
0-1 损失函数的意思是,预测对的时候,函数为0,预测错的时候,函数为1。更简单的理解就是0-1函数只取决于预测值与实际值乘积的正负号。很明显0-1损失函数是一个在定义域为0时,不可导,也不是一个连续函数,更不是一个非凸函数(这里不再解释这些概念,都是数学的基础知识)。因此该损失函数在求解模型参数时,存在很多不足之处。
2.2 交叉熵损失函数
- 交叉熵损失函数是0-1函数的一种替换形式,。函数的形式如下:
2.2.1 表达式一
运用交叉熵损失函数的典型算法是logistic回归算法(激活函数是sigmoid函数)。logistic不用均方差函数,使用logistic是有原因的。在推到均方差误差函数的时候,我们有一个假设前提,预测值与真实值的误差是白噪声,其实就是服从正态分布(高斯分布)。为什么假设误差是个白噪声呢?这就涉及到大学所学的概率论了,根据中心极限定理,我们知道数据足够多的时候,误差近似服从正态分布。而在推到logistic算法时,它假设样本服从0-1分布(伯努利分布),然后根据最大似然估计,求其最优解。逻辑回归没有极大化似然函数,我们将其转化为最小化负的似然函数。
-
logistic(Sigmoid)表达式为:
-
logistic的Log损失函数表达式:
我们知道,当真实值y=1时,我们希望自己的模型预测的也接近于1,即在1的附近,这时损失函数就趋于0,同理真实值y=0时,损失函数也趋于0。说明此函数满足损失函数的第二个原则。对于第一个原则,我们易知,在定义域(0,1)内小于0,但是损失函数前面有一个负号,因此该损失函数也满足非负性。
此处说明一下,该指数函数有的教材是以e为底,有的是以2为底,仔细想一下,每个编写教材的思考角度不一样,如果从数学推理的角度,设计算法时应该以e为底,因为自然常数e有着特殊的意义,可以推导出很多有意义的东西,比如幂级数,欧拉公式,素数定理等等。如果从计算机的角度,计算机喜欢0,1,也只识别0,1 我们使用2为底,能够加快我们的运算速度。这只是自己的浅理解,没有查看过相关文献,没有理论支撑。
-
logistic的损失函数整体表达式:
-
考虑到经验风险,损失函数为:
上试就是交叉熵函数。
2.2.2 表达式二
-
对于sigmoid函数,有
-
-
有了上试对sigmoid函数的推导,下面就容易处理了。我们知道在二分类中,假设y的取值,正类时:,负类时:。对于sigmoid函数,我们将也放入变量中,,其损失函数的形式如下:
-
-
经验风险的损失函数为:
-
2.2.3 交叉熵损失函数+Sigmoid激活函数
-
有了激活函数的基础,我们知道在做二分类的时候,通常输出层选择sigmoid激活函数。现在谈谈为什么在激活函数为sigmoid下,我们要选择交叉熵损失函数,而不选择均方误差损失函数。其实有两方面原因:
- 第一原因。先天条件不满足,sigmoid假设样本服从伯努利分布,而均方误差函数假设服从白噪声。
- 第二个原因。sigmoid激活函数 + MSE(均方误差)损失函数收敛速度慢。这里不再陈述为何收敛速度慢,上一遍文章讲激活函数的时候,就是在MSE损失函数下,sigmoid函数为何梯度消失的问题。
那疑问来了,为何在交叉熵损失函数下,为何sigmoid的收敛速度快了呢?这里不再介绍过程了,这涉及到前向传播和后向传播,不是几句话能说明白的。它收敛变化的原因就是它的梯度不含有激活函数的导数,在最后一层是预测值与实际值的差,差值大的时候,梯度大些,能快速靠近收敛点差值小了,梯度小些,缓慢的靠近收敛点,防止在收敛点震荡。
2.3 对数似然损失函数
对数似然损失函数其实是交叉熵损失函数的推广。
-
对数似然损失函数的表达式;
-
常常激活函数选择softmax时,我们选用对数似然损失函数。这是因为我们在选择模型函数的时候,选择的是softmax函数。我们知道softmax激活函数,通常用来解决多分类并且类与类之间是互斥的。因此当我们的某一个样本,实际标签属于2类(假设类别有1,2,3,...),从而只有,其他的都为0(),导致损失函数为。
2.4 Hinge 损失函数
- 对于二分类问题,假设输出的。Hinge (合页)损失函数的表达式:
- L(y,f(x))=max(0,1-f(x)*y)
- 运用Hinge损失函数的典型分类器是SVM算法,。我们可以知道,当预测对的时候,同号,hinge loss为0;当预测错的时候,异号,hinge loss为1。
- Hinge损失函数对判定边界附近点(错误越大的点)和离群点的惩罚力度较高,由于错分导致分类误差会很大,如此便会影响整个分类超平面的学习,从而降低模型泛化能力。
2.5 指数损失
- exp-loss主要用于以boosting思想,设计的算法,主要有AdaBoost算法和提升树(boosting tree)系列算法。
- 具体形式:
2.6 均方误差损失函数
- 均方误差损失函数较多用于回归任务,它假设样本和噪声都是服从正态分布的。它也是一个连续函数。
- MSE 公式:
- 特点:
- 计算方便,只是平方运算,不含较为复杂的幂运算;
- 欧氏距离是一种很好的相似度度量标准;
- 在不同的表示域变换后特征性质不变。
2.7 绝对值损失函数
-
具体公式
绝对值损失和 MSE 损失类似,不同之处在于平方损失函数更平滑。绝对值损失在预测值等于真实值时,存在间断点,实际中几乎不用,因为在间断点时,损失函数不可导。
2.8 自定义损失函数
- Tensorflow 不仅支持常用的损失函数,还支持自己定义函数。因为在实际项目中,有的损失函数不适用,需要自己去定义函数。比如,在预测商品销量的时候,假设商品的成本是1元,销售价是10元,如果预测少一个,意味着少挣9元,但是预测多一个,意味着损失1元,客户希望利润最大化,那该如何选择损失函数?