上海网站建设自学,华强北网站建设设计,wordpress文章自动更新方法,网页如何设计7.5.1 训练深层网络
训练神经网络的实际问题#xff1a; 数据预处理的方式会对最终结果产生巨大影响。 训练时#xff0c;多层感知机的中间层变量可能具有更广的变化范围。 更深层的网络很复杂容易过拟合。
批量规范化对小批量的大小有要求#xff0c;只有批量大小足够…7.5.1 训练深层网络
训练神经网络的实际问题 数据预处理的方式会对最终结果产生巨大影响。 训练时多层感知机的中间层变量可能具有更广的变化范围。 更深层的网络很复杂容易过拟合。
批量规范化对小批量的大小有要求只有批量大小足够大时批量规范化才是有效的。
用 x ∈ B \boldsymbol{x}\in B x∈B 表示一个来自小批量 B B B 的输入$\hat{\boldsymbol{\mu}}_B $ 表示小批量 B B B 的样本均值 σ ^ B \hat{\boldsymbol{\sigma}}_B σ^B 表示小批量 B B B 的样本标准差批量规范化 BN 根据以下表达式转换 x \boldsymbol{x} x B N ( x ) γ ⊙ x μ ^ B σ ^ B β BN(\boldsymbol{x})\gamma\odot\frac{\boldsymbol{x}\hat{\boldsymbol{\mu}}_B}{\hat{\boldsymbol{\sigma}}_B}\beta BN(x)γ⊙σ^Bxμ^Bβ
应用标准化后生成的小批量的均值为 0单位方差为 1。此外其中还包含与 x \boldsymbol{x} x 形状相同的拉伸参数 γ \gamma γ 和偏移参数 β \beta β。需要注意的是 γ \gamma γ 和 β \beta β 是需要与其他模型一起参与学习的参数。
从形式上看可以计算出上式中的 $\hat{\boldsymbol{\mu}}_B $ 和 σ ^ B \hat{\boldsymbol{\sigma}}_B σ^B μ ^ B 1 ∣ B ∣ ∑ x ∈ B x σ ^ B 1 ∣ B ∣ ∑ x ∈ B ( x − μ ^ B ) 2 ϵ \begin{align} \hat{\boldsymbol{\mu}}_B \frac{1}{\left|B\right|}\sum_{\boldsymbol{x}\in B}\boldsymbol{x}\\ \hat{\boldsymbol{\sigma}}_B \frac{1}{\left|B\right|}\sum_{\boldsymbol{x}\in B}(\boldsymbol{x}-\hat{\boldsymbol{\mu}}_B)^2\epsilon \end{align} μ^Bσ^B∣B∣1x∈B∑x∣B∣1x∈B∑(x−μ^B)2ϵ
式中添加的大于零的常量 ϵ \epsilon ϵ 可以保证不会发生除数为零的错误。
7.5.2 批量规范化层
全连接层和卷积层需要两种略有不同的批量规范化策略 全连接层 通常我们将批量规范化层置于全连接层中的仿射变换和激活函数之间。 设全连接层的输入为 x x x权重参数和偏置参数分别为 W \boldsymbol{W} W 和 b b b激活函数为 ϕ \phi ϕ批量规范化的运算符为 B N BN BN。那么使用批量规范化的全连接层的输出的计算详情如下 h ϕ ( B N ( W x b ) ) \boldsymbol{h}\phi(BN(\boldsymbol{W}xb)) hϕ(BN(Wxb)) 卷积层 对于卷积层可以在卷积层之后和非线性激活函数之前应用批量规范化。而且需要对多个输出通道中的每个输出执行批量规范化每个通道都有自己的标量参数拉伸和偏移参数。 预测过程中的批量规范化 批量规范化在训练模式和预测模式下的行为通常不同。
7.5.3 从零实现
import torch
from torch import nn
from d2l import torch as d2ldef batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):if not torch.is_grad_enabled(): # 如果是在预测模式下直接使用传入的移动平均所得的均值和方差X_hat (X - moving_mean) / torch.sqrt(moving_var eps)else:assert len(X.shape) in (2, 4)if len(X.shape) 2: # 使用全连接层的情况计算特征维上的均值和方差mean X.mean(dim0) # 按行求均值var ((X - mean) ** 2).mean(dim0) # 按行求方差else: # 使用二维卷积层的情况计算通道维上axis1的均值和方差。mean X.mean(dim(0, 2, 3), keepdimTrue) # 保持X的形状(即第1维输出通道数)以便后面可以做广播运算结果的形状是1*n*1*1var ((X - mean) ** 2).mean(dim(0, 2, 3), keepdimTrue)X_hat (X - mean) / torch.sqrt(var eps) # 训练模式下用当前的均值和方差做标准化# 更新移动平均的均值和方差moving_mean momentum * moving_mean (1.0 - momentum) * meanmoving_var momentum * moving_var (1.0 - momentum) * varY gamma * X_hat beta # 缩放和移位return Y, moving_mean.data, moving_var.dataclass BatchNorm(nn.Module):# num_features完全连接层的输出数量或卷积层的输出通道数。# num_dims2表示完全连接层4表示卷积层def __init__(self, num_features, num_dims):super().__init__()if num_dims 2:shape (1, num_features)else:shape (1, num_features, 1, 1)# 参与求梯度和迭代的拉伸和偏移参数分别初始化成1和0self.gamma nn.Parameter(torch.ones(shape))self.beta nn.Parameter(torch.zeros(shape))# 非模型参数的变量初始化为0和1self.moving_mean torch.zeros(shape)self.moving_var torch.ones(shape)def forward(self, X):# 如果X不在内存上将moving_mean和moving_var# 复制到X所在显存上if self.moving_mean.device ! X.device:self.moving_mean self.moving_mean.to(X.device)self.moving_var self.moving_var.to(X.device)# 保存更新过的moving_mean和moving_varY, self.moving_mean, self.moving_var batch_norm(X, self.gamma, self.beta, self.moving_mean,self.moving_var, eps1e-5, momentum0.9)return Y7.5.4 使用批量规范化层的 LeNet
net nn.Sequential(nn.Conv2d(1, 6, kernel_size5), BatchNorm(6, num_dims4), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), BatchNorm(16, num_dims4), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2), nn.Flatten(),nn.Linear(16*4*4, 120), BatchNorm(120, num_dims2), nn.Sigmoid(),nn.Linear(120, 84), BatchNorm(84, num_dims2), nn.Sigmoid(),nn.Linear(84, 10))学习率拉的好大。
lr, num_epochs, batch_size 1.0, 10, 256
train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())loss 0.262, train acc 0.902, test acc 0.879
20495.7 examples/sec on cuda:07.5.5 简明实现
net1 nn.Sequential(nn.Conv2d(1, 6, kernel_size5), nn.BatchNorm2d(6), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.BatchNorm2d(16), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2), nn.Flatten(),nn.Linear(256, 120), nn.BatchNorm1d(120), nn.Sigmoid(),nn.Linear(120, 84), nn.BatchNorm1d(84), nn.Sigmoid(),nn.Linear(84, 10))d2l.train_ch6(net1, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())loss 0.263, train acc 0.903, test acc 0.870
36208.4 examples/sec on cuda:07.5.6 争议
这个东西就是玄学有效但是不知大为什么有效。作者给出的解释是“减少内部协变量偏移”但是也是处于直觉而不是证明。
练习
1在使用批量规范化之前我们是否可以从全连接层或者卷积层中删除偏置函数为什么
我认为可以偏置会在减去均值时消去此外BN 中也是带偏移参数的。 2比较 LeNet 在使用和不使用批量规范化情况下的学习率。
a. 绘制训练和测试精准度的提高。b. 学习率有多高?学习率相同的话使用批量规范化的收敛速度会非常快。 3我们是否需要在每个层中进行批量规范化尝试一下
net2 nn.Sequential(nn.Conv2d(1, 6, kernel_size5), nn.BatchNorm2d(6), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.BatchNorm2d(16), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2), nn.Flatten(),nn.Linear(256, 120), nn.Sigmoid(),nn.Linear(120, 84), nn.Sigmoid(),nn.Linear(84, 10))lr, num_epochs, batch_size 1.0, 10, 256
train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch6(net2, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())loss 0.349, train acc 0.871, test acc 0.856
37741.0 examples/sec on cuda:0去掉后面两个之后曲线稳多了。 4可以通过批量规范化来替换暂退法吗行为会如何改变
看来还是批量规范化好些
net3 nn.Sequential(nn.Conv2d(1, 6, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2), nn.Flatten(),nn.Linear(256, 120), nn.Sigmoid(),nn.Dropout(p0.1),nn.Linear(120, 84), nn.Sigmoid(),nn.Dropout(p0.1),nn.Linear(84, 10))lr, num_epochs, batch_size 1.0, 10, 256
train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch6(net3, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())loss 0.541, train acc 0.790, test acc 0.748
40642.6 examples/sec on cuda:05 确定参数 gamma 和 beta并观察和分析结果。
net[1].gamma.reshape((-1,)), net[1].beta.reshape((-1,))(tensor([3.1800, 1.6709, 4.0375, 3.4801, 2.6182, 2.3103], devicecuda:0,grad_fnReshapeAliasBackward0),tensor([ 3.5415, 1.6295, 1.8926, -1.5510, -2.4556, 1.1020], devicecuda:0,grad_fnReshapeAliasBackward0))6查看高级 API 中关于 BatchNorm 的在线文档以了解其他批量规范化的应用。
略。 7研究思路可以应用的其他“规范化”变换有哪些可以应用概率积分变换吗全秩协方差估计呢
略。