Python 智能项目:1~5(2)https://developer.aliyun.com/article/1426930
一、人工智能系统的基础
人工智能(AI)在过去几年中一直处于技术的最前沿,并已进入主流应用,例如专家系统,移动设备上的个性化应用, 自然语言处理中的机器翻译,聊天机器人,自动驾驶汽车等。 但是,AI 的定义在很长一段时间以来一直是一个争论的主题。 这主要是因为所谓的 AI 效应将过去已经通过 AI 解决的工作归类为非 AI。 根据一位著名的计算机科学家的说法:
智能是机器尚未完成的一切。
–拉里·特斯勒(Larry Tesler)
在 1996 年 IBM 电脑 Deep Blue 击败 Gary Kasparov 之前,一直认为构建能下象棋的智能系统是 AI。类似地,曾经将视觉,言语和自然语言方面的问题视为复杂问题,但是由于 AI 的影响,它们现在仅被视为计算而非真正的 AI。 近来,人工智能已经能够解决复杂的数学问题,创作音乐和创作抽象绘画,并且人工智能的这些功能正在不断增加。 科学家将 AI 系统在未来等同于人类智能水平的点称为 AI 奇点。 机器是否会真正达到人类的智能水平这个问题非常令人着迷。
许多人会认为机器永远无法达到人类的智能水平,因为用来学习或执行智能任务的 AI 逻辑是由人类编程的,并且它们缺乏人类所拥有的意识和自我意识。 但是,一些研究人员提出了另一种想法,即人类意识和自我意识就像无限循环程序,可以通过反馈从周围的环境中学习。 因此,也有可能将意识和自我意识编程到机器中。 但是,就目前而言,我们将把 AI 的这一哲学方面再留一天,并简单地讨论我们所知道的 AI。
简而言之,AI 可以定义为机器(通常是计算机或机器人)以类人的智力执行任务的能力,例如具有推理,学习经验,归纳,破译含义和拥有的能力等属性。 视觉感知。 我们将坚持这个更实际的定义,而不是关注 AI 效应所带来的哲学内涵以及 AI 奇异性的前景。 尽管可能存在关于 AI 可以实现和不能实现的争论,但基于 AI 的系统的最新成功故事却令人瞩目。 下图描述了 AI 的一些较新的主流应用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hORVU4dY-1681653992465)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/623d9065-122c-4066-bfed-634f7ac3cd75.png)]
图 1.1:人工智能的应用
本书将涵盖来自 AI 的所有核心学科的项目的详细实现,概述如下:
- 基于迁移学习的 AI 系统
- 基于自然语言的 AI 系统
- 基于生成对抗网络(GAN)的应用
- 专家系统
- 视频到文本翻译应用
- 基于 AI 的推荐系统
- 基于 AI 的移动应用
- 基于 AI 的聊天机器人
- 强化学习应用
在本章中,我们将简要介绍实现机器学习和深度学习的概念,这些概念是实现以下各章中涉及的项目所必需的。
神经网络
神经网络是受人脑启发的机器学习模型。 它们由神经处理单元组成,它们以分层的方式相互连接。 这些神经处理单元称为人工神经元,它们在人脑中执行与轴突相同的功能。 在人脑中,树突接收来自邻近神经元的输入,并在将输入传输到神经元的体细胞之前减弱或放大输入。 在神经元的躯体中,这些修饰的信号被加在一起并传递到神经元的轴突。 如果轴突的输入超过指定的阈值,则信号将传递到相邻神经元的树突。
人工神经元松散地工作可能与生物神经元在相同的逻辑上起作用。 它接收来自邻近神经元的输入。 通过神经元的输入连接来缩放输入,然后将它们加在一起。 最后,求和的输入通过激活函数传递,该函数的输出传递到下一层的神经元。
下图说明了生物神经元和人工神经元,以进行比较:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aa6arHAs-1681653992466)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/6527d133-7918-4ab3-96e8-36fa4181c4dc.png)]
图 1.2:生物神经元
下图说明了人工神经元:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9f2bukQd-1681653992467)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/ed578913-a219-4604-be04-530487b57afa.png)]
图 1.3:人工神经元
现在,让我们看一下人工神经网络的结构,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlRfPnxB-1681653992467)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/b767da6e-2a08-4790-8e59-3081c2ab9651.png)]
图 1.4:人工神经网络
输入x ∈ R^N
穿过神经单元的连续层,这些层以分层方式排列。 特定层中的每个神经元都接收来自先前层的神经元的输入,这些输入被它们之间的连接权重所衰减或放大。 权重w[ij]^(l)
对应于l
层第i
个神经元与l + 1
层第j
个神经元。 同样,每个神经元单元i
在特定层1
中都有一个偏置b[i]^(l)
。 神经网络为输入向量x ∈ R^N
预测输出y_hat
。 如果数据的实际标签是y
,其中y
取连续值,则神经元网络将预测误差最小化(y - y_hat)^2
来学习权重和偏差。 当然,对于所有标记的数据点,必须将误差最小化:(xi, yi), i ∈ 1, 2, ..., m
。
如果我们用一个公共向量W
表示一组权重和偏差,并且预测中的总误差由C
表示,则在训练过程中,估计的W
可以表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqsHEvIU-1681653992468)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/973e52ab-5ebb-40a0-941c-20665d118f10.png)]
同样,预测输出y_hat
可以由输入x
的函数表示,并由权重向量W
进行参数化,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P8reOrtv-1681653992468)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/9e08ed5e-7e12-46d1-a2cb-a2e343d9c8d2.png)]
这种用于预测输出连续值的公式称为回归问题。
对于两类二分类,交叉熵损失最小,而不是平方误差损失,并且网络输出正类的概率而不是输出。 交叉熵损失可以表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmQaswLT-1681653992468)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/c0fb9371-3b94-4ffa-9443-f51299bb5cb8.png)]
此处,p[i]
是给定输入x
的输出类别的预测概率,并且可以表示为输入x
的函数。由权重向量参数化,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6x7kCN0-1681653992469)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/90eddcaa-84e7-46c8-8b42-d34e3fd7ef91.png)]
通常,对于多类别分类问题(例如n
类),交叉熵损失可通过以下方式给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHT2Av4g-1681653992469)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/b8e45aea-221b-44e3-bbc3-0d9e88a4cf2d.png)]
在这里,y[i]^(j)
是第i
个数据点的第j
类的输出标签。
神经激活单元
取决于架构和当前的问题,在神经网络中使用了几种神经激活单元。 我们将讨论最常用的激活函数,因为它们在确定网络架构和表现方面起着重要作用。 线性和 Sigmoid 单元激活函数主要用于人工神经网络,直到 Hinton 等人发明的整流线性单元(ReLUs)彻底改变了神经网络的表现。
线性激活单元
线性激活单元将总输入输出到衰减的神经元,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0OzUxtx-1681653992469)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/d1c95a3f-f648-44c6-88be-744da68e0aee.png)]
图 1.5:线性神经元
如果x
是线性激活单元的总输入,则输出y
可以表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3A5Jn0N-1681653992470)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/7db1c93b-6ac7-4b2c-b464-dd69836c6854.png)]
Sigmoid 激活单元
Sigmoid 激活单元,y
的输出是其总输入x
的函数,表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bq7DSl5f-1681653992470)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/e72ceed8-eaaa-4d3e-bc39-256e36d389e2.png)]
由于 Sigmoid 激活单元响应是非线性函数,如下图所示,它可用于在神经网络中引入非线性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3o5Suub-1681653992470)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/f54ce333-0cdb-400f-b9d1-22d60475291f.png)]
图 1.6:Sigmoid 激活函数
自然界中任何复杂的过程通常在输入输出关系上都是非线性的,因此,我们需要非线性激活函数通过神经网络对其进行建模。 两类分类的神经网络的输出概率通常由 Sigmoid 神经单元的输出给定,因为它的输出值从零到一。 输出概率可以表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cg6Zf2uo-1681653992470)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/4e502901-d686-46cf-ba1c-e0b11d2c2707.png)]
在这里,x
代表输出层中 Sigmoid 单元的总输入量。
双曲正切激活函数
给出了双曲正切激活函数(tanh)的输出y
作为其总输入的函数x
如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZG9VpHxc-1681653992471)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/ff09283d-c4ae-42d3-8b20-5c6cb9523899.png)]
tanh 激活函数输出的值在[-1, 1]
范围内,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dktR3vy1-1681653992482)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/58f98f0c-6a81-4acc-bafb-9b0f683ad9c9.png)]
图 1.7:Tanh 激活函数
需要注意的一件事是 Sigmoid 和 tanh 激活函数在很小的输入范围内都是线性的,超过该范围输出就会饱和。 在饱和区,激活函数(相对于输入)的梯度非常小或接近零; 这意味着它们非常容易消失梯度问题。 正如您将在后面看到的那样,神经网络将从反向传播方法中学习,在该方法中,层的梯度取决于后续层中直至最终输出层中激活单元的梯度。 因此,如果激活单元中的单元在饱和区域中工作,则将更少的误差反向传播到神经网络的早期层。 神经网络通过利用梯度来最小化预测误差,以学习权重和偏差(W
)。 这意味着,如果梯度很小或消失为零,则神经网络将无法正确学习这些权重。
整流线性单元(ReLU)
当神经元的总输入大于零时,ReLU 的输出为线性,而当神经元的总输入为负时,ReLU 的输出为零。 这个简单的激活函数为神经网络提供了非线性,同时,它相对于总输入提供了一个恒定的梯度。 这个恒定的梯度有助于防止神经网络出现饱和或消失的梯度问题,如激活函数(如 Sigmoid 和 tanh 激活单元)所示。 ReLU 函数输出(如图“图 1.8”所示)可以表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FPRC1BGK-1681653992482)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/f3c8b630-6ebc-4f71-903a-d192d27621f7.png)]
ReLU 激活函数可以绘制如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOmPDWkN-1681653992483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/56ed1747-01f7-48fa-9a00-db7d1b05a8f9.png)]
图 1.8:ReLU 激活函数
ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢训练速度,尤其是在初始阶段。 LReLU 激活函数(如图 1.9 所示)在这种情况下非常有用,即使输出和梯度不为零,即使输入为负值。 ReLU 输出函数泄漏可以表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S4gi2H4B-1681653992483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/048015a0-395a-46f0-bf04-524539aea052.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzFolLb7-1681653992483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/66329819-1528-4067-afc8-bf3e505ecb09.png)]
将为 LReLU 激活函数提供α
参数,而对于参数 ReLU,α
是神经网络将通过训练学习的参数。 下图显示了 LReLU 激活函数的输出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjfbfOa5-1681653992483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/908a6fec-a34a-4e27-a0a4-27dd3b5d84cc.png)]
图 1.9:LReLU 激活函数
softmax 激活单元
在多类别分类问题的情况下, softmax 激活单元通常用于输出类别概率。 假设我们正在处理n
类分类问题,并且与这些类相对应的总输入如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yu30DXdv-1681653992483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/1e6529dc-c80f-4914-b540-4a7a23382feb.png)]
在这种情况下,softmax 激活单元的第k
类的输出概率由以下公式给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcGlA4Kd-1681653992484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/2c4f3f2d-fb61-4823-bad9-632d16200fe2.png)]
还有其他几种激活函数,大多数是这些基本版本的变体。 我们将在以下各章介绍的不同项目中讨论它们时,对它们进行讨论。
训练神经网络的反向传播方法
在反向传播方法中,神经网络通过梯度下降技术进行训练,其中组合权重向量W
迭代更新,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmuexJBs-1681653992484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/80a9c3b5-27aa-462b-a309-dec4fdbf49cb.png)]
这里,η
是学习率, W^(t + 1)
和W^(t)
分别是迭代t + 1
和t
时的权重向量,∇C(W^(t))
是迭代t
时的成本函数或误差函数对于权重向量W
的梯度。 先前由w ∈ W
概括的单个权重或偏差的算法可以表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xc2rEHFh-1681653992484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/2a2d7a65-e5d6-4570-8400-3895193259bb.png)]
从前面的表达式中可以得出,梯度下降学习方法的核心在于针对每个权重计算成本函数或误差函数的梯度。
从微分的链式规则中,我们知道如果我们有 y = f(x), z = f(y)
,那么以下是正确的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nrl36B3Q-1681653992484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/c53a0c79-d20d-4f73-9d61-f2f8e93e8f00.png)]
该表达式可以推广为任意数量的变量。 现在,让我们看一个非常简单的神经网络,如下图所示,以了解反向传播算法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EI6rXhcX-1681653992485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/98bc8f7e-872a-46ef-a018-c9ad01d911f8.png)]
图 1.10:说明反向传播的网络
令网络输入为二维向量, x = [x1, x2]^T
, 输出标签和预测分别为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kiIoJeW-1681653992485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/df5f56eb-23da-40f8-900d-1da3eecfb2d3.png)] 和 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aviFHxTN-1681653992485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/b3cffb09-935e-4bc2-a6d1-330919797695.png)] 。 另外,我们假设神经网络中的所有激活单元都是 Sigmoid。 让广义权重将层l-1
中的任何单元i
连接到层l
中的单元j
表示为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8aKG1ZB-1681653992485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/29efb244-a597-41d7-baee-9826abbacd0b.png)] ,而l
层中任何单元i
的偏置应表示为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yvhqi7My-1681653992486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/99d2725a-1b33-4aea-a0b1-7631b21edbc1.png)] 。 让我们得出一个数据点的梯度; 总梯度可以计算为训练(或小批量)中使用的所有数据点的总和。 如果输出是连续的,则可以选择损失函数C
作为预测误差的平方:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qc99igvJ-1681653992486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/bb6a924b-9414-4008-b7a8-ee6cc0d11649.png)]
可以通过将相对于W
向量的成本函数最小化来确定由集合W
表示的网络的权重和偏差,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFX6SHpO-1681653992486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/7de557d6-4617-45f4-8e7f-aeb5523343d5.png)]
为了通过梯度下降迭代地执行成本函数的最小化,我们需要针对每个权重计算成本函数的梯度w ∈ W
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gB7GxHNr-1681653992486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/c4b40a1e-3fc2-4c2c-b5be-1d20c9b34f17.png)]
现在我们有了所需的一切,让我们计算成本函数C
相对于权重 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5URAIhr-1681653992486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/8ef28fd7-2ae7-4473-bfcd-9020f9bb8903.png)] 的梯度。 使用差分的链式规则,我们得到以下信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CG1dH99x-1681653992487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/0b0d48f2-769e-4477-bc38-ba07495015a2.png)]
现在让我们看下面的公式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APMV9m59-1681653992487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/8c25c79b-a37b-455f-95cc-e0501608846b.png)]
正如您在前面的表达式中看到的那样,导数不过是预测中的误差。 通常,在存在回归问题的情况下,输出单元激活函数是线性的,因此适用以下表达式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ws5Qsrs-1681653992487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/714abd7d-0c22-40db-80f2-bfc0e479ef6a.png)]
因此,如果我们要计算成本函数相对于输出单元总输入的梯度,则为∂C/∂s[1]^(3)
。 这仍然等于输出预测中的误差。
根据输入权重和激活,输出单元上的总输入可以表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCFBo4Tk-1681653992487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/153c33ee-f998-4650-be8d-a77f9ef8ffbe.png)]
这意味着∂s[1]^(3)/∂w[21]^(3) = z[2]^(3)
以及成本函数相对于权重w[21]^(3)
的导数通过以下方式得出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAZnpRvL-1681653992487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/34c1605c-eb43-4d09-b029-b8177ecd1dc6.png)]
如您所见,相对于最终输出层之前的层中的权重,该误差在计算成本函数的梯度时反向传播。 当我们计算成本函数相对于广义权重的梯度w[jk]^(2)
时,这变得更加明显。 取对应于j = 1
和k = 2
的权重; 即w[jk]^(2)
。 成本函数C
相对于该权重的梯度可以表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4UL9Pc2c-1681653992488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/474751ea-71f8-4c57-9d16-1679ed2fbea5.png)]
现在,∂s[2]^(2)/∂w[12]^(2) = z[1]^(2)
表示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4VpsziP-1681653992488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/d5f34043-fdeb-48ca-bf1b-d1a1915ba77d.png)]
因此,一旦我们确定了成本函数相对于神经元总输入的梯度为∂C/∂s
,则任何权重的梯度w
贡献了总输入量s
,可以通过简单地乘以与权重相关的激活z
来获得。
现在,成本函数相对于总输入的梯度s[2]^(2)
可以再次通过链式法则得出,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84Gyc7zq-1681653992488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/ff5d7314-4a37-458c-933b-25a883f492bd.png)]
由于神经网络的所有单元(输出单元除外)均为 Sigmoid 激活函数,因此情况如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PJpkobLk-1681653992488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/665d5aaa-1fa7-4ab0-a7a8-5961d7faaf77.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQxHDysg-1681653992489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/b43669e7-d10c-4ad9-bc67-b404ec992de1.png)]
结合(1), (2), (3)
,我们得到以下信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IxfJEsf0-1681653992489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/ed1832d2-e65e-4568-8594-f5ded856cfe3.png)]
在前面的派生梯度表达式中,您可以看到预测误差(y_hat - y)
通过与相关的激活和权重(根据微分链规则)组合以计算每一层权重的梯度而向后传播 ,因此是 AI 术语中的反向传播名称。
卷积神经网络
卷积神经网络(CNN)利用卷积运算从具有关联拓扑的数据中提取有用信息。 这最适合图像和音频数据。 输入图像在通过卷积层时会生成多个输出图像,称为输出特征映射。 输出特征映射将检测特征。 初始卷积层中的输出特征映射可以学习检测基本特征,例如边缘和颜色成分变化。
第二卷积层可以检测到稍微复杂的特征,例如正方形,圆形和其他几何结构。 随着神经网络的发展,卷积层学会了检测越来越复杂的特征。 例如,如果我们有一个 CNN 可以对图像是猫还是狗进行分类,则神经网络底部的卷积层可能会学会检测诸如头部,腿部等特征。
“图 1.11”显示了 CNN 的架构图,该 CNN 处理猫和狗的图像以对其进行分类。 图像通过卷积层,该卷积层有助于检测相关特征,例如边缘和颜色组合。 ReLU 激活会增加非线性。 激活层之后的合并层汇总本地邻居信息,以提供一定数量的平移不变性。 在理想的 CNN 中,此卷积激活池操作在网络进入密集连接之前执行了几次:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-heHr3WWB-1681653992489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/332c2f90-aae5-4b98-b417-ce942177e184.png)]
图 1.11:CNN 架构
当我们经过具有多个卷积激活池操作的网络时,图像的空间分辨率会降低,而输出特征映射的数量在每一层中都会增加。 卷积层中的每个输出特征映射都与过滤器核相关联,该过滤器核的权重是通过 CNN 训练过程学习的。
在卷积操作中,将过滤器核的翻转版本放置在整个图像或特征映射上,并为过滤器上每个位置计算过滤器核输入值与相应图像像素或特征映射值的点积。 输入图像或特征映射。 已经习惯了普通图像处理的读者可能已经使用了不同的过滤器核,例如高斯过滤器,Sobel 边缘检测过滤器等,其中许多过滤器的权重已预定义。 卷积神经网络的优点是通过训练过程确定不同的过滤器权重。 这意味着,针对卷积神经网络正在处理的问题,可以更好地定制过滤器。
当卷积运算涉及在输入的每个位置上覆盖过滤器核时,该卷积被称为跨度为 1。 如果我们选择在覆盖过滤器核时跳过一个位置,那么卷积将以两个步幅执行。 通常,如果将n
位置跳过而将过滤器核覆盖在输入上,则表示卷积以n + 1
的步幅执行。 大于 1 的步幅会减小卷积输出的空间大小。
通常,卷积层之后是池化层,池化层基本上总结了由池化的接收场确定的邻域中的输出特征映射激活。 例如,一个2 x 2
的接收场将收集四个相邻的输出特征映射激活的本地信息。 对于最大池操作,将选择四个激活的最大值作为输出,而对于平均池化,将选择四个激活的平均值。 合并降低了特征映射的空间分辨率。 例如,对于具有2 x 2
接收场的224 x 224
大小的特征映射池化操作,特征映射的空间大小将减小为112 x 112
。
要注意的一件事是,卷积运算减少了每层要学习的权重数。 例如,如果我们有一个空间大小为224 x 224
的输入图像,而下一层的期望输出为大小为224 x 224
的大小,那么对于具有完整连接的传统神经网络来说,要学习的权重数是224 x 224 x 224 x 224
。对于具有相同输入和输出大小的卷积层,我们需要学习的只是过滤器核的权重。 因此,如果我们使用3 x 3
过滤器核,我们只需要学习 9 个权重即可,而不是224 x 224 x 224 x 224
权重。 这种简化是有效的,因为局部空间邻域中的图像和音频之类的结构之间具有高度相关性。
输入图像经过多层卷积和池化操作。 随着网络的发展,特征映射的数量增加,而图像的空间分辨率降低。 在卷积池层的末端,特征映射的输出被馈送到全连接层,然后是输出层。
输出单元取决于手头的任务。 如果执行回归,则输出激活单元是线性的,而如果是二分类问题,则输出单元是 Sigmoid 的。 对于多类别分类,输出层是 softmax 单元。
在本书的所有图像处理项目中,我们都将使用一种或另一种形式的卷积神经网络。
循环神经网络(RNN)
循环神经网络(RNN)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的函数,因此名称中的术语为循环。 下图说明了 RNN 的架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AM4GFnDP-1681653992489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/0c426b93-140c-48a7-b982-e649cbaac4e3.png)]
图 1.12:RNN 架构
在每个给定的时间步长t
处,计算记忆状态h[t]
,基于步骤t-1
处的之前的状态h[t-1]
,以及时间步长t
处的输入x[t]
。 新状态h[t]
用于在步骤t
处预测输出o[t]
。 控制 RNN 的方程式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GoEDN5yz-1681653992489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/438f6f9e-0b82-497a-a27a-b6908e54889f.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lxi7Xx6U-1681653992490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/4ce6cd6d-4a3d-4c78-9aa6-364d288f20c7.png)]
如果我们要预测句子中的下一个单词,则函数f[2]
通常是词汇表中单词的 softmax 函数。 根据当前问题,f[1]
函数可以是任何激活函数。
在 RNN 中,步骤t
中的输出误差会尝试纠正先前时间步中的预测,并通过k ∈ 1, 2, ..., t-1
来概括。 通过传播先前时间步长中的误差来实现。 这有助于 RNN 了解彼此相距较远的单词之间的长期依赖性。 实际上,由于梯度问题的消失和爆炸,并非总是可能通过 RNN 学习这么长的依赖关系。
如您所知,神经网络通过梯度下降来学习,并且可以通过以下步骤来学习单词在时间步t
与在先序列步k
之间的关系。 记忆状态h[t]^(i)
相对于记忆状态h[i]^(t)
的梯度。 用以下公式表示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzimxzLw-1681653992490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/4b851df6-5d8f-4c92-861e-2c0066c19254.png)]
如果从序列步骤k
的存储状态h[k]^(i)
到序列步骤k + 1
的存储状态h[k + 1]^(i)
的权重连接由*给出u[ii] ∈ W[hh]
,则以下是正确的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WyXz6D1w-1681653992490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/94bf384a-86e7-413d-ae16-9b3f5249eef1.png)]
在前面的等式中,s[k + 1]^(i)
是在时间步k + 1
时存储状态i
的总输入,因此情况如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aYLRtsB1-1681653992490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/82fd4549-3b28-4289-9145-320579f8f364.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgUnIgYI-1681653992491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/6034762c-e89b-43a9-823a-588dae6f05fd.png)]
既然我们已经准备就绪,那么就很容易理解为什么 RNN 中可能会出现消失的梯度问题。 从前面的等式(3))
和(4)
得到以下结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ub9UQ4mh-1681653992491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/a5818e53-89c6-4a7a-8f79-f71fdfc2535d.png)]
对于 RNN,函数f[2]
通常为 Sigmoid 或 tanh,其饱受饱和度的困扰,即具有超出指定输入值范围的低梯度。 现在,由于f[2]
的导数彼此相乘,因此,如果激活函数的输入在饱和区工作,则∂h[t]^(i)/∂h[k]^(i)
的斜率可以变为零,即使相对tk
的中等值。 即使f[2]
函数在饱和区中不起作用,但 Sigmoids 的f[2]
函数的梯度始终比1
小,因此很难学习序列中单词之间的远距离依存关系。 同样,可能会由于u[ii]^(t - k)
因子而出现爆炸性梯度问题。 假设步t
和k
之间的距离约为10
,而权重u[ii]
,大约两点。 在这种情况下,梯度将被放大两倍,即2 ^ 10 = 1024
,从而导致爆炸梯度问题。
长短期记忆(LSTM)单元
消失的梯度问题在很大程度上由 RNN 的改进版本(称为长短期记忆(LSTM)单元)解决。 长短期存储单元的架构图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUtKQAcn-1681653992491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/eab0d93b-3c6d-4fb8-a9ac-d49481457c76.png)]
图 1.13:LSTM 架构
除了记忆状态h[t]
之外,LSTM 还介绍了 RNN 单元状态C[t]
。 单元状态由三个门控制:遗忘门,更新门和输出门。 遗忘门确定从先前的单元状态C[t-1]
保留多少信息,其输出表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ff2vOGa8-1681653992491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/00985346-4740-4212-97ff-0506b23e7d21.png)]
更新门的输出表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F8QssJ8b-1681653992492)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/16cfb5c1-3e84-497e-8725-fc5c0e571a30.png)]
潜在的新候选单元状态C_tilde[t]
表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kr3grJGt-1681653992492)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/d10b017e-3e19-4c63-8ece-90ca7b3d2dfe.png)]
基于先前的电池状态和当前的潜在电池状态,通过以下方式提供更新的电池状态输出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fru6Aby0-1681653992492)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/e4d692b3-3335-41cb-a793-1d6504dda376.png)]
并非单元状态的所有信息都传递到下一步,并且应由输出门确定应释放多少单元状态到下一步。 输出门的输出通过以下方式给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTgakVbP-1681653992492)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/959381ee-2245-42ab-92a9-fd26d61d3756.png)]
根据当前单元状态和输出门,通过以下方式给出传递给下一步的更新后的内存状态:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxAdrkW8-1681653992492)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/55a8e2c1-d673-4016-b4f2-a2baf36f73ed.png)]
现在出现了一个大问题:LSTM 如何避免消失的梯度问题? LSTM 中∂h[t]^(i)/∂h[k]^(i)
的等效项由∂C[t]^(i)/∂C[k]^(i)
给出,可以用以下产品形式表示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZfZ735y-1681653992493)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/0467935c-2261-4019-86e5-d5cb976fdcfb.png)]
现在,单元状态单元的循环由以下给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJTm0B03-1681653992493)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/eb7d80c6-f2eb-44c2-8272-555b5611da6d.png)]
由此,我们得到以下内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xPcQopsH-1681653992493)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/636e59ba-65ee-410a-8dce-c19ce20565c6.png)]
结果,梯度表达式∂C[t]^(i)/∂C[k]^(i)
变为以下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0hjN3MvM-1681653992493)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/78f1eac4-0f48-4f0f-8521-344d3a317e9d.png)]
如您所见,如果我们可以将遗忘单元格状态保持在一个附近,则梯度将几乎不衰减地流动,并且 LSTM 不会遭受梯度消失的困扰。
我们将在本书中看到的大多数文本处理应用将使用 RSTM 的 LSTM 版本。
生成对抗网络
生成对抗网络,通常称为 GAN ,是通过生成器G
学习特定概率分布的生成模型。 生成器G
与判别器D
进行零和极小极大游戏,并且两者都会随着时间的流逝而逐渐达到纳什均衡。 生成器尝试生成类似于给定概率分布P(x)
生成的样本,而判别器D
尝试区分生成器生成的那些假数据样本。G
来自原始分布的数据样本。 生成器G
尝试通过转换样本z
来生成与P(x)
相似的样本。 噪声分布P(z)
。 判别器D
在假冒时学会将生成器G
生成的样本标记为G(z)
;x
原始时属于P(x)
。 在 minimax 游戏的平衡状态下,生成器将学习生成与原始分布P(x)
相似的样本,因此以下是正确的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnVDmihC-1681653992494)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/0bb90a7f-37ac-4079-8896-baa81ed7b81d.png)]
下图说明了学习 MNIST 数字的概率分布的 GAN 网络:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrXcumpk-1681653992494)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/c8c7095f-4435-4ed0-a46b-3b89ed954f90.png)]
Figure 1.14: GAN architecture
判别器最小化的成本函数是二进制交叉熵,用于区分生成器生成的假数据,和属于概率分布P(x)
的真实数据点z
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z1PCNgah-1681653992494)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/b9cb9aa1-7eac-4174-983d-cb5be41b1eff.png)]
生成器将尝试最大化由(1)
给出的相同成本函数。 这意味着,优化问题可以表示为具有效用函数 U(G, D)
的 minimax 玩家,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eb2q4UoS-1681653992494)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/56db8673-21ba-456d-94a5-f78f8d33506b.png)]
通常,要测量给定概率分布与给定分布的匹配程度,请使用f
-发散度量,例如 Kullback-Leibler(KL)散度,詹森·香农散度和 Bhattacharyya 距离。 例如,以下给出两个概率分布P
和Q
之间的 KL 散度,其中对分布的期望是P
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FJEiF1UR-1681653992494)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/a28bf1ff-ec23-480a-9740-060b00b8ab64.png)]
类似地,P
和Q
之间的詹森香农散度给出如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjWhhkTr-1681653992495)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/17bdf041-b5b0-442c-aea2-d56561c1f54e.png)]
现在,回到(2)
,表达式可以编写如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQcVg71T-1681653992495)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/0c60cfa5-eb0a-4114-aa84-beab07d5a6cc.png)]
在这里,G(x)
是生成器的概率分布。 将期望扩展到其不可或缺的形式,我们得到以下内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B7w8bhJD-1681653992495)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/f5932e0c-dc8c-4041-abe9-24e33bcfc95f.png)]
对于固定的生成器分配,如果满足以下条件,则G(x)
对于判别器的效用函数将最小。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YjWXgDBr-1681653992495)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/ec1949f8-e469-4633-9aaf-d857c5f0831c.png)]
用(5)
替换为(3)
中的D(x)
,我们得到以下信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAT085Jx-1681653992495)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/9dd0ea39-6a35-49d3-aa07-47e8242fd453.png)]
现在,生成器的任务是最大化工具V(G, D_hat)
或最小化工具-V(G, D_hat)
。 -V(G, D_hat)
的表达式可以重新安排如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lStPBxdx-1681653992496)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/2e348883-3d4b-421d-940e-8c0c8a593af0.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBbNXj8H-1681653992496)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/63acc434-0231-447f-a331-5afab842bd9a.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EU1QRmtA-1681653992496)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/8893fadf-3fbf-4c42-bb8d-7a27f14dcb76.png)]
因此,我们可以看到生成器最小化-V(G, D_hat)
等于最小化实际分布P(x)
与生成器生成的样本分布之间的 Jensen Shannon 散度G
(即G(x)
)。
训练 GAN 并不是一个简单的过程,在训练这样的网络时我们需要考虑几个技术方面的考虑。 我们将使用高级 GAN 网络在第 4 章“使用 GANs 的时装行业中的风格迁移”中构建跨域风格迁移应用。
强化学习
强化学习是机器学习的一个分支,它使机器和/或智能体可以通过采取特定行动在特定上下文中最大化某种形式的奖励。 强化学习不同于监督学习和无监督学习。 强化学习广泛用于博弈论,控制系统,机器人技术和其他新兴的人工智能领域。 下图说明了强化学习问题中智能体与环境之间的交互:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9NI3aWx-1681653992496)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/13aa6565-1619-42b6-a595-a2bf486f0a6e.png)]
图 1.15:强化学习模型中的智能体与环境交互
Q 学习
现在,我们将研究一种流行的强化学习算法,称为 Q 学习。 Q 学习用于确定给定的有限马尔可夫决策过程的最佳动作选择策略。 马尔可夫决策过程由状态空间S
; 一个动作空间A
; 立即奖励集R
; 给定当前状态s[t]
的下一个状态的概率S[t + 1]
; 当前动作a[t]
; P(S[t+1]/S[t];r[t])
; 和折扣系数γ
定义。 下图说明了马尔可夫决策过程,其中下一个状态取决于当前状态以及在当前状态下执行的任何操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dsO4giP1-1681653992497)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/83330458-c0b9-4660-a1e3-6cd4927244a6.png)]
图 1.16:马尔可夫决策过程
假设我们有一系列状态,动作和相应的奖励,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmnmBxhv-1681653992497)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/3c565184-9ac9-488b-8caa-6136105ef059.png)]
如果我们考虑长期奖励R[t]
,则在步骤t
处,它等于从t
开始的每一步直到最后的立即奖励总和,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XliTxXRi-1681653992497)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/94a7a7da-3528-4fb2-9e42-1af592e0c024.png)]
现在,马尔可夫决策过程是一个随机过程,无法每次基于S[t]
和a[t]
进行相同的下一步S[t + 1]
; 因此,我们对未来的奖励应用了折扣系数γ
。 这意味着长期奖励可以更好地表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QX2NRjRy-1681653992498)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/4a4b48fe-0a74-4d0f-92ad-bad7fdc7fb35.png)]
由于在时间步t
上已经实现了即时奖励,为了最大化长期奖励,我们需要最大化时间步t + 1
的长期奖励(即R[t + 1]
),方法是选择最佳操作。 通过采取行动a[t]
的状态S[t]
所期望的最大长期回报,由以下 Q 函数表示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uGpvkR0X-1681653992498)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/b3ecdb7c-d4cf-48a2-af93-c969b62fb41e.png)]
在每个状态s ∈ S
,Q 学习中的主体尝试采取行动α ∈ A
,以最大化其长期回报。 Q 学习算法是一个迭代过程,其更新规则如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sjIfFQw-1681653992498)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/b6e4a367-e0aa-406d-bd8b-5e1b2cb8c1d7.png)]
如您所见,该算法受(1)
中表达的长期奖励概念的启发。
处于状态s[t]
的采取行动a[t]
的总累积奖励Q(s[t], a[t])
取决于即时奖励r[t]
以及在新步骤s[t+1]
处的,我们希望的最大长期回报。 在马尔可夫决策过程中,新状态s[t + 1]
随机依赖于当前状态,即s[t]
,然后通过P(S[t+1]/S[t];r[t])
形式的概率密度/质量函数选取的动作a[t]
。
该算法通过根据α
的值对旧期望值和新长期奖励值进行加权平均,来不断更新期望长期累积奖励。
通过迭代算法构建了Q(s, a)
函数后,在基于给定状态s
进行游戏时,我们可以采取最佳措施a_hat
, 作为最大化 Q 函数的策略:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5LfNIjr-1681653992498)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/88e6ee5c-d64d-4d70-a9cf-ee3eb0e6c32a.png)]
深度 Q 学习
在 Q 学习中,我们通常会处理一组有限的状态和动作。 这意味着,表格足以容纳 Q 值和奖励。 但是,在实际应用中,状态和适用动作的数量大多是无限的,并且需要更好的 Q 函数近似器来表示和学习 Q 函数。 深度神经网络是通用函数近似器,因此在这里就应运而生。 我们可以用神经网络表示 Q 函数,该神经网络将状态和动作作为输入并提供相应的 Q 值作为输出。 或者,我们可以只使用状态来训练神经网络,然后将输出作为与所有动作相对应的 Q 值。 下图说明了这两种情况。 由于 Q 值是奖励,因此我们在以下网络中处理回归:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oD6OIG5e-1681653992499)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/673b706b-7aa2-488e-851d-860dffe3abfb.png)]
图 1.17:深度 Q 学习函数近似器网络
在本书中,我们将使用强化学习来训练赛车,以通过深度 Q 学习自行驾驶。
迁移学习
通常,迁移学习是指使用在一个领域中获得的知识来解决另一领域中的相关问题的概念。 但是,在深度学习中,它专门指的是将针对特定任务训练的神经网络重新用于不同领域中的相似任务的过程。 新任务使用从先前任务中学到的特征检测器,因此我们不必训练模型就可以学习它们。
由于不同层之间的连接模式的性质,深度学习模型倾向于具有大量参数。 要训练这么大的模型,需要大量的数据; 否则,模型可能会过拟合。 对于许多需要深度学习解决方案的问题,将无法获得大量数据。 例如,在用于对象识别的图像处理中,深度学习模型提供了最新的解决方案。 在这种情况下,可以基于从现有的经过训练的深度学习模型中学习到的特征检测器,使用迁移学习来创建特征。 然后,这些特征可用于使用可用数据构建简单模型,以解决当前的新问题。 因此,新模型需要学习的唯一参数是与构建简单模型有关的参数,从而减少了过拟合的机会。 通常在大量数据上训练预训练的模型,因此,它们具有作为特征检测器的可靠参数。
当我们在 CNN 中处理图像时,初始层会学会检测非常通用的特征,例如卷曲,边缘,颜色组成等。 随着网络的深入发展,更深层次的卷积层将学会检测与特定种类的数据集相关的更复杂特征。 我们可以使用预训练的网络,并选择不训练前几层,因为它们会学习非常通用的函数。 相反,我们可以只专注于训练最后几层的参数,因为它们将学习针对当前问题的复杂函数。 这样可以确保我们需要训练的参数较少,并且可以明智地使用数据,仅训练所需的复杂参数,而不训练通用特征。
迁移学习已广泛应用于通过 CNN 进行图像处理的过程,其中过滤器充当特征检测器。 用于迁移学习的最常见的预训练 CNN 是AlexNet
,VGG16
,VGG19
,Inception V3
和ResNet
等。 下图说明了用于迁移学习的预训练VGG16
网络:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0Sdz8Wj-1681653992499)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/04ca3848-86ab-45e6-81f2-1c1d1011ef88.png)]
图 1.18:使用预训练的 VGG 16 网络进行迁移学习
以x
表示的输入图像被馈送到预训练的 VGG 16 网络,以及4096
维输出特征向量x'
,是从最后一个全连接层中提取的。 提取的特征x'
以及相应的类别标签y
用于训练简单的分类网络,从而减少解决问题所需的数据。
我们将通过使用第 2 章,“迁移学习”中的迁移学习来解决医疗保健领域中的图像分类问题。
受限玻尔兹曼机
受限玻尔兹曼机(RBM)是一门无监督的机器学习算法,用于学习数据的内部表示。 RBM 具有可见层v ∈ R^m
,以及隐藏层h ∈ R^n
。 RBM 学习在可见层中将输入呈现为隐藏层中的低维表示。 给定可见层输入,所有隐藏层单元在条件上都是独立的。 类似地,给定隐藏层输入,所有可见层在条件上都是独立的。 给定隐藏层输入,这使得 RBM 可以独立地对可见单元的输出进行采样,反之亦然。
下图说明了 RBM 的架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RhhZCbR1-1681653992499)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/0c7517cc-ffec-4988-956f-e2258a4c314d.png)]
图 1.19:受限玻尔兹曼机
权重w[ij] ∈ W
将可见单元i
连接到隐藏单元j
,其中W ∈ R^(mxn)
是所有这些权重的集合,从可见单元到隐藏单元。 可见单元的偏差由b[i] ∈ b
表示,而隐藏单元的偏差由c[j] ∈ c
表示。
受统计物理学中玻耳兹曼分布的思想启发,可见层向量v
和隐藏层向量h
的联合分布正比于配置的负能量的指数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pQSgnK4-1681653992499)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/1aea1d38-4ac6-4663-b3a2-31b6849a03a0.png)](1)
配置的能量由以下给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FldV2zZc-1681653992500)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/e92fb4ee-090a-4067-b628-b1f0dcf9eac0.png)](2)
给定可见输入向量v
的隐藏单元j
的概率可以表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z30lC2kF-1681653992500)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/7e50218c-8aa9-4d4b-8d38-761ba1efb7ff.png)](2)
类似地,给出隐藏输入向量h
的可见单元i
的概率由以下公式给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AbpDiiex-1681653992500)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/7bab8697-ec6f-46d1-8e2f-9ec1cf2bf5cc.png)](3)
因此,一旦我们通过训练了解了 RBM 的权重和偏差,就可以在给定隐藏状态的情况下对可见表示进行采样,而在给定可见状态的情况下可以对隐藏状态进行采样。
类似于主成分分析(PCA),RBM 是一种方法,将一个维度(由可见层v
提供)中的数据表示为不同的维度(由隐藏层h
提供)。 当隐藏层的大小小于可见层的大小时,RBM 执行减小大小的任务。 RBM 通常在二进制数据上训练。
通过最大化训练数据的可能性来训练 RBM。 在成本函数相对于权重和偏差的梯度下降的每次迭代中,都会出现采样,这会使训练过程变得昂贵并且在计算上有些棘手。 一种名为对比发散的聪明采样方法(使用吉布斯采样)用于训练 RBM。
在第 6 章,“智能推荐系统”中,我们将使用 RBM 构建推荐系统。
自编码器
与 RBM 十分相似,自编码器是一类无监督的学习算法,旨在发现数据中的隐藏结构。 在主成分分析(PCA)中,我们尝试捕获输入变量之间的线性关系,并尝试通过(输入变量的)线性组合来在降维空间中表示数据,这说明了数据的大部分差异。 但是,PCA 无法捕获输入变量之间的非线性关系。
自编码器是一种神经网络,可以捕获输入变量之间的非线性相互作用,同时在隐藏层中以不同维度表示输入。 在大多数情况下,隐藏层的大小小于输入的大小。 假设存在高维数据固有的低维结构,我们跳过了这一点。 例如,高维图像可以由低维流形表示,并且自编码器通常用于发现该结构。 下图说明了自编码器的神经架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xf0sw8RB-1681653992500)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/594d3d11-05f5-4367-a760-726135cf225b.png)]
图 1.20:自编码器架构
自编码器有两个部分:编码器和解码器。 编码器尝试将输入数据x
投影到隐藏层h
中。 解码器尝试从隐藏层h
重构输入。 通过最小化重构误差,即来自解码器和原始输入的重构输入x_tilde
之间的误差,可以训练伴随此类网络的权重。 如果输入是连续的,则最小化重构误差的平方和,以学习自编码器的权重。
如果我们用函数f[W](x)
表示编码器,而解码器则用f[U](x)
表示,其中W
和U
是与编码器和解码器关联的权重矩阵,那么情况如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5Z9O7hu-1681653992500)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/40f56474-8d03-49d3-9567-3a30fce2337b.png)](1)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZCXnQuW-1681653992501)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/7e6dae4f-91dc-43af-a351-d93afff1ecd7.png)](2)
训练集上的重构误差C
,x[i], i ∈ 1, 2, 3, ..., m
可以表示如下 :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dl0bT6y-1681653992501)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/5ecc227c-e830-4604-898b-f08d92be4d0a.png)](3)
通过最小化(3)
的成本函数,可以学习自编码器的最佳权重W_hat, U_hat
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfR1FzyM-1681653992501)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/1a645659-bc76-482d-9d08-7c790e29013e.png)](4)
自编码器用于多种目的,例如学习数据的潜在表示,降噪和特征检测。 降噪自编码器将实际输入的噪声版本作为其输入。 他们尝试构建实际的输入,以作为重建的标签。 类似地,自编码器可以用作生成模型。 可以用作生成模型的一类这样的自编码器称为变分自编码器。 当前,变分自编码器和 GAN 作为图像处理的生成模型非常受欢迎。
总结
现在,我们到了本章的结尾。 我们已经研究了人工神经网络的几种变体,包括用于图像处理目的的 CNN 和用于自然语言处理目的的 RNN。 此外,我们将 RBM 和 GAN 视为生成模型,将自编码器视为无监督方法,可以解决许多问题,例如降噪或解密数据的内部结构。 此外,我们还谈到了强化学习,这对机器人技术和 AI 产生了重大影响。
您现在应该熟悉本书其余各章中构建智能 AI 应用时将要使用的核心技术。 在构建应用时,我们将在需要时进行一些技术上的改动。 建议不熟悉深度学习的读者探索更多有关本章涉及的核心技术的信息,以便更全面地理解。
在随后的章节中,我们将讨论实用的 AI 项目,并使用本章中讨论的技术来实现它们。 在第 2 章,“迁移学习”中,我们将从使用迁移学习实现医疗保健应用进行医学图像分析开始。 我们希望您期待您的参与。
二、迁移学习
迁移学习是将特定领域中一项任务中获得的知识迁移到相似领域中相关任务中的过程。 在深度学习范例中,迁移学习通常是指将预训练模型的重用作为另一个问题的起点。 计算机视觉和自然语言处理中的问题需要大量数据和计算资源,才能训练出有意义的深度学习模型。 迁移学习在视觉和文本领域已变得非常重要,因为它减轻了对大量训练数据和训练时间的需求。 在本章中,我们将使用迁移学习来解决医疗保健问题。
我们将在本章中涉及的与迁移学习有关的一些关键主题如下:
- 使用迁移学习来检测人眼中的糖尿病性视网膜病变状况,并确定视网膜病变的严重程度
- 探索可用于训练可检测人眼眼底图像中的糖尿病性视网膜病变的卷积神经网络(CNN)的高级预训练卷积神经架构
- 查看实际实现 CNN 所需的不同图像预处理步骤
- 学习制定适合当前问题的成本函数
- 定义适当的度量标准来衡量训练模型的表现
- 使用仿射变换生成其他数据
- 与适当的学习率,优化器的选择等有关的训练错综复杂
- 查看端到端 Python 实现
技术要求
您将需要具备 Python 3,TensorFlow,Keras 和 OpenCV 的基础知识。
迁移学习简介
在传统的机器学习范例中(请参见“图 2.1”),每个用例或任务都是根据手头的数据独立建模的。 在迁移学习中,我们使用从特定任务中获得的知识(以架构和模型参数的形式)来解决不同(但相关)的任务,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-64XnqN9d-1681653992501)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/07387bba-04ab-4758-9ac4-8740ea2f1bea.png)]
图 2.1:传统机器学习与迁移学习
吴安德(Andrew Ng)在其 2016 年 NIPS 教程中表示,迁移学习将成为机器学习商业成功的第二大推动力(在监督学习之后); 这一说法日新月异。 迁移学习现已广泛用于需要使用人工神经网络解决的问题中。 因此,最大的问题是为什么会这样。
从头开始训练人工神经网络是一项艰巨的任务,主要是由于以下两个原因:
- 人工神经网络的成本面是非凸的; 因此,它需要一组良好的初始权重才能实现合理的收敛。
- 人工神经网络具有很多参数,因此,它们需要大量数据进行训练。 不幸的是,对于许多项目而言,可用于训练神经网络的特定数据不足,而该项目旨在解决的问题非常复杂,需要神经网络解决方案。
在这两种情况下,迁移学习都可以解决。 如果我们使用在大量标记数据上训练的预训练模型,例如 ImageNet 或 CIFAR,则涉及迁移学习的问题将具有很好的初始权重来开始训练; 然后可以根据现有数据对这些权重进行微调。 同样,为了避免在较少的数据量上训练复杂的模型,我们可能希望从预训练的神经网络中提取复杂的特征,然后使用这些特征来训练相对简单的模型,例如 SVM 或逻辑回归模型。 举个例子,如果我们正在研究图像分类问题,并且已经有一个预训练的模型(例如,基于 1,000 个 ImageNet 的VGG16
网络),我们可以通过VGG16
的权重迁移训练数据,并从最后一个池化层提取特征。 如果我们有m
个训练数据点,则可以使用等式(xi, yi), i = 1 -> m
,其中x
是特征向量,y
是输出类。 然后,我们可以从预训练的VGG16
网络中得出复杂的特征,例如向量h
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xxt36aFH-1681653992502)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/bb55e155-7677-4ae6-8bf9-9998e72422ab.png)]
此处W
是经过预训练的VGG16
网络的权重集,直到最后一个池化层。
然后我们可以使用经过转换的训练数据点集(hi, yi), i = 1 -> m
来构建相对简单的模型。
检测糖尿病性视网膜病变的迁移学习
在本章中,我们将使用迁移学习来构建一个模型,以检测人眼中的糖尿病性视网膜病变。 糖尿病性视网膜病通常在糖尿病患者中发现,其中高血糖水平导致视网膜血管的损害。 下图左侧为正常视网膜,右侧为糖尿病性视网膜病变:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AbF3opW5-1681653992502)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/01145ccc-ee1f-48be-8662-d9fcd40381a7.png)]
图 2.2:正常人视网膜与患有糖尿病性视网膜病的视网膜
在医疗保健中,糖尿病性视网膜病变的检测通常是一个手动过程,需要受过训练的医师检查彩色眼底视网膜图像。 这导致诊断过程的延迟,通常导致延迟的治疗。 作为我们项目的一部分,我们将建立一个强大的人工智能系统,该系统可以拍摄视网膜的彩色眼底图像,并对糖尿病性视网膜病变的视网膜状况进行严重性分类。 我们将视网膜图像分类的不同条件如下:
*0
:无糖尿病性视网膜病变
*1
:轻度糖尿病性视网膜病变
*2
:中度糖尿病性视网膜病变
*3
:严重的糖尿病视网膜病变
*4
:糖尿病性视网膜增生病
糖尿病视网膜病变数据集
用于构建糖尿病性视网膜病变检测应用的数据集可从 Kaggle 获得,可从以下链接下载。
训练和保留测试数据集都存在于train_dataset.zip
文件中,该文件可在前面的链接中找到。
我们将使用标记的训练数据通过交叉验证来构建模型。 我们将在保持数据集上评估模型。
由于我们正在处理类别预测,因此准确率将是有用的验证指标。 精度定义如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CYPF3RnS-1681653992502)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/654757ad-de20-47fc-9b3f-a320446f607c.png)]
此处,c
是正确分类的样本数,N
是评估样本的总数。
与 Kaggle 标准相比,我们还将使用二次加权 kappa 统计信息确定模型的质量,并确定模型的表现基准。 二次加权 kappa 定义如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YssPrdil-1681653992502)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/54dadcbf-9122-4ff6-89f4-a98ca577f4b8.png)]
二次加权 kappa 表达式中的权重w[ij]
如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wjLwPn5l-1681653992502)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/e9f8f87c-4ebe-4065-8787-997893e22c33.png)]
在上式中,以下内容适用:
N
代表类别数O[ij]
表示已被预测为i
类的图像数量,其中图像的预测类为i
而实际类别为j
E[ij]
表示预测类别为i
的预期观测个数,预测类为i
而实际类别为j
,假设预测类和实际类是独立的
为了更好地了解 kappa 指标组件,让我们看一下苹果和橘子的二分类。 假设预测类和实际类的混淆矩阵如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r9EpNA9X-1681653992503)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/0c2ae574-b0cc-4cc5-8dc7-51ddcce904f8.png)]
图 2.3:Kappa 指标项
真实标签为橙子,假设标签之间具有独立性时,预测苹果的预期计数由以下公式给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ebWWURHy-1681653992503)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/81cdd503-0856-413d-806e-2d844b0dae16.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vNIYnuT4-1681653992503)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/01ae53b3-037d-4047-a4fe-b41a148af503.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NHmHEOP4-1681653992503)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/be17d2d1-dd00-4ba9-9165-571866d133b2.png)]
鉴于没有模型,此预期计数是您可能犯的最严重的错误。
如果您熟悉两个类别变量之间的独立性卡方检验,则假设类别变量之间具有独立性,则列联表中每个单元格中的预期计数都是基于相同的公式计算的。
可以从混淆矩阵中直接追踪模型的观测计数,该模型预测的真实标签为橙子时,预测的苹果等于5
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jbKJzY9S-1681653992503)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-proj-py/img/f6d73ecf-a072-4064-9b92-8e880c0080e6.png)]
因此,我们可以看到模型在预测橙子为苹果时所产生的误差小于我们不使用模型时所获得的误差。 与没有模型的预测相比,Kappa 通常衡量我们的表现如何。
如果我们观察二次权重的表达式w[ij]
,我们可以看到,当实际标签与预测标签之间的差异较大时,权重的值会更大。 由于类的序数性质,这是有道理的。 例如,让我们用类别标签 0 表示完美状态的眼睛; 患有轻度糖尿病性视网膜病的患者; 中度糖尿病视网膜病变伴两个; 并伴有严重的糖尿病性视网膜病变。 当轻度糖尿病性视网膜病被错误地分类为严重糖尿病性视网膜病而不是中度糖尿病性视网膜病时,这个二次项权重w[ij]
将会更高。 这是有道理的,因为即使我们没有设法预测实际类别,我们也希望预测一个尽可能接近实际状况的状况。
我们将使用sklearn.metrics.cohen_kappa_score
和weights= "quadratic"
来计算 kappa 得分。 权重越高,kappa 得分越低。
定义损失函数
该用例的数据分为五类,分别与无糖尿病性视网膜病变,轻度糖尿病性视网膜病变,中度糖尿病性视网膜病变,严重糖尿病性视网膜病变和增生性糖尿病性视网膜病变有关。 因此,我们可以将其视为分类问题。 对于我们的分类问题,需要对输出标签进行一次热编码,如下所示:
- 无糖尿病性视网膜病变:
[1 0 0 0 0]^T
- 轻度糖尿病性视网膜病变:
[0 1 0 0 0]^T
- 中度糖尿病性视网膜病变:
[0 0 1 0 0]^T
- 严重糖尿病性视网膜病变:
[0 0 0 1 0]^T
- 增生糖尿病性视网膜病变:
[0 0 0 0 1]^T