您的位置:首页 > 理论基础 > 计算机网络

机器学习第四回——神经网络

2020-07-31 22:59 651 查看

认识神经网络

模型表示一

神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出。
我们设计出了类似于神经元的神经网络,效果如下:

其中𝑥1, 𝑥2, 𝑥3是输入单元(input units),我们将原始数据输入给它们。𝑎1, 𝑎2, 𝑎3是中间单元,它们负责将数据进行处理,然后呈递到下一层。最后是输出单元,它负责计算ℎ𝜃(𝑥)。
上图为一个 3 层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit),第一层的x0,第二层的a0均为偏差单位。
下面引入一些标记法来帮助描述模型:

我们可以知道:每一个𝑎都是由上一层所有的𝑥和每一个𝑥所对应的决定的。(我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION )) 把𝑥, 𝜃, 𝑎 分别用矩阵表示,我们可以得到𝜃 ⋅ 𝑋 = 𝑎 :

模型表示二

利用向量化的方法计算
以上面的神经网络为例,计算第二层的值:

我们令 𝑧(2) = 𝜃(1)𝑥,则 𝑎(2) = 𝑔(𝑧(2)) ,计算后添加 𝑎0(2) = 1。 计算输出的值为:

这只是针对训练集中一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即:

多类分类

例:
我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有 4 个值。例如,第一个值为 1 或 0 用于预测是否是行人,第二个值用于判断是否为汽车。输入向量𝑥有三个维度,两个中间层,输出层 4 个神经元分别用来表示 4 类,也就是每一个数据在输出层都会出现[𝑎 𝑏 𝑐 𝑑]𝑇,且𝑎, 𝑏, 𝑐, 𝑑中仅有一个为 1,表示当前类。下面是该神经网络的可能结构示例:

神经网络的学习

假设神经网络的训练样本有𝑚个,每个包含一组输入𝑥和一组输出信号𝑦,𝐿表示神经网络层数,𝑆𝐼表示每层的 神经元个数,𝑆𝐿代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类:𝑆𝐿 = 0, 𝑦 = 0 𝑜𝑟 1表示哪一类;
𝐾类分类:𝑆𝐿 = 𝑘, 𝑦𝑖 = 1表示分到第 i 类;(𝑘 > 2)

代价函数


对于每一行特征,我们都会给出𝐾个预测,基本上我们可以利用循环,对每一行特征都预测𝐾个不同结果,然后在利用循环
在𝐾个预测中选择可能性最高的一个,将其与𝑦中的实际数据进行比较。
正则化的那一项只是排除了每一层𝜃0后,每一层的𝜃 矩阵的和。最里层的循环𝑗循环所有的行(由𝑠𝑙 +1 层的激活单元数决定),循环𝑖则循环所有的列,由该层(𝑠𝑙层)的激活单元数所决定。即:ℎ𝜃(𝑥)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization 的 bias 项处理所有参数的平方和。

反向传播算法

用来计算代价函数的偏导数。
基本思想:首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
例:
假设我们的训练集只有一个实例(𝑥(1), 𝑦(1)),我们的神经网络是一个四层的神经网络,其中𝐾 = 4,𝑆𝐿 = 4,𝐿 = 4:
前向传播算法:

我们从最后一层的误差开始计算,我们用𝛿来表示误差,则:𝛿(4) = 𝑎(4) − 𝑦

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

算法表示为:

即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的
结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。之后,我们便可以计算代价函数的偏导数了,计算方法如下:

梯度检验

当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
具体方法:对于某个特定的 𝜃,我们计算出在 𝜃-𝜀 处和 𝜃+𝜀 的代价值(𝜀是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 𝜃处的代价值。

当θ是一个向量时

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

随机初始化

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

使用神经网络的步骤:

网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:

  1. 参数的随机初始化
  2. 利用正向传播方法计算所有的ℎ𝜃(𝑥)
  3. 编写计算代价函数 𝐽 的代码
  4. 利用反向传播方法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: