0_1-全连接层、损失函数的反向传播
依赖知识约定说明误差反向结论常用损失函数均方差损失交叉熵损失依赖知识a) 了解神经网络的基础知识b) 熟悉导数的链式法则及常见函数的导数c) 熟悉常见的优化方法,梯度下降,随机梯度下降等d) 熟悉矩阵和向量的乘加运算约定说明a) 对于一个nnn层神经网络,第iii层表示为li, 1≤i≤nli, 1
numpy实现神经网络系列
工程地址:https://github.com/yizt/numpy_neuron_network
基础知识
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练习
CNN练习
本文目录
本文下载地址:0_1-全连接层、损失函数的反向传播
依赖知识
a) 了解神经网络的基础知识
b) 熟悉导数的链式法则及常见函数的导数
c) 熟悉常见的优化方法,梯度下降,随机梯度下降等
d) 熟悉矩阵和向量的乘加运算
约定说明
a) 对于一个 n n <script type="math/tex" id="MathJax-Element-1">n</script>层神经网络,第 <script type="math/tex" id="MathJax-Element-2">i</script>层表示为 li, 1≤i≤n l i , 1 ≤ i ≤ n <script type="math/tex" id="MathJax-Element-3">l_i, \ 1 \le i \le n</script> ,第 i i <script type="math/tex" id="MathJax-Element-4">i</script>神经元个数为 <script type="math/tex" id="MathJax-Element-5">|l_i|</script> ; 注意 li l i <script type="math/tex" id="MathJax-Element-6">l_i</script>是输入层, ln l n <script type="math/tex" id="MathJax-Element-7">l_n</script> 是输出层。
b) 对于神经网络的一个输入样本 x x <script type="math/tex" id="MathJax-Element-8">x</script> ,其维度为 <script type="math/tex" id="MathJax-Element-9">(1,|l_1|)</script> ,也就是一个行向量;对应的输出 y y <script type="math/tex" id="MathJax-Element-10">y</script> 也是一个行向量,维度为 <script type="math/tex" id="MathJax-Element-11">(1,|l_n|)</script> 。(注:也可以将 x x <script type="math/tex" id="MathJax-Element-12">x</script> 和 <script type="math/tex" id="MathJax-Element-13">y</script> 表示为列向量,这里预先说明好为行向量,避免后面有歧义)
c) 设神经网络中第i层的输出为 zi z i <script type="math/tex" id="MathJax-Element-14">z^i</script>,( zi z i <script type="math/tex" id="MathJax-Element-15">z^i</script> 都是行向量)则 x=z1,y=zn x = z 1 , y = z n <script type="math/tex" id="MathJax-Element-16">x=z^1, y=z^n</script> ; 第 i i <script type="math/tex" id="MathJax-Element-17">i</script> 层的权重和偏置分别为 <script type="math/tex" id="MathJax-Element-18">W^i, b^i</script> ;则对于全连接层 zi+1=ziWi+bi z i + 1 = z i W i + b i <script type="math/tex" id="MathJax-Element-19">z^{i+1} = z^iW^i + b^i</script> ; 其中 Wi W i <script type="math/tex" id="MathJax-Element-20">W^i</script> 和 bi b i <script type="math/tex" id="MathJax-Element-21">b^i</script>的维度分别为为 (|li|,|li+1|),(1,|li+1|) ( | l i | , | l i + 1 | ) , ( 1 , | l i + 1 | ) <script type="math/tex" id="MathJax-Element-22">(|l_i|,|l_{i+1}|),(1,|l_{i+1}|)</script>
d) 定义损失函数为 L(y,y∗) L ( y , y ∗ ) <script type="math/tex" id="MathJax-Element-23">L(y,y^*)</script> ;其中 y∗ y ∗ <script type="math/tex" id="MathJax-Element-24">y*</script> 为样本的真实 y y <script type="math/tex" id="MathJax-Element-25">y</script>值
误差反向
a) 记损失函数L关于第 <script type="math/tex" id="MathJax-Element-26">i</script> 层神经元的输出 zi z i <script type="math/tex" id="MathJax-Element-27">z^i</script> 的偏导为 δi=∂L∂zi (1) δ i = ∂ L ∂ z i ( 1 ) <script type="math/tex" id="MathJax-Element-28">\delta^i = \frac {\partial L} {\partial z^i} \ \ \ (1)</script>
b) 首先我们来看看损失函数L在最后一层参数上的偏导;也就是 ∂L∂Wn−1 ∂ L ∂ W n − 1 <script type="math/tex" id="MathJax-Element-29">\frac {\partial L} {\partial W^{n-1}}</script> 和 ∂L∂bn−1 ∂ L ∂ b n − 1 <script type="math/tex" id="MathJax-Element-30">\frac {\partial L} {\partial b^{n-1}}</script>
对等式(4)一般化的向量表示为:
同理可得:
c) 更一般的损失函数L关于第 l l <script type="math/tex" id="MathJax-Element-34">l</script>层(这里没有用索引
<script type="math/tex" id="MathJax-Element-35">i</script>,避免跟等式1~4中的索引名相同,引起理解障碍)的参数上的偏导,也就是 ∂L∂Wl ∂ L ∂ W l <script type="math/tex" id="MathJax-Element-36">\frac {\partial L} {\partial W^l}</script> 和 ∂L∂bl ∂ L ∂ b l <script type="math/tex" id="MathJax-Element-37">\frac {\partial L} {\partial b^l}</script>
同理可得:
d) 现在我们来看a)中定义的损失函数L关于第 l l <script type="math/tex" id="MathJax-Element-40">l</script>层输出的偏导 <script type="math/tex" id="MathJax-Element-41">\delta^l = \frac {\partial L} {\partial z^l}</script>
一般化的表示如下:
结论
以上的证明就是为了说明下面的结论,所以请牢记以下的结论,后续自己写神经网络的反向传播都会用到以下结论
a) 根据公式15,损失函数L关于第 l l <script type="math/tex" id="MathJax-Element-44">l</script>层神经元的偏导,就是第 <script type="math/tex" id="MathJax-Element-45">l+1</script> 层的偏导乘上第l层权重矩阵的转置。我们将公式(15)递归一下, δl=δl+1(Wl)T=δl+2(Wl+1)T(Wl)T=δn(Wn−1)T(Wn−2)T...(Wl)T (16) δ 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 ) <script type="math/tex" id="MathJax-Element-46">\delta^l=\delta^{l+1}(W^l)^T=\delta^{l+2}(W^{l+1})^T(W^l)^T=\delta^n(W^{n-1})^T(W^{n-2})^T...(W^l)^T \ \ (16)</script>
也就是说,只要求得损失函数L关于最后一层(n)的偏导 δn δ n <script type="math/tex" id="MathJax-Element-47">\delta^n</script>,其它任意层的偏导,直接用最后一层的偏导逐层乘上权重的转置即可。很简单,很对称,有木有?
b) 根据公式(8) ,损失函数L关于第 l l <script type="math/tex" id="MathJax-Element-48">l</script>层权重 <script type="math/tex" id="MathJax-Element-49">W^l</script> 的偏导为,第 l l <script type="math/tex" id="MathJax-Element-50">l</script> 层输出的转置乘第 <script type="math/tex" id="MathJax-Element-51">l+1</script> 层的偏导 ∂L∂Wl=(zl)Tδl+1 (8) ∂ L ∂ W l = ( z l ) T δ l + 1 ( 8 ) <script type="math/tex" id="MathJax-Element-52">\frac {\partial L} {\partial W^l} = (z^l)^T\delta^{l+1} \ \ \ \ (8)</script>
c) 根据公式(9) ,损失函数L关于第 l l <script type="math/tex" id="MathJax-Element-53">l</script>层偏置 <script type="math/tex" id="MathJax-Element-54">b^l</script> 的偏导,就是第 l+1 l + 1 <script type="math/tex" id="MathJax-Element-55">l+1</script> 层的偏导: ∂L∂bl=δl+1 (9) ∂ L ∂ b l = δ l + 1 ( 9 ) <script type="math/tex" id="MathJax-Element-56">\frac {\partial L} {\partial b^l} =\delta^{l+1} \ \ \ (9)</script>
由以上可知对任意的全连接层,我们只需要只到它后一层的偏导,就可以求得当前层参数(权重、偏置)的偏导; 就可以使用梯度下降算法更新参数了
根据公式(16), 损失函数L关于任何一层的偏导,只需要求导损失函数关于最后一层的偏导 δn δ n <script type="math/tex" id="MathJax-Element-59">\delta^n</script> 即可。 δn δ n <script type="math/tex" id="MathJax-Element-60">\delta^n</script> 与损失函数的定义有关,下一节介绍常用损失函数的偏导计算。
常用损失函数
以下说明损失函数的偏导的计算
均方差损失
对于单个样本 (x,y∗) ( x , y ∗ ) <script type="math/tex" id="MathJax-Element-61">(x,y*)</script> ,定义如下:
L(y,y∗)=12(y−y∗)2(19) (19) L ( y , y ∗ ) = 1 2 ( y − y ∗ ) 2 <script type="math/tex" id="MathJax-Element-62">L(y,y*) = \frac 1 2(y-y^*)^2 \tag {19}</script>
其中 y y <script type="math/tex" id="MathJax-Element-63">y</script>是神经网络最后一层的输出
<script type="math/tex" id="MathJax-Element-64">y=z^n</script> ,就是预测值
更一般的表示为 ∂L∂y=y−y∗ ∂ L ∂ y = y − y ∗ <script type="math/tex" id="MathJax-Element-66">\frac {\partial L} {\partial y} = y - y^*</script> ; 也就是 δn=∂L∂y=y−y∗=zn−y∗(21) (21) δ n = ∂ L ∂ y = y − y ∗ = z n − y ∗ <script type="math/tex" id="MathJax-Element-67">\delta^n=\frac {\partial L} {\partial y}=y-y^* = z^n-y^* \tag {21}</script>
即使用均方误差情况下,损失函数L关于网络最后一层的导数就是预测值减实际值
交叉熵损失
交叉熵用于度量两个概率分布的差异;一般使用交叉熵损失前,会对网络输出做softmax变换进行概率归一化;所以我们这里介绍的交叉熵损失是带softmax变换的交叉熵。
softmax变换定义如下:
交叉熵损失定义如下:
a) 我们先来求 ai a i <script type="math/tex" id="MathJax-Element-70">a_i</script> 关于 yj y j <script type="math/tex" id="MathJax-Element-71">y_j</script> 的偏导
b) 然后我们来求L关于 yj y j <script type="math/tex" id="MathJax-Element-73">y_j</script> 的偏导
更一般的表示为 :
∂L∂y=a−y∗(25) (25) ∂ L ∂ y = a − y ∗ <script type="math/tex" id="MathJax-Element-75">\frac {\partial L} {\partial y} = a - y^* \tag {25}</script>
所以使用带softmax变换的交叉熵损失函数,损失函数L关于网络最后一层的导数就是预测值经softmax变换后的值减去真实值。(是不是跟均方差损失函数很相似,注意还是有差异的噢)
更多推荐
所有评论(0)