CNN卷积神经网络学习笔记3:权值更新公式推导
2015-07-06 11:23
633 查看
在上篇《CNN卷积神经网络学习笔记2:网络结构》中,已经介绍了CNN的网络结构的详细构成,我们已经可以初始化一个自己的CNN网络了,接下来就是要用训练得到一个确定的CNN的模型,也就是确定CNN的参数。
CNN本质上就是人工神经网络的一种,只是在前几层的处理上有所不同,我们可以把卷积核看成是人工神经网络里的权值W,而采样层实质上也是一种卷积运算。所以可以基于人工神经网络的权值更新的方法来推导CNN里的权值更新公式。人工神经网络里是用反向传播算法将误差层层回传,利用梯度下降法更新每一层的权值,CNN中也是类似的。所以这里先对传统的BP算法做个概述,然后再推广到CNN中。
EN=12∑n=1N∑k=1c(tnk−ynk)2.E^N = \frac{1}{2}\sum_{n=1}^N\sum_{k=1}^c(t_k^n-y_k^n)^2.
其中N是样本个数,c是label的维度,对于分类问题,意味着这些样本能分为c类。tknt_n^k表示第n个样本的label tnt^n的第k维,ykny_n^k是第n个样本网络的输出(predict label)的第k维。我们的目标是要更新网络的权值,使得网络输出y与真实值t更接近,也就是最小化这个E,考虑到要考虑一个样本,则第n个样本的误差函数是:
En=12∑k=1c(tnk−ynk)2.E^n = \frac{1}{2}\sum_{k=1}^c(t_k^n-y_k^n)^2.
定义第l层的输出为:
xl=f(ul),其中ul=Wlxl−1+bl(1)x^l=f(u^l), 其中u^l = W^l x^{l-1}+b^l(1)
这里f是激活函数,xl−1x^{l-1}是l-1层的输出,也就是l层的输入,W和b分别是l层的权值和偏置。
上式就是前向传播的公式,每一层对输入(也就是上一层的输出)做运算,得到输出结果,这样将样本信息逐层传递,最后输出一个预测值(predict label)。
BP算法中是用梯度下降法更新权值的,梯度下降法的更新公式如下:
Wlnew=Wlold−η∂E∂Wlold.W_{new}^l = W_{old}^l - \eta\frac{\partial E}{\partial W_{old}^l}.
blnew=blold−η∂E∂blold.b_{new}^l = b_{old}^l - \eta\frac{\partial E}{\partial b_{old}^l}.
梯度下降法细节可以参考这里:
http://ufldl.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization
其中η\eta是梯度下降的学习率(learning rate),可以看出,梯度下降法更新权值主要是利用误差代价函数对参数的梯度,所以权值更新的目标就是让每一层得到这样的梯度,然后更新。
为了求取单个样本的误差代价函数对参数的偏导,这里定义节点灵敏度(sensitivities)δ\delta为误差对输出的变化率:
δ=∂E∂u\delta = \frac{\partial E}{\partial u}
其中的u是ul=Wlxl−1+blu^l = W^l x^{l-1}+b^l.
对于参数中的偏置b,因为∂u∂b=1\frac{\partial u}{\partial b}=1,由链式求导法则可得:
∂E∂bl=∂E∂ul∂ul∂bl=δl.(2)\frac{\partial E}{\partial b^l} = \frac{\partial E}{\partial u^l} \frac{\partial u^l}{\partial b^l}= \delta^l .(2)
每层的灵敏度是不一样的,可以算得:
δl=∂E∂bl=∂12(y−t)2∂bl=f′(ul)∘(yn−tn).(3)\delta^l = \frac{\partial E}{\partial b^l} = \frac{\partial \frac{1}{2}(y-t)^2}{\partial b^l} = f'(u^l)\circ(y^n - t^n).(3)
注意这里y也是b的函数,y=f(ul)=f(Wlxl−1+b)y=f(u^l)=f(W^lx^{l-1}+b),所以要乘上f′(ul)f'(u^l),这里的∘\circ表示每个元素相乘,因为每个神经元连接都会有一个灵敏度δ\delta,所以每一层的灵敏度是一个矩阵。
进一步求得误差代价函数E对参数中的权值W的偏导:
∂E∂Wl=∂E∂ul∂ul∂Wl=δlxl−1.(4)\frac{\partial E}{\partial W^l} = \frac{\partial E}{\partial u^l} \frac{\partial u^l}{\partial W^l}= \delta^l x^{l-1}.(4)
至此,我们得到了每一层利用梯度下降进行权值更新时需要的梯度,也就是(2),(4),可以看到他们都和灵敏度有关,而灵敏度可由(3)式计算。
在(3)式中,yly^l和ulu^l中的xl−1x^{l-1}是不知道的,也就是说,我们不知道每一层具体的的输入和输出,而且这个也太难计算,那么怎么把误差信息层层回传呢?
从灵敏度下手:
δl=∂E∂ul=∂E∂ul+1∂ul+1∂ul=δl+1∂(Wl+1xl+b)∂ul=δl+1∂(Wl+1f(ul)+b)∂ul=δl+1Wl+1∘f′(ul).\delta^l =\frac{\partial E}{\partial u^l} =\frac{\partial E}{\partial u^{l+1}} \frac{\partial u^{l+1}}{\partial u^l}=\delta^{l+1}\frac{\partial (W^{l+1}x^l+b)}{\partial u^l}=\delta^{l+1}\frac{\partial (W^{l+1}f(u^l)+b)}{\partial u^l}=\delta^{l+1}W^{l+1} \circ f'(u^l).
所以反向传播其实是通过灵敏度层层回传误差信息,如下就是反向传播的核心公式:
δl=δl+1Wl+1∘f′(ul).(5)\delta^l = \delta^{l+1}W^{l+1}\circ f'(u^l).(5)
以上是对经典的BP算法做一个概述,CNN中把权值W换成卷积核k,按照(1)(2)(3)(4)(5)式就可以得到CNN的权值更新公式。
xlj=f(∑i∈Mj∗klij+bj).x_j^l=f(\sum_{i\in Mj}*k_{ij}^l+b_j).
其中,Mj表示选择的输入特征图组合,kijk_ij是输入的第i种特征图和输出的第j种特征图之间的连接所用的卷积核,bjb_j是第j种特征图对应的偏置,f是激活函数。
因为l+1层是采样层,所以相当于也是做卷积,例如做scale=2的下采样,就是用2*2的每个值为1/4的卷积核卷积图像,所以这里的权值W实际上就是这个2*2的卷积核,它的值是βj\beta_j。up表示上采样操作,因为l+1采样层的灵敏度矩阵是l层灵敏度矩阵的尺寸的1/4(scale=2时),所以这里要对l+1层的灵敏度矩阵做上采样,使它们尺寸一致。
∂E∂bj=∑u,v(δlj)u,v\frac{\partial E}{\partial b_j}=\sum_{u,v} (\delta_j^l)_{u,v}
这里(pl−1i)uv(p_i^{l-1})_{uv}是xl−1ix_i^{l-1}在做卷积时,与kijk_{ij}做卷积的每一个patch,(u,v)是patch中心,输出特征图中(u,v)位置的值,是由输入特征图中(u,v)位置的patch和卷积核kijk_ij卷积所得的值。
xlj=f(βljdown(xl−1j)+blj).x_j^l=f(\beta_j^l down(x_j^{l-1})+b_j^l).
down表示下采样,这里的β\beta是乘性偏置,b是加性偏置,一般cnn网络中没有这个β\beta。
∂E∂bj=∑u,v(δlj)u,v.\frac{\partial E}{\partial b_j}=\sum_{u,v} (\delta_j^l)_{u,v}.
至此我们就得到了CNN的权值更新公式。
下一篇中讨论一个简单的CNN实现。
Reference
《Notes on Convolutional Neural Networks》
http://cogprints.org/5869/1/cnn_tutorial.pdf
以及它的中文翻译:
/article/1919472.html
CNN本质上就是人工神经网络的一种,只是在前几层的处理上有所不同,我们可以把卷积核看成是人工神经网络里的权值W,而采样层实质上也是一种卷积运算。所以可以基于人工神经网络的权值更新的方法来推导CNN里的权值更新公式。人工神经网络里是用反向传播算法将误差层层回传,利用梯度下降法更新每一层的权值,CNN中也是类似的。所以这里先对传统的BP算法做个概述,然后再推广到CNN中。
1,BP算法
1.1 Feedforward Pass前向传播
首先定义平方误差代价函数:EN=12∑n=1N∑k=1c(tnk−ynk)2.E^N = \frac{1}{2}\sum_{n=1}^N\sum_{k=1}^c(t_k^n-y_k^n)^2.
其中N是样本个数,c是label的维度,对于分类问题,意味着这些样本能分为c类。tknt_n^k表示第n个样本的label tnt^n的第k维,ykny_n^k是第n个样本网络的输出(predict label)的第k维。我们的目标是要更新网络的权值,使得网络输出y与真实值t更接近,也就是最小化这个E,考虑到要考虑一个样本,则第n个样本的误差函数是:
En=12∑k=1c(tnk−ynk)2.E^n = \frac{1}{2}\sum_{k=1}^c(t_k^n-y_k^n)^2.
定义第l层的输出为:
xl=f(ul),其中ul=Wlxl−1+bl(1)x^l=f(u^l), 其中u^l = W^l x^{l-1}+b^l(1)
这里f是激活函数,xl−1x^{l-1}是l-1层的输出,也就是l层的输入,W和b分别是l层的权值和偏置。
上式就是前向传播的公式,每一层对输入(也就是上一层的输出)做运算,得到输出结果,这样将样本信息逐层传递,最后输出一个预测值(predict label)。
1.2 Backpropagation Pass反向传播
预测值与真实值(label)之间必然是存在误差的,反向传播就是要把这个误差信息回传给每一层,让这些层修改他们的权值,使得CNN更精准。BP算法中是用梯度下降法更新权值的,梯度下降法的更新公式如下:
Wlnew=Wlold−η∂E∂Wlold.W_{new}^l = W_{old}^l - \eta\frac{\partial E}{\partial W_{old}^l}.
blnew=blold−η∂E∂blold.b_{new}^l = b_{old}^l - \eta\frac{\partial E}{\partial b_{old}^l}.
梯度下降法细节可以参考这里:
http://ufldl.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization
其中η\eta是梯度下降的学习率(learning rate),可以看出,梯度下降法更新权值主要是利用误差代价函数对参数的梯度,所以权值更新的目标就是让每一层得到这样的梯度,然后更新。
为了求取单个样本的误差代价函数对参数的偏导,这里定义节点灵敏度(sensitivities)δ\delta为误差对输出的变化率:
δ=∂E∂u\delta = \frac{\partial E}{\partial u}
其中的u是ul=Wlxl−1+blu^l = W^l x^{l-1}+b^l.
对于参数中的偏置b,因为∂u∂b=1\frac{\partial u}{\partial b}=1,由链式求导法则可得:
∂E∂bl=∂E∂ul∂ul∂bl=δl.(2)\frac{\partial E}{\partial b^l} = \frac{\partial E}{\partial u^l} \frac{\partial u^l}{\partial b^l}= \delta^l .(2)
每层的灵敏度是不一样的,可以算得:
δl=∂E∂bl=∂12(y−t)2∂bl=f′(ul)∘(yn−tn).(3)\delta^l = \frac{\partial E}{\partial b^l} = \frac{\partial \frac{1}{2}(y-t)^2}{\partial b^l} = f'(u^l)\circ(y^n - t^n).(3)
注意这里y也是b的函数,y=f(ul)=f(Wlxl−1+b)y=f(u^l)=f(W^lx^{l-1}+b),所以要乘上f′(ul)f'(u^l),这里的∘\circ表示每个元素相乘,因为每个神经元连接都会有一个灵敏度δ\delta,所以每一层的灵敏度是一个矩阵。
进一步求得误差代价函数E对参数中的权值W的偏导:
∂E∂Wl=∂E∂ul∂ul∂Wl=δlxl−1.(4)\frac{\partial E}{\partial W^l} = \frac{\partial E}{\partial u^l} \frac{\partial u^l}{\partial W^l}= \delta^l x^{l-1}.(4)
至此,我们得到了每一层利用梯度下降进行权值更新时需要的梯度,也就是(2),(4),可以看到他们都和灵敏度有关,而灵敏度可由(3)式计算。
在(3)式中,yly^l和ulu^l中的xl−1x^{l-1}是不知道的,也就是说,我们不知道每一层具体的的输入和输出,而且这个也太难计算,那么怎么把误差信息层层回传呢?
从灵敏度下手:
δl=∂E∂ul=∂E∂ul+1∂ul+1∂ul=δl+1∂(Wl+1xl+b)∂ul=δl+1∂(Wl+1f(ul)+b)∂ul=δl+1Wl+1∘f′(ul).\delta^l =\frac{\partial E}{\partial u^l} =\frac{\partial E}{\partial u^{l+1}} \frac{\partial u^{l+1}}{\partial u^l}=\delta^{l+1}\frac{\partial (W^{l+1}x^l+b)}{\partial u^l}=\delta^{l+1}\frac{\partial (W^{l+1}f(u^l)+b)}{\partial u^l}=\delta^{l+1}W^{l+1} \circ f'(u^l).
所以反向传播其实是通过灵敏度层层回传误差信息,如下就是反向传播的核心公式:
δl=δl+1Wl+1∘f′(ul).(5)\delta^l = \delta^{l+1}W^{l+1}\circ f'(u^l).(5)
以上是对经典的BP算法做一个概述,CNN中把权值W换成卷积核k,按照(1)(2)(3)(4)(5)式就可以得到CNN的权值更新公式。
2,CNN中卷积层权值更新推导
2.1 对照(1)式计算l层的输出
在CNN中,对于卷积层的每一种输出的特征图xjx_j有:xlj=f(∑i∈Mj∗klij+bj).x_j^l=f(\sum_{i\in Mj}*k_{ij}^l+b_j).
其中,Mj表示选择的输入特征图组合,kijk_ij是输入的第i种特征图和输出的第j种特征图之间的连接所用的卷积核,bjb_j是第j种特征图对应的偏置,f是激活函数。
2.2 对照(5)式计算灵敏度
δlj=δl+1jWl+1j∘f′(ul)=βl+1jup(δl+1j)∘f′(ul).\delta_j^l = \delta_j^{l+1}W_j^{l+1} \circ f'(u^l) = \beta_j^{l+1} up(\delta_j^{l+1}) \circ f'(u^l).因为l+1层是采样层,所以相当于也是做卷积,例如做scale=2的下采样,就是用2*2的每个值为1/4的卷积核卷积图像,所以这里的权值W实际上就是这个2*2的卷积核,它的值是βj\beta_j。up表示上采样操作,因为l+1采样层的灵敏度矩阵是l层灵敏度矩阵的尺寸的1/4(scale=2时),所以这里要对l+1层的灵敏度矩阵做上采样,使它们尺寸一致。
2.3 对照(2)式计算误差代价函数对偏置b的偏导
也就是对层l中的灵敏度中所有节点求和,这里(u,v)代表灵敏度矩阵中的元素位置:∂E∂bj=∑u,v(δlj)u,v\frac{\partial E}{\partial b_j}=\sum_{u,v} (\delta_j^l)_{u,v}
2.4 对照(4)式计算误差代价函数对卷积核k的偏导:
∂E∂klij=∑u,v(δlj)u,v(pl−1i)uv.\frac{\partial E}{\partial k_{ij}^l} = \sum_{u,v}(\delta_j^l)_{u,v}(p_i^{l-1})_{uv}.这里(pl−1i)uv(p_i^{l-1})_{uv}是xl−1ix_i^{l-1}在做卷积时,与kijk_{ij}做卷积的每一个patch,(u,v)是patch中心,输出特征图中(u,v)位置的值,是由输入特征图中(u,v)位置的patch和卷积核kijk_ij卷积所得的值。
3,CNN中下采样层权值更新推导
3.1 对照(1)式计算l层的输出
在CNN中,对于采样层的每一种输出特征图xjx_j有:xlj=f(βljdown(xl−1j)+blj).x_j^l=f(\beta_j^l down(x_j^{l-1})+b_j^l).
down表示下采样,这里的β\beta是乘性偏置,b是加性偏置,一般cnn网络中没有这个β\beta。
3.2 对照(5)式计算灵敏度
δlj=δl+1jWl+1j∘f′(ul)=f′(ulj)∘conv2(δl+1j,rot180(kl+1j),′full′).\delta_j^l = \delta_j^{l+1}W_j^{l+1} \circ f'(u^l) = f'(u_j^l) \circ conv2(\delta_j^{l+1}, rot180(k_j^{l+1}), 'full').3.3 对照(2)式计算误差代价函数对偏置b的偏导
这里和卷积层的b是一样的:∂E∂bj=∑u,v(δlj)u,v.\frac{\partial E}{\partial b_j}=\sum_{u,v} (\delta_j^l)_{u,v}.
至此我们就得到了CNN的权值更新公式。
下一篇中讨论一个简单的CNN实现。
Reference
《Notes on Convolutional Neural Networks》
http://cogprints.org/5869/1/cnn_tutorial.pdf
以及它的中文翻译:
/article/1919472.html
相关文章推荐
- keytool+tomcat配置HTTPS双向证书认证
- 常用的网络测试命令:
- 【Linux 内核网络协议栈源码剖析】数据包发送
- 一类判定性问题的网络流模型的构建
- iOS ——网络监测
- 互联网企业网络安全架构
- ASIHTTPRequest实现https双向认证请求
- httpclient请求
- 6月第4周网络安全报告:应用程序漏洞居首 占61.5%
- 微信公众平台消息接口开发之微信浏览器HTTP_USER_AGENT判断
- 用平常语言介绍神经网络算法
- TCP/IP网络编程 学习笔记_1 --网络编程入门
- TCP/IP网络编程 学习笔记_1 --网络编程入门
- 网络基础
- 基于SVM和神经网络的车牌识别
- 网络模拟器WANem的使用
- 谁是网络文学搅局者不重要,IP能不能变现还没闹明白呢
- 博科SAN交换机学习笔记之二:配置文件备份与固件升级 作者 LiaoJL | 转载时请务必以超链接形式标明文章原文链接和作者信息及本版权声明。 原文链接:http://www.liaojl.co
- webHttpBinding、basicHttpBinding和wsHttpBinding区别
- Tomcat 输入http://localhost:8080打不开网页的解决方法