内心深处:自动编码器
自动编码器(AE)是神经网络,旨在将它们的输入复制到它们的输出。他们通过将输入压缩到一个潜在空间 表示中,然后从这个表示中重建输出。这种网络由两部分组成:
- 编码器:这是网络的一部分,它将输入压缩成潜在空间表示。可以用编码函数 h=f(x) 来表示。
- **解码器:**该部分旨在从潜在空间表示中重建输入。可以用解码函数 r=g(h) 来表示。
Architecture of an Autoencoder
因此,自动编码器作为一个整体可以由函数 g(f(x)) = r 来描述,其中您希望***【r***与原始输入 x 一样接近。
为什么要将输入复制到输出?
如果自动编码器的唯一目的是将输入复制到输出,那么它们将毫无用处。事实上,我们希望通过训练自动编码器将输入复制到输出,潜在表示将呈现有用的属性。
这可以通过对复制任务创建约束来实现。从自动编码器获得有用特征的一种方式是约束使其尺寸小于 x ,在这种情况下,自动编码器被称为欠完成。通过训练欠完整表示,我们迫使自动编码器学习训练数据的最显著特征。如果给自动编码器太多的容量,它可以学习执行复制任务,而不提取任何关于数据分布的有用信息。如果潜在表示的尺寸与输入相同,以及在过完全的情况下,潜在表示的尺寸大于输入,也会发生这种情况。在这些情况下,即使线性编码器和线性解码器也可以学习将输入复制到输出,而无需学习任何关于数据分布的有用信息。理想情况下,可以成功地训练自动编码器的任何体系结构,根据要建模的分布的复杂性选择编码维数以及编码器和解码器的容量。**
自动编码器的用途是什么?
今天数据去噪和用于数据可视化的降维被认为是自动编码器的两个主要有趣的实际应用。通过适当的维度和稀疏性约束,自动编码器可以学习比 PCA 或其他基本技术更有趣的数据投影。
自动编码器是从数据示例中自动学习的。这意味着很容易训练将在特定类型的输入上表现良好的算法的专门实例,并且它不需要任何新的工程,只需要适当的训练数据。
然而,自动编码器在图像压缩方面表现不佳。当自动编码器在给定的数据集上被训练时,它将在与所使用的训练集相似的数据上实现合理的压缩结果,但是将是较差的通用图像压缩器。像 JPEG 这样的压缩技术会好得多。
自动编码器被训练为当输入通过编码器然后通过解码器时尽可能多地保留信息,但是也被训练为使新的表示具有各种良好的属性。不同种类的自动编码器旨在实现不同种类的属性。我们将重点讨论四种类型的自动编码器。
自动编码器的类型:
在本文中,将描述以下四种类型的自动编码器:
- 标准自动编码器
- 多层自动编码器
- 卷积自动编码器
- 正则化自动编码器
为了说明不同类型的自动编码器,我们使用 Keras 框架和 MNIST 数据集创建了一个示例。每种自动编码器的代码都可以在我的 GitHub 上找到。
标准自动编码器
在其最简单的形式中,自动编码器是三层网络,即具有一个隐藏层的神经网络。输入和输出是相同的,我们学习如何重建输入,例如使用 adam 优化器和均方误差损失函数**。**
这里,我们看到我们有一个欠完成自动编码器,因为隐藏层尺寸(64)小于输入(784)。这种约束将迫使我们的神经网络学习数据的压缩表示。
多层自动编码器
如果一个隐藏层不够,我们显然可以将自动编码器扩展到更多的隐藏层。
现在我们的实现使用 3 个隐藏层,而不是只有一个。可以选择任何隐藏图层作为要素制图表达,但我们将使网络对称,并使用最中间的图层。
卷积自动编码器
我们也可以问自己:自动编码器可以用于卷积而不是全连接层吗?
答案是肯定的,原理是相同的,但是使用图像(3D 矢量)而不是扁平的 1D 矢量。对输入图像进行下采样,以给出较小尺寸的潜在表示,并迫使自动编码器学习图像的压缩版本。
正则化自动编码器
除了施加比输入维度更小的隐藏层之外,还有其他方法可以约束自动编码器的重构。正则化的自动编码器不是通过保持编码器和解码器浅和代码大小小来限制模型容量,而是使用损失函数来鼓励模型具有除了将其输入复制到其输出的能力之外的其他属性。在实践中,我们通常会发现两种类型的正则化自动编码器:稀疏的 T2 自动编码器和去噪的 T4 自动编码器。
****稀疏自动编码器:稀疏自动编码器通常用于学习另一个任务的特征,例如分类。已经被正则化为稀疏的自动编码器必须响应它已经被训练的数据集的独特统计特征,而不是简单地充当身份函数。通过这种方式,以稀疏性为代价执行复制任务的训练可以产生一个附带学到有用特征的模型。
我们可以约束自动编码器的重构的另一种方式是对其损耗施加约束。例如,我们可以在损失函数中加入一个正则项。这样做将使我们的自动编码器学习数据的稀疏表示。
请注意,在我们的隐藏层中,我们添加了一个 l1 活动正则化器,它将在优化阶段对损失函数应用惩罚。因此,与普通的自动编码器相比,这种表示更加稀疏。
****去噪自动编码器:通过改变损失函数的重建误差项,我们可以获得一个自动编码器,它可以学习一些有用的东西,而不是向损失函数添加惩罚。这可以通过在输入图像中添加一些噪声,并让自动编码器学习去除噪声来实现。通过这种方式,编码器将提取最重要的特征,并学习数据的鲁棒表示。
摘要
在本文中,我们介绍了自动编码器的基本架构。我们还研究了许多不同类型的自动编码器:普通的、多层的、卷积的和正则化的。每一种都有不同的属性,这取决于所施加的约束:要么是隐藏层的维度减少,要么是另一种惩罚。
我希望这篇文章对新的深度学习实践者来说是清晰和有用的,并且它让你对什么是自动编码器有了很好的了解!如果有不清楚的地方,请随时给我反馈或问我问题。
在 GitHub 上创建一个帐户,为 Autoencoders 的开发做出贡献。
github.com](https://github.com/nathanhubens/Autoencoders)**
隐藏在深度学习下的深层问题:
对吴恩达深度学习 Coursera 专业化的思考
TL;DR——我强烈推荐这个 MOOC 专业。但是,要注意!这不仅仅是另一张证书。更深层次的问题潜伏在表面之下,促使您更深入地思考使用这项新技术的责任。
读者注意(2018–06–07):文章分为两部分。第一部分描述了面向数字图书馆潜在学生的 MOOC 课程。第二部分探讨了“那又怎样?”含义,尤其是 DL 实践者的责任。
我最近完成了 Coursera 深度学习(DL)专业化课程,包括 5 门课程、14 个课程周、180 个视频、29 个实验室和 5 次“英雄”访谈。[01]
我的动机是学习一项新技能,我做到了。然而,我也带走了许多问题和顾虑,以及一系列需要调查的项目。如果你致力于这一专业,你将获得更多的-另一个证书!以下是我对这一经历及其在更大背景下的意义的思考。
我的经历
DeepLearning.ai 的吴恩达和斯坦福以一种人性化的风格教授这门课程,在适当的时候逐步揭示细节。他有理解学生在努力学习这门复杂学科时的想法的天赋。他的任务是培训数百万专业人员使用人工智能工具,“这样他们就可以去发明没有大公司能做的事情。”[02]
我在 2013 年上过 Ng 的机器学习课程,用的是 Octave,很兴奋能用 Python 更深入。2017 年 9 月,我开始了五门课程中的第一门。我立刻注意到,Coursera 在这四年里对他们的 MOOC 基础设施进行了许多学习改进。以下是我学习经历中难忘的元素。
了解你的数学!
像第一个课程一样,主题流从基础数学开始,并使用逻辑回归的经典例子将其转化为工作代码。然而,我注意到对符号(尤其是奇怪的上标)的更多强调,就像我们在构建更复杂的东西一样。我是正确的!我很快了解到 NumPy 是你的朋友,它支持向量化重构代码。*回见。嗯,不完全是。*我最终了解到,矢量化是为深度神经网络粉碎张量的核心,为实际应用提供了必要的计算能力。
复古粉笔对话
视频很短,平均 7 分钟。Ng 以复古的粉笔演讲风格进行了演讲——从一张白纸开始,用几乎无法辨认的脚本详细地写下一切*。*我很快适应了他的风格,在每个片段结束时捕捉最终屏幕,粘贴到 PowerPoint 中,并添加更多评论。还提供了 MP3 视频和粗略的 TXT 翻译。
只是-足够的测验
每周,讲座都以一个简短的多项选择题测验结束。起初,这些小测验很烦人,但事实证明它们击中了关键点,足以确保我关注视频。
英雄访谈
令人高兴的是“英雄”访谈,Ng 将采访 DL 研究人员关于深度学习的历史和里程碑。后面课程的英雄视频我都错过了!Ng 是不是英雄用完了?
填空实验室
最好的部分是实验室,由特定结构内的填空组成。这也是使用 Jupyter 笔记本进行教学的一个很好的例子,清晰详细的说明激励学生进行编码并获得即时反馈。因此,学生被激励去学习良好的实践,小心翼翼地插入调试语句和仔细地关注单元测试。
与实验室的薄弱环节是自动评分程序,这是草率的,有时很奇怪。*DL 的巨大应用前景!*这个小故障迫使学生花费额外的时间来理解算法中的数学到代码的转换和数据流。凭借极大的耐心、论坛评论和 StackOverflow,我能够找到解决方案,通常是预计时间的两倍。
软性截止日期
我偶尔会面临提交实验的最后期限,这增加了完成实验的戏剧性和满足感。这些截止日期是“软”的,只是将课程完成时间推迟到下一个月周期(不损失之前的工作)。我发现截止日期对我来说是有益的,就像任何忙碌的专业人士一样。
付钱还是不付钱
你可以作为一名审计员免费参加整个专业化认证!我是这样开始的,直到第一次测验。审核员不会对他们的测验或实验评分。你可以做实验,但是你不会收到自动评分系统的反馈。在我的专业阶段,我不需要另一个证书。但是,我需要反馈!而且,这个反馈确实提高了我的学习质量。
最佳实践
在第一次基础课程后,我期待着与性感的 CNN 和 RNN 模特一起处理图像和自然语言的令人兴奋的事情。令我失望的是,Ng 将接下来的两门课程重点放在了神经网络调优的实践方面(测试/开发、正则化、偏差/方差、小批量、超参数调优)和结构化开发项目(评估指标、人的水平性能、错误分析)。真扫兴!
事后看来,这两门课程是整个专业中更有洞察力的。Ng 在深度学习的艺术方面指导我们,强调不断发展的最佳实践及其实验性质。结合“英雄”访谈,Ng 向我介绍了 DL 专业人士社区。手感不错!
全栈
最后,这种专业化让我掌握了在 Python、NumPy、TensorFlow 和 Keras 的全套工具上设计和实现深度神经网络的技能,以及熟悉基于云的编程环境,如 Jupyter 笔记本。我经常将实验室笔记本文件(和其他相关文件)复制到我的本地 Anaconda3 环境中,并且不加修改地执行。为了增加计算能力,我安装了一个 GTX1060 卡。令我惊讶的是,无论是本地还是基于云的 DL 技术变得如此方便和平易近人。
那又怎样?
完成 DL 专业后,我感到宽慰的是我的时间被释放了,而悲伤的是安德鲁的粉笔演讲结束了。我花了很多时间学习这个复杂的学科。然而,我学到了什么持久的意义?这只是区分狗和猫的可爱方法吗?把梵高的风格应用到朋友的照片上?深度学习有实用价值和社会救赎的潜力吗?
经过这么多努力,那又怎样?
意义的问题一直在我脑海中翻腾。所以,我回到第一堂课,整理了一份完整的专业化大纲(十页纸!).是的,有很多材料。但是,我突然意识到,我的“哦,我的上帝”时刻到了!
DL 的意义在于揭示关于思考和学习的基本原理,而不是通过模仿人脑(它只是肤浅地模仿)。相反,DL 使人类能够在几个具有挑战性的智力任务中创造出超过“人类水平的性能”的算法。换句话说,…
我们人类已经创造了足够聪明的工具来超越我们自己!
这不是通常的超级智能机器人因为我们的自卑而决定消灭人类的科幻故事。真正的问题是在大型系统中嵌入 DL 应用程序的意想不到的后果,如脸书、亚马逊、谷歌和其他影响许多人生活的公司。此外,这些数字图书馆的应用将在未来几年大幅增加!
我的见解
下面是我从上面得出的一些见解?
以数据开始和结束
一张简单而深刻的 Ng 幻灯片的标题是“规模推动 DL 进步”,如下图所示。
From Coursera Course “Neural Networks & Deep Learning” by Andrew Ng
对于任何预测算法,预测的性能(或准确性)都受到数据量的严重影响。数据必须是有质量标签的数据,其中观察正确地反映了现实,并标有“良好”指标。蹩脚或贴错标签的数据不算!
这里有几点需要注意…
- 更多的数据总是胜过更少的数据!控制最多数据的公司最终会战胜所有其他公司!
- 在低数据量的情况下,任何预测算法都和其他算法一样好。所以 DL 没有优势;因此,使用传统的机器学习算法(如随机森林),因为它们更容易,更快,并提供更好的可解释性。
- 在高数据量的情况下,深度神经网络可以显著提高性能。
- 绩效往往是不明确的。测试数据的预测准确性(正确预测/总预测)经常被使用,但是这对于许多用例可能是误导的。在这里深入挖掘!
洞察力是…一切都依赖于数据,这是 DL 的“阿喀琉斯之踵”。将数据视为有价值的资产。
数据不仅仅是数字
在实验室中,我对数据的想法发生了微妙的转变。作为商业智能的背景,我一直认为数据是一个大数字表中的行(实例)和列(特征)。处理图像和音乐会动摇这种心态。
我清楚地记得 Ng 的 Octave 实验室处理一位数的图像(来自 MNIST)。每个像素的灰度值被放入一个长的线性阵列(特征),使像素的 x-y 位置的任何指示无效。我认为这种做法不会产生任何有用的结果。*这怎么可能?*然而这个简单的一层神经网络达到了 82%的准确率。惊喜!
在最新的 Ng 的 CNN 课程中,我们学习了如何应用卷积变换,它确实保留了位置信息。预测精度提高到 90%以上,超过了人类的水平。太神奇了!
重点是,DL 要求同时从两个角度查看数据:
- 以矩阵形式构造的数字,可在 GPU 上进行高效计算。在这里,形状(维度大小的向量)对于矩阵计算是至关重要的,更重要的是,保持矩阵的意义。每次我弄乱形状的顺序,都是因为我忘记了矩阵的意义,尤其是它与数学的对应关系。
- 现实的碎片,每一个都有其独特的品质。自然抗拒被数字化,无论是作为图像、声音、振动等等。对我来说,这在 RNN 的课程中很明显,处理音乐中的序列模式。通常,我不得不提醒自己,这些数字实际上是一个爵士钢琴家打出的旋律,数字化成 MIDI 编码。现在,我可以正确地处理观点 1。
这种观点认为,数据具有数字和现实的双重性格,两者的完全共存对任何人来说都是难以维持的。
近乎炼金术
DL 是一门正在努力寻找其理论的原始科学。*想想 17 世纪的化学。*因为 DL 缺乏坚实的理论,研究人员正在尝试模型结构、成本函数、数据转换等疯狂的想法。而且,这些疯狂的想法已经产生了惊人的效果!这太令人兴奋了!
但是,这也让 DL 的新生感到困惑。所以,当一个学生问,“为什么要使用盗梦网络”,答案通常是“因为它能产生更高的测试准确度”。真实的回答应该是“因为我们不确定要做什么,所以我们正在尝试一切可能的方法”。
正如在 Geoffrey Hinton 的“英雄”采访中所讨论的,原始科学的斗争在随机梯度下降(SGD)与反向传播的结合中最为明显。这是可行的,但是如何在一个非平凡的网络中理解和优化它的过程呢?辛顿表示,他对 SGD“深表怀疑”,也许应该“扔掉它,重新开始”。相反,他强调对无监督学习的研究,这可能意味着“摆脱反向传播”。[03]
其观点是,DL 是一门实验性的原始科学,缺乏坚实的理论指导。拥抱它!适当地促进其成熟。同时,认识到一个人有很大的责任去坚定地基于好的数据不断地测试算法性能的准确性。
想象一下出现在法庭上解释为什么你控制自动驾驶汽车的 DL 算法导致了一起死亡事故。因此,要对你的模型的有效性着迷甚至偏执![04]
元学习是新的秘方
在我看来,DL 正在迅速超越 SGD,进入一些人称为“元学习”的模糊领域——意识到并控制学习(模型训练)过程。[05]
作为元学习的一瞥,我特别着迷于 ng 的讲座和实验室:
- 人脸识别,重新使用预先训练好的模型将其权重“转移”到新的应用程序中。
- 神经风格转移,戏弄成本函数以平衡内容与风格激活。
- 爵士乐独奏,欺骗一个预先训练好的模型,生成一个可能的输入数据序列。
- 去除词向量的偏见,用类比来检测和纠正性别偏见。
- 语言翻译,通过管理注意力放置节点来增强。
我的兴趣促使我学习各种元学习方法,例如:
- AlphaGo Zero 证明了问题域(如围棋)的良好模拟可以替代生成标记数据,使用生成式对抗网络(GAN)。
- 由 Hinton 引入的胶囊网络 (CapsNet),用于纠正图像分类器中的缺陷。
- 通过遗传进化算法优化 DNN 类型、组件和超参数。
这个观点是,人们应该急切地探索 DL 的新秘方——元学习。
智能可扩展学习的潜力
对我来说,从这些 DL 课程中可以明显看出,MOOC 基础设施在最近几年已经成熟。当我观看视频、参加测验和在实验室工作时,我生成了大量的点击数据,这些数据可以用测验分数和实验室完成情况来标记。鉴于论坛上的活动,我是数百名(也许数千名)其他学生中的一员。随着课程设置的持续循环,这种点击数据的积累将对指导学习过程非常有用。[06]
我们能设计和训练一个 DNN 模型来指导为新生定制的有效学习吗?把这个学习过程想象成一个旅行到目的地的冒险游戏。一路上有许多难题有待解决。并且,许多路径都是可能的。到达目的地,你就获得了认证。
不仅仅是深度学习的主题,这种方法也适用于成千上万的其他主题。此外,如果可以为一名学生提供定制学习,那么这种定制学习可以扩展到数千名新学生,最终成熟为全球学习服务。
问题是……我们现在有技术为全世界提供智能的可扩展学习资源吗?维基百科的‘教学’?涡轮增压的卡恩学院?
我的新超能力
最后,我的思绪回到了 DL 的社会和伦理含义上。在他的最后一个视频中,吴恩达祝贺他的学生完成了这个专业,并敦促他们进一步发展自己的职业生涯,追求自己的梦想。
From Coursera Course “Sequence Models” by Andrew Ng
ng 进一步将深度学习的学习比作一个人获得了使计算机能够看到、合成艺术和音乐、翻译语言和诊断放射图像的超能力。他接着敦促道:
做你认为对人类最好的工作。
当今世界面临诸多挑战。但是借助深度学习的力量,我认为我们可以把它变成一个更好的地方。
现在你有了这种超能力,我希望你能利用它走出去
,让自己和他人的生活变得更好。[07]
他的观点是…
伟大的能力意味着伟大的责任。
深度学习赋予我们巨大的力量,也赋予我们巨大的责任去明智地使用它,造福人类。
作为促进这种责任的一个积极的实质性例子,Francois Chollet 最近提出,深度学习工具不应该被用来操纵人。相反,深度学习应该让人们能够控制这些工具,以追求自己的目标和激情。[08]
一些专家将深度学习比作人类的其他重大发明,如核能。如果这种比较是正确的,那么它是一个非常发人深省的想法。
参考
[01] Coursera,《深度学习专业化》。链接所有五个球场现在都是每月循环一次。关于其内容的概述,请参见泰丝·费兰德斯 2018 年 3 月 8 日撰写的精彩的 28 页幻灯片笔记。另外,Ryan Shrott 的关于“11 个经验教训”的文章是这些课程中教授的概念的一个很好的例子。
[02] Knight,“吴恩达的下一招:培养一百万人工智能专家”,《麻省理工科技评论》,8 月 8 日。2017.链接采访聚焦 ng 的在线课程和他培养新人工智能专家的目标。《麻省理工科技评论》29:18 吴恩达谈论人工智能状态的精彩视频。链接一条评论称“Ng 是煤矿里最完美的金丝雀。只要他不抓狂,我们应该相对安全。”
[03]莱文,《人工智能先驱说我们需要重新开始》,Axios,2017 年 9 月 15 日。链接
[04] Moore,“关于深度学习的深层误解”,走向数据科学,2018 年 1 月 26 日。链接开发 DL 应用的最佳实践。我是偏执狂!我的模特是故意骗我的!它是来抓我的!
[05]元学习的定义是从这个维基百科条目中提炼出来的。
关于 DL 元学习的不太密集的文章正在出现,比如:
- Perez,《深度元学习的方法分类学》,直觉机器,2017 年 3 月 5 日。链接
- Rodriguez,《深度学习研究的新进展:理解元学习》,走向数据科学,2018 年 3 月 15 日。链接
- Miikkulainen 等,《进化中的深度神经网络》,arXiv,2017 年 3 月 1 日。 link CoDeepNEAT 通过遗传进化算法优化 DNN 类型、组件和超参数。
[06]在上面的注释#02 中,吴恩达评论道,Coursera 已经检查了 MOOC 交互数据,以实现“教育本身的自动化”。
[07] Ng,“结论和感谢”视频,Coursera 课程“序列模型”,第 3 周。
[08] Chollet,《AI 让我担心什么》,2018 年 3 月 28 日。链接
如果您从这篇文章中受益,请支持 my Patreon 创建并指导小型经理同行小组,以探索由深度学习实现的分析系统的关键管理问题。如果同事对该计划感兴趣,请分享链接或推文。谢谢,理查德
深层潜在因素模型与反投影变分推理
Multivariate normally distributed factors generate the image together with complex f(.) function. (Just an illustration of a process)
我们周围的材料,我们正在目睹的过程和场合,我们拥有的数据集都是我们的观察结果,自然界中有生成模型,我们无法观察但可以生成这些观察结果。潜在因素模型从概率上描述了我们对观察结果生成过程的信念。今天的主题是深度潜在因素模型,这是一种试图用低维(希望是可解释的)因素解释高维复杂数据的统计模型。在深层潜在因素模型中,我们假设有一个复杂的函数,它接受很少的潜在因素作为输入,并生成我们观察到的复杂输出。
人们可能有各种动机去使用潜在因素模型。可解释性显然是其中之一。想象一下,我们找到了产生面部图像的可解释因素。我们有决定头发形状的因素,决定眼睛颜色的因素,以及决定性别的因素。如果我们有这些因素,我们将能够通过指定它们的一些属性来生成全新的面孔。你可能会说 GANs 也会产生新的看不见的面孔。但是记住 GANs 是从估计的概率分布中抽取样本,完全随机,GANs 中没有属性规范(至少据我所知是这样的。有大量的 GAN 模型,很难跟上人工智能的最新发展。打破维度的诅咒是另一个动机。如果数据的维数很大,并且我们想要训练分类模型,则需要学习的参数数量也很高,并且对于一个良好概括的模型来说需要大量数据。通过降低维度,我们还减少了参数的数量,因此学习所需的数据更少。降维对于可视化也很有用,尤其是当维度可以降到 2 或 3 的时候。这些只是使用潜在因素模型的少数动机。
快速提示:了解一些期望值最大化算法的知识是理解本文其余部分的先决条件。在毕晓普的《模式识别与机器学习》一书中可以找到见解清晰、数学优雅的精彩章节。
A general graphical representation of latent factor models. z represents latent variable vector. x is observation vector and there are N observations.
开始时,我们假设有模型参数θ,我们希望应用最大似然参数估计,即设置参数以使似然分布达到最大值。如果我们知道每个数据的 z 值,估计参数就相当容易了(更多信息,请看看我在 GLM 的文章)。记住,我们的任务之一是估计将 z 值映射到 x 值的参数。如果我们不知道 z 值,那怎么可能呢?EM 算法为我们提供了一种通过迭代应用期望和最大化步骤来实现它的方法。让我们通过定义目标来钻研数学
Maximum likelihood objective function where X and Z represent all the observations and latent variables respectively. Theta is model parameter(s).
不幸的是,由于需要求和的元素呈指数增长,上述目标包含难以处理的求和操作。为了克服这个问题,我们引入了一个 q(Z)项,并利用詹森不等式找到对数似然的一个下界。
Lower bound to log-likelihood which is a function of q and theta
寻找对数似然性下限背后的动机是,虽然我们不能直接评估对数似然性,但我们可以评估下限,以便我们可以获得关于对数似然性的信息。为此,我们重新排列了下界项,并把它写成对数似然项和一个附加散度项之和。
loglikelihood can be written as summation of Lower bound and reverse-KL divergence terms
KL 散度是一种非对称度量,度量两个概率分布之间的散度,当两个分布相同时,取 0 的值为最小值。正如你所看到的,当 KL 散度取最小值时,对数似然变得等于下限。因此,我们需要使 q(Z)等于 Z p(Z|X)的后部,以使 KL 散度为 0。让我们用 p(Z|X)代替 q(Z)重写 lower bound。
Changing the q(Z) terms with the posterior of Z which is calculated for the old theta parameters
现在,我们可以评估旧θ参数的对数似然值,它基本上等于旧θ的下限值。但是下限值可以通过优化θ值来增加。下限的第二项仅包括旧的θ参数,对于该部分没有任何作用。但是可以进一步优化第一部分,并且可以增加下界的值。这也意味着对数似然性可以通过估计新的θ值来进一步增加。当你仔细观察第一部分时,你会发现它是一个期望项,对这个期望项求值就形成了 EM 算法的 E 部分。E 步包含了 Z 的后验的推断,所以我们可以用推断步来重命名 E 步。通过估计新的模型参数来最大化下界,这叫 M 步,但我觉得叫学习步没有错。考虑到文章接下来的部分,我倾向于重命名 E 和 M 步骤。
E and M steps
寻找潜在因素的后验并不总是容易的,尤其是当我们处理复杂的模型时。这一次,我们不是精确地计算后验概率,而是用一个具有可变参数φ的建议分布 q(z)来逼近它。在这种情况下,我们假设没有模型参数。
We assume there are no model parameters theta, and we approximate to p(Z|X) by tuning variational parameters phi.
在这种情况下,对数似然是常数,不随 q 和 phi 的选择而变化,但我们不能直接评估它。我们需要做的是巧妙地选择一个变分分布 q(我们试图选择一个与 z 的后验分布尽可能相似的分布族)并优化它的参数φ,以便减小原始后验分布和建议分布之间的 KL 散度。换句话说,我们通过调整输入 q 和 phi 来逼近具有下限的对数似然。寻找函数 q 是变分法的主题,但是对于完全分解的 q(平均场近似),q 的形式是已知的(更多信息请看 Bishop 的书)。这个过程被称为变分贝叶斯。
在下一部分,我们将深入到深层潜在因素模型的变分推理的细节,我将介绍著名的变分自动编码器。在这之前,我们将重新安排一下下限方程。
Rearranging lower bound equation
如果模型也有参数呢?然后下界变成 q,theta,和 phi 的函数。
Lower bound is the function of q, theta, phi
为了使问题更简单,我们可以通过考虑共轭性来仔细设计模型,并使用全分解的 q 函数来不优化关于 q 的目标函数。因此,下界需要关于模型参数θ和变分参数φ进行优化。模型参数的估计就是 e M 算法的 M 步。另一方面,变分参数估计与寻找潜在变量的后验有关,因此它是一个推理步骤,构成了 EM 算法的 E 步骤。我们称这个全过程为变分 EM。
现在考虑一个具有高斯似然的复杂模型,其中均值和协方差是接受潜在因子 z 作为输入的神经网络。我们还将潜在因素的先验分布定义如下。
A complex generative model
用经典的变分推理方法很难对如此复杂的模型做出有效的推理。变分推理的最新进展使我们能够在这些复杂的模型中进行推理。在上面的模型中,我们想要估计的模型参数(θ)只不过是神经网络的权重。
对于推理,我们将高斯分布指定为变分分布族,但这次我们定义了神经网络结构,该结构将观察值映射到变分分布的均值和协方差(我们可能不喜欢使用观察和推理网络,但在可能的情况下使用它们是明智的)。所以变分 EM 部分的目标变成了
Lower bound for stochastic training
Inference network
有趣的是,观察到每个潜在特征(z_i)都有它自己的变分参数(均值和协方差矩阵),但是这些参数是由作为推理网络权重的观测值(x_i)和全局变分参数(phi)产生的。
深度学习社会更喜欢使用损失函数作为目标,因此我们可以最小化它的负值,而不是最大化下界。
Loss function
损失函数定义了一个自动编码器,因为它的第一项试图重建涉及解码器的观测值,而第二项通过试图使观测值尽可能接近先验值来将观测值编码成潜在表示。
KL divergence between two multivariate Gaussians
损失函数的第二项是两个多元高斯函数之间的 KL 散度,我们知道它的形式。该表达式取决于变分参数φ,并且该项将随着随机梯度下降而相对于φ进行优化。
Monte Carlo integration to estimate expectation
第一项是一个期望值,我们可以用蒙特卡罗积分来估计它,而不是用解析方法计算(我们不能)。这里的问题是,在从 q(z|x)采样 z 之后,我们失去了与变分参数的所有联系,并且不能优化 w.r.t .变分参数项,尽管该项依赖于它们。重新参数化技巧是克服这个问题的好方法。
Reparametrization trick
在重新参数化技巧中,我们将样本 z 写成具有参数μ和适马的确定性函数的输出,输入ε是来自零均值单位方差正态分布的样本。现在我们可以用链式法则(dE/dz * dz/dphi)优化 w.r.t .变分参数项。
在这篇文章中,我试图从众所周知的 EM 算法开始解释变分自动编码器的基本思想。有趣的是,通过在目标函数中引入具有小更新的推理网络,我们得到了一种特殊类型的正则化自动编码器,这使得我们能够运行具有反向传播算法的变分 EM 的 E 和 M 步骤。
参考
金玛、迪德里克·p 和马克斯·韦林。“自动编码变分贝叶斯” arXiv 预印本 arXiv:1312.6114 (2013)。
毕晓普的模式识别和机器学习书
深度学习#1:设置 AWS 和图像识别
这篇文章是深度学习系列文章的一部分。检出部分 2 此处 和部分 3 此处 。
This week: classifying images of cats and dogs
欢迎来到这个实用深度学习系列的第一篇文章。在这个条目中,我将设置 Amazon Web Services (AWS)实例,并使用一个预先训练好的模型对猫和狗的图像进行分类。
在这个完整的系列中,我将在博客中记录我在快速人工智能深度学习课程的第一部分中的过程。这门课程最初是在旧金山大学的数据学院开设的,现在作为 MOOC 开放。最近作者给出了课程的第二部分,将在几个月后在网上提供。学习这门课程的主要原因是我对深度学习的极大兴趣。我发现了许多关于机器学习的在线资源,但关于深度学习的实用课程似乎很少。深度学习似乎是一个排他性的群体,只是更难进入而已。开始深度学习首先需要的是一个 GPU。在本课程中,我们使用 AWS 中的 p2 实例。让我们开始吧。
这门课的第一周主要是设置。让你的深度学习设置正确可能需要一段时间,重要的是让一切正常工作。这包括设置 AWS、创建和配置 GPU 实例、设置 ssh-ing 到服务器的过程以及管理您的目录。
我在实习笔记本电脑上遇到了一些权限问题。让我给你一个建议,可以节省很多时间来绕过它:在尝试这样做之前,确保你在你的笔记本电脑上有完全的管理员权限。一些可爱的工程师提出为我设置 GPU 实例,但他们没有时间很快完成。所以我决定亲自动手。
设置 AWS 实例的脚本是用 bash 编写的。如果你在一台 Windows 机器上工作,你将需要一个能处理这个的程序。我用的是 Cygwin。我想分享一些我在安装过程中遇到的问题(及其解决方案)。如果你没有跟随快速人工智能课程,只是跟着阅读,你可以跳过这一步。我在安装过程中遇到的一些问题是:
- bash 脚本抛出一个错误
我读过一些对此可能的解释,但没有一个明确的解决方案对我有效。Github 上的课程设置脚本现在分为两个脚本:setup_p2.sh 和 setup_instance.sh。如果您无法使用这两个脚本,您可以使用这个脚本来设置您的 p2 实例。如果脚本不运行,请确保也尝试原始版本。
我在 aws-alias.sh 脚本中遇到了类似的问题。在第 7 行末尾添加一个’修复了这个问题。下面是第 7 行的前后一段:
alias aws-state='aws ec2 describe-instances --instance-ids $instanceId --query "Reservations[0].Instances[0].State.Name"
alias aws-state='aws ec2 describe-instances --instance-ids $instanceId --query "Reservations[0].Instances[0].State.Name"'
这里是给不熟悉 Bash 的大家看的 Bash 小抄。我强烈推荐这样做,因为您将需要 Bash 来与您的实例进行交互。
- 巨蟒装置。视频中提到要先安装 Anaconda 再安装 Cygwin。这可能有点令人困惑,因为您需要使用“Cygwin python”在那里运行 pip 命令,而不是本地 Anaconda 发行版。
此外,这个存储库有一个很好的让实例运行的分步指南。
深度学习入门
经过一些问题,我让我的 GPU 实例运行。是时候开始深度学习了!一个简短的声明:在这些博客中,我不会重复课堂笔记中列出的内容,没有必要。我将强调一些我发现非常有趣的事情,以及我在课程中遇到的问题和想法。
让我们从你可能想到的第一个问题开始:什么是深度学习,为什么它现在会受到如此大肆宣传?
深度学习只是一个具有多个隐藏层的人工神经网络,这使它们变得“深”。一般的神经网络只有一个,也许两个隐藏层。深度神经网络有更多的隐藏层。与普通神经网络中的“简单”层相比,它们还具有不同类型的层。
(Shallow) Neural Network
目前,深度学习在众所周知的数据集上一直表现出色。因此,深度学习已经经历了很多炒作。深度学习的流行有三个原因:
- 无限灵活的功能
- 通用参数拟合
- 快速且可扩展
神经网络是模仿人脑的。根据通用逼近定理,它理论上可以求解任何函数。通过反向传播来训练神经网络,这允许我们将模型的参数拟合到所有这些不同的函数。最后一个原因是最近在深度学习方面取得成就的主要原因。由于游戏行业的进步和强大 GPU 的发展,现在有可能以快速和可扩展的方式训练深度神经网络。
在第一课中,我们的目标是使用一个预先训练好的模型,即 Vgg16 来对猫和狗的图像进行分类。Vgg16 是 2014 年赢得 Imagenet 挑战赛的车型的轻量版。这是一年一度的挑战,也可能是计算机视觉领域最大的挑战。我们可以将这个预先训练好的模型应用到我们的猫和狗图像数据集上。我们的数据集已经由本课程的作者编辑过,以确保其格式适合我们的模型。原始数据集可以在 Kaggle 上找到。当这项比赛最初在 2013 年举办时,最先进的技术是 80%的准确性。我们的简单模型已经达到了 97%的准确率。令人震惊吧。这是一些图片及其预测标签的外观:
Predicted labels for dogs and cats
目标标签是使用一种称为“一键编码”的过程设置的,这种过程通常用于分类变量。[1.0.]指一只猫和[0。1.]指的是狗。我们创建了一个包含两个值的数组,而不是一个名为“target”的变量包含两个级别 0 和 1。你可以把这些变量看成‘猫’和‘狗’。如果变量为真,则标记为 1,否则标记为 0。在多分类问题中,这可能意味着您的输出向量如下所示:[0 0 0 0 0 0 0 0 1 0 0 0]。在这种情况下,Vgg16 模型输出图像属于类别“猫”的概率和图像属于类别“狗”的概率。下一个挑战是调整这个模型,以便我们可以将它应用到另一个数据集。
狗和猫的对决
本质上,这是与前一个相同的数据集,但是课程作者没有对其进行预处理。Kaggle 命令行界面(CLI)提供了一种快速下载数据集的方法。它可以通过 pip 安装。美元符号通常用于表示命令正在终端中运行。
$ pip install kaggle-cli
训练集包含 25000 张狗和猫的标记图像,而测试集包含 12500 张未标记图像。为了微调参数,我们还通过选取训练集的一小部分来创建验证集。建立完整数据集的“样本”也很有用,您可以使用它来快速检查您的模型在构建过程中是否正常工作。
为了运行我们的模型,我们使用 Keras 库。这个库位于流行的深度学习库 Theano 和 TensorFlow 之上。Keras 基本上使你的网络编码更加直观。这意味着您可以更多地关注网络的结构,更少地担心 TensorFlow API。为了知道哪张图片属于哪个类,Keras 查看它存储的目录。因此,确保将图像移动到正确的目录是很重要的。完成这项工作所需的 bash 命令可以直接从 Jupyter 笔记本上运行,我们在那里编写所有代码。此链接包含这些命令的附加信息。
在我的 Amazon p2 实例上,一个 epoch(完整遍历数据集)需要 10 分钟。在这种情况下,该数据集是由 23.000 幅图像组成的训练集。其他 2000 幅图像在验证集中。我决定在这里使用 3 个纪元。验证集的准确率在 98%左右。训练完模型后,我们可以看看一些正确分类的图像。在这种情况下,我们使用图像是一只猫的概率。1.0 表示图像是猫的完全置信度,0.0 表示图像是狗的完全置信度。
Correctly classified images
现在让我们来看看一些被错误分类的图片。正如我们所看到的,大部分都是从很远的地方拍摄的,以多种动物为特色。最初的 Vgg 模型用于图像,其中目标类的一个东西在图片中清晰可见。只有我一个人觉得第四张图有点恐怖吗?
Incorrectly classified images
最后,这些是模型最不确定的图像。这意味着概率最接近 0.5(其中 1 是猫,0 是狗)。第四张照片是一只猫,只有脸是可见的。第一个和第三个图片是矩形的,而不是像原始模型被训练的图片那样是方形的。
Images where the model is most uncertain
这就是这周的内容。就我个人而言,我迫不及待地想开始学习第 2 课,了解更多关于模型的内部知识。希望我们也能从零开始用 Keras 建立一个模型!
另外,感谢所有更新 Github 脚本的人。帮了大忙!再次感谢 Fast AI 论坛上的所有人,你们太棒了。
如果你喜欢这篇文章,一定要推荐给别人看。你也可以按照这个简介来跟上我在快速人工智能课程中的进程。那里见!
我目前是一名微型公司的数据科学家。我们正在努力寻找数据工程师和软件工程师。我们也在为自己和我们的合作伙伴招募数据科学家,这些合作伙伴包括荷兰、以色列的一些最大的组织和一些大型全球公司!
通过 LinkedIn 联系我,加入我们在阿姆斯特丹或特拉维夫的团队,或者让我帮助您加入我们遍布全球的合作伙伴组织!
深度学习#2:卷积神经网络
CNN 怎么学,学什么?
这篇文章是深度学习系列文章的一部分。检出部分 1 此处 和部分 3 此处 。
本周我们将探索卷积神经网络(CNN)的内部工作原理。你可能想知道这些网络内部发生了什么?他们是如何学习的?
我所学课程背后的教学理念是基于自上而下的方法。基本上,我们马上就可以玩完整的模型,随着我们的进行,我们对它的内部运作了解得越来越多。因此,这些博客文章将逐渐深入神经网络的内部工作。这只是第 2 周,所以我们开始朝着这个目标前进。
上周,我在猫和狗的图像数据集上训练了 Vgg16 模型。我想首先说明为什么使用预先训练的模型是一个好方法。为了做到这一点,思考这些模型正在学习什么是很重要的。实质上,CNN 正在学习过滤器,并将它们应用于图像。这些滤镜与你应用于 Instagram 自拍的滤镜不同,但概念并没有太大的不同。CNN 拿起一个小方块,开始在图像上应用,这个方块通常被称为“窗口”。然后,网络寻找该过滤器匹配图像内容的图像部分。在第一层,网络可能会学习一些简单的东西,比如对角线。在每一层中,网络能够结合这些发现,并不断学习更复杂的概念。这听起来仍然很模糊,所以让我们看一些例子。泽勒和弗格斯(2013) 在视觉化 CNN 所学方面做得很好。这是他们在论文中使用的 CNN。赢得 Imagenet 竞赛的 Vgg16 型号就是基于这种型号。
CNN by Zeiler & Fergus (2013)
这张图片现在可能看起来很混乱,不要惊慌!先说一些我们都能从这张图中看到的东西。首先,输入图像是 224x224 像素的正方形。我之前说的滤镜是 7x7 像素。该模型有一个输入层、7 个隐藏层和一个输出层。输出层中的 c 是指模型将预测的类的数量。现在让我们来看看最有趣的东西:模型在不同的层中学到了什么!
Layer 2 of the CNN. The left image represents what the CNN has learned and the right image has parts of actual images.
在 CNN 的第二层,这个模型已经获得了比对角线更有趣的形状。在第六个方块(水平计数)中,您可以看到模型正在拾取圆形。还有,最后一个方块在看角落。
Layer 3 of the CNN
在第 3 层中,我们可以看到模型开始学习更具体的东西。第一个方块显示模型现在能够识别地理模式。第六个方块是识别汽车轮胎。而第十一个方块是认人。
Layers 4 and 5 of the CNN
最后,第 4 层和第 5 层延续了这一趋势。第五层是挑选对我们的猫狗问题非常有用的东西。它还识别独轮车和鸟类/爬行动物的眼睛。请注意,这些图像只显示了每一层所学知识的很小一部分。
希望这能告诉你为什么使用预先训练的模型是有用的。如果你想了解这个研究领域的更多信息,你可以查阅“迁移学习”。Vgg16 模型已经知道很多关于识别狗和猫的知识了。针对猫狗问题的训练集只有 25000 张图片。新模型可能无法从这些图像中学习所有这些特征。通过一个称为微调的过程,我们可以改变 Vgg16 模型的最后一层,这样它就不会输出 1000 个类别的概率,而只输出 2 个类别(猫和狗)的概率。
如果你有兴趣阅读更多关于深度学习背后的数学知识,斯坦福的 CNN 网页提供了一个很好的资源。他们还称浅层神经网络为“数学上的可爱”,这是第一次。
微调和线性层
我上周用来分类猫和狗的预先训练好的 Vgg16 模型并不自然地输出这两个类别。它实际上产生了 1000 个类。此外,该模型甚至不输出“猫和狗”类,但它输出特定品种的猫和狗。那么,我们如何有效地改变这个模型,只将图像分类为猫或狗呢?
一种选择是手动将这些品种映射到猫和狗,并计算概率。但是,这种方法忽略了一些关键信息。例如,如果图片中有一根骨头,则该图像可能是一只狗。但是如果我们只看每个品种的概率,这些信息就会丢失。在那里,我们替换了模型末端的线性(密集)层,并用一个只输出 2 个类的层来替换它。Vgg16 模型实际上在末端有 3 个线性层。我们可以微调所有这些层,并通过反向传播来训练它们。反向传播通常被视为某种抽象的魔法,但它只是使用链式法则计算梯度。你永远不必担心数学的细节。TensorFlow、Theano 和其他深度学习库会帮你做到这一点。
如果你正在浏览快速人工智能课程第二课的笔记本,请注意内存问题。我建议您首先仅使用示例图像运行笔记本。如果您使用的是 p2 实例,如果您一直保存和加载 numpy 数组,您可能会耗尽内存。
激活功能
我们刚刚讨论了网络末端的线性层。然而,神经网络中的所有层都不是线性的。在计算了神经网络中每个神经元的值之后,我们将这些值通过一个激活函数。人工神经网络基本上由矩阵乘法组成。如果我们只使用线性计算,我们可以把它们堆叠起来。这不会是一个非常深的网络…因此,我们经常在网络的每一层使用非线性激活函数。通过将线性和非线性函数层层叠加,理论上我们可以模拟任何东西。这是三种最流行的非线性激活函数:
- Sigmoid (解析一个介于 0 和 1 之间的值)
- TanH (解析一个介于-1 和 1 之间的值)
- ReLu (如果值为负,则变为 0,否则保持不变)
Three most used activation functions: Sigmoid, Tanh & Rectified Linear Unit (ReLu)
目前,ReLu 是最常用的非线性激活函数。这样做的主要原因是它减少了消失梯度和稀疏性的可能性。我们将在后面更详细地讨论这些原因。模型的最后一层一般使用不同的激活函数,因为我们希望这一层有一定的输出。softmax 函数在做分类的时候很受欢迎。
在微调 Vgg16 模型中的最后层之后,该模型具有 138.357.544 个参数。谢天谢地,我们没有手动计算所有的梯度:)。下周我将深入 CNN 的工作,我们将讨论适配不足和适配过度。
如果你喜欢这篇文章,一定要推荐给别人看。你也可以按照这个简介来跟上我在快速人工智能课程中的进程。那里见!
我目前是一名微型公司的数据科学家。我们正在努力寻找数据工程师和软件工程师。我们也在为自己和我们的合作伙伴招募数据科学家,这些合作伙伴包括荷兰、以色列的一些最大的组织和一些大型全球公司!
请通过 LinkedIn联系我,加入我们在阿姆斯特丹或特拉维夫的团队,或者让我帮助您加入我们遍布全球的合作伙伴组织!
深度学习#3:更多关于 CNNs &处理过度拟合
什么是卷积,最大池和辍学?
这篇文章是深度学习系列文章的一部分。退房 第一部分 和 第二部分 。
Data augmentation is one of the techniques for reducing overfitting
欢迎来到深度学习系列的第三篇文章!本周我将探索卷积神经网络(CNN)的更多部分,还将讨论如何处理欠拟合和过拟合。
卷积
那么卷积到底是什么呢?你可能记得我以前的博客文章,我们基本上采取了一个小过滤器,并在整个图像上滑动这个过滤器。接下来,图像的像素值与过滤器中的像素值相乘。使用深度学习的好处在于,我们不必考虑这些过滤器应该是什么样子。通过随机梯度下降(SGD ),网络能够学习最优滤波器。过滤器是随机初始化的,并且是位置不变的。这意味着他们可以在图像的任何地方找到一些东西。同时,模型也知道它在图像中的什么地方找到了这个东西。
应用此过滤器时,零填充是一个有用的工具。所有这些都是在图像周围零像素的额外边界上完成的。这使得我们在图像上滑动滤镜时也可以捕捉图像的边缘。你可能想知道过滤器应该有多大。研究表明,较小的过滤器通常表现更好。在这种情况下,我们使用大小为 3x3 的过滤器。
当我们将这些滤镜滑过我们的图像时,我们基本上创建了另一个图像。因此,如果我们的原始图像是 30×30,则具有 12 个滤波器的卷积层的输出将是 30×30×12。现在我们有一个张量,它基本上是一个二维矩阵。现在你也知道 TensorFlow 这个名字的由来了。
在每个卷积层(或多层)之后,我们通常有一个最大池层。这一层只是减少了图像中的像素数量。例如,我们可以取一个正方形的图像,并用正方形上的最高值来替换它。
Max Pooling
由于 Max Poling,我们的过滤器可以探索图像的更大部分。此外,由于像素的损失,我们通常会在使用最大池后增加过滤器的数量。
从理论上讲,每个模型架构都是可行的,应该能够为您的问题提供一个好的解决方案。然而,有些架构比其他架构做得快得多。一个非常糟糕的架构可能需要比你剩余的年数更长的训练…因此,考虑你的模型的架构以及为什么我们使用像 max pooling 这样的东西并改变所使用的过滤器的数量是有用的。为了结束 CNN 的这一部分,这个页面提供了一个很棒的视频,它可视化了 CNN 内部发生的事情。
欠拟合与过拟合
你如何知道你的模型是否不合适?如果验证集的准确性高于训练集的准确性,则您的模型不符合要求。此外,如果整个模型表现不佳,这也称为欠拟合。例如,使用线性模型进行图像识别通常会导致模型欠拟合。或者,当你的深层神经网络出现不适应时,这可能是由辍学引起的。在训练过程中,Dropout 随机将激活设置为零,以避免过度拟合。在对验证/测试集进行预测的过程中,这不会发生。如果是这种情况,您可以删除辍学。如果模型现在过度拟合,你可以开始增加小块的辍学。
一般规则是:从过度拟合模型开始,然后采取措施防止过度拟合。
当您的模型太适合训练集时,就会发生过度拟合。然后,模型就很难归纳出不在训练集中的新示例。例如,您的模型识别训练集中的特定图像,而不是一般模式。您的训练准确度将高于验证/测试集的准确度。那么我们能做些什么来减少过度拟合呢?
减少过拟合的步骤:
- 添加更多数据
- 使用数据扩充
- 使用通用的架构
- 添加正规化(主要是辍学,L1/L2 正规化也是可能的)
- 降低架构复杂性。
第一步当然是收集更多的数据。但是,在大多数情况下,您将无法。让我们假设你已经收集了所有的数据。下一步是数据扩充:总是推荐使用的东西。
数据扩充包括像随机旋转图像、放大、添加滤色器等。数据扩充只发生在训练集,而不发生在验证/测试集。检查您是否使用了过多的数据扩充会很有用。例如,如果你放大得太多以至于猫的特征不再可见,那么模型不会因为这些图像的训练而变得更好。让我们探索一些数据增强!
对于 Fast AI 课程的追随者:请注意,笔记本使用“width_zoom_range”作为数据增强参数之一。但是,该选项在 Keras 中不再可用。
Original image
现在让我们看看执行数据增强后的图像。所有的“猫”对我来说仍然清晰可辨。
Augmented cats
第三步是使用一个通用的架构。然而,更重要的是第四步:添加正则化。三个最受欢迎的选项是:辍学,L1 正则化和 L2 正则化。在深度学习中,你通常会看到辍学,这是我之前讨论过的。Dropout 删除训练中激活的随机样本(使其为零)。在 Vgg 模型中,这仅适用于模型末端完全连接的层。然而,它也可以应用于卷积层。请注意,辍学会导致信息丢失。如果你在第一层丢失了一些东西,那么整个网络都会丢失。因此,好的做法是从第一层的低压差开始,然后逐渐增加。第五个也是最后一个选择是降低网络复杂性。实际上,在大多数情况下,各种形式的正则化应该足以处理过度拟合。
Visualization of dropout
批量正常化
最后,我们来讨论一下批量规范化。这是你应该经常做的事情!批处理规范化是一个相对较新的概念,因此还没有在 Vgg 模型中实现。
如果你对机器学习感兴趣,标准化你的模型的输入是你一定听说过的事情。批处理规范化更进了一步。批量标准化在每个卷积层后添加一个“标准化层”。这允许模型在训练中收敛得更快,因此也允许您使用更高的学习速率。
简单地标准化每个激活层中的权重是行不通的。随机梯度下降非常顽固。如果想使其中一个权重很高,它会在下一次简单地这样做。通过批量标准化,模型了解到它可以调整所有权重,而不是每次只调整一个。
MNIST 数字识别
MNIST 手写数字数据集是机器学习中最著名的数据集之一。该数据集也是一个很好的方式来实验我们现在所知道的关于 CNN 的一切。Kaggle 也托管 MNIST 数据集。我快速编写的这段代码是在这个数据集上获得 96.8%准确率所必需的。
import pandas as pd
from sklearn.ensemble import RandomForestClassifiertrain = pd.read_csv('train_digits.csv')
test = pd.read_csv('test_digits.csv')X = train.drop('label', axis=1)
y = train['label']rfc = RandomForestClassifier(n_estimators=300)
pred = rfc.fit(X, y).predict(test)
深度学习#4:为什么你需要开始使用嵌入层
以及它不仅仅是单词嵌入。
这篇文章是深度学习系列文章的一部分。在这里检查其他部分:
欢迎来到深度学习系列的第 4 部分。你可能已经注意到,前三篇文章和这篇文章之间有一点延迟。这个系列最初的目标是与深度学习的 fast.ai 课程一起写作。然而,后面讲座的概念经常重叠,所以我决定先完成课程。通过这种方式,我可以更详细地概述这些主题。在这篇博客中,我想介绍一个概念,它跨越了课程(4-6)的多个讲座,并且在实践中证明对我非常有用:嵌入层。
在介绍时,嵌入层的概念可能是非常陌生的。例如,Keras 文档除了“将正整数(索引)转化为固定大小的密集向量”之外,没有提供任何解释。快速的谷歌搜索可能也不会让你走得更远,因为这些类型的文档是首先弹出的东西。然而,在某种意义上,Keras 的文档描述了所有发生的事情。那么,为什么要使用嵌入层呢?这里有两个主要原因:
- 独热编码矢量是高维稀疏的。假设我们在做自然语言处理(NLP),有一个 2000 字的字典。这意味着,当使用一键编码时,每个单词将由一个包含 2000 个整数的向量来表示。并且这些整数中的 1999 个是零。在大型数据集中,这种方法计算效率不高。
- 每次嵌入的向量在训练神经网络时得到更新。如果你看过这篇文章顶部的图片,你就会明白如何在多维空间中找到单词之间的相似之处。这使我们可以可视化单词之间的关系,也可以通过嵌入层将一切转化为矢量。
这个概念可能还是有点模糊。让我们用一个单词的例子来看看嵌入层是做什么的。然而,嵌入的起源来自于词的嵌入。有兴趣了解更多可以查一下 word2vec 。让我们以这句话为例(不要当真):
“深度学习很深”
使用嵌入层的第一步是通过索引对这个句子进行编码。在这种情况下,我们为每个唯一的单词分配一个索引。句子看起来是这样的:
1 2 3 4 1
接下来创建嵌入矩阵。我们决定给每个指数分配多少“潜在因素”。基本上这意味着我们希望向量有多长。一般的用例是 32 和 50 这样的长度。让我们在这篇文章中为每个指数分配 6 个潜在因素,以保持可读性。嵌入矩阵看起来像这样:
Embedding Matrix
因此,我们可以使用嵌入矩阵来保持每个向量的大小更小,而不是以巨大的独热编码向量结束。简而言之,所有发生的事情就是单词“deep”由一个向量[.32、. 02、. 48、. 21、. 56、. 15]表示。然而,并不是每个单词都被向量所取代。相反,它被用于在嵌入矩阵中查找向量的索引所取代。同样,当使用非常大的数据集时,这在计算上是高效的。因为嵌入的向量也在深度神经网络的训练过程中得到更新,所以我们可以在多维空间中探索哪些单词是彼此相似的。通过使用像 t-SNE 这样的降维技术,这些相似性可以被可视化。
t-SNE visualization of word embeddings
不仅仅是单词嵌入
这些前面的例子表明,单词嵌入在自然语言处理领域非常重要。它们让我们能够捕捉语言中的关系,否则很难捕捉。然而,嵌入层可以用来嵌入更多的东西,而不仅仅是文字。在我目前的研究项目中,我使用嵌入层来嵌入在线用户行为。在这种情况下,我为用户行为分配指数,如“门户 Y 上页面类型 X 的页面视图”或“滚动 X 像素”。这些指数然后被用于构建用户行为序列。
在“传统”机器学习模型(SVM、随机森林、梯度增强树)与深度学习模型(深度神经网络、递归神经网络)的比较中,我发现这种嵌入方法对深度神经网络非常有效。
“传统的”机器学习模型依赖于特征工程的表格输入。这意味着,作为研究人员,我们决定什么会变成一个特征。在这些情况下,特征可以是:访问的主页数量,完成的搜索数量,滚动的像素总量。然而,在进行特征工程时,很难捕捉空间(时间)维度。通过使用深度学习和嵌入层,我们可以通过提供一系列用户行为(作为索引)作为模型的输入来有效地捕捉这个空间维度。
在我的研究中,具有门控循环单元/长短期记忆的循环神经网络表现最好。结果非常接近。从“传统”特征工程模型来看,梯度增强树表现最好。以后我会写一篇关于这项研究的更详细的博文。我想我的下一篇博文将更详细地探索递归神经网络。
其他研究探索了使用嵌入层来编码 MOOCs 中的学生行为(皮赫等人,2016 年)和用户通过在线时装商店的路径(塔姆哈尼等人,2017 年)。
推荐系统
嵌入层甚至可以用来处理推荐系统中的稀疏矩阵问题。由于深度学习课程(fast.ai)使用推荐系统来引入嵌入层,所以我也想在这里探索它们。
推荐系统到处都在使用,你可能每天都受到它们的影响。最常见的例子是亚马逊的产品推荐和网飞的节目推荐系统。实际上,网飞举办了一场 100 万美元的挑战赛,为他们的推荐系统寻找最佳的协同过滤算法。你可以在这里看到这些模型中的一个。
有两种主要类型的推荐系统,区分这两种是很重要的。
- 基于内容的过滤。这种类型的过滤基于关于项目/产品的数据。例如,我们让用户填写一份关于他们喜欢什么电影的调查。如果他们说他们喜欢科幻电影,我们会向他们推荐科幻电影。在这种情况下,所有项目都必须有大量的元信息。
- 协同过滤:让我们找到和你一样的人,看看他们喜欢什么,然后假设你也喜欢同样的东西。像你这样的人=对你看过的电影评价相似的人。在大型数据集中,这已被证明比元数据方法好得多。从本质上讲,询问人们的行为不如观察他们的实际行为好。进一步讨论这个问题是我们当中的心理学家的事情。
为了解决这个问题,我们可以创建一个所有用户对所有电影的评级的巨大矩阵。然而,在许多情况下,这将创建一个极其稀疏的矩阵。想想你在网飞的账户。你看过的连续剧和电影占他们总供应量的百分比是多少?这可能是一个很小的百分比。然后,通过梯度下降,我们可以训练一个神经网络来预测每个用户对每部电影的评价有多高。如果你想知道更多关于深度学习在推荐系统中的使用,请告诉我,我们可以一起进一步探索。总之,嵌入层是惊人的,不应该被忽视。
如果你喜欢这篇文章,一定要推荐给别人看。你也可以按照这个简介来跟上我在快速人工智能课程中的进程。那里见!
参考
c .、Bassen、j .、Huang、j .、Ganguli、s .、Sahami、m .、Guibas、L. J .、& Sohl-Dickstein,J. (2015 年)。深度知识溯源。神经信息处理系统进展(第 505-513 页)。
塔哈内,a .,阿罗拉,s .,&瓦里耶,D. (2017 年 5 月)。对时尚电子商务中用户行为的情境变化进行建模。亚太知识发现和数据挖掘会议(第 539-550 页)。斯普林格,查姆。
深度学习是 Monty Hall 策略(或者,用 PyTorch 温和地介绍 Deep-Q 学习和 OpenAI 健身房)
你永远不知道一系列事件会如何影响你。
对我来说,暴饮暴食布鲁克林 99 旧集,结合 Tensorflow 最近宣布他们已经正式纳入爱德华概率编程库,让我在一段时间内第一次思考贝叶斯概率。
在这一集里,霍尔特上尉和他的丈夫在争论蒙蒂·霍尔的问题。
One of TV’s best characters, Captain Holt in Fox’s (now NBC’s!) Brooklyn 99. A rare show of emotion for AI here.
我不熟悉旧游戏,但问题的表述是这样的:
有三扇门,一扇门后是一辆汽车,另外两扇门后是山羊。选一个。一旦你选择了,gameshow 主持人 Monty 将会打开你没有选择的两扇门中的一扇门——一扇绝对没有汽车在后面的门。你应该坚持你最初的猜测,还是换到两扇门中的另一扇门?
This article assumes you want to win the car, not the Greatest Of All Time
很明显,每扇门都有 1/3 的胜算,这一点在蒙蒂打开一扇门后并没有改变。贝叶斯先验为【1/3,1/3,1/3】。然而,一旦失败的大门被打开,就会有新的信息出现,概率应该被重新检查。事实上,汽车在未选择的门后面的概率现在“集中”到 2/3,吸收了蒙蒂打开的哑门的概率。即后验为【1/3,0,2/3】。因此,你不太可能总是赢,但是通过切换到你最初没有选择的未打开的门,你的机会增加了一倍。
这是这个博弈的优势策略。
如果你想直接跳到本文附带的相对简单的 Jupyter 笔记本,这里是。
我过去与人工智能有关的大部分工作都是回归一点生成性的东西,我已经远离了标题制作技术:人工智能自学玩末日游戏,人工智能现在比人类更擅长围棋,人工智能自动驾驶汽车自组织成汽车人和霸天虎等等。因为这个,我也没有机会玩开 AI 健身房。事实证明,两者都很容易使用,我认为它们应该在每个人的深度学习工具箱中占有一席之地。
像往常一样,我会省去大部分的数学。深度 Q 学习涉及到一些内容,尽管这并不复杂,但我可以从我的论文工作中告诉你,随机的实际实现是第一位的,数学是一个很好的事后完整性证明,使你能够写一篇严肃的论文。直觉很重要。
在这篇文章中,我实际上并不打算讨论可训练分布和 Tensorflow 的 Edward,而是展示如何构建一个简单的、可扩展的代理来解决一个博弈论类型的问题,该问题可以与当今前沿的人工智能环境进行交互。
开放 AI 健身房
让我们先解决这个问题。健身房没有任何魔力,只是一套良好的标准化环境,在其中测试自主 AI 代理,模拟他们的行为对环境的影响。只需通过pip install gym
安装,在 Jupyter 笔记本内部就能轻松使用。
健身房附带的一个非常简单的环境叫做 CartPole,它看起来像这样:
杆子通过枢轴连接到轨道上的手推车上,手推车的目标是保持杆子直立——想象一下试图在手掌上平衡一支笔。
环境模拟力和重力,环境的动作空间是推车可以被向左或向右推(轨道是无摩擦的,所以任何推动都会增加推车的速度,然后它会继续以那个速度前进)。当杆子越过一个无法返回的角度时,游戏结束。
动作空间定义了人工智能(我假设它是一个神经网络)输出的维度;每个时刻都有两种可能的行动。因此,您可能有一个输出神经元,其中输出> 0 被解释为向右推,而≤ 0 被解释为向左推。更有可能的是,你可能有两个神经元对应左右,取其中的 argmax 。
相反,环境的观察空间形成了对人工智能的输入。任何试图求解 CartPole 的人工智能都有四个输入:代表速度和角度的浮点数。
通常当你听到 Open AI Gym 被提及时,人们会谈论 Atari 游戏:动作空间将是游戏手柄上的按钮,观察空间将是小行星游戏中屏幕上的像素。在这里,我正在解决一个简单的博弈论问题,但以一种与健身房兼容(即子类化)的标准化方式。
在典型的 PyTorch 训练循环中使用健身房看起来像这样:
import gym
env = gym.make("CartPole-v0")
model = MyAI()
optimizer = torch.optim.Adam(model.parameters())
env.reset()for frame in range(0, 6000): # frames of the game to play out
action = model.act(state, epsilon)
next_state, reward, done, _ = env.step(action)
replay_buffer.append(state, action, reward, next_state, done)
state = next_state
env.render()
if done:
env.reset()
if len(replay_buffer) > batch_size: # won or died
loss = calc_loss_over_episode(replay_buffer)
optimizer.zero_grad()
loss.backward()
optimizer.step()
在进入深度 Q 学习之前,这里有几件事情要解开:
- MyAI 是一个神经网络模型的占位符,按照下面的标准 PyTorch 方式构建,但是增加了一个 act 方法。
- 可以预见,重置健身房环境会将其设置回初始状态。
- ε是一个随时间衰减的数,就像模拟退火一样(更多内容见下文)。
- 环境中的每一步都返回一个新的状态、一个奖励(在赢得游戏之前可能是零)、一个表示我们是否完成的标志(赢了还是输了,在这种情况下重置环境),以及一些可选的调试信息。
- env.render() 只做图形。Gym 提供了一些有用的图形原语,如果你想自己制作的话。
- 损失是一集或一批的平均值,其中可能包含一个或多个完整的游戏。在这段时间内发生的所有动作都存储在重播缓冲区中,使其能够在一集结束时回放,这样我们就可以在我们希望更接近目标时计算损失。
- calc_loss_over_episode 会在下面的深 Q 位覆盖!
环境
为开放人工智能创建一个健身房很容易。你只需要子类化 gym 并实现一些方法。这里有一个模板:
from gym import spaces
from gym.envs.classic_control import rendering
out = 3
in = 3class MyEnv(gym.Env):
def __init__(self):
self.action_space = spaces.Discrete(out)
self.observation_space = spaces.Discrete(in)
self.initial_state = whatever_you_like
self.state = self.initial_state
self.viewer = rendering.Viewer(640, 480) def step(self, action):
# do something to calculate next state, reward, and done
return self.state, reward, self.done, {} def reset(self):
self.state = initial_state
self.done = False
return self.state def render(self, mode='human'):
# This gets you a window and primitives e.g.
# cart = rendering.FilledPolygon([(l,b), (l,t), (r,t), (r,b)])
return self.viewer.render()
行动空间需要离散,因为每个行动将是 0 或 1(采取,不采取)。观察空间可能会更大。这取决于你如何表述这个问题,我是这样表述蒙蒂·霍尔的:
信不信由你,用一种适合人工智能的方式来阐述这个问题是这篇文章中最困难的部分。
首先,有一个隐藏状态,在游戏重置时初始化(每两次移动后)。隐藏状态只是说车在哪个门后面;另外两扇门关着山羊。对 AI 可见的观察状态从[0,0,0]开始。接下来,人工智能选择一扇门,这个动作会得到 0.3 的持续奖励。(这个数字是我随意选的;奖励可以是任何正数或负数,AI 的任务是最大化它)。
当蒙蒂打开一扇门时,状态发生了变化;这通过观察到的状态的变化指示给 AI,用 2 标记新打开的(和包含山羊的)门。接下来,人工智能采取第二个行动:它可以选择打开的门(失败!),坚持它原来的猜测,或者扭曲。游戏结束,如果人工智能最终选择了正确的门,它将得到+1 奖励。如果没有,它得到 0 奖励。正如我们所知,大多数情况下,扭转会更好:将原来的猜测改为另一扇未打开的门。
所以,人工智能看到的是:3 扇门(输入),每扇门都有一些值。人工智能在每一步可以采取的行动:打开三扇门中的一扇门。
也许,有更简洁的方法来构建这个问题,但我选择的方法似乎很简单,直观地映射到实际的游戏中——这是一个简单的问题,我后来发现用少量的神经元训练真的很快,所以,那就行了,猪。
在许多强化学习演示中,观察空间是一个 2D 盒子,代表雅达利游戏的电视输出。
模型
这里需要的是 PyTorch 神经网络模型,它将环境的当前状态(来自观察空间)作为输入,并预测来自动作空间的动作作为输出。这只是通过网络向前传递,但是!存在局部最小值的可能性。我在 Q-learning 空间读到了一个很好的解释,代理人/网络可能第一次服用海洛因,并一遍又一遍地重复奖励,但最终永远无法解决这个游戏。
Like the crew of Red Dwarf never escaping the Despair Squid
所以,你不希望人工智能学习或收敛得太快。不是每次都预测它的最佳行动,最大化它的回报(这是比较科学术语中的贪婪算法),而是希望人工智能最初探索行动空间。因此,随着某种概率ε的降低,AI 将从动作空间中选择一个随机动作,而不是它的最佳预测。
这就是 act 方法所做的一切,这就是 epsilon greedy 学习。其余时间,它只需通过调用 forward (即通过网络运行当前状态来预测最佳的下一个动作)来挑选网络的最佳预测动作。
下面是做这项工作的简单 PyTorch 网络:
# env is the AI gym defined and instantiated aboveclass DQN(nn.Module):
def __init__(self):
super(DQN, self).__init__()
self.layers = nn.Sequential(
nn.Linear(env.observation_space.n, 20),
nn.ReLU(),
nn.Linear(20, 20),
nn.ReLU(),
nn.Linear(20, env.action_space.n)
)
def forward(self, x):
return self.layers(x)
def act(self, state, epsilon):
if random.random() > epsilon:
state = Variable(torch.FloatTensor(state).unsqueeze(0))
q_value = self.forward(state)
action = q_value.max(1)[1]
else:
action = random.randrange(env.action_space.n)
return action
如您所见,它有 3 个输入(每个输入可以是 0、1 或 2,代表当前状态),扇出 20 个具有 ReLU 非线性的神经元的输入层,20 个也具有 ReLU 的神经元的隐藏层,减少到 3 个神经元的输出层,我们将取其最大值来预测下一个动作。
20 的隐藏大小是任意的。有一些简单的样板文件:
- 我们的状态只是一个像[0,1,2]这样的向量。PyTorch 需要一个张量Nxnum _ features,其中 N 是批量大小。实际上,Unsqueeze 将[0,1,2]转换为[[0,1,2]],也就是说,批量大小为 1;给定当前状态,一次预测一个动作。概念上很简单,但可能是你想为生产优化的东西,否则 GPU 的能力被浪费了。
- q_value 是网络前向传递的输出,它给出了给定状态下我们可以采取的三种行动中的每一种行动的预期回报。我们沿着神经元的轴(不是 0,批处理轴)找到最大值,max()函数给出一个元组,其中[0]是值,[1]是索引。因此,如果向前传递收益 Y=[-1.34,0.62,0.32] — Y.max(1)将是[0.62,1],Y.max(1)[1]意味着净建议我们采取行动 1。Y.max(1)[0]表明,如果我们采取这一行动,Q 值将是 0.62。
q 学习
这就是问题的核心。Q-Learning 实际上只是问了一个问题,“如何在给定的时间步计算损失?”从游戏结束时的奖励往回看,看看我们在每一步的行动是如何促成最终奖励的。
如果你回想几年前谷歌花了很多钱收购 DeepMind 的时候,头条新闻表明这是因为 DeepMind 有一些解决 Atari 游戏的革命性方法,这导致了 AlphaGo 和最近的电话呼叫 Duplex。就我现在所知,我不认为那是原因。或许,他们有一个像样的基础设施,通过它他们可以将老式算法应用到一个奇特的问题领域,但更重要的是,他们有一个大 G 想要挖走的伟大团队。
我以前在我的文章中强调过这一点,但人工智能真的只是通过人们尝试东西来进步,不一定是大公司,只是有人拿着 GTX 1080 问为什么总是通过 X 来完成,而 Y 在实践中更好。
于是我们来到了上面神秘提到的函数 calc_loss_over_episode() 。代码看起来就像这样:
# gamma is a learning-rate hyperparameter, try 0.9def calc_loss_over_episode(batch_size):
state, action, reward, next_state, done = replay_buffer.sample(batch_size) state = Variable(torch.FloatTensor(state))
next_state = Variable(torch.FloatTensor(next_state))
action = Variable(torch.LongTensor(action))
reward = Variable(torch.FloatTensor(reward))
done = Variable(torch.FloatTensor(done)) q_values = model(state)
next_q_values = model(next_state) q_value = q_values.gather(1, action.unsqueeze(1)).squeeze(1)
next_q_value = next_q_values.max(1)[0] if done:
expected_q_value = reward
else:
expected_q_value = reward + gamma * next_q_value loss = (q_value - Variable(expected_q_value)).pow(2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss
这个的高层次是:
- 在批次的随机样本中的每个时间步长(通过不总是以相同的顺序移动批次来改进训练)。
- 在给定的当前状态下预测 Q 值(如果网络在给定的当前状态下采取了 3 个可用的 Monty Hall 行动中的每一个,则预期的回报)。理解这一点的关键是,网络的估计 Q 值将开始完全随机,但最终开始收敛到真实的答案。
- 在我们采取了上一步预测的行动后,预测实际下一个状态的 Q 值(同样,它们完全是随机开始的)。
- 在将 Q 值添加到预期奖励之前,对其进行一点折扣(乘以 gamma)。这是因为在随机环境中,我们无法对一个行动的结果有 100%的把握;因此,gamma 对未来的奖励比眼前的奖励打了一点折扣。
- 找出均方误差(从实际中减去理想/预期回报,对差值求平方并取平均值),然后反推并优化网络参数以最小化损失(使用 SGD、Adam 等)。
对于 Monty Hall 问题,假设一批按顺序处理。 *Q(状态,动作)*产生我们下一个建议的动作。这是一个由输出神经元激活组成的向量。 Q(【所有门都关闭】,2) 是在所有输入都为 0 的网络中单次正向传递后输出神经元 2 的激活。它从未经训练的神经网络的随机垃圾开始。
网络为这一步获得健身房环境 0.3 奖励,蒙蒂打开一扇门。神经网络又迈出了一步。 *Q([AI 选择了门 2 & Monty 打开了门 1】,动作)*由另一个通过具有输入[0,2,1]的网络的向前传递来计算(根据我上面的图)。我们的网还是垃圾;假设这次输出神经元的 argmax 为 1(“开门#1”),值为 0.64。愚蠢的网络试图打开蒙蒂已经打开的门!
健身房环境现在返回奖励 0,并发出游戏已经终止的信号(称之为时间 T)。我们的损失函数现在表示“我的预期 Q 值是 0.64[嗯,它是一个向量,所以其他两个动作也包括在内],我得到的回报是 0。我们可以反推该损失,这将帮助我们更好地猜测时间 T-1 时的 Q 值(给定一个状态)。这将有助于更好地猜测 Q 值和在时间 T-2 要采取的行动。(除了在学习步骤中,时间向前流动,因此在步骤 T-2 计算损失将预测 T-1 和时间 T 的行动/状态/回报)。
一次学习迭代只跨越两个时间段,这是我们从一个批次中随机抽取的。在某个时候,我们将对一个终端案例(时间 T)进行采样,这将使我们更好地了解网络在前一步(T-1)的行为是如何对最终奖励做出贡献的。然后在某个时候,我们将对倒数第二步(T-1)的移动进行采样,我们现在对它如何影响最终回报有了更好的了解,我们可以用它来更好地了解在那之前(T-2)的移动,以此类推,倒回到开始。
如果这对你来说看起来像是欺骗,只是一点点,那么我同意:这只是利用大数据来弥补理解和直觉的完全缺乏。然而,它确实让你得到了一个趋向于零的漂亮图形,这是机器学习研究人员的未声明的目标:
(L) Loss per batch, ® Mean loss per frame (many batches)
对于每一批(在上面的图表中,我使用了 32 个)移动(可能包括 16 个已完成的游戏),你可以看到损失趋向于零,但没有达到零——因为 Monty Hall 参与者仍有至少 1/3 的机会会输。有时候人工智能有一轮非常不幸的比赛。
与此同时,回到现实世界,在蒙蒂打开一扇门后,人工智能确实学会了改变它的猜测:
After the middle door is opened, with an initial guess of the first door, the AI’s next action is to open the 3rd door. Separately, after the 3rd door is opened and the AI’s initial guess was the first door, it switches to the middle door. 0.00001 is a small value for epsilon, meaning “make your best guess, not a random one”
我完整的 Jupyter 笔记本就是这里的。
后续步骤
正如人工智能中的许多东西一样,Deep-Q 学习已经有些过时了,但如果你能稍微落后于潮流,这是一个很好的强化学习材料的仓库。
只是不要忘记,所有这一切都是因为我们有在数千场比赛中训练我们的人工智能的自由;这个网络只用 20 个神经元就“解决”了蒙蒂·霍尔,这比完全无脑的蛔虫少了一个数量级。
这不是人类大脑的工作方式,所以即使是一个坚定的贝叶斯应该原谅队长霍尔特没有“解决”蒙蒂的游戏。当训练样本非常少时,人工智能应该如何学习;它应该如何对第一次遇到的问题进行元推理,就像蒙蒂霍尔游戏的第一次参赛者会做的那样?(除了 gameshow 的参赛者似乎通常没有多余的 20 个神经元这一事实)。
没有人知道这些问题的答案——让我们继续努力,找出答案!
深度学习和机器学习
2015 年 7 月 14 日
这篇博客文章是关于我目前正在从事的一项正式工作的非正式讨论——我的博士背景文献综述。因此,它的链接非常丰富——我在这里记录的旅程本质上是由其他人的工作组成的。这篇文章也可能被解释为试图说服我的上司 奥马尔·拉纳教授 和 罗南·雷利教授 我实际上是在做事情,而不是阅读论文和调试torch 7/Theano代码。但事实并非如此:)
机器学习-背景
机器学习领域目前非常活跃。一周接一周,一个月接一个月,以前的记录在翻滚然后又翻滚(尽管规则在一路上被打破)。库使用 Nvidia 的 CUDA 实现针对 GPU 硬件优化的算法,研究人员可以从 Nvidia 购买硬件,或者在云中租赁机器,每次一小时。家庭/小公司的程序员现在可以在非常大的数据集上训练非常大的模型,这在 3-4 年前只有大得多的公司才能考虑做。
为什么这很重要?嗯,机器学习最简单的定义是软件,当针对特定任务进行测量时,它会随着时间的推移提高自己的性能。这句话描述了一种与我们目前所习惯的软件非常不同的软件——操作系统、浏览器和大多数应用程序不会根据“经验”有意义地修改它们的行为——它们一次又一次地重复做完全相同的事情。拥有可训练的——可以学习的——软件是一种非常有价值的能力,我们将在后面看到。
在我看来,机器学习代表了我们这个时代的重大挑战之一,与理解现实的结构或什么是生命本身不相上下。
机器学习!=深度学习(只不过现在有点)
机器学习不是深度学习(它是深度学习的超集),但最近(尤其是在主流媒体上),这两个术语已经成为同义词。深度学习是机器学习的一个分支,它源于人工神经网络——在我看来是所有人工智能分支中最有趣的,因为它具有生物合理性(映射到人类大脑中类似的功能或特征)以及它为研究人员提供的路线图/思想宝库。自 20 世纪 60 年代以来,人工神经网络一直非常受欢迎,也非常不受欢迎,因为第一次炒作超过了现实,然后从业者又赶上了(明斯基和帕普特在 1969 年的书感知器中对人工神经网络的贬低至今仍在该领域回响,尽管它遭到了反驳)。
在这里引用明斯基是恰当的——直到最近谈论在 Prolog 和 Lisp 中实现的符号逻辑和神经网络一样可以接受(甚至更可以接受)。但是像神经网络一样,Prolog 和 LISP 已经过时了。然而,从软件工程的角度来看,它们是诱人的。例如,Prolog 处理如下易于理解的事实和规则:
likes(joe, fish).
likes(joe, mary).
likes(mary, book).
likes(john, book).
当我们带着问题“咨询”系统时,Prolog 使用归结反驳来回答,于是我们得到:
?- likes(mary,fish).
no
*"no" means nothing matches the question, no does not mean false.*
但是 Prolog 很慢,规则/事实数据库变得难以管理。Prolog / Lisp 在日本遭遇了自己的人工智能冬天,因为非专业硬件超过了优雅的专用硬件(它们的表现基本上符合摩尔定律)。最近,谷歌的研究人员建立了深度学习系统,专注于相同的领域,显示出有希望的结果,但它们的内部工作方式不像(尽管简单)Prolog 等效程序那样明显/清晰。这既不是一件好事也不是一件坏事——简而言之,这是对古老的象征主义与联结主义辩论的重述。在实践中,硬结果很重要,现在神经网络正在赢得这场辩论…
下面的示意图显示了人工智能的同心分组/子集,以提供深度学习和机器学习之间关系的更真实的画面。
图一。描述人工智能中不同子领域之间关系的示意图,来自本吉奥的书。
神经网络有它们的问题——其中之一是不透明的问题。虽然可视化工具存在,但大部分神经网络看起来像,而且确实是,浮点数的大格子。不经意的观察者从它们那里得到的信息不会比通过观察人类大脑更有意义,当试图将神经网络集成到工作软件系统中时,这不是很好。
那么什么是神经网络呢?
Haykin 的规范文本将神经网络定义如下:
“由简单处理单元组成的大规模并行分布式处理器,具有存储经验知识并使其可供使用的自然倾向”。
这些简单的处理单元就是神经元。神经元的标准模型是由麦卡洛克和皮茨在 1943 年提出的,从那以后就没怎么改变过。神经元接受输入 X 的向量,这些输入被加权,并且可选的偏置 b(图中未示出)基于应用于权重的某个函数(根据期望的特性使用许多不同的函数)生成输出或激活。下图描绘了这种风格化的神经元。
图二。单个神经元的标准(麦卡洛克-皮茨)模型。
现实世界的神经网络有成千上万个这样的神经元,它们一起提供了经验知识的存储,最有用的是,在先前已经看到的数据的背景下理解新的、看不见的数据的能力。GPU 非常适合训练神经网络,因为它们也是大规模并行的,如下图所示。
图 3。Nvidia 的 Titan X GPU,拥有 3,072 个 CUDA 内核。
神经网络的个人历史
我第一次遇到神经网络是在 1997 年——我最后一年的项目结合了SNNS(torch 7/the ano 的祖先)和西姆德雷拉创造了一个“通过观察学习”的 6 自由度机械臂。我们教网络嵌套杯子——就像一个孩子会做的那样。事实上,随着网络的训练,它显示了嵌套策略的复杂性进展(线性- >预堆叠),正如皮亚杰为真实儿童记录的。这个项目也旨在成为进一步工作的垫脚石,该工作受到人类大脑中布罗卡区发展的启发,如果我们预先训练或调节简单任务的神经网络,它在学习更复杂的任务时会更成功。预训练/调节是训练深网时要考虑的一个重要启发(见下文)。事后看来,我怀疑我为了我的项目结束演示过度训练了这个网络,以确保在我使用的简单的 20x20 视网膜上找到杯子的准确性!在 1997 年(从主观上来说),从计算机科学的角度来看,神经网络被认为是优雅的,但可疑地接近心理学和软件工程,可以从诸如基于案例的推理、推理、决策树等技术中获得更好的(和可理解的)结果。
2003 年,我的理学硕士再次关注神经网络,但几乎是作为主要活动(分布式计算)的副业。这项工作的主要目的是展示一个异构计算节点集群如何有效地复制一个非常著名的基准测试,该基准测试使用钱和 Sejnowski,1998 的神经网络模型预测球状蛋白质的二级结构,使用基于的 Linda 和 David Gelernter 的基于元组的架构进行近似线性加速。此外,这项工作只使用了前馈神经网络——递归网络,当然 LSTM 会产生更好的结果,因为它们能够保留氨基酸输入序列的信息。
2003 年,关于投资银行使用神经网络来预测股票市场和监控投资组合风险的流言四起。如果这是真的,那么我向读者提出,2008 年的事件表明,这些神经网络可能已经找到了一系列不幸的局部极小值…
2006 年,世界变了。 Geoffrey Hinton 、 Yoshua Bengio 和 Yann LeCun 开始将神经网络分层堆叠——每一层都从其输入中提取重要/相关的特征,并将这些特征传递给其上一层。此外,焦点从简单的分类器转移到了生成模型——实际上,网络的主要任务变成了在不断增加的抽象级别(通过堆栈)上生成输入数据,以便提取有用的特征。这些都是重大突破,时机也很偶然——在硬件方面,Nvidia(和 AMD,但 OpenCL 对深度学习来说几乎是死的)正在让 GPU 卡成为通过 CUDA 访问的计算资源。即使在今天,我们仍然处于一个黄金时代,因为这三位一体的融合:
- 带有训练算法的核心思想(神经网络)反向传播:Rumelhart,Hinton,Williams 本质上服从并行化。
- 内在并行硬件(GPU)来训练这些神经网络。
- 越来越大的数据集(标记的和未标记的)作为输入提供给神经网络。
2013 年 3 月,辛顿加入谷歌,2013 年 12 月,乐存加入脸书。这两家公司、百度以及更多公司都在深度学习方面投入巨资,以自动分类、理解和翻译网络上的丰富内容——文本、图像、视频、语音…你为什么会这么做是显而易见的——社交平台变得更加相关,手机变得更加强大和有用,广告变得更有针对性,电子商务网站提供更好的搜索结果,推荐是真正有用的——可能性是无限的。仅仅是让谷歌和脸书在这一领域开展工作,就要为当前许多(准确和不准确的)主流媒体对人工智能的报道负责。
这让我们很好地了解了神经网络的典型用途。
实际应用
简而言之,神经网络从它们接受训练的数据中提取特征和模式——通常是人类看不到的特征和模式。然后,一个经过训练的神经网络可以得到新的、看不见的数据,并做出预测。这个一般化步骤非常有用,特别是对于递归神经网络,其可以随时间吸收数据*,即编码时间信息或序列。神经网络变得非常擅长:*
- 图像解析(边缘检测、对象检测和分类)
- 场景理解
- 语音识别
- 自然语言处理
- 语言翻译
- 玩简单的电子游戏
- 多标签系统的分类和聚类
- 时间序列预测。
对于特定的用例,人工神经网络有时能够并且将会表现更好,通常是通过更简单/更老的技术。构建一个允许使用多种 ML 技术的问题总是明智的,这样可以进行对等比较。然而,特别是在计算机视觉和序列翻译领域,深度学习方法主导了各种排行榜。
更一般地,如果神经网络 N 可以在系统 S 和从时间步长 0 到当前时间步长 t 在该系统中发生的事件 E 上被训练,例如 E = {e0,…然后可以对 e(t+1),e(t+2)等中将要发生的事情提供合理到良好的预测。,那么这就有广泛的适用性——在电子商务、个性化医疗、库存管理中——只要是你能想到的,都需要这种预测。这是神经网络的基本吸引力(与理解图像及其元素相比,这一点经常被忽视/低估)。
神经网络的弱点
毫无疑问,神经网络是令人沮丧的工作。神经网络是:
- 难以培训(时间过长,最终表现平平)。
- 对输入的呈现方式非常敏感,因此可以提取正确的特征(ICLR 是一个致力于表征学习的会议)——本吉奥、库维尔和文森特对这些复杂性进行了很好的综述。
- 权重的初始状态会对最终绩效产生巨大的(正面和负面)影响。
- 服从“经验法则”,这些法则散布在文献中,被发现/重新发现/重新发明:例如,课程学习,颠倒输入顺序,调整学习速度。无论如何,这不是一个完整的列表…
尽管如此,各种形式的神经网络已经在许多不同的领域展示了一流的成果。这就是它们有趣的原因,也是我认为研究人员和公司坚持使用它们的原因。它们复杂、深奥的本质远远超过了它们产生的结果。
深度学习的“国家状况”——2015 年 ICLR
看看某个研究领域最近的会议上提出的主题,了解该领域当前的“国家状况”是有益的。机器学习也不例外,我参加的最后一次会议是几周前在加州圣地亚哥举行的 ICLR 2015 。正如在对 ICLR 的其他评论中已经提到的,所有提交的论文都可以在 Arxiv 上获得,这太棒了。很高兴看到这些论文的作者展示他们的作品,或者在海报会议上直接谈论他们。还有很多其他优秀的会议——NIPS、 KDD 、IJCAI——我选择 ICLR,因为它在我心目中是最新鲜的!
第二,研究人员正在寻找共同的参考点,以此来对正在开发的最新系统进行评级。玩具任务是一个很好的例子,它与课程学习有着清晰的渊源。ICLR 2015 的一篇论文正在接受审查,但我猜没有被接受的是递归神经网络正则化。关于这篇论文,我最喜欢的是 Github 上的代码——一种将论文中的数据与可再现的输出相匹配的好方法。
带 fbfft 的快速卷积网络:一个 GPU 性能评估演示了在训练深度网络时如何更努力地驱动 GPU,并且已经有了该库的另一个版本(提示:使用 16 位浮点而不是 32 位!)不难想象,如果确定了进一步的不同优化,Nvidia 将在未来为深度学习社区生产专用硬件…
最后,从直觉的角度来看,我个人最喜欢的是记忆网络。它具有较低的生物学似然性(或者当然该论文中没有探讨这方面),但是具有较高的实际应用性。我们可以很容易地想象出这种架构的变体,例如,它学会了访问 SQL / NoSQL 数据库中保存的业务事实,或者访问类似 Prolog 的事实和规则。
机器学习的商品化
机器学习已经渡过了某种难关,现在被视为商业应用的必备工具。语音和计算机视觉的传统应用将继续,但 ML 也将在 POBAs(普通的旧商业应用)中变得无处不在。ML 的商品化已经开始了:
还存在许多较小的服务,随着时间的推移,随着赢家的出现,我们可以期待看到整合。对于那些希望在本地使用 ML 的工程师,我们提供以下服务:
ML 从业者的祸根是超参数选择(也称为上帝参数——使你美丽的神经网络出色工作或比随机猜测好不了多少的配置标志)。事实上, Bergstra 和 Bengio 证明了随机猜测超参数通常是一种“足够好”的策略,因为算法通常只对一两个超参数敏感。最近,Snoek 等人应用贝叶斯先验和高斯过程来进一步完善这种方法(我猜我会称之为智能随机性加学习)。Spearmint——构建的实现已经被剥离成一个具有漂亮的 API 的启动。考虑到一些深度网络需要大约两周的时间来训练,任何更快的到达最优超参数的路径都是有利的。
该领域的未来方向
很明显,与理论相比,围绕机器学习的软件工具相当不成熟。研究人员撰写并发表论文,而不是生产强度代码。因此,将机器学习与计算机科学的其他分支(操作系统、网络、数据存储、搜索)进行比较表明,在这一领域需要做很多工作。
冒着过度对冲的风险,下一个突破要么来自现有的方法(见 2014 / 2015 年,施密德胡伯和霍克雷特的《长短期记忆》又名 LSTM 变得多么受欢迎),经过 15 年的探索之后),要么来自新的思维,可能是受生物构造的启发。Geoffrey Hinton 目前关于胶囊/流形学习的工作就是一个很好的例子。对于研究人员来说,看到文献中存在哪些由于计算困难而被放弃的想法/技术,现在可能更容易处理,这肯定是有希望的!
有可能我们所要做的就是将网络堆叠得更高(900+层深?)根据 Srivastava、Greff 和 Schmidhuber 的高速公路网论文继续前进,但我的感觉是“深度”方法只剩下这么多距离了。无论如何,有趣的是,目前六层似乎是最佳的(但是谷歌网使用 22 或 27 层,这取决于你如何计算它们)。
有点奇怪的是,反向传播结合随机梯度下降(SGD)仍然是使用的最好/规范的学习算法。自 1986 年以来,它确实经受住了时间的考验,并且非常适合 GPU。目前的研究似乎集中在网络架构上,但学习算法的复兴似乎也将不可避免。
大多数神经网络都是由老师训练的——对于好的输出,我们奖励网络低误差,对于差的输出,我们惩罚它。这种方法工作得很好,但是需要很好标记的数据,这通常是一种奢侈或者根本不可能实现的。谷歌 Deepmind 正在倡导强化学习,将其作为开发能够很好地跨问题转移的系统的一种方式(在他们迄今为止的开创性论文中,一个单一的神经网络已经学习/泛化到足以玩所有的雅达利游戏)。
最后,有理由期待神经网络复杂性的降低,如果不是理论上的,那么肯定是实践和使用上的。使用最小描述长度或VAP Nik–Chervonenkis 维度作为度量,我们感兴趣的是构建最简单、最紧凑的神经网络(具体来说,使用最少的参数)来解决给定的问题或任务。更简单的网络也会训练得更快——这在实践中是一个非常好的好处。
回顾/总结
这篇博文比我预想的要长!一部分是历史之旅,一部分是对机器学习的概述,带有明显的深度学习倾向,这是一篇比我目前正在为我的博士论文撰写的文章更非正式的文献综述。
这一领域的创新步伐很快——每年有四五个大型会议,每个会议都会带来新的公告和突破。目前,软件工程、快速、可扩展的硬件和良好的理论真正融合在一起。
深度学习/神经网络可能不是将所有人工智能结合在一起的单一统一理论(有太多的未知和以前的失败),但我怀疑它将对人工智能的发展产生深远的影响,至少在未来十年内。
进一步阅读
如果你仍然对机器学习感兴趣(你为什么会不感兴趣?!)我认为公平地说,在这个领域,你只是不能做足够的阅读——基础已经建立,但前沿每天都在被推进和挑战。这篇博文包含了许多有趣的链接,除此之外,如果你想了解更多,我强烈推荐这个领域的主要思想领袖/实践者的 Reddit ML AMAs。它们是(没有优先顺序——它们都有助于优秀的、有洞察力的阅读):
- 吴恩达和亚当·科茨(2015 年 4 月 15 日)
- 于尔根·施密德于贝尔(2015 年 3 月 4 日)
- 杰弗里·辛顿(2014 年 11 月 10 日)
- 迈克尔·乔丹(2014 年 9 月 10 日)
- 扬·勒村(2014 年 5 月 15 日)
- 约舒阿·本吉奥(2014 年 2 月 27 日)
深度学习和毒蘑菇
在对蘑菇或机器学习知之甚少的情况下,使用深度学习网络解决一个常见问题。
简介
机器学习是一个如此迷人的话题,它允许机器学习如何完成历史上需要人类完成的任务。虽然几年前机器学习还需要最强大的超级计算机,但云计算、更便宜的 CPU 和更好的算法的出现让机器学习变得更广泛。今天,高中生可以在普通家用计算机上使用机器学习,其能力可以提供比人类更好的图像分类结果。但首先,这就是为什么我对机器学习,特别是深度学习感到兴奋。
鉴于最近媒体报道了人工智能的进步,特别是深度学习网络的进步,我决定了解一些核心概念,这些概念允许机器在危险中击败人类,围棋,扑克或自动驾驶汽车以及其他许多通常需要人脑的应用。我认为深度学习网络是极其庞大和复杂的分层试错系统,当给定大型数据集和大量计算资源时,它们可以自我学习。
研究深度学习网络
我转向谷歌搜索,以确定 AlphaGo 的技术,这是一种击败世界上最好的围棋选手的人工智能。谷歌使用了一个名为 DeepMind 的深度学习网络系统。在战胜最优秀的人类选手后不久,DeepMind 转而使用开源的深度学习库 TensorFlow。由于对 TensorFlow 了解不多,我继续寻找一个易于管理的切入点,不需要博士学位,以了解 TensorFlow 的基础知识和一些我可以在家里的笔记本电脑上复制的示例。我发现了一个包含 YouTube 视频、GitHub 项目、博客帖子和类似内容的大型资料库。
我发现这两个资源对了解 TensorFlow 最有帮助:
Siraj Raval 的 YouTube 视频,他希望在人工智能方面启发和教育开发人员,这样他们就可以使用 Youtube 视频和 Udacity 开发游戏、音乐、聊天机器人、创造艺术和许多其他很酷的东西。我在 YouTube 上看过他的视频,据说是教你*“在 5 分钟内建立一个 TensorFlow 图像分类器”*。https://youtu.be/QfNvhPx5Px8。
该视频是实践性的,节奏很快,很难跟上,但在看了几遍后,我确信我可以效仿这个例子,并受到启发,创建了我自己的图像分类器,它不是基于达斯·维德和熊猫。
谷歌开发者 Codelabs 正在提供一个名为*“诗人的 tensor flow”*的图像分类示例,它允许你识别给定花的属。这个例子使用了几种,像雏菊、向日葵、蒲公英、郁金香和玫瑰。它提供了一个详细的步骤列表,只要一切按计划进行,就很容易遵循。https://code labs . developers . Google . com/code labs/tensor flow-for-poets/# 0
您可以查看完整说明的链接。
蘑菇是如何发挥作用的
对于图像分类器来说,有什么比将图像与达斯·维德进行匹配更好的用例,可以基于可用的图像库来实现?我转向蘑菇。每当我们在森林里徒步旅行时看到蘑菇,我通常不知道斑点蘑菇是否可以食用。几年前,我和我的合作伙伴认为开发一个可以判断主题是否适合消费的移动应用程序会很棒。只要把你的相机对准蘑菇,应用程序就会告诉你它是否可以食用。需要说明的是,我没有计划构建这样一个应用程序所需的 web 服务,但基于 TensorFlow 的图像分类能够提供当今解决方案中最复杂的部分,人们可以相对容易地构建由深度学习网络支持的蘑菇标识符应用程序。
项目及成果
我是这样做的:
我用谷歌图片搜索下载了 600 张食用蘑菇和同样数量的有毒蘑菇的图片,并将其输入到我基于 TensorFlow 的深度学习网络中。经过大约 30 分钟的训练,精确度和损失函数值都指向正确的方向,所以我知道这个网络能够提供结果。
准确度和损耗的张量图
这个图表显示了深度学习网络的准确性水平。x 轴上的训练步数和 y 轴上的精确度。达到~97%是相当可观的。
在这种情况下,y 轴上的交叉熵用作损失函数。它基本上显示了网络学习的效率。数字越小越好。x 轴上的训练步数。
例:飞木耳
不可食用!毒药(得分= 0.99746)可食用(得分= 0.00230)
例子:鸡油菌
我会吃这些。可食用(得分= 0.96285)毒药(得分= 0.03706)
这是两个最令人印象深刻的结果。还有其他不太确定的结果,我相信这些结果是基于有点不科学的研究图像库,因为网络的准确性相当高。清理图像数据库并使用更大的食用和有毒蘑菇数据集将是一个有趣的项目。
结论
让我惊讶的是,建立并运行一个有效的深度学习网络所需的简单性和低技术知识门槛。这项突破性的技术现在对全世界的开发者和爱好者开放,使用它不需要计算机科学学位。我们正在见证一个重要的转变,强大的机器学习技术正在从少数科学家的实验室转移到成千上万的开发人员手中,他们将提供成千上万的人工智能应用,对我们的生活产生难以想象的影响。TensorFlow 等工具包将使这一切成为可能。
深度学习和土壤科学—第 1 部分
预测土壤性质的土壤光谱学
这是我致力于深度学习在土壤科学中的应用的系列文章的第一篇。我的动机是为了表明深度学习对其他事情有用,而不是对猫和狗的照片或情感进行分类。并不是说猫和狗有什么不好,但是已经有数百万个这样的例子了…
这是一个正在进行的系列,到目前为止还包括:
使用上下文空间信息的数字土壤制图。从点信息生成土壤图的多任务 CNN。
towardsdatascience.com](/deep-learning-and-soil-science-part-2-129e0cb4be94) [## 深度学习和土壤科学—第 3 部分
土壤光谱学与迁移学习。将大陆土壤光谱模式“本地化”到国家范围。
towardsdatascience.com](/deep-learning-and-soil-science-part-3-c793407e4997)
其他与地球科学相关的文章:
使用 SHAP 来证实数字土壤制图 CNN 捕捉到了合理的关系。
towardsdatascience.com](/explaining-a-cnn-generated-soil-map-with-shap-f1ec08a041eb) [## GeoVec:用于地球科学的单词嵌入
词语嵌入的类比、分类、关联和空间插值。
towardsdatascience.com](/geovec-word-embeddings-for-geosciences-ac1e1e854e19)
一点背景知识
土壤科学是一个相对广泛的学科,所以我将尝试给出一些关于我们所做的事情和我们通常处理的数据类型的背景。
现场和实验室的土壤
土壤是一个复合体,可以用多种方式描述,这取决于你是否对它的物理、化学和/或生物特性感兴趣,它在景观中的位置,它与生物圈其他部分的相互作用,等等。
通常,描述从土壤剖面开始。我们挖了一个坑,我们能够看到类似下图的东西。
Soil profile (Spodosol) in Denmark.
图片中你首先注意到的是不同的颜色和不同层次的垂直结构。每一层都有不同的特征,作为土壤科学家,我们有兴趣尽可能全面地描述它们。
典型的描述通常包括现场可观察到的属性(坐标、层厚、颜色等。)和我们在实验室处理样品后获得的信息(pH 值、颗粒大小、营养成分等。).
可以想象,数据采集的现场和实验室部分非常昂贵,因此我们花费大量时间来优化采样设计,预测我们在某个位置会发现什么,并根据更容易、更快或更便宜的测量方法来预测土壤属性。
土壤光谱学
土壤光谱学是一种允许在野外或实验室快速获取土壤信息的技术。简单地说,我们用一束光照射土壤样本,然后测量反射回来的东西。根据样品的成分,反射回仪器(光谱仪)的能量因样品而异,从而获得样品的光谱特征。
Spectral signature of a soil sample.
表示该数据的另一种方式是通过生成频谱图。你可能见过它们被用于音频分析。你可以在这里找到更多关于他们的信息。频谱图的 2D 结构使其成为被卷积神经网络摄取的完美候选。
Spectrum (bottom) and its corresponding spectrogram (top).
卷积神经网络模型
设计卷积神经网络(CNN)是一个高度迭代的过程。有时候感觉更像一门艺术,而不是一门精确的科学。然而,阅读别人的作品并从中获得灵感总是好的。我不会解释它们是如何工作的,但在这里你可以找到一个很好的描述 MNIST 数据集的图像分类的例子。
在设计本研究中使用的 CNN 时,一系列因素引导或限制了这一过程:
- **输入数据的 2D 结构:**声谱图是一个矩阵(1 波段图像),使用 2D-CNN 处理可能更好。
- 数据集规模相对较小:切记数据是从现场样本中获取的,这一点很重要。这意味着去实地,挖一个洞,在实地或在将样本送到实验室后扫描样本。这个过程既费时又费钱。我们在本例中使用的数据集包含来自全欧洲的大约 20,000 个样本。这不是你能找到的最小的数据集,但与用于训练 AlexNet 的数据集(超过 1500 万张图像)相比,还是很小的。很容易过度适应一个小数据集,所以我用了一个小网络。
- **多种输出:**我们可以使用光谱预测许多土壤特性。在这项具体研究中,我们有兴趣预测:a)有机碳含量(OC),b)阳离子交换容量(CEC),c)粘土颗粒尺寸部分,d)砂颗粒尺寸部分,e)水中测得的 pH 值,以及 f)总氮含量(N)。我们可以为他们每个人训练不同的模型,但我对 多任务学习 产生某种协同效应的潜力感兴趣。
最终的网络结构如下所示:
Multi-task network architecture
网络的头部(“公共层”)是图像分类中常见的一系列卷积层和最大池层。网络的这一部分由所有目标土壤属性共享,并且应该能够了解谱图是如何构造的。在“公共层”提取由谱图表示的数据的一般表示之后,信息被导向 6 个不同的分支,每个分支对应一个目标土壤特性。每个分支由一个卷积层(BN)组成,在产生输出之前,卷积层被展平(到 1D)。这些分支应该能够学习光谱图中的信号,这些信号是针对每种土壤特性的。****
结果
与其他传统方法的比较
使用光谱数据预测土壤特性的两种常用模型是立体回归树模型(Quinlan 等人,1992 年)和偏最小二乘回归(PLSMartens 和 Naes,1989 年)。我们使用这些模型作为基线来评估 CNN 的性能。使用光谱(不是光谱图)训练模型,这些光谱是使用文献中常用的一系列方法预处理的:
- 将反射率转换为表观吸光度(a = log10®)。
- Savitzky-Golay 平滑(Savitzky 和 Golay,1964),使用 11 的窗口大小和二阶多项式。
- 边缘修整(< 500 nm and > 2450 纳米)以去除伪影。
- 每十次测量取样一次。
- 应用标准正态变量变换(Barnes 等人,1989)。
下图比较了所有模型(PLS,Cubist,CNN)的预测误差。我们还包括了 CNN 预测单个属性的误差作为参考。
Comparison between PLS, Cubist and CNN for each target property.
CNN 的表现优于 PLS 和 Cubist 模型,多任务 CNN 的表现通常优于单预测 CNN。
多任务学习的协同效应
我认为最有趣的结果是通过使用多任务网络观察到的协同效应。在下图中,您可以看到随着我们增加同时预测的属性数量(我们修改了每种情况下的网络架构,获得了范围[1,6]内的分支数量),预测误差如何减少(pH 除外)。与单独预测 OC 相比,同时预测我们的 6 个属性将 OC 的预测误差降低了近 50%。
Percentage change in error when more properties are predicted simultaneously. X-axes correspond to number of extra variables used, starting from zero. Value next to first point corresponds to the RMSE when only the target property is used. Error bars correspond to the 90% confidence interval.
当网络预测一个属性时,它使用其余的预测属性作为约束预测的“提示”。一个简单的例子是粘土和砂含量的情况。在最普遍的情况下,土壤矿物颗粒被分成 3 组逐渐增大的颗粒:粘土、淤泥和沙子。这三组的比例相加应为 1 (100%)。如果模型预测粘土含量非常高,这是一个暗示,表明砂含量应该很低。显然,6 个属性之间的相互作用更加复杂,但是网络正在捕捉这种效应。因此,我们观察到预测误差的减少。
最后的话
在我的研究小组中,我们通常使用机器学习技术,如随机森林、回归树等。这是我第一次尝试使用卷积神经网络来做一些不同于分类图像的事情。
我特别喜欢这项工作的是多任务学习的协同效应。在我们的头脑中,我们产生了指导我们做决定的规则,CNN 能做类似的事情真是太棒了。
结果很有希望,自从我开始研究这个,我一直在尝试用 CNN 做任何事情!
在接下来的文章中,我将探索一点迁移学习,以及在土壤制图中的一些应用,敬请关注!
引用
关于这项工作的更多细节可以在相应的论文中找到。
Padarian,j .,Minasny,b .和 McBratney,A.B .,2018。使用深度学习从区域光谱数据预测土壤特性。地域晶洞。https://doi.org/10.1016/j.geodrs.2018.e00198
参考
- 巴恩斯,r .,达诺亚,硕士和李斯特,S. J. (1989)。近红外漫反射光谱的标准正态变量变换和去趋势。应用光谱学 43 (5),772–777。
- 马滕斯,h .和奈斯,T. (1989 年)。多元校准。约翰·威利父子公司。
- 昆兰,J. R. 等 (1992)。连续上课学习。第五届澳大利亚人工智能联合会议。第 92 卷。新加坡,第 343-348 页。
- 萨维茨基和戈雷(1964 年)。用简化的最小二乘法对数据进行平滑和微分。分析化学 36 (8),1627–1639。
深度学习和土壤科学—第二部分
利用上下文空间信息的数字土壤制图
这是我致力于深度学习在土壤科学中的应用的系列文章的第二篇。这是一个正在进行的系列,到目前为止还包括:
预测土壤性质的土壤光谱学。根据光谱图预测多种土壤特性的多任务卷积神经网络。
towardsdatascience.com](/deep-learning-and-soil-science-part-1-8c0669b18097) [## 深度学习和土壤科学—第 3 部分
土壤光谱学与迁移学习。将大陆土壤光谱模式“本地化”到国家范围。
towardsdatascience.com](/deep-learning-and-soil-science-part-3-c793407e4997)
其他与地球科学相关的文章:
词语嵌入的类比、分类、关联和空间插值。
towardsdatascience.com](/geovec-word-embeddings-for-geosciences-ac1e1e854e19)
在本系列的第一部分,我给出了土壤科学家如何收集信息的一些背景,这通常涉及一些实地工作和实验室分析。这是一个昂贵而耗时的过程,这也是我们试图建立模型来预测土壤特性的原因之一。
在本文中,我将重点放在生成地图的空间模型上。首先,我给出了一些关于传统的和“机器学习”方法制作土壤图的背景。然后,我深入探讨了为什么上下文信息很重要,以及我们如何使用卷积神经网络(CNN)来利用这些信息。
语境
土壤理论史
19 世纪晚期,负责绘制俄罗斯帝国土壤图的地质学家和地理学家 v·v·道库恰耶夫提出了土壤形成(以及变化)取决于多种因素的观点,包括其母质、气候、地形、植被和时间。这个一般概念是现代土壤学(土壤研究)的基础。
传统土壤制图
人类绘制土壤地图已经有很长时间了。为了税收等目的,决定在哪里种什么。要了解土壤和自然界,观察是整个过程的关键部分。在野外,挖好坑后,我们描述土壤剖面和它的地层,试图了解它的历史。但这只是故事的一部分。由于这个坑被淹没在景观中,土壤学家在得出任何结论(或绘制地图)之前都要观察周围环境。
描述观察完了,就该画图了!你将所有点(坑)放在一张白纸上,并根据以下两个因素在它们周围画多边形:1)它们的相似性(不相似性)和 2)关于形成因素的信息。过了一段时间(在本例中可能是很多年),您会得到如下结果:
Humus content in Russian soils. Dokuchaev (1883).
数字土壤制图
自从道库恰耶夫的工作以来,情况发生了变化。理论上不多,但我们如何观察自然,如何处理数据。现在,技术出现在大部分过程中,从 GPS 获得坑的准确位置,到描述土壤形成因素的卫星图像。
在传统的土壤制图中,通过观察形成因素之间的相互作用得出的结论是在土壤科学家的头脑中得出的。在数字土壤制图(DSM)中,整个过程现在由建模和机器学习来辅助。土壤学家可以了解到山谷中的土壤不同于山坡上的土壤。我们当然可以训练一个模型做同样的事情,对吗?
DSM 是土壤科学的一个动态子领域,所以很难概括社区正在做的一切。我们使用从线性回归到随机森林的模型。我们有许多来源来获得预测因子(形成因素),包括卫星图像和衍生产品。要获得更多关于 DSM 的信息,我建议你参考 McBratney 等人 (2003)。
卷积神经网络和 DSM
正如我在前面提到的,需求侧管理的理论背景是基于土壤属性和土壤形成因素之间的关系。在实践中,单个土壤观测值通常被描述为坐标为(x,y)
的点p
,相应的土壤形成因子由同一位置的多个协变量栅格(a1,a2,…,an)
的像素值的向量表示,其中n
是协变量栅格的总数。
这种点表示无疑是有用的,但它相当于土壤科学家只查看土壤剖面,而不考虑周围的景观。为了完成这幅图,我们可以将模型暴露在每次观察的空间环境中…相当于走出土坑,四处张望。
在 CNN 的帮助下,我们可以扩展传统的 DSM 方法,包括关于(x,y)
附近的信息,并充分利用土壤观测的空间背景。我们可以用形状为(w,h,n)
的 3D 数组替换协变量向量,其中w
和h
是以点p
为中心的窗口的宽度和高度,以像素为单位。
Representation of the vicinity around a soil observation p
, for n
number of covariate rasters. w
and h
are the width and height in pixels, respectively. Each raster A
is a proxy for a forming factor.
因为我是多任务学习的爱好者,所以我们使用具有 3D 阵列的 CNN 作为输入,并基于数字高程模型、坡度、地形湿度指数、长期年平均温度和年总降雨量,生成了 5 个深度范围的土壤属性(土壤有机碳)预测。网络看起来像这样:
Multi-task network architecture
网络负责人(“共享层”)提取数据的通用表示,然后将该数据导向 5 个不同的分支,每个分支对应一个目标深度。分支应该能够学习特定于每个深度的信号。****
结果
数据扩充
数据扩充是机器学习中常见的预处理。当我们谈论地图时,我们通常有兴趣点的俯视图,因此增加数据的最简单方法是旋转。这里我们将图像旋转了 90 度、180 度和 270 度。这样做有两个好处:
- 最明显的优势是,我们有效地将观察次数增加了四倍。
- 第二个优点是,我们通过引入旋转不变性来帮助模型进行更鲁棒的概括。
Effect of using data augmentation as a pre-treatment.
正如预期的那样,数据扩充在减少模型误差和可变性方面是有效的(图 4)。我们观察到平均误差在 0-5、5-15、15-30、30-60 和 60-100 厘米深度范围内分别降低了 10.56、10.56、11.25、14.51 和 24.77%。
邻域大小
Effect of vicinity size on prediction error (RMSE, y-axis), by depth range. Ref_1x1 corresponds to a fully connected neural network without any surrounding pixels. Ref_Cubist corresponds to the Cubist models used in a previous study (Padarian et al., 2017).
邻域窗口(邻域)的大小对预测误差有显著影响(图 5)。大于 9 像素的尺寸显示误差增加。在本例中,对于 100 米网格大小的国家级 SOC 制图,150 至 450 米半径的信息是有用的。该范围类似于 Paterson 等人在一篇综述中报告的耕地的空间相关性范围。(2018),其中,基于 41 个变异函数,作者估计平均空间相关范围约为 400 m。由于我们使用了相对粗糙的像素分辨率(100m),因此很难判断提高 SOC 预测所需的最小上下文量。我们相信使用更高的分辨率(<10 米)可以产生更多关于这个问题的见解。
将 CNN 的结果与更传统的方法(Cubist)进行比较,对于 0-5、5-15、15-30、30-60 和 60-100 厘米的深度范围,CNN 分别显著降低了 23.0、23.8、26.9、35.8 和 39.8%的误差。
多层土壤预测
在 DSM 中,有两种主要方法来处理土壤性质的垂直变化。您可以逐层进行预测(深度是隐式的),或者在模型中包含深度(深度是显式的)。这两种方法都表明,随着预测深度的增加,模型解释的方差会减小。这是意料之中的,因为用作协变量的信息通常代表地表条件。
在这项研究中,我们可以再次看到使用多任务 CNN 的协同效应(我在第一篇文章中谈到过)。如下图所示,在这种情况下,模型解释的差异实际上随着深度而增加。不应该在模型和数据集之间比较 R 的绝对值,但是绝对有可能比较趋势。
Percentage change in model R² in function of depth.
我想这是我喜欢多任务 CNN 的主要原因。但是请注意,它并不总是有效的…在以后的帖子中,我会给你看一些例子。
地图呢?
如果你已经到了这一步,你绝对值得拥有一张地图!毕竟,这就是介绍的内容,对吗?这项研究是利用智利的土壤信息进行的。在下图中,你可以看到一个小测试区域的预测示例(最终我会分享一个完整地图的链接)。
Detailed view of (left panel) map generated by a Cubist model (Padarian et al., 2017) and (right panel) model generated by the multi-task CNN.
视觉上,与传统模型(立体派)相比,CNN 生成的地图显示出一些差异。使用 Cubist 模型生成的地图显示了与地形相关的更多细节,但由于树规则生成的明显限制,也会出现一些假象,并且可能会出现协变量栅格的一些假象。另一方面,使用 CNN 生成的地图显示了平滑效果,这是使用相邻像素的预期行为结果。
很难从视觉上评价一幅地图,因为我们不可避免地基于审美来判断它。现实有多平滑或尖锐?这是我所在领域正在进行的讨论。传统的土壤多边形并不是描述土壤的最佳方式,因为土壤是一个连续体,但我们不难发现两种土壤之间存在明显变化的情况,因此非常平滑的栅格可能是错误的…最有可能的解决方案是介于两者之间。
(编辑)解释模型
在不同的场景中测试了这种方法之后,很明显,我们需要一种方法来解释 CNN 模型,至少证实它们捕捉到了 SOC 和预测者之间的合理关系。在下面链接的文章中,你可以读到我是如何利用 SHAP 价值观做到这一点的。
使用 SHAP 来证实数字土壤制图 CNN 捕捉到了合理的关系。
towardsdatascience.com](/explaining-a-cnn-generated-soil-map-with-shap-f1ec08a041eb)
最后的话
数字土壤制图是一个非常有趣和动态的学科,很高兴看到像卷积神经网络这样的方法在这里适用。直观地说,一种能够利用背景空间信息的方法完全符合土壤科学的理论框架。
此外,我们再次看到了多任务网络的协同效应,通过在更深的层中调整预测。如果模型已经做出了预测顶层的努力,那么它肯定应该使用它来指导更深层的预测!这正是土壤科学家在描述剖面图时所做的事情!
我已经承诺了一个关于迁移学习的帖子,希望这将是下一个帖子。我有一个半生不熟的草稿,但是我的博士学位让我很忙…所以请耐心点!
引用
关于这项工作的更多细节可以在相应的论文中找到。
帕达里安,j .,米纳斯尼,b .,和麦克布拉特尼,A. B .,2019。使用深度学习进行数字土壤制图,土壤,5,79–89,https://doi.org/10.5194/soil-5-79-2019。
注 04/09/2018: 该文件尚未被接受,并在 2018 年 10 月 15 日之前接受公众审查和讨论。欢迎您参与这一过程。
注 27/02/2019: 论文已被接受并发表。
参考
道库恰耶夫,弗吉尼亚州,1883 年。黑钙土带土壤上层腐殖质含量示意图:对“俄罗斯黑钙土”一书的补充。
2003 年获学士学位的麦克布拉特尼、获硕士学位的桑托斯和获学士学位的米纳斯尼。论数字土壤制图。《地球学报》,第 117 卷第 1-2 期,第 3-52 页。
Padarian,b . minas ny 和 and McBratney:智利和智利土壤网格:对 GlobalSoilMap 的贡献,Geoderma Regional,9,17–28,2017。
Paterson,s .、McBratney,A. B .、Minasny,b .和 Pringle,M. J .:农业和环境应用的土壤特性变异图,载于:土壤计量学,第 623-667 页,Springer,2018 年。
承认
我要感谢我的编辑 Clara da Costa-Reidel 的更正。有一个有科学背景的人来校对你的作品真是太好了!
深度学习和视觉问答
视觉问答是关于建立一个计算机系统来回答用图像和自然语言表达的问题的研究领域。首先,我们来考察一下视觉问答中的三个数据集。
VQA 数据集
Figure 1. VQA Dataset from www.visualqa.org
在来自 www.visualqa.org 的VQA 数据集中,计算机系统需要解决问题,例如,二进制分类问题(伞是不是颠倒的?),一个计数问题(床上有几个孩子?),或者一个开放式的问题(谁戴着眼镜?孩子设定在哪里?)
CLEVR 数据集
Figure 2. CLEVR Dataset from Stanford
在斯坦福 的 CLEVR 数据集里,计算机系统需要回答关于物体的形状/颜色/大小/材料,以及其空间/逻辑关系的问题。
图 QA 数据集
Figure 3. FigureQA from Maluuba
在来自 Maluuba 的 图 QA 数据集中,计算机系统需要回答以条形图、饼状图或线图呈现的问题。
视觉问答和深度学习
因为视觉问答需要涉及图像识别和自然语言处理的技术,所以研究的一个主要方向是在深度学习上:使用卷积神经网络(CNN) 进行图像识别,使用递归神经网络(RNN) 进行自然语言处理,然后将结果组合起来给出最终答案,如图图 4 所示。
Figure 4. Combining CNN/RNN for VQA
Keras给出了视觉问答的通用模型,如图图 5** 所示。**
Figure 5. VQA/CNN/RNN Model from keras.io
- 第 1–4 行:导入 Keras
- 第 6–21 行:实现 CNN 进行图像识别
- 第 23–26 行:实现自然语言处理的 RNN
- 综合 CNN 和 RNN 的结果,给出最终答案
视觉问答与关系网络
在视觉问答领域,一个有趣且重要的想法是由deep mind[1,2]提出的关系网络**。关系网的主要目的是探索图像和问题中呈现的对象之间的空间关系或逻辑关系,如***“…与图 6 问题中的*** 大小相同,以及***“…在图 7 问题中的*** 的左侧。**
Figure 6. non-relational questions and relational questions in CLEVR Dataset
Figure 7. the model of relation network
图 7 示出了视觉问答系统内部的关系网络的架构。注意,关系网络可能在基于对象到对象的或基于特征到特征的中探索关系。图 8 显示了 Keras/Theano 中特征提取和关系提取的简单实现。
Figure 8. a simple implementaion of feature extraction and relation extraction in Keras/Theano
结论
****视觉问答是一项有趣的挑战,结合了不同的学科,包括计算机视觉、自然语言理解和深度学习。希望我们能在 Medium 下看到更多这方面的文章。
参考
[1] VQA 数据集
[2] CLEVR 数据集
[3] 图 QA 数据集
[4] 科拉斯 VQA 模型
[5] 来自 DeepMind 的关系网
[6] 视觉问答的人工智能进度测量
理解人类推理的深度学习方法
对于一个正在使用深度学习来发现患者是否患有多发性硬化症的医生来说,从模型中获得是或否的答案一点也不好。对于自动驾驶汽车这样的安全关键应用,预测碰撞是不够的。迫切需要让机器学习模型对其断言进行推理,并向人类表达出来。由 Devi Parikh、Druv Batra【17】所做的视觉问题回答工作以及由费-李非团队所做的关于理解视觉关系的工作【16】是实现这一点的少数线索。但是在学习推理结构方面还有很长的路要走。所以在这篇博客中,我们将讨论,如何将推理整合到 CNN 和知识图中。
长期以来,推理被理解为一堆演绎和归纳。抽象符号逻辑的研究使得这些概念规范化,正如约翰·维恩在 1881 年所描述的。就像我们做的那些智商测试。A 暗示 B,B 暗示 C,所以 A 暗示 C,等等。把它想象成一堆逻辑方程。
但后来,这种固定的归纳/演绎推理的思想在 1975 年被扎德【2】所拆解,他在那里描述了近似推理的概念。它还引入了与数字变量(年龄=21、15、19、57、42、72)相对的术语,称为语言变量(年龄=年轻、非常年轻、非常年轻、非常年轻、年老、非常年老、非常年老),这形成了通过单词【3】建立模糊逻辑的基础。这是一种标准化,考虑到推理中的模糊性或歧义性。
例如,在我们的日常语言中,我们不会说“我在和一个身高 173 cm 的 21 岁男性说话,我会说“我在和一个高个子年轻小伙子说话”。因此,模糊逻辑在构建推理模型时考虑到了论证的模糊性。
尽管包含了模糊性,但它不能抓住人类推理的本质。其中一个解释可能是,除了像“ A 不是 B,B 是 C,意味着 A 不是 C ”这样的简单推理之外,在人类理性的情况下,还有一个压倒性的隐含推理元素。在一瞬间,人类可以推断出事情,而不需要经过一系列的步骤。有时候这也是本能。如果你有一只宠物狗,那么你知道当你从它嘴里抢走玩具时它会做什么。
随着时间的推移,人类表现出抽象和改进推理的显式形式(一次性的、可区分的记忆)的非凡能力。这意味着它不是以纯粹的统计形式炮制出来的。基于统计学习【4】的语言模型是内隐学习的一个例子,在这里我们不使用任何规则、命题、模糊逻辑。相反,我们允许时间模型学习长程相关性【5】【6】。你可以把它想象成手机的自动完成功能。
您可以训练推理结构来预测最符合逻辑的短语,或者让统计方法来预测概率上合适的完成短语。
这些类型的模型不能用于单词或图像的罕见出现,因为它们由于罕见而忘记了这些信息。它也不能概括一个概念。例如,如果我们看到一种类型的奶牛,我们能够将我们的学习推广到所有其他类型的奶牛。如果我们听过一次话语,我们就能识别出它在不同口音、方言和韵律中的变体。
一次性学习【7】为学习一个罕见的事件铺平了道路,这是基于我们利用过去知识的能力,不管它多么不相关。如果一个人从出生起就只见过正方形和三角形,就像臭名昭著的猫实验【8】),然后第一次接触到一只鹿,一个人就不会仅仅把它记为一个图像,还会下意识地存储其相似度 w.r.t 正方形和三角形。对于一次性学习,记忆库变得必不可少。内存必须与核心模型交互,以使它更有效地学习和更快地推理。****
One Shot Learning
我知道你可能会纠结于这个学期。这里有一个简单的例子,我们用 Imagenet 进行一次性学习。现在把 1000 类图像网络想象成一场真人秀的评委,比如猴子、人类、汽车等等。每个人都根据是猴子还是人类的可能性来打分。
让我们假设有一个第 1001 个类的模型没有被训练。如果我从这堂课上拿两个项目,那么它们都不会给出一个有把握的分数,但是如果我们看看这两个项目的 1000 向量分数,它们可能有相似性。例如加拉帕戈斯蜥蜴,可能比任何其他类别的法官得到更多鳄鱼和蜥蜴的投票。评委们肯定会给加拉帕戈斯蜥蜴的图像打相似的分数,尽管它不在类别列表中,而且在训练数据中甚至没有一张图像。这种基于特征相似性的聚类是一次性学习的最简单形式。
桑托罗【9】最近关于记忆增强神经网络的工作考虑通过可微分的记忆操作来自动化与记忆的交互,这是受神经图灵机【10】的启发。
因此,网络学习决定它认为有用的特征向量,与它从未见过的类一起存储在可区分的存储块中。这种表现形式一直在演变。它赋予了神经网络学习“如何快速学习”的能力,这就是为什么他们称之为元学习。所以它开始表现得更像人类。我们把过去和现在联系起来的能力是惊人的。例如“如果我没有见过这种奇怪的外星生物,我仍然可以说它看起来更像狒狒或长着牛角的大猩猩。
从这次讨论中得到的关键信息是
1.基于模糊逻辑的纯显式推理未能抓住人类推理的本质。
2.像传统的一次性学习这样的隐式模型本身无法从罕见事件中归纳或学习。它需要增加记忆。
这种增强记忆的结构可以是由 cho,sutskever【5】【6】提出的 LSTM 的形式,或者它可以是像 santoro 最近的工作那样的动态查找表。【9】。这种动态查找可以基于本吉奥实验室的 Sungjin 提出的外部知识图【11】进一步丰富。这就是所谓的神经知识语言模型。
假设你想学习如何完成一个不完整的句子。现在,我可以通过简单的序列到序列模型来实现这一点。但是这样不好,因为命名实体很少出现。它以前很少听到“Crazymuse”。但是,如果我们学会从知识图中获取命名实体,通过识别主题或关系,并识别是从 LSTM 还是从知识图中获取,那么我们就可以用甚至很少的命名实体来完成句子。这是一种将丰富的知识图和神经网络结合起来的非常棒的方式。感谢 Reddit ML 组和“你在读什么”主题,我读了一组精选的论文。
现在,我们刚刚学到的知识打开了推理和推断的可能性,因为知识表示(主语、谓语、宾语)允许我们执行更复杂的推理任务,类似于显式模糊逻辑和隐式统计学习。
这种从知识图中学习检索的能力连同注意力机制【13】可以导向可解释的模型。
诸如 SQUAD【14】【15】之类的问答数据集的可用性有助于在可推断语言模型方面取得重大进展。近期作品在视觉问答【16】【17】【18】使用视觉基因组【19】、CLEVR【20】和 VRD【21】等数据集以
Evolution of Architectures to learn Reasoning
但是,尽管基于场景理解的背景问答有所进步,但还是有一些限制
1.将 LSTMs 用于基于记忆的模型并学习视觉关系方面的注意力转移【16】无疑提高了对上下文的理解和概括能力。但是在学习和提高推理的标准形式方面还有很多工作要做。
2.使用卷积神经网络的结构化流水线的窒息使得该模型对于人类解释是不透明的。它可能适用于基本分类和领域特定的生成任务,但不是为推理而设计的。相反,如果我们能够像 Tom Mitchell在“永不停止的学习”中提出的那样,直接学习知识图和本体中更丰富的多模态实体表示就好了。然后,我们可以学习跨领域的推理结构,并迫使模型更好地阐明其对实体关系的理解。
我梦想有一天,机器将学会推理。有一天,我们可以问机器,为什么你认为这个人有多发性硬化症。然后,它可以找到词语来阐明它的推理。我知道纳夫塔利在信息瓶颈原理方面的工作,以及林可唯的【24】在永无止境的学习方面的工作。但是缺少的是主动学习模糊逻辑提供的基本推理结构的抽象。你可以通过奖励来学习最优策略,或者基于一次性学习原则的某种验证,或者一些基于半监督图的方法来驱动它。但是不管驱动因素是什么,模型都需要学习提高推理能力。模型需要学习将这个推理引擎与来自声音或图像的丰富特征表示关联起来,这甚至可能催化“改进表示、改进推理、改进表示、改进推理”的循环,就像策略迭代一样。最重要的是,模型应该能够清晰地向人类表达抽象概念,并说,“嘿,人类,我认为猫很可爱,因为它们的眼睛像婴儿的眼睛,充满活力,不像你单调的日常生活”
在那之前,让我们继续训练模型,继续梦想模型建立并运行的那一天。因为梦想变成现实的速度超乎你的想象!
关于我
Jaley 是 youtuber 和创作者在Edyoda(www . Edyoda . com)。他过去是哈曼公司的高级数据科学家,对人类推理的结构非常好奇。****
对 独立研究刊物 鼓掌表示支持。
我的微课相关知识图
课程链接: 知识图谱与深度学习
参考
【洛杉矶】扎德。语言变量的概念及其在近似推理中的应用——信息科学,8(3):199–249,1975。
洛特菲·扎德。模糊逻辑=用文字计算。IEEE 模糊系统汇刊,4(2):103–111,1996。
[4] 尤金·查尔尼亚克。统计语言学习。麻省理工学院出版社,1996 年。
伊利亚·苏茨基弗、奥里奥尔·维尼亚尔斯和阔克·V·勒。用神经网络进行序列间学习。《神经信息处理系统进展》,第 3104–3112 页,2014 年。
李菲菲、罗布·弗格斯和皮埃特罗·佩罗娜。对象类别的一次性学习。IEEE 模式分析和机器智能汇刊,28(4):594–611,2006。
大卫·罗斯和科林·布莱克莫尔。猫视觉皮层的方位选择性分析。实验性大脑研究,20(1):1–17,1974。
[9]亚当·桑托罗、谢尔盖·巴图诺夫、马修·伯特温尼克、金奎大·威斯特拉和蒂莫西·莉莉卡普。记忆增强神经网络的元学习。在机器学习国际会议上,第 1842-1850 页,2016 年。
亚历克斯·格雷夫斯、格雷格·韦恩和伊沃·达尼埃尔卡。神经图灵机。arXiv 预印本 arXiv:1410.5401,2014。
[11] Sungjin Ahn、Heeyoul Choi、Tanel Pä rnamaa 和 Yoshua Bengio。一种神经知识语言模型。arXiv 预印本 arXiv:1608.00318,2016。【12】凯文·徐、吉米·巴、瑞安·基罗斯、赵京贤、亚伦·库维尔、鲁斯兰·萨拉库迪诺夫、里奇·泽梅尔、约舒阿·本吉奥。展示、参与和讲述:具有视觉注意力的神经图像字幕生成。在机器学习国际会议上,第 2048–2057 页,2015 年。
[13] 罗伯特·戴西蒙和约翰·邓肯。选择性视觉注意的神经机制。神经科学年度评论,18(1):193–222,1995。
[14] 普拉纳夫·拉杰普尔卡、、康斯坦丁·洛皮列夫和珀西·梁。小队:机器理解文本的 10 万+题。arXiv 预印本 arXiv:1606.05250,2016。
[15] Pranav Rajpurkar,Robin Jia 和 Percy Liang。知道你不知道的:无法回答的问题。arXiv 预印本 arXiv:1806.03822,2018。
兰杰·克里希纳、伊内斯·横山雅美、迈克尔·伯恩斯坦和李菲菲。推荐关系。IEEE 计算机视觉和模式识别会议论文集,第 6867-6876 页,2018 年。
[17]斯坦尼斯劳·安托尔、艾西瓦娅·阿格拉瓦尔、贾森·卢、、德鲁夫·巴特拉、C·劳伦斯·兹尼克和德维·帕里克。Vqa:视觉问答。IEEE 计算机视觉国际会议论文集,第 2425–2433 页,2015 年。
[20]贾斯廷·约翰逊、巴拉思·哈里哈兰、劳伦斯·范德马腾、李菲菲、劳伦斯·兹尼克和罗斯·吉希克。Clevr:组合语言和初级视觉推理的诊断数据集。计算机视觉与模式识别(CVPR),2017 年 IEEE 会议,第 1988–1997 页。IEEE,2017。
[21] 吴策·卢、兰杰·克里希纳、迈克尔·伯恩斯坦和李菲菲。基于语言先验的视觉关系检测。在 2016 年欧洲计算机视觉会议上
【22】纪、、何、徐、、。基于动态映射矩阵的知识图嵌入。《计算语言学协会第 53 届年会暨第 7 届自然语言处理国际联合会议论文集》(第 1 卷:长论文),第 1 卷,第 687–696 页,2015 年。
[23] 安托万·博德斯、尼古拉斯·乌苏尼尔、阿尔韦托·加西亚·杜兰、杰森·韦斯顿和奥克萨纳·亚赫年科。翻译用于多关系数据建模的嵌入。《神经信息处理系统进展》,第 2787-2795 页,2013 年。
大规模深度学习:-精确、大型迷你批量 SGD:
使用分布式计算(😄大数据)有一段时间,我想知道深度学习算法如何扩展到多个节点。脸书人工智能研究中心(FAIR)最近发表了一篇论文,介绍了他们如何在 ImageNet 数据集上成功运行 resnet-50 层模型,使用 256 个 GPU 在一小时内小批量处理 8192 张图像。我相信本文中介绍的许多信息适用于试图在多 GPU 设置上快速构建模型的每个人。在这篇文章中,我总结了论文中的关键观点,当你试图扩展深度学习实现时,这些观点将是有用的。
关键见解:
- 分布式同步 SGD 提供了一种解决方案,可以将 SGD 小批量划分到一堆节点上,这些节点可以是多个 GPU。
- 大的小批量导致优化困难,并且有解决它的技术。
- 使用线性比例规则来调整学习率,学习率是小批量和预热方案的函数。
为什么规模很重要?
最近的事实证明,当提供大量数据时,深度学习算法工作得更好。随着更多的数据,它显示了计算机视觉,自然语言处理和语音领域的巨大进步。但是,在 256 个节点的规模上运行像 Resnet -50 这样的架构也有其自身的挑战。
什么是分布式同步 SGD?
下面是 SGD 公式。
其中 X 是总数据集,X 是来自数据集的样本,l(x,w)是针对标签的每个样本计算的损失(交叉熵损失)。
但在实践中,我们使用迷你批量 SGD,计算每批的损耗和梯度,并相应地修改权重。如下所述。
其中β代表最小批量,它是 X 的子集。
在分布式同步 SGD 的情况下,每个 GPU 在小批量数据的子集上运行相同的图形,一旦 GPU 完成处理,权重被传输到参数服务器,参数服务器聚集来自多个 GPU 的所有梯度并发送回它们。
需要应用一些技巧,如线性缩放、预热策略,以使模型达到与在单个 GPU 上以较小批量训练的模型相当的结果。
Source : Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
为什么技巧很重要?
使用 1000 数量级的大批量的一个主要挑战是,当以正常学习速率训练时,梯度倾向于振荡。因此,实验表明,当批量增加时,很难进行训练。
提出了三种重要的解决方案来缓解上述问题。
- 线性标度法则
- 热身策略
- 大型迷你批次的批次标准化
什么是线性比例法则?
使用大批量的能力对于跨多个工作节点并行处理图像是非常有用的。所有的线性比例规则说的是将学习率提高“k”倍。其中“k”是批量增加的次数。虽然这个规则很简单,但它却是一个强有力的规则。
Source : Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
带有(a)的图像显示了仅应用线性比例规则时模型的表现。查看结果,很明显,批量大小为 8k 的模型表现得几乎与用正常批量训练的模型一样好。预热策略有助于模型表现得与用较小批量训练的模型一样好。
什么是热身策略?
讨论了两种标记策略。一种是持续预热和逐渐预热。
**恒定预热:**在恒定预热中,你用很小的学习率对模型进行几个时期(文中 5 个时期)的训练,然后将学习率提高到“k 倍学习率”。然而,当学习速率改变时,这种方法导致训练误差的尖峰。在上面的(b)图中可以看到观察结果。与简单的线性标度规则相比,模型的训练误差也更高。
**渐进热身:**顾名思义,你从一个小的学习速率开始,然后在每个历元以一个常数逐渐增加,直到达到“k 倍学习速率”。这种方法有助于模型在大批量(本例中为 8k)时表现更好,这与用较小批量训练的模型的训练误差相当。
使用大批量时,批量规范化有什么特殊之处?
批次归一化计算小批次中样本的统计数据。当我们计算跨多个节点的样本损失时,一个样本的损失独立于另一个样本是很重要的。但是,当您使用批量标准化时,一个样本的损失函数不再独立于其他损失函数。计算的小批量统计数据是损失的关键组成部分。如果每个工人的小批量样本大小发生变化,它会影响正在优化的基本损失函数。
因此,建议在所有工人节点上保持最小批量大小相同,在本文中,每个工人有 32 个样本,工人数量为 256。应该在节点(大小为 32)级别而不是批处理级别(大小为 8k)计算批处理规范化。
分布式 SGD 的微妙之处和缺陷:
- 缩放交叉熵损失不等同于缩放学习率。
- 有两种应用动量的流行方法,一种是在使用学习率之前计算(eq 9),另一种是使用学习率(eq 10)。
Source : Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
Source : Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
观察到在改变学习率之后应用动量校正提供了更多的训练稳定性。
3.执行梯度聚合时,通过 kn 而不是 n 来归一化每个工作节点中的梯度。“n”表示每个工作节点处理的样本数,“k”表示工作节点的总数。
本文还描述了用于网络通信的算法、使用的软件、使用的硬件以及使用各种超参数进行的实验。如果你打算尽快扩大规模,这是一本必读的书。
很快会看到另一篇文章😃
深度学习笔记,第三章(第一部分):概率导论
这些是我对深度学习这本书第三章的笔记的第一部分。它们也可以作为概率的快速入门。这些笔记涵盖了这一章的大约一半(介绍性概率的部分),后续的文章将涵盖其余部分(一些更高级的概率和信息理论)。
我在第二章的笔记可以在这里找到:
这些是我对深度学习书第二章的笔记。它们也可以作为线性代数的快速介绍…
becominghuman.ai](https://becominghuman.ai/deep-learning-book-notes-chapter-2-linear-algebra-for-deep-learning-af776cf52506)
像往常一样,这篇文章基于一个 Jupyter 笔记本,可以在这里找到。
书籍推荐
可能性
出自本书:
- 概率论:科学的逻辑 杰恩斯著。
我的评论: (还)没看。然而,如果你是概率新手,我不建议你这么做。引用这本书的序言: “下面的材料是写给已经熟悉应用数学的读者的,在大学本科或更高的水平。”你可能不知道高等本科或更高层次的应用数学,如果你知道,你可能已经知道足够的概率,这可能不是你目前的主要优先事项。也就是说,这绝对是一本关于概率的经典研究生教材,值得放在你的数学书籍清单上阅读。请注意,它没有太多的练习,而且它所做的练习更多的是关于完成书中的证明,而不是练习(我猜这与它是一本研究生书是一致的)。
本人推荐:
-
概率导论布利茨坦和黄。
我的评论: 不错,引人入胜的书,很好地覆盖了概率最重要的方面。使用故事、代码和许多练习,其中一些有在线解决方案。 100%推荐,如果你已经不太懂概率的话肯定适合。请注意,你需要了解一些微积分来阅读它,因为概率经常涉及积分和导数。
我唯一的批评:有解决方案的练习太少,练习的交错应该更精细(即应该在每一节的结尾有练习,而不是在每一章的结尾),如果代码是 Python 而不是 R 就好了;).
这本书也是基于哈佛大学的统计数据 110,你可以在这里观看: -
贝特塞卡斯和齐茨克里斯的概率 导论。
我的评论: 没看过,但显然挺有说服力的。应该与上面的另一本《概率导论》相当相似,事实上,几乎可以说这本书是“麻省理工版本”,而前一本是“哈佛版本”。这个还附带了开放式课程视频: -
海明的概率艺术 。我的评论:我没有读过这本书,但我确实买了它,因为我在研究为这篇文章推荐的书籍,因为它看起来很有竞争力。引用其中一篇评论:
“海明对概率的贡献就像费曼在他的讲座中对物理学的贡献一样。” 这本书似乎也呈现了一些信息论,这是我们目前深度学习书章节的另一个话题! -
*数学和尚 概率初级读本 。
**我的评论:*这是一个 Khanacademy 风格的 youtube 播放列表。我把它包括在内,因为这可能是学习一些应用于概率的测度理论的最简单的方法,因为我相信除了杰恩斯以外,上面没有任何一本书提到测度理论。深度学习需要了解什么测度理论吗?几乎肯定不会,但人们可能会参考它(例如,深度学习的书会参考),对它有一些模糊的概念会很有用。
信息论
出自本书:
- 信息论的要素 由盖和托马斯。
我的评论: 没看过。坦白地说,我从来没有读过任何一本专门关于信息论的书。然而,这基本上被认为是信息论上的经典。坦白地说,对于深度学习,你可能不需要非常深入地了解信息论,但如果你确实想学习它,阅读这本书似乎是一个不错的方法。 - 信息理论、推理和学习算法 麦凯著。
我的评论: 我也没看过。然而,我推荐它多于,原因如下:
-它在亚马逊上的评论比封面&托马斯好。
-它明确涵盖了机器学习背景下的信息论。
-是免费的!!!!!!!!!
我的推荐:
(目前)没有。
可能性
什么?
也许描述概率的一种方式类似于逻辑,但是当不确定性出现时。
例如,逻辑可以接受“如果某物会飞,那么它是一只鸟”和“如果某物是一只鸟,那么它是美味的”这样的陈述,并允许我们推断出“如果某物会飞,那么它是美味的”,但是在并非所有会飞的都是鸟或者并非所有是鸟的都是美味的情况下,它对我们没有帮助。概率可以:有了概率,我们就可以知道“如果一个东西会飞,那么有 90%的可能是一只鸟”和“如果是一只鸟,有 80%的可能是美味的,否则肯定不好吃”。由此我们可以推断,有 72%的可能性会飞的东西是美味的,这是我们用逻辑无法做到的。
“频繁主义者”和“贝叶斯”对概率的解释是有区别的……我不会对此做过多解释。坦率地说,大多数人通常在不同的情况下使用这两种方法,这本质上可以归结为,他们接受我们在日常生活中用概率语言谈论的几乎所有事情确实是概率。
这里有一个关于这个话题的有趣视频:
为什么?
那么深度学习为什么需要概率呢?根据这本书,有两个原因:
- 概率推理在这个世界上是必要的,因为很少有事情是确定的,所以我们的人工智能系统应该使用概率规则进行推理。
举一个具体的深度学习例子,就拿下面的 MNIST 形象来说。是奇怪的 4 还是奇怪的 9?结果是 4,你可能会认为这是最合理的答案,但我相信你不会肯定地说,这就是为什么你的深度学习算法似乎也不必肯定地给出答案。
- 我们经常需要对深度学习算法进行概率分析。
举个简单的例子,当我们评估一个分类模型时,我们经常使用它的准确度,这毕竟是模型在给定一个例子的情况下输出正确答案的概率。更复杂的是,我们可以问这样的问题,比如“如果我给它 N 个例子来训练,我的算法将具有精度 X 的概率是多少”,就像在 PAC learning 中一样,等等。
在我看来,有一个关键的原因被忽略了,那就是逻辑是离散的而概率是连续的*。就拿这张图来说吧,是狗还是猫?*
我想我们都同意这里不涉及概率。这绝对是一只 100%的猫,所以上面的“很少事情是确定的”论点不应该适用。
事实上,我认为它没有,但对我们的模型来说,返回某样东西是猫而不是确定性的概率仍然很重要,因为概率是连续的而确定性不是:如果我们的算法输出确定性,并认为上面的图片是一只狗,那就真的很难知道如何改变它的参数,以便它输出正确的答案,而不会破坏它在例子上的表现。相比之下,对于概率,有一个简单的方法来增加图片是一只猫的概率,我们在第四章会看到。
不确定性来源
这本书给出了 3 个(或者可以说是 4 个)不确定性的来源。我认为有可能将它们合二为一:
- “真正的”随机性(“随机性”只是“随机性”的一个花哨说法):有时候这个世界真的在抛硬币,你必须处理好这个问题。一个深度学习的例子是语言建模,其中深度学习模型需要在给定一系列先前单词的情况下预测下一个单词。如果我给你一个句子“法国是一个……”,你能预测下一个单词是什么吗?不,因为它实际上可以是任何数量的东西:就在法国的维基百科页面上,这些词后面是“国家”、“统一”、“发达”、“创始”、“成员”和“永久”。这本书区分了“固有的随机性”和“不完全的可观察性”。在我看来,这通常不是一个有用的区别:如果有人抛硬币,答案是随机的,因为有实际的量子过程决定它最终在哪一边,还是看起来是随机的,因为我们没有硬币旋转速度、空气分子密度等信息。?答案几乎总是:没关系。
- 建模不完整:有时候你就是不能对所有事情建模,或者不想建模。
再次以语言建模为例,事实是尽管最近取得了真正的进步,但计算机仍然无法像人类一样理解语言,这有时意味着人类可以 100%的概率预测句子中的下一个单词,而机器还不能。这意味着我们的算法需要依赖输出概率,因为它们还不够好。类似地,你可能会认为,对确定某件事所涉及的所有复杂性进行建模太高了,你有时犯错误也没关系。书中的例子很好地说明了这一点:记住“大多数鸟都会飞”比记住“除了生病、受伤或非常年幼的鸟,以及几维鸟、鸵鸟、鸸鹋等,所有的鸟都会飞”要便宜得多。
随机变量
随机变量是其值随机变化的“变量”。
从代码的角度来看,这没有任何意义,所以你可以把随机变量想象成一个不带参数的函数,返回一个随机值。这是一个随机变量 X 的例子,它是随机的 1 或 2。
所以当我谈论随机变量 X 时,你可能会问,我是在谈论用def X(): ...
定义的函数,还是在谈论通过调用X()
得到的返回值?
答案是:看情况。事实是,数学符号是如此草率,但在实践中,它通常会直截了当地指出人们是在谈论def X(): ...
还是X()
。
最后要注意的是,如果随机变量在数学表达式中作为一个数字使用,它通常不会每次都重新计算,所以例如:X < 1.5 and X > 0.5 意味着:
不是
随机变量可以是连续或离散*。难道而不是读连续和离散随机变量的定义,是因为它是错误的,而且我不是指“有点简化”中的“错误”,而是更多的“错误”是指“如此简化,以至于人们会错误地认为某些 r.v.s 实际上是连续的却是离散的,这完全错过了为什么一开始就有区别的要点”。*
以下是我认为保持准确性的两者的简化定义:
- 离散随机变量是一种随机变量,它只能返回(也称为“接受”)“断开的”值。换句话说,在它能返回的任意两个数之间,还有其他数(实际上是无穷多个)是它不能返回的。
例如,我们上面的变量 X 是离散的,因为它只能返回 1 或 2,而不能返回 1.5、1.25、1.58928921 或 1 和 2 之间的任何其他数字。同样,即使一个变量可以取下列任何一个数字:0.5,1,1.5,2,2.5…等等,它也是离散的,尽管它有无限的可能性。 - 一个连续的随机变量可以取一个(或几个)区间上的任何值。
例如,下面的变量 Y 可以取 0 到 1 之间的任何数字。它能达到 0.03920 吗?是的。0.23?是的。等等。
这种区别很重要,原因有二:
- 离散的随机变量可以用正规的算术来处理。连续随机变量需要微积分。
- 一个离散随机变量可以取的所有值都有大于 0 的概率。一个连续的随机变量可以取的所有值有一个概率…等于 0!
想想下面的变量 Y:0 到 1 之间的每一个数被 Y 返回的概率都是一样的……但是 0 到 1 之间有多少个数呢?无限!所以不可能每个数字的概率都大于 0,因为否则总的概率将等于无穷大。
分发、PMF 和 pdf
分布是描述随机变量不同可能输出的概率的一种方式。分布可以告诉我们一个随机变量输出一个给定值或一个给定区间值的概率是多少。
在 Python 中,scipy.stats
模块支持许多发行版。我们将在这里解释一下如何探索这个模块。
离散分布有一个概率质量函数(PMF)。它接受一个值并输出一个概率,例如,如果 P 是上面变量 X 的 PMF,则 P(1) = 0.5。有时我们写 P(X = 1),这样我们就确定它是 X 的 PMF
如果你画出这个函数,x 轴将显示它可以取的不同值,而 y 轴将显示该值的概率。当然,所有 y 值之和必须等于 1,因为随机变量的概率之和必须为 1。
scipy 支持的离散分布可以在这里找到。这允许我们使用已知的分布创建随机变量,这比编写自己的函数更方便。需要注意的一点是,为了从一个 r.v .中采样,我们现在需要调用 distribution 对象上的rvs()
函数。例如,让我们从“二项式”分布中取样:
因为离散 r.v .的值是不连续的,所以 PMF 看起来像这样“尖尖的”:
对于多个变量可以有一个 PMF,在这种情况下我们称之为“联合 PMF”。所以 PMF P(X = x,Y = y)给出了 X 等于 X,Y 等于 Y 的概率,通常这与 X 等于 x 乘以 Y 等于 Y 的概率相同,但并不总是如此(见下文)。
这是一个联合 PMF 的样子:
另一方面,连续随机变量具有概率密度函数。它也是 r.v .可以取的值的函数,但是它不而不是返回给定值的概率:正如我们已经说过的,对于每个可能的值,概率都是 0。
然而,我们可能想要表达这样的概念,例如,接近 0 的值应该比接近* 2 的值更有可能,即使 0 和 2 的概率都是 0。这就是概率密度函数的用武之地:在 x ( p(x) )的 PDF p 的值与得到一个在区间*内非常接近 x 的数的概率成比例。**
具体来说,它是这样定义的,即值落在一个区间内的概率是该区间内 PDF 曲线下的面积。换句话说,要获得某个区间内的值的概率,你需要对该区间内的 PDF 进行积分,就像如果你想对一个离散的 r.v .做同样的事情,你需要对该区间内的 PMF 值求和:积分基本上是求和的连续等价物。
遗憾的是,与求和不同,手工积分相当困难。幸运的是,借助现代软件,有两种方法可以轻松获得积分:
- 使用 Wolfram Alpha ,你通常可以获得积分的精确解析解:例如,只需写下“integrate 2x+1 from 0.1 to 0.8”,Wolfram Alpha 就会告诉你确切的答案,即 1.33。
- 在 python 中使用 scipy:可以使用
scipy.integrate.quad
。它返回的第一个值是积分,第二个值可以忽略(这是对答案中可能存在的误差的估计,因为数值积分是一个近似过程)。
scipy 中的连续分布可以在这里找到。让我们重新定义上面的 r.v. Y,你会记得它是从 0 到 1 均匀分布的:
正如我们所记得的,Y 是一个连续的随机变量,从 0 到 1 的所有值被选中的概率相等,而 0 以外的所有值被选中的概率为 0。让我们展示一下它的 PDF 格式:
我们预计 Y 返回一个介于 0.3 和 0.4 之间的数字的概率是 0.1,因为该区间覆盖了允许范围的 10%。同样,很明显,值落在 0 和 1 之间的概率一定是 1,并且它落在-1 和 2 之间的概率也一定是 1。
让我们通过整合来检查:
就像 PMF 一样,一个 PDF 可以关联到两个不同的随机变量。我们称之为“联合 PDF”。下面是一个例子:
排斥
如果给你一个联合 PMF,想知道单个变量对应的 PMF 或者 PDF 怎么办?换句话说,你知道 P(X=x,Y=y),想知道的只是 P(X=x)。
从逻辑上看,X = x 忽略 Y 的概率应该是 X=x 和 Y=0(或者 Y 的第一个可能值)的概率加上 X=x 和 Y=1 的概率,等等。换句话说,我们对所有可能的 Y 取 P(X=x,Y=y)的和。在数学上:
这个过程确实是正确的,叫做边缘化。X 的最终分布称为边际分布。让我们看看 PMF 是什么样子,提醒一下,我们在join_probabilities
变量中有一组联合概率:
**
在这种情况下,我们恢复了 X 的原始 PMF,因为joint_probabilities
包含了独立变量的概率。情况不一定总是如此。
边缘化也适用于 pdf,同样,唯一的区别是我们需要在所有可能的 y 上使用积分,而不是 sum,即:
让我们看看当我们在之前的连续连接 PDF 中边缘化 X 时会是什么样子:
**
也许一种看待边缘化的方式是一种“挤压”的形式:想象沿着 y 轴压缩你在上面看到的 3D 图片,将概率质量推到它自己的顶部,直到 3D 图形完全变平,只留下原始的 x 轴。
当然,因为你可以有两个以上变量的联合分布,这个可视化只能到此为止,但是记住我们上次的引用:
要处理一个 14 维的空间,想象一个 3 维的空间,大声对自己说“14”。每个人都这样做。
杰弗里·辛顿
条件概率
边缘化可以让我们从 X 和 Y 的联合分布中得到忽略变量 Y 的变量 X 的分布,但是如果给定 Y 的一个特定值,我们想知道 X 的分布呢?
给定 Y,这个概率称为 X 的条件概率,表示如下:
在这种情况下,竖线通常读作“given”。
举个具体的例子,假设你想知道某人是否来自德国,你知道他说一口流利的德语。以下是显示世界上说德语且居住在德国的人口比例的联合 PMF:
**
怎么知道说德语的人是德国人的概率?看起来你需要知道世界上有多少人说德语,以及德国总共有多少人。事实上,在这两种情况下,你都不需要实际的人口数量,世界人口的比例就足够了。换句话说:
我们得到分母的方法当然是使用如上所述的边缘化*,即把生活在德国的每个人的语言相加。*
我们得到:
84.2%的几率,这当然不足为奇,因为德国是一个讲德语的大国。
正如您可能猜到的,一般规则如下:
将这个规则应用于 X 的所有可能值,我们得到一个新的分布,称为给定 y 的 X 的条件分布。
类似于我们所说的边缘化可以被认为是“挤压”联合分布的图形,采用条件分布类似于切割图形,然后重整图形,使得最终分布仍然总计为 1。让我们沿着 Y = 1.0 对之前的 3D 关节 PDF 进行“切片”:
**
重要的是不要将条件概率与实际可行的东西混淆。在我们德国的例子中,很明显,教某人德语并不会使他们更有可能来自德国,但是这个陷阱通常并不那么明显。
条件概率链规则
我们现在知道如何从联合分布到边际分布,从联合边际分布到条件分布。现在,让我们完成从边际和条件分布到联合分布的循环。
这个过程非常简单。假设你知道一个人说德语是德国人的概率,也知道世界上任何地方的人说德语的概率,你想知道一个人既是德国人又会说德语的概率。看起来你需要简单地将条件概率和边际概率相乘:
事实上,这直接来自上面条件概率的定义。
总的来说:
贝叶斯法则
最后假设你不想知道你的朋友是德国人的概率,而不是他会说德语,而是想知道某人会说德语的概率,因为他们来自德国。
当然,我们可以使用以前的完整联合 PMF 表来完成,但不幸的是,我们并不总是能够访问这些表。假设我们从上面知道了概率(说德语的人来自德国),以及世界上任何地方的人是德国人的概率和世界上有人说德语的概率。我们能搞清楚吗?
当然,我们只需要恢复联合概率,我们在上面做过,然后除以德国人的比例。
一般来说,我们有:
(来自条件概率的定义)
所以:
(来自条件概率的链式法则)。
这最后一个等式以贝叶斯法则而闻名。它在许多情况下都非常有用,尽管你可以看到,尽管它的名字很花哨,但它只是我们定义的一个简单应用。
最后的话
以上仅涵盖了第三章的大约一半。这比我预期的要花更长的时间来写,我认为我们已经在材料中取得了很好的自然突破(剩下的更多的是各种有趣的技术的大杂烩),所以我将在随后的帖子中完成第三章的笔记。回头见!
深度学习第十章:序列建模:递归和递归网络
我们有幸请到了作者 Ian Goodfellow 介绍《第 10 章序列建模:深度学习的递归和递归网络》一书。
以下是他在演讲中提到的论文列表:
用于递归神经网络序列预测的预定采样
教授强制:用于训练递归网络的新算法
用于训练非常深的前馈网络的随机行走初始化
层归一化
多预测深度玻尔兹曼机器
我希望你喜欢伊恩的演讲!
我们刚刚完成了该书的第二部分,并将从 8 月 28 日开始复习第三部分:深度学习研究。即将举行的活动时间表:
08/28 13 线性因子模型
09/05 14 自动编码器
09/11 15 表征学习
09/18 16 用于深度学习的结构化概率模型
09/25 17 蒙特卡罗方法
10/02 18 面对配分函数【T33
我希望你能加入我们!
书:
深度学习书籍是唯一一个教授深度学习核心原则的有组织的出版物。这本书可以在网上免费获得:http://www.deeplearningbook.org/
俱乐部:
深度学习读书会 是留出一段时间来复习书中的资料,一起解决问题。每周,我们行业专家都会介绍一个章节。我们每周一下午 6:30-8:30 在旧金山霍华德街 101 号的 USF 数据研究所会面。
**过往事件录音在此有:https://www.youtube.com/c/AlenaKruchkova
我现在挖的东西:
- fast.ai 的雷切尔·托马斯(Rachel Thomas)开设了令人惊叹的计算线性代数课程*。这是一门“完全以实际应用为中心”的课程,使用了“前沿算法和工具”。
https://github . com/fastai/numerical-linear-algebra/blob/master/readme . MD*** - 奥莱利人工智能大会在旧金山举行,拥有一个令人印象深刻的发言人名单:
https://conferences . oreilly . com/artificial-intelligence/AI-ca
如果你在那里见到我,打个招呼!
深度学习第三章:概率与信息论
在 5 月 15 日的第三次会议上,我们复习了第三章:概率和信息理论。(这本书可以在网上免费获得:【http://www.deeplearningbook.org/】T2
我们有一个由 Pierre Dueck 所做的可爱的报告,它引起了很多讨论!你可以在这里观看:
完全披露:我们没有谈到信息论。我们希望尽快解决这个问题,见下文。
我们还与特邀嘉宾亚历山大·托舍夫进行了问答。亚历克斯是谷歌大脑的研究工程师,专门研究计算机视觉,你可以在这里查看他的出版物:https://research.google.com/pubs/AlexanderToshev.html
我们的下一次会议是在 5 月 22 日星期一。我们将讨论第 4 章:数值计算。这是我们深入研究 ML 和 DL 之前的最后一章。
雅罗斯拉夫·布拉托夫将回来做报告,由于第四章很短,我们可以进一步回顾线性代数和概率/信息理论。
所以进来准备好测试他所有这些科目!
在接下来的 12 周里,我们每周一都会见面。有关未来的活动,请查看我们的 meetup 页面。我们将通过这个链接获得现场直播:https://youtu.be/-l1JGI-cCvY
深度学习第四章:数值计算
第四章:数值计算由雅罗斯拉夫·布拉托夫提出。
在我们讨论第 3 章的时候,我们没有机会复习这一章的信息论部分,所以在我们进入第 4 章之前,我们请雅罗斯拉夫给我们一个快速的概述。
然后我们继续讨论数值计算。雅罗斯拉夫用他自己的幻灯片(请见下面附的幻灯片)向我们概述了这一章,然后在演示结束时浏览了 Ian Goodfellow 的幻灯片。
雅罗斯拉夫·布拉托夫的数字计算幻灯片
drive.google.com](https://drive.google.com/open?id=0B653sCwrWAVNclZZRU5fdkRkakU)
这是我们深入 ML 和 DL(也称为有趣的东西)之前的最后一章:),所以请继续关注不久的将来的更多帖子。
我们每周一都会在 USF 数据研究所见面。对于未来的活动,请查看我们的 meetup 页面。下一次会议在 2017 年 6 月 12 日星期一下午 6:30-8:30 我们将讨论第 5 章:机器学习基础。我们将有一个现场直播的链接:https://youtu.be/-l1JGI-cCvY
深度学习第六章:深度前馈网络
上周我们讨论了深度学习一书的第六章(这本书可以在网上免费获得:http://www.deeplearningbook.org/)。
讨论由蒂莫西·库尔主持。Timo 拥有宾州大学计算机视觉博士学位,曾在谷歌地图担任 ML 工程师。目前,他是 Lighthouse AI 的高级机器学习工程师,他们正在为你的家建造眼睛。仅供参考,他们正在招聘;)
Andrej Karpathy (OpenAI 研究科学家,cs231 stanford 计算机视觉课程讲师)的一篇文章,讲述了理解前馈网络的重要性:https://medium . com/@ kar pathy/yes-you-should-understand-back prop-e 2f 06 eab 496 bBTW cs 231n 是对深度学习的惊人介绍,当然还有我们最喜欢的书。
我希望你喜欢蒂莫西关于前馈网络的介绍!
我对即将到来的事情感到非常兴奋!
第七章正规化将由雅罗斯拉夫布拉托夫呈现!他很兴奋!我引用他的话:“我想展示优化,但我记得我也很喜欢正则化。”:)这一章有点长,但比其他一些章节组织得更好,所以我想我们会很开心。RSVP 这里:https://www . meetup . com/Deep-Learning-Book-Club/events/240769087/
第 8 章优化讨论将由 Vazgen Hakobjanyan 主持。瓦兹根是耶里万研究实验室的董事会成员。这些家伙真的很棒!看看这篇最近的论文https://arxiv.org/abs…
他们的数字图书馆指南被谷歌排名第一,因为它太棒了——你应该使用它!【http://yerevann.com/a…】T21 回复此处:https://www . meetup . com/Deep-Learning-Book-Club/events/240769100/
第九章 CNN 将由路易·莫尼耶主持。我无法告诉你,让他来主持这场讨论,我有多兴奋!他是一位行业资深人士,如果你不知道他的许多成就,你应该谷歌一下他:)目前他是 Airbnb 人工智能实验室的负责人。但最重要的是,他是一位出色的教育家,对揭开艾的神秘面纱充满热情!RSVP 这里:https://www . meetup . com/Deep-Learning-Book-Club/events/240769114/
然后我们有杰瑞米·霍华德回来了!严重昏厥
如果你想在我们未来的会议中主持讨论,请联系我!
我就知道这些了,周一见!
我们将于周一下午 6:30-8:30 在霍华德街 101 号会面
链接到 meetup 页面:https://www.meetup.com/Deep-Learning-Book-Club/
链接到 YouTube 频道,上面有之前会议的记录(随意忽略带有紫色大脑缩略图的视频——这些是直播视频,一旦完成,我会用编辑过的版本替换它们)https://www.youtube.com/c/AlenaKruchkova
深度学习概念—第 1 部分
激活功能
Sigmoid 函数:
乙状结肠的导数:
之前,我们一直使用 sigmoid 函数作为隐藏单元的激活函数,在分类的情况下,作为输出单元的激活函数。然而,这不是你能使用的唯一的激活功能,实际上有一些缺点。
如反向传播材料中所述,s 形的导数在 0.25 处达到最大值(见上文)。这意味着,当您使用 sigmoid 单元执行反向传播时,返回网络的误差将在每一层至少缩小 75%。对于接近输入图层的图层,如果您有很多图层,权重更新将会很小,并且这些权重将需要很长时间来训练。由于这个原因,sigmoids 已经不再受欢迎的激活隐藏单位。
输入校正的线性单位
最近的深度学习网络使用整流线性单元 (ReLUs)代替 sigmoids 用于隐藏层。如果输入小于 0,整流线性单元具有输出 0,否则具有原始输出。也就是说,如果输入大于 0,则输出等于输入。数学上,这看起来像
f(x)= max(x,0)。
函数的输出或者是输入, x ,或者是 0,以较大者为准。所以如果x= 1,那么 f ( x )=0,如果 x =0.5,那么 f ( x )=0.5。从图形上看,它看起来像:
ReLU 激活是您可以使用的最简单的非线性激活功能。当输入为正时,导数为 1,因此不会出现 sigmoids 反向传播误差的消失效应。研究表明,ReLUs 可以大大加快大型网络的训练速度。像 TensorFlow 和 TFLearn 这样的大多数框架使得在隐藏层上使用 ReLUs 变得很简单,所以你不需要自己实现它们。
缺点
有可能一个大的梯度可以设置权重使得一个 ReLU 单位总是 0。这些“死的”单元将总是 0,并且大量的计算将被浪费在训练中。
摘自安德烈·卡帕西的 CS231n 课程:
不幸的是,ReLU 部队在训练中很脆弱,可能会“死亡”。例如,流过 ReLU 神经元的大梯度可能导致权重更新,使得神经元再也不会在任何数据点上激活。如果发生这种情况,那么从该点开始,流经该单元的梯度将永远为零。也就是说,ReLU 单元在训练期间可能会不可逆地死亡,因为它们可能会从数据流形上脱落。例如,如果学习率设置得太高,您可能会发现多达 40%的网络可能是“死的”(即,在整个训练数据集内从未激活的神经元)。有了正确的学习率设置,这个问题就不那么常见了。
Softmax
之前我们已经看到神经网络用于回归(自行车骑手)和二元分类(研究生入学)。通常,您会发现想要预测某个输入是否属于多个类中的一个。这是一个分类问题,但乙状结肠不再是最佳选择。相反,我们使用 softmax 功能。softmax 函数将每个单元的输出压缩到 0 和 1 之间,就像一个 sigmoid。它还对每个输出进行分频,使输出的总和等于 1。softmax 函数的输出相当于分类概率分布,它告诉您任何类为真的概率。
这与正常的 sigmoid 之间唯一的真正区别是 softmax 将输出归一化,使它们的总和为 1。在这两种情况下,您都可以放入一个向量,并得到一个向量,其中输出是一个大小相同的向量,但所有值都压缩在 0 和 1 之间。对于二进制分类,您可以使用带有一个输出单元的 sigmoid。但是,如果您正在进行多项式分类,您可能希望使用多个输出单元(每个类一个)并在输出上激活 softmax。
例如,如果一个 softmax 函数有三个输入,比如一个网络有三个输出单元,它看起来像:
数学上,softmax 函数如下所示,其中 z 是输出层的输入向量(如果有 10 个输出单元,则 z 中有 10 个元素)。再次, j 索引输出单元。
不可否认,这看起来很难理解,但实际上很简单,如果你不懂数学也没关系。请记住,输出被压缩,它们的总和为 1。
为了更好地理解这一点,考虑训练一个网络来从图像中识别和分类手写数字。该网络有十个输出单元,每个单元对应一个数字 0 到 9。然后,如果你给它输入一个数字 4 的图像(见下文),对应于数字 4 的输出单元就会被激活。
图片来自 MNIST 数据集
建立这样的网络需要 10 个输出单元,每个单元对应一个数字。每个训练图像都标有真实数字,网络的目标是预测正确的标签。因此,如果输入是数字 4 的图像,则对应于 4 的输出单元将被激活,并且对于其余单元以此类推。
对于上面的示例图像,softmax 函数的输出可能如下所示:
预测上述数字的网络的 softmax 输出示例
这个图像看起来最像数字 4,所以你有很大的可能性。然而,这个数字在没有完成循环的情况下看起来有点像 7,又有点像 9。所以,你最有可能得到 4,但也有可能得到 7 或 9。
softmax 可用于任意数量的课程。接下来你会看到,它将被用来预测两类情绪,积极的或消极的。它也用于成百上千的类,例如在对象识别问题中,有成百上千个不同的可能对象。
Softmax 函数与 Sigmoid 函数:
Sigmoid 函数的性质
- sigmoid 函数返回实值输出。
- sigmoid 函数的一阶导数将是非负或非正的。
- **非负:**如果一个数大于等于零。
- **非正数:**如果一个数小于或等于零。
Sigmoid 函数用法
- 逻辑回归模型中用于二元分类的 Sigmoid 函数。
- 在创建人工神经元时,sigmoid 函数用作激活函数。
- 在统计学中, sigmoid 函数图通常作为累积分布函数。
Softmax 函数的性质
下面是 softmax 函数的几个属性。
- 计算出的概率将在 0 到 1 的范围内。
- 所有概率之和等于 1。
Softmax 函数用法
- 用于多分类逻辑回归模型。
- 在构建神经网络时,softmax 函数用于不同的层级别。
Sigmoid 函数和 Softmax 函数的区别
范畴交叉熵
之前,我们一直使用误差平方和作为网络的成本函数,但在这些情况下,我们只有单一(标量)输出值。
然而,当你使用 softmax 时,你的输出是一个向量。一个向量是来自输出单元的概率值。你也可以使用所谓的一键编码将你的数据标签表示为一个向量。
这仅仅意味着您有一个长度为类的数量的向量,并且 label 元素被标记为 1,而其他标签被设置为 0。在对之前的数字进行分类的情况下,数字 4 的图像的标签向量将是:
y =[0,0,0,0,1,0,0,0,0,0]
我们的输出预测向量可以是这样的
^ =[0.047,0.048,0.061,0.07,0.330,0.062,0.001,0.213,0.013,0.150]。
我们希望误差与这些向量的距离成正比。为了计算这个距离,我们将使用交叉熵。然后,我们在训练网络时的目标是通过最小化交叉熵来使我们的预测向量尽可能接近标签向量。交叉熵计算如下所示:
交叉熵计算
如上所述,交叉熵是标签元素的总和乘以预测概率的自然对数。注意,这个公式是不对称的!翻转向量是个坏主意,因为标签向量有很多零,取零的对数会导致错误。
对标签向量使用独热编码的酷之处在于除了一个 true 类之外,yj都是 0。然后,除了其中 y j =1 之外,该和中的所有项都是零,并且对于真实标签,交叉熵简单地是d*= lny^。例如,如果您的输入图像是数字 4,并且它被标记为 4,那么只有对应于 4 的单元的输出在交叉熵成本中起作用。*
关于这个的好博客:https://ljvmiranda 921 . github . io/notebook/2017/08/13/soft max-and-the-negative-log-likelihood/
KL 散度:
https://www . countbayesie . com/blog/2017/5/9/kull back-lei bler-divergence-explained
学分:来自课堂讲稿:https://classroom.udacity.com/nanodegrees/nd101/syllabus
深度学习概念—第 2 部分
part 1:https://medium . com/forward-data-science/deep-learning-concepts-part-1-ea 0 b 14b 234 c 8
损失函数选择:MSE 与交叉熵;
交叉熵是各种模型(如分类、分割、生成模型等)的首选损失函数。这里我们解释行为的差异:
假设您只有三个训练数据项。您的神经网络对输出神经元使用 softmax 激活,因此有三个可以解释为概率的输出值。例如,假设神经网络的计算输出和目标值(也称为期望值)如下:
computed | targets | correct?
-----------------------------------------------
0.3 0.3 0.4 | 0 0 1 (democrat) | yes
0.3 0.4 0.3 | 0 1 0 (republican) | yes
0.1 0.2 0.7 | 1 0 0 (other) | no
该神经网络具有 1/3 = 0.33 的分类误差,或者等效地,2/3 = 0.67 的分类精度。请注意,神经网络只是勉强得到前两个正确的训练项目,在第三个训练项目上差得很远。但是现在考虑下面的神经网络:
computed | targets | correct?
-----------------------------------------------
0.1 0.2 0.7 | 0 0 1 (democrat) | yes
0.1 0.7 0.2 | 0 1 0 (republican) | yes
0.3 0.4 0.3 | 1 0 0 (other) | no
这个 NN 也有 1/3 = 0.33 的分类误差。但是第二个神经网络比第一个好,因为它固定了前两个训练项目,并且几乎没有错过第三个训练项目。总而言之,分类误差是一种非常粗略的误差度量。
现在考虑交叉熵误差。上述第一个神经网络中第一个训练项目的交叉熵误差为:
-( (ln(0.3)*0) + (ln(0.3)*0) + (ln(0.4)*1) ) = -ln(0.4)
请注意,在神经网络分类的情况下,计算有点奇怪,因为除了一项之外,所有项都将消失。(关于如何计算交叉熵,网上有几个很好的解释。)因此,第一个神经网络的平均交叉熵误差(ACE)计算如下:
-(ln(0.4) + ln(0.4) + ln(0.1)) / 3 = 1.38
第二个神经网络的平均交叉熵误差为:
-(ln(0.7) + ln(0.7) + ln(0.3)) / 3 = 0.64
请注意,第二个高级神经网络的平均交叉熵误差小于第一个神经网络的 ACE 误差。交叉熵中的 ln()函数考虑了预测的接近程度,是一种更细粒度的计算误差的方法。
交叉熵误差优于均方误差。简而言之,在反向传播训练期间,您希望根据目标值将输出节点值驱动到 1.0 或 0.0。如果使用 MSE,权重调整因子(渐变)包含(输出)(1-输出)项。随着计算的输出越来越接近 0.0 或 1.0,(输出) (1 —输出)的值变得越来越小。例如,如果输出= 0.6,则(输出)* (1 —输出)= 0.24,但如果输出为 0.95,则(输出)* (1 —输出)= 0.0475。随着调整因子变得越来越小,权重的变化也变得越来越小,可以说训练会停止。
但是如果你使用交叉熵误差,那么(输出)* (1 —输出)项就消失了(数学很酷)。所以,体重的变化不会越来越小,所以训练不太可能停止。请注意,此参数假设您正在使用 softmax 输出节点激活进行神经网络分类。
调试深度学习模型:
查看验证集中每类标签的前几个错误预测(损失最大的预测)总是一个好主意。它通常能让你对你的模型的行为以及你的标签数据有多好或多干净有很好的了解。
伪标签:
http://deep learning . net/WP-content/uploads/2013/03/pseudo _ label _ final . pdf
[## keras 中一个简单的伪标签实现
(此贴与 fast.ai 第七课 jupyter 笔记本高度相关在此)我目前正在参加…
shaoanlu.wordpress.com](https://shaoanlu.wordpress.com/2017/04/10/a-simple-pseudo-labeling-function-implementation-in-keras/)
**基本思路:**思路是用标注数据训练一个模型。使用该模型来预测未标记数据的标签,然后包括伪标记数据作为数据的一部分,以在假设伪标签是真实标签的情况下与标记数据一起训练该模型。
**来自上面的博客:**一种有效的伪标记方法是,如 2015 年全国数据科学碗获奖者在这里提到的,以 67:33 的比例混合原始数据和伪标记数据。fast.ai 的课视频里也提到了这一点。
fast.ai 一课伪标注的另一个实现可以在第七课笔记本这里找到。
preds = model.predict([conv_test_feat, test_sizes],
batch_size=batch_size*2)
gen = image.ImageDataGenerator()
test_batches = gen.flow(conv_test_feat, preds, batch_size=16)
val_batches = gen.flow(conv_val_feat, val_labels, batch_size=4)
batches = gen.flow(conv_feat, trn_labels, batch_size=44)
mi = MixIterator([batches, test_batches, val_batches)bn_model.fit_generator(mi, mi.N, nb_epoch=8,
validation_data=(conv_val_feat, val_labels))
在上面的代码中,fast.ai 课程的讲师杰瑞米·霍华德写了一个自定义迭代器,用于混合训练数据和伪标签数据。
原木损失
衡量分类模型的性能,其中预测输入是介于 0 和 1 之间的概率值。机器学习模型的目标是最小化这个值。完美的模型的对数损失为 0。随着预测概率偏离实际标签,测井曲线损失增加。
测井损失与准确性
- 准确性是预测值等于实际值的预测数。准确性并不总是一个好的指标,因为它具有是或否的性质。
- 测井损失根据实际标签的变化程度,考虑您预测的不确定性。这让我们对模型的性能有了更细致的了解。
下图显示了给定真实观测值(isDog = 1)的可能测井损失值的范围。随着预测概率接近 1,测井曲线损失缓慢下降。然而,随着预测概率的降低,测井曲线损失迅速增加。日志丢失惩罚了这两种类型的错误,尤其是那些有把握的和错误的预测!
**def** logloss(true_label, predicted, eps=1e-15):
p = np.clip(predicted, eps, 1 - eps)
**if** true_label == 1:
**return** -log(p)
**else**:
**return** -log(1 - p)
在二进制分类中(M=2),公式等于:
多类分类
在多类分类(M>2)中,我们取观测值中每个类预测的测井损失值的总和。
跨类的所有日志损失值的总和
为什么是负号?
Log Loss 使用负 Log 来提供一个简单的比较指标。之所以采取这种方法,是因为数字的正对数< 1 returns negative values, which is confusing to work with when comparing the performance of two models.
Log Loss vs Cross-Entropy
Log loss and cross-entropy are slightly different depending on the context, but in machine learning when calculating error rates between 0 and 1 they resolve to the same thing. As a demonstration, where p and q are the sets p∈{y, 1−y} and q∈{ŷ, 1−ŷ} we can rewrite cross-entropy as:
- p = set of true labels
- q = set of prediction
- y = true label
- ŷ = predicted prob
Which is exactly the same as log loss!
Data leakage:
Here are good blog posts explaining this and apply to general machine learning/data mining: