目录
一、LogLoss对数损失函数(逻辑回归,交叉熵损失)
二、平方损失函数(最小二乘法, Ordinary Least Squares )
三、指数损失函数(Adaboost)
四、Hinge损失函数(SVM)
五、其它损失函数
六、Keras / TensorFlow 中常用 Cost Function 总结
七、tf.losses 模块
有些人可能觉得逻辑回归的损失函数就是平方损失,其实并不是。平方损失函数可以通过线性回归在假设样本是高斯分布的条件下推导得到,而逻辑回归得到的并不是平方损失。在逻辑回归的推导中,它假设样本服从伯努利分布(0-1分布),然后求得满足该分布的似然函数,接着取对数求极值等等。而逻辑回归并没有求似然函数的极值,而是把极大化当做是一种思想,进而推导出它的经验风险函数为:最小化负的似然函数(即max F(y, f(x)) —> min -F(y, f(x)))。从损失函数的视角来看,它就成了log损失函数了。
log损失函数的标准形式:
刚刚说到,取对数是为了方便计算极大似然估计,因为在MLE(最大似然估计)中,直接求导比较困难,所以通常都是先取对数再求导找极值点。损失函数L(Y, P(Y|X))表达的是样本X在分类Y的情况下,使概率P(Y|X)达到最大值(换言之,就是利用已知的样本分布,找到最有可能(即最大概率)导致这种分布的参数值;或者说什么样的参数才能使我们观测到目前这组数据的概率最大)。因为log函数是单调递增的,所以logP(Y|X)也会达到最大值,因此在前面加上负号之后,最大化P(Y|X)就等价于最小化L了。
逻辑回归的P(Y=y|x)表达式如下(为了将类别标签y统一为1和0,下面将表达式分开表示):
将它带入到上式,通过推导可以得到logistic的损失函数表达式,如下:
逻辑回归最后得到的目标式子如下:
上面是针对二分类而言的。这里需要解释一下:之所以有人认为逻辑回归是平方损失,是因为在使用梯度下降来求最优解的时候,它的迭代式子与平方损失求导后的式子非常相似,从而给人一种直观上的错觉。
这里有个PDF可以参考一下:Lecture 6: logistic regression.pdf.
注意:softmax使用的即为交叉熵损失函数,binary_cossentropy为二分类交叉熵损失,categorical_crossentropy为多分类交叉熵损失,当使用多分类交叉熵损失函数时,标签应该为多分类模式,即使用one-hot编码的向量。
最小二乘法是线性回归的一种,最小二乘法(OLS)将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布(为什么假设成高斯分布呢?其实这里隐藏了一个小知识点,就是中心极限定理,可以参考【central limit theorem】),最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离。为什么它会选择使用欧式距离作为误差度量呢(即Mean squared error, MSE),主要有以下几个原因:
平方损失(Square loss)的标准形式如下:
当样本个数为n时,此时的损失函数变为:
Y-f(X)
表示的是残差,整个式子表示的是残差的平方和,而我们的目的就是最小化这个目标函数值(注:该式子未加入正则项),也就是最小化残差的平方和(residual sum of squares,RSS)。
而在实际应用中,通常会使用均方差(MSE)作为一项衡量指标,公式如下:
上面提到了线性回归,这里额外补充一句,我们通常说的线性有两种情况,一种是因变量y是自变量x的线性函数,一种是因变量y是参数α的线性函数。在机器学习中,通常指的都是后一种情况。
学过Adaboost算法的人都知道,它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。在Adaboost中,经过m此迭代之后,可以得到fm(x):
Adaboost每次迭代时的目的是为了找到最小化下列式子时的参数α 和G:
而指数损失函数(exp-loss)的标准形式如下
可以看出,Adaboost的目标式子就是指数损失,在给定n个样本的情况下,Adaboost的损失函数为:
关于Adaboost的推导,可以参考Wikipedia:AdaBoost或者《统计学习方法》P145.
在机器学习算法中,hinge损失函数和SVM是息息相关的。在线性支持向量机中,最优化问题可以等价于下列式子:
下面来对式子做个变形,令:
于是,原式就变成了:
如若取λ=1/(2C),式子就可以表示成:
可以看出,该式子与下式非常相似:
前半部分中的 l 就是hinge损失函数,而后面相当于L2正则项。
Hinge 损失函数的标准形式
可以看出,当|y|>=1时,L(y)=0。
更多内容,参考Hinge-loss。
补充一下:在libsvm中一共有4中核函数可以选择,对应的是-t
参数分别是:
除了以上这几种损失函数,常用的还有:
0-1损失函数
绝对值损失函数
下面来看看几种损失函数的可视化图像,对着图看看横坐标,看看纵坐标,再看看每条线都表示什么损失函数,多看几次好好消化消化。
mean_squared_error或mse
mean_absolute_error或mae
mean_absolute_percentage_error或mape
mean_squared_logarithmic_error或msle
squared_hinge
hinge
categorical_hinge
binary_crossentropy(亦称作对数损失,logloss)
logcosh
categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)
的二值序列
sparse_categorical_crossentrop:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:np.expand_dims(y,-1)
kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异.
poisson:即(predictions - targets * log(predictions))
的均值
cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数
需要记住的是:参数越多,模型越复杂,而越复杂的模型越容易过拟合。过拟合就是说模型在训练数据上的效果远远好于在测试集上的性能。此时可以考虑正则化,通过设置正则项前面的hyper parameter,来权衡损失函数和正则项,减小参数规模,达到模型简化的目的,从而使模型具有更好的泛化能力。
本文是介绍tf.losses 模块(实际就是对tf.nn.下面的loss函数的高级封装)。
此模块下主要的Functions有:
absolute_difference(): 为训练过程添加一个“绝对差异”loss,其实就是做差后取绝对值作为loss。
add_loss(): 为loss集合添加额外定义的loss。
compute_weighted_loss(): 计算加权loss。
cosine_distance(): Adds a cosine-distance loss to the training procedure. (deprecated arguments)
get_losses(): 从loss集合中获取loss列表。
get_regularization_loss(): 获取整体的正则化loss。
get_regularization_losses(): 获得正则化loss列表。
get_total_loss(): 返回其值表示总损失的张量。
hinge_loss(): 为训练过程添加一个hinge loss。
huber_loss(): 为训练过程添加一个Huber Loss。
log_loss(): 为训练过程添加一个Log Loss。
mean_pairwise_squared_error(): 为训练过程添加一个pairwise-errors-squared loss。
mean_squared_error(): 为训练过程添加一个Sum-of-Squares loss,就是常说的均方误差loss。
sigmoid_cross_entropy(): sigmoid cross-entropy loss(用tf.nn.sigmoid_cross_entropy_with_logits 实现)
softmax_cross_entropy(): softmax cross-entropy loss (用tf.nn.softmax_cross_entropy_with_logits 实现)
sparse_softmax_cross_entropy(): 稀疏softmax Cross-entropy loss (用 tf.nn.sparse_softmax_cross_entropy_with_logits 实现)
下面以常用的softmax_cross_entropy() 函数为例,做一个详细介绍。
softmax_cross_entropy() # 交叉熵loss
tf.losses.softmax_cross_entropy(
onehot_labels, # 注意此处参数名就叫 onehot_labels
logits,
weights=1.0,
label_smoothing=0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
Args:
onehot_labels: [batch_size, num_classes] one_hot类型的label.
logits: [batch_size, num_classes] 神经网络的logits输出. 这两个参数都没什么好解释的,最基本的知识。
weights: 为可选参数,首先它是tensor 然后它可以是一个标量(此时作为loss的系数),也可以是一个[batch_size]的向量(看源码我个人理解就是对一个batch的样本进行加权,不知道有什么意义,因为一般来说训练样本的输入顺序是随机的,即每一个batch的样本全部都是随机的,这中情况下这个加权没有任何意义了)
label_smoothing: 这个参数如果设置大于0,则对label进行平滑,平滑的公式为:
new_onehot_labels = onehot_labels*(1-label_smoothing) + label_smoothing/num_classes
scope: 命名空间
loss_collection: 指定loss集合。
reduction: 指定应用到这个loss的reduction类型.
NONE: Un-reduced weighted losses with the same shape as input.
SUM: Scalar sum of weighted losses.
MEAN: Scalar ‘SUM’ divided by sum of weights.
SUM_OVER_BATCH_SIZE: Scalar ‘SUM’ divided by number of elements in losses.
SUM_OVER_NONZERO_WEIGHTS: Scalar ‘SUM’ divided by number of non-zero weights.
SUM_BY_NONZERO_WEIGHTS: Same as ‘SUM_OVER_NONZERO_WEIGHTS’
reduction一般都是使用MEAN而不是默认的SUM_BY_NONZERO_WEIGHTS,不过需要注意的是设置这个参数的时候是:reduction=tf.losses.Reduction.MEAN
实例:
import tensorflow as tf
Reduction = tf.losses.Reduction # 免得下面写太长
......
input = tf.placeholder(tf.float32, shape=[None, None, None, 3], name='input')
output = tf.placeholder(tf.float32, shape=[None, None, None, classnum], name='output')
logits = network.build_model(input, classnum, is_training)
def myloss(logits, labels):
soft_loss = tf.loses.softmax_cross_entropy(
onehot_labels=output, logits=logits, reduction=Reduction.MEAN
)
regular_loss = tf.losses.get_regularization_loss()
return soft_loss + regular_loss
......
# Train
loss = myloss(logist=logits, labels=output)
train_opt = tf.train.AdamOptimizer(learning_rate).minimize(loss, var_list=[var for var in tf.trainable_variables()])
......
[深度学习] 多种损失函数 contrastive loss & triplet loss & L-softmax_(∩ᵒ̴̶̷̤⌔ᵒ̴̶̷̤∩)的博客-CSDN博客_contrastive loss参考:https://blog.csdn.net/zeroQiaoba/article/details/80086906损失函数对比损失函数(Contrastive loss function)三元组损失(triplet loss)triplet loss 和 contrastive loss 的缺陷两者都需要精细设计的 对的选择。由此引入Large_margin softmax(L-softmax)。L-Softmaxentropy lossSoftmax loss..https://blog.csdn.net/Trance95/article/details/117875433
深度学习的19种损失函数 - 百度文库https://wenku.baidu.com/view/4ac5346be618964bcf84b9d528ea81c758f52e1c.html