吴恩达机器学习——第10章 神经网络参数的反向传播算法

1、代价函数

神经网络的代价函数类似于逻辑回归的代价函数:
J ( θ ) = 1 m [ i = 1 m k = 1 k y k ( i ) l o g ( h θ ( x ( i ) ) ) k + ( 1 y k ( i ) ) l o g ( 1 ( h θ ( x ( i ) ) ) k ) ] + λ 2 m l = 1 L 1 i = 1 s l j = 1 s l + 1 ( θ j i ( l ) ) 2 J(θ)=-\frac{1}{m}\left[\sum_{i=1}^m\sum_{k=1}^ky^{(i)}_klog(h_θ(x^{(i)}))_k+(1-y_k^{(i)})log(1-(h_θ(x^{(i)}))_k)\right]+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(θ_{ji}^{(l)})^2

上述的代价函数看上去非常复杂,其实跟逻辑回归函数的含义是一样的,区别在于神经网络支持多个输出 h θ ( x ) h_θ(x)

下面介绍一下函数中各个函数的含义:

  • m:代表样本的数量,i代表某个样本的下标, x ( i ) x^{(i)} 代表某个样本对应的所有特征, y ( i ) y^{(i)} 代表某个样本对应的实际分类结果,而 h θ ( x ( i ) ) h_θ(x^{(i)}) 代表预测的结果。
  • k:代表分类的数量,神经网络的输出层的节点数=k。 y k ( i ) y_k^{(i)} 代表第k个节点的实际分类结果,而 ( h θ ( x ( i ) ) ) k (h_θ(x^{(i)}))_k 代表第k个节点预测的结果。
  • λ \lambda 是正则化参数。
  • L代表神经网络的层的总数,之前我们介绍神经网络 θ ( i ) θ^{(i)} 的时候提起过,它是第i层到第i+1层的权重矩阵,所以 θ θ 所对应的的层数是(1,L-1)。
  • s l s_l 代表是第 l l 层的激活项的数量,所以 i = 1 s l \sum_{i=1}^{s_l} 代表的是第l层的每一项的和。i代表的是特征的数量,在这里因为 s l s_l 代表的就是该层的输入项的数量,也就是特征的数量,所以i的取值范围是(0, s l s_l ),不过一般会省略 θ 0 θ_0 ,所以i的取值范围就是(1, s l s_l )。
  • s l + 1 s_l+1 :应该是包含上 θ 0 \theta_0 的意思。 θ j i ( l ) \theta_{ji}^{(l)} 中的上标l的指的是网络的层数,j指的是节点的下标,i指的是 θ \theta 的下标。

2、反向传播算法

在这之前,我们先回顾一下前向传播算法。

假设只有一个训练集(x,y)、神经网络为4层的情况,则:

  • 第一层的激活项就是: a ( 1 ) = x a^{(1)} = x
  • z ( 2 ) = θ ( 1 ) a ( 1 ) z^{(2)}=θ^{(1)}a^{(1)}
  • a ( 2 ) = g ( z ( 2 ) ) a^{(2)}=g(z^{(2)})
  • z ( 3 ) = θ ( 2 ) a ( 2 ) z^{(3)}=θ^{(2)}a^{(2)}
  • a ( 3 ) = g ( z ( 3 ) ) a^{(3)}=g(z^{(3)})
  • z ( 4 ) = θ ( 3 ) a ( 3 ) z^{(4)}=θ^{(3)}a^{(3)}
  • a ( 4 ) = g ( z ( 4 ) ) = h θ ( x ) a^{(4)}=g(z^{(4)})=h_θ(x)

2.1 定义

前向传递输入信号直至输出产生误差,反向传播误差信息更新权重矩阵。

在不断重复前后传递的过程中,优化权重矩阵,得到最优模型。

2.2 原理

下面通过两个例子来说明反向传播的原理。

两人猜数字:
在这里插入图片描述

  • input:代表输入。
  • output:代表输出。
  • 机器猫:代表预测结果与实际值的差距。

