损失函数和正则化 Loss Function& Regularization

本文探讨深度学习中关键概念——损失函数与正则化的应用。通过实例解析SVM损失函数与合页函数的关系,以及正则化如何避免过拟合,确保模型泛化能力。同时,介绍了Softmax分类器及其损失函数的计算方式。

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

By Stockholm_Sun
我们来谈谈关于深度学习的概念,损失函数。
这次我将给出一些例子来解释。
(Slide From Stanford CS231n)
CS231n
显然,现在的情况是:猫没有被正确分类,车是对的,青蛙完全错了。
为了使它们完全正确,我们引入了损失函数。现存的损失函数还是比较多样的,这里介绍两种。

SVM loss

SVM损失函数具有如下形式:
在这里插入图片描述
由于自变量的变化像一个合页,所以又被成为“合页函数”。其中,s_y_i表达的含义是正确分类对应的分数。接下来,我们以第一列为例,求一下Loss值:

Losses = max ( 0 , 5.1 - 3.2 + 1 ) + max ( 0 , -1.7 - 3.2 + 1 ) = 2.9

同理,第二、三列的Losses分别为 0 和 12.9 ,最终根据定义求得L值为 L = ( 2.9 + 0 + 12.9 ) / 3 = 5.27
L的大小也就衡量了模型的好坏,越小越好。而且不难得出,L取值范围为 [ 0 , INF )。值得一提的是,上述公式中的为什么要在 s_j - s_y_i 的后面加一个1呢?实际上这个1是一个常数,一般在采用合页函数时就会+1,当然也可以加其它数字。

正则化 Regularization

试想一下,拟合训练集时如果每一个都严格的来拟合,那么对应产生的拟合模型会十分复杂,这实际上是不必要的,因此引入正则化来限制模型变得更复杂。
因此,正则化后L函数的真正的表达式如下:在这里插入图片描述
λ是一个超参数,此外,需要提到的是几个R(W)的形式:
在这里插入图片描述
笼统来说,L2正则化保证了把大型错误放大,L1正则化则更喜欢权重矩阵更稀疏的表达。

Softmax Classifier

它对于每一个分数作出了如下处理:首先将其exp,然后归一化(在这里的表述就是求得权值),损失函数即为所得值的负自然对数,总结下来公式如下:
在这里插入图片描述
不难得出,L取值范围也是 [ 0 , INF )
综上所述,最终的Loss可被归结表述为:
在这里插入图片描述

