TowardsDataScience 博客中文翻译 2016~2018(一百二十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

[谷歌/ICML/论文摘要]使用大规模无监督学习构建高级特征

原文:https://towardsdatascience.com/google-icml-paper-summary-building-high-level-features-using-large-scale-unsupervised-fa1ae8fb8678?source=collection_archive---------16-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF from this website

我们如何构建更高级的特征检测器?我们能通过无监督学习做到吗?

请注意,这篇帖子是给未来的自己看的,回顾这篇论文上的材料,而不是从头再看一遍。

Paper from this website

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这篇论文的作者感兴趣的是从未标记的数据中制作类特定特征检测器。(例如,从未标记的人脸图像中制作人脸检测器。)为了实现这一点,作者在大数据集上训练了 9 层稀疏自动编码器。与普遍的看法相反,有可能在没有任何标签数据的情况下建立一个人脸检测器,而且在 ImageNet 数据上的表现优于现有技术水平。(2012 年)。

简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文的目的是仅从未标记的图像中构建类别特定的特征检测器,这是由神经科学的猜想所激发的,即在人脑中存在高度类别特定的神经元,通常和非正式地称为“祖母神经元”。在传统的计算机视觉中,大多数研究人员使用标记数据来获取这些过滤器,然而获取大量数据可能是困难的。这个实验的成功将提供两件事情,一个是从未标记的数据中学习高级特征的方法,另一个是是否可以从未标记的数据中学习大母神经元的可能性。这些方法中的大多数,例如稀疏自动编码器,仅学习低级特征,例如边缘或斑点。作者假设,深度学习之所以需要这么长时间,是因为缺乏高级特征,例如,图像的大小被调整得更小,这些减少破坏了高级特征的学习。作者没有缩小图像,也使用了大量的计算能力。在所有这些之后,它显示了从未标记的数据中学习更高水平的特征是肯定可能的。最后,使用学习过的过滤器,他们能够在 ImageNet 数据集上超越最先进的性能。(2012 年)。

训练集构造/算法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,从 1000 万个 YouTube 视频中随机选择了补丁,使用 OpenCV 人脸检测器,他们能够得出结论,在 100,000 个采样的补丁中,人脸不到 3%。并且所使用的算法受到不同类型的无监督学习算法的成功的启发。(RBM、稀疏自动编码器等)。作者的目的是学习更高层次的特征,而不仅仅是低层次的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,作者使用的架构可以被认为是深度稀疏自动编码器,有一些扭曲,它们是局部感受域,池化和局部对比度归一化。(他们使用 L2 池)。堆叠一系列统一模块的方式,在选择性和耐受性层之间切换,被认为是大脑采用的架构。需要注意的一个重要事实是,尽管网络使用局部感受野,但它们不是卷积的(参数不在图像的不同位置共享。),这在生物学上更说得通。

学习和优化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在学习期间,第二子层被固定为统一的权重,并且编码器和解码器中的所有其他权重通过上面看到的成本函数来训练。优化问题也称为重构拓扑独立分量分析,基本上第一项确保表示编码了关于数据的重要信息,第二项鼓励汇集要素以将相似的要素组合在一起以实现方差。本文作者实现了异步随机梯度下降,并使用 1000 台机器对网络进行了三天的训练。

人脸实验

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试图像由来自 Wild 数据集和 ImageNet 数据集的标记人脸的 37,000 幅图像组成。训练后,作者使用测试集来测量每个神经元识别人脸的性能。令人惊讶的是,最好的神经元能够以 81.7%的准确率识别人脸。并且在没有局部对比度标准化层的情况下,准确度已经下降到 78.5%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当他们创建激活值的直方图时,他们能够上图,很明显,即使没有标记数据,也有可能训练人脸检测器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当作者通过使用两种技术可视化神经元的最佳刺激时。(可视化测试集中最具响应性的刺激,并进行数值优化以找到最佳刺激)。他们能够证实神经元确实在寻找一张脸。并且通过额外的实验,表明学习的权重对于不同的方差是鲁棒的,例如平面外旋转和缩放。

猫和人体探测器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者还想知道该网络是否能够学习高级功能,如猫和人体。如上所述,网络中的一些神经元能够检测到形状像猫或人体的高级特征。在他们自己的数据集上进行测试,在猫和人体上分别达到了 74.8%和 76.7%。

使用 ImageNet 进行物体识别

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在经过训练的权重之上添加一对一对所有逻辑分类器之后,他们重新训练网络,(这种方法也称为无监督预训练。)在 ImageNet 数据集上。他们能够超越最先进的基线(2012 年)。在包含 22K 个类别的 ImageNet 上,它比其他最高的结果取得了 70%的相对改善。所有的性能都可以在上表中看到。

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总之,使用大量的数据以及巨大的计算能力,可以仅使用未标记的数据来学习高级特征,如人脸和人体。此外,该方法在 ImageNet 数据集上的表现优于 2012 年的最先进水平。

最后的话

这是一个非常酷的实验,然而所需的数据量太大了(以及计算能力),也许这就是它没有起飞的原因。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我也实现了广残网,请点击这里查看博文 pos t。

参考

  1. Le,q .、Ranzato,m .、Monga,r .、Devin,m .、Chen,k .、和 Corrado,g .等人(2011 年)。使用大规模无监督学习构建高级特征。Arxiv.org。检索于 2018 年 8 月 15 日,来自https://arxiv.org/abs/1112.6209

谷歌知道如何教学

原文:https://towardsdatascience.com/google-knows-how-to-teach-45e531ab3ada?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Google’s Machine Learning Crash Course

足够了!我受够了!”我脑袋里面的声音就是这样在磨了几个小时几天的学习机学习之后对我吼的。虽然我已经习惯了,但这次听起来很严肃。真的很严重!“嗯,好吧。那你想做什么?”我相当礼貌地问道。我刚说完这句话,就得到回应,“抓点数据。运行一些代码。做一些分析。给我看一些图,图表”。从这些话中可以明显看出,我的内在自我并不厌倦机器学习。它受够了过多的学习和研究,却很少尝试和实施。所以我浏览了保存的内核、笔记本、GitHub repos 和博客帖子的列表,做了一些实践,我选择了这个——幽灵作者认证!

在接下来的大约两个小时里,我们忙于解决那个卡格尔问题。事实上,我在我跟随的 Kaggle 中发现了一个非常有用的笔记本( 这里 ) 。我喜欢文字云,在看完这本笔记本后,我开始知道如何制作一个!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The Raven word-cloud, with font size varying according to the frequency of the words

当我看着那些巧妙的文字云感到高兴时,我的手机发出嗡嗡声,要求一些 Twitter 通知。这是我在转发中发现的:

接下来的一秒钟,我上了博客,从那里我进入了速成班( 这里 )。接下来发生了三件事:第一,我注意到视频没有播放。我重新加载,尝试了不同的模块,然后从 Chrome 切换到另一个浏览器,它工作了。问题出在 Chrome 浏览器的广告拦截扩展上。当它被禁用时,视频工作正常。我使用“反馈”按钮让他们了解这个问题。第二,左边的主题列表涵盖了许多重要的 ML 主题,我的注意力开始增长。第三,我内心愤怒的声音又回来了,“减少损失、一般化、逻辑回归、神经网络……再来一句理论,我就要把你大脑里的神经元烧掉,我是认真的”。然而这一次,我做出了不同的回应,“我现在不想听你说!”当两个你爱的东西走到一起(ML 和 Google),你无法阻止自己用双手去抓住它。接下来的几个小时,我忙着看视频,看笔记,跑步练习,完成了速成班的一半。你猜怎么着,粘在上面的不仅仅是我。我的抱怨,叫喊,愤怒的内心声音也加入进来。

谷歌的机器学习速成班现在将在我的机器学习推荐资源列表中。尽管它自称为速成课程,但任何完成包括视频、笔记、练习和游戏任务在内的所有课程内容的人都会意识到,这不仅仅是一门速成课程。它不仅让我更好地了解了许多事情,还帮助我理解了一些我以前不知道的方法和概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“Dude, this is what convex means! You heard about it in all those courses and wondered what it is” — my inner voice after it joined me and got glued to this course.

这不是我从谷歌找到的第一个对机器学习真正有帮助的资源。Jason Mayes 机器学习 101 课程有非常生动的幻灯片,很好地解释了 ML 的概念。它有 101 张很好的机器学习内容的幻灯片,有很好的设计和很好的例子。

例子让理解更容易。这正是 Martin Gorner 在他关于深度学习的几个小时会议中所做的。虽然这不像神经网络上的任何 MOOC 那么大,但 Martin 通过分解神经网络并展示其各个部分的功能,很好地解释了神经网络是如何工作的。在几个小时的时间里,你将了解数据是如何输入网络的,权重和偏差是如何添加的,为什么我们需要激活函数,如何通过正则化、剔除和许多其他有用的技术来提高精度。这也有助于我理解 TensforFlow 是如何工作的。

[## 学 TensorFlow 和深度学习,没有博士| Google Cloud 大数据和机器学习…

这个 3 小时的课程为开发人员提供了深度学习基础知识的快速介绍

cloud.google.com](https://cloud.google.com/blog/big-data/2017/01/learn-tensorflow-and-deep-learning-without-a-phd)

除了所有这些资源之外,当我浏览谷歌的一些网站时,还会不时地发现许多其他资源。Google 的Tech Dev Guide**和Learn With Google AI都有非常好的资源,无论是学习还是准备面试。在博客文章 机器学习的规则 **,中,作者列出了 43 条规则,每一条都用一个例子解释了它是如何在 Google Play、Google Plus 等谷歌产品中实现或使用的。Google code labs是另一个非常有用的资源,有一系列 Google 产品和技术的简单教程。谷歌的博客页面(像 这个这个 ) 也是找到一些非常有趣的文章和更新的好来源。

通过 MOOCs、Youtube、博客和许多来自大学、学者、研究人员、学生和博客作者的其他途径,可以获得数百门课程,拥有一些来自科技公司的学习资源也很好。谷歌似乎在这方面做得很好。我希望谷歌和其他科技公司为任何愿意学习的人提供更多这样的开放资源。

虽然这里列出的大部分资源都是关于机器学习的,这也是我一直生活的地方,但在过去的一年里,我也遇到了许多其他技术和产品的资源。探索谷歌开发人员和其他谷歌网站将会带来宝贵的学习和实践资源。

你觉得这篇文章有用吗?欢迎留下任何反馈/意见。感谢阅读!!

连接: 领英推特 和我的 博客

谷歌无所不知——第一部分——Chrome 浏览模式

原文:https://towardsdatascience.com/google-knows-it-all-part-1-chrome-browsing-patterns-979d0f1c7ebd?source=collection_archive---------6-----------------------

剑桥分析公司和脸书事件引起了关于数据隐私和安全的轩然大波。虽然只有脸书在社交媒体上成为攻击目标,但你的数据正被互联网上每一个你与之互动的实体所收集。而且通常收集是为了让你的体验更好。当你真的很饿的时候,谁不喜欢一个应用程序上的食物推荐。它让你变得懒惰,但也节省了你的时间。

我请求谷歌给我发送我的数据,为此他们花了大约一个。我对数据的粒度感到震惊。从我一年前访问的 URL(在 leaf 处),到我每次给任何应用程序我的位置许可时我的位置数据(关于我的高度、速度、方向、垂直精度等等的数据),它都有。基本上,他们已经把我在谷歌应用程序中搜索过的所有东西都储存起来了。

我想用我的浏览数据,看看我是否能从中获得一些有用的东西。我用的是 python 3.6,所有的计算都是在熊猫 3.6 中完成的。 Json、datetime、tldextractregex 是我导入来清理数据的主要包。我特别崇拜《海底世界》中的调色板,并把它用在我的想象中。

简要地;我提取了 json 文件,清理了它,从 URL 数据中提取了域、子域、安全等,并将不同的域分为这 7 类;

一、学习——从 coursera 到 stack overflow 到 piazza 的一切

二。娱乐 —网飞,脸书,…

三。沟通 — Whatsapp,Messenger,GroupMe,Gmail,…

四。找工作——是的,我必须把它写进去,因为我开始在这上面花了很多时间

动词 (verb 的缩写)常规——从普通的谷歌搜索到预订机票到点餐,无所不包

不及物动词新闻——自从我加入科技公司后,就没怎么看了。

七。未分类的——所有其他的东西

上述分类是基于提取的域名完成的。

背景 : 我有 2017 年 3 月到 2018 年 2 月的数据。2017 年 6 月,我辞去了分析顾问的工作,并于 2018 年 8 月加入佐治亚理工学院。这可能有助于下面图表的上下文

自从加入 Tech,我发现我的互联网使用量明显增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

被访问的安全网页的数量有所增加,而对不安全网页的访问基本保持不变。12 月份也可以看到下降。(寒假!)

下面的热图可以告诉你我是什么时候开始在 Tech 读硕士的。从 2017 年 8 月开始,学习网站突然增加,12 月略有下降。**‘求职’2018 年一二月也变得更黑了。‘娱乐’**秋季学期最后两个月也降了,所以我知道 2018 年三四月该期待什么了!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深入挖掘一周水平的分析,我总是在一周开始时学习,但随着时间的推移它会下降。真的可以在这里责怪自己。另一方面,随着时间的推移,“娱乐”会略有增加。随着时间的推移,“求职”再次下降。也许是周日晚上的负罪感引发了周一学习和求职的突然增加。

注意:在我加入 GeorgiaTech 后,我将下图的数据限制为日期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深入研究一个小时的分析,你会发现大部分的学习在上午 9 点左右开始,也就是课程开始的时候,在下午 3-4 点左右达到高峰。娱乐活动也在那段时间达到高峰,这要归功于欧洲足球比赛。你可以从凌晨 2 点到 8 点的干燥区域推断出我的睡眠模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另一个有趣的分析是在日时 T21 水平上进行的。在周日(第六天)下午 4-6 点左右有一个特殊的下降。这是由于日常杂货店访问目标/Publix。不出所料,星期五(第 4 天)比其他时间早结束,星期六比其他时间晚开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这最后的视觉化就是看看我在这些独立的类别中工作时有多有效。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很明显,在找工作的时候,我的沟通能力下降了。求职和娱乐的相关性也很低(或不太高),这很好。学习和娱乐不太相关,当娱乐节目开始时,交流增加。

同样的代码可以在这里找到:https://github . com/jehlokhande 93/BrowsingHistoryVisualization

**** [## Jeh Lokhande -数据科学家实习生- Cox Communications | LinkedIn

查看全球最大的职业社区 LinkedIn 上 Jeh Lokhande 的个人资料。Jeh 列出了 6 项工作…

www.linkedin.com](https://www.linkedin.com/in/jehlokhande/)****

使用迁移学习的 Google 地标识别

原文:https://towardsdatascience.com/google-landmark-recognition-using-transfer-learning-dde35cc760e1?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Picture by Kevin Widholm

我法师分类用 15k 职业!

项目由凯瑟琳·麦克纳布、阿努拉格·莫希勒、 阿瓦尼·夏尔马 、埃文·大卫、阿尼莎·加尔格

D 处理大量的类,而在许多类中只有很少的图像,这使得这项任务非常具有挑战性!

问题来自一个著名的 Kaggle 比赛,谷歌地标识别挑战赛。训练集包含超过 120 万张图像,分布在 14,951 类地标**、**中,每类图像从一张到数千张不等。随着深度学习的发展,这种极端分类的问题在今天的数据科学社区中非常普遍。关于这个数据集需要注意的一件重要事情是,给定的测试集包括许多根本不是地标的图像,我们称之为“垃圾”图像。

这种数据集的巨大学习潜力促使我们的团队将其作为高级预测建模的课程项目。这篇博客将详细介绍我们在谷歌地标识别挑战中的尝试。我们将讨论所使用的平台、我们解决问题的方法、数据处理、尝试过的模型、我们的结果以及我们在此过程中面临的一些挑战。

按照此 github repo 获取代码。

方法概述

首先,我们首先在本地系统上处理 100 个类的数据样本,以设置整个过程。

这次试运行的一个教训是,使用较小分辨率的图像,模型训练的速度提高了 6 倍。

不同分辨率图像的下载时间大致相同(主要时间花在打开 url 链接上)。出于时间的考虑,我们决定在我们的项目中使用分辨率为 96x96 的图像,而不是全分辨率。最终的结果产生于 2000 个具有调整图像大小的类的数据样本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们需要选择一个平台,在一个巨大的数据集上运行如此密集的代码。一般选项有亚马逊网络服务(AWS)、谷歌云平台(GCP)或任何其他大数据处理平台。我们选择使用 GCP,因为帐户启动时有 300 美元的免费信贷。这个博客是一个很好的资源,可以一步一步的指导你在 GCP 创建图像识别的虚拟实例,特别是 CNN。我们最终使用了 1 个 GPU——NVIDIA Tesla K80,8 个 CPU,50GB RAM 和 500 GB 磁盘空间。

为了图像分类的目的,我们需要从一般的数据预处理开始,然后才能从 Keras 实现 CNN。我们需要在训练集和验证集中对图像进行分类标记,因此我们建立了相应的数据集。

在数据预处理之后,我们的方法包括对数据使用 VGG16 预训练模型以及 DeLF 来处理困难的测试图像。DELF 匹配图像中的局部特征,我们将在后半部分详细讨论这一点。最后,我们使用来自训练数据的样本测试集来检索准确度分数,并且我们的模型能够达到高达 83%的准确度(鼓掌!/喘息声!) .

I .获取图像数据

数据以 CSV 的形式出现,带有图像 URL 和地标 id。我们的 2000 个类样本包含从“1000”到“2999”的类标签(地标 id)。本项目的数据预处理大致分为以下几个步骤:

a)Train-validation-holdout data:由于 test 文件夹中的文件大部分是垃圾文件,不包含任何地标,我们不得不从 training.csv 创建自己的 holdout set 来测试我们的最终模型。我们从每个类中抽取 1%的图像来制作维持数据集。接下来是对剩余 99%数据的训练验证分割。来自每个类别的 20%的图像被标记为验证集,剩余的 80%用于训练。在这一步的最后,这就是数据分布

测试集有 1183 行。验证数据有 31,651 行,训练数据有 130,551 行。

**b)获取图像文件:**准备好图像 URL 和唯一 id 后,下一步是将图像下载到适当的文件夹中。创建了三个单独的文件夹,每个文件夹对应一个训练集、验证集和维持集。调整大小后的图像(96x96)被下载到各自的文件夹(在 GCP)中,大约花了 9 个小时才完成。

c)制作目录结构:训练和验证数据必须采用特定的目录格式,这样我们才能使用 Keras 功能。我们将数据转换成这种结构,其中每个类都是 Train/Validation 文件夹中的一个子文件夹。该子文件夹包含属于该类别的所有图像文件。

二。数据预处理

数据清理

某些 URL 链接已断开,下载的文件已损坏。在将文件移动到特定目录之前,使用文件大小大于 1000 字节的过滤器删除了所有此类文件。接下来,我们发现一些类在验证文件夹中丢失了。这是因为 80-20 的比例。所有具有 4 个或更少图像的类对验证集没有任何贡献(因为 4 的 20%小于 1)。验证数据中缺少文件夹导致模型训练出现问题。创建空白文件夹就是为了解决这个问题。

图像增强

我们的数据中的图像是在不同的角度、水平位移、变焦等情况下拍摄的。预计在测试数据中也会发现类似的变化。为了说明这些变化,我们对高度和宽度偏移、缩放、亮度、旋转和剪切进行了非零值的图像增强。我们没有将增强图像存储在我们的系统中,而是将它们直接用作模型的输入。通过目测图像来选择要使用的参数类型,并根据模型训练获得的精度来确定这些参数的具体值。

三。模特培训

在 Keras 库中可以找到不同的 CNN 架构,例如 VGG16、VGG19、Inception 等。虽然 VGG19 和 Inception 是更重的架构(需要训练的参数数量),但在我们拥有的时间范围内,训练 VGG16 是可行的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An image classified as triumphal_arch using ImageNet

从简单开始,我们使用在 Google ImageNet 数据集上预先训练的 VGG16 来预测地标。我们观察到 ImageNet 权重能够成功地从我们的图像中捕获一般特征。这使得 VGG16(带有 ImageNet 权重)成为我们在迁移学习过程中的首选模型。

我们的方法是使用 VGG16 的瓶颈层作为特征提取器,并训练顶部 3 层使用更具体的特征对地标进行分类。在阅读了一些关于迁移学习的最佳实践的博客之后,我们加入了一个额外的步骤,在对整个网络进行训练之前,初始化前三层的权重。

