智能计算机系统
人工智能是机器展现的智能行为,分为强AI(类人智慧)和弱AI(特定任务)。主要流派包括:符号主义(逻辑推理)、行为主义(感知-行动)和连接主义(神经网络)。神经网络模仿生物神经元,从单层感知机发展为多层深度学习模型。训练过程通过正向传播提取特征,反向传播调整参数优化模型。随着计算能力提升,深度神经网络通过多层次抽象特征实现更强的分类能力。
一、绪论
什么是人工智能
人工智能(Artificial Intelligence, AI)指由人类制造的机器所展现出的智能行为。
强人工智能:具备与人类同等智慧、甚至超越人类的人工智能,能够表现出正常人类所具有的所有智能行为。
弱人工智能:专注于完成特定具体任务的人工智能,是计算机科学中的非平凡应用。
人工智能的三个流派
逻辑主义(符号主义)
核心:符号推理与机器研究,通过符号表达的方式来研究智能与推理。奠基人是西蒙(Herbert Simon)。
符号主义的典型例子:∀x (P(x, y) → Q(x, y)) ∨ R(x, y)
这是一阶谓词逻辑,使用符号来表达变量或事件之间的关系。
符号主义的缺陷:
- 未能找到能够表述所有事件的简洁逻辑体系;
- 常识知识无穷无尽,难以完全形式化;
- 命题逻辑判定是NP完全的,一阶谓词逻辑不可判定。
符号主义主要考虑了理性认知的智能,但人类智能同时包含感性认知(感知)和理性认知(认知)两个方面。
行为主义
核心:控制、自适应与进化计算,与未来的车联网等应用密切相关。奠基人是维纳(Norbert Wiener)。
行为主义的主要思想是"感知-行动",需要在真实世界的复杂环境中进行学习训练。从实现角度看,更偏向硬件,因为需要感知器和控制器来与外界进行交互。
连接主义
核心:神经元网络和深度学习,模仿人的神经系统,将神经系统的模型用计算方式呈现,以此模拟智能。奠基人是明斯基(Marvin Minsky)。
神经网络发展历程:单个神经元的感知机 → 多神经元、多层的神经网络(MLP、SVM等) → 深度神经网络
智能计算机系统
智能计算机系统是智能的物质载体。
现阶段的智能计算系统通常是集成CPU和智能芯片的异构系统。软件上通常包含面向开发者的智能计算编程环境,包括编程框架和编程语言。
智能计算机系统经历了三代发展:
- 面向符号主义处理的专用计算机;
- 面向连接主义的专用计算机;
- 未来强人工智能、通用人工智能的载体。
我们目前处于第二代。
二、神经网络基础
人工神经元
人工神经元模仿生物神经细胞的结构,构建出一个包含输入、输出与计算功能的模型。输入可类比为生物神经元的树突,输出可类比为轴突,计算过程则类比为细胞体。
感知机模型
感知机模型 H(x)=sign(wTx+b)H(x) = \operatorname{sign}(w^T x + b)H(x)=sign(wTx+b) 对应一个超平面 wTx+b=0w^T x + b = 0wTx+b=0,模型参数为 (w,b)(w, b)(w,b)。其中 www 称为权重,bbb 称为偏置。感知机的目标是找到一组 (w,b)(w, b)(w,b),将线性可分的数据集 DDD 中的所有样本点正确地分为两类。
H(x)=sign(wTx+b) H(x) = \operatorname{sign}(w^T x + b) H(x)=sign(wTx+b)
这里的 sign\operatorname{sign}sign 是一个阶跃激活函数,定义为:
sign(x)={+1,x≥0−1,x<0 \operatorname{sign}(x) = \begin{cases} +1, & x \ge 0 \\ -1, & x < 0 \end{cases} sign(x)={+1,−1,x≥0x<0
感知机是第一个能够自动学习权重的人工神经元,它具有三层结构:输入层、计算层和输出层。在每次预测后,可以根据预测结果对权重进行调整。
那该如何调整权重,使感知机模型的分类效果更好呢?
我们引入损失函数的概念:对每个预测错误的样本点进行惩罚,预测正确的则不惩罚,所有惩罚的总和即为损失函数。我们需要设计合适的损失函数并将其最小化,从而得到权重和偏置的最佳值。
寻找损失函数
考虑一个数据集 D={(x1,y1),(x2,y2),(x3,y3),…,(xm,ym)}D = \{(x_1, y_1), (x_2, y_2), (x_3, y_3), \dots, (x_m, y_m)\}D={(x1,y1),(x2,y2),(x3,y3),…,(xm,ym)}。若存在超平面 S=wTx+b=0S = w^T x + b = 0S=wTx+b=0 能将正负样本分开,则说明数据线性可分。如何求出该超平面的表达式?
策略:设误分类点的集合为 MMM,使用误分类点到超平面的总距离作为损失函数(总距离越小越好)。
推导过程
点 xix_ixi 到超平面 SSS 的欧式距离:
di=∣wTxi+b∣∥w∥ d_i = \frac{|w^T x_i + b|}{\|w\|} di=∥w∥∣wTxi+b∣
其中 ∥w∥\|w\|∥w∥ 是权重向量 www 的 L2L^2L2 范数(模长)。
对于任意样本点 (xi,yi)(x_i, y_i)(xi,yi),判断其是否被误分类:
- 若分类正确:yiy_iyi 与 (wTxi+b)(w^T x_i + b)(wTxi+b) 同号,即 yi(wTxi+b)>0y_i (w^T x_i + b) > 0yi(wTxi+b)>0
- 若分类错误:yiy_iyi 与 (wTxi+b)(w^T x_i + b)(wTxi+b) 异号,即 yi(wTxi+b)<0y_i (w^T x_i + b) < 0yi(wTxi+b)<0
注意:这里的 yiy_iyi 是样本的真实标签,取值为 {−1,+1}\{-1, +1\}{−1,+1}。
对于误分类点,由于 yiy_iyi 与 (wTxi+b)(w^T x_i + b)(wTxi+b) 异号,则有:
∣wTxi+b∣=−yi(wTxi+b) |w^T x_i + b| = -y_i (w^T x_i + b) ∣wTxi+b∣=−yi(wTxi+b)
因此误分类点的距离可写为:
di=−yi(wTxi+b)∥w∥ d_i = \frac{-y_i (w^T x_i + b)}{\|w\|} di=∥w∥−yi(wTxi+b)
将所有误分类点的距离相加得到总距离:
d=∑xi∈M−yi(wTxi+b)∥w∥ d = \sum_{x_i \in M} \frac{-y_i (w^T x_i + b)}{\|w\|} d=xi∈M∑∥w∥−yi(wTxi+b)
由于 ∥w∥\|w\|∥w∥ 不影响优化方向(仅为缩放因子),可将其省略,得到简化后的损失函数:
L(w,b)=∑xi∈M−yi(wTxi+b) L(w, b) = \sum_{x_i \in M} -y_i (w^T x_i + b) L(w,b)=xi∈M∑−yi(wTxi+b)
现在我们有了损失函数,如何求得最佳的权重 www 和偏置 bbb 呢?
我们可以使用随机梯度下降法:随机选择一个误分类点 (xi,yi)(x_i, y_i)(xi,yi),对 www 和 bbb 分别求偏导:
∇wLi=−yixi \nabla_w L_i = -y_i x_i ∇wLi=−yixi
∇bLi=−yi \nabla_b L_i = -y_i ∇bLi=−yi
沿负梯度方向调整参数,步长为 α\alphaα:
w←w−α∇wLi=w+αyixi w \leftarrow w - \alpha \nabla_w L_i = w + \alpha y_i x_i w←w−α∇wLi=w+αyixi
b←b−α∇bLi=b+αyi b \leftarrow b - \alpha \nabla_b L_i = b + \alpha y_i b←b−α∇bLi=b+αyi
通过迭代,使损失函数不断减小,最终求得最佳的权重和偏置。
多层感知机
将大量神经元模型以不同方式连接,并作用在不同的激活函数上,就构成了人工神经网络模型。
多层感知机一般指全连接的两层神经网络模型,其结构如下图所示:
该感知机具有两层神经元结构:三个输入、两个输出。包含2个权重矩阵和2个偏置矩阵,激活函数为 GGG。
- 输入层 → 隐层:权重矩阵 W(1)W^{(1)}W(1) 有 3×2=63 \times 2 = 63×2=6 个变量;偏置矩阵 b(1)b^{(1)}b(1) 有 222 个变量。第一层总共 888 个变量,输出为 h=G(W(1)Tx+b(1))h = G(W^{(1)T} x + b^{(1)})h=G(W(1)Tx+b(1))。
- 隐层 → 输出层:权重矩阵 W(2)W^{(2)}W(2) 有 2×2=42 \times 2 = 42×2=4 个变量;偏置矩阵 b(2)b^{(2)}b(2) 有 222 个变量。第二层总共 666 个变量,输出为 y^=G(W(2)Th+b(2))\hat{y} = G(W^{(2)T} h + b^{(2)})y^=G(W(2)Th+b(2))。
例题
一个含有2个隐层的BP神经网络,每个隐层神经元个数均为20,输入和输出节点分别有8和5个节点。问:这个网络的权重和偏置数分别是多少?
解
- 权重数 = 前一层结点数 × 当前层结点数
权重数 = 8×20+20×20+20×5=6608 \times 20 + 20 \times 20 + 20 \times 5 = 6608×20+20×20+20×5=660 - 偏置数 = 除输入层外,每层的结点数之和
偏置数 = 20+20+5=4520 + 20 + 5 = 4520+20+5=45
浅层神经网络
只有一个隐层的多层感知机是最经典的浅层神经网络。它具有训练数据量小、训练速度快的特点,理论上可以逼近任意连续函数,但在表示复杂函数时能力有限。
多层神经网络(深度学习)
随着计算机硬件计算能力的提升,神经网络的层数不断增加。
随着网络层数的增加,每一层对前一层的表示更加抽象。每一层神经元学习到的是前一层特征的更高阶抽象,通过抽取更抽象的特征来区分事物,从而获得更好的分类能力。
神经网络的训练
为了使模型的输出值尽可能接近真实值,需要不断调整参数,这一过程称为模型训练。
正向传播和反向传播
- 正向传播:根据输入数据,经过权重计算和激活函数,逐层计算出隐层特征,将输入的低级特征逐步提取为抽象特征,最终得到输出结果。
- 反向传播:根据正向传播的结果和期望值计算损失函数,通过链式求导从输出层向输入层反向传播误差,并更新权重以减小输出与期望值的差距。
链式求导:复合函数的导数等于外函数在内函数值处的导数乘以内函数的导数。
若 h(x)=f(g(x))h(x) = f(g(x))h(x)=f(g(x)),则 h′(x)=f′(g(x))g′(x)h'(x) = f'(g(x)) g'(x)h′(x)=f′(g(x))g′(x)。
我们以两层神经网络为例:
已知条件:
- 输入层:x=[x1,x2,x3]Tx = [x_1, x_2, x_3]^Tx=[x1,x2,x3]T
- 权重:
W(1)=(W1,1(1)W1,2(1)W1,3(1)W2,1(1)W2,2(1)W2,3(1)W3,1(1)W3,2(1)W3,3(1)),W(2)=(W1,1(2)W1,2(2)W2,1(2)W2,2(2)W3,1(2)W3,2(2)) W^{(1)} = \begin{pmatrix} W_{1,1}^{(1)} & W_{1,2}^{(1)} & W_{1,3}^{(1)} \\ W_{2,1}^{(1)} & W_{2,2}^{(1)} & W_{2,3}^{(1)} \\ W_{3,1}^{(1)} & W_{3,2}^{(1)} & W_{3,3}^{(1)} \end{pmatrix}, \quad W^{(2)} = \begin{pmatrix} W_{1,1}^{(2)} & W_{1,2}^{(2)} \\ W_{2,1}^{(2)} & W_{2,2}^{(2)} \\ W_{3,1}^{(2)} & W_{3,2}^{(2)} \end{pmatrix} W(1)= W1,1(1)W2,1(1)W3,1(1)W1,2(1)W2,2(1)W3,2(1)W1,3(1)W2,3(1)W3,3(1) ,W(2)= W1,1(2)W2,1(2)W3,1(2)W1,2(2)W2,2(2)W3,2(2) - 隐层:h=[h1,h2,h3]Th = [h_1, h_2, h_3]^Th=[h1,h2,h3]T
- 输出层:y^1,y^2\hat{y}_1, \hat{y}_2y^1,y^2
- 偏置:b(1),b(2)b^{(1)}, b^{(2)}b(1),b(2)
正向传播:从输入层到隐层,再到输出层。基本操作为矩阵乘法、向量加法,最后送入激活函数。本例选用 Sigmoid 函数作为激活函数。
-
输入层 → 隐层:
v=W(1)x+b(1)=(W1,1(1)W1,2(1)W1,3(1)W2,1(1)W2,2(1)W2,3(1)W3,1(1)W3,2(1)W3,3(1))×(x1x2x3)+b(1) v = W^{(1)} x + b^{(1)} = \begin{pmatrix} W_{1,1}^{(1)} & W_{1,2}^{(1)} & W_{1,3}^{(1)} \\ W_{2,1}^{(1)} & W_{2,2}^{(1)} & W_{2,3}^{(1)} \\ W_{3,1}^{(1)} & W_{3,2}^{(1)} & W_{3,3}^{(1)} \end{pmatrix}× \begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix}+b^{(1)} v=W(1)x+b(1)= W1,1(1)W2,1(1)W3,1(1)W1,2(1)W2,2(1)W3,2(1)W1,3(1)W2,3(1)W3,3(1) × x1x2x3 +b(1)h=σ(v)=11+e−v h = \sigma(v) = \frac{1}{1 + e^{-v}} h=σ(v)=1+e−v1
-
隐层 → 输出层:
z=W(2)h+b(2)=(W1,1(2)W1,2(2)W2,1(2)W2,2(2)W3,1(2)W3,2(2))×(h1h2h3)+b(2) z = W^{(2)} h + b^{(2)} = \begin{pmatrix} W_{1,1}^{(2)} & W_{1,2}^{(2)} \\ W_{2,1}^{(2)} & W_{2,2}^{(2)} \\ W_{3,1}^{(2)} & W_{3,2}^{(2)} \end{pmatrix}× \begin{pmatrix} h_1 \\ h_2 \\ h_3 \end{pmatrix}+ b^{(2)} z=W(2)h+b(2)= W1,1(2)W2,1(2)W3,1(2)W1,2(2)W2,2(2)W3,2(2) × h1h2h3 +b(2)y^=σ(z)=11+e−z \hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}} y^=σ(z)=1+e−z1
举例:
假定输入数据x1=0.02、x2=0.04、x3=0.01x_1=0.02、x_2=0.04、x_3=0.01x1=0.02、x2=0.04、x3=0.01
固定偏置b(1)=[0.4,0.4,0.4]、b(2)=[0.7,0.7]b^{(1)}=[0.4,0.4,0.4]、b^{(2)}=[0.7,0.7]b(1)=[0.4,0.4,0.4]、b(2)=[0.7,0.7]
期望输出y1=0.9、y2=0.5{y_1}=0.9、{y_2}=0.5y1=0.9、y2=0.5
实际输出:y1^、y2^\hat{y_1}、\hat{y_2}y1^、y2^
未知权重W(1)、W(2)W^{(1)}、 W^{(2)}W(1)、W(2)
解题:
我们初始化权重矩阵:
W(1)=(0.250.150.300.250.200.350.100.250.15)W(2)=(0.400.250.350.300.010.35)W^{(1)} = \begin{pmatrix} 0.25 & 0.15 & 0.30 \\ 0.25 & 0.20 & 0.35 \\ 0.10 & 0.25 & 0.15 \end{pmatrix} W^{(2)} = \begin{pmatrix} 0.40 & 0.25 \\ 0.35 & 0.30 \\ 0.01 & 0.35 \end{pmatrix}W(1)=
0.250.250.100.150.200.250.300.350.15
W(2)=
0.400.350.010.250.300.35
输出到隐层计算:
v=W(1)x+b(1)=(0.250.150.300.250.200.350.100.250.15)(0.020.040.01)+(0.40.40.4)=(0.4160.41350.4215)v = W^{(1)}{x} + {b}^{(1)} = \begin{pmatrix} 0.25 & 0.15 & 0.30 \\ 0.25 & 0.20 & 0.35 \\ 0.10 & 0.25 & 0.15 \end{pmatrix} \begin{pmatrix} 0.02 \\ 0.04 \\ 0.01 \end{pmatrix}+ \begin{pmatrix} 0.4 \\ 0.4 \\ 0.4 \end{pmatrix}= \begin{pmatrix} 0.416 \\ 0.4135 \\ 0.4215 \end{pmatrix} v=W(1)x+b(1)=
0.250.250.100.150.200.250.300.350.15
0.020.040.01
+
0.40.40.4
=
0.4160.41350.4215
h=Sigmoid(v)=11+e−v=(11+e−0.41611+e−0.413511+e−0.4215)=(0.60250.60190.6038){h} = Sigmoid(v)=\frac{1}{1+e^{-v}} = \begin{pmatrix} \dfrac{1}{1+e^{-0.416}} \\[8pt] \dfrac{1}{1+e^{-0.4135}} \\[8pt] \dfrac{1}{1+e^{-0.4215}} \end{pmatrix} = \begin{pmatrix} 0.6025 \\ 0.6019 \\ 0.6038 \end{pmatrix}h=Sigmoid(v)=1+e−v1= 1+e−0.41611+e−0.413511+e−0.42151 = 0.60250.60190.6038
隐层到输出层计算:
z=W(2)h+b(2)=(0.400.350.010.250.300.35)(0.60250.60190.6038)+(0.70.7)=(1.15771.2425){z} = W^{(2)}{h} + {b}^{(2)} = \begin{pmatrix} 0.40 & 0.35 & 0.01 \\ 0.25 & 0.30 & 0.35 \end{pmatrix} \begin{pmatrix} 0.6025 \\ 0.6019 \\ 0.6038 \end{pmatrix} + \begin{pmatrix} 0.7 \\ 0.7 \end{pmatrix} = \begin{pmatrix} 1.1577 \\ 1.2425 \end{pmatrix}z=W(2)h+b(2)=(0.400.250.350.300.010.35)
0.60250.60190.6038
+(0.70.7)=(1.15771.2425)
y^=Sigmoid(z)=11+e−z=(11+e−1.157711+e−1.2425)=(0.76090.7760)\hat{y} = Sigmoid(z)=\frac{1}{1+e^{-z}}= \begin{pmatrix} \dfrac{1}{1+e^{-1.1577}} \\[8pt] \dfrac{1}{1+e^{-1.2425}} \end{pmatrix} = \begin{pmatrix} 0.7609 \\ 0.7760 \end{pmatrix}y^=Sigmoid(z)=1+e−z1= 1+e−1.157711+e−1.24251 =(0.76090.7760)
计算误差:
L(W)=12[(y^1−y1)2+(y^2−y2)2]=12[(0.7609−0.9)2+(0.7760−0.5)2]=0.0478\begin{align} L(\mathbf{W}) &= \frac{1}{2}\left[ (\hat{y}_1 - y_1)^2 + (\hat{y}_2 - y_2)^2 \right] \\ &= \frac{1}{2}\left[ (0.7609 - 0.9)^2 + (0.7760 - 0.5)^2 \right] \\ &= 0.0478 \end{align}L(W)=21[(y^1−y1)2+(y^2−y2)2]=21[(0.7609−0.9)2+(0.7760−0.5)2]=0.0478
此代数式就是该神经网络的损失函数
好了,我们现在通过正向传播计算出了输出值,但是和预期值仍有误差,那么怎么进行修正呢?
反向传播:
损失函数为:L(W)=12(y1^−y1)2+12(y2^−y2)2L({W}) = \frac{1}{2}(\hat{y_1} - y_1)^2 + \frac{1}{2}(\hat{y_2} - y_2)^2L(W)=21(y1^−y1)2+21(y2^−y2)2
我们以w2,1(2)w_{2,1}^{(2)}w2,1(2)参数为例子,计算其对整体误差的影响有多大,可以使用误差函数对www参数求偏导,根据链式法则:
∂L(W)∂w2,1(2)=∂L(W)∂y1^⋅∂y1^∂z1⋅∂z1∂w2,1(2)\frac{\partial L({W})}{\partial w_{2,1}^{(2)}} = \frac{\partial L({W})}{\partial \hat{y_1}} \cdot \frac{\partial \hat{y_1}}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_{2,1}^{(2)}}∂w2,1(2)∂L(W)=∂y1^∂L(W)⋅∂z1∂y1^⋅∂w2,1(2)∂z1
这里可以根据上图各元素之间的代数关系来确认偏导关系式
计算各偏导值:
∂L(W)∂y1^=−(y1−y1^)=0.9−0.7609=−0.1391\frac{\partial L(W)}{\partial \hat{y_1}} = -(y_1 - \hat{y_1}) = 0.9 - 0.7609 = -0.1391∂y1^∂L(W)=−(y1−y1^)=0.9−0.7609=−0.1391
∂y1^∂z1=y1^(1−y1^)=0.7609×(1−0.7609)=0.1819\frac{\partial \hat{y_1}}{\partial z_1} = \hat{y_1}(1 - \hat{y_1}) = 0.7609 \times (1 - 0.7609) = 0.1819∂z1∂y1^=y1^(1−y1^)=0.7609×(1−0.7609)=0.1819
∂z1∂w1,2(2)=h2=0.6019\frac{\partial z_1}{\partial w_{1,2}^{(2)}} = h_2 = 0.6019∂w1,2(2)∂z1=h2=0.6019
最终结果:
∂L(W)∂w1,2(2)=−0.1391×0.1819×0.6019=−0.0152\frac{\partial L(W)}{\partial w_{1,2}^{(2)}} = -0.1391 \times 0.1819 \times 0.6019 = -0.0152∂w1,2(2)∂L(W)=−0.1391×0.1819×0.6019=−0.0152
调整权重值:
w←w−α∂L(W)∂w1,2(2)w \leftarrow w - α\frac{\partial L(W)}{\partial w_{1,2}^{(2)}}w←w−α∂w1,2(2)∂L(W)
我们假设步长为α=1,则:
w=0.35−(−0.0152)=0.3652w=0.35-(-0.0152)=0.3652w=0.35−(−0.0152)=0.3652
同理,计算过程相同,我们也可以计算重新其他权重值
- 反向传播的作用就是将神经网络的输出误差反向传播到神经网络的输入端,并以此来更新神经网络各个连接的权重
- 当第一次反向传播完成后,网络模型参数得到更新,进行下一轮正向传播后,可以再次反向传播调整参数,如此迭代训练,就能不断缩小和真实值之间的差距
神经网络设计原理
当神经网络训练完成后,若发现结果仍有较大偏差,可以考虑以下三种主要措施:
- 调整网络的拓扑结构
- 选择合适的激活函数
- 选择合适的损失函数
神经网络的拓扑结构
典型的神经网络结构为:输入层 → 隐层 → 输出层。
- 输入层的神经元个数 = 特征维度
- 输出层的神经元个数 = 分类类别数
给定训练样本后,输入层和输出层的节点数即可确定。隐层的数量和每层的神经元个数需要额外设计,这是影响神经网络拟合效果的重要因素。
隐层节点数的设计决定了神经网络的表达能力:
- 隐层节点数太少:网络从样本中获取信息的能力不足,无法充分反映数据集的规律。
- 隐层节点数太多:网络的拟合能力过强,可能过度拟合数据集中的噪声,导致泛化能力下降。
激活函数
在神经元中,加权求和后的数据会经过一个函数 GGG,称为激活函数。激活函数为神经元引入非线性因素,使得神经网络能够逼近任意非线性函数。
激活函数通常需要具备以下性质:
- 可微性:当使用基于梯度的优化方法时,函数必须处处可微(或至少几乎处处可微)。
- 输出范围的影响:激活函数输出值有限时,基于梯度的优化更加稳定,特征表示受有限权值的影响更显著;输出无限时,训练可能更高效,但需要更小的学习率以避免数值不稳定。
下面介绍几个常见的激活函数:
(1)阶跃函数
- 理想激活函数是阶跃函数 , 0表示抑制神经元而1表示激活神经元

