Skip to content

Commit

Permalink
✨ Add Group Norm
Browse files Browse the repository at this point in the history
  • Loading branch information
limberc committed Nov 15, 2018
1 parent c63a742 commit acd5118
Showing 1 changed file with 11 additions and 12 deletions.
23 changes: 11 additions & 12 deletions ch03_深度学习基础/第三章_深度学习基础.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,6 @@ sigmoid 激活函数图像如下图所示:

设最终中误差为 $ E $,对于输出那么 $ E $ 对于输出节点 $ y_l $ 的偏导数是 $ y_l - t_l $,其中 $ t_l $ 是真实值,$ \frac{\partial y_l}{\partial z_l} $ 是指上面提到的激活函数,$ z_l $ 是上面提到的加权和,那么这一层的 $ E $ 对于 $ z_l $ 的偏导数为 $ \frac{\partial E}{\partial z_l} = \frac{\partial E}{\partial y_l} \frac{\partial y_l}{\partial z_l} $。同理,下一层也是这么计算,只不过 $ \frac{\partial E}{\partial y_k} $ 计算方法变了,一直反向传播到输入层,最后有 $ \frac{\partial E}{\partial x_i} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial z_j} $,且 $ \frac{\partial z_j}{\partial x_i} = w_i j $。然后调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果;



### 3.2.2如何计算神经网络的输出?

答案来源:[零基础入门深度学习(3) - 神经网络和反向传播算法](https://www.zybuluo.com/hanbingtao/note/476663)
Expand Down Expand Up @@ -209,8 +207,6 @@ $$

同理,我们还可以计算出 $ y_2 $。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量 $ x_1, x_2, x_3, x_4 $ 时,神经网络的输出向量 $ y_1, y_2 $, 。这里我们也看到,输出向量的维度和输出层神经元个数相同。



### 3.2.3如何计算卷积神经网络输出值?

答案来源:[零基础入门深度学习(4) - 卷积神经网络](https://www.zybuluo.com/hanbingtao/note/485480)
Expand Down Expand Up @@ -293,7 +289,6 @@ $$

以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且 filter 的权值对于上一层所有神经元都是一样的。对于包含两个 $ 3 * 3 * 3 $ 的 fitler 的卷积层来说,其参数数量仅有 $ (3 * 3 * 3+1) * 2 = 56 $ 个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。


### 3.2.4 如何计算 Pooling 层输出值输出值?

Pooling 层主要的作用是下采样,通过去掉 Feature Map 中不重要的样本,进一步减少参数数量。Pooling 的方法很多,最常用的是 Max Pooling。Max Pooling 实际上就是在 n\*n 的样本中取最大值,作为采样后的样本值。下图是 2\*2 max pooling:
Expand Down Expand Up @@ -624,36 +619,36 @@ $\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)$

### 3.4.11 为什么Tanh收敛速度比Sigmoid快?(贡献者:黄钦建-华南理工大学)

`$tanh^{,}(x)=1-tanh(x)^{2}\in (0,1)$`
$tanh^{,}(x)=1-tanh(x)^{2}\in (0,1)$

`$s^{,}(x)=s(x)*(1-s(x))\in (0,\frac{1}{4}]$`
$s^{,}(x)=s(x)*(1-s(x))\in (0,\frac{1}{4}]$

由上面两个公式可知tanh(x)梯度消失的问题比sigmoid轻,所以Tanh收敛速度比Sigmoid快。

## 3.5 Batch_Size

### 3.5.1 为什么需要 Batch_Size?

Batch 的选择,首先决定的是下降的方向。
Batch的选择,首先决定的是下降的方向。

如果数据集比较小,可采用全数据集的形式,好处是:

1. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
2. 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。

对于更大的数据集,采用全数据集的形式,坏处是:
对于更大的数据集,假如采用全数据集的形式,坏处是:
1. 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
2. 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来 RMSProp 的妥协方案。

### 3.5.2 Batch_Size 值的选择

假如每次只训练一个样本,即 Batch_Size = 1。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。此时,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

既然 Batch_Size 为全数据集或者Batch_Size = 1 都有各自缺点,可不可以选择一个适中的Batch_Size值呢?
既然 Batch_Size 为全数据集或者Batch_Size = 1都有各自缺点,可不可以选择一个适中的Batch_Size值呢?

此时,可采用批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。

### 3.5.3 在合理范围内,增大 Batch_Size 有何好处
### 3.5.3 在合理范围内,增大Batch_Size有何好处

1. 内存利用率提高了,大矩阵乘法的并行化效率提高。
2. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
Expand All @@ -667,12 +662,16 @@ Batch 的选择,首先决定的是下降的方向。

### 3.5.5 调节 Batch_Size 对训练效果影响到底如何?

1. Batch_Size 太小,可能导致算法不收敛
1. Batch_Size 太小,模型表现效果极其糟糕(error飙升)
2. 随着 Batch_Size 增大,处理相同数据量的速度越快。
3. 随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
4. 由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
5. 由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

### 3.5.6 受限于客观条件无法给足够的Batch Size怎么办?

在极小的情况下(低于十),建议使用[Group Norm](https://arxiv.org/abs/1803.08494)

## 3.6 归一化

### 3.6.1 归一化含义?
Expand Down

0 comments on commit acd5118

Please sign in to comment.