在网络上找了很多关于深度学习的资料,也总结了一点小心得,于是就有了下面这篇文章。这里内容较为简单,适合初学者查看,所以大佬看到这里就可以走了。
话不多说,上图
从上图可以看出,传统神经网络算是另外两个神经网络的母体,所以这三者之间真要比较也一般都是拿CNN与RNN进行比较,很少看到拿三者一起比较的,很多初学者在这里就有所误解,以为三个神经网络是同时期的不同网络架构。
为了让大家更容易理解,这里整理了一组思维导图,解析三者神经网络的区别:
一、传统神经网络
传统神经网络(Traditional Neural Network)是指没有采用现代深度学习技术(如残差连接、批归一化、注意力机制等)的早期人工神经网络。它们通常由简单的全连接层或卷积层堆叠而成,其结构和训练方法相对基础。以下是传统神经网络的详细解释:
传统神经网络是一种基于生物学神经元模型的计算模型,通过多层非线性变换处理输入数据。其核心思想是通过“逐层传递”的方式将输入数据映射到输出结果,每一层的神经元通过权重和激活函数进行计算。
1.1 典型结构
可能你看了上面的解释还是感到模模糊糊的一知半解,没有完全理解传统神经网络到底是什么,没关系,下面我们上图,从结构的角度逐层分析传统神经网络结构。
传统神经网络的结构通常包括以下部分:
(1) 输入层(input layer)
输入层就是接收我们传入数据的层,输入的信息也叫做输入向量,它的功能如下:
- 功能:接收原始数据(如像素值、文本特征等一系列非线性讯息)。
- 示例:例如 MNIST 手写数字识别的输入层是 784 维向量(28×28 像素)。
(2) 隐藏层(hidden layer)
隐藏层一般也称为“隐层”是输入层和输出层之间众多神经元和链接组成的各个层面,隐藏层根据所搭建的神将网络结构而定,可能会有很多层,也可能只有几层。
-
全连接层(Dense Layer):
-
每个神经元与前一层的所有神经元相连,如上面的图可以看出每一个圆圈和前面的圆圈都有一条相连的线,每个圆圈就表示一个神经元,需要注意的是同一层之间的神经元没有连接,如上图中的四个圆圈就组成了一个隐藏层,当然一般不止四个,这里只是示例图像。
-
在神经元当中一般会有权重,每层也会有相应的激活函数,有多少个隐藏层就意味着有多少个激活函数。
-
计算公式: z = W ⋅ x + b , a = σ ( z ) z=W\cdot x+b, a=\sigma (z) z=W⋅x+b,a=σ(z),( σ \sigma σ为激活函数)。
-
-
激活函数:
常用的激活函数主要有以下三个:
-
Sigmoid:将输出压缩到 [0,1],但存在梯度消失问题。
-
Tanh:输出范围 [-1,1],缓解梯度消失但未彻底解决。
-
ReLU:早期传统网络较少使用,因其可能导致神经元死亡。
在上面也提到了一个很重要得概念,叫做梯度消失,那么什么是梯度消失呢,梯度消失是因为梯度是用于更新神经网络的权重值(新的权值 = 旧权值 - 学习率*梯度),梯度会随着时间的推移不断下降减少,而当梯度值变得非常小时,就不会继续学习,这种现象我们一般称为梯度消失。
(3) 输出层(output layer)
作为神将网络结构的最后一层,输出层是在神经元链接中传输、分析、权衡之后,形成的结果,最后经由输出层输出。输出的数据我们一般称为输出向量,模型的回归和分类也可以在这一步看出来,如果使用分类数据的激活函数一般是分类任务,如果没有使用激活函数,一般为回归任务。
- 多分类任务:使用如 Softmax 激活函数,输出类别概率。
- 回归任务:使用线性激活函数(无激活函数)。
1.2 典型网络
传统神经网络算是人工智能领域的奠基性模型,典型结构包含输入层、隐藏层和输出层,通过非线性激活函数和权重连接实现特征映射。根据连接方式,可分为三大类:
-
前馈神经网络
前馈神经网络简单理解就是数据单向流动,无反馈,从头走到尾(输入层→隐藏层→输出层),它通过链式法则逐层传播,没有反馈连接(即信号元不回传)。前馈神经网络由多层神经元(节点)组成,每层包含多个神经元,层与层之间通过权重连接,同层神经元无连接。
其工作原理也是前向传播 + 加反向传播所组成,下面我们来逐步介绍一下前向传播与反向传播的原理:
(1)前向传播(Forward Propagation)
每个神经元的计算过程分为三步,以隐藏层第 j j j 个神经元为例:
加权求和:先是接收上一层所有神经元的输出 x i x_i xi,乘以对应的权重 w i j w_{ij} wij 并求和,加上偏置(Bias) b j b_j bj,具体计算公式如下:
z j = ∑ i w i j x i + b j z_j = \sum_{i} w_{ij} x_i + b_j zj=i∑wijxi+bj
激活函数(Activation Function):对加权和 z j z_j zj 进行非线性变换,输出 a j = f ( z j ) a_j = f(z_j) aj=f(zj)。激活函数的作用是引入非线性,使网络能处理复杂问题。常见激活函数就是我们上面介绍的三个,在经过设定激活函数处理之后,再传向下一层。
逐层传递:输入层数据经隐藏层逐层计算后(经过上面的加权求和与激活函数处理(每层都要进行相同操作)),最终由输出层生成结果。核心组件
- 权重(Weights)与偏置(Bias):
权重表示神经元之间连接的强度,偏置类似截距,调整激活函数的输入。二者是网络的可学习参数,通过训练优化。 - 非线性的重要性:
若没有激活函数(或使用线性函数),多层网络等价于单层,无法拟合复杂非线性关系。激活函数使网络具备处理非线性问题的能力。
(2)训练过程(基于反向传播)
一般前馈神经网络通过 反向传播(Backpropagation) 算法优化参数,所谓的反向传播指的是模型通过计算损失函数 L L L 的出真实值与预测值之间的差距,然后反向去优化权重的过程,具体过程如下:
计算输出与损失
数据通过前向传播从输入层单向流动至输出层,得到预测值 y ^ \hat{y} y^,并通过损失函数 L ( y ^ , y ) L(\hat{y}, y) L(y^,y) 计算预测值与真实值 y y y 的差距。此时网络仅完成了前向计算,尚未涉及参数优化。反向传播:基于链式法则的梯度推导
反向传播的目标是计算损失 L L L 对网络中所有可学习参数(权重 w w w、偏置 b b b)的梯度 ∂ L ∂ w , ∂ L ∂ b \frac{\partial L}{\partial w}, \frac{\partial L}{\partial b} ∂w∂L,∂b∂L,以更新参数。-
梯度计算遵循链式法则:若网络结构为 L → 输出层 → 隐藏层 → 输入层 L \rightarrow \text{输出层} \rightarrow \text{隐藏层} \rightarrow \text{输入层} L→输出层→隐藏层→输入层,则输出层参数的梯度可直接通过 L L L 对输出的导数计算,而隐藏层参数的梯度需通过输出层梯度“反向传递”(因为隐藏层的输出是输出层的输入)。
-
例如,对于两层网络 输入层 → 隐藏层 → 输出层 \text{输入层} \rightarrow \text{隐藏层} \rightarrow \text{输出层} 输入层→隐藏层→输出层的梯度为:
∂ L ∂ w ( 1 ) = ∂ L ∂ 输出 ⋅ ∂ 输出 ∂ 隐藏层激活 ⋅ ∂ 隐藏层激活 ∂ w ( 1 ) \frac{\partial L}{\partial w^{(1)}} = \frac{\partial L}{\partial \text{输出}} \cdot \frac{\partial \text{输出}}{\partial \text{隐藏层激活}} \cdot \frac{\partial \text{隐藏层激活}}{\partial w^{(1)}} ∂w(1)∂L=∂输出∂L⋅∂隐藏层激活∂输出⋅∂w(1)∂隐藏层激活
这里每一步导数的传递方向与数据流动方向相反,但传递的是梯度(导数),而非原始数据。
总结
反向传播依赖前向传播过程中存储的中间结果(如各层的输入 ( z )、激活值 a a a 来高效计算梯度。例如:
-
隐藏层神经元的输入 z = w ( l − 1 ) a ( l − 1 ) + b ( l − 1 ) z = w^{(l-1)} a^{(l-1)} + b^{(l-1)} z=w(l−1)a(l−1)+b(l−1),激活值 a = f ( z ) a = f(z) a=f(z)。
-
反向传播时,计算 ∂ L ∂ w ( l − 1 ) \frac{\partial L}{\partial w^{(l-1)}} ∂w(l−1)∂L 需要用到 a ( l − 1 ) a^{(l-1)} a(l−1)(前向传播中存储的上一层激活值)和当前层的梯度 δ ( l ) = ∂ L ∂ z ( l ) \delta^{(l)} = \frac{\partial L}{\partial z^{(l)}} δ(l)=∂z(l)∂L。
关键点:前向传播的中间变量为反向传播提供了“计算梯度的必要信息”,使梯度可以沿网络层反向推导,而无需数据本身反向流动。
在这里很多小伙伴就会有疑问,为什么前馈神经网络数据单向流动,却能反向传播,这里需要注意的是:
-
数据流动方向:始终是输入→输出,用于生成预测结果和损失,不涉及参数更新逻辑。
-
梯度传递方向:仅用于优化参数,通过链式法则从损失函数出发,逆向推导各层参数对损失的影响(梯度),与数据流动方向无关。
举个简单的例子二者的关系类似“函数求值”与“函数求导”:
-
前向传播是“求值”(给定输入,计算输出和损失);
-
反向传播是“求导”(给定损失,计算各参数的梯度)。
数学上,求导的方向自然与函数复合的方向相反(链式法则的本质),这与数据是否反向流动无关。
典型示例:单层感知机 vs 多层感知机
- 单层感知机(Single-Layer Perceptron):
仅有输入层和输出层(无隐藏层),等价于线性分类器,只能处理线性可分问题(如区分圆形和方形)。 - 多层感知机(Multilayer Perceptron, MLP):
包含至少一个隐藏层,通过多层非线性变换,能处理线性不可分问题(如异或运算、图像分类)。隐藏层越多,网络表达能力越强,但也可能导致过拟合。
- 权重(Weights)与偏置(Bias):
-
反馈神经网络(Feedback Neural Network)
和前馈神经网络相对的就是反馈神经网络,它在前馈神经网络的基础上加了一个反馈操作,可以使的数据流动方向可以从后往前,形成流动循环,如下图所示:
“反馈” 对应的英文是 Feedback,核心是 “反向输送”,数据在网络中不仅可以从输入层流向输出层(前向),还可以从某些层 “反馈” 到前面的层(如输出层→隐藏层,或隐藏层→自身),形成 循环连接(环路),因为上面的图是网上找的示意图,没有画的特别详细,大家只做一个对照参考即可。
如果大家还是理解不了,这里有一个相对形象的例子,反馈机制就像水管里的水,不仅可以向前流,还可以通过阀门流回前面的管道,形成一个循环系统。这种 “回头路” 让网络具备了 “记忆” 或 “动态” 处理能力。
(1)反馈神经网络的核心特点:循环结构与动态处理
- 结构上:存在“递归连接”
反馈神经网络的神经元连接主要有以下两种关键形式:
- 层间反向连接:比如输出层的神经元连接到隐藏层或输入层(如输出反馈到输入,形成闭环)。
- 层内自连接:同一层的神经元连接到自己或同层的其他神经元(最常见的是隐藏层神经元的输出“回头”作为自己下一个时刻的输入)。
这种连接形成 有向环图(区别于前馈网络的无环图),使得网络在处理数据时需要考虑“历史信息”。
-
工作机制:依赖“时间序列”或“历史状态”
反馈神经网络的核心是 处理序列数据(如语音、文本、股票价格等随时间变化的数据),每个时刻的计算不仅依赖当前输入,还依赖之前的“记忆”。典型过程如下:- 输入:在每个时间步 t t t,输入当前数据 x t x_t xt,同时接收来自上一时刻的“隐藏状态” h t − 1 h_{t-1} ht−1(即网络之前的“记忆”)。
- 隐藏层计算:隐藏层神经元结合 x t x_t xt 和 h t − 1 h_{t-1} ht−1 进行计算,得到当前时刻的隐藏状态 h t h_t ht,并将 h t h_t ht 传递到下一时刻(形成循环)。
- 输出:可以在每个时间步输出结果(如语音识别逐字输出),或在最后一个时间步输出最终结果(如文本分类)。
用公式表示隐藏层的计算(以最简单的递归神经网络RNN为例):
h t = f ( W ⋅ h t − 1 + U ⋅ x t + b ) h_t = f(W \cdot h_{t-1} + U \cdot x_t + b) ht=f(W⋅ht−1+U⋅xt+b)
其中:-
W W W 是隐藏层自连接的权重(反馈权重), U U U 是输入层到隐藏层的权重, b b b 是偏置;
-
f f f 是激活函数(如Tanh、Sigmoid),用于引入非线性。
(2) 典型例子:递归神经网络(RNN)及其变种
最常见的反馈神经网络是 RNN(Recurrent Neural Network),以及它的改进版本(LSTM、GRU等),专门用于处理序列数据。例如:
-
处理句子“我吃饭”:当网络处理“吃”时,需要记住前面的“我”(主语);处理“饭”时,需要记住“吃”(谓语),这种依赖通过隐藏状态的反馈实现。
-
语音识别:每个时刻的音频信号输入,结合之前的隐藏状态(记忆),逐步输出对应的文字。
(3)为什么需要反馈神经网络
前馈神经网络的缺陷:
- 输入和输出是“独立”的,无法处理数据中的时序关系或上下文依赖。例如,判断句子“我喜欢苹果,因为它很甜”中的“它”指代“苹果”,需要记住前文的“苹果”,前馈网络无法直接做到(除非人为将整个句子的所有词作为输入,但无法处理无限长序列)。
反馈神经网络的优势:
- 通过隐藏状态的反馈,将历史信息“传递”到当前时刻,实现“记忆”功能。例如:
-
聊天机器人需要记住用户之前的对话内容(如“你刚才说你喜欢猫,那你养过猫吗?”),反馈网络可以通过隐藏状态保存对话历史。
-
股票预测需要根据过去的价格趋势预测未来,反馈网络能捕捉时间序列中的依赖关系。
-
反馈神经网络的不足:
梯度在长时间传播时可能会消失或爆炸(尤其是基础RNN),因此才有了LSTM、GRU等变种,通过门控机制缓解这个问题。(4)总结
反馈神经网络是一类允许数据反向流动(形成循环连接)的神经网络,通过隐藏状态的循环传递实现对序列数据的“记忆”,适用于处理具有时间或上下文依赖的任务(如语言、语音、时序预测)。其核心是“递归连接”和“动态处理”,与前馈网络的最大区别在于是否具备记忆能力和循环结构。如果你还是觉得抽象,可以记住一句话:
“前馈网络像计算器,输入数据直接算结果;反馈网络像人,能记住之前的信息,处理需要‘上下文’的数据(比如你现在看这句话,需要结合前面的解释才能理解,这就是一种‘反馈’式的理解)。”
- 结构上:存在“递归连接”
-
自组织神经网络
自神经网络也叫做自编码器神经网络(Autoencoder Neural Network),是一种无监督学习的神经网络,它的主要目的是学习一种高效的数据编码方式,将输入数据映射到一个低维的表示(编码),然后再从这个编码中尽可能准确地重构出原始输入(解码)。
它通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。
因为这个神经网络在现阶段应用并不是很多,所以这里只做一个简单介绍,其结构如下图所示:
(1)结构-
编码器:将输入数据压缩成一个低维的编码表示,这个过程可以看作是对输入数据的特征提取。它由多个神经元层组成,通过一系列的线性变换和非线性激活函数来实现对输入的压缩。
-
解码器:将编码表示恢复成与原始输入相似的输出。解码器的结构通常与编码器相反,也是由多个神经元层组成,通过反向的操作来重构输入数据。
(2)工作原理
-
训练阶段:自编码器通过最小化重构误差来学习数据的内在结构。在训练过程中,将输入数据送入编码器,得到编码表示,然后通过解码器将编码重构为输出。计算输出与原始输入之间的差异(通常使用均方误差等损失函数),并通过反向传播算法来调整编码器和解码器的参数,使得重构误差逐渐减小。
-
应用阶段:训练完成后,编码器可以将新的输入数据转换为低维的编码表示,这些编码可以用于数据压缩、特征提取、异常检测等任务。例如,在数据压缩中,可以将原始数据用学到的编码表示来存储,需要时再通过解码器进行恢复;在特征提取中,编码可以作为数据的一种紧凑的特征表示,用于后续的分类、聚类等任务。
(3) 特点
-
无监督学习:不需要标注数据,能够自动从大量的无标注数据中学习到数据的特征和结构。
-
数据降维:可以将高维数据映射到低维空间,同时保留数据的主要信息,有助于减少数据存储空间和计算量。
-
特征学习:能够学习到数据的内在特征表示,这些特征可能比原始数据更具有代表性,有利于提高后续任务的性能。
代码示例:
-
from keras.models import Sequential
from keras.layers import Dense
# MNIST手写数字识别示例
dnn_model = Sequential([
Dense(512, activation='relu', input_shape=(784,)),
Dense(256, activation='relu'),
Dense(10, activation='softmax')
])
dnn_model.compile(optimizer='adam', loss='categorical_crossentropy')
经过上面的讲解你应该对于传统神经网络的三大网络结构有了一定的了解,在这里我做一个总结对比:
对比项 | 前馈神经网络 | 反馈神经网络 | 自编码器神经网络 |
---|---|---|---|
网络结构 | 由输入层、一个或多个隐藏层和输出层组成,层与层之间神经元单向连接,无反馈连接,呈有向无环图结构 | 存在神经元之间的反馈连接,可形成环路,有层间反向连接和层内自连接,呈有向环图结构 | 包含编码器和解码器两部分,编码器将输入压缩为低维编码,解码器将编码重构为输出,整体结构对称 |
数据流动 | 数据仅从输入层向输出层单向流动,不存在反向的数据传递 | 数据不仅能前向传播,还存在反馈,即部分层的输出会作为前面层的输入,在时间步间循环 | 数据先从输入层进入编码器得到编码,再将编码输入解码器得到输出,是一种特殊的前向传播过程 |
记忆能力 | 无记忆能力,每个输入的处理独立于其他输入,不考虑历史信息 | 具有记忆能力,通过隐藏状态的反馈保留历史信息,可处理与历史相关的序列数据 | 一般无明显记忆能力,主要关注输入数据的重构,重点在于学习数据的潜在特征表示 |
训练方式 | 使用反向传播算法,通过最小化预测值与真实值之间的损失函数来更新网络参数 | 通常使用时间反向传播(BPTT)算法,考虑时间维度上的梯度传播,训练时要处理梯度消失或爆炸问题 | 通过最小化重构误差(如均方误差)来更新编码器和解码器的参数,采用无监督学习方式 |
适用场景 | 适用于处理静态数据,如图像分类、手写数字识别、简单的回归任务等 | 适合处理序列数据,如自然语言处理中的机器翻译、语音识别、时间序列预测等 | 常用于数据压缩、特征提取、异常检测、去噪等,尤其在无监督特征学习和数据降维方面表现出色 |
典型模型示例 | 多层感知机(MLP) | 递归神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU) | 基本自编码器、变分自编码器(VAE)、去噪自编码器 |
介绍完了传统神经网络的三大结构,我们再来说说它需要改进的点。
1.3 训练问题
传统神经网络在训练中一直面临着以下挑战:
(1) 梯度消失/爆炸
- 原因:链式求导导致梯度在反向传播中指数级衰减(消失)或增长(爆炸)。
- 梯度消失:简单来讲梯度消失(Vanishing Gradient Problem,或称梯度弥散)的意思是,在误差反向传播的过程中,误差经过每一层传递都会不断衰减,当网络层数很深时,神经元上的梯度也会不断衰减,导致前面的隐含层神经元的学习速度慢于后面隐含层上的神经元。
- 梯度爆炸:梯度爆炸的一个原因是网络的权重设置得过大,在每一层传递过程中,神经网络的层数越深,梯度越大。这就带来了梯度爆炸的问题。
- 影响:深层网络无法有效更新权重,训练停滞。
(2) 过拟合
- 原因:这也是传统神经网络的一个痛点,因为网络容量过大,在模型训练过程中回记忆噪声数据,导致模型过拟合,没有达到想要的结果。
- 解决方案:
- 正则化(如 L2 正则化)。
- Dropout(早期传统网络较少使用)。
(3) 优化困难
- 问题:因为当时传统神经网络所用的优化器为 SGD(随机梯度下降(stochastic gradient descent,SGD)),梯度方向不准确,陷入局部最优,达不到全局最优解,所产生的问题。
- 改进:当然这种方法在现在改进起来也很容易就是使用更优的优化器(如 Adam),但传统网络通常依赖 SGD。
1.4 局限性
虽然对当时的来说传统神经网络已经很优秀,但是我们现在来看,传统神经网络还是有很大的缺点,其中最为限制其性能的就是以下三点:
- 深度限制:难以训练超过 20 层的网络。
- 特征提取能力:依赖手工特征(如 SIFT、HOG),而非端到端学习。
- 计算效率:全连接层参数量巨大,如 1000 层的网络可能包含数亿参数。
1.5 典型应用
在了解了上面的这些之后我们再来了解一下它的发展历史,传统神经网络的应用总共有以下在节点:
- 图像识别:LeNet-5(1998 年,手写数字识别)。
- 语音识别:深度信念网络(DBNs)。
- 自然语言处理:循环神经网络(RNNs)的早期应用。
1.6 与现代网络的对比
将传统神经网络拿到现在来对比,可以看出传统神经网络架构还是较为单一:
特性 | 传统神经网络 | 现代神经网络(如 ResNet) |
---|---|---|
残差连接 | 无 | 有(解决梯度消失) |
激活函数 | Sigmoid/Tanh 为主 | ReLU/Swish/GELU 为主 |
归一化 | 无 | 批归一化(BatchNorm) |
深度 | 浅(通常 <20 层) | 深(如 ResNet-152 有 152 层) |
特征学习 | 依赖手工特征 | 端到端学习 |
总结:从上述的介绍我们可以看出,传统神经网络是深度学习的基础,但受限于梯度消失、过拟合和计算效率等问题,难以构建更深层、更复杂的模型。现代网络(如 ResNet、Transformer)通过引入残差连接、批归一化、注意力机制等创新,突破了这些限制,推动了 AI 技术的革命性发展。
二、卷积神经网络(CNN):空间特征的提取专家
在进入 CNN 的世界之前我们先来看一组图:
上图中左边是全连接神经网络,右边是卷积神经网络,可以看出传统的神经网络还是在平面展开,而卷积神经网络可以在三维展开,这也就是卷积神经网络能够处理更复杂的图片和视频的原因。
卷积神经网络(Convolutional Neural Network, CNN)是一种专门设计用于处理网格状数据(如图像、音频、视频)的深度学习模型。它通过卷积层、池化层和全连接层的组合,能够自动提取数据的层次化特征,在计算机视觉领域取得了革命性突破。其核心优势在于局部连接和权重共享,大幅减少参数数量并提升平移不变性,下面就让我们进入卷积神经网络的世界。
看过上面的流程之后我们在来举一个现实例子:
上面的图片显示经过了一层卷积,然后经过 ReLu 激活函数映射,在经过卷积、映射和 POOL 池化,将上面的步骤重复了三遍,然后经过 FC(全连接层)输出结果,可以看到最后的结果,识别 car 排在第一。
那现在有一个问题,上面的模型是一个基层卷积神经网络呢?
答案是 10 层,因为只有经过更新权重的层才算是一层神经网络,如 ReLu 等都不能算是一层神经网络,只有 Conv 层、Pool 层以及FC层才算是一层神经网络。
下面我们就逐层分析一下 CNN 神经网络的内在结构都代表什么意思。
2.1 CNN的核心思想
- 局部连接:每个神经元仅连接输入的局部区域(如图像的一个小窗口),而非全部像素。
- 参数共享:同一卷积核的参数在整个输入中共享,大幅减少参数量。
- 层级特征提取:浅层学习边缘、纹理等低级特征,深层学习形状、物体部件等高级特征。
2.2 典型结构
CNN的结构通常包含以下模块:
(1) 输入层
输入层和之前提到的输入层区别不大,这里不在过多赘述,之讲解一下大概结构:
- 图像输入:形状为
(高度, 宽度, 通道数)
,如RGB图像为(224, 224, 3)
。 - 预处理:归一化(如像素值缩放到 [0,1])和标准化(均值为0,方差为1)。
(2) 卷积层(Convolutional Layer)
卷积层作为卷积神经网络的核心,它到底做了些什么呢,下面我们就来一起探索:
- 功能:通过滑动窗口(卷积核)提取局部特征。
- 关键参数:
- 核大小:如
3x3
、5x5
,决定感受野大小。 - 步长(Stride):窗口滑动的步幅,步长为2时特征图尺寸减半。
- 填充(Padding):在输入边缘填充0,保持特征图尺寸。
- 核大小:如
- 输出形状:
输出尺寸 = 输入尺寸 − 核大小 + 2 × 填充 步长 + 1 \text{输出尺寸} = \frac{\text{输入尺寸} - \text{核大小} + 2 \times \text{填充}}{\text{步长}} + 1 输出尺寸=步长输入尺寸−核大小+2×填充+1
知道了上面这些概念,我们再来看看它实际是怎样运作的:
上面就是一个卷积核为 33 步长为 2 边缘填充为 1 的一个卷积层,可以看出它每次计算都是在 33 的小区域内进行,这个就是它的卷积核,每次滑动两个窗口,是步长,外面的一圈灰色的是填充值,为了不影响计算权重,一般都设为 0。
下面我们来逐层解释这几个名词:
(3) 激活函数
- ReLU:最常用激活函数,公式为 f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x),解决梯度消失问题。
- Swish/GELU:更平滑的激活函数,提升深层网络性能。
(4) 池化层(Pooling Layer)
- 功能:降低特征图尺寸,减少计算量,增强平移不变性。
- 类型:
- 最大池化(Max Pooling):取窗口内最大值。
- 平均池化(Average Pooling):取窗口内平均值。
- 示例:
MaxPool2D(pool_size=(2,2))
将特征图尺寸减半。
(5) 全连接层(Fully Connected Layer)
- 功能:将提取的特征映射到最终分类结果。
- 结构:每个神经元与前一层所有神经元相连。
- 输出层:
- 多分类任务:使用 Softmax 激活函数,输出类别概率。
- 回归任务:使用线性激活函数。
(6) 正则化技术
- 批量归一化(BatchNorm):标准化特征分布,加速训练。
- Dropout:随机丢弃神经元,防止过拟合。
2.3 CNN的优势
特性 | 传统神经网络 | CNN |
---|---|---|
局部连接 | 全连接,参数量爆炸 | 局部连接,参数大幅减少 |
平移不变性 | 需手动设计特征 | 自动学习平移不变特征 |
层级特征 | 依赖手工特征 | 端到端学习层次化特征 |
计算效率 | 高(全连接层参数量大) | 低(卷积层参数共享) |
2.4 经典CNN模型
模型 | 特点 | 应用场景 |
---|---|---|
LeNet-5 | 首个成功的CNN(1998),用于手写数字识别 | MNIST、OCR |
AlexNet | 现代CNN的奠基模型(2012),引入ReLU和Dropout | ImageNet分类 |
VGGNet | 加深网络(16-19层),验证深度重要性 | 图像分类、特征提取 |
ResNet | 引入残差连接,解决梯度消失问题 | 图像分类、目标检测 |
YOLO | 实时目标检测模型,融合CNN与回归 | 自动驾驶、安防监控 |
2.5 工作流程示例(MNIST识别)
- 卷积层:提取边缘、曲线等低级特征。
- 池化层:降低特征图尺寸,保留关键信息。
- 全连接层:整合全局特征,输出数字概率。
代码示例:
from keras.layers import Conv2D, MaxPooling2D, Flatten
# CIFAR-10图像分类
cnn_model = Sequential([
Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)),
MaxPooling2D((2,2)),
Conv2D(64, (3,3), activation='relu'),
MaxPooling2D((2,2)),
Flatten(),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
6. 应用领域
- 图像分类:识别物体类别(如ImageNet挑战赛)。
- 目标检测:定位并分类图像中的多个物体(如COCO数据集)。
- 语义分割:像素级分类(如医学影像分析)。
- 视频分析:动作识别、异常检测(如UCF101数据集)。
- 自然语言处理:文本分类、情感分析(如TextCNN)。
总结: CNN通过局部连接、参数共享和层级特征提取,成为处理图像和视频数据的首选模型。其成功推动了计算机视觉的革命,并为后续模型(如Transformer)奠定了基础。理解CNN的结构和原理是深入学习深度学习的关键一步。
三、循环神经网络(RNN)
RNN(循环神经网络,Recurrent Neural Network)是一种专门处理序列数据(如文本、语音、时间序列等)的神经网络架构。与传统前馈神经网络(如CNN)不同,RNN通过循环连接(Recurrent Connection)引入了时间维度上的记忆能力,允许信息在网络中传递和保留。
其通过隐藏状态传递机制捕捉长期依赖。经典公式如下:
h
t
=
tanh
(
W
x
h
x
t
+
W
h
h
h
t
−
1
+
b
h
)
h_t = \tanh(W_{xh}x_t + W_{hh}h_{t-1} + b_h)
ht=tanh(Wxhxt+Whhht−1+bh)
y
t
=
softmax
(
W
h
y
h
t
+
b
y
)
y_t = \text{softmax}(W_{hy}h_t + b_y)
yt=softmax(Whyht+by)
3.1 核心特点
-
循环结构
RNN的隐藏层不仅接收当前输入,还接收上一时刻的隐藏状态,形成“循环”信息流。公式表示为:
h t = σ ( W x h x t + W h h h t − 1 + b h ) h_t = \sigma(W_{xh}x_t + W_{hh}h_{t-1} + b_h) ht=σ(Wxhxt+Whhht−1+bh)
其中, h t h_t ht是当前时刻的隐藏状态, x t x_t xt是输入, σ \sigma σ是激活函数(如tanh)。 -
时间依赖性
能够捕捉序列中的长期依赖关系(如句子中的上下文关联),但传统RNN存在梯度消失/爆炸问题,导致难以学习长期依赖。 -
变体改进
- LSTM(长短期记忆网络):通过门控机制(输入门、遗忘门、输出门)解决长期依赖问题。
- GRU(门控循环单元):简化版LSTM,参数更少,训练效率更高。
核心挑战:梯度消失/爆炸
- 解决方案:
- 使用ReLU激活函数
-引入门控机制(LSTM、GRU)
-梯度裁剪
- 使用ReLU激活函数
LSTM结构解析:
- 遗忘门:决定保留多少历史信息
- 输入门:控制新信息的流入
- 输出门:调节隐藏状态的输出
3.2 与CNN的对比
特性 | CNN | RNN |
---|---|---|
结构 | 前馈,空间局部连接 | 循环,时间序列连接 |
适用数据 | 图像、网格数据 | 文本、语音、时间序列 |
记忆能力 | 无 | 有(短期依赖为主) |
典型应用 | 图像分类、目标检测 | 语言模型、语音识别 |
3.3 应用领域
- 自然语言处理(NLP)
- 语言模型(如GPT系列)
- 机器翻译、情感分析、文本生成
- 时间序列预测
- 股票走势预测、天气预测
- 语音处理
- 语音识别、说话人识别
- 视频分析
- 动作识别、视频描述生成
优缺点
- 优点:
- 擅长处理序列数据中的时间依赖关系。
- 结构灵活,可根据任务调整层数和单元类型(LSTM/GRU)。
- 缺点:
- 传统RNN存在梯度消失问题,难以捕捉长期依赖。
- 并行计算能力差,训练速度较慢(LSTM/GRU有所改善)。
代码示例(文本生成):
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
model = Sequential([
LSTM(128, input_shape=(seq_length, vocab_size)),
Dense(vocab_size, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy')
总结:RNN是处理序列数据的核心模型,其循环结构赋予了对时间信息的建模能力。尽管存在一些局限性,但其变体(如LSTM、GRU)在实际任务中表现出色,是自然语言处理和时间序列分析的基石。
四、三者对比
4. 1 特征提取方式对比
# 可视化中间层输出
from keras.models import Model
# CNN特征可视化
conv_layer = Model(inputs=cnn_model.input,
outputs=cnn_model.layers[2].output)
feature_maps = conv_layer.predict(img_array)
# RNN隐藏状态可视化
lstm_layer = Model(inputs=rnn_model.input,
outputs=rnn_model.layers[2].output)
hidden_states = lstm_layer.predict(text_sequence)
4.2 各自特点对比
特征 | 传统神经网络(DNN) | 卷积神经网络(CNN) | 循环神经网络(RNN) |
---|---|---|---|
连接方式 | 全连接 | 局部连接+参数共享 | 时序递归连接 |
核心优势 | 简单快速 | 空间特征提取 | 时序依赖捕捉 |
参数数量 | O(n²)级增长 | O(k²×c)级增长(k为卷积核尺寸) | O(n×h)级增长(h为隐藏单元) |
特征提取 | 全局特征 | 空间局部特征 | 时序特征 |
典型应用 | 简单分类/回归 | 图像处理 | 自然语言处理 |
并行计算能力 | 高 | 极高 | 低 |
记忆能力 | 无 | 无 | 有时序记忆 |
处理序列能力 | 需展开为向量 | 需转换为图像格式 | 原生支持 |
训练难度 | 容易过拟合 | 中等 | 梯度消失/爆炸问题严重 |
4.3 计算效率提升方案
网络类型 | 优化策略 | 效果提升幅度 |
---|---|---|
DNN | 参数剪枝+量化 | 50-70% |
CNN | 深度可分离卷积 | 3-5倍加速 |
RNN | 使用GRU代替LSTM | 30%提速 |
混合架构 | 层间融合+知识蒸馏 | 2-3倍加速 |
4.4 内存优化代码示例
# 混合精度训练
from keras.mixed_precision import set_global_policy
set_global_policy('mixed_float16')
# 梯度累积
optimizer = Adam(learning_rate=1e-4, gradient_accumulation_steps=4)
# 内存映射数据集
dataset = tf.data.Dataset.from_generator(data_gen, output_types=(tf.float32, tf.int32))
4.5 参数共享机制对比
- DNN:无共享机制
- CNN:卷积核滑动共享
- RNN:时间步参数共享
# 参数数量计算示例
def print_params(model):
trainable_params = np.sum([K.count_params(w) for w in model.trainable_weights])
print(f"可训练参数数量: {trainable_params:,}")
print_params(dnn_model) # 约 669,706 参数
print_params(cnn_model) # 约 121,866 参数
print_params(rnn_model) # 约 1,313,793 参数
五、组合应用:CNN+RNN的协同效应
- 图像描述生成
- CNN提取图像特征 → RNN生成自然语言描述
- 视频分类
- CNN处理空间信息 → RNN分析时间序列动态
- 对话系统
- CNN编码视觉输入 → RNN生成回复
示例架构:
# CNN特征提取
image_input = Input(shape=(224,224,3))
cnn_features = VGG16(weights='imagenet', include_top=False)(image_input)
cnn_features = GlobalAveragePooling2D()(cnn_features)
# RNN文本生成
text_input = Input(shape=(max_length,))
embedding = Embedding(vocab_size, 128)(text_input)
lstm_output = LSTM(256)(embedding)
# 合并输出
concat = Concatenate()([cnn_features, lstm_output])
output = Dense(1000, activation='softmax')(concat)
model = Model(inputs=[image_input, text_input], outputs=output)
六、写在最后(小结一下)
6.1 行业应用风向标
- 传统DNN:适合小规模、结构化数据,已逐步被CNN/RNN替代
- CNN:计算机视觉领域的绝对主力,向轻量化(MobileNet)和3D扩展
- RNN:LSTM/GRU仍是序列建模的主流,但Transformer架构在长距离依赖上表现更优
6.2 行业应用风向标
相信读完这篇文章,你对与三大网络架构有了一个大体的了解,掌握三大神经网络的本质差异,犹如获得打开深度学习世界的三把钥匙。无论是处理空间信息、时序序列还是简单结构化数据,选择合适的网络架构往往能事半功倍。如果有任何问题欢迎留言,也期待各位的批评指正!
参考资料:
https://www.cnblogs.com/Luv-GEM/p/10694471.html
https://blog.csdn.net/v_JULY_v/article/details/51812459