深度学习优化 --- 批标准化(知识总结&工作随记)

  • 特征缩放的两种方法:归一化, 标准化

    • 归一化/标准化的作用

      1.统计建模中,如回归模型,自变量X XX的量纲不一致导致了回归系数无法直接解读或者错误解读;需要将X XX都处理到统一量纲下,这样才可比;
      2.机器学习任务和统计学任务中有很多地方要用到“距离”的计算,比如PCA,比如KNN,比如kmeans等等,假使算欧式距离,不同维度量纲不同可能会导致距离的计算依赖于量纲较大的那些特征而得到不合理的结果;
      3.参数估计时使用梯度下降,在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。
      
    • 前人经验

      1.如果你对处理后的数据范围有严格要求,那肯定是归一化,个人经验,标准化是ML中更通用的手段,如果你无从下手,可以直接使用标准化;
      2.如果数据不为稳定,存在极端的最大最小值,不要用归一化;
      3.在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,标准化表现更好;在不涉及距离度量、协方差计算的时候,可以使用归一化方法。
      
  • 归一化(最小-最大缩放)将值限定在(0, 1)范围

在这里插入图片描述

  • 标准化:将数据变换为均值为0,标准差为1的分布(并非一定是正态的)

在这里插入图片描述

  • 批标准化(BN):Batch normalization 的 batch 是批数据, 把数据分成小批小批进行SGD(随机梯度下降). 而且在每批数据进行前向传递的时候, 对每一层都进行 标准化处理

    • BN算法步骤

    img

    • BN作用

      1. 你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;
      2. 你再也不用去理会过拟合中dropout、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;
      3. 再也不需要使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法),因为BN本身就是一个归一化网络层;
      4. 可以把训练数据彻底打乱
      
  • Pytorch应用BN

    torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True)
    
    • 每一层激活函数前添加BN层(也可以对输入层单独增加一层BN),接口每次执行BN进行了两步操作

      • 先对输入进行标准化
      • 然后对归一化的结果进行缩放和平移,设置affine=True,即意味着weight(γ)和bias(β)将被使用
    • 参数:

      • num_features: 输入特征数
      • eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
      • momentum: 动态均值和动态方差所使用的动量。默认为0.1。
      • affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数,即γ与β。
      • track_running_stats:一个布尔值,当设置为True时,该模块跟踪运行的平均值和方差,当设置为False时,该模块不跟踪此类统计数据,并且始终在train和eval模式中使用批处理统计数据。默认值:True
    • 示例

      class ALS_Net(torch.nn.Module):
          def __init__(self):
              super(ALS_Net, self).__init__()
              self.dense1 = torch.nn.Linear(input_data, HL1)
              self.dense2 = torch.nn.Linear(HL1, HL2) # 两层隐藏层
              self.dense3 = torch.nn.Linear(HL2, output_data)
              self.bn0 = torch.nn.BatchNorm1d(input_data, affine=True) # 对输入层也增加BN层
              self.bn1 = torch.nn.BatchNorm1d(HL1, affine=True)  # 对隐藏层增加BN层
              self.bn2 = torch.nn.BatchNorm1d(HL2, affine=True)
      
          def forward(self, x):
          	x = self.bn0(x)
              x = self.dense1(x)
              x = self.bn1(x) # 激活函数前调用BN
              x = F.relu(x)
              x = self.dense2(x)
              x = self.bn2(x)
              x = F.relu(x)
              x = self.dense3(x)
              return x
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrlturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值