C语言BP神经网络框架-神经网络正反向传播

文章总览-手把手教你用C语言搭建一个全连接神经网络框架

符号对照表

数学符号对照表

符号 含义
x x x 标量
x \bm{x} x 向量
X \bm{X} X 矩阵
X X X 张量
( ⋅ ) T (\cdot)^T ()T 向量或者矩阵的转置
⊙ \odot 按元素相乘
∥ ⋅ ∥ p \|\cdot\|_p p L p L_p Lp范数
∥ ⋅ ∥ \|\cdot\| L 2 L_2 L2范数
∑ \sum 连加
∏ \prod 连乘
f ( ⋅ ) f(\cdot) f() 函数
log ⁡ ( ⋅ ) \log(\cdot) log() 自然对数函数
exp ⁡ ( ⋅ ) \exp(\cdot) exp() 指数函数
d y d x \frac{dy}{dx} dxdy y y y关于 x x x的导数
∂ y ∂ x \frac{\partial y}{\partial x} xy y y y关于 x x x的偏导
∇ x y \nabla_{\bm{x}} y xy y y y关于向量 x \bm{x} x的梯度
⋅ ∼ N ( μ , σ 2 ) \cdot \sim N(\mu, \sigma^2) N(μ,σ2) 随机变量 ⋅ \cdot 服从高斯分布
⋅ ∼ U ( − α ,   α ) \cdot \sim U(-\alpha,~ \alpha) U(α, α) 随机变量 ⋅ \cdot 服从均匀分布
E ( ⋅ ) E(\cdot) E() 随机变量 ⋅ \cdot 的数学期望
V a r ( ⋅ ) Var(\cdot) Var() 随机变量 ⋅ \cdot 的方差

神经网络参数符号对照表

