Andrej Karpathy作者

出神入化:特斯拉AI主管、李飞飞高徒Karpathy的33个神经网络「炼丹」技巧

特斯拉人工智能部门主管 Andrej Karpathy 发布新博客,介绍神经网络训练的技巧。

Andrej Karpathy 是深度学习计算机视觉领域、生成式模型强化学习领域的研究员。博士期间师从李飞飞。在读博期间,两次在谷歌实习,研究在 Youtube 视频上的大规模特征学习,2015 年在 DeepMind 实习,研究深度强化学习。毕业后,Karpathy 成为 OpenAI 的研究科学家,后于 2017 年 6 月加入特斯拉担任人工智能自动驾驶视觉总监。

今日他发布的这篇博客能为深度学习研究者们提供极为明晰的洞见,在 Twitter 上也引发了极大的关注。

1. 谁说神经网络训练简单了?

很多人认为开始训练神经网络是很容易的,大量库和框架号称可以用 30 行代码段解决你的数据问题,这就给大家留下了(错误的)印象:训练神经网络这件事是非常简单的,不同模块即插即用就能搭个深度模型。

简单的建模过程通常如下所示:

>>> your_data = # plug your awesome dataset here>>> model = SuperCrossValidator(SuperDuper.fit, your_data, ResNet50, SGDOptimizer)# conquer world here

这些库和示例令我们想起了熟悉标准软件及模块,标准软件中通常可以获取简洁的 API 和抽象。

例如 Request 库的使用展示如下:

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))>>> r.status_code200

酷!这些库和框架的开发者背负起理解用户 Query 字符串、url、GET/POST 请求、HTTP 连接等的大量需求,将复杂度隐藏在几行代码后面。这就是我们熟悉与期待的。

然而,神经网络不一样,它们并不是现成的技术。我在 2016 年撰写的一篇博客中试图说明这一点,在那篇文章中我认为反向传播是「leaky abstraction」,然而现在的情况似乎更加糟糕了。

Backprop + SGD 不是魔法,无法让你的网络运行;批归一化也无法奇迹般地使网络更快收敛;RNN 也不能神奇地让你直接处理文本。不要因为你可以将自己的问题表示为强化学习,就认为你应该这么做。如果你坚持在不理解技术原理的情况下去使用它,那么你很可能失败。

2. 背着我不 work 的神经网络

当你破坏代码或者错误配置代码时,你通常会得到某种异常。你在原本应该插入字符串的地方插入了整数;导入出错;该关键字不存在……此外,为了方便 debug,你还很可能为某个功能创建单元测试。

这还只是开始。训练神经网络时,有可能所有代码的句法都正确,但整个训练就是不对。可能问题出现在逻辑性(而不是句法),且很难通过单元测试找出来。

例如,你尝试截损失度而不是梯度,这会导致训练期间的异常值被忽视,但语法或维度等检测都不会出现错误。又或者,你弄错了正则化强度、学习率、衰减率、模型大小等的设置,那么幸运的话网络会报错,然而大部分时候它会继续训练,并默默地变糟……

因此,「快速激烈」的神经网络训练方式没有用,只会导致困难。现在,这些经验性困难是使神经网络正常运行的拦路虎,你需要更加周密详尽地调试网络才能减少困难,需要大量可视化来了解每一件事。

在我的经验中,深度学习成功的重要因素是耐心注重细节

如何解决

基于以上两点事实,我开发了一套将神经网络应用于新问题的特定流程。该流程严肃地执行了上述两项原则:耐心和注重细节。

具体来说,它按照从简单到复杂的方式来构建,我们在每一步都对即将发生的事作出准确的假设,然后用实验来验证假设或者调查直到发现问题。我们试图尽力阻止大量「未经验证的」复杂性一次来袭,这有可能导致永远也找不到的 bug/错误配置。如果让你像训练神经网络那样写它的代码,你会想使用非常小的学习率,然后猜测,再在每次迭代后评估整个测试集。

1. 梳理数据

训练神经网络的第一步是不要碰代码,先彻底检查自己的数据。这一步非常关键。我喜欢用大量时间浏览数千个样本,理解它们的分布,寻找其中的模式。幸运的是,人类大脑很擅长做这件事。有一次,我发现数据中包含重复的样本,还有一次我发现了损坏的图像/标签。我会查找数据不均衡和偏差。我通常还会注意自己的数据分类过程,它会揭示我们最终探索的架构。比如,只需要局部特征就够了还是需要全局语境?标签噪声多大?

此外,由于神经网络是数据集的压缩/编译版本,你能够查看网络(错误)预测,理解预测从哪里来。如果网络预测与你在数据中发现的不一致,那么一定是什么地方出问题了。

