外链论坛

 找回密码
 立即注册
搜索
查看: 43|回复: 3

独家 | 怎么样手动优化神经网络模型(附链接)

[复制链接]

2902

主题

1万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99159549
发表于 2024-8-31 05:57:33 | 显示全部楼层 |阅读模式

翻译:陈丹

校对:车前子

本文约5400字意见阅读15分钟

本文是一个教授怎样优化神经网络模型的基本教程,供给详细的实战代码供读者学习和实践。

标签:神经网络优化

深度学习的神经网络是采用随机梯度下降优化算法对训练数据进行拟合。利用误差反向传播算法对模型的权值进行更新。优化和权值更新算法的组合是经过仔细挑选的,是日前已知的最有效的拟合神经网络的办法然而,能够运用交替优化算法将神经网络模型拟合到训练数据集。这是一个有用的练习,能够认识更加多关于神经网络的是怎样运转的,以及应用设备学习时优化的中心性。拥有非常规模型结构和不可微分传递函数的神经网络,可能需要它。在本教程中,您将认识怎样手动优化神经网络模型的权重。完成本教程后,您将晓得

怎样从头起始研发神经网络模型的正向推理通路。

怎样优化二值归类感知器模型的权值。

怎样利用随机爬山算法优化多层感知器模型的权值。

咱们起始吧。

图源土地管理局,权利归其所有

教程概述

本教程分为三个部分:它们是:

优化神经网络

优化感知器模型

优化多层感知器

优化神经网络

深度学习或神经网络是一种灵活的设备学习。它们是受大脑结构和功能的启发而来的,由节点和层次构成的模型。神经网络模型的工作原理是将给定的输入向量传播到一个或多个层,以产生可用于归类或回归预测建模的数值输出。经过反复将模型暴露在输入和输出示例中,并调节权重以使模型输出相针对期望输出的误差最小来训练模型。这便是所说的随机梯度下降优化算法。模型的权值是运用微积分中的一个特定规则来调节的,即将误差按比例分配给网络中的每一个权重。这被叫作为反向传播算法。利用反向传播进行权值更新的随机梯度下降优化算法是训练神经网络模型的最佳办法。然而,这并不是训练神经网络的独一办法能够运用任意的优化算法来训练神经网络模型。便是说,咱们可以定义一个神经网络模型结构,并运用给定的优化算法为模型找到一组权重,从而使预测误差最小或归类精度达到最大。交替优化算法一般来讲比反向传播的随机梯度下降算法效率更低。然而,在某些特定状况下,它可能更有效,例如非标准网络体系结构或不可微分的传递函数。在训练设备学习的算法中,尤其是神经网络中,展示优化的中心性是一个有趣的练习。接下来,让咱们探索怎样运用随机爬山算法训练一个叫作为感知器模型的简单单节点神经网络。

优化感知器模型

