admin 管理员组文章数量: 1087677
【深度学习】零基础理解NN和CNN
作为一个十余年来快速发展的领域,深度学习越来越火了。深度学习善于从原始输入数据中挖掘越来越抽象的特征表示,而这些表示具有良好的泛化能力.它克服了过去人工智能中被认为难以解决的一些问题.且随着训练数据集数量的显著增长以及芯片处理能力的剧增,它在目标检测和计算机视觉、自然语言处理、语音识别和语义分析等领域成效卓然,因此也促进了人工智能的发展。
本文主要介绍深度学习中NN(神经网络)和CNN(卷积神经网络)的基本概念,并不涉及任何推导。
一、神经网络NN(Neural Network)
神经网络的基本结构是:输入层,隐含层,输出层
现在我们拿一个最简单的神经网络——逻辑回归,来理解一些神经网络的专业名词。如下图:
先说一下这个网络能干什么事情,我们输入一个图片,然后经过这个网络,我们就得到了一个概率,这个概率表示输入的图片是某一种东西(比如猫)的可能性。
以上面的图为例,这个网络的运转流程是这样的:
第一部分:输入1,x1,x2,...xm,然后让xi和wi分别相乘,通过计算得到 z = 1*w0+ x1*w1+...+xm*wm。w0 可以看做是偏置项,这个时候我们就能拟合一个完整的线性表达了。然后z经过一个激活函数sigmoid得到^y,即^y = sigmoid(z),激活函数的目的是为了增加函数的非线性表达。损失函数是用来评判预测值和真实值之间的误差的,我们根据定义的损失函数计算出预测值^y和真实值y之间的误差。
完整的第一部分即从输入到损失的计算这一过程就叫做前向传播
第二部分:然后我们根据损失函数和优化算法对权重w进行调整,让网络能够向着我们的目的进行调整。
第二个部分的过程叫做反向传播
1. 激活函数:
使用激活函数是为了增加函数的非线性表达,如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,使用之后使得神经网络可以任意逼近任何非线性函数。图中的Activation function为sigmoid函数 该激活函数的示意图如下, sigmoid函数将输入的值转换成0~1 之间光滑的数。这样就使得 输出的^y 表示分类的概率 现在也有很多使用tanh激活函数,函数输出为-1~1,比sigmoid收敛更快
2. 损失函数:
损失函数是用来评判预测值和真实值之间的误差的,我的理解是损失函数本质上是给这个网络定了一个目标或者一个标准,根据这个标准我们就能评价这个网络好不好。
3. 优化算法:
虽然说网络定义了指标(损失函数),但是他只会评价,并不会提供建议(只会说不会做的东西...),那么这个时候优化函数就粉墨登场了,他是个实干派,他就会让网络向着损失函数最小或者最大(根据情况)的方向调整参数。这样我们的网络就有一个方向了,这样我们最终就能让网络顺着我们的想法移动了。
以梯度下降法为例,说明一个优化算法是怎么训练参数的。对于一个损失函数J(w) ,优化函数的目的是最小化J(w),如下图
我们每次调整w向着让J最小的方向前进,每次走一小步,走了好久好久,最终,我们走到函数的最底部(让J最小)我们就成功了。
每次更新的可以表示为w = w - α* dJ(w)/d(w),dJ(w)/d(w)就是函数J(w)的导数,表示下降的方向 α是步长,每次向着最小值前进的步长。α其实就是所谓的学习率。然后我们根据迭代,一步一步的改变w的值。多次迭代之后我们就能够找到让损失最小的参数w。
二、卷积神经网络CNN (Convolutional Neural Networks)
1962年, 生物学家 Hubel和 Wiesel通过对猫脑视觉皮层的研究, 发现在视觉皮层中存在一系列复杂构造的细胞, 这些细胞对视觉输入空间的局部区域很敏感, 它们被称为“感受野”. 感受野以某种方式覆盖整个视觉域, 它在输入空间中起局部作用,因而能够更好地挖掘出存在于自然图像中强烈的局部空间相关性.
如下图卷积网络结构由输入层、输出层、卷积层、池化层、全连接层构成
卷积神经网络其实是神经网络的一种拓展,CNN的主要的思想是局部连接(Sparse Connectivity)和权值共享(Shared Weights)下面会详细解释局部连接和权值共享具体的含义。
1. 卷积
卷积就是加权求和,黄色的矩形块表示一个卷积核,对图片(绿色区域)的卷积操作如下,卷积核通常可以表示图片的某一种特征(边缘等)
2. 卷积层
卷积层由多个特征图组成, 每个特征图由多个神经元组成, 它的每一个神经元通过卷积核与上一层特征面的局部区域相连. 卷积核是一个权值矩阵。如下图(左)中的粉嫩的长方体,这个就是一个卷积层,而里面一个矩形就表示特征图,特征图的正面可以看成下图(右),一个特征图包含了多个神经元(用图中的白色圆圈表示,此图为9个)。
卷积层需要定义一些参数:填充(Padding )以及卷积核的步长(Stride),大小(Kernel),和深度
填充:通常是为了让卷积后的图像与原图保持一样,填充为n表示在原图周围加了n层0,
步长:步长为n 表示每做一次卷积,卷积核向下一个方向移动n个像素
卷积核大小:表示神经元感受野大小,如下图(右)定义定义的大小为3*3,
深度:表示有多少种卷积核,每一种卷积核表示一种特征
卷积层之间的计算:
一个图像(32*32*3)作为输入,那么我们需要定义5*5*3的卷积核,这样的卷积核有6个,这样我们对图像进行卷积操作,卷积操作之后我们输出的卷积层就是 28*28*6(特征图大小为28*28,特征图个数为6个),依次类推
虽然说激励函数一般使用饱和非线性函数如sigmoid函数、tanh函数等.相比较于饱和非性函数,不饱和非线性函数能够解决梯度爆炸/梯度消失问题,同时也能够加快收敛速度。所以现在都是用ReLU函数,下图是一个ReLU的函数
3. 池化层
池化层通常用于保留主要的特征,同时减少下一层的参数和计算量 一般来说有最大池化和平均池化,下图为2*2最大池化,表示将特征图中的2*2区域压缩为一个值,这样能保留主要的特征,并减少下一层的参数。 若使用平均池化,那么就是取区域范围内的平均值,如上图黄色区域,若使用平均池化,则输出的结果是2,并非3
4. 全连接层
全连接层常简称为 FC,全连接层FC之后看起来就是普通的NN。连接层实际就是卷积核大小为上层特征图大小的卷积运算,卷积后的结果为一个节点,就对应全连接层的一个点。
假设最后一个卷积层的输出为7×7×512,连接此卷积层的全连接层为1×1×4096,要将这个卷积层转化为全连接层,那么我们需要4096种卷积核,卷积核的大小是7*7,卷积核的深度是512,这样进行卷积操作后输出的1×1×4096 可以看作为后面NN模块的输入。
对于总体网络来说:卷积是用来获取特征的,而NN是用来将获取的特征输入进行决策(分类)的。即卷积作为眼睛,而NN作为大脑。
5. 局部连接
卷积核的大小代表了神经元的感受野,感受野在输入空间中起局部作用,因而能够更好地挖掘出存在于自然图像中强烈的局部空间相关性,这是对图像处理来说非常有效的手段。
如下图左图,是NN的神经元的连接方式,可以看出NN是全局感受野,而右图每一个红色矩形便是对应神经元的感受域,每个神经元只与感受域内的神经元连接,紫色矩形表示CNN卷积层的一个特征图。
6. 权值共享
权值共享简单的来说,对于一个卷积层的N个特征图来说,每一个特征图的卷积核参数是共享的,这大大减少了参数量。下面给出一个例子:
若我们有1000x1000像素的图像,有1百万个隐藏层的神经元,如果全连接,就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。。 权值共享就是说如果我们对这一百万个神经元的每一个神经元都连接10x10个元素的图像区域,而且每一个神经元存在10x10=100个连接权值参数都是一样的那么我们就大大减少了参数数量了,从10^12变成10^2。 但是这样我们的每一层神经元均使用同一个卷积核,这样我们只能提取一种特征,因此我们可以增加卷积核的数量,这样我们就能得到多种特征,若有一百种特征,我们最终需要的参数数量也仅仅是10^4。
本人也是初入深度学习的门槛,主要参考了以下的博客,和一些自己的理解,有什么不足或者错误的地方欢迎指点讨论。
权值共享的理解
从NN到CNN
本文标签: 深度学习零基础理解NN和CNN
版权声明:本文标题:【深度学习】零基础理解NN和CNN 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1700276297a375948.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论