在你对数据有了一些感知之后,你可以写一些简单的代码来搜索/过滤/排序标签类型、标注规模、标注数量等,并沿任意轴可视化其分布和异常值。异常值通常能够揭示数据质量或预处理中的 bug。

2. 配置端到端训练/评估架构、获取基线结果

现在我们已经理解了数据,那我们就可以开始构建高大上的多尺度 ASPP FPN ResNet 并训练强大的模型了吗?当然还不到时候,这是一个充满荆棘的道路。我们下一步需要构建一个完整的训练、评估架构,并通过一系列实验确定我们对准确率的置信度。

在这个阶段,你们最好选择一些不会出错的简单模型,例如线性分类器或非常精简的 ConvNet 等。我们希望训练这些模型,并可视化训练损失、模型预测和其它度量指标(例如准确率)。当然在这个过程中,我们还需要基于一些明确假设,从而执行一系列对照实验(ablation experiments)。

该阶段的一些技巧与注意事项:

  • 固定随机 seed:始终使用固定的随机 seed 能保证很多属性,例如在我们两次运行相同代码时能得到相同的输出。这能消除变化因子,从进行合理的判断。

  • 简化:确保禁用不必要的技巧。例如,在这个阶段肯定需要关闭数据增强。数据增强可以在后期引入,并作为一种强大的正则化策略。不过在这个阶段引入的话,它就有机会带来一些愚蠢的 bug。

  • 使用多数据、少次数的验证评估:当我们在绘制测试损失时,我们需要在整个比较大的测试集中执行评估。不要过几个批量就绘制一次测试损失,然后再依赖 TensorBoard 的平滑处理。我们虽然追求的是准确率,但也要防止犯这些低级错误。

  • 在初始化中验证损失:验证你的损失函数在初始化中有比较合理的损失值。例如,如果你正确地初始化最终层,那么你应该通过-log(1/n_classes) 度量初始化的 Softmax 值。L2 回归和 Huber 损失函数等都有相同的默认值。

  • 优秀的初始化:正确地初始化最终层。例如,如果你正在对均值为 50 的一些数据做回归处理,那么初始化的最终偏置项就应该为 50。如果你有一个非平衡数据集(两类样本数 1:10),那么就需要在 logits 上设置偏置项,令模型在初始化时预测概率为 0.1。正确配置这些偏置项将加快收敛速度,因为网络在前面几次迭代中基本上只在学习偏置。

  • 人类基线结果:监控损失值等其他度量指标(例如准确度),这些指标应该是人类能解释并检查的。尽可能评估你自己(人类)获得的准确率,并与构建的模型做对比。或者对测试数据进行两次标注,其中一次为预测值,另一次为标注值。

  • 独立于输入的基线结果:训练一个独立于输入的基线模型,例如最简单的方法就是将所有输入都设置为 0。这样的模型应该比实际输入数据表现更差,你的模型是否准备好从任何输入中抽取任何信息?

  • 在批数据上过拟合:在单个批数据上使得过拟合(两个或多个少样本)。为此,我们需要增加模型拟合能力,并验证我们能达到的最低损失值(即 0)。我还想在同一张图中显示标签和预测值,并确保损失值一旦达到最小,它们就能完美地对齐了。

  • 验证训练损失的下降:在这一阶段,你可能希望在数据集上实现欠拟合,该阶段的模型应该是极简的。然后我们尝试增加一点模型的拟合能力,再看看训练损失是否稍微下降了一些。

  • 在输入网络前可视化:在运行模型之前,我们需要可视化数据。也就是说,我们需要可视化输入到网络的具体数据,即可视化原始张量的数据和标签。这是唯一的「真实来源」,我有很多次都是因为这个过程而节省了大量时间,并揭示了数据预处理和数据增强过程中的问题。

  • 可视化预测过程:我喜欢在训练过程中对一个固定的测试批数据进行模型预测的可视化。这展示了预测值如何变化的过程,能为我们提供关于训练过程的优秀直觉。很多时候,如果网络以某种方式小幅度波动,那么模型最可能在尝试拟合数据,这也展示了一些不稳定性。太低或太高的学习率也很容易注意到,因为抖动量比较大。

  • 使用反向传播绘制依赖性:你的深度学习代码通常包括复杂的、矢量化的、Boardcast 操作。一个常见的 bug 是,人们会无意间使用 view 而不是 transpose/permute,从而混合了批量数据中的维度信息。然而,你的网络仍然可以正常训练,只不过它们学会忽略了其它样本中的数据。一种 debug 的方法是将某些样本 i 的损失设置为 1.0,然后运行反向传播一直到输入,并确保第 i 个样本的梯度不为零。更一般的,梯度为我们提供了网络中的依赖性关系,它们在 debug 中非常有用。

  • 一般化特殊案例:这是一种更为通用的代码技巧,但是我经常看到人们在使用这些技巧时会新产生 Bug,尤其是在从头构建一般函数时。相反,我喜欢直接写非常具体的函数,它只包含我现在需要做的事情。我会先让这个函数能 work,然后再一般化好函数,并确保能取得相同的结果。通常这个过程会体现在向量化代码中,我会先用循环编写某个过程,然后再一次一个循环地将它们转化为向量化化代码。

