从零开始学AI14——最大似然估计与对数损失函数

逻辑回归的核心原理可以概括为以下几点:

  1. 理论基础:逻辑回归基于最大似然估计(MLE),通过最大化观测数据发生的概率来确定模型参数,而非使用最小二乘法。

  2. 损失函数:推导得出对数损失(LogLoss/交叉熵),其特点是:

    • 对"盲目自信的错误预测"施加严厉惩罚
    • 形成凸函数,保证优化过程能找到全局最优解
  3. 优化方法:由于无法直接求解,必须采用梯度下降等迭代算法:

    • 将概率乘积转换为对数求和,避免数值计算问题
    • 通过求导获得简洁的梯度表达式
  4. 概率解释:模型输出通过Sigmoid函数转换为概率,完美适配二分类问题的伯努利分布特性。

这种理论框架确保了逻辑回归在分类问题中的统计合理性,而梯度下降则提供了可行的参数优化路径。

逻辑回归 (Logistic Regression)

这里是重点:逻辑回归不使用"最小二乘法"。

  • 为什么不用最小二乘法?

    • 如果你强行把最小二乘法(平方损失)套在逻辑回归头上,因为那个 S 形的 Sigmoid 函数存在,你的损失函数图像会变成**"非凸的" (Non-convex)**。
    • 人话解释: 图像会变得像波浪线一样,有很多个坑。梯度下降走进去,很容易掉进一个小坑(局部最优)就以为到底了,找不到真正的深渊(全局最优)。而且,你也推导不出一个像线性回归那样的直接求解公式。
  • 那它基于什么?

    • 理论基础: 最大似然估计 (Maximum Likelihood Estimation, MLE)
    • 损失函数: 推导出来的是对数损失 (Log Loss / Cross Entropy)。这个函数的图像是个完美的碗形(凸函数),只有一个底。
    • 解题方法: 必须使用 梯度下降(或者更高级的牛顿法、L-BFGS等迭代算法)。逻辑回归没有"一步到位"的数学公式解。

结论: 逻辑回归的理论基础是最大似然估计 ,解法主要靠梯度下降

算法模型 核心思想 (理论基础) 损失函数 (评判标准) 求解方法 (怎么算出权重)
逻辑回归 最大似然估计 (MLE) 对数损失 (Log Loss) 只能用 梯度下降 (及其变种)

最大似然和对数损失函数(讲人话)

这两个概念是逻辑回归(以及所有概率模型)的灵魂。我们抛开枯燥的公式,用**"侦探破案""严厉的老师"**这两个比喻来解释。


1. 最大似然估计 (Maximum Likelihood Estimation, MLE)

人话代号:逆向推理的侦探

想象这样一个场景:

你面前有一个黑盒子(模型),上面有两个旋钮(参数)。你不确定这两个旋钮应该拧到刻度几,才能最完美地解释你看到的现象。

侦探游戏:抛硬币

假设你捡到一枚硬币,你怀疑它做过手脚(灌了铅)。

  • 实验: 你抛了 10 次,竟然 10 次都是正面朝上
  • 推测 A: 这是一枚普通硬币 (正面概率 50%)。
    • 发生"10次全正"的概率是:0.5×0.5×...≈0.00090.5×0.5×...≈0.0009(万分之九)。
  • 推测 B: 这是一枚作弊硬币 (正面概率 99%)。
    • 发生"10次全正"的概率是:0.99×0.99×...≈0.900.99×0.99×...≈0.90(百分之九十)。

侦探(MLE)的逻辑:

"既然'10次全正'这件事已经实实在在发生了 ,那么推测 B 让这件事发生的概率最大(90% vs 0.09%)。所以,我有理由相信,这枚硬币就是作弊硬币!"

总结:
最大似然估计 就是一种**"事后诸葛亮"**的思维。

既然事情已经发生了,我们就反推:到底什么样的参数(旋钮),能让这件事情发生的概率最大? 那个参数就是我们要找的"最优解"。


2. 对数损失函数 (Log Loss)

人话代号:惩罚吹牛的严厉老师

在最大似然估计中,我们要算一连串概率的乘积 (例如 0.9×0.8×...0.9×0.8×...)。

这有两个大麻烦:

  1. 数值太小: 几十个零点几乘起来,结果接近于 0,计算机算不准(下溢出)。
  2. 不好算: 乘法求导很麻烦,加法求导很容易。

于是,数学家引入了 对数(Log) ,把乘法变成了加法。同时,为了配合梯度下降(它喜欢找最低点,不喜欢找最高点),我们加了个负号 。这就变成了对数损失

它的评分标准非常特别:它不仅看你对不对,还看你"信不信"。

假设我们要预测一张图是不是猫(1是猫,0不是猫)。真实答案是:这是一只猫(1)

  • 学生小明(谦虚且对):
    • 预测:是猫的概率 0.6。
    • Log Loss 评价:虽然对了,但你不太自信。罚酒 1 杯(损失值小)。
  • 学生小红(自信且对):
    • 预测:是猫的概率 0.99。
    • Log Loss 评价:非常自信且正确!不罚,甚至发小红花(损失值接近 0)。
  • 学生小刚(犹豫且错):
    • 预测:是猫的概率 0.4(意味着他觉得可能是狗)。
    • Log Loss 评价:错是错了,好在你话没说死。罚酒 3 杯(损失值中等)。
  • 学生小强(自信但大错特错------最惨):
    • 预测:是猫的概率 0.01(他拍着胸脯说:这绝对不是猫!)。
    • Log Loss 评价:直接拖出去枪毙!
    • 原理: log⁡(0.01)log(0.01) 是一个巨大的负数,取反后就是巨大的惩罚。

总结:
对数损失函数最痛恨**"盲目自信的错误"**。

  • 如果你预测对了,且越自信(概率越接近1),损失越小。
  • 如果你预测错了,且越自信(概率越接近0或1的极端),损失会呈指数级爆炸。

3. 两者的关系(一句话点破)

最大似然 是我们的**"指导思想"(我们要让模型最符合现实)。
对数损失是这个思想落地的
"执行工具"**。

数学上:
最大化 似然函数(让好事发生的概率最大) ≈≈ 最小化 对数损失函数(让犯错的惩罚最小)。

它们是一枚硬币的两面,只是为了方便计算机算梯度,我们平时都只用"对数损失"。

最大似然和对数损失函数(数学推导)

简单来说,对数损失函数(Log Loss)并不是数学家拍脑袋想出来的,而是通过最大似然估计(MLE)严格推导出来的。

我们分四步来完成这个推导。


第一步:定义单个样本的概率公式

在二分类(Binary Classification)中,我们假设:

  • y=1y=1 的概率是 hθ(x)hθ(x)。
  • y=0y=0 的概率是 1−hθ(x)1−hθ(x)。

为了方便数学运算,我们需要把这两个式子合并成一个通项公式

利用 yy 只能取 0 或 1 的特性,我们可以写出**伯努利分布(Bernoulli Distribution)**公式:

P(y∣x;θ)=(hθ(x))y⋅(1−hθ(x))1−yP(y∣x;θ)=(hθ​(x))y⋅(1−hθ​(x))1−y

我们来验证一下是否正确:

  • 当 y=1y=1 时:
    P=(h)1⋅(1−h)0=h⋅1=hP=(h)1⋅(1−h)0=h⋅1=h
    (对应 y=1y=1 的概率,正确)
  • 当 y=0y=0 时:
    P=(h)0⋅(1−h)1=1⋅(1−h)=1−hP=(h)0⋅(1−h)1=1⋅(1−h)=1−h
    (对应 y=0y=0 的概率,正确)

第二步:构建似然函数 (Likelihood Function)

