对上一节的NN网络中的前向和反向传递函数进行详解

网络说明

前向传递函数

单个神经节点的前向传递为:
o u t p u t N = s i g m o i d ( ∑ i = 0 n ( o u t p u t i N − 1 ∗ W i ) + b ) o u t p u t N = R e L U ( ∑ i = 0 n ( o u t p u t i N − 1 ∗ W i N ) + b ) output^N = sigmoid(\sum_{i=0}^n(output_i^{N-1} * W^i) + b)\\ output^N = ReLU(\sum_{i=0}^n(output_i^{N-1} * W^N_i) + b) outputN=sigmoid(i=0n(outputiN1Wi)+b)outputN=ReLU(i=0n(outputiN1WiN)+b)

因此其单层的前行传递代码为

# output1 = F(output0,weight0,bias0,active_mode)
output1 = ReLU(np.dot(weight0, output0) + bias0) if active_mode == "ReLU" else sigmoid(np.dot(weight0, output0) + bias0)

将三层的前行传递函数串联将构成前向传递函数

def forward(input, weight0, bias0, weight1, bias1, weight2, bias2, active_mode)

前向传递函数参数讲解

input:为模型输入,在本项目中为,4*4转换为16*1的数据,所以input.shape因该为(16, 1)

input = input.reshape(-1, 1)  #将4x4矩阵展开为16x1列向量
print(input.shape)
  • weight0:为第一层隐藏层的输入权重,大小为num_hidden_layer0 * input.shape[0]为(16*16)的二维矩阵

初始化用np.random.randn(num_hidden_layer0, input.shape[0])生成。=注意.randn.rand区别=

  • bias0:为第一层隐藏层的输入偏执,大小为num_hidden_layer0 * 1为16*1

初始化用np.random.randn(num_hidden_layer0 , 1)生成

同理其他参数。

反向传播函数

我们采用预测输出output与我们给定的target(img)进行对比,做均方误差。我们的目标是最小化均方误差 (MSE)。
M S E = ∑ i = 0 n ( o u t p u t i N − i m g i ) 2 n + 1 MSE = \frac{\sum_{i=0}^n{(output^N_i - img_i)^2}}{n+1} MSE=n+1i=0n(outputiNimgi)2
i m g img img为目标值(实际值), o u t p u t output output为模型预测值,因为 o u t p u t output output为第N层输出所以 o u t p u t = o u t p u t N output = output^N output=outputN

所以首先对每个预测值 o u t p u t i N output^N_i outputiN 计算均方误差 M S E MSE MSE o u t p u t i N output^N_i outputiN的导数
d_output_layer = 均方误差( M S E MSE MSE)对模型的预测输出 o u t p u t i N output^N_i outputiN的导数
M S E ′ = ∑ i = 0 n ∂ M S E d o u t p u t i N = ∑ i = 0 n 2 ∗ o u t p u t i N − i m g i n + 1 MSE^\prime =\sum_{i=0}^n{ \frac{\partial_{MSE}}{\mathrm{d}_{output^N_i}}} = \sum_{i=0}^n{2 * \frac{output^N_i - img_i}{n+1}} MSE=i=0ndoutputiNMSE=i=0n2n+1outputiNimgi
又因为在神经节点中
o u t p u t i N = s i g m o i d ( ∑ i = 0 n ( o u t p u t i N − 1 ∗ W i ) + b ) output^N_i = sigmoid(\sum_{i=0}^n(output_i^{N-1} * W_i) + b) outputiN=sigmoid(i=0n(outputiN1Wi)+b)
所以
∂ o u t p u t N d W i = d o u t p u t N d { ∑ i = 0 n ( o u t p u t i N − 1 ∗ W i ) + b } ∗ d { ∑ i = 0 n ( o u t p u t i N − 1 ∗ W i ) + b } W i 其中: d o u t p u t N d { ∑ i = 0 n ( o u t p u t i N − 1 ∗ W i ) + b } = 激活函数的导数 d { ∑ i = 0 n ( o u t p u t i N − 1 ∗ W i ) + b } W i = o u t p u t i N − 1 \frac{\partial_{output^N}}{\mathrm{d}_{W_i}} = \frac{\mathrm{d}_{output^N}}{\mathrm{d}_\{\sum_{i=0}^n(output_i^{N-1} * W_i) + b\}}* \frac{\mathrm{d}_\{\sum_{i=0}^n(output_i^{N-1} * W_i) + b\}}{W_i}\\ 其中:\frac{\mathrm{d}_{output^N}}{\mathrm{d}_\{\sum_{i=0}^n(output_i^{N-1} * W_i) + b\}}=激活函数的导数\\ \frac{\mathrm{d}_\{\sum_{i=0}^n(output_i^{N-1} * W_i) + b\}}{W_i} = output_i^{N-1} dWioutputN=d{i=0n(outputiN1Wi)+b}doutputNWid{i=0n(outputiN1Wi)+b}其中:d{i=0n(outputiN1Wi)+b}doutputN=激活函数的导数Wid{i=0n(outputiN1Wi)+b}=outputiN1
又因为
Y = S i g m o i d ( x ) = 1 1 + e − x Y ′ = Y ∗ ( 1 − Y ) Y = Sigmoid(x) = \frac {1 }{1 + e^{-x}}\\ Y^\prime = Y * ( 1 - Y ) Y=Sigmoid(x)=1+ex1Y=Y(1Y)
所以
∂ o u t p u t N d W i = 激活函数的导数 ∗ o u t p u t i N − 1 = o u t p u t N ∗ ( 1 − o u t p u t N ) ∗ o u t p u t i N − 1 \frac{\partial_{output^N}}{\mathrm{d}_{W_i}} = 激活函数的导数 * output_i^{N-1} = output^N * (1-output^N) *output_i^{N-1} dWioutputN=激活函数的导数outputiN1=outputN(1outputN)outputiN1
同理
∂ o u t p u t N d b = 激活函数的导数 ∗ 1 = o u t p u t N ∗ ( 1 − o u t p u t N ) ∗ 1 \frac{\partial_{output^N}}{\mathrm{d}_{b}} = 激活函数的导数 * 1 = output^N * (1-output^N) *1 dboutputN=激活函数的导数1=outputN(1outputN)1
所以可知均方误差 M S E MSE MSE 对最后一层的输入权重 W i W_i Wi b b b的导数为:
∂ M S E d W i = ∂ M S E d o u t p u t i N ∗ ∂ o u t p u t i N d W j = 2 ∗ o u t p u t i N − i m g i n + 1 ∗ o u t p u t i N ∗ ( 1 − o u t p u t i N ) ∗ o u t p u t j N − 1 ∂ M S E d b = ∂ M S E d o u t p u t i N ∗ ∂ o u t p u t i N d b = 2 ∗ o u t p u t i N − i m g i n + 1 ∗ o u t p u t i N ∗ ( 1 − o u t p u t i N ) ∗ 1 \frac{\partial_{MSE}}{\mathrm{d}_{W_i}} =\frac{\partial_{MSE}}{\mathrm{d}_{output^N_i}}*\frac{\partial_{output^N_i}}{\mathrm{d}_{W_j}}= 2 * \frac{output^N_i - img_i}{n+1}*output^N_i * (1-output^N_i) *output_j^{N-1}\\ \frac{\partial_{MSE}}{\mathrm{d}_{b}} =\frac{\partial_{MSE}}{\mathrm{d}_{output^N_i}}*\frac{\partial_{output^N_i}}{\mathrm{d}_{b}}=2 * \frac{output^N_i - img_i}{n+1}*output^N_i * (1-output^N_i) * 1 dWiMSE=doutputiNMSEdWjoutputiN=2n+1outputiNimgioutputiN(1outputiN)outputjN1dbMSE=doutputiNMSEdboutputiN=2n+1outputiNimgioutputiN(1outputiN)1
根据我们所计算的 M S E MSE MSE和对输入权重 W i W_i Wi b b b的导数,我们可以计算出输入权重 W i W_i Wi b b b M S E MSE MSE减小方向上的梯度 g r a d w e i g h t grad_weight gradweight g r a d b i a s grad_bias gradbias
然后结合学习率 l e a r n i n g r a t e learning_rate learningrate对输入权重 W i W_i Wi b b b进行修正

 # 使用梯度下降法更新输出层的权重和偏置
    weight -= learning_rate * grad_weight  # 更新输出层的权重
    bias -= learning_rate * grad_bias  # 更新输出层的偏置

又因为由上面可知,对于每一层 Sigmoid的反向传递函数
∂ o u t p u t N d W i N = o u t p u t N ∗ ( 1 − o u t p u t N ) ∗ o u t p u t i N − 1 ∂ o u t p u t N d b N = o u t p u t N ∗ ( 1 − o u t p u t N ) ∗ 1 \frac{\partial_{output^N}}{\mathrm{d}_{W^N_i}} = output^N * (1-output^N) *output_i^{N-1}\\ \frac{\partial_{output^N}}{\mathrm{d}_{b^N}} = output^N * (1-output^N) *1 dWiNoutputN=outputN(1outputN)outputiN1dbNoutputN=outputN(1outputN)1
根据求导的链式法则

均方误差 M S E MSE MSE 对倒数第二层的输入权重 W i N − 1 W^{N-1}_i WiN1和$ b^{N-1} $的导数为
∂ M S E d W i N − 1 = W N ∗ ∂ M S E d o u t p u t i N ∗ 激活函数的导 数 N ∗ ∂ o u t p u t i N − 2 d W j N − 1 = W N ∗ ∂ M S E d o u t p u t i N ∗ 激活函数的导 数 N ∗ 激活函数的导 数 N − 1 ∗ o u t p u t j N − 2 ∂ M S E d b N − 1 = W N ∗ ∂ M S E d o u t p u t i N ∗ 激活函数的导 数 N ∗ ∂ o u t p u t i N − 2 d b N − 1 = W N ∗ ∂ M S E d o u t p u t i N ∗ 激活函数的导 数 N ∗ 激活函数的导 数 N − 1 ∗ 1 其中激活函 数 N = o u t p u t N ∗ ( 1 − o u t p u t N ) \frac{\partial_{MSE}}{\mathrm{d}_{W^{N-1}_i}} =W^N *\frac{\partial_{MSE}}{\mathrm{d}_{output^N_i}}* 激活函数的导数^N*\frac{\partial_{output^{N-2}_i}}{\mathrm{d}_{W^{N-1}_j}}\\ = W^N *\frac{\partial_{MSE}}{\mathrm{d}_{output^N_i}}* 激活函数的导数^N* 激活函数的导数^{N-1}*output_j^{N-2}\\ \frac{\partial_{MSE}}{\mathrm{d}_{b^{N-1}}} =W^N *\frac{\partial_{MSE}}{\mathrm{d}_{output^N_i}}* 激活函数的导数^N *\frac{\partial_{output^{N-2}_i}}{\mathrm{d}_{b^{N-1}}}\\ = W^N *\frac{\partial_{MSE}}{\mathrm{d}_{output^N_i}}* 激活函数的导数^N* 激活函数的导数^{N-1}*1\\ 其中激活函数^N = output^N * (1-output^N) dWiN1MSE=WNdoutputiNMSE激活函数的导NdWjN1outputiN2=WNdoutputiNMSE激活函数的导N激活函数的导N1outputjN2dbN1MSE=WNdoutputiNMSE激活函数的导NdbN1outputiN2=WNdoutputiNMSE激活函数的导N激活函数的导N11其中激活函N=outputN(1outputN)
均方误差 M S E MSE MSE 对倒数第三层同理,在一层基础上修改

最后希望各位大佬多多提出建议,轻点踩。

你可能感兴趣的:(神经网络,神经网络,python)