3.5 损失函数
损失函数是绝对网络学习质量的关键。无论什么样的网络结构,如果使用的损失函数不正确,最终都将难以训练出正确的模型。这里先介绍几个常用的loss函数。
损失函数的作用是用于描述模型预测值与真实值的差距大小。一般有两种比较常见的算法:均值平方差(MSE)和交叉熵,下面除了对这两种算法进行介绍,还介绍了自定义损失函数。
3.5.1 均值平方差
均值平方差(Mean Squared Error,MSE),也称“均方误差”,在神经网络中主要是表达预测值与真实值之间的差异。在数理统计中,均方误差是指参数估计值与参数真实值之差平方的期望值。其公式定义如下,主要是对每个真实值与预测值相减的平方取平均值。
均方误差的值越小,表明模型越好。类似的损失算法还有均方根误差RMSE(将MSE开平方)、平方绝对值误差MAD(对一个真实值与预测值相减的绝对值取平均值)等。
注意:在神经网络计算中,预测值要与真实值控制在同样的数据分布内,假设将预测值经过sigmoid激活函数得到取值为0~1,那么真实值也归一化成0~1。这样在进行loss计算时才会有较好的效果。
3.5.2 交叉熵
交叉熵也是loss算法的一种,一般用在分类问题上,表达的意识为预测输入样本属于某一类的概率。其表达式如下式:
式中,y代表真实值分类(0或1),a代表预测值。交叉熵也是值越小,代表预测结果越准。
注意:这里用于计算的a也是通过分布统一化处理的(或者是经过sigmoid激活函数激活的),取值为0~1。如果真实值和预测值都是1,前面一项ylna就是1×ln(1)等于0,后一项(1-y)ln(1-a)也就是0×ln(0),loss为0,反之loss函数为其他数。
【例3-10】利用交叉熵实现一个简单神经网络。
运行程序,输出如下:
3.5.3 自定义损失函数
对于理想的分类问题和回归问题,可采用交叉熵或者MSE损失函数,但是对于一些实际的问题,理想的损失函数可能在表达上不能完全表达损失情况,以至于影响对结果的优化。例如,对于产品销量预测问题,表面上是一个回归问题,可使用MSE损失函数。在实际情况下,当预测值大于实际值时,损失值应是正比于商品成本的函数;当预测值小于实际值时,损失值是正比于商品利润的函数,多数情况下商品成本和利润是不对等的。自定义损失函数如下:
TensorFlow中,通过以下代码实现自定义损失函数:
其中,
·tf.greater(x,y),返回x>y的判断结果的bool型Tensor,当Tensorx,y的维度不一致时,采取广播(broadcasting)机制。
·tf.where(condition,x=None,y=None,name=None),根据condition选择x(if true)ory(if false)。
【例3-11】使用自定义损失函数实现一个简单的神经网络。
运行程序,输出如下: