分类问题的损失函数
在分类问题中,我们常用的损失函数为交叉熵:
H(p,q)=-\sum_xp(x)\log{q(x)}
它刻画的是通过概率分布q来表达概率分布p的难度,其中p代表的是真实值,q代表的是预测值。
例如:
H((1,0,0),(0.5,0.4,0.1))=-(1*log0.5+0*log0.4+0*log0.1)\approx0.3
当然,这个值越小说明越接近。
另外,在使用log函数定义损失函数时,我们可以用 tf.clip_by_value(y, 1e-10, 1.0) 将y限制在一个范围,而避免出现log0这样的计算错误。
TensorFlow实现交叉熵误差的代码:
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
其中的*是元素乘,因为在TensorFlow中,矩阵的乘法应该是tf.matmul()。
我们注意到,对于一个概率分布,每一个可能的值的概率加起来应该是1。但是,我们最后输出的向量y并不一定每一项加起来最后和为1。此时,我们采用softmax函数将其转化为概率分布:
softmax(y)_i=y'_i=\frac{e^{y_i}}{\sum_{j=1}^ne^{y_j}}
它具有以下特点:
- 输入几维向量得到的还是几维向量
- 向量每个元素和为1
由于交叉熵经常和softmax函数一起使用,所以TensorFlow对其进行了封装:
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
回归问题的损失函数
在回归问题中,我们常用的损失函数是均方误差(MSE):
MSE(y,y')=\frac{\sum_{i=1}^n(y_i-y')^2}{n}
代码:
mse = tf.reduce_mean(tf.square(y_ - y))
自定义损失函数
在某些情况下,我们需要自定义损失函数,例如:
Loss(y,y')=\sum_{i=1}^nf(y_i,y_i'),f(x,y)=\begin{cases} a(x-y)&x\gt y\\ b(y-x)&x\leq y \end{cases}
代码表示为:
loss = tf.reduce_sum(tf.where(tf.greater(v1, v2), (v1 - v2) * a, (v2 - v1) * b))
网友评论