[Machine Learning] 7 神经网络的学习(Neural Networks: Learning)

在这里插入图片描述

7 Neural Networks-Learning(神经网络的学习)

7.1 Cost Function

假设神经网络的训练样本有𝑚个,每个包含一组输入𝑥和一组输出信号𝑦,𝐿表示神经网络层数,𝑆𝐼表示每层的 neuron 个数(𝑆l表示输出层神经元个数),𝑆L代表最后一层中处理单元的个数。

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

  • 二类分类:𝑆L = 0, 𝑦 = 0 𝑜𝑟 1表示哪一类;
  • 𝐾类分类:𝑆L = 𝑘, 𝑦i = 1表示分到第 i 类(𝑘 > 2);

在这里插入图片描述
逻辑回归问题中的代价函数为:
在这里插入图片描述
在逻辑回归中,只有一个输出变量,又称标量(scalar),也只有一个因变量𝑦,但是在神经网络中,可以有很多输出变量,ℎ𝜃(𝑥)是一个维度为𝐾的向量,并且训练集中的因变量也是同样维度的一个向量,因此代价函数会比逻辑回归更加复杂一些,为:
在这里插入图片描述
这个看起来复杂很多的代价函数背后的思想还是一样的,希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,都会给出𝐾个预测,基本上可以利用循环,对每一行特征都预测𝐾个不同结果,然后在利用循环在𝐾个预测中选择可能性最高的一个,将其与𝑦中的实际数据进行比较。

正则化的那一项只是排除了每一层𝜃0后,每一层的𝜃 矩阵的和。最里层的循环𝑗循环所有的行(由𝑠𝑙 +1 层的激活单元数决定),循环𝑖则循环所有的列,由该层(𝑠𝑙层)的激活单元数所决定。即:ℎ𝜃(𝑥)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization 的 bias 项处理所有参数的平方和。

7.2 Backpropagation Algorithm(反向传播算法)

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

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

假设训练集只有一个实例(𝑥(1), 𝑦(1)),神经网络是一个四层的神经网络,其中𝐾 = 4,𝑆𝐿 = 4,𝐿 = 4:

前向传播算法:
在这里插入图片描述
反向传播算法
在这里插入图片描述
从最后一层的误差开始计算,误差是激活单元的预测(ak(4))与实际值(𝑦𝑘)之间的误差,(𝑘 = 1: 𝑘),用𝛿来表示误差,则:𝛿(4) = 𝑎(4) − y 。

利用这个误差值来计算前一层的误差:𝛿(3) = (𝛩(3))𝑇𝛿(4)∗ 𝑔′(𝑧(3)) 其中 𝑔′(𝑧(3)) 是 𝑆 形函数的导数,𝑔′(𝑧(3)) = 𝑎(3)∗ (1 − 𝑎(3))。而(𝛩(3))𝑇𝛿(4)则是权重导致的误差的和。

下一步是继续计算第二层的误差:𝛿(2) = (𝛩(2))𝑇𝛿(3)∗ 𝑔′(𝑧(2)) 。

因为第一层是输入变量,不存在误差。有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设𝜆 = 0,即不做任何正则化处理时有: 𝜕/𝜕𝛩𝑖𝑗(𝑙)𝐽(𝛩) = 𝑎𝑗(𝑙)𝛿𝑖(𝑙+1)

上面式子中上下标的含义:

  • 𝑙 代表目前所计算的是第几层。
  • 𝑗 代表目前计算层中的激活单元的下标,也将是下一层的第𝑗个输入变量的下标。
  • 𝑖 代表下一层中误差单元的下标,是受到权重矩阵中第𝑖行影响的下一层中的误差单元的下标。

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

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

在求出了𝛥𝑖𝑗(𝑙)之后,便可以计算代价函数的偏导数了,计算方法如下:
在这里插入图片描述
进一步理解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3 Gradient Checking(梯度检测)

当对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做==梯度的数值检验(Numerical Gradient Checking)==方法。这种方法的思想是通过估计梯度值来检验计算的导数值是否真的是所要求的。

对梯度的估计采用的方法是在代价函数上沿着切线的方向选择两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 𝜃,计算出在 𝜃-𝜀 处和 𝜃+𝜀 的代价值(𝜀是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 𝜃处的代价值。
在这里插入图片描述
当𝜃是一个向量时,则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验。
在这里插入图片描述
最后还需要对通过反向传播方法计算出的偏导数进行检验。

根据上面的算法,计算出的偏导数存储在矩阵 𝐷𝑖𝑗(𝑙) 中。检验时,要将该矩阵展开成为向量,同时也将 𝜃 矩阵展开为向量,针对每一个 𝜃 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同𝐷𝑖𝑗(𝑙) 进行比较。

在这里插入图片描述

7.4 Random Initialization(随机初始化)

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

通常初始参数为正负𝜀之间的随机值,假设要随机初始一个尺寸为 10×11 的参数矩阵,代码如下:
Theta1 = np.random.randn(10, 11) * (2*eps) – eps

7.5 Putting it together

神经网络结构:

  • 第一层——特征数量
  • 最后一层——类的数量(K分类就是K个)
  • 隐藏层——每个隐藏层的单元个数相同,且单元的个数越多越好
  • 需要设计的结构——隐藏层的层数and单元个数

训练神经网络步骤:

  • (a)参数的随机初始化
  • (b)利用正向传播方法计算所有的h_θ (x)
  • (c)编写计算代价函数 J 的代码
  • (d)利用反向传播方法计算所有偏导数
  • (e)利用数值检验方法检验这些偏导数
  • (f)使用优化算法来最小化代价函数

上一篇:6 神经网络:表述(Neural Networks: Representation)
下一篇:8 应用机器学习的建议(Advice for Applying Machine Learning)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值