backpropagation算法原理
Backpropagation核心解决的问题: ∂C/∂w 和 ∂C/∂b 的计算, 针对cost函数C
ω324: ω 24 3 : 表示第从第(3-1)层的的第4个神经元到第3层的第2个神经元的权重weight
b23: b 3 2 : 表示第2层的第3个神经元的偏向bais
正向传播
公式:
αlj=σ(∑kωljkαl−1k+blj)
α
j
l
=
σ
(
∑
k
ω
j
k
l
α
k
l
−
1
+
b
j
l
)
分为两步:
1. ωα+b ω α + b 加权求和
2. 对加权求和整体使用sigmoid函数求出下层的输出值
数据结构
对于每一层(l),定义一个权重矩阵 (weight matrix): ωl ω l ,这个权重矩阵包含当前层的所有神经元到前一层的所有神经元的权重
ωljk: ω j k l : 表示第从第l层的的第j个神经元到第l-1层的第k个神经元的权重weight
对于每一层(l),定义一个偏向向量(bais vector): bl b l
blj b j l 则表示l层的第k个神经元的bais
同理,对于 α α :l层的神经元向量 αl α l ,每个神经元的值 αlj α j l
Vector a function: σ(υ)j=σ(υj) σ ( υ ) j = σ ( υ j )
例如: f(x)=x2 f ( x ) = x 2
f([23])=[f(2)f(3)]=[49] f ( [ 2 3 ] ) = [ f ( 2 ) f ( 3 ) ] = [ 4 9 ]
则,可以由l层的每一个元素的计算公式可以退出该层矩阵运算的公式:αlj=σ(∑kωljkαl−1k+blj)=>αl=σ(ωlαl−1+bl) α j l = σ ( ∑ k ω j k l α k l − 1 + b j l ) => α l = σ ( ω l α l − 1 + b l )
其中 ∑kωljkαl−1k ∑ k ω j k l α k l − 1 可以用 ωljαl−1k ω j l α k l − 1 表示,即第l层权重矩阵的第j个行向量与前一层神经元的列向量进行内积的结果,令 zl=ωlαl−1+bl z l = ω l α l − 1 + b l ,则 αl=σ(zl) α l = σ ( z l ) 。
简单点理解:对于每层正向传播,每层的值(向量形式)就是当前层的权重矩阵与上一层的值(向量)相乘再加上当前层的偏向(向量),然后统一使用sigmoid函数转化
关于Cost函数的两个假设:
二次Cost函数
C=12n∑x||y(x)−αL(x)||2 C = 1 2 n ∑ x | | y ( x ) − α L ( x ) | | 2
其中 αL(x) α L ( x ) 表示输出层的真实值所组成的向量, x x 表示训练实例,n表示输入实例的个数。
- 第一个假设是成本函数可以写成单个训练样例的成本函数 Cx C x 的平均值 C=1n∑xCx C = 1 n ∑ x C x 。二次成本函数就是这种情况,单个训练样例的Cost函数为 Cx=12∥y−aL∥2 C x = 1 2 ‖ y − a L ‖ 2
- 第二个假设是它可以写成神经网络输出的函数:
![]()
二次Cost函数满足这个要求,因为单个训练样例x的二次Cost可写为C=12∥y−aL∥2=12∑j(yj−aLj)2 C = 1 2 ‖ y − a L ‖ 2 = 1 2 ∑ j ( y j − a j L ) 2介绍一个后面需要用到的公式
The Hadamard product, s⊙t,向量对应元素相乘:
[12]⊙[34]=[1∗32∗4]=[38] [ 1 2 ] ⊙ [ 3 4 ] = [ 1 ∗ 3 2 ∗ 4 ] = [ 3 8 ]
backpropagation4个重要公式
反向传播是关于如何改变网络中的权重和偏差来改变成本函数,这意味着需要计算偏导数 ∂C/∂ωljk ∂ C / ∂ ω j k l 和 ∂C/∂blj ∂ C / ∂ b j l 。但为了计算这些,我们首先引入一个中间量, δlj δ j l ,我们称之为在l层的第j个神经元的error。反向传播计算每一层的 δlj δ j l ,然后将 δlj δ j l 与 ∂C/∂ωljk ∂ C / ∂ ω j k l 和 ∂C/∂blj ∂ C / ∂ b j l 关联起来。
为了理解错误是如何定义的,想象我们的神经网络中存在一个恶魔:
恶魔对第l层的第j个神经元添加一个变化量 Δzlj Δ z j l ,该神经元输出就变成 σ(zlj+Δzlj) σ ( z j l + Δ z j l ) 。这种变化通过网络中的后续层传播,最终导致整体Cost的变化 ∂C∂zljΔzlj ∂ C ∂ z j l Δ z j l (简单的高数知识)。
如果这个恶魔是一个好人,它想要帮我们优化Cost,他会尝试一个更小的 Δzlj Δ z j l 使得损失函数更小。假设 ∂C∂zlj ∂ C ∂ z j l 是一个很大的值(不管正负)。然后恶魔通过选择与 ∂C∂zlj ∂ C ∂ z j l 有相反的符号的 Δzlj Δ z j l 来降低Cost。相反,如果 ∂C∂zlj ∂ C ∂ z j l 接近于零,那么恶魔通过干扰加权输入 zlj z j l 就几乎不能改变Cost,此时,这个神经元已经非常接近最优(再如何优化也不能改变Cost)。所以这里把 ∂C∂zlj ∂ C ∂ z j l 定义为神经元error的度量。
于是定义在l层的第j个神经元的error :δjl : δ l j
BP1
我们定义在输出层(L)的第j个神经元的error的方程为:
δLj=∂C∂aLjσ′(zLj)(BP1) (BP1) δ j L = ∂ C ∂ a j L σ ′ ( z j L )解释:其中 ∂C∂aLj ∂ C ∂ a j L 这部分衡量Cost相对于第j个神经元activation的输出的变化率, σ′(zLj) σ ′ ( z j L ) 这部分衡量activation方程相对于中间变量 zLj z j L 的变化率
转化为矩阵的表达形式
δL=∇aC⊙σ′(zL) δ L = ∇ a C ⊙ σ ′ ( z L )
可以认为 ∇aC ∇ a C 表示C相对于输出activation的变化率,根据上面定义的2次Cost方程,输出层的error可以写成:
δL=(aL−y)⊙σ′(zL) δ L = ( a L − y ) ⊙ σ ′ ( z L )
BP2
因为下一层的error的变化会引起当前层error的变化,当前层(l层)的error变化方程为(error传递公式):
δl=((wl+1)Tδl+1)⊙σ′(zl)(BP2) (BP2) δ l = ( ( w l + 1 ) T δ l + 1 ) ⊙ σ ′ ( z l )
其中 (w1+1)T ( w 1 + 1 ) T 是第 (1+1)th ( 1 + 1 ) t h 层的权重矩阵 wl+1 w l + 1 的转置。第 (l+1)th ( l + 1 ) t h 层处的error δl+1 δ l + 1 乘以 (l+1)th ( l + 1 ) t h 权重矩阵的转置 (wl+1)T ( w l + 1 ) T 时,我们可以直观地认为网络向前传递error。然后 ⊙σ′(zl) ⊙ σ ′ ( z l ) ,可以算出前一层的error。
交替使用可以算出神经网络的所有层的error
BP3
Cost对偏向求偏导:
∂C∂blj=δlj(BP3) (BP3) ∂ C ∂ b j l = δ j l
写成向量形式:
∂C∂b=δ ∂ C ∂ b = δ
BP4
Cost对权重求偏导:
∂C∂wljk=al−1kδlj(BP4) (BP4) ∂ C ∂ w j k l = a k l − 1 δ j l
写成矩阵形式:
∂C∂w=ainδout ∂ C ∂ w = a i n δ o u t