通俗易懂介绍最大似然估计(MLE):

我来用最生活化的例子,给你讲清楚最大似然估计(MLE)。

一句话理解:最大似然估计就是 “结果已经发生,我就猜最可能导致这个结果的原因”

一个经典例子

假设你数了数,发现袋子里的红豆和绿豆一共100个,但你不知道比例。你随机抓10次,每次抓1个,结果8次是红豆,2次是绿豆。

那么,袋子里的红豆比例最可能是多少?你的直觉会说80%。对,这就是最大似然估计的结论。因为它要让“抓出8红2绿”这个已经发生的现象出现概率最大化。

在机器学习里怎么用?

机器学习的本质是:给定输入(比如照片),让模型猜测输出(比如猫/狗)。训练时,我们已经有真实答案,所以问题变成:选哪组参数,能让模型在看到这张照片时,刚好猜对猫的概率最大?

  • 分类问题(比如判断猫/狗):模型会输出“是猫的概率”。MLE的目标是让所有训练样本中,正确答案对应的概率都尽可能高。这正好等价于常用的交叉熵损失函数

  • 回归问题(比如预测房价):MLE假设真实值 = 模型预测值 + 正态分布的误差。此时,最大化似然等价于最小化平方误差,也就是常用的均方误差。

为什么能这么用?

  • 从直觉角度:我们相信“发生的事,在它对应的条件下,概率应该不会太小”。所以选那个让已有数据出现概率最大的模型参数,最合理。

  • 从统计角度:当样本足够多时,MLE找到的答案会接近真相(统计里叫“一致”性质),而且它的误差通常是所有靠谱方法里最小的。

需要注意什么?

MLE如果硬套小样本容易过拟合。比如只有2次抓豆都是红,它会认为袋子里100%红豆。为了解决这个问题,后来就有了 最大后验估计(MAP) ,给它加一点“先入为主”的常识(比如红豆比例大概率接近50%)。

总结
最大似然估计就是 “顺着结果,倒推原因”。在深度学习和机器学习里,它通过最大化模型对正确答案的预测概率,统一出了我们常用的损失函数(交叉熵、均方误差等)。它靠谱是因为统计上保证大样本下接近真相,且计算方便。

通俗易懂介绍交叉熵损失函数:

交叉熵损失函数的核心作用,是衡量两个概率分布的差距。在分类任务中,它衡量的是:模型预测的概率分布,和真实标签的概率分布,有多不一样。

先从简单例子感受一下

三分类任务(猫、狗、鸟),一张猫的图片。

  • 真实标签(One-hot 编码):[1, 0, 0](猫是100%,其他0%)

  • 模型输出的概率(经过Softmax):[0.7, 0.2, 0.1]

交叉熵的计算公式(单个样本):
损失 = - (1×log0.7 + 0×log0.2 + 0×log0.1) = -log0.7 ≈ 0.36

发现没有?最终只取决于真实类别对应的那个预测概率。如果模型对猫的预测是0.7,损失就是 -log(0.7)。当预测接近1时,-log(1)=0;预测接近0时,-log(0)会趋向无穷大。

一、实现步骤(前向计算)

假设分类任务有C个类别,一次有N个样本。

  1. 模型输出 logits
    神经网络最后一层输出原始分数,比如 [2.0, 1.0, 0.1],还不是概率。

  2. Softmax 转成概率

    • 对每个输出求 e^x[7.39, 2.72, 1.11]

    • 归一化得到概率:[0.66, 0.24, 0.10](和为1)

  3. 计算交叉熵
    对每个样本 i,取真实类别 y_i 对应的概率 p_i,求 -log(p_i),然后对所有样本取平均。
    公式:Loss = - (1/N) Σ log(p_i[真实类别])

二、代码级别的实现(Python + NumPy)

import numpy as np

def cross_entropy_loss(logits, labels):
    # 1. Softmax
    exp_logits = np.exp(logits - np.max(logits, axis=1, keepdims=True))  # 防溢出
    probs = exp_logits / np.sum(exp_logits, axis=1, keepdims=True)       # 概率
    
    # 2. 取真实类别对应的概率
    N = logits.shape[0]
    correct_probs = probs[range(N), labels]   # labels中是类别索引,如[0,2,1,...]
    
    # 3. 计算损失
    loss = -np.mean(np.log(correct_probs + 1e-8))  # 加极小值防log(0)
    return loss

三、训练时怎么用(反向传播)

在深度学习框架(PyTorch/TensorFlow)中,通常直接用内置的 CrossEntropyLoss,它会自动完成三件事:

  • 先套 Softmax(把logits转成概率)

  • 再算 交叉熵

  • 然后计算 梯度(反向传播优化模型)

注意:不要在最后一层手动加Softmax后又单独用CrossEntropyLoss,否则相当于做了两次Softmax(错上加错)。框架里的 CrossEntropyLoss 期望输入是未归一化的 logits。

四、为什么分类任务都用它?

损失函数 作用
均方误差(MSE) 对分类不友好,梯度易消失,优化慢
交叉熵 预测错得离谱时,损失极大、梯度大,模型能快速改正

举个例子:真实是猫(概率应为1),模型预测猫的概率只有0.01(很差)。

  • MSE损失 ≈ (1-0.01)² = 0.98

  • 交叉熵损失 ≈ -log(0.01) = 4.6

交叉熵不仅损失更大,反向传播时梯度也更明显,让模型快速提高猫的概率。

总结:交叉熵 = Softmax + 取真实类别概率 + 负对数。它会狠狠惩罚那些对正确类别信心不足的预测,这让它成为分类任务的首选损失函数。

梯度计算:

有交叉熵损失之后,梯度的计算结果会非常简洁,这也是它被广泛使用的重要原因。

先说结论:当你的模型最后一层是 Softmax,损失函数是 交叉熵 时,损失函数对 logits(Softmax 的输入)的梯度,就等于模型预测的概率减去真实标签的概率

公式极简:梯度 = 预测概率 - 真实标签

一个具体例子帮你理解

假设是个三分类问题(猫、狗、鸟),真实图片是“猫”。

  • 真实标签(one-hot):[1, 0, 0]

  • 模型输出的 logits[2.0, 1.0, 0.1]

  • Softmax 后的预测概率[0.66, 0.24, 0.10]

那么梯度就是:[0.66-1, 0.24-0, 0.10-0] = [-0.34, 0.24, 0.10]

这个梯度是什么意思?

  • 对猫的那一类(索引0):梯度 = 预测概率 - 1 = 负数(-0.34)
    意味着要降低这个 logit 吗?不是。注意这是对 logits 的梯度。负梯度表示:为了让损失变小,应该增大对应类别的 logit(因为梯度下降是往负梯度方向更新)。所以模型会努力让“猫”的预测概率更接近1。

  • 对狗和鸟的那两类:梯度 = 预测概率 - 0 = 正数(0.24 和 0.10)
    正梯度意味着要减小这些类别的 logits,让它们预测概率接近0,别抢“猫”的概率。

这个梯度方向非常直观:正确类别的概率要增大,错误类别的概率要减小。调整幅度正好等于当前“犯错”的大小。

完整反向传播路径

在实际训练中,梯度要一路传回前面的层:

输入 x → 隐藏层 → ... → 线性层 W · h + b → logits → Softmax+交叉熵 → 损失 L
  1. 第一步:计算出 dL / d(logits) = (预测概率 - 真实标签) (如上)

  2. 第二步:把梯度传回线性层,计算 dL/dW = h^T · dL/d(logits), dL/db = sum(dL/d(logits))

  3. 第三步:再往前传,更新所有隐藏层参数

优点总结

  1. 梯度公式漂亮预测 - 真实 简单明了,不会出现梯度消失。

  2. 误差越大,修正越猛:假设模型把“猫”预测成 0.01,差值为 -0.99,梯度大小 0.99,更新步长大;预测成 0.9,差值 -0.1,梯度小,微调即可。

  3. 天然适合反向传播:不像 MSE + Sigmoid 那样容易饱和产生接近 0 的梯度。

一句话记住:Softmax + 交叉熵 后,梯度 = 预测值 - 真实值。这个误差信号直接告诉模型“你对了多少、错了多少”,干净利落地指导每一层参数更新。

交叉熵损失函数与最大似然的关系:

当然。用数学公式能最清晰地看到:交叉熵损失函数,就是最大似然估计在分类问题中的负数形式

1. 最大似然估计的通用公式

假设有一组独立的训练样本 {(x₁, y₁), (x₂, y₂), ...},模型参数为 θ。模型预测给定输入 x 得到正确输出 y 的概率为 P(y|x; θ)

所有样本都正确的联合概率(似然函数)就是每个样本概率的乘积:

L(θ) = ∏ P(yᵢ | xᵢ; θ)

为了计算方便,取对数把乘法变加法:

log L(θ) = Σ log P(yᵢ | xᵢ; θ)

最大似然就是找 θ 最大化这个和。

2. 应用到分类任务

在手写数字识别这类分类问题里,P(y|x; θ) 就是模型输出“真实类别”的那一项概率。

假如某个样本真实标签是第 k 类(用 one-hot 表示为 y_true = [0,...,1,...,0]),模型输出的概率分布为 p = [p₁, p₂, ..., p_C],那么:

P(y_true | x; θ) = p_k(只取真实类别对应的概率)

所以对数似然是:

log L(θ) = Σ log p_k(对所有训练样本求和)

3. 变成损失函数

机器学习习惯最小化损失,所以取负号:

Loss = - (1/N) Σ log p_k

这正是交叉熵损失函数。因为真实标签 one-hot 和预测概率 p 的交叉熵就是:

H(y_true, p) = - Σ (y_trueⱼ · log pⱼ) = -1 · log p_k

4. 最终的等式

最小化交叉熵损失 = 最大化对数似然

写成公式:

θ_best = argmin₍θ₎ [- Σ log p(y_true | x; θ)]

等价于:

θ_best = argmax₍θ₎ [ Σ log P(y_true | x; θ) ]

一句话总结:

  • 交叉熵 = 否定答案的对数概率

  • 最大似然 = 肯定答案的对数概率

  • 两者就是一个“负号”的差别,目标是等价的——让模型对正确答案的预测概率越高越好。

这也是为什么深度学习中的分类问题,用交叉熵做损失函数,本质上就是在做最大似然估计。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