现在的目标是:找到一组参数 θθ,使得所有样本(假设有 mm 个)同时发生的概率最大。

因为样本之间是独立 的,所以"所有样本同时发生"的总概率,就是每一个样本概率的乘积

定义似然函数 L(θ)L(θ):

L(θ)=∏i=1mP(y(i)∣x(i);θ)L(θ)=∏i=1m​P(y(i)∣x(i);θ)

L(θ)=∏i=1m[(hθ(x(i)))y(i)⋅(1−hθ(x(i)))1−y(i)]L(θ)=∏i=1m​[(hθ​(x(i)))y(i)⋅(1−hθ​(x(i)))1−y(i)]

最大似然的核心思想: 我们要调节 θθ,让 L(θ)L(θ) 的值最大


第三步:取对数 (Log-Likelihood)

上一步得到的 L(θ)L(θ) 是连乘积。连乘有两个坏处:

  1. 难算: 对连乘求导非常痛苦。
  2. 下溢出: 很多个 0.9、0.8 乘在一起,结果会迅速趋近于 0,计算机无法处理。

所以,我们两边同时取自然对数 (ln⁡ln 或 log⁡log)

利用对数性质:log⁡(a⋅b)=log⁡a+log⁡blog(a⋅b)=loga+logb 和 log⁡(ab)=blog⁡alog(ab)=bloga。

得到对数似然函数 l(θ)l(θ):

l(θ)=log⁡L(θ)l(θ)=logL(θ)

l(θ)=∑i=1mlog⁡[(hθ(x(i)))y(i)⋅(1−hθ(x(i)))1−y(i)]l(θ)=∑i=1m​log[(hθ​(x(i)))y(i)⋅(1−hθ​(x(i)))1−y(i)]

利用加法和指数下沉的性质拆开:

l(θ)=∑i=1m[y(i)log⁡(hθ(x(i)))+(1−y(i))log⁡(1−hθ(x(i)))]l(θ)=∑i=1m​[y(i)log(hθ​(x(i)))+(1−y(i))log(1−hθ​(x(i)))]

此时的目标依然是:最大化 (Maximize) l(θ)l(θ)。


第四步:转化为损失函数 (Loss Function)

在机器学习中,我们习惯做最小化 (Minimize) 任务(比如梯度下降是往山谷走,不是往山顶走)。

为了把"最大化似然"变成"最小化损失",我们需要做两个操作:

  1. 取负号: 最大化 AA 等价于最小化 −A−A。
  2. 取平均: 除以样本数 mm(为了让损失值不随样本数量增加而变大,标准化)。

于是,我们得到了最终的对数损失函数 (Log Loss / Cross Entropy)

J(θ)=−1ml(θ)J(θ)=−m1​l(θ)

代入刚才的式子:

J(θ)=−1m∑i=1m[y(i)log⁡(hθ(x(i)))+(1−y(i))log⁡(1−hθ(x(i)))]J(θ)=−m1​∑i=1m​[y(i)log(hθ​(x(i)))+(1−y(i))log(1−hθ​(x(i)))]


总结推导逻辑链

  1. 概率模型: P=hy(1−h)1−yP=hy(1−h)1−y (巧妙利用0和1的特性)
  2. 似然函数: L=∏PiL=∏Pi (所有样本全对的概率,连乘)
  3. 对数似然: log⁡L=∑log⁡PilogL=∑logPi (为了好算,变乘为加)
  4. 损失函数: Loss=−1mlog⁡LLoss=−m1logL (为了做梯度下降,变大为小)

这就是为什么逻辑回归的损失函数长成这个样子。它本质上就是带着负号的最大似然估计

最大似然和对数损失函数(代码实现)

这段代码将通过可视化的方式,直观地展示对数损失函数(Log Loss)是如何工作的,以及 最大似然估计(MLE)最小化损失之间的"镜像关系"。