3. 过拟合

到了这个阶段,我们应该对数据集有所了解了,而且有了完整的训练+评估流程。对于任何给定的模型,我们可以计算出我们信任的度量。而且还为独立于输入的基线准备了性能,一些 dumb 基线的性能(最好超过这些),我们人类的表现有大致的了解(并希望达到这一点)。现在,我们已经为迭代一个好的模型做好了准备。

我准备用来寻找好模型的方法有两个阶段:首先获得足够大的模型,这样它能够过拟合(即关注训练损失),然后对其进行适当的正则化(弃掉一些训练损失以改进验证损失)。我喜欢这两个阶段的原因是,如果我们不能用任何模型实现较低的误差率,则可能再次表明一些问题、bug 和配置错误。

该阶段的一些技巧与注意事项:

  • 选择模型:为了达到理想的训练损失,我们可能希望为数据选择一个合适的架构。当我们在挑选模型时,我的第一个建议即别好高骛远。我看到很多人都非常渴望一开始就堆叠一些新的模块,或创造性地用于各种异质架构,从而想一步到位做好。我建议可以找最相关的论文,并直接利用它们的简单架构,从而获得良好性能。后面再基于这个架构做修改和改进,并将我们的想法加进去就行了。

  • Adam 是一般选择:在配置基线模型地早期阶段,我喜欢使用 Adam 算法(学习率为 3e-4)。在我的经验中,Adam 对参数的容忍度更高,不太好的学习率也能获得一般的效果。对于卷积网络来说,一般经过仔细调整的 SGD 几乎总会略优于 Adam,但最佳学习率的可能区域要窄得多。

  • 一次复杂化一个:如果你有多个特性插入分类器,我建议你一个个插入,从而确保能获得期待的性能提升。不要在最开始时就一次性全加上,这样你会弄不清楚性能提升到底是哪个特性带来的。还有其它增加复杂性的方法,例如你可以先尝试插入较小的图像,然后再慢慢地加大。

  • 别相信默认的学习率衰减:如果你修改来自其它领域的代码,你应该小心使用学习率衰减方法。对于不同问题,你不仅希望使用不同的衰减策略,同时因为 Epoch 的数量不同,衰减过程也会不一样。例如数据集的大小,会影响 Epoch 的数量,而很多学习率衰减策略是直接与 Epoch 相关的。在我自己的工作中,我经常整个地关闭学习率衰减,即使用常数学习率

4. 正则化

理想情况下,我们现在至少有了一个拟合训练集的大模型。现在是时候对它进行正则化,并通过放弃一些训练准确率来提升验证准确率了。技巧包括:

  • 更多数据:首先,在当前任何实际环境中正则化模型的最好方式是增加更多真实的训练数据。在你能收集更多数据时,花费大量工程时间试图从小数据集上取得更好结果是很常见的一个错误。我认为增加更多数据是单调提升一个较好配置神经网络性能的唯一可靠方式。

  • 数据增强:比真实数据较次的方法是半假数据,试验下更激进的数据增强。

  • 创造性增强:如果半假数据也没有,假数据也还可以。人们在寻求扩展数据集的创造性方法。例如,域随机化、使用模拟数据、把数据插入场景这样机智的混合方法,甚至可以用 GAN。

  • 预训练:即使你有足够的数据,你也可以使用预训练网络,基本没什么损失。

  • 坚持监督式学习:不要对无监督学习过于激动。据我所知,没有什么无监督学习方法在当前计算机视觉任务上有很强的结果(尽管 NLP 领域现在有了 BERT 和其他类似模型,但这更多归功于文本更成熟的本质以及对噪声比更好的信号)。

  • 更小的输入维度:移除可能包含假信号的特征。如果你的数据集很小,任何加入的假输入只会增加过拟合的可能。类似地,如果低级细节作用不大,试试输入更小的图像。

  • 更小的模型:在许多情况下,你可以在网络上使用域知识约束来降低模型大小。例如,在 ImageNet 主干网络顶部使用全连接层一度很流行,但它们后来被简单的平均池化取代,消除了这一过程中大量的参数

  • 减小批大小:由于 BN 基于批量大小来做归一化,较小的批量大小具有更强的正则化效果。这主要因为一个批量的统计均值与标准差是实际均值和标准差的近似,所以缩放量和偏移量在小批量内波动地更大。

  • drop:增加 dropout。在卷积网络上使用 dropout2d(空间 dropout)。保守谨慎的使用 dropout,因为它对 batch 归一化好像不太友好。

  • 权重衰减:增加权重衰减惩罚。

  • 早停(early stopping):基于你得到的验证损失停止训练,从而在即将过拟合之前获取模型。

  • 尝试更大的模型:我过去多次发现更大模型最终都会很大程度的过拟合,但它们「早停」后的性能要比小模型好得多。

