适用于有python语言基础的深度学习小白入门教程(一)
1. 什么是深度学习?
深度学习(Deep Learning,DL)是机器学习(Machine Learning,ML)领域中的一个研究方向,作用是帮助机器学习项目更接近于人工智能。
简单来说,深度学习就像是让计算机学会像人脑一样思考,能自己从图像、声音、文字等数据中找出规律。它通过把简单的特征一层层组合,最终识别出更复杂的模式,比如识别人脸、理解语音等。
深度学习从字面理解包含两个意思,分别是“深度”和“学习”。
1.1 学习
简单来说,学习就是从不知道到知道的过程,比如看到伸出一根手指代表“1”,两根手指代表“2”,我们就通过观察和归纳学会了这个规则。
那“深度学习”跟这种学习有什么关系呢?我们可以把人学习的过程看作是有策略和方法的。
不同的人学得好坏,往往取决于他们怎么理解、思考和总结问题。
科学家们试图让计算机也能像人一样去“思考”和“学习”,于是就设计了模拟人脑的“神经网络”。
这个“神经网络”是借鉴人脑中大量神经元互相连接的结构,虽然目前还不能完全复制人脑的思考方式,但它已经能在某些方面,比如识别图片、理解语言等,表现得越来越聪明了。
1.2 深度
简单来说,“深度”指的是把复杂问题分成多个步骤,一层一层地处理。
比如算 1 + 1 + 1,我们通常会先算 1 + 1 = 2,再算 2 + 1 = 3。这个分步骤的过程,其实就是“分层”的思维方式。
输入层是我们提供给计算机的信息,比如数字、图片、文字等。
输出层是我们想得到的结果,比如计算答案或识别一张图片。
中间的每一层(隐藏层)就像是一步步的处理过程,每层都对数据进行一点加工。
所以,“深度”其实就是这些中间处理层很多、结构更复杂,就像人解难题时会分步骤思考一样,计算机也是通过分层来逐步理解和处理数据的。
层越多,模型处理复杂问题的能力就越强。
2. 深度学习核心步骤
深度学习虽然听起来复杂,但其核心流程可以概括为三个主要步骤。
2.1 步骤一:建立模型
一开始,我们先不管细节,先搭建一个非常复杂的函数(网络结构),它的内部有很多未知数(参数)。
我们把数据输进去,让它给出一个结果(预测值),然后和真实值对比,算出误差。
根据这个误差,我们反过来调整函数里的参数,让它的预测越来越准。
经过不断地练习和调整,最终从输入得到正确的输出,这个过程训练出的系统,就是我们说的“模型”,模型里的参数叫做权重。
“建立模型”主要是指设计和构建神经网络的结构,相当于定义一个包含许多可能函数的“函数集合”。
2.1.1 选择网络结构
我们应该选择什么样的网络结构?
网络应该有多少层?
每层应该包含多少神经元?
AlexNet (2012) : 8层网络,在ImageNet竞赛中取得突破,错误率为16.4%
VGG (2014) : 19层网络,结构相对简单统一,错误率降至7.3%
GoogLeNet (2014) : 22层网络,引入了Inception模块,注重计算效率,错误率降至6.7%
Residual Net (ResNet) (2015) : 高达152层,通过引入“残差连接”解决了深度网络训练困难的问题,错误率显著降低至3.57%
一般来说,更深、更复杂的网络结构通常具有更强的表达能力,能够学习到更复杂的特征表示。
2.1.2 引入激活函数
为了增强网络的表达能力,我们需要激活函数来将线性函数变为非线性函数。
如果没有激活函数,多层神经网络本质上等同于单层线性网络(因为多层线性变换的叠加仍然是线性变换)。
激活函数需要有连续性,大多数优化算法(如梯度下降)依赖于梯度的计算,连续的函数才可导,才可以得出最优解。
以上是常用的激活函数及其导数,其中ReLU计算简单高效,能有效缓解梯度消失问题,是目前最常用的激活函数之一。
2.1.3 前向计算
前向计算是指数据从输入层开始,逐层通过网络,经过加权求和与激活函数处理,最终在输出层得到预测值的过程。
每个神经元会拿输入做加权计算(乘上某些数字 + 偏置),再通过激活函数处理。
图中每一层的1
和0
、0
和0
、-2
和2
表示偏置。
偏置(Bias)是神经网络中每个神经元独有的一个额外参数,它和权重一起参与计算。
能让模型更灵活,能更好地学习和拟合数据。
2.2 步骤二:定义损失函数
定义了模型之后,我们需要一个标准来衡量模型预测的好坏。
这个标准就是损失函数(Loss Function),它量化了模型预测值与真实值之间的差异。
模型就根据这个反馈去调整内部的参数,让下一次预测得更准。
常用损失函数:
- 均方误差 (Mean Squared Error, MSE)
常用于回归问题,计算预测值与真实值之差的平方的均值
其中N
是样本数量,Y
是真实值,f(X)
是预测值
- 交叉熵损失函数 (Cross-Entropy Loss)
常用于分类问题(如二分类或多分类),衡量两个概率分布之间的差异
其中单个输出ai,真实标签yi
2.3 步骤三:参数学习
有了模型和评估标准,接下来的目标就是找到一组最优的模型参数(权重w
和偏置b
),使得损失函数的值最小。
这个过程就是模型的训练或优化。
2.3.1 梯度下降
梯度下降是最常用的优化算法之一。
通过计算损失函数对模型参数的梯度(导数),然后沿着梯度的反方向更新参数,从而逐步减小损失值。
神经网络里有很多“连接”,每一层的神经元连接到下一层
每条连接上都有一个权重 w w w
每个神经元也有一个 偏置 b b b
所有的 w w w 和 b b b 加起来,就是神经网络的参数集合 θ = { w 1 , w 2 , . . . , b 1 , b 2 , . . . } \theta = \{w_1, w_2, ..., b_1, b_2, ...\} θ={w1,w2,...,b1,b2,...}
步骤:
-
选择一个初始值:
我们需要先给这些权重 w w w、偏置 b b b 一个起点。
一般是随机初始化,也可以使用预训练集。
-
计算梯度(∂L/∂w):
我们输入数据让模型做预测,算出每个参数的梯度,也就是计算损失函数 L 关于每个参数 w 的偏导数(写作 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L)。
梯度能告诉我们如果改动这个参数,会让损失变大还是变小。
-
更新参数:
η \eta η 是学习率,它控制了每次更新的步长。
学习率的选择非常重要,太小会导致收敛过慢,太大则可能导致震荡或无法收敛。
−η * (∂L/∂w) 表示参数更新的量和方向,梯度是“往错误方向爬”,我们要沿着反方向下坡,所以有个负号。
-
迭代: 重复步骤2和3,直到 ∂L/∂w 非常小(即损失函数几乎不再下降,达到收敛状态),或者达到预设的迭代次数。
2.3.2 反向传播算法
那我问你,如何计算梯度值呢?
直接计算大规模神经网络中损失函数对于所有参数的梯度 (∂L/∂w) 是非常复杂的。
反向传播算法是一种高效计算这些梯度的方法。
其核心思想是利用链式法则从网络的输出层开始,逐层向后计算梯度。
上图例子是一个sigmoid 函数,它对一个线性组合 z = w 0 x 0 + w 1 x 1 + w 2 z = w_0x_0 + w_1x_1 + w_2 z=w0x0+w1x1+w2 取sigmoid输出。
f ( w , x ) = 1 1 + e − ( w 0 x 0 + w 1 x 1 + w 2 ) f(w, x) = \frac{1}{1 + e^{-(w_0x_0 + w_1x_1 + w_2)}} f(w,x)=1+e−(w0x0+w1x1+w2)1
正向传播(Forward Pass):
-
从左到右计算,先算每一项:
w 0 ⋅ x 0 = 2 ⋅ − 1 = − 2 w_0 \cdot x_0 = 2 \cdot -1 = -2 w0⋅x0=2⋅−1=−2
w 1 ⋅ x 1 = − 3 ⋅ − 2 = 6 w_1 \cdot x_1 = -3 \cdot -2 = 6 w1⋅x1=−3⋅−2=6
z = − 2 + 6 + w 2 = − 2 + 6 + ( − 3 ) = 1 z = -2 + 6 + w_2 = -2 + 6 + (-3) = 1 z=−2+6+w2=−2+6+(−3)=1
-
然后通过一系列函数:
乘 -1: − z = − 1 -z = -1 −z=−1
取指数: e − 1 ≈ 0.37 e^{-1} \approx 0.37 e−1≈0.37
加 1: 0.37 + 1 = 1.37 0.37 + 1 = 1.37 0.37+1=1.37
取倒数: 1 / 1.37 ≈ 0.73 1 / 1.37 \approx 0.73 1/1.37≈0.73
最终输出就是:0.73
反向传播(Backward Pass):
我们现在从输出(右边)往回传“误差影响力”或“梯度”
每个小圆圈表示一个操作,我们需要按链式法则:
当前节点的梯度 = 本地梯度 × 上一层传来的梯度
我们看 w 0 ⋅ x 0 w_0 \cdot x_0 w0⋅x0 那一步:
它后面传来的梯度是:0.2
-
乘法的局部梯度:
对 x 0 x_0 x0 而言,梯度是 w 0 = 2 w_0 = 2 w0=2
对 w 0 w_0 w0 而言,梯度是 x 0 = − 1 x_0 = -1 x0=−1
-
所以正如图上所示:
对 x 0 x_0 x0: 2 ⋅ 0.2 = 0.4 2 \cdot 0.2 = 0.4 2⋅0.2=0.4
对 w 0 w_0 w0: − 1 ⋅ 0.2 = − 0.2 -1 \cdot 0.2 = -0.2 −1⋅0.2=−0.2
3.典型神经网络模型
3.1 卷积神经网络(CNN)
CNN 是一种特别适用于处理网格状数据的深度学习模型,例如图像(2D网格的像素)和时间序列数据(1D网格)。
通常应用在图像分类、目标检测、图像分割、人脸识别、自然语言处理(如文本分类)等。
CNN 的设计灵感来源于生物视觉系统的层级特征提取。
在人类视觉皮层中,神经元对视野中的小区域敏感,并逐步组合这些信息以识别更复杂的模式。
低层:先看到图像的基本元素,如边缘、角点
中层:再组合这些线条成五官、轮廓等局部特征
高层:组合局部部件形成完整的物体概念,比如“这是张人脸”
CNN 模仿的就是这个从局部到整体的识别过程。
3.1.1 卷积层
-
卷积运算:卷积层是 CNN 的核心构建块。
它通过在输入数据上滑动一个或多个卷积核或滤波器的小型矩阵,来找特定特征,比如边缘或纹理。
卷积核/滤波器:一个小窗口,在图像上滑动,它会检测某种特征。
不同卷积核能做不同事,有的模糊图像,有的强调边缘,就像各种不同的滤镜。
局部感受野:每个神经元只看图像的一小部分。
权值共享:同一个卷积核在整个输入数据上共享其权重。节省参数,并使得网络对物体在图像中的位置具有一定的平移不变性。
-
卷积参数:
步长 :卷积核每次滑动的像素数,也就是滑动的速度,越大图就越快缩小。
零填充:在输入数据的边缘添加零值像素,防止边缘信息丢失。
滤波器示例:不同的滤波器可以提取不同的图像特征。
3.1.2 池化层
池化层通常接在卷积层之后,能帮助压缩信息量(降采样) ,保留重要特征,丢掉细节,让处理更高效。
池化层对特征图的每个小区域(例如2x2)进行聚合操作。
最大池化:取区域内的最大值。这是最常用的池化方法,因为它能保留最显著的特征。
平均池化:取区域内的平均值
3.1.3 激活函数
在卷积层和全连接层之后,通常会应用一个非线性激活函数,如ReLU,避免梯度消失,训练更顺畅。
3.2 循环神经网络(RNN)
RNN 是一类专门用于处理序列数据(如文本、语音、时间序列)的神经网络。它们通过在网络中引入循环连接,使得信息可以在时间步之间传递和保持。
也就是会记住以前的信息。
通常应用在自然语言处理(机器翻译、文本生成、情感分析)、语音识别、时间序列预测、视频分析等。
序列数据是指其元素顺序很重要的数据,比如股票价格(历史价格影响未来预测)、语音信号(声音随时间变化)、文本(词语的顺序决定句子含义)。
3.2.1 RNN基本结构
RNN的核心思想是“记忆”。它有一个内部状态(隐藏状态 h),用于捕获序列中先前时间步的信息。
在每个时间步 t t t,RNN接收当前输入 x t x_t xt和前一时间步的隐藏状态 h t − 1 h_{t-1} ht−1,然后计算当前隐藏状态 h t = f ( x t , h t − 1 h_t = f(x_t, h_{t-1} ht=f(xt,ht−1)和当前输出 y t y_t yt。
循环连接:隐藏状态的计算依赖于前一个隐藏状态,形成了环路。即每一个时间步都依赖前一个时间步的结果。
不同类型的RNN结构:
类型 | 说明 | 举例 |
---|---|---|
一对多 | 一个输入,多个输出 | 图片 → 文字描述 |
多对一 | 多个输入,一个输出 | 一段话 → 情绪判断 |
多对多 | 多个输入,多个输出 | 翻译(英文 → 中文) |
3.2.2 RNN内部计算
-
计算隐藏状态的公式: h t = f ( U h t − 1 + W x t + b ) h_t = f(U h_{t-1} + W x_t + b) ht=f(Uht−1+Wxt+b)
W x t W x_t Wxt:处理当前输入的信息
U h t − 1 U h_{t-1} Uht−1:带入上一个时间步的记忆信息
-
计算输出的公式: y t = g ( V h t + b y ) y_t = g(V h_t + b_y) yt=g(Vht+by)
V V V:输出权重矩阵
b y b_y by:输出偏置项
g g g:输出激活函数,如 softmax (用于分类) 或线性函数 (用于回归)
每一步,它都会用当前的输入 + 上一步的记忆 来更新当前的隐藏状态。
3.2.3 RNN局限性
由于RNN在时间上展开,反向传播时梯度会逐层传递,可能会导致梯度消失或者梯度爆炸。
梯度消失:如果激活函数的导数或权重矩阵的范数持续小于1,梯度在反向传播过程中会指数级衰减,导致模型“忘记了前面的内容”
梯度爆炸:相反,持续大于1,则梯度会指数级增长,导致训练不稳定。
3.2.4 长短期记忆网络(LSTM)
LSTM 是一种特殊的RNN,旨在解决标准RNN的梯度消失/爆炸问题。
它引入了门控机制,来决定信息的去留:
门 | 作用 | 类比 |
---|---|---|
遗忘门 | 忘掉不重要的旧信息 | 像大脑筛选掉无关的记忆 |
输入门 | 接受重要的新信息 | 记下新的知识点 |
输出门 | 决定输出什么 | 把有用的想法表达出来 |
还有一个细胞状态,像一条信息传送带,能让有用的内容一直传下去。
3.3 深度置信网络(DBN)
是一种早期的深度生成模型,由多个受限玻尔兹曼机(RBM)堆叠组成。
能逐层提取抽象特征,可以应用在图像识别、语音识别、特征提取等(现在已较少使用)。
3.4堆栈自编码器网络(SAE)
SAE是通过堆叠多个自编码器(AE)形成的深层神经网络,用于无监督特征学习。
能在无标签数据中提取有用特征,可以应用在数据降维、图像去噪、异常检测等。