图神经网络学习笔记:神经网络基础
图神经网络就是将
图数据和
神经网络进行结合,在图数据上面进行
端对端的计算。
1. 机器学习基本概念
1.1 机器学习的常见分类
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习有以下几种常见的分类方法:
- 根据训练数据是否有标签可分为:
监督学习:训练数据中每个样本都有标签,通过标签指导模型进行训练无监督学习:训练数据完全没有标签,算法从数据中发现约束关系,如数据之间的关联等,典型的无监督算法有如聚类算法半监督学习:训练数据又有有标签数据,又有无标签数据(GNN划时代的论文GCN的模型就是半监督的)
- 从算法输出的形式上可分为:
分类问题:模型输出离散值回归问题:模型输出连续值
1.2 机器学习的一般流程
机器学习的流程可以简单概括为:提取特征–>建立模型–>确定损失函数->进行优化求解。
- 提取特征这一步没什么好说的,如果用的是经典的数据集那么特征都是被提取好的,如果要自己提取特定数据的特征那就要具体问题具体分析了。
- 建立模型这一步,书中介绍传统的机器学习模型有
逻辑回归、随机森林等;而深度学习的方法有多层感知机(MLP),卷积网络等。模型可以看做是一个函数 Y = f ( X ; W ) Y=f(X;W) Y=f(X;W),函数建立了特征X到标签Y到映射,而W则是模型中的参数。 - 确定损失函数才能评估一个模型的好坏,可以通过损失函数的值来优化模型。在2.1.3中介绍了一些常见的损失函数。
假设有一批包含N条样本的训练集,用集合 X = ( x i , y i ) ∣ i = 1 , 2 , . . . , N X={(x_i,y_i)|i=1,2,...,N} X=(xi,yi)∣i=1,2,...,N表示。每一个样本 x i x_i xi都有对应的标签 y i y_i yi,其中 x i ∈ R d x_i \in R^d xi∈Rd表示每个样本是一个d维的向量,标签 y i y_i yi是一系列离散值 y i ∈ Y = 0 , 1 , . . . , K y_i \in Y ={0,1,...,K} yi∈Y=0,1,...,K,表示样本 x i x_i xi所属的类别,K为类别的种类数。我们的目的是建立一个能完成分类功能的模型,即需要这样一个模型: f : R d → R K f:R^d \rightarrow R^K f:Rd→RK,输入是d维的向量,经过f映射,输出在每个类别上有一个概率 P ( Y ∣ x i ) = f ( x i ; θ ) P(Y|x_i)=f(x_i;\theta) P(Y∣xi)=f(xi;θ),我们要取的就是最大的概率值作为最后模型给出的标签 y i ∗ = a r g m a x ( P ( Y ∣ x i ) ) y_i^*=argmax(P(Y|x_i)) yi∗=argmax(P(Y∣xi))。
那么如何评估一个模型的好坏呢?要评价我们得到的预测和真实值的差异,即
y
i
y_i
yi和
y
i
∗
y_i^*
yi∗之间的差异,而且我们需要一个可以量化的方法,这个方法就是定义一个损失函数(Loss Function)。通常用
L
(
y
,
f
(
x
;
θ
)
)
L(y,f(x;\theta))
L(y,f(x;θ))表示,通过最小化损失函数训练模型就是优化求解的过程,可以表示为
θ
∗
=
a
r
g
m
i
n
[
1
N
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
;
θ
)
)
+
λ
ϕ
(
θ
)
]
\theta^*=argmin [\frac{1}{N} \sum_{i=1}^N{L(y_i,f(x_i;\theta))+\lambda \phi(\theta)}]
θ∗=argmin[N1∑i=1NL(yi,f(xi;θ))+λϕ(θ)],其中,前面的均值函数表示的是经验误差,L代表的是损失函数,
ϕ
\phi
ϕ表示的是正则化项(regularizer)或者惩罚项(penality term),可以是L1或L2以及其他正则函数。总之过程就是在寻找是的目标函数最小的
θ
\theta
θ值。
在实际的优化中,常常无法一步到位直接找到合适的参数。对训练集X使用模型 f ( X ; θ 0 ) f(X;\theta_0) f(X;θ0)进行预测,其中 θ 0 \theta_0 θ0表示初始参数,然后对预测的结果与样本真实标签利用损失函数计算损失值,优化方法会根据当前损失值对参数进行调整,得到 θ 1 \theta_1 θ1,然后重复上述过程,持续迭代,直到该算法发现损失可能是最低的模型参数。通常,可以不断迭代,直到总体损失不再变化或变化极其缓慢为止,这时就称模型已经收敛。这一过程还有两个隐患,一个是训练过程一直用的是训练集,模型可能过拟合,变得只认识训练集而不认识测试集;另一种情况是可能欠拟合,即无论如何也无法在训练集上收敛。
1.3 常见的损失函数
1)平方损失函数
定义如下:
L
(
y
,
f
(
x
,
θ
)
)
=
1
N
∑
i
=
1
N
(
y
i
−
f
(
x
i
;
θ
)
)
2
L(y,f(x,\theta))=\frac{1}{N} \sum_{i=1}^N (y_i-f(x_i;\theta))^2
L(y,f(x,θ))=N1i=1∑N(yi−f(xi;θ))2
其中N是样本数量,它衡量的是模型预测的结果与标签之间的平方差,常用于回归类问题。
2)交叉熵损失函数
交叉熵(cross entropy)损失常用于分类问题中,分类模型通常输出类别的概率分布,交叉熵衡量的是数据标签的真实分布与分类模型预测的概率分布之间的差异程度,损失值越小,他们之间的差异就越小,模型就能越准确地进行预测。其离散形式如下:
L
(
y
,
f
(
x
)
)
=
H
(
p
,
q
)
=
−
1
N
∑
i
=
1
N
p
(
y
i
∣
x
i
)
l
o
g
[
q
(
y
i
^
∣
x
i
)
]
L(y,f(x))=H(p,q)=-\frac{1}{N}\sum_{i=1}^N p(y_i|x_i)log[q(\hat{y_i}|x_i)]
L(y,f(x))=H(p,q)=−N1i=1∑Np(yi∣xi)log[q(yi^∣xi)]
其中p,q分别表示数据标签的真实分布和模型预测给出的分布,
p
(
y
i
∣
x
i
)
p(y_i|x_i)
p(yi∣xi)表示样本
x
i
x_i
xi标签的真实分布。一般来说,样本
x
i
x_i
xi只属于某个类别
c
k
c_k
ck,因此
p
(
y
i
=
c
k
∣
x
i
)
=
1
p(y_i=c_k|x_i)=1
p(yi=ck∣xi)=1,在其他类别上概率为0。
q
(
y
i
^
∣
x
i
)
q(\hat{y_i}|x_i)
q(yi^∣xi)表示给定样本
x
i
x_i
xi模型预测在各个类别上的概率分布。如果样本
x
i
x_i
xi的标签为
c
k
c_k
ck,那么上式可以简化为:
L
(
y
,
f
(
x
)
)
=
−
1
N
∑
i
=
1
N
l
o
g
[
q
(
y
i
^
=
c
k
∣
x
i
)
]
L(y,f(x))=-\frac{1}{N}\sum_{i=1}^Nlog[q(\hat{y_i}=c_k|x_i)]
L(y,f(x))=−N1i=1∑Nlog[q(yi^=ck∣xi)]
可以看出在这种情况下,最小化交叉熵损失的就是最大化样本标签的似然概率。对于二分类来说
y
i
∈
0
,
1
y_i\in {0,1}
yi∈0,1,使用逻辑回归可以得到样本
x
i
x_i
xi属于类别1的概率
q
(
y
i
=
1
∣
x
i
)
q(y_i=1|x_i)
q(yi=1∣xi),那么样本属于类别0的概率为
1
−
q
(
y
i
=
1
∣
x
i
)
1-q(y_i=1|x_i)
1−q(yi=1∣xi),使用上式,可以得到逻辑回归的损失函数,如下所示,它也被称为二元交叉熵损失。
L
(
y
,
f
(
x
)
)
=
−
1
N
∑
i
=
1
N
[
y
i
log
q
(
y
i
=
1
∣
x
i
)
+
(
1
−
y
i
)
log
(
1
−
l
o
g
q
(
y
i
=
1
∣
x
i
)
)
]
L(y,f(x))=-\frac{1}{N}\sum_{i=1}^N[y_i\log{q(y_i=1|x_i)}+(1-y_i)\log{(1-log{ q(y_i=1|x_i)})}]
L(y,f(x))=−N1i=1∑N[yilogq(yi=1∣xi)+(1−yi)log(1−logq(yi=1∣xi))]
1.4 梯度下降算法
1.梯度下降算法的原理
梯度下降法(Gradient Descent,GD)是一种常用的求解无约束最优化问题的方法,在最优化、统计学以及机器学习等领域有着广泛的应用。
梯度下降就是一种经典的方法。它利用梯度信息,通过不断迭代调整参数来寻找合适的解。
对于一个多元函数
f
(
x
)
f(x)
f(x),梯度定义为对其中每个自变量的偏导数构成的向量,用
f
′
(
x
)
f'(x)
f′(x)表示,如下所示:
f
′
(
x
)
=
∇
f
(
x
)
=
[
∇
f
(
x
1
)
,
.
.
.
,
∇
f
(
x
n
)
]
T
f'(x)=\nabla f(x) = [\nabla{f(x_1)},...,\nabla{f(x_n)}]^T
f′(x)=∇f(x)=[∇f(x1),...,∇f(xn)]T
考察
f
(
x
+
δ
x
)
f(x+\delta x)
f(x+δx)在x处的泰勒展开,如下所示:
f
(
x
+
Δ
x
)
=
f
(
x
)
+
f
′
(
x
)
Δ
x
+
o
(
Δ
x
)
f(x+\Delta x) = f(x) + f'(x) \Delta x+o(\Delta x)
f(x+Δx)=f(x)+f′(x)Δx+o(Δx)
要想使得
f
(
x
+
Δ
x
)
<
f
(
x
)
f(x+\Delta x)<f(x)
f(x+Δx)<f(x),忽略高阶项,就需要
f
′
(
x
)
T
Δ
x
<
0
f'(x)^T\Delta x<0
f′(x)TΔx<0,也就是说,满足这个条件就可以使得函数值减小,进一步地
f
′
(
x
)
T
Δ
x
=
∣
∣
f
′
(
x
)
T
∣
∣
⋅
∣
∣
Δ
x
∣
∣
⋅
cos
θ
f'(x)^T \Delta x=||f'(x)^T||\cdot ||\Delta x||\cdot \cos \theta
f′(x)TΔx=∣∣f′(x)T∣∣⋅∣∣Δx∣∣⋅cosθ,取
Δ
x
=
−
α
f
′
(
x
)
\Delta x = -\alpha f'(x)
Δx=−αf′(x),可保证更新后的x可以使得函数值减小,这里
α
\alpha
α是一个超参数,用于调整每次更新的步长,称为学习率。
机器学习中优化的目标是最小化损失函数。通过梯度下降的方法进行求解的过程分为以下几步,算法过程如下所示:
首先,通过随机初始化为需要求解的参数赋初值,作为优化的起点;
接下来,使用模型对所有样本进行预测,计算总体的损失值;
然后利用损失值对模型参数进行求导,得到相应的梯度;
最后基于梯度调整参数,得到迭代之后的参数。
重复上述过程,直到达到停止条件。

2.随机梯度下降算法
上面的梯度下降算法需要首先计算所有数据上的损失值,然后再进行梯度下降,这种方式在数据规模比较大时是比较低效的。原因有三:
- 数据规模大,计算所有的样本的时间增加
- 数据维度增加,计算复杂度增加
- 虽然可以基于所有样本得到准确的梯度值,但是仅需进行一次参数更新。称这样的梯度下降算法为批梯度下降(
Batch Gradient Descent)。
如果不适用全量的样本来计算梯度,而使用单一样本来近似估计梯度,就能极大减少计算量,提高计算效率,而且这种算法能够保证收敛性,称之为随机梯度下降(Stochastic Gradient Descent, SGD)。
具体来说,每次从训练集中随机选择一个样本,计算其对应的损失和梯度,进行参数更新,反复迭代。这种方式在数据规模比较大时可以减少计算复杂度,从概率意义上来说单个样本的梯度是对整个数据梯度的无偏估计,但是它存在着一定的不确定性,因此收敛速率相比批梯度下降得更慢。
改进的方法是每次使用多个样本来估计梯度,这样可以减少不确定性,提高收敛速率。这种方法称为小批量随机梯度下降(mini-batch SGD),其中每次迭代选取的样本数量称为批大小(batch size),算法步骤如下:

2.神经网络
在机器学习领域,神经网络是指由很多人工神经元构成的网络结构模型,这些人工神经元之间的连接强度是可学习的参数。
2.1 神经元
一个基本神经元包括三个部分:输入信号,线性组合和非线性激活函数。

其中:
- z i = ∑ j = 1 m w i j x j z_i=\sum_{j=1}^m w_{ij}x_j zi=∑j=1mwijxj
- a i = σ ( z i + b ) a_i=\sigma (z_i+b) ai=σ(zi+b)
这里的 x 0 , x 1 , . . . , x m x_0,x_1,...,x_m x0,x1,...,xm是输入信号, w i 0 , w i 1 , . . . , w i m w_{i0},w_{i1},...,w_{im} wi0,wi1,...,wim是神经元的权值,而 z i z_i zi则是输入信号的线性组合。 b b b是偏置,激活函数为 σ ( ⋅ ) \sigma (\cdot) σ(⋅), a i a_i ai是神经元输出信号。
2.2 多层感知机
2.2.1 单隐层感知器
单隐藏层的感知器如下图所示:

它通过将神经元进行堆叠得到,可以把它看成一个映射:
f
:
R
i
n
D
→
R
o
u
t
D
f:R^D_{in} \rightarrow R^D_{out}
f:RinD→RoutD
其中
D
i
n
D_{in}
Din表示输入层的神经元个数,也就是输入向量的维度,
D
o
u
t
D_{out}
Dout表示输出层神经元个数,也就是输出向量的维度。计算过程如(2.10)所示。
f
(
x
)
=
f
2
(
b
(
2
)
+
W
(
2
)
(
f
1
(
b
(
1
)
+
W
(
1
)
x
)
)
)
f(x) = f_2(b^{(2)}+W^{(2)}(f_1(b^{(1)}+W^{(1)}x)))
f(x)=f2(b(2)+W(2)(f1(b(1)+W(1)x)))
其中
b
(
1
)
,
b
(
2
)
b(1),b(2)
b(1),b(2)表示偏置,
W
(
1
)
,
W
(
2
)
W(1),W(2)
W(1),W(2)表示权重向量,
f
1
,
f
2
f_1,f_2
f1,f2表示激活函数。
h
(
x
)
=
f
1
(
b
(
1
)
+
W
(
1
)
x
)
h(x)=f_1(b^{(1)}+W^{(1)}x)
h(x)=f1(b(1)+W(1)x),就是隐藏层的输出。由此可见,隐藏层的输出就是对输入进行线性变换和非线性变换。
W
(
1
)
∈
R
D
i
n
×
D
h
W^{(1)}\in R^{D_{in}\times D_{h}}
W(1)∈RDin×Dh
是将输入向量变换为隐藏层向量的变换矩阵,
W
(
1
)
W^{(1)}
W(1)的每一列表示从输入连接到隐藏层一个神经元的权值向量。
f
1
f_1
f1表示激活函数,它对隐藏层的每个神经元进行变换,得到对应的输出。这种计算方式称为逐元素操作(Elementwise operator)。
2.2.2 感知机的信息传递
多层感知器(Multi-Layer Perceptron, MLP),也称为前馈神经网络。典型的多层感知机如下图所示:
多层感知器可以分为3个部分:输入层、隐藏层、输出层,其中隐藏层可以包括一层或者多层,每一层都由若干神经元组成,每个神经元承担的计算功能包括线性加权和非线性变换;层与层之间通过权值建立联系,后一层的每个神经元与前一层的每个神经元都产生连接。
输入信号通过不断地进行线性变换(线性加权)和非线性变换(激活函数),逐渐将输入信号向后一层传递,直到输出层。其中输入层和输出层的神经元个数往往是通过先验的知识确定的,而隐藏层中每层的神经元个数以及使用的层数都是超参数。
多层感知器的信息传播过程如下:
z
(
l
)
=
W
(
l
)
⋅
a
(
l
−
1
)
+
b
(
l
)
z^{(l)}=W^{(l)}\cdot a^{(l-1)}+b^{(l)}
z(l)=W(l)⋅a(l−1)+b(l)
a
(
l
)
=
σ
l
(
z
(
l
)
)
a^{(l)}=\sigma_l (z^{(l)})
a(l)=σl(z(l))
其中
W
(
l
)
∈
R
D
l
×
D
l
−
1
W^{(l)}\in R^{D_l \times D^{l-1}}
W(l)∈RDl×Dl−1是第
(
l
−
1
)
(l-1)
(l−1)到第
l
l
l层的变换参数,
D
l
−
1
D_{l-1}
Dl−1表示第
(
l
−
1
)
(l-1)
(l−1)层的神经元个数,
D
l
D_l
Dl表示第
l
l
l层的神经元个数;
b
(
l
)
∈
R
D
l
b^{(l)}\in R^{D_l}
b(l)∈RDl表示偏置项;
{
w
(
l
)
,
b
(
l
)
}
\{w^{(l)},b^{(l)}\}
{w(l),b(l)}是一层网络中可训练的参数。
σ
l
\sigma_l
σl是第
l
l
l层的激活函数。
z
(
l
)
∈
R
D
l
,
a
(
l
)
∈
R
D
l
z^{(l)}\in R^{D_l},a^{(l)}\in R^{D_l}
z(l)∈RDl,a(l)∈RDl分别表示线性变换的输出和激活函数的输出。
多层感知器逐层传递信息,得到输出y,整个网络可以看作一个复杂的复合函数 φ ( X ; W , b ) \varphi (X;W,b) φ(X;W,b),其中W,b表示参数的集合 { W l , b ( l ) ∣ l = 1 , 2 , 3... } \{W^{l}, b^{(l)}|l=1,2,3...\} {Wl,b(l)∣l=1,2,3...}。
2.3 激活函数
激活函数的非线性让神经网络可以逼近任何非线性函数,因为注意到神经网络中会先进行线性组合,如果没有非线性元素的引入,那么神经网络最后的结果一定是线性的,表达能力有限。
激活函数的选择可以多种多样,一个基本的要求是他们是连续可到的,可以允许在少数点上不可导。常见的激活函数包括S型激活函数和ReLU及其变种等。
2.3.1 S型激活函数
S型激活函数中比较典型的是Sigmoid和Tanh,这种激活函数的特点是有界。即
lim
x
→
∞
s
(
x
)
=
a
,
lim
x
→
∞
s
(
x
)
=
b
\lim_{x \to \infty} s(x) = a, \lim_{x \to \infty }s(x) = b
limx→∞s(x)=a,limx→∞s(x)=b,并且输入的绝对值越大,对应的梯度就越小,越趋近于0。
Sigmoid函数的定义如下:
σ
(
x
)
=
1
1
+
e
−
x
\sigma (x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1
Sigmoid函数将任意大小的输入都压缩到0到1之间,输入的值越大,压缩后越趋近于1;输入值越小,压缩后越趋近于0。当
x
∈
[
−
1
,
1
]
x\in [-1,1]
x∈[−1,1]时,可以近似看作线性函数,并且当
x
=
0
x=0
x=0时,函数值为0.5。
它在神经网络中常常用作二分类器最后一层的激活函数,可以将任意实数值转换为概率;另一个应用场景是由于它的值域为 ( 0 , 1 ) (0,1) (0,1),故可以作为一个类似开关的调节器,用于对其他信息进行调节。
另一个函数是Tanh,定义如下:
t
a
n
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
tanh(x)=ex+e−xex−e−x
相比较于Sigmoid,Tanh的值域范围也更大一些,为
(
−
1
,
1
)
(-1, 1)
(−1,1)。Sigmoid和Tanh的函数图像图下所示:

Tanh也可以作为”开关“调节输入信息。
2.3.2 ReLU及其变种
1.ReLU
线性整流函数(Reetified Linear Unit, ReLU)是目前深度学习模型中经常使用的激活函数。它的定义为当
x
>
=
0
x>=0
x>=0时,保持x不变进行输出;当
x
<
0
x<0
x<0时,输出为0。
R
e
L
U
(
x
)
=
{
x
i
f
x
>
=
0
0
i
f
x
<
0
ReLU(x)=\left\{\begin{matrix} x & if x>=0\\ 0 & if x<0 \end{matrix}\right.
ReLU(x)={x0ifx>=0ifx<0
可以看出,ReLU对正负值得处理方式完全不同,当输入为负时,全部置0,而输入为正时保持不变,这个特性称为单侧抑制。在隐藏层中,这个特性会为隐藏层得输出带来一定的稀疏性。同时由于它在输入为正时,输出保持不变,梯度为1,可以缓解梯度消失的问题。梯度公式如下:
∇
x
R
e
L
U
(
x
)
=
{
1
if
x
≥
0
0
if
x
<
0
\nabla_xReLU(x)=\begin{cases} 1 & \text{ if } x\ge0 \\ 0 & \text{ if } x<0 \end{cases}
∇xReLU(x)={10 if x≥0 if x<0
另外,单侧抑制在某些情况下可能会导致某个神经元”死亡“,原因是如果某个神经元输出始终为负,那么在进行反向传播时,其相应的梯度始终未0,导致无法进行有效的更新。
2.LeakyReLU
LeakyReLU在输入为负时,可以允许一定量的信息通过,具体做法是在输入为负时,输出为
λ
x
\lambda x
λx,如下所示:
L
e
a
k
y
R
e
L
U
(
x
)
=
{
x
if
x
>
0
λ
x
if
x
≤
0
LeakyReLU(x)=\begin{cases} x & \text{ if } x > 0 \\ \lambda x & \text{ if } x \le 0 \end{cases}
LeakyReLU(x)={xλx if x>0 if x≤0
其中
λ
>
0
\lambda >0
λ>0是一个超参数,通常取值为0.2,这样可以避免ReLU出现神经元“死亡”现象。
LeakyReLU的梯度如下:
∇
x
L
e
a
k
y
R
e
L
U
(
x
)
=
{
1
if
x
>
0
λ
if
x
<
=
0
\nabla _x LeakyReLU(x)=\begin{cases} 1 & \text{ if } x > 0 \\ \lambda & \text{ if } x <=0 \end{cases}
∇xLeakyReLU(x)={1λ if x>0 if x<=0
3.PReLU
PReLU(Parametric ReLU)在LeakyReLU的基础上更进一步,它将LeakyReLU中的超参数
λ
\lambda
λ改进为可以训练的参数,并且每个神经元可以使用不同的参数。对于单个神经元,PReLU的定义如下:
P
R
e
L
U
(
x
)
=
{
x
if
x
>
0
a
x
if
x
<
=
0
PReLU(x)=\begin{cases} x & \text{ if } x>0 \\ ax & \text{ if } x<=0 \end{cases}
PReLU(x)={xax if x>0 if x<=0
对于
x
∈
R
D
t
x\in R^{D_t}
x∈RDt,所需要的参数量为
D
l
D_l
Dl,因此相较于LeakyReLU,PReLU引入了更多的参数。另外对于维护更高的输入,比如卷积神经网络的中间层输出
x
∈
R
H
×
W
×
C
x\in R^{H\times W\times C}
x∈RH×W×C,不必为其中的每个元素均设置一个可训练的参数,可以在维度H和W上进行共享,这样需要的参数总量为C。
4.ELU
指数线性单元(Exponential Linear Unit,ELU)在输入为负时,进行非线性变换,如下所示:
E
L
U
(
x
)
=
{
x
if
x
>
=
0
α
(
e
x
)
−
1
if
x
<
0
ELU(x)=\begin{cases} x & \text{ if } x>=0 \\ \alpha(e^x)-1 & \text{ if } x<0 \end{cases}
ELU(x)={xα(ex)−1 if x>=0 if x<0
其中
α
>
0
\alpha >0
α>0,
α
\alpha
α是一个超参数,控制着输入为负时的饱和区。它具有调节激活值的均值为0的功能,可以加速神经网络的收敛。
ReLU、LeakyReLU、ELU函数曲线对比:

2.4 训练神经网络
反向传播方法的提出解决了训练神经网络的问题。它基于链式法则快速地计算参数的梯度,然后使用梯度下降算法进行参数更新。
2.4.1 神经网络的运行过程
神经网络的运行过程分为三步:
- 前向传播:给定输入和参数,逐层向前计算,最终得到模型预测结果
- 反向传播:基于前向传播得到的预测结果,使用损失函数得到损失值,然后计算相关参数的梯度,该计算方法称为
反向传播(back-propagation) - 参数更新:使用梯度下降算法对参数进行更新,重复上述过程,逐步迭代,直到模型收敛。

2.4.2 反向传播
以多层感知器为例介绍反向传播算法。给定样本:
{
(
x
n
,
y
n
)
}
n
=
1
N
\{(x_n,y_n)\}_{n=1}^N
{(xn,yn)}n=1N,使用多层感知器的消息传递公式可以进行前向传播,如下图所示:

给定样本
(
x
,
y
)
(x,y)
(x,y),前向传播得到输出
y
^
\hat{y}
y^,对应的损失值为
L
(
y
,
y
^
)
L(y,\hat{y})
L(y,y^),接下来求参数矩阵
W
(
l
)
W^{(l)}
W(l)的梯度
∂
L
(
y
,
y
^
)
∂
W
(
l
)
\frac{\partial L(y, \hat{y})}{\partial W^{(l)}}
∂W(l)∂L(y,y^),使用链式法则可以得到如下:
∂
L
(
y
,
y
^
)
∂
W
(
l
)
=
∂
z
(
l
)
∂
W
(
l
)
∂
L
(
y
,
y
^
)
∂
z
(
l
)
\frac{\partial L(y, \hat{y})}{\partial W^{(l)}} =\frac{\partial z^{(l)}} {\partial W^{(l)}} \frac{\partial L(y, \hat{y})}{\partial z^{(l)}}
∂W(l)∂L(y,y^)=∂W(l)∂z(l)∂z(l)∂L(y,y^)
定义
δ
(
l
)
=
∂
L
(
y
,
y
^
)
∂
z
(
l
)
\delta ^{(l)}=\frac{\partial L(y, \hat{y})}{\partial z^{(l)}}
δ(l)=∂z(l)∂L(y,y^)为误差项,它衡量的是
z
(
l
)
z^{(l)}
z(l)对损失的影响,进一步使用链式法则,得到如下公式:
δ
(
l
)
=
∂
L
(
y
,
y
^
)
∂
z
(
l
)
=
∂
a
(
l
)
∂
z
(
l
)
×
∂
z
(
l
+
1
)
∂
a
(
l
)
×
∂
L
(
y
,
y
^
)
∂
z
(
l
+
1
)
\delta ^{(l)}=\frac{\partial L(y, \hat{y})}{\partial z^{(l)}}=\frac{\partial a^{(l)}}{\partial z^{(l)}} \times \frac{\partial z^{(l+1)}}{\partial a^{(l)}} \times \frac{\partial L(y, \hat{y})}{\partial z^{(l+1)}}
δ(l)=∂z(l)∂L(y,y^)=∂z(l)∂a(l)×∂a(l)∂z(l+1)×∂z(l+1)∂L(y,y^)
基于公式
z
(
l
+
1
)
=
W
(
l
+
1
)
a
(
l
)
+
b
(
l
+
1
)
z^{(l+1)}=W^{(l+1)}a^{(l)}+b^{(l+1)}
z(l+1)=W(l+1)a(l)+b(l+1)且
a
(
l
)
=
σ
(
z
(
l
)
)
a^{(l)}=\sigma (z^{(l)})
a(l)=σ(z(l))进行变换可以得到如下公式
δ
(
l
)
=
∂
L
(
y
,
y
^
)
∂
z
(
l
)
=
∂
a
(
l
)
∂
z
(
l
)
×
∂
z
(
l
+
1
)
∂
a
(
l
)
×
∂
L
(
y
,
y
^
)
∂
z
(
l
+
1
)
=
σ
′
(
z
(
l
)
)
⊙
W
(
l
+
1
)
T
δ
(
l
+
1
)
\delta ^{(l)}=\frac{\partial L(y, \hat{y})}{\partial z^{(l)}}=\frac{\partial a^{(l)}}{\partial z^{(l)}} \times \frac{\partial z^{(l+1)}}{\partial a^{(l)}} \times \frac{\partial L(y, \hat{y})}{\partial z^{(l+1)}}=\sigma '(z^{(l)})\odot W^{(l+1)^T}\delta^{(l+1)}
δ(l)=∂z(l)∂L(y,y^)=∂z(l)∂a(l)×∂a(l)∂z(l+1)×∂z(l+1)∂L(y,y^)=σ′(z(l))⊙W(l+1)Tδ(l+1)
其中
σ
′
(
z
(
l
)
)
\sigma '(z^{(l)})
σ′(z(l))是激活函数的导数。
⊙
\odot
⊙表示哈达玛积,它是一种对应元素相乘的二元运算符。从上式中可知,第一层的误差与第
l
+
1
l+1
l+1层的误差有关,这就是反向传播的来源。
那么对于
∂
L
(
y
,
y
^
)
∂
W
(
l
)
∈
R
D
l
×
D
l
−
1
\frac{\partial L(y, \hat{y})}{\partial W^{(l)}}\in R^{D_l \times D_{l-1}}
∂W(l)∂L(y,y^)∈RDl×Dl−1,可以得到式:
∂
L
(
y
,
y
^
)
∂
W
(
l
)
=
(
a
(
l
−
1
)
δ
(
l
)
)
T
\frac{\partial L(y, \hat{y})}{\partial W^{(l)}}=(a^{(l-1)}\delta ^{(l)})^T
∂W(l)∂L(y,y^)=(a(l−1)δ(l))T
偏置项
b
(
l
)
b^{(l)}
b(l)的导数为
∂
L
(
y
,
y
^
)
∂
b
(
l
)
=
δ
(
l
)
\frac{\partial L(y, \hat{y})}{\partial b^{(l)}}=\delta ^{(l)}
∂b(l)∂L(y,y^)=δ(l)。
2.4.3 优化困境
-
梯度消失:
从上面反向传播的链式公式可以看出,第 l l l层的误差是通过第 ( l + 1 ) (l+1) (l+1)层的误差与两层之间权重的加权,再乘以激活函数的导数得到的,如果激活函数使用Sigmoid,它的导数为 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma '(x)=\sigma (x)(1-\sigma (x)) σ′(x)=σ(x)(1−σ(x)),由于 σ ( x ) ∈ ( 0 , 1 ) \sigma (x)\in (0,1) σ(x)∈(0,1),它的导数的最大值为 σ ′ ( x ) = 0.25 \sigma '(x)=0.25 σ′(x)=0.25,当层数增加时,最后一层的误差将在前面的层中快速衰减,这会导致靠近输入层的梯度值非常小,参数几乎无法进行有效的更新,在下一次前向传播时,由于前面层的参数无法有效地从数据中获取有价值的信息供后面的层使用,模型就难以进行有效的训练,这种现象就是梯度消失。
导致梯度消失的原因在于激活函数的饱和性,比如Sigmoid和Tanh函数,它们在趋近于上下边界的时候梯度会比较小,再与误差项相乘将变得更小,多次的反向传播将会导致梯度值不断减小。如下图所示:

可以看出越靠近输入的层,它的值就越小,这就是梯度消失的表现。因此现在的神经网络通常使用 R e L U ReLU ReLU激活函数. -
局部最优与鞍点:尽管损失函数通常都是凸的,但是损失函数和参数之间的关系是非凸的,如下图所示:

深度神经模型具有非常多的局部最优,当陷入局部最优时,模型优化就会很困难,不过,深度神经网络模型通常存在非常多的局部最优点,往往这些局部最优解都能保证模型的效果。
另一个问题时,由于维度过高,深度神经网络模型也存在很多鞍点。鞍点指在该处梯度为0,但是它并不是最小值或者最大值,通常鞍点带来的麻烦更大。当处于鞍点区域并且误差较大时,由于这部分区域相对平坦,梯度值较小,模型收敛速度受到极大影响,造成一种陷入局部最优的假象。
参考资料
- 《深入浅出图神经网络:GNN原理解析》
- https://arxiv.org/ftp/arxiv/papers/1812/1812.08434.pdf
- https://www.jianshu.com/p/3a11faa9c8cb
- https://blog.youkuaiyun.com/Jeff__Fang/article/details/116865658
- https://blog.youkuaiyun.com/weixin_45884316/article/details/115751272
- https://zhuanlan.zhihu.com/p/75307407
- https://blog.youkuaiyun.com/qq_41800366/article/details/86583789
机器学习基础与神经网络
13万+

被折叠的 条评论
为什么被折叠?



