此时我们可以进一步总结上述任务:一个图片是否是猫的识别问题,其实就是训练一个好的神经网络,训练的意思就是让权重和偏差的值不断调整到最佳,以使得整个网络的预测效果最好 。
接下来我们来说明神经网络算法是如何让计算机训练出"一套"好的权重和偏差的 。首先我们来了解下神经网络中神经元是如何形成的 。
我们用X代表输入层,也就是x1、x2、x3构成的特征矩阵,用W代表权重矩阵,用b代表偏差,前面讲过我们通过样本特征矩阵和权重矩阵进行矩阵相乘WX,然后加上偏差b(参数值)形成每一个"连接",用z代表矩阵相乘加上偏差的结果,即z=WX+b,这样的线性组合结果只能划分线性关系,而现实世界转化来的分类问题大多是非线性的 。因此神经网络中引入激活函数的概念,实现对非线性问题的划分,这样极大的扩充了神经网络的分类能力 。
我们展示一个常用的激活函数:sigmoid函数,如下图表示的是sigmoid函数对输入变量X在[-6,6]区间上的映射 。
文章插图
激活函数基本上都是非线性的,如果没有激活函数会发生什么呢?
线性组合z=WX+b其实就是在多维空间(X有多少个特征,多维空间就是多少维)里切一刀,如下图,我们无法通过线性切割把二维空间不同的两类标识分开,引入激活函数就相当于将z=WX+b再进行一次非线性转化,形成一个曲线,把这个多维空间里的样本点进行分割 。
文章插图
实际中的神经网络的每一个神经元都是由线性函数和激活函数构成 。如下图 。
文章插图
我们再用σ代表激活函数,α带表了经过激活函数处理的矩阵,则每一个神经元的形成过程可以表示为下图:
文章插图
神经网络的训练过程就是一个个神经元形成的过程 。
我们把隐藏层比较多(大于2)的神经网络叫做深度神经网络(Deep Neural Network,DNN),深度学习,就是使用深度神经网络架构的机器学习方法 。通常来说隐藏层越多,我们分类的效果就越好(但计算量也更大) 。如下图表示隐藏层越多,形成的非线性划分效果越精准 。
文章插图
最后我们来揭示计算机是如何训练一个个神经元的,也就是确定神经元的权重W和偏差b值的过程 。初始化时随机指定一些w和b的值,不断读取打过标签的图像输入模型,就可以对w和b进行校正 。
随机初始化一般不会有多好的表现,我们需要选择一个损失函数L,它表示当前每一次迭代计算中目标输出与实际输出之间的误差,是关于W和b作为的函数,也是评价模型训练好坏的标准 。
文章插图
自然地,损失函数的值越小表面该模型的效果越好,所以神经网络的训练过程,就转化为的求解该损失函数L的一组解(W和b),使其达一个比较小的值的过程,而这一组得出的解就是最终的神经网络的参数值W和偏差b 。找到了神经网络中的全部参数w和b,也就形成了一个明确的神经网络模型 。
那么怎样求得损失函数的最小值以及其对应的w和b呢?这其实是一个解方程组的过程,计算机通常是如何求解方程的呢?核心思想是迭代,当前主流的迭代方法是梯度下降 。
梯度下降方法的主要思想:想象你在一个山峰上,在不考虑其他因素的情况下,你要如何行走才能最快的下到山脚?当然是选择最陡峭的地方,这也是梯度下降法的核心思想:它通过每次在当前最陡峭的方向向下"迈"一步,来逐渐到达山脚 。
数学上,梯度指向函数增长最快的方向,可以通过对损失函数求导获得 。这个最陡峭的方向,就是梯度向量的负方向 。
文章插图
损失函数对应的所有取值结果可以看成一个多维空间中的"山体表面"(也就是有权重W和b作为自变量与输出结果一起构成的多维空间曲面),让损失函数沿着负梯度的方向进行搜索,不断迭代更新参数,最终使得损失函数最小化 。
如上图所示,那么现在模型的训练问题就变为:明确自己现在的位置(可能是任意位置),然后求梯度,然后沿着与梯度相反的方向去走,一步一步下降直到接近最小值,最终找到这个曲面上的最小值,同时就找到了对应曲面最小值的位置坐标(也就是w和b的值),也就获得了整个神经网络的全部参数,这样一个神经网络就训练完成,接下来我们可以输入新的图片,通过这个神经网络来输出结果0或1,即图片是否是猫这样一个识别问题了 。
推荐阅读
- 一文看懂网上支付系统架构
- 豪华车|WLTP续航660不缩水 奔驰最贵纯电车全球首发:一图读懂EQS SUV
- 华为|7大家族产品齐飞!一文看懂华为终端商用产品线
- 两万字长文读懂 Java 集合
- 一文详解,PHP 协程:Go + Chan + Defer
- 一文让你了解微前端的现状
- 一文了解深度推荐算法的演进
- 使用Pytorch和Matplotlib可视化卷积神经网络的特征
- 一文搞懂 ThreadLocal 原理
- 一文看懂静态资源服务沉浮及其在携程的演进