前言

3Blue1Brown 视频笔记,仅供自己参考

这个章节主要讲神经网络的结构,讲什么是神经元,为什么有层,其背后的数学原理是什么?

官网:https://www.3blue1brown.com

视频:https://www.bilibili.com/video/BV1bx411M7Zx

1. 介绍示例

在这里插入图片描述

上图所示是一个 3,一个字迹歪斜 28x28 像素,超低分辨率的 3,但你的大脑把它辨认成 3 一点问题也没有,我希望大家能稍微感叹一下,人脑 “竟然” 能如此轻而易举地完成这项工作

在这里插入图片描述

上图中的不同写法我们都认作 3,但不同写法的 3 中各个像素的值是大相径庭的,你眼睛中看到不同 3 时激发的光感细胞有着千差万别

在这里插入图片描述

但你大脑皮层中小小的一块处理视觉的智能区域,却居然能够把这些图像处理成相同的信息,同时还能把其他的图像解释成各自不同的信息

在这里插入图片描述

不过要是我现在叫你写个程序,输入一个 28x28 像素的表格,输出一个 0 到 9 之间的个位数,来判断一个图片里到底写着哪个数字呢?这个原本轻松的工作一下就变得难如登天了

2. 系列预览

在这里插入图片描述

大家又不是山顶洞人,想必我没有必要再给大家展望一遍机器学习和神经网络对当下和未来有多么息息相关

在这里插入图片描述

但假设大家对神经网络没有任何背景知识,我想来给大家介绍下神经网络究竟是什么,用可视化的方式展示它的工作机制,把它作为一门数学而不是单纯的网红热词来对待

在这里插入图片描述

这个系列讲完,我希望大家能够理解神经网络为什么会是这样的结构,让大家再度听说神经网络 “学习” 之时,能够明白这究竟代表的是什么

在这里插入图片描述

本章仅仅会介绍神经网络的结构,下一期将会讨论它的学习原理

在这里插入图片描述

接下来我们将会手把手搭建一个能够识别手写数字的神经网络,这是一个用于入门的经典范例

在这里插入图片描述

神经网络的变种非常非常之多,近些年对于这些变种的研究更呈爆发的态势,

在这里插入图片描述

不过在这几期入门介绍的文章中,我们只会讨论最简单不加料的原味版(多层感知器 MLP),我们得先理解经典的原版才好理解功能更强大的现代变种,而且相信我,光理解原版就够咱们喝一壶的了

在这里插入图片描述

不过即便最简单的版本就已经能来识别手写数字,对于电脑而言已经很棒了

在这里插入图片描述

与此同时,你们也会看到神经网络有时也会有不尽如人意的地方

3. 神经元是什么?

在这里插入图片描述

顾名思义,神经网络之名来源自人的大脑结构,我们来一层层剖析下,它的神经元是什么,神经元又是如何连接起来的

在这里插入图片描述

目前说到神经元,我想要大家把它暂时理解成一个用来装数字的容器,装着一个 0 到 1 之间的数字,仅此而已

在这里插入图片描述

看上面的例子,这个网络一开始的地方有很多神经元,分别对应的是 28x28 输入图像里的每一个像素,总计 784 个神经元

在这里插入图片描述

神经元中装着的数字代表对应像素的灰度值,0 代表纯黑像素,1 代表纯白像素,我们把神经元里装着的数叫做 “激活值”(activation),大家可以想象这么一个画面,激活值越大,那么这个神经元就点的越亮

4. 层的介绍

在这里插入图片描述

这 784 个神经元就组成了网络的第一层,现在我们跳到网络的最后一层,这一层的十个神经元分别代表 0 到 9 这十个数字,它们的激活值同理都处在 0 到 1 之间,这些值表示系统认为输入的图像对应着哪个数字的可能性

在这里插入图片描述

网络中间还有几层 “隐含层”,暂时我们就把它看做一个大黑箱,里面就进行着处理识别数字的具体工作

在这里插入图片描述