符号 含义 备注
N t N_t Nt 训练样本维度 N t > 0 N_t>0 Nt>0
N T N_T NT 训练样本数量 N T > 0 N_T>0 NT>0
N ( i ) N^{(i)} N(i) 第i层神经元个数 i ∈ { 0 , 1 , 2 , ⋯   , H + 1 }      i = H + 1 i\in \{0,1,2,\cdots,H+1\}~~~~i=H+1 i{0,1,2,,H+1}    i=H+1表示输出层~~不带Bias
H H H 隐藏层数 包含H个隐藏层
K 分类类别数 K > 1 K>1 K>1
S l S_l Sl 损失函数 S l ∈ { Mean  Square   Error,Cross  Entropy  Loss } S_l\in \{\text{Mean~~Square ~~Error,Cross~~Entropy~~Loss}\} Sl{Mean  Square   ErrorCross  Entropy  Loss}
符号 含义 备注
x \bm{x} x 输入行向量 一个训练样本特征为一个行向量
y \bm{y} y 标签向量 一个训练样本标签为一个行向量 (ONEHOT)
s \bm{s} s 求和值行向量 每层对应一个行向量
a \bm{a} a **值行向量 每层对应一个行向量
σ \sigma σ **函数 σ ∈ { s i g m o i d , t a n h , r e l u , l e a k y r e l u , s o f t m a x } \sigma \in {\text\{sigmoid,tanh,relu,leaky relu,softmax}\} σ{sigmoid,tanh,relu,leakyrelu,softmax}
⋅ j ( i ) \bm{\cdot}^{(i)}_j j(i) i代表网络层次~~~j代表分量 0 ≤ i ≤ H + 1 0\leq i\leq H+1 0iH+1
符号 含义 备注
X \bm{X} X 输入训练样本 维度 N T × N t N_T\times N_t NT×Nt~~相当**值矩阵 A ( 0 ) A^{(0)} A(0)
X + \bm{X}^+ X+ 输入训练样本加偏置列 维度 N T × ( N t + 1 ) N_T\times (N_t+1) NT×(Nt+1)~~相当**值矩阵 ( A ( 0 ) ) + \big(A^{(0)}\big)^+ (A(0))+
S ( i ) \bm{S}^{(i)} S(i) 第 i 层求和值矩阵 维度 N T × N ( i ) N_T\times N^{(i)} NT×N(i)~~ i = 1 , ⋯   , H , H + 1 i=1,\cdots,H,H+1 i=1,,H,H+1
A ( i ) \bm{A}^{(i)} A(i) 第 i 层**值矩阵 维度 N T × N ( i ) N_T\times N^{(i)} NT×N(i)~~ i = 0 , 1 , ⋯   , H , H + 1 i=0,1,\cdots,H,H+1 i=0,1,,H,H+1
( A ( i ) ) + \big(\bm{A}^{(i)}\big)^+ (A(i))+ 第 i 层**值矩阵加偏置列 维度 N T × ( N ( i ) + 1 ) N_T\times (N^{(i)}+1) NT×(N(i)+1)~~ i = 0 , 1 , ⋯   , H i=0,1,\cdots,H i=0,1,,H
W ( i ) \bm{W}^{(i)} W(i) 第 i 层权值矩阵 维度 N ( i − 1 ) × N ( i ) N^{(i-1)}\times N^{(i)} N(i1)×N(i), i = 1 , ⋯   , H , H + 1 i=1,\cdots,H,H+1 i=1,,H,H+1.
W ( H + 1 ) \bm{W}^{(H+1)} W(H+1) 输出层权值矩阵 维度 N ( N ) × K N^{(N)}\times K N(N)×K~~标签有 K 个类目
W b ( i ) \bm{W}_b^{(i)} Wb(i) 第 i 层权值偏置矩阵 维度 ( N ( i − 1 ) + 1 ) × N ( i ) (N^{(i-1)}+1)\times N^{(i)} (N(i1)+1)×N(i), i = 1 , ⋯   , H , H + 1 i=1,\cdots,H,H+1 i=1,,H,H+1.
W b ( H + 1 ) \bm{W}_b^{(H+1)} Wb(H+1) 输出层权值偏置矩阵 维度 ( N ( N ) + 1 ) × K (N^{(N)}+1)\times K (N(N)+1)×K~~标签有 K 个类目
S ( H + 1 ) \bm{S}^{(H+1)} S(H+1) 输出层求和值矩阵 维度 $N_T\times K $
A ( H + 1 ) \bm{A}^{(H+1)} A(H+1) 输出层**值矩阵 维度 $N_T\times K $
Y \bm{Y} Y 训练数据标签 维度 N T × K N_T \times K NT×K (ONE-HOT)
Δ ( i ) \bm{\Delta}^{(i)} Δ(i) 反向传播中间变量矩阵 维度 N T × N ( i ) N_T \times N^{(i)} NT×N(i)~~ i = 1 , ⋯   , H , H + 1 i=1,\cdots,H,H+1 i=1,,H,H+1
Δ ( H + 1 ) \bm{\Delta}^{(H+1)} Δ(H+1) 输出层反向传播中间变量矩阵 维度 N T × K N_T \times K NT×K

神经网络正反向传播

神经网络的正反向传播是神经网络训练的重要组成部分,以图为例进行数学建模,最终扩展得到模型的矩阵运算形式。
C语言BP神经网络框架-神经网络正反向传播
自定义运算符:

  1. x + \bm{x}^+ x+ 运算符:为向量 x \bm{x} x添加 B i a s Bias Bias列,具体在第 0 0 0列添加全 1 1 1
    x = ( a b c d e f g h i )        x + = ( 1 a b c 1 d e f 1 g h i ) \bm{x} = \left( \begin{matrix} a & b & c \\ d & e & f \\ g & h & i \end{matrix} \right) ~~~~~~\bm{x}^+ = \left( \begin{matrix} 1 & a & b & c \\ 1 & d & e & f \\ 1 & g & h & i \end{matrix} \right) x=adgbehcfi      x+=111adgbehcfi

  2. x − \bm{x}^- x 运算符:为向量 x \bm{x} x删去 B i a s Bias Bias列,具体删除第 0 0 0列。
    x = ( a b c d e f g h i )        x − = ( b c e f h i ) \bm{x} = \left( \begin{matrix} a & b & c \\ d & e & f \\ g & h & i \end{matrix} \right) ~~~~~~ \bm{x}^- = \left( \begin{matrix} b & c \\ e & f \\ h & i \end{matrix} \right) x=adgbehcfi      x=behcfi

