【吴恩达机器学习】第五周—神经网络反向传播算法

31.jpg

第五周—神经网络、反向传播算法和随机初始化

1.神经网络的损失函数

神经网络模型中损失函数/代价函数和之前的逻辑回归模型中的损失函数有什么区别?先回顾下正则化的逻辑回归模型:
损失函数:

1562925073373-a124c37c-96e4-4eea-b374-1d0d9f06eac2.png
1562925073373-a124c37c-96e4-4eea-b374-1d0d9f06eac2.png
梯度下降算法:
1562925085426-f5702e05-d74b-4baa-b12a-2bb254b2be2b.png
1562925085426-f5702e05-d74b-4baa-b12a-2bb254b2be2b.png
注意:这里样本点有m个,特征参数θ有n个
损失函数的核心就是求m个样本点的总误差,然后除以m,得到平均误差,即平均损失。那么在神经网络中的损失函数公式是怎样?其实,思想都一样,都是求平均损失,只是表现方式看上去复杂了一些。前半部分很好理解,就是将每个样本点的k类的交叉熵损失相加求期望,关键在于后面的正则化项,看上去不太好理解。
神经网络模型的损失函数公式如下:
11.png
11.png
后半部分的正则化项是如何得来?请看下面1.1节公式推导。

1.1公式推导

乍一看公式,一脸懵,下面,我们还是会结合一个例子推导一下。推导前,先明确下神经网络模型中的分类情况和一些参数的含义:
这里定义:
L:神经网络模型的总层数
s_l:l激活单元(神经元)个数
K:分类类别数\begin{cases} k = 2,输出层只需要一个激活单元即可,s_l = 1 \\[2ex] k >=3,输出层需要k个激活单元,s_l = k \end{cases}

然后,看下面的神经网络模型:
image.png

这是一个包含m个样本点,L = 4,k = 4的神经网络分类模型
第1~4层的激活单元数分别为:3,5,5,4 s_l = 3,5,5,4(for l = 1,2,3,4)


下面我们看一下每一layer的矩阵运算,重点看θ矩阵:
第一层:5x4矩阵
\theta^{(1)} = \begin{Bmatrix} \theta_{10} & \theta_{11} & \theta_{12} &\theta_{13} \\ \theta_{20} &..&..&.. \\ \theta_{30} &..&..&.. \\ \theta_{40} &..&..&.. \\ \theta_{50} &..&..& \theta_{53} \end{Bmatrix}, X^{(1)} = \begin{Bmatrix} x_0(bias)\\ x_1\\ x_2\\ x_3\\ \end{Bmatrix} \Longrightarrow \theta^{(1)}X^{(1)} = \alpha^{(2)} = \begin{Bmatrix} \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \end{Bmatrix}

第二层:5x6矩阵
\theta^{(3)} = \begin{Bmatrix} \theta_{10} & \theta_{11} & \theta_{12} &\theta_{13}& \theta_{14} & \theta_{15} \\ \theta_{20} &..&..&..&..&.. \\ \theta_{30} &..&..&..&..&.. \\ \theta_{40} &..&..&..&..& \theta_{45} \end{Bmatrix},\alpha^{(1)} = \begin{Bmatrix} \alpha_0(bias)\\ \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \end{Bmatrix}
\Longrightarrow
\theta^{(2)}\alpha^{(2)} = \alpha^{(3)}= \begin{Bmatrix} \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \end{Bmatrix}

第三层:4x6矩阵
\theta^{(3)} = \begin{Bmatrix} \theta_{10} & \theta_{11} & \theta_{12} &\theta_{13}& \theta_{14} & \theta_{15} \\ \theta_{20} &..&..&..&..&.. \\ \theta_{30} &..&..&..&..&.. \\ \theta_{40} &..&..&..&..& \theta_{45} \end{Bmatrix},
\alpha^{(2)} = \begin{Bmatrix} \alpha_0()\\ \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4\\ \alpha_5 \end{Bmatrix} \Longrightarrow \theta^{(3)}\alpha^{(3)} = \alpha^{(4)}=\begin{Bmatrix} \alpha_1\\ \alpha_2\\ \alpha_3\\ \alpha_4 \end{Bmatrix}

下面再看神经网络模型下的损失函数后半部分的正则化项:

\frac{\lambda}{2m} \sum^{L-1}_{l=1} \sum^{s_l}_{i=1} \sum^{s_l+1}_{j=1} (\Theta^{(l)}_{ji})^2

在本例中L = 4,s_l = 3,5,5,4 ( l = 1,2,3,4) 将正则化项展开:
\frac{\lambda}{2m} \sum^{L-1}_{l=1} \sum^{s_l}_{i=1} \sum^{s_{l+1}}_{j=1} (\Theta^{(l)}_{ji})^2 \Longleftrightarrow
\frac{\lambda}{2m} \sum^{3}_{i=1} \sum^{5}_{j=1} (\theta^{(1)}_{ji})^2 + \frac{\lambda}{2m} \sum^{5}_{i=1} \sum^{5}_{j=1} (\theta^{(2)}_{ji})^2 + \frac{\lambda}{2m} \sum^{5}_{i=1} \sum^{4}_{j=1} (\theta^{(3)}_{ji})^2
注意:公式中最里面一项\sum^{s_{l+1}}_{j=1}从j = 1开始到s_{l+1}结束s_{l+1}= 第(l+1)层激活单元数,而不是s_{l}+1。第一项\sum^{s_{l+1}}_{j=1}遍历每一行,第二项\sum^{s_{l}}_{i=1}遍历每一列,最后\sum^{L-1}_{l=1}遍历每一层layer,为什么 ?

最外面\sum^{L-1}_{l=1}遍历每一层layer,这个比较好理解,因为每一层的参数矩阵\theta^{(l)}都是不同的,为了求代价函数,必需加权每一层的参数矩阵;然后里面两层遍历行和列,也很好理解。因为每一层的参数矩阵,实际上影响了每一个输出的类别,所以对于这层参数矩阵,我们需要加权其中的每一个参数项\theta_{ij},至于最后是从行遍历到列,还是从列遍历到行,其实都一样。
还有一点需要注意:i 为什么从1开始 ?因为和逻辑回归中的一样,神经网络模型中的正则化项也一般是从\theta_0开始。故从i = 1开始是为了去除\theta_0

2.反向传播Backpropagation

我们之前对神经网络模型的计算用的都是从layer = 1到2到....L的正向逐级计算,即正向传播算法,现在我们先回顾一下正向/前向传播算法:
还是用1.中的例子,假设神经网络模型中:K = 4, S_L = 4, L = 4训练集中只有一个数据实例(x^{(1)},y^{(1)})神经网络模型和前向传播算法表示如下:

image.png
即最终的假设函数

2.1反向传播的意义?

反向传播就是和之前正向传播算法相对应的,从神经网络模型的最后一层误差开始,逐层往前推导的,反向传播求误差,其实时求模型代价函数偏导\frac{\vartheta}{\vartheta\theta^{(l)}_{ij}} J(\Theta)的一种手段,意义就在于比正向传播算法更快速更高效地求出代价函数偏导,在实际模型训练过程中,能大大降低计算时间,使模型更快收敛。关于反向传播算法,更详细的了解请看以下几篇文章:
https://zhuanlan.zhihu.com/p/25081671
https://zhuanlan.zhihu.com/p/21407711

2.2反向传播示例

沿用上图的神经网络模型,我们要计算代价函数偏导:

11.png
11.png
不考虑正则项,假设有m个样本,k项输出,我们从最后一层(输出层)的误差开始计算,假设误差用 表示。我们以最后一层第k项为例:误差 = 预测值 - 实际值 =

第4层整体误差用向量表示:\delta^{(4)} = a^{(4)} - y

第3层的误差:\delta^{(3)} = (\Theta^{(3)})^T\delta^{(4)}*g'(z^{(3)})
其中左半部分(\Theta^{(3)})^T\delta^{(4)}表示权重导致的误差的和;右半部分g'(z^{(3)}) =a^{(3)} * (1-a^{(3)}) 是激活函数Sigmod函数的导数。具体的解析和推导见下面。

第2层的误差:\delta^{(2)} = (\Theta^{(2)})^T\delta^{(3)}*g'(z^{(2)}) 第1层误差:由于第一层为输入层,输入层输入的是实际的训练集实例,不存在误差。

2.2.1误差公式解析

公式解析:\delta^{(4)} = a^{(4)} - y表示第4层误差(4 x 1)
\delta^{(3)}表示第3层的误差矩阵(5 x 1);
\Theta^{(3)}表示第3层权重/参数,形态为:4 x 5(不考虑bias);
第3层的误差:\delta^{(3)} = (\Theta^{(3)})^T\delta^{(4)}*g'(z^{(3)}) 是怎么来的 ?第3层误差和第4层误差的关系是怎么样的?

为了方便理解,举个不是很严谨的小例子:
这里假设\delta^{(4)}=\begin{Bmatrix} 1000\\ 2000\\ 3000\\ 4000\ \end{Bmatrix}求第单层第一个激活单元a^{(3)}_1的误差,已知a^{(3)}_1到第4层4个激活单元的权重分别为:0.1,0.2,0.3,0.4
a^{(3)}_1的误差\delta^{(3)}_1 = 0.11000 + 0.22000 + 0.33000 + 0.44000 = 100+400+900+1600 = 3000

如果不考虑到误差的变化情况(即不考虑其导数项),\delta^{(3)} = (\Theta^{(3)})^T\delta^{(4)}就可以表示第3层的损失了,为什么加上后面的g'(z^{(3)}) 考虑到误差和预测值的导数项相同,故\delta^{(3)} = (\Theta^{(3)})^T\delta^{(4)}*g'(z^{(3)}) 中误差的偏导项可以用预测值的导数项来表示,即式子里右半边表示g'(z^{(3)}) = [a^{(3)}]'

2.2.2误差公式推导

公式推导:
h_\theta(z) = g(z) = \frac{1}{1+e^{-z}}f(z) = (1+e^{-z}) ,则:\begin{cases} f'(z) = (1+e^{-z})'=-e^{-z} = 1-f(z) \\[2ex] g'(z) = [\frac{1}{f(z)}]'=\frac{-1}{f^2(z)}*f'(z) \end{cases}
\Longrightarrow

g'(z) = \frac{f(z)-1}{f^2(z)} =\frac{f(z)-1}{f(z)} *\frac{1}{f(z)} = (1-g(z))*g(z)

\begin{cases} g'(t) = (1-g(t))*g(t) \\[2ex] g(z^{(3)}) = a^{(3)} \end{cases} \Longrightarrow g'(z^{(3)}) =a^{(3)} * (1-a^{(3)})

2.3反向传播算法

2.3.1偏导公式

上面2.1小结,我们得出了每一层的误差,通过公式推导,我们可以将代价函数的偏导用这些误差表示。此处,不考虑正则化项,即\lambda =0 我们可以得到代价函数的偏导:
\frac{\vartheta}{\vartheta\theta^{(l)}_{ij}} J(\Theta) = a_j^{(l)}\delta^{(l+1)}_i

式中:
l表示的是神经网络层数;
j表示在当前层下,激活单元的下标;
i有点特殊,代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标

我们获取了所有误差以后,通过这个偏导公式,我们可以计算出每一个激活单元的偏导。

\frac{\vartheta}{\vartheta\theta^{(l)}_{ij}} J(\Theta) = a_j^{(l)}\delta^{(l+1)}_i具体推导过程可以参考知乎文章:
https://zhuanlan.zhihu.com/p/58068618

2.3.2算法公式

image.png

当我们训练集有m个样本点时,我们会遍历每个样本**For i = 1 to m **第一层激活单元的输入值a^{(1)} = x^{(1)}我们先用正向传播算法,计算出每一层的a^{(l)} 然后用反向传播计算出每一层\delta^{(L-1)},\delta^{(L-2)}...\delta^{(2)}的误差矩阵,最后我们会对每一个节点的误差做迭代:
\Delta^{(l)}_{(ij)} := \Delta^{(l)}_{(ij)} + a_j^{(l)}\delta^{(l+1)}_i
注:这里的\Delta\delta的大写形式。迭代求出\Delta^{(l)}_{(ij)}后,我们就可以计算代价函数的偏导数了,计算方法如下:

2.png
2.png
得到的即得到了偏导,即:

2.3.3进一步理解

先看一个例子:
image.png

假设\delta^{(3)}已知,求\delta^{(2)}_2
\delta^{(2)}_2是第二层中第二个激活单元的误差(+1项不看),可见这个激活单元向第3层传递有两条路径:蓝色线和红色线,蓝线权重用\theta^{(2)}_{12}表示,红线权重用\theta^{(2)}_{22}表示
则:\delta^{(2)}_2=\theta^{(2)}_{12}\delta^{(3)}_1+\theta^{(2)}_{22}\delta^{(3)}_2

然后,我们思考一下\delta^{(l)}_jJ(\theta)的关系,这里先看一下代价函数:

11.png
11.png
我们简化一下,先不考虑正则化项,且数据集样本点只有一个(x,y)则函数变成:
s

更进一步,可以想象下代价函数描述的是假设和真实值之间的偏差(用方差表示):
J(\theta)= Cost(h_\theta(x) , y) \approx \frac{(h_\theta(x)-y)^2}{2}

在之前,我们对代价函数求权重的偏导可得出:
\frac{\vartheta}{\vartheta\theta^{(l)}_{ij}} J(\Theta) = a_j^{(l)}\delta^{(l+1)}_i
这里z = h_\theta(x) = \Theta a 故有:
\frac{\vartheta J(\Theta)}{\vartheta z} = \frac{\vartheta J(\Theta)}{\vartheta \theta}* \frac{\vartheta \theta}{\vartheta z} = a\delta*\frac{\vartheta \theta}{\vartheta z} = a\delta*(1/a) = \delta
从公式可知误差 = 损失函数对假设函数的偏导。

4.png
4.png

3.梯度检验

当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。

4.随机初始化

任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的。
我们通常初始参数为正负\epsilon 之间的随机值。\epsilon通常是一个非常小的值,如0.001

5.总结概述

总结一下使用神经网络时的步骤:

网络结构:
第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。

我们真正要决定的是隐藏层的层数和每个中间层的单元数。

训练神经网络:

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

推荐阅读更多精彩内容