这个网络中,我选择加两层隐含层,每层有 16 个神经元,我得承认这些设置都是随便选的,结构选择两层隐藏层的理由过一会我再来解释,而选择 16 个神经元无非是显得好看罢了。实际应用中,在网络的结构上我们有很大的调整实验的余地

在这里插入图片描述

神经网络运作的时候,上一层的激活值将决定下一层的激活值,所以说,神经网络处理信息的核心机制正是一层的激活值是通过怎样的运算,算出下一层激活值的

在这里插入图片描述

某种程度上讲,它想模仿的是生物中神经元组成的网络,某些神经元的激活就会促使另一些神经元激活,当前我给你展示的神经网络已经被训练好,可以识别数字了,我来解释下这是什么意思

在这里插入图片描述

这表示,如果你在网络输入层的 784 个神经元处,输入了 784 个代表输入图像各像素的灰度值,那么,这层激活值的图案会让下层的激活值产生某些特征图案,再让下下层产生特征的图案,最终在输出层得到某种结果

Note:这里的 “图案” pattern 等价于 “模式识别” 的 “模式”

在这里插入图片描述

而输出层最亮的那个神经元就表示神经网络的 “选择”,它认为输入图像里写着这个数字

5. 为什么要分层?

在这里插入图片描述

在我介绍网络每层间如何影响训练过程的数学原理之前,我们先来讨论下凭什么我们就觉得这种层状结构就可以做到智能判断,我们在期待什么呢?我们到底期望这些中间层最好能做些什么呢?

在这里插入图片描述

当我们人类在识别数字的时候,我们是在组合数字的各个部件,9 就是上边一个圈,右边再一竖,8 就是上边一个圈搭着下边一个圈,4 就能拆分成 3 条线执行,诸如此类

在这里插入图片描述

在这里插入图片描述

在理想的情况下,我们希望倒数第二层中的各个神经元能分别对应上一个笔画部件,这样一来,当我们输入一个 9 或者 8 这种带圈的数字时,某一个神经元中的激活值就会接近 1,而且我并不特指某种样子的圈,我是希望,所有这种位于图像顶部的圆圈图案都能点亮这个神经元

在这里插入图片描述

这样一来,从第三层到最后一层,我们只需要学习哪些部件能组合成哪个数字即可

在这里插入图片描述

当然,这样一来我们就引出了更多的问题,例如,要如何识别这些部件呢,哪些部件才算正确的呢,而且我还没提到上一层网络是如何影响下一层的,不过暂时请先和我一起把话题讨论完

在这里插入图片描述

识别圆圈的任务同理可以拆分成更细微的问题,一种合理的方法便是首先识别出数字图形中更小的边,比如像 1、4、7 中的这种长条就是一条长边嘛,或者把它当做几条短边组合起来的图案也可以

在这里插入图片描述

在这里插入图片描述

于是我们希望,也许网络第二层的各个神经元就能对应上这些各种各样的短边,没准当 28x28 的图像输入进来的时候,它就能把所有关联短边的八到十个神经元都给点亮,接着就能点亮对应顶部圆圈和长竖条的神经元,最后就能点亮对应 9 数字的神经元

在这里插入图片描述

至于我们的网络是否真的能做到这一步,等我解释完网络如何训练再来回头讨论吧,但这就是我们希望的,希望这种层状结构能完成的目标

在这里插入图片描述

更进一步讲,假如神经网络真能识别出这类边缘和图案,它就能很好地运用到其他图像的识别任务上来,甚至不光是图像识别,世界上各种人工智能的任务都可以转化为抽象元素一层层的抽丝剥茧

在这里插入图片描述

就比如说语音识别就是要从原音频中识别出特殊的声音,组合成特定的音节,组合成单词,再组合成短语以及更加抽象的概念

在这里插入图片描述

回到神经网络工作原理的话题上来,试想一下,你要设计上一层中的激活值到底会如何决定下一层中的激活值

在这里插入图片描述

我们需要设计一个机制,可以把像素拼成短边,把短边拼成图案,或者把图案拼成数字等等

