【Python · Pytorch】人工神经网络 ANN(上)
- 0. 生物神经网络
- 1. 人工神经网络定义
- 2. 人工神经网络结构
- 2.1 感知机
- 2.2 多层感知机
- 2.3 全连接神经网络
- 2.4 深度神经网络
- 2. 训练流程
- ※ 数据预处理 (Data Preprocessing)
- 3. 常见激活函数
- 3.1 Sigmoid / Logistic
- 3.2 ReLU
- 3.3 Tanh
- 3.4 Softmax
- 3.5 LeakyReLU
- 3.6 Softplus
- 3.7 Swish
- 4. 前向传播
- 4.1 参数初始化
- 4.1.1 基于固定方差
- 4.1.2 基于方差缩放
- Xavier 初始化
- He初始化
- 4.1.3 正交初始化
- 4.2 矩阵表示
- 5. 常见损失函数
- 5.1 回归问题
- 5.2 分类问题
- 5.2.1 交叉熵误差函数
- 5.3.1 信息量
- 5.3.2 熵
- 5.3.3 相对熵 - KL散度
- 5.3.4 交叉熵
0. 生物神经网络
生物神经网络 (Biological Neural Networks):一般指生物的大脑神经元、细胞、触点等组成的网络,用于产生生物的意识,帮助生物进行思考和行动。
组成:细胞本体、树突、轴突丘、轴突、突触
生物神经元结构:
要由细胞体、树突、轴突和突触组成。细胞体包含细胞核,是神经元的“控制中心”;树突从细胞体延伸出,接收来自其他神经元的信号;轴突是长纤维,用于传递信号到其他神经元或组织;突触是神经元之间的连接点,通过电信号和化学信号进行信息传递。
感知机便是根据生物神经元简单抽象得到的模型。
有些在生物神经网络中的特性,在人工神经网络中同样有所体现。
赫布法则:如果两个神经元细胞总是同时被激活,它们之间的连接就会加强。这种连接强度的变化是突触可塑性的结果,突触可塑性是指突触连接强度的变化,它负责优化神经回路、铭刻记忆以及形成与学习和适应性有关的机制。
凝固:短期记忆转化为长期记忆的过程称作凝固,凝固现象目前在人工神经网络中还没有对应的概念,但人工神经网络存在记忆能力,只是其容量有限,且根据“喂给”神经网络的数据不同,其所记忆的内容不同。
虽然当前神经网络发展已经不仅仅局限于从生物身上学习,但模拟生物依旧是研究神经网络的重要方向。
脉冲神经网络
脉冲神经网络(Spiking Neural Network,SNN)脉冲神经网络是源于生物启发的新一代人工神经网络模型,属于深度学习的子集,且具有较强的生物基础支撑。
脉冲神经网络,其模拟神经元更加接近实际,除此之外,把时间信息的影响也考虑其中。
脉冲神经网络中的神经元不是在每一次迭代传播中都被激活(而在典型的多层感知机网络中却是),而是在它的膜电位达到某一个特定阈值才被激活。当一个神经元被激活,它会产生一个信号传递给其他神经元,提高或降低其膜电位。
自组织神经网络
生物神经网络有一个重要的特点是高度可塑性,这使得自然生物体具有卓越的适应性,并且这种能力会影响神经系统的突触强度和拓扑结构。
然而,人工神经网络主要被设计为静态的、完全连接的结构,在面对不断变化的环境和新的输入时可能非常脆弱。尽管研究人员对在线学习和元学习进行了大量研究,但目前最先进的神经网络系统仍然使用离线学习,因为这与反向传播结合使用时更加简单。
哥本哈根信息技术大学的研究团队提出了一种自组织神经网络 ——LNDP,能够以活动和奖励依赖的方式实现突触和结构的可塑性。
1. 人工神经网络定义
什么是人工神经网络?
人工神经网络(Artificial Neural Network,即ANN),它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。
神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激活函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。
通用近似定理 是人工神经网络的核心。
通用近似定理:令 ϕ ( ⋅ ) \phi(·) ϕ(⋅)是一个非常数、有界、单调递增的连续函数, L d L_{d} Ld是一个 d d d维的单位超立方体 [ 0 , 1 ] d [0,1]^{d} [0,1]d, C ( L d ) C(L_{d}) C(Ld)是定义在 L d L_{d} Ld上的连续函数集合。对于任何一个函数 f ∈ C ( L d ) f\in C(L_{d}) f∈C(Ld),存在一个整数m,和一组实数 v i , b i ∈ R v_{i},b_{i}\in \mathbb{R} vi,bi∈R以及实数向量 w i ∈ R d \mathrm{w}_{i}\in \mathbb{R}^{d} wi∈Rd, i = 1 , ⋯ , m i=1,\cdots,m i=1,⋯,m,以至于我们可以定义函数:
F ( x ) = ∑ i = 1 m v i ϕ ( w T x + b i ) , F(\mathrm{x})=\sum^{m}_{i=1}v_{i}\phi(\mathrm{w}^\mathrm{T}\mathrm{x}+b_{i}), F(x)=i=1∑mviϕ(wTx+bi),
作为函数 f f f的近似实现,即
∣ F ( x ) − f ( x ) ∣ < ϵ , ∀ x ∈ L d |F(\mathrm{x})-f(\mathrm{x})|\lt\epsilon,\forall\mathrm{x}\in L_{d} ∣F(x)−f(x)∣<ϵ,∀x∈Ld
其中 ϵ > 0 \epsilon\gt0 ϵ>0是一个很小的正数。
上述定理可以被描述为:如果前馈神经网络具有至少一个非线性输出层,那么只要有足够数量的隐藏层神经元,它就可以以任意精度来近似任何一个有限空间到另一个有限维空间的函数。
故神经网络又被称为 万能函数拟合器(universal approximator)。
由于其内部参数的不可解释性,神经网络又被视作一种黑盒模型,故训练神经网络又被称作 “数据炼金术”。
ANN属于机器学习中的监督学习算法,机器学习范式的详细内容将在后续小节介绍。
2. 人工神经网络结构
2.1 感知机
感知机(Perceptron),对所有变量进行加权求和,并通过函数最终映射到一个单一输出,感知机是多层感知机的基本单元,也是学习神经网络需要了解的基本概念。
感知机是多层感知机的 组成单元 / 人工神经元,多层感知机通过许多互相连接的感知机形成,感知机结构如下图所示。
其中, x n x_n xn表示输入变量, w n w_n wn表示连接权重, b b b表示偏置/阈值,经 Σ \Sigma Σ求和后,得到中间值 o o o,再经过激活函数 f f f,得到输出结果 y y y。
- 输入变量 x n x_n xn:感知环境的输入端,负责输入各种要素
- 连接权重 w n w_n wn:感知机需要学习的变量,负责表明各输入要素对最终结果的“贡献”程度
- 偏置 / 阈值 b b b:调节因子 / 激活阈值,使得感知机更为灵活,增强响应能力,达到阈值后神经元激活,即神经元的激励程度
- 中间值 o o o:经过输入层求和的基础结果
- 激活函数 f f f:使得感知机输出适应不同的任务类型
- 输出结果 y y y:感知机最终输出结果
感知机输出结果计算公式如下:
y
=
f
(
∑
i
=
0
n
w
i
x
i
+
b
i
)
y=f(\sum^{n}_{i=0}w_{i}x_{i}+b_{i})
y=f(i=0∑nwixi+bi)
感知机因结构问题无法解决 异或问题(XOR),而多层感知机则可以解决此问题。
其中: ∑ i = 0 n w i x i + b i \sum_{i=0}^{n}w_ix_i+b_i ∑i=0nwixi+bi部分称为 仿射 (Affine),激活函数 f ( ⋅ ) f(\cdot) f(⋅)部分称 非线性变换。
仿射变换为两函数的复合: 线性映射 + 平移。假设某线性映射被表示为矩阵 A A A,平移被表示为向量 b ⃗ \vec{b} b,仿射向量 y ⃗ \vec{y} y可被表示为:
y ⃗ = A x ⃗ + b ⃗ \vec{y}=A\vec{x}+\vec{b} y=Ax+b
将其视作向量,感知机仿射部分可被表示为:
y ⃗ = W x ⃗ + b ⃗ \vec{y}=W\vec{x}+\vec{b} y=Wx+b
2.2 多层感知机
多层感知机(MLP, Multilayer Perceptron):一种前馈人工神经网络模型,其将输入的多个数据集映射到单一的输出的数据集上。
MLP的每一层都由多个神经元构成,神经元之间通过加权连接相互影响。
MLP能够处理非线性问题,通过学习合适的权重和偏差来建立输入与输出的映射关系,广泛应用于分类、回归、模式识别等任务
神经网络定义相关概念:
- 超参数:神经网络层数、批次大小、迭代次数、学习率、优化器、正则化参数等
- 参数:神经网络中的权重和偏置等
多层感知机是所有神经网络的“基础型”,神经网络的结构主要包括:输入层、隐藏层、输出层。
- 输入层(Input Layer):输入层接收原始数据特征作为输入,输入层通常是神经网络的前部。
- 隐藏层(Hidden Layer):隐藏层位于输入层和输出层间,由多个神经元组成,可具有不同数量的神经元。这些神经元通过权重和激活函数进行信息的处理和传递。
- 输出层(Output Layer):输出层产生网络的最终结果,其神经元数量取决于任务类型。
2.3 全连接神经网络
全连接网络(Fully Connected Neural NetworkFCN)是一种特殊的神经网络结构,其中每一层的每个神经元都与前一层的所有神经元相连接。
这种全连接的特性使得FCN能够学习到输入数据中的复杂特征表示。
非全连接神经网络
全连接神经网络
FCN通常被用作分类任务中的特征提取器,也可以与其他类型的网络结合使用,以提高整体性能。
2.4 深度神经网络
深度神经网络(Deep Neural Network,DNN)是指具有多个隐藏层的神经网络。
DNN通过增加隐藏层的数量来增强网络的非线性映射能力,从而能够处理更加复杂的数据和任务。
DNN在图像识别、语音识别、自然语言处理等领域取得了显著成果,是深度学习技术的重要组成部分。
多层并无严格衡量标准,其好处是可以用较少的参数表示复杂的函数。
2. 训练流程
首先定义神经网络结构,然后进入训练流程。
基础神经网络的 训练流程:
- 初始化参数:初始化神经网络中的权重和偏置参数,通常可使用随机初始化的方法
- 前向传播:将训练集数据归一化后输入神经网络,计算得到最终输出的预测值
- 计算损失:将输出的预测值与真实值进行比较,通过 损失函数 描述二者间的差距
- 反向传播:计算损失函数对于每个参数的梯度,以便调整每一层的参数
- 参数更新:根据反向传播得到的梯度信息,使用优化算法(如梯度下降)更新神经网络中的参数,以降低损失
- 重复迭代:重复进行前向传播、计算损失、反向传播和参数更新的过程 ,直至达到设定条件(达到最大迭代次数 / 损失函数收敛)
- 模型评估:
- 验证集验证模型是否过拟合,的超参数设置是否合理,即神经网络层数、批次大小、迭代次数、学习率、优化器、正则化参数设置是否合理。
- 测试集评估神经网络的泛化性能是否良好,即神经网络的预测能力是否达标。
- 模型应用:模型性能达到预期,可进行实际应用。
相关概念
拟合程度:
- 欠拟合:模型在训练过程中未能捕捉到数据集中的有效规律或模式,导致模型过于简单,无法正确预测结果。
- 过拟合:模型在训练数据上表现良好,但在新数据上表现不佳。
泛化能力:模型在训练数据集之外的新数据中的预测和处理能力。一个具有良好泛化能力的模型,不仅能够在训练数据上表现出色,还能在面对新的数据时保持较好的性能。
以做数学题为例,对基础神经网络的训练流程进行口语化描述:
- 初始化参数:大脑本身拥有能够快速有效学习知识的能力
- 前向传播:第一次计算凭借直觉进行计算得到结果
- 计算损失:核对答案发现差距,寻找出错步骤
- 反向传播:学习这种题型的规律
- 参数更新:掌握这种题型的规律
- 重复迭代:通过重复刷题、核对答案,不断加强巩固题型规律的掌握程度
- 模型评估:检验是否能够举一反三,解开没见过但具有相同规律的题型
- 模型应用:在做卷子的过程中可以解决遇到的新题
神经网络在一次次调整权重和偏置的过程中,意味着完成了每层神经元对下层神经元贡献度的调整,在不断调整中使得神经网络能够固化各神经元贡献度,掌握解决一类问题的规律,最终达到任务预期。
相关概念
拟合程度:
- 欠拟合:做题数量少或未发现习题规律,难以应对这种规律的习题
- 过拟合:死记硬背所有做过的习题
泛化能力:模型利用所学对相似规律或模式的未知习题“举一反三”的能力
**
※ 数据预处理 (Data Preprocessing)
在数据分析之前,对原始数据进行清洗、转换和集成的过程。
目的:提高数据的质量,使数据更加适合进行分析和建模。
常见数据预处理方式:
- 标签编码:将类别标签转化为 one-hot 编码形式,这样不仅可以直接用于多分类的损失函数计算,也使得模型输出可以直观地表示为概率分布。
- 归一化:将输入标准化到 0-1 范围,这有助于模型训练过程中的收敛速度,并提高最终模型的稳定性,适用于图像数据。
3. 常见激活函数
3.1 Sigmoid / Logistic
Sigmoid函数,又称Logistic函数,是使用范围最广的一类函数,具有指数函数形状。其接近生物神经元,是生物学中常见的S型生长曲线。
Sigmoid函数呈现为"S"型曲线,其值域为(0,1),可将数值"挤压"至0~1区间内,故可表作概率或用于输出归一化,其图像如下图所示。
Sigmoid函数公式如下:
σ
(
x
)
=
S
i
g
m
o
i
d
(
x
)
=
1
1
+
e
−
x
\sigma(x)=Sigmoid(x)=\frac{1}{1+e^{-x}}
σ(x)=Sigmoid(x)=1+e−x1
Sigmoid函数导数特性:
σ ′ ( x ) = σ ( x ) ⋅ ( 1 − σ ( x ) ) \sigma'(x)=\sigma(x)\cdot (1-\sigma(x)) σ′(x)=σ(x)⋅(1−σ(x))
特点:
- 值域(0,1):表作概率、输出归一化
- 输出均值不为0:Sigmoid输出均值大于0,存在偏移现象。
3.2 ReLU
Rectified Linear Unit(修正线性单元)提供了一种简单的非线性变换,仅保留非负元素,其图像如下图所示。
ReLU函数公式如下:
R
e
L
U
(
x
)
=
m
a
x
{
0
,
x
}
ReLU(x)=max\{0,x\}
ReLU(x)=max{0,x}
特点:
- 解决梯度消失问题:解决了Sigmoid函数与Tanh函数存在的梯度消失问题。
- 输出均值不为0:与Sigmoid相似,ReLU输出均值大于0,存在偏移现象。
- 神经元死亡现象:当x进入到小于0的范围时,激活函数输出始终为0,权重无法更新,出现神经元死亡现象。
3.3 Tanh
双曲正切函数(Tanh)是双曲正弦函数(Sinh)与双曲余弦函数(Cosh)的比值,其图像如下图所示。
Tanh函数公式如下:
T a n h ( x ) = S i n h ( x ) C o s h ( x ) = e x − e − x e x + e − x = 2 σ ( 2 x ) − 1 Tanh(x)=\frac{Sinh(x)}{Cosh(x)}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}=2\sigma(2x)-1 Tanh(x)=Cosh(x)Sinh(x)=ex+e−xex−e−x=2σ(2x)−1
特点:
- 存在梯度消失问题:函数存在的梯度消失问题。
- 输出均值为0:与Sigmoid不同,Tanh输出均值为0,能够加快网络收敛速度。
- 可看作放大并平移的Sigmoid函数。
3.4 Softmax
Softmax函数,又称 归一化指数函数,用于多分类问题,在神经网络的最后一层被使用。
Softmax函数能够将输入信号转换为 0~1 之间的值,表示各类别的概率。
它能将一个含任意实数的K维向量z“压缩”到另一个K维实向量σ(z)中,使得每一个元素的范围都在(0,1)之间,并且所有元素的和为1。
Softmax函数公式如下:
p i = s o f t m a x ( x ) i = e x i ∑ j = 1 n e x j p_i=softmax(x)_i=\frac{e^{x_i}}{\sum^n_{j=1}e^{x_j}} pi=softmax(x)i=∑j=1nexjexi
import torch
import torch.nn as nn
x = torch.Tensor([1,3,2], [1,2,2], [1,1,1])
m0 = nn.Softmax(dim=0)
m1 = nn.Softmax(dim=1)
output0 = m0(x)
output1 = m1(x)
print(output0)
print(output1)
特点:
- 值域(0,1):表作概率、输出归一化
- 多分类问题
3.5 LeakyReLU
Leaky ReLU 通过把x的非常小的线性分量 α \alpha α 给予负输入,以调整负值的零梯度问题,其图像如下图所示。
LeakyReLU函数公式如下:
L
e
a
k
y
R
e
L
U
(
x
)
=
{
α
x
,
x
<
0
x
,
x
≥
0
LeakyReLU(x)=\left\{ \begin{aligned} \begin{matrix} \alpha x &, \space x\lt 0 \\ x &, \space x\geq 0 \\ \end{matrix} \end{aligned} \right.
LeakyReLU(x)={αxx, x<0, x≥0
其中,
α
\alpha
α为可学习参数或固定超参数,用以调节ReLU负值的零梯度问题,通常
α
\alpha
α的值为0.01左右。
特点:
- 解决神经元死亡现象:当 x < 0 x\lt0 x<0时,激活函数输出不再始终为0,一定程度上解决了神经元死亡现象。
3.6 Softplus
Softplus 激活函数是一种渐进型的非线性激活函数,可以看作平滑的ReLU函数,其图像如下图所示。
Softplus函数公式如下:
S
o
f
t
p
l
u
s
(
x
)
=
l
n
(
1
+
e
x
)
Softplus(x) = ln (1 + e^x)
Softplus(x)=ln(1+ex)
其导数为Sigmoid函数:
S
o
f
p
l
u
s
′
(
x
)
=
1
1
+
e
−
x
=
σ
(
x
)
Sofplus'(x)=\frac{1}{1+e^{-x}}=\sigma(x)
Sofplus′(x)=1+e−x1=σ(x)
特点:
- 解决神经元死亡现象:当 x < 0 x\lt0 x<0时,激活函数输出不再始终为0,一定程度上解决了神经元死亡现象。
3.7 Swish
Swish激活函数是一种新型的激活函数,全称 自门控 (Self-Gated) 激活函数,其图像如下图所示。
Swish函数公式如下:
S
w
i
s
h
(
x
)
=
x
⋅
S
i
g
m
o
i
d
(
β
x
)
Swish(x) = x \cdot Sigmoid(\beta x)
Swish(x)=x⋅Sigmoid(βx)
其中, σ ( ⋅ ) \sigma(\cdot) σ(⋅)为Logistics函数, β \beta β为可学习参数或固定超参数。
σ ( ⋅ ) ∈ ( 0 , 1 ) \sigma(\cdot)\in(0,1) σ(⋅)∈(0,1)可以看作一种软性门控机制,这种思想在LSTM中也有应用。
β \beta β 取值:
- 当 β = 0 \beta=0 β=0时,Swish函数为 x 2 \frac{x}{2} 2x。
- 当 β = 1 \beta=1 β=1时,Swish函数在 x > 0 x \gt 0 x>0时近似线性,在 x < 0 x \lt 0 x<0近似饱和。
- 当 β → + ∞ \beta \rightarrow +\infin β→+∞时,Swish函数近似ReLU函数,其非线性程度由 β \beta β控制。
特点:
- 更好地学习复杂的非线性特征:Swish激活函数有助于神经元学习复杂的非线性函数,帮助神经元学习复杂的非线性特征。
4. 前向传播
4.1 参数初始化
神经网络参数初始化是深度学习中的关键步骤之一。它涉及设置神经网络中的权重和偏置的初始值。参数初始化的选择和设置对于网络的训练和性能具有重要影响。参数初始化的重要性:避免对称性问题、保持梯度稳定性、信号传播的稳定性。
神经网络初始化权重一般采用随机值,以打破权重的对称结构。对于参数初始化的对称结构,有两个极端的例子。
对称权重(对称性问题)
- 全零值权重:全部权重设置为0
- 某层神经元全部丢弃,形成阻碍,权重无法正常传播,神经网络无法正常学习。
- 同值权重:全部权重设置为相同值
- 所有权重进行相同更新,等同于一个巨大的神经元,无法实现网络表达能力。
保持梯度稳定性
- 梯度消失:在反向传播中,梯度逐渐变小,导致网络难以学习。
- 梯度爆炸:在反向传播中,梯度变得非常大,导致权重更新过大,网络不稳定。
信号传播的稳定性
- 每个神经元的输出会作为下一层神经元的输入,如果信号传播过程中的方差变化过大,可能会导致网络中的信号失真或放大,影响网络的性能。
所以,良好的参数随机初始化策略,可以减轻神经网络的训练压力,避免出现梯度消失、梯度爆炸等问题。
常见的参数初始化策略
- 高斯分布初始化
- 均匀分布初始化
- Xavier初始化
- He初始化
4.1.1 基于固定方差
-
高斯分布初始化:高斯分布初始化方法是最简单的初始化方法,参数从一个固定均值(比如0)和固定方差(比如0.01)的Gaussian分布进行随机初始化。
-
均匀分布初始化:在一个给定区间[-r,r]内采用均匀分布初始化参数,超参数r可根据神经元连接数量自适应调节。
- 初始化一个深层神经网络时,一个比较好的初始化策略是保持每个神经元输入和输出的方差一致。
4.1.2 基于方差缩放
Xavier 初始化
适用函数类型:Sigmoid / Tanh (S型)
Xavier初始化:一种为解决梯度消失/梯度爆炸设计的方法。通过初始化权重,使得每个神经元的输出方差与输入方差相同。通过从具有零均值和特定方差的分布中设置初始权重来实现这一目标。这个特定方差是根据神经元的输入和输出连接数确定的。
权重从随机均匀分布中初始化,确保权重足够小以避免梯度爆炸问题,同时足够大以避免梯度消失问题。
Xavier初始化的公式:
W
∼
N
[
0
,
2
n
i
+
n
i
+
1
]
W\sim N[0,\frac{2}{n_i+n_{i+1}}]
W∼N[0,ni+ni+12]
优点
- 可以显著加速学习过程,可以帮助网络更快收敛。
- 能帮助防止梯度消失和梯度爆炸问题。通过确保每个神经元的输出方差与输入方差相同,它可以确保梯度保持在可控范围内,使网络更容易训练。
局限性
- 它假设激活函数是线性的,然而有时激活函数是线性的。这可能导致输出与输入方差不同,引发梯度消失或梯度爆炸问题。
其他替代方案:LeCun初始化
He初始化
适用函数类型:ReLU(线性激活函数)
He初始化:何凯明等提出的一种鲁棒的神经网络参数初始化方法,动机同Xaviar初始化基本一致,都是为了保证信息在前向传播和反向传播过程中能够有效流动,使不同层的输入信号的方差大致相等。
关于参数的大部分假设同Xaviar初始化一致,但He初始化对应的是非线性激活函数 (如ReLU) ,而Xaviar初始化对应的是线性激活函数。
He初始化的公式:
W
∼
U
[
−
6
n
i
+
n
i
+
1
,
6
n
i
+
n
i
+
1
]
W\sim U[-\sqrt{\frac{6}{n_i+n_{i+1}}},\sqrt{\frac{6}{n_i+n_{i+1}}}]
W∼U[−ni+ni+16,ni+ni+16]
4.1.3 正交初始化
- 用 均值为0 方差为1 的高斯分布初始化一个矩阵
- 将这个矩阵用奇异值分解得到两个正交矩阵,并使用其中之一作为权重矩阵
4.2 矩阵表示
神经网络的前向传播实际是逐步输出结果的过程,其中包含了上一层激活值对下一层的影响程度,这个过程可以看作某些神经元促使另一些神经元的激活。
以识别任务为例,直观感受神经网络隐含层权重的意义。
- 隐含层中的神经元是对上层输入“拆分”提取后的模糊“印象”理解,通过叠加“印象”从而完成识别过程
- 不同“印象”不同贡献程度的叠加,在输出层输出不同的结果
- 这种模糊“印象”难以被人类直观理解,但可通过训练使得神经网络拟合真实映射,故神经网络也被视作一种“黑箱”模型
- 简单的识别任务中,CNN卷积层提取的“印象”相较于ANN更容易被人类接受(比如CNN识别手写数字任务中 提取手写数字的“部件”)
这种模糊“印象”,也被称作特征。随着网络深度的增加,隐含层能够从低级特征中抽象出更高级的特征。
神经网络上下层间传播,包含两大数值:权重、偏置
- 权重:上层神经元对下层神经元的影响/贡献程度
- 偏置:输出信号的阈值,代表神经元的敏感程度,表示神经元不能随意激活。上层所有神经元的加权和/总贡献大于某值,才会有激活值影响后续神经元,该神经元才有意义。
这里介绍第
l
l
l层第
0
0
0个神经元激活值的计算公式。
a
0
(
l
)
=
σ
(
w
0
,
0
a
0
(
l
−
1
)
+
w
0
,
1
a
1
(
l
−
1
)
+
⋯
+
w
0
,
n
a
n
(
l
−
1
)
+
b
0
)
a_0^{(l)}=\sigma(w_{0,0} \space a_{0}^{(l-1)} + w_{0,1} \space a_{1}^{(l-1)} + \cdots + w_{0,n} \space a_{n}^{(l-1)} + b_0)
a0(l)=σ(w0,0 a0(l−1)+w0,1 a1(l−1)+⋯+w0,n an(l−1)+b0)
其中,
a
0
(
l
)
a_0^{(l)}
a0(l)表示第
l
l
l层第0个神经元的激活值,
w
0
,
0
w_{0,0}
w0,0表示第
l
−
1
l-1
l−1层第0个神经元与第
l
l
l层第0个神经元间的权重,
a
i
(
l
−
1
)
a^{(l-1)}_i
ai(l−1)表示第
l
−
1
l-1
l−1层第i个神经元的激活值,
b
0
b_0
b0表示第
l
l
l层第0个神经元的偏置,
σ
(
⋅
)
\sigma(\cdot)
σ(⋅)表示激活函数。
至此,可通过矩阵简化层间权重、各层激活值与阈值的表示。
权重矩阵:
W
=
[
w
0
,
0
w
0
,
1
⋯
w
0
,
n
w
1
,
0
w
1
,
1
⋯
w
1
,
n
⋮
⋮
⋱
⋮
w
m
,
0
w
m
,
1
⋯
w
m
,
n
]
W = \left [ \begin{matrix} w_{0,0} & w_{0,1} & \cdots & w_{0,n} \\ w_{1,0} & w_{1,1} & \cdots & w_{1,n} \\ \vdots & \vdots & \ddots & \vdots \\ w_{m,0} & w_{m,1} & \cdots & w_{m,n} \\ \end{matrix} \right ]
W=
w0,0w1,0⋮wm,0w0,1w1,1⋮wm,1⋯⋯⋱⋯w0,nw1,n⋮wm,n
其中, w i , j w_{i,j} wi,j表示前一层第 i i i个神经元与下一层第 j j j个神经元间连接的权重大小。
上一层激活值向量:
a
(
l
−
1
)
=
[
a
0
(
l
−
1
)
a
1
(
l
−
1
)
⋮
a
n
(
l
−
1
)
]
a^{(l-1)} = \left [ \begin{matrix} a_{0}^{(l-1)} \\ a_{1}^{(l-1)} \\ \vdots \\ a_{n}^{(l-1)} \\ \end{matrix} \right ]
a(l−1)=
a0(l−1)a1(l−1)⋮an(l−1)
其中, a i ( l − 1 ) a_{i}^{(l-1)} ai(l−1)表示第 l − 1 l-1 l−1层第 i i i个神经元的激活值。
偏置向量:
b
=
[
a
0
a
1
⋮
a
m
]
b = \left [ \begin{matrix} a_{0} \\ a_{1} \\ \vdots \\ a_{m} \\ \end{matrix} \right ]
b=
a0a1⋮am
其中,
b
j
b_{j}
bj表示第
l
l
l层第
j
j
j个神经元的偏置。
下一层激活值向量:
a
(
l
)
=
σ
(
[
w
0
,
0
w
0
,
1
⋯
w
0
,
n
w
1
,
0
w
1
,
1
⋯
w
1
,
n
⋮
⋮
⋱
⋮
w
m
,
0
w
m
,
1
⋯
w
m
,
n
]
[
a
0
(
l
−
1
)
a
1
(
l
−
1
)
⋮
a
n
(
l
−
1
)
]
+
[
a
0
a
1
⋮
a
m
]
)
a^{(l)} = \sigma \left( \left [ \begin{matrix} w_{0,0} & w_{0,1} & \cdots & w_{0,n} \\ w_{1,0} & w_{1,1} & \cdots & w_{1,n} \\ \vdots & \vdots & \ddots & \vdots \\ w_{m,0} & w_{m,1} & \cdots & w_{m,n} \\ \end{matrix} \right ]\left [ \begin{matrix} a_{0}^{(l-1)} \\ a_{1}^{(l-1)} \\ \vdots \\ a_{n}^{(l-1)} \\ \end{matrix} \right ]+\left [ \begin{matrix} a_{0} \\ a_{1} \\ \vdots \\ a_{m} \\ \end{matrix} \right ]\right)
a(l)=σ
w0,0w1,0⋮wm,0w0,1w1,1⋮wm,1⋯⋯⋱⋯w0,nw1,n⋮wm,n
a0(l−1)a1(l−1)⋮an(l−1)
+
a0a1⋮am
可简化为如下表示:
a
(
l
)
=
σ
(
W
a
(
l
−
1
)
+
b
)
a^{(l)} = \sigma(Wa^{(l-1)}+b)
a(l)=σ(Wa(l−1)+b)
其中, a ( l ) a^{(l)} a(l)表示第 l l l层神经元的激活值,W表示第 l − 1 l-1 l−1与 l l l层间的权重矩阵, a ( l − 1 ) a^{(l-1)} a(l−1)表示第 l − 1 l-1 l−1层神经元的激活值, b b b表示第 l l l层神经元的偏置, σ ( ⋅ ) \sigma(\cdot) σ(⋅)表示激活函数。
通过以上描述可知,每个单独的神经元可以视作参数不同的函数,故整个神经网络可视作海量参数的复合函数。
故神经网络的 “学习” 的目的是 找到正确的权重和偏置,从而更好地拟合目标映射以完成识别任务,这个过程则依靠 反向传播 完成。
5. 常见损失函数
损失函数(Loss Function)是在监督学习任务中用于衡量模型预测结果与真实标签之间的差异的函数。
目标:最小化预测结果与真实值之间的差异,从而使模型能够更好地拟合训练数据。
5.1 回归问题
5.1.1 平均绝对误差函数( l 1 \mathscr{l_1} l1 损失)
平均绝对误差(Mean Absolute Error, MAE) 通过计算两点间曼哈顿距离的平方以衡量两个向量间的差距。
MAE假设预估值和真实值的误差服从拉普拉斯分布。
平均绝对误差计算方法是求预测值与真实值之间绝对值之和。其公式如下:
M
A
E
(
y
,
y
^
)
=
1
n
∑
i
=
1
n
∣
y
i
−
y
i
^
∣
MAE(y,\hat{y})=\frac{1}{n}\sum_{i=1}^{n}|y_{i}-\hat{y_{i}}|
MAE(y,y^)=n1i=1∑n∣yi−yi^∣
其中,
n
n
n是样本数量,
y
i
y_i
yi是第
i
i
i 个样本的真实值,
y
^
i
\hat{y}_i
y^i是第
i
i
i个样本的预测值。
曲线分布如下:
L1损失函数的导数是常量,有着稳定的梯度,所以不会有梯度爆炸的问题。对于离群点造成的惩罚是固定的,不会被放大。
5.1.2 均方差误差函数( l 2 \mathscr{l_2} l2 损失)
均方差误差(Mean Square Error, MSE) 通过计算两点间欧氏距离的平方以衡量两个向量间的差距。
MSE假设预估值和真实值的误差服从标准高斯分布,大多数变量都可以建模为高斯分布,故均方差误差几乎是回归问题最常用的损失函数。
均方差误差计算方法是求预测值与真实值之间距离的平方和。预测值和真实值越接近,两者均方差就越小,其公式如下:
M
S
E
(
y
,
y
^
)
=
1
n
∑
i
=
1
n
(
y
i
−
y
i
^
)
2
MSE(y,\hat{y})=\frac{1}{n}\sum_{i=1}^{n}(y_{i}-\hat{y_{i}})^{2}
MSE(y,y^)=n1i=1∑n(yi−yi^)2
其中, n n n是样本数量, y i y_i yi是第 i i i 个样本的真实值, y ^ i \hat{y}_i y^i是第 i i i个样本的预测值。
均方差误差函数常用于回归问题
- 通常分类问题需要最后一层归一化表作概率,当Sigmoid / Softmax / Tanh函数和MSE一起使用时会出现梯度消失。
- 回归问题使用MSE可以保证损失函数为凸函数,即可得到最优解。而分类问题使用交叉熵函数可保证区间内单调,且运算量小。
- MSE对于分类问题的二阶导数矩阵(即Hessian矩阵)不是正定矩阵。
- 线性回归与欧氏距离相关 (MSE),而分类问题与概率分布有关(CrossEntropy)
- 平方损失函数意味着模型的输出是以预测值为均值的高斯分布。
- 分类问题中的标签没有连续概念。独热编码作为标签的一种表达方式,标签间的距离没有实际意义。
曲线分布如下:
函数曲线连续,处处可导,随着误差值的减小,梯度也减小,有利于收敛到最小值。
5.1.3 Huber误差函数
Huber误差结合了MAE的稳健性和MSE的稳定性,本质上是二者中取其优。
对于大误差,它是线性的;对于小误差,它本质上是二次的。其公式如下:
Huber loss
=
L
δ
(
y
,
y
^
i
)
=
{
1
2
[
y
i
−
y
^
i
]
2
,
i
f
∣
y
i
−
y
^
i
∣
≤
δ
δ
∣
y
i
−
y
^
i
∣
−
1
2
δ
2
,
i
f
∣
y
i
−
y
^
i
∣
>
δ
\text{Huber loss}=L_{\delta}(y,\hat{y}_i) = \left\{\begin{matrix}\frac12[y_{i} - \hat{y}_{i}]^2 & ,\qquad if\space|y_{i} - \hat{y}_{i}| \leq \delta \\ \delta|y_{i} - \hat{y}_{i}| - \frac12\delta^2 &, \qquad if\space|y_{i} - \hat{y}_{i}| > \delta\end{matrix}\right.
Huber loss=Lδ(y,y^i)={21[yi−y^i]2δ∣yi−y^i∣−21δ2,if ∣yi−y^i∣≤δ,if ∣yi−y^i∣>δ
其中, y i y_i yi是第 i i i 个样本的真实值, y ^ i \hat{y}_i y^i是第 i i i个样本的预测值, δ \delta δ是控制平滑范围的阈值。
5.2 分类问题
5.2.1 交叉熵误差函数
交叉熵是信息论中的一个概念,要了解交叉熵的本质,需要先从最基本的概念讲起。
5.3.1 信息量
在信息论中,事件发生概率越小,其所包含的信息量就越大。
这里我们假设两件事,仅类比进行直观感受:
- 事件A:人类2050年之前载人登录月球(再次实现)
- 事件B:人类2050年之前载人登录开普勒-452b (从未实现 距离地球1400光年)
仅凭直觉便可察觉,事件B显然比事件A包含更多的信息量。
事件A:
- 现状:其距离相对较近、环境特点相对明确、技术难度相对较低且成本更为可控。
- 实现意义:人类充分利用当前多个探测器传回的大量数据,深入了解其环境特点、大气条件、地表状况,时机成熟便可实现载人登录月球,验证目前航空航天技术、发展新技术,为探索太阳系及其周边星系奠定基础。
事件B:
- 现状:其距离远、环境特点不明确、技术难度及成本远超目前人类极限。
- 实现意义:人类在极短内多次技术爆炸,掌握包括深空低延时通信、星际旅行、深空探测等多项必备技术,并使得其成本降低至与登录月球无异。
月球探测任务的成本虽然高昂,但与深空探测相比仍然具有相对的经济性。
从以上举例可以看出,越难以发生的事件,其所获取到的信息量越大;反之,越容易发生的事件,其所获取到的信息量越小。
信息论中认为,信息量与事件发生的概率有关。
假设
X
X
X是一个离散型随机变量,其取值集合为
X
\mathcal{X}
X,概率分布函数
p
(
x
)
=
P
r
(
X
=
x
)
,
x
∈
X
p(x)=Pr(X=x),x\in\mathcal{X}
p(x)=Pr(X=x),x∈X,则定义事件
X
=
x
0
X=x_{0}
X=x0的信息量为:
I
(
x
0
)
=
−
l
o
g
(
p
(
x
0
)
)
I(x_0)=-log(p(x_0))
I(x0)=−log(p(x0))
5.3.2 熵
信息量表示包含信息的多少,而信息熵则表示所有信息量的期望,用于量化信息的不确定性和信息量,其定义为:
H
(
X
)
=
E
[
I
(
X
)
]
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(X)=E[I(X)]=-\sum_{i=1}^{n}p(x_i)log(p(x_i))
H(X)=E[I(X)]=−i=1∑np(xi)log(p(xi))
对于某个事件,有
n
n
n种可能性,每一种可能性都有一个概率
p
(
x
i
)
p(x_i)
p(xi)这样就可以计算出某一种可能性的信息量。
假设小明和小张相约打靶,小明和小王打中的先验概率为10%和99.9%,打靶结果是0-1事件。熵是信息量的期望,通过分别计算二人的信息熵可以得出其打靶结果的不确定度。
小明打靶不确定度:
H
A
(
x
)
=
−
[
p
(
x
A
)
l
o
g
(
p
(
x
A
)
)
+
(
1
−
p
(
x
A
)
)
l
o
g
(
1
−
p
(
x
A
)
)
]
=
0.4690
H_A(x)=-[p(x_A)log(p(x_A))+(1-p(x_A))log(1-p(x_A))]=0.4690
HA(x)=−[p(xA)log(p(xA))+(1−p(xA))log(1−p(xA))]=0.4690
小王打靶不确定度:
H
B
(
x
)
=
−
[
p
(
x
B
)
l
o
g
(
p
(
x
B
)
)
+
(
1
−
p
(
x
B
)
)
l
o
g
(
1
−
p
(
x
B
)
)
]
=
0.0114
H_B(x)=-[p(x_B)log(p(x_B))+(1-p(x_B))log(1-p(x_B))]=0.0114
HB(x)=−[p(xB)log(p(xB))+(1−p(xB))log(1−p(xB))]=0.0114
小明打靶结果的不确定度较低,十有八九脱靶;但小王打靶结果的不确定度更低,几乎次次中靶,结果相当的确定。
5.3.3 相对熵 - KL散度
相对熵,又称KL散度,对于同一个随机变量 x x x有两个单独的概率分布 P ( x ) P(x) P(x)和 Q ( x ) Q(x) Q(x),可使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异。
在深度学习中,P用以表示样本真实分布,Q用以表示模型预测分布。
如果用P来描述目标问题,则得到信息增量。例如:假设[1, 0, 0]代表真实分布,而[0.6, 0.3, 0.1]代表预测分布。P可完美描述样本,用Q可大致描述样本,但未达完美,需要额外的”信息增量“,反复训练模型方可使预测分布Q无限接近于P,亦可完美描述样本,故而Q等价于P。
KL散度的定义为:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
q
(
x
i
)
)
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))
其中:n表示事件的所有可能性。KL散度越小,表示q分布与p分布差距越小,两者越接近。
5.3.4 交叉熵
系统真实的概率分布,称作真实分布。根据真实分布,我们能够找到一个最优策略,以最小的代价消除系统的不确定性,而这个代价大小就是信息熵。
多数情况下,我们并不知道系统的真实分布,交叉熵 是用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力大小。
交叉熵越低,意味着非真实分布越接近真实分布。所以在机器学习分类算法中,我们总是最小化交叉熵,交叉熵越低,间接证明算法推算出的非真实分布q越接近真实分布p。
而在公式层面,交叉熵是KL散度的变形产物,对KL散度公式变形可得:
D
K
L
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
q
(
x
i
)
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
=
H
(
p
(
x
i
)
)
+
[
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
]
\begin{equation} \begin{aligned} D_{KL}&=\sum_{i=1}^{n}p(x_i)log(\frac{p(x_i)}{q(x_i)})\\&=\sum_{i=1}^{n}p(x_i)log(p(x_i))-\sum_{i=1}^{n}p(x_i)log(q(x_i))\\&=H(p(x_i))+[-\sum_{i=1}^{n}p(x_i)log(q(x_i))] \end{aligned} \end{equation}
DKL=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(xi))+[−i=1∑np(xi)log(q(xi))]
等式前半部分是p的熵,等式后半部分定义为 交叉熵:
H
(
p
,
q
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
H(p,q)=-\sum_{i=1}^{n}p(x_i)log(q(x_i))
H(p,q)=−i=1∑np(xi)log(q(xi))
在深度学习中,我们可以使用KL散度评估真实值与预测值间的差距,即 D K L ( y ∣ ∣ y ^ ) D_{KL}(y||\hat{y}) DKL(y∣∣y^)。由于真实分布不变,KL散度公式中第一项 − H ( y ) -H(y) −H(y)为常数项,故在优化过程中,只需关注第二项交叉熵即可。所以,一般在深度学习分类任务中用交叉熵做损失函数用以评估模型。
在分类问题中,交叉熵用以衡量两个概率分布之间的差异性。
H ( y , y ^ ) = − ∑ i = 1 n y i l o g ( y i ^ ) H(y,\hat{y})=-\sum_{i=1}^{n}{y_{i}}log(\hat{y_{i}}) H(y,y^)=−i=1∑nyilog(yi^)
交叉熵误差函数常用于分类问题
假设分类问题的真实分布为[1, 0, 0],神经网络最终的输出为[a, b, c],下面我们分别计算MSE和CrossEntropy。
MSE:
y
=
(
a
−
1
)
2
(
b
−
0
)
2
(
c
−
0
)
2
=
(
a
−
1
)
2
b
2
c
2
y = (a-1)^2(b-0)^2(c-0)^2=(a-1)^2b^2c^2
y=(a−1)2(b−0)2(c−0)2=(a−1)2b2c2
CrossEntropy:
y
=
(
−
1
)
⋅
l
o
g
(
a
)
−
0
⋅
l
o
g
(
b
)
−
0
⋅
l
o
g
(
c
)
=
−
l
o
g
(
a
)
y=(-1)\cdot log(a)-0\cdot log(b)-0\cdot log(c)=-log(a)
y=(−1)⋅log(a)−0⋅log(b)−0⋅log(c)=−log(a)
交叉熵作为损失函数仅与正确结果有关,而MSE则与正确错误结果均有关。该损失函数除了让正确的分类尽量变大,还会让错误的分类变得平均,影响反向传播效率。