zoukankan      html  css  js  c++  java
  • 【AI学习总结】均方误差(Mean Square Error,MSE)与交叉熵(Cross Entropy,CE)损失函数

    出发点

    对于一个样本,有输入和输出结果,我们的目的是优化训练我们的模型,使得对于样本输入,模型的预测输出尽可能的接近真实输出结果。现在需要一个损失函数来评估预测输出与真实结果的差距

    均方误差

    回归问题

    样本有若干维,每一维都有一个真实值。我们要将样本的数据通过我们的模型预测也得到同样多的预测值,真实值可以看成一个向量,预测值也一样。预测值向量要在某种定义下与真实值向量是接近的。

    定义

    [L={1over N}sumlimits_{i=1}^{N}(hat y_i-y_i)^2 ]

    其中(N)为样本的总维数,(y_i)表示第i维的真实值,(hat y_i)表示第i维的预测值,这个误差函数是容易理解的。

    如果把这个样本看做N维空间中的一个向量,均方误差实际上是这真实值与预测值两个向量的欧氏距离

    均方误差实际上就是一种衡量“有多近”的标准,这个距离的定义显然是合适的。

    在实际应用中,我们需要利用梯度方法训练模型,因此损失函数应当是容易计算梯度并且不会产生梯度消失的。

    考虑(L)对每个(hat y_i)的偏导

    [{partial Lover partial hat y_i}={1over N}2(hat y_i-y_i) ]

    当预测值与真实值差别越大,即(|hat y_i-y_i|)越大时,梯度的绝对值也是更大的,这符合我们的要求。

    分类问题

    与回归问题不同的是,样本的每一维的真实值不是连续,有序的,而是一个个离散的类别

    这些类别不仅不连续(离散),而且还是无序的,如果仍然用回归问题的思路,直接去这个(hat y_i)表示把第(i)维归入哪一类显然是不合适的,因为不存在2.5类这样的东西。在这种情况下传统的均方误差也不适用了。因为第1类与第2类的差距并不一定比第1类与第9类的差距小,然而((2-1)^2<(9-1)^2),也就是说类之间没法定义“距离”的概念了。

    如果我们换一种思路呢,尝试预测分到每一类的概率?

    概率分布

    假设总共有(K)类,对于每一维的预测值不是一个类别的确定值,而是一个K维的向量,代表分到每一类的一个概率分布。

    (z_i^k)表示样本第(i)维被分到第k类的概率

    神经网络直接得到出来的预测值并不能满足概率的要求——和为1

    那么将这个预测值过一个Softmax

    [p_i^k={ ext e^{z_i^k}over sumlimits_{j=1}^{K} ext e^{z_i^j}} ]

    这样就得到了一个和为1的概率分布,同时这个概率分布很好的突出了最大值(指数关系)。

    举例,[1,5,3],通过softmax后得到的是[0.015,0.866,0.117]

    那对应的真实值又是什么呢?

    如果训练数据中样本每一维的Label就是确定的类别,那么就是一个只有正确的类那一维概率为1,其他维都为0的K维向量。

    设第i维的真实类别为(y_i),那么

    [p_i^k=egin{cases}1,&k=y_i\0,&else end{cases} ]

    在某些特殊情况中,训练数据的Label不是确定的类别,而也是一个概率分布。

    既然是两个向量的差异,那这样我们不可以直接做均方差吗?

    [L={1over N}sumlimits_{i=1}^N{1over K}sumlimits_{k=1}^K(hat p_i^k-p_i^k)^2 ]

    (同样用(hat p_i^k)代表预测值)

    在实际情况中,分类问题往往不像回归问题那样要同时考虑多维,分类问题的样本往往就是一维的(N=1),就是这个东西要分到哪一类,其实也就是加起来除以N的区别,不妨设N=1,那么下标(i)可以去掉了。

    得到

    [L={1over K}sumlimits_{k=1}^K(hat p_k-p_k)^2 ]

    我们下面将说明,在这里用均方差是不合适的。

    梯度消失

    由于这里的(p)(z)过了一遍softmax的结果,我们还要把这个加上

    [{partial Lover partial hat z_k}={partial Lover partial hat p_k}{partial hat p_kover partial hat z_k} ]

    [{partial Lover partial hat p_k}={1over K}2(hat p_k-p_k) ]

    就是先前求过的均方差的梯度

    [S=sumlimits_{j=1}^{K} ext e^{hat z_j} ]

    [{partial hat p_kover partial hat z_k}={ ext e^{hat z_k}(S- ext e^{hat z_k})over S^2}=hat p_k(1-hat p_k) ]

    所以

    [{partial Lover partial hat z_k}={1over K}2(hat p_k-p_k)hat p_k(1-hat p_k) ]

    我们前面说过,softmax的特点是突出大值,最大的那个(hat p_k)大了,其他的就自然小了,(hat p_k)不仅与(hat z_k)有关,更重要的是(hat z_k)在所有(hat z)中的相对大小而不是绝对大小,所以我们主要关心真实概率(p_k)较大的那些类,只需要那些类被突出出来,其他自然就小了。

    大的概率值应该是怎么样的?

    真实概率(p_k)较大,预测出来的(hat p_k)我们也希望它比较大,当(hat p_k)很小的时候就错了,这个时候梯度绝对值应该更大

    这时候就出问题了,当预测出来(hat p_k)特别接近0的时候,均方差计算出的梯度非常小,当(hat p_k=0)时梯度直接消失了,这明显是有问题的。这就需要我们使用新的损失函数。

    交叉熵

    交叉熵本身是用来计算两个概率分布之间的差异性信息的。

    定义式是这样的

    [L=-sumlimits_{k=1}^K p_klog hat p_k ]

    log外面的是第k类的真实概率,里面的是第k类的预测概率

    (在绝大多数分类问题中,(p_k)只有一个是1,其他都是0,都是确定的分类任务,也就是说求和式只有一项。但不失一般性,我们还是按照原来的形式讨论)

    现在我们来求它的梯度

    求梯度

    [{partial Lover partial hat z_k}={partial Lover partial hat p_k}{partial hat p_kover partial hat z_k} ]

    其中

    [{partial hat p_kover partial hat z_k}={ ext e^{hat z_k}(S- ext e^{hat z_k})over S^2}=hat p_k(1-hat p_k) ]

    这一部分与上面是一样的。

    [{partial Lover partial hat p_k}=-{p_kover hat p_k} ]

    那么

    [{partial Lover partial hat z_k}=-p_k(1-hat p_k) ]

    真实概率(p_k)较大,当(hat p_k)很小的时候,梯度绝对值应该更大,可以观察到上式是符合突出大值的要求的,在这种情况下按照梯度下降法走一步,(hat z_k)的增大量会比其他(z)要大,(hat p_k)就会被突出。

    另外的想法

    网上还有一些说法是,在分类问题中我们只关心最大值(因为最后输出的答案还是要找一个概率最大的输出),把整个分布拟合的那么像没有意义。

    在确定的分类任务中,对于那些错误的类((p_k=0),预测值(hat p_k)是多少并不重要,只要它不是最大的那个就行了,所以它是(0.1)还是(0.01)并不一定有很大的差别,而均方误差的目标是概率分布的完全拟合,它可能过于严格了。)

  • 相关阅读:
    Intellij IDEA使用姿势
    款阿里开源的 Java 诊断工具Arthas
    Spring Boot Runner启动器
    Spring Boot 2.x 启动全过程源码分析
    Spring Boot自动配置原理
    vue包部署在tomcat上,解决资源路径问题
    输入回车 回显换行
    session和cookie
    WebStorage——SessionStorage、LocalStorage与cookie
    HTML5 cache
  • 原文地址:https://www.cnblogs.com/BAJimH/p/14970554.html
Copyright © 2011-2022 走看看