96SEO 2026-02-19 10:20 0
通过这一重大革命和概念验证几乎每个行业都在尝试调整其业务模型以适应深度学习但是它有一些主要要求可能并不适合每个业务或行业。

当受到刺激时人类似乎能够快速理解新概念然后在将来认识到这些概念的变体。
孩子可以从一张图片中学会识别狗但是机器学习系统需要大量示例来学习狗的特征并在将来识别它们。
本书的主要动机是使用很少的示例来训练模型而无需进行大量的重新训练就能够将其概括为不熟悉的类别。
深度学习在机器学习的发展中发挥了重要作用但它也需要大量的数据集。
不同的技术例如正则化可以减少在低数据环境中的过拟合但不能解决较少的训练示例所固有的问题。
此外大型数据集导致学习缓慢需要使用梯度下降法进行许多权重更新。
相反许多已知的非参数模型例如最近邻居不需要任何训练但是表现取决于有时任意选择的距离度量例如
的对象分类算法都需要数百或数千张图像和非常大的数据集进行训练但是单样本学习的目的是从一个或仅几个训练图像中学习有关对象类别的信息。
笔记本PyTorchMatplotlibScikit-Learn
如果我们研究孩子的成长我们会发现随着他们的成长他们的学习能力也会提高。
关于大脑如何训练自己以处理数据的大多数信息是未知的但是有各种理论可以对其进行探索。
如下图所示如果我们查看大脑神经元的结构则神经元的工作方式类似于收集器其中它通过树突从其他神经元收集信号。
一旦信号变强神经元就会通过称为轴突的细链向附近的神经元发出电信号。
在该网络的末端突触将信号活动转换为激发活动并激活连接的神经元。
大脑神经元通过改变突触的有效性来学习将信号发送到大脑的不同部分类似于人工神经网络中某些神经元的权重变为接近零的方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4p8Nc9s-1681785569470)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/30194677-af4a-47bf-9e51-058911b43b19.png)]
反过来许多神经科学家认为随着通过学习和刺激来更多地利用大脑就会形成密集的树突状连接。
尽管人类神经元一直是创建人工神经网络的灵感但它们在多种方式上却有所不同。
研究人员正在尝试通过尝试不同的激活激励函数和非线性系统来弥合这些差距。
与我们的大脑具有收集和传输从我们的感官接收到的信息的神经元的方式类似神经网络也由多层一组神经元组成这些层通过跨层传输信息来学习任务。
在某些情况下我们可以说人造神经元的工作方式类似于大脑中存在的神经元。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TVQiEmkX-1681785569473)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/571d3436-3f5f-46aa-9057-efe3e52dd3c8.png)]
如上图所示信息流经每个连接每个连接都有特定的权重该权重控制数据流。
如果将人脑神经元的活动与人工神经网络进行比较我们将看到只要为任务创建神经网络就如同创建新的脑神经元。
如果环顾四周我们已经开始依靠计算机做出决策例如在信用卡欺诈垃圾邮件/非垃圾邮件和推荐系统方面。
如果我们希望拥有与人脑相似的神经网络则需要改进现有的优化算法。
另一个关键区别是速度。
机器学习是一个程序在给定任务损失函数的情况下可以通过经验训练数据进行学习。
在开发了传统机器学习算法方面的一些稳定性之后研究人员转向了概率领域因为随着高维数据的引入它变得更有希望。
挑战赛时便开始蓬勃发展并且自此在数据科学领域中发挥了重要作用。
参数使用给定训练数据例如逻辑回归支持向量机和神经网络的算法调整数学或统计模型中的参数即可完成学习。
非参数通过存储训练数据记忆并执行一些降维映射来完成学习例如
顺便说一句如果我们有大量的数据集则最好使用参数方法因为非参数方法通常需要存储数据并针对每个查询对其进行处理。
机器学习和深度学习已经彻底改变了计算机科学行业但它们各有利弊。
数据收集为每个类别收集足够的相关数据以供机器学习非常费力。
数据标记通常标记数据需要专家或由于隐私安全或道德问题而无法进行。
硬件限制由于数据量大而且参数模型大因此训练它们需要昂贵的硬件GPU
TPU。
结果分析尽管有某些提供分析参数的开源库但了解结果也是一项重大挑战。
除了这些挑战之外机器学习在处理特征选择和高维数据方面也面临挑战。
在下一节中我们将介绍单样本学习并学习如何尝试解决机器学习和深度学习所面临的挑战。
单样本学习是一种在有限的监督数据的帮助下借助强大的先验知识来学习新任务的方法。
年代-尽管近年来研究人员在通过不同的深度学习架构和优化算法例如
在医学上当可用数据有限时例如在治疗罕见疾病时我们可以使用单样本学习。
如果我们进一步讨论如何从有限的数据中学习必要的信息我们将意识到人脑已经受过训练以提取重要信息的神经元。
例如如果教导孩子球形物体是球那么他们的大脑也会处理有关球的大小和纹理的信息也称为物体的过滤器。
因此对于任何形式的单样本学习我们都可以说我们至少需要满足以下条件之一
先前训练过的过滤器和预定架构正确的数据分布假设一种确定形式的分类法用于存储或收集的信息
在这些情况下我们只能依靠非参数或概率方法因为要学习参数我们需要足够数量的数据。
即使我们以某种方式强迫神经网络几乎不学习任何数据也将导致过拟合。
在下一部分中我们将进行简短的编码练习以了解当我们拥有小的数据集时简单的非参数
不幸的是它在现实世界中可能无法很好地工作因为我们仍然存在学习良好的特征表示并选择合适的距离函数的问题。
数据扩充方法基于模型的方法基于指标的方法基于优化的方法基于生成建模的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BvRcaoUT-1681785569473)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/7da6c666-88ab-45dc-ada6-3081219fd02c.png)]
数据扩充是深度学习社区中最常用的方法可以为数据增加变化增加数据大小并平衡数据。
尽管数据扩充方法在预处理中起着至关重要的作用但本书不会涉及到该主题。
https://github.com/Packt-Publishing/Hands-on-One-Shot-Learning.git转到克隆的存储库的Chapter01目录
Hands-on-One-Shot-Learning/Chapter01然后打开一个终端并使用以下命令安装
3”和4中可以将environment_name替换为易于记忆的名称例如one_shot或您选择的名称。
environment_name使用以下命令安装requirements.txt
notebook现在我们已经建立了环境让我们继续进行编码练习。
例如如果我们看到一些未知的东西我们会寻找它与我们已经知道的对象的相似性。
分类器是一个非参数分类器它简单地存储训练数据D并使用对它的k个最近邻居的多数投票对每个新实例进行分类并使用任何距离函数来计算
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BnjsJ0Ix-1681785569473)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/16ca7a17-01fc-4139-a2af-1e12225d1e1b.png)]
iris.target为了确保我们使用的数据集非常小我们将随机选择
indicesnp.random.choice(len(X),
name,horizontalalignmentcenter,bboxdict(alpha.5,
facecolorw),size25)ax.set_title(3D
ax.w_zaxis.set_ticklabels([])plt.show()下图是输出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uO9QaLd6-1681785569473)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/ea368c60-84e7-477f-87c8-f3f5081638a5.png)]
KNeighborsClassifier(n_neighbors3)#
MLPClassifier(hidden_layer_sizes(13,13,13),max_iter10)
mlp.fit(X_train,y_train)您可能会收到一些警告具体取决于
的版本例如/sklearn/neural_network/multilayer_perceptron.py:562:ConvergenceWarning:
这可能是由于许多原因造成的包括数据集的随机性邻居的选择以及层数。
总是会存储更好的数据因为它总是存储数据点而不是像神经网络那样学习参数。
深度学习已经彻底变革了数据科学领域并且仍在不断进步但是仍然有一些主要行业尚未体验到深度学习的所有优势例如医疗和制造业。
人类成就的顶峰将是创造一种可以像人类一样学习并且可以像人类一样成为专家的机器。
在本章中我们了解了人类的大脑以及人工神经网络的结构如何接近我们的大脑结构。
我们还讨论了单样本学习及其各种类型然后在iris数据集上进行了实验以比较在数据稀缺情况下的参数方法和非参数方法。
总的来说我们得出结论正确的特征表示在确定机器学习模型的效率方面起着重要作用。
在下一章中我们将学习基于度量的单样本学习方法并探索单样本学习算法的特征提取领域。
比新近训练的人工神经网络更好地工作什么是非参数机器学习算法决策树是参数算法还是非参数算法将其他分类算法作为编码练习进行实验并比较结果。
单样本学习一直是许多科学家的活跃研究领域他们试图找到一种在学习方面与人类尽可能接近的认知机器。
由于存在关于人类如何进行单样本学习的各种理论因此我们可以使用许多不同的深度学习方法来解决这一问题。
本书的这一部分将重点介绍基于度量基于模型和基于优化的深度学习架构以解决单样本学习问题及其实现。
深度学习已在各种应用中成功实现了最先进的表现例如图像分类对象检测语音识别等。
但是深度学习架构在被迫对几乎没有监督信息的数据进行预测时常常会失败。
这些表示形式可以有多种形式特别是如果我们想学习复杂的任务例如疾病检测或者如果我们希望我们的架构根据不同的目标学习表示形式例如计算两个图像之间的相似度我们可以计算欧几里得距离和余弦相似度。
在本章中我们将学习可以从较小的数据集中学习正确的数学表示形式的深度学习架构。
总体而言我们的目标是创建一种无需大量数据收集或训练过程即可概括不熟悉类别的架构。
本节将主要关注机器学习的参数方法是什么以及它们实际学习了什么。
简而言之参数化机器学习算法试图学习数据及其标签的联合概率分布。
因此考虑到一个单层神经网络它实际学习的是方程的权重和偏差以便使P(Y
逻辑回归是判别式分类器的一种形式在判别式分类器中我们仅关注P(Y
X)即我们尝试对Y标签的概率分布做出假设并尝试以某种方式将我们的X输入映射到它。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mPs0fwQp-1681785569474)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/010cceaa-cf25-4883-a25d-5800e070dc87.png)]
由于数据的缘故这都是可能的-随着数据量的增加我们对Y的近似值也随之增加。
在下一节中我们将学习神经网络的学习过程并了解哪些属性在逼近Y标签中起着重要的作用。
众所周知神经网络通过使用随机梯度下降优化方法使损失函数或目标函数最小化来学习。
相反如果我们的目标是回归我们将选择损失函数例如均方误差均方根误差和
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxX1cslS-1681785569474)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/47a48789-8ff8-42cf-a648-96d68b1df236.png)]
在知道损失函数对神经网络有重大影响之后每个人首先想到的是我们需要提出更好的损失函数。
如果您研究最新的研究您会发现主要的发展是基于更改损失函数的对象检测图像分割机器翻译等。
目标函数本质上必须是凸形的才能满足随机梯度下降优化的要求。
通常通过不同函数获得的最小值在数值上相同。
在下一节中我们将了解这些损失函数如何帮助架构学习不同的图像特征以及如何结合这些特征来为其他各种目标训练模型。
在下图中如果我们看一下前几层将看到简单易懂的提取特征例如边缘和兴趣点而更深层的特征则更复杂。
例如如果我们查看下图中的最后一层将观察到与初始层特征相比特征是不可识别的。
这是因为随着我们进入更深的层次越来越多的信息丰富的特征正在通过各种矩阵运算来提取。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrhCklNm-1681785569474)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/2ea3be34-ced7-4c60-a302-98d1f0c35e3e.jpeg)]
但是如果我们有诸如汽车类型之类的类别则需要更深层次的模型因为我们需要提取更复杂的特征这需要更大的数据集。
问题是什么决定了模型学习的特征或参数的类型是否有可能在初始层学习这些重要参数
在下一部分中我们将探索连体网络它是一种神经网络架构可以通过更改损失函数及其架构设计来学习前几层的复杂特征。
在此架构中模型学会了在两个给定的输入之间进行区分而不是学习使用分类损失函数对其输入进行分类的模型。
但是对于单样本学习方法因为我们没有很多数据点我们将在一个数据集上训练模型架构并在另一个数据集上对其进行测试。
为了简单起见我们使用带监督的基于度量的方法使用连体神经网络来学习图像嵌入然后将该网络的特征重新用于单样本学习而无需进行微调或重新训练。
机器学习算法的良好特征的提取在确定模型效率方面起着至关重要的作用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eAUUkAwK-1681785569474)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/0d94a582-9d00-4f5b-a28f-7e4df967ea31.png)]
其次连体网络方法仅适用于相似的域因为它还需要注意域的适应性也就是说它需要尝试确保我们的训练和测试数据集在域方面是紧密的。
例如如果您要创建一个系统来测试两个手写示例是否属于同一个人则可以在
数据集上训练一个连体网络架构通过该架构可以学习特定于手写体的特征例如曲线
连体网络由两个相同的神经网络组成它们共享相似的参数每个头部获取一个输入数据点。
这些网络的最后一层被馈送到对比损失函数层该层计算两个输入之间的相似度。
因此类似于我们在共享参数的卷积神经网络方法中所做的工作我们可以更快地优化网络。
权重共享确保两个相似的图像不会映射到特征嵌入空间中的不同位置。
特征嵌入是将特征投影到某个更高维度的空间也称为特征嵌入空间具体取决于我们要实现的任务。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAN6kOQv-1681785569475)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/be19cfde-bc78-4b64-92a9-85e89e1df3ce.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1fVbmz6d-1681785569475)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/67555406-abd0-4471-b5e1-deb9c87c2813.jpg)]
在层的最后连体网络使用损失函数的微分形式来学习各层之间的微分特征。
通常对于连体网络我们仅使用两种类型的函数-对比损失函数和三重损失函数。
使用连体架构的整体思想不是在类别之间进行分类而是学习区分输入。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVWw6PXJ-1681785569475)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/aaedf542-dd84-4589-8774-94190df0b2f6.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8aGqVHNf-1681785569475)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/029593cf-8b9d-4162-8c8f-4b58a97c679d.png)]
如果两个输入X1和X2相同则意味着连体网络应该能够学习制作D²[w]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MvFva8yr-1681785569476)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/50d96d9a-18f2-41b9-a4af-0df76984984e.png)]
0时损失函数才为零否则它将表现为回归损失并尝试学习特征以确保D[w]接近
尽管对比损失函数是学习判别特征的一种好方法但是在连体网络架构的其他修改版本中对比损失函数不能非常清楚地学习决策边界。
在这种情况下我们可以使用称为三重损失的新损失函数该函数可帮助架构获得更好的结果。
锚点A主数据点正例P类似于锚点的数据点负例N与锚点不同的数据点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LAmdKh7G-1681785569476)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/73760b22-b575-40f1-85be-396c6822a5d5.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-saWm77m0-1681785569476)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/e89f8c0f-2387-40bf-9cd0-b346ff3fdc52.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iH5PvTjk-1681785569476)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/aa0e72e6-1a0c-4888-a75d-1e4276061bb4.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PpnHF8kX-1681785569476)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/5c387438-e9c3-499e-b6ed-5c92097ee9a0.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AMdW5ClQ-1681785569477)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/8d24886d-e1ca-4322-848e-32251f118edd.png)]
三重损失函数的收敛性优于对比损失函数因为它一次考虑了三个示例并保持了正和负点之间的距离如上图所示从而可以更准确地学习决策边界而对比损失函数一次只考虑成对示例因此从某种意义上讲它更贪婪这会影响决策边界。
图像分类是一种需要大量数据点的方法而如果使用单样本学习的连体网络架构则仅需几个数据点就可以实现更高的准确率。
在下一节中以相似的主题进行工作我们将学习匹配的网络架构该架构使用注意力机制和不同的训练过程来学习训练集标签上的概率分布。
匹配网络通常会提出一个框架该框架学习一个网络该网络映射一个小的训练数据集并在相同的嵌入空间中测试未标记的示例。
匹配网络旨在学习小型训练数据集的正确嵌入表示并使用具有余弦相似性度量的可微
建模级别在建模级别他们提出了匹配网络该网络利用注意力和记忆力方面的进步实现快速有效的学习。
训练过程在训练级别上他们有一个条件-训练和测试集的分布必须相同。
例如这可能意味着每个类显示一些示例并将任务从小批量切换到小批量类似于在展示新任务的一些示例时如何对其进行测试。
匹配网络结合了参数模型和非参数模型的最佳特性也被称为差分最近邻居。
在下一节中我们将研究在建模级别由匹配网络做出的贡献随后我们将经历训练过程的贡献。
在所有这些模型中都定义了神经注意力机制来访问存储矩阵该矩阵存储有用的信息来解决手头的任务。
数据集它包含数千个类别例如猫狗和鸟但是作为标签集的一部分我们将仅使用其中的五个类别。
支持集这是我们标签集类别的采样输入数据点例如图像。
批量类似于支持集批量也是由标签集类别的输入数据点组成的采样集。
N路k次方法此处N是支撑集的大小或更简单地说是训练集中可能类别的数量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uwBi4jQk-1681785569477)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/3118bc82-3dc7-473f-8e77-f57c6f17b84e.png)]
匹配网络的关键思想是将图像映射到嵌入空间该空间也封装了标签分布然后使用不同的架构在相同的嵌入空间中投影测试图像。
在训练架构方面匹配网络遵循某种技术它们尝试在训练阶段复制测试条件。
简而言之正如我们在上一节中所了解的那样匹配网络从训练数据中采样标签集然后它们从同一标签集生成支持集和批量集。
数据预处理之后匹配网络通过训练模型以将支持集作为训练集并将批量集作为测试集来最小化误差从而学习其参数。
通过将支持集作为训练集将批量集作为测试集的训练过程可使匹配的网络复制测试条件。
在下一部分中我们将介绍匹配网络的架构和算法并学习如何在模型的训练阶段使用批量集即测试集。
匹配网络将支持集k示例映射到分类器C[s](·)的支持集k示例S
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3YQOhWG-1681785569477)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/94576b62-c681-443b-ba09-e6e280e2407f.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KqQQntfm-1681785569477)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/725b5feb-44c8-43ed-8a13-b4c530b590e8.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugcAoyIF-1681785569477)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/8c500245-cdfc-485c-8f8b-16692f891db5.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kbFiT3mm-1681785569478)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/0b1398a4-325e-475e-84e6-a59cdc029dfd.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6o3GIOvP-1681785569478)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/d3c88db6-018b-4740-a01d-e40f57052f55.png)]
总体而言我们可以看到y_hat如何成为确定测试输入x_hat属于哪个类别的概率的线性组合。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGJD1eHt-1681785569478)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/6d449b9b-9813-4ed7-9f19-37f2889465e4.png)]
本质上这是过去大多数基于度量的方法所做的但是无法获得人类水平的认知结果。
它们通常用于任何图像的初始特征提取因为这将为我们的架构适当地初始化训练过程。
S)已设定条件训练集图像的嵌入也彼此独立而不认为它们是支持集的一部分。
解决方案匹配网络使用双向长短期记忆LSTM在整个支持集范围内启用每个数据点的编码。
用于理解数据序列因为它们能够使用其单元内部的门保持整个数据的上下文。
2如果要计算两个数据点之间的相似度首先需要将它们放入相同的嵌入空间。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bymx6VrL-1681785569478)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/d8c095d5-729c-49ac-8834-ef3b2c1f861e.png)]
这里K是展开步骤的数量embeddings(x_hat)是通过
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XYbuWrUG-1681785569478)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/5840cf24-bfa3-424f-a151-23cf76511e2c.png)]
匹配的网络架构解决了通过设置框架在训练模型时复制测试条件的单样本学习问题如训练过程部分中所述。
与训练集类似查询图像即测试图像的全上下文嵌入提取也经历了组合的双向
然后从g(x[i])和f(x)获得的输出用于检查查询图像属于哪个类别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aOgkXl52-1681785569479)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/61fbf48b-9b8f-4de8-96b1-487001701281.png)]
为了训练模型我们可以使用任何基于分类的损失函数例如交叉熵损失函数。
匹配网络的关键思想是创建一个即使在训练数据即支持集中不存在的类也可以表现良好的架构。
匹配网络因其创新的训练过程和完全上下文嵌入而成为一站式学习的著名方法之一。
如果我们尝试从人类学习的角度理解匹配网络的方法则它与儿童的教学过程非常相似。
要学习新任务将为他们提供一系列小型示例然后是小型测试集然后重复进行。
使用此程序并借助人脑的上下文记忆保持功能孩子们可以学习一项新的任务。
nn正如我们在理论“了解连体网络”部分中学到的作为数据预处理的一部分我们需要创建对
(self.x0[index],self.x1[index],self.label[index])def
self.size在创建迭代器之前让我们创建pairs函数并对其进行预处理
digit_indices[dn][i]x0_data.append(data[z1]
众所周知contrastive_loss_function包含两个部分
对于类似的点(1-y)*(distance_function)^2对于不同的点
y*{max(0,(m-distance_function^2)}
在这里distance_function被视为欧几里得距离也称为均方根
为此我们首先创建一个带有两个函数的名为SiameseNetwork的类
forward_once在forward_once中训练数据将穿过所有层并返回输出的嵌入。
forward在forward中对于给定的输入对将两次调用forward_once这将返回获得的嵌入的
正如在连体网络的理论部分所讨论的那样我们与两个并行层共享参数因此我们不需要显式创建两个分支我们只需创建一个分支即可
__init__(self,flag_kafFalse):super(SiameseNetwork,
500),nn.ReLU(inplaceTrue),nn.Linear(500,10),nn.Linear(10,
self.forward_once(input1)output2
self.forward_once(input2)return
output2减少MNIST数据集并选择2000随机点将batchsize设置为
dsets.MNIST(root../data/,trainTrue,downloadTrue)
dsets.MNIST(root../data/,trainFalse,transformtransforms.Compose([transforms.ToTensor(),]))
np.random.choice(len(train.train_labels.numpy()),
np.random.choice(len(test.test_labels.numpy()),
create_iterator(train.train_data.numpy()[indices],train.train_labels.numpy()[indices],batchsize)
create_iterator(test.test_data.numpy()[indices_test],test.test_labels.numpy()[indices_test],batchsize)#
torch.optim.SGD(model.parameters(),
lrlearning_rate,momentummomentum)#
torch.utils.data.DataLoader(train_iter,batch_sizebatchsize,
torch.utils.data.DataLoader(test,batch_sizebatchsize,
shuffleTrue)然后我们训练模型一定数量的时间并打印结果
Epoch:str(epoch)------------------)for
labels)optimizer.zero_grad()loss.backward()optimizer.step()train_loss.append(loss.item())if
0.003937现在让我们创建所有用于绘制嵌入的函数和一个损失函数
plot_loss(train_loss,nametrain_loss.png):plt.plot(train_loss,
numpy_labels,name./embeddings_plot.png):c
numpy_all[np.where(numpy_labels
9])plt.savefig(name)使用以下代码绘制loss函数
plot_loss(train_loss)这将给出以下图作为结果输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rVUxiGwN-1681785569479)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/aba64cc3-f3b4-4d14-a3bf-8d0ae4a62c36.png)]
然后我们将定义test_model和testing_plots来绘制MNIST数据集的测试集嵌入
test_model(model):model.eval()all_
model.forward_once(x)all_.extend(output.data.cpu().numpy().tolist())all_labels.extend(labels.data.cpu().numpy().tolist())numpy_all
testing_plots(model):dict_pickle{}numpy_all,
test_model(model)dict_pickle[numpy_all]numpy_alldict_pickle[numpy_labels]numpy_labelsplot_mnist(numpy_all,
testing_plots(model)这将给出以下图作为结果输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5p1fQlYw-1681785569479)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/9b174385-0416-496d-b96a-6eee5e7b5f61.png)]
在上图中我们可以观察到大多数点都在一个群集中而其他一些点则不在群集中可以看作是离群值。
我们的匹配网络架构实现包括以下五个重要部分有关更多详细信息您可以参考“建模级别-匹配网络架构”部分中的匹配网络架构图
f余弦相似距离函数c注意模型softmax(c)损失函数交叉熵损失
inline我们将加载omniglot数据集该数据集将使用帮助程序脚本转换为.npy格式。
在帮助程序脚本中我们仅以以下大小格式加载数据[total_number,
range(0,20):plt.figure()plt.imshow(temp[i,:,:,0])通过运行前面的代码您将获得以下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6rPY2JW-1681785569479)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/fd4f59b6-874c-4f35-b486-0072c2a2426a.png)]
标签集choose_label支持集support_set_xsupport_set_y支持集示例中的一批
[total_classes,20,28,28,1]:return:
[support_set_x,support_set_y,target_x,target_y]
range(batch_size):choose_classes
np.random.choice(data.shape[0],
np.random.choice(classes_per_set,
np.random.choice(data.shape[1],
[0,1,2,3,...,19]support_set_x[i]
sample_batch(datatset[dataset_name])support_set_x
support_set_x.reshape((support_set_x.shape[0],
support_set_x.shape[2],support_set_x.shape[3],
support_set_x.shape[5]))support_set_y
support_set_y.reshape(support_set_y.shape[0],
target_y如果您还记得在匹配的网络架构中网络有四个主要部分
nn.Sequential(nn.Conv2d(in_channels,
1),nn.ReLU(True),nn.BatchNorm2d(out_channels),nn.MaxPool2d(kernel_size2,
stride2),nn.Dropout(dropout_prob))return
Embeddings_extractor(nn.Module):def
image_size28):super(Embeddings_extractor,
AttentionalClassify(nn.Module):def
__init__(self):super(AttentionalClassify,
size[batch_size,sequence_length]:param
support_set_y:[batch_size,sequence_length,classes_num]:return:
shape[batch_size,classes_num]softmax
nn.Softmax(dim1)softmax_similarities
softmax_similarities.unsqueeze(1).bmm(support_set_y).squeeze()return
preds创建一个距离网络该距离网络将从测试图像和训练嵌入中获取输出以计算距离。
__init__(self):super(DistanceNetwork,
torch.sum(torch.pow(support_image,
input_image.unsqueeze(1).bmm(support_image.unsqueeze(2)).squeeze()cosine_similarity
support_manitudesimilarities.append(cosine_similarity)similarities
torch.stack(similarities)return
similarities.t()创建BidirectionalLSTM它将从测试图像获取输入和输出并将它们放在相同的嵌入空间中。
BidirectionalLSTM(nn.Module):def
vector_dim):super(BidirectionalLSTM,
self).__init__()self.batch_size
nn.LSTM(input_sizeself.vector_dim,
(Variable(torch.zeros(self.lstm.num_layers
self.lstm.hidden_size),requires_gradFalse),Variable(torch.zeros(self.lstm.num_layers
self.lstm.hidden_size),requires_gradFalse))def
self.repackage_hidden(self.hidden)output,
image_size28):super(MatchingNetwork,
self).__init__()self.batch_size
learning_rateself.num_classes_per_set
num_classes_per_setself.num_samples_per_class
num_samples_per_classself.image_size
Embeddings_extractor(layer_size64,
BidirectionalLSTM(layer_size[32],
np.arange(support_set_images.size(1)):gen_encode
:])encoded_images.append(gen_encode)#
self.g(target_image)encoded_images.append(gen_encode)output
torch.stack(encoded_images,dim0)#
support_set_ysupport_set_y_one_hot)#
target_y).float())crossentropy_loss
构建器该构建器将调用匹配的网络并运行其周期以进行训练测试和验证
range(int(total_train_batches)):x_support_set,
Variable(torch.from_numpy(x_support_set)).float()y_support_set
Variable(torch.from_numpy(y_support_set),
requires_gradFalse).long()x_target
Variable(torch.from_numpy(x_target)).float()y_target
Variable(torch.from_numpy(y_target),
requires_gradFalse).squeeze().long()#
y_support_set.unsqueeze(2)sequence_length
y_support_set.size()[1]batch_size
y_support_set.size()[0]y_support_set_one_hot
Variable(torch.zeros(batch_size,
sequence_length,classes_per_set).scatter_(2,y_support_set.data,1),
x_support_set.size()x_support_set
processoptimizer.zero_grad()c_loss.backward()optimizer.step()iter_out
total_train_batchestotal_accuracy
torch.optim.Adam(matchNet.parameters(),
test_loss,test_accuracy[],[]for
range(total_epochs):###############################
##########################################total_c_loss,
run_epoch(total_train_batches,train)train_loss.append(total_c_loss)train_accuracy.append(total_accuracy)#################################
#######################################total_val_c_loss,
val)val_loss.append(total_val_c_loss)val_accuracy.append(total_val_accuracy)print(Epoch
valid_accuracy:{:.2f}.format(e,
total_val_accuracy))运行此代码块后您将看到模型开始训练并打印以下输出
valid_accuracy:0.37现在通过运行以下代码块来获得测试的准确率
run_epoch(total_test_batches,test)
print(test_accuracy:{}%.format(total_test_accuracy*100))运行此代码块后您将看到以下输出
plot_loss(train,val,name1train_loss,name2val_loss):plt.plot(train,
labelname2)plt.legend()plot_loss(train_loss,val_loss)运行这些单元格后您将看到如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zFmgUaC-1681785569480)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/97d99dae-968d-45c3-9d2f-13cf0b663c2b.png)]
在连体网络编码练习中我们创建了一个小的卷积层并由一个全连接层姐妹架构进行了扩展。
训练模型后我们还绘制了模型获得的二维嵌入图并观察了某些数字如何聚类在一起。
同样在匹配网络编码练习中我们为匹配网络的每个模块实现了小型架构例如嵌入提取器注意力模型和完全上下文嵌入。
您可能还观察到某些模型是从头开始训练的-我们可能已经使用了迁移学习架构或者增加了
我们探索了两种神经网络架构它们已在研究界和软件行业中用于单样本学习。
总之可以说匹配网络和连体网络架构都已经成功证明通过更改损失函数或特征表示我们可以用有限的数据量实现目标。
在下一章中我们将探索不同的基于优化的方法并了解它们与基于度量的方法之间的区别。
架构来获取嵌入对比损失函数有哪些缺点三重损失函数如何帮助解决它维度的诅咒是什么
要更深入地了解本章介绍的架构并探讨它们的工作方式和原因请阅读以下文章
当然除了学习新事物的能力外人类在执行任何任务时还可以访问大量内存。
遵循相同的思想过程设计了基于模型的架构并添加了外部存储器以快速概括单样本学习任务。
在这些方法中使用存储在外部存储器中的信息模型仅需几个训练步骤即可收敛。
神经网络仅接受固定大小的输入这在输入长度可变的现实生活中不会有太大帮助。
神经网络无法将值绑定到我们已知的两个信息系统人脑和计算机大量使用的数据结构中的特定位置。
的总体架构这是理解记忆增强神经网络MANN的基础这些神经网络修改了
来自生物学和计算神经科学领域的研究提供了广泛的证据表明记忆对于快速有效地存储和检索信息至关重要。
基本上由神经网络组成该神经网络由控制器和称为存储库或存储矩阵的二维矩阵组成。
在每个时间步长神经网络都会接收一些输入并生成与该输入相对应的输出。
在这样做的过程中它还访问内部存储库并对其执行读取和/或写入操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-trrJCU4K-1681785569480)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/29d7adbd-0103-4c43-b5b0-c2a65a121d48.png)]
如果通过在内存矩阵中指定行索引和列索引来访问内存位置则无法获取该索引的梯度。
此操作不可反向传播并且会使用标准的反向传播和基于梯度下降的优化技术来限制
的控制器使用模糊读写操作与内存进行交互这些操作与内存的所有元素进行不同程度的交互。
更准确地说控制器以差分方式在所有存储位置上生成权重这有助于使用基于标准梯度的优化方法从头到尾训练网络。
控制器生成的注意力向量是长度R的向量称为权重向量w[t]其中向量w[t](i)的条目是存储库第i行的权重。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7A2AFjWA-1681785569480)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/eed93f02-4abc-465e-b009-2912f63ccb39.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83DMFHmv-1681785569480)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/7b4dda93-17d9-4c36-ab06-7af57479b100.png)]
为了擦除旧数据写头使用附加长度C擦除向量e[t]以及权重向量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kistk1um-1681785569480)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/cb6720e7-9a40-4e30-b015-966dd1074fb0.png)]
a[t]以及M_erased[t]根据前面的方程式和权重向量更新存储矩阵的行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-agR1IydJ-1681785569480)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/6d9c4431-8618-4953-a442-b2320bd662fb.png)]
读取和写入操作的关键是权重向量该权重向量指示要从中读取/写入的行。
第一步是基于内容的寻址其目的是基于每一行与给定的长度为C的给定关键字向量k[t]的相似度来生成权重向量。
更精确地说控制器发出向量k[t]并使用余弦相似性度量将其与M[t]的每一行进行比较。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmBkp4HH-1681785569481)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/d338c2ca-2226-4543-abc4-5ab988fc0a28.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rVPXuOk8-1681785569481)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/e9fa7fd5-b836-4dc6-a320-74200df1183a.png)]
第二阶段是基于位置的寻址其重点是从特定存储位置读取/写入数据而不是在阶段
1)称为插值门将内容权重向量w[t]^c与前一个时间步的权重向量w[t-1]混合以产生门控权重w[t]^g。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jzhRclXJ-1681785569481)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/906b96f2-1a9f-4b09-ad23-f551d40f82d5.png)]
在第三阶段插值后头部发出归一化的移位加权s[t]以执行R模的移位运算即向上或向下移动行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmwCGGqe-1681785569481)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/8ad09342-cba4-4cfe-8b3e-3536756a491d.png)]
第四个也是最后一个阶段锐化用于防止偏移的权重w_tilde[t]模糊。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RZscwMJJ-1681785569481)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/f6a0bbfd-bfe5-4d2d-8d0e-015fc55c1642.png)]
所有操作包括读取写入和寻址的四个阶段都是差分的因此可以使用反向传播和任何基于梯度下降的优化器从头到尾训练整个
控制器是一个神经网络可以是前馈网络也可以是循环神经网络例如长短期记忆LSTM。
它已显示在各种算法任务例如复制任务上均具有良好的表现这些任务将在本章的稍后部分实现。
在此任务中对于给定的输入控制器可能只需要执行两个操作并且这两个操作都与内容有关而与位置无关。
当输入与先前看到的输入非常相似时将采取一种措施在这种情况下我们可以更新内存的当前内容。
当当前输入与以前看到的输入不相似时将采取另一种操作在这种情况下我们不想覆盖最近的信息。
的读取操作非常相似唯一的区别是此处的权重向量仅使用基于内容的寻址NMT
更准确地说控制器使用标准化的读取权重向量w[t]^r将其与M[t]的行一起使用以生成读取向量r[t]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZQhEgEW-1681785569482)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/dc63f6b2-8a4b-4774-8ed6-0d720f31bb7b.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LHaCXoZ-1681785569482)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/b947ff46-f23a-45ed-a252-2ceaa0ca82b6.png)]
为了写入存储器控制器在写入最近读取的存储器行和写入最近读取的存储器行之间进行插值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1DYAg09m-1681785569482)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/940cbf9a-4794-43e5-917a-171886d6871a.png)]
NTM以跟踪最久未使用的存储位置以执行基于内容的寻址以读取和写入最久未使用的位置。
在下一部分中我们将学习另一种基于模型的架构该架构由四个架构的网络组成并为单样本学习领域做出了重大贡献。
在通常的深度学习方法中神经网络的权重是通过随机梯度下降来更新的这需要大量的时间来训练。
众所周知随机梯度下降法意味着我们将考虑每个训练数据点进行权重更新因此如果我们的批量大小为
元网络建议通过训练与原始神经网络并行的神经网络来预测目标任务的参数从而解决权重缓慢的问题。
在元网络的情况下这是一个嵌入函数用于比较两个不同数据点的特征。
基础学习器基础学习器尝试学习目标任务任务目标网络可以是简单的分类器。
然后可以将知识迁移到基础级学习器以在单个任务的上下文中提供概括。
要为元学习器嵌入函数和基础学习器分类模型两者学习这些权重我们需要两个不同的网络。
这使得元网络成为迄今为止我们在本书中讨论过的最复杂的网络之一。
支持集训练集中的采样输入数据点xy。
测试集来自训练集的采样数据点x和。
嵌入函数f[θ]作为元学习器的一部分嵌入函数与连体网络非常相似。
经过训练可以预测两个输入是否属于同一类。
基本学习器模型g[φ]基本学习器模型尝试完成实际的学习任务例如分类模型。
θ⁺嵌入函数的快速权重f[θ]。
φ⁺基本学习器模型的快速权重g[φ]。
F[w]一种
架构用于学习嵌入函数的快速权重θf[θ]的慢速网络。
G[v]通过v学习快速权重φ参数化的神经网络用于基础学习器g[φ]来自其损失梯度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HG064yIu-1681785569482)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/7ee8a46f-a88d-4310-a261-da0df68aa4f7.png)]
网络F[w]学习嵌入函数的元学习器快速权重-即θ⁺。
神经网络G[v]以学习基本学习器的快速权重即φ⁺。
现在我们已经了解了快速权重和慢速权重的概念和架构让我们尝试观察整个元网络架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0J7P1e0-1681785569482)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/d98e350d-6d91-4bff-b79d-6f33824b0e59.png)]
如上图所示元网络由基本学习器和配备外部存储器的元学习器嵌入函数组成。
在元学习器中它用于连续学习更新参数而在基础学习器中对输入进行预处理之后它将元信息梯度传递给元
之后元学习器使用元信息梯度将参数化更新快速返回给基础学习器以通过使用慢速权重和快速权重的集成来进行优化如图所示
元网络的基本关键思想是通过处理元信息以快速的方式学习权重以进行快速概括。
中将慢速权重和快速权重组合在一起以在神经网络中进行预测如下图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewDk3StF-1681785569483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/e3036523-f829-413a-85ad-fe9838ae6684.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nq94NlUA-1681785569483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/6a8a41af-c6a4-471a-8998-920cf7d1d0c7.png)]
通过嵌入函数f[θ]正向传播数据点。
计算交叉熵损失L_emb。
F[w](▽L_emb)。
接下来遍历支持集S中的示例并为每个示例计算快速权重。
将基本学习器g[φ](x[i])例如分类模型向前传递并计算损失函数L_task[i]例如交叉熵。
计算基本学习器梯度▽L_task[i]并使用它们来计算示例级快速权重φ⁺[i]
G[v](▽L_task[i])。
将基础学习器φ⁺[i]的计算得出的快速权重存储在存储器的M部分的i位置处。
在嵌入网络中使用⊕合并快速权重和缓慢权重。
将支持样本转发通过嵌入网络并获得嵌入r[i]
f[θ,θ⁺](x[i])。
将r[i]存储在内存R的k部分的i位置。
现在通过使用支持集样本M的快速权重来计算基础学习器的快速权重φ⁺。
使用最新的φ⁺将测试样本向前传递通过基本学习器并计算损失函数L_task[i]。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-melCfz13-1681785569483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/14423e78-c644-4cec-b7dc-f5879e000a7a.png)]
元学习器也遵循相同的策略分别用于提取数据和元信息的上下文嵌入。
架构倾向于记住历史这使得元学习器的目标能够跨任务提取重要信息。
例如假设我们正在训练我们的网络以完成多种任务例如猫的品种分类和狗的品种分类。
元学习器进行训练时它会学习例如狗品种分类中权重更新的策略并使用这些学习到的信息以较少的步骤和较少的数据来优化其用于猫品种分类的操作。
模型显示为T时间步长的随机k维向量。
网络的工作是在每个时间步从零向量输出这些T[k]维随机向量。
output_size)self.intialize_parameters()def
layersnn.init.xavier_uniform_(self.layer1.weight,
nn.init.normal_(self.layer1.bias,
std0.01)nn.init.xavier_uniform_(self.layer2.weight,
gain1.4)nn.init.normal_(self.layer2.bias,
torch.sigmoid(self.layer2(x))return
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hsrIEyx3-1681785569483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/3a4d2e1c-a7df-4316-b1cd-5a67640f0bdf.png)]
similarityinterpolateshiftsharpen
在这里我们将定义ReadHead它可以根据read操作访问和更新内存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRLV2MNX-1681785569483)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/006a56d0-58c8-429e-a160-c9f33966e585.png)]
functionself.w_last.append(w)mem
wReadHead和WriteHead都使用全连接层来生成用于内容编址的参数kbetagsgamma。
全连接控制器读写头部记忆体参数在无法训练的记忆上运行的工具函数
self._read_write(controller_out)#
torch.sigmoid(self.fc_out(out))return
self.write_head(controller_out,
在第二步预测步骤中网络采用k维零向量来产生预测该预测对每个时间步执行输入的复制。
self.seq_width)inp[1:self.seq_len
out我们还将实现梯度剪切因为剪切梯度通常是一个好主意以使网络在数值上稳定
min_grad-10,max_grad10):parameters
parameters:p.grad.data.clamp_(min_grad,max_grad)初始化训练参数
learning_rate1e-2sequence_length,
BinaySeqDataset(sequence_length,
torch.optim.RMSprop(model.parameters(),
time()model.initalize_state()optimizer.zero_grad()inp_seq_len
Y)loss.backward()clip_grads(model)optimizer.step()losses
Loss:0.7188648581504822定义一个plot_signal函数并绘制训练损失losses
fig_size(500,100)):plt.figure(figsizefig_size)plt.imshow(grid_image.data.permute(2,
dimensionmodel.initalize_state()for
scale_eachTrue)plt.figure(figsize(200,200))
plt.imshow(grid_img_truth.data.permute(2,
0))plt.figure(figsize(200,200))
plt.imshow(grid_img_pred.data.permute(2,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEebHoA4-1681785569484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/0dc925d0-48d7-4b5c-958f-fe2f911fdb8d.png)]
的控制器能够使用基于内容的寻址基于位置的寻址或同时使用这两种而
该模式背后的思想是最久未使用的内存位置由读取操作确定而读取操作由基于内容的寻址执行。
因此我们基本上执行基于内容的寻址以读取和写入最久未使用的位置。
purpose定义ReadHead使其可以根据read操作访问和更新内存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LaxQm6Z8-1681785569484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/295304f9-1168-4b66-8274-4550618d7e6e.png)]
locationsself.w_last.append(w_r)#
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6eoF5Q1I-1681785569484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/1560e10f-2d4c-4532-a273-9d87c961a89e.png)]
torch.topk(-1*w_u,kn_reads)wlu_t
memory_size).type(torch.FloatTensor),dim1,keepdimTrue)return
self.usage_weight_vector(prev_w_u,
(1-torch.sigmoid(a))*w_least_used_weight_tmemory_update
locationsself.w_last.append(w_write)#
wReadHead和WriteHead都使用全连接层来生成用于内容编址的参数kbetags和gamma。
我们观察到的最常见的事情是使用外部存储器这对学习神经网络不同阶段的表示形式有什么帮助。
方法在单样本学习任务中表现良好但是由于手工设计的内存寻址函数它们的能力仍然有限因为它们必须具有差异性。
在元网络中我们看到了如何定义一个新网络以实现对原始网络的快速学习以及如何在元学习器级别上存储有关表示的信息如何在基础级别上微调参数。
尽管基于模型的架构是实现单样本学习的好方法但它们具有外部存储器的先决条件因此与其他方法相比实现基于模型的架构的成本昂贵。
内存为我们提供了一种方式来存储我们所学到的信息因此优化策略使我们能够更快地学习事物。
在后面的章节中我们将探索一些不同形式的优化策略这些策略可以用来学习目标。
什么是神经图灵机它们如何帮助学习记忆矩阵如何帮助模型更快地学习元学习器和基础学习器之间的分裂如何帮助架构学习单样本学习
基于模型的方法是您需要学习的更复杂的主题之一因此如果您想更深入地研究所涉及的概念则可以阅读以下论文
但是梯度下降优化需要大量训练样本才能使模型收敛这使其不适合进行少量学习。
在通用深度学习模型中我们训练模型以学习实现确定的目标而人类则训练为学习任何目标。
遵循此观察结果各种研究人员创建了针对元学习机制的不同优化方法。
换句话说系统着重于如何收敛任何损失函数目标而不是最小化单个损失函数目标这使该算法方法任务和域不变。
例如您不需要训练模型就可以使用交叉熵损失函数来识别花朵的类型。
相反您可以训练模型以了解任何两个图像之间的差异从而使模型任务不可知例如花识别花检测和领域不可知例如猫识别。
如果我们研究神经网络架构的学习方法它通常由很多参数组成并使用梯度下降算法进行了优化该算法需要对许多示例进行许多迭代以使其表现良好。
但是梯度下降算法在其模型中提供了不错的表现但是在某些情况下梯度下降优化算法会失败。
当给出有限数量的数据时梯度下降算法无法优化神经网络的主要原因有两个
对于每个新任务神经网络必须从其参数的随机初始化开始这会导致后期收敛。
迁移学习已通过使用预训练的网络来缓解此问题但由于数据应具有相似的域而受到限制。
即使是梯度下降的权重更新步骤方法例如
真正有用的是学习一些可以在所有域中使用的通用初始化这是初始化的一个好地方。
梯度下降算法的关键思想是基于下一步的方向该方向是根据概率分布假设选择的。
因此如果我们能够以某种方式完全近似概率分布则仅需几个步骤就可以优化网络。
与模型无关的元学习MAML尝试通过为每个新任务提供更好的权重初始化来解决梯度下降方法的缺点。
当将其用于新任务时该模型通过使用已初始化的参数通过一个或多个梯度步骤来微调架构从而提供更好的表现。
从特征学习的角度来看这种训练模型参数以使一些梯度步骤可以优化损失函数的方法也可以从构建内部表示的角度来看。
的目的是为模型的参数提供良好的初始化从而以较少的梯度步骤实现对新任务的最佳快速学习。
它还尝试避免过拟合的情况这种情况在训练具有较少数据架构的神经网络时会发生。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1nzw41d-1681785569484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/b3cabe38-594a-4604-a177-7da4089882bb.png)]
假设我们有三个不同的新任务并且为每个任务带有箭头的灰色线执行了一个梯度步骤。
我们可以看到参数θ接近三个任务的所有三个最佳参数这使θ成为可以快速适应不同新任务的最佳参数初始化。
顾名思义与模型无关的元学习可以用于任何形式的模型无论是分类回归还是强化学习。
T这表示各种任务-例如我们希望我们的模型学习识别猫狗马等以及T[i]代表一种识别猫的训练模型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fXeIwkVF-1681785569484)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/db9617c8-2ef5-4a11-8dec-bf17f01a1a38.png)]
假设我们希望训练一个分类模型f[θ]该模型可以学习识别图像中的猫狗和马。
从P(T)中提取T[i]-例如我们从所有可能的任务中随机抽取识别猫的任务。
由于我们正在针对特定任务训练模型因此我们将学习θ[i]特定于任务的参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAhxmL2D-1681785569485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/4848ff3d-a327-43fe-8c92-7d6f69977ac1.png)]
通过使用模型f[θ[i]]上的采样测试数据点D[i]计算损失及其梯度来更新θ
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-srwnunb7-1681785569485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/00a98b32-110e-44d8-9a49-e36078be0d57.png)]
当涉及到模仿学习时机器人需要接收适当的数据这些数据包括有关动觉变化有关其身体部位运动的意识遥距操作控制和其他类型输入的信息。
它提出了一种仅通过利用从不同任务的数据中提取的强大先验知识例如关于动觉学习的信息就可以从人类的单个视频中学习机器人操纵技能的系统如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAXlPsfQ-1681785569485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/7f72e13d-4f5d-4cb6-99c3-fd2394d5cc99.png)]
提出了行为克隆目标的暂时损失该目标也充当日志空间中的正则化项。
众所周知在任何情况下都要进行强正则化对于避免过拟合非常重要尤其是在单样本学习的情况下。
元学习器在此阶段模型着重于学习跨各种任务的常识。
基础学习器在基础学习器中模型尝试优化以学习任务特定目标的参数。
单元将用作元学习器而特定于任务的目标例如狗的品种分类将被用作基础学习器。
中的单元状态更新与反向传播中的基于梯度的更新相似可用于学习基本学习器目标的更新规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yVKzA4u-1681785569485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/7f93507c-8eba-4a42-a6f5-8eb229b65be1.png)]
我们还知道随机梯度下降SGD有多种变化形式例如动量RMSpropAdam
等它们实质上存储了有关过去学习的信息以梯度形式以实现更好的优化。
单元视为一种更好的优化策略该策略使模型能够捕获特定任务的短期知识和公共长期知识。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zwY4kVJH-1681785569485)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/5a9a4fca-cdb7-4c9d-9aba-27c879fc4481.png)]
θ[t]是时间步长t的参数▽L[t]是t时的损失梯度并且α[t]是时间t时的学习率。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HrpVbwvY-1681785569486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/1994255e-a722-4cfe-bfac-9a66d91048e2.png)]
元学习器的作者提出如果将以下值放在单元更新方程中那么我们将获得梯度下降更新规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CeHbwDMy-1681785569486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/b38cc62b-318b-4b9e-ba28-0e5eb9a1106d.png)]
从逻辑上考虑这一点我们只想学习i[t]因为这与估计梯度下降的学习率基本相似。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2pu9vkP-1681785569486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/da2cd6b1-bca0-456b-8064-23bdb90ef26c.png)]
本质上i[t]被定义为具有当前梯度当前损失和先前学习率i[t-1]的组合的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnZS3OZD-1681785569486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/1d551c2d-de09-4a7b-8657-0c310ee85bbb.png)]
故意这样做是为了使元学习器能够控制学习率以便在更少的时间内训练基础学习器。
在一般的深度学习设置中要在给定数据集D上训练模型我们将数据集分为三个部分训练验证和测试集。
但是在元学习设置中我们首先将数据集划分为特定于任务的集例如猫品种分类和狗品种分类称为元集例如D[n]。
D[n]由D_n_train和D_n_test组成因此对于K样本学习每个D_n_train由K
此后D_n_train进一步分为三个部分D_meta_trainD_meta_valD_meta_test。
在这里目标是使用D_meta_train训练学习算法该算法可以将任何特定于任务的集合作为训练集D_train并产生更好的分类器学习器。
要训练一个单样本学习模型您需要匹配训练条件以测试时间条件例如像在匹配网络中一样在较少的数据上进行训练但要进行多个批量。
元学习器也遵循与匹配网络相同的概念并已被证明在特定任务目标上确实表现出色。
基础学习器M具有特定任务的主要目标带有参数θ-例如用于识别猫的分类器元学习器RLSTM
Y从D_meta_train采样的数据点损失L用于调整主要任务特定目标的损失函数例如二进制交叉熵损失
D_test。
随机初始化基础学习器分类模型的初始参数θ[0]。
对于t
1至T步骤重复以下步骤从D_train中随机采样输入输出对(X[t],
Y[t])计算基础学习器分类模型的损失。
使用单元格的基本学习器的损失L[t]及其梯度▽[θ[t-1]]
Y_test)计算基础学习器分类模型的损失。
使用▽[θ[d-1]]
在T步骤之后最终的基本学习器参数将用于评估测试集并更新元学习器参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9DlaC1x-1681785569486)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/968555da-ab84-4ab1-9e2a-cd4ba196a50d.png)]
您确实可以在元学习器中添加一些复杂的架构但这要付出大量训练参数的代价。
1.).requires_grad_(),torch.Tensor(32).zero_().requires_grad_(),torch.Tensor(32,
32).uniform_(-1./math.sqrt(32),
1./math.sqrt(32)).requires_grad_(),torch.Tensor(32).zero_().requires_grad_(),torch.Tensor(1,
32).uniform_(-1./math.sqrt(32),
1./math.sqrt(32)).requires_grad_(),torch.Tensor(1).zero_().requires_grad_(),
Passopt.step()运行此命令后您将以以下形式查看优化输出
一旦获得正确的参数我们将首先生成一些随机数据点以对五个数据点进行子采样。
如果将结果绘制成图我们将看到神经网络能够在正弦数据点上获得正确的曲线
t_params)plt.plot(test_x.data.numpy(),
plt.savefig(maml_output.png)运行此命令后您应该能够获得如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qfIrxeMf-1681785569487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/1255afd0-ad98-404e-8676-0adad4b09236.png)]
它是模型不可知的元学习的一种变体但是增加了先验信息也就是说已经添加了有关该域的其他相关信息。
为此他们使用跨各种任务收集的数据并根据其学习新的元测试任务的能力进行评估。
此过程可以形式化为学习数据一系列任务的先验知识即提取重要信息并且微调过程成为在学习到的先验知识下的推断
warnings.filterwarnings(ignore)创建一个简单的神经网络架构将学习正弦曲线。
我们将从正弦曲线中获取随机生成的数据因此我们将使用这个非常小的网络因为我们不需要大的网络来学习曲线
1.).requires_grad_(),torch.Tensor(32).zero_().requires_grad_(),torch.Tensor(32,
32).uniform_(-1./math.sqrt(32),
1./math.sqrt(32)).requires_grad_(),torch.Tensor(32).zero_().requires_grad_(),torch.Tensor(1,
32).uniform_(-1./math.sqrt(32),
1./math.sqrt(32)).requires_grad_(),torch.Tensor(1).zero_().requires_grad_(),
13232).uniform_(-1./math.sqrt(65),
1./math.sqrt(65)).requires_grad_(),torch.Tensor(32).zero_().requires_grad_(),torch.Tensor(32,
32).uniform_(-1./math.sqrt(32),
1./math.sqrt(32)).requires_grad_(),torch.Tensor(32).zero_().requires_grad_(),torch.Tensor(1,
32).uniform_(-1./math.sqrt(32),
1./math.sqrt(32)).requires_grad_(),torch.Tensor(1).zero_().requires_grad_(),
我们将使用内循环而不是外循环训练因此我们需要设置某些参数例如alphabeta学习率优化器和循环数
如“域自适应元学习”部分所述这种方法只能从一个人的视频中学习新技能。
为此它首先使用人类演示和远程演示来训练元网络以在元训练阶段建立强大而丰富的先于任务
range(n_inner_loop):sampled_data
torch.FloatTensor([[random.uniform(math.pi/4,
inner_loop_loss.append(adap_loss)v_f,
outer_lopp_loss.append(loss)在此阶段机器人meta_net学习如何使用数据向人类学习。
在元训练阶段之后机器人可以通过将其学习到的先验知识与执行新技能的人员的一个视频相结合来获得新技能。
在元训练阶段目标是使用人类和机器人的演示数据获取先验策略φ使用学到的知识然后快速学习如何仅用几个数据点来模仿新任务
一旦获得正确的参数我们将首先生成一些随机数据点以对五个数据点进行子采样并使用adap_net的损失微调主要的meta_net
torch.FloatTensor([[random.uniform(math.pi/4,
torch.autograd.grad(t_adap_loss,
range(len(params))]部署后机器人可以仅使用人类与这些对象一起执行任务的单个视频即可适应具有新颖对象的特定任务。
parametersplt.plot(test_x.data.numpy(),
plt.savefig(daml-sine.png)运行代码后您将看到类似于以下内容的图形
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zoMfmvr2-1681785569487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/e8692140-1570-4eda-add5-c8331e6abf96.png)]
https://github.com/PacktPublishing/Hands-On-One-shot-Learning-with-Python/tree/
同样为了进行优化学习神经网络的参数许多研究人员也公开了许多方法但是事实证明梯度下降是一种适用于每种情况的通用方法。
如果我们希望处理特定类型的神经网络问题那么最好探索可能适合我们任务的不同优化技术。
如何通过优化我们的初始参数设置来解决单样本学习问题从而在几个数据点上进行一个或几个梯度下降步骤可以导致更好的概括。
我们将通过用概率模型表示对象类别来观察几个贝叶斯学习框架的发展。
我们将对判别式K样本学习和贝叶斯程序学习及其在现实世界中的应用进行恰当的解释。
梯度下降优化算法的优缺点是什么梯度下降优化算法有其他选择吗为什么训练神经网络需要那么多的周期
深度学习架构已被证明是非常有效的但是它们仍然不是单样本学习的最佳方法。
此外我们将贝叶斯方法与深度学习圈中解决任何问题的众所周知的技术迁移学习进行比较。
当人们对看不见的数据进行推断时他们会利用有关他们已经看到听到触摸或经历过的相关事件的强大先验知识或归纳偏见。
例如与狗一起长大的婴儿可能第一次见到猫并立即推断出它与家犬的宠物般的性情相似。
但是公平地说猫比狗更像狗而不是孩子经历的其他随机事物例如食物。
与机器学习模型相反人类不需要成千上万的猫实例就可以从头开始学习只要他们已经学会了识别狗就可以识别猫。
人脑具有元学习的固有能力这与机器学习语言中的迁移学习和多任务学习有关。
这些模型旨在从对象的各个部分学习高级抽象特征并将这些学习的特征应用于新的但相似的对象类别。
在本章中我们将研究如何生成这些生成模型拥有先验知识意味着什么如何用数学术语构筑先验知识如何从一些对象中学习高级概念模型的参数学习
以及如何将这些新学到的知识与先验知识相结合以对新对象做出有意义的决策推断。
本章将基于理论因此没有正式的技术要求但是需要对贝叶斯建模有基本的了解。
在本节中我们将从数学的角度简要讨论贝叶斯学习背后的思想这是单样本学习概率模型的核心。
贝叶斯学习的总体目标是在给定训练数据的情况下对参数θ的分布进行建模即学习分布p(θ
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZeO3ujs-1681785569487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/461dfab6-3cd8-4782-a6de-e092332fa3b6.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2SNvKhF-1681785569487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/59ce0f8b-fa97-4605-98f6-78bf3737c14f.png)]
我们可以对两边取对数这不会影响优化问题但会使数学容易且易于处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RaobFfry-1681785569487)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/f1da3c33-07dc-4b1d-8a75-aa4162729d8c.png)]
我们可以从数据的右侧删除P(data)因为它不依赖于θ来进行优化因此优化问题如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wDd9RnXm-1681785569488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/d5a1d317-b037-40b4-b612-10d2e168e328.png)]
在给定的概率设置中相同的项称为给定θ的数据的似然和先验在参数空间中的先验信念。
这种概率优化称为最大后验MAP估计因为我们正在从数据中最大化模型参数的后验分布。
一个不同的数据集很有可能会给我们完全不同的学习参数这些参数在参数空间中与从原始数据集中学习的参数相距甚远。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MuZD2wuB-1681785569488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/ad909edc-738b-40ed-a6fb-4d3893f9efc9.png)]
估计将收敛至点A。
但是大多数概率量都更偏向于惯用右手的人这与世界上惯用右手的人多于惯用左手的人这一事实相吻合。
现在在深入研究用于单样本学习的概率模型之前我们将简要研究有向图模型。
有向图模型也称为贝叶斯网络由与有向边相连的随机变量定义如在父子关系中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjRvCVMY-1681785569488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/169cea75-5669-4783-a7c4-a4b77f185c91.png)]
此图中SRLW和T的随机变量的联合分布通过一个简单的链式规则可分为多个分布
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ns0qgE1-1681785569488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/9511985a-1153-4134-8e00-3c8126a5dc83.png)]
这是因为每个分布都以许多变量为条件并且每个条件变量都有其自己的结果空间。
如果我们在有大量条件变量的情况下在图中走得更远则这种影响会更加突出。
因此要学习每种条件分布的庞大参数集我们需要大量的标记数据这在现代机器学习任务中通常是不可用的。
更正式地讲如果X[i]是有向图中的顶点则V是顶点数X[pa(t)]都是顶点X[t]的父级则所有顶点上的联合概率分布可写为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7mRkCFD-1681785569488)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/4bb469f5-c12f-455b-9a29-06e6eff50baa.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6101q0mF-1681785569489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/8f18500d-a05b-498d-949b-2d311af7bcbd.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGuay8K2-1681785569489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/06cbc1c2-9840-44aa-b8f3-a41e2abac4c4.png)]
首先人们倾向于仅从一个或几个示例中学习关于对象的有意义的信息例如对象边界并对其进行高精度分类请参见上图中的i)部分。
另一方面深度学习模型需要大量带标签的数据才能在诸如对象识别之类的任务上达到人类水平的表现。
其次人类从一个示例中学习了绝大多数能力例如创建新字符参见上图中的ii)部分将对象/字符分解为各个部分和关系请参见iii)部分并根据有关现有概念的现有知识开发新的有意义的概念/字符请参见上图中的iv)部分。
相反深度学习模型针对每个任务都需要特殊的损失函数和架构由于该任务可用的标记数据非常有限因此通常不切实际。
学习理论指出需要更多的数据而不是更少的数据来学习更复杂的可以很好地概括的模型。
但是人类往往会从非常稀疏的数据中学习到更丰富的表述这些表述可以很好地概括。
概率模型旨在弥合数据饥渴的机器模型与人类采用的高度健壮的元学习方法之间的鸿沟。
在本章中我们将讨论两行概率方法这些方法在从很少的数据中学习各种任务方面已经获得了广泛的成功
第一种方法是对对象零件子零件及其之间的关系进行显式建模以学习概念对象。
这可用于从一个或几个示例中对新对象进行分类并从预定义的零件和子零件列表中绘制新类型的对象。
第二种方法基于深度学习方法通过从初始的大量训练数据中学习新类别其中只有一个类别的图像以及来自其他类别的大量图像来完成一次分类任务。
最初的大量训练数据集有助于学习有关概念的强大先验知识这些概念随后可用于从一次镜头分类中对新对象进行分类。
例如它可以从零件和子零件中采样新类型的概念在这种情况下为手写字符并以新的方式将它们组合在一起。
在第二步中第一步中抽取的概念形成另一个较低层的生成模型以产生新示例如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfziZhnd-1681785569489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/a87b8aac-2728-4f0f-bfb7-9e588762ceca.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qWjoBOP-1681785569489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/16ff2f50-55be-44fd-8da5-661c7c7ea3a6.png)]
手写字符类型ψ是字符的各个部分和子部分之间以及它们之间的关系的抽象架构。
反映现实生活中的字符书写过程字符部分S[i]形成了笔向下移动到笔抬起操作的一个笔触。
为了生成新的字符类型模型首先为每个部分采样零件数k和子零件数n[i]。
每个字符部分都是通过对预定义集合中的子部分进行采样而产生的因此对下一个子部分进行采样的概率取决于前一个子部分。
为零件S[i]采样了关系R[i]该关系定义了该零件与先前零件的连接方式。
字符标记θ[m]是通过对墨水从笔到纸的流动方式进行建模而由零件和关系生成的。
首先将噪声此处称为运动方差添加到子零件的比例尺和控制点以定义冲程或零件轨迹s[m]。
使用随机渲染函数生成原始二进制字符图像I[m]该函数将笔划轨迹与灰度墨水映射。
是一种高度直观的模型可以在贝叶斯框架下使用简单的程序为概念建模。
在分类和生成的单次计算机视觉任务上该模型的表现与人类水平的表现相当其数据需求远低于某些最新的深度学习模型。
框架支持设计更复杂的程序这些程序可以对各种对象的复杂表示进行建模。
例如可以使用此框架对在零件和关系方面具有清晰直观描述的对象例如车辆食品动物甚至人脸进行建模。
然而这些概率程序需要对数据及其部分子部分和关系进行手动标记这是一个耗时的过程而深度学习方法则是自己学习这些人类直观特征和深层抽象特征。
样本学习的一种非常常见的方法是训练具有相关任务的大型模型而我们为此拥有大型数据集。
因此来自大型数据集的知识被提炼为到模型中这仅从几个示例中增加了对新相关任务的学习。
样本学习的概率模型其中所有任务共享一个公共特征提取器但具有各自的线性分类器其中仅包含几个特定于任务的参数。
这个想法是使用一个强大的神经网络该网络从大量监督数据中学习可靠的特征并将其与概率模型结合起来。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UA29kkWo-1681785569489)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/5f07d8c6-f555-4b6f-89a9-72d141ed72f9.png)]
参数W_tilde对应于大型数据集D_tilde中的C_tilde类参数W对应于
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qoIZuYhe-1681785569490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/f23a6f16-745c-44e0-bc32-0ca3befa7b6a.png)]
将此近似值与上图中的图模型结构结合起来我们可以摆脱原始数据集D_tilde并使用W_tilde的
样本学习过程将信息合并到两个数据集D_tilde和D中以在W上生成后验分布
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pH7WtcsP-1681785569490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/3f0ac346-6f71-413c-9364-4da122454208.png)]
从图模型在上图中我们知道给定父级W的情况D有条件地独立于D_tilde我们有以下内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IucwwUOw-1681785569490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/93b309a8-288c-4cd2-883f-f166d5f51c7d.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dx9JUQPf-1681785569490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/be56381d-889a-404b-95e6-1ebe2a7002bc.png)]
我们可以将项P(D_tilde)吸收到比例常数中从而使前面的方程式变为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5BUaiKt-1681785569490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/a32d4c87-1014-4d11-b7c1-563e0c5bfd97.png)]
主要挑战是在给定初始数据集D_tilde的情况下计算超参数θ的后验这会使该模型的推理变得难以处理。
由于使用了较大的初始数据集来学习权重W_tilde后分布P(W_tilde
给定图模型我们可以写出概念超参数θ和模型权重WW_tilde的联合分布如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7qqu61c-1681785569490)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/cd64030c-1e6b-4a97-bc41-e5043bf94a5e.png)]
的隐藏权重W和W_tilde被视为独立的。
第二给定θP(w_tilde[c]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O147xEil-1681785569491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/0c67309f-24e7-462a-abaa-039674855756.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vASiwi5T-1681785569491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/4a4c76f8-4524-4ba0-bda8-afec7fa80efe.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drwATmue-1681785569491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/bd2213cb-753d-470a-994d-2b8cc7b6a7c4.png)]
W_tilde_MAP)dW的推断是难以理解的因此此处使用近似值。
个图像上此方法可以单样本学习一次和五样本学习获得最先进的结果。
离统一概率模型和深度学习的领域又迈进了一步将两者结合起来可以开发出真正强大的模型从而利用概率领域的强大数学保证和深度学习模型的强大健壮功能。
样本学习方法仍然需要大量带标签的训练数据来训练基于深度学习的特征提取器。
另一方面贝叶斯程序学习方法利用模型中的归纳偏差和手工设计的特征因此需要较少的标注训练数据。
在本章中我们学习了在贝叶斯框架内开发概率模型的方法该模型可以极大地减少数据需求并达到人类水平的表现。
从前面讨论的手写字符的示例中我们还观察到概率模型不仅可以学习如何对字符进行分类还可以学习基本概念即以新的方式应用获得的知识例如从集合中仅有的几个字符生成全新的字符以及将字符解析为部分和关系。
但是人类学习器需要从具有丰富重叠结构的许多经验中获得的广泛的先前经验来完成新的学习任务。
为了模仿人类学习图结构需要具有更多的依赖性并且需要在模型中内置丰富的归纳偏差。
还应注意人类在很小的时候就对物体的物理特性形状运动和其他力学有很好的认识。
学习模型不会隐式地捕获对象的直观物理特性也不会显式地将其嵌入对象中。
直观物理类似于游戏引擎中嵌入的物理与概率模型和深度学习的集成是朝着更健壮的单发学习迈出的重要一步。
最后由于先验知识以强先验和图结构的形式嵌入到概率模型中因此与必须从头学习任务的深度学习模型相比它们的数据消耗更少。
在推断时这些模型必须搜索巨大的概率空间这对于现代计算机而言是不实际的。
最近的工作通过使用前馈映射对摊销概率推理计算来解决图模型中的这一推理挑战可以使用成对的生成/识别网络来学习。
《通过概率性规划归纳的人类级别概念学习》《可以无监督单样本学习对象类别的一种贝叶斯方法》《使用概率模型的判别性
样本学习》《构建像人一样学习和思考的机器》《简单视觉概念的单样本学习》《使用分层非参数贝叶斯模型的单样本学习》
在这本书中我们了解了用于深度学习的各种形式的架构以及从手动特征提取到变型贝叶斯框架的各种技术和方法。
单样本学习是一个特别活跃的研究领域因为它专注于根据人类的神经能力更紧密地建立一种机器意识。
年中随着深度学习社区的进步我们至少可以说我们正在开发一种可以像人类一样同时学习多个任务的机器。
在这一章中我们将看到单样本学习还有哪些其他选择并讨论本书中未深入探讨的其他方法。
在深度学习社区中已经提出了用于单样本学习的各种其他方法例如使用
到目前为止我们已经看到了使用单样本学习进行分类的模型但是在对象检测和语义分割方面也取得了一些进步。
一个很好的例子是关于《为短时学习重新研究基于局部描述符的图像到类度量》主题的研究工作。
它与其他神经网络架构的主要区别是用基于局部描述符的图像到类度量替代了最后一层。
《通过类别遍历查找与几次任务学习相关的任务相关特征》也为改进度量学习方法做出了贡献方法是引入一个插件框架。
在本文中作者讨论了众所周知的度量学习方法例如连体网络和匹配网络如何一次只关注一个任务而不是整个学习所有任务。
类别遍历模块CTM插件组件通过完成所有支持任务来学习重要的尺寸特征。
在集中器和投影仪单元的帮助下为相似类别提取通用特征嵌入并在不同类别中提取唯一特征。
的输出我们可以在元学习器之前添加一个强大的先验这可以使我们更快更好地进行优化。
《RepMet用于分类和几次对象检测的基于代表的度量学习》是一种小样本学习对象检测方法。
在本文中作者提出了一种用于对象区域提议的特征金字塔网络的变体并且在其顶部他们添加了基于度量的分类器该分类器根据与学习的类代表的距离对建议的区域进行分类。
同样《具有共同注意和共同激励的一次目标检测》也可以使用传统的视觉方法在建议的区域基础上进行过滤。
例如如果我们要检测笔架则目标图像将是笔架而查询图像将是桌子上的笔架。
在这种方法中我们首先从目标图像中提取有关对象的空间信息然后从查询图像中提取上下文对象。
研究工作《CANet具有迭代细化和专注的小样本学习的类不可知分割网络》证明了医学影像行业的潜在增长。
在本文中作者提出了一个用于语义分割的两级框架密集比较模块DCM和迭代优化模块IOM。
架构提取特征在训练集示例和测试集示例之间进行了密集的特征比较而
《PANet具有原型对齐的几次语义分割》通过以下方式解决了少数镜头分割问题
中最初网络从特定嵌入空间内的一些支持图像中学习特定于类别的表示然后通过将每个像素与学习到的特定于类别的表示进行匹配对查询/目标图像执行分割。
可以利用支持集中的重要见解并在几次分割的情况下提供更可靠的概括。
我们需要查看我们希望训练的模型架构的能力以及希望解决的问题的复杂性。
类似于单样本学习多年来研究人员提出了其他一些方法也旨在解决数据有限的问题。
在下一节中我们将学习机器学习的这些领域以及它们与单样本学习相比的效率。
有多种不同的相关解决方案与单样本学习方法非常相似但其解决方案方法略有不同。
在半监督学习中我们使用未标记的数据来总体上进一步了解人口结构。
个带标签的数据集训练模型并在大小相等的测试数据点上使用该模型为它们创建伪标签。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8F3ksliq-1681785569491)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/59858a66-819e-4871-955e-a0c5ffb64345.png)]
获得伪标签后我们将实标签与伪标签连接起来将实特征与伪特征连接在一起。
也就是说我们从一个类别中获得的样本要多于从其他类别中获得的样本。
这也被普遍称为偏态分布数据集。
让我们看一下处理偏斜数据集的一些流行方法
度量标准的选择度量标准的多种形式可以帮助评估模型的准确率例如混淆矩阵精度召回率和
得分。
算法的选择参数算法通过数据集学习其参数因此如果数据集存在偏差则参数模型最有可能也会受到偏差。
等被证明是最佳方法。
数据采样方法的选择也可以考虑进行数据采样以确保数据集不会保持偏斜。
这种方法接近单样本学习因为我们期望创建的机器学习模型应该能够从一些示例中学习分布。
本书中讨论的大多数方法都是元学习型方法例如与模型无关的元学习和元网络。
元学习是一种在不同任务上训练模型然后针对特定任务使用通常学到的特征的方法。
它帮助模型在许多任务上学习先验从而帮助模型在有限的数据下达到优化。
迁移学习是指使用从解决一个问题中获得的知识并将其用于解决另一个问题的技术。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRLMQhm6-1681785569492)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-1shot-learn-py/img/d2619e72-ed14-4933-9ca1-7d658c79f2f2.png)]
换句话说在一个数据集上训练的神经网络模型可以通过对前一个网络进行微调而用于其他数据集就像我们如何使用在不同域数据集例如
数据集上训练的连体网络来提取更好的特征用于签名匹配手写匹配等。
迁移学习在深度学习领域引起了很多关注并已被证明对于许多应用非常有用。
从理论上讲单样本学习有多种应用但直到最近才开始在实际场景中使用。
这种进步可以通过多种方式挽救生命可以为罕见病的发现铺平道路解决全球粮食危机或优化供应链模型。
《元学习实践》《为小样本学习重新研究基于局部描述符的图像到类度量》《通过类别遍历查找与几项学习相关的任务相关特征》《RepMet基于代表的度量学习用于分类和几次检测》《具有共同注意和共同激励的一次对象检测》《CANet具有迭代细化和专心的少样本学习的类不可知分割网络》《PANet具有原型对齐的几次图像语义分割》
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback