跳转至

2 Regularization and Optimization

文本统计:约 1179 个字 • 4 行代码

2.1 Regularization

对数据进行拟合的时候,会出现过拟合的情况,这是我们不想遇到的情况。于是我们引入一个正则化项,通过惩罚模型参数 \(W\) 的复杂度来实现这一点。通过控制 \(\lambda\) 来控制了正则化项在总损失中的权重,较大的 \(λ\) 值会使得模型更加简单,较小的 \(λ\) 值则允许模型更复杂。

常见的正则化方法

  • L2 正则化
\[ R(W) = \sum_k \sum_l W_{k,l}^2 \]

L2 正则化通过对权重矩阵 \(W\) 中所有元素的平方和进行惩罚,鼓励权重向量接近零但不为零。这有助于减少模型的复杂度,从而降低过拟合的风险。

  • L1 正则化
\[ R(W) = \sum_k \sum_l |W_{k,l}| \]

L1正则化通过对权重矩阵 \(W\) 中所有元素的绝对值之和进行惩罚,鼓励权重向量中的一些元素变为零。这不仅有助于减少模型的复杂度,还可以实现特征选择的效果。

  • Elastic Net(L1 + L2)
\[ R(W) = \sum_k \sum_l \beta W_{k,l}^2 + |W_{k,l}| \]

Elastic Net 结合了 L1 和 L2 正则化的特点,通过同时使用平方项和绝对值项来惩罚权重矩阵 \(W\)。这种方法可以在一定程度上克服 L1 和 L2 正则化的局限性,提供更灵活的正则化效果。

  • 更复杂的正则化方法,除了上述简单的正则化方法外,还有些更复杂的正则化技术,这将在 Lecture 5 中阐述:

  • Dropout:在训练过程中随机丢弃一部分神经元,以减少神经元之间的依赖关系,从而提高模型的泛化能力。

  • Batch Normalization:通过对每一批数据进行标准化处理,加速模型的收敛速度,并减少内部协变量偏移问题。

  • Stochastic Depth, Fractional Pooling, etc.:这些方法通过引入随机性和不确定性来进一步增强模型的泛化能力。

Example

给定:

  • 输入向量 $ x = [1, 1, 1, 1]$
  • 权重向量:
  • \(w_1 = [1, 0, 0, 0]\)
  • \(w_2 = [0.25, 0.25, 0.25, 0.25]\)

这两个权重向量与 \(x\) 的点积相同:

\[ w_1^T x = w_2^T x = 1 \]

使用 L2 正则化, L2 正则化公式为:

\[ R(W) = \sum_k \sum_l W_{k,l}^2 \]

问题:L2 正则化更偏好哪个权重?

解释:

L2 正则化倾向于“分散”的权重,即更喜欢权重分布均匀而不是集中在少数位置。

分别计算两个权重的 L2 正则化值:

  • \(R(w_1) = 1^2 + 0 + 0 + 0 = 1\)

  • \(R(w_2) = 4 \times (0.25)^2 = 4 \times 0.0625 = 0.25\)

结论:L2 更偏好 \(w_2\),因为它的正则化值更小。

使用L1 正则化,L1 正则化公式为:

\[ R(W) = \sum_k \sum_l |W_{k,l}| \]

问题:L1 正则化更偏好哪个权重?

解释:

L1 正则化倾向于稀疏的权重,即更喜欢很多权重为 0 的情况。

分别计算两个权重的 L1 正则化值:

  • \(R(w_1) = |1| + 0 + 0 + 0 = 1\)

  • \(R(w_2) = 4 \times |0.25| = 1\)

虽然两者值相同,但 L1 更偏好 \(w_1\),因为它的非零元素更少,更稀疏。

总结

  • L2 正则化 偏好 \(w_2\):权重分布更均匀。
  • L1 正则化 偏好 \(w_1\):权重更稀疏(更多 0)。

2.2 Optimization

In 1-dimension, the derivative of a function:

\[ \frac{df(x)}{dx} = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h} \]

在多维空间中,一个函数的梯度是一个向量,它的每个分量是函数在对应维度上的偏导数(partial derivative)

\[ \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n} \right) \]

在任意一个方向上,函数的变化率(也就是“斜率”)等于这个方向向量与梯度的点积(dot product)

\[ \text{slope} = \nabla f \cdot \mathbf{v} \]

函数在某一点下降最快的方向是梯度的反方向,也就是负梯度方向

Example

一般情况下我们不用这种方法,计算量太大,一般采取解析法得到梯度。但是在检查的时候可能会采用数值法来验证正确性 (gradient check)

Stochastic Gradient Descent (SGD)

损失函数

\[ L(W) = \frac{1}{N} \sum_{i=1}^{N} L_i(x_i, y_i, W) + \lambda R(W) \]

梯度计算

\[ \nabla_W L(W) = \frac{1}{N} \sum_{i=1}^{N} \nabla_W L_i(x_i, y_i, W) + \lambda \nabla_W R(W) \]

\(N\) 很大时,计算所有样本的梯度非常昂贵。

使用小批量近似求和:使用一个小批量(minibatch)的样本进行梯度估计,而不是使用全部样本。常见小批量大小:32、64、128 等

Vanilla Minibatch Gradient Descent 实现

while True:
    data_batch = sample_training_data(data, 256)  # 从数据集中随机抽取 256 个样本
    weights_grad = evaluate_gradient(loss_fun, data_batch, weights)  # 计算这批样本的梯度
    weights += -step_size * weights_grad  # 更新参数,执行梯度下降

Multiclass SVM optimization demo

评论区

对你有帮助的话请给我个赞和 star => GitHub stars
欢迎跟我探讨!!!