前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零基础成为深度学习高手——Ⅱ

从零基础成为深度学习高手——Ⅱ

作者头像
计算机视觉研究院
发布2018-04-17 13:48:51
5110
发布2018-04-17 13:48:51
举报

今天继续昨天的知识,继续学习新的一个阶段知识:

深度学习基础知识

接下来我们了解一下基础知识,我们上面也提到了,我们这次主要以卷积神经网络在图像识别领域的应用来介绍深度学习的,卷积神经网络,这个词听起来非常深奥,但其实没什么复杂的,我们可以分开成两个词来理解,卷积和神经网络,先看下卷积。 卷积时数学的定义,在数学里是有明确的公式定义的。

是不是觉得公式太抽象,看不明白?没关系,我们举个栗子就明白了。

还是以图像识别为例,我们看到的图像其实是由一个个像素点构成的。

一般彩色图像的是RGB格式的,也就是每个像素点的颜色,都是有RGB(红绿蓝三原色混合而成的),是三个值综合的表现。

假设f函数为5x5(对应到图片上即为5x5像素)为例,h函数为3x3的函数,大家可以理解为为一个手电筒(也就是筛选器),依次扫过这个5x5的区间。在照过一个区域,就像对应区域里的值就和框里的数据去做运算。最终输出为我们的输出图。

手电筒本身是一个函数,在3x3的区域内,他在每个位置都有参数,它的参数和对应到图片上相应位置的数字,先相乘,然后再把相乘的数字相加的结果输出,依次按照这些去把整个图片全部筛选一遍,就是我们所说的卷积运算了。

还是比较抽象,没关系,看下面这个图片就清楚了。

那我们为什么要做卷积呢?我们其实就是建立一个输入和输出的函数,图像识别的目的就是把输入的信息(像素点信息)对应到我们输出结果(识别类别)上去,所以是逐层提取有用特征,去除无用信息的过程。

比如下图所示,第一层可以识别一些边缘信息,后面逐层抽象,汇总到最后,就可以输出我们想要的结果,也就是我们的识别结果。

虽然我们知道特征是逐层抽象提取的,但是不幸的是,我们并不知道那一层是具体做什么的,也就不知道那个层数具体是什么意思。

也就是说,其实深度学习网络对于我们而言,是个黑盒子,我们只能通过他的输出来判断其好坏,而不能直接去调整某个参数。

那么,什么是神经网络呢?

其实这个模型来自于心理学和神经学,人工智能的专家借鉴了这个结构。

左侧为神经元,神经元接收外界的输入刺激或者其他神经元的传递过来的信号,经过处理,传递给外界或者给其他神经元。

右侧为我们根据神经元的生物学特征抽象出来的数学模型,其中x是输入,包括一开始数据来源(外部刺激)的输入,也包括其他节点(神经元)的输入。

w为参数(weight),每个节点还有一个b,这个b其实是一个偏置。

大家在学习新东西的时候,凡事多问个为什么?只有知道背后的原因了,这样你才能理解的更深刻。有句话说得好,还有什么比带着问题学习更有效率的学习方法呢?

为什么要加这个b呢?

大家想想看,如果没有b的话,当输入x为0的时候,输出全部为0,这是我们不想看到的。所以要加上这个b,引入更多的参数,带来更大的优化空间。

大家看一下,目前为止,这个神经元里的函数都还是线性的,也就是说输出与输入是线性相关的,但是根据神经元的生物学研究,发现其接受到的刺激与输入并不是线性相关的,也为了能够表征一些非线性函数,所以必须要再引入一个函数,也就是下面我们要讲的激活函数(activation function)。

为什么需要激活函数?因为需要引入一些非线性的特性在里面。 常见的激活函数有这些。

最近流行的激活函数

以前是sigmoid比较常见,但是现在ReLU用的比较多一些。

就类似于下图这样,在节点经过线性运算后,经过非线性的ReLU,然后进入下一层的下一个节点。中间的w和b,就是我们卷积神经网络的参数,也是我们模型中需要训练的对象。

大家看LeNet模型中,就是在输入数据多次进行卷积神经网络的处理。

对于模型而已,我们习惯把输入的数据叫做输入层,中间的网络叫做隐藏层,输出的结果叫做输出层。中间层数越多,模型越复杂,所需要训练的参数也就越多。

所谓的deep learning中的deep,指的就是中间层的层数,右图中GoogLenet有22层。

一般说来,模型越复杂,所能实现的功能也越强大,所能达到的精度也越高,目前最深的模型大概有10的7次方个神经元,其神经元比相对原始的脊椎动物如青蛙的神经系统还要小。