所以我们最后的过程看起来像这样:

  1. 在 VGG16 的瓶颈层上使用 ImageNet 权重将图像(96x96)转换为矢量。
  2. 初始化最上面三层的权重。为此,训练了仅具有三个密集层(2 个 ReLU 激活,1 个 softmax)的模型。输入是上一步获得的图像向量。这样得到的重量被保存起来以备后用。
  3. 现在,整个 VGG16 模型已经编译完成——上一步中的前三个初始化层被添加到 VGG16 底层之上。我们选择只冻结底部的 16 层,而不是 19 层,这样网络可以更好地学习 ImageNet 图像之外的图像。这给了我们一个很好的准确性跳跃。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Step 1: Yellow, Step 2: Blue, Step 3: Red

我们探索的编译模型中的可变性是——要训练的层数、优化器的类型、所选优化器的超参数、图像增强的参数、批量大小和时期数。这些细节将在下面讨论。损失函数被固定为“分类交叉熵”。

IIIa。要训练的层数

我们只采用 VGG16 架构直到最后一个卷积层,并在顶部添加全连接层作为顺序层。这很重要,因为从 VGG16 中选择完全连接的层迫使我们对模型使用固定的输入大小(224 X 224,原始的 ImageNet 格式)。通过只保留卷积模块,我们的模型可以适应任意的输入大小。在我们的例子中,它是 96 X 96(图像高度 X 图像宽度)

借助新编译的 VGG16 架构,我们在对数据进行训练的同时,改变了冻结权重的层数。在中间运行中,我们还试验了添加的脱落层来测试我们模型的结果。对于验证和训练数据集来说,精度会随着丢失层而下降,因此被移除。

仅使用三个密集层(2 个 ReLU 激活,1 个 softmax)和冻结在底部 16 层的来自 ImageNet 的权重,就可以实现最佳精度。

IIIb。优化者

我们使用了各种优化工具,包括 momentum SGD、Adam 和 Adagrad。超参数首先以标准范围给出,然后朝着提高精度的方向变化。没有一个特定的学习率对所有优化者都有效。我们观察到,训练时间随着数据量的增加而线性增长,同样的学习速度也适用于更大的数据。我们调整的超参数是这些优化器的学习速率、动量和衰减。在用一些自适应学习率梯度下降算法进行试验后,我们观察到 Adam 对我们的问题是最好的。本文对超参数调优过程有很大帮助。

IIIc。图像增强

在观察了每个参数对图像的影响后,我们观察了每个参数对模型结果的累积影响。这些范围证实了我们目测照片的观察结果,这些照片有时是参观纪念碑的人拍摄的自拍照,例如 15-30°的角度会产生良好的精确度。

IIId。批量

有两个批量大小的实例要使用。

一个是在将图像转换为特征向量(使用 VGG16 瓶颈层)时应用图像增强,其中图像是成批拍摄的。这意味着训练和验证图像的数量应该是该批量大小的倍数。我们的最终模型的批量为 240。

其次是在模特培训期间。增加批量大小是增加训练时间和增加模型准确性之间的折衷。批量大小为 1 将基本上进行随机梯度下降,一次进行一次观察。对于如此庞大的数据集,在决定批量大小时,必须牢记我们系统的内存限制。我们能够以合理的准确度和运行时间达到 240 的批量。

IIIe。时代数

一旦上述超参数的特定设置达到了良好的精度水平,我们就将时期从 15 增加到 24 或 30,这将产生更好的模型结果。在 GCP 上使用单个 Nvidia Tesla K80 GPU 和 8 个 CPU(批量大小为 240)时,每个历元大约需要 15 分钟,因此历元的增量是选择性的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终模型

我们用 VGG16 架构训练的模型在验证集上可以给我们 78.60%的准确度,在转移到其他模型如 Inception 和 Resnet 之前,我们竭尽全力提高准确度,查看不同参数的影响。对于我们的最终模型,在 30 个历元之后,精度饱和到接近的值范围。最终模型的参数如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在模型已经训练好了,我们得到了 78.6%的验证准确率,接下来呢??让我们继续对测试图像进行预测。但是…

测试数据主要由不相关的图像组成,这些图像甚至不是地标

这是一个问题,因为深度神经网络很容易被欺骗,也就是说,即使是不相关的图像,也会被有把握地归类为一类。那么,我们如何判断神经网络的预测是否正确呢?

四。深度局部特征

为了解决这个问题,我们利用一种称为 DeLF 的局部特征描述符进行大规模图像检索。它从图像中提取局部特征并进行匹配。我们使用它将测试图像的局部特征与已知的地标图像进行匹配。

DeLF 是 Google 最近开发的,详细内容可以在这篇论文中找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DeLF Pipeline

DeLF 架构是这样的,它选择具有最高分数的特征,然后查询图像通过,并且在经过几何验证之后,其特征与数据库图像的特征相匹配。特征的匹配是通过 Ransac(随机样本一致性)完成的,并且内联体的数量被用于做出决定。

内联体数量的这个阈值(进行‘标志’—‘无标志’分类)由我们决定,并且可以根据图像的分辨率直观地改变。分辨率越高,可用于匹配的局部特征的数量越多。然后通过 DELF 发送从深度网络获得的预测,并将测试图像与来自预测类的数据库图像进行比较。

有 3 种可能的匹配情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一种情况具有最多的内联体,第二种情况具有较少的内联体,并且在没有界标的情况下,没有到只有几个内联体(同样,实际数量取决于我们决定处理的图像的分辨率)。

因此,设置适当的阈值,我们能够决定测试图像实际上是否是地标。

动词 (verb 的缩写)结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Test set is the holdout set that was kept aside in the beginning

为了更好地理解模型行为,我们检查了一些错误分类的图像,并收集了一些有趣的观察结果。几个错误分类的测试图像看起来相似,并被合理地分类到错误的类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Images that confused our model

不及物动词结论

摘要

我们试图训练 CNN 在谷歌地标识别挑战中获得良好的准确性。为此,谷歌云平台被用来使用具有所需功能的机器。首先,训练图像数据集被分成训练、验证和测试图像,并且图像在下载之前被调整大小以使挑战更易处理。对于模型训练,VGG 16 神经网络与来自 ImageNet 的迁移学习一起使用。我们尝试了#层、优化器、超参数、图像增强、批量大小和#时期的变化,以提高验证准确性。最后,我们使用 DeLF 来处理主要由不相关图像组成的实际测试数据集。

后续步骤

对于这个项目,由于时间短和可用的计算机资源,我们面临许多限制。明确的下一步将是尝试更重的模型,如 Inception Net(它一直在我们配置的系统中抛出 OOM 错误),增加批量大小,并在更大的样本(或整个数据集)上工作。我们还尝试将图像分辨率增加到 224x224,但这将一个时期的训练时间增加到 90 分钟。如果有更多的时间,我们肯定会探索图像分辨率对准确性的影响。

改进或发展我们当前工作的其他可能步骤包括:

  • 为测试图像创建 DeLF 和 CNN 的管道,以确保只有有效的界标被馈送到 CNN 进行分类。
  • 一旦更多的 CNN 像 Inception Net 和 ResNet 被训练,尝试这些模型的集合。

七。从过程中学习

回顾过去,我们的团队从整个过程中学到了很多东西。在这里,我们记下几个关键的要点,我们希望在开始项目之前就知道。

  1. 利用预先构建的磁盘映像进行映像识别。试图通过安装所有依赖项来配置自己的系统是一场噩梦!
  2. 检查tensor flow 是否确实在使用 GPU 加速,然后等待几个小时等待您的纪元运行。
  3. 总是在较小的数据集上对整个过程进行试运行(从最开始到结束)。

非常感谢我们的教授 Joydeep Ghosh 博士,他在这个旅程中给了我们很大的帮助。如果您有任何意见或建议,请告诉我们。希望这个博客能帮助你设计你自己的图像分类项目!

谷歌新闻和列夫·托尔斯泰:使用 t-SNE 可视化 Word2Vec 单词嵌入

原文:https://towardsdatascience.com/google-news-and-leo-tolstoy-visualizing-word2vec-word-embeddings-with-t-sne-11558d8bd4d?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个人都以独特的方式感知文本,不管这个人是在网上看新闻,还是看世界知名的经典小说。这也适用于各种算法和机器学习技术,它们以更数学的方式理解文本,即使用高维向量空间。

本文致力于使用 t-SNE 可视化高维 Word2Vec 单词嵌入。可视化有助于理解 Word2Vec 如何工作,以及如何在神经网络或其他机器学习算法中使用它们之前解释从文本中捕获的向量之间的关系。作为训练数据,我们将使用来自谷歌新闻的文章和俄罗斯作家列夫·托尔斯泰的经典文学作品,托尔斯泰被认为是有史以来最伟大的作家之一。

我们通过 t-SNE 算法的简要概述,然后使用 Word2Vec 进行单词嵌入计算,最后,在 2D 和 3D 空间中使用 t-SNE 进行单词向量可视化。我们将使用 Jupyter Notebook 用 Python 编写我们的脚本。

t 分布随机邻居嵌入

T-SNE 是一种用于数据可视化的机器学习算法,它基于非线性降维技术。t-SNE 的基本思想是在保持点之间相对成对距离的情况下降低维度空间。换句话说,该算法将多维数据映射到两个或更多维,其中最初彼此远离的点也位于远处,并且靠近的点也转换成靠近的点。可以说,t-SNE 正在寻找一种新的数据表示方法,在这种方法中,相邻关系被保留。t-SNE 整个逻辑的详细描述可以在原始文章[1]中找到。

Word2Vec 模型

首先,我们应该获得单词的矢量表示。为此,我选择了 Word2vec [2],这是一个计算效率高的预测模型,用于从原始文本数据中学习多维单词嵌入。Word2Vec 的关键概念是定位在训练语料库中共享共同上下文的单词,这些单词在向量空间中与其他单词相比非常接近。

作为可视化的输入数据,我们将使用来自谷歌新闻的文章和列夫·托尔斯泰的几部小说。在谷歌新闻数据集(大约 1000 亿字)的一部分上训练的预训练向量是由谷歌在官方页面发布的,所以我们将使用它。

除了预训练的模型,我们将使用 Gensim [3]库在托尔斯泰的小说上训练另一个模型。Word2Vec 将句子作为输入数据,产生单词向量作为输出。首先,需要下载预先训练的 Punkt 句子标记器,它将一个文本分成一系列句子,考虑缩写词,搭配和词,这些词可能指示句子的开始或结束。默认情况下,NLTK 数据包不包括预先训练的俄语 Punkt 分词器,所以我们将来自https://github.com/mhq/train_punkt的第三方模型。

在 Word2Vec 训练阶段,使用了以下超参数:

  • 特征向量的维数是 200。
  • 句子中被分析单词之间的最大距离是 5。
  • 忽略每个语料库中总频率低于 5 的所有单词。

使用 t-SNE 可视化单词嵌入

在需要可视化位于多维空间中的对象之间的相似性的情况下,T-SNE 非常有用。对于大型数据集,制作易读的 t-SNE 图变得越来越困难,因此常见的做法是可视化最相似单词的组。

让我们从预先训练的 Google 新闻模型的词汇表中选择几个词,并准备词向量用于可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The effect of various perplexity values on the shape of words clusters

接下来,我们进入本文最吸引人的部分,SNE 霸王龙的构型。在这一节中,我们应该注意下面的超参数。

  • 部件的数量,即输出空间的尺寸。
  • 困惑值,其在 t-SNE 的上下文中可以被视为有效邻居数量的平滑测量。它与许多其他流形学习者中使用的最近邻的数量有关(见上图)。根据[1],建议在 5 到 50 之间选择一个值。
  • 嵌入的初始初始化类型

值得一提的是,t-SNE 有一个非凸的目标函数,使用随机初始化的梯度下降优化将其最小化,因此不同的运行会产生略有不同的结果。

下面是使用 Matplotlib 创建 2D 散点图的脚本,Matplotlib 是 Python 中最流行的数据可视化库之一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Clusters of similar words from Google News (preplexity=15)

在某些情况下,为了看到全貌,一次绘制所有单词向量可能是有用的。现在让我们来分析《安娜·卡列尼娜》,这是一部充满激情、阴谋、悲剧和救赎的史诗小说。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Visualization of the Word2Vec model trained on Anna Karenina

如果我们在 3D 空间中映射初始嵌入,则整个画面可以提供更多信息。这一次让我们来看看《战争与和平》,它是世界文学的核心小说之一,也是托尔斯泰最伟大的文学成就之一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Visualization of the Word2Vec model trained on War and Peace

结果呢

这是从 Word2Vec 和 t-SNE 的角度看文本的样子。我们为谷歌新闻中的相似词汇绘制了一个信息量很大的图表,并为托尔斯泰的小说绘制了两个图表。还有一件事,GIFs!gif 很牛逼,但是绘制 gif 和绘制常规图形几乎是一样的。所以,我决定不在文章中提及它们,但是您可以在源代码中找到生成动画的代码。

Github 提供了源代码。

