开篇
之前我详细写过两个专栏,分别为《快速入门CV》和《快速入门NLP》,讲道理,这两个专栏针对原理是写的挺详细的,但是想要快速上手的话,其实要学的知识还是蛮多的。
因此针对这部分,我打算再好好写一下,尽量精简一些,同时形成文档,可以提供给大家离线查阅。
那么要想快速入门深度学习,神经网络有点像这个领域的普通话了,基本上不可能绕过去,所以今天就从神经元和神经网络开始。
1 神经元
我们所说的神经网络,基本单元可以视为神经元,是仿生学的概念,因此其实深度学习其实也是在模拟我们的大脑。
1.1 生物神经元的启发
人类大脑里的生物神经元,工作逻辑其实很简单:
通过树突接收四面八方的信号,在胞体里把信号整合起来;如果总刺激超过了某个阈值,就通过轴突把信号传给下一个神经元。

简单说就三件事:接收信号、整合信号、决定要不要激活输出。
上世纪40年代,研究者把这套逻辑抽象成了数学模型,也就是MP人工神经元模型。它就是整个人工神经网络最基础的计算单元。
1.2 一个神经元,到底在算个啥?
我们拿预测冰淇淋销量举例子:输入是温度、星期几这些特征,一个神经元就是对这些特征做一次打分,然后进行预测。
定义输入特征为向量:
每个特征对应一个权重 ,再加上一个偏置项 。 神经元的计算分成两步:
第一步:线性加权求和
把每个特征乘以对应的重要程度,全部加起来,再加上偏置量:
-
权重:可以理解成「这个特征对结果影响有多大」,可正可负;
-
偏置:相当于给结果设置一个基准线,避免所有输入都是0的时候,神经元直接没输出。
第二步:非线性激活
光有加权求和还不够,我们还要把结果送入激活函数,得到神经元最终的输出:

目前工程里最常用的激活函数是ReLU,逻辑非常简单: 输入大于0就原样输出,小于等于0直接输出0。

1.3 激活函数非用不可吗?
其实一开始我学激活函数的时候,并没有过多的思考它的作用和必要性,而是文章里这么说,我就这么记,随着学的深入,其实慢慢就能理解。
但是在这里还是和大家介绍一下它的作用,并且知乎上有很多大佬举了很多生动的例子,尤其是有一个掰铁丝的例子让我印象深刻,有兴趣的朋友可以去搜索一下。
我们直接上结论:
如果没有激活函数,无论堆叠多少层神经元,整个网络都等价于一层线性变换。
再多的层数,也只是反复做矩阵乘法,其实这是线性操作,到最后依然只能表达简单的直线关系。可现实世界里的规律,大多都不是直线!
咋说呢,感觉神经元做的操作感官上有点类似于直线,模拟的函数有限,激活函数可以假如非线性元素,可以模拟各种曲线。
所以呢,激活函数给网络引入非线性能力。有了这一步"掰弯",模型才有能力去拟合那些复杂的、弯弯曲曲的函数曲线。

你要把深度学习最后学到的模型视为一个无比复杂的函数,那么它的函数图像必然不是一个直线,当然一般其实也画不出来。
当然,单个神经元的能力还是很有限的。面对复杂的数据模式,只靠一个单元远远不够。
那怎么办?由此我们想到了:
堆叠神经元,神经形成网络。
2 单层感知机的局限
把输入直接连到输出神经元,中间没有其他单元,这就是单层感知机。
单层感知机可以自动学习权重,完成简单的二分类任务。但研究者很快就发现了它的致命问题。
2.1 解决不了异或问题
MP只能处理线性可分的数据。
最经典的例子就是XOR异或问题:输入两个相同输出0,输入不同输出1。就这么简单的逻辑,MP怎么都做不到。

