一、多层感知机
1.1 单层感知机
1943年,麦卡洛克和皮兹提出MCP模型,开启了人工神经网络的大门。该模型模拟人的神经元反应过程,对输入信号进行线性加权、求和后,再通过非线性激活(阈值法)输出。其数学表达式为:
y = f ( ∑ i = 1 n w i x i + b ) y=f\left(\sum_{i=1}^{n} w_{i} x_{i}+b\right) y=f(i=1∑nwixi+b)
其中, x i x_i xi是输入信号, w i w_i wi是对应的权重, b b b是偏置, f f f是激活函数。
假设一个简单的单层感知机,有两个输入 x 1 = 2 x_1 = 2 x1=2, x 2 = 3 x_2 = 3 x2=3,权重 w 1 = 0.5 w_1 = 0.5 w1=0.5, w 2 = 0.3 w_2 = 0.3 w2=0.3,偏置 b = 1 b = 1 b=1,激活函数采用单位阶跃函数(当输入大于0时输出为1,否则为0)。先计算线性组合:
z = w 1 x 1 + w 2 x 2 + b = 0.5 × 2 + 0.3 × 3 + 1 = 2.9 z = w_1x_1 + w_2x_2 + b = 0.5×2 + 0.3×3 + 1 = 2.9 z=w1x1+w2x2+b=0.5×2+0.3×3+1=2.9
由于 z > 0 z > 0 z>0,经过激活函数后输出 y = 1 y = 1 y=1。
1.2 神经网络
神经网络由多个神经元构成,各神经元具有不同的权重和偏置,这些权重和偏置是网络需要学习的参数。多个单层感知机组合在一起,就形成了神经网络。以一个简单的包含两个隐藏层的神经网络为例,输入层有两个神经元接收输入信号,隐藏层分别有三个和两个神经元,输出层有一个神经元。每个神经元都按照单层感知机的方式进行计算,前一层的输出作为后一层的输入,从而实现复杂的非线性映射。
1.3 激活函数
常见的激活函数有ReLU、LeakyReLU、PReLU和ELU等。
- ReLU函数: R e L U ( x ) = { x x ≥ 0 0 x < 0 ReLU(x)= \begin{cases}x & x \geq 0 \\ 0 & x<0\end{cases} ReLU(x)={x0x≥0x<0
例如,当 x = 3 x = 3 x=3时, R e L U ( 3 ) = 3 ReLU(3) = 3 ReLU(3)=3;当 x = − 2 x = -2 x=−2时, R e L U ( − 2 ) = 0 ReLU(-2) = 0 ReLU(−2)=0。 - LeakyReLU函数: L e a k y R e L U ( x ) = { x i f x > 0 γ x i f x ≤ 0 = m a x ( 0 , x ) + γ m i n ( 0 , x ) LeakyReLU(x) = \begin{cases}x & if x>0 \\ \gamma x & if x \leq 0\end{cases} =max (0, x)+\gamma min (0, x) LeakyReLU(x)={xγxifx>0ifx≤0=max(0,x)+γmin(0,x)
通常 γ \gamma γ取一个较小的值,如0.01。当 x = 5 x = 5 x=5时, L e a k y R e L U ( 5 ) = 5 LeakyReLU(5) = 5 LeakyReLU(5)=5;当 x = − 4 x = -4 x=−4时, L e a k y R e L U ( − 4 ) = 0.01 × ( − 4 ) = − 0.04 LeakyReLU(-4) = 0.01×(-4) = -0.04 LeakyReLU(−4)=0.01×(−4)=−0.04 。 - PReLU函数: P R e L U i ( x ) = { x i f x > 0 γ i x i f x ≤ 0 = m a x ( 0 , x ) + γ i m i n ( 0 , x ) PReLU_{i}(x) = \begin{cases}x & if x>0 \\ \gamma_{i} x & if x \leq 0\end{cases} =max (0, x)+\gamma_{i} min (0, x) PReLUi(x)={xγixifx>0ifx≤0=max(0,x)+γimin(0,x)
与LeakyReLU类似,但每个神经元可以有不同的 γ i \gamma_i γi值 。 - ELU函数: E L U ( x ) = { x i f x > 0 γ ( e x p ( x ) − 1 ) i f x ≤ 0 = m a x ( 0 , x ) + m i n ( 0 , γ ( e x p ( x ) − 1 ) ) ELU(x) = \begin{cases}x & if x>0 \\ \gamma(exp (x)-1) & if x \leq 0\end{cases} =max (0, x)+min (0, \gamma(exp (x)-1)) ELU(x)={xγ(exp(x)−1)ifx>0ifx≤0=max(0,x)+min(0,γ(exp(x)−1))
当 x = 2 x = 2 x=2时, E L U ( 2 ) = 2 ELU(2) = 2 ELU(2)=2;当 x = − 1 x = -1 x=−1,若 γ = 1 \gamma = 1 γ=1,则 E L U ( − 1 ) = 1 × ( e − 1 − 1 ) ≈ − 0.632 ELU(-1)=1×(e^{-1}-1)\approx -0.632 ELU(−1)=1×(e−1−1)≈−0.632 。
这些激活函数具有计算高效、符合生物学合理性、单侧抑制和宽兴奋边界的特点,在一定程度上能缓解梯度消失问题。如果神经网络中不使用非线性激活函数,即便增加更多隐藏层,在数学上也等价于一个单层感知机,无法学习复杂的非线性关系。
二、前馈神经网络
2.1 人工神经网络
人工神经网络主要由大量神经元及其之间的有向连接构成,构建时需要考虑三方面:神经元的激活规则,即输入到输出的非线性映射关系;网络的拓扑结构,也就是不同神经元之间的连接关系;学习算法,用于通过训练数据学习神经网络的参数。
2.2 前馈全连接神经网络
前馈全连接神经网络是人工神经网络的一种形式。其特点是各神经元分别属于不同层,层内无连接,相邻两层之间的神经元全部两两连接(全连接),整个网络中无反馈,信号从输入层向输出层单向传播(前馈)。
以一个简单的前馈全连接神经网络为例,输入层有3个神经元,隐藏层有4个神经元,输出层有2个神经元。输入层的每个神经元都与隐藏层的4个神经元相连,隐藏层的每个神经元又都与输出层的2个神经元相连。假设输入向量 x = [ x 1 , x 2 , x 3 ] T x = [x_1, x_2, x_3]^T x=[x1,x2,x3]T,输入层到隐藏层的权重矩阵 W [ 1 ] W^{[1]} W[1]是一个 4 × 3 4×3 4×3的矩阵,偏置向量 b [ 1 ] b^{[1]} b[1]是一个4维向量,隐藏层到输出层的权重矩阵 W [ 2 ] W^{[2]} W[2]是一个 2 × 4 2×4 2×4的矩阵,偏置向量 b [ 2 ] b^{[2]} b[2]是一个2维向量。通过前馈计算,可以得到输出结果。
2.3 逻辑回归模型
逻辑回归模型的公式为:
x w b } → z = w T x + b → y ^ = σ ( z ) → L ( y ^ , y ) \left.\begin{array}{c} x \\ w \\ b \end{array}\right\} \to z=w^{T} x+b \to \hat{y}=\sigma(z) \to L(\hat{y}, y) xwb⎭
⎬
⎫→z=wTx+b→y^=σ(z)→L(y^,y)
其中, x x x是输入特征向量, w w w是权重向量, b b b是偏置, z z z是线性组合的结果, σ ( z ) \sigma(z) σ(z)是sigmoid激活函数,用于将 z z z的值映射到 ( 0 , 1 ) (0, 1) (0,1)区间,得到预测值 y ^ \hat{y} y^, L ( y ^ , y ) L(\hat{y}, y) L(y^,y)是损失函数,用于衡量预测值与真实值 y y y之间的差异。
假设输入 x = [ 1 , 2 ] T x = [1, 2]^T x=[1,2]T, w = [ 0.3 , 0.4 ] T w = [0.3, 0.4]^T w=[0.3,0.4]T, b = 0.1 b = 0.1 b=0.1,先计算 z = w T x + b = 0.3 × 1 + 0.4 × 2 + 0.1 = 1.2 z = w^Tx + b = 0.3×1 + 0.4×2 + 0.1 = 1.2 z=wTx+b=0.3×1+0.4×2+0.1=1.2 ,再通过sigmoid函数 σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1 + e^{-z}} σ(z)=1+e−z1,可得 y ^ = 1 1 + e − 1.2 ≈ 0.777 \hat{y}=\frac{1}{1 + e^{-1.2}}\approx0.777 y^=1+e−1.21≈0.777 。
2.4 神经网络模型
神经网络模型中涉及多个记号: l l l表示神经网络的层数; M l M_l Ml表示第 l l l层神经元的个数; f l ( ⋅ ) f_l(\cdot) fl(⋅)表示第 l l l层神经元的激活函数; W ( l ) ∈ R M l × M l − 1 W^{(l)} \in \mathbb{R}^{M_{l} ×M_{l-1}} W(l)∈RMl×Ml−1是第 l − 1 l - 1 l−1层到第 l l l层的权重矩阵; b ( l ) ∈ R M l b^{(l)} \in \mathbb{R}^{M_{l}} b(l)∈RMl是第 l − 1 l - 1 l−1层到第 l l l层的偏置; z ( l ) ∈ R M l z^{(l)} \in \mathbb{R}^{M_{l}} z(l)∈RMl是第 l l l层神经元的净输入(净活性值); a ( l ) ∈ R M l a^{(l)} \in \mathbb{R}^{M_{l}} a(l)∈RMl是第 l l l层神经元的输出(活性值)。
以前馈神经网络的第一层为例,假设有输入 x = [ x 1 , x 2 , x 3 ] T x = [x_1, x_2, x_3]^T x=[x1,x2,x3]T,权重矩阵 W [ 1 ] W^{[1]} W[1]的第一列 w 1 [ 1 ] = [ w 11 [ 1 ] , w 21 [ 1 ] , w 31 [ 1 ] ] T w_1^{[1]} = [w_{11}^{[1]}, w_{21}^{[1]}, w_{31}^{[1]}]^T w1[1]=[w11[1],w21[1],w31[1]]T,偏置 b 1 [ 1 ] b_1^{[1]} b1[1],则第一个神经元的净输入为:
z 1 [ 1 ] = w 11 [ 1 ] x 1 + w 21 [ 1 ] x 2 + w 31 [ 1 ] x 3 + b 1 [ 1 ] = ( w 11 [ 1 ] , w 21 [ 1 ] , w 31 [ 1 ] ) ( x 1 x 2 x 3 ) + b 1 [ 1 ] = w 1 [ 1 ] T x [ 0 ] + b 1 [ 1 ] z_{1}^{[1]}=w_{11}^{[1]} x_{1}+w_{21}^{[1]} x_{2}+w_{31}^{[1]} x_{3}+b_{1}^{[1]}=\left(w_{11}^{[1]}, w_{21}^{[1]}, w_{31}^{[1]}\right)\left(\begin{array}{c}x_{1} \\ x_{2} \\ x_{3}\end{array}\right)+b_{1}^{[1]}=w_{1}^{[1] T} x^{[0]}+b_{1}^{[1]} z1[1]=w11[1]x1+w21[1]x2+w31[1]x3+b1[1]=(w11[1],w21[1],w31[1])
x1x2x3
+b1[1]=w1[1]Tx[0]+b1[1]
经过激活函数 f 1 f_1 f1后得到输出 a 1 [ 1 ] = f 1 ( z 1 [ 1 ] ) a_{1}^{[1]} = f_1(z_{1}^{[1]}) a1[1]=f1(z1[1]) 。
2.5 前馈计算—信息向前传递
前馈计算的过程为:
z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) , z^{(l)}=W^{(l)} a^{(l-1)}+b^{(l)}, z(l)=W(l)a(l−1)+b(l),
a ( l ) = f l ( z ( l ) ) . a^{(l)}=f_{l}\left(z^{(l)}\right). a(l)=fl(z(l)).
x = a ( 0 ) → z ( 1 ) → a ( 1 ) → z ( 2 ) → ⋯ → a ( L − 1 ) → z ( L ) → a ( L ) = ϕ ( x ; W , b ) x=a^{(0)} \to z^{(1)} \to a^{(1)} \to z^{(2)} \to \cdots \to a^{(L-1)} \to z^{(L)} \to a^{(L)}=\phi(x ; W, b) x=a(0)→z(1)→a(1)→z(2)→⋯→a(L−1)→z(L)→a(L)=ϕ(x;W,b)
其中, x x x是输入, W W W和 b b b是网络参数, L L L是网络的层数。
假设有一个3层的前馈神经网络,输入 x = [ 1 , 2 , 3 ] T x = [1, 2, 3]^T x=[1,2,3]T,第一层权重矩阵 W [ 1 ] W^{[1]} W[1] 、偏置 b [ 1 ] b^{[1]} b[1],第二层权重矩阵 W [ 2 ] W^{[2]} W[2] 、偏置 b [ 2 ] b^{[2]} b[2] ,第三层权重矩阵 W [ 3 ] W^{[3]} W[3] 、偏置 b [ 3 ] b^{[3]} b[3] 。先计算第一层的净输入 z [ 1 ] = W [ 1 ] x + b [ 1 ] z^{[1]} = W^{[1]}x + b^{[1]} z[1]=W[1]x+b[1] ,经过激活函数得到 a [ 1 ] = f 1 ( z [ 1 ] ) a^{[1]} = f_1(z^{[1]}) a[1]=f1(z[1]) ;然后将 a [ 1 ] a^{[1]} a[1]作为第二层的输入,计算 z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] z^{[2]} = W^{[2]}a^{[1]} + b^{[2]} z[2]=W[2]a[1]+b[2] ,再经过激活函数得到 a [ 2 ] = f 2 ( z [ 2 ] ) a^{[2]} = f_2(z^{[2]}) a[2]=f2(z[2]) ;最后计算第三层的 z [ 3 ] = W [ 3 ] a [ 2 ] + b [ 3 ] z^{[3]} = W^{[3]}a^{[2]} + b^{[3]} z[3]=W[3]a[2]+b[3] ,经过激活函数得到最终输出 a [ 3 ] = f 3 ( z [ 3 ] ) a^{[3]} = f_3(z^{[3]}) a[3]=f3(z[3]) 。
2.6 通用近似定理
通用近似定理表明,令 φ ( ⋅ ) \varphi(\cdot) φ(⋅)是一个非常数、有界、单调递增的连续函数, I d I_d Id是一个 d d d维的单位超立方体 [ 0 , 1 ] d [0,1]^d [0,1]d , C ( I d ) C(I_d) C(Id)是定义在 I d I_d Id上的连续函数集合。对于任何一个函数 f ∈ C ( I d ) f \in C(I_d) f∈C(Id) ,存在一个整数 m m m ,和一组实数 v i v_i vi , b i ∈ R b_i \in \mathbb{R} bi∈R以及实数向量 w i ∈ R d 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 i T x + b i ) F(x)=\sum_{i=1}^{m} v_{i} \varphi\left(w_{i}^{T} x+b_{i}\right) F(x)=i=1∑mviφ(wiTx+bi)
作为函数 f f f的近似实现,即:
∣ F ( x ) − f ( x ) ∣ < ϵ , ∀ x ∈ I d |F(x)-f(x)|<\epsilon, \forall x \in \mathcal{I}_{d} ∣F(x)−f(x)∣<ϵ,∀x∈Id
其中 ϵ > 0 \epsilon>0 ϵ>0是一个很小的正数。这意味着具有线性输出层和至少一个使用“挤压”性质激活函数的隐藏层的前馈神经网络,只要隐藏层神经元数量足够,就可以以任意精度近似任何定义在实数空间中有界闭集的函数。
2.7 Deep is better
在图像分类任务中,深度神经网络表现出了优异的性能。例如,AlexNet(2012)、VGG(2014)、GoogleNet(2014)和Residual Net(2015)等网络结构,随着网络深度的增加,在图像分类任务上的错误率逐渐降低。如152层的特殊结构网络,错误率可低至3.57%,而较浅的网络错误率相对较高,这充分说明了深度神经网络在处理复杂图像分类任务时的优势。
2.8 深度神经网络
深度神经网络具有许多隐含层,通过这些隐含层可以自动学习数据的多层次特征表示。在图像分类中,浅层网络可能只能学习到图像的边缘、颜色等简单特征,而深层网络可以逐渐学习到更复杂的特征,如物体的形状、纹理以及它们之间的空间关系等,从而提高分类的准确性。
三、梯度反向传播
3.1 全连接网络
3.1.1 参数学习
给定训练集为 D = ( x ( n ) , y ( n ) ) n = 1 N D={(x^{(n)}, y^{(n)})}_{n=1}^{N} D=(x(n),y(n))n=1N ,将每个样本 x ( n ) x^{(n)} x(n)输入给前馈神经网络,得到网络输出为 y ^ ( n ) \hat{y}^{(n)} y^(n) ,其在数据集 D D D上的损失函数为:
R ( W , b ) = 1 N ∑ n = 1 N L ( y ( n ) , y ^ ( n ) ) + 1 2 λ ∥ W ∥ F 2 \mathcal{R}(W, b)=\frac{1}{N} \sum_{n=1}^{N} \mathcal{L}\left(y^{(n)}, \hat{y}^{(n)}\right)+\frac{1}{2} \lambda\| W\| _{F}^{2} R(W,b)=N1n=1∑NL(y(n),y^(n))+21λ∥W∥F2
其中, L ( y ( n ) , y ^ ( n ) ) \mathcal{L}\left(y^{(n)}, \hat{y}^{(n)}\right) L(y(n),y^(n))是单个样本的损失函数, λ \lambda λ是正则化参数,用于防止过拟合, ∥ W ∥ F 2 \| W\| _{F}^{2} ∥W∥F2是权重矩阵 W W W的Frobenius范数。通过梯度下降法更新参数:
W ( l ) ← W ( l ) − α ∂ R ( W , b ) ∂ W ( l ) W^{(l)} \leftarrow W^{(l)}-\alpha \frac{\partial \mathcal{R}(W, b)}{\partial W^{(l)}} W(l)←W(l)−α∂W(l)∂R(W,b)
b ( l ) ← b ( l ) − α ∂ R ( W , b ) ∂ b ( l ) b^{(l)} \leftarrow b^{(l)}-\alpha \frac{\partial \mathcal{R}(W, b)}{\partial b^{(l)}} b(l)←b(l)−α∂b(l)∂R(W,b)
其中, α \alpha α是学习率,控制参数更新的步长。
假设一个简单的全连接网络,有两个样本 ( x ( 1 ) , y ( 1 ) ) (x^{(1)}, y^{(1)}) (x(1),y(1))和 ( x ( 2 ) , y ( 2 ) ) (x^{(2)}, y^{(2)}) (x(2),y(2)),损失函数为均方误差损失 L ( y ( n ) , y ^ ( n ) ) = 1 2 ( y ( n ) − y ^ ( n ) ) 2 \mathcal{L}\left(y^{(n)}, \hat{y}^{(n)}\right)=\frac{1}{2}(y^{(n)} - \hat{y}^{(n)})^2 L(y(n),y^(n))=21(y(n)−y^(n))2 ,权重矩阵 W W W是一个 2 × 3 2×3 2×3的矩阵,偏置向量 b b b是一个2维向量, λ = 0.1 \lambda = 0.1 λ=0.1 , α = 0.01 \alpha = 0.01 α=0.01 。先计算损失函数 R ( W , b ) \mathcal{R}(W, b) R(W,b) ,再分别计算 ∂ R ( W , b ) ∂ W \frac{\partial \mathcal{R}(W, b)}{\partial W} ∂W∂R(W,b)和 ∂ R ( W , b ) ∂ b \frac{\partial \mathcal{R}(W, b)}{\partial b} ∂b∂R(W,b) ,最后按照梯度下降公式更新 W W W和 b b b 。
3.1.2 梯度下降
梯度下降类似于盲人下山,通过不断沿着梯度的反方向调整网络参数,使得损失函数逐渐减小。对于神经网络这个复杂的复合函数,其梯度计算基于链式法则。例如,对于复合函数 y = f 5 ( f 4 ( f 3 ( f 2 ( f 1 ( x ) ) ) ) ) y=f^{5}\left(f^{4}\left(f^{3}\left(f^{2}\left(f^{1}(x)\right)\right)\right)\right) y=f5(f4(f3(f2(f1(x))))) ,其对 x x x的导数为:
∂ y ∂ x = ∂ f 5 ∂ f 4 ∂ f 4 ∂ f 3 ∂ f 3 ∂ f 2 ∂ f 2 ∂ f 1 ∂ f 1 ∂ x \frac{\partial y}{\partial x}=\frac{\partial f^{5}}{\partial f^{4}} \frac{\partial f^{4}}{\partial f^{3}} \frac{\partial f^{3}}{\partial f^{2}} \frac{\partial f^{2}}{\partial f^{1}} \frac{\partial f^{1}}{\partial x} ∂x∂y=∂f4∂f5∂f3∂f4∂f2∂f3∂f1∂f2∂x∂f1
3.1.3 链式法则
链式法则是微积分中求复合函数导数的常用方法:
- 若 x ∈ R x \in \mathbb{R} x∈R , u = u ( x ) ∈ R s u = u(x) \in \mathbb{R}^{s} u=u(x)∈Rs , g = g ( u ) ∈ R t g = g(u) \in \mathbb{R}^{t} g=g(u)∈Rt ,则:
∂ g ∂ x = ∂ u ∂ x ∂ g ∂ u ∈ R 1 × t \frac{\partial g}{\partial x}=\frac{\partial u}{\partial x} \frac{\partial g}{\partial u} \in \mathbb{R}^{1 × t} ∂x∂g=∂x∂u∂u∂g∈R1×t - 若 x ∈ R p x \in \mathbb{R}^{p} x∈Rp , y = g ( x ) ∈ R s y = g(x) \in \mathbb{R}^{s} y=g(x)∈Rs , z = f ( y ) ∈ R t z = f(y) \in \mathbb{R}^{t} z=f(y)∈Rt ,则:
∂ z ∂ x = ∂ y ∂ x ∂ z ∂ y ∈ R p × t \frac{\partial z}{\partial x}=\frac{\partial y}{\partial x} \frac{\partial z}{\partial y} \in \mathbb{R}^{p × t} ∂x∂z=∂x∂y∂y∂z∈Rp×t - 若 X ∈ R p × q X \in \mathbb{R}^{p ×q} X∈Rp×q为矩阵, y = g ( X ) ∈ R s y = g(X) \in \mathbb{R}^{s} y=g(X)∈Rs , z = f ( y ) ∈ R z = f(y) \in \mathbb{R} z=f(y)∈R ,则:
∂ z ∂ X i j = ∂ y ∂ X i j ∂ z ∂ y ∈ R \frac{\partial z}{\partial X_{i j}}=\frac{\partial y}{\partial X_{i j}} \frac{\partial z}{\partial y} \in \mathbb{R} ∂Xij∂z=∂Xij∂y∂y∂z∈R
假设函数 z = ( x 2 + 1 ) 3 z = (x^2 + 1)^3 z=(x2+1)3 ,令 u = x 2 + 1 u = x^2 + 1 u=x2+1 ,则 z = u 3 z = u^3 z=u3 。根据链式法则, ∂ z ∂ x = ∂ z ∂ u ∂ u ∂ x \frac{\partial z}{\partial x}=\frac{\partial z}{\partial u}\frac{\partial u}{\partial x} ∂x∂z=∂u∂z∂x∂u , ∂ z ∂ u = 3 u 2 \frac{\partial z}{\partial u}=3u^2 ∂u∂z=3u2 , ∂ u ∂ x = 2 x \frac{\partial u}{\partial x}=2x ∂x∂u=2x ,所以 ∂ z ∂ x = 3 ( x 2 + 1 ) 2 × 2 x = 6 x ( x 2 + 1 ) 2 \frac{\partial z}{\partial x}=3(x^2 + 1)^2×2x = 6x(x^2 + 1)^2 ∂x∂z=3(x2+1)2×2x=6x(x2+1)2 。
3.2 反向传播算法
反向传播算法是根据前馈网络的特点设计的高效计算梯度的方法。以一个简单的神经网络为例,包含输入层、一个隐藏层和输出层,假设网络的输出为 y ^ \hat{y} y^,损失函数为 L ( y , y ^ ) L(y, \hat{y}) L(y,y^),其中 y y y 是真实标签。
设输入层有 n n n 个神经元,隐藏层有 m m m 个神经元,输出层有 k k k 个神经元。输入向量为 x = [ x 1 , x 2 , ⋯ , x n ] T x = [x_1, x_2, \cdots, x_n]^T x=[x1,x2,⋯,xn]T,输入层到隐藏层的权重矩阵为 W ( 1 ) ∈ R m × n W^{(1)} \in \mathbb{R}^{m \times n} W(1)∈Rm×n,偏置向量为 b ( 1 ) ∈ R m b^{(1)} \in \mathbb{R}^{m} b(1)∈Rm;隐藏层到输出层的权重矩阵为 W ( 2 ) ∈ R k × m W^{(2)} \in \mathbb{R}^{k \times m} W(2)∈Rk×m,偏置向量为 b ( 2 ) ∈ R k b^{(2)} \in \mathbb{R}^{k} b(2)∈Rk。
前馈计算过程如下:
隐藏层的净输入: z ( 1 ) = W ( 1 ) x + b ( 1 ) z^{(1)} = W^{(1)}x + b^{(1)} z(1)=W(1)x+b(1)
隐藏层的输出: a ( 1 ) = f 1 ( z ( 1 ) ) a^{(1)} = f_1(z^{(1)}) a(1)=f1(z(1)),其中 f 1 f_1 f1 是隐藏层的激活函数
输出层的净输入: z ( 2 ) = W ( 2 ) a ( 1 ) + b ( 2 ) z^{(2)} = W^{(2)}a^{(1)} + b^{(2)} z(2)=W(2)a(1)+b(2)
输出层的输出: y ^ = a ( 2 ) = f 2 ( z ( 2 ) ) \hat{y} = a^{(2)} = f_2(z^{(2)}) y^=a(2)=f2(z(2)),其中 f 2 f_2 f2 是输出层的激活函数
反向传播的目标是计算损失函数 L ( y , y ^ ) L(y, \hat{y}) L(y,y^) 关于权重和偏置的梯度,即 ∂ L ∂ W ( 1 ) \frac{\partial L}{\partial W^{(1)}} ∂W(1)∂L、 ∂ L ∂ b ( 1 ) \frac{\partial L}{\partial b^{(1)}} ∂b(1)∂L、 ∂ L ∂ W ( 2 ) \frac{\partial L}{\partial W^{(2)}} ∂W(2)∂L 和 ∂ L ∂ b ( 2 ) \frac{\partial L}{\partial b^{(2)}} ∂b(2)∂L。
步骤 1:计算输出层的误差 δ ( 2 ) \delta^{(2)} δ(2)
δ ( 2 ) = ∂ L ∂ z ( 2 ) = ∂ L ∂ y ^ ⊙ f 2 ′ ( z ( 2 ) ) \delta^{(2)} = \frac{\partial L}{\partial z^{(2)}} = \frac{\partial L}{\partial \hat{y}} \odot f_2'(z^{(2)}) δ(2)=∂z(2)∂L=∂y^∂L⊙f2′(z(2))
其中, ⊙ \odot ⊙ 表示逐元素相乘, f 2 ′ ( z ( 2 ) ) f_2'(z^{(2)}) f2′(z(2)) 是输出层激活函数的导数。
假设损失函数为均方误差损失 L ( y , y ^ ) = 1 2 ∑ i = 1 k ( y i − y ^ i ) 2 L(y, \hat{y}) = \frac{1}{2} \sum_{i=1}^{k} (y_i - \hat{y}_i)^2 L(y,y^)=21∑i=1k(yi−y^i)2,则 ∂ L ∂ y ^ = y ^ − y \frac{\partial L}{\partial \hat{y}} = \hat{y} - y ∂y^∂L=y^−y。若输出层激活函数为 sigmoid 函数 f 2 ( z ) = 1 1 + e − z f_2(z) = \frac{1}{1 + e^{-z}} f2(z)=1+e−z1,其导数为 f 2 ′ ( z ) = f 2 ( z ) ( 1 − f 2 ( z ) ) f_2'(z) = f_2(z)(1 - f_2(z)) f2′(z)=f2(z)(1−f2(z))。
例如,设 y = [ 0 , 1 ] T y = [0, 1]^T y=[0,1]T, y ^ = [ 0.2 , 0.8 ] T \hat{y} = [0.2, 0.8]^T y^=[0.2,0.8]T, z ( 2 ) = [ 1 , 2 ] T z^{(2)} = [1, 2]^T z(2)=[1,2]T, f 2 ( z ( 2 ) ) = [ 0.731 , 0.881 ] T f_2(z^{(2)}) = [0.731, 0.881]^T f2(z(2))=[0.731,0.881]T, f 2 ′ ( z ( 2 ) ) = [ 0.197 , 0.105 ] T f_2'(z^{(2)}) = [0.197, 0.105]^T f2′(z(2))=[0.197,0.105]T,则:
∂ L ∂ y ^ = [ 0.2 − 0 , 0.8 − 1 ] T = [ 0.2 , − 0.2 ] T \frac{\partial L}{\partial \hat{y}} = [0.2 - 0, 0.8 - 1]^T = [0.2, -0.2]^T ∂y^∂L=[0.2−0,0.8−1]T=[0.2,−0.2]T
δ ( 2 ) = [ 0.2 , − 0.2 ] T ⊙ [ 0.197 , 0.105 ] T = [ 0.0394 , − 0.021 ] T \delta^{(2)} = [0.2, -0.2]^T \odot [0.197, 0.105]^T = [0.0394, -0.021]^T δ(2)=[0.2,−0.2]T⊙[0.197,0.105]T=[0.0394,−0.021]T
步骤 2:计算隐藏层的误差 δ ( 1 ) \delta^{(1)} δ(1)
δ ( 1 ) = ( W ( 2 ) T δ ( 2 ) ) ⊙ f 1 ′ ( z ( 1 ) ) \delta^{(1)} = \left(W^{(2)T} \delta^{(2)}\right) \odot f_1'(z^{(1)}) δ(1)=(W(2)Tδ(2))⊙f1′(z(1))
其中, W ( 2 ) T W^{(2)T} W(2)T 是权重矩阵 W ( 2 ) W^{(2)} W(2) 的转置, f 1 ′ ( z ( 1 ) ) f_1'(z^{(1)}) f1′(z(1)) 是隐藏层激活函数的导数。
假设隐藏层激活函数为 ReLU 函数 f 1 ( z ) = max ( 0 , z ) f_1(z) = \max(0, z) f1(z)=max(0,z),其导数为 f 1 ′ ( z ) = { 1 , z > 0 0 , z ≤ 0 f_1'(z) = \begin{cases} 1, & z > 0 \\ 0, & z \leq 0 \end{cases} f1′(z)={1,0,z>0z≤0。设 W ( 2 ) = [ 0.1 0.2 0.3 0.4 ] W^{(2)} = \begin{bmatrix} 0.1 & 0.2 \\ 0.3 & 0.4 \end{bmatrix} W(2)=[0.10.30.20.4], z ( 1 ) = [ 0.5 , − 0.3 ] T z^{(1)} = [0.5, -0.3]^T z(1)=[0.5,−0.3]T,则 f 1 ′ ( z ( 1 ) ) = [ 1 , 0 ] T f_1'(z^{(1)}) = [1, 0]^T f1′(z(1))=[1,0]T。
W ( 2 ) T δ ( 2 ) = [ 0.1 0.3 0.2 0.4 ] [ 0.0394 − 0.021 ] = [ − 0.00236 − 0.00064 ] W^{(2)T} \delta^{(2)} = \begin{bmatrix} 0.1 & 0.3 \\ 0.2 & 0.4 \end{bmatrix} \begin{bmatrix} 0.0394 \\ -0.021 \end{bmatrix} = \begin{bmatrix} -0.00236 \\ -0.00064 \end{bmatrix} W(2)Tδ(2)=[0.10.20.30.4][0.0394−0.021]=[−0.00236−0.00064]
δ ( 1 ) = [ − 0.00236 − 0.00064 ] ⊙ [ 1 , 0 ] T = [ − 0.00236 0 ] \delta^{(1)} = \begin{bmatrix} -0.00236 \\ -0.00064 \end{bmatrix} \odot [1, 0]^T = \begin{bmatrix} -0.00236 \\ 0 \end{bmatrix} δ(1)=[−0.00236−0.00064]⊙[1,0]T=[−0.002360]
步骤 3:计算梯度
∂ L ∂ W ( 2 ) = δ ( 2 ) ( a ( 1 ) ) T \frac{\partial L}{\partial W^{(2)}} = \delta^{(2)} (a^{(1)})^T ∂W(2)∂L=δ(2)(a(1))T
∂ L ∂ b ( 2 ) = δ ( 2 ) \frac{\partial L}{\partial b^{(2)}} = \delta^{(2)} ∂b(2)∂L=δ(2)
∂ L ∂ W ( 1 ) = δ ( 1 ) x T \frac{\partial L}{\partial W^{(1)}} = \delta^{(1)} x^T ∂W(1)∂L=δ(1)xT
∂ L ∂ b ( 1 ) = δ ( 1 ) \frac{\partial L}{\partial b^{(1)}} = \delta^{(1)} ∂b(1)∂L=δ(1)
设 a ( 1 ) = [ 0.6 , 0.7 ] T a^{(1)} = [0.6, 0.7]^T a(1)=[0.6,0.7]T, x = [ 0.1 , 0.2 ] T x = [0.1, 0.2]^T x=[0.1,0.2]T,则:
∂ L ∂ W ( 2 ) = [ 0.0394 − 0.021 ] [ 0.6 0.7 ] = [ 0.02364 0.02758 − 0.0126 − 0.0147 ] \frac{\partial L}{\partial W^{(2)}} = \begin{bmatrix} 0.0394 \\ -0.021 \end{bmatrix} \begin{bmatrix} 0.6 & 0.7 \end{bmatrix} = \begin{bmatrix} 0.02364 & 0.02758 \\ -0.0126 & -0.0147 \end{bmatrix} ∂W(2)∂L=[0.0394−0.021][0.60.7]=[0.02364−0.01260.02758−0.0147]
∂ L ∂ b ( 2 ) = [ 0.0394 − 0.021 ] \frac{\partial L}{\partial b^{(2)}} = \begin{bmatrix} 0.0394 \\ -0.021 \end{bmatrix} ∂b(2)∂L=[0.0394−0.021]
∂ L ∂ W ( 1 ) = [ − 0.00236 0 ] [ 0.1 0.2 ] = [ − 0.000236 − 0.000472 0 0 ] \frac{\partial L}{\partial W^{(1)}} = \begin{bmatrix} -0.00236 \\ 0 \end{bmatrix} \begin{bmatrix} 0.1 & 0.2 \end{bmatrix} = \begin{bmatrix} -0.000236 & -0.000472 \\ 0 & 0 \end{bmatrix} ∂W(1)∂L=[−0.002360][0.10.2]=[−0.0002360−0.0004720]
∂ L ∂ b ( 1 ) = [ − 0.00236 0 ] \frac{\partial L}{\partial b^{(1)}} = \begin{bmatrix} -0.00236 \\ 0 \end{bmatrix} ∂b(1)∂L=[−0.002360]
步骤 4:更新参数
根据梯度下降法,更新权重和偏置:
W ( 2 ) ← W ( 2 ) − α ∂ L ∂ W ( 2 ) W^{(2)} \leftarrow W^{(2)} - \alpha \frac{\partial L}{\partial W^{(2)}} W(2)←W(2)−α∂W(2)∂L
b ( 2 ) ← b ( 2 ) − α ∂ L ∂ b ( 2 ) b^{(2)} \leftarrow b^{(2)} - \alpha \frac{\partial L}{\partial b^{(2)}} b(2)←b(2)−α∂b(2)∂L
W ( 1 ) ← W ( 1 ) − α ∂ L ∂ W ( 1 ) W^{(1)} \leftarrow W^{(1)} - \alpha \frac{\partial L}{\partial W^{(1)}} W(1)←W(1)−α∂W(1)∂L
b ( 1 ) ← b ( 1 ) − α ∂ L ∂ b ( 1 ) b^{(1)} \leftarrow b^{(1)} - \alpha \frac{\partial L}{\partial b^{(1)}} b(1)←b(1)−α∂b(1)∂L
其中, α \alpha α 是学习率。假设 α = 0.01 \alpha = 0.01 α=0.01,则更新后的参数为:
W new ( 2 ) = W ( 2 ) − 0.01 × [ 0.02364 0.02758 − 0.0126 − 0.0147 ] W^{(2)}_{\text{new}} = W^{(2)} - 0.01 \times \begin{bmatrix} 0.02364 & 0.02758 \\ -0.0126 & -0.0147 \end{bmatrix} Wnew(2)=W(2)−0.01×[0.02364−0.01260.02758−0.0147]
b new ( 2 ) = b ( 2 ) − 0.01 × [ 0.0394 − 0.021 ] b^{(2)}_{\text{new}} = b^{(2)} - 0.01 \times \begin{bmatrix} 0.0394 \\ -0.021 \end{bmatrix} bnew(2)=b(2)−0.01×[0.0394−0.021]
W new ( 1 ) = W ( 1 ) − 0.01 × [ − 0.000236 − 0.000472 0 0 ] W^{(1)}_{\text{new}} = W^{(1)} - 0.01 \times \begin{bmatrix} -0.000236 & -0.000472 \\ 0 & 0 \end{bmatrix} Wnew(1)=W(1)−0.01×[−0.0002360−0.0004720]
b new ( 1 ) = b ( 1 ) − 0.01 × [ − 0.00236 0 ] b^{(1)}_{\text{new}} = b^{(1)} - 0.01 \times \begin{bmatrix} -0.00236 \\ 0 \end{bmatrix} bnew(1)=b(1)−0.01×[−0.002360]
四、图像分类流程
4.1 数据准备
- 数据收集:收集大量的图像数据,这些图像应涵盖不同的类别,例如在猫狗分类任务中,需要收集猫和狗的图像。可以从公开数据集(如 ImageNet、CIFAR - 10 等)获取数据,也可以通过网络爬虫等方式自己收集。
- 数据标注:为每一张图像标注其所属的类别。例如,对于一张猫的图像,标注为“猫”这个类别。标注的准确性对模型的训练效果至关重要。
- 数据预处理:对收集到的图像进行预处理操作,包括:
- 归一化:将图像的像素值归一化到 [0, 1] 或 [-1, 1] 区间,例如将像素值除以 255 可以将像素值归一化到 [0, 1] 区间。假设图像的一个像素值为 128,则归一化后的值为 128 ÷ 255 ≈ 0.502 128 \div 255 \approx 0.502 128÷255≈0.502。
- 缩放:将所有图像调整为相同的尺寸,以便输入到神经网络中。例如,将所有图像都调整为 224×224 像素的大小。
- 数据增强:通过旋转、翻转、裁剪等方式增加数据的多样性,提高模型的泛化能力。例如,将图像随机水平翻转,原来在左边的物体就会出现在右边。
4.2 模型选择与构建
- 选择合适的模型架构:可以选择经典的神经网络架构,如 AlexNet、VGG、ResNet 等。例如,ResNet 通过引入残差块解决了深度神经网络训练过程中的梯度消失和梯度爆炸问题,能够训练更深的网络,从而学习到更复杂的特征。
- 构建模型:使用深度学习框架(如 PyTorch、TensorFlow 等)构建所选的模型。以 PyTorch 为例,构建一个简单的两层全连接神经网络的代码如下:
import torch
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
# 示例参数
input_size = 784 # 假设输入图像是 28x28 像素的,展平后为 784 维向量
hidden_size = 500
num_classes = 10 # 假设是 10 分类任务
model = SimpleNet(input_size, hidden_size, num_classes)
4.3 模型训练
- 定义损失函数:根据具体的任务选择合适的损失函数,在图像分类任务中,常用的损失函数是交叉熵损失函数。对于多分类问题,交叉熵损失函数的公式为:
L ( y , y ^ ) = − ∑ i = 1 C y i log ( y ^ i ) L(y, \hat{y}) = - \sum_{i=1}^{C} y_i \log(\hat{y}_i) L(y,y^)=−i=1∑Cyilog(y^i)
其中, y y y 是真实标签的 one - hot 编码, y ^ \hat{y} y^ 是模型的预测概率分布, C C C 是类别数。 - 定义优化器:选择合适的优化器来更新模型的参数,常用的优化器有随机梯度下降(SGD)、Adam 等。例如,使用 Adam 优化器的代码如下:
import torch.optim as optim
learning_rate = 0.001
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
- 训练循环:将数据分成多个批次(batch),每个批次的数据输入到模型中进行前馈计算,得到预测结果,然后计算损失函数,再通过反向传播算法计算梯度,最后使用优化器更新模型的参数。训练过程通常会进行多个轮次(epoch),直到模型的性能达到满意的程度。
num_epochs = 10
batch_size = 64
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# 前馈计算
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
4.4 模型评估
- 划分验证集和测试集:将收集到的数据划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于在训练过程中评估模型的性能,调整模型的超参数(如学习率、批次大小等),测试集用于最终评估模型的泛化能力。
- 评估指标:使用合适的评估指标来评估模型的性能,常用的评估指标有准确率、精确率、召回率、F1 值等。例如,准确率的计算公式为:
Accuracy = 正确预测的样本数 总样本数 \text{Accuracy} = \frac{\text{正确预测的样本数}}{\text{总样本数}} Accuracy=总样本数正确预测的样本数
4.5 模型部署
- 模型保存:将训练好的模型保存下来,以便后续使用。在 PyTorch 中,可以使用
torch.save()
函数保存模型的参数。
torch.save(model.state_dict(), 'model.pth')
- 部署模型:将保存的模型部署到实际应用中,例如开发一个图像分类的 Web 应用,用户上传一张图像,模型对其进行分类并返回结果。可以使用 Flask 等 Web 框架开发这样的应用。
综上所述,多层感知机、前馈神经网络、梯度反向传播算法以及图像分类流程构成了深度学习在图像分类领域的核心内容。通过不断地研究和改进这些技术,能够提高图像分类的准确性和效率,推动深度学习在更多领域的应用。