keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy'])
深度学习笔记 目标函数的总结与整理
目标函数,或称损失函数,是网络中的性能函数,也是编译一个模型必须的两个参数之一。由于损失函数种类众多,下面以keras官网手册的为例。
在官方keras.io里面,有如下资料:
-
mean_squared_error或mse
-
mean_absolute_error或mae
-
mean_absolute_percentage_error或mape
-
mean_squared_logarithmic_error或msle
-
squared_hinge
-
hinge
-
binary_crossentropy(亦称作对数损失,logloss)
-
categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如
(nb_samples, nb_classes)
的二值序列 -
sparse_categorical_crossentrop:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:
np.expand_dims(y,-1)
-
kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异.
-
cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数
mean_squared_error
顾名思义,意为均方误差,也称标准差,缩写为MSE,可以反映一个数据集的离散程度。
标准误差定义为各测量值误差的平方和的平均值的平方根,故又称为均方误差。
公式:
公式意义:可以理解为一个从n维空间的一个点到一条直线的距离的函数。(此为在图形上的理解,关键看个人怎么理解了)
mean_absolute_error
译为平均绝对误差,缩写MAE。
平均绝对误差是所有单个观测值与算术平均值的偏差的绝对值的平均。
公式:(fi是预测值,yi是实际值,绝对误差)
mean_absolute_percentage_error
译为平均绝对百分比误差 ,缩写MAPE。
公式:(At表示实际值,Ft表示预测值)
mean_squared_logarithmic_error
译为均方对数误差,缩写MSLE。
公式:(n是整个数据集的观测值,pi为预测值,ai为真实值)
squared_hinge
公式为max(0,1-y_true*y_pred)^2.mean(axis=-1),取1减去预测值与实际值的乘积的结果与0比相对大的值的平方的累加均值。
hinge
公式为为max(0,1-y_true*y_pred).mean(axis=-1),取1减去预测值与实际值的乘积的结果与0比相对大的值的累加均值。
Hinge Loss 最常用在 SVM 中的最大化间隔分类中,
对可能的输出 t = ±1 和分类器分数 y,预测值 y 的 hinge loss 定义如下:
可以看出当 t 和 y 有相同的符号时(意味着 y 预测出正确的分类)
此时的 hinge loss
但是如果它们的符号相反
binary_crossentropy
即对数损失函数,log loss,与sigmoid相对应的损失函数。
公式:L(Y,P(Y|X)) = -logP(Y|X)
该函数主要用来做极大似然估计的,这样做会方便计算。因为极大似然估计用来求导会非常的麻烦,一般是求对数然后求导再求极值点。
损失函数一般是每条数据的损失之和,恰好取了对数,就可以把每个损失相加起来。负号的意思是极大似然估计对应最小损失。
categorical_crossentropy
多分类的对数损失函数,与softmax分类器相对应的损失函数,理同上。
tip:此损失函数与上一类同属对数损失函数,sigmoid和softmax的区别主要是,sigmoid用于二分类,softmax用于多分类。
一种解释:
softmax公式:
logistic regression的目标函数是根据最大似然来做的.也就是假设x属于类y,预测出概率为oy,那么需要最大化oy.
softmax_loss的计算包含2步:
(1)计算softmax归一化概率
(2)计算损失
这里以batchsize=1的2分类为例:
设最后一层的输出为[1.2 0.8],减去最大值后为[0 -0.4],
然后计算归一化概率得到[0.5987 0.4013],
假如该图片的label为1,则Loss=-log0.4013=0.9130
可选参数
(1) ignore_label
int型变量,默认为空。
如果指定值,则label等于ignore_label的样本将不参与Loss计算,并且反向传播时梯度直接置0.
(2) normalize
bool型变量,即Loss会除以参与计算的样本总数;否则Loss等于直接求和
(3) normalization
enum型变量,默认为VALID,具体代表情况如下面的代码。
enum NormalizationMode {
// Divide by the number of examples in the batch times spatial dimensions.
// Outputs that receive the ignore label will NOT be ignored in computing the normalization factor.
FULL = 0;
// Divide by the total number of output locations that do not take the
// ignore_label. If ignore_label is not set, this behaves like FULL.
VALID = 1;
// Divide by the batch size.
BATCH_SIZE = 2;
//
NONE = 3;
}
归一化case的判断:
(1) 如果未设置normalization,但是设置了normalize。
则有normalize==1 -> 归一化方式为VALID
normalize==0 -> 归一化方式为BATCH_SIZE
(2) 一旦设置normalization,归一化方式则由normalization决定,不再考虑normalize。
使用方法
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc1"
bottom: "label"
top: "loss"
top: "prob"
loss_param{
ignore_label:0
normalize: 1
normalization: FULL
}
}
扩展使用
(1) 如上面的使用方法中所示,softmax_loss可以有2个输出,第二个输出为归一化后的softmax概率
(2) 最常见的情况是,一个样本对应一个标量label,但softmax_loss支持更高维度的label。
当bottom[0]的输入维度为N*C*H*W时,
其中N为一个batch中的样本数量,C为channel通常等于分类数,H*W为feature_map的大小通常它们等于1.
此时我们的一个样本对应的label不再是一个标量了,而应该是一个长度为H*W的矢量,里面的数值范围为0——C-1之间的整数。
至于之后的Loss计算,则采用相同的处理。
在kaggle比赛中,经常需要提交log loss,对数损失是经常用到的一个评价指标。其定义为给定概率分类器预测的真实
标签的负对数似然率。
每一个样本的对数损失就是在给定真实样本标签的条件下,分类器的负对数似然函数:
-log P(yt|yp) = -(yt log(yp) + (1 - yt) log(1 - yp))
当某个样本的真实标签y=1时,loss=-log(p),分类器的预测概率值为p=pr(y=1)的概率如果越大,越接近1,则损失越小;如果p=pr(y=1)的概率值越小,则分类损失越大。
在提交结果中,使用官方提供的测试集是没有标签的,提交基于测试集模型的预测值,属于每一类预测值的概率值,官方评价指标使用log loss,会返回一个负对数似然值作为评价的目标值。
举个例子:
两个类别,spam,ham是真实标签值,四个预测值,预测属于正确类别的概率值基本正确,所以返回的对数损失是0.21......,值比较小,说明预测还是可以的。
sparse_categorical_crossentrop
在上面的多分类的对数损失函数的基础上,增加了稀疏性(即数据中多包含一定0数据的数据集),如目录所说,需要对数据标签添加一个维度np.expand_dims(y,-1)。
kullback_leibler_divergence
(译自WIKI)
对于离散随机变量,其概率分布P 和 Q的KL散度可按下式定义为
即按概率P求得的P和Q的对数差的平均值。KL散度仅当概率P和Q各自总和均为1,且对于任何i皆满足
Q(i)>0及P(i)>0时,才有定义。式中出现0Ln0的情况,其值按0处理。
对于连续随机变量,其概率分布P和Q可按积分方式定义为
其中p和q分别表示分布P和Q的密度。
更一般的,若P和Q为集合X的概率测度,且Q关于P绝对连续,则从P到Q的KL散度定义为
其中,假定右侧的表达形式存在,则为Q关于P的R–N导数。
相应的,若P关于Q绝对连续,则
即为P关于Q的相对熵,用以度量两个分布的差异。
cosine_proximity
此方法用余弦来判断两个向量的相似性。
设向量 A = (A1,A2,...,An),B = (B1,B2,...,Bn),则有
余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越趋近于0,他们的方向更加一致。相应的相似度也越高。