很明显,无论怎么调整权重,光靠直线,无法区分class0和1。
那么到是什么导致的呢?
因为缺少一层能做特征空间变换的中间层。
聪明的你会想到,原始空间里分不开的数据,能不能先把它映射到另一个空间,让它在新空间里变得可分?
顺着这个思路,研究者加入了隐藏层,多层感知机(MLP)就应运而生了。
3 多层感知机:MP+隐藏层
一个基础的多层感知机,由输入层、隐藏层、输出层三部分构成。
3.1 三层网络,分别干什么活?
-
输入层:不做任何计算,只负责接收和传递原始数据;
-
隐藏层:网络真正的干活儿的地方。一层里有很多神经元,每个神经元都对上一层的数据做加权求和+激活。原始特征经过这一层,就被映射到了新的特征空间;
-
输出层:接收隐藏层变换好的特征,输出最终的预测结果。回归任务输出数值,分类任务输出类别结果。

3.2 前向传播
我们拿只有一层隐藏层的网络举例,过一遍完整的计算流程。
设 是输入层到隐藏层的参数, 是隐藏层到输出层的参数。
先算隐藏层的输出:
再算最终的预测输出:
整个过程就是:原始输入经过隐藏层做一次非线性变换,变换后的特征再交给输出层计算,得到最终结果。
3.3 前向传播解决的问题
有一个很重要的理论叫万能逼近定理:
只要隐藏层的神经元数量足够多,单隐藏层的神经网络,就能以任意精度逼近任意连续函数。
这句话相当于给研究者吃了一颗定心丸:多层网络在理论上,拥有足够强的表达能力。理论上,你就去堆网络吧,最终肯定能对出你想要的函数模型。
但是,理论可行不代表训练可行。
网络刚初始化的时候,所有权重、偏置都是随机生成的。拿随机参数跑出来的结果,基本等同于瞎猜。
那怎么让这些参数自动调整,让预测越来越准?
这里就会涉及一整套神经网络训练流程:
用损失函数衡量错了多少,用梯度下降找更新方向,再用反向传播把误差一层层传回去。
这一块涉及不少推导,全部铺开的话篇幅会很长。所以损失函数、梯度下降、反向传播这些训练相关的内容,我们放到下一篇文章完整讲解。本篇我们先把网络本身的结构和前向逻辑吃透。
4 深度神经网络
再和大家说一下深度神经网络,刚才我们只用到了一层隐藏层。如果继续堆叠更多隐藏层,每一层都做一次线性变换+激活,就得到了深度神经网络,也就是我们常说的深度学习。

层数加深之后,网络会形成一种逐层抽象的特征提取逻辑。拿图像识别举例子就很好懂:
-
浅层神经元捕捉边缘、简单纹理;
-
中间层组合边缘,识别轮廓、局部形状;
-
更深层再把局部形状组合起来,得到物体的整体特征。
每一层,都在上一层的基础上,做进一步的加工和抽象。
当然层数变多也会带来新问题。比如大家常听说的梯度消失、过拟合。这些都属于训练优化层面的问题,我们留到后面再展开。
总结一下:
-
人工神经元灵感来自生物神经元,核心是加权求和 + 非线性激活;激活函数是网络拥有非线性能力的关键。
-
单层感知机只能处理线性可分任务,面对XOR这类简单非线性问题都束手无策。
-
加入隐藏层得到多层感知机MLP,通过特征空间变换解决了非线性拟合问题;理论上足够多的神经元可以逼近任意连续函数。
-
多层网络的前向传播,就是数据从输入层开始,逐层做线性计算+激活,一路流向输出层。
-
网络初始参数都是随机值,想要让模型学会规律,需要完整的训练机制。训练部分我们下一篇详细拆解。
本质上来说,神经网络就是一套带可学习参数的分层函数映射框架。现在就粗暴的理解为函数吧,我们后来熟悉的CNN、RNN、Transformer,底层都建立在这套基础逻辑之上。
所以说它是深度学习领域的普通话,一点都不过分。