目录
任务
任务简介
- 了解正则化中L1和L2(weight decay)
- 了解dropout
详细说明
-
第一部分讲解正则化的概念,正则化方法是机器学习(深度学习)中重要的方法,它目的在于减小方差。常用的正则化方法有L1和L2正则化,其中L2正则化又称为weight decay。在pytorch的优化器中就提供了weight decay的实现,将学习weight decay的pytorch实现。
-
第二部分讲解深度学习中常见的正则化方法——Dropout,Dropout是简洁高效的正则化方法,但需要注意其在实现过程中的权值数据尺度问题。将详细介绍pytorch中Dropout的实现细节。
知识点
正则化与偏差-方差分解
- Regularization:减小方差的策略
- 误差可分解为:偏差,方差与噪声之和。即误差 = 偏差 + 方差 + 噪声之和
- 偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力
- 方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响
- 噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界
Regularization:减小方差的策略
Regularization就是解决方差过大的问题的。
一元线性模型中,在train data set上模拟很好,但是在test data set 上表现就很差,是典型的过拟合现象,就是方差过大的一个例子。
下图中彩色部分就是cost的等高线,每个相同颜色代表cost的值一样,左边是L1、右边是L2
L2 Regularization = weight decay(权值衰减)
L2正则项到了pytorch就有了新名字:weight decay(权值衰减)
下面请看手推公式表演…
其中Cost可以用Loss表示,然后λ是超参数,1/2是为了消除求导带的一个系数。
通常,λ取值范围为(0,1),所以wi(1−λ)变小了。也就是为什么叫权重衰减的原因,变小了嘛。
pytorch中的L2正则项——weight decay
Pytorch中的 weight decay 是在优化器中实现的,在优化器中加入参数weight_decay=即可。
例如下面的两个随机梯度优化器,一个是没有加入正则项,一个加入了正则项,区别仅仅在于是否设置了参数weight_decay的值:
optim_normal = torch.optim.SGD(net_normal.parameters(), lr=lr_init, momentum=0.9)
optim_wdecay = torch.optim.SGD(net_weight_decay.parameters(), lr=lr_init, momentum=0.9, weight_decay=1e-2)
代码展示
# -*- coding:utf-8 -*-
"""
@brief : weight decay使用实验
"""
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from tools.common_tools2 import set_seed
from torch.utils.tensorboard import SummaryWriter
set_seed(1) # 设置随机种子
n_hidden = 200
max_iter = 2000
disp_interval = 200
lr_init = 0.01
# ============================ step 1/5 数据 ============================
def gen_data(num_data=10, x_range=(-1, 1)):
w = 1.5
train_x = torch.linspace(*x_range, num_data).unsqueeze_(1)
train_y = w * train_x + torch.normal(0, 0.5, size=train_x.size())
test_x = torch.linspace(*x_range, num_data).unsqueeze_(1)
test_y = w * test_x + torch.normal(0, 0.3, size=test_x.size())
return train_x, train_y, test_x, test_y
train_x, train_y, test_x, test_y = gen_data(x_range=(-1, 1))
# ============================ step 2/5 模型 ============================
class MLP(nn.Module):
def __init__(self, neural_num):
super(MLP, self).__init__()
self.linears = nn.Sequential(
nn.Linear(1, neural_num),
nn.ReLU(inplace=True),
nn.Linear(neural_num, neural_num),
nn.ReLU(inplace=True),
nn.Linear(neural_num, neural_num),
nn.ReLU(inplace=True),
nn.Linear(neural_num, 1),
)
def forward(self, x):
return self.linears(x)
net_normal = MLP(neural_num=n_hidden)
net_weight_decay = MLP(neural_num=n_hidden)
# ==============