初学者都能懂的深度学习之神经网络(二)梯度下降法


注明:本人仔细学习 3Blue1Brown 中提供的深度学习视频,将其整理出此文档。因文章的篇幅和本人的理解能力有限,若有条件的可以观看 3Blue1Brown 在b站上传的深度学习的三个视频以及相关内容。此文档会加入一些自己学习的感悟和理解,若有误烦请诸位指正。


第二部分 深度学习之神经网络的梯度下降法


在第一部分中,学习了最基本的神经网络架构,对于神经网络的基本概念,如:输入输出层隐含层神经元以及权重值偏置值激活函数等的基本概念(回顾:数字9的图像分辨率为 28*28 像素,每个像素的灰度值在 0 到 1 之间,它们决定了网络输入层中 784 个神经元的激活值。接着下一层的每个神经元的激活值等于上一层中所有激活值的加权和再加上对应的偏置值,最后把这个和输进 sigmoid 或者 ReLU 压缩函数(在第一部分指出,我们设计层状结构的目的是希望:第二层可以识别短边、第三层可以识别圆圈和直线等更细小的图案,最后一层将这些图案拼凑起来,识别出数字)),但是对于如何确定隐含层的个数以及其神经元的个数,通过何种手段或者算法得到合理的权重值、偏置值,还尚不清楚,所以这一部分将介绍神经网络的梯度下降法(神经网络是如何学习?),希望通过这一部分的学习,可以:

  • 了解梯度下降的思想(这一思想不仅是神经网络学习的基础,而且机器学习中很多其他技术也是基于这个方法
  • 了解隐含层神经元的真正含义

我们希望训练好网络后,给它更多以前从未见过的带标记的数据作为测试,对于数据集中的图像全部标号:

在模型不断训练后就能看到对这些新图像进行分类的准确度如下:

从一开始,对网络中的权重值、偏置值的取值是随机的,网络的识别结果可想而知会表现得非常糟糕,这时就需要定义一个 “代价函数” 反馈给电脑,而正确输出的激活值要么是 1 要么是 0。我们将输出层所有神经元的误差平方之后求和作为训练单个样本的 “Loss/Cost(代价或误差)”当平方和比较小时,自然神经网络对图像进行正确分类的概率就越高。所有训练样本的 ”Loss 平均值“ 我们就称之为 “平均代价(也称为 Empirical Risk (经验风险))”,该指标是用以评价训练出来的神经网络的优劣程度

我们用数学的形式来表达神经网络:
( y 1 , y 2 , ⋯   , y 10 ) = f ( x 1 , x 2 , x 3 , ⋯   , x 784 , k 1 , k 2 , k 3 , ⋯   , k 13002 ) 其中, x 1 ∽ x 784 为神经网络输入,且 x 1 ∽ x 784 ∈ [ 0 , 1 ] ; y 1 ∽ y 10 为神经网络输出,且 y 1 ∽ y 10 ∈ [ 0 , 1 ] ; k 1 ∽ k 13002 为神经网络权重和偏置参数值。 {( y_1,y_2,\cdots,y_{10}) =f(x_1,x_2,x_3,\cdots,x_{784},k_1,k_2,k_3,\cdots,k_{13002})}\\ 其中,x_1 \backsim x_{784}为神经网络输入,且x_1 \backsim x_{784} \in [0,1];\\ y_1 \backsim y_{10}为神经网络输出,且y_1 \backsim y_{10} \in [0,1];\\ k_1 \backsim k_{13002}为神经网络权重和偏置参数值。 (y1,y2,,y10)=f(x1,x2,x3,,x784,k1,k2,k3,,k13002)其中,x1x784为神经网络输入,且x1x784[0,1]y1y10为神经网络输出,且y1y10[0,1]k1k13002为神经网络权重和偏置参数值。
而代价函数还要再抽象一层,上述神经网络 13002 个权重和偏置参数值作为 “代价函数/损失函数(Cost function)”输入输出“代价值”</u,而参数训练数据集。但是对于一个有 13002 个变量的函数,我们如何调整这些变量呢?

学过微积分的你都清楚,对于一元函数(当然不需要处处可导),可以通过简单的求导,找到一阶导数为 0 或 不存在 的点,通过两侧导数的正负性即可知道该一元函数的最小/最大值。But! 13002 元函数这么做显然不合理。这里举出一个一元连续函数的例子:

先随便挑选一个值,通过斜率的正负来决定向左还是向右走函数值才会变小,在每一个点上都这么重复计算新斜率,再适当地走一小步就会逼近函数的某个局部最小值。但又有新的问题:由于不知道一开始输入值在哪里,最后可能会落到不同的坑里,并且无法保证落到的局部最小值就是代价函数可能达到的全局最小值。

如果每步的大小和斜率成比例,那么在最小值附近的斜率就会越来越平缓,每步会越来越小,以防止调过头。想象一个更复杂的两输入一输出的二元函数,x、y 为输入,z 为代价值,现在我们需要在三维空间中找到 z 的最小值,即在输入空间内沿哪个方向走才好让输出结果下降得最快。在多元微积分中,我们熟知函数的梯度指出了函数的最陡增长方向,相反沿着梯度的负方向走,函数值自然就下降的最快了(这个梯度向量的长度就代表了整个最陡的斜坡到底有多陡)。至少现在可以非常容易计算出这个向量,而不是之前计算几阶导数那样繁琐,具体的步骤如下:

  • 先计算梯度
  • 按照梯度反方向走一小步下山
  • 反复循环前两个步骤

处理带 13002 个输入的函数也是一个道理,把 13002 个权重偏置放在一个列向量里,代价函数的负梯度也是一个向量,通过向量的求和运算,具体改变每一项的参数可以让代价函数下降的最快。对于这个特别设计的代价函数,更新权重和偏置来降低代价函数的值,意味着输入训练集的每一份样本的输出都更接近期待的真实结果(需要注意的是:这个代价函数取了整个训练集的平均值,所以最小化的意思是对所有的样本得到的总体结果都会更好一点)其中计算梯度的算法是神经网络的核心,即反向传播算法(Back propagation, BP)会在 “第三部分 深度学习之神经网络的反向传播算法” 中讲解。

这里我们提到让神经网络学习,实质上是让代价函数的值最小,而为了达到这个结果,代价函数非常有必要是平滑的,这样才能每次挪一点点,最后找到局部最小值。这就是为什么神经元的激活值是连续的,而非直接沿袭生物学神经元那种二元式的。这种按照负梯度的倍数,不断调整函数输入值的过程便称之为 “梯度下降法”。

这里还有一种不借助空间的思路:

负梯度的每一项告诉了我们两件事:

  • 正负号告诉我们输入向量的某一项该调大还是调小;
  • 每一项的相对大小告诉我们改变哪个值得影响更大!

基于某些连线得影响权重更大,当你再看到整个复杂到爆的代价函数得梯度向量时,可以把它理解为各个权重偏置得相对重要程度(即改变哪个参数性价比最高)。有一个非常简单的两输入一输出得二元函数的例子:

对于这个复杂的神经网络,随机初始化权重和偏置值时,并通过梯度下降法调整了很多次参数之后,神经网络来识别它从未见过的图像时,表现又会如何呢?

这个 2 层,每层 16 个神经元的网络,可以做到 96% 的正确率,如果再修修改改隐含层的结构的话,准确率可以达到 98%,已经非常好了,当然不是最好,如果换成更加复杂的网络肯定效果会更好。

这里需要强调的是,如果你看了第一部分神经网络结构的文章,你需要认真看完下面这一段:

在第一部分,我们期望的是隐含层第一层可以识别出短边,第二层可以把短边拼成圈或者长笔画,最后再把这些部件拼成数字。But!神经网络完全不是这么做的。在第一部分中:把第一层所有神经元和第二层某一神经元间所有的权重可以表示为第二层神经元所识别的一个像素图案。但在实际训练后的网络中,第一层和第二层之间的权重图像如下:

由此看出,第二层识别图像没有什么规律,中间只有一些松散的图案。感觉就像在非常庞大的参数空间中,网络找到了一个还不错的局部最小值,尽管它可以解决绝大多数图像分类问题,但并不会像我们所期望的识别图像中的各种短边或图案

这里有一个特殊的例子,我们在把一个随机的图像输入进去,让训练好的网络进行识别:

结果却是,网络总能很自信地给你一个没道理的答案,正如它把真正 的 5 识别成 5,也能把一张随机的噪声图识别成 5。换句话来说,这个网络可以很好地识别数字,但是它并不知道如何写数字。j究其原因,很大程度上是因为它的训练被限定在很窄的框架内,从网络自身的角度看,整个宇宙都是由小网格内清晰定义的静止数字所组成,而它的代价函数则只会促使它对最后的判断有绝对的自信

此时你可能会好奇,为什么在一开始介绍网络是时,想让你觉得它是在识别图案和短边,但其实神经元根本就没有这么做。我们不应该把这看作我们讨论的终点,相反,应当作为学习的起点。这种网络其实是早在八九十年代就已经研究过的旧技术,但你需要先理解这些旧的,才能更好地理解现代变种 ( CNN, RN, LSTM, etc.) 的细节,而显然旧方法也足以解决些有趣的问题。(你越去深究隐含层的工作原理,你就会发现其实它也没那么智能

好了,第二部分的梯度下降法也就是这么简单,如何去计算权重值偏置值就是第三部分反向传播算法的内容了,我也会尽快板砖。当然,我还需要强调的是,如果有条件最好去看看 3B1B 在b站神经网络的 3 个视频,当你看了我的介绍再去学习视频,醍醐灌顶!

最后的最后,强烈建议大家阅读 Michael Nielson 在深度学习神经网络上的著作:Neural networks and deep learning,可以亲自试验代码和数据,这本书还会手把手给你解释代码中的每一步。其他的推荐还有 Chris Olah 写的非常深刻漂亮的博客:Neural Networks, Manifolds, and Topology – colah’s blog,以及 Distill 上的文章:Neural Networks, Manifolds, and Topology – colah’s blog CWhy Momentum Really Works (distill.pub)。(强烈推荐 Chris Olah 讲 RNN LSTM 的那篇)

注:俺只是个研一的算法 ”搬运工“。

我的邮箱:[email protected]

猜你喜欢

转载自blog.csdn.net/HISJJ/article/details/126842556