计算过程是这样的:

  1. 输入数据,经过小黄帽的计算,输出结果(前向传播)。
  2. 机器猫计算预测结果与真实结果的差。
  3. 小黄帽根据误差值,调整权重矩阵(反向传播)。
  4. 小黄帽根据最新的权重矩阵,重新进行结果(前向传播)。
  5. 重复上述步骤,直到误差值满足要求为止。

可以看出,反向传播就是把误差传递到上一层,推动上一层对权重矩阵进行优化。

三人猜数字
在这里插入图片描述
下面我们增加一个参与人员,即增加一个隐藏层。这时候计算过程就变成了如下的过程:

  1. 输入值经过小红帽、小黄帽的计算,输出结果(前向传播)。
  2. 机器猫计算预测值与实际值的误差 δ 1 \delta_1
  3. 小黄帽根据误差值,调整权重矩阵(反向传播)。
  4. 小黄帽调整完权重矩阵后,如果还有误差 δ 2 \delta_2 ,就把这个误差 δ 2 \delta_2 再传递给小红帽(反向传播)。
  5. 小红帽根据误差值,调整权重矩阵(反向传播)。
  6. 由于小红帽是第一层,所以小红帽根据最新的权重矩阵进行计算(前向传播)。
  7. 小黄帽根据最新的权重矩阵,重新进行结果(前向传播)。
  8. 重复上述步骤,直到误差值满足要求为止。

值得注意的是第4步,我认为小黄帽传递给小红帽的误差值 δ 2 \delta_2 ,与机器猫传递给小黄帽的误差值 δ 1 \delta_1 是不同的。 δ 2 \delta_2 是在更新权重矩阵后重新计算出来的误差值。

2.3 模型

