【PyTorch】偏置项 bias 与 Batch-Normalize
文章目录
- 偏置项.
- Batch-Normalize.
- Nomalize Input.
- BN.
- Why it works.
- 测试数据.
- 指数加权平均.
偏置项.
- 神经网络中,进行运算后,通常要对结果加上一个偏置项 Bias\rm BiasBias,记输入数据为 XXX,参数为 WWW,运算为 ∗*∗,偏置项为 bbb,则上述过程表述为:Z=X∗W+b(1)Z=X*W+b\tag{1}Z=X∗W+b(1)
- 后续经过激活函数 σ(⋅)\sigma(·)σ(⋅),通常为 Sigmoid,ReLU\rm Sigmoid,ReLUSigmoid,ReLU 等非线性函数,得到本层输出数据 AAA,该过程表述如下:A=σ(Z)(2)A=\sigma(Z)\tag{2}A=σ(Z)(2)
- 关于偏置项 Bias\rm BiasBias 的作用理解有很多角度,下面摘录个人认为易于理解且直观的观点:
偏置实际上是对神经元激活状态的控制,当偏置存在时,xxx 较小时 yyy 的值就可以很大,就可以较快的将该神经元激活。
做模式识别,本质是要提取某种全局信息,所以提取的过程就是要抛弃局部信息保留整体信息,增加偏置这个参数,就是调整丢弃的局部信息的比例或者能量,没有这个参数,对信息的抛弃率的调整的灵活性就欠缺。
Batch-Normalize.
- 在介绍 Batch−Normalize\rm Batch-NormalizeBatch−Normalize 之前,需要简单提及归一化输入,即将训练数据 {xi∣i=1,2,⋯,N}\{x_i|i=1,2,\cdots,N\}{xi∣i=1,2,⋯,N} 变换为均值为 0⃗\vec 00,方差为 111 的数据。具体做法是对训练集分别计算均值向量与方差:μ=1N∑i=1Nxi\mu=\frac1N\sum_{i=1}^Nx_iμ=N1i=1∑Nxixi′=xi−μ,i=1,2,⋯,N(step.1)x_i'=x_i-\mu~,~i=1,2,\cdots,N\tag{step.1}xi′=xi−μ , i=1,2,⋯,N(step.1)σ2=1N∑i=1N(xi′)2\sigma^2=\frac1N\sum_{i=1}^N\big(x_i'\big)^2σ2=N1i=1∑N(xi′)2xi′′=xi′σ(step.2)x_i''=\frac{x_i'}{\sigma}\tag{step.2}xi′′=σxi′(step.2)
Nomalize Input.
- 关于归一化输入操作所带来的益处,AndrewNg\rm Andrew~NgAndrew Ng 的阐述是较为清晰直观的。以二维情况为例,易于作图和理解。当输入数据的不同特征取值范围区别较大,如 1≤x1≤1000,0≤x2≤11\leq x_1\leq1000,0\leq x_2\leq11≤x1≤1000,0≤x2≤1,会导致它们对应参数 w1,w2w_1,w_2w1,w2 的取值范围区别较大,从而优化算法在寻找损失函数最小值时,类似于在下图中一个狭长的山谷中搜索:
- 绘制其等高线图如下所示:
在这样一个参数空间内搜索时,优化算法需要使用较小的学习率,否则极易在接近最小值点时越过它。但整个参数搜索过程依旧是振荡的,可以看到在 b=−wb=-wb=−w 方向上,很小步幅的移动就会越过多条等高线。 - 经过归一化操作后,数据不同特征的取值范围大致接近,从而代价函数的参数空间类似与下图中这样各方向大致相同的空间:
观测上图所示的等高线图,无论优化算法起始点如何,相较于狭长等高线,都能够更快、更有效地找到最优值点。高维空间中的情况可以从上述二维平面中类推,代价函数的参数空间倾向于在各个维度上尺度大致相等,更容易运行优化算法。 - 最后需要提醒的一点是,对训练集计算出均值、方差并进行归一化操作后,在测试集上运行算法时,应使用训练集计算出的均值、方差数值,而非在测试集上重新计算。这样确保训练集、测试集经历了相同的归一化过程。
BN.
- 下面的内容关于本篇主题 Batch−Normalize\rm Batch-NormalizeBatch−Normalize,该算法由 SergeyLoffe\rm Sergey~LoffeSergey Loffe 和 ChristianSzegedy\rm Christian~SzegedyChristian Szegedy 提出,其操作与归一化输入大体相同,但归一化的对象是神经网络中间层的输出。Batch−Normalize\rm Batch-NormalizeBatch−Normalize 使得参数搜索更加容易,并且网络对于超参数的选择更加稳定。
- 在实践中,我们通常对未激活输出 ZZZ 进行 Batch−Normalize\rm Batch-NormalizeBatch−Normalize,假设 {zi∣i=1,2,⋯,M}\{z_i|i=1,2,\cdots,M\}{zi∣i=1,2,⋯,M} 是神经网络某一隐层的未激活输出集合,Batch−Normalize\rm Batch-NormalizeBatch−Normalize 的具体操作如下:μ=1M∑i=1Mzi\mu = \frac1M\sum_{i=1}^Mz_iμ=M1i=1∑Mziσ2=1M∑i=1M(zi−μ)2\sigma^2=\frac1M\sum_{i=1}^M(z_i-\mu)^2σ2=M1i=1∑M(zi−μ)2zi′=zi−μσ2+ϵ,i=1,2,⋯,M(3)z_i'=\frac{z_i-\mu}{\sqrt{\sigma^2+\epsilon}}~,~i=1,2,\cdots,M\tag{3}zi′=σ2+ϵzi−μ , i=1,2,⋯,M(3)
- (3)(3)(3) 中 ϵ\epsilonϵ 是很小的常数,用于避免 σ2=0\sigma^2=0σ2=0 时方差无定义,此时 {zi′∣i=1,2,⋯,M}\{z_i'|i=1,2,\cdots,M\}{zi′∣i=1,2,⋯,M} 是具有零均值、单位方差的隐层输出数据。但对于下一隐层而言,接收到的输入数据来自于不同的分布会更有意义,因此在上述归一化过程后,我们计算:z~i=γ⋅zi′+β,i=1,2,⋯,M(4)\tilde z_i=\gamma\cdot z_i'+\beta~,~i=1,2,\cdots,M\tag{4}z~i=γ⋅zi′+β , i=1,2,⋯,M(4)
- 这里 z~i\tilde z_iz~i 具有均值 β\betaβ,方差 γ2\gamma^2γ2,并且注意 γ,β\gamma,\betaγ,β 均是模型中的参数,是可以为优化算法所学习的,其遵循的更新规则和一般神经网络中的 W,bW,bW,b 完全一致。接下来使用 {z~i∣i=1,2,⋯,M}\{\tilde z_i|i=1,2,\cdots,M\}{z~i∣i=1,2,⋯,M} 替代原本的未激活输入,进入激活函数并向前传播。A=σ(Z~)A=\sigma(\tilde Z)A=σ(Z~)
- 如果加入了 Batch−Normalize\rm Batch-NormalizeBatch−Normalize 操作,那么 (1)(1)(1) 中的偏置项就不发挥作用了,因为无论 bbb 取何值,在标准归一化操作时都会被减去,而偏置功能转由参数 β\betaβ 承担,这一点在实现时需要注意。
- 对于 (4)(4)(4) 存在的意义,可以通过下图中 Sigmod\rm SigmodSigmod 函数值来获得一个直观理解:
如果所有的未激活输出都服从零均值、单位方差,那么意味着激活函数接收到的数据总是聚集在 000 附近的近似线性区域内,网络很难拟合到更多的特征。
Why it works.
- Batch−Normalize\rm Batch-NormalizeBatch−Normalize 能够加速网络训练,是由于它针对隐层输出进行了类似归一化输入的操作,使得优化算法得到一定程度的提速;另外,BN\rm BNBN 还增强了网络的稳定性,具体地说,网络中深层参数会更加 robust\rm robustrobust,当浅层参数发生变化时,深层参数不会表现出过大的波动。
- 我们考虑网络的第 l,l+1l,l+1l,l+1 层,其未激活输出记为 zzz,参数记为 w.w.w. 第 lll 层的未激活输出为 zlz^lzl,它由下式计算得到:zl=wl⋅al−1(5)z^l=w^l\cdot a^{l-1}\tag{5}zl=wl⋅al−1(5)如果应用 BN\rm BNBN 算法,那么会对 zlz^lzl 进行处理得到 z~l\tilde z^lz~l,z~l\tilde z^lz~l 拥有固定的均值 β\betaβ 和方差 γ2.\gamma^2.γ2.
- 这意味着即使在网络参数更新后,即使影响 zlz^lzl 值的前层参数 w1,w2,⋯,wlw^1,w^2,\cdots,w^lw1,w2,⋯,wl 发生变化,导致 zlz^lzl 的分布发生变化,但经过 BN\rm BNBN 后的未激活输出 z~l\tilde z^lz~l 限制了这种数据分布变化的剧烈程度,因为 z~l\tilde z^lz~l 必须具有均值 β\betaβ 和 方差 γ2.\gamma^2.γ2.
- 限制数据分布变化程度的意义在于:如果我们根据数据 (X,y)(X,y)(X,y) 学习到了某个映射规则 fff,而此时输入数据 XXX 的分布发生变化,那么映射规则 fff 则需要重新学习,该问题称为 CovariateShift.\rm Covariate~Shift.Covariate Shift. 而 BN\rm BNBN 通过固定均值、方差来控制数据分布变化程度,从而增强了网络深层参数的稳定性。
- 一种直观的理解是,BN\rm BNBN 弱化了深度网络各层之间的依赖性,使得各层以一定的独立性去学习特征。
- 另外,BN\rm BNBN 带来的意外之喜是,由于通常和 Mini−BatchGradientDescent\rm Mini-Batch~Gradient~DescentMini−Batch Gradient Descent 算法配合使用,因此每轮训练的均值和方差都是只在一个 mini−batch\rm mini-batchmini−batch 上计算的,所以它在每一层的激活输出上增加了噪音。
- 减去均值,除以标准差带来的噪音意味着 BN\rm BNBN 和 Dropout\rm DropoutDropout 类似,带有轻微的正则化效果,网络的后层不会过分地倚重前层某一个节点,从而不会出现某个连接权重过分大导致过拟合出现。
测试数据.
- 前面提到 (3)(3)(3) 中 μ,σ2\mu,\sigma^2μ,σ2 在训练时是针对每个 mini−batch\rm mini-batchmini−batch 计算的,但进行测试时,我们通常只有很少的数据作为输入,因此对于均值、方差的计算需要另寻出路。
- 常见的解决方案是,对训练阶段计算得到的均值、方差进行指数加权平均得到 μ∗,σ2∗\mu^*,\sigma^{2*}μ∗,σ2∗ 作为测试阶段使用的 BN\rm BNBN 计算量。
- 指数加权平均 ExponentialWeightedAverage\rm Exponential~Weighted~AverageExponential Weighted Average 针对一组数据 {θi∣i=1,2,⋯,n}\{\theta_i|i=1,2,\cdots,n\}{θi∣i=1,2,⋯,n},输出一组数据 {vt∣t=0,1,2,⋯,n}\{v_t|t=0,1,2,\cdots,n\}{vt∣t=0,1,2,⋯,n},其计算规则如下所示:v0=0v_0=0v0=0v1=ρv0+(1−ρ)θ1v_1=\rho v_0+(1-\rho)\theta_1v1=ρv0+(1−ρ)θ1v2=ρv1+(1−ρ)θ2v_2=\rho v_1+(1-\rho)\theta_2v2=ρv1+(1−ρ)θ2⋮\vdots⋮vt=ρvt−1+(1−ρ)θt(6)v_t=\rho v_{t-1}+(1-\rho)\theta_t\tag{6}vt=ρvt−1+(1−ρ)θt(6)
- 其中 ρ\rhoρ 是权重参数,上述计算规则得出的 vtv_tvt 近似等于 ttt 之前 11−ρ\cfrac1{1-\rho}1−ρ1 个数据的均值(包括 ttt ),常用 ρ=0.9\rho=0.9ρ=0.9,此时均值窗口大小为 10.10.10.
指数加权平均.
- 观察 (6)(6)(6) 不难发现,指数加权平均实际等价于对过去的数据乘以一个按照指数 ρx\rho^xρx 衰减的权重后再求平均。(6)(6)(6) 中 vtv_tvt 可以展开如下:vt=(1−ρ)[θt+ρθt−1+ρ2θt−2+⋯+ρt−1θ1](7)v_t=(1-\rho)\big[\theta_t+\rho\theta_{t-1}+\rho^2\theta_{t-2}+\cdots+\rho^{t-1}\theta_1\big]\tag{7}vt=(1−ρ)[θt+ρθt−1+ρ2θt−2+⋯+ρt−1θ1](7)数学上通常以 1e\cfrac1ee1 为临界值,(7)(7)(7) 中所有小于 1e\cfrac1ee1 的权重忽略不记,得到:ρx=1e\rho^x=\frac1eρx=e1x=1ln(1/ρ)(8)x=\frac1{\ln(1/\rho)}\tag{8}x=ln(1/ρ)1(8)
- 当 ρ→1\rho\rightarrow1ρ→1 时 ln(1/ρ)\ln(1/\rho)ln(1/ρ) 与 1−ρ1-\rho1−ρ 极为接近,二者极限均为 000,作图如下所示:
- 所以近似认为 vtv_tvt 表示过去 11−ρ\cfrac1{1-\rho}1−ρ1 个数值的指数加权均值,这一点从 (7)(7)(7) 中乘积第一项 1−ρ1-\rho1−ρ 来理解也是极为自然的。
import numpy as np
import matplotlib.pyplot as pltx = np.linspace(1e-5,1,1e3)
y1 = 1-x
y2 = np.log(1/x)plt.xlabel('x')
plt.ylabel('y')
plt.plot(x,y1,'ro',label = 'y=1-x')
plt.plot(x,y2,'bo',label = 'y=ln(1/x)')
【PyTorch】偏置项 bias 与 Batch-Normalize相关推荐
- 神经网络为什么需要加偏置项(bias)?
文章目录 一.什么是 bias? 二.bias 的作用 一.什么是 bias? 偏置单元(bias unit),在有些资料里也称为偏置项(bias term)或者截距项(intercept term) ...
- Batch Normalize的几点说明
前言 前面也讲过部分Batch Normalize的内容,单独拿出来成文,是因为感觉这方法非常赞,加快训练速度十几倍不等,模型越复杂越受益. 一句话总结BN:对每层输入加同分布约束,再加参数线性变换学 ...
- batchnomal_pytorch的batch normalize使用详解
torch.nn.BatchNorm1d() 1.BatchNorm1d(num_features, eps = 1e-05, momentum=0.1, affine=True) 对于2d或3d输入 ...
- PyTorch数据归一化处理:transforms.Normalize及计算图像数据集的均值和方差
PyTorch数据归一化处理:transforms.Normalize及计算图像数据集的均值和方差 1.数据归一化处理:transforms.Normalize 1.1 理解torchvision 1 ...
- BP算法,用梯度下降法更新权值W与偏置项b
Bp算法实际是输出的误差函数对每一个参数求导,输出层可以直接求出,非输出层则有链式法则求导.这里以上图5层神经网络为例进行说明. 一 符号说明: 1)这里使用激活函数为sigmoid函数: ...
- 归纳偏置 (Inductive Bias)
一.概念 Inductive Bias一般翻译为归纳偏置/归纳偏差(归纳偏置应该更容易理解些),是一个关于机器学习算法的目标函数的假设.其实说的是模型的指导规则. 归纳是自然科学中常用的两大方法(归纳 ...
- 【机器学习】浅谈 归纳偏置 (Inductive Bias)
目录 一.概念 二.例子 三.意义 一.概念 在机器学习中,很多学习算法经常会对学习的问题做一些关于目标函数的必要假设,称为 归纳偏置 (Inductive Bias). 归纳 (Induction) ...
- 神经网络中的偏置项b到底是什么?
前言 很多人不明白为什么要在神经网络.逻辑回归中要在样本X的最前面加一个1,使得 X=[x1,x2,-,xn] 变成 X=[1,x1,x2,-,xn] .因此可能会犯各种错误,比如漏了这个1,或者错误 ...
- 神经网络为什么要加偏置?---bias与费米能级εF
神经网络不加偏置也可以运行也就是说偏置bias对于神经网络来说不是必须的,那为什么一定要加偏置,有仿生学解释,但是人脑的分子数量是mol量级的,光蛋白质就有几万种,这么复杂的结构应该不是加一个偏置就能 ...
最新文章
- asyncdata 获取参数_载入页面初始数据(asyncData)《 Nuxt.js:异步数据 》
- oracle hint push_pred,hints的push_pred应用-Oracle
- 在JSP中读取POST的JSON数据
- 数据结构 2018统考题【找出数组中未出现的最小正整数】
- PostgreSQL数据库的注入
- Flume 1.7 源码分析(四)从Source写数据到Channel
- 贪心策略——活动选择问题
- unzip命令找不到
- JAVA中字符串函数subString的用法小结
- ViewStub基本用法
- LD_PRELOAD实现API劫持
- 超大图片(4000×3000像素)的畸变矫正,python+OpenCV实现
- Linux_Ubuntu快捷键截屏
- (建议收藏) | Spring Boot集成JSON Web Token(JWT)【知识积累】
- CAPM模型和Alpha策略
- 常微分方程matlab求解英文文献,常微分方程及其matlab求解毕业论文设计
- 土旦:关于display:flex碰上white-space nowrap 影响布局的问题
- react点击后高亮显示
- micropython教程nucleo-f767zi开发板_NUCLEO-F767ZI开发板评测
- 如何设计一个落地页,才算得上是一个好的落地页?