- A+
0x01 批量归一化和残差网络
批量归一化(BatchNormalization)
对输入的标准化(浅层模型)
处理后的任意一个特征在数据集中所有样本上的均值为0、标准差为1。
标准化处理输入数据使各个特征的分布相近
批量归一化(深度模型)
利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使整个神经网络在各层的中间输出的数值更稳定。
1.对全连接层做批量归一化
位置:全连接层中的仿射变换和激活函数之间。

2.对卷积层做批量归⼀化
位置:卷积计算之后、应⽤激活函数之前。
如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和偏移参数。 计算:对单通道,batchsize=m,卷积计算输出=pxq 对该通道中m×p×q个元素同时做批量归一化,使用相同的均值和方差。
3.预测时的批量归⼀化
训练:以batch为单位,对每个batch计算均值和方差。
预测:用移动平均估算整个训练数据集的样本均值和方差。
残差网络(ResNet)
深度学习的问题:深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,准确率也变得更差。
残差块(Residual Block)
恒等映射:
左边:f(x)=x
右边:f(x)-x=0 (易于捕捉恒等映射的细微波动)

ResNet模型
卷积(64,7x7,3)
批量一体化
最大池化(3x3,2)
残差块x4 (通过步幅为2的残差块在每个模块之间减小高和宽)
全局平均池化
全连接

主要构建模块:
稠密块(dense block): 定义了输入和输出是如何连结的。
过渡层(transition layer):用来控制通道数,使之不过大,1X1卷积层:来减小通道数;步幅为2的平均池化层:减半高和宽
习题积累:
1. nn.BatchNorm2d(6)
的含义是
- 全连接层的批量归一化,batchsize为6
- 卷积层的批量归一化,batchsize为6
- 全连接层的批量归一化,输出神经元个数为6
- 卷积层的批量归一化,通道数为6答案解释
D正确,nn.BatchNorm2d()
表示卷积层的BN,参数为通道数。nn.BatchNorm1d()
表示全连接层的BN,参数为输出神经元个数。
2. 关于BN层描述错误的是
- 卷积层的BN位于卷积计算之后,激活函数之前。
- 拉伸参数和偏移参数均为超参数。
- 预测时用移动平均估算整个训练数据集的样本均值和方差。
- BN层能使整个神经网络在各层的中间输出的数值更稳定。
B错误,拉伸参数和偏移参数为可学习参数。其它选项参考BN层定义
3. 关于ResNet描述错误的是
- 残差网络由多个残差块组成。
- 在残差块中,输⼊可通过跨层的数据线路更快地向前传播。
- 可以通过不断加深网络层数来提高分类性能。
- 较普通网络而言,残差网络在网络较深时能更好的收敛。
C 错误,网络达到一定深度后再一味地增加层数反而会招致网络收敛变得更慢,准确率也变得更差。 其它选项参考 ResNet的结构特征。
4. 稠密连接网络过渡层中,1*1卷积层的主要作用是
- 减小通道数
- 增加通道数
- 引入非线性
- 代替全连接层答案解释
A正确,参考过渡层的作用。
5. 在稠密块中,假设由3个输出通道数为8的卷积层组成,稠密块的输入通道数是3,那么稠密块的输出通道数是
- 8
- 11
- 24
- 27
输出通道数=输入通道数+卷积层个数*卷积输出通道数
0x02 凸优化
优化与估计
尽管优化方法可以最小化深度学习中的损失函数值,但本质上优化方法达到的目标与深度学习的目标并不相同。
- 优化方法目标:训练集损失函数值
- 深度学习目标:测试集损失函数值(泛化性)
优化在深度学习中的挑战
- 局部最小值
- 鞍点
- 梯度消失
局部最小值
f(x)= xcosΠx
def f(x):
return x * np.cos(np.pi * x)
d2l.set_figsize((4.5, 2.5))
x = np.arange(-1.0, 2.0, 0.1)
fig, = d2l.plt.plot(x, f(x))
fig.axes.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),
arrowprops=dict(arrowstyle='->'))
fig.axes.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8),
arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)');

鞍点
x = np.arange(-2.0, 2.0, 0.1)
fig, = d2l.plt.plot(x, x**3)
fig.axes.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),
arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)');

梯度消失
x = np.arange(-2.0, 5.0, 0.01)
fig, = d2l.plt.plot(x, np.tanh(x))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)')
fig.axes.annotate('vanishing gradient', (4, 1), (2, 0.0) ,arrowprops=dict(arrowstyle='->'))

参看:[机器学习必知必会]凸优化
https://www.jianshu.com/p/6a962fb1b4e0
优化方法的目标是最小化 训练集损失函数,深度学习的目标是最小化 测试集 损失函数值。
局部最小值、鞍点、梯度消失都属于优化在深度学习中面临的挑战。
鞍点是对所有自变量一阶偏导数都为0,而且Hessian矩阵特征值有正有负的点。
假设A和B都是凸集合,A和B的交集也是凸集合。
有限制条件的优化问题可以用拉格朗日乘子法、添加惩罚项、投影法解决。
习题积累:





0x03 梯度下降
梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
梯度下降法(gradient descent)是一个最优化算法,常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型。
1.关于梯度下降,局部极小值是梯度下降算法面临的一个挑战。梯度下降是沿着梯度的反方向移动自变量从而减小函数值的。
牛顿法:
- 牛顿法相比梯度下降的一个优势在于:梯度下降‘步幅’的确定较为困难,而牛顿法相当于可以通过Hessian矩阵来调整‘步幅’。
- 在牛顿法中,局部极小值也可以通过调整学习率来解决。
- 牛顿法需要计算Hessian矩阵的逆,计算量比较大。
- 随机梯度下降的时间复杂度为:O(1)
2.梯度下降算法中的正数 η 通常叫作学习率。这是一个超参数,需要人工设定。如果使用过小的学习率,会导致 x 更新缓慢从而需要更多的迭代才能得到较好的解。学习率选择太大则,步子太大,容易扯着蛋, 跨越最优解。
3.小批量随机梯度下降在参数进行更新的时候每一次取一小部分样本进行梯度下降,对梯度取均值进行梯度更新。当批量较大时,每个小批量梯度里可能含有更多的冗余信息。为了得到较好的解,批量较大时比批量较小时需要计算的样本数目可能更多,例如增大迭代周期数
4.对于动态学习率:
- 在最开始学习率设计比较大,加速收敛。
- 学习率可以设计为指数衰减或多项式衰减。
- 在优化进行一段时间后可以适当减小学习率来避免震荡。
- 动态学习率可以随着迭代次数增加减小学习率。