×

PyTorch教程8.5之批量归一化

消耗积分:0 | 格式:pdf | 大小:0.40 MB | 2023-06-05

李永每

分享资料个

训练深度神经网络很困难。让它们在合理的时间内收敛可能很棘手。在本节中,我们将介绍 批量归一化,这是一种流行且有效的技术,可以持续加速深度网络的收敛 Ioffe 和 Szegedy,2015 年连同残差块(稍后将在第 8.6 节中介绍),批量归一化使从业者可以例行地训练超过 100 层的网络。批量归一化的第二个(偶然的)好处在于其固有的正则化。

import torch
from torch import nn
from d2l import torch as d2l
from mxnet import autograd, init, np, npx
from mxnet.gluon import nn
from d2l import mxnet as d2l

npx.set_np()
from functools import partial
import jax
import optax
from flax import linen as nn
from jax import numpy as jnp
from d2l import jax as d2l
import tensorflow as tf
from d2l import tensorflow as d2l

8.5.1. 训练深度网络

在处理数据时,我们经常在训练前进行预处理。关于数据预处理的选择通常会对最终结果产生巨大影响。回想一下我们将 MLP 应用于预测房价(第 5.7 节)。我们处理真实数据的第一步是将我们的输入特征标准化为零均值 μ=0和单位方差 Σ=1across multiple observations ( Friedman, 1987 )至少,人们经常重新缩放它,使对角线是统一的,即 Σii=1. 另一种策略是将向量重新调整为单位长度,每次观察的均值可能为零。这可以很好地工作,例如,对于空间传感器数据。这些预处理技术以及更多技术有助于很好地控制估计问题。参见例如Guyon等人的文章。( 2008 )审查特征选择和提取技术。标准化向量还有一个很好的副作用,即限制作用于它的函数的函数复杂性。例如,支持向量机中著名的半径边界( Vapnik, 1995 )和感知器收敛定理( Novikoff, 1962 )依赖有界范数的输入。

直觉上,这种标准化与我们的优化器配合得很好,因为它先验地将参数放在相似的范围内。因此,很自然地会问 深度网络中相应的规范化步骤是否可能没有好处。虽然这并不是导致批量归一化发明的原因 Ioffe 和 Szegedy,2015 年 ,但它是在统一框架内理解它及其堂兄层归一化Ba等人,2016 年的有用方法。

其次,对于典型的 MLP 或 CNN,在我们训练时,中间层中的变量(例如,MLP 中的仿射变换输出)可能采用幅度变化很大的值:沿着从输入到输出的层,跨同一层中的单元,随着时间的推移,由于我们对模型参数的更新。批量归一化的发明者非正式地假设,这种变量分布的漂移可能会阻碍网络的收敛。凭直觉,我们可能会推测,如果一层的可变激活是另一层的 100 倍,这可能需要对学习率进行补偿性调整。自适应求解器,例如 AdaGrad Duchi等人,2011 年、Adam Kingma 和 Ba,2014 年))、Yogi ( Zaheer et al. , 2018 )或 Distributed Shampoo ( Anil et al. , 2020 )旨在从优化的角度解决这个问题,例如,通过添加二阶方法的方面。另一种方法是通过自适应规范化来防止问题发生。

第三,更深层次的网络很复杂,而且往往更容易过度拟合。这意味着正则化变得更加关键。一种常用的正则化技术是噪声注入。这已经为人所知很长时间了,例如,关于输入的噪声注入( Bishop, 1995 )它还构成了第 5.6 节中 dropout 的基础 事实证明,批归一化带来了所有三个好处:预处理、数值稳定性和正则化。

批归一化应用于单个层,或者可选地应用于所有层:在每次训练迭代中,我们首先通过减去它们的均值并除以它们的标准差来归一化(批归一化的)输入,其中两者都是基于统计数据估计的当前的小批量。接下来,我们应用比例系数和偏移量来恢复丢失的自由度。批归一化正是由于这种 基于统计的归一化 而得名。

请注意,如果我们尝试对大小为 1 的小批量应用批量归一化,我们将无法学习任何东西。这是因为在减去均值后,每个隐藏单元的值为 0。正如您可能猜到的那样,由于我们将整个部分用于批量归一化,并且具有足够大的小批量,因此该方法被证明是有效且稳定的。这里的一个要点是,当应用批量归一化时,批量大小的选择甚至比没有批量归一化更重要,或者至少需要适当的校准,因为我们可能会调整它。

表示为B一个小批量并让 x∈B作为批量归一化的输入(BN). 在这种情况下,批量归一化定义如下:

(8.5.1)BN(x)=γ⊙x−μ^Bσ^B+β.

在(8.5.1)μ^B 是样本均值和σ^B是 minibatch 的样本标准差B. 应用标准化后,生成的小批量具有零均值和单位方差。单位方差的选择(相对于其他一些幻数)是一个任意选择。我们通过包含元素尺度参数来恢复这种自由度 γ转移参数 β具有相同的形状x. 两者都是需要在模型训练中学习的参数。

中间层的可变幅度在训练期间不能发散,因为批量归一化主动将它们居中并将它们重新缩放回给定的均值和大小(通过 μ^Bσ^B). 实践经验证实,正如在讨论特征重新缩放时所提到的,批量归一化似乎允许更积极的学习率。我们计算μ^Bσ^B(8.5.1)如下:

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'PyTorch教程8.5之批量归一化',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);