政安晨:【完全零基础】认知人工智能(五)【超级简单】的【机器学习神经网络】 —— 数据训练

回顾

作为这个系列文章的最后一篇,咱们先回顾一下建立神经网络的整体步骤,以实现对机器学习神经网络的整体认知:

在人工智能领域中,机器学习神经网络的数据训练部分是指通过将大量的输入数据输入到神经网络中,利用反向传播算法来调整网络中的参数,从而使得网络能够学习到输入数据的特征和模式。

数据训练部分通常包括以下几个步骤:

  1. 数据准备首先要准备大量的标注数据,这些数据有已知的输入和输出值。输入数据通常是一组向量或矩阵的形式,输出数据可以是分类标签、连续值等。同时,还需要将数据集划分为训练集、验证集和测试集。

  2. 初始化参数神经网络中的参数(权重和偏置)需要进行初始化,可以使用随机数或者其他方法。

  3. 前向传播将输入数据通过网络的每一层传递,并计算输出。每一层的输出都是下一层的输入,直到到达输出层。

  4. 计算损失将网络的输出与真实值进行比较,通过某种损失函数来计算网络输出与真实值之间的差异

  5. 反向传播根据损失函数的计算结果,通过链式法则计算每个参数对损失函数的梯度

  6. 参数更新根据计算得到的梯度,使用优化算法(如随机梯度下降)来更新网络中的参数,目的是使损失函数逐渐减小

  7. 重复迭代以上步骤是一个迭代过程,通过多次迭代来逐步优化网络的参数,使得网络能够更好地拟合输入数据

  8. 模型评估使用验证集来评估训练后的模型的性能,可以计算准确率、精确率、召回率等指标

  9. 测试模型最后使用独立的测试集来评估模型的泛化能力,即模型对未见过的数据的预测能力

数据训练部分的目的是通过大量的数据和反向传播算法来调整网络参数,使得网络能够学习到输入数据的特征和模式,从而实现对未知数据的准确预测或分类

第一次看到这个系列的小伙伴,可以看一下我这个系列的前面几篇文章
政安晨:【完全零基础】认知人工智能(一)【超级简单】的【机器学习神经网络】 —— 预测机icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136139504政安晨:【完全零基础】认知人工智能(二)【超级简单】的【机器学习神经网络】—— 底层算法icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136141888政安晨:【完全零基础】认知人工智能(三)【超级简单】的【机器学习神经网络】—— 三层神经网络示例icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136151970政安晨:【完全零基础】认知人工智能(四)【超级简单】的【机器学习神经网络】—— 权重矩阵icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136160424

误差

神经网络的输出是一个极其复杂困难的函数这个函数具有许多参数影响到其输出的链接权重

我们可以使用梯度下降法,计算出正确的权重吗?

只要我们选择了合适的误差函数,这是完全可以的。神经网络本身的输出函数不是一个误差函数。但我们知道,由于误差是目标训练值与实际输出值之间的差值,因此我们可以很容易地把输出函数变成误差函数

咱们再仔细观察一下如下表格(这是3个输出节点的目标值和实际值以及误差函数的候选项):

误差函数的第一个候选项是(目标值-实际值),非常简单。这似乎足够合理了,对吧?

如果你观察对所有节点的误差之和,以判断此时网络是否得到了很好的训练,你会看到总和为0!

这是如何发生的呢?

A - 

很显然,由于前两个节点的输出值与目标值不同,这个网络没有得到很好的训练。但是,由于正负误差相互抵消,我们得到误差总和为0。总和为零意味着没有误差。然而即使正负误差没有完全互相抵消,这也很明显不符合实际情况,由此你也可以明白这不是一个很好的测量方法。

B - 

为了纠正这一点,我们采用差的绝对值,即将其写成|目标值-实际值|,这意味着我们可以无视符号。由于误差不能互相抵消,这可能行得通。由于斜率在最小值附近不是连续的,这使得梯度下降方法无法很好地发挥作用,由于这个误差函数,我们会在V形山谷附近来回跳动,因此这个误差函数没有得到广泛应用。在这种情况下,即使接近了最小值,斜率也不会变得更小,因此我们的步长也不会变得更小,这意味着我们有超调的风险。

C - 

第三种选择是差的平方,即(目标值-实际值)2。我们更喜欢使用第三种误差函数,而不喜欢使用第二种误差函数,原因有以下几点:

· 使用误差的平方,我们可以很容易使用代数计算出梯度下降的斜率。