δ ( l ) = ( θ ( l ) ) T δ ( l + 1 ) . g ( z ( l ) ) \delta^{(l)}=(\theta^{(l)})^T\delta^{(l+1)}.*g^{'}(z^{(l)})
推导过程就算了,没那个能力,下面介绍下各个参数的含义:

  1. δ ( l ) \delta^{(l)} :代表第 l l 层的误差。
  2. θ ( l ) \theta^{(l)} :代表第 l l 层的权重矩阵。
  3. . .* ”:是前后两个向量的乘法。
  4. g ( z ( l ) ) g^{'}(z^{(l)}) :是对激活函数的求导。

2.4 反向传播的理解

下面用示意图的形式解释一下反向传播误差计算的大概原理,注意这只是示意,为了理解原理,实际上并没有这么简单:
在这里插入图片描述

如上图所示,该神经网络共有4层:

  1. s 1 s_1 :第一层为输入层,输入样本为 x 1 , x 2 x_1, x_2
  2. s 2 s_2 :第二层为隐藏层,预估结果为 a ( 2 ) a^{(2)} ,误差项为 δ ( 2 ) \delta^{(2)} ,权重矩阵为 θ ( 2 ) \theta^{(2)}
  3. s 3 s_3 :第三层为隐藏层,预估结果为 a ( 3 ) a^{(3)} ,误差项为 δ ( 3 ) \delta^{(3)} ,权重矩阵为 θ ( 3 ) \theta^{(3)}
  4. s 4 s_4 :第四层为输出层,预估结果为 a ( 4 ) a^{(4)} ,误差项为 δ ( 4 ) \delta^{(4)}

我们知道误差=实际值-预估值,从第四层反向来看,实际结果为 y ( i ) y^{(i)} ,可以得出各层的误差计算结果为:

  1. δ 1 ( 4 ) = y ( i ) a 1 ( 4 ) \delta_1^{(4)}=y^{(i)}-a^{(4)}_1
  2. 第三层的误差计算方式与前向传播类似,但是方向是反的,所以可以得出:说实话,不知道为什么能推导出这个公式来?
    δ 1 ( 3 ) = θ 11 ( 3 ) δ 1 ( 4 ) \delta^{(3)}_1=\theta^{(3)}_{11}*\delta^{(4)}_1
    δ 2 ( 3 ) = θ 12 ( 3 ) δ 1 ( 4 ) \delta^{(3)}_2=\theta^{(3)}_{12}*\delta^{(4)}_1
  3. 第二层的误差为:
    δ 1 ( 2 ) = θ 11 ( 2 ) δ 1 ( 3 ) + θ 21 ( 2 ) δ 2 ( 3 ) \delta^{(2)}_1=\theta^{(2)}_{11}*\delta^{(3)}_1+\theta^{(2)}_{21}*\delta^{(3)}_2
    δ 2 ( 2 ) = θ 12 ( 2 ) δ 1 ( 3 ) + θ 22 ( 2 ) δ 2 ( 3 ) \delta^{(2)}_2=\theta^{(2)}_{12}*\delta^{(3)}_1+\theta^{(2)}_{22}*\delta^{(3)}_2

3、展开参数

本章介绍矩阵和向量的相互转换。

假设 T i T_i 是矩阵, V V 是向量。

矩阵转向量:

V = [ T 1 ( : ) ; T 2 ( : ) ; T 3 ( : ) ; ] V=[T_1(:);T_2(:);T_3(:);]

这样把每个矩阵的所有数据平铺形成一个向量。
向量转矩阵:

T 1 = r e s h a p e ( V ( 1 : 110 ) , 10 , 11 ) T_1=reshape(V(1:110),10,11)

取1-110元素,形成10*11的矩阵。

4、梯度检测

4.1 目的

反向传播在使用过程中非常容易出错,而且不容易发现,梯度检测就是一种校验反向传播结果的有效方式。

4.2 原理

使用梯度下降的方式求导,然后比较梯度检测的结果与反向传播的结果是否类似,如果类似则说明反向传播的计算结果无误,否则则应该进行优化。

先看一下梯度下降的求导方式:
在这里插入图片描述

如上图所示,是求导数的一种方式。

假设 ϵ \epsilon 是一个非常小的值,接近于0,则 θ J ( θ + ϵ ) J ( θ ϵ ) 2 ϵ \frac{\partial}{\partial\theta}\approx\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}

下面把该公式引入到 θ \theta 为向量的情况下:

θ 1 J ( θ 1 + ϵ , θ 2 , θ 3 , . . . . . . θ n ) J ( θ 1 ϵ , θ 2 , θ 3 , . . . . . . θ n ) 2 ϵ \frac{\partial}{\partial\theta_1}\approx\frac{J(\theta_1+\epsilon,\theta_2,\theta_3,......\theta_n)-J(\theta_1-\epsilon,\theta_2,\theta_3,......\theta_n)}{2\epsilon}

θ m J ( θ 1 , θ 2 , θ 3 , . . . . . . θ m + ϵ . . . . . . θ n ) J ( θ 1 , θ 2 , θ 3 , . . . . . . θ m ϵ . . . . . . θ n ) 2 ϵ \frac{\partial}{\partial\theta_m}\approx\frac{J(\theta_1,\theta_2,\theta_3,......\theta_m+\epsilon......\theta_n)-J(\theta_1,\theta_2,\theta_3,......\theta_m-\epsilon......\theta_n)}{2\epsilon}

注意:梯度校验计算量非常大,校验完成后需要关闭掉。

5、随机初始化

参数 θ \theta 需要设置初始值,一般采用随机方式: r a n d ( 10 , 11 ) ( 2 ϵ ) ϵ rand(10,11)*(2*\epsilon)-\epsilon ,产生的随机数界于( ϵ , ϵ -\epsilon,\epsilon )之间。

6、处理流程

6.1 选择网络架构

神经网络的第一步是选择网络架构,选择网络架构需要遵循几个原则:

  • 输入项的数目=特征的数量
  • 输出项的数据=类别的数量
  • 隐藏层的数目:一般选择 1
  • 隐藏层单元的数目:各个隐藏层保持一致。单元的数目越多效果越好,但是计算量响应变大。

6.2 处理流程

神经网络整体的处理流程是:

  1. 构建神经网络架构。
  2. 前向传播计算。
  3. 计算 J ( θ ) J(\theta)
  4. 反向传播。
  5. 梯度检测。
  6. 停用梯度检测。
  7. 计算 m i n J ( θ ) minJ(\theta)

7、资料

参考一文搞懂反向传播算法,本文对于反向传递的介绍非常容易理解。

发布了48 篇原创文章 · 获赞 34 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/u013252773/article/details/100552501
今日推荐