MIT深度学习笔记(一)深度学习简介

什么是深度学习?

人工智能>>机器学习>>深度学习,他们是包含的关系。所有使用计算机模仿人行为的技术都是人工智能;不通过特定编程来使计算机学习处理一系列问题的技术是机器学习;使用神经网络来挖掘数据模式是深度学习。也就是说深度学习的本质是对数据的处理方法。


深度学习的结构模块——感知器

前向传播的感知器是深度学习中最基础的结构模块之一,它由输入、权重、求和、非线性激活、输出五部分组成。在这里需要注意的是:

  • $\mathbf{X}^\top \mathbf{W}$的结果是一个数字,所以非线性函数处理的对象是个数字,输出的\hat{y}也是个数字;
  • 1\times w_{_{0}}增加了偏置,使数据能够在不同的非线性激活函数中有效地传递下去;

常用的非线性激活函数有S型函数、双曲函数、线性整流函数。这里展示了他们的函数图像、导数图像、和tensor flow中的函数指令。不难发现,前二者都具有使数据收敛在0~1的能力,并且越偏离中心,其对结果影响的变化量(即导数)越小。

非线性激活函数的作用是向神经网络中引入了非线性因素,使得其能够处理非线性问题。图像处理中的语义分割,图像转文字的语义识别、复杂数据的分类等都依赖于非线性的模式。这是深度学习能应用在大多数实际场景中的基础。

这是一个二维数组作为输入的例子。令求和结果等于0,我们得到了一条分割输入数组平面的直线1+3X_{1}-2X_{2}=0

以使用S型激活函数为例,在直线右侧,激活函数的输入z>0,对应的y<0.5;在直线左侧,激活函数的输入z<0,对应的y>0.5。在这里我们可以发现,输入平面内平行于直线1+3X_{1}-2X_{2}=0直线簇与激活函数的输入z具有一一对应的关系,即这组直线簇能够填满整个平面,并且互不重合。那么我们现在就可以认为,这组2维的输入数据被降维成了一维,并且通过中间稀疏,两端密集的形式与输出\hat{y}具有一一对应的关系。

当我们有更高维度的输入时,十个、一百个乃至更多的输入数据维度时,它也会像这样,遵循一定的规则,被降至一维,与输出\hat{y}一一对应。而在这个过程中,感知器的权重就是降维过程的中的规则,通过合理的权重我们就能得到合适的规则,从而有效地发掘数据的隐含信息,有效地的抽象出数据模式。

然而当从高维度向低维度降维时,仅仅一种规则往往是不够的,为了能够更好地得到数据之间的隐含关系,我们需要更多的规则共同作用、相互作用,也就是说用感知器搭建起神经网络

使用感知器搭建神经网络

首先对感知器的图形表达做出简化:

  • 隐藏偏置,默认每个求和过程都包含输入为1,权重为w_{0}的偏置;
  • 简化线条,默认每条由输入指向求和的线条都包含权重,每条由求和指向输出的线条都包含非线性激活函数;

像这样,我们使用相同的数据,但不同的权重,给出不同的输出,就搭建起了一个多输出的感知器。

像这样,我们将多输出的感知器的输出作为下一级感知器的输入,就得到了一个单层的神经网络。它由输入、隐藏层、输出构成,由于隐藏层只有一层,所以被称为是单层的神经网络。

在这里,z_{i}是要经过非线性激活函数才传给输出的,也就是说单层神经网络要经过两次求和、两次激活、并具有两个偏置权重。在更复杂的神经网络图示中,我们也将省略g(z_{i})环节的线条。

需要注意的是,通常情况下,为了方便起见,我们会将每个神经元与前一层的所有神经元相连,这种连接方式被称为全连接,对应的神经网络是全连接层,即稠密层

这是一种更简洁的表达方式,我们把稠密层的线条连接替换为带\times\square

像这样,增加更多的隐含层,我们就得到了多层的神经网络,也称深度神经网络。

损失函数

在开始训练神经网络之前,我们需要一个合适的标准来告诉我们当前的神经网络它是好是坏,评价神经网络当前效果的指标是损失函数。损失函数衡量了错误预测产生的成本。它量化了当前处理数据的方式所带来的有效数据模式的损失程度。

经验损失函数,又称目标函数、损失函数、经验风险,是一种常用的评价神经网络数据损失的函数。它将每一组输入得到的预测值与实际值按照特定“规则”做比较再求均值,它整体衡量了神经网络对于整个样本集的数据损失程度。

根据这个“规则”的不同,常见的损失函数有:

  • 二元交叉熵损失,它用于衡量输出是0~1之间的变量的神经网络的损失;
  • 均方差损失,它用于评估输出为实数的回归模型的损失;

二元交叉熵损失函数的输入y\hat{y}必须在0~1之间,所以其结果一定是一个负数。由于在0附近log函数的导数非常大,所以这个损失函数会在预测值在0+和1-附近快速增长,从而保证了其在训练过程中使预测值逼近真实值的能力。

均方差损失函数适用于神经网络输出y\hat{y}(即损失函数的输入)为实数的情况,其结果显然为正数,且平方运算对于预测的偏差具有放大作用,所以也能够帮助神经网络更快地训练。

