Machine Learning - VII. Regularization规格化 (Week 3)

本文深入探讨了机器学习中的规范化原理及其在不同场景的应用,包括逻辑回归、线性规划、欠拟合与过拟合的识别,以及如何通过调整参数避免过拟合。重点介绍了规范化在减少模型复杂度、提升泛化能力方面的关键作用,并提供了实用的规范化方法与案例分析。

http://blog.csdn.net/pipisorry/article/details/43966361

机器学习Machine Learning - Andrew NG courses学习笔记

规格化Regularization

过拟合Overfitting

线性规划的例子(housing prices)                                                   逻辑回归的例子(breast tumor cancer)

从左到右分别是欠拟合(underfitting,也称High-bias)、合适的拟合和过拟合(overfitting,High variance)三种情况。

欠拟合underfit(or the hypothesis having high bias; figure1): if the algorithm has a very strong preconception, or a very strong bias that housing prices are going to vary linearly with their size and despite the data to the contrary.

过拟合overfit(figure3): 可以看到,如果模型复杂(可以拟合任意的复杂函数),它可以让我们的模型拟合所有的数据点,也就是基本上没有误差。对于回归来说,就是我们的函数曲线通过了所有的数据点。对分类来说,就是我们的函数曲线要把所有的数据点都分类正确。这两种情况很明显过拟合了。The term high variance is a historical or technical one.But, the intuition is that,if we're fitting such a high order polynomial, then, the hypothesis can fit almost any function and this face of possible hypothesis is just too large, it's too variable.
And we don't have enough data to constrain it to give us a good hypothesis so that's called overfitting. the curve tries too hard to fit the training set, so that it even fails to generalize to new examples and fails to predict prices on new examples.

如在逻辑规划中,如果你有太多的features(不一定是多项式features),就可能导致过拟合。More generally if you have logistic regression with a lot of features.Not necessarily polynomial ones, but just with a lot of features you can end up with overfitting.

过拟合的存在也导致训练集误差并不是一个分类器在新数据上好坏评估的好指示器。

解决过拟合问题的方法


当我们有很多features,但是只有很少的训练数据时,就会有overfitting问题。而由于features太多又不好绘制,不好确定保留哪些features。

解决方法



 怎么检测underfit & overfit?

鉴别两种类型的问题使用Learning Curves学习曲线方法来检测。

具体解决方法及检测具体的方法请参考[Machine Learning - X. Advice for Applying Machine Learning机器学习应用上的建议 (Week 6) ]

皮皮blog



规格化:代价函数Cost Function

规格化的好处的Intuition

小的参数通过会导致smoother和simpler的函数。And it is kind of hard to explain unless you implement yourself and see it for yourself.

至于规格化有这么些好的特性的理论解释请参考我的另一篇博文[最优化方法:范数和规则化regularization ]。

规格化:在代价函数中惩罚参数

添加规格化项regularization term。Note: 包不包括0在实践中对结果影响不大。


规格参数regularization parameter: λ

用于控制很好地拟合训练集和保持参数足够小的权衡,这样的话可以使hypothesis更简单从而避免过拟合。controls the trade of between the goal of fitting the training set well and the goal of keeping the parameter plan small and therefore keeping the hypothesis relatively simple to avoid overfitting.

λ设置太大带来的问题


λ太大,惩罚参数太狠,所有参数都接近0,这样就可能拟合出一条水平线,导致欠拟合underfitting。

λ设置的影响:在mlclass-ex2  -  2.5 Optional (ungraded) exercises中的一个例子


参数λ怎么选择?

枚举λ,在交叉验证集上选择使误差最小的规格化参数。

参考[Machine Learning - X. Advice for Applying Machine Learning机器学习应用上的建议 (Week 6) ],同时分析了λ在训练集和交叉验证集上的bias和var的变化。

皮皮blog





规格化线性规划Regularized Linear Regression

For linear regression, we had worked out two learning algorithms,gradient descent and the normal equation.There we take those two algorithms and generalize them to the case of regularized linear regression.

梯度下降解线性规划的改进


