目录:
task1:https://blog.csdn.net/zahidzqj/article/details/104293563
task2:https://blog.csdn.net/zahidzqj/article/details/104309590
task3:https://blog.csdn.net/zahidzqj/article/details/104319328
task4:https://blog.csdn.net/zahidzqj/article/details/104324196
task5:https://blog.csdn.net/zahidzqj/article/details/104324349
task6:本章节
task8:https://blog.csdn.net/zahidzqj/article/details/104452274
task9:https://blog.csdn.net/zahidzqj/article/details/104452480
task10:https://blog.csdn.net/zahidzqj/article/details/104478668
1 批量归一化和残差网络
主要包括:批量归一化、ResNets、DenseNet
批量归一化(BatchNormalization)
网络训练过程中参数不断改变导致后续每一层输入的分布也发生变化,而学习的过程又要使每一层适应输入的分布,因此我们不得不降低学习率、小心地初始化。
中心化(又叫零均值化):是指变量减去它的均值。其实就是一个平移的过程,平移后所有数据的中心是(0,0)。
标准化(又叫归一化): 是指数值减去均值,再除以标准差。
目的:通过中心化和标准化处理,最终得到均值为0,标准差为1的服从标准正态分布的数据。
数据归一化方法很简单,就是要让数据具有0均值和单位方差,如下式:
BN增加了2个参数,用来保持模型的表达能力。于是最后的输出为:
对卷积层做批量归⼀化
位置:卷积计算之后、应⽤激活函数之前。
如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和偏移参数。
计算:对单通道,batchsize=m,卷积计算输出=pxq
对该通道中m×p×q个元素同时做批量归一化,使用相同的均值和方差。
预测时的批量归⼀化
训练:以batch为单位,对每个batch计算均值和方差。
预测:用移动平均估算整个训练数据集的样本均值和方差。
残差网络ResNets
深度学习的问题:深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,准确率也变得更差。
残差块(Residual Block)
恒等映射:
左边(普通神经网络):f(x)=x
右边(引入残差块):f(x)-x=0 (易于捕捉恒等映射的细微波动)
在残差块中,输⼊可通过跨层的数据线路更快地向前传播。
稠密连接网络(DenseNet)
主要构建模块:
稠密块(dense block): 定义了输入和输出是如何连结的。
过渡层(transition layer):用来控制通道数,使之不过大
其中过渡层组成: 1×1卷积层:来减小通道数
步幅为2的平均池化层:减半高和宽
习题:
nn.BatchNorm2d(6)
的含义是:卷积层的批量归一化,通道数为6
BN层描述错误的是:拉伸参数和偏移参数均为超参数。
ResNet描述错误的是:可以通过不断加深网络层数来提高分类性能。
稠密连接网络过渡层中,1*1卷积层的主要作用是减小通道数
在稠密块中,假设由3个输出通道数为8的卷积层组成,稠密块的输入通道数是3,那么稠密块的输出通道数是:
计算公式: in_channels + i * out_channels=3*8+3=27
2 凸优化
本节主要是给出并证明了凸函数和凸集合的相关概念以及一些性质。
尽管优化方法可以最小化深度学习中的损失函数值,但本质上优化方法达到的目标与深度学习的目标并不相同。
优化方法目标:训练集损失函数值
深度学习目标:测试集损失函数值(泛化性)
优化在深度学习中的挑战
1)局部最小值
2)鞍点
3)梯度消失
首先是局部最小值问题:
如图,对于这样的函数,存在一个局部最小值,当模型从最左面开始进行梯度下降时,达到局部最小值后梯度为0就停止优化了,但显然距离全局最小值还有一定的距离,也就是说损失函数因为局部最小值的问题没有达到最优。
在一个方向上是极大值,另一个方向是极小值点,一阶导都是为0,但是二阶导有正有负。
凸性 (Convexity):集合中两点连线,连线部分都在集合内,那就是凸函数。
规律:凸集合的交集为凸集合,并集不一定是。
注意:函数值的期望大于期望的函数值
性质
凸函数与二阶导数:
限制条件:
1)拉格朗日乘子法
2)惩罚项
3)投影
3 梯度下降
一维梯度下降
证明:沿梯度反方向移动自变量可以减小函数值
#eg:f(x)=x^2
#定义原函数
def f(x):
return x**2 # Objective function
#定义一阶导数
def gradf(x):
return 2 * x # Its derivative
#更新x
def gd(eta):
x = 10
results = [x]
for i in range(10):
x -= eta * gradf(x)
results.append(x)
print('epoch 10, x:', x)
return results
#设置不同的学习率0.2 0.05 1.1
res = gd(0.2)#gd(0.05) gd(1.1)
def show_trace(res):
n = max(abs(min(res)), abs(max(res)))
f_line = np.arange(-n, n, 0.01)
d2l.set_figsize((3.5, 2.5))
d2l.plt.plot(f_line, [f(x) for x in f_line],'-')
d2l.plt.plot(res, [f(x) for x in res],'-o')
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)')
show_trace(res)
修改不同的学习率,梯度衰减的速度不同,函数收敛的情况也不同。
在更新梯度的过程中容易陷入局部最小值,无法达到全局最优。
多维梯度下降
#eg:f(x)=x1^2+x2^2
eta = 0.1
def f_2d(x1, x2): # 目标函数
return x1 ** 2 + 2 * x2 ** 2
def gd_2d(x1, x2):
return (x1 - eta * 2 * x1, x2 - eta * 4 * x2)
show_trace_2d(f_2d, train_2d(gd_2d))
自适应方法:牛顿法
c = 0.5
def f(x):
return np.cosh(c * x) # Objective
def gradf(x):
return c * np.sinh(c * x) # Derivative
def hessf(x):
return c**2 * np.cosh(c * x) # Hessian
# Hide learning rate for now
def newton(eta=1):
x = 10
results = [x]
for i in range(10):
x -= eta * gradf(x) / hessf(x)
results.append(x)
print('epoch 10, x:', x)
return results
show_trace(newton())
随机梯度下降
随机梯度下降参数更新:
总结:
梯度下降:是沿梯度反方向移动自变量从而减小函数值,学习率设置要合理,而且局部极小值是梯度下降算法面临的一个挑战。
牛顿法:可以通过Hessian矩阵来调整“步幅”,解决局部极小值,但是不能避免这么问题,由于求Hessian矩阵的逆,计算量比较大。
对于n个样本,使用随机梯度下降更新一次的时间复杂度为O(n),一个的时间复杂度为:O(1),随样本数量线性增长。
梯度下降、随机梯度下降和小批量随机梯度下降可根据参数batch_size修改来实现。
未完待续。。。