6. 边缘检测的例子

在这里插入图片描述

这里我们来放大关注其中一个,我们来设计让第二层中的这个神经元,能够正确识别出图像中的这块区域里是否存在一条边

在这里插入图片描述

现在我们就需要知道这个网络的参数,你应该如何调整网络上的旋钮开关,才能让它足以表现出一条边的这种图案

在这里插入图片描述

我们需要给这个神经元和第一层所有神经元的每一条连线都赋上一个权重值,这些权重都不过是数字而已,然后,我们拿起第一层所有的激活值和它们对应的权重值一起,算出它们的加权和

在这里插入图片描述

我觉得把这些权重值看做一个表格更好理解,我会把正的权重值标记成绿色,负的标记成红色,颜色越暗就大致表示它的权重越接近于 0

在这里插入图片描述

现在我们如果把关注区域的权重赋为正值,而其他所有的权重值一律赋为 0,这样一来,对所有的像素值取加权和就只会累加我们关注区域的像素值了

在这里插入图片描述

此时如果你真的想识别出这里是否存在一条边,你只需要给周围一圈的像素赋予负的权重,这样当中间的像素亮,周围的像素暗时,加权和就能达到最大

在这里插入图片描述

这样计算出来的加权和可以是任意大小,但这个网络中,我们需要激活值都处在 0 与 1 之间,那么,我们就可以顺其自然把这个加权和输进某个函数,把这条实数轴挤压进 0 到 1 的区间内

在这里插入图片描述

其中一个叫 sigmoid 的函数非常常用,它又叫 logistic 曲线,简而言之,它能把非常大的负值变成接近 0,非常大的正值变成接近 1,而在取值 0 附近则是平稳增长的

在这里插入图片描述

所以这个神经元中的激活值,实际上就是对一个加权和到底有多正的打分,但有时即使加权和大于 0 时,你也不想把神经元点亮,可能只有当和大于例如 10 的时候才让它激活,此时你就需要加上一个偏置值保证不能随便激活,而我们只需要在加权和之后加上一个 -10 之类的数,再把它送进 sigmoid 函数中即可,这个附加的数就叫做 偏置

总而言之,权重告诉你这个第二层的神经元关注什么样的像素图案,偏置则告诉你加权和得有多大才能让神经元的激活变得有意义

7. 统计权重和偏置

在这里插入图片描述

我们这就解说完了其中一个神经元,但这一层的每一个神经元都会和第一层全部的 784 个神经元相连接,每一个神经元的 784 个连线上都带着一个权重,而且每一个神经元都会在计算自己的加权和后加上自己的偏置,再通过 sigmoid 压缩输出自己的结果

在这里插入图片描述

一下子要考虑的就多起来了,这层隐藏层的 16 个神经元就需要总计 784x16 个权重值和 16 个偏置值

在这里插入图片描述

而且这还是单单第一层和第二层之间的连接,别的层之间的连接也还有它们分别自带的权重和偏置,一套下来整个网络一共会用上将近 13000 个权重加偏置,相当于这个网络上有 13000 多个旋钮开关让你调整,从而带来不一样的结果

8. 如何学习

在这里插入图片描述

所以,当我们讨论机器如何学习的时候,我们其实在讲,电脑应该如何设置这么多的数字参数才能让它正确地解决问题

在这里插入图片描述

这里有个细思极恐的思想实验,想象一下你自己手动调整这些权重还有偏置参数,让第二层识别短边,第三层识别图案,比起把网络完全当做一个黑箱,我个人觉得这么考虑更加令人满足

在这里插入图片描述

毕竟当网络的输入和期望出了偏差的时候,如果你一定程度上了解了这些权重和偏置的意义,那么你再尝试对结构进行修正就有出发点了

在这里插入图片描述

或许你的神经网络能输出正确的结果,但过程和你想象的不一样,那么,深挖权重和偏置的实际意义就可以有效挑战你的假设,进而探索出所有可能的解决方案

9. 符号和线性代数

在这里插入图片描述

顺便一提,整个函数这么写下来是不是很难懂,我这里就给大家展示个既能表示所有的连线,看着又清爽的符号表达,你之后学习神经网络时会一直见到这种符号

在这里插入图片描述

我们把某一层中所有的激活值统一成一列向量,再把它和下一层间所有的权重放到一个矩阵里,矩阵第 k 行就是这一层的所有神经元和下一层第 n 个神经元间所有连线的权重

在这里插入图片描述

这样权重矩阵和向量乘积的第 n 项,就是这一层所有的激活值和下一层第 n 个神经元间连线权重的加权和,

在这里插入图片描述

顺带一句,机器学习到头来和线性代数是分不开的,如果大家想更形象地理解矩阵和矩阵乘法的意义的话,不妨去看下我之前做的线性代数的本质系列内容,特别是第三章

在这里插入图片描述

回到符号表达的话题,表示偏置值的时候,我们并不会把一个个值都拎出来单独讨论,相反,我们会把它们都放到一个向量里,然后把它和之前的矩阵乘法的结果相加

在这里插入图片描述

最后一步,我们把整个表达式用一个 sigmoid 包起来,所谓包起来就是指对表达式结果向量中的每一项都取一次 sigmoid

在这里插入图片描述

现在只要我们一写下权重矩阵和相应向量的符号,神经网络各层之间激活值的转化就可以表达得清晰简洁明了了

在这里插入图片描述

这种表达也让我们写程序变得简便了许多,因为很多库在矩阵乘法方面做了十足的优化,比如 numpy

10. 回顾

在这里插入图片描述

还记得之前我叫大家把神经元看作数字的容器吗?实际上,神经元中装着的值是取决于你的输入图像的,所以我们把神经元看作一个函数才更加准确

在这里插入图片描述

它输入的是上一层所有的神经元的输出,而它的输出是一个 0 到 1 之间的值

在这里插入图片描述

其实整个神经网络就是一个函数,一个输入 784 个值,输出 10 个值的函数

在这里插入图片描述

只不过这个函数极其的复杂,它用了 13000 个权重和偏置参数来识别特殊图案,又要循环不停地用到矩阵乘法和 sigmoid 映射运算

在这里插入图片描述

但它终究只是个函数而已,而它的复杂程度可以稍微让人安点心,如果它没这么复杂的话,我们恐怕就不大能指望它数字识别能多准了

在这里插入图片描述

那么,它是如何处理这项艰巨任务的呢,神经网络是如何通过数据来获得合适的权重和偏置的呢,这就是下一章的内容,我们会继续探究这一特殊的神经网络的运作方式

11. ReLU vs Sigmoid

在这里插入图片描述

最后我们来谈下 sigmoid 函数,以我的理解,早期的网络都是用这个函数,把加权和映射到 0 至 1 的区间内,当年正是这么来模仿生物学上的神经元是否激活的来着

在这里插入图片描述

但现在的神经网络基本上都不用 sigmoid 了,而是使用更好训练的 ReLU,其全称为 “线性整流函数”,这个函数就是返回 0 和 a 的最大值,其中 a 就是函数的输入

在这里插入图片描述

之所以使用 ReLU,我认为一部分是为了模仿生物学上的神经元什么时候会激活,当超过一个阈值的时候 ReLU 就和恒定函数一样,而没过这个阈值就不激活,输出 0,可以当作是 sigmoid 的一种简化版

在这里插入图片描述

sigmoid 并没有让训练结果变得更好,或者某种程度上讲它很难训练,后来有人就拿 ReLU 试了试,结果发现在特别深的神经网络上效果特别的好

相关资料

结语

本章我们主要讲解了神经网络的结构,以多层感知机出发,并以手写数字识别为例来讲解神经网络中的每个 layer 都在做什么事,输入层是 784 个像素值,而输出层是 0-9 十个数字的概率,而中间的隐藏层则在不断的提取特征图案

OK,以上就是本章的全部内容了,下章我们来讨论神经网络的学习原理,敬请期待😄

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