规格化线性回归时,我们并不惩罚θ0。
regularized的解释:在每一步规格化时,θJ总是乘上一个小于1的数,这样就可以shrinking参数θJ一点点,这也就是的效果。

Note: lz想,这样的话,是不是在很多问题中,我们只要用相当的思路,也就是在每次更新参数θ时,都乘一个小于1一点点的数就可以当成规格化了?毕竟其中的λ也是不确定的数。

Normal equation解线性规划的改进


推导: using the new definition of J of θ, with the regularization objective.Then this new formula for θ is the one that will give you the global minimum of J of θ.

Note: so long as the regularization parameter is strictly greater than zero.It is actually possible to prove that this matrix X transpose X plus parameter time, this matrix will not be singular and that this matrix will be invertible.

Regularized Logistic Regression规格化逻辑规划

规格化Gradient descent方法



(注意:中括号里应该是+λ/m*θj)

规格化高级方法

Code for regularized logistic regression

1. code to compute the regularized cost function:

J = -1/m * (y' * log(sigmoid(X*theta)) + (1-y)' * log(1 - sigmoid(X*theta))) + lambda/(2*m) * (theta'*theta - theta(1)*theta(1));

2. code to compute the gradient of the regularized  cost:

1>        #vectorized,推荐

grad = 1/m*(X'*(sigmoid(X*theta)-y));
temp = theta;temp(1)=0;
grad = grad+lambda/m*temp;

2>       #vectorized

tmp = X' * (sigmoid(X * theta) - y);
grad = (tmp + lambda * theta) / m;
grad(1) = tmp(1) / m; 

3>        #non-vectorized

grad(1) = 1/m*(sigmoid(X*theta)-y)'*X(:,1);
for i=2:size(theta)
    grad(i) = 1/m*(sigmoid(X*theta)-y)'*X(:,i) + lambda/m*theta(i);

end

Note: end keyword in indexing:One special keyword you can use in indexing is the end keyword in indexing.This allows us to select columns (or rows) until the end of the matrix.
For example, A(:, 2:end) will only return elements from the 2nd to last column of A. Thus, you could use this together with the sum and .^ operations to compute the sum of only the elements you are interested in(e.g., sum(z(2:end).^2)).

皮皮blog




Review复习



非线性分类器的学习在后面讲解,它们就不是使用linear\logistic regression的高维feature(polynomial terms)来实现了,如神经网络Neural Networks、支持向量机SVM。

from:http://blog.csdn.net/pipisorry/article/details/43966361


<think>我们有一个表达式:0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 2.0)) 其中,sparsity是一个表示稀疏度的标量或张量(可能是神经网络的激活稀疏度、权重稀疏度等) 步骤1:理解表达式各部分 1. torch.sigmoid(x) 函数:它将输入x映射到(0,1)区间,公式为:$$\sigma(x) = \frac{1}{1 + e^{-x}}$$ 2. 表达式中的参数:sparsity(通常表示当前稀疏度,比如某一层的激活稀疏度,即非零元素的比例) 3. 表达式:0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 2.0)) 步骤2:逐步计算表达式 设输入为:s = sparsity a. 计算 s - 2.0 b. 计算 torch.sigmoid(s-2.0) = 1/(1+exp(-(s-2.0))) c. 计算 1 - torch.sigmoid(s-2.0) d. 计算 0.3 * (1 - torch.sigmoid(s-2.0)) e. 计算 0.1 + 上述结果 步骤3:分析函数行为 考虑s在不同取值时,函数的行为: 当 s 远小于 2.0 时(比如s=0): s-2.0 ≈ -2.0, sigmoid(-2.0) ≈ 0.1192, 则1-sigmoid≈0.8808,然后乘以0.3≈0.2642,最后加上0.1≈0.3642 当 s 等于 2.0 时: s-2.0=0, sigmoid(0)=0.5, 1-0.5=0.5,0.3*0.5=0.15,加上0.1=0.25 当 s 远大于 2.0 时(比如s=4.0): s-2.0=2.0, sigmoid(2.0)≈0.8808, 1-0.8808≈0.1192,0.3*0.1192≈0.03576,加上0.1≈0.13576 因此,这个函数在s=2.0附近有一个平滑的过渡,且当稀疏度s增加时,函数值从0.36左右(当s很小)下降到0.14左右(当s很大)。 步骤4:函数图像 我们可以将函数写成: f(s) = 0.1 + 0.3 * (1 - σ(s-2.0)) 其中σ是sigmoid函数。 由于sigmoid函数是单调递增的,所以1-sigmoid(s-2.0)是单调递减的,因此f(s)也是关于s的单调递减函数。 当s→-∞时,σ(s-2.0)→0,f(s)→0.1+0.3*1=0.4 当s→∞时,σ(s-2.0)→1,f(s)→0.1+0.3*0=0.1 所以函数的值域为(0.1, 0.4) 步骤5:在深度学习中的应用 这个表达式可能用于动态调整正则化强度、学习率或其他超参数。具体地,它可能用于稀疏正则化(Sparsity Regularization)中,根据当前模型的稀疏度(sparsity)来调整惩罚项的系数。 在深度学习中,我们有时希望模型具有稀疏性(例如,激活稀疏、权重稀疏),这可以通过在损失函数中添加一个关于稀疏度的正则项来实现。而正则项的强度(系数)可能需要根据训练过程中当前的稀疏度进行动态调整。 例如,引用[1]和引用[4]提到了稀疏性正则化(Regularization for Sparsity)和结构化稀疏(Structured Sparsity)在深度神经网络中的应用。引用[1]中有一个表达式: sparsityError = [zeros(size(nn.a{i},1),1) nn.nonSparsityPenalty * (-nn.sparsityTarget ./ pi + (1 - nn.sparsityTarget) ./ (1 - pi))] 这显示了在稀疏自编码器中如何计算稀疏误差。 而我们的表达式:0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 2.0)) 可能被用作一个动态的稀疏惩罚系数(nonSparsityPenalty)。设计思路是: - 当稀疏度s较低(即模型还不够稀疏)时,我们希望惩罚大一些(系数大),以促使模型变得更加稀疏。 - 当稀疏度s较高(已经比较稀疏)时,我们希望惩罚小一些(系数小),以免过度惩罚导致模型性能下降。 在我们的表达式中,当s(稀疏度)小于2.0(这里的2.0可能是目标稀疏度?但注意稀疏度通常是一个0到1之间的值,而这里却出现了2.0,所以需要澄清)时,函数值较大(最大0.4),惩罚强;当s大于2.0时,函数值较小(最小0.1),惩罚弱。 但是,这里有一个关键点:稀疏度(sparsity)通常是指非零元素的比例,所以它的取值范围是[0,1]。而表达式中的2.0显然超出了这个范围。因此,我们需要重新考虑这个表达式中sparsity的含义。 可能的情况: 1. 这个sparsity不是以比例形式表示,而是以其他形式(比如非零元素的数量),但这样通常与规模相关,不太合理。 2. 表达式中的2.0可能是一个比例,但写成了2.0(即200%),这显然不可能,因为比例最大为1(100%)。 3. 可能是笔误,或者这里的sparsity并不是我们通常理解的稀疏度比例,而是其他含义。 重新审视:在引用[1]中,sparsityTarget通常是一个0到1之间的值(比如0.05)。所以表达式中的2.0很可能是2.0%,即0.02(但写成了2.0)。或者,可能是另一种情况:这个表达式中的sparsity是乘以100后的值(即百分比形式)?那么2.0就表示2%(即0.02)。这样,当sparsity=2.0(即2%)时,函数值为0.25;当sparsity=0时(0%),函数值为0.4;当sparsity=4.0(4%)时,函数值为0.14。 因此,假设sparsity是以百分比形式表示(即实际稀疏度乘以100),那么它的范围可能是[0,100](或更大,但通常不会超过100)。那么表达式中的2.0就对应2%的稀疏度。 应用场景:在训练过程中,我们监控每一层的稀疏度(比如激活的稀疏度,即激活值为0的比例),然后根据当前稀疏度动态调整稀疏正则项的强度。这个表达式给出的系数在稀疏度低于目标值(2%)时较大,高于目标值时较小,从而使得稀疏度向2%靠近。 另一种可能:表达式中的2.0并不是目标稀疏度,而是一个阈值,用来控制惩罚系数的变化。当稀疏度低于阈值时,惩罚系数较大;高于阈值时,惩罚系数较小。这样,阈值2.0(即2%)可能是我们设定的目标稀疏度。 因此,这个表达式可以作为一个自适应稀疏正则化系数,用于训练过程中动态调整稀疏惩罚的强度。 步骤6:总结计算结果 表达式:0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 2.0)) 其中sparsity是表示稀疏度的数值(可能是百分比形式,即实际稀疏度乘以100),取值范围可能是[0,100]。 该表达式将sparsity映射到一个(0.1, 0.4)之间的值,且当sparsity增加时,该值减小。 函数图像: 当sparsity=0时,值≈0.4 当sparsity=2.0时,值=0.25 当sparsity=4.0时,值≈0.14 应用:在深度学习中作为动态的稀疏正则化系数,根据当前模型的稀疏度调整惩罚强度,以引导模型达到目标稀疏度(2%)。 注意:如果sparsity是比例形式(即0到1之间),那么表达式中的2.0应该改为0.02,否则逻辑上不合理。因此,在实际使用中,需要根据sparsity的表示方式调整表达式。 例如,如果sparsity是比例(0.0~1.0),则表达式应改为: 0.1 + 0.3 * (1 - torch.sigmoid((sparsity * 100) - 2.0)) 或者 0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 0.02)) 但原表达式是直接使用sparsity(没有乘以100)减去2.0,所以更可能是sparsity已经以百分比形式给出。 结论:在应用该表达式时,必须确保sparsity和2.0在同一个尺度上(即都是百分比,或者都是比例)。如果sparsity是比例,则2.0应替换为0.02;如果sparsity是百分比,则保持原样。 步骤7:在PyTorch中的示例 假设我们有一个表示当前稀疏度的张量(以百分比形式),例如: sparsity = torch.tensor([0.0, 2.0, 4.0]) # 表示0%,2%,4% 则计算过程如下: ```python import torch sparsity = torch.tensor([0.0, 2.0, 4.0]) # 计算表达式 result = 0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 2.0)) print(result) # 输出:tensor([0.4000, 0.2500, 0.1358]) ``` 如果sparsity是比例形式(0~1),则我们需要调整: sparsity_percent = sparsity * 100 # 转换为百分比 result = 0.1 + 0.3 * (1 - torch.sigmoid(sparsity_percent - 2.0)) 或者直接修改表达式中的常数: result = 0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 0.02)) 但注意,两种方式在数值上并不完全等价,因为sigmoid函数的斜率不同。所以需要根据实际需求选择。 步骤8:应用场景扩展 除了稀疏正则化系数,类似的动态系数调整也可用于: - 学习率调整(根据稀疏度调整学习率) - Dropout率调整 - 其他正则化项的系数(如L1、L2) 在引用[4]中,作者采用了惩罚不重要的Filter和Channel的方法,这种动态调整的系数可以用于控制惩罚的强度。 因此,这个表达式在深度学习中的应用主要是作为自适应超参数调整机制的一部分。 注意:由于表达式输出值在0.1到0.4之间,所以它适合作为乘性系数(即正则化项乘以这个系数)。 最终答案: 表达式计算结果是一个在0.1到0.4之间的值,具体取决于sparsity的值(稀疏度,以百分比形式),且与sparsity负相关。在深度学习中,它常用于自适应调整稀疏正则化强度,以引导模型达到目标稀疏度(2%)。 相关问题: 1. 为什么在稀疏正则化中需要动态调整惩罚系数? 2. 如何监控深度学习模型中的稀疏度? 3. 除了Sigmoid函数,还有哪些函数可以用于设计自适应超参数调整? 4. 在PyTorch中如何实现自定义的动态正则化系数? 5. 稀疏正则化在卷积神经网络(CNN)中如何应用?与全连接层有何不同?</think>### 表达式分析:$0.1 + 0.3 \times (1 - \text{torch.sigmoid}(\text{sparsity} - 2.0))$ #### 1. **数学计算过程** 令 $x = \text{sparsity} - 2.0$,表达式简化为: $$f(\text{sparsity}) = 0.1 + 0.3 \times (1 - \sigma(x))$$ 其中 $\sigma(x)$ 是Sigmoid函数: $$\sigma(x) = \frac{1}{1 + e^{-x}}$$ | sparsity值 | 计算过程 | 结果范围 | |-----------|---------|---------| | **sparsity ≪ 2.0**<br>(如 sparsity=0) | $x \rightarrow -\infty$<br>$\sigma(x) \approx 0$<br>$f \approx 0.1 + 0.3 \times 1 = 0.4$ | 接近上限 0.4 | | **sparsity = 2.0** | $x = 0$<br>$\sigma(0) = 0.5$<br>$f = 0.1 + 0.3 \times 0.5 = 0.25$ | 中间值 0.25 | | **sparsity ≫ 2.0**<br>(如 sparsity=4.0) | $x \rightarrow +\infty$<br>$\sigma(x) \approx 1$<br>$f \approx 0.1 + 0.3 \times 0 = 0.1$ | 接近下限 0.1 | 函数特性: - **单调递减**:输出值随sparsity增加而减小 - **值域**:$(0.1, 0.4)$ - **平滑过渡**:在sparsity=2.0处有拐点 #### 2. **在深度学习中的应用** 此表达式主要用于**稀疏正则化**(Sparsity Regularization),通过动态调整惩罚强度引导模型达到目标稀疏度: 1. **稀疏性控制机制**: - 当 `sparsity < 2.0`(实际稀疏度低于目标):输出值接近0.4 → **增强惩罚** - 当 `sparsity > 2.0`(实际稀疏度高于目标):输出值接近0.1 → **减弱惩罚** - 目标稀疏度设定为2.0%(即0.02),需注意sparsity应为百分比形式[^1][^4] 2. **典型应用场景**: ```python # 伪代码:稀疏正则化项 sparsity = calculate_activation_sparsity() # 计算当前稀疏度(百分比) penalty_coeff = 0.1 + 0.3 * (1 - torch.sigmoid(sparsity - 2.0)) loss = cross_entropy + penalty_coeff * L1_regularization ``` 引用[1]中的数学形式: $$\text{sparsityError} = \text{zeros}(...) + \text{nonSparsityPenalty} \times \left(-\frac{\text{sparsityTarget}}{\pi} + \frac{1 - \text{sparsityTarget}}{1 - \pi}\right)$$ 其中动态系数机制类似[^1] 3. **结构化稀疏实现**(引用[4]): - 滤波器级稀疏:淘汰不重要的卷积滤波器 - 通道级稀疏:移除冗余特征通道 - 层跳接:直接跳过整层计算 ```python # 结构化稀疏示例 if penalty_coeff > threshold: prune_filters(model) # 执行滤波器剪枝[^4] ``` #### 3. **参数设计解析** | 参数 | 作用 | 设计意图 | |------|------|---------| | **0.1** | 基础惩罚系数 | 保证最小惩罚强度 | | **0.3** | 可变惩罚幅度 | 控制调整范围 | | **2.0** | 目标稀疏度阈值 | 设定优化目标(2%) | | **Sigmoid** | 平滑过渡函数 | 避免惩罚突变导致训练震荡 | #### 4. **可视化效果** ``` 惩罚强度 0.4 |*\ | \ | \ 0.2 | \ | \ 0.1 +------*----> sparsity(%) 2.0 ``` 当实际稀疏度偏离目标值2.0%时,Sigmoid的平滑过渡特性使惩罚强度渐变,稳定训练过程[^3]。 ### 总结 该表达式是**稀疏驱动**的自适应正则化系数生成器: 1. 核心目标:引导模型权重/激活的稀疏度向**2%** 收敛 2. 动态机制:低于目标时增强惩罚,高于目标时减弱惩罚 3. 应用价值:提升模型压缩效率,优化推理速度,增强特征选择性 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值