未验证 提交 ffd8b975 编写于 作者: A Aston Zhang 提交者: GitHub

Merge pull request #469 from PenghuahuaPeng/master

错别字还有空格
# 批量归一化
# 批量归一化
这一节我们介绍批量归一化(batch normalization)层,它能让较深的神经网络的训练变得更加容易 [1]。在 [“实战Kaggle比赛:预测房价”](../chapter_deep-learning-basics/kaggle-house-price.md) 一节里,我们对输入数据做了标准化处理:处理后的任意一个特征在数据集中所有样本上的均值为0、标准差为1。标准化处理输入数据使各个特征的分布相近:这往往更容易训练出有效的模型。
......@@ -34,17 +34,17 @@ $$\boldsymbol{\sigma}_\mathcal{B}^2 \leftarrow \frac{1}{m} \sum_{i=1}^{m}(\bolds
$$\hat{\boldsymbol{x}}^{(i)} \leftarrow \frac{\boldsymbol{x}^{(i)} - \boldsymbol{\mu}_\mathcal{B}}{\sqrt{\boldsymbol{\sigma}_\mathcal{B}^2 + \epsilon}},$$
这里$\epsilon > 0$是一个很小的常数,保证分母大于0。在上面标准化的基础上,批量归一化层引入了两个可以学习的模型参数,拉(scale)参数 $\boldsymbol{\gamma}$ 和偏移(shift)参数 $\boldsymbol{\beta}$。这两个参数和$\boldsymbol{x}^{(i)}$形状相同,皆为$d$维向量。它们与$\boldsymbol{x}^{(i)}$分别做按元素乘法(符号$\odot$)和加法计算:
这里$\epsilon > 0$是一个很小的常数,保证分母大于0。在上面标准化的基础上,批量归一化层引入了两个可以学习的模型参数,拉(scale)参数 $\boldsymbol{\gamma}$ 和偏移(shift)参数 $\boldsymbol{\beta}$。这两个参数和$\boldsymbol{x}^{(i)}$形状相同,皆为$d$维向量。它们与$\boldsymbol{x}^{(i)}$分别做按元素乘法(符号$\odot$)和加法计算:
$${\boldsymbol{y}}^{(i)} \leftarrow \boldsymbol{\gamma} \odot \hat{\boldsymbol{x}}^{(i)} + \boldsymbol{\beta}.$$
至此,我们得到了$\boldsymbol{x}^{(i)}$的批量归一化的输出$\boldsymbol{y}^{(i)}$。
值得注意的是,可学习的拉和偏移参数保留了不对$\hat{\boldsymbol{x}}^{(i)}$做批量归一化的可能:此时只需学出$\boldsymbol{\gamma} = \sqrt{\boldsymbol{\sigma}_\mathcal{B}^2 + \epsilon}$和$\boldsymbol{\beta} = \boldsymbol{\mu}_\mathcal{B}$。我们可以对此这样理解:如果批量归一化无益,理论上学出的模型可以不使用批量归一化。
值得注意的是,可学习的拉和偏移参数保留了不对$\hat{\boldsymbol{x}}^{(i)}$做批量归一化的可能:此时只需学出$\boldsymbol{\gamma} = \sqrt{\boldsymbol{\sigma}_\mathcal{B}^2 + \epsilon}$和$\boldsymbol{\beta} = \boldsymbol{\mu}_\mathcal{B}$。我们可以对此这样理解:如果批量归一化无益,理论上学出的模型可以不使用批量归一化。
### 对卷积层做批量归一化
对卷积层来说,批量归一化发生在卷积计算之后、应用激活函数之前。如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉和偏移参数,且均为标量。设小批量中有$m$个样本。在单个通道上,假设卷积计算输出的高和宽分别为$p$和$q$。我们需要对该通道中$m \times p \times q$个元素同时做批量归一化。对这些元素做标准化计算时,我们使用相同的均值和方差,即该通道中$m \times p \times q$个元素的均值和方差。
对卷积层来说,批量归一化发生在卷积计算之后、应用激活函数之前。如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉和偏移参数,且均为标量。设小批量中有$m$个样本。在单个通道上,假设卷积计算输出的高和宽分别为$p$和$q$。我们需要对该通道中$m \times p \times q$个元素同时做批量归一化。对这些元素做标准化计算时,我们使用相同的均值和方差,即该通道中$m \times p \times q$个元素的均值和方差。
### 预测时的批量归一化
......@@ -82,11 +82,11 @@ def batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):
# 更新移动平均的均值和方差。
moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
moving_var = momentum * moving_var + (1.0 - momentum) * var
Y = gamma * X_hat + beta # 拉和偏移。
Y = gamma * X_hat + beta # 拉和偏移。
return Y, moving_mean, moving_var
```
接下来我们自定义一个`BatchNorm`层。它保存参与求梯度和迭代的拉参数`gamma`和偏移参数`beta`,同时也维护移动平均得到的均值和方差,以能够在模型预测时使用。`BatchNorm`实例所需指定的`num_features`参数对于全连接层为输出个数,对于卷积层则为输出通道数。该实例所需指定的`num_dims`参数对于全连接层和卷积层分别为2和4。
接下来我们自定义一个`BatchNorm`层。它保存参与求梯度和迭代的拉参数`gamma`和偏移参数`beta`,同时也维护移动平均得到的均值和方差,以能够在模型预测时使用。`BatchNorm`实例所需指定的`num_features`参数对于全连接层为输出个数,对于卷积层则为输出通道数。该实例所需指定的`num_dims`参数对于全连接层和卷积层分别为2和4。
```{.python .input n=73}
class BatchNorm(nn.Block):
......@@ -96,7 +96,7 @@ class BatchNorm(nn.Block):
shape = (1, num_features)
else:
shape = (1, num_features, 1, 1)
# 参与求梯度和迭代的拉和偏移参数,分别初始化成 0 和 1。
# 参与求梯度和迭代的拉和偏移参数,分别初始化成 0 和 1。
self.gamma = self.params.get('gamma', shape=shape, init=init.One())
self.beta = self.params.get('beta', shape=shape, init=init.Zero())
# 不参与求梯度和迭代的变量,全在 CPU 上初始化成 0。
......@@ -148,7 +148,7 @@ train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)
gb.train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx, num_epochs)
```
最后我们查看下第一个批量归一化层学习到的拉参数`gamma`和偏移参数`beta`
最后我们查看下第一个批量归一化层学习到的拉参数`gamma`和偏移参数`beta`
```{.python .input n=60}
net[1].gamma.data().reshape((-1,)), net[1].beta.data().reshape((-1,))
......
# 前言
# 前言
就在几年前,不管在大公司还是创业公司,都鲜有工程师和科学家来将深度学习应用到智能产品与服务中。作为深度学习前身的神经网络,才刚刚摆脱被机器学习学术界认为是过时工具的印象。那个时候,即使是机器学习也非新闻头条的常客。它仅仅被看作是一门具有前瞻性,并拥有一系列小范围实际应用的学科。在包含计算机视觉和自然语言处理在内的实际应用通常需要大量的相关领域知识:这些实际应用被视为相互独立的领域,而机器学习只占其中一小部分。
......@@ -53,7 +53,7 @@
## 致谢
我们无比感谢本书的中英文版稿件贡献者和论坛用户们。他们帮助增添或改进了书中内容并提供了有价值的反馈。特别地,我们要感谢每一位为这本中文版开源书提交内容改动的贡献者们。这些贡献者的Github用户名和姓名(如提供)是:1000Delta、aa12356jm(崔永明)、aaronzs(Aaron Sun)、AceCoooool(陈斌斌)、alues(曾元豪)、Andiedie(周长安)、Angzz(李昂)、cgraywang(王晨光)、ChaiBapchya(Chaitanya Prakash Bapat)、chiyahoho(金杰)、cholesky01(赵小华)、daizuozhuo(戴作卓)、danteliujie(刘捷)、daquexian(张建浩)、DarkWings520(梓善)、delphi-tang(唐佐林)、DHRUV536、ding-hai(丁海)、DL-85(郭晶博)、duanhong169(段弘)、elliotxx(杨英明)、eric-haibin-lin(林海滨)、Evensgn(范舟)、fcbruce(李律)、Feywell(李阳)、fierceX(夏鲁豫)、foreversailor(张鹏)、gcaxuxi(徐曦)、Ghostish(Kangel Zenn)、GYingchao(Richard CUI)、gyp03(郭云鹏)、hank123456、haojin2(金颢)、hardfish82、hetong007(何通)、HITjialanyu(高剑伟 )、hlnull(王海龙)、htoooth、hufuyu、hukun01(Kun Hu)、ibyte2011(刘俊朋)、icemelon9(沈海晨)、inkydragon(韩承宇)、Jerryzcn(张钟越)、Jing-Luo(罗晶)、jiqirer(jiqirer)、Jonariguez(贾忠祥)、jwwthu(姜蔚蔚)、kaonashi-tyc(田宇琛)、kevinthesun(王曜)、kli-nlpr(李凯)、lanking520(兰青)、Laurawly(王乐园)、leezu(Leonard Lausen)、leizhag(张雷)、leocvml(鄭宇翔)、linbojin、lingss0918、LinkHS(杨大卫)、liujia1(刘佳)、loveisp(戴玮)、MachineIntellect(贾老坏)、mingloo(陆明)、MoodMAX(张亚鹏)、mzchtx(李超)、nlpjoe(周俊佐)、noobbull(Liang Jinzheng)、omg2hei(童话)、oneTaken(彭小平)、PEGASUS1993(王皓)、pengyuanzhuo(彭远卓)、PeterHuang2015(黄焖鸡)、piiswrong(解浚源)、Ramlinbird(彭艺宇)、rebounding(刘铭)、reminisce(吴俊)、rliu054(刘睿)、rongruosong(张绍明)、SnailTyan(刘天池)、starsdeep(廖翊康)、sxjscience(施行健)、SyunSiu(孙畔勇)、szha(查晟)、szhengac(郑帅)、Tom-Ren(任杰骥)、wanghaizhen(王海珍)、wangx404(王鑫)、wangzhe258369、wangzhenhui1992(王振荟)、WenmuZhou(周军)、wkcn(吴侃)、wlbksy(汪磊)、wudayo、xcnick(徐驰)、XiaGenYuan(夏根源)、xiaotinghe(何孝霆)、XieGuochao(谢国超)、xinetzone(刘新伟)、xmfbit(肖梅峰)、xwind-h(黄晓烽)、yanwenlei(燕文磊)、yidawang(王贻达)、yifeim(马逸飞)、yixuan(邱怡轩)、yongwww(吴勇)、ypwhs(杨培文)、yufengwhy(余峰)、yupbank(Peng Yu)、yuweiw823(王雨薇)、yuxiangw(王宇翔)、yxyphoebe(喻心悦)、yzhao30(赵越)、yzhliu(刘忆智)、zhanghang1989(张航)、zheng-da(郑达)、zhiics(陈志)、zhouhang95(周航)、zhreshold(张帜)、zijie0(周远)。谢谢你们为每一位读者改进这本开源书。
我们无比感谢本书的中英文版稿件贡献者和论坛用户们。他们帮助增添或改进了书中内容并提供了有价值的反馈。特别地,我们要感谢每一位为这本中文版开源书提交内容改动的贡献者们。这些贡献者的Github用户名和姓名(如提供)是:1000Delta、aa12356jm(崔永明)、aaronzs(Aaron Sun)、AceCoooool(陈斌斌)、alues(曾元豪)、Andiedie(周长安)、Angzz(李昂)、cgraywang(王晨光)、ChaiBapchya(Chaitanya Prakash Bapat)、chiyahoho(金杰)、cholesky01(赵小华)、daizuozhuo(戴作卓)、danteliujie(刘捷)、daquexian(张建浩)、DarkWings520(梓善)、delphi-tang(唐佐林)、DHRUV536、ding-hai(丁海)、DL-85(郭晶博)、duanhong169(段弘)、elliotxx(杨英明)、eric-haibin-lin(林海滨)、Evensgn(范舟)、fcbruce(李律)、Feywell(李阳)、fierceX(夏鲁豫)、foreversailor(张鹏)、gcaxuxi(徐曦)、Ghostish(Kangel Zenn)、GYingchao(Richard CUI)、gyp03(郭云鹏)、hank123456、haojin2(金颢)、hardfish82、hetong007(何通)、HITjialanyu(高剑伟)、hlnull(王海龙)、htoooth、hufuyu、hukun01(Kun Hu)、ibyte2011(刘俊朋)、icemelon9(沈海晨)、inkydragon(韩承宇)、Jerryzcn(张钟越)、Jing-Luo(罗晶)、jiqirer(jiqirer)、Jonariguez(贾忠祥)、jwwthu(姜蔚蔚)、kaonashi-tyc(田宇琛)、kevinthesun(王曜)、kli-nlpr(李凯)、lanking520(兰青)、Laurawly(王乐园)、leezu(Leonard Lausen)、leizhag(张雷)、leocvml(鄭宇翔)、linbojin、lingss0918、LinkHS(杨大卫)、liujia1(刘佳)、loveisp(戴玮)、MachineIntellect(贾老坏)、mingloo(陆明)、MoodMAX(张亚鹏)、mzchtx(李超)、nlpjoe(周俊佐)、noobbull(Liang Jinzheng)、omg2hei(童话)、oneTaken(彭小平)、PEGASUS1993(王皓)、pengyuanzhuo(彭远卓)、PeterHuang2015(黄焖鸡)、piiswrong(解浚源)、Ramlinbird(彭艺宇)、rebounding(刘铭)、reminisce(吴俊)、rliu054(刘睿)、rongruosong(张绍明)、SnailTyan(刘天池)、starsdeep(廖翊康)、sxjscience(施行健)、SyunSiu(孙畔勇)、szha(查晟)、szhengac(郑帅)、Tom-Ren(任杰骥)、wanghaizhen(王海珍)、wangx404(王鑫)、wangzhe258369、wangzhenhui1992(王振荟)、WenmuZhou(周军)、wkcn(吴侃)、wlbksy(汪磊)、wudayo、xcnick(徐驰)、XiaGenYuan(夏根源)、xiaotinghe(何孝霆)、XieGuochao(谢国超)、xinetzone(刘新伟)、xmfbit(肖梅峰)、xwind-h(黄晓烽)、yanwenlei(燕文磊)、yidawang(王贻达)、yifeim(马逸飞)、yixuan(邱怡轩)、yongwww(吴勇)、ypwhs(杨培文)、yufengwhy(余峰)、yupbank(Peng Yu)、yuweiw823(王雨薇)、yuxiangw(王宇翔)、yxyphoebe(喻心悦)、yzhao30(赵越)、yzhliu(刘忆智)、zhanghang1989(张航)、zheng-da(郑达)、zhiics(陈志)、zhouhang95(周航)、zhreshold(张帜)、zijie0(周远)。谢谢你们为每一位读者改进这本开源书。
此外,我们感谢Amazon Web Services,特别是Swami Sivasubramanian、Raju Gulabani、Charlie Bell和Andrew Jassy在我们撰写本书时给予的慷慨支持。如果没有可用的时间、资源以及来自同事们的讨论和鼓励,就没有这本书的项目。我们还要感谢Apache MXNet团队实现了很多本书所使用的特性。另外,经过同事们的校勘,本书的质量得到了极大的提升。在此我们一一列出章节和校勘人,以表示我们由衷的感谢:引言的校勘人为金颢,预备知识的校勘人为吴俊,深度学习基础的校勘人为张航、王晨光、林海滨,深度学习计算的校勘人为查晟,卷积神经网络的校勘人为张帜、何通,循环神经网络的校勘人为查晟,优化算法的校勘人为郑帅,计算性能的校勘人为郑达、吴俊,计算机视觉的校勘人为解浚源、张帜、何通、张航,自然语言处理的校勘人为王晨光,附录的校勘人为金颢。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册