一、正则化
  vagE8kJM1f2f 2023年11月01日 91 0

1、正则化的理解

    当模型的复杂度>>数据的复杂度时,会出现过拟合现象,即模型过度拟合了训练数据,其泛化能力变差。为此,会通过数据增强、降维、正则化等方法防止模型过拟合。

\[\mathop{\arg\min}\limits_{\omega} (\mathcal{L}(w) + \lambda \Omega(w)) \]

  式子里面,前者为损失函数,后者为正则化项。
  从数学角度理解,以线性回归为例,其损失函数为:

\[\mathcal{L}(\omega) = \sum^{N}_{i=1}||\omega^T -y_i||^2 \]

   可以得到:

\[W = (X^TX)^{-1}X^TY \]

   需要对\(X^TX\)求逆,才能得到解。
   对于 \(X_{N \times P}\), \(x_i \in \mathbb{R}^P\), 其中 \(N\) 为样本数,\(P\)为样本维度,当 \(P>>N\) 时,在数学上,表现为\(X^TX\)不可逆,在现象上,即为模型过拟合。
   若以\(L2\)正则化方法进行约束,则有:

\[\begin{aligned} J(\omega) &=\sum^{N}_{i=1}||\omega^T -y_i||^2 +\lambda W^TW \\ &=(W^TX^T-Y^T)(XW-Y) + \lambda W^TW \\ &=W^TX^TXW -W^TX^TY-Y^TXW+YY^T+\lambda W^TW \\ &=W^TX^TXW-2W^TX^TY+Y^TY+\lambda W^TW \\ &=W^T(X^TX+\lambda I)W - 2W^TX^TY+Y^TY \end{aligned}\]

   求导:

\[\begin{aligned} \frac{\partial J(\omega)}{\partial \omega} = 2(X^TX+\lambda I)W -2X^TY \end{aligned} \]

   解得:

\[\begin{aligned} W = (X^TX+\lambda I)^{-1}X^TY \end{aligned} \]

    \(X^TX\) 为半正定矩阵,\(\lambda I\) 为半角矩阵,\((X^TX+\lambda I)\) 为正定矩阵,一定可逆,这从数学上解释了正则化的原因。

2、L1 正则化(Lasso Regression) 与 L2 正则化(岭回归,Ridge Regression )

   神经网络中,参数 \(\theta\) 包括每一层的权重 \(\omega\) 和偏置 \(b\),通常情况下,只对权重 \(\theta\) 进行惩罚,因为其关联两个变量之间的相互作用,而 \(b\) 仅控制一个参数,不进行正则化也不会导致太大方差,为了减小空间,所有层使用共同的权重衰减。

  \(L1\)\(L2\)正则化,可以看作是在损失函数中引入了惩罚项。先来介绍下\(L1\)\(L2\)正则化损失函数:

  \(L1\) 损失函数,也叫最小绝对值偏差(LAD)或绝对值损失函数(LAE),即把目标值 \(y_i\) 与估计值 \(f(x_i)\) 的差的绝对值总和最小化:

\[\begin{aligned} L = \sum^{n}_{i=1} |y_i - f(x_i)| \end{aligned} \]

  \(L2\) 损失函数,也叫最小平方误差(LSE),即把目标值 \(y_i\) 与估计值 \(f(x_i)\) 的差的平方和最小化。

\[\begin{aligned} L = \sum^{n}_{i=1} (y_i - f(x_i))^2 \end{aligned} \]

3、L1 正则化的稀疏性

TODO...画图啊。。。好麻烦。。。有空在更

4、Dropout

   \(Dropout\) 给正则化提供了一个非常简便的方法,即在训练过程中,让神经元以超参数 \(p\) 的概率被激活或设置为0。参考CS231n笔记
  值得注意的是,对于某一神经元的输入 \(x\) ,经过 \(Dropout\) 后,期望值为 \(E = px + (1-p)\times 0\)为了在测试时与训练时获得相同的预期输出,需要对其进行缩放,主要有在训练时缩放预测时缩放,训练时缩放的好处在于,无论是否使用 \(Dropout\) ,预测的代码可以保持不变。

"""
inverted dropout(反向随机失活): 推荐实现方式.
在训练的时候drop和调整数值范围,测试时不用任何改变.
"""
p = 0.5 # 激活神经元的概率. p值更高 = 随机失活更弱

def train_step(X):
    # 3层neural network的前向传播
    H1 = np.maximum(0, np.dot(W1, X) + b1)
    U1 = (np.random.rand(*H1.shape) < p) / p # 第一个dropout mask. /p 即为缩放,保证期望相同
    H1 *= U1 # drop!
    H2 = np.maximum(0, np.dot(W2, H1) + b2)
    U2 = (np.random.rand(*H2.shape) < p) / p # 第二个dropout mask. /p 即为缩放,保证期望相同
    H2 *= U2 # drop!
    out = np.dot(W3, H2) + b3
    # 反向传播:计算梯度... (略)
    # 进行参数更新... (略)

def predict(X):
# 前向传播时模型集成
H1 = np.maximum(0, np.dot(W1, X) + b1) # 预测不用缩放了
H2 = np.maximum(0, np.dot(W2, H1) + b2)
out = np.dot(W3, H2) + b3

5、提前终止(Early Stopping)

  我愿称之为懒人必备正则化方法,简单且有效。
  在训练模型的后期,经常会出现训练集上的 \(Loss\) 还在下降,但验证集上的 \(Loss\) 反而开始上升,说明模型开始过拟合了,此时保存验证集上 \(Loss\) 最低的模型即可。

6、多任务学习(Multi-task)

  多任务学习是通过合并几个任务从而提高泛化能力的方式,可以视作对参数施加了软约束。当模型的一部分被多个任务共享时,这部分将被约束为更好的值,前提是共享的任务合理,会提高模型的泛化能力。
  这部分好像没什么好说的,现在大部分的 \(E2E\) 模型都会使用多任务,\(BEV\) 感知里面也经常使用。

7、数据增强、添加噪声等

  数据增强基本是在写大部分 \(Dataset\)\(Dataloader\) 的时候必定经过的一个流程了,需要注意的是,对于分类任务,不能使用改变类别的变换,比如 \(6\)\(9\) ,对于目标检测任务使用旋转或放缩变换时,注意检测框需要一并进行处理。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  yCJS27XXARYK   2024年05月17日   63   0   0 AI综合