动手学深度学习(3)-多层感知机
多层感知机
在机器学习基础(10)-神经网络 - EverNorif中,我们已经简单介绍过前馈神经网络,即多层感知机,这里不再重复介绍。下面直接进入多层感知机的Pytorch实现。
这里我们同样使用FashionMNIST数据集来进行测试,实际上多层感知机的实现只需要在之前Softmax回归的基础上增加net的层数即可。
首先需要设置Model,相比于之前的Softmax回归,这里多增加了一层ReLU激活函数以及一层全连接层:
1 | |
之后设置相关超参数以及数据,损失函数和优化器:
1 | |
之后就可以进行训练和测试了,这部分的代码基本都是类似的。这里的accuracy与动手学深度学习(2)-线性模型 - EverNorif中实现的方法相同。
1 | |
正则化
权重衰退
在训练参数化机器学习模型的时候,权重衰退(weight decay)是最广泛使用的正则化技术之一,它实际上就是\(L_2\)正则化。权重衰退的思想在于通过控制参数向量范数的大小来控制模型的复杂度,并且选择的是\(L_2\)范数\(||w||^2\)。
此外,为什么我们首先使用L2范数,而不是L1范数.事实上,这个选择在整个统计领域中都是有效的和受欢迎的。L2正则化线性模型构成经典的岭回归(ridge regression)算法, L1正则化线性回归是统计学中类似的基本模型,通常被称为套索回归(lasso regression)。使用L2范数的一个原因是它对权重向量的大分量施加了巨大的惩罚, 这使得我们的学习算法偏向于在大量特征上均匀分布权重的模型。 在实践中,这可能使它们对单个变量中的观测误差更为稳定。相比之下,L1惩罚会导致模型将权重集中在一小部分特征上,而将其他权重清除为零。这称为特征选择(feature selection),这可能是其他场景下需要的。
\(L_2\)正则化的优化目标函数是: \[ L(\mathbf{w}, b) + \frac{\lambda}{2} ||\mathbf{w}||^2 \] 将其带入梯度下降算法中,每一轮的参数更新方式即为: \[ \mathbf{w} \leftarrow (1-\eta \lambda) \mathbf{w} - \eta \frac{\partial L(\mathbf{w}, b)}{\partial \mathbf{w}} \] 与不带\(L_2\)正则化的参数更新式子相比,这个式子仅仅在前一项\(\mathbf{w}\)上增加了一个小于1的系数,这表示在每次更新参数的时候,我们首先将参数缩小一些,再进行正常流程的更新。也就是说,我们在利用梯度更新参数的同时,也在试图将参数的大小缩小到零。这也就对应了该正则化方法的名称:权重衰减。
在Pytorch中,可以直接在实例化优化器的时候指定weight_decay参数来进行指定进行权重衰减时需要使用的\(\lambda\)值,默认不传则表示该值为0,即不进行权重衰减。默认情况下Pytorch同时衰减权重和偏置项,我们也可以通过传入字典列表来指定对于不同参数执行不同的权重衰减。
1 | |
在实践中,权重衰减的值通常设置为1e-2、1e-3、1e-4。不过权重衰退的效果有限,如果模型真的非常复杂,权重衰减一般不会带来特别好的效果。
Dropout
dropout是深度学习中另一种常用的正则化方法。我们通常希望一个模型具有良好的鲁棒性,即对于正常的数据能够正常处理,对于不那么好的数据,同样也能够进行较好地处理。为了实现这个目标,我们可以在训练过程中增加噪音。有两种方式可以增加噪音,一种是直接使用含有噪音的数据,另一种则是在层与层之间增加噪音,dropout就属于后者。
这里需要对加入噪音进行一定的数学描述,假设\(X\)是正常的数据,\(X^{'}\)是加入噪音之后的数据,我们希望有如下等式: \[ E(X^{'}) = X \] 简单来说,dropout完成的事情就是在层间随机抑制一些神经元,同时加强另一些神经元。具体地,对于每个元素,有如下变化方式,该方式可以满足上面提到的增加噪音的等式原则。 \[ x^{'} = \begin{cases} 0, & \text{with probablity p} \\ \frac{x}{1-p}, & \text{otherwise} \\ \end{cases} \] 通常情况下,我们会将dropout作用在隐藏层中全连接层的输出上。在Pytorch构造Model的时候,我们可以很容易地在层之间增加dropout。不过需要注意的是,dropout仅在训练过程中使用,它会影响模型参数的更新。而在预测的时候,dropout层的行为是原样输出,即不做任何处理。
1 | |
在实践中,dropout概率通常可以选择0.9、0.5、0.1。