最后,为了更加确保网络是个合理的分类器,我喜欢可视化网络第一层的权重,确保自己获得了有意义的边缘。如果第一层的滤波器看起来像噪声,那需要去掉些东西。类似地,网络内的激活函数有时候也会揭示出一些问题。

5. 精调

现在你应该位于数据集一环,探索取得较低验证损失的架构模型空间。这一步的一些技巧包括:

  • 随机网格搜索:在同时精调多个参数时,使用网格搜索听起来更诱惑,能够确保覆盖到所有环境。但记住,使用随机搜索反而是最佳方式。直观上,因为神经网络对一些参数更为敏感。在极限情况下,如果参数 a 很重要,改变 b 却没有影响,然后相比于多次在固定点采样,你宁可彻底采样 a。

  • 参数优化:如今社区内有大量好的贝叶斯参数优化工具箱,我的一些朋友用过后觉得很成功。但我的个人经验是,探索好的、宽的模型空间和参数的最佳方法是找个实习生。开玩笑而已,哈哈哈。

6. 最后的压榨

一旦你找到最好的架构类型和参数,依然可以使用更多的技巧让系统变得更好:

  • 集成:模型集成是能将准确率稳定提升 2% 的一种好方式。如果你承担不起测试阶段的计算成本,试着使用《Distilling the Knowledge in a Neural Network》中的方法把你的模型蒸馏到一个网络。

  • 一直训练:我经常看到一些人在验证损失趋平时会中断模型训练,以我的经验来看,网络会长时间保持非直观的训练。寒假时有一次我忘了关掉模型训练,一月回来后发现它取得了 SOTA 结果。

结论

一旦你做到了这些,你就具备了成功的所有要素:对神经网络、数据集和问题有了足够深的了解,配置好了完整的训练/评估体系,取得高置信度的准确率,逐渐探索更复杂的模型,提升每一步的表现。现在万事俱备,就可以去读大量论文,尝试大量实验并取得 SOTA 结果了。


原文链接:https://karpathy.github.io/2019/04/25/recipe/

工程模型训练Andrej Karpathy
10
相关数据
OpenAI 机构

OpenAI是一家非营利性人工智能研究公司,旨在以惠及全人类的方式促进和发展友好的人工智能。OpenAI成立于2015年底,总部位于旧金山,旨在通过向公众开放其专利和研究与其他机构和研究人员“自由合作”。创始人的部分动机是出于对通用人工智能风险的担忧。

https://www.openai.com/
DeepMind机构

DeepMind是一家英国的人工智能公司。公司创建于2010年,最初名称是DeepMind科技(DeepMind Technologies Limited),在2014年被谷歌收购。在2010年由杰米斯·哈萨比斯,谢恩·列格和穆斯塔法·苏莱曼成立创业公司。继AlphaGo之后,Google DeepMind首席执行官杰米斯·哈萨比斯表示将研究用人工智能与人类玩其他游戏,例如即时战略游戏《星际争霸II》(StarCraft II)。深度AI如果能直接使用在其他各种不同领域,除了未来能玩不同的游戏外,例如自动驾驶、投资顾问、音乐评论、甚至司法判决等等目前需要人脑才能处理的工作,基本上也可以直接使用相同的神经网上去学而习得与人类相同的思考力。

李飞飞人物

李飞飞,斯坦福大学计算机科学系教授,斯坦福视觉实验室负责人,斯坦福大学人工智能实验室(SAIL)前负责人。专业领域是计算机视觉和认知神经科学。2016年11月李飞飞加入谷歌,担任谷歌云AI/ML首席科学家。2018年9月,返回斯坦福任教,现为谷歌云AI/ML顾问。10月20日斯坦福大学「以人为中心的AI计划」开启,李飞飞担任联合负责人。11月20日李飞飞不再担任SAIL负责人,Christopher Manning接任该职位。

