| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用 -> 正文阅读 |
|
[人工智能]深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用 |
深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用前言提示:这里可以添加本文要记录的大概内容: 一、Batch Normalization是什么?相信大家第一次接触,应该是在训练模型的时候,模型训练困难,总是波动很大或者损失函数下降十分缓慢,甚至是无法收敛。 有研究表明:随着 DNN 网络层次的加深,参数的变化导致每一层的输入分布会发生改变,进而上层的网络需要不停地去适应这些分布变化,使得我们的模型训练变得困难。 为什么会这样呢?因为 Internal Covariate Shift 1.1 Internal Covariate Shift因为在训练过程中,每一层的输入分布会随着前一层参数的变化而变化,这种现象称之为 Internal Covariate Shift1。 下图为一个多层全连接的神经网络结构示意图,左侧的网络层为底层,右侧的网络层称之为顶层。
在模型的反向传播过程中,根据计算的梯度来更新每一层的 W [ l ] W^{[l]} W[l]和 b [ l ] b^{[l]} b[l],那么 Y [ l ] Y^{[l]} Y[l]的分布也会改变, Z [ l ] Z^{[l]} Z[l]的分布也随之改变。 然而 Z [ l ] Z^{[l]} Z[l]作为下一层 ( l + 1 ) (l+1) (l+1)的输入,这就使得 ( l + 1 ) (l+1) (l+1)层的神经元也需要不断的适应这样的变化,这就会降低整个网络的收敛速度。 1.2 Internal Covariate Shift 带来的影响① 上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低
② 网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度
下图为 s i g m o i d ( 左 ) sigmoid(左) sigmoid(左) 和 T a n h ( 右 ) Tanh(右) Tanh(右) 的激活函数与对应的一阶导数曲线图2
饱和区: 一旦陷入饱和区,两者的偏导都接近于0,导致权重的更新量很小,比如某些权重很大,导致相关的神经元一直陷在饱和区,更新量又接近于0,以致很难跳出或者要花费很长时间才能跳出饱和区。 1.3 如何减缓 Internal Covariate Shift 问题带来的影响注意:Internal Covariate Shift 是因为参数更新带来的网络中每一层输入值分布的改变,并且随着网络层数的加深而变得更加严重. 白化(Whitening)这不是本文探讨的重点,想了解的可以参考 Whitening 3 ,这里我们只需要知道,白化后的数据会有如下性质:
通过白化操作,可以有效地减缓 Internal Covariate Shift 的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛。 白化存在的问题白化存在如下缺点:
二、Batch Normalization这里说明下传统 Normalization 使用的原因:
而 Normalization 能够很好的使得样本处于同一个分布 2.1 传统 Normalization上面所说的传统 Normalization 在数学里面都学过,也叫归一化,常见的形式如下: 在非线性变换之后或者线性变换之前对
x
x
x 进行标准化处理(减去均值,除标准差),让数据处于均值为0、方差为1的分布中,以降低样本间的差异性。而 Batch Normalization 则是指对一个 batch 进行 Normalization . 如果仅仅使用这样的方法,对网络某一层 l l l 的输出数据做归一化,然后送到网络下一层B中,这样会影响本层网络 l l l 所学到的特征,从而导致数据表达能力的缺失。 另一方面,通过让每一层的输入分布均值为0,方差为1,会使得输入在经过sigmoid或tanh激活函数时,容易陷入非线性激活函数的线性区域,即0附近的线性区域。 这样一来非线性激活函数就起不到相应的非线性变换的作用,或者就是相当于一个线性层罢了,那么网络的非线性表达能力就下降了。 2.2 改进因此,BN又引入了两个可学习(learnable)的参数 γ \gamma γ与 β \beta β,这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换,即: ????????????????????????????????????????????????????????????????????????????????????????????????????????? Z j ~ = γ j Z j ^ + β j \tilde{Z_{j}} = \gamma_j\hat{Z_{j}} + \beta_j Zj?~?=γj?Zj?^?+βj? 这个操作使数据在中心区域附近的线性区域往旁边的非线性区域进行了一定的偏移,即通过 γ j \gamma_j γj? 和 β j \beta_j βj? 把原来的输出值从标准正态分布左移或者右移一点,使得曲线更加胖一点或瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区进行了扩散移动。 核心思想: 找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处( γ j \gamma_j γj? 和 β j \beta_j βj? 带来的),又避免太靠非线性区两头使得网络收敛速度太慢(Normalization 带来的)。这两个参数的核心思想就是兼顾线性的快速收敛,与非线性的较强表达能力。这两个参数需要通过学习得到的。 2.3 原文算法4三、Batch Normalization 在测试阶段的使用3.1 测试阶段如何计算 μ l \mu_l μl? 和 σ l 2 \sigma_l^2 σl2? 5在训练阶段,各层的 μ l \mu_l μl? 和 σ l 2 \sigma_l^2 σl2? 是通过当前层得到的输入 batch 计算而得。 而测试阶段有可能仅输入一个或者极少样本,它对应的 μ l \mu_l μl? 和 σ l 2 \sigma_l^2 σl2?是没有意义的,这时候该如何计算 μ l \mu_l μl? 和 σ l 2 \sigma_l^2 σl2? 呢? 针对每一层 l l l 而言:因为在训练结束后,每一层的参数已经固定好了,那么每一层有很多个已经计算过的mini-batch,则有这些 batch 对应的 μ l \mu_l μl? 和 σ l 2 \sigma_l^2 σl2?,在训练时,把这些值都保存下来;在测试时,通过计算 μ l \mu_l μl?的数学期望,以及 σ l 2 \sigma_l^2 σl2? 的无偏估计,从而间接求出该层的全局统计量:
这样的好处是,能够追踪训练过程中所有 mini-batch 的样本的特性。 需要注意的是: 对每一层输入进行归一化的时候,是按照一维度一维度的归一化,即每一个神经元 l i l_i li? 表示一维特征,在对该维度求 μ l i \mu_{l_i} μli?? 和 σ l i 2 \sigma_{l_i}^2 σli?2?,然后对该维度的输入进行 Normalization ,这一点千万别搞错了。 在得到每一个特征的均值和方差后,就可以对测试样本进行 Normalization 了. 3.2 完成BN层的计算这里特别指出:BN 层往往是添加在每一层网络中非线性层之前(激活函数计算之前)。 因此可以通过 Batch Normalization 得到: B N ( X t e s t ) = γ ? X t e s t ? μ t e s t σ t e s t 2 + ε + β BN(X_{test}) = {\gamma} {\cdot} {\frac {X_{test} - {\mu}_{test}} {\sqrt{\sigma^2_{test}+ \varepsilon}}} + {\beta} BN(Xtest?)=γ?σtest2?+ε?Xtest??μtest??+β 四、Batch Normalization总结BN的优势可以总结为如下6: (1)BN使得网络中的每一层输入数据都相对稳定,能够给加快模型的训练速度
(2)BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
假设对参数 W W W 进行缩放,得到 a W aW aW。那么有:
其中 μ 2 = a μ 1 \mu_2 = a\mu_1 μ2?=aμ1? , σ 2 2 = a 2 σ 1 2 \sigma_2^2 = a^2 \sigma_1^2 σ22?=a2σ12? 忽略计算过程中的 ε \varepsilon ε,则有: B N ( a W u ) = γ ? a W u ? μ 2 σ 2 2 + β = γ ? a W u ? a μ 1 a 2 σ 1 2 + β = γ ? W u ? μ 1 σ 1 2 + β = B N ( W u ) BN(aWu)=\gamma\cdot\frac{aWu-\mu_2}{\sqrt{\sigma^2_2}}+\beta=\gamma\cdot\frac{aWu-a\mu_1}{\sqrt{a^2\sigma^2_1}}+\beta=\gamma\cdot\frac{Wu-\mu_1}{\sqrt{\sigma^2_1}}+\beta=BN(Wu) BN(aWu)=γ?σ22??aWu?μ2??+β=γ?a2σ12??aWu?aμ1??+β=γ?σ12??Wu?μ1??+β=BN(Wu) ? B N ( ( a W ) u ) ? u = γ ? a W σ 2 2 = γ ? a W a 2 σ 1 2 = ? B N ( W u ) ? u \frac{\partial{BN((aW)u)}}{\partial{u}}=\gamma\cdot\frac{aW}{\sqrt{\sigma^2_2}}=\gamma\cdot\frac{aW}{\sqrt{a^2\sigma^2_1}}=\frac{\partial{BN(Wu)}}{\partial{u}} ?u?BN((aW)u)?=γ?σ22??aW?=γ?a2σ12??aW?=?u?BN(Wu)? ? B N ( ( a W ) u ) ? ( a W ) = γ ? u σ 2 2 = γ ? u a σ 1 2 = 1 a ? ? B N ( W u ) ? W \frac{\partial{BN((aW)u)}}{\partial{(aW)}}=\gamma\cdot\frac{u}{\sqrt{\sigma^2_2}}=\gamma\cdot\frac{u}{a\sqrt{\sigma^2_1}}=\frac{1}{a}\cdot\frac{\partial{BN(Wu)}}{\partial{W}} ?(aW)?BN((aW)u)?=γ?σ22??u?=γ?aσ12??u?=a1???W?BN(Wu)? 从第一个式子可以看到,在缩放后BN层的输出和缩放前BN层的输出的值一样,即缩放效果 a a a 被消掉,这里的缩放就是W更新一次之后,相比原来更新前,其实就是一个增大减小,使用一个a来表示。 意思就是,即便每一层的参数在不断地改变,但是这对BN层的输出区间没有太大影响,能够使得输出稳定在有 γ 和 β {\gamma} 和 {\beta} γ和β 决定的分布区间内.这就能够有效地降低底层、顶层等网络层之间由于分布不断改变,而使得网络训练速度慢、训练不稳定等问题。 此外,权重的缩放并不会影响对
μ
\mu
μ 的梯度计算。 (3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
(4)BN能够起到一定的正则化效果
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/22 10:21:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |