人工智能(AI)是近两年来最热门的词之一了,自16年Google DeepMind的AlphaGo打败了世界围棋大师李世石后,人们在惊叹之余,也意识到人工智能时代的正式开始。从此,人工智能、机器学习和深度学习就成为了热门词汇,而它们的关系如下图1所示。
人工智能的概念起源于1956年,所谓的人工智能就是给机器赋予人的智能,让机器能够像人一样地思考问题,做出决策。而一种较为有效的、可行的实现人工智能的方法就是机器学习,机器学习最基本的做法,是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。实现机器学习的一种重要框架是深度学习,它的出现使机器学习能够实现更多的应用,包括无人驾驶汽车,预防性医疗保健,甚至是更好的电影推荐。
从下图2可以看出,深度作为当前热门领域“机器学习”的其中一种框架,近年来,在google的使用呈直线上升趋势。
本文以下是通过参考台湾李宏毅教授的介绍深度学习的ppt,“”Deep Learning Tutorial “”,再加上自己的理解,简单介绍下深度学习的实现原理。下面的介绍主要分为两大部分,第一部分主要介绍深度学习的实现过程,第二部分介绍如何创建一个简单的深度学习模型。
深度学习的过程就是使用多个处理层对数据进行高层抽象,得到多重非线性变换函数的过程。就目前而言,深度学习主要是与人工神经网络相结合的,因此这里的深度学习算法框架也可以成为深度神经网络算法框架。
深度学习通过构建深层神经网络,来模拟人类大脑的工作原理。如下图所示,深层神经网络由一个输入层,数个隐层,以及一个输出层构成。每层有若干个神经元,神经元之间有连接权重。每个神经元模拟人类的神经细胞,而结点之间的连接模拟神经细胞之间的连接。深度学习框架的基本结构如下图3所示。
1. 深度学习的实现过程
机器学习的过程就是相当于寻找一个通用函数(变换)的过程。如:
语音识别,就是将一连串的语音信号作为自变量,通过一个函数,转换为一个自然语句:
图像识别,就是将给定的一个图片作为自变量,通过一个函数,转换为一个具体的图片描述:
像sari这种对话系统,将用户说的话通过一个函数,去查找相对应的输出,作为系统应答:
我们就图像识别应用,来直观地了解深度学习的一般框架,如下图所示。简单地说,深度学习过程就是选择一个最佳函数的过程,也可以说成为函数寻找最佳参数的过程。如下图左所示,深度学习过程主要分为三步:
1. 输入一系列的函数作为待训练模型
2. 评价各个函数的好坏,使用误差率作为标准
3. 通过每个函数的输出与正确的结果对比,来选择最佳的匹配函数。下面分别介绍下每一步所做的工作。
1.1 定义一系列的函数作为待训练模型
神经网络中一个神经元就相当于一个简单的线性函数,线性函数的定义如下:
其中,w1…wk就是作为函数的参数,也是神经元每个输入的权重值,b作为函数的偏移量。神经元的结构如下图5所示。途中除了函数的定义中存在的权重值w和偏移量b以外,还存在一个激活函数。
激活函数是用来引入非线性因素的。网络中仅有线性模型的话,表达能力不够。比如一个多层的线性网络,其表达能力和单层的线性网络是相同的。常见的激活函数有sigmod函数,relu函数和tanh函数。
1.2 确定函数好坏的方法
下图6所示为使用深度学习来训练给定的一张数字图像所代表的实际数字的例子。给定一张2的数字图像作为输入,输入层为256个像素点,而输出层则为0-9这10个数字对应的softmax值,根据softmax值的大小来选择最优的结果作为输出。
Softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,待分类的类别数量大于2,且类别之间互斥。比如我们的网络要完成的功能是识别0-9这10个手写数字,若最后一层的输出为[0,0.7,0.2, 0.1, 0, 0, 0, 0, 0, 0],则表明我们网络的识别结果为数字1。
一个好的函数应该能够保证对于整个样本集作为输入,输出的总误差是尽可能小的,误差可以表示为计算的输出值和真实值之间的距离。如下图7所示,针对下图神经网络,每个输出的误差可以用来计算结果值和实际值之间的差来表示。
总误差L等于多个输出误差之和,用下面的公式表示:
1.3 挑选最佳函数的方法
要在一系列的函数中寻找最佳的函数,也就是总的误差最小的函数,就是为这个函数寻找最佳的参数,在神经网络中称为权重值。对于下图8一个拥有三个输入神经元的两层前反馈全连接神经网络来讲,光是第一层就有9个权重值,若输入神经元1000,那光这一层神经网络就有1000000个权重值。
因此枚举出所有可能的值并从中选择一组最优的权重值是不可能的,那么如何找到一个最优的参数值,使得结果的误差总和最小呢,深度学习中采用的是梯度下降法,如下图9所示。这里假设横坐标为权重值w,w是一个m*1的矩阵。对于单连接网络,m代表神经元的个数,对于全连接网络,m代表神经元个数的平方,纵坐标为总的误差值L,w和L的关系可用一条不规则的曲线表示。寻找最佳w的计算过程如下:
1.首先,初始化权重w
2.然后,计算每个神经元输出的总的误差值,计算误差值对权重值的偏导 数,也就是下图曲线的斜率。
3.如果偏导数小于零,说明曲线处于下降趋势,即随着w的增加,误差在减少,因此这时需要继续增加w的值。
4.如果偏导数大于零,说明曲线处于上升趋势,即随着w的增加,误差在增大,因此这时需要减少w的值,
5.回到步骤2,重复以上过程,直到偏导数趋近于零,也就是处于说在一定的范围内,误差L相对于w处于最小值状态,此时的w可作为较优的一组参数。
如下图10,对于权重矩阵θ,使用梯度下降法去寻找较优权重值的计算过程。如下图左,对于θ中的每一个权值,计算总误差相对于此权值的偏导,如下图右。
如果这个偏导值小于零,新的权重值
使用梯度下降法寻找最优权重值的较为形象的过程如下图11。此图近似为一个山的等高线,海拔越低代表总的误差越小。要想找到最优解,首先我们选定一个初始的下山位置,然后通过偏导计算我们现在是处于上山还是下山方向,如果是下上方向,则选择一个步长继续下山,直到每一次处于上山方向,就代表我们已经找到山脚。
2. 构建一个简单的深度学习模型
下面我们通过创建一个简单的深度学习框架模型,这里我们使用keras,建立在TensorFlow和Theano深度学习框架之上的一个较容易上手的深度学习框架。我们使用keras自带的一个例子mnist_mlp.py进行深度学习模型的创建。根据上述介绍可知,创建过程主要分为三步:
1. 定义深度神经网络模型,相当于定义一系列的函数,如下图12所示。模型类型为sequential(线性叠加模型),线性叠加模型就是把每一层按照次序叠加起来,每层之间采用全连接方式。创建的神经网络有三层,add是往model里添加层,输入为2828的矩阵,输出结果为110的矩阵,前两层使用的激活函数是sigmod,最后挨着输出层使用的激活函数为softmax。
2. 评价各个函数的好坏,计算训练值和真实值之间的误差,如下图13所示。这里损失函数使用mse。
3. compile用来在模型编译的时候配置损失函数、优化器以及正确率函数。fit是用来训练一个固定迭代次数的模型。x_train为训练样本集就是手写的数字图片,y_train是训练样本的结果集,这里是指样本集的标签,batch_size为每次训练和梯度更新块的大小,nb_epoch为迭代次数。
训练好模型后,需要测试模型的准确率,使用evaluate函数,如下图15。
执行过程如下几张截图,由下图16输出可看到底层调用的是TensorFlow框架,而且训练样本集有60000个训练样本,测试样本集有10000个测试样本。
从下图可以看出这个深度学习模型有三层,总共的参数有669706个。如下图17所示。
训练数据迭代次数为20次,显示每次迭代的误差率和准确率如下图:
3.总结
本文首先讲述了深度学习的一般过程,接着介绍了如何使用keras框架构建一个简单的三层深度学习模型,适合深度学习的初学者入门。另外,使用keras构建深度学习模型的好处就是简单容易实现,但却隐藏了底层的实现细节。如果想清楚底层的实现的话,建议使用TensorFlow框架来构建深度学习模型。