TensorFlow神经网络到深度学习
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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(xy),返回x>y的判断结果的bool型Tensor,当Tensorxy的维度不一致时,采取广播(broadcasting)机制。

·tf.where(condition,x=None,y=None,name=None),根据condition选择x(if true)ory(if false)。

【例3-11】使用自定义损失函数实现一个简单的神经网络。

运行程序,输出如下: