为了账号安全,请及时绑定邮箱和手机立即绑定

从零开始用Python打造自己的神经网络 !

标签:
Python

这是一份用于理解深度学习内部运作方式的初学者指南。作者根据自己从零开始学习用 Python 构建神经网络的经验,编写了一份攻略。内容涵盖神经网络定义、损失函数、前向传播、反向传播、梯度下降算法,对于想要了解深度学习运作原理的各位来说,内容精彩不可错过。

动机:为了深入了解深度学习,我决定从零开始构建神经网络,并且不使用类似 Tensorflow 的深度学习库。我相信,对于任何有理想的数据科学家而言,理解神经网络内部的运作方式都非常重要。

本文涵盖了我学到的所有东西,希望你也能从中获益!

什么是神经网络?

大多数介绍神经网络的文章在描述它们时都会提出大脑类比。在不深入研究大脑类比的情况下,我发现简单地将神经网络描述为将给定输入映射到输出的数学函数更容易。

神经网络由以下几个组件组成

一个输入层,x

任意数量的隐藏层

一个输出层,ŷ

每两层之间都有一组权重和偏置,W 和 b

每个隐藏层都要选择一个激活函数 σ。在本文中,我们选用 Sigmoid 激活函数。

下图显示了2层神经网络的架构(请注意,在计算神经网络中的层数时,通常会排除输入层)

webp


2层神经网络的体系结构

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

webp

训练神经网络

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

webp

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

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

培训过程的每次迭代都包含以下步骤:

计算预测输出ŷ,称为前馈

更新权重和偏差,称为反向传播

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

webp

前馈

正如我们在上面的顺序图中看到的,前馈只是简单的计算,对于一个基本的2层神经网络,神经网络的输出是:

webp

让我们在python代码中添加一个前馈函数来做到这一点。 请注意,为简单起见,我们假设偏差为0。

webp

但是,我们仍然需要一种方法来评估我们预测的“好的程度”(即我们的预测有多好)? 而损失函数能让我们做到这一点。

损失函数

有许多可用的损失函数,我们的问题的性质应该决定了我们选择的损失函数。 在本教程中,我们将使用简单的平方和误差作为我们的损失函数。

webp

也就是说,平方和误差仅仅是每个预测值与实际值之差的总和。 差值是平方的,因此我们测量的是差值的绝对值。

我们的训练目标是找到最佳的权重和偏差集,以最大限度地减少损失函数。

反向传播

既然我们已经测量了预测的误差(损失),我们需要找到一种方法来传播误差,并更新权重和偏差。

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

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

webp

梯度下降算法

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

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

webp

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

唷!这真难看,但它允许我们得到我们需要的东西——损失函数相对于权重的导数(斜率),以便我们可以相应地调整权重。

现在我们已经有了这个,让我们将反向传播函数添加到python代码中。

webp

为了更深入地理解微积分和链式法则在反向传播中的应用,我强烈推荐3 blue 1 brown的本教程。

把它们放在一起

现在我们已经有了完整的python代码来进行前馈和反向传播,让我们将神经网络应用到一个例子中,看看它表现如何。

webp

我们的神经网络应该学习理想的权重集来表示这个函数。请注意,仅仅通过检查来计算权重对我们来说并不是微不足道的。

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

webp

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

webp

1500次训练迭代后的预测

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

请注意,预测值和实际值略有不同。这是可取的,因为它可以防止过度拟合,并允许神经网络更好地推广到看不见的数据。

下一步是什么?

幸运的是,我们的旅程还没有结束。关于神经网络和深度学习还有很多要学习的。例如:

除了Sigmoid函数,我们还能使用什么其他激活功能?

在训练神经网络时使用学习率

使用卷积用于图像分类任务

我很快就会在这些主题上写更多内容,所以请关注我的媒体并留意他们!

最后的想法

我从写自己的神经网络中学到了很多东西。



作者:编程新视野
链接:https://www.jianshu.com/p/dc206498104d


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消