· 误差函数平滑连续,这使得梯度下降法很好地发挥作用—没有间断,也没有突然的跳跃。

· 越接近最小值,梯度越小,这意味着,如果我们使用这个函数调节步长,超调的风险就会变得较小。

是否有第四个选项呢?

有,你可以构造各种各样的复杂有趣的代价函数。一些函数可能完全行不通,一些函数可能对特定类型的问题起作用,一些能够发挥作用的函数,可能由于额外的复杂度而有点不值得。

要使用梯度下降的方法,现在我们需要计算出误差函数相对于权重的斜率。

这需要微积分的知识,微积分使用精确的数学方式,计算出当一些变量改变时,其他应变量如何改变。例如,当在弹簧上施加一个伸展力时,弹簧的长度如何变化。

此处,我们感兴趣的是,误差函数是如何依赖于神经网络中的链接权重的。询问这个问题的另一种方式是—“误差对链接权重的改变有多敏感?

咱们看下图:

我们希望最小化的是神经网络的误差函数我们试图优化的参数是网络链接权重

在这个简单的例子中,我们只演示了一个权重,但是我们知道神经网络有众多权重参数

下图显示了两个链接权重,这次,误差函数是三维曲面,这个曲面随着两个链接权重的变化而变化。你可以看到,我们努力最小化误差,现在,这有点像咱们这个系列第四篇文章提到的:在多山的地形中寻找一个山谷

当函数具有多个参数时,要画出误差曲面相对较难,但是使用梯度下降寻找最小值的思想是相同的。

让我们使用数学的方式,写下想要取得的目标:

这个表达式表示了当权重wj,k改变时,误差E是如何改变的。这是误差函数的斜率,也就是我们希望使用梯度下降的方法到达最小值的方向。

在我们求解表达式之前,让我们只关注隐藏层和最终输出层之间的链接权重。下图突出显示了咱们所感兴趣的这个区域。我们将重回输入层和隐藏层之间的链接权重。

在进行微积分计算时,我们会时不时地返回来参照此图,以确保我们没有忘记每个符号的真正含义。小伙伴们不要被吓倒而裹足不前,这个过程并不困难,咱们在这个系列以前的文章中已经介绍了所有所需的概念。

首先,让我们展开误差函数,这是对目标值和实际值之差的平方进行求和,这是针对所有n个输出节点的和:

此处,我们所做的一切,就是写下实际的误差函数E。

注意,在节点n的输出o_{n}只取决于连接到这个节点的链接,因此我们可以直接简化这个表达式。这意味着,由于这些权重是链接到节点k的权重,因此节点k的输出o_{k}只取决于权重wj,k。

咱们可以使用另一种方式来看待这个问题,节点k的输出不依赖于权重wj,b,其中,由于b和k之间没有链接,因此b与k无关联。权重wj,b是连接输出节点b的链接权重,而不是输出节点k的链接权重。

这意味着,除了权重wj,k所链接的节点(也就是o_{k})外,我们可以从和中删除所有的o_{n},这就完全删除了令人厌烦的求和运算。这是一个很有用的技巧,值得保留下来收入囊中。

这意味着误差函数根本就不需要对所有输出节点求和。原因是节点的输出只取决于所连接的链接,就是取决于链接权重。这个过程在许多教科书中一略而过,这些教科书只是简单地声明了误差函数,却没有解释原因。

无论如何,咱们现在有了一个相对简单的表达式了

现在,我们将进行一点微积分计算。

t_{k}的部分是一个常数,因此它不会随着wj,k的变化而变化。也就是说,t_{k}不是wj,k的函数。仔细想想,如果真实示例所提供的目标值根据权重变化,就太让人匪夷所思了!由于我们使用权重前馈信号,得到输出值o_{k},因此这个表达式留下了我们所知的依赖于wj,k的o_{k}部分。我们将使用链式法则,将这个微积分任务分解成更多易于管理的小块。

我们将使用链式法则,将这个微积分任务分解成更多易于管理的小块。

再看一下链式法则:

现在,我们可以反过来对相对简单的部分各个击破,我们对平方函数进行简单的微分,就很容易击破了第一个简单的项。这使我们得到了以下的式子:

对于第二项,我们需要仔细考虑一下,但是无需考虑过久。o_{k}是节点k的输出,如果你还记得,这是在连接输入信号上进行加权求和,在所得到结果上应用S函数得到的结果。让我们将这写下来,清楚地表达出来:

o_{j}是前一个隐藏层节点的输出,而不是最终层的输出o_{k}

对S函数求微分,这对我们而言是一种非常艰辛的方法,但是,其他人已经完成了这项工作。我们可以只使用众所周知的答案,就像全世界的数学家每天都在做的事情一样即可(细节这里不赘述啦)。

在微分后,一些函数变成了非常可怕的表达式,S函数微分后,可以得到一个非常简单、易于使用的结果。在神经网络中,这是S函数成为大受欢迎的激活函数的一个重要原因

因此,让我们应用这个酷炫的结果,得到以下的表达式:

这个额外的最后一项是什么呢?由于在sigmoid()函数内部的表达式也需要对w_{j,k}进行微分,因此我们对S函数微分项再次应用链式法则。这也非常容易,答案很简单,为o_{j}

在写下最后的答案之前,让我们把在前面的2去掉,我们只对误差函数的斜率方向感兴趣,这样我们就可以使用梯度下降的方法,因此可以去掉2。只要我们牢牢记住需要什么,在表达式前面的常数,无论是2、3还是100,都无关紧要。因此,去掉这个常数,让事情变得简单。

这就是我们一直在努力要得到的最后答案,这个表达式描述了误差函数的斜率,这样我们就可以调整权重w_{j,k}了:

这就是我们一直在寻找的神奇表达式,也是训练神经网络的关键。

这个表达式值得再次回味,颜色标记有助于显示出表达式的各个部分。

第一部分,非常简单,就是(目标值-实际值),我们对此已经很清楚了。

在sigmoid中的求和表达式也很简单,就是进入最后一层节点的信号,我们可以称之为ik,这样它看起来比较简单。这是应用激活函数之前,进入节点的信号。

最后一部分是前一隐藏层节点j的输出。读者要有一种意识,明白在这个斜率的表达式中,实际涉及哪些信息并最终优化了权重,因此小伙伴们值得仔细观察这些表达式、这些项。

咱们还需要做最后一件事情。我们所得到的这个表达式,是为了优化隐藏层和输出层之间的权重。现在,我们需要完成工作,为输入层和隐藏层之间的权重找到类似的误差斜率。

同样,我们可以进行大量的代数运算,但是不必这样做。我们可以很简单地使用刚才所做的解释,为感兴趣的新权重集重新构建一个表达式:

· 第一部分的(目标值-实际值)误差,现在变成了隐藏层节点中重组的向后传播误差,正如在前面所看到的那样。我们称之为ej。

· sigmoid部分可以保持不变,但是内部的求和表达式指的是前一层,因此求和的范围是所有由权重调节的进入隐藏层节点j的输入。我们可以称之为ij。

· 现在,最后一部分是第一层节点的输出oi,这碰巧是输入信号。

这种巧妙的方法,简单利用问题中的对称性构建了一个新的表达式,避免了大量的工作。这种方法虽然很简单,但却是一种很强大的技术,一些天赋异禀的数学家和科学家都使用这种技术。你肯定可以使用这个技术,给你的队友留下深刻印象。

因此,我们一直在努力达成的最终答案的第二部分如下所示,这是我们所得到误差函数斜率,用于输入层和隐藏层之间权重调整。

现在,我们得到了关于斜率的所有关键的神奇表达式,可以使用这些表达式,在应用每层训练样本后,更新权重,在接下来的内容中我们将会看到这一点。

记住权重改变的方向与梯度方向相反,正如我们在先前的图中清楚看到的一样。我们使用学习因子,调节变化,我们可以根据特定的问题,调整这个学习因子。当我们建立线性分类器,作为避免被错误的训练样本拉得太远的一种方式,同时也为了保证权重不会由于持续的超调而在最小值附近来回摆动,我们都发现了这个学习因子。让我们用数学的形式来表达这个因子。

更新后的权重wj, k是由刚刚得到误差斜率取反来调整旧的权重而得到的。正如我们先前所看到的,如果斜率为正,我们希望减小权重,如果斜率为负,我们希望增加权重,因此,我们要对斜率取反。符号α是一个因子,这个因子可以调节这些变化的强度,确保不会超调。我们通常称这个因子为学习率。

这个表达式不仅适用于隐藏层和输出层之间的权重,而且适用于输入层和隐藏层之间的权重。差值就是误差梯度,我们可以使用上述两个表达式来计算这个误差梯度。