自从引入隐藏单元,人工神经网络的大小大约每 2.4 年翻一倍,按照现在的发展速度,大概要到2050年左右才能达到人类大脑的神经元数量的规模。

损失函数

怎么判断一个模型训练的好坏呢?我们需要一个评价指标(也就是KPI考核指标),也就是损失函数。 习大大教导我们不忘初心 ,那我们最初的目标是什么?是建立输入输出的映射关系。

比如我们的目标是判断一张图片上是只猫,还是一棵树。那这张图片上所有的像素点就是输入,而判断结果就是输出。

那怎么表征这个模型的好坏呢?很简单,大家应该很容易想到,就是把模型输出的答案和正确答案做一下比对,看一下相差多少。

我们一般用下面这个公式(平均平方误差,即MSE)来评估我们的模型好坏。

我们就是通过对比输出结果与预期结果的差异,其中带帽子的yu就是预期的结果(也就是标签值,即是真值),而前面的不带帽子的yu就是实际的输出结果。当训练结果非常好的时候,比如说是全对的时候,平均误差就是0。当训练结果非常差的时候,比如说全错的时候,误差即为1。

于是我们知道了,这个E越小越好,最好变成0. 大家注意下,这个求和的标识,表示是所有的数据的和,而不是一个的数值。我们常说大数据来训练模型,其实这就是大数据。我们训练的时候需要上百万张的图片,最终得出来的误差,就是这里,然后再除以数量,取平均值。

那怎么去降低这个误差呢?要回答这个问题,就涉及到卷积神经网络的核心思想了,也就是反向传播。

反向传播/梯度下降

既然讲到机器学习,那当然是让机器自己去通过数据去学习,那机器是如何进行自学习的呢?下面就要敲黑板,划重点了,因为这就是深度学习的重中之重了,也就是机器学习的核心了,理解了这个概念,基本上就理解了一多半了。

这个概念就是反向传播。听名字比较玄乎,其实这个概念大家在高等数学里都接触过这个概念了——梯度,其实也就是求导。

对于一维函数而言,函数梯度下降的方向就是导数的反方向。

对于二维函数而言,就是把误差对每个变量求偏导,偏导的反方向即为梯度下降的方向。

说起来有点抽象,我们举个实例来说明一下。

下面是我们的参数和损失函数的值。

我们先对第一个参数加一个极小值,算出新的损失函数。

然后用损失函数的变化去除这个极小值,就是这个参数的梯度了。

同样我们可以使用同样的方法去求得其他参数的梯度。

只要找到梯度下降的方向,按照方向去优化这些参数就好了。这个概念就是梯度下降。

但是我们知道,我们要训练的参数非常多,数据量也非常大,经常是百万、千万量级的,如果每次都把全部训练数据都重新计算一遍,计算损失函数,然后再反向传播,计算梯度,这样下去,模型的误差优化的非常非常慢。 那有没有更快的方法呢? 当然有了。

这些参数(weights),数量非常多,大概有上百万个,为了保证能够更好、更快的计算,节省算力,一般选用随机梯度下降方法,随机抽取一定数量(即为批量,batch)的样本,去计算梯度值,一般选择32/64/128。

这个方法就是随机梯度下降,这个批量(batch)这也是大家经常要调的参数。 我们可以这样理解随机梯度下降,其核心思想是,梯度是期望。期望可使用小规模的样本近似估计。

具体而言,在算法的每一步,我们从训练集中均匀抽出小批量样本来代替全部数据的梯度,因为其梯度期望是一致的。

值得一提是:这些batch中的样本,必须是随机抽取的,否则其期望就准确了。选的批量(batch)的值越小,进行一次参数优化的计算量越小,就越快,但是其随机性会比较大一些,如果选取的批量值比较大,则计算会稍微慢一些,但是随机性会小一些,这是我们需要权衡的。

前向计算一次,反向反馈一下,更新一下参数,叫做一个Epoch. Epoch的次数也是个超参数,也是需要搭建模型的时候可以调整的参数。

在整个模型中也是类似的。

简单总结下,截止到目前,我们已经了解了一些深度学习的基本概念,比如什么是卷积神经网络,了解了反向传播的传播的概念,如何梯度下降的方法去优化误差。

基本上深度学习是什么回事,大家已经知道了,但是深度学习还需要注意一些细节。有句话说的好,细节就是魔鬼,细节处理的好坏很大程度上决定了你是一个高手,还是一个菜鸟。

明天我们说说深度学习高手进阶篇,希望您继续关注与阅读!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机视觉战队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档