代码包含两个核心可视化部分:

  1. 单样本视角:展示为什么预测错了要"重罚"(损失函数的形状)。
  2. 全局优化视角 :展示最大化似然 (找最高点)和最小化损失(找最低点)是如何殊途同归的。

Python 代码实现

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

# ==========================================
# 0. 基础函数定义
# ==========================================

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def calculate_log_loss(y_true, y_pred_prob):
    # 加一个极小值 eps 防止 log(0) 报错
    eps = 1e-15
    y_pred_prob = np.clip(y_pred_prob, eps, 1 - eps)
    # 公式: - [y * log(h) + (1-y) * log(1-h)]
    return - (y_true * np.log(y_pred_prob) + (1 - y_true) * np.log(1 - y_pred_prob))

def calculate_log_likelihood(y_true, y_pred_prob):
    eps = 1e-15
    y_pred_prob = np.clip(y_pred_prob, eps, 1 - eps)
    # 似然是概率乘积,对数似然是概率对数之和
    # 公式: Σ [y * log(h) + (1-y) * log(1-h)]
    return np.sum(y_true * np.log(y_pred_prob) + (1 - y_true) * np.log(1 - y_pred_prob))

# ==========================================
# 可视化 1: 单个样本的损失函数形状
# ==========================================
plt.figure(figsize=(12, 5))

# 模拟预测概率从 0.01 到 0.99
h = np.linspace(0.001, 0.999, 100)

# 情况 A: 真实标签 y=1 (是一只猫)
# 损失 = -log(h)
cost_y1 = -np.log(h)

# 情况 B: 真实标签 y=0 (不是猫)
# 损失 = -log(1-h)
cost_y0 = -np.log(1 - h)

plt.subplot(1, 2, 1)
plt.plot(h, cost_y1, 'b-', linewidth=3, label='y=1 (True is 1)')
plt.plot(h, cost_y0, 'r--', linewidth=3, label='y=0 (True is 0)')
plt.title("Log Loss Function (Single Sample)", fontsize=14)
plt.xlabel("Predicted Probability (h)", fontsize=12)
plt.ylabel("Loss / Cost", fontsize=12)
plt.legend(fontsize=12)
plt.grid(True, alpha=0.3)

# 添加文字说明
plt.text(0.1, 3, "Predict wrong\n(High Cost)", fontsize=10, color='red')
plt.text(0.7, 0.5, "Predict right\n(Low Cost)", fontsize=10, color='blue')

# ==========================================
# 可视化 2: 最大似然 vs 最小损失 (全局视角)
# ==========================================
# 1. 生成模拟数据
np.random.seed(42)
X = np.random.randn(50) # 50个样本
true_w = 2.0 # 真实的权重是 2.0
# 根据真实权重生成 y (概率采样)
probs = sigmoid(X * true_w)
y = np.random.binomial(1, probs)

# 2. 暴力搜索:假设我们不知道 w 是 2.0,我们试探从 -2 到 6 的各种 w
w_candidates = np.linspace(-2, 6, 100)
log_likelihoods = []
losses = []

for w in w_candidates:
    # 预测概率
    y_pred = sigmoid(X * w)
    
    # 计算总对数似然 (Log Likelihood) -> 我们希望它最大
    ll = calculate_log_likelihood(y, y_pred)
    log_likelihoods.append(ll)
    
    # 计算平均损失 (Log Loss / Cost) -> 我们希望它最小
    # Loss = -1/m * LogLikelihood
    loss = np.mean(calculate_log_loss(y, y_pred))
    losses.append(loss)

# 3. 绘图对比
plt.subplot(1, 2, 2)

# 双Y轴绘制
ax1 = plt.gca()
ax2 = ax1.twinx()

# 画对数似然 (红色,找最高点)
line1, = ax1.plot(w_candidates, log_likelihoods, 'r-', linewidth=2, label='Log Likelihood (Maximize)')
ax1.set_xlabel('Parameter w (Weight)', fontsize=12)
ax1.set_ylabel('Log Likelihood (Sum)', color='r', fontsize=12)
ax1.tick_params(axis='y', labelcolor='r')

# 画损失函数 (蓝色,找最低点)
line2, = ax2.plot(w_candidates, losses, 'b--', linewidth=2, label='Log Loss (Minimize)')
ax2.set_ylabel('Log Loss / Cost (Mean)', color='b', fontsize=12)
ax2.tick_params(axis='y', labelcolor='b')

# 标出最优解
best_w_idx = np.argmax(log_likelihoods)
best_w = w_candidates[best_w_idx]
plt.axvline(x=best_w, color='green', linestyle=':', label='Optimal w')
plt.title(f"MLE vs Log Loss\nOptimal w ≈ {best_w:.2f} (True=2.0)", fontsize=14)

# 合并图例
lines = [line1, line2]
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='center right')

plt.tight_layout()
plt.show()

可视化图解

图一(左侧):单样本的赏罚机制

这张图展示了对数损失函数的核心逻辑:不要盲目自信

  • 蓝线 (当真实是 y=1 时):
    • 如果你预测概率是 1.0(非常自信是对的),损失是 0。
    • 如果你预测概率是 0.0(非常自信是错的),损失直接飙升到无穷大(图左侧蓝线陡峭上升)。
  • 红线 (当真实是 y=0 时):
    • 如果你预测概率是 0.0,损失是 0。
    • 如果你预测概率是 1.0,损失飙升到无穷大。

结论: 对数损失函数是一个"严厉的老师",它对**Confidence(置信度)**非常敏感。

图二(右侧):最大似然 vs 最小损失

这张图展示了硬币的两面。X 轴是我们猜测的参数 ww(权重)。

  • 红线 (Log Likelihood): 这是一个倒扣的碗。也就是最大似然估计。我们要爬到山顶(Maximize),山顶对应的 ww 大约是 2.0。
  • 蓝线 (Log Loss): 这是一个正放的碗。也就是损失函数。我们要走到谷底(Minimize)。
  • 绿线 (最优解): 你会发现,红线的最高点 ,垂直对下来的位置,正好也是蓝线的最低点

结论:

数学推导中的 J(θ)=−1ml(θ)J(θ)=−m1​l(θ) 在图上得到了完美验证。
最大化似然(让模型最像真的) 等价于 最小化对数损失(让犯错惩罚最小)。它们算出的是同一个最优参数。

最大似然和对数损失函数(逻辑回归中的应用)

在逻辑回归中,**最大似然估计(MLE)对数损失函数(Log Loss)**并不是两个独立的东西,而是一套组合拳。

它们的应用流程可以概括为:MLE 制定战略,Log Loss 执行战术,梯度下降负责跑腿。

以下是它们在逻辑回归中应用的完整四步闭环


第一步:确立目标(MLE 制定战略)

应用场景: 模型刚建立,甚至还没开始训练时。

逻辑回归的输出是一个概率值 y^y^​(比如 0.8)。

面对一堆训练数据(有的 y=1y=1,有的 y=0y=0),我们到底想要什么样的参数 θθ(权重 ww 和偏置 bb)?

最大似然估计(MLE)站出来定调子:

"我们的终极目标是:找到一组参数 w,bw,b,使得模型预测出来的概率分布,最像真实发生的历史数据。"

  • 如果某条数据真实是 1,模型预测的概率 y^y^ 就要越接近 1 越好。
  • 如果某条数据真实是 0,模型预测的概率 y^y^ 就要越接近 0 越好。
  • 应用体现: 这一步确定了我们的数学方向------我们要最大化所有样本预测正确概率的乘积(即似然函数 LL)。

第二步:转化难题(Log Loss 执行战术)

应用场景: 准备构建损失函数时。

