机器学习-吴恩达-笔记-5-神经网络学习

目录

代价函数

反向传播算法

反向传播算法的直观理解

梯度检验

随机初始化

综合起来


【此为本人学习吴恩达的机器学习课程的笔记记录,有错误请指出!】

代价函数


首先引入一些便于稍后讨论的新标记方法:

𝑚:训练样本的数量

𝐿:神经网络的层数

𝑆𝑙:该层神经元个数(不包含偏置单元)

𝑆𝐿:最后一层中处理单元个数

将神经网络的分类定义为两种情况:二类分类和多类分类,

二类分类: 𝑆𝐿 = 1, 𝑦 = 0 𝑜𝑟 1表示哪一类;

𝐾类分类: 𝑆𝐿 = 𝑘, 𝑦𝑖 = 1表示分到第 i 类; (𝑘 > 2)

我们知道逻辑回归问题的代价函数为:

在逻辑回归中,只有一个输出变量,又称标量( scalar),也只有一个因变量 𝑦,但是在神经网络中,我们可以有很多输出变量,ℎ𝜃(𝑥)是一个维度为𝐾的向量,并且训练集中的因变量也是同样维度的一个向量,因此代价函数会比逻辑回归更加复杂一些,为: ℎ𝜃(𝑥) ∈ ℝ𝐾 , (ℎ𝜃(𝑥))𝑖 = 𝑖𝑡ℎ output

这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出𝐾个预测,基本上我们可以利用循环,对每一行特征都预测𝐾个不同结果,然后再利用循环在𝐾个预测中选择可能性最高的一个,将其与𝑦中的实际数据进行比较。

正则化的那一项只是排除了每一层𝜃0后,每一层的𝜃 矩阵的和。

循环 𝑗 循环所有的行(由𝑆𝑙 +1 层的激活单元数决定),

循环 𝑖 则循环所有的列,由该层( 𝑆𝑙 层)的激活单元数所决定。

即: ℎ𝜃(𝑥)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization 的 bias 项处理所有参数的平方和。

 

反向传播算法


之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的ℎ𝜃(𝑥)。

现在,为了计算代价函数的偏导数,需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。

假设我们的训练集只有一个实例(𝑥(1), 𝑦(1)),我们的神经网络是一个四层的神经网络,

其中𝐾 = 4, 𝑆𝐿 = 4, 𝐿 = 4:

前向传播算法:

 

我们从最后一层的误差开始计算,误差是激活单元的预测( )与实际值( )之间的误差,( 𝑘 = 1: 𝑘)。

用𝛿来表示误差,则:  

利用这个误差值来计算前一层的误差: 

  是 𝑆 形函数的导数:  。

   是权重导致的误差的和 。

下一步是继续计算第二层的误差:  

第一层是输入变量,不存在误差。

有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设𝜆 = 0,即不做任何正则化处理时有:

重要的是清楚地知道上面式子中上下标的含义:

𝑙 代表目前所计算的是第几层。

𝑗 代表目前计算层中的激活单元的下标,也将是下一层的第𝑗个输入变量的下标。

𝑖 代表下一层中误差单元的下标,是受到权重矩阵中第 𝑖 行影响的下一层中的误差单元的下标。

如果考虑正则化处理,并且训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在一般的情况中,我们同样需要计算每一层的误差单元,但是需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用 来表示这个误差矩阵。第 𝑙 层的第 𝑖 个激活单元受到第 𝑗个参数影响而导致的误差。

算法表示为:

即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。

在求出了 之后,便可以计算代价函数的偏导数了,计算方法如下:

 

反向传播算法的直观理解


神经网络算法的训练(先看一个训练样本的步骤细节)步骤如下:

步骤 1:初始化所有参数 𝛩

步骤 2:输入一个训练样本 𝑥,并使用前向传播算法计算出每层的输出值 𝑎

步骤 3:根据最后一层的输出值 𝑎 和 真实值 𝑦,计算出总体误差 𝛿

步骤 4:使用反向传播算法,从最后一层开始,用总体误差 𝛿 对所有参数 𝛩 求出偏导数

步骤 5:最后根据参数 𝛩 偏导数来更新参数 𝛩

注意:用总体误差 𝛿 对 𝛩 求出偏导数,可以理解为该 𝛩 对总体误差产生了多少影响。

前向传播算法,先计算出每层的输出值 𝑎:

反向传播算法,根据预测值  𝑎 和真实值  𝑦 倒推每层误差:

 

梯度检验


当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。

为了避免这样的问题,我们采取一种叫做梯度的数值检验( Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

高级算法计算出来的偏导数存储在矩阵 中。检验时,我们要将该矩阵展开成为向量,同时我们也将 𝜃 矩阵展开为向量,我们针对每一个 𝜃 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同  进行比较,如果比较相近,说明高级算法计算的偏导数符合要求。

 

随机初始化


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

通常初始参数为正负 𝜀 之间的随机值,假设我们要随机初始一个尺寸为 10×11 的参数矩阵,octave代码如下:

Theta1 = rand(10, 11) * (2 * eps) – eps

 

综合起来


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

网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。

第一层的单元数即我们训练集的特征数量。

最后一层的单元数是我们训练集的结果的类的数量。

如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。

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

训练神经网络:

1. 参数的随机初始化

2. 利用正向传播方法计算所有的ℎ𝜃(𝑥)

3. 编写计算代价函数 𝐽 的代码

4. 利用反向传播方法计算所有偏导数

5. 利用数值检验方法检验这些偏导数

6. 使用优化算法来最小化代价函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值