1.上节回顾
在上次课程总结中,我们对人工智能有了初步认识,并从最简单的线性分类入手,学习了线性分类的方法和感知机的建立。为了解决非线性问题,我们引入了多层感知机,使用BP神经网络对问题进行解答。虽然BP算法学习完全自主且可逼近任意非线性函数,但是也存在收敛速度慢等一系列的问题,下面将从性能优化的角度,进一步进行总结。
2.性能优化
2.1 问题描述
基本BP算法又可以称为最速梯度法,其迭代形式简单,可以逐步得到每一层神经网络的权值,其递推公式表示如下
如何选取和
构成优化核心内容。
2.2 动量法
2.2.1 SGD问题:病态曲率
2.2.2 动量法思想与更新公式
如果把原始的 SGD 想象成一个纸团在重力作用向下滚动,由于质量小受到山壁弹力的干扰大,导致来回震荡;或者在鞍点 处因为质量小速度很快减为0,导致无法离开这块平地。动量方法相当于把纸团换成了铁球;不容易受到外力的干扰,轨迹更加稳定;同时因为在鞍点处因为惯性的作用,更有可能离开平地。
动量法更新公式如下:
优点:动量法可有效改善收敛速度,以及避免一些陷入局部极小值。
2.3 自适应梯度算法
2.3.1 自适应梯度定义
参数自适应变化:具有较大偏导的参数相应有一个较大的学习率,而具有小偏导的参数则对应一个较小的学习率。
具体来说,每个参数的学习率会缩放各参数反比于其历史梯度平方值总和的平方根。
2.3.2相关算法
2.3.2.1 AdaGrad算法
缺点:AdaGrad算法学习率是单调递减的,训练后期学习率过小会导致训练困难, 甚至提前结束,需要设置一个全局的初始学习率。
2.3.2.2 RMSProp算法
RMSProp 解决 AdaGrad 方法中学习率过度衰减的问题
2.3.2.3 Adam算法
Adam 在RMSProp 方法的基础上更进一步。
2.3.3 各算法总结
AdaGrad及Adam等算法可自适应调节学习速率,加速收敛。
3.卷积神经网络基础
3.1 深度学习平台介绍
3.1.1 深度学习平台简介
相关平台:
平台评价:
3.1.2 PyTorch基本使用
3.1.2.1 介绍
PyTorch是一个Python的深度学习库。它最初由Facebook人工智能研究小组开发,而优步的Pyro软件则用于概率编程。
3.1.2.2 基本概念及操作
张量(Tensor):是一个物理量,对高维 (维数 ≥ 2) 的物理量进行 “量纲分析” 的一种工具。简单的可以理解为:一 维数组称为矢量,二维数组为二阶张量,三维数组为三阶张量。
计算图:用“结点”(nodes)和“线”(edges)的有向图来描述数学计算的图像。“节点” 一般用来表示施加 的数学操作,但也可以表示数据输入的起点/输出的 终点,或者是读取 /写入持久变量的终点。“线”表示“节点”之间的输入 /输出关系。这些数据“线” 可以输运“size可动态调整”的多维数据数组,即 “张量”(tensor )。
基本流程:
基本使用:
//定义网络
import torch.nn as nn
class LinearRegression(nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(1, 1) # 输入和输出的维度都是1
def forward(self, x):
out = self.linear(x)
return out
//进行训练:
model = LinearRegression()
params = list(model.named_parameters())
(_, w) = params[0]
(_, b) = params[1]
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.3)
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = 2*x + 10 + torch.rand(x.size())
for epoch in range(20):
inputs = x
target = y
out = model(inputs) # 向前传播
loss = criterion(out, target) # 向后传播
optimizer.zero_grad() # 注意每次迭代都需要清零
loss.backward()
optimizer.step()
print('Epoch: {}, w: {:.4f},b:{:.4f}'.format(epoch + 1, float(w.data),
float(b.data)))
model.eval()
3.2 卷积神经网络基础
3.2.1 基本概念
卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今几乎所有的图像识别、目标检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。
常用基本概念:
全连接网络:链接权过多,也很难收敛,同时可能会进入局部极小值,容易产生过拟合问题
局部连接网络:只有一部分权值连接,只有部分输入和权值卷积
特征提取:特征提取采用卷积的模式,图像卷积定义为
特征提取过程如下图所示
填充(Padding):在矩阵边界填充一些值,用以增加矩阵的大小,通常用0
步长(Stride):卷积核在原图上每一步移动的距离,如图步长为2。
多通道卷积:如RGB
池化(Pooling):使用局部统计特征,如均值或最大值,解决特征过多的问题。
3.2.2 卷积神经网络构成
3.2.3 学习算法
3.3 LeNet-5网络
3.3.1 网络介绍
3.3.2 结构详解
网络结构:
C1层:
- 6个Feature map构成
- 每个神经元对输入进行5*5卷积
- 每个神经元对应 5*5+1 个参数,共6个feature map, 28*28 个神经元,因此共有 (5*5+1)*6*(28*28)=122,304 连接
S2层(Pooling层):
C3层(卷积层):
S4层:与S2层工作相同。
C5层:
- 120个神经元
- 每个神经元同样对输入进行5*5卷积,与S4全连接
- 总连接数(5*5*16+1)*120=48120
F6层:
- 84个神经元
- 与C5全连接
- 总连接数(120+1)*84=10164
输出层:
- 由欧式径向基函数单元构成
- 每类一个单元
- 输出RBF单元计算输入向量和参数向量之间的欧式距离
网络说明:
与现在网络的区别
-卷积时不进行填充(padding)
-池化层选用平均池化而非最大池化
-选用Sigmoid或tanh而非ReLU作为非线性环节激活函数 -层数较浅,参数数量小(约为6万)
3.3.3 误差反向传播
经典BP算法:
卷积NN的BP算法:
当前卷积层,下一层为下采样层,误差回传
当前下采样层,下一层为卷积层,误差回传
3.3.4 网络结构可视化
可以一个网站进行网络结构的可视化
https://adamharley.com/nn_vis/cnn/3d.html
3.3.5 LeNet5代码实现
import torch
from torch import nn
from d2l import torch as d2l
class Reshape(torch.nn.Module):
def forward(self, x):
return x.view(-1, 1, 28, 28)
net = torch.nn.Sequential(
Reshape(),
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))
nn. Sequential():该函数可以将不同的模块组合成一个新的模块,将各模块按顺序输入即可。
nn.AvgPool2d(kernel_size, stride)或MaxPool2d:平均池化或最大池化层,输入参数分别为池化窗口大小和步长。二参数同时可以为整数,否则为元组类似的还有平均池化nn.AvgPool2d(kernel_size,stride)。
nn. Sigmoid():该函数为上一层的输出添加sigmoid激活函数类似的还有nn.ReLU(), nn.Tanh()等。
nn. Conv2d(in_channels,out_channels,kernel_size):卷积层,其三个参数按顺序代表输入通道数、输出通道数、卷积核大小若卷积核形状为正方形,则卷积核大小可以为int否则,卷积核大小必须为元组(tuple)。如: nn.Conv2d(1, 6, (5, 4))即代表卷积核大小为5× 4。
stride参数:可以规定卷积的步长,与卷积核大小类似,若各方向步长相同则可以为整数,否则应为元组。
padding参数:在图像的周围补充0的个数,常常用于控制卷积前后图像的尺寸大小。