深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

自动驾驶技术技术

从 20 世纪 80 年代首次成功演示以来(Dickmanns & Mysliwetz (1992); Dickmanns & Graefe (1988); Thorpe et al. (1988)),自动驾驶汽车领域已经取得了巨大进展。尽管有了这些进展,但在任意复杂环境中实现完全自动驾驶导航仍被认为还需要数十年的发展。原因有两个:首先,在复杂的动态环境中运行的自动驾驶系统需要人工智能归纳不可预测的情境,从而进行实时推论。第二,信息性决策需要准确的感知,目前大部分已有的计算机视觉系统有一定的错误率,这是自动驾驶导航所无法接受的。

线性分类器技术

机器学习通过使用对象的特征来识别它所属的类(或组)来进行统计分类。线性分类器通过基于特征的线性组合的值进行分类决策。 对象的特征也称为特征值,通常在称为特征向量的向量中呈现给机器。

网格搜索技术

网格搜索是一项模型超参数优化技术,常用于优化三个或者更少数量的超参数,本质是一种穷举法。对于每个超参数,使用者选择一个较小的有限集去探索。然后,这些超参数笛卡尔乘积得到若干组超参数。网格搜索使用每组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

深度强化学习技术

强化学习(Reinforcement Learning)是主体(agent)通过与周围环境的交互来进行学习。强化学习主体(RL agent)每采取一次动作(action)就会得到一个相应的数值奖励(numerical reward),这个奖励表示此次动作的好坏。通过与环境的交互,综合考虑过去的经验(exploitation)和未知的探索(exploration),强化学习主体通过试错的方式(trial and error)学会如何采取下一步的动作,而无需人类显性地告诉它该采取哪个动作。强化学习主体的目标是学习通过执行一系列的动作来最大化累积的奖励(accumulated reward)。 一般来说,真实世界中的强化学习问题包括巨大的状态空间(state spaces)和动作空间(action spaces),传统的强化学习方法会受限于维数灾难(curse of dimensionality)。借助于深度学习中的神经网络,强化学习主体可以直接从原始输入数据(如游戏图像)中提取和学习特征知识,然后根据提取出的特征信息再利用传统的强化学习算法(如TD Learning,SARSA,Q-Learnin)学习控制策略(如游戏策略),而无需人工提取或启发式学习特征。这种结合了深度学习的强化学习方法称为深度强化学习。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

欠拟合技术

使用太少参数,以致于不能很好的拟合数据,称为拟合不足(欠拟合)现象

感知技术

知觉或感知是外界刺激作用于感官时,脑对外界的整体的看法和理解,为我们对外界的感官信息进行组织和解释。在认知科学中,也可看作一组程序,包括获取信息、理解信息、筛选信息、组织信息。与感觉不同,知觉反映的是由对象的各样属性及关系构成的整体。

超参数优化技术

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

TensorBoard技术

一个信息中心,用于显示在执行一个或多个 TensorFlow 程序期间保存的摘要信息。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

正则化技术

当模型的复杂度增大时,训练误差会逐渐减小并趋向于0;而测试误差会先减小,达到最小值后又增大。当选择的模型复杂度过大时,过拟合现象就会发生。这样,在学习时就要防止过拟合。进行最优模型的选择,即选择复杂度适当的模型,以达到使测试误差最小的学习目的。

随机搜索技术

动量技术

优化器的一种,是模拟物理里动量的概念,其在相关方向可以加速SGD,抑制振荡,从而加快收敛

批归一化技术

批归一化(Batch Normalization,BN)由谷歌于2015年提出,是一个深度神经网络训练的技巧,它不仅可以加快模型的收敛速度,还能在一定程度上缓解深层网络中的“梯度弥散”问题,从而使得训练深层网络模型更加容易和稳定。目前BN已经成为几乎所有卷积神经网络的标配技巧了。从字面意思看来Batch Normalization(简称BN)就是对每一批数据进行归一化。

强化学习技术

强化学习是一种试错方法,其目标是让软件智能体在特定环境中能够采取回报最大化的行为。强化学习在马尔可夫决策过程环境中主要使用的技术是动态规划(Dynamic Programming)。流行的强化学习方法包括自适应动态规划(ADP)、时间差分(TD)学习、状态-动作-回报-状态-动作(SARSA)算法、Q 学习、深度强化学习(DQN);其应用包括下棋类游戏、机器人控制和工作调度等。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

推荐文章
暂无评论
暂无评论~