MLE 虽然定好了目标(最大化乘积),但在计算机工程落地时遇到了两个大坑:

  1. 算不动: 几万个样本的概率(0.x)乘在一起,结果几乎等于 0(下溢出)。
  2. 不好求导: 乘法的导数极其复杂,没法做梯度下降。

对数损失函数(Log Loss)站出来解决问题:

它对 MLE 的公式做了"整容手术":

  1. 取对数: 把"连乘"变成了"求和"。
  2. 取负号: 把"最大化似然"变成了"最小化损失"(符合人类直觉:误差越小越好)。

应用体现:

逻辑回归最终使用的损失函数公式 ,就是这样诞生的:

J(θ)=−1m∑[ylog⁡(y^)+(1−y)log⁡(1−y^)]J(θ)=−m1​∑[ylog(y^​)+(1−y)log(1−y^​)]

这步的意义: 如果没有 MLE 的理论支撑,我们就不知道为什么要用这个奇怪的 Log Loss 公式(为什么不用平方差 MSE?)。正是 MLE 告诉我们:对于 0/1 分类问题,Log Loss 才是统计学上的最优解。


第三步:指导方向(计算梯度)

应用场景: 训练过程中的每一次迭代。

现在有了 Log Loss 函数 J(θ)J(θ),它的图像是一个碗底形(凸函数)。

我们需要告诉计算机:参数 ww 和 bb 应该往大调,还是往小调?

应用体现:

我们对 Log Loss 函数进行求导(计算梯度)

因为 Log Loss 的特殊结构(包含对数),它和 Sigmoid 函数(包含指数)在一起求导时,会发生奇妙的化学反应------复杂的对数和指数互相抵消了!

最终算出的梯度非常简洁:

梯度=预测值−真实值=(y^−y)⋅x梯度=预测值−真实值=(y^​−y)⋅x

  • 如果 Log Loss 很大(预测严重错误),梯度就很大,参数调整幅度就大。
  • 如果 Log Loss 很小(预测基本正确),梯度就很小,参数微调即可。

第四步:修正模型(参数更新)

应用场景: 梯度下降的最后一步。

根据上一步 Log Loss 提供的"梯度(方向和力度)",我们更新参数:

wnew=wold−学习率×梯度wnew​=wold​−学习率×梯度


总结:一句话理清关系

在逻辑回归中:

  1. 最大似然 (MLE) 是**"立法者":它从概率论的角度证明了,为了让模型最准,我们必须**优化"预测概率的对数"这一指标。
  2. 对数损失 (Log Loss) 是**"执法者":它把 MLE 的理论思想,固化成了一个具体的、计算机可运行的数学公式**。
  3. 此后,所有的训练过程(梯度下降),都是围绕着**"如何让 Log Loss 这个数字变小"**来进行的。
相关推荐
流年如夢1 小时前
排序算法详解
数据结构·算法·排序算法
会编程的土豆1 小时前
Go 语言中的 `new` 关键字(创建指针)
java·算法·golang
南宫萧幕2 小时前
HEV能量管理建模实战:从零搭建 Simulink 物理环境到 Python(DQN) 强化学习联合仿真调通
开发语言·python·算法·matlab·汽车·控制
x_yeyue2 小时前
2026第十七届蓝桥杯c++B组省赛题解
笔记·算法·蓝桥杯·acm·题解
handler012 小时前
【C++ 算法竞赛基础】数论篇:核心公式、经典例题与高频模板
开发语言·c++·算法·蓝桥杯·数论·最大公约数·最小公倍数
z200509302 小时前
今日算法(二叉树)
数据结构·c++·算法
南境十里·墨染春水2 小时前
八大排序算法 - 基数排序
算法·排序算法
老四啊laosi2 小时前
[滑动窗口] 12. 将 x 减到 0 的最小操作数
算法·leetcode·将 x 减到 0 的最小操作数
一条大祥脚2 小时前
Codeforces Round 1098 (Div. 2)
算法·深度优先