美文网首页Deep Learning
交叉熵与最大似然估计

交叉熵与最大似然估计

作者: 拓季 | 来源:发表于2018-01-04 23:28 被阅读0次

    在 Andrew Ng 的 Deep Learning Specialization 系列课程中在讲解 Logistic regression 时一直采用的一个损失函数和成本函数定义为:

    • 单个样本的损失函数:L(ŷ, y) = - (ylog(ŷ) + (1 - y) log(1 - ŷ)),注意这里的 log 的底数为自然基底 e,由于在很多计算工具中都将 ln 的实现方法定义为 log,所以公式和课堂上采用的是 log

    • 训练样本集的成本函数:样本集中全部 m 个样本的损失函数的均值
      J = (1/m) ΣL(ŷ(i), y(i)) = (1/m) Σ(-y(i)logŷ(i) - (1 - y(i))log(1 - ŷ(i))),其中 i = 1, 2, 3, ..., m, m 为样本的数量

    这里激活函数使用的是 Sigmoid 函数,其数学描述为:σ(z) = 1 / (1 + e-z) ,进而对应每一个特征向量 x,激活函数的输出结果为:

    • ŷ = σ(z) = σ(wTx + b)

    在课堂中 Andrew 并没有花时间解释为何采用这个损失函数,实际上这个损失函数是一个二元分类的交叉熵 Cross-Entropy 函数。为了更清楚的解释这个概念,给出交叉熵的概念如下:

    如果一个事件的发生概率为 p,则其交叉熵为:

    • CE = - ln(p)

    由于对一个概率值取自然对数的结果为一个 ≤ 0 的数,因此加上一个负号则可以使得函数最终的计算结果为一个正数。

    在 Logistic regression 中由于 y 的取值只有 0 或 1,而 Sigmoid 函数的输出值值域为 (0, 1),因此可以看作是一个概率,在此有:

    • 当 y 取值为 1 时,我们期望模型的预测值 ŷ 能够接近 1,即激活函数应该输出一个更接近于 1 的概率值,对应的交叉熵函数变为 ln(ŷ) = ln(σ(wTx + b)) ,取值接近于 0

    • 当 y 取值为 0 时,我们期望模型的预测值 ŷ 能够接近 0,即激活函数应该输出一个更接近于 0 的概率值,对应的交叉熵函数变为 ln(1 - ŷ) = ln(1 - σ(wTx + b)) ,取值仍接近于 0

    Loss & prediction, from Udacity

    由于交叉熵函数的取值和我们期望的误差的取值是一致的,因此可以用交叉熵函数作为一个损失函数,而针对整个样本集来说,则可以定义加总形式的交叉熵函数作为成本函数。

    这个交叉熵函数还有一个隐藏的特性是对其求解梯度后有:

    • ∇ CE = (ŷ - y)(x1, x2, x3, ..., xn, 1),这意味着当误差较大时,我们可以给予参数较大幅度的调整,而当误差较小时则给予较小的调整。

    更一般地,如果针对存在 n 个分类的 m 个样本,则这个样本集的成本函数的交叉熵函数形式为:

    • CE = - (1/m) ΣmΣnyijln(pij)),这里 i = 1, 2, 3, ..., m,j = 1, 2, 3, ..., n

    以交叉熵函数作为成本函数的数学基础来自于统计学中的最大似然估计 Maximum Likelihood Estimation, MLE。

    最大似然估计

    最大似然估计是一种参数估计,更确切的说,是一个点估计。

    在现实世界的研究中,我们可以首先假定某些被研究对象的概率分布服从某种分布形态,例如二项分布、正态分布、指数分布,但对于相应分布中的具体参数的取值却无从知晓,此时我们可以借助从总体中抽样的方式,对总体的概率分布的参数进行一个点对点的估计。假定被研究对象的总体服从二项分布,如果知道了基础的(0,1)分布中结果指定为 1 时的概率 p 也就知道了这个分布形态的全部。

    在最大似然估计的语境中,由于总体分布参数未知,因此用 θ 表示总体的一个或多个未知参数。需要注意的是,在最大似然估计中,我们需要限定抽样样本集 X 当中的样本 x1, x2, x3, ..., xn 彼此是独立同分布的,也即样本被抽取到的概率是彼此独立的,它们之间唯一的联系就是来自于同一个总体,具有相同的概率分布形态。

    此时,由于样本之间彼此独立且服从参数为 θ 的分布,那么取得任意一个样本 xi 的概率可以表示为 P(xi | θ),因而取得当前这个样本集的概率为:

    • P(X) = P(x1 | θ)P(x2 | θ)P(x3 | θ) ... P(xn | θ)

    由于在抽样后会得到总体的一个观测,因此相应的概率在具体的样本集中都是已知的,上面这个函数则可以看作在不同的参数 θ 的取值下,取得当前这个样本集的概率,也即可能性 likelihood,因此将其称为参数 θ 相对于样本集 X 的似然函数 likelihood function,记为L(θ),即有:

    • L(θ) = L(x1, x2, x3, ..., xn | θ) = P(x1 | θ)P(x2 | θ)P(x3 | θ) ... P(xn | θ) = ∏P(xi | θ), i = 1, 2, 3, ..., n

    对于抽样得到样本集 X 这个既成事实,我们可以认为这就是最该发生的一个结果,也即所有可能的结果中概率最大的那一个,这就是最大似然估计的命名由来。此时,我们需要寻找的就是那个使似然函数取得最大值的 θ 值:

    • argmax L(θ)

    这里 argmax ƒ(x) 是使得函数 ƒ(x) 取得其最大值的所有自变量 x 的集合,相应的 argmin ƒ(x) 是使得函数 ƒ(x) 取得其最小值的所有自变量 x 的集合,而我们想要研究的问题最终再一次变成了一个求极值问题。

    由于在计算当中,多个概率的乘法最终会得到一个非常小的值,从而可能造成下溢 underflow,因此一般会进一步对之前的似然函数取一个对数,将连续乘法转化为加法:

    • lnL(θ) = ln(ΠP(xi | θ))= Σ lnP(xi | θ), i = 1, 2, 3, ..., n

    总结起来,利用最大似然函数求解总体参数的估计值的一般步骤为:

    1. 获取似然函数

    2. 对似然函数取自然对数

    3. 将对数似然函数求(偏)导数,令其为0,得到似然方程

    4. 求解似然方程,得到的一个或多个数值即为总体参数的最大似然估计值

    需要注意的是与任何参数估计方法一样,最大似然估计的准确性也受到样本数量的影响,一般样本数量越大越准确。对于最大似然估计的理解参考了很多 zouxy09的专栏 的内容,在此表示感谢!他的专栏是一个机器学习的知识宝库,后续有时间一定会仔细阅读!

    代码实现

    以向量化的方式实现交叉熵函数的代码为:

    import numpy as np
    # Y and P are lists of labels and estimations
    # returns the float corresponding to their cross-entropy.
    def cross_entropy(Y, P):
        Y = np.float_(Y)
        P = np.float_(P)
        # np.log() is based in e in numpy
        return -np.sum(Y * np.log(P) + (1 - Y) * np.log(1 - P)) / len(Y)
    

    参考阅读

    1. 从最大似然到 EM 算法浅解

    2. 如何通俗的理解最大似然估计 - 马老师的版本

    3. All About Loss Functions

    4. Picking Loss Functions - A comparison between MSE, Cross Entropy, and Hinge Loss

    5.Michael Nielsen on Loss

    相关文章

      网友评论

        本文标题:交叉熵与最大似然估计

        本文链接:https://www.haomeiwen.com/subject/nfarnxtx.html