2024-01-02 22:42:36 | 我爱编程网
从零开始用Python构建神经网络
动机:为了更加深入的理解深度学习,我们将使用 python 语言从头搭建一个神经网络,而不是使用像 Tensorflow 那样的封装好的框架。我认为理解神经网络的内部工作原理,对数据科学家来说至关重要。
这篇文章的内容是我的所学,希望也能对你有所帮助。
神经网络是什么?
介绍神经网络的文章大多数都会将它和大脑进行类比。如果你没有深入研究过大脑与神经网络的类比,那么将神经网络解释为一种将给定输入映射为期望输出的数学关系会更容易理解。
神经网络包括以下组成部分
? 一个输入层,x
? 任意数量的隐藏层
? 一个输出层,?
? 每层之间有一组权值和偏置,W and b
? 为隐藏层选择一种激活函数,σ。在教程中我们使用 Sigmoid 激活函数
下图展示了 2 层神经网络的结构(注意:我们在计算网络层数时通常排除输入层)
2 层神经网络的结构
用 Python 可以很容易的构建神经网络类
训练神经网络
这个网络的输出 ? 为:
你可能会注意到,在上面的等式中,输出 ? 是 W 和 b 函数。
因此 W 和 b 的值影响预测的准确率. 所以根据输入数据对 W 和 b 调优的过程就被成为训练神经网络。
每步训练迭代包含以下两个部分:
? 计算预测结果 ?,这一步称为前向传播
? 更新 W 和 b,,这一步成为反向传播
下面的顺序图展示了这个过程:
前向传播
正如我们在上图中看到的,前向传播只是简单的计算。对于一个基本的 2 层网络来说,它的输出是这样的:
我们在 NeuralNetwork 类中增加一个计算前向传播的函数。为了简单起见我们假设偏置 b 为0:
但是我们还需要一个方法来评估预测结果的好坏(即预测值和真实值的误差)。这就要用到损失函数。
损失函数
常用的损失函数有很多种,根据模型的需求来选择。在本教程中,我们使用误差平方和作为损失函数。
误差平方和是求每个预测值和真实值之间的误差再求和,这个误差是他们的差值求平方以便我们观察误差的绝对值。
训练的目标是找到一组 W 和 b,使得损失函数最好小,也即预测值和真实值之间的距离最小。
反向传播
我们已经度量出了预测的误差(损失),现在需要找到一种方法来传播误差,并以此更新权值和偏置。
为了知道如何适当的调整权值和偏置,我们需要知道损失函数对权值 W 和偏置 b 的导数。
回想微积分中的概念,函数的导数就是函数的斜率。
梯度下降法
如果我们已经求出了导数,我们就可以通过增加或减少导数值来更新权值 W 和偏置 b(参考上图)。这种方式被称为梯度下降法。
但是我们不能直接计算损失函数对权值和偏置的导数,因为在损失函数的等式中并没有显式的包含他们。因此,我们需要运用链式求导发在来帮助计算导数。
链式法则用于计算损失函数对 W 和 b 的导数。注意,为了简单起见。我们只展示了假设网络只有 1 层的偏导数。
这虽然很简陋,但是我们依然能得到想要的结果—损失函数对权值 W 的导数(斜率),因此我们可以相应的调整权值。
现在我们将反向传播算法的函数添加到 Python 代码中
为了更深入的理解微积分原理和反向传播中的链式求导法则,我强烈推荐 3Blue1Brown 的如下教程:
Youtube:
整合并完成一个实例
既然我们已经有了包括前向传播和反向传播的完整 Python 代码,那么就将其应用到一个例子上看看它是如何工作的吧。
神经网络可以通过学习得到函数的权重。而我们仅靠观察是不太可能得到函数的权重的。
让我们训练神经网络进行 1500 次迭代,看看会发生什么。 注意观察下面每次迭代的损失函数,我们可以清楚地看到损失函数单调递减到最小值。这与我们之前介绍的梯度下降法一致。
让我们看看经过 1500 次迭代后的神经网络的最终预测结果:
经过 1500 次迭代训练后的预测结果
我们成功了!我们应用前向和方向传播算法成功的训练了神经网络并且预测结果收敛于真实值。
注意预测值和真实值之间存在细微的误差是允许的。这样可以防止模型过拟合并且使得神经网络对于未知数据有着更强的泛化能力。
下一步是什么?
幸运的是我们的学习之旅还没有结束,仍然有很多关于神经网络和深度学习的内容需要学习。例如:
? 除了 Sigmoid 以外,还可以用哪些激活函数
? 在训练网络的时候应用学习率我爱编程网
? 在面对图像分类任务的时候使用卷积神经网络
我很快会写更多关于这个主题的内容,敬请期待!
最后的想法
我自己也从零开始写了很多神经网络的代码
虽然可以使用诸如 Tensorflow 和 Keras 这样的深度学习框架方便的搭建深层网络而不需要完全理解其内部工作原理。但是我觉得对于有追求的数据科学家来说,理解内部原理是非常有益的。
这种练习对我自己来说已成成为重要的时间投入,希望也能对你有所帮助
我在腾讯云上租了一台服务器,搭建了anaconda环境,装载了jupyter,然后在手机端打开服务器上的jupyter,这样就可以自由自在的写Python程序了
我大致把深度学习需要的库全装上去了,然后经常要训练神经网络模型的,我上课就可以用手机看训练的进度和调节参数了
我爱编程网(https://www.52biancheng.com)小编还为大家带来大学生新手如何入门Python算法的相关内容。
新手如何入门Python算法快进来学!
新手如何入门Python算法?
学会了Python基础知识, 想进阶一下, 那就来点算法吧!毕竟
编程语言只是工具,结构算法才是灵魂。
新手如何入门Python算法?
几位印度小哥在Git Hub上建了一个各种Python算法的门大全
。从原理到代码,全都给你交代清楚了。为了让新手更加直观
的理解,有的部分还配了动图。
https://github.com/TheAlgorithms/Python
这个项目主要包括两部分内容:一是各种算法的基本原理讲解
,二是各种算法的代码实现。
算法的代码实现
算法的代码实现给的资料也比较丰富,除了算法基础原理部分
的Python代码, 还有包括神经网络、机器学习、数学等等代码
实现。
例如在神经网络部分,给出了BP神经网络、卷积神经网络、全
卷积神经网络以及感知机等。
代码以Python文件格式保存在Git Hub上, 需要的同学可以自
行保存下载。
https://github.com/TheAlgorithms/Python
新手如何入门Python算法?
算法原理
在算法原理部分主要介绍了排序算法、搜索算法、插值算法、
跳跃搜索算法、快速选择算法、禁忌搜索算法、加密算法等。
当然,除了文字解释之外,还给出了帮助更好理解算法的相应
资源链接,包括维基百科、动画交互网站链接。
例如,在一些算法部分中,其给出的动画交互链接,非常完美
帮助理解算法的运行机制。
交互动画地址:
https//www.toptal.com/developers/sortingalgorithms/bub
ble-sort
排序算法
冒泡排序
新手如何入门Python算法?
冒泡排序,有时也被称做沉降排序,是一种比较简单的排序算
法。这种算法的实现是通过遍历要排序的列表,把相邻两个不
符合排列规则的数据项交换位置,然后重复遍历列表,直到不
再出现需要交换的数据项。当没有数据项需要交换时,则表明
该列表已排序。
桶排序算法
桶排序(Bucket sort) 或所谓的箱排序, 是一个排序算法, 工作
的原理是将数组分到有限数量的桶子里。每个桶子再个别排序
,有可能再使用别的排序算法或是以递归方式继续使用桶排序
进行排序。
鸡尾酒排序
鸡尾酒排序,也就是定向冒泡排序,鸡尾酒搅拌排序,搅拌排
序(也可以视作选择排序的一种变形),涟漪排序,来回排序
或快乐小时排序,都是冒泡排序的一种变形。此算法与冒泡排
序的不同处在于排序时是以双向在序列中进行排序。
新手如何入门Python算法?
插入排序
插入排序(Insertion Sort) 是一种简单直观的排序算法。它的
工作原理是通过构建有序序列,对于未排序数据,在已排序序
列中从后向前扫描,找到相应位置并插入。插入排序在实现上
, 通常采用in-place排序的额外空间的排序, 因而在从后向前排
描过程中,需要反复把已排序元素逐步向后挪位,为最新元素
提供插入空间。
归并排序
归并排序(Mergesort, 或mergesort) , 是创建在归并操作_
的一种有效的排序算法, 效率为O(n logn) (大O符号) 。1945
年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide
and Conquer) 的一个非常典型的应用, 且各层分治递归可以
同时进行。
堆(Heap)
堆(Heap) 是一种基于比较的排序算法。它可以被认为是一种
改进的选择排序。它将其输入划分为已排序和未排序的区域,
新手如何入门Python算法?
并通过提取最大元素,将其移动到已排序区域来迭代缩小未排序
区域。
基数排序
基数排序(Radix sort) 是一种非比较型整数排序算法, 其原理
是将整数按位数切割成不同的数字,然后按每个位数分别比较
。由于整数也可以表达字符串(比如名字或日期)和特定格式
的浮点数,所以基数排序也不是只能使用于整数。
选择排序
选择排序(Selection sort) 是一种简单直观的排序算法。它的
工作原理如下。首先在未排序序列中找到最小(大)元素,存
放到排序序列的起始位置,然后,再从剩余未排序元素中继续
寻找最小(大)元素,然后放到已排序序列的末尾。以此类推
,直到所有元素均排序完毕。
Shell排序
Shell Sort是插入排序的一种推广, 允许交换相距很远的项。思
路是安排元素列表,以便从任何地方开始,考虑到每个第n个元
素都会给出一个排序列表。这样的列表叫做h排序。等效地,可
以被认为是h交错列表,每个元素都是单独排序的。
2025-02-01 20:24:39
2024-01-05 14:11:24
2025-02-10 15:19:48
2025-01-28 17:58:32
2024-11-22 05:08:01
2024-09-10 08:50:00