浅谈LR算法的Cost Function

博客探讨逻辑回归为何不用最小化平方误差函数(MSE)作为代价函数,主要原因有:MSE假设是高斯分布,而逻辑回归采用伯努利分布;MSE会使代价函数非凸,存在局部最优解;MSE更易导致梯度弥散。还分析了代价函数为凸函数的原因及MSE易导致梯度弥散的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解LR的同学们都知道,LR采用了最小化交叉熵或者最大化似然估计函数来作为Cost Function,那有个很有意思的问题来了,为什么我们不用更加简单熟悉的最小化平方误差函数(MSE)呢?

我个人理解主要有三个原因:

  • MSE的假设是高斯分布,交叉熵的假设是伯努利分布,而逻辑回归采用的就是伯努利分布;
  • MSE会导致代价函数J(θ)非凸,这会存在很多局部最优解,而我们更想要代价函数是凸函数;
  • MSE相对于交叉熵而言会加重梯度弥散。

这里着重讨论下后边两条原因。

代价函数为什么要为凸函数?

假设对于LR我们依旧采用线性回归的MSE作为代价函数:

J(θ)=12mi=1m(hθ(x(i))y(i))2 J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2

其中
hθ(x)=11+eθTx h θ ( x ) = 1 1 + e − θ T x

这样代价函数 J(θ) J ( θ ) 关于算法参数θ会是非凸函数,存在多个局部解,我们可以形式化的表示为下图:
这里写图片描述
如上图所示, J(θ) J ( θ ) 非常复杂,这并不是我们想要的。我们想要的代价函数是关于θ的凸函数,这样我们就可以轻松地根据梯度下降法等最优化手段去轻松地找到全局最优解了。

所以,我们理想的代价函数应该是凸函数,如下图所示:
这里写图片描述
因此,MSE对于LR并不是一个理想的代价函数。那么为什么交叉熵可以呢?我们先给出交叉熵的公式形式:

J(θ)=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))] J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ]

即令每个样本属于其真实标记的概率越大越好,可以证明 J(θ) J ( θ ) 是关于θ的高阶连续可导的凸函数,因此可以根据凸优化理论求的最优解。

note:最小化交叉熵也可以理解为最大化似然估计,即利用已知样本分布,找到最有可能导致这种分布的参数值,即最优解 θ θ ∗

为什么MSE会更易导致梯度弥散?

我们简单求解下MSE和交叉熵对应w的梯度,首先是MSE:

对于单样本的Loss Function为:

LMSE=12(yy^)2 L M S E = 1 2 ( y − y ^ ) 2

LMSE L M S E 对于w的梯度为:

LMSEw=(yy^)σ(w,b)h ∂ L M S E ∂ w = ( y − y ^ ) σ ( w , b ) h

其中 σ(w,b) σ ( w , b ) 为sigmoid函数:

σ(w,b)=11+ewTx+b σ ( w , b ) = 1 1 + e − w T x + b

而以交叉熵为Loss Function:

Lcrossentropy=(ylogy^+(1y)log(1y^)) L c r o s s e n t r o p y = − ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) )

则对应的梯度为:

Lcrossentropyw=(y^y)h ∂ L c r o s s e n t r o p y ∂ w = ( y ^ − y ) h

我们对比两者的梯度绝对值可以看出MSE和交叉熵两种损失函数的梯度大小差异:
|ΔMSE||Δcrossentropy|=σ(w,b)0.25 | Δ M S E | | Δ c r o s s e n t r o p y | = | σ ′ ( w , b ) | ≤ 0.25

即MSE的梯度是交叉熵梯度的1/4。

note:
Cost Function和Loss Function的区别
Cost Function:指基于参数 w w b,在所有训练样本上的总成本;
Loss Function:指单个训练样本的损失函数。

其实可以从另外一个角度理解为什么交叉熵函数相对MSE不易导致梯度弥散:当训练结果接近真实值时会因为梯度算子极小,使得模型的收敛速度变得非常的缓慢。而由于交叉熵损失函数为对数函数,在接近上边界的时候,其仍然可以保持在高梯度状态,因此模型的收敛速度不会受损失函数的影响。

参考文献:
[1]. Poll的笔记:[Machine Learning] 浅谈LR算法的Cost Function

在MATLAB中,随机梯度下降(Random Gradient Descent,RGD)是一种常用的优化算法,用于寻找函数的最小值。它的基本思想是在每个迭代步骤中,选择一个随机的方向并沿该方向移动一个小步长,这个小步长通常是由学习率乘以当前点处的随机梯度估计确定的。 以下是使用MATLAB实现随机镜像下降算法的一个简单示例: ```matlab function [x, cost] = random_mirror_descent(f, grad_f, x0, lr, max_iter, mirror_func) % f: 目标函数 % grad_f: 梯度函数 % x0: 初始点 % lr: 学习率 % max_iter: 最大迭代次数 % mirror_func: 镜像反射函数 x = x0; cost = f(x); % 记录初始成本 for iter = 1:max_iter % 随机选择一个方向 direction = -grad_f(x) + randn(size(x)); % 加入随机噪声 % 使用mirror_func应用反射操作 step_direction = mirror_func(direction); % 更新步骤大小(这里假设lr是一个固定的值) step_size = lr * norm(step_direction); % 更新位置 next_x = x + step_size * step_direction; % 如果越界,应用边界反射 if ~isInsideDomain(next_x) % 自定义判断是否越界的函数 next_x = reflect(next_x, domain_boundary); end % 更新状态并记录成本 x = next_x; new_cost = f(x); cost(iter+1) = new_cost; % 如果新成本大于旧成本,说明可能陷入局部极小,考虑回退 if new_cost > cost(iter) % 回退到上一步的位置 x = x - 2 * step_size * step_direction; end end ``` 请注意,上述代码是一个简化版的示例,实际使用时可能需要根据具体的应用场景调整细节,比如如何判断是否越界、如何计算正确的反射方向等。此外,对于复杂的边界条件或特定类型的反射操作,可能需要引入额外的库或自定义函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值