第一部分对神经网络进行介绍,讲述神经网络的基础性知识。
第二部分,简要描述深度学习,介绍基础理论和网络学习过程。
1.神经网络
神经网络的学习,是指从训练数据中自动获取最有权重参数的过程。神经网络的首需能力是,在测试环境中增加其表达能力和泛化行为。
人工神经网络(Artificial Neural Network,ANN)
1.1 全连接神经网络FNN
全连接神经网络(Fully Connected Neural Network,FNN)。网络第0 层称之为输入层,最后一层为输出层,其余均为隐藏层,任意相邻两层,以全连接路径关联。
Step1 FNN前向传播:
(1)每个神经元以上一层各个节点输出作为输入,通过线性变换(结合偏置)和非线性函数激活(激活函数),得到这个节点的输出,并传递给下一层的节点
(2)输入层的节点对数据不做任何处理,节点个数等于输入自变量x的维度
(3)输出层的节点个数等于输出因变量y的维度
前向传播的过程结束后,我们得到的输出值若与实际值相差远,此时需要对误差进行反向传播,更新权值,重新计算输出。
Step2 FNN反向传播(Back Probation algorithm, BP):
(1)用神经网络对数据进行建模,就是要找到最合适的参数(权重w和偏置b),对数据进行最佳逼近。通常会设计一个损失函数来度量逼近效果,最优参数应使得损失函数最小化。
(2)神经网络可以视为一个非常复杂的复合函数,求解最优参数时,需要进行链式求导,形成了梯度的反向传播。
(3)常见损失函数:分类问题:交叉熵;回归问题:均方误差
误差反向传播法完成后,最后我们再把更新的权值重新计算,不停地迭代,最后实现总误差非常接近希望值。
参考文章:一文弄懂神经网络中的反向传播法 【推荐】
1.2卷积神经网络CNN
卷积神经网络(Convolutional Neural Network,CNN)是一种具有卷积计算的前馈神经网络(Feedforward Neural Networks)。在图像识别的比赛中,基于深度学习的方法都是以CNN为基础的。
1.2.1 整体原理
CNN中新出现了卷积层(Convolution层)和池化层(Pooling层)。之前的“Affine-Relu”连接被替换成“Convolution-Relu-(Pooling)”连接。
卷积层和池化层是图像识别中必备的模块。CNN可以有效读取图像中的某种特性,在手写数字识别中,还可以实现高精度的识别。
CNN的可视化:学习前的滤波器是随机进行初始化的。但学习后的滤波器变成了有规律的图像。学习后的滤波器在不同方向上有响应,滤波器会提取边缘(颜色变化的分界线)和斑块等原始信息。CNN会将这些原始信息传递给后面的层。第1层对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别有响应。
1.2.2 卷积层
全连接层存在的问题:数据的形状被忽视,向全连接层输入时,需要将3维数据拉平为1维数据。而卷积层可以保持形状不变。
卷积运算:卷积层进行的处理就是卷积运算,相当于图像处理中的“滤波器运算”。
在全连接的神经网络中,除了权重参数,还存在偏置。CNN中,滤波器的参数就对应之前的权重,也存在偏置。
填充(padding):在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据,称为填充。
填充的原因:使用填充主要是为了调整输出的大小。在反复进行卷积运算的深度网络中某个时刻输出大小有可能变成1,导致无法再应用卷积计算,这时就要使用填充。
步幅(stride),填充(padding), (FH,FW)为滤波器大小。
H=(H+2P-FH)/S +1 W=(W+2P-FW)/S +1
当输出大小无法除尽时,需要采用报错等对策,有时会四舍五入不报错。
3维数据的卷积运算:输入数据和滤波器的通道数要设为相同的值。滤波器大小可以设定为任何值,但是每个通道的滤波器大小要全部相同。
1.2.3 池化层
池化是缩小高、长方向上的空间运算。一般来说,池化的窗口大小会和不服设定成相同的值。
种类:Max池化、Average池化。在图像识别领域,主要使用Max池化。
1.2.4 具有代表性的CNN
CNN_NAME | FUTURE | |
---|---|---|
LeNet | LeNet是CNN的元组,1998年首次被提出,是进行手写数字识别的网络。 | LeNet中使用sigmoid函数,而现在的CNN中主要使用ReLu函数。 |
AlexNet | AlexNet在2012年被提出,是引发深度学习热潮的导火线,但网络结构和LeNet基本上没有什么不同。 | 较LeNet的差异:激活函数使用ReLu函数。使用Dropout。使用进行局部正规化的LRN(Local Response Normalization)层。 |
VGG | VGG是由卷积层和池化层构成的基础的CNN。 | 特点:将有权重的层(卷积层或全连接层)叠加到16层(或19层),具备了深度(根据层深度,称为VGG16或VGG19);基于3*3的小型滤波器的卷积运算是连续进行的。 |
GoogleNet | GoogleNet的特征:网络不仅在纵向上有深度,在横向上也有深度(广度、宽度)。 | 在横向上也有深度称为“Inception”结构(该结构使用多个大小不同的滤波器和池化,最后再合并它们的结果)。 |
ResNet | ResNet是微软开发的网络。特征:具有比以前更深的结构。 | ResNet为了解决网络过深很多情况下学习不能顺利进行导致的性能不佳的问题,导入了“快捷结构”,就可以随着层的加深而不断提高性能了(也是有其限度的),反向传播时信号可以无衰减地传递。快捷结构横跨(跳过)了输入数据的卷积层,将输入x合计到输出,原来的2层卷积层的输出F(x)变成了F(x)+x。 |
2.深度学习
深度学习是利用数学理论与计算机算法所构建的整体架构,通过完整有效的训练数据及使用计算机本身运算能力,调整架构超参数,从而拟合目标函数,其是一种理论与经验共用的建模方式。
2.1.从数据中学习
数据驱动
神经网络或深度学习比以往的机器学习方法更能避免认为介入。先从图像中提取特征量(提取本质数据的转换器)。
机器学习的方法中,由机器从手机到的数据中找到规律性。将图像转换未向量时使用的特征量仍是由人来设计的。
神经网络(深度学习)的方法直接学习图像本身,不存在人为介入。深度学习也称为端到端机器学习(end-to-end machine learning)。
神经网络的优点:对所有的问题都可以用同样的流程来解决。不管要求解的问题,神经网络都是通过不断地学习所提供地数据,尝试发现待求解地问题地模式。也就是说,与待处理地问题无关,神经网络可以将数据直接作为原始数据,进行“端到端”地学习。
训练数据和测试数据
泛化能力是指处理未被观察过地书地能力。获得泛化能力是机器学习的最终目标。
损失函数
神经网络以损失函数(loss function)为指标作为线索去寻找最优权重参数。这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。损失函数是表示神经网络性能的“恶劣程度”的指标。
在神经网络的学习中,寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数。为了找到使损失函数的值尽可能小的地方,需要计算参数的导数(确切地讲是度),然后以这个导数为指引,逐步更新参数的值。
分类问题:交叉熵;回归问题:均方误差
深度学习算法的实现
Step0:神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习。
Step1:(mini-batch)从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减少mini-batch的损失函数的值。
Step2:(计算梯度)为减少mini-batch的损失函数,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
Step3:(更新参数)将权重参数沿梯度方向进行微小更新。
Step4:重复1,2,3。
激活函数(Activation function):
在神经网络中,多层的线性变换相当于单层线性变换的组合,导致特征表达能力有限。由于在上一层的输入和下一层的输出之间存在一个激活函数,它的作用是为了引入非线性变换,用来弥补线性变换的不足,使网络增添非线性特性,从而可逼近任意非线性函数,大幅度提升拟合效果,提高神经网络特征表达的能力。
作为激活函数有三点要求: 第一,在固定区间内连续、可求其导函数,为非线性函数;第二,该函数及其导过程计算简单(提高网络计算效率);第三,该函数及其导函数的值域固定且合适(提高训练效率和稳定性)。
目前常用的激活函数有 Sigmoid 函数、Tanh 函数、ReLU(Rectified Linear
Unit)函数以及Leaky ReLU函数(改进ReLU 函数可能导致神经元坏死的缺点)。
ReLu函数:该函数模拟生物神经学,保留信息单侧抑制与激活边界宽等特点,降低网络所需计算内存,稀疏性优异,减轻梯度消失概率,维持收敛速度,增加表达能力。
def relu(x):
return np.maximum(0, x) #f(x) = max(0,x)
Sigmoid函数:该函数常用于网络中,计算结果符合伯努利分布,当结果趋近于
(−∞,+∞)时,函数图像趋近平滑状态且具有对称性。
def sigmoid(x):
return 1 / (1 + np.exp(-x)) #R(f)∈(0,1)
Data Augmentation(数据扩充): 通过对输入图像的旋转、垂直或水平方向上的移动等微小变化,增加图像的数量,以达到提高识别精度的目的。
迁移学习: 将别人学习完地权重(部分)复制到其他神经网络,进行再学习。迁移学习是对已有模型进行迁移学习和微调(fine tuning),泛化到自己的数据集上,所以在数据集较少时非常有效。
深度学习框架的预训练模型库:
TensorFlow:https://github.com/tensorflow/models
Pytorch:https://github.com/pytorch/vision
深度学习需要解决的问题: AlexNet中,大多数时间都被耗费在卷积层上,卷积层的处理时间占GPU整体的95%。
基于GPU的高速化: 与深度学习比较“亲近”的是NVIDIA的GPU。大多数深度学习框架只受益于NVIDIA的GPU,因为深度学习的框架中使用了NVIDIA提供的VUDA这个面向GPU计算的综合开发环境。
探险家的故事
有一个性情古怪的探险家。他在广袤的干旱地带旅行,坚持寻找幽深的山谷。他的目标是要到达最深的谷底(他称之为“至深之地”)。这也是他旅行的目的。并且,他给自己制定了两个严格的“规定”:一个是不看地图;另一个是把眼睛蒙上。因此,他并不知道最深的谷底在这个广袤的大地的何处,而且什么也看不见。在这么严苛的条件下,这位探险家如何前往“至深之地”呢?他要如何迈步,才能迅速找到“至深之地”呢?
寻找最优参数时,我们所处的状况和这位探险家一样,是一个漆黑的世界。在这么困难的状况下,地面的坡度显得尤为重要。探险家虽然看不到周围的情况,但是能够知道当前所在位置的坡度(通过脚底感受地面的倾斜状况)。于是,朝着当前所在位置的坡度最大的方向前进,就是SGD的策略。勇敢的探险家心里可能想着只要重复这一策略,总有一天可以到达“至深之地”。
深度学习的应用
物体检测 | 图像分割 | 图像标题的生成 |
---|---|---|
图像分割变换 | 图像生成 | Deep Q-Network强化学习 |