读书截止时间:2019.04.10
读书次数:1次
2 CHAPTER 2 How the backpropagation algorithm works
将解释一种计算这种梯度的快速算法,一种称为反向传播的算法。
2.1 热身:神经网络中使用矩阵快速计算输出的方法
定义表示层的个神经元到层的个神经元的权重。例如
image下标和的顺序别扭解释
偏置定义表示在层的第的偏置
激活值定义表示在层的第的激活值
层的第个神经元的激活值就和层的激活值通过联系起来
其中求和是在层的所有个神经元上进⾏的。为了用矩阵的形式重写这个表达式,我们对每⼀层都定义⼀个权重矩阵。权重矩阵的元素正是连接到层神经元的权重,更确切地说,在第⾏第列的元素是。类似的,对每⼀层,定义⼀个偏置向量,。你已经猜到这些如何⼯作了—— 偏置向量的每个元素其实就是前面给出的,每个元素对应于层的每个神经元。最后,我们定义激活向量,其元素是那些激活值
写为向量形式为
在计算上述的式子时,我们间接的计算了中间量,称为层神经元的带权输入,可简写为
的每个元素是,其实就是第层第个神经元的激活函数的带权输入。
2.2 代价函数的两个假设 ?
反向传播的目标是计算代价函数分别关于和的偏导数 和 。
二次代价函数有下列形式:其中是训练集的总数;是对应的目标输出;表示网络层数;表示当输入是时的网络输出的激活值向量
主要假设:
- 代价函数可以被写成⼀个在每个训练样本上的代价函数的均值。其中对每个独立的训练样本其代价是。
- 代价可以写成神经网络输出的函数 image ;例如,二次代价函数满足这个要求,因为对于一个单独的训练样本其二次代价函数可以写作这是输出的激活值的函数。
2.3 Hadamard(Schur)乘积,
假设和是两个相同维度的向量。表示按元素的乘积,即,例如
2.4 反向传播背后的四个基本方程
反向传播其实是对权重和偏置变化影响代价函数过程的理解。最终极的含义其实就是计算偏
导数和。引入一个中间量:在层的第个神经元上的误差。
定义层的第个神经元上的误差为:
使⽤表⽰关联于层的误差向量。反向传播会提供给我们⼀种
计算每层的的⽅法,然后将这些误差和最终我们需要的量和联系起来。
解决方案:反向传播基于四个基本方程。这些方程给我们一种计算误差和代价函数梯度的方法
输出层误差的方程,
表示代价随着输出激活值的变化而变化的速度。假如不太依赖一个特定的输出神经元,那么就会很小。表示处激活函数变化的速度
例如使用二次函数,那么,所以(容易计算)
使用矩阵改写为其中被定义成一个向量,其元素为
例如二次函数,所以
使用下一层的误差来表示当前层的误差:其中表示层权重矩阵的转置。当我们应⽤转置的权重矩阵,我们可以凭直觉地把它看作是在沿着⽹络反向移动误差,给了我们度量在层输出的误差⽅法。然后,我们进⾏Hadamard 乘积运算。这会让误差通过层的激活函数反向传递回来并给出在第层的带权输⼊的误差。
通过BP1和BP2我们可以计算任何层的误差,首先通过BP1计算,然后应用BP2计算等。
代价函数关于网络中任意偏置的改变率其实误差和偏导数值完全一致,重写为其中和偏置都是针对同一个神经元
代价函数关于任何一个权重的改变率 简写为其中是输入给权重的神经元,是输出自权重的神经元的误差
image⼀个好的结果就是当激活值很⼩,,梯度也会趋向很⼩。这样,我们就说权重缓慢学习,表⽰在梯度下降的时候,这个权重不会改变太多。换言之,(BP4)的⼀个结果就是来⾃低激活值神经元的权重学习会非常缓慢。
从其他方面理解,从输出层开始,先看BP1的项,当接近0或者1时函数变得非常平。这时。所以如果输出神经元处于或者低激活值或者⾼激活值时,最终层的权重学习缓慢。这样的情形,我们常常称输出神经元已经饱和,并且权重学习也会终止(或者学习非常缓慢)。类似的对于输出神经元的偏置也是成立的。
如果输⼊神经元激活值很低,或者输出神经元已经饱和了(过⾼或者过低的激活值),权重会学习缓慢。
总结
2.4.1 问题
另一种反向传播方程的表示方式:基于传统的矩阵乘法
证明BP1可以写成
其中是一个方阵,其对角线的元素是,其他的元素均是0.
BP2可以写成
结合上述的两个证明
2.5 四个基本方程的证明
误差定义
应用链式法则,可以就输出激活值的偏导数的形式重新表示这里的求和是在输出层的所有神经元k上运行的,当然输出激活值只依赖于当时第个神经元的输入权重。所以当时就消失了,所以变为
回想一下,右边的第二项可以写为,方程变为这正是BP1的分量形式
要以重写可以应用链式法则这里最后一行我们交换了右边的两项,并用的定义带入。
作微分
带入得
这是BP2得分量形式
2.5.1 练习
证明方程BP3,BP4
2.6 反向传播算法
- 输入:为输入层设置对应的激活值
- 正向传播:计算相应的和
- 输出层误差:计算向量
- 反向传播误差:对于每个,计算
- 输出:代价函数的梯度由 和
特别的,给定一个大小为的小批量数据,下面的算法在这个小批量数据的基础上应用一步梯度下降学习算法
- 输入训练样本的集合
- 对每个训练样本:设置对应的输入激活,并执行以下步骤
- 前向传播:对每个计算 and
- 输出误差:计算向量
- 反向传播误差:对每个计算
- 梯度下降:对每个根据和更新权重和偏置
2.6.1 练习
使用单个修正的神经元的反向传播假设我们改变⼀个前馈⽹络中的单个神经元,使得那个神经元的输出是,其中是和S型函数不同的某⼀函数。我们如何调整反向传播算法?
线性神经元上的反向传播假设我们将非线性神经元的函数替换为。重写反向传播算法。
2.7 代码
class Network(object):
def update_mini_batch(self, mini_batch, eta):
"""Update the network's weights and biases by applying
gradient descent using backpropagation to a single mini batch.
The "mini_batch" is a list of tuples "(x, y)", and "eta"
is the learning rate."""
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
for x, y in mini_batch:
delta_nabla_b, delta_nabla_w = self.backprop(x, y)
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
self.weights = [w-(eta/len(mini_batch))*nw
for w, nw in zip(self.weights, nabla_w)]
self.biases = [b-(eta/len(mini_batch))*nb
for b, nb in zip(self.biases, nabla_b)]
2.7.1 问题
在⼀个⼩批量数据上的反向传播的全矩阵⽅法
我们对于随机梯度下降的实现是对⼀个⼩批量数据中的训练样本进⾏遍历。所以也可以更改反向传播算法使得它同时对⼀个⼩批量数据中的所有样本进⾏梯度计算。这个想法其实就是我们可以⽤⼀个矩阵,其中每列就是在⼩批量数据中的向量,⽽不是单个的输⼊向量,。我们通过乘权重矩阵,加上对应的偏置进⾏前向传播,在所有地方应用S 型函数。然后按照类似的过程进行反向传播。请显式写出这种⽅法下的伪代码。更改network.py 来实现这个⽅案。这样做的好处其实利⽤到了现代的线性代数库。所以,这会⽐在⼩批量数据上进⾏遍历要运⾏得更快(在我的笔记本电脑上,在MNIST 分类问题上,我相较于上⼀章的实现获得了2 倍的速度提升)。在实际应用中,所有靠谱的反向传播的库都是用了类似的基于矩阵或者其变化形式来实现的。
2.8 在什么层面上反向传播是快速的算法
当把代价函数当作权重的函数时可以可以通过计算两个接近相同的值的代价来估计,同样对于偏置来说是一样的
但是计算量及其大,所以当反向传播出现时边使用反向传播来训练
2.8 反向传播:全局观
假设我们对一些网络中的做一点小小的变动
image这个改变会导致再输出激活值上的相应改变 image
然后,会产生对下一层所有激活值的改变 image
接着这些改变将会影响到一个个下一层,到达输出层,最终影响代价函数 image
所以代价函数改变和就按照下面的公式关联
导致了再层神经元的激活值的变化,
的变化将会导致下一层所有激活值的变化。
代入方程我们得到:
所以
全部改变
所以过程解释
网友评论