如果我们试图按照矩阵乘法的形式进行运算,那么我们需要看看计算的过程。为了有助于理解,我们将按照以前那样写出权重变化矩阵的每个元素。

由于学习率只是一个常数,并没有真正改变如何组织矩阵乘法,因此我们省略了学习率α。

权重改变矩阵中包含的值,这些值可以调整链接权重wj, k,这个权重链接了当前层节点j与下一层节点k。你可以发现,表达式中的第一项使用下一层(节点k)的值,最后一项使用前一层(节点j)的值。

仔细观察上图,你就会发现,表达式的最后一部分,也就是单行的水平矩阵,是前一层oj的输出的转置。颜色标记显示点乘是正确的方式。如果你不能确定,请尝试使用另一种方式的点乘,你会发现这是行不通的。

因此,权重更新矩阵有如下的矩阵形式,这种形式可以让我们通过计算机编程语言高效地实现矩阵运算。

实际上,这不是什么复杂的表达式。由于我们简化了节点输出o_{k},那些sigmoids已经消失了。

示例

我们来演示几个有数字的示例,让读者看看这种权重更新的方法是可以成功的。下面的网络是我们之前演示过的一个,但是这次,我们添加了隐藏层第一个节点oj=1和隐藏层第二个节点oj=2的示例输出值。这些数字只是为了详细说明这个方法而随意列举的,读者不能通过输入层前馈信号正确计算得到它们:

我们要更新隐藏层和输出层之间的权重w1,1。当前,这个值为2.0。

让我们再次写出误差斜率(方便比照看)。

让我们一项一项地进行运算:

· 第一项(tk-ok)得到误差e1=0.8。

· S函数内的求和Σjwj,koj为(2.0×0.4)+(3.0 * 0.5)=2.3。

· sigmoid 1/(1+e -2.3) 为0.909。中间的表达式为0.909 *(1-0.909)=0.083。

· 由于我们感兴趣的是权重w1,1,其中j=1,因此最后一项oj也很简单,也就是oj=1。此处,oj值就是0.4。

将这三项相乘,同时不要忘记表达式前的负号,最后我们得到-0.0265。

如果学习率为0.1,那么得出的改变量为-(0.1 * -0.02650)=+0.002650。因此,新的w1,1就是原来的2.0加上0.00265等于2.00265。

虽然这是一个相当小的变化量,但权重经过成百上千次的迭代,最终会确定下来,达到一种布局,这样训练有素的神经网络就会生成与训练样本中相同的输出。

咱们就这样完成了这个例子。

结论

1. 神经网络的误差是内部链接权重的函数。

2. 改进神经网络,意味着通过改变权重减少这种误差。

3. 直接选择合适的权重太难了。另一种方法是,通过误差函数的梯度下降,采取小步长,迭代地改进权重。所迈出的每一步的方向都是在当前位置向下斜率最大的方向,这就是所谓的梯度下降。

4. 使用微积分可以很容易地计算出误差斜率。


至此,咱们已经完成了零基础认知人工智能的神经网络全系列的文章啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI文生视频物理世界模型——Sora降世,AI视频领域降维打击令五大行业一夜变天!

年初六,OpenAI发布了“文生视频”的工具,Sora。AI技术变革又一次震撼了整个世界。或许你又开始担心,AI发展那么快,将会取代自己。但请记住,危机时代也是变革时代,变革就是机会。开工第一天,相信…

新能源汽车整车测试解决方案-热管理测试

热管理测试(Thermal Management Test) 整车热管理主要研究对象是电驱动系统及电池系统的温度控制和驾驶室的气候调节,满足关键零部件的冷却要求,确保各零部件的安全性与可靠性,提高车厢内乘员环境的舒适性&#xff0c…

【机器学习】数据清洗——基于Pandas库的方法删除重复点

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

【全网首篇】Copyparty 路径遍历漏洞 CVE-2023-37474 漏洞分析

Copyparty是一个便携式文件服务器 Copyparty 路径遍历漏洞 CVE-2023-37474 漏洞分析,这个漏洞研究了一些时间,不过这个不难 漏洞复现分析环境 Copyparty测试版本:1.8.0和1.8.2 系统:Windows10 和 Linux 运行环境:…