[## sismetanin/word2vec-tsne

谷歌新闻和列夫托尔斯泰:使用 t-SNE 可视化 Word2Vec 单词嵌入。

github.com](https://github.com/sismetanin/word2vec-tsne)

参考

  1. 长度 Maate 和 G. Hinton,“使用 t-SNE 可视化数据”,《机器学习研究杂志》,第 9 卷,第 2579-2605 页,2008 年。
  2. T.Mikolov,I. Sutskever,K. Chen,G. Corrado 和 J. Dean,“单词和短语的分布式表示及其组合性”,神经信息处理系统进展,第 3111–3119 页,2013 年。
  3. R.Rehurek 和 P. Sojka,“大型语料库主题建模的软件框架”,LREC 2010 年自然语言处理框架新挑战研讨会论文集,2010 年。

谷歌对象检测 API 检测品牌标志第 1 部分

原文:https://towardsdatascience.com/google-object-detection-api-to-detect-brand-logos-fd9e113725d8?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Brand Logos Object Detection

Google 已经分享了它的 Object Detecion API 和非常好的文档来帮助我们在自己的数据集上训练一个新的模型。文档可在使用云机器学习引擎训练对象检测器获得。指南解释得很清楚,只要按照步骤做一些改动就可以了。我试图训练检测品牌标志的模型,并发现结果适合这篇博文。

数据集

我使用的是 Flick-27 logo 数据集,它是公开可用的,有从 Flickr 下载的 27 个品牌的图片。它为每个类有 30 张图片。总共 810 幅图像用于训练。虽然它对于深度学习问题来说是一个非常小的数据集,但是使用数据扩充技术,它可以膨胀到适合于训练对象检测模型的更大的数据集。

一个大的数据集 flickr-32 也有更多的例子。对于训练数据集的 32 个类别中的每一个,它具有 70 个图像,而对于测试和验证数据集,它对于每个类别具有 10 个图像。它还有 6000 张没有标识的图片。但是它没有注释(图像中徽标周围的边框)。这就是为什么它更适合于标识(对象)识别而不是标识(对象)检测。

数据增强

因为 flick-27 是一个非常小的数据集,只有 810 张图像,所以数据扩充是训练前非常重要的一部分。为了增加数据,我从给定的图像中裁剪出每一个标志,并进行一些变换,如水平翻转、垂直翻转、添加噪声、旋转、模糊等。然后将每个转换后的图像粘贴到一些随机位置上没有徽标的图像上,并记录位置坐标,这些坐标将作为以后训练的注释。在这之后,我从仅仅 810 张图片中得到了大约 15000 个例子。我使用视觉对象类挑战 2012 数据集作为无徽标数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Augmented data

迁移学习

迁移学习是深度学习的一个重要概念。在迁移学习中,我们通过将输入作为自己的数据集来重新训练已经训练好的模型。这样我们可以减少训练所需的数据量和训练时间。训练利用来自已经训练的模型的权重,并开始学习新的权重来学习分类新的数据。这是一种非常有效的技术。

我使用了在牛津 Pet 数据集上训练的 SSD Mobilenet 模型作为基础模型,而在同一牛津 Pet 数据集上训练的更快的 RCNN 被用于使用例如云机器学习引擎训练对象检测器。与 RCNN 或更快的 RCNN 等更大的模型相比,使用 SSD mobilenet 作为模型更小、更快。模型训练的大小只有 22MB。

更多经过训练的迁移学习模型可以在检测模型动物园找到。

培养

由于训练步骤已经在原帖使用云机器学习引擎训练物体检测器中做了很好的解释,我就不在这里解释了。然而,更多的帖子会有所帮助

如何用 TensorFlow 的物体检测器 API 训练自己的物体检测器

用 Tensorflow 和 OpenCV 构建实时物体识别 App

结论

我尝试使用 Flickr-27 数据集为品牌标志检测的对象检测进行训练,我发现了一些好的结果和大量的学习。

我观察到,它在高清晰度图像上工作得非常好,而在图像中的较小对象上不太准确。这是 SSD mobilenet 模型的一个折衷。但 SSD mobilenet 可以与高清摄像头一起实时使用,以获得更高的准确性,与 GPU 一起使用,以实现更快的实时检测。

下一个

我计划将来用更多的图片在 Flickr-47 数据集上训练它,以获得更好的准确性。

用高清摄像头和 GPU 在实时视频流上测试它。

尝试 SSD Inception 模型,而不是 Mobilenet,以便在较小的对象上获得更好的准确性。

第二部分:https://medium . com/forward-data-science/Google-object-detection-API-to-detect-brand-logos-Part-2-384055 e4e 109

检测品牌标志的 Google 对象检测 API 第 2 部分

原文:https://towardsdatascience.com/google-object-detection-api-to-detect-brand-logos-part-2-384055e4e109?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我对 Logo 检测的痴迷从第一部就开始了。所以这次我尝试用一个更大的数据集和一些其他模型来使用迁移学习进行训练。结果优于第一部分。我能够检测尺寸较小的徽标,并且通过对检测代码进行一些更改,我也能够提高检测速度。

新数据集— Flickr Belga 徽标

在我之前的尝试中,我使用了更小的 flickr-27 徽标数据集——只有 27 个徽标类别的 810 幅训练图像。因此,面临的挑战是找到一个更好的数据集,用更多数量的图像进行训练。很难找到带有可用于对象的注释的图像数据集。

幸运的是,我偶然发现了 flickrBelgaLogos 数据集,它是 Belga 徽标数据集的扩展。Belga 徽标数据集包含 37 个徽标类别的 10k 幅图像。然而,在评估后,只有 2695 个被认为适合检测。flickrBelgaLogos 创建了一个新的合成数据集,方法是将 Belga 徽标中裁剪的徽标剪切并粘贴到从 Flickr 抓取的图像数据集中。

每个徽标类别的徽标分布可以从他们的网站上看到。我删除了一些图像样本数量较少的徽标类别。最后,我为总共 2406 张图片的 20 个标志类别创建了一个数据集。(我还复制了 flickr-27 数据集中的图片,以增加样本量)。

虽然这不是一个庞大的数据集,但显然比我之前的数据集有所改进。而且性能提高了许多倍。

训练不同的模型

有了数据集和注释之后,很容易得到注释 XML。然而,有一些重要的观点

1-总是以类别名称开头,后跟下划线“_”。此外,XML 的命名应该与图像名称相同。

2-label _ map . Pb txt 文件中的类别名称应以 1 开头,而不是 0。否则,将跳过类别 0 进行培训。

3-同样在训练时,如果你得到一个错误,很可能你的注释文件不正确,注释文件中的对象位置超出了图像边界。

创建”后。记录“来自图像数据集的文件我使用转移学习训练了 3 个模型— Faster_Rcnn_restnet101、SSD Inception V2 和 SSD Mobilenet 。我的意图是获得更快和更好的检测。这些是我在上述模型上训练和测试时的一些观察结果

1-更快的 RCNN 在检测中是最好的,而在检测中稍慢。然而,它们并不太慢。我设法实现了每秒 3.6 帧的视频检测,而没有并行性。我用的是 GeForce GTX 1060 6GB 机。

2- SSD Inception 和 Mobilenet 的检测速度非常快,但检测精度非常低。也许它们可以在大量训练数据集上表现得更好,但更快的 RCNN 仍然是我检测的选择。

3-我对上述模型进行了大约 100,000 次迭代的训练。但是更多的迭代使得模型更容易检测到假阳性。我不知道原因,但这是我观察到的。使用在更快的 RCNN restnet 上训练的. 99 阈值检测 obove 视频,迭代 110k】。

检测更小的物体

检测更小的物体是我从一开始就关心的问题,为了实现这一点,我尝试使用图像中更小的物体来训练模型。这在直觉上看起来是正确的,而我通过长时间训练模型实现了较小物体的检测。但是模型能探测到多小的物体是有限制的。

标注的较小对象上的训练模型可能会增加假阳性检测,而非常小的对象上的训练甚至可能不训练。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

检测速度

由于 Priya Dwivedi 发布了“https://medium . com/forward-data-science/is-Google-tensor flow-object-detection-API-the-easy-way-to-implementing-image-recognition-A8 BD 1 f 500 ea 0”,我能够轻松地对视频进行检测,因为 OpenCV for Videos 非常令人头痛,而 moviepy 则容易得多。

对于一个 30 秒的剪辑(更快的 RCNN restnet 模型),我能够将时间提高到大约 3 分钟的检测时间,如上文提到的 1920x1080 视频剪辑的 3.6 FPS。在独立图像上,它在 0.28 秒内探测到物体。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谷歌智能写作、机器偏见、种族主义人工智能——总结一个疯狂阅读博客的夜晚

原文:https://towardsdatascience.com/google-smart-compose-machine-bias-racist-ai-summarising-one-night-of-binge-reading-from-blogs-19a033953013?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pic Credit

在桑德尔·皮帅上台并开始他的谷歌 I/O 2018 主题演讲后,我开始记下正在宣布和演示的有趣的事情。有一些非常有趣的演示和公告,特别是对于那些对深度学习感兴趣的人。我对 Gmail 的 Smart Compose 和 Google Duplex 以及其他东西很好奇,这两个都是自然语言处理的用例。Google Duplex 得到了很多关注,这并不奇怪,因为 Google Assistant 与真人的对话听起来天衣无缝,也很像人。如果你对深度学习感兴趣,你肯定想知道至少一点关于这些是如何完成的,谷歌的研究博客是一个了解更多的好地方。以防你不知道,ai.googleblog.com 是谷歌新的研究博客!

我们都熟悉在手机上完成单词的建议。但是为什么要把这个功能限制在只有单词补全呢?智能撰写是 Gmail 的新功能,它可以在我们撰写电子邮件时提供建议,从而帮助我们完成句子。这也像许多最近的进步和功能,利用神经网络。在典型的单词完成任务中,提示性单词取决于标记/单词的前缀序列。根据前面的单词,建议接下来可能出现的语义最接近的单词。在智能撰写的情况下,除了前缀序列之外,电子邮件标题以及先前的电子邮件正文(如果在当前邮件是对先前邮件的回复的情况下存在)也被认为是输入,以提供句子完成的建议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pic Credit

延迟、可伸缩性和隐私是三个已确定的挑战,要使该功能高效、可访问且安全,就必须解决这三个挑战。为了使句子完成建议有效,等待时间应该更短,这样用户就不会注意到任何延迟。考虑到有超过 10 亿人使用 Gmail,很难想象每封邮件的内容会有多么不同。该模型应该足够复杂和可伸缩,以容纳尽可能多的用户。当涉及任何类型的数据时,到处都可以听到对隐私的呼喊。只有少数事情比我们的电子邮件更需要隐私。因此,模型不应该以任何方式暴露用户的数据。

谷歌在 Smart Compose 上的博客引用了一些研究论文,这些论文有助于构建这一新 Gmail 功能背后的神经网络架构。还有一篇在博客中分享的论文 语义从语言语料库中自动导出必然包含人类偏见 。这是一篇非常有趣的论文,它引导我写了一系列博客。即使你不是人工智能研究人员,也不是机器学习专家,你也一定听说过这些领域的进步极大地改变了我们生活的许多方面。隐私和偏见是围绕从数据中学习的应用程序或程序的使用的两个大问题。虽然隐私问题已经被关注了很长一段时间,但偏见似乎也在蔓延。任何利用机器学习来解决问题的程序都需要数据作为输入。根据手头的问题或任务,这些输入数据可以是文本、图像、音频等。不管输入数据是什么类型/形式,它都是通过某种人类行为生成的。这意味着存在于人类行为和思想中的偏见和成见是学习模型中最重要的部分——输入。

当哈佛大学的拉坦娅·斯威尼在谷歌上搜索自己的名字时,令她惊讶的是,搜索结果中还有一条广告显示,“拉坦娅·斯威尼被捕了?”这让她对谷歌搜索结果进行了研究,从中她得出结论,与黑人联系更紧密的名字更有可能出现这样的搜索结果或广告。她在对 2000 多个真实姓名进行搜索后发现,与黑人相关的名字显示此类犯罪广告的可能性高达 25%。谷歌搜索在这里是种族歧视吗?这是来自谷歌的回应——“AdWords 不进行任何种族定性。我们也有一个“反”和暴力政策,声明我们将不允许宣传反对某个组织、个人或群体的广告。由个体广告客户决定他们希望选择哪些关键词来触发他们的广告。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pic Credit

2016 年,一位互联网用户在 Twitter 上发帖,讲述了他使用谷歌图片搜索的经历之一。当他搜索“三个白人少年”时,他发现的结果是微笑、快乐的白人少年的图像。当用“三个黑人少年”进行类似的搜索时,结果大相径庭。虽然这些结果也有一些正常和普通的图像,但许多其他结果是被监禁的青少年的。这篇文章发布后很快就火了,这并不奇怪。这背后的原因是什么?图像搜索背后的算法是编程来做这个的吗?情况肯定不是这样。谷歌也解释了这种情况——“我们的图片搜索结果是整个网络内容的反映,包括各类图片出现的频率以及它们在网上的描述方式”。

问题似乎只出在可以访问大量数据的大型科技公司的应用程序/算法上吗?美国的许多法院使用一种软件给被告/被指控者一个风险分数。这个分数代表这个人犯罪的可能性。软件从哪里获得数据来执行分析并给出风险分数?据 ProPublica 的博客称,开发这种风险评估软件的 Northpointe 公司使用了 137 个问题的答案作为数据。这些答案要么直接通过询问被告获得,要么取自过去的犯罪记录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pic Credit

在这种情况下,数据可能不多,但这并不意味着该程序没有偏见。当 Brisha Borden 骑着一辆不属于她的自行车被逮捕时,风险评估程序给她打了高分,认为她将来可能会犯下更多的罪行。同一个节目给了弗农·彼得一个较低的分数,他过去曾因持械抢劫入狱 5 年。然而,在两年的时间里,得分高的布里沙没有犯任何罪行,而得分低的弗农却因为另一次抢劫而再次入狱。数据也是这个风险评估项目最关键的组成部分。

这些不仅仅是为了解释偏见问题而精心挑选的一些事件。几年前有一个事件,惠普的面部跟踪网络摄像头在白人身上工作正常,但却无法识别深色皮肤的人。谷歌照片将黑人归类为大猩猩。所有这些的根本原因是偏见是被使用的数据的很大一部分。当生成的数据存在偏差时,以及当收集的用于训练模型的数据不具有代表性时,都会发生这种情况。当手机或网站上的一些应用程序将他们或朋友归类为某种动物时,并非所有人都会一笑置之。没有一家研究基于数据的算法和应用的公司会希望它们表现出偏见。我们许多人都很清楚,用于这些目的的算法远非完美。然而,当人们经历这些偏见时,他们的反应会是自发的,就好像他们受到了同伴的影响一样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pic Credit

拉坦娅·斯威尼事件发生在 2013 年。同样,提到的其他事件发生在 2014 年和 2016 年的某个时候,而惠普的面部跟踪问题发生在 2009 年。鉴于我们正在谈论的事件发生在几年前,这些偏见的问题现在可能已经解决了,不是吗?不。谷歌通过阻止应用程序中的任何图片被归类为大猩猩、黑猩猩等,修复了照片应用程序的问题。听起来更像是一种变通办法,而不是解决办法?但是我们的问题是这些是偏见,而不是错误。它们不存在于代码中。它们存在于数据中,这使得这个问题很难解决。

学习模型并不完美。开发和建造这些设备的公司也没有假装它们是。谷歌毫不犹豫地承认,即使是其最先进的算法也容易受到数据偏差的影响。它不断努力使这些算法变得更好。苹果已经从以前的人脸识别软件面临的所有缺陷和问题中吸取了教训。它确保使用神经网络构建的人脸识别程序是根据适当的代表性数据进行训练的——这些数据包括年龄、性别、种族、族裔等所有多样性。领先的科技公司和许多其他公司正在朝着改进这些算法的方向迈进,这些算法肯定有很大的潜力,比如疾病的早期检测和诊断,帮助不同能力的人,教育,使计算机和技术更好地执行类似人类的任务等。

尽管这些进步在过去几年里发生得很快,但像算法偏差这样的问题仍然存在。由于学习模型在对其进行训练的数据中存在偏差时是无能为力的,因此开发不仅学习关联模式而且学习在偏差存在时隐式处理偏差的学习模型将是一个巨大的进步。我们人类是如此受思想驱动。然而,即使有偏见的想法,如果我们愿意,我们也有能力采取不带偏见的行动。学习模型能学会这样做吗?如果不完全是,至少在某种程度上是?

致谢:

Google 研究团队在 Google Smart Compose 上的博客— 链接
语义从包含类人偏见的语言语料库中自动导出研究论文— 链接
ProPublica 在机器偏见上的博客— 链接

你觉得这个帖子有用吗?鼓掌是让我知道它做到了的一种方式。感谢阅读!!

要连接: LinkedInTwitter 和我的博客

谷歌的 AutoML 将改变企业使用机器学习的方式

原文:https://towardsdatascience.com/googles-automl-will-change-how-businesses-use-machine-learning-c7d72257aba9?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想获得灵感?快来加入我的 超级行情快讯 。😎

Google 的 AutoML 是一个新兴的(alpha 阶段)机器学习工具云软件套件。它基于谷歌在图像识别领域的最新研究,名为神经架构搜索 (NAS)。NAS 基本上是一种算法,在给定特定数据集的情况下,它会搜索最佳神经网络来对该数据集执行特定任务。AutoML 是一套机器学习工具,允许人们轻松训练高性能的深度网络,而不需要用户拥有任何深度学习或人工智能的知识;你需要的只是标签数据!Google 将使用 NAS 为您的特定数据集和任务找到最佳网络。他们已经展示了他们的方法如何能够实现比手工设计的网络更好的性能。

AutoML 完全改变了整个机器学习游戏,因为对于许多应用程序来说,不需要专业技能和知识。很多公司只需要深度网络来完成更简单的任务,比如图像分类。在这一点上,他们不需要雇佣 5 个机器学习博士;他们只需要有人能够处理移动和组织他们的数据。

毫无疑问,企业如何使用“人工智能”的这种转变将带来变化。但是我们看到的是什么样的变化呢?这种变化对谁有利?所有进入机器学习领域的人会发生什么?在这篇文章中,我们将分析谷歌的 AutoML,以及总体上向软件 2.0 的转变,对机器学习领域的企业和开发者意味着什么。

更多的开发,更少的商业研究

人工智能领域的很多企业,尤其是初创企业,正在深度学习的背景下做相对简单的事情。他们的大部分价值来自于他们最终组装的产品。例如,大多数计算机视觉初创公司都在使用某种图像分类网络,这实际上将是 AutoML 在套件中的第一个工具。事实上,谷歌的 NASNet,在图像分类方面达到了目前的最先进水平,已经在 TensorFlow 中公开可用了!企业现在可以跳过产品管道中复杂的实验研究部分,直接使用迁移学习来完成任务。因为实验研究减少了,更多的商业资源可以花在产品设计、开发和所有重要的数据上。

说到这个…

它变得更加关注产品

从第一点连接,由于更多的时间花在产品设计和开发上,公司会有更快的产品迭代。公司的主要价值将不再是他们的研究有多伟大和前沿,而是他们的产品/技术设计得有多好。设计的好吗?好用吗?他们的数据管道是否以这样一种方式建立,即他们可以快速方便地改进他们的模型?这些将是新的关键问题,以优化他们的产品,并能够比竞争对手更快地迭代。尖端研究也将不再是提高技术性能的主要驱动力。

现在更像是…

数据和资源变得至关重要

既然研究是等式中不太重要的部分,公司如何脱颖而出?你如何在竞争中领先?当然,销售、营销以及我们刚刚讨论过的产品设计都非常重要。但是这些深度学习技术性能的巨大驱动力是你的数据和资源。你的数据越清晰、多样且有任务针对性(即质量和数量),你就越能使用 AutoML 等软件工具改进你的模型。这意味着获取和处理数据需要大量资源。所有这些都部分表明我们正在远离编写大量代码的本质。

它变得更加…

软件 2.0:深度学习成为大多数人工具箱中的另一个工具

使用谷歌的 AutoML 你所要做的就是上传你的标签数据,然后嘣,你就搞定了!对于那些没有深入(哈哈,双关语)这个领域,只想利用技术力量的人来说,这是一个大问题。深度学习的应用变得更加触手可及。编码更少,更多地使用工具套件。事实上,对于大多数人来说,深度学习只是他们工具箱中的另一个工具。Andrej Karpathy 写了一篇关于软件 2.0 的伟大文章,讲述了我们如何从编写大量代码转向更多的设计和使用工具,然后让人工智能完成剩下的工作。

但是,考虑到所有这些…

创造性科学和研究仍有空间

即使我们有这些易于使用的工具,旅程也不会就此结束!当汽车被发明出来的时候,我们并没有停止改进它们,即使现在它们很容易使用。仍然有许多改进可以用来改进当前的人工智能技术。人工智能仍然不是很有创造力,也不能推理或处理复杂的任务。它需要大量的标签数据,获取这些数据既昂贵又耗时。训练仍然需要很长时间才能达到最高的准确度。深度学习模型的性能对于一些简单的任务来说是不错的,比如分类,但在本地化等事情上只能做得相当好,有时甚至很差(取决于任务的复杂性)。我们甚至还没有完全理解内部的深层网络。

所有这些都为科学和研究提供了机会,特别是推进当前的人工智能技术。在商业方面,一些公司,特别是科技巨头(如谷歌、微软、脸书、苹果、亚马逊)需要通过科学和研究来创新过去的现有工具,以便竞争。他们都可以获得大量的数据和资源,设计出色的产品,进行大量的销售和营销等。他们真的可以使用更多的东西来使他们与众不同,这可以来自尖端创新。

这留给我们最后一个问题…

这一切是好是坏?

总的来说,我认为我们创造人工智能技术的这种转变是一件好事。大多数企业将利用现有的机器学习工具,而不是创建新的工具,因为他们不需要它。许多人都可以接触到接近尖端的人工智能,这意味着对所有人来说都是更好的技术。人工智能也是一个相当“开放”的领域,像吴恩达这样的主要人物创建了非常受欢迎的课程来教授人们这一重要的新技术。让事物变得更容易接近有助于人们适应快节奏的技术领域。

这样的转变以前发生过很多次。编程计算机是从汇编级编码开始的!我们后来转向了 C 之类的东西。今天许多人认为 C 太复杂了,所以他们使用 C++。很多时候,我们甚至不需要像 C++这样复杂的东西,所以我们只是使用 Python 或 R 这样的超高级语言!我们使用手边最合适的工具。如果你不需要一些超低级的东西,那么你就不必使用它(例如 C 代码优化,从零开始的深度网络的 R&D),可以简单地使用一些更高级的内置的东西(例如 Python,迁移学习,人工智能工具)。

与此同时,在人工智能技术的科学和研究方面的持续努力至关重要。通过设计新的基于人工智能的产品,我们肯定可以为世界增加巨大的价值。但是有一点需要新的科学来推进。人类的创造力永远是有价值的。

结论

感谢阅读!我希望你喜欢这篇文章,并从人工智能技术的当前趋势中学到一些新的有用的东西!这是一篇部分自以为是的文章,所以我很想听听你在下面的回应!

喜欢学习?

在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!

谷歌在 Keras 的使用

原文:https://towardsdatascience.com/googles-use-in-keras-22fef48e2dfa?source=collection_archive---------11-----------------------

如何使用谷歌的通用句子编码器进行垃圾邮件分类

这是我放在一起的一个小视频,关于如何在 Keras 模型中使用谷歌的通用句子编码器。在此视频中,我们训练了一个模型来区分真实和垃圾短信。

如果您有任何问题或反馈,请告诉我!

我的网站上有代码:http://hunterheidenreich . com/blog/Google-universal-sentence-encoder-in-keras/

垃圾邮件数据集原文可以在这里找到:https://www . ka ggle . com/UC IML/SMS-spam-collection-dataset/version/1 # _ = _

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

JavaScript 中的 GPU 加速神经网络

原文:https://towardsdatascience.com/gpu-accelerated-neural-networks-in-javascript-195d6f8e69ef?source=collection_archive---------3-----------------------

Octoverse 2017 报道,JavaScript 是 Github 上最受欢迎的语言。用 pull 请求的数量来衡量,JavaScript 的活跃程度可以与 Python、Java 和 Go 的总和相媲美。

JavaScript 已经征服了网络,并在服务器、手机、桌面和其他平台上取得了进展。

与此同时,GPU 加速的使用已经远远超出了计算机图形学的范围,现在已经成为机器学习不可或缺的一部分。

用深度架构训练神经网络是一个计算密集型过程,已经在机器智能的许多重要领域产生了最先进的结果。

本文着眼于这些趋势的持续融合,并概述了将 GPU 加速的神经网络引入 JavaScript 世界的项目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Community logo for JavaScript

概述

下面列出的所有项目都得到积极维护,在 Github 上有数千颗星,并通过 NPM 或 CDNs 分发。

它们都通过 WebGL 在浏览器中实现 GPU 加速,如果没有合适的显卡,则退回到 CPU。

旨在运行现有模型的库(尤其是那些用 Python 框架训练的)不包括在本概述中。

最终,有四个项目成功上榜。

虽然 deeplearn.js 的功能集面向神经网络,但它可以被描述为一个通用的机器学习框架。Propel 是一个科学计算库,提供自动微分。Gpu.js 提供了一种在 Gpu 上运行 JavaScript 函数的便捷方式。Brain.js 是一个更老的神经网络库的延续,使用 gpu.js 进行硬件加速。

我打算保留这篇文章,并将其扩展成一个 Github 库。如果你看到相关消息,请告诉我。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Deeplearn.js

Deeplearn.js 是四个项目中最受欢迎的,被描述为“机器智能的硬件加速 JavaScript 库”。它得到了谷歌大脑团队和一个由 50 多名贡献者组成的社区的支持。两位主要作者是丹尼尔·斯米尔科夫尼基尔·苏拉特

Definition of a convolutional layer in deeplearn.js

deeplearn.js 以 TypeScript 编写,并模仿 Tensorflow,支持 Google Brain 旗舰开源项目中提供的越来越多的功能子集。API 本质上有三个部分。

第一部分涵盖了用于创建、初始化和转换张量的函数,张量是保存数据的类似数组的结构。

API 的下一部分提供了在张量上执行的操作。这包括基本的数学运算、归约、归一化和卷积。在这一点上,对递归神经网络的支持是初步的,但确实包括长短期记忆网络单元的堆栈。

第三部分围绕模型训练展开。所有流行的优化器,从随机梯度下降亚当,都包括在内。另一方面,交叉熵损失是参考文献中提到的唯一损失函数。

API 的其余部分用于设置环境和管理资源。

node.js 中的实验性 GPU 加速可以通过 headless-gl 实现(参见第 49 期)。

该项目网站有许多令人难忘的演示。这些包括通过递归神经网络进行的钢琴演奏,建立模型的视觉界面和基于 SqueezeNet(一种参数数量相对较少的图像分类器)的网络摄像头应用程序。

推进

Propel 被描述为“JavaScript 的差异化编程”。两位主要作者瑞安·达尔伯特·贝尔德的工作得到了 11 位撰稿人的补充。

A feed-forward neural network with three layers trained with Propel on the MNIST data set

自动微分(AD)是这个项目的核心,让我们不再需要手动指定导数。对于用支持的张量运算定义的给定函数 f(x) ,梯度函数可以用 grad 得到。多变量箱由多 grad 覆盖。

除了 AD,这个项目的走向似乎并不完全明朗。虽然网站上提到“类似 numpy 的基础设施”是一个目标,但该 API 在“重度开发”下,包括与神经网络计算机视觉相关的功能。使用 load 函数,npy 文件的内容可以被解析并作为张量使用。

在浏览器环境中,Propel 利用 deeplearn.js 中的 WebGL 功能。对于 Node 中的 GPU 加速,该项目使用 TensorFlow 的 C API。

gpu.js

虽然我的大部分经验是使用 CUDA 而不是 WebGL,但我可以证明 GPU 编程的耗时本质。因此,当我看到 gpu.js 时,我感到惊喜。该项目在 Github 上有大约 5700 颗星,其受欢迎程度可与 deeplearn.js 媲美,并有 18 名贡献者。随着时间的推移,一些个人做出了重大贡献。罗伯特·普卢默是主要作者。

Matrix multiplication with gpu.js: The Hello World equivalent in GPU programming

在当前的上下文中,内核是在 GPU 而不是 CPU 上执行的功能。有了 gpu.js,内核可以用 JavaScript 的子集来编写。代码然后被编译并在 GPU 上运行。节点。通过 OpenCL 的 JS 支持已经在几周前添加了。

多达三维的数字和数字数组被用作输入和输出。除了基本数学运算,gpu.js 还支持局部变量、循环和 if/else 语句。

为了实现代码重用和更模块化的设计,可以注册定制函数然后在内核代码中使用。

在内核的 JavaScript 定义中, this 对象提供了线程标识符,并保存了在实际内核内部为常量但在外部为动态的值。

该项目专门研究加速的 JavaScript 函数,并不试图提供一个神经网络框架。为此,我们可以求助于依赖于 gpu.js 的库。

Brain.js

Brain.jsharthur/brain 的继任者,这是一个历史可以追溯到 2010 年古代的存储库。

总共有近 30 人对这两个资料库作出了贡献。

GPU 加速神经网络的支持基于 gpu.js,可以说是该项目最近历史上最重要的发展。

除了前馈网络,Brain.js 还包括三种重要类型的递归神经网络的实现:经典的 Elman 网络、长短期记忆网络和最近的带门控递归单元的网络。

资源库中包含的演示还处于早期阶段。主页上显示了学习色彩对比度偏好的神经网络。另外两个演示,一个涉及对用 ASCII 符号绘制的字符的检测,可以在源代码中找到。

用于机器学习的加速 JavaScript 库的出现有几个有趣的含义。

在线课程可以将与机器学习或 GPU 计算相关的练习直接集成到 web 应用程序中。学生不必跨不同的操作系统和软件版本建立单独的开发环境。

许多基于神经网络的演示可以更容易地部署,不再需要服务器端 API。

对机器学习感兴趣的 JavaScript 开发者可以充分利用他们的专业技能,在集成问题上花费更少的时间。

此外,可以更有效地利用客户端可用的计算资源。毕竟,并不是所有的显卡都一直被用于虚拟现实和加密货币挖掘。

明确地说,在这一点上,我不提倡将本文中提到的库用于任务关键型神经网络。Python 生态系统仍然是大多数应用程序的首选。

然而,看到过去 12 个月取得的进展令人鼓舞。一年前,deeplearn.js 和 Propel 都不存在。gpu.js 存储库中的活动水平相对较低,Brain.js 不支持 gpu 加速。

随着时间的推移,这些项目将在某些方面与已建立的框架竞争,并启用 JavaScript 独一无二适合的全新应用程序。

感谢您的阅读!如果你喜欢这篇文章,请点击拍手按钮并关注我,以获得更多关于机器学习最新发展的信息。

关于这个话题的介绍,可以看看我的机器从头学习系列。

GPU 优化的动态编程

原文:https://towardsdatascience.com/gpu-optimized-dynamic-programming-8d5ba3d7064f?source=collection_archive---------4-----------------------

利用 GPU 计算能力开发动态编程的并行性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: link

我们来考虑一下 路径和:项目欧拉问题 81 中的两路(环节)。探索解的动态编程范式和 GPU 优化是我们感兴趣的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Project Euler: 81

您需要通过向右或向下移动矩阵中具有最小单元聚合和的单元,从左上向右下遍历。所以在左边的图中,红色区域展示了满足给定条件的路径。

动态程序建模

对于上述任务,我们可以如下对动态程序建模。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dynamic Approach

我们可以从原点 O 开始遍历,并向右或向下移动。如果我们移动到 B 的成本是 成本(O + B) ,移动到 A 给出 成本(O + A) 。我们在拐角处没有选择的余地。考虑移动到 x 点,我们有两个选择。因此,现在正确的值是 min(Cost(A + X),Cost(B + X)) 。同样,我们可以遍历整个矩阵,更新从其 顶部左侧 双亲到特定单元的最小范围。这需要 O(mn) 的迭代次数,在我们的例子中我们考虑 80 x 80 导致我们6400次迭代。现在让我们从 GPU 的角度来考虑这个问题。在 GPU 中,所有的单元都是同时计算的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPU Computation

如所展示的,尽管在整个矩阵的初始迭代中立刻计算了所有单元,但是只有具有标记 1 的单元将被计算为具有正确的值。仅仅一次迭代之后,带有标记 2 的单元将不会计算出正确的值,因为此时带有标记 1 的单元不具有正确的值。同样,我们必须多次运行程序,以获得单元格中的正确数字。在图中,标有相同数字的单元可以并行计算,这是动态程序中可用的并行度。我们对 GPU 所要做的就是虚线所示的正确的行刷次数,但是有多少呢?它显然是行数和列数的总和。因此,时间复杂度是 O(m+n) 在我们的例子中是 160。这是一个巨大的收获。然而,由于我们一次又一次地计算整个矩阵,我们需要存储原始矩阵,从而增加了程序的空间复杂度。

示例代码

pom.xml 和 DynamicProgramming.java

用这种方法可以很快地得到非常大的矩阵的结果。迭代次数的上限是行数和列数之和,而不是乘积。我在代码中使用的数据集可以在项目欧拉问题 81 的网页上找到。

链接:https://projecteuler.net/problem=81

使用随机森林的梯度推进在纽约出租车费用预测挑战中的应用

原文:https://towardsdatascience.com/gradient-boosting-using-random-forests-for-application-on-the-new-york-taxi-fare-prediction-f6101c592bf9?source=collection_archive---------15-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这篇短文中,我将描述使用随机森林的梯度推进在 Kaggle 上的纽约出租车费用预测挑战中的应用。我还将比较两个最流行的软件包:微软的 LightGBM 和 Yandex 的 CatBoost

首先我将简要地谈论随机森林。随机森林基本上是决策树的集合,通常通过 bagging 方法训练,其中最大样本数设置为训练集的大小。在构建树的同时,每次都有一个分裂,并且从完整的 p 预测值集中选择随机样本的 m 预测值作为分裂候选值。这些 m 个预测值中只有一个被选择。在每次分裂时选择 m 个预测值的新样本。通常情况下,m√*p:*每次分割时考虑的预测值数量大约等于预测值总数的根。这具有以下效果:

  • 将树彼此去相关
  • 交易较高的偏差和较低的方差

随机森林有助于快速了解哪些特征很重要,尤其是在特征选择方面。

Boosting 是一种将几个弱学习者组合成一个强学习者的技术。您按顺序训练预测器,每次都试图纠正前一个预测器。不涉及 bagging(减少统计学习方法方差的通用程序)。每棵树都适合原始数据集的修改版本。

在我们谈论梯度增强之前,我们必须了解一下 Adaboost。自适应增强关注前一个欠适应的训练实例。增加错误分类的训练实例的相对权重,然后使用更新的权重训练第二分类器,等等。

类似于梯度下降,但不是改变单个预测参数来最小化成本函数,Adaboost 将预测器添加到集成中,逐渐使其更好。一旦训练了所有预测器,集成就像装袋一样进行预测,只是预测器具有不同的权重。然而,这种技术不能并行化,并且与装袋和粘贴相比不能很好地扩展。

渐变增强,和 Adaboost 一样也是一种序列技术。然而,在每次迭代中,新的预测器被拟合到由前一个预测器产生的残差,而不是使用实例权重。

整体算法如下:

  1. 使决策树回归器适合训练集
  2. 根据 1 产生的残差训练第二个决策树回归器。
  3. 根据 2 产生的剩余误差训练第三个回归变量。
  4. 通过将所有树的预测相加,使用这三棵树的集合对新实例进行预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Schematic of how gradient boosting works.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在说说代码:这个代码大量借用了 Kaggle 上的 Sylas。评估指标是 RMSE(均方根误差)。首先,您需要导入库,然后从 csv 文件输入数据。我们将使用 LightGBM。注意 nrows 参数。你做得越高,你应该得到的分数就越好,但是跑的时间就越长。

import numpy as np 
import pandas as pd
from sklearn.model_selection import train_test_split
import lightgbm as lgbm
import gc# Reading Data
train_df =  pd.read_csv('train.csv', nrows = 800000)
#Drop rows with null values
train_df = train_df.dropna(how = 'any', axis = 'rows')def clean_df(df):
    return df[(df.fare_amount > 0)  & (df.fare_amount <= 500) &
          # (df.passenger_count >= 0) & (df.passenger_count <= 8)  &
           ((df.pickup_longitude != 0) & (df.pickup_latitude != 0) & (df.dropoff_longitude != 0) & (df.dropoff_latitude != 0) )]train_df = clean_df(train_df)

Train_df 基本上包含纽约出租车的所有信息,包括上下车地点、乘客、日期和时间以及票价本身。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

How train_df looks like

现在我们需要定义几个要调用的函数。

# To Compute Haversine distance
def sphere_dist(pickup_lat, pickup_lon, dropoff_lat, dropoff_lon):
    """
    Return distance along great radius between pickup and dropoff coordinates.
    """
    #Define earth radius (km)
    R_earth = 6371
    #Convert degrees to radians
    pickup_lat, pickup_lon, dropoff_lat, dropoff_lon = map(np.radians,
                                                             [pickup_lat, pickup_lon, 
                                                              dropoff_lat, dropoff_lon])
    #Compute distances along lat, lon dimensions
    dlat = dropoff_lat - pickup_lat
    dlon = dropoff_lon - pickup_lon

    #Compute haversine distance
    a = np.sin(dlat/2.0)**2 + np.cos(pickup_lat) * np.cos(dropoff_lat) * np.sin(dlon/2.0)**2
    return 2 * R_earth * np.arcsin(np.sqrt(a))def sphere_dist_bear(pickup_lat, pickup_lon, dropoff_lat, dropoff_lon):
    """
    Return distance along great radius between pickup and dropoff coordinates.
    """
    #Define earth radius (km)
    R_earth = 6371
    #Convert degrees to radians
    pickup_lat, pickup_lon, dropoff_lat, dropoff_lon = map(np.radians,
                                                             [pickup_lat, pickup_lon, 
                                                              dropoff_lat, dropoff_lon])
    #Compute distances along lat, lon dimensions
    dlat = dropoff_lat - pickup_lat
    dlon = pickup_lon - dropoff_lon

    #Compute bearing distance
    a = np.arctan2(np.sin(dlon * np.cos(dropoff_lat)),np.cos(pickup_lat) * np.sin(dropoff_lat) - np.sin(pickup_lat) * np.cos(dropoff_lat) * np.cos(dlon))
    return adef radian_conv(degree):
    """
    Return radian.
    """
    return  np.radians(degree)def add_airport_dist(dataset):
    """
    Return minumum distance from pickup or dropoff coordinates to each airport.
    JFK: John F. Kennedy International Airport
    EWR: Newark Liberty International Airport
    LGA: LaGuardia Airport
    SOL: Statue of Liberty 
    NYC: Newyork Central
    """
    jfk_coord = (40.639722, -73.778889)
    ewr_coord = (40.6925, -74.168611)
    lga_coord = (40.77725, -73.872611)
    sol_coord = (40.6892,-74.0445) # Statue of Liberty
    nyc_coord = (40.7141667,-74.0063889) 

    pickup_lat = dataset['pickup_latitude']
    dropoff_lat = dataset['dropoff_latitude']
    pickup_lon = dataset['pickup_longitude']
    dropoff_lon = dataset['dropoff_longitude']

    pickup_jfk = sphere_dist(pickup_lat, pickup_lon, jfk_coord[0], jfk_coord[1]) 
    dropoff_jfk = sphere_dist(jfk_coord[0], jfk_coord[1], dropoff_lat, dropoff_lon) 
    pickup_ewr = sphere_dist(pickup_lat, pickup_lon, ewr_coord[0], ewr_coord[1])
    dropoff_ewr = sphere_dist(ewr_coord[0], ewr_coord[1], dropoff_lat, dropoff_lon) 
    pickup_lga = sphere_dist(pickup_lat, pickup_lon, lga_coord[0], lga_coord[1]) 
    dropoff_lga = sphere_dist(lga_coord[0], lga_coord[1], dropoff_lat, dropoff_lon)
    pickup_sol = sphere_dist(pickup_lat, pickup_lon, sol_coord[0], sol_coord[1]) 
    dropoff_sol = sphere_dist(sol_coord[0], sol_coord[1], dropoff_lat, dropoff_lon)
    pickup_nyc = sphere_dist(pickup_lat, pickup_lon, nyc_coord[0], nyc_coord[1]) 
    dropoff_nyc = sphere_dist(nyc_coord[0], nyc_coord[1], dropoff_lat, dropoff_lon)

    dataset['jfk_dist'] = pickup_jfk + dropoff_jfk
    dataset['ewr_dist'] = pickup_ewr + dropoff_ewr
    dataset['lga_dist'] = pickup_lga + dropoff_lga
    dataset['sol_dist'] = pickup_sol + dropoff_sol
    dataset['nyc_dist'] = pickup_nyc + dropoff_nyc

    return dataset

def add_datetime_info(dataset):
    #Convert to datetime format
    dataset['pickup_datetime'] = pd.to_datetime(dataset['pickup_datetime'],format="%Y-%m-%d %H:%M:%S UTC")

    dataset['hour'] = dataset.pickup_datetime.dt.hour
    dataset['day'] = dataset.pickup_datetime.dt.day
    dataset['month'] = dataset.pickup_datetime.dt.month
    dataset['weekday'] = dataset.pickup_datetime.dt.weekday
    dataset['year'] = dataset.pickup_datetime.dt.year

    return dataset

上面的代码主要计算哈弗线距离,它计算两个纬度经度点之间的距离。我们还希望以合适的日期和时间格式获得到机场的距离以及旅程的持续时间,以便稍后进行处理。

现在让我们修改 train_df,使这些附加属性从上面的函数中计算出来。

train_df = add_datetime_info(train_df)
train_df = add_airport_dist(train_df)
train_df['distance'] = sphere_dist(train_df['pickup_latitude'], train_df['pickup_longitude'], 
                                   train_df['dropoff_latitude'] , train_df['dropoff_longitude'])train_df['bearing'] = sphere_dist_bear(train_df['pickup_latitude'], train_df['pickup_longitude'], 
                                   train_df['dropoff_latitude'] , train_df['dropoff_longitude'])                                    
train_df['pickup_latitude'] = radian_conv(train_df['pickup_latitude'])
train_df['pickup_longitude'] = radian_conv(train_df['pickup_longitude'])
train_df['dropoff_latitude'] = radian_conv(train_df['dropoff_latitude'])
train_df['dropoff_longitude'] = radian_conv(train_df['dropoff_longitude'])train_df.drop(columns=['key', 'pickup_datetime'], inplace=True)y = train_df['fare_amount']
train_df = train_df.drop(columns=['fare_amount'])print(train_df.head())x_train,x_test,y_train,y_test = train_test_split(train_df,y,random_state=123,test_size=0.10)

Train_df 现在有了这些附加列:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

train_df with the additional columns after data processing.

我们可以去掉 train_df,因为我们现在已经将数据分为 x_train 和 x_test 以及 y_train 和 y_test。

del train_df
del y
gc.collect()

现在的关键部分是设置用于 LightGBM 的参数。我调整的关键参数是 max_bin,learning_rate,num_leaves。另一个重要参数是升压类型。在这里,我尝试了 dart(droppets meet Multiple Additive Regression Trees),因为它应该有助于实现更高的准确性。

params = {
        'boosting_type':'dart',
        'objective': 'regression',
        'nthread': 4,
        'num_leaves': 31,
        'learning_rate': 0.05,
        'max_depth': -1,
        'subsample': 0.8,
        'bagging_fraction' : 1,
        'max_bin' : 5000 ,
        'bagging_freq': 20,
        'colsample_bytree': 0.6,
        'metric': 'rmse',
        'min_split_gain': 0.5,
        'min_child_weight': 1,
        'min_child_samples': 10,
        'scale_pos_weight':1,
        'zero_as_missing': True,
        'seed':0,
        'num_rounds':50000
    }

现在我们开始使用 LightGBM,并将这些参数输入模型。我们删除最后不需要的数据帧以节省内存。

train_set = lgbm.Dataset(x_train, y_train, silent=False,categorical_feature=['year','month','day','weekday'])
valid_set = lgbm.Dataset(x_test, y_test, silent=False,categorical_feature=['year','month','day','weekday'])
model = lgbm.train(params, train_set = train_set, num_boost_round=10000,early_stopping_rounds=500,verbose_eval=500, valid_sets=valid_set)
del x_train
del y_train
del x_test
del y_test
gc.collect()

我们现在可以测试模型并将结果输入到 test_df 数据帧中。

test_df =  pd.read_csv('test.csv')
print(test_df.head())
test_df = add_datetime_info(test_df)
test_df = add_airport_dist(test_df)
test_df['distance'] = sphere_dist(test_df['pickup_latitude'], test_df['pickup_longitude'], 
                                   test_df['dropoff_latitude'] , test_df['dropoff_longitude'])test_df['bearing'] = sphere_dist_bear(test_df['pickup_latitude'], test_df['pickup_longitude'], 
                                    test_df['dropoff_latitude'] , test_df['dropoff_longitude'])  
test_df['pickup_latitude'] = radian_conv(test_df['pickup_latitude'])
test_df['pickup_longitude'] = radian_conv(test_df['pickup_longitude'])
test_df['dropoff_latitude'] = radian_conv(test_df['dropoff_latitude'])
test_df['dropoff_longitude'] = radian_conv(test_df['dropoff_longitude'])test_key = test_df['key']
test_df = test_df.drop(columns=['key', 'pickup_datetime'])

最后输出模型预测,并输入到 Kaggle 的提交文件中!

prediction = model.predict(test_df, num_iteration = model.best_iteration)      
submission = pd.DataFrame({
        "key": test_key,
        "fare_amount": prediction
})submission.to_csv('taxi_fare_submission_800k.csv',index=False)

我使用 dart boosting 方法在整个 22m 行中取得的最好成绩是 2.88。我在总共 1488 支队伍中取得了第 79 名。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们来看看 Yandex 的 Catboost。因为我们已经有了所需格式的数据,所以使用 CatBoost 只需要几行代码。

from catboost import Pool, CatBoostRegressortrain_pool = Pool(x_train, y_train, cat_features=[5,6,7,8])
test_pool = Pool(x_test, y_test, cat_features=[5,6,7,8])
model = CatBoostRegressor(iterations=4000, depth=10, learning_rate=1, loss_function='RMSE')
model.fit(train_pool)
preds2 = model.predict(test_df)
print(preds2)submission = pd.DataFrame({
        "key": test_key,
        "fare_amount": prediction
})submission.to_csv('taxi_fare_submission_800k_cat_boost_it4k_depth10.csv',index=False)

使用 Catboost,我使用全部 22m 行只处理了 3.13。

为了优化模型的参数,以及正确地比较 LightGBM 和 CatBoost,我们需要进行更多的实验,并很好地了解决策树和随机森林的作用。

看看其他人用类似的方法用 LightGBM 和 CatBooost 实现了什么会很有趣。

带自由单子的梯度下降

原文:https://towardsdatascience.com/gradient-descend-with-free-monads-ebf9a23bece5?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最近,我在 Scala 中玩自由单子,发现这可能是在函数式编程风格中进行梯度计算的完美方式。显然,从性能的角度来看,使用自由单子计算梯度并不是最好的主意,但它对于教育和实验目的非常有用。如果您有办法在 dispose 中计算任意表达式的梯度,那么开始构建简单的神经网络并不是什么大事。

Free Monad 是构建任何一种表示计算的抽象语法树 (AST ),同时保持计算 AST 与它的解释方式分离的完美方式。

我的目标是演示如何使用自由单子构建一个简单的梯度计算引擎。首先,我们将为 AST 表示定义一个域模型。然后,可以定义一个表示计算的自由单子。最后,我们将能够使用不同的解释器分析和数值计算梯度,并比较结果(应该相等)。此外,我们将能够定义一个简单的梯度下降优化器,能够解决一个简单的方程定义的计算自由单子。这里是回购,代码在这里演示。

计算 AST 表示

我们需要一种将计算表示为 AST 的方法。我们可以把它表示为一个图,其中边是进出由运算表示的顶点的张量。有两种边:变量和常数:

以及几种表示 AST 图顶点的操作:

定义了计算图的边(张量)和顶点(操作)之后,我们可以用一组预定义的基本操作来表示任意的计算。

我在这里使用术语张量。它只是一组不同形状的值的数学抽象。标量是一个 0 维张量。向量是一维张量。矩阵是二维张量。而任何具有更高维度的事物,都被简单地称为 n 维张量。在这个例子中,我使用的是 0 维张量,也就是标量。

此外,定义两个额外的类型也很方便:

计算自由单子

下一步是定义一个计算自由单子。我在这里使用的是 cats Scala 库:

我不会在这里深入探讨什么是自由单子。这里有牛逼的文章这里有。本质上,仅仅通过 Op[A]我们就可以使用自由单子将它提升到单子上下文中。这样一来,我们就有办法把 Op[A]组合成一元式了。这种一元组合是这样构建的,它是栈安全的,可以从定义它的地方单独解释。这意味着,反过来,我们可以对同一个计算表达式应用多个解释器。

现在可以使用 Scala for-comprehension 语法,根据计算自由单子定义计算:

上面的函数获取一个映射,其中键是变量或常量名称,值是变量/常量本身。该表达式接受三个变量(x1、x2 和 x3)和一个常数(c1)。

以下是计算的可视化表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

((x1 -x2) + x3)c1((x1 -x2) + x3)*c1

数值梯度解释器

这里的数字梯度是在维基百科文章中描述的意义上使用的。当我们有一个依赖于多个输入变量的计算表达式时,就可以计算每个输入变量的偏导数。计算这种偏导数的最简单的方法是简单地将初始的一组值输入到计算中并得到输出结果,然后输入相同的初始的一组值,但是对于我们正在计算导数的变量,该值增加了一些小的增量。计算出两个输出值后,我们可以将它们相减,然后除以上一步中使用的增量。根据定义,这是一个偏导数。

我们可以立即尝试一个简单的表达式:

这看起来工作得很好,但是从性能的角度来看并不是很好。如果我们有大量的输入张量,那么我们必须对张量中的每个标量(项)进行两次解释。如果我们能够首先解析地计算导数,然后通过使用矢量化张量运算在一次运行中计算导数,那将会好得多(关于此的更多细节在此)。

分析梯度解释器

似乎我们可以将链规则应用于计算图,并在单个解释器运行中计算所有输入变量的偏导数(在神经网络应用中称为反向传播)。这是解释器正在做的事情:

正如你所看到的,它有更复杂的实现,但它能够在一次解释运行中计算所有的偏导数。让我们尝试一下,看看它是否与 6 个不同的数值解释器执行计算的结果相匹配:

如您所见,不仅结果与使用数值梯度解释器获得的结果相匹配,而且精度更高,并且是在单次解释器运行中计算的。

梯度下降优化器

在我们的 dispose 中有了梯度计算解释器,我们可以很容易地创建一个优化器,它使用梯度下降来最小化函数值。对于给定的成本函数,这在求解方程或训练机器学习模型时非常有用。

让我们立即对同一个表达式进行尝试,看看它是否有效:

如您所见,optimizer 找到了这样一组输入变量,因此表达式值几乎为零,这是非负定义表达式的最小可能值。

结论

我希望你也觉得玩偏导数和梯度下降很有趣,用自由单子以函数的方式表达。我曾经用 Python 实现过同样的方法,但是实现起来更麻烦。

梯度下降——初学者指南

原文:https://towardsdatascience.com/gradient-descent-a-beginners-guide-fa0b5d0a1db8?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简介:

最近,在我的课程中,我对整个科学领域的进步感到敬畏。在仅仅十年的时间里,我们已经彻底改变了我们看待机器能力的方式,我们构建软件的方式等等。十年前看似不可能的任务现在变得触手可及,不费吹灰之力。长话短说,我们让机器思考了!!听起来很酷,不是吗?
人工智能已经真正进入主流意识。这些天来,每个人在日常生活中都听到或读到过“机器学习”这两个神奇的词。但是我们中的任何人对人工智能到底是什么理解得有多清楚呢?虽然,让机器思考和学习的想法听起来很吸引人,而且势不可挡,对于像我这样有抱负的数据科学家来说,让我们的头脑转起来;很少有人理解或知道一些导致机器学习的基本概念。在这篇博客文章中,我只是简单地把我对最重要和最基本的技术之一的理解放在许多机器学习算法的核心——梯度下降。
任何机器学习算法最关键的部分之一就是优化。如何让自己的学习算法学得更快?梯度下降是机器学习中最有效的优化算法之一。我们很多人都非常熟悉什么是梯度下降,但当谈到理解它时,我们所有人都经历过看到可怕的数学方程和图形的过程,看起来像是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Google

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Google

别担心,比看起来容易!

正如克里斯·派恩所说,“有时候你唯一能控制的就是视角。你无法控制自己的处境。但你可以选择如何看待它。”

现在,让我们换个角度来看上面的图,就像这样-

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,为了理解梯度下降,让我们想象这条河从山顶开始的路径。梯度下降的工作正是河流的目标;到达山的最底部。现在,正如我们所知,地球上有一个重力,因此河流将继续向下流动,直到它到达山脚。在这里,我们会做一些假设,说这座山的形状将会是这样的,河流不会在任何地方停留,而是直接到达山脚。在机器学习中,这是我们渴望的理想情况,你可以说我们已经实现了我们的“全局最小值”(在这个类比中,这意味着我们已经到达了“山脚”)。).然而,在现实生活中,情况并非如此。从山的角度来看,河流在向下流动的过程中可能会遇到很多坑,水有可能被困在坑里而无法向下流动。在机器学习术语中,这被称为“局部最小值”,这对我们的任何学习算法都是有害的。梯度下降容易达到这样的局部最小值,并且不能收敛。然而,当山区地形以这样一种特殊的方式设计时,即碗形(在机器学习中,我们将这种函数称为凸函数),那么我们保证会到达全局最小值(foothill)。现在,当谈到梯度下降时,有两个要点:初始值和学习率。为了给出一个大概的概念,我们知道,根据河流最初的源头,它会沿着不同的路径到达山麓丘陵。此外,根据河流的速度(学习速度),你可能会以不同的方式到达山脚。这些值对于决定你是到达山脚(全局最小值)还是被困在坑里(局部最小值)很重要。

