Neural Networks and Deep Learning CH2

这一章主要介绍了backpropagation算法的原理。

backpropagation的核心是一个计算 Cw 的表达式。其中 C 为cost function,参数是weight w,bias b 。这个表达式告诉我们当我们改变weight和bias的时候,cost function的改变有多快。

Warm up: a fast matrix-based approach to computing the output from a neural network

这一节回顾了一个基于矩阵的计算神经网络输出的算法。并对一些backpropagation用到的符号进行了定义。

这些定义和之前学的没什么不同。

如下图:
这里写图片描述

然后解释了为什么定义wljk是第 l 层第j个神经元和第 l1 层第 k 个神经元的weight:
这样定义可以在向量化的时候去掉一个转置符号,公式漂亮且加快了运算速度。
这里写图片描述

The two assumptions we need about the cost function

Backpropagation的目标是计算在网络中的任意Cw Cb

其中cost function C 为:
这里写图片描述
L表示神经网络的层数。 aL 即输出层。

为了backpropagation能工作,我们需要做出以下两个主要的假设:
第一,cost function对于每一个训练样例 x Cx,能够写成均值形式 C=1nxCx 。需要这个假设的原因是backpropagation实际上是先对单独的训练样例 x 计算Cxw Cxw ,之后再用均值来算总的。

第二,cost function能够被写成神经网络输出的函数,如下图:
这里写图片描述

The Hadamard product

这一节介绍了一个运算符号 st
含义是elementwise的乘法运算,如下图例子:
这里写图片描述

Backpropagation

The four fundamental equations behind backpropagation

这一节是关于backpropagation的重要的四个公式,是这一章的核心。

Proof of the four fundamental equations

这一节简单介绍了公式的推导。

My summary

感觉这两节的写法以及证明方法没有NTU课堂上的逻辑清晰,结合二者,我自己总结了一下。证明全是基于chain rule。

首当其冲要明白,算法的目的是计算 Cw Cb

Cb 的计算方法可以由 Cw 的证明中得出来,因此先写出 Cw ,就可以轻易写出 Cb

以下是关于 Cw 的计算过程和证明过程:

首先,由于:
这里写图片描述
根据chain rule,可以写出:
Cwlij=zliwlijCzli

对于等式右边第一项 zliwlij
由于 zli=jwlijal1j ,因此 zliwlij=al1j (输入定义为 a0 )。

对于等式右边第二项 Czli
定义 δli=Czli
对于输出层:
这里写图片描述
根据chain rule,可以写出:
δLj=aLjzLjCaLj=CaLjσ(zLj) (输出定义为 aL )。

又由于:
这里写图片描述
根据chain rule,可以写出:
δli=Czli=alizlikzl+1kaliCzl+1k
上式右边第一项: alizli=σ(zlj)
上式右边第二项: zl+1k=iwl+1kiali+bl+1k
所以, zl+1kali=wl+1ki
上式右边第三项: Czl+1k=δl+1k
综上,得到第l+1层到第l层的 δ 递推式,原来求的初始条件 L 也有了意义。
其递推式为:δli=σ(zli)kwl+1kiδl+1k,将其矩阵化,可以得到: δl=((wl+1)Tδl+1)σ(zl)

至此,所有关于 Cw 的计算过程和证明过程结束。可以得到以下三个重要公式:
δLj=CaLjσ(zLj)
δl=((wl+1)Tδl+1)σ(zl)
Cwlij=al1jδli

同理,用链式法则可以得到最后一个重要公式:
Cblj=δlj

至此,整个backpropagation简单版的推导与公式计算就此结束。

The backpropagation algorithm

mini-batch的伪代码:
这里写图片描述

具体实现,上一章有完整代码:

  def backprop(self, x, y):
       """Return a tuple "(nabla_b, nabla_w)" representing the
       gradient for the cost function C_x.  "nabla_b" and
       "nabla_w" are layer-by-layer lists of numpy arrays, similar
       to "self.biases" and "self.weights"."""
       nabla_b = [np.zeros(b.shape) for b in self.biases]
       nabla_w = [np.zeros(w.shape) for w in self.weights]
       # feedforward
       activation = x
       activations = [x] # list to store all the activations, layer by layer
       zs = [] # list to store all the z vectors, layer by layer
       for b, w in zip(self.biases, self.weights):
           z = np.dot(w, activation)+b
           zs.append(z)
           activation = sigmoid(z)
           activations.append(activation)
       # backward pass
       delta = self.cost_derivative(activations[-1], y) * \
           sigmoid_prime(zs[-1])
       nabla_b[-1] = delta
       nabla_w[-1] = np.dot(delta, activations[-2].transpose())
       # Note that the variable l in the loop below is used a little
       # differently to the notation in Chapter 2 of the book.  Here,
       # l = 1 means the last layer of neurons, l = 2 is the
       # second-last layer, and so on.  It's a renumbering of the
       # scheme in the book, used here to take advantage of the fact
       # that Python can use negative indices in lists.
       for l in xrange(2, self.num_layers):
           z = zs[-l]
           sp = sigmoid_prime(z)
           delta = np.dot(self.weights[-l+1].transpose(), delta) * sp
           nabla_b[-l] = delta
           nabla_w[-l] = np.dot(delta, activations[-l-1].transpose())
       return (nabla_b, nabla_w)

In what sense is backpropagation a fast algorithm?

这一节解释了为什么backpropagation计算 Cwj 的速度比较快。
朴素的算法是对于每一个weight,计算一次偏导,那么当整个神经网络的神经元个数非常多的时候,这个计算量就非常大了。而backpropagation快就在于它能够一次前向传播,一次后向传播计算出所有的偏导。

Backpropagation: the big picture

这一节解释了两个问题:
其一,这个算法在我们做这些矩阵与向量乘法的时候,究竟做了什么。
其二,第一个发现这个算法的人是如何发现它的。

对于第一个问题:
首先假设我们对weight wljk 做了一个小改变:
这里写图片描述
这个改变将会导致接下来一个神经元的输入的改变:
这里写图片描述
然后继续依此影响接下来的每一层:
这里写图片描述
直到影响到输出,以及cost function:
这里写图片描述

cost function的改变可以由一下式子给出:
这里写图片描述
这个式子说明计算出 Cwljk ,就可以计算出改变weight对cost function的影响。由类似chain rule的一系列运算,可以得到:
这里写图片描述
因此:
这里写图片描述
其实意义就是,backpropagation提供了一种计算以上所有影响了cost function路径的和。记录了这些路径的改变是如何影响到输出层和cost function的。
事实上,第二个问题也是由上述过程发现的,也就是说,第一个发现backpropagation的人也是按照以上流程发现了这种算法,而其原来的证明非常复杂,以上的证明只是简单版本的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值