神经网络&反向传播算法

433 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

神经网络,Neural Networks,逐渐兴起于二十世纪八九十年代,应用得非常广泛。但由于各种原因,在90年代的后期应用减少了(这期间SVM是机器学习领域的主流算法)。二十一世纪10年代神经网络又东山再起了。

无论是线性回归还是逻辑回归存在一个缺点:当特征太多时,计算的负荷会非常大。

假设有大于****100个变量,我们希望用这100个特征来构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便我们只采用两两特征的组合(𝑥1𝑥2 + 𝑥1𝑥3 + 𝑥1𝑥4+. . . +𝑥2𝑥3 + 𝑥2𝑥4+. . . +𝑥99𝑥100),我们也会有接近5000个组合而成的特征。

实际上,在应用中往往会涉及到比这个还要大很多的特征量。例如训练一个模型来识别视觉对象。假使采用的都是50x50像素的小图片,并且将所有的像素视为特征,则会有2500个特征,如果要进一步将两两特征组合构成一个多项式模型,则会有约312万个(接近3百万个)特征。这时候就需要神经网络

在约定俗成的符号传统中,当计算网络的层数时,输入层是不算入总层数内,所以隐藏层是第一层。第二个惯例是我们将输入层称为第零层

表示分类数据的简单方法:独热编码( one-hot encoding 。 独热编码是一个向量,它的分量和类别一样多。类别对应的分量设置为1,其他所有分量设置为0。分类“鸡猫狗”中,标签y将是一个三维向量,其中(1,0,0)对应于“猫”、(0,1,0)对应于“鸡”、(0,0,1)对应于“狗”:

y∈{(1,0,0),(0,1,0),(0,0,1)}.

       李沐认为:“神经网络是一种语言,可以用这个结构化的语言拟合数据,无论数据是结构化的还是非结构化的。”

反向传播算法

吴恩达老师认为反向传播的推导是机器学习领域最难的数学推导之一

为了计算代价函数的偏导数 我们需要采用一种反向传播算法( Backpropagation Algorithm ,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。

以一个例子来说明反向传播算法

image.png

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

我们用𝛿来表示误差,则:𝛿 (4) = 𝑎 (4) – y 利用这个误差值来计算前一层的误差: image.png 其中 image.png 是 𝑆 形函数的导数, image.pngimage.png 则是权重导致的误差的和。下一步是继续计算第二层的误差:image.png

因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设𝜆 = 0,即我们不做任何正则化处理时有:

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

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

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

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

需要为整个训练集计算误差单元,此时的误差单元是一个矩阵,我们用𝛥𝑖𝑗 (𝑙)来表示这个误差矩阵。第 𝑙 层的第 𝑖 个激活单元受到第 𝑗 个参数影响而导致的误差。

在求出了𝛥𝑖𝑗 (𝑙)之后,我们便可以计算代价函数的偏导数了,计算方法如下:

image.png

使用神经网络时的步骤:

首先,选择网络结构,即决定选择多少以及决定每层分别有多少个单元第一层的单元数即我们训练集的特征数量最后一层的单元数是我们训练集的结果的类的数量我们真正要决定的是隐藏层的层数和每个中间层的单元数,通常情况下隐藏层单元的个数越多越好。

接着,训练神经网络:

  1. 参数的随机初始化

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

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

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

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

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