首先声明这篇博客适用于有适当数学和计算机基础的同学,因为适用范围较广,因而我会从最基本的只是开始讲解从机器学习一直到深度学习的延伸和发展。
为了能够让更多的人了解深度学习的入门知识,自不量力地写一篇基本的卷积神经网络的入门教程,来让大家对深度学习有一个基本的认识。下面是对整篇博客的一个梗概:
- 分类器训练
- 神经网络
- 卷积神经网络
- googLenet的inception基本介绍
分类器训练
社会和科技的进步迫使计算机具备精确的分类功能,而且随着网络的发展获取已经明确知道分类结果的数据越来越容易,这些数据用行话说就是带标签的数据。我们的任务就是用这些带标签的数据来制作一个分类器来满足人工智能的需求。而要如何做呢,下图就是一个比较好的解释:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLkoCMYd-1576313179566)(http://i.imgur.com/tXZUyQH.png)]
如图所示,training set中的x就是我们已经获取的训练数据,y是已知的数据分类结果,注意这里的x是一维行向量,而y是一个数字,一个x对应一个y, 我们目前获取到的是成千上万个<x, y>, 而我们的任务通过这些数据对来训练出一个分类器,使得一个未知数据通过这个分类器的时候能够很大概率的预测出其所属分类。这个领域惯用的伎俩是用一个列向量W来和x相乘,得到的结果是一个数字,这其实是对x进行一个线性变换,让得到的这个数字更加接近于y,就证明这个分类器的分类效果好,
而后来证明线性分类器的分类效果有局限性,而非线性分类器的效果更好,因而就把W和x相乘的结果通过一个非线性转换器f, 行话叫激活函数,字面意思就是f的输入符合它本身的要求,它就被激活,反之就不被激活,从f的输出结果result就是调整方案之后的结果( r e s u l t = f ( W ∗ x ) result = f(W * x) result=f(W∗x))比线性分类器的结果要好,整个结构如上图所示。我们构造这个模型的目的就是为了找到合适的W来完成分类器的构建。
上文提到我们拿到的不是一个样本,而是成千上万个样本,而我们的任务也不是让某一个样本的预测结果准确,而是让所有的样本的预测结果的准确性较高,这就引入了下一个概念–损失函数,
损失函数: 预测结果和真实结果之间的差异 – L ( W ) = L ( y , r e s u l t ) L(W) = L(y, result) L(W)=L(y,result)
而我们任务的最终目的就是为了找到损失函数 L ( W ) L(W) L(W)最小时的W,但凡学过一点微积分的人都知道要这个函数的导数为0的自变量对应的值,而对应于此处就是如下公式,简单明了:
W o p t = a r g m i n W ( L ( W ) ) ) W_{opt}=argmin_{W}(L(W))) Wopt=argminW(L(W)))
随着问题的深入,问题看来已经解决的差不多了,但是再一想可能就会有些麻烦了。如果
L
(
W
)
L(W)
L(W)很简单,我们就能很快求出其导数为0的点,那如果公式很复杂,我们就不能一下子找到其最优解,而这里要采取的方法就是赫赫有名的梯度下降法登台亮相的时候了,先展示一下其工作原理图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6M1AvWY-1576313179568)(http://i.imgur.com/KQVhqud.png)]
寻找一个函数的最小值,就好比站在一个起起伏伏的山丘上找到周围这篇区域的最低点,而由于地势复杂,我们不能够一下子走到最低点,按照常识我们会先找到下山最快的方向走一小步,然后再看看周围哪里下山最快,而后接着走,一直走到最低点为止,而梯度下降法就是采用了这样的策略,上述提到的下山最快的方向对应于行话就是负梯度方向,这是有学数学基础的同学都知道的,而每走一步,就会更新一下自己的步伐,更新后的步伐就更接近于山丘的最低点,也就是是损失函数的值进一步减小,这样一直不断的迭代下去,直到再走一步和之前的高度差不多,就不用再走了,行话叫函数收敛了,上述的基本原理转换为如下公式:
Repeat until converge{
W
j
:
=
W
j
−
α
∂
L
(
W
)
)
∂
W
j
{W_{j}:=W_{j}- \alpha \frac{\partial L(W))}{\partial W_{j}}}
Wj:=Wj−α∂Wj∂L(W))}
这里的 α \alpha α是之前所说的每走一步的大小,行话叫做学习率。
分类器升级
这里首先为下面的升级版作一下铺垫,知识点如下图所示,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OoNfYNBU-1576313179569)(http://i.imgur.com/XzO8aFI.png)]
反向传播,为了对求梯度的进一步深化,可以实现求解连续多步的梯度。
如图, x x x和 y y y经过 f f f的处理得到 z z z, 而后 z z z经过有限步的计算得到了 L L L,而通过 z z z前面的步骤的回退计算出 z z z对应于 L L L的全局梯度,而我们需要求解的是 x x x和 y y y对于 L L L的全局梯度,而我们现在能够获取的是 x x x和 y y y对应于 z z z的局部梯度,这里就运用了微积分中的链式法则, x x x对于 L L L的全局梯度是 x x x和 y y y对应于 z z z的局部梯度与 z z z对应于 L L L的全局梯度的乘积,公式如上图所示。
而后进入正题,上一节介绍的只是
x
x
x经历了一个
W
W
W,而后经过激活函数的处理,得到结果,而后反向传播运用梯度下降法对于
W
W
W进行调整,而对于大部分的复杂数据集,这样只设计一步的分类器不能达到要求,需要连续几步来进一步提高分类器的准确率,原理图如下,渐渐地,有了一些级联的概念,这里黄色箭头指的是前向计算,而红色箭头指的是反向传播。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KlDHiS3P-1576313179573)(http://i.imgur.com/Jf1KuW3.png)]
Tips: 这里的 x x x和所有的 W W W都依然是一维的。
神经网络
这里介绍的神经网络是对上面分类器的一个升级,之前
x
x
x和
W
W
W都是一维的,而现在
x
x
x依然是一维的,不同的是
W
W
W已经变为二维的了,很容易想到,计算出的
f
(
x
,
W
)
f(x, W)
f(x,W)就变为了一个一维向量,而不是原来的数字了,而这里的
x
x
x重新命名为input layer,
f
(
x
,
W
)
f(x, W)
f(x,W)为hidden layer, 最后的
r
e
s
u
l
t
result
result为output layer,其实就是换汤不换药,换个高端一点的说法罢了,原理图如下,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSOxSWqF-1576313179576)(http://i.imgur.com/1gmtWFO.png)]
神经网络升级
这一节又是对上一节的进一步升级,这里和上一节有如下两点不同:
- 如今的 x x x和 W W W都已经变为了二维的,而 f ( x , W ) f(x, W) f(x,W)也变为了二维的,
- W W W的尺寸已经减小,且不是和 x x x的所有值相乘,只是和 x x x的局部区域做卷积,输出一个点,把 x x x的所有局部区域都滑过后结束本层的计算,
这里的 W W W叫做卷积核,有一些图像处理基础的同学对这个词都会很熟悉,网上有很多介绍它的教程甚至动态图,大家可以自行下载和学习,因这不是本篇博客的重点,因而在这里不赘述了。
而为什么不让 W W W和 x x x统一尺寸呢?道理很简单,为的是减少参数的个数,常用的卷积核有33, 55, 77, 而如果 W W W和 x x x的尺寸一致,若 x x x是224224,那参数的数量就会大大增加,每次更新优化参数的时间就会大大增加。
卷积神经网络
铺垫了那么久,终于进入要讲的章节了,可见知识真的是要一步一步的深入才能学好。
之前提到的
x
x
x和
W
W
W都是二维的,而现如今
x
x
x变为了三维矩阵,而
W
W
W变为了更高维度的矩阵了,这就更加接近了现实生活中的图像的概念。原理图如下所示,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZAOL4xu-1576313179577)(http://i.imgur.com/GkdfuMr.png)]
而这里重点要进一步讲述一下卷积核,卷积核有三个维度,长,宽和深度,这个深度必须和输入数据的深度一致,比如输入的是彩色图像,深度为3,而一个卷积核的深度一定是3,而卷积核的个数是不受限制的,每一层的卷积核的个数越多,对于输入提取的信息就越全面,但是要调整的参数就越多,因而这需要结合实际情况对卷积核的个数具体设计。高维的卷积核示意图如下所示,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iP5P2BWQ-1576313179577)(http://i.imgur.com/S9wzZRE.png)]
一个卷积核对应于输入的一个特征检测,更专业一点就是输入的一个基,这个术语对于学过线性代数的同学来说并不陌生,一个矩阵的基越多,这个矩阵就能够被描述的越全面,这就正好符合现在的情形,而卷积核就代表了图像的特征,例如边缘,颜色,色调…
结语
这篇博客从一开始的分类器训练一步步递进,分别介绍神经网络已经卷积神经网络,是对深度学习初学者的一个帮助。如果哪里说的不对,请大家为我指明,共同学习共同进步。