0_1-全连接层、损失函数的反向传播

numpy实现神经网络系列

工程地址:https://github.com/yizt/numpy_neuron_network

基础知识

0_1-全连接层、损失函数的反向传播

0_2_1-卷积层的反向传播-单通道、无padding、步长1

0_2_2-卷积层的反向传播-多通道、无padding、步长1

0_2_3-卷积层的反向传播-多通道、无padding、步长不为1

0_2_4-卷积层的反向传播-多通道、有padding、步长不为1

0_2_5-池化层的反向传播-MaxPooling、AveragePooling、GlobalAveragePooling、GlobalMaxPooling

0_3-激活函数的反向传播-ReLU、LeakyReLU、PReLU、ELU、SELU

0_4-优化方法-SGD、AdaGrad、RMSProp、Adadelta、Adam

DNN练习

1_1_1-全连接神经网络做线性回归

1_1_2-全连接神经网络做mnist手写数字识别

CNN练习

2_1-numpy卷积层实现

2_2-numpy池化层实现

2_3-numpy-cnn-mnist手写数字识别

本文目录

本文下载地址:0_1-全连接层、损失函数的反向传播

依赖知识

a) 了解神经网络的基础知识

b) 熟悉导数的链式法则及常见函数的导数

c) 熟悉常见的优化方法,梯度下降,随机梯度下降等

d) 熟悉矩阵和向量的乘加运算

约定说明

a) 对于一个 n 层神经网络,第 i 层表示为 l i ,   1 i n ,第 i 神经元个数为 | l i | ; 注意 l i 是输入层, l n 是输出层。

b) 对于神经网络的一个输入样本 x ,其维度为 ( 1 , | l 1 | ) ,也就是一个行向量;对应的输出 y 也是一个行向量,维度为 ( 1 , | l n | ) 。(注:也可以将 x y 表示为列向量,这里预先说明好为行向量,避免后面有歧义)

c) 设神经网络中第i层的输出为 z i ,( z i 都是行向量)则 x = z 1 , y = z n ; 第 i 层的权重和偏置分别为 W i , b i ;则对于全连接层 z i + 1 = z i W i + b i ; 其中 W i b i 的维度分别为为 ( | l i | , | l i + 1 | ) , ( 1 , | l i + 1 | )

d) 定义损失函数为 L ( y , y ) ;其中 y 为样本的真实 y

误差反向

a) 记损失函数L关于第 i 层神经元的输出 z i 的偏导为 δ i = L z i       ( 1 )

b) 首先我们来看看损失函数L在最后一层参数上的偏导;也就是 L W n 1 L b n 1

L W i , j n 1       = L z j n z j n W i , j n 1       ( 2 )         / / W i , j n 1 n 1 i n j z j n W i , j n 1 = δ j n ( k = 1 | l n 1 | z k n 1 W k , j n 1 + b j n 1 ) W i , j n 1       ( 3 )       / / z j n z n 1 W n 1 j , b j n 1 = δ j n z i n 1         ( 4 )

对等式(4)一般化的向量表示为:

(5) L W n 1 = ( z n 1 ) T δ j n

同理可得:

(6) L b n 1 = δ n

c) 更一般的损失函数L关于第 l 层(这里没有用索引 i ,避免跟等式1~4中的索引名相同,引起理解障碍)的参数上的偏导,也就是 L W l L b l

L W l = L z l + 1 z l + 1 W l         ( 7 ) = ( z l ) T δ l + 1         ( 8 )

同理可得:
(9) L b l = δ l + 1

d) 现在我们来看a)中定义的损失函数L关于第 l 层输出的偏导 δ l = L z l
(1) δ i l = L z i l       (2) = L z l + 1 z l + 1 z i l       ( 10 )         / / (3) = L z l + 1 ( z l W l + b l ) z i l       ( 11 )         / / z l (4) = j = 1 | l l + 1 | L z j l + 1 ( k = 1 | l l | z k l W k , j l + b j l ) z i l       ( 12 )         / / l + 1 l i (5) = j = 1 | l l + 1 | δ j l + 1 W i , j l       ( 13 )         / / k = i (6) = δ l + 1 ( ( W l ) T ) i       ( 14 )         / / l + 1 W l i

一般化的表示如下:
δ l = L z l = δ l + 1 ( W l ) T       ( 15 )

结论

​ 以上的证明就是为了说明下面的结论,所以请牢记以下的结论,后续自己写神经网络的反向传播都会用到以下结论

a) 根据公式15,损失函数L关于第 l 层神经元的偏导,就是第 l + 1 层的偏导乘上第l层权重矩阵的转置。我们将公式(15)递归一下, δ l = δ l + 1 ( W l ) T = δ l + 2 ( W l + 1 ) T ( W l ) T = δ n ( W n 1 ) T ( W n 2 ) T . . . ( W l ) T     ( 16 )

​ 也就是说,只要求得损失函数L关于最后一层(n)的偏导 δ n ,其它任意层的偏导,直接用最后一层的偏导逐层乘上权重的转置即可。很简单,很对称,有木有?

b) 根据公式(8) ,损失函数L关于第 l 层权重 W l 的偏导为,第 l 层输出的转置乘第 l + 1 层的偏导 L W l = ( z l ) T δ l + 1         ( 8 )

c) 根据公式(9) ,损失函数L关于第 l 层偏置 b l 的偏导,就是第 l + 1 层的偏导: L b l = δ l + 1       ( 9 )

​ 由以上可知对任意的全连接层,我们只需要只到它后一层的偏导,就可以求得当前层参数(权重、偏置)的偏导; 就可以使用梯度下降算法更新参数了

(17) w = w η L w     / / η

(18) b = b η L b

​ 根据公式(16), 损失函数L关于任何一层的偏导,只需要求导损失函数关于最后一层的偏导 δ n 即可。 δ n 与损失函数的定义有关,下一节介绍常用损失函数的偏导计算。

常用损失函数

​ 以下说明损失函数的偏导的计算

均方差损失

​ 对于单个样本 ( x , y ) ,定义如下:

(19) L ( y , y ) = 1 2 ( y y ) 2

​ 其中 y 是神经网络最后一层的输出 y = z n ,就是预测值

(7) L y i = ( 1 2 ( y i y i ) 2 ) y i (8) = ( y i y i ) ( y i y i ) y i (9) = ( y i y i )               ( 20 )

​ 更一般的表示为 L y = y y ; 也就是 (21) δ n = L y = y y = z n y

​ 即使用均方误差情况下,损失函数L关于网络最后一层的导数就是预测值减实际值

交叉熵损失

​ 交叉熵用于度量两个概率分布的差异;一般使用交叉熵损失前,会对网络输出做softmax变换进行概率归一化;所以我们这里介绍的交叉熵损失是带softmax变换的交叉熵。

​ softmax变换定义如下:

(22) a i = e y i / k e y k

​ 交叉熵损失定义如下:
(23) L ( y , y ) = i y i log a i

a) 我们先来求 a i 关于 y j 的偏导
a i y j = ( e y i / k e y k ) y j = e y i y j 1 k e y k + e y i 1 ( k e y k ) 2 ( k e y k ) y j = e y i y j 1 k e y k e y i ( k e y k ) 2 e y j = { e y j k e y k ( e y j ) 2 ( k e y k ) 2 i = j e y i e y j ( k e y k ) 2 i   j (24) = { a i ( 1 a i ) i = j a i a j i   j

b) 然后我们来求L关于 y j 的偏导

(10) L y j = i ( y i log a i ) a i a i y j (11) = i y i a i a i y j (12) = y j a j a j ( 1 a j ) + i   j y i a i a i a j / / i , j (13) = y j ( 1 a j ) + i   j y i a j (14) = y j + i y i a j / / 1 (15) = a j y j

​ 更一般的表示为 :

(25) L y = a y

​ 所以使用带softmax变换的交叉熵损失函数,损失函数L关于网络最后一层的导数就是预测值经softmax变换后的值减去真实值。(是不是跟均方差损失函数很相似,注意还是有差异的噢)

猜你喜欢

转载自blog.csdn.net/csuyzt/article/details/81839388