感知器算法(https://machinelearningmastery.com/implement-perceptron-algorithm-scratch-python/)是最简单的人工神经网络。它是一个单神经元模型,可用于两类归类问题,为以后研发更大的网络供给基本在本节中,咱们将优化感知器神经网络模型的权重。首要,让咱们定义一个综合二进制归类问题,咱们能够用它做为优化模型的焦点。咱们能够运用make_classification()(https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html)函数定义一个包括1000行和5个输入变量的二归类问题。下面的示例创建数据集并总结数据的形状。

运行以上示例,打印出所创建数据集的形状,以确定符合咱们的预期。

接下来,咱们需要定义一个感知器模型。感知器模型有一个节点,它对数据集中的每一列都有一个输入权重。每一个输入值乘以其相应的权重得到一个加权和,而后添加一个偏差权重,就像回归模型中的截距系数同样。这个加权和叫作为活性值。最后,对活性值进行解释并用于预测类标签,1暗示正激活,0暗示负激活。在优化模型权重之前,咱们必须创立模型并相信它的运作方式。咱们从定义一个用于解释模型激活的函数起始这被叫作为激活函数,或传递函数;后一个名叫作更传统,是我的首选。下面的transfer()函数接受模型的激活并返回一个类标签,class=1暗示正激活或零激活,class=0暗示负激活。这叫作为阶跃函数。接下来,咱们能够开发一个函数,该函数计算来自数据集的给定输入行的模型活性值。此函数将获取模型的数据行和权重,并计算输入的加权和以及偏差权重。下面的activate()函数实现了这一点。重视咱们特意运用简单的Python列表和命令式编程风格,而不是NumPy的数组或列表压缩,是为了让Python初学者更易读懂。您能够随意优化它,并在下面的注释中发布您的代码。

接下来,咱们能够一块运用activate()和transfer()函数来生成给定数据行的预测。下面的predict_row()函数实现了这一点。

接下来,咱们能够为给定数据集中的每一行调用predict_row()函数。下面的predict_dataset()函数实现了这一点。一样咱们有意运用简单的命令式编码方式来加强可读性,而不是列表压缩。

最后,咱们能够运用该模型对咱们的合成数据集进行预测,以确认它都是正确工作的。咱们能够运用rand()函数生成一组随机的模型权重。回想一下,咱们需要为每一个输入赋予一个权重(在这个数据集中有五个输入),再加上一个额外的权重做为偏移权重。

而后咱们能够将这些权重与数据集一块运用来进行预测。

咱们能够评定这些预测的归类精度。

这般咱们能够将所有这些整理在一块,并演示用咱们的简单感知器模型进行归类。下面列出了完整的示例。

运行该示例将为训练数据集中的每一个示例生成一个预测,而后打印出归类预测的准确度。重视您的结果可能会由于算法或评定过程的随机性或数值精度的差异而有所区别(https://machinelearningmastery.com/different-results-each-time-in-machine-learning/)思虑运行该示例几次并比较平均结果。倘若给定一组随机权重和一个每类中有相同数量示例的数据集,咱们期望大约50%的准确率,这与咱们在本例中看到的差不多。

此刻咱们能够优化数据集的权重,以得到该数据集的良好准确度。首要咱们需要将数据集分成训练集和测试集。重要的是要保存有些未用于优化模型的数据,以便在对新数据进行预测时,咱们能够对模型的性能进行恰当的估计。咱们运用67%的数据进行培训,剩下的33%做为测试集来评定模型的性能。

接下来,咱们能够研发一个随机爬山算法。优化算法需要一个目的函数来优化。它必须取一组权重,并返回一个与更好的模型相对应的最小化或最大化的分数。在这种状况下,咱们运用一组给定的权重来评定模型的准确性,并返回归类精度,这必须使其最大化。下面的objective()函数经过给定数据集和一组权重来实现这一点,并返回模型的精度。

接下来,咱们能够定义随机爬山算法(https://machinelearningmastery.com/stochastic-hill-climbing-in-python-from-scratch/)该算法需要一个初始解(例如随机权重),并且会持续地对解进行小的修改,并检测是不是会产生一个性能更好的模型。对当前处理方法所做的更改量由“步长”超参数掌控。此过程将连续固定次数的迭代,做为超参数供给下面的hillclimbing()函数实现了这一点,它将数据集、目的函数、初始解和超参数做为参数,并返回找到的最佳权重集和估计的性能。

而后咱们能够调用这个函数,传入一组权重做为初始解,将训练数据集做为优化模型的数据集。

最后,咱们能够在测试数据集上评定最佳模型并报告性能。

结合这一点,下面列出了在合成二进制优化数据集上优化感知器模型权重的完整示例。

每次对模型进行改进时,运行示例将报告迭代次数和归类精度。在搜索的最后,报告了最佳权重集在训练数据集上的性能,并计算和报告了同一模型在测试数据集上的性能。重视您的结果可能会由于算法或评定过程的随机性或数值精度的差异而有所区别(https://machinelearningmastery.com/different-results-each-time-in-machine-learning/)。思虑运行该示例几次并比较平均结果。在这种状况下,咱们能够看到优化算法找到了一组权重,在训练数据集上达到了88.5%的准确率,在测试数据集上达到了81.8%的准确率。

此刻咱们已然熟练怎样手动优化感知器模型的权重,让咱们瞧瞧怎样扩展示例来优化多层感知器(Multilayer Perceptron,MLP)模型的权重。

优化多层感知器

多层感知器(MLP)模型是一个拥有一个或多个层次的神经网络,每一层都有一个或多个节点。它是感知器模型的扩展,可能是应用最广泛的神经网络(深度学习)模型。在本节中,咱们将在上一节所学的基本上,优化每层拥有任意数量层和节点的MLP模型的权重。首要咱们研发模型并用随机权重进行测试,而后运用随机爬山算法优化模型权重。运用MLPs进行二归类时,一般运用sigmoid变换函数(叫作为logistic函数)来代替感知器中运用的阶跃变换函数。此函数输出0-1之间的实数,暗示二项式概率分布(https://machinelearningmastery.com/discrete-probability-distributions-for-machine-learning/),例如一个示例属于1类的概率。下面的transfer()函数实现了这一点。

咱们能够运用上一节中相同的activate()函数。在这儿咱们运用它来计算给定层中每一个节点的激活。predict_row()函数必须替换为更精细的版本。函数获取一行数据和网络并返回网络的输出。咱们将把咱们的网络定义为一个列表。每一个层将是一个节点列表,每一个节点将是一个权重列表或数组。为了计算网络的预测,咱们简单地枚举层,而后枚举节点,而后每一个节点的输出进行激活计算和变换。在这种状况下,咱们将对网络中的所有节点使用相同的变换函数,尽管这不是必须的。针对拥有多个层的网络,上一层的输出用作下一层中每一个节点的输入。而后返回网络中最后一层的输出。下面的predict_row()函数实现了这一点。

便是这般最后咱们需要定义一个网络。例如,咱们能够运用单个隐匿层和单个节点定义MLP,如下所示:

实质上是一个感知器,尽管它有一个sigmoid变换函数。这很无聊。咱们定义一个拥有一个隐匿层和一个输出层的MLP。第1隐匿层将有10个节点,每一个节点将从数据集中获取输入模式(例如5个输入)。输出层将有一个节点,从第1隐匿层的输出接收输入,而后输出预测。

而后咱们能够运用模型对数据集进行预测。

在计算归类精度之前,咱们必须将预测四舍五入到归类标签0和1。

将这些整合在一块,在咱们合成的二进制归类数据集上运用随机初始权重来评定MLP的完整示例如下所示。

运行该示例将为训练数据集中的每一个示例生成一个预测,而后打印预测的归类精度。重视您的结果可能会由于算法或评定过程的随机性或数值精度的差异而有所区别(https://machinelearningmastery.com/different-results-each-time-in-machine-learning/)思虑运行该示例几次并比较平均结果。一样咱们期盼在给定一组随机权重和一个数据集(每一个类中有相同数量的示例)的状况下,准确率大约为50%,这与咱们在本例中看到的差不多。

接下来,咱们能够将随机爬山算法应用于数据集。这与将爬山应用于感知器模型非常相同,只是在这种状况下,一个过程需要修改网络中的所有权重。为此,咱们研发一个新功能,创建一个网络副本,并在制作副本时对网络中的每一个权重进行变异。下面的step()函数实现了这一点。

修改网络中的所有权重是拥有侵略性的。在搜索空间中,一个不那样激进的过程可能是对模型中的权重子集进行一个小的更改,是由于一个超参数掌控的。这个做为扩展内容。而后咱们能够从hillclimbing()函数调用这个新的step()函数。

结合这一点,下面列出了应用随机爬山算法优化二归类MLP模型权重的完整示例。

每次对模型进行改进时,运行示例将报告迭代次数和归类精度。在搜索的最后,报告了最佳权重集在训练数据集上的性能,并计算和报告了同一模型在测试数据集上的性能。重视您的结果可能会由于算法或评定过程的随机性或数值精度的差异而有所区别(https://machinelearningmastery.com/different-results-each-time-in-machine-learning/)思虑运行该示例几次并比较平均结果。在这种状况下,咱们能够看到优化算法找到了一组权重,在训练数据集上达到了87.3%的准确率,在测试数据集上达到了大约85.1%的准确率。

进一步阅读

倘若您想深入认识,本节将供给相关该主题的更加多资源。教程用于评定设备学习算法的训练测试分割:https://machinelearningmastery.com/train-test-split-for-evaluating-machine-learning-algorithms怎样用Python中从头起始实现感知器算法:https://machinelearningmastery.com/implement-perceptron-algorithm-scratch-python/怎样用Python编写反向传播的神经网络(从头起始):https://machinelearningmastery.com/implement-backpropagation-algorithm-scratch-python/接口sklearn.datasets.make_classification 接口:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.htmlsklearn.metrics.accuracy_score 接口:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.htmlnumpy.random.rand接口:https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html总结在本教程中,您认识怎样手动优化神经网络模型的权重。详细来讲,你学到了:

怎样从头起始研发神经网络模型的正向推理通路。

怎样优化二归类感知器模型的权值。

怎样利用随机爬山算法优化多层感知器模型的权值。

原文标题:How to Manually Optimize Neural Network Models原文链接:https://machinelearningmastery.com/manually-optimize-neural-networks/编辑:王菁校对:林

译者简介

陈丹,复旦大学大三在读,主修预防医学,辅修数据科学。对数据分析充满兴趣,但初入这一行业,还有非常多非常多需要奋斗进步的空间。期盼今后能在翻译组进行关联工作的过程中拓展文献阅读量,学习到更加多的前沿知识,同期认识更加多一起志趣的小伙伴!

翻译组招募信息

工作内容:

需要一颗细致的心,将选择好的外文文案翻译成流畅的中文。倘若你是数据科学/统计学/计算机类的留学生,或在海外从事关联工作,或对自己外语水平有自信心伴侣欢迎加入翻译小组。

你能得到:定时的翻译培训加强志愿者的翻译水平,加强针对数据科学前沿的认知,海外的伴侣能够和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生她们都将作为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇明显位置注明作者和出处(转载:数据派ID:DatapiTHU),并在文案结尾安置数据派醒目二维码。有原创标识文案,请发送【文案叫作-待授权公众号名叫作及ID】至联系邮箱,申请白名单授权并按需求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,咱们将依法追究其法律责任。

点击“阅读原文”拥抱组织

回复

使用道具 举报

2826

主题

1万

回帖

9956万

积分

论坛元老

Rank: 8Rank: 8

积分
99569756
发表于 2024-9-27 14:32:13 | 显示全部楼层
你的话语如春风拂面,温暖了我的心房,真的很感谢。
回复

使用道具 举报

2920

主题

1万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139495
发表于 前天 19:36 | 显示全部楼层
我完全同意你的观点,说得太对了。
回复

使用道具 举报

2902

主题

1万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99159549
 楼主| 发表于 昨天 21:41 | 显示全部楼层
楼主节操掉了,还不快捡起来!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-10-18 21:18 , Processed in 0.077062 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.