batch size
一个训练集过大(m个样例),需要划分。
- 划分为1个:
- 名称:batch梯度下降
- batch_size = m
- 用整个训练集进行梯度下降
- 划分为5个:
- 名称:mini-batch梯度下降
- batch_size = m/5
- 划分为m个:
- 名称:随机梯度下降
- batch_size = 1
- 一次对一个样例数据进行梯度下降
epoch
对整个训练集进行一次梯度下降:即所有的训练样本完成一次forward和backward propagation。
对于训练集划分为5个子集:就是对5个子集都执行完。
一般样本要过很多次,多个epoch,直到收敛。
iteration
迭代,表示进行了一次梯度下降,更新了一次网络参数。
iteration=[batch_size]个训练数据forward+backward后更新参数过程
episode
一个状态、动作和回报的序列,以终止状态结束。对于围棋,从头到尾下一盘棋就是一个episode。是强化学习中的概念。
下采样
下采样层有两个作用,一是减少计算量,防止过拟合;二是增大感受野,使得后面的卷积核能够学到更多更加全面的信息。
下采样的方式主要有两种:
- 采用stride为2的池化层,如Max-pooling和Average-pooling ,目前通常使用Max-pooling,因为他计算简单而且能够更好的保留纹理特征;
- 采用stride为2的卷积层,下采样的过程是一个信息损失的过程,而池化层是不可学习的,用stride为2的可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一些计算量
卷积
一个尺寸 insize×insize\rm in_{size}\times in_{size}insize×insize 的特征图,经过 convsize×convsize\rm conv_{size}\times conv_{size}convsize×convsize 的卷积层,步幅为stride\rm stridestride,填充为paddingsize\rm padding_{size}paddingsize,计算出输出的特征图尺寸:
outsize=insize−convsize+2×paddingsizestride+1
\rm out_{size}= \dfrac{in_{size}-conv_{size}+2\times padding_{size}}{stride}+1
outsize=strideinsize−convsize+2×paddingsize+1
例:输入4*4,卷积核3*3,stride = 1,padding = 0
输出尺寸 = (4-3+0)/1 + 1 = 2
输入5*5,卷积核3*3,stride = 1,padding = 1
输出尺寸 = (5-3+2)/1 + 1 = 5
输入5*5,卷积核3*3,stride = 2,padding = 0
输出尺寸 = (5-3+0)/2 + 1 = 2
输入6*6,卷积核3*3,stride = 2,padding = 1
输出尺寸 = int(6-3+2)/2 + 1 = 3
注意:这里的padding有一列是没有参与卷积的,因为stride为2没有办法采样到这一列
VGG得出多层窄卷积层比少层宽卷积层更强大
上采样的原理和常用方式
在卷积神经网络中,由于输入图像通过卷积神经网络CNN提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进一步的计算,这个使图像由小分辨率映射到大分辨率的操作,叫上采样,它的实现一般有三种方式:
- 插值, 一般使用的是双线性插值,因为效果最好,虽然计算上比其他插值方式复杂,但是相对于卷积计算可以说不值一提,其他插值方式还有最近邻插值、三线性插值等;
- 转置卷积又称反卷积(Transpose Conv),通过对输入feature map间隔填充0,再进行标准的卷积计算,可以使输出feature map尺寸比输入更大;
- Up-Pooling Max Unpooling Avg Unpooling Max Unpooling 在对称的max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余补零。
Batch Normalization
归一化,提高模型泛化能力,加速模型训练,并防止梯度爆炸等问题
对每个channel通道计算平均值和方差,然后基于计算出的平均值和方差进行归一化
x^i=xi−μσ2+ϵ
\mathbf{\hat{x}_i}=\frac{\mathbf{x_i}-\mathbf{\mu}}{\sqrt{\mathbf{\sigma^2}+\mathbf{\epsilon}}}
x^i=σ2+ϵxi−μ
ϵ\epsilonϵ是一个非常小的正数,用来保证数值的稳定性,防止计算过程中出现除以零的情况。
对归一化后的数据进行缩放和平移
BN(xi)=γ∗x^i+β
\mathbf{BN(x_i)=\gamma*\hat{x}_i+\beta}
BN(xi)=γ∗x^i+β
γ\gammaγ是缩放因子,用于调整归一化数据的尺度;β\betaβ是平移因子,用于调整归一化后的数据平移。它们可以适应性的调整数据分布,更好地满足网络的训练。
激活函数
ReLU (Rectified Linear Unit - 修正线性单元)
ReLU 是目前最受欢迎的激活函数之一。它的定义非常简单:
- 当输入大于0时,输出就是输入本身。
- 当输入小于或等于0时,输出为0。
数学表达式为: f(x)=max(0,x)f(x) = \max(0, x)f(x)=max(0,x)
优点:
- 计算速度快,因为只涉及到比较和乘法。
- 在正数区间(x > 0)梯度恒为1,可以有效缓解梯度消失问题。
缺点:
- Dying ReLU Problem (神经元死亡问题): 当输入为负数时,ReLU的梯度为0。如果一个神经元的输出在训练过程中恒为负,那么这个神经元的权重将永远不会更新。这个神经元就“死亡”了。
ELU (Exponential Linear Unit - 指数线性单元)
ELU 是 ReLU 的一个变体,旨在解决“神经元死亡”的问题。
- 当输入大于0时,它和 ReLU 一样,输出就是输入本身。
- 当输入小于或等于0时,它会输出一个会慢慢饱和到 -α 的负值。
数学表达式为(通常 α 取值为1):
f(x)={xif x>0α(ex−1)if x≤0
f(x) =
\begin{cases}
x & \text{if } x > 0 \\
\alpha(e^x - 1) & \text{if } x \le 0
\end{cases}
f(x)={xα(ex−1)if x>0if x≤0
ELU vs. ReLU 的主要区别
-
对负值的处理:
- ReLU 将所有负输入都变为0。
- ELU 对负输入给出一个负的输出。这使得神经元的平均激活值可以更接近于0,类似于批归一化(Batch Normalization)的效果,有助于加速学习。
-
神经元死亡问题:
- ReLU 存在这个问题,因为负输入的梯度为0。
- ELU 通过对负值区域提供一个非零的梯度,缓解了这个问题。
-
计算复杂度:
- ReLU 的计算非常简单(一个
max
操作)。 - ELU 的计算中包含了指数运算 (
exp
),因此计算量会比 ReLU 稍大一些。
- ReLU 的计算非常简单(一个
总结:
特性 | ReLU | ELU |
---|---|---|
正值输入 | (x) | (x) |
负值输入 | 0 | α(ex−1)\alpha(e^x - 1)α(ex−1) |
输出均值 | 倾向于正 | 更接近于0 |
神经元死亡 | 存在风险 | 基本解决 |
计算速度 | 非常快 | 稍慢 |
总的来说,ELU 在很多情况下可以比 ReLU 带来更好的性能和更快的收敛速度,因为它解决了 ReLU 的一些关键短板。