神经网络正向传播

  1. 神经网络示例推导:
    C语言BP神经网络框架-神经网络正反向传播

  2. 矩阵扩展推导形式:
    C语言BP神经网络框架-神经网络正反向传播

神经网络反向传播

  1. 示例推导:
    1.1 输出层权值梯度:
    C语言BP神经网络框架-神经网络正反向传播

    1.2 隐藏层权值梯度:
    C语言BP神经网络框架-神经网络正反向传播

  2. 矩阵扩展推导形式:
    2.1 输出层权值求导:
    C语言BP神经网络框架-神经网络正反向传播

    2.2 隐藏层权值求导:
    C语言BP神经网络框架-神经网络正反向传播

神经网络张量流

前向传播 维度 反向传播 维度
X \bm{X} X N T × ( N t + 1 ) N_T\times (N_t+1) NT×(Nt+1) LOSS Scalar
S ( 1 ) \bm{S}^{(1)} S(1) N T × N ( 1 ) N_T\times N^{(1)} NT×N(1) Δ ( H + 1 ) \bm{\Delta}^{(H+1)} Δ(H+1) N T × K N_T\times K NT×K
( A ( 1 ) ) + (\bm{A}^{(1)})^+ (A(1))+ N T × ( N ( 1 ) + 1 ) N_T\times (N^{(1)}+1) NT×(N(1)+1) ∇ W ( H + 1 ) L \nabla_{\bm{W}^{(H+1)}}\mathcal{L} W(H+1)L ( N ( H ) + 1 ) × K (N^{(H)}+1)\times K (N(H)+1)×K
S ( 2 ) \bm{S}^{(2)} S(2) N T × N ( 2 ) N_T\times N^{(2)} NT×N(2) Δ ( H ) \bm{\Delta}^{(H)} Δ(H) N T × ( N ( H ) + 1 ) N_T\times (N^{(H)}+1) NT×(N(H)+1)
( A ( 2 ) ) + (\bm{A}^{(2)})^+ (A(2))+ N T × ( N ( 2 ) + 1 ) N_T\times (N^{(2)}+1) NT×(N(2)+1) ∇ W ( N ) L \nabla_{\bm{W}^{(N)}}\mathcal{L} W(N)L ( N ( H − 1 ) + 1 ) × N ( H ) (N^{(H-1)}+1)\times N^{(H)} (N(H1)+1)×N(H)
⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots
S ( H ) \bm{S}^{(H)} S(H) N T × N ( H ) N_T\times N^{(H)} NT×N(H) Δ ( i ) \bm{\Delta}^{(i)} Δ(i) N T × ( N ( i ) + 1 ) N_T\times (N^{(i)}+1) NT×(N(i)+1)
( A ( H ) ) + (\bm{A}^{(H)})^+ (A(H))+ N T × ( N ( H ) + 1 ) N_T\times (N^{(H)}+1) NT×(N(H)+1) ∇ W ( i ) L \nabla_{\bm{W}^{(i)}}\mathcal{L} W(i)L ( N ( i − 1 ) + 1 ) × N ( i ) (N^{(i-1)}+1)\times N^{(i)} (N(i1)+1)×N(i)
S ( H + 1 ) \bm{S}^{(H+1)} S(H+1) N T × K N_T\times K NT×K Δ ( 1 ) \bm{\Delta}^{(1)} Δ(1) N T × ( N ( 1 ) + 1 ) N_T\times (N^{(1)}+1) NT×(N(1)+1)
A ( H + 1 ) \bm{A}^{(H+1)} A(H+1) N T × K N_T\times K NT×K ∇ W ( 1 ) L \nabla_{\bm{W}^{(1)}}\mathcal{L} W(1)L ( N t + 1 ) × N ( 1 ) (N_t+1)\times N^{(1)} (Nt+1)×N(1)
计算Loss 计算Loss 更新梯度 更新梯度