(2).Sigmoid函数
- 数学表达式:sigmoid(x)=11+e−xsigmoid(x)=\frac{1}{1+e^{-x}}sigmoid(x)=1+e−x1
- 优点:是最常见的非线性激活函数;能够把连续实值变换成0和1之间的输出;如果是非常大的负数,那么就变为0;如果是非常大的正数,输出就变为1
- 缺点:
- 非零均值,输出值永远大于0,导致梯度更新方向单一;
- 计算机进行指数级运算,速度较慢;
- 在输入的绝对值大于某个阈值后,过快进入饱和状态(即函数值趋于1或者0,而不再有显著的变化),出现梯度消失情况,即梯度会趋于0,在实际模型训练中会导致模型收敛缓慢,性能不够理想
(3).Tanh函数
- 数学表达式:tanh(x)=2sigmoid(2x)−1=eαx−e−αxeαx+e−αxtanh(x)=2sigmoid(2x)-1=\frac{e^{\alpha{x}}-e^{-\alpha{x}}}{e^{\alpha{x}}+e^{-\alpha{x}}}tanh(x)=2sigmoid(2x)−1=eαx+e−αxeαx−e−αx
- Tanh函数图像与Sigmoid函数相似,但是输出的结果在(-1,+1)之间
- 优点:是0均值函数
- 缺点:在输入很大或是很小的时候,输出几乎平滑,梯度很小,不利于权重更新
(4).ReLU函数
- 数学表达式:f(xi)={0xi<0xixi≥0f(x_i)=\begin{cases}0&x_i<0\\x_i&x_i\geq0&\end{cases}f(xi)={0xixi<0xi≥0
- 优点:能够在x>0时保持梯度不衰减,从而缓解梯度消失问题
- 缺点:当输入是负数的时候,ReLU是完全不被激活的,如果学习率很大,反向传播后的参数可能为负数,导致下一轮正向传播的输入为负数,而一旦输入到了负数,ReLU就会死掉
(5).Leaky ReLU函数
- 数学表达式:f(xi)={axxi<0a∈(0,1)xixi≥0f(x_i)=\begin{cases}ax&x_i<0 &a∈(0,1)\\x_i&x_i\geq0&\end{cases}f(xi)={axxixi<0xi≥0a∈(0,1)
- 优点:负数区域内,Leaky ReLU有一个很小的斜率,可以避免ReLU死掉的问题
(6)ELU函数
- 数学表达式:f(xi)={a(ex−1)xi<0xixi≥0f(x_i)=\begin{cases}a(e^x-1)&x_i<0 \\x_i&x_i\geq0&\end{cases}f(xi)={a(ex−1)xixi<0xi≥0
- α是可调参数,控制着ELU在负值区间的饱和位置;ELU的输出均值接近于零,所以收敛速度更快
- 右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒,避免神经元死掉
鲁棒:Robust(英文音译),意思是稳健、强壮、抗干扰;一个"鲁棒"的系统/模型,在遇到意外情况、噪声、异常值或输入变化时,依然能保持稳定表现,不会崩溃
损失函数
损失函数:L=f(y^,y)L = f(\hat{y}, y)L=f(y^,y),y^\hat{y}y^是实际输出值,yyy是预测值,y^\hat{y}y^是实际输出值:y^=Hw(x)\hat{y}=H_w(x)y^=Hw(x),损失函数可以记为:L(w)=f(Hw(x),y)L(w)=f(H_w(x),y)L(w)=f(Hw(x),y)
常用的损失函数:均方损失函数和交叉熵损失函数
均方差损失函数:
是神经网络常用的损失函数,我们以单个神经元输出的均方差损失函数为例:
L(w)=12(y−y^)2L(w)=\frac{1}{2}{(y-\hat{y})^2}L(w)=21(y−y^)2
对其进行梯度下降计算,求其偏导:
∂L∂w=∂L∂y^⋅∂y^∂z⋅∂z∂w=−(y−y^)⋅sigmoid′(z)⋅x\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial w} = -(y - \hat{y}) \cdot sigmoid'(z) \cdot x∂w∂L=∂y^∂L⋅∂z∂y^⋅∂w∂z=−(y−y^)⋅sigmoid′(z)⋅x
∂L∂b=∂L∂y^⋅∂y^∂z⋅∂z∂b=−(y−y^)⋅sigmoid′(z)\frac{\partial L}{\partial b} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial b} = -(y - \hat{y}) \cdot sigmoid'(z)∂b∂L=∂y^∂L⋅∂z∂y^⋅∂b∂z=−(y−y^)⋅sigmoid′(z)
sigmoid′(z)=((1−y^)⋅y^)sigmoid'(z)=((1-\hat{y})\cdot \hat{y})sigmoid′(z)=((1−y^)⋅y^)
由于所有偏导式中均含有sigmoid′(z)sigmoid'(z)sigmoid′(z),当神经元输出接近1时,梯度将趋于0,出现梯度消失,导致神经网路反向传播时参数更新缓慢,学习效率从下降
为了解决这个问题,我们引入了交叉熵损失函数,下面来介绍交叉熵损失函数的,这方面涉及了信息论的相关知识,下面来逐步讲解推导
信息量:
- 信息是用来消除随机不确定性的东西,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度;
- 信息量的大小与信息发生的概率成反比,概率越大,信息量越小,概率越小,信息量越大。就比如"太阳东升西落"的信息量为0、"cncs赢得major冠军"的信息量很大
- 我们设某件事发生的概率为P(x)P(x)P(x),则其信息量表示为:I(x)=−log(p(x)) I(x)=-log(p(x))I(x)=−log(p(x))
信息熵:
- 对于一个随机变量XXX,我们用信息量来衡量单个事件发生的意外程度;为了衡量整个随机变量的平均不确定性,我们引出了信息量的数学期望,即信息熵,其数学表达式为:H(x)=E[I(x)]=−∑i=1np(xi)log2p(xi)H(x)=E[I(x)]=-\sum_{i=1}^{n}p(x_i)log_{2}p(x_i)H(x)=E[I(x)]=−i=1∑np(xi)log2p(xi)
相对熵(KL散度): - 对于同一个随机变量XXX有两个单独的概率分布P(x)P(x)P(x)和Q(x)Q(x)Q(x),我们使用相对熵来衡量两个概率分布之间的差异,其数学表达式为:DKL(p∣∣q)=∑i=1nP(xi)log(p(xi)q(xi))D_{KL}(p||q)=\sum_{i=1}^{n}P(x_i)log(\frac{p(x_i)}{q(x_i)})DKL(p∣∣q)=i=1∑nP(xi)log(q(xi)p(xi))
- 在机器学习中,我们常常使用P(x)P(x)P(x)表示样本的真实分布,Q(x)Q(x)Q(x)来表示模型所预测的分布,计算的交叉熵越小,说明P(x)P(x)P(x)与Q(x)Q(x)Q(x)的分布更加接近
相对熵的计算:在一个三分类任务中(例如,猫狗马分类器,分别代表猫,狗,马,例如一张猫的图片真实分布P(X)=[1,0,0], 预测分布Q(X)=[0.7,0.2,0.1],计算KL散度:DKL(p∣∣q)=∑i=1np(xi)log(p(xi)q(xi))=p(x1)logp(x1)q(x1)+p(x2)logp(x2)q(x2)+p(x3)logp(x3)q(x3)=1×log10.7=0.36\begin{align} D_{KL}(p||q) &= \sum_{i=1}^{n} p(x_i) \log\left(\frac{p(x_i)}{q(x_i)}\right) \\ &= p(x_1)\log\frac{p(x_1)}{q(x_1)} + p(x_2)\log\frac{p(x_2)}{q(x_2)} + p(x_3)\log\frac{p(x_3)}{q(x_3)} \\ &= 1 \times \log\frac{1}{0.7} \\ &= 0.36 \end{align}DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))=p(x1)logq(x1)p(x1)+p(x2)logq(x2)p(x2)+p(x3)logq(x3)p(x3)=1×log0.71=0.36
交叉熵:
我们将相对熵的数学式变换一下:DKL(p∣∣q)=∑i=1np(xi)log(p(xi)q(xi))=∑i=1np(xi)log(p(xi))−∑i=1np(xi)log(q(xi))=−H(p(x))+[−∑i=1np(xi)log(q(xi))]\begin{align} D_{KL}(p||q) &= \sum_{i=1}^{n} p(x_i) \log\left(\frac{p(x_i)}{q(x_i)}\right) \\ &= \sum_{i=1}^{n} p(x_i) \log\left({p(x_i)}\right)-\sum_{i=1}^{n} p(x_i) \log\left({q(x_i)}\right) \\ &=-H(p(x))+[-\sum_{i=1}^{n}p(x_i)log(q(x_i))] \end{align}DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))=i=1∑np(xi)log(p(xi))−i=1∑np(xi)log(q(xi))=−H(p(x))+[−i=1∑np(xi)log(q(xi))]
再变换一下,可以得到:−∑i=1np(xi)log(q(xi))]=DKL(p∣∣q)+H(p(x))-\sum_{i=1}^{n}p(x_i)log(q(x_i))]= D_{KL}(p||q)+H(p(x))−i=1∑np(xi)log(q(xi))]=DKL(p∣∣q)+H(p(x))
可以看到,式子的右半边是KL散度加上信息熵,而左半边我们称之为交叉熵,交叉熵等于KL散度加上一个信息熵常量;
在训练神经网络时,输入数据与标签就已经确定,那么真实概率分布P(x)P(x)P(x)也就以及确定,信息熵就是一个常量,所以我们常用交叉熵代表KL散度,用来表示真实概率分布和预测概率分布之间的差异,该值越小表示预测结果越好
好的,介绍完交叉熵,下面我们来研究其作为损失函数的作用:
对于单个样本,其交叉熵损失函数为:L=−∑k=1Kyklog(yk^)L=-\sum_{k=1}^Ky_klog(\hat{y_k})L=−k=1∑Kyklog(yk^)
其中,k为该样本的类别数,yky_kyk为其标签值,y^\hat{y}y^为模型预测值
对于多个样本,其交叉熵损失函数为:
L=−1m∑i=1m∑k=1Kyi,kln(y^i,k)L = -\frac{1}{m} \sum_{i=1}^{m} \sum_{k=1}^{K} y_{i,k} \ln(\hat{y}_{i,k})L=−m1i=1∑mk=1∑Kyi,kln(y^i,k)
其中,m为训练样本的总数量,k为类别数,i为每个样本,yi,ky_{i,k}yi,k为第i个样本类别为k的标签值,yi,k^\hat{y_{i,k}}yi,k^为第i个样本类别为k的模型预测值
在神经网络的训练中,二分类(是或不是)问题更加常见,我们也常使用二分类交叉熵损失函数,其数学表达式为:
L=−1m∑i=1m[yiln(y^i)+(1−yi)ln(1−y^i)]L = -\frac{1}{m}\sum_{i=1}^{m}[y_i\ln(\hat{y}_i) + (1-y_i)\ln(1-\hat{y}_i)]L=−m1i=1∑m[yiln(y^i)+(1−yi)ln(1−y^i)]
回到前面,我们使用使用二分类交叉熵损失函数,结合sigmoid求梯度:
∂L∂w=∂L∂y^⋅∂y^∂z⋅∂z∂w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial w}∂w∂L=∂y^∂L⋅∂z∂y^⋅∂w∂z
∂L∂y^=−1m∑i=1m∂∂y^[yln(y^)+(1−y)ln(1−y^)]=1m∑i=1my^−yy^(1−y^)\frac{\partial L}{\partial \hat{y}} =-\frac{1}{m} \sum_{i=1}^{m}\frac{\partial }{\partial \hat{y}} \left[ y \ln(\hat{y}) + (1 - y) \ln(1 - \hat{y}) \right]=\frac{1}{m}\sum_{i=1}^{m}\frac{\hat{y}-{y}}{\hat{y}({1-{\hat{y}})}}∂y^∂L=−m1i=1∑m∂y^∂[yln(y^)+(1−y)ln(1−y^)]=m1i=1∑my^(1−y^)y^−y
∂yk^∂z=y^(1−y^)\frac{\partial \hat{y_k}}{\partial z}={\hat{y}}(1-{\hat{y}})∂z∂yk^=y^(1−y^)
∂z∂w=x\frac{\partial z}{\partial w}=x∂w∂z=x
消去分子分母,我们得到:
∂L∂w=−1m∑i=1m(y^−y)⋅x\frac{\partial L}{\partial w} = -\frac{1}{m}\sum_{i=1}^{m}({\hat{y}-{y}}) \cdot x∂w∂L=−m1i=1∑m(y^−y)⋅x
同理:
∂L∂b=−1m∑i=1m(y^−y)\frac{\partial L}{\partial b} =-\frac{1}{m}\sum_{i=1}^{m}({\hat{y}-{y}})∂b∂L=−m1i=1∑m(y^−y)
可以看到,sigmoid函数的导数被约掉了,避免了过饱和问题;交叉熵损失+Sigmoid激活函数可以解决输出层神经元学习率缓慢的问题
神经网络中损失函数的特性
- 同一个算法的损失函数不是唯一的
- 损失函数是参数(w,b)(w,b)(w,b)的函数
- 损失函数可以评价网络模型的好坏,损失函数越小说明模型和参数越符合训练样本
- 损失函数只是一个标量,不是向量
- 选择损失函数时,挑选对参数(w,b)(w,b)(w,b)可微的函数
- 损失函数又称为代价函数、目标函数
过拟合和正则化
用于就机器学习训练的数据集,一般分为两个部分——训练集和测试集;
机器学习不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好,因为模型最终是要部署到没有见过训练数据的真实场景;
提升模型在测试集上的预测效果叫做泛化
过拟合
随着神经网络规模不断增大,隐层数量不断增加,参数跟着增加,表示能力大幅增强,可能会导致一个问题:过拟合导致的泛化能力差
欠拟合:训练考虑的维度太少,拟合函数无法满足训练集,误差较大
过拟合:指模型过度接近训练的数据,导致模型的泛化能力不足;具体表现为在训练数据集上测试的误差很低,但在验证数据集上的误差很大
解决的办法:正则化,常见的正则化的方法有:参数范数惩罚、稀疏化、Bagging集成、Dropout、提前终止、数据集扩增,下面逐个介绍
正则化

