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。
神经网络由多个神经元构成,各神经元具有不同的权重和偏置,这些权重和偏置是网络需要学习的参数。多个单层感知机组合在一起,就形成了神经网络。以一个简单的包含两个隐藏层的神经网络为例,输入层有两个神经元接收输入信号,隐藏层分别有三个和两个神经元,输出层有一个神经元。每个神经元都按照单层感知机的方式进行计算,前一层的输出作为后一层的输入,从而实现复杂的非线性映射。
常见的激活函数有ReLU、LeakyReLU、PReLU和ELU等。
这些激活函数具有计算高效、符合生物学合理性、单侧抑制和宽兴奋边界的特点,在一定程度上能缓解梯度消失问题。如果神经网络中不使用非线性激活函数,即便增加更多隐藏层,在数学上也等价于一个单层感知机,无法学习复杂的非线性关系。
人工神经网络主要由大量神经元及其之间的有向连接构成,构建时需要考虑三方面:神经元的激活规则,即输入到输出的非线性映射关系;网络的拓扑结构,也就是不同神经元之间的连接关系;学习算法,用于通过训练数据学习神经网络的参数。
前馈全连接神经网络是人工神经网络的一种形式。其特点是各神经元分别属于不同层,层内无连接,相邻两层之间的神经元全部两两连接(全连接),整个网络中无反馈,信号从输入层向输出层单向传播(前馈)。
以一个简单的前馈全连接神经网络为例,输入层有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维向量。通过前馈计算,可以得到输出结果。
逻辑回归模型的公式为:
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 。
神经网络模型中涉及多个记号: 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]) 。
前馈计算的过程为:
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]) 。
通用近似定理表明,令 φ ( ⋅ ) \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是一个很小的正数。这意味着具有线性输出层和至少一个使用“挤压”性质激活函数的隐藏层的前馈神经网络,只要隐藏层神经元数量足够,就可以以任意精度近似任何定义在实数空间中有界闭集的函数。
在图像分类任务中,深度神经网络表现出了优异的性能。例如,AlexNet(2012)、VGG(2014)、GoogleNet(2014)和Residual Net(2015)等网络结构,随着网络深度的增加,在图像分类任务上的错误率逐渐降低。如152层的特殊结构网络,错误率可低至3.57%,而较浅的网络错误率相对较高,这充分说明了深度神经网络在处理复杂图像分类任务时的优势。
深度神经网络具有许多隐含层,通过这些隐含层可以自动学习数据的多层次特征表示。在图像分类中,浅层网络可能只能学习到图像的边缘、颜色等简单特征,而深层网络可以逐渐学习到更复杂的特征,如物体的形状、纹理以及它们之间的空间关系等,从而提高分类的准确性。
给定训练集为 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 。
梯度下降类似于盲人下山,通过不断沿着梯度的反方向调整网络参数,使得损失函数逐渐减小。对于神经网络这个复杂的复合函数,其梯度计算基于链式法则。例如,对于复合函数 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
链式法则是微积分中求复合函数导数的常用方法:
假设函数 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 。
反向传播算法是根据前馈网络的特点设计的高效计算梯度的方法。以一个简单的神经网络为例,包含输入层、一个隐藏层和输出层,假设网络的输出为 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。
δ ( 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
δ ( 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]
∂ 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]
根据梯度下降法,更新权重和偏置:
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]
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)
import torch.optim as optim
learning_rate = 0.001
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
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}')
torch.save()
函数保存模型的参数。torch.save(model.state_dict(), 'model.pth')
综上所述,多层感知机、前馈神经网络、梯度反向传播算法以及图像分类流程构成了深度学习在图像分类领域的核心内容。通过不断地研究和改进这些技术,能够提高图像分类的准确性和效率,推动深度学习在更多领域的应用。