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

算法理论基础

激活函数

Sigmoid

σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+ez1

σ ′ ( z ) = σ ( z ) ( 1 − σ ( z ) ) \sigma'(z) = \sigma(z)(1-\sigma(z)) σ(z)=σ(z)(1σ(z))

tanh

σ ( z ) = e z − e − z e z + e − z = 1 − 2 e − z e z + e − z \sigma(z) = \frac{e^z-e^{-z}}{e^z+e^{-z}} = 1- \frac{2e^{-z}}{e^z + e^{-z}} σ(z)=ez+ezezez=1ez+ez2ez
σ ′ ( z ) = 1 − σ ( z ) 2 \sigma'(z) = 1-\sigma(z)^2 σ(z)=1σ(z)2

relu

σ ( z ) = {    0 , i f    z < 0    z , o t h e r w i s e \sigma(z) = \begin{cases} ~~0, & if ~~ z<0 \\ ~~z, & otherwise \end{cases} σ(z)={  0,  z,if  z<0otherwise
σ ′ ( z ) = {    0 , i f    z < 0    1 , o t h e r w i s e \sigma'(z) = \begin{cases} ~~0, &if ~~ z<0 \\ ~~1, & otherwise \end{cases} σ(z)={  0,  1,if  z<0otherwise

leakyrelu

σ ( z ) = {    z , i f    z > 0    a z , o t h e r w i s e \sigma(z) = \begin{cases} ~~z, & if ~~ z>0 \\ ~~az, & otherwise \end{cases} σ(z)={  z,  az,if  z>0otherwise                        ~~~~~~~~~~~~~~~~~~~~~~                       其中 a a a为斜率,又称倾斜因子。
σ ′ ( z ) = {    1 ,    i f z > 0    a , o t h e r w i s e \sigma'(z) = \begin{cases} ~~1, & ~~ if z>0 \\ ~~a, & otherwise \end{cases} σ(z)={  1,  a,  ifz>0otherwise

softmax

第 i 个类目的概率:
p i = a i ( N + 1 ) = σ ( s i ( N + 1 ) ) = e s i ( N + 1 ) ∑ j = 1 K e s j ( N + 1 ) p_i = a^{(N+1)}_i =\sigma(s^{(N+1)}_i)= \frac{e^{s^{(N+1)}_i}}{\sum_{j=1}^{K} e^{s^{(N+1)}_j}} pi=ai(N+1)=σ(si(N+1))=j=1Kesj(N+1)esi(N+1)

δ i j = { 1 i = j 0 i ≠ j \delta_{ij}= \begin{cases} 1& i=j\\ 0& i \neq j \end{cases} δij={10i=ji=j

∂ p i ∂ s j = p i ( δ i j − p j ) \frac{\partial p_i}{\partial s_j}=p_i(\delta_{ij}-p_j) sjpi=pi(δijpj)
softmax 求导的具体证明过程见博客:softmax激活+crossEntropy损失求导公式推导

损失函数

Mean Square Error

L o s s ( z , y ) = 1 2 ∑ i = 1 K ( z i − y i ) 2 Loss(\bm{z},\bm{y}) =\frac{1}{2} \sum_{i=1}^{K}(z_i-y_i)^2 Loss(z,y)=21i=1K(ziyi)2
∂ L o s s ∂ z = ( z − y ) \frac{\partial Loss}{\partial \bm{z}} = (\bm{z}-\bm{y}) zLoss=(zy)

Cross Entropy Loss

L o s s ( z , y ) = − ∑ i = 1 K y i log ⁡ z i = − y k log ⁡ z k Loss(z,y) = -\sum_{i=1}^{K}y_i\log z_i=-y_k\log z_k Loss(z,y)=i=1Kyilogzi=yklogzk
∂ L o s s ∂ z = − y z \frac{\partial Loss}{\partial \bm{z}} =-\frac{\bm{y}}{\bm{z}} zLoss=zy

  ~  
使用 CrossEntropy 损失,并用 Softmax 激活。可以极大的削弱梯度消失现象。
∂ L o s s ( a ( N + 1 ) , y ) ∂ s j ( N + 1 ) = a j ( N + 1 ) − y j \frac{\partial Loss(a^{(N+1)}, y)}{\partial s^{(N+1)}_j} = a^{(N+1)}_j -y_j sj(N+1)Loss(a(N+1),y)=aj(N+1)yj
原因证明过程见博客:softmax激活+crossEntropy损失求导公式推导

初始化方法

全零初始化

将神经网络所有参数全部初始化为零。

随机初始化

将神经网络所有参数初始化为某种数据分布。

  1. 高斯分布初始化
    参数服从固定均值和方差的高斯分布进行随机初始化,也可以考虑输入和输出神经元的数量,分别记作叫 n i n n_{in} nin n o u t n_{out} nout:
    W ∼ N ( 0 ,   2 n i n + n o u t ) \bm{W} \sim N(0, ~\sqrt{\frac{2}{n_{in}+n_{out}}}) WN(0, nin+nout2 )
  2. 均匀分布初始化
    参数服从 U [ − α ,   α ] U[-\alpha, ~\alpha] U[α, α]的均匀分布进行随机初始化,也可以考虑输入神经元的数量 n i n n_{in} nin:
    W ∼ U ( − 1 n i n ,   1 n i n ) \bm{W} \sim U(-\sqrt{\frac{1}{n_{in}}},~ \sqrt{\frac{1}{n_{in}}}) WU(nin1 , nin1 )

Xavier初始化

参数服从 U [ − α ,   α ] U[-\alpha, ~\alpha] U[α, α]的均匀分布进行随机初始化,目的是让输入和输出神经元的方差尽量一致。其中, α \alpha α通过推导证明得出:
W ∼ U ( − 2 n i n + n o u t ,   2 n i n + n o u t ) \bm{W} \sim U(-\sqrt{\frac{2}{n_{in}+n_{out}}},~ \sqrt{\frac{2}{n_{in}+n_{out}}}) WU(nin+nout2 , nin+nout2 )

具体的证明过程见博客: Xavier initialization 理解与实现(python 与 C)

凯明初始化

思想:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。

  1. 适用于ReLU的初始化方法:
    W ∼ N ( 0 , 2 n i n ) \bm{W} \sim N(0, \sqrt{\frac{2}{n_{in}}}) WN(0,nin2 )
  2. 适用于Leaky ReLU的初始化方法:
    W ∼ N ( 0 , 2 ( 1 + α 2 ) n i n ) \bm{W} \sim N(0, \sqrt{\frac{2}{(1+\alpha^2)n_{in}}}) WN(0,(1+α2)nin2 )

具体参见博客: 浅谈深度学习初始化参数(weight initialization)

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页