<think>嗯,用户问的是如何在Matlab中绘制L曲线,当使用L1正则化损失函数是非线性的情况。首先,我需要回忆一下L曲线是什么。L曲线通常用来展示正则化参数λ对模型复杂度拟合误差之间的权衡,横轴通常是正则化项,纵轴是损失函数值。不过对于L1正则化,可能结构会有所不同。 用户提到损失函数是非线性的,这可能意味着问题不是线性回归,比如可能是逻辑回归或者其他非线性模型。这时候,传统的L曲线绘制方法可能需要调整,因为解析解可能不存在,需要数值优化方法。 首先,要绘制L曲线,通常需要计算不同λ值下的损失函数正则化项的值。对于非线性损失函数,可能需要使用优化算法(如fmincon)来求解每个λ对应的参数θ,然后记录这两个值。 步骤可能包括: 1. 定义损失函数L1正则化项。例如,损失函数可能是交叉熵,正则化项是λ*sum(abs(θ))。 2. 对于一系列λ值,使用优化器求解最小化的目标函数(损失+正则化)。 3. 收集每个λ对应的损失函数值(不加正则化项)正则化项的值(比如L1范数)。 4. 绘制损失值随正则化项变化的曲线,或者正则化参数λ与两者的关系。 需要注意的是,当损失函数是非线性时,优化可能变得困难,尤其是L1正则化导致的问题可能非光滑。可能需要使用特定的优化算法,如迭代阈值法或近端梯度下降,或者利用Matlab的优化工具箱中的函数,比如fminunc或fmincon,并确保处理非光滑项的方法正确。 另外,L曲线的形状可能不如L2正则化那样光滑,因为L1会导致参数稀疏,可能存在拐点。用户可能需要生成足够多的λ点来捕捉曲线的变化,尤其是在λ较小的区域,正则化项的变化可能更剧烈。 可能的代码结构大致是生成λ的数组,循环每个λ,运行优化,记录结果,然后绘图。需要注意初始值的选择可能影响优化结果,可能需要设置合适的初始值,比如零向量或者某个合理的估计。 此外,用户可能需要将损失函数正则化项分开计算,即在优化目标中包括正则化项,但在记录损失值时只计算原始损失。例如,优化目标为J = loss + λ*L1,但绘制时,横轴可能是L1范数,纵轴是loss,或者横轴是λ,纵轴是两者的组合,这需要明确用户的需求。 可能遇到的问题包括优化过程耗时,尤其是当λ很多或者模型参数很多时。这时可能需要并行计算或者更高效的算法。另外,对于不同的λ,可能需要调整优化选项,比如最大迭代次数,以确保收敛。 总结步骤: 1. 定义损失函数L1正则化项。 2. 生成一组λ值,通常是等比数列,如logspace。 3. 对每个λ,求解最小化问题,得到参数θ。 4. 计算每个θ对应的原始损失值L1范数。 5. 绘制损失值vs L1范数的曲线,或者损失L1的组合随λ的变化。 可能的Matlab代码示例可能使用循环,调用fmincon,并在每次迭代中保存结果。然后使用plot或loglog函数绘制曲线。</think>当处理非线性损失函数的L1正则化问题时,绘制L曲线需要结合数值优化方法。以下是具体步骤示例代码: ### 方法步骤 1. **定义损失函数正则化项**:将原始损失函数(非线性)L1正则化项分开定义。 2. **参数优化**:对每个正则化参数λ,使用优化算法(如`fmincon`)求解最优参数θ。 3. **数据收集**:记录每个λ对应的原始损失值(不含正则化项)L1范数值。 4. **曲线绘制**:以L1范数为横轴,损失值为纵轴绘制L曲线。 ### 示例代码 ```matlab % 假设非线性损失函数(示例:Logistic回归损失) function loss = myLoss(theta, X, y) z = X * theta; loss = mean(-y .* log(sigmoid(z)) - (1 - y) .* log(1 - sigmoid(z))); end % L1正则化项函数 function reg = l1Reg(theta, lambda) reg = lambda * sum(abs(theta)); end % 主程序 X = ... % 输入数据特征矩阵 y = ... % 输入标签 theta_initial = zeros(size(X,2),1); % 初始参数 lambda_values = logspace(-4, 2, 50); % 生成λ值(对数分布) % 预分配存储 loss_values = zeros(length(lambda_values),1); l1_norms = zeros(length(lambda_values),1); options = optimoptions('fmincon', 'Display', 'off', 'Algorithm', 'interior-point'); for i = 1:length(lambda_values) lambda = lambda_values(i); % 定义目标函数 = 损失 + 正则化 objFun = @(theta) myLoss(theta, X, y) + l1Reg(theta, lambda); % 优化求解 [theta_opt, ~] = fmincon(objFun, theta_initial, [], [], [], [], [], [], [], options); % 记录原始损失(不含正则化L1范数 loss_values(i) = myLoss(theta_opt, X, y); l1_norms(i) = sum(abs(theta_opt)); end % 绘制L曲线 figure; loglog(l1_norms, loss_values, 'b-o'); xlabel('L1 Norm of θ'); ylabel('Loss Value (Without Regularization)'); title('L-Curve for L1 Regularization (Nonlinear Loss)'); grid on; ``` ### 关键解释 - **数值优化**:由于损失函数非线性,必须依赖数值优化算法。`fmincon`的`interior-point`算法能处理非光滑L1正则化。 - **λ值选择**:使用对数间隔(`logspace`)覆盖大范围,重点观察小λ区域的变化。 - **数据分离**:记录损失值时需排除正则化项,否则曲线会重复包含λ的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值