深度学习笔记 目标函数的总结与整理

 

  目标函数,或称损失函数,是网络中的性能函数,也是编译一个模型必须的两个参数之一。由于损失函数种类众多,下面以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 定义如下:

  L(y) = max(0,1-t*y)

  看到 y 应当是分类器决策函数的“原始”输出,而不是最终的类标。例如,在线性的 SVM 中
   y = w*x+b

  可以看出当 t 和 y 有相同的符号时(意味着 y 预测出正确的分类)

   |y|>=1

  此时的 hinge loss

   L(y) = 0

  但是如果它们的符号相反

  L(y)则会根据 y 线性增加 one-sided error。(译自wiki)

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求得的PQ的对数差的平均值。KL散度仅当概率PQ各自总和均为1,且对于任何i皆满足

  Q(i)>0P(i)>0时,才有定义。式中出现0Ln0的情况,其值按0处理。

  对于连续随机变量,其概率分布PQ可按积分方式定义为 

  

  其中pq分别表示分布PQ的密度。

  更一般的,若PQ为集合X的概率测度,且Q关于P绝对连续,则从PQ的KL散度定义为

  

  其中,假定右侧的表达形式存在,则Q关于P的R–N导数。

  相应的,若P关于Q绝对连续,则

  即为P关于Q的相对熵,用以度量两个分布的差异。


cosine_proximity

  此方法用余弦来判断两个向量的相似性。

  设向量 A = (A1,A2,...,An),B = (B1,B2,...,Bn),则有

  

  

  余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越趋近于0,他们的方向更加一致。相应的相似度也越高。

keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy'])的更多相关文章

  1. keras中的loss、optimizer、metrics

    用keras搭好模型架构之后的下一步,就是执行编译操作.在编译时,经常需要指定三个参数 loss optimizer metrics 这三个参数有两类选择: 使用字符串 使用标识符,如keras.lo ...

  2. Deploying Keras model on Tensorflow Serving--

    keras训练了个二分类的模型.需求是把keras模型跑到 tensorflow serving上 (TensorFlow Serving 系统用于在生产环境中运行模型) keras模型转 tenso ...

  3. keras模块学习之-目标函数(objectives)笔记

    本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! 目标函数又称损失函数(loss),目的是计算神经网络的输出与样本标记的差的一种方法,如: model = Sequential() ...

  4. Keras Model Sequential模型接口

    Sequential 模型 API 在阅读这片文档前,请先阅读 Keras Sequential 模型指引. Sequential 模型方法 compile compile(optimizer, lo ...

  5. keras Model 3 共享的层

    1 入门 2 多个输入和输出 3 共享层 考虑这样的一个问题:我们要判断连个tweet是否来源于同一个人. 首先我们对两个tweet进行处理,然后将处理的结构拼接在一起,之后跟一个逻辑回归,输出这两条 ...

  6. keras Model 1 入门篇

    1 入门 2 多个输入和输出 3 共享层 最近在学习keras,它有一些实现好的特征提取的模型:resNet.vgg.而且是带权重的.用来做特诊提取比较方便 首先要知道keras有两种定义模型的方式: ...

  7. tensorflow 2.0 技巧 | 自定义tf.keras.Model的坑

    自定义tf.keras.Model需要注意的点 model.save() subclass Model 是不能直接save的,save成.h5,但是能够save_weights,或者save_form ...

  8. keras Model 2 多输入和输出

    1 入门 2 多个输入和输出 3 共享层 函数式模型有一个很好用的应用实例是:编写拥有多个输入和输出的模型.函数式模型使得在复杂网络中操作巨大的数据流变的简单. 我们实现下面这样的模型 from ke ...

  9. Problem after converting keras model into Tensorflow pb - 将keras模型转换为Tensorflow pb后的问题

    I'm using keras 2.1.* with tensorflow 1.13.* backend. I save my model during training with .h5 forma ...

随机推荐

  1. Java_7 ArrayList集合

    1 ArrayList创建变量的步骤 1: 导入包 java.util包中 2: 创建引用类型的变量 数据类型< 集合存储的数据类型> 变量名 = new 数据类型<集合存储的数据类 ...

  2. linux命令学习之:vim

    1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器. 虽然emacs是公认的世界第一,我认为使用emacs并没有使用vi进行编辑来得高效. 如果是初学vi,运行一下vimtu ...

  3. HttpClient上传文件

    1.上传客户端代码: public static void upload() { CloseableHttpClient httpclient = HttpClients.createDefault( ...

  4. java 向上转型和向下转型

    学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么 ...

  5. bean生命周期_Junit测试使用factory模式

    在面试某互联网_保险 公司, 被问到了spring中bean的生命周期,不禁联想到我们之前作 junit测试时,使用了Factory模式,而没有用Mock.

  6. django分页的东西, 不详细, 但是也足够了。

    视图函数中的代码 from django.shortcuts import render, HttpResponse, redirect import json from django.core.pa ...

  7. Hibernate: save, persist, update, merge, saveOrUpdate[z]

    [z]https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate 1. Introduction In this ...

  8. css 边距等常用设置

    前端知识 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  9. c# usercontrol 用户自定义控件无法显示在工具箱的解决办法

    由于最开始x86平台,后来换成anyCPU 重新编译也没有删除x86目录下的dll ,也没重新生成 费x86 下的dll , 导致工具箱无法找到目录下的dll 无法加载自定义控件 右击工具栏中的内容选 ...

  10. angular2.0学习笔记2.创建hello world项目

    1.打开终端命令行窗口 2.切换到指定目录 E:\cd myobject 3.创建新项目 ng new angular2-helloworld 4.创建成功后,在angular2-helloworld ...