Leetcode 283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […

区块链革命:Web3如何改变我们的生活

随着技术的不断发展,区块链技术作为一种去中心化的分布式账本技术,正逐渐成为数字世界的核心。Web3作为区块链技术的重要组成部分,正在引领着数字化时代的变革,其影响已经开始渗透到我们生活的方方面面。本文将深入探讨区块链革命…

c# #if 与 Conditional属性宏的区别

测试代码 using System; using System.Diagnostics;namespace ConsoleApp1 {public class TestClass{[Conditional("Debug1")]public static void Func1(){Console.WriteLine("Conditional 宏");}public static void Func2(){ #if Debug2Console.WriteLin…

springboot当中使用EMQX(MQTT协议)

本篇博客主要围绕EMQX是什么?、能干什么?、怎么用? 三点来进行整理。 1、MQTT协议 1.1、MQTT简介 在了解EMQX前首先了解一下MQTT协议,MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输&#xff0…

智慧城市驿站:智慧公厕升级版,打造现代化城市生活的便捷配套

随着城市化进程的加速,人们对城市生活质量的要求也越来越高。作为智慧城市建设的一项重要组成部分,多功能城市智慧驿站应运而生。它集合了信息技术、设计美学、结构工艺、系统集成、环保节能等多个亮点,将现代科技与城市生活相融合&#xff0…

qt for python创建UI界面

现在很多库都有用到python,又想使用QT creater创作界面,来使用。 1.使用的版本 使用虚拟机安装Ubuntu22.04,Ubuntu使用命令行安装qt,默认安装的是QT5,不用来回调了,就用系统默认的吧,不然安装工具都要费不少事情。pyt…

SimpleDateFormat为什么是线程不安全的?

目录 在日常开发中,Date工具类使用频率相对较高,大家通常都会这样写:这很简单啊,有什么争议吗?格式化后出现的时间错乱。看看Java 8是如何解决时区问题的:在处理带时区的国际化时间问题,推荐使用…

[力扣 Hot100]Day30 两两交换链表中的节点

题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 出处 思路 前两个结点先偷一手用交换val做,从链表第1…

算法面试八股文『 模型详解篇 』

说在前面 这是本系列的第二篇博客,主要是整理了一些经典模型的原理和结构,面试有时候也会问到这些模型的细节,因此都是需要十分熟悉的。光看原理还不够,最好是能用代码试着复现,可以看看李沐老师深度学习的教材&#…

沁恒CH32V30X学习笔记11---使用外部时钟模式2采集脉冲计数

使用外部时钟模式2采集脉冲计数 使用外部触发模式 2 能在外部时钟引脚输入的每一个上升沿或下降沿计数。将 ECE 位置位时,将使用外部时钟源模式 2。使用外部时钟源模式 2 时,ETRF 被选定为 CK_PSC。ETR 引脚经过可选的反相器(ETP),分频器(ETPS)后成为 ETRP,再经过滤波…

自动化上位机开发C#100例:如何用面向对象的方式封装雷赛运动控制卡EtherCAT总线卡(C#代码)

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类 文章目录 LTDMC.dll下载LTDMC.cs LTDMC.dll C#调用封装下载ICard.cs 运动控制卡接口Card.cs 运动控制卡抽象类CardLTDMC.cs 雷赛运动控制卡EtherCAT总线卡实现类CardList.cs 总线卡列表封装 LTDMC.dll下载 最新…

人工智能|机器学习——基于机器学习的舌苔检测

代码下载: 基于深度学习的舌苔检测毕设留档.zip资源-CSDN文库 1 研究背景 1.1.研究背景与意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。在诊断中,中医通过观察人的舌头的舌质、苔…

基于STM32F407的coreJSON使用教程

目录 概述 工程建立 代码集成 函数介绍 使用示例 概述 coreJSON是FreeRTOS中的一个组件库,支持key查找的解析器,他只是一个解析器,不能生成json数据。同时严格执行 ECMA-404 JSON 标准。该库用 C 语言编写,设计符合 ISO C90…

基于Java SSM框架实现生鲜食品o2o商城系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现生鲜食品o2o商城系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 生鲜食品o2o商城系统,主要的模块包括查看管理员;首页、个人中心、用户…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络,也称为多层感知机(Multilayer Perceptron,MLP),是一种常见的神经网络模型,用于解决各种机器学习问题,包括分类和回归。BP 代表“反向传播”(Backpropagation&#…

领域驱动设计(Domain Driven Design)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、场景和要求二、领域模型关键词1.领域2.子域3.通用语言4.限界上下文5.领域模型6.实体和值对象7.聚合根8.领域服务9.领域事件 总结 前言 Domain Driven Desi…