什么是深度学习?
人工智能>>机器学习>>深度学习,他们是包含的关系。所有使用计算机模仿人行为的技术都是人工智能;不通过特定编程来使计算机学习处理一系列问题的技术是机器学习;使用神经网络来挖掘数据模式是深度学习。也就是说深度学习的本质是对数据的处理方法。
深度学习的结构模块——感知器
前向传播的感知器是深度学习中最基础的结构模块之一,它由输入、权重、求和、非线性激活、输出五部分组成。在这里需要注意的是:
- 的结果是一个数字,所以非线性函数处理的对象是个数字,输出的也是个数字;
- 增加了偏置,使数据能够在不同的非线性激活函数中有效地传递下去;
常用的非线性激活函数有S型函数、双曲函数、线性整流函数。这里展示了他们的函数图像、导数图像、和tensor flow中的函数指令。不难发现,前二者都具有使数据收敛在0~1的能力,并且越偏离中心,其对结果影响的变化量(即导数)越小。
非线性激活函数的作用是向神经网络中引入了非线性因素,使得其能够处理非线性问题。图像处理中的语义分割,图像转文字的语义识别、复杂数据的分类等都依赖于非线性的模式。这是深度学习能应用在大多数实际场景中的基础。
这是一个二维数组作为输入的例子。令求和结果等于0,我们得到了一条分割输入数组平面的直线。
以使用S型激活函数为例,在直线右侧,激活函数的输入,对应的;在直线左侧,激活函数的输入,对应的。在这里我们可以发现,输入平面内平行于直线的直线簇与激活函数的输入具有一一对应的关系,即这组直线簇能够填满整个平面,并且互不重合。那么我们现在就可以认为,这组2维的输入数据被降维成了一维,并且通过中间稀疏,两端密集的形式与输出具有一一对应的关系。
当我们有更高维度的输入时,十个、一百个乃至更多的输入数据维度时,它也会像这样,遵循一定的规则,被降至一维,与输出一一对应。而在这个过程中,感知器的权重就是降维过程的中的规则,通过合理的权重我们就能得到合适的规则,从而有效地发掘数据的隐含信息,有效地的抽象出数据模式。
然而当从高维度向低维度降维时,仅仅一种规则往往是不够的,为了能够更好地得到数据之间的隐含关系,我们需要更多的规则共同作用、相互作用,也就是说用感知器搭建起神经网络。
使用感知器搭建神经网络
首先对感知器的图形表达做出简化:
- 隐藏偏置,默认每个求和过程都包含输入为1,权重为的偏置;
- 简化线条,默认每条由输入指向求和的线条都包含权重,每条由求和指向输出的线条都包含非线性激活函数;
像这样,我们使用相同的数据,但不同的权重,给出不同的输出,就搭建起了一个多输出的感知器。
像这样,我们将多输出的感知器的输出作为下一级感知器的输入,就得到了一个单层的神经网络。它由输入、隐藏层、输出构成,由于隐藏层只有一层,所以被称为是单层的神经网络。
在这里,是要经过非线性激活函数才传给输出的,也就是说单层神经网络要经过两次求和、两次激活、并具有两个偏置权重。在更复杂的神经网络图示中,我们也将省略环节的线条。
需要注意的是,通常情况下,为了方便起见,我们会将每个神经元与前一层的所有神经元相连,这种连接方式被称为全连接,对应的神经网络是全连接层,即稠密层。
这是一种更简洁的表达方式,我们把稠密层的线条连接替换为带的。
像这样,增加更多的隐含层,我们就得到了多层的神经网络,也称深度神经网络。
损失函数
在开始训练神经网络之前,我们需要一个合适的标准来告诉我们当前的神经网络它是好是坏,评价神经网络当前效果的指标是损失函数。损失函数衡量了错误预测产生的成本。它量化了当前处理数据的方式所带来的有效数据模式的损失程度。
经验损失函数,又称目标函数、损失函数、经验风险,是一种常用的评价神经网络数据损失的函数。它将每一组输入得到的预测值与实际值按照特定“规则”做比较再求均值,它整体衡量了神经网络对于整个样本集的数据损失程度。
根据这个“规则”的不同,常见的损失函数有:
- 二元交叉熵损失,它用于衡量输出是0~1之间的变量的神经网络的损失;
- 均方差损失,它用于评估输出为实数的回归模型的损失;
二元交叉熵损失函数的输入和必须在0~1之间,所以其结果一定是一个负数。由于在0附近log函数的导数非常大,所以这个损失函数会在预测值在0+和1-附近快速增长,从而保证了其在训练过程中使预测值逼近真实值的能力。
均方差损失函数适用于神经网络输出和(即损失函数的输入)为实数的情况,其结果显然为正数,且平方运算对于预测的偏差具有放大作用,所以也能够帮助神经网络更快地训练。
训练神经网络
神经网络的训练,即是找到一组适合的权重,使得损失函数取得最小值。
每层神经网络都包含了“该层输入该层输出”大小的权重矩阵,也就是说n层神经网络一共有n+1个权重矩阵。我们希望找到这样n+1个权重矩阵使得损失函数最小,这个过程就是训练。
首先要明确,损失函数是关于神经网络权重矩阵们的函数。这张图片以两个的权重矩阵为例,绘制了损失函数关于这两个矩阵的二元函数图像。
我们在其上随机选取一个初始点,然后计算它在该点的梯度(梯度向量是,它所指向的方式即是函数值增长最快的方向)。然后我们将自变量,也就是权重矩阵,向梯度相反的方向移动一小步。不断重复,直到收敛,或者满足我们期望的目标。
在这个不断循环的过程中,权重是在不断更新的,而每次权重的更新,都需要重新计算损失函数和梯度。这个循环的过程就是训练的过程,这个过程使用的方法就是梯度下降算法。
梯度的计算——反向传播算法
为了反应神经网络不同层的权重矩阵对最终损失函数的影响,我们应用链条求导公式,从最后一层逐层向前推导,得到对应层级的梯度函数。这种求梯度的算法叫做反向传播算法。
实际神经网络问题——优化算法
首先要明确,每单次学习,我们都是沿着梯度下降的方向优化权重矩阵的。也就是说,用去替代之前的。其中我们称作学习率,是反映神经网络每次训练快慢的可设置常数。
观察这张图,我们能够发现:
- 使用过小的学习率会导致收敛得很慢,甚至在局部极小值处停下来,得不到最优的结果;
- 使用过大的学习率会导致越过最小值,甚至引起不稳定和发散,无法在最小值处停止;
- 合适的学习率能够使损失函数稳定地收敛,并且避免局部极小值。
为此,选择合适的学习率是我们必须思考的问题。
不断地尝试不同的学习率,直到取得满意的结果是一种费时和麻烦的做法。许多的自适应调整学习率的算法被提出来,并且应用于了不同场合。在这些算法中,学习率不再是固定的常数,它可以根据梯度的大小、学习的快慢、权重矩阵的大小等做出改变。
常见的优化算法(梯度下降算法)包括:SGD,Adam,Adadelta,Adagard,RMSProp等。
这里列举了python>>tensorflow的实际代码段,后续我将在实验课进行尝试。
实际神经网络问题 ——随机梯度下降
回顾上面提到的梯度下降算法,在每一次循环中我们都需要重新计算损失函数在该点的梯度,对于复杂神经网络而言,它有非常多的层数,每一层的输入输出的神经元节点也十分多,这就导致权重矩阵在数量上和规模上都很大,这在重复训练中会产生巨大的计算量。
为此我们选取一个随机数,我们只计算在处的损失函数的梯度。
也就是说我们将只计算一部分权重参数作为变量的损失函数,而保持其余权重参数不变,从而降低了权重矩阵的规模,继而减少了计算量。
但是这引入了很大不确定性,为了能更有效地使用随机的梯度下降方向代替整体的梯度下降方向,我们使用更多的随机数,计算随机梯度下降再取均值。
这个均值能够更好地预测整体的梯度下降方向,并且减少了计算量。此方法被称为随机梯度下降算法。其核心就是使用“随机包含部分权重参数的损失函数的梯度均值”去近似“包含全部权重参数的损失函数的梯度”。
不同的随机数梯度能够通过GPU并行计算,从能能够显著提高训练速度。
实际神经网络问题——过拟合
过度拟合是再神经网络训练中常见的现象。其本质是对数据模式的过度发掘,使其损失了泛化能力。也就是说过多的神经网络层数和参数、训练程度,使得训练的结果“太好地”代表了数据集之间的数据关系,而导致新加入的数据不能够适应这种关系。
为此我们需要训练规则化(正则化),从而提高我们模型的泛化能力。它可以帮助我们避免在优化模型时走向越来越复杂。
常用的规则化方法有:
- 删节点测试;
- 早期停止;
删节点测试,再训练的过程中随机删掉部分神经元(把激活函数置0),从而找出哪些节点对于最终的结果影响较小,从而降低神经网络的规模。
早期停止,是边训练边测试(将训练集和测试集分开),在训练集损失函数逐渐收敛的过程中,找到测试集损失函数收敛的较好的点。
总结
这篇学习笔记主要介绍了感知器,如何用感知器搭建神经网络,如何使用反向传播算法优化神经网络,以及在实际神经网络训练中的三个问题(优化算法、随机梯度下降、过拟合)。
有任何见解都欢迎指教,有任何疑问都可以在评论区留言。你们的关注和点赞是我不断创作的动力!