[ML]前馈神经网络的BP算法详细推导

前言

吴恩达的机器学习网课里面,介绍了BP算法,但是并没有BP算法的推导过程。
很多人第一次接触神经网络,第一次接触BP算法的时候,都会被吓到,都会说,“哇,这个算法真复杂”。神经网络复杂的原因在于参数繁多:
自变量X需要乘一个参数矩阵\Theta^{(1)},再用一次sigmoid函数
再乘以一个参数矩阵\Theta^{(2)},再用一次sigmoid函数
再乘以一个参数矩阵\Theta^{(3)},再用一次sigmoid函数
……
经过多层套娃,才能得到最终的Y拟合值。以如此多的参数作为自变量,求解代价函数的最小值点argmin\left \{ \left. J(\Theta) \right \} \right.,因此以梯度下降为基本思想的BP算法显得非常复杂。以下是我对BP神经网络的详细推导,以后哪天忘了,回来翻一翻这篇文章就够了。

示意图和主要符号

本文的主要符号基本与吴恩达机器学习课堂上的主要符号一致。


神经网络示意图1

神经网络示意图2

L:神经网络层数,l=1,2,...,L
s_l:第l层的神经元数量(不包括偏置元)
z^{(l)}:第l层神经网络的输入值,s_l维向量
a^{(l)}:第l层神经网络的输出值,s_l+1维向量
\Theta^{(l)}a^{(l)}z^{(l+1)}的线性变换,属于待估参数,s_{l+1}\times (s_l+1)阶矩阵
K:输出神经元的数量,k=1,2,...,KK=s_L
h_{\Theta}(\textbf{x}):估计值,h_{\Theta}(\textbf{x})\in \mathbb{R}^K(h_{\Theta}(\textbf{x}))_k表示向量h_{\Theta}(\textbf{x})的第k个元素
(\textbf{x}^{(1)}, \textbf{y}^{(1)}), (\textbf{x}^{(2)}, \textbf{y}^{(2)}), \cdots (\textbf{x}^{(m)}, \textbf{y}^{(m)})是样本,\textbf{x}^{(i)}s_1维向量,\textbf{y}^{(i)}K维向量,\textbf{x}^{(1)}加上偏置元便得到a^{(1)}

我们的目标

我们的目标是要求解使得代价函数J(\Theta)最小的参数\Theta,即argmin\left \{ \left. j(\Theta) \right \} \right.。代价函数是:
J(\Theta)=-\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K}\left [ y_k^{(i)}ln(h_{\Theta}(\textbf{x}^{(i)}))_k+(1-y_k^{(i)})ln(1-(h_{\Theta}(\textbf{x}^{(i)}))_k) \right ]+\frac{\lambda }{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(\Theta_{ji}^{(l)})^2
我们可以基于梯度下降的思想,来逼近最小值。设\theta是任意一个参数,根据梯度下降的思想,通过不断更新参数值:\theta\leftarrow \theta-\alpha\frac{\partial J(\Theta)}{\partial \theta},便可以逼近最小值。那么问题来了,怎么求得这个偏导数呢?

最后一层的delta值

在求偏导数之前,我们必须悉知,BP算法求偏导数中,\delta ^{(l)}对求偏导非常重要,它是J(\Theta)z^{(l)}偏导的值。至于为什么这么重要,推导完就会知道了。现在我们必须寻找到一个\delta ^{(l)}合理的递推式,使得我们能够在程序中快速求出每一层的\delta ^{(l)}
在求\delta ^{(l)}之前,我们先简化一下代价函数,假设只有一个样本,而且没有正则化项:
J(\Theta)=-\sum_{k=1}^{K}\left [ y_klna_k^{(L)}+(1-y_k)ln(1-a_k^{(L)}) \right ]
稍微运用一下大一学过的微积分求导法则,就能得到\frac{\partial J(\Theta)}{\partial a_k^{(L)}}=\frac{a_k^{(L)}-y_k}{a_k^{(L)}(1-a_k^{(L)})}
此外,必须注意到,sigmoid函数的导数:g'(z)=g(z)(1-g(z))
因此利用链式法则,我们可以求得第L层的第k个delta值:
\frac{\partial J(\Theta)}{\partial z_k^{(L)}}=\frac{\partial J(\Theta)}{\partial a_k^{(L)}}\frac{\partial a_k^{(L)}}{\partial z_k^{(L)}}=\frac{a_k^{(L)}-y_k}{a_k^{(L)}(1-a_k^{(L)})}a_k^{(L)}(1-a_k^{(L)})=a_k^{(L)}-y_k
也就是:\delta _k^{(L)}=a_k^{(L)}-y_k。写成向量化的形式才是我们想要的最终结果:\delta ^{(L)}=a^{(L)}-\textbf{y}
到此为止,我们得到了最后一层的delta值。接下来我们要寻找一个递推公式,通过\delta ^{(L)}反向递推每一层的\delta ^{(l)}值。这边是反向传播算法中反向的意思。

delta值的递推公式

根据微积分的链式法则,直接计算\delta _i^{(l)}
\delta _i^{(l)}=\frac{\partial J(\Theta)}{\partial \delta_i^{(l)}}=\sum_{j=1}^{s_{l+1}}\frac{\partial J(\Theta)}{\partial z_j^{(l+1)}}\frac{\partial z_j^{(l+1)}}{\partial a_i^{(l)}}\frac{\partial a_i^{(l)}}{\partial z_i^{l}}=\sum_{j=1}^{s_{l+1}}\delta _i^{(l+1)}\theta_{ji}^{(l)}a_i^{(l)}(1-a_i^{(l)})
上面是\delta ^{(l)}的第i个元素。写成向量化的形式是:
\delta ^{(l)}=(\Theta^{(l)})^T\delta ^{(l+1)}.*[a^{(l)}.*(1-a^{(l)})]
其中.*是点乘运算,代表向量或者矩阵中相应位置的元素相乘。必须维度相同的向量或者矩阵才能点乘。上式就是我们想要的delta值递推公式。

对参数的偏导数

好了,现在知道了\delta ^{(l)},并且知道了z^{(l+1)}=\Theta^{(l)}a^{(l)},我们需要求偏导数:\frac{\partial J(\Theta)}{\partial \Theta^{(l)}}
\frac{\partial J(\Theta)}{\partial \Theta^{(l)}}=\frac{\partial J(\Theta)}{\partial z^{(l+1)}}\frac{\partial z^{(l+1)}}{\partial \Theta^{(l)}}=\delta ^{(l+1)}(a^{(l)})^T
大功告成了!现在得到了想要的结果:在一个样本的情况下,第l层的参数矩阵的偏导数是:\delta ^{(l+1)}(a^{(l)})^T
那么,如果把情况扩展到m个样本,该怎么处理呢?非常非常简单,每一个样本的偏导数加总,便得到m个样本的偏导数。在实际的BP算法中,每一次反向传播,都会循环m次,求m个偏导,再把他们加总。
那么,如果把情况扩展到有正则项的情况呢?非常非常简单,在原来已经加总的偏导数情况下,再加上正则化项相应的偏导数即可!

Loop{
    初始化参数theta
    偏导 = 0
    for i from 1 to m, do{
        通过xi和theta,求yi的拟合值
        对于第i个样本,利用反向传播,求每一层的参数的偏导
        偏导 = 偏导 + 第i个样本的偏导
    }
    偏导 = 偏导 + 正则化项的偏导
    theta = theta - alpha * 偏导
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容