• softmax 分类


    为什么softmax 里面要用交叉熵?这个问题之前困扰我挺久的,但这两篇博文完美解答了我的疑惑。

    交叉熵、相对熵和负对数似然的理解 - 最大的梦想家的文章 - 知乎 https://zhuanlan.zhihu.com/p/268171298

    Kullback-Leibler(KL)散度介绍 - 灰灰的文章 - 知乎 https://zhuanlan.zhihu.com/p/100676922

    KL散度

    KL散度,是衡量原始分布和近似分布(也就是学习出来的分布)之间的差异性,如果差异越大,说明学习出来的近似分布越不拟合。

    [D_{KL}(Pparallel Q) = sum_{i=1}^N p_i(log(p_i)-log(q_i))\ S(P) = sum_{i=1}^K p_ilog p_i\ CrossEntropy = -sum_{i=1}^K p_i log q_i \ CrossEntropy(y_{true}, y_{pred}) = -sum_{i=1}^K y_{true}(i) log y_{pred}(i) \ ]

    可以看到KL散度,实际上就是实际分布的熵S,加上预测分布和实际分布的交叉熵,机器学习的目的就是最小化KL散度,因为KL散度越小,说明两个分布越接近,这意味着我们通过学习得到的分布和实际的分布越接近。

    对数似然

    假设我们观测到了一连串样本,其中A情况有a个,B情况有b个,C情况有c个。我们的目标是什么?找到一组分布( p(a) p(b) p(c) )使得出现这种状态的概率最高。

    因为机器学习学的就是一个分布。

    那么我们的目标就是最大化 (p(a)^a * p(b)^b *p(c)^c)

    用对数来表示就是(alog p(a) +blog p(b) + c log p(c))

    实际上我们会这样来表示:(sum_{i=1}^N n_ilog p_i)

    我们的目标就是最大化这个似然函数,有的情况下,它是有解的,比如以前概率论中取导数求出极值点,然后得到分布的函数。但是在机器学习中,我们是通过学习得到分布的,并没有一个准确的函数。

    还记得之前的交叉熵吗?

    对数似然(sum_{i=1}^N n_ilog p_i) 可以除以(sum_{i=1}^N n_i) ,因为这个值是一个常数,那么就得到了:

    (sum_{i=1}^N p_{true}(i)log p_{pred}(i))

    wow!!!!!!!!

    这个不就是之前的交叉熵的负数吗?

    所以换一种思路去思考对数似然,最大化对数似然实际上就是在最小化KL散度,因为我们的目标就是找到一组最接近真实分布的预测分布。

    至此,我们得出结论,负对数似然就是交叉熵。

    为什么我们可以用交叉熵来作为损失函数?

    之前的KL散度中,是包含了两个组成部分的——自身熵S和交叉熵。

    在深度学习分类时,我们用做标签的是一组onehot向量,(0,0,0,……,1,0,0),这代表$p_j = 1 quad and quad p_{i|i eq j} =0 $ ,所以,(S(P) = sum_{i=1}^K p_ilog p_i=0),而交叉熵也可以该写为(CrossEntropy = -sum_{i=1}^K p_i log q_i = -p_jlog q_j = -log q_j)

    而这个交叉熵和之前提到的负对数似然一致。

    这就是为什么可以用交叉熵来做为损失函数。

    SoftMax 梯度下降

    等待填坑……

    参考这篇博文 https://www.pianshen.com/article/8637598192/

    实际上softmax的求导还是挺好理解的。

  • 相关阅读:
    maven第三章 maven使用入门
    各个软件产生的原因
    maven的pom.xml深入理解
    批量同步订单信息(包括状态)到订单中心心得
    数据库连接超时和go away、如何检测数据库的最大连接数
    记录错误日志的技巧
    架构思想总结同步和事务的具体应用
    业务逻辑复杂性处理
    日志系统总结
    php捕获异常的处理
  • 原文地址:https://www.cnblogs.com/kalicener/p/15528232.html
Copyright © 2020-2023  润新知