损失函数
通过损失函数求解进行模型评估
损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。
在应用中,损失函数通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。
常见损失函数
- 交叉熵损失函数
- 0-1损失函数
- 平方损失函数(线性回归:最小二乘法)
损失函数:均方误和交叉熵
一、均方误差函数:
编辑
其中,t是真实标签,y是网络预测值。
然后我们将其对权重w求导:
发现它的变化与激活函数的导数有关系,也就是激活函数梯度f'(z)越大,w的大小调整得越快,训练收敛越快。反之,f'(z)越小,w的大小调整得越慢,训练收敛越慢。
以一个二分类问题为例,进行两组实验。
在上图两点中,0.98距离0差距较大但是它的梯度(斜率)趋于零,根据我们上面的分析,也就是说它调整的慢(收敛慢),同样0.82相比0.98来说与零相差小,但是它的梯度很大,所以它的收敛快。
下图是基于两点的loss变化图:
我们可以根据上图中绿色线(梯度斜率)变化大致画出来
我们可以根据上图中红色线(梯度斜率)变化大致画出来
所以在这里就产生了一个矛盾,当误差较大时我们希望它调整的大一些,加快收敛。但是如上述的0.98处一样,误差大但是变化率小,收敛的比慢。0.82位置误差相对小但是权值调整速度比较快,因此就有了交叉熵函数。
二、交叉熵函数:
同样我们对其w求导:
其中呢,
也就是
所以我们发现交叉熵函数w的调整与(y-t)相关,就是与网络误差值正相关,误差越大,调整越大,收敛越快,这是我们想要的。
三、结论
回归用均方误差,分类用交叉熵。
四、实验证明
在MNIST数据集上经过5个epoch来做对比,很明显交叉熵的收敛速度较快。
激活函数的作用
处理线性不可分问题,解决非线性的问题
1.为何引入非线性的激活函数?
如果不用激活函数,在这种情况下每一层输出都是上层输入的线性函数。容易验证,无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。因此引入非线性函数作为激活函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入。
引入ReLu的原因
第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现 梯度消失 的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。
第三,ReLu会使一部分神经元的输出为0,这样就造成了 网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生