理解深度学习内部运作的初学者指南

詹姆斯·洛伊
2018年5月14日 · 分钟阅读
更新:一年前写这篇文章时,我没想到它会如此受欢迎。从那时起,该文章已被浏览超过45万次,拍手超过30,000次。它也进入了Google的首页,并且是“ 神经网络 ” 的前几个搜索结果之一。你们中的许多人都向我伸出了援助之手,而我对本文对您的学习之旅的影响深感谦卑。

本文还引起了Packt Publishing编辑的注意。在这篇文章发表后不久,我被选为《用Python的神经网络项目》一书的唯一作者今天,我很高兴与您分享我的书已经出版了!

本书是本文的续篇,涵盖了神经网络项目在人脸识别,情感分析,噪声消除等领域的端到端实施。每章均介绍了独特的神经网络架构,包括卷积神经网络,长短期记忆网和暹罗神经网络。如果您希望通过深度学习项目来创建强大的机器学习产品组合,请考虑购买本书!

您可以从亚马逊获得这本书:使用Python的神经网络项目

动机:为了更好地了解深度学习,这是我个人旅程的一部分,我决定从零开始构建神经网络,而无需像TensorFlow这样的深度学习库。我认为,了解神经网络的内部运作方式对任何有抱负的数据科学家都至关重要。

本文包含了我所学的内容,希望对您也有所帮助!

什么是神经网络?

神经网络由以下组件组成

  • 一个输入层X
  • 任意数量的隐藏层
  • 输出层ŷ
  • 每个图层W和b之间的一组权重偏差
  • 每个隐藏层σ激活函数的选择。在本教程中,我们将使用Sigmoid激活函数。

下图显示了2层神经网络的体系结构(请注意,在计算神经网络中的层数时,通常不包括输入层

2层神经网络的架构

在Python中创建神经网络类很容易。

训练神经网络

输出ŷ一个简单的2层的神经网络是:

您可能会注意到,在上式中,权重W和偏差b是影响输出ŷ的唯一变量

自然,权重和偏差的正确值决定了预测的强度。根据输入数据微调权重和偏差的过程称为训练神经网络。

培训过程的每个迭代都包括以下步骤:

  • 计算预测输出ŷ,称为前馈
  • 更新权重和偏差,称为反向传播

下面的顺序图说明了该过程。

前馈

让我们在python代码中添加一个前馈功能即可。请注意,为简单起见,我们假设偏差为0。

但是,我们仍然需要一种方法来评估我们的预测的“良好”(即,我们的预测有多远)?该损失函数允许我们这样做。

损失函数

即,平方和误差仅是每个预测值与实际值之间的差之和。差异是平方的,以便我们测量差异的绝对值。

我们训练的目标是找到使损失函数最小化的最佳权重和偏差。

反向传播

为了知道适当的量来调整权重和偏差,我们需要知道损失函数相对于权重和偏差的导数

回想一下微积分,函数的导数就是函数的斜率。

梯度下降算法

如果我们有导数,我们可以通过增加/减少来简单地更新权重和偏差(请参见上图)。这称为梯度下降

但是,由于损失函数的方程式不包含权重和偏差,因此我们无法直接计算损失函数相对于权重和偏差的导数。因此,我们需要链式规则来帮助我们进行计算。

用于计算损失函数相对于权重的导数的链式规则。请注意,为简单起见,我们仅显示了假设为1层神经网络的偏导数。

!这很丑陋,但它使我们能够获得所需的值–损失函数相对于权重的导数(斜率),以便我们可以相应地调整权重。

现在我们有了,让我们将反向传播功能添加到我们的python代码中。

为了更深入地了解微积分和链规则在反向传播中的应用,我强烈建议3Blue1Brown推荐本教程。

全部放在一起

我们的神经网络应学习代表此功能的理想权重集。请注意,仅通过检查就可以算出重量并不是完全简单的。

让我们训练神经网络进行1500次迭代,看看会发生什么。查看下面的每次迭代损失图,我们可以清楚地看到损失单调地向最小值减小。这与我们之前讨论的梯度下降算法是一致的。

让我们看一下1500次迭代后神经网络的最终预测(输出)。

1500次训练迭代后的预测

我们做到了!我们的前馈和反向传播算法成功地训练了神经网络,并且预测收敛于真实值。

请注意,预测值与实际值之间存在细微差异。这是理想的,因为它可以防止过度拟合,并使神经网络可以更好地概括未见数据。

下一步是什么?

  • 除了Sigmoid函数外,我们还可以使用其他哪些激活函数?
  • 训练神经网络时使用学习率
  • 使用卷积进行图像分类任务

我将在不久的将来就这些主题写更多的文章,所以一定要在Medium上关注我,并留意它们!

最后的想法

尽管诸如TensorFlow和Keras之类的深度学习库使在不完全了解神经网络的内部工作原理的情况下轻松构建深层网络,但我发现对于有抱负的数据科学家加深对神经网络的了解是有益的。

这项练习对我的时间来说是一笔巨大的投资,我希望它也对您有用!