如上所述,地球引力是促使河水向下流动的主要原因之一。可悲的是,在编码/数学中,我们没有利用地球引力的杠杆作用!!因此,为了克服这一点,我们需要转向数学,需要知道两种方法来帮助我们走向山脚。我们通过计算 1)给出坡度方向的梯度和 2)计算我们的步长(即河流在特定方向上需要移动多少单位)
现在,让我们考虑梯度下降的公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面的公式来看,有两件事是我们可以自行设定的;α和ɵ.的当前位置这里我们唯一需要学习的是,如何计算梯度?为了计算一个函数对于一个点ɵ的梯度,我们必须对这个函数关于ɵ.求导一次让我们通过一个例子来理解如何做到这一点:

考虑一个函数:

f(x,y) = x + y

-我们设置 x = 2 和 y = 6 的初始值

-函数的输出是 8

-这里的问题是,如何调整输入值以减少输出?让我们从对上述函数的输入进行微分开始;x 和 y:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些导数可以被认为是每个输入上的力,因为我们希望将输出拉得尽可能小;力告诉我们 x 和 y 想要如何改变来减少输出。

让我们看看更新规则在上面的计算中是如何工作的(假设α= 0.001)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这直觉上是有道理的!为了减少函数的输出,我们需要用一个大小为 1 的正力来调整输入 x 和 y。例如,将 x 的值从 2 更改为 1.999 将得到小于 8 的输出 7.99,同样,将 y 的值从 6 更改为 5.999 将得到小于 8 的输出 7.998!!梯度下降算法的下一个重要特征是它是一个迭代算法!意思是,我们重复上述步骤,直到收敛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,如果我们重复上述过程 4000 次,我们将得到 x = -2 和 y = 2.0 的值,从而得出函数 f(x,y) = 0 的输出。所以我们得到了 x 和 y 的期望值,这使得我们的函数给出最小值 0。这是梯度下降算法背后的直觉——一种“最成功”的优化技术,是大多数机器学习算法的核心。我告诉过你,这比看起来容易,只是为了让事情变得简单,我们用了一个简单的低维例子。在现实中,我们将处理非线性、高维函数,在这些函数中不可能通过手动分析来解决任何问题。然而,这种方法在那里是完全一样的!
这有意义吗?是吗?没有吗?虽然这篇文章的目的是帮助初学者获得梯度下降背后的工作直觉,但它绝不是一个全面的概述。在那之前,保持冷静,不断创新!

最后,正如我的朋友戈苏丁所说的“吉特·k·阿恩吉!”(会赢)

梯度下降算法及其变体

原文:https://towardsdatascience.com/gradient-descent-algorithm-and-its-variants-10f652806a3?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Trajectory towards local minimum

优化是指最小化/最大化一个由 x 参数化的目标函数 f(x) 的任务。在机器/深度学习术语中,它的任务是最小化由模型参数 w ∈ R^d.优化算法(在最小化的情况下)参数化的成本/损失函数 J(w) 具有以下目标之一:

  • 找到目标函数的全局最小值。如果目标函数是凸的,即任何局部最小值都是全局最小值,这是可行的。
  • 找到目标函数在其邻域内的最低可能值。如果目标函数不像大多数深度学习问题那样是凸的,通常就是这种情况。

有三种优化算法:

  • 非迭代优化算法,仅求解一个点。
  • 本质上是迭代的优化算法,并且收敛到可接受的解决方案,而不管参数初始化,例如应用于逻辑回归的梯度下降。
  • 本质上是迭代的优化算法,应用于一组具有非凸成本函数的问题,如神经网络。因此,参数的初始化对于加快收敛速度和降低错误率起着至关重要的作用。

梯度下降机器学习深度学习中最常见的优化算法。它是一种一阶优化算法。这意味着在对参数进行更新时,它只考虑一阶导数。在每次迭代中,我们在目标函数 J(w) w.r.t 的梯度的相反方向上更新参数,其中梯度给出最陡上升的方向。我们在每次迭代中达到局部最小值的步长由学习速率α决定。因此,我们沿着斜坡的方向下山,直到我们到达一个局部最小值。

在本文中,我们将介绍梯度下降算法及其变体:批量梯度下降、小批量梯度下降和随机梯度下降

让我们先看看梯度下降是如何对逻辑回归起作用的,然后再详细讨论它的变体。为了简单起见,我们假设 logistic 回归模型只有两个参数:权重 w 和偏差 b

1.将重量 w 和偏差 b 初始化为任意随机数。

2.为学习率α选择一个值。学习率决定了每次迭代的步长。

  • 如果α非常小,则需要很长时间才能收敛,并且计算量很大。
  • 如果α很大,它可能无法收敛并超过最小值。

因此,针对不同的α值绘制成本函数,并选择恰好在第一个不收敛的值之前的α值,这样我们就有了一个收敛的非常快速的学习算法(见图 2)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2: Gradient descent with different learning rates. Source

  • 最常用的费率有: 0.001,0.003,0.01,0.03,0.1,0.3

3.如果数据的比例非常不同,请确保对数据进行缩放。如果我们不缩放数据,水平曲线(等高线)会更窄更高,这意味着需要更长的时间来收敛(见图 3)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: Gradient descent: normalized versus unnormalized level curves.

调整数据,使μ = 0,σ = 1。下面是每个示例的缩放公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.在每次迭代中,取成本函数 J(w) w.r.t 每个参数(梯度)的偏导数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更新方程是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 为了便于说明,我们假设我们没有偏见。如果 w 的当前值的斜率为> 0 ,这意味着我们处于最优 w* 的右边。因此,更新将是负的,并将开始接近最佳值 w *。然而,如果它是负的,更新将是正的,并将增加当前值 w 以收敛到最优值 w *(见图 4):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4: Gradient descent. An illustration of how gradient descent algorithm uses the first derivative of the loss function to follow downhill it’s minimum.

  • 继续该过程,直到成本函数收敛。也就是说,直到误差曲线变得平坦不变。
  • 此外,在每次迭代中,步长将位于产生最大变化的方向,因为它垂直于每步的高程曲线。

现在让我们讨论梯度下降算法的三种变体。它们之间的主要区别是我们在计算每个学习步骤的梯度时使用的数据量。它们之间的权衡是梯度的精度与执行每个参数更新(学习步骤)的时间复杂度。

批量梯度下降

批量梯度下降是指在对参数进行更新时,我们对每次迭代的所有示例进行求和。因此,对于每次更新,我们必须总结所有示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

for i in range(num_epochs):
    grad = compute_gradient(data, params)
    params = params — learning_rate * grad

主要优势:

  • 我们可以在训练时使用固定的学习率,而不用担心学习率衰减。
  • 它具有朝向最小值的直线轨迹,并且如果损失函数是凸的,它保证在理论上收敛到全局最小值,并且如果损失函数不是凸的,它保证收敛到局部最小值。
  • 它对梯度有无偏估计。例子越多,标准误差越低。

主要缺点:

  • 即使我们可以使用矢量化实现,浏览所有示例仍然会很慢,尤其是当我们有大型数据集时。
  • 学习的每一步都是在看完所有的例子之后进行的,有些例子可能是多余的,对更新没有太大帮助。

小批量梯度下降

小批量梯度下降法不是遍历所有样品,而是根据批量大小对少量样品进行汇总。因此,学习发生在每个小批量的 b 示例上:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 打乱训练数据集以避免预先存在的示例顺序。
  • 根据批量大小将训练数据集划分为 b 个小批量。如果训练集大小不能被批大小整除,则剩余的将是它自己的批。
for i in range(num_epochs):
    np.random.shuffle(data)
    for batch in radom_minibatches(data, batch_size=32):
        grad = compute_gradient(batch, params)
        params = params — learning_rate * grad

批量大小是我们可以调整的。通常选择 2 的幂,如 32、64、128、256、512 等。其背后的原因是因为一些硬件,如 GPU,在普通批量大小如 2 的幂的情况下,可以实现更好的运行时间。

主要优势:

  • 比批处理版本快,因为它经历的例子比批处理(所有例子)少得多。
  • 随机选择例子将有助于避免多余的例子或非常相似的例子,对学习没有太大帮助。
  • 利用批量大小< size of training set, it adds noise to the learning process that helps improving generalization error.
  • Even though with more examples the estimate would have lower standard error, the return is less than linear compared to the computational burden we incur.

The main disadvantages:

  • It won’t converge. On each iteration, the learning step may go back and forth due to the noise. Therefore, it wanders around the minimum region but never converges.
  • Due to the noise, the learning steps have more oscillations (see figure 4) and requires adding learning-decay to decrease the learning rate as we become closer to the minimum.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5: Gradient descent: batch versus mini-batch loss function

With large training datasets, we don’t usually need more than 2–10 passes over all training examples (epochs). Note: with batch size b = m (训练样本数),我们得到批量梯度下降。

随机梯度下降

随机梯度下降(SGD)不是遍历所有示例,而是对每个示例(xi,yi).)执行参数更新因此,学习发生在每一个例子上:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 打乱训练数据集以避免预先存在的示例顺序。
  • 将训练数据集划分为 m 个示例。
for i in range(num_epochs):
    np.random.shuffle(data)
    for example in data:
        grad = compute_gradient(example, params)
        params = params — learning_rate * grad

它分享了小批量版本的大部分优点和缺点。以下是特定于 SGD 的选项:

  • 与有助于改善泛化误差的小批量相比,它给学习过程添加了更多的噪声。然而,这将增加运行时间。
  • 我们不能在 1 个例子上使用矢量化,速度变得非常慢。此外,由于我们在每个学习步骤中仅使用一个示例,因此差异变得很大。

下图显示了梯度下降的变量及其朝向最小值的方向:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6: Gradient descent variants’ trajectory towards minimum

如上图所示,与小批量相比,SGD 方向噪音很大。

挑战

以下是关于梯度下降算法及其变体(主要是批处理和小批处理)的一些挑战:

  • 梯度下降是一种一阶优化算法,这意味着它不考虑成本函数的二阶导数。然而,函数的曲率影响每个学习步骤的大小。梯度测量曲线的陡度,而二阶导数测量曲线的曲率。因此,如果:
  1. 二阶导数= 0→曲率呈线性。因此,步长=学习率α。
  2. 二阶导数> 0 →曲率向上。因此,步长< the learning rate α and may lead to divergence.
  3. Second derivative < 0 → the curvature is going downward. Therefore, the step size >即学习速率α。

结果,看起来对梯度有希望的方向可能不是这样,并且可能导致学习过程变慢或者甚至发散。

  • 如果 Hessian 矩阵具有较差的条件数,即最大曲率的方向比最小曲率的方向具有更大的曲率。这将导致代价函数在某些方向上非常敏感,而在另一些方向上不敏感。因此,它会使梯度变得更难,因为看起来对梯度有希望的方向可能不会导致成本函数的大变化(见图 7)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7: Gradient descent fails to exploit the curvature information contained in the Hessian matrix. Source

  • 梯度 gTg 的范数应该随着每个学习步骤缓慢降低,因为曲线变得越来越平坦,并且曲线的陡度将降低。然而,我们看到,由于曲线的曲率,梯度的范数在增加。尽管如此,即使梯度的标准在增加,我们也能够实现非常低的错误率(见图 8)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 8: Gradient norm. Source

  • 在小维度中,局部极小是常见的;然而,在大尺寸中,鞍点更常见。鞍点是指函数在某些方向上向上弯曲,在其他方向上向下弯曲。换句话说,鞍点从一个方向看起来像最小值,从另一个方向看起来像最大值(见图 9)。当 hessian 矩阵的至少一个特征值为负,而其余特征值为正时,会发生这种情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 9: Saddle point

  • 如前所述,选择一个合适的学习速度是很难的。此外,对于小批量梯度下降,我们必须在训练过程中调整学习速率,以确保它收敛到局部最小值,而不是在它周围徘徊。计算学习率的衰减率也很困难,并且随着不同的数据集而变化。
  • 所有参数更新具有相同的学习率;然而,我们可能希望对一些参数进行更大的更新,这些参数的方向导数比其他参数更符合朝向最小值的轨迹。

原载于 2017 年 12 月 21 日imaddabbura . github . io

梯度下降算法和自适应学习率调整方法

原文:https://towardsdatascience.com/gradient-descent-algorithms-and-adaptive-learning-rate-adjustment-methods-79c701b086be?source=collection_archive---------0-----------------------

这里有一个快速简明的总结供参考。更多详细解释请阅读:http://ruder.io/optimizing-gradient-descent/

批量梯度下降

普通梯度下降,也称为批量梯度下降,计算整个训练数据集的成本函数相对于参数θ的梯度。

随机梯度下降

相反,随机梯度下降(SGD)对每个训练示例 x(i)和标签 y(i)的执行参数更新

小批量梯度下降

小批量梯度下降最终取两者之长,对 n 个训练样本的每一个小批量进行更新。

挑战

然而,普通的小批量梯度下降并不能保证良好的收敛性,但也带来了一些需要解决的挑战:

  • 选择一个合适的学习速度可能很困难。学习率太小会导致收敛速度非常慢,而学习率太大会阻碍收敛,并导致损失函数在最小值附近波动,甚至发散。
  • 学习率时间表[ 11 ]尝试通过例如退火来调整训练期间的学习率,即根据预定义的时间表或当各时期之间的目标变化低于阈值时降低学习率。然而,这些时间表和阈值必须提前定义,因此无法适应数据集的特征[ 10 ]。
  • 此外,相同的学习率适用于所有参数更新。如果我们的数据很稀疏,并且我们的要素具有非常不同的频率,我们可能不希望将所有要素更新到相同的程度,而是对很少出现的要素执行更大的更新。
  • 最小化神经网络常见的高度非凸误差函数的另一个关键挑战是避免陷入其众多次优局部最小值。Dauphin 等人[ 19 ]认为,困难实际上不是来自局部最小值,而是来自鞍点,即一个维度向上倾斜而另一个维度向下倾斜的点。这些鞍点通常被相同误差的平台所包围,这使得 SGD 很难逃脱,因为梯度在所有维度上都接近于零。

梯度下降优化算法

动力

SGD 在穿越峡谷时有困难,峡谷是指表面在一个维度上比另一个维度上弯曲得更陡峭的区域,这在局部最优解附近很常见。在这些场景中,SGD 在峡谷的斜坡上振荡,同时沿着底部朝着局部最优值缓慢前进,如下图所示。这有助于在相关方向上加速 SGD 并抑制振荡

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SGD without momentum (left) v/s SGD with momentum

内斯特罗夫加速梯度

Momentum 首先计算当前梯度(图 4 中的蓝色小向量),然后在更新的累积梯度(蓝色大向量)的方向上进行大跳跃,NAG 首先在先前累积梯度(棕色向量)的方向上进行大跳跃,测量梯度,然后进行校正(红色向量),这导致完整的 NAG 更新(绿色向量)。这种预先更新防止我们走得太快,并提高了响应能力,从而显著提高了 RNNs 在许多任务上的性能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:内斯特罗夫更新(来源: G .辛顿的讲座 6c

阿达格拉德

上述方法使更新适应我们的误差函数的斜率,并依次加速 SGD。Adagrad 根据每个参数的重要性调整更新,以执行更大或更小的更新。

我们将 g(t,I)设为目标函数 w.r.t .在时间步长 t 对参数θi 的梯度:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Adagrad 的一个主要好处是,它消除了手动调整学习速率的需要。大多数实现使用默认值 0.01,并保持不变。

Adagrad 的主要缺点是它在分母中累积平方梯度:因为每个增加的项都是正的,所以累积和在训练期间保持增长。这进而导致学习速率收缩,并最终变得无穷小,此时算法不再能够获得额外的知识。

阿达德尔塔

Adadelta [ 6 ]是 Adagrad 的一个扩展,旨在降低其激进的、单调递减的学习速率。不是累积所有过去的平方梯度,而是将累积的过去梯度的窗口限制到某个固定大小的 ww。

RMSprop

RMSprop 和 Adadelta 都是在同一时间独立开发的,因为需要解决 Adagrad 的学习率急剧下降的问题。RMSprop 将学习率除以梯度平方的指数衰减平均值。

圣经》和《古兰经》传统中)亚当(人类第一人的名字

自适应矩估计是当今最流行的方法。

ADAM 计算每个参数的自适应学习率。除了存储像 Adadelta 和 RMSprop 这样的过去平方梯度 vt 的指数衰减平均值之外,Adam 还保持过去梯度 mt 的指数衰减平均值,类似于动量

那达慕

Adam 可以被视为 RMSprop 和 momentum 的组合。我们也看到内斯特罗夫加速梯度(NAG)优于普通动量。因此,Nadam(内斯特罗夫加速自适应矩估计)[ 24 ]结合了 adam 和 NAG。

演职员表:塞巴斯蒂安·鲁德(2016)。梯度下降优化算法综述。arXiv 预印本 arXiv:1609.04747。

梯度下降和加密货币

原文:https://towardsdatascience.com/gradient-descent-and-cryptocurrency-995693ddae6b?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Pierpaolo Lanfrancotti on Unsplash

我一直在想一个有趣的方式来谈谈我通过 fast.ai 课程学到的一些早期的东西。我几乎要用一篇快速的文章来重新开始随机梯度下降(SGD)的概念,但是我确实喜欢使用类比的文章。类比是看待一个概念的另一种方式,并进一步巩固它在你大脑中的位置。

因此,今天,我将为大家提供一个关于新加坡元的转折和对那些狂热分子来说加密货币美妙世界的一个方面之间的良好联系。

重启的随机梯度下降

在《走向数据科学》中有几篇关于 SGD 的很棒的文章,那些不熟悉它或需要快速回顾的人,我建议搜索并阅读这些文章。我发现这里有几个,这里有几个。

总体想法是改变你的神经网络中权重的值,以便达到局部最小值。这个最小值由一个函数定义,您的目标是优化。学习率是你向那个最小点移动的速度。如果你学得太快,你可能会错过最小值。如果学得太慢,解题的时间可能会太长。数据科学就是要权衡取舍。

在 fast.ai 课程中,我们很早就学习了带重启的 SGD。这种技术有助于模型在第一轮中找到最佳路径。您可以将“重启”方法视为一种在搜索空间中寻找比第一次绕行更好的路径的方法。这里有一张图片可以帮助你想象这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 1. From fast.ai Lesson 1

在左图中,模型正在经历一次 SGD 过程。在这一旅程中,模型找到了发挥其最大能力和约束的最佳解决方案。在右图中,重启功能通过多次运行 SGD 来利用它。如您所见,有更多的机会达到更好的局部最小值。

这种改进可能是模型中 99%和 99.5%准确性之间的差异!另外,该课程使这个功能非常容易使用,所以我建议检查一下。

现在来看看密码世界。

类比

你们中的一些人认为这是一个延伸的类比,但我真的很喜欢将想法融合在一起。因此,在我开车回家的路上,我一直在听这个关于一家名为 Multicoin Capital 的公司的播客。他们投资于加密团队,他们有很多关于空间现状的有趣的事情要说。

提出的一个话题是他们在考察采用不同智能合同协议的公司时使用的框架。智能合约协议这几个词在这个讨论中无关紧要,所以不要太担心。他们强调了他们的论点,他们认为智能合同领域将有多个赢家,因为有几个维度可能存在局部最大值。他们认为,目前,世界上只有一个地方最大值是以太坊,肯定会发现更多。

为了进一步分析,想想上面的图片(或者向上滚动到它)。这一职能的地形非常崎岖不平——有很深的低谷,也有很高的顶点。在投资的情况下,目标是找到高峰(而不是当我们考虑 ML 时的局部低谷)。

因此,在他们的世界里,他们在这片奇异的土地上搜寻,试图找到那些利用不同特性和技术的公司,从而实现新的局部最优。这些投资者是“重新启动的新币”,试图通过该函数找到本地最大值(即最有机会获胜的公司)。

带重新启动的 SGD 是一种不同的方式来看待如何探索函数空间,以获得 ML 问题的最低错误。在投资领域,人们发现自己也在从事类似的事情——尽管他们寻求的是最高回报。正是通过这种反复试验,我们为自己(和我们有趣的算法)设定了最高的成功概率。

感谢阅读。

梯度下降、反向推进和导数

原文:https://towardsdatascience.com/gradient-descent-back-prop-and-derivatives-5b286bb8d8b5?source=collection_archive---------3-----------------------

我收到了很多人关于梯度下降和反向传播的问题——这里是我对这些概念的 简化解释 ,给你一些关于神经网络是如何训练的直觉!

在训练神经网络时,我们使用梯度下降来降低我们的网络犯的错误总数。梯度下降是一种希尔下降算法。这座山和我们网络预测的“总错误数”一样高。

我们从运行一个循环开始,在每个循环迭代中,我们的目标是减少我们的净错误总数。这就是我们如何计算网络的训练准确度分数。

在正向推进的最后,通过比较我们的预测结果和真实结果,我们知道我们的网络所产生的“总误差量”。(Y 减去 Yhat)。

但是只有在反推步骤中,我们才能看到总误差中有多少是由每个神经元 T21 引起的。在每个神经元犯下的所有小错误之后,加起来成为整个网络的“总错误”。

微分学是我们用来观察事物如何变化的方法:它们变化快吗?慢慢改变?他们到底有没有改变?

当我们对(山坡)进行微分以获得成本函数的导数时,我们确定了我们所处位置的梯度/斜率。我们得到的梯度告诉我们我们在误差山的每个方向上倾斜了多少。这帮助我们小心翼翼地走下错误之山,一步一步地到达谷底,在我们的循环中,我们找到救赎!

我刚刚谷歌了一下,发现了这个很棒的视频…制作得很好,很直观!

可视化梯度下降

原文:https://towardsdatascience.com/gradient-descent-d3a58eb72404?source=collection_archive---------13-----------------------

梯度下降是一种非常强大的算法,是许多现代机器学习算法的基础。我们将涵盖对什么是梯度下降的直观理解,它如何连接到微积分,以及我们如何在数据科学中使用它。

目标

  • 使用汽车数据集预测 MPG
  • 理解术语残差的含义以及它如何定义我们的成本函数
  • 对误差函数求微分以找到最小值

要求

  • 以前有机器学习和微积分的经验

入门:下载数据

对于本教程,我们必须做的第一件事是下载我们在示例中使用的数据集。我发现了一个数据集,其中有汽车的 mpg,我将在教程中使用。这里是下载数据集的链接,请跟随。否则,你可以只是跟着视觉。如果您想在本教程的任何一个步骤上得到帮助,请在这里与我预约时间!

下载完成后,我们先来找一个与汽车 MPG 关联度高的变量。正如你在下图中看到的,汽车的重量与汽车每加仑行驶的英里数有很高的(负)相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Weight is in tons

看着这幅图,你可以想象一条线,它能很好地表现数据。让我们在没有机器帮助的情况下做几次尝试来想出一条线。

对我来说,它看起来像是有一个截距与 y 轴大约 45 英里/加仑。同样,看起来它与 x 轴在 5°左右相交。利用这一点,我可以用这个工具画出一条线来表示这些数据。

这又给了我一个方程式 y = -34/5 * x + 45 || 让我们画出这个图,看看它是什么样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你所看到的,我们的线条很好地表现了数据,但它并不完美…因此,让我们尝试找出一种方法来衡量它与数据的吻合程度…

我们将定义一个叫做残差的东西,它是从我们的直线到我们的点的距离。在这种情况下,我们可以想象,我们想要最小化从每个点到我们的线的距离,然后最后,我们想要选择总体上最接近所有点的线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Residuals in Red

这里我们可以看到残差是每个点到预测线的距离。我们可以对所有残差的绝对值求和,然后用这个来看看我们的模型表现如何。在这条线的例子中,代表这条线与数据拟合程度的单一值是 115.75。让我们开始玩我们的线,以更好地了解如何尽量减少这种残留。

首先,我们将保持斜率不变,并改变截距。我们可以想象这是如何改变情节的,图例告诉我们剩余分数,这样我们就可以将其与我们的第一行进行比较!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在此图中,您可以看到,只要改变截距,我们的剩余分数就会根据直线的拟合程度而增加或减少!我们可以仔细看看,实际上画出每条线的残差,开始了解最大值或最小值出现在哪里。事实上,我们将把每条线的残差称为**损失函数。**想通了这一点,我所说的开始变得有意义了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以在这里看到,根据我们改变 y 轴截距的程度,我们会得到不同的残值。**而且损失函数有最小值。**这意味着我们可以用数值方法找到函数的最小值,这个最小值就是最佳拟合线。

最佳拟合线是最小化所有参数的残差的线

让我们回到之前的等式。它的形式是 *y = m x + b 或者如果你在做线性回归,它会是下面的形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们一直在看,当β_ 1 系数改变时会发生什么。在另一个世界里,我们可以看到β_ 0 是如何改变残差的。在这种情况下,我们会查看改变斜率的残差,并将其最小化。

在一个不同的例子中,你可以假设我们可以从许多不同的变量预测 MPG。然后,可以对这些变量中的每一个进行调整,以最小化残差,从而为所有参数创建最准确的预测。不过,要做到这一点,我们需要非常清楚地定义一个残差函数,以便我们知道我们在测量什么。在我们的二维例子中,这看起来像下面这样(但是记住我们总是可以推广到一个更高维的空间)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然我们已经清楚地定义了误差函数,我们可以对β_ 0 和β_ 1 进行微分。这将允许我们建立我们的最小化问题,然后利用微积分找到最小残差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在可以从任意的 B_0 和 B_1 开始,每次把它插入到我们的部分函数中,然后根据我们的部分函数选择一个新的猜测。

每次我们都会根据偏方程是正还是负来选择一个新的猜测。这个跳跃的大小被称为学习率

这是优化许多机器学习技术的基础,并且表现非常好。为了实现,我会使用一个内置的库,但理解底层的数学总是一个加分。

本教程只是触及了这个主题的表面,但是为了更深入一点,这里有一些我们没有真正谈论过的主题:

凸性——在我们的线性回归问题中,只有一个最小值。我们的误差面是。不管我们从哪里开始,我们最终都会达到绝对最小值。一般来说,情况不必如此。梯度搜索可能会陷入局部极小值。有几种方法可以减轻这种情况(例如,随机梯度搜索)。

收敛 —我们没有讨论如何确定搜索何时找到解。这通常是通过寻找迭代间误差的微小变化来实现的(例如,梯度接近零的地方)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

梯度下降——去神秘化

原文:https://towardsdatascience.com/gradient-descent-demystified-bc30b26e432a?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Types of Gradient Descent Algorithms

在本文中,我将详细讨论梯度下降,解释除标准梯度下降算法之外的不同优化算法。

为了讨论各种梯度下降算法,我将使用逻辑回归的损失函数作为要优化的“”函数。

对于那些不知道逻辑回归的人来说,

逻辑回归是一种统计技术,将输入变量(自变量或回归变量)作为连续变量,将输出变量(因变量或回归变量)作为二元变量。就效果而言,输入变量的单位变化会使输出变量的几率乘以一个常数因子。

逻辑回归作为一种分类技术被广泛使用。让我们考虑下面的回归方程,其中响应变量 y 是具有两类的分类变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Logistic Regression Equation

为了对对象进行分类,我们将获得对象属于类别“1”的概率。为了预测概率,我们将使用线性模型和逻辑函数的输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Finding probability of an example belonging to a class

梯度下降的目的是找出优化给定函数的最佳参数。在逻辑回归算法中,通过最小化以下损失函数找到最佳参数 θ :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Loss function of Logistic Regression (m: number of training examples)

最小化上述函数的最基本和广泛使用的优化技术是 梯度下降。 它是一种求函数最小值的迭代优化算法。为了使用梯度下降找到局部最小值,采取与函数在当前点的梯度的负值成比例的步骤。如果取正方向,算法找到局部最大值,这个过程称为 梯度上升。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Illustration of each iteration of Gradient Descent [Source: Wikipedia]

梯度下降是基于这样的观察:如果多变量函数 F 在点 x 的邻域中被定义并且是可微分的,那么如果从点 x 沿着点 x 处的 F 的负梯度方向前进,函数 F 下降最快。

对于上面定义的损失函数 J ,点 j 处的梯度定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradient at a point — ΔJ

上述等式的推导如下所示,[Credits: Avitus

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Derivation of Gradient at a point

标准梯度下降算法

标准梯度下降算法定义如下,其中 η 是学习率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradient Descent Algorithm

在最后一次迭代之后,上述算法给出了函数 J 最小的 θ 的最佳值。该算法的缺点在于,在每次迭代中,必须根据 m 个训练示例来计算 m 个梯度。如果训练集非常大,上述算法将是内存低效的,并且如果训练集不适合内存,可能会崩溃。在这种情况下,随机梯度下降算法会很有帮助。

随机梯度下降

与计算真实梯度的传统算法不同,在随机梯度下降算法的迭代中,梯度是针对单个随机选择的训练样本计算的。该算法定义如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Stochastic Gradient Descent Algorithm

*在每次迭代中,在 1 和 *m(训练样本数)之间选择一个随机索引,并且只针对所选索引处的训练样本计算梯度。可以对训练集进行多次遍历,直到算法收敛。如果做到了这一点,就可以在每次传递时打乱数据以防止循环。

当然,这种方法有其优点和局限性。

  1. 有噪声的更新导致波动(有噪声的近似)。
  2. 每一步只需要一个例子。
  3. 可用于在线设置。
  4. 学习率 η 要慎重选择。

在计算批次梯度和单个示例的梯度之间的折衷是在每个步骤针对多个训练示例(称为“小批次”)计算梯度。

小批量梯度下降

在小批量梯度下降中,在每次迭代中,在 1m 之间选择 z 个随机指数,并在这些随机指数下对训练样本计算梯度。该算法定义如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Mini Batch Gradient Descent Algorithm

这比所描述的随机梯度下降法的性能要好得多,因为代码可以利用矢量化库,而不是单独计算每一步。它还可以导致更平滑的收敛,因为在每一步计算的梯度是在更多训练样本上平均的。

动量梯度下降

在这里,我将讨论随机梯度下降算法的一个简单补充,称为动量,它通常比随机梯度下降算法工作得更好更快。动量或带动量的随机梯度下降是一种有助于在正确方向上加速梯度向量的方法(如下所示),从而导致更快的收敛。这是最流行的优化算法之一,许多最先进的模型都是用它来训练的。在深入数学之前,让我们探索动量梯度下降算法背后的思想

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SGD without momentum (Source: Genevieve B. Orr)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SGD with momentum (Source: Genevieve B. Orr)

指数加权平均值处理的是数字序列。假设,我们有一些有噪声的序列。对于这个例子,我绘制了余弦函数,并添加了一些高斯噪声。看起来是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Credits: Vitaly Bushaev

请注意,尽管这些点看起来非常接近,但它们都不共享 x 坐标。对于每个点来说,这是一个唯一的数字。这个数字定义了序列中每个点的索引。

我们想对这些数据做的是,不是使用它,而是想要某种“移动”平均值,这将对数据进行“去噪”,并使其更接近原始函数。指数加权平均值可以给我们一个看起来像这样的图片:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Credits: Vitaly Bushaev

如你所见,这是一个非常好的结果。我们得到的不是有很多噪音的数据,而是更平滑的线,比我们得到的数据更接近原始函数。指数加权平均值用下面的等式定义了新的序列 V:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

序列 V 就是上面标为黄色的那个。 β 是另一个超参数,取值从 0 到 1。我用的是 beta = 0.9 以上。这是一个很好的值,最常用于带动量的 SGD。直观上,你可以把 β 想成如下。我们对序列的最后 1 / (1- β) 个点进行近似平均。让我们看看 β 的选择如何影响我们的新序列 v。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您所见,β值越小,新序列的波动越大,因为我们对更小数量的样本求平均值,因此更接近噪声数据。β值越大,如β =0.98 ,我们得到的曲线越平滑,但它稍微向右偏移了一点,因为我们对大量示例进行了平均(β =0.98 时约为 50)。β = 0.9 在这两个极端之间提供了良好的平衡。

动量梯度下降算法定义如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Momentum gradient descent algorithm

内斯特罗夫动量梯度下降算法

内斯特罗夫动量是动量更新的一个略有不同的版本,最近越来越受欢迎。在这个版本中,我们首先看当前动量指向的点,并从该点计算梯度。当你看这幅画时,它变得清晰多了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内斯特罗夫动量算法定义如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Nesterov momentum algorithm formulas

结论

我希望这篇文章能帮助你学习不同类型的关于逻辑回归的梯度下降算法。动量梯度下降实际上是深度学习中最流行的优化算法之一,比更高级的算法使用得更频繁。

我将发表另一篇文章描述先进的梯度下降算法,如 Ada Grad,RMS Prop,Adam 梯度下降等。

请在下面的评论中发表你对这篇文章的看法。

参考

  1. Coursera 上的高级机器学习课程
  2. 蒸馏,为什么动量真的起作用
  3. 走向数据科学

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Toa Heftiba on Unsplash

Python 中的梯度下降

原文:https://towardsdatascience.com/gradient-descent-in-python-a0d07285742f?source=collection_archive---------0-----------------------

当你冒险进入机器学习时,你学习的一个基本方面将是理解“梯度下降”。梯度下降是机器学习算法的支柱。在这篇文章中,我将尝试使用 python 代码来解释梯度下降的基本原理。一旦你掌握了梯度下降法,事情就开始变得更加清晰,并且很容易理解不同的算法。关于这个话题已经写了很多,所以它不会是一个突破性的话题。为了跟随并建立你自己的梯度下降,你需要一些基本的 python 包。要可视化的 numpy 和 matplotlib。

让我们从一些数据开始,更好的是让我们创造一些数据。我们将创建一个带有随机高斯噪声的线性数据。

X = 2 * np.random.rand(100,1)
y = 4+3 * X+NP . random . randn(100,1)

接下来让我们将数据可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很明显,Y 和 x 有很好的线性关系。这个数据非常简单,只有一个自变量 x。

你可能在大学学过,一条线可以表达为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Slope of line

然后你可以求解 b 和 m 的方程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Analytical method

这就是所谓的解方程的解析方法。这没有错,但是记住机器学习是关于矩阵编程的。为了机器学习,我可以用一种不同的方式,用机器学习来表达一条直线的方程。我会称 y 为我的假设,表示为 J(θ),称 b 为θ0,m 为θ1。我可以写出相同的等式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Machine learning way

为了求解θ0 和θ1 的解析方法,我必须编写以下程序:

theta _ best = NP . linalg . inv(X . t . dot(X))。点(X.T)。点(y)

请记住,我在 X 上增加了一个偏差单位,对于 X 上的每个向量都是 1,这是为了便于矩阵乘法求解θ。

你可以看到,如果 X 中的特征数量开始增加,那么 CPU/GPU 执行矩阵乘法的负载就会开始增加,如果特征数量非常大,比如有一百万个特征,那么你的计算机几乎不可能解决这个问题。这就是梯度下降的救援之处。

简单解释一下梯度下降,想象你在一座山上,被蒙上眼睛,你的任务是在没有帮助的情况下从山上下来到平地。你唯一的助手是一个能告诉你离海平面高度的小装置。你的方法是什么?你会开始向某个随机的方向下降,然后问这个小工具现在的高度是多少。如果这个小工具告诉你这个高度,并且它大于初始高度,那么你知道你开始的方向是错误的。你改变方向,重复这个过程。这样反复多次,最后你成功地下来了。

这是机器学习术语的类比:

向任何方向迈出的步伐=学习速度

小工具告诉你身高=成本函数

你脚步的方向=梯度

看起来很简单,但是从数学上来说,我们如何表示它呢?数学是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 m =观察次数

我举一个线性回归的例子。你从一个随机的θ向量开始,预测 h(θ),然后使用上面代表均方误差(MSE)的等式推导出成本。请记住,你试图将成本降至最低,你需要知道你的下一步(或θ)。偏导数有助于找到下一次迭代的θ。

但是等等,现在我们需要计算θ0 和θ1,如何计算,如果我们有多个特征,那么我们会有多个θ。别担心,这里有一个计算θ的通用形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中α=学习率

好了,我们都准备好写我们自己的梯度下降了,虽然一开始看起来很难,但相信我,用矩阵编程只是小菜一碟。

我们需要什么,一个计算成本的成本函数,一个计算新θ向量的梯度下降函数,就是这样,真的就是这样。

让我们从成本函数开始,代码如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cost function

我会在这篇文章的最后分享我的 GitHub 要点,这样你就可以下载并运行代码,但是现在让我们理解一下成本函数。它需要θ,X 和 y,其中θ是一个向量,X 是行向量,y 是向量。你的数据通常是这样的 X 是一个行向量的矩阵,而 y 是一个向量。

记住,你不需要显式调用这个函数,我们的梯度下降方法会在内部调用它,所以让我们来看看梯度下降函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradient Descend function

它需要三个强制输入 X,y 和θ。你可以调整学习速度和迭代次数。正如我之前说过的,我们从 gradient_descent 函数调用 cal_cost。

让我们试着用梯度下降法来解决我们之前定义的问题。

我们需要找到θ0 和θ1,但是我们需要在梯度下降中传递一些θ向量。我们可以从高斯分布的θ的随机值开始,并且可以是 1000 次迭代和 0.01 的学习率。代码片段是不言自明的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们得到θ0 = 4.11 和θ1 = 2.899,分别非常接近于θ0 和θ1 的实际值 4 和 3。但是我们需要迭代 1000 次,用 0.01 的学习率吗?为了回答这个问题,我们需要看看成本是如何随着迭代而变化的,所以让我们针对迭代绘制 cost_history。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看这个图,很明显,在大约 180 次迭代之后,成本没有降低,这意味着我们只能使用 200 次迭代。如果我们放大图表,我们可以注意到这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还可以注意到,成本最初下降得更快,然后下降得更慢。

你可以尝试不同的学习率和迭代组合。

如果能看到梯度下降在不同的学习速率和迭代次数下实际上是如何收敛到解的,那就太好了。如果我们能一次看到所有的东西,这将更有意义。

那么为什么要等呢让我们开始吧,让我们画出四种迭代和学习率组合的收敛和成本与迭代的图表

it_lr =[(2000,0.001),(500,0.01),(200,0.05),(100,0.1)]

为了简洁起见,我没有在这里粘贴代码,而只是粘贴图表,请随时查看我的 GitHub 链接上的完整代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

检查学习率小的情况下收敛到解需要多长时间,而学习率大的情况下收敛得更快。

需要注意的是,你的问题的实际学习速度将取决于数据,没有一个通用的公式来设置它。然而,有一些复杂的优化算法,它们以较大的学习率开始,然后随着我们接近解决方案而慢慢降低学习率,例如 Adam optimizer。

随机梯度下降

你可能听说过这个术语,可能想知道这是什么。理解这一点很简单,在我们的梯度下降算法中,我们对每个观测值逐个进行梯度计算,在随机梯度下降算法中,我们可以随机选择随机观测值。它被称为随机,因为样本是随机选择的(或混洗的),而不是作为一个单独的组(如在标准梯度下降中)或按照它们在训练集中出现的顺序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小批量梯度下降

在实际操作中,我们使用一种叫做小批量梯度下降的方法。这种方法使用随机样本,但分批进行。这意味着我们不是为每个观察值计算梯度,而是为一组观察值计算梯度,这导致了更快的优化。一种简单的实现方法是混洗观察值,然后创建批次,然后使用批次进行梯度下降。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们为线性回归实现了梯度下降,但是您也可以为逻辑回归或任何其他算法实现梯度下降。改变的是成本函数和计算梯度的方式。所以我们需要定义我们的成本函数和梯度计算。

这是对梯度下降的简化解释,但实际上你不需要写你自己的梯度下降。有许多复杂的算法可用。

这里是 GITHUB 要点的链接

如果你想看一个运行的例子,请查看谷歌实验室这里

[## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/gist/sagarmainkar/5cfa33898a303f895da5100472371d91/notebook.ipynb)

梯度下降:简单解释?

原文:https://towardsdatascience.com/gradient-descent-simply-explained-1d2baa65c757?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

This is how the 2D cost function can look when plotted with two 2 independent variables.

我经常被问到这两个问题,那就是“你能解释一下梯度下降吗?”以及“梯度下降在机器学习中是如何体现的?”。

通过我多年的训练,我想我会在这篇博文中分享什么是梯度下降,以及为什么它是机器学习的“基本成分”。

现在我在这里做一个非常重要的假设,那就是读者理解微积分,尤其是 2 阶的微分。

成本函数

对于那些正在学习或已经学习机器学习的人来说,你知道每个机器学习模型都有一个成本函数。简单来说,这是一种确定机器学习模型在给定每个参数的不同值的情况下表现如何的方法。

例如,线性回归模型,参数将是两个系数,β1 和β2。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Linear Regression Model

成本函数将是最小二乘法的总和。

由于成本函数是参数β1 和β2 的函数,我们可以用每个β值绘制成本函数。(即给定每个系数的值,我们可以参考成本函数来了解机器学习模型的表现有多好。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鉴于有许多参数,你可以想象一旦成本函数确定, 一个多维平面的轮廓被布置出来。 (类似于三维空间中的山区)。

**注:**这就是很多混乱的地方。基本上我见过很多人被横轴弄糊涂了。他们认为横轴实际上是 Xs,或者独立变量,但这不是真的,因为Xs 将在整个训练阶段保持不变。请记住,在训练阶段,我们的重点是选择参数的“最佳”值(即系数)。

当我们训练模型时,我们试图找到系数的值(对于线性回归的情况,是β),这将使我们的成本最低。换句话说,对于线性回归的情况,我们正在寻找系数的值,该值将把成本降低到最小值,也就是山区的最低点。

“梯度”下降

现在让我们来看看模型的训练阶段。

现在,假设我们将一个代理放入这个多维平面(还记得山区),起始位置是随机给定的(即,为每个系数随机分配一个值)。这个随机分配的起始位置在机器学习界被称为**“初始化”**,一共是一整个研究领域。

这个代理只能看到一个东西,那就是它所站的点的梯度,也就是给定系数单位变化的成本变化率。梯度的这种直觉是从微积分中的一阶微分得到的。这解释了梯度下降的“梯度”。

渐变“下降”

如果你学习了任何关于梯度下降的材料,你会遇到另一个专业术语,叫做学习率。学习率实际上指的是代理人在“山区”旅行时迈出了多大的一步,意味着我们正在采取的参数的变化有多大。所以如果在站立点坡度很陡,你迈出一大步,你会看到成本大幅下降。

或者,如果梯度小(梯度接近于零),那么即使采取大的步长,假定梯度小,成本的变化也将小。

把所有的放在一起

因此,在梯度下降中,在代理所处的每个点,代理只知道梯度(对于每个参数)和要采取的步长。*考虑到梯度和步长,每个参数的当前值将被更新。*使用参数的新值,再次重新计算梯度,并与步长一起计算参数的新值。这样不断重复,直到我们达到收敛(我们将在稍后讨论)。给定许多重复的步骤,代理将慢慢下降到山区的最低点。

现在你可能会问为什么代理将移动到最低点,而不是做一个上升。我将留给读者去发现更多,但让我提供一些研究方向。这与成本函数是凸函数以及参数值如何更新有关。

收敛

一旦代理人在许多步骤后意识到成本并没有提高很多,而是停留在非常接近某个特定点(最小值)的位置,从技术上来说,这就是所谓的收敛。最后一步的参数值称为“最佳”参数集(在线性回归模型中,我们有两个 Betas 的“最佳”值)。我们有一个训练有素的模特。

总之,梯度下降是我们计算相关参数的最佳值集的一种方法。

步骤如下:

1-给定梯度,计算参数相对于步长的变化。

2-使用参数的新值,计算新的梯度。

3 —返回步骤 1。

一旦我们达到收敛,这一系列的步骤就会停止。我希望这有助于你理解梯度下降。

所以,让我欢迎你来到梯度下降的世界,如果你足够冒险(我希望你在这篇博客文章之后会这么做),一定要看看 Sebastian Ruder 的这篇博客文章,它讲述了梯度下降算法的其他变体。

希望这篇博文有用。祝您的数据科学学习之旅愉快,请访问我的其他博客文章LinkedIn 个人资料

**注:**考虑注册我的时事通讯或前往我的网站获取最新消息。

梯度下降,最简单的方法

原文:https://towardsdatascience.com/gradient-descent-the-easy-way-5240ca9a08da?source=collection_archive---------6-----------------------

理解梯度下降的温和而直观的方法。

梯度下降是所有深度学习的核心。这篇文章用简单的细节解释了这种方法的技术细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更新:学习和练习强化学习的最好方式是去 http://rl-lab.com

考虑一个系统,它接受一个输入,然后根据给定的参数进行一些计算,然后输出结果。

然后将输出与一些预期结果进行比较,我们希望看到的是输出尽可能接近那些预期结果。

以旧电视机或收音机为例,当有信号时,您可以使用一个按钮来微调设备,以获得最佳的音频/视频,几乎没有或没有噪音。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么如何用数学方法做到这一点呢?

输出和预期结果之间的差异由我们称之为损失函数的函数来描述(𝓛).

为简单起见,我们将假设系统的损失函数是抛物线形式的:

𝓛 = a𝜃 + b
其中𝜃是微调参数,a 和 b 是一些值。

该损失函数如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图给出了基于参数𝜃.的输出误差量
目的是最小化误差,从图中很容易看出最小误差在曲线的底部(点:𝜃 = 0,𝓛 = 1)。

怎么求误差最小?

通常,解析解是可能的,但当损失函数变得复杂时,这并不总是容易的,因此我们退回到迭代解。

我们进行的方式相当直观,我们改变𝜃,看看𝓛是否减少。我们一直这样做,直到找到𝓛最小值的𝜃值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,当𝜃从-2 移动到-1.4 时,𝓛下降,这意味着𝜃正朝着正确的方向移动。另一方面,当𝜃从+1.5 移动到+2 时,𝓛增加,这意味着𝜃在向错误的方向移动,它必须向箭头所示的相反方向移动。

现在的问题是如何找到最小化𝓛的𝜃?

显然,我们需要改变𝜃,但改变多少,向哪个方向改变?
正如我们在上面看到的,当我们将𝜃从最低值变化到最高值时(例如:-∞到﹢∞),我们跟踪了𝓛.的变化如果𝓛继续减少,我们继续增加𝜃,否则,如果𝓛开始增加,我们开始减少𝜃,直到我们找到正确的值。这解决了方向问题,但是𝜃应该变化的量呢?
一个简单的解决办法是取𝓛的一小部分变异,我们称之为𝛂.

将所有这些特征混合在一起,我们得到以下公式:

𝜃𝑛₊₁ = 𝜃𝑛 -𝛂 . ∆𝓛

这个公式清楚地表明,𝜃的下一个值,是以前一个值减去𝓛.变化的一个分数为基础的如果𝓛在减少,那么∆𝓛将是 0,-𝛂也是。∆𝓛 > 0 所以𝜃会增加。如果𝓛在增加,那么∆𝓛将会是 0,-𝛂也是。∆𝓛 < 0 所以𝜃会减少。

如何计算∆𝓛?

当然,最直接的方法是∆𝓛 = 𝓛(end) — 𝓛(start),但这需要一些管理。一个更好的方法是计算导数,这将给出𝓛在每一点的变化。
例如,𝓛 = a𝜃 + b 的导数变成了 d𝓛/d𝜃 = 2a𝜃,因此通过插入𝜃的值,我们得到了 d𝓛.对于某个𝜃.,当 d𝓛为零时,𝓛最小
目标现在变成找到给出 d𝓛 = 0 的𝜃

如何选择𝛂?

𝛂通常由经验决定,应该尝试几个值来找到使转换更快的值,但这里仍然有一个问题,即参数的常数(稍后将详细介绍)。

例子

假设𝛂= 0.9,𝓛 = 𝜃,ɛ= 0.00001,这个值告诉我们∆𝓛应该变得多小才能被认为是零。
迭代梯度下降公式后(𝜃𝑛₊₁ = 𝜃𝑛 -𝛂。∆𝓛)我们得到下表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,为了使∆𝓛小于 0.00001,并且能够找到可接受的𝜃.值,需要 77 次迭代它有点长,这是因为我们有一个恒定的𝛂!
原因是,即使接近最小值时,我们也在走同一步,而事实上,我们应该用更小的步来重新调整下降。

示意性地,梯度下降类似于下图(PS。这不是准确的表示,但它给出了一种直觉)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,真正需要的是,当我们接近最小值时,我们必须调整我们的步骤,以确定最小值,并避免绕过它。因此,我们需要类似下面这样的东西:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现这一点的一种方式是随着我们的继续减少𝛂,例如,随着每次迭代 i 计算因子 f = 1 + (i/10) 然后在梯度下降公式中将𝛂除以 f :

𝜃𝑛₊₁ = 𝜃𝑛 -𝛂/ f 。∆𝓛

这一修改将产生更好的结果,我们只需 8 次迭代就能得到解决方案,如下表所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,这里有一个 python 代码,它将计算任何损失函数的梯度下降,只要函数 dF(x)中给定了右导数

结论

梯度下降是一种寻找损失函数最小值的便捷工具,在深度学习领域非常有用。

梯度下降与神经进化

原文:https://towardsdatascience.com/gradient-descent-vs-neuroevolution-f907dace010f?source=collection_archive---------3-----------------------

2017 年 3 月,OpenAI 发布了一篇关于进化策略的博文,这是一种已经存在了几十年的优化技术。他们论文的新颖性在于,他们成功地将该技术应用于强化学习(RL)问题背景下的深度神经网络。在此之前,深度学习 RL 模型(通常有数百万个参数)的优化通常是通过反向传播实现的。使用进化策略进行深度神经网络(DNN)优化似乎为深度学习研究人员打开了一个令人兴奋的新工具箱。

本周,优步人工智能研究所发布了一套五篇论文,都聚焦于“神经进化”。术语神经进化指的是通过进化算法优化神经网络。研究人员假设遗传算法是一种训练深度神经网络以解决强化学习问题的有效方法,并且在某些领域优于传统的 RL 方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Neuroevolution relates to natural evolution as an airplane relates to a bird. Neuroevolution has borrowed some fundamental concepts from nature, similarly as neural networks, planes, etc.

概观

那么这意味着什么呢?在不久的将来,所有的 DNN,从有监督的到无监督的以及 RL 应用,都会使用神经进化进行优化吗?神经进化是深度学习的未来吗?神经进化到底是什么?在这篇博文中,我将尝试介绍神经进化,并将其与传统的反向传播算法进行比较。我也将尝试回答上述问题,并把神经进化技术放在更大的 DL 图像中。

首先,我将从框架优化问题开始,这是反向传播和神经进化试图解决的核心问题。我还将尝试明确区分监督学习和强化学习之间的区别。

接下来,我将讨论反向传播,并解释它与神经进化的关系。鉴于 OpenAI 和优步人工智能研究所都刚刚发表了关于这项技术的论文,我有很多课题要解决。幸运的是,由于深度学习神经进化处于研究的早期阶段,神经进化的机制仍然是相当容易理解的。

最优化问题

正如在我之前的博文中所讨论的,机器学习模型本质上是函数逼近器。无论是分类、回归还是强化学习,最终目标几乎都是找到一个将输入数据映射到输出数据的函数。您可以使用训练数据来推断参数和超参数,并使用测试数据来验证近似函数在看不见的数据上是否表现良好。

输入可以是手动定义的特征或原始数据(图像、文本等)。)并且输出是分类中的类或标签、回归中的真实值以及强化学习中的动作。在这篇博文中,我们将把函数逼近器的类型限制在深度学习网络中,但同样的讨论也适用于其他模型。因此,需要推断的参数对应于网络中的权重和偏差。“在训练和测试数据上表现良好”通过客观测量来表达,例如分类的对数损失、回归的均方误差(MSE)和强化学习的回报。

因此,核心问题是找到导致最低损失或最高回报的参数设置。简单!给定需要作为网络参数的函数进行优化的优化目标,即损失或回报,目标因此是以优化目标最小化或最大化的方式来调整参数。

为了使这个形象化,让我们用两个例子。在这两种情况下,我们都制定了优化目标。在抛物线的图像中,x 轴代表模型的单个参数,y 轴代表优化目标(如测试数据)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在下图中,x 轴和 y 轴代表模型的两个参数,z 轴代表优化目标(如测试数据)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

事实上,由于参数的数量以及它们在深度学习网络中的非线性组合,不可能绘制出“优化表面”。然而,同样的想法也适用,优化表面通常是高维的和复杂的,有许多山丘、摇篮、山谷等。

现在的目标是找到一种优化技术,允许我们在优化面上爬行,找到最小值或最大值。请注意,这些曲面的大小和形状与参数的数量有关,无论我们使用的是连续参数还是离散参数,探索所有选项都是不可行的。现在问题变成了如下:给定优化面中的一个随机起点,找到绝对最小值或最大值。

深度神经网络是很好的函数逼近器(甚至在一定程度上是通用函数逼近器),但它们也很难优化。在这种情况下,难以优化意味着很难在“优化面”上找到全局最大值或最小值。在接下来的章节中,我将讨论如何使用梯度下降和神经进化来寻找好的解决方案。

梯度下降

梯度下降(反向传播)的一般思想已经存在了几十年。由于大量的数据、计算能力和新颖的创新,它已经成为优化深度学习模型参数的主要技术。

梯度下降的大致思路是这样的:
-假设你在法国巴黎,你需要到达德国柏林。在这种情况下,欧洲是优化面,巴黎是随机起点,柏林是绝对最小值或最大值。由于你没有地图,你向随机的陌生人询问去柏林的方向。一些随机的陌生人知道柏林在哪里,但其他人不知道,所以虽然大多数时候,你走在正确的方向,但也有可能你会走错方向。只要陌生人是正确的而不是错误的,它就应该是可行的(例如,随机梯度下降,或带有小批次的梯度下降)。
——你朝陌生人给你指的方向走 5 英里(步长或学习速度)。这个过程一直重复,直到你相信你离德国足够近。结果可能是你刚进入德国,离柏林(当地的 optima)很远。没有办法验证你是否达到了你的最终目标,你只能根据你周围的环境(测试损失或奖励)来估计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradient descent: walking around in Europe without a map.

回到两个可视化的例子,你可以想象在抛物线和更复杂的表面的情况下梯度下降是如何工作的。本质上,使用梯度下降,您是在优化曲面上行走。在抛物线的例子中,这很简单,因为你只需要走下斜坡。如果学习率太高,你可能永远无法达到绝对最小值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The importance of a proper stepsize (image taken from the Cornell course)

在第二个例子中,情况更加复杂。为了达到绝对最小值,你必须克服几座山和几个谷。几个梯度下降变量,试图模仿物理行为,如一个有动量的球滚下表面(如亚当),以避免陷入局部最优。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An example path that gradient descent might take. Notice that depending on the hyperparameters you might get stuck in the initial local minima.

我强烈推荐这篇关于梯度下降变体的博文。它清楚地解释和说明了不同变体之间的差异,以及它们如何解决梯度下降所面临的不同问题。在这个优化问题中经常有几个局部最优解、障碍和不同的路径,不同的梯度下降法通常试图解决一些(或所有这些)问题。如今,亚当乐观主义者似乎是最有影响力的一个。

梯度下降的本质是计算适当的梯度,推动你走向一个好的解决方案。在监督学习中,有可能通过标记数据集相对容易地获得“高质量梯度”。然而,在强化学习中,你只能得到很少的回报,因为随机的初始行为不会带来很高的回报。此外,这种奖励只发生在几次行动之后。虽然分类和回归中的损失是你试图逼近的函数的相对较好的代理,但是强化学习中的回报通常不是你想要学习的行为或函数的非常好的代理。

鉴于强化学习中的梯度并不总是高质量的,进化算法最近被优步和 OpenAI 用于改善学习。

神经进化

神经进化、遗传算法、进化策略都围绕着遗传进化的概念。

当你在 DNN 优化的背景下进行遗传优化时,你从模型的初始群体开始。典型地,模型被随机初始化,并且基于该初始模型导出几个后代。在 DNN 的情况下,你初始化一个模型(就像你平常做的那样),然后你添加小的随机向量,从一个简单的高斯分布中取样,到参数中。这导致模型的云,它们都驻留在优化表面的某个地方。请注意,这是梯度下降的第一个重要区别。您开始(并继续工作)一群模型,而不是一个单一的(点)模型。

从这个原始种群开始,基因优化周期开始。接下来,我将在进化策略的背景下描述遗传优化。进化策略、遗传算法等。关于如何进行遗传优化,所有的方法都略有不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Overview of genetic optimisation.

首先,执行健康评估。适应性评估对应于检查模型在优化表面中的位置,并确定哪个模型表现最好(例如,最适合)。有些型号的性能会比其他型号好,这仅仅是因为它们的初始化方式。
接下来,基于健康评估执行选择。在进化策略中,(伪)子代被简化为一个单一的模型,通过适应度评估进行加权。对 DNN 来说,适应度被定义为损失或回报。本质上,你就这样在优化面上走来走去,并利用后代朝着正确的方向前进。请注意,这是梯度下降的第二个主要区别。你不是计算梯度,而是设置多个“天线”,并朝着看起来最好的方向移动。在某种程度上,这类似于“结构化随机”搜索。选择阶段的最终结果是你有一个单一的模型。
接下来,执行再现和组合。具体地,重复与初始阶段相同的过程。基于新选择的‘主要’模型,导出一组新的后代。然后这个过程在这个后代身上继续。
通常,在遗传优化中,突变也被执行以改善后代的多样性。突变的一个例子是改变如何产生不同的后代(即不同参数的不同噪声水平)。

es 的优点之一是可以在不同的核上计算群体中不同模型的适合度评估(核外计算)。适应性评估后需要共享的唯一信息是它们的性能(标量值)以及用于生成模型的随机种子值。因此,不再需要与所有机器共享整个网络。OpenAI 和优步都使用了成千上万的机器来做实验。随着云计算的兴起,运行这些实验变得非常可扩展,并且只受计算能力的限制。

下图展示了 es 和梯度下降之间的两个主要区别。使用多个模型来移动,并且不计算梯度,而是基于它们的性能对不同的模型进行平均。正如优步的研究所示,对群体而不是单一模型进行优化会产生更高的稳健性,并显示出与 DNN 优化的贝叶斯方法的相似性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Neuroevolution: walking around Europe in a group.

我强烈推荐看看优步博客文章中的精彩插图。这些说明了如何使用 ES 来规避梯度下降面临的一些问题(例如,陷入局部最优)。本质上,进化策略执行梯度近似。虽然当真实梯度可用时,使用真实梯度更好,但当真实梯度只有相对较差的近似可用时,以及当需要探索优化表面时,例如在强化学习场景中,该方法确实显示出前景。

结论

OpenAI 和优步的研究人员能够表明,进化策略的“梯度近似”导致监督学习场景中令人满意的(但不一定是新的最先进的)解决方案。另一方面,他们能够在强化学习场景中展示其方法的高性能(在某些领域可与最先进的技术相媲美)。

神经进化会是深度学习的未来吗?可能不会,但我相信它对困难的优化问题有很好的前景,比如在强化学习场景中。此外,我相信神经进化和梯度下降方法的结合将导致 RL 性能的显著改善。神经进化的一个缺点是训练这些系统需要大量的计算能力,这可能会限制这些技术的民主化。

鉴于著名的研究小组正在关注这些问题,我仍然很高兴看到未来会发生什么!

基于图形的亚马逊产品推荐引擎

原文:https://towardsdatascience.com/graph-based-recommendation-engine-for-amazon-products-1a373e639263?source=collection_archive---------2-----------------------

在我攻读硕士学位期间,我和我的同事为大数据课程做了一个很酷的项目。我们发现了一个最近发布的包含亚马逊产品和评论的数据集,因此我们决定基于这些产品构建一个推荐引擎。我们最初看到了协同过滤论文,它是亚马逊和网飞等多家大公司推荐引擎的基础。然而,我们决定采用另一种方法,在一个大图中表示产品,并在图的边缘捕捉产品交互。在这篇文章中,我将描述我们使用的数据,我们如何建立图表,我们如何评估我们的系统,以及我们的引擎失败的不同情况,以及如何潜在地改进它。

数据

我们在这个项目中使用了两个数据集。你可以从这里下载。第一个数据集包含从 1996 年 5 月到 2014 年 7 月在亚马逊上销售的产品的客户评论。每条评论都有一段用户体验的文字描述,一个有问题的产品的评级,以及一个有用性投票,它代表了这条评论对其他客户的帮助程度。原始数据有 1.428 亿条评论,但是,我们使用了该数据的子集,这样每个产品至少有 5 条评论。我们的子集数据有 4113 万条评论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Product review sample

  • reviewerID —审阅者的 ID,例如 A2SUAM1J3GNN3B
  • asin —产品的 ID,例如 0000013714
  • 审阅者姓名—审阅者的姓名
  • 有帮助性—评价的帮助性等级,例如 2/3
  • 审阅文本—审阅的文本
  • 总体—产品评级
  • 摘要—审核的摘要
  • unixReviewTime —查看的时间(unix 时间)
  • 审阅时间—审阅的时间(原始)

第二个数据集是产品元数据。它包括产品描述,价格,销售排名,品牌信息和共同购买链接。共同购买链接的划分如下

  • 也查看:客户在查看此产品后查看的其他产品
  • also _ built:客户购买该产品后购买的其他产品
  • buyed _ together:客户与目标产品一起购买(一揽子交易)的其他产品。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Product metadata sample

  • asin —产品的 ID,例如 0000031852
  • 标题—产品的名称
  • 价格—以美元为单位的价格(爬行时)
  • imUrl —产品图像的 Url
  • 相关—相关产品(也购买、也查看、一起购买、查看后购买)
  • 销售等级-销售等级信息
  • 品牌——品牌名称
  • 类别—产品所属类别的列表。

构建图表

使用上述数据,我们构建了一个图,其中每个节点是一个产品,每个边是两个产品之间的关系。图中的每个节点都有一个权重,用于计算图的边权重。

产品得分

我们使用第一个数据集来计算这个分数。对于一个目标产品,我们得到该产品的所有评论,对于每个评论,我们提取有用性投票和总得分。思维过程如下:总得分越高,产品越好。此外,有用性越高,购买该产品时考虑该评论的人就越多。因此,我们需要建立一个与总体分数和有用性投票成正比的产品分数。两个模型出现了:

  • 乘法模型:得分=有用性*总体
  • 加法模型:得分= alpha*有用性+ (1-alpha) *总体

我们考虑这两个模型进行评估,看看哪一个表现更好。

图形边缘

使用第二个数据集,我们创建产品之间的边。使用共同购买的链接,我们在目标产品和每个共同购买的产品之间构建边,如下所示:

  • 对于 buy _ together 产品,权重=1 的边
  • 对于同时购买的产品,权重=2 的边
  • 对于同时查看的产品,权重=3 的边

在创建初始边权重之后,我们基于每个节点的乘积分数和初始边权重来计算新的权重。产品 P1 和产品 P2 之间边 E 的新得分如下:

E(P1,P2) =初始边权重*(1-产品得分 P1)*(1-产品得分 P2)

这样,具有较高产品分数和较好初始交互的产品在图中更接近。

这样,我们构建了一个包含 150 万个节点和 5200 万条边的图。

搜索 K-最近产品

为了找到每个目标产品的推荐,我们搜索 k 个最接近的产品,并将它们返回给用户。

  1. 首先将产品 A 的所有直接连接添加到候选列表中
  2. 对于候选列表中的每个项目:
    -如果候选列表中没有 K 个项目,则添加它
    -否则,只有到产品 A 的距离小于列表中所有产品的最大距离时,才添加它
  3. 对候选人排序
  4. 返回前 K 个作为推荐

估价

这就是我们最初陷入困境的地方,不知道如何评估我们的模型。这不是我们训练一个模型并在子集数据上测试它的情况。经过研究,我们发现推荐系统通常用行业中的 A/B 测试来测试,其中业务相关的指标(例如总销售额)在用户的统计代表性样本上被跟踪。我们决定做一个迷你版。我们随机选择了 10 种产品,并考虑了这 4 种型号的建议:

  • 乘法模型
  • alpha=0.25 的加法模型
  • alpha=0.5 的加法模型
  • alpha=0.75 的加法模型
  • 以 Amazon.com 的亚马逊推荐为基准

我们将这些建议提供给 5 名参与者,并要求他们报告每个目标产品中哪些项目是相关的建议。从那里,我们能够计算相关性分数,作为来自全部样本的全部相关推荐的比率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Relevancy scores

正如所料,亚马逊的推荐是最相关的(否则我们会成为亿万富翁)。对于我们的模型,加法模型比乘法模型表现更好。经过一些调查,我们发现许多评论的有用性得分为 0,因此无论总得分是多少,产品得分都是 0。

至于相加模型,我们发现,与其中一个参数占主导地位的情况相比,对产品总体得分和有用性赋予相同的权重会产生略好的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

个案研究

在我们用于评估的 10 个产品中,我们有一个案例,我们的系统比亚马逊提供了更好的推荐。目标产品是儿童相关产品,我们的模型给出了 4 个儿童相关产品,而亚马逊给出了 2 个儿童相关产品和 3 部手机。

在另一个案例中,目标产品是迈克尔·杰克逊的音乐专辑。亚马逊推荐了同一位艺术家的其他音乐专辑。我们的系统确实推荐了其他音乐专辑,但它们来自不同的艺术家。

此外,有一次我们的系统没有给出任何建议。这是因为选择的产品与任何其他产品都没有优势,因此搜索无法找到任何可推荐的产品。

进一步改进

如果有更多的时间在这个项目上工作,我们有几个想法要进一步实施。其中之一是对评论文本执行 NLP,以从每个评论中提取情感。我们会根据评论的积极或消极程度来打分。这将导致我们计算不同的产品得分函数。我们可以通过使用元数据数据集中给出的产品在其类别中的排名来进一步提高产品得分。

另一种可能性是为每个产品添加一个类别特性。通过介绍类别是如何相似的,我们确保没有产品是没有边连接的,因为这将在相似类别的产品之间创建新的边。

评估方面,我们可以添加更多的参与者和更多的产品,以更好地评估我们产品的相关性。这将通过创建一个为用户提供选择建议的应用程序来简化。

这种方法的优点是只需要构建一次图。之后,只需向其他产品添加节点和边,就可以非常容易地向其中添加产品。此外,搜索算法是在线功能,在返回推荐方面速度很快。

谢谢你。

这篇文章最初发表在我的博客

图形嵌入——综述

原文:https://towardsdatascience.com/graph-embeddings-the-summary-cc6075aba007?source=collection_archive---------2-----------------------

本文介绍了什么是图嵌入,它们的用途,以及最常用的图嵌入方法的比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pixabay — geralt

raphs 通常用于不同的实际应用中。社交网络是人们相互追随的大型图表,生物学家使用蛋白质相互作用的图表,而交流网络本身就是图表。他们在文本挖掘领域使用单词共现图。对在图上执行机器学习的兴趣正在增长。他们试图预测社交媒体中的新友谊,而生物学家则预测蛋白质的功能标签。对图表的数学和统计操作是有限的,并且将机器学习方法直接应用于图表是具有挑战性的。在这种情况下,嵌入似乎是一种合理的解决方案。

什么是图嵌入?

图嵌入是属性图到一个向量或一组向量的变换。嵌入应该捕获图的拓扑、顶点到顶点的关系,以及关于图、子图和顶点的其他相关信息。嵌入器编码的属性越多,在以后的任务中可以检索的结果越好。我们可以大致将嵌入分为两组:

  • **顶点嵌入:**我们用它自己的矢量表示对每个顶点(节点)进行编码。当我们想要在顶点级别上执行可视化或预测时,例如 2D 平面中的顶点的可视化,或者基于顶点相似性的新连接的预测,我们将使用这种嵌入。
  • **图嵌入:**这里我们用一个向量来表示整个图。当我们想要在图表水平上进行预测时,以及当我们想要比较或可视化整个图表时,例如化学结构的比较时,使用这些嵌入。

稍后,我们将介绍第一组中的一些常用方法(DeepWalk、node2vec、SDNE ),以及第二组中的 graph2vec 方法。

为什么我们使用图嵌入?

图形是一种有意义且易于理解的数据表示形式,但是需要图形嵌入有几个原因:

  • **图上的机器学习是有限的。**图由边和节点组成。那些网络关系只能使用数学、统计学和机器学习的特定子集,而向量空间有更丰富的方法工具集。
  • 嵌入是压缩的表示。邻接矩阵描述了图中节点之间的连接。它是一个|V| x |V|矩阵,其中|V|是图中节点的数量。矩阵中的每一列和每一行代表一个节点。矩阵中的非零值表示两个节点相连接。使用邻接矩阵作为大型图的特征空间几乎是不可能的。想象一个有 1M 个节点和 1M×1M 的邻接矩阵的图。嵌入比邻接矩阵更实用,因为它们将节点属性打包在一个维数更小的向量中。
  • 向量运算比图形上的可比运算更简单更快

挑战

嵌入方法需要满足更多的要求。这里我们描述了嵌入方法面临的诸多挑战中的三个:

  • 我们需要确保嵌入很好地描述了图的属性。它们需要表示图形拓扑、节点连接和节点邻域。预测或可视化的性能取决于嵌入的质量。
  • 网络的大小不应该降低嵌入过程的速度。图通常很大。想象一下拥有数百万人的社交网络。一个好的嵌入方法需要在大型图上是有效的。
  • **一个重要的挑战是决定嵌入维度。**较长的嵌入比排序嵌入保留了更多的信息,但也带来了更高的时间和空间复杂度。用户需要根据需求做出取舍。在文章中,他们通常报告说 128 到 256 之间的嵌入大小对于大多数任务来说是足够的。在方法 Word2vec 中,他们选择了嵌入长度 300。

Word2vec

在我们介绍嵌入图的方法之前,我将讨论 Word2vec 方法和 skip-gram 神经网络。它们是图形嵌入方法的基础。如果想更好的理解,建议查看这个优秀教程或者这个视频

Word2vec 是一种将单词转换成嵌入向量的嵌入方法。相似的词应该有相似的嵌入。Word2vec 使用 skip-gram 网络,这是一种具有一个隐藏层的神经网络。跳跃语法被训练来预测句子中的相邻单词。这个任务被称为假任务,因为它只是在训练阶段使用。网络在输入端接受该单词,并进行优化,使其能够以很高的概率预测句子中的相邻单词。下图显示了输入单词(标有绿色)和预测单词的示例。通过这个任务,作者实现了两个相似的单词具有相似的嵌入,因为具有相似含义的两个单词很可能具有相似的邻近单词。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The word colored with green is given to the network. It is optimized to predict the word in the neighborhood with higher probability. In this example, we consider words that are the most two places away from the selected words.

下图所示的 skip-gram 神经网络具有输入层、一个隐藏层和输出层。网络接受独热编码字。独热编码是长度与单词字典相同的向量,并且除了 1 之外全是 0。第一个是编码单词在字典中出现的位置。隐藏层没有激活功能,其输出呈现单词的嵌入。输出层是预测邻域单词的 softmax 分类器。关于 skip-gram 的更多细节可以在之前提到的教程 I 中找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Skip-gram neural network

我将介绍四种图形嵌入方法。其中三个嵌入节点,而一个用一个向量嵌入整个图。他们在三种方法中使用了 Word2vec 的嵌入原理。

顶点嵌入方法

我将介绍三种在图中嵌入节点的方法。选择它们是因为它们通常在实践中使用并且通常提供最好的结果。在我们开始之前,我可能会提到节点嵌入的方法可以分为三大类:因式分解方法、随机漫步方法和深度方法。

深度行走使用随机行走产生嵌入。随机游走从一个选定的节点开始,然后我们从当前节点移动到随机邻居,移动了定义的步数。

该方法基本上包括三个步骤:

  • *采样:*用随机漫步对一个图进行采样。很少从每个节点进行随机行走。作者表明,从每个节点进行 32 到 64 次随机行走就足够了。他们还表明,好的随机漫步有大约 40 步的长度。
  • 训练 skip-gram: 随机游走与 word2vec 方法中的句子相当。skip-gram 网络接受随机行走中的一个节点作为独热向量作为输入,并最大化预测邻居节点的概率。它通常被训练来预测大约 20 个邻居节点——左侧 10 个节点和右侧 10 个节点。
  • *计算嵌入:*嵌入是网络的一个隐层的输出。DeepWalk 计算图中每个节点的嵌入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Phases of DeepWalk approach

深度行走方法随机地执行随机行走,这意味着嵌入不能很好地保持节点的局部邻域。Node2vec 方法解决了这个问题。

Node2vec 是 DeepWalk 的修改版,与随机漫步的区别很小。它有参数 P 和 Q。参数 Q 定义随机行走发现图中未发现部分的可能性,而参数 P 定义随机行走返回前一个节点的可能性。参数 P 控制节点周围微观视图的发现。参数 Q 控制更大邻域的发现。它推断社区和复杂的依赖关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The figure shows probabilities of a random walk step in Node2vec. We just made a step from the red to the green node. The probability to go back to the red node is 1/P, while the probability to go the node not connected with the previous (red) node 1/Q. The probability to go to the red node’s neighbor is 1.

嵌入的其他步骤与 DeepWalk 方法相同。

结构化深度网络嵌入(SDNE) 与前两种方法没有任何共同之处,因为它不执行随机行走。我之所以提到它,是因为它在不同任务上的表现非常稳定。

它被设计成使得嵌入保持一阶和二阶近似。一阶近似是由边链接的节点之间的局部成对相似性。它描述了本地网络结构的特征。如果网络中的两个节点与边相连,则它们是相似的。当一篇论文引用另一篇论文时,意味着它们涉及相似的主题。二阶接近度表示节点邻域结构的相似性。它捕捉全球网络结构。如果两个节点共享许多邻居,它们往往是相似的。

作者提出了一个自动编码器神经网络,它有两个部分—见下图。自动编码器(左和右网络)接受节点邻接向量,并被训练来重建节点邻接。这些自动编码器被称为普通自动编码器,它们学习二阶近似。邻接向量(邻接矩阵中的一行)在表示连接到所选节点的节点的位置上具有正值。

网络中还有一个被监督的部分——左翼和右翼之间的联系。它计算从左侧和右侧嵌入之间的距离,并将其包括在网络的公共损耗中。训练网络,使得左和右自动编码器得到通过输入上的边连接的所有节点对。距离部分的损失有助于保持一阶近似。

网络的总损耗计算为左右自动编码器的损耗与中间部分的损耗之和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图形嵌入方法

最后一种方法嵌入整个图形。它计算一个描述图形的向量。我选择了 graph2vec 方法,因为这是我所知道的最好的图形嵌入方法。

Graph2vec 基于使用跳格网络的 doc2vec 方法的思想。它从输入中获得文档的 ID,并被训练以最大化从文档中预测随机单词的概率。

Graph2vec 方法包括三个步骤:

  • **从图中采样并重新标记所有子图。**子图是出现在所选节点周围的一组节点。子图中的节点距离所选边数不超过。
  • 训练跳格模型。图表类似于文档。因为文档是一组单词,所以图是一组子图。在这个阶段,训练跳格模型。它被训练成最大化预测输入图上存在的子图的概率。输入图作为一个热点向量提供。
  • 计算嵌入,在输入端提供一个图 ID 作为一个热点向量。嵌入是隐藏层的结果。

由于任务是预测子图,所以具有相似子图和相似结构的图具有相似的嵌入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其他嵌入方法

我提出了四种基于常用文献的方法。由于这个主题目前非常流行,所以有更多的方法可用。在这里,我列出了其他可用的方法:

  • 顶点嵌入方法: LLE,拉普拉斯特征映射,图分解,GraRep,HOPE,DNGR,GCN,线
  • 图嵌入方法: Patchy-san、sub2vec(嵌入子图)、WL 核和深度 WL 核

参考

[1] C. Manning,R. Socher,第二讲|词向量表示法:word2vec (2017), YouTube

[2] B. Perozzi,R. Al-Rfou,S. Skiena,DeepWalk:社会表征的在线学习(2014),arXiv:1403.6652

[3]麦考密克。 Word2Vec 教程—跳格模型(2016)http://mccormickml.com

[4] T. Mikolov,K. Chen,G. Corrado,J. Dean,向量空间中词表征的高效估计(2013),arXiv:1301.3781

[5] A .纳拉亚南,m .钱德拉莫汉,r .文卡特桑,l .陈,y .刘,s .贾伊斯瓦尔,graph2vec:学习图的分布式表示(2017), arXiv:1707.05005

[6] P. Goyal,E. Ferrara,图嵌入技术、应用和性能:一项调查(2018), 基于知识的系统

[7] D .王,p .崔,w .朱,结构化深度网络嵌入(2016), 第 22 届 ACM SIGKDD 知识发现与数据挖掘国际会议论文集。

[8] A. Grover,J. Leskovec,node2vec:面向网络的可扩展特征学习(2016), 第 22 届 ACM SIGKDD 知识发现与数据挖掘国际会议论文集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值