如图,假设训练集中的m个数据分布满足某个多项式分布;
我们使用均方损失函数作为损失函数,为使损失最小,则有:L(w)=minw12m∑i=1m∥yi−y^i∥2L(w)=\min\limits_{w} \frac{1}{2m} \sum_{i=1}^{m} \|y_i - \hat{y}_i\|^2L(w)=wmin2m1i=1∑m∥yi−y^i∥2
若拟合效果较好,则拟合函数为:L1(w)=w0+w1x+w2x2L_1(w)=w_0+w_1{x}+w_2{x^2}L1(w)=w0+w1x+w2x2
而过拟合函数为:L2(w)=w0+w1x+w2x2+w3x3+w4x4L_2(w)=w_0+w_1{x}+w_2{x^2}+w_3{x^3}+w_4{x^4}L2(w)=w0+w1x+w2x2+w3x3+w4x4
为了使损失函数最小,拟合函数参数过于复杂,尽管对拟合效果更好,但是也丧失了对测试集的泛化能力;为了解决这个问题,我们需要引入惩罚项,使多余参数尽可能小
正则化就是在损失函数中增加一个惩罚项,惩罚高阶参数,使其趋近于0;
正则化过程仅对权重www进行惩罚,正则化项记为:Ω(w)Ω(w)Ω(w),正则化后的损失函数记为:L~(w)=L(w)+λΩ(w)\tilde{L}({w}) = L({w}) + \lambda \Omega({w})L~(w)=L(w)+λΩ(w)
L2正则化
L2L^2L2的正则化项为Ω(w)=12∣∣w∣∣22=12∑jwj2\Omega (w)=\frac{1}{2}||w||^2_2=\frac{1}{2}\sum_j{w_j^2}Ω(w)=21∣∣w∣∣22=21∑jwj2,损失函数为:L~(w)=L(w)+λ2∣∣w∣∣22\tilde{L}(w) = L({w}) + \frac{\lambda}{2}||w||^2_2L~(w)=L(w)+2λ∣∣w∣∣22
求偏导,有:L~(w)∂wj=L(w)∂wj+λw\frac{\tilde{L}(w)}{\partial w_j} = \frac{{L}(w)}{\partial w_j} + \lambda w∂wjL~(w)=∂wjL(w)+λw
权重沿梯度方向更新:wj←wj−η(∂L(w)∂wj+λ(wj))w_j \leftarrow w_j - \eta \left( \frac{\partial L(w)}{\partial w_j} + \lambda (w_j) \right)wj←wj−η(∂wj∂L(w)+λ(wj))通过L2L^2L2正则化后,w权重值变小,网络的复杂度降低,对数据拟合的也更好
L1正则化
L1L^1L1正则化项是各个权重的绝对值之和,即ΩL1(w)=∣∣w∣∣1=∑j∣wj∣\Omega_{L1}(w)=||w||_1=\sum_j|w_j|ΩL1(w)=∣∣w∣∣1=∑j∣wj∣,则损失函数为:L~(w)=L(w)+λ∣∣w∣∣1\tilde{L}(w) = L({w}) + \lambda||w||_1L~(w)=L(w)+λ∣∣w∣∣1
对其中一个权重wjw_jwj求偏导,有:L~(w)∂wj=L(w)∂wj+λ∣∣w∣∣1∂wj\frac{\tilde{L}(w)}{\partial w_j} = \frac{{L}(w)}{\partial w_j} + \frac{\lambda||w||_1}{\partial w_j}∂wjL~(w)=∂wjL(w)+∂wjλ∣∣w∣∣1
其中对于正则化项求偏导的结果如下:注意在零点处不可导,需要使用次梯度∂∣∣w∣∣1∂wj={+1,wj>0−1,wj<0次梯度∈[−1,1],wj=0\frac{\partial||w||_1}{\partial w_j} = \begin{cases} +1, & w_j > 0 \\ -1, & w_j < 0 \\ 次梯度∈[-1, 1], & w_j = 0 \end{cases}∂wj∂∣∣w∣∣1=⎩
⎨
⎧+1,−1,次梯度∈[−1,1],wj>0wj<0wj=0
简记为符号函数:∂∣∣w∣∣1∂wj=sign(wj)\frac{\partial||w||_1}{\partial w_j}=sign(w_j)∂wj∂∣∣w∣∣1=sign(wj)
沿梯度下降更新权重值,我们设步长(学习率)为η\etaη:wj←wj−η(∂L(w)∂wj+λ⋅sign(wj))w_j \leftarrow w_j - \eta \left( \frac{\partial L(w)}{\partial w_j} + \lambda \cdot \operatorname{sign}(w_j) \right)wj←wj−η(∂wj∂L(w)+λ⋅sign(wj))
L1L^1L1正则化通过加入一个符号函数,使得当wiw_iwi为正时,更新后的wiw_iwi变小,当wiw_iwi为负时,更新后的wiw_iwi变大,因此正则化后的效果就是让wiw_iwi接近0,这样网络中的权重就会接近0,从而也就减小了网络复杂度,防止了过拟合
Bagging集成方法
Bagging集成方法是一种并行式集成学习方法,核心思想是:通过构建多个独立模型,再平均/投票它们的预测结果,从而降低方差,提升泛化能力
Bagging的数据集从原始数据集中重复采样获取,数据集大小与原始数据集保持一致,Bagging可以多次重复使用同一个模型、训练算法和目标函数进行训练

Dropout正则化
L2L^2L2 和 L1L^1L1正则化是通过在目标函数中增加一项惩罚项,Dropout正则化是通过在训练时暂时修改神经网络来实现的,在训练的过程中,随机删除一些隐层单元,在计算时暂时无视
设置掩码向量μ进行采样,μ的每一项分别对应一个输入或隐层节点。输入单元的采样概率为0.8,隐藏单元的采样概率为0.5;网络中的每个单元乘以相应的掩码后沿着网络的其余部分继续向前传播,这样就能实现随机删除的功能
其他正则化方法
- 提前终止:在训练过程中一旦测试误差不再降低且达到预定的迭代次数,就可以终止,这种策略称之为提前终止
- 多任务学习:合并多个相关任务的同时学习来减少神经网络的泛化误差
- 数据集增强:使用更多的数据进行训练,可对原数据集进行变换形成新数据集添加到训练数据中
- 参数共享:强迫两个模型(监督模式下的训练模型和无监督模式下的训练模型)的某些参数相等,使其共享唯一的一组参数
- 稀疏表示:惩罚神经网络中的激活单元,稀疏化激活单元
交叉验证
数据集的划分
最简单的划分方式:直接划分为训练集和测试集两部分
缺点:最终模型与参数的选取将极大程度依赖于对训练集和测试集的划分方法
交叉验证的方式给每个样本作为测试集和训练集的机会,充分利用样本信息,保证了鲁棒性,防止过度拟合
Leave-one-out cross-validation
每次取出一个数据作为测试集的唯一元素,而其他n-1个数据都作为训练集用于训练模型和调参;最终训练出n个模型,得到n个MSE;将这n个MSE取平均得到最终的test MSE
缺点:计算量过大,耗费时间长
K-折交叉验证
将数据集分为n份计算量较大,我们可以分为K份(份数较小),不重复地每次取其中一份做测试集,用其他K-1份做训练集训练模型,之后计算该模型在测试集上的MSE,最后再将K次的MSE取平均得到最后的MSE
三、深度学习
适用于图像处理的卷积神经网络

假设处理一张 32×3232 \times 3232×32 像素的图像。对于一个三层全连接神经网络,输入层的数据量为 32×32×3=307232 \times 32 \times 3 = 307232×32×3=3072(三个通道对应 RGB 值)。若隐层神经元个数为 100,则第一层的权重数量为 3072×100=307,2003072 \times 100 = 307,2003072×100=307,200。
实际场景中,图像尺寸更大、网络结构更深,权重数量过多容易导致过拟合。为此,我们采用卷积神经网络结构,它能有效减少权重数量、支持深层网络、处理复杂数据。
卷积神经网络(CNN)
| 全连接 | 卷积 | |
|---|---|---|
| 局部链接 | ![[Pasted image 20251211085424.png|275]] | ![[Pasted image 20251211085431.png|275]] |
| 权重共享 | 所有神经元之间的连接使用不同的权值 | 输出层神经元共享同一组权重,进一步减少权重数量 |
| 权重数量 | wi×hi×wj×hjw_i \times h_i \times w_j \times h_jwi×hi×wj×hj | f×ff \times ff×f |
CNN 组成
VGG16 结构
- 13 个卷积层(conv)
- 3 个全连接层(FC)
- 5 个池化层(max pool)
- Softmax 分类层
其中,卷积层和全连接层具有可学习的权重系数,称为权重层,总数为 13+3=1613 + 3 = 1613+3=16。池化层不涉及权重,不计入层数。
卷积层和池化层交替出现,使得特征图尺寸逐渐减小,通道数逐渐增加。
卷积层
卷积神经网络的核心特征:局部连接、权重共享。
卷积运算可有效减少权重数量、避免过拟合,下面来看看卷积运算是怎么实现的
数学表达式(*为卷积运算):x(n)∗y(n)=s(n)=∑i=−∞∞x(i)y(i−1)x(n)*y(n)=s(n)=\sum_{i=-∞}^{∞}x(i)y(i-1)x(n)∗y(n)=s(n)=i=−∞∑∞x(i)y(i−1)
神经网络中权重的具体运算为:
我们称输入的数据为Image,与之进行卷积运算的称为卷积核(Filter),得到的结果称为特征图(Convolved Faeture)
卷积过程:filter与image对应位置相乘在累加得到的值填入Convolved Featured的对应位置,再选取image的下一个位置与卷积核进行运算,最后得到完整的特征图数据
多输入特征图单输出特征图卷积运算

多输入特征图多输出特征图卷积运算
使用不同的卷积核可以识别不同的特征并输出
卷积层如何检测特征
在神经网络的前几层,识别出物体最基础的部分,例如垂直还是水平的边缘;在之后的隐藏层慢慢可以识别出物体的部分,直到最后几层可以识别出完整的物体
检测垂直边缘:
假设数字10为边缘的特征值,数字0为图像特征值,卷积之后,就得到了特征图像
可以看到,图像中间是10,两边为0,就得到了边缘的特征图像
检测对角线边缘:
边界扩充(padding)
卷积操作有个副作用:每卷一次,图像就缩小一圈
对于一个卷积运算,我们假设input=4×4,filter=3×3,则卷积运算后得到的Convolved Feature=2×2
这样边界的像素只参与一次运算,信息利用率低,所以我们在原图上填充一个边界,就可以使边界像素利用率提高了
卷积步长(stride)
滑动卷积步长是滑动滤波器每次移动的像素点个数,它与input、filter、pad共同决定输出图像的尺寸
有以下数据:input=wi×hiinput=w_i×h_iinput=wi×hi、filter=f×ffilter=f×ffilter=f×f、pad=ppad=ppad=p、stride=sstride=sstride=s
求output=?
计算公式:output=[wi+2p−fs+1]×[hi+2p−fs+1]output=[\frac{w_i+2p-f}{s}+1]×[\frac{h_i+2p-f}{s}+1]output=[swi+2p−f+1]×[shi+2p−f+1]
偏置(bias)
输入数据卷积运算后,在与偏置进行运算后,就能得到输出数据
数据说明:
wi、hiw_i、h_iwi、hi是输入图像数据的宽和高,可以理解为长宽像素的个数,cic_ici是通道数,例如输入的数据是图像的RGB数值,那么通道数就是3
c0c_0c0是卷积核的数量,fff是卷积核的长和宽
池化层
在通过卷积获得了特征图 (features) 之后,下一步我们希望利用这些特征去做分类
理论上讲,可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战:对于一个96×96的图像,我们使用400个8×8的卷积核进行卷积后(pad=0,stride=1),得到output=(96−8+1)2×400=3168400output=(96-8+1)^2×400=3168400output=(96−8+1)2×400=3168400,数量级是百万级别的,计算量极大且极易过拟合
为了解决这个问题,我们之所以使用卷积后的特征就是因为图像具有静态性属性——在一个图像区域有用的特征极有可能在另一个区域同样适用。因此为了描述较大的图像。一个方法就是对不同位置的特征进行聚合统计。例如、人们可以计算图像一个区域上的某个特定特征的平均值,这种操作就叫做池化,有时称为平均池或最大池(取决于计算池化的方法)
池化的作用
- 主要用于特征降维,压缩数据
- 主动减小图片尺寸,从而减少参数的数量和计算量,控制过拟合
- 不引入额外参数
常用池化方法:Max pooling、Avg pooling、L2 pooling
Max pooling
最大池化就是取filter对应区域内最大像素值替代该像素点值,其作用是降维。在vgg16中,pooling采用的是2*2的最大池化方法,池化使用的池化窗口都是2*2大小,因此池化后得到的图像大小为原来的1/2
Max pooling可以保留特征的最大值,提高提取特征值的鲁棒性
全连接层(FC)
全连接的本质:将特征提取得到的高维特征图映射成一维特征向量,该特征向量包含所有特征信息,可转化为各个类别的概率;
在全连接层中的每一个节点都与上一层每个节点连接,把前一层的输出特征都综合起来;因为把所有的局部特征连接起来,所以叫全连接
vgg16中,有三个全连接层——2个FC4096、1个FC 1000;FC-4096指的是全连接层中有4096个节点,同样地,FC-1000为该层全连接层有1000个节点
全连接层的连接:
1.特征图和全连接层的相连——如何将如何将7*7*512的特征图全连接向下一层的4096个神经元?
全连接层可以视作一种特殊的卷积,这个过程可以看作:有4096个7*7*512的卷积核和7*7*512的特征图进行卷积操作,最终得到1*1*4096的特征图,即全连接后得到4096个神经元
2.全连接层和全连接层相连——为什么需要多层的4096个神经元进行全连接呢?
只用一层FC有时候没法解决非线性问题,而如果有两层或以上FC就可以很好地解决非线性问题了
Softmax 层
又称softmax指数函数,起分类器作用
如果将max看成一个分类问题,就是非黑即白,最后的输出是一个确定的变量。更多的时候,我们希望输出的是取到某个分类的概率,或者说,我们希望分值大的那一项被经常取到,而分值较小的那一项也有一定的概率偶尔被取到,所以我们就应用到了soft的概念,即最后的输出是每个分类被取到的概率
softmax通常作为网络的最后一层,对输出进行归一化,输出分类概率;需要凸显出最大的值,并抑制远低于最大值的其他分量
softmax层输入、输出数据规模相同
数学定义上,softmax是多分类的概率转换器,能够把任意实数向量转换成概率分布,概率的和为1,我们给定向量Z={z1、z2、z3……zk},其运算式为:
softmax(zi)=ezi∑j=1kezisoftmax(z_i)=\frac{e^{z_i}}{\sum_{j=1}^ke^{z_i}}softmax(zi)=∑j=1keziezi
神经网络分类任务的一般流程
- 神经网络通过前面的层(卷积层、全连接层等)提取特征,最后输出一个分数向量(logits),这个向量长度等于类别数;
- 然后,我们需要将这个分数向量转化为概率分布,使得每个类别的概率在0到1之间,并且所有类别的概率之和为1;
- 最后,我们根据概率分布选择概率最大的类别作为预测结果。
Softmax层就是完成第二步的一种方式。它与“普通分类”的区别主要在于这个转化过程,Softmax把"谁得分最高"变成了"每个选项的可能性有多大",让分类结果更加透明和可信
| 特性 | 普通分类 | softmax分类 |
|---|---|---|
| 输出意义 | 原始分数 | 概率值 |
| 输出范围 | 任意实数 | 0到 1 |
| 总和 | 不固定 | 总是1 |
| 可解释性 | 较差 | 很好 |
| 置信度 | 无法直接获得 | 直接可得 |
vgg16流程总览

即使只有一层隐层,只要有足够的神经元,神经网络理论上可以拟合任意连续函数。为什么还要使用深层网络结构?
1.深度网络可从局部到整体“理解图像”
2.深度网络可减少权重数量
基于CNN的图像分类算法
AlexNet
AlexNet的几个成功的点:
- ReLu函数:训练中收敛速度更快,提高训练速度
- LRN局部归一化:提升较大响应
- MaxPool:避免特征被平均池化模糊,提升特征鲁棒性
- Dropout:随机舍弃部分隐层结点,避免过拟合
ReLu函数
标准神经元一般使用tanh和sigmoid作为激活函数,但是在输入值较为极端时,会出现饱和性以及梯度消失问题,训练效果下降;ReLu函数在X>0时,梯度不变,从而避免梯度消失问题
可以看到函数收敛速度的明显差距
LRN算法
tanh和sigmoid这些传统的激活函数的值域都是有范围的,但是ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化,计算公式:
bx,yi=ax,yi(k+α∑j=max(0,i−n/2)min(N−1,i+n/2)(ax,yj)2)βb_{x,y}^i=\frac{a_{x,y}^i}{{(k+α∑_{j=max(0,i−n/2)}^{min(N−1,i+n/2)}(a_{x,y}^j)^2)}^β}bx,yi=(k+α∑j=max(0,i−n/2)min(N−1,i+n/2)(ax,yj)2)βax,yi
LRN就是把ReLU输出的结果和它周围一定范围的邻居做一个局部的归一化,假设有一个向量X={x1、x2、x3…xn},那么将所有的数归一化到0-1之间的归一化规则是:xi=xi−xminxmax−xix_i=\frac{x_i-x_{min}}{x_{max}-x_i}xi=xmax−xixi−xmin
LRN的核心效果: 如果一个像素点在其通道上和相邻通道上的值都很大,那么它的分母就会很大,从而使得归一化后的值“被抑制”。反之,如果一个值很大,但它的邻居都很小,那么它被抑制的程度就小,从而显得更加“突出”。这样就形成了一种竞争机制,局部响应归一化,让显著的特征更加显著
LRN被后来研究者发现无明显效果且不稳定,故现在很少使用,取而代之的是BN算法:不是在同一位置的不同通道间做归一化,而是在一个Batch内,对每个通道的所有激活值进行批归一化
Dropout
Dropout规则:
- 在模型训练过程中,以一定概率随机地舍弃某些隐层神经元。在反向传播更新权重时,不更新与该神经元相关的权重;
- 被舍弃神经元相关的权重得保留下来(只是暂时不更新),另一批样本输入时继续使用与该神经元相关的权重;
- 防止训练数据中复杂的共适应关系,抑制过拟合;
- Dropout也可以看成是一种模型组合,每个样本都是不一样的网络结构
VGG
卷积池:多层小卷积比单层大卷积效果好
一个5x5conv和两个3x3conv的感受野大小相同;每个卷积层加入ReLU,两层3x3conv 决策函数的区分能力更强
相同的感受野,使用的卷积核越小,多层网络权值更少,能减少过拟合
VGG成功的原因
- 更深的卷积神经网络,更多的卷积层和非线性激活函数,提升分类准确率
- 规则的多层小卷积替代大卷积,减少参数数量,提高训练收敛速度
- 部分网络层参数的预初始化,(VGG11的前4个卷积层和后3个全连接层的权重),提高训练收敛速度
Inception
Inception-v1
- 使用1×1 卷积降维,压缩通道数,大幅减少计算量和参数
- 多尺度并行:同时使用 1×1、3×3、5×5 卷积,适应不同大小目标
- 网络更深更宽,提升表达能力
- 输出层用 Softmax 做多分类
Inception-v2(BN-Inception)

- 学习VGG 用两个 3x3 卷积代替一个 5x5 卷积(网络整体深度增加了9层,缺点就是增加了25%的weights和30%的计算消耗
- 使用BN(BatchNorm)加速训练,并在每个卷积层之后、激活函数之前插入BN层
BatchNorm:批归一化
神经网络一旦训练起来,参数就要发生更新,除了输入层数据,后面每一层数据分布都是在变化的,网络中间层在训练过程中数据分布的改变称之为:Internal Covarirate Shift,BN层就是解决这个问题的
算法部分省略,来看作用:
- BN作为一种正则化技术,可以减少dropout层的使用;BN可替代 LRN / Dropout / L2 Normalization;
- 提高收敛速度、训练速度;
- 可选择更高的学习率、方便调参
Inception-v3
Inception-V3是在在v2的基础上,3×3 卷积分解为 1×3 + 3×1 非对称卷积,减少参数数量,同时通过非对称的卷积结构拆分增加特征多样性

Inception-v4
Inception v4中基本的Inception module还是沿袭了Inception-v2/v3的结构,只是结构看起来更加简洁统一;
注意:Inception v4没有使用残差学习的思想,Inception-Resnet-v1和Inception-Resnet-v2才是Inception module与残差学习的结合产物
2016 年论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》同时发布了:纯 Inception 结构(Inception-v4)不加残差也能极深(37层)且有效,性能优于v3,并探索 Inception + 残差(Inception-ResNet)的混合,效果比纯v4更好
Inception-ResNet
ResNet
残差的思想:此前的网络结构是对输入做一个非线性变换,而ResNet的思想是允许原始输入信息直接传到后面的层中,通过直接将输入信息绕道传到输出(恒等映射),保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度,引入残差后的映射对输出的变化更敏感。

普通网络:直接学习映射H(x)H(x)H(x)
残差网络:学习H(x)=F(x)+xH(x)=F(x)+xH(x)=F(x)+x ,让F(x)F(x)F(x)负责学残差(变化量)
例如:
假设输入 x=5 ,期望输出 H(x)=5.1
情况1:普通网络
目标:直接学 F′(5)=5.1
如果输出要涨到 5.2 ,F′ 从 5.1→5.2 ,变化率只有2%(0.1/5.1)
情况2:残差网络
目标:学 F(5)=0.1 (残差),然后 H(5)=5+0.1=5.1
如果输出要涨到 5.2 ,F 从 0.1→0.2 ,变化率高达100%(0.1/0.1)
为避免梯度消失,在每个卷积层之后、激活函数之前增加BN层
基于CNN的图像检测算法
图像检测算法的任务种类
- 分类,评价标准:精确率 (Precision)
- 定位+分类,评价标准:IoU(交并比)
- 物体检测,评价标准:mAP(Mean Average Percision)
两个重要的衡量标准
IoU:用于衡量定位准确度,一般IoU≥0.5可认为成功
mAP:Mean Average Percision——平均精度均值
- 在计算机视觉领域,用于衡量模型在测试集上检测精度的优劣程度;
- 综合考虑检测结果的召回率(查全率)和精度(查准率),mAP值越高表示检测结果越好;
选择的样本数N越多,召回率越高,查准率越低
目前:基于深度学习的目标检测算法大致分为两类:
- 两阶段算法(two-stage)算法:基于候选区域方法,先产生边界框,再做CNN分类(R-CNN系列)
- 一阶段系列(one-stage)算法:对输入图像直接处理,同时输出定位及其类别(YOLO系列)
R-CNN
R-CNN主要步骤
- 候选区提取:使用选择性搜索(Selective Search)从输入图片中提取2000个左右候选区域
- 特征提取:首先将所有候选区裁切成固定大小,再对每个候选区使用AlexNet(5 conv+2 FC)提取图像特征,也可以使用ResNet、VGG
- 线性分类:用特定类别的线性SVM对每个候选区域做分类
- 边界框回归:用线性回归修正边界框的位置与大小,其中每个类别单独训练一个边界框回归器
缺点:
- 重复计算
- SVM模型在标注数据足够的时候不是最好选择
- 多个步骤,中间需要保存大量数据
- 检测速度慢
对R-CNN的改进:
Fast-RCNN:
- 整图卷积特征图,减少重复计算问题
- ROI Pooling归一化,后连接全连接层
- 将边界框回归器放进网络一起训练
- 用softmax代替SVM分类器
Faster-RCNN:使用RPN(Region Proposal Network)替代 Selective Search
YOLO
YOLO算法开创了one-stage检测的先河,将目标分类和边界框定位用一个神经网络统一起来,合二为一,实现了端到端的目标检测。YOLO的运行速度非常快
统一检测算法流程:
- 网格划分 :把图像划分为 S×S 网格(S=7),每个格子负责预测落在它中心的物体。
- 每个格子的预测每个格子预测 B 个边界框(B=2)和 C 个类别概率(C=20 for VOC)
- 边界框:5 维 = (x,y,w,h,confidence)
- (x,y) :框中心相对于格子偏移(0~1)
- (w,h) :框宽高相对于整图(0~1)
- confidence:Pr(object)×IoU
- 类别概率:条件概率 P(classi∣object)
总输出维度:tensor的维度为:S×S×(B×5+C)=7×7×(2×5+20)=7×7×30
YOLO基于GooGleNet结构,使用的激活函数是Leaky ReLU:f(x)=max(x,0.1x)f(x)=max(x,0.1x)f(x)=max(x,0.1x)
SSD
基于YOLO直接回归bbox和分类概率的one-stage检测方法,结合Faster R-CNN中的anchor-box思想产生先验框,并且采用特征金字塔进行多尺度预测,在满足检测速度快的同时,大大提高了检测准确度
- 直接采用卷积来进行检测,不是像Yolo那样在全连接层之后做检测
- 多尺度特征图检测,在大的和小的特征图都提取anchor box用来做检测
- 设置先验框,每个单元设置尺度或者长宽比不同的先验框,预测的边界框是以这些先验框为基准的,在一定程度上减少训练难度
模型评估指标计算
精准度等指标的计算
这类题目通常给出一个“混淆矩阵(Confusion Matrix)”或者分类结果的统计数值,来计算模型的准确率等评判标准
分类预测的四种结果:
- TP:真正例,即模型预测是A,实际上确实是A
- FP:假正例,即模型预测是A,实际上确实不是A
- TN:正负例,即模型预测不是A,实际上确实不是A
- FN:假负例,即模型预测不是A,实际上确实是A
核心公式:
-
精确率 (Precision):你预测为正例的样本中,有多少是真的正例?
Precision=TPTP+FPPrecision = \frac{TP}{TP + FP}Precision=TP+FPTP -
召回率 (Recall):实际为正例的样本中,有多少被你预测出来了?
Recall=TPTP+FNRecall = \frac{TP}{TP + FN}Recall=TP+FNTP -
F1-Score:精确率和召回率的调和平均,用来综合评价
F1=2×Precision×RecallPrecision+RecallF1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}F1=2×Precision+RecallPrecision×Recall -
准确率 (Accuracy):所有预测中,预测正确的比例
Accuracy=TP+TNTP+TN+FP+FNAccuracy = \frac{TP + TN}{TP + TN + FP + FN}Accuracy=TP+TN+FP+FNTP+TN
例题
假设一个 CNN 缺陷检测模型,用于识别零件表面是否有“裂纹”
- 标签定义:1 代表有裂纹(正类),0代表无裂纹(负类)
- 判定标准:模型输出概率 ≥0.5\ge 0.5≥0.5 时,预测为1;否则预测为0
以下是测试集中 10 个样本的真实情况与模型输出:
| 样本编号 | 实际标签 | 模型输出概率 |
|---|---|---|
| 1 | 1 | 0.85 |
| 2 | 0 | 0.10 |
| 3 | 1 | 0.42 |
| 4 | 0 | 0.55 |
| 5 | 0 | 0.05 |
| 6 | 0 | 0.20 |
| 7 | 1 | 0.70 |
| 8 | 0 | 0.30 |
| 9 | 0 | 0.48 |
| 10 | 0 | 0.15 |
- 精确率 (Precision)是多少?
- 召回率 (Recall)是多少?
- 准确率 (Accuracy)是多少?
- 分析:如果这个场景是“安全关键型”检测(即绝对不能漏掉任何一个裂纹),目前的模型表现是否合格?为什么?
解题
第一步:根据 0.5 阈值转换预测结果
- 预测为1的样本编号:1, 4, 7(共 3 个)
- 预测为0的样本编号:2, 3, 5, 6, 8, 9, 10(共 7 个)
第二步:统计混淆矩阵
- TP (真正例):实际为 1 且预测为 1 →\rightarrow→ 样本 1, 7 →\rightarrow→ 2
- FP (假正例):实际为 0 但预测为 1 →\rightarrow→ 样本 4 →\rightarrow→ 1
- FN (假负例):实际为 1 但预测为 0 →\rightarrow→ 样本 3 →\rightarrow→ 1
- TN (真负例):实际为 0 且预测为 0 →\rightarrow→ 样本 2, 5, 6, 8, 9, 10 →\rightarrow→ 6
第三步:计算指标
- 精确率 (Precision) = TP/(TP+FP)=2/(2+1)=66.7%TP / (TP + FP) = 2 / (2 + 1) = \mathbf{66.7\%}TP/(TP+FP)=2/(2+1)=66.7%
- 召回率 (Recall) = TP/(TP+FN)=2/(2+1)=66.7%TP / (TP + FN) = 2 / (2 + 1) = \mathbf{66.7\%}TP/(TP+FN)=2/(2+1)=66.7%
- 准确率 (Accuracy) = (TP+TN)/总数=(2+6)/10=80%(TP + TN) / 总数 = (2 + 6) / 10 = \mathbf{80\%}(TP+TN)/总数=(2+6)/10=80%
第四步:分析回答
- 结论:不合格
- 理由:在安全关键场景下,召回率 (Recall)是最重要的指标。目前的召回率仅为 66.7%,意味着有 33.3% 的裂纹(样本 3)被漏检了,这会导致严重的安全隐患;通常这类场景需要通过降低阈值来牺牲精确率,从而强行提升召回率
循环神经网络(RNN)
卷积神经网络(CNN)擅长处理空间数据(如图像),而循环神经网络(RNN)则专门用于处理序列数据,如时间序列、文本、语音等。RNN的核心思想是引入“记忆”机制,使网络能够利用先前步骤的信息来影响当前输出。
RNN 的基本结构
RNN 的每个时间步共享相同的权重。其基本单元包含隐藏状态和可学习的权重矩阵,能够将当前输入与前一时刻的隐藏状态结合,产生当前输出和新的隐藏状态。

数学上,RNN 在时间步 ttt 的计算如下:
ht=σ(Whhht−1+Wxhxt+bh) h_t = \sigma(W_{hh} h_{t-1} + W_{xh} x_t + b_h) ht=σ(Whhht−1+Wxhxt+bh)
yt=σ(Whyht+by) y_t = \sigma(W_{hy} h_t + b_y) yt=σ(Whyht+by)
其中:
- xtx_txt:时间步 ttt 的输入
- hth_tht:时间步 ttt 的隐藏状态(记忆)
- yty_tyt:时间步 ttt 的输出
- WxhW_{xh}Wxh、WhhW_{hh}Whh、WhyW_{hy}Why:权重矩阵
- bhb_hbh、byb_yby:偏置向量
- σ\sigmaσ:激活函数(如 tanh 或 ReLU)
训练:通过时间反向传播(BPTT)
RNN 的训练使用通过时间反向传播算法,本质上是将展开的序列视为一个深度网络,并应用链式法则计算梯度。由于梯度需要在多个时间步上传播,RNN 容易遇到梯度消失或梯度爆炸问题。
RNN 的变体
为了克服梯度消失问题,研究人员提出了多种改进结构:
1. 长短时记忆网络(LSTM)
LSTM 引入了细胞状态和三个门控机制:
- 遗忘门:决定哪些信息从细胞状态中丢弃
- 输入门:决定哪些新信息存入细胞状态
- 输出门:决定基于细胞状态的输出
LSTM 的数学表达式较复杂,但其核心是通过门控机制有选择地保留长期依赖。
2. 门控循环单元(GRU)
GRU 是 LSTM 的简化版本,只有两个门:
- 重置门:控制前一隐藏状态对当前候选隐藏状态的影响
- 更新门:控制前一隐藏状态与候选隐藏状态之间的更新比例
GRU 参数更少,训练速度更快,在许多任务上与 LSTM 性能相当。
RNN 的应用领域
-
自然语言处理(NLP)
- 语言建模、文本生成
- 机器翻译(早期 Seq2Seq 模型)
- 情感分析、命名实体识别
-
时间序列预测
- 股票价格预测
- 天气预测
- 传感器数据分析
-
语音识别
- 将音频序列转换为文本
-
视频分析
- 视频帧序列的理解与标注
RNN 的局限性
尽管 RNN 在序列建模中非常强大,但仍有一些局限性:
- 并行化困难:由于序列的时序依赖性,难以像 CNN 那样高度并行化。
- 长序列处理能力有限:即使使用 LSTM/GRU,对极长序列的依赖建模仍然具有挑战性。
- 计算成本较高:每个时间步都需要计算,序列较长时训练和推理时间显著增加。
随着 Transformer 架构的出现,许多原本使用 RNN 的任务(如机器翻译)已转向基于自注意力机制的模型。但 RNN 及其变体在资源受限或序列较短的任务中仍有其应用价值。
Transformer架构详见论文《Attention Is All You Need》
生成对抗网络GAN
解决的问题:从训练样本中学习出新样本,为无监督、预测学习提供算法框架
模型由两个部分组成:
-
生成器(伪装者):找出观测数据内部的统计规律,尽可能生成能够以假乱真的样本,使判别网络输出难以区分真假;
-
判别器(警察):判断输入是来自真实样本集还是生成样本集。如果是真实样本,输出1;如果是生成样本,输出接近0。

GAN训练过程
优化生成器
J(G)=Ez pz(z)[log(1−D(G(z)))]J^{(G)}=E_{z~p_z(z)}[log(1-D(G(z)))]J(G)=Ez pz(z)[log(1−D(G(z)))]
优化目标:生成的假样本G(z),被判别器判断为接近1 ,即 (1-D(G(z)) 越小越好
损失函数J(G)J^{(G)}J(G)越小越好,理论上可以无穷小
优化判别器
J(D)=−Ex∼pdata[logD(x)]−Ez∼pz[log(1−D(G(z)))]J(D) = -{E}_{x \sim p_{\text{data}}}[\log D(x)] - {E}_{z \sim p_z}[\log(1 - D(G(z)))]J(D)=−Ex∼pdata[logD(x)]−Ez∼pz[log(1−D(G(z)))]
优化目标:输入真样本x时,输出D(x)接近1,则log(D(x))=0;输入生成样本G(z)时,输出D(G(z))接近0,则1-D(G(z))=1,log(1- D(G(z)))=0。
J(D)J^{(D)}J(D)的取值范围:−∞−0-∞-0−∞−0
-
在最开始训练时,由于生成器生成的数据与真实数据差异很大,因此D(x)应该接近1,D(G(z))应该接近0。
-
理论上来说,只要训练顺利,最终D(x)和D(G(z))都应该非常接近0.5,但现实总不会那么地完美。
-
在实际使用生成对抗网络时,生成器无法战胜判别器是很常见的情况,因此现在有各类的研究都在努力尝试提升生成器的生成水平
生成对抗网络容易出现的问题
- 梯度消失,解决办法:修改生成器的代价函数
- 模式崩溃:生成器只生成几种模式的样本,生成样本缺乏多样性,解决办法:减小惩罚,采用更平滑的损失函数
更多推荐

所有评论(0)