训练神经网络

神经网络的训练,即是找到一组适合的权重,使得损失函数取得最小值。

每层神经网络都包含了“该层输入\times该层输出”大小的权重矩阵,也就是说n层神经网络一共有n+1个权重矩阵。我们希望找到这样n+1个权重矩阵使得损失函数最小,这个过程就是训练。

首先要明确,损失函数是关于神经网络权重矩阵们的函数。这张图片以两个1\times 1的权重矩阵为例,绘制了损失函数关于这两个矩阵的二元函数图像。

我们在其上随机选取一个初始点(w_{0},w_{1}),然后计算它在该点的梯度(梯度向量是(\frac{\partial J(x_0,y_0)}{\partial x},\frac{\partial J(x_0,y_0)}{\partial y}),它所指向的方式即是函数值增长最快的方向)。然后我们将自变量,也就是权重矩阵,向梯度相反的方向移动一小步。不断重复,直到收敛,或者满足我们期望的目标。

在这个不断循环的过程中,权重是在不断更新的,而每次权重的更新,都需要重新计算损失函数和梯度。这个循环的过程就是训练的过程,这个过程使用的方法就是梯度下降算法

梯度的计算——反向传播算法

为了反应神经网络不同层的权重矩阵对最终损失函数的影响,我们应用链条求导公式,从最后一层逐层向前推导,得到对应层级的梯度函数。这种求梯度的算法叫做反向传播算法。

实际神经网络问题——优化算法

首先要明确,每单次学习,我们都是沿着梯度下降的方向优化权重矩阵的。也就是说,用W-\eta \times \frac{\partial J(W)}{\partial W}去替代之前的W。其中\eta我们称作学习率,是反映神经网络每次训练快慢的可设置常数。

观察这张图,我们能够发现:

  • 使用过小的学习率会导致收敛得很慢,甚至在局部极小值处停下来,得不到最优的结果;
  • 使用过大的学习率会导致越过最小值,甚至引起不稳定和发散,无法在最小值处停止;
  • 合适的学习率能够使损失函数稳定地收敛,并且避免局部极小值。

为此,选择合适的学习率\eta是我们必须思考的问题。

不断地尝试不同的学习率,直到取得满意的结果是一种费时和麻烦的做法。许多的自适应调整学习率的算法被提出来,并且应用于了不同场合。在这些算法中,学习率不再是固定的常数,它可以根据梯度的大小、学习的快慢、权重矩阵的大小等做出改变。

常见的优化算法(梯度下降算法)包括:SGD,Adam,Adadelta,Adagard,RMSProp等。

这里列举了python>>tensorflow的实际代码段,后续我将在实验课进行尝试。

实际神经网络问题 ——随机梯度下降

回顾上面提到的梯度下降算法,在每一次循环中我们都需要重新计算损失函数在该点的梯度,对于复杂神经网络而言,它有非常多的层数,每一层的输入输出的神经元节点也十分多,这就导致权重矩阵W在数量上和规模上都很大,这在重复训练中会产生巨大的计算量。

为此我们选取一个随机数i,我们只计算在i处的损失函数的梯度。

也就是说我们将只计算一部分权重参数作为变量的损失函数,而保持其余权重参数不变,从而降低了权重矩阵的规模,继而减少了计算量。

但是这引入了很大不确定性,为了能更有效地使用随机的梯度下降方向代替整体的梯度下降方向,我们使用更多的随机数,计算随机梯度下降再取均值。

这个均值能够更好地预测整体的梯度下降方向,并且减少了计算量。此方法被称为随机梯度下降算法。其核心就是使用“随机包含部分权重参数的损失函数的梯度均值”去近似“包含全部权重参数的损失函数的梯度”。

不同的随机数梯度能够通过GPU并行计算,从能能够显著提高训练速度。

实际神经网络问题——过拟合

过度拟合是再神经网络训练中常见的现象。其本质是对数据模式的过度发掘,使其损失了泛化能力。也就是说过多的神经网络层数和参数、训练程度,使得训练的结果“太好地”代表了数据集之间的数据关系,而导致新加入的数据不能够适应这种关系。

为此我们需要训练规则化(正则化),从而提高我们模型的泛化能力。它可以帮助我们避免在优化模型时走向越来越复杂

常用的规则化方法有:

  • 删节点测试;
  • 早期停止;

删节点测试,再训练的过程中随机删掉部分神经元(把激活函数置0),从而找出哪些节点对于最终的结果影响较小,从而降低神经网络的规模。

早期停止,是边训练边测试(将训练集和测试集分开),在训练集损失函数逐渐收敛的过程中,找到测试集损失函数收敛的较好的点。

总结

这篇学习笔记主要介绍了感知器,如何用感知器搭建神经网络,如何使用反向传播算法优化神经网络,以及在实际神经网络训练中的三个问题(优化算法、随机梯度下降、过拟合)。

有任何见解都欢迎指教,有任何疑问都可以在评论区留言。你们的关注和点赞是我不断创作的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值