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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

从虚构到现实:人工神经网络初学者指南

原文:https://towardsdatascience.com/from-fiction-to-reality-a-beginners-guide-to-artificial-neural-networks-d0411777571b?source=collection_archive---------3-----------------------

(这篇文章和许多类似的文章来自我在 jasonroell.com 的个人博客。看看吧!)

对人工智能的兴趣正在达到新的高度。2016 年是人工智能初创公司和资金创下纪录的一年,2017 年肯定会超过它,如果它还没有超过的话。根据 IDC 的数据,到 2020 年,认知系统和人工智能方面的支出将增长超过 750%。从最小的初创公司到最大的公司,从智能手机应用程序到公共健康安全系统,对人工智能的兴趣和投资涵盖了商业和技术领域的所有领域。技术领域的大牌都在人工智能上投入巨资,同时将其融入商业模式,并越来越多地用于他们的产品中:虚拟助理(如 Siri)、计算机视觉、语音识别、语言翻译和许多其他应用。但是 AI 背后实际的 IT 是什么?简而言之:人工神经网络(ANN)。在这里,我们来看看它们是什么,它们是如何工作的,以及它们如何与激发它们的生物神经网络相关联。

定义人工神经网络

术语人工神经网络用于指代数学模型或模拟大脑神经网络中基本计算特征的实际程序。

神经元

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

来源:http://www . robots . ox . AC . uk

虽然生物神经元是极其复杂的细胞,但它们在输入和输出方面的基本计算性质相对简单。每个神经元有多个树突和一个轴突。神经元从其树突接收输入,并通过其轴突传递输出。输入和输出都采用电脉冲的形式。神经元将其输入相加,如果总电脉冲强度超过神经元的触发阈值,则神经元沿着其单个轴突触发新的脉冲。轴突进而沿着其分支突触分发信号,这些分支突触共同到达数千个相邻的神经元。

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

来源:数据营

神经元和晶体管之间有一些基本的相似之处。它们都是各自领域信息处理的基本单位;它们都有输入和输出;他们都和邻居有联系。然而,神经元和晶体管之间也有很大的不同。晶体管是简单的逻辑门,通常连接到不超过三个其他晶体管。相比之下,神经元是高度复杂的有机结构,与大约 10,000 个其他神经元相连。自然地,当涉及到执行需要数千个并行连接的认知壮举时,这种丰富的连接网络使神经元比晶体管具有巨大的优势。几十年来,工程师和开发人员一直在设想如何利用这一优势,让计算机和应用程序更像大脑一样运行。最后,他们的想法已经成为主流。虽然晶体管本身不会很快看起来像神经元,但它们运行的一些人工智能软件现在可以模仿基本的神经处理,而且只会越来越复杂。

神经元建模

感知器

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

来源:http://cs231n.github.io/neural-networks-1/

感知器,或单层神经网络,是最简单的神经计算模型,也是构建的理想起点。你可以把感知器想象成一个神经元。然而,感知器没有树突,而是简单地有输入: *x1,x2,x3,…,xN。*此外,感知器没有轴突,而是只有一个输出: y = f(x)

重量

感知器的每个输入(x1,x2,x3,…,xN)都有一个权重(w1,w2,w3,…,wN)。如果某个权重小于 1,就会削弱其输入。如果大于 1,就会放大。在稍微复杂一点但被广泛采用的感知器模型中,还有一个输入 1 ,具有固定权重 b ,称为偏差,用作训练感知器的目标值。

激活功能

也被称为传递函数,激活函数决定了感知器输出的值。激活函数的最简单形式是某种类型的阶跃函数。它模仿生物神经元在达到其触发阈值时触发,如果总输入超过给定的阈值量,则输出 1,否则输出 0。然而,为了得到更真实的结果,需要使用一个非线性的激活函数。其中最常用的是 sigmoid 函数:

f(x)= 1 / (1+e^-x)

这个基本公式有许多常用的变体。然而,所有的 sigmoid 函数在绘制时都会采用某种形式的 S 曲线。当输入为零时,输出也为零。然而,当输入值变为正值时,输出最初(大致)呈指数增长,但最终在水平渐近线表示的固定值处达到最大值。这个最大输出值反映了生物神经元可以产生的最大电脉冲强度。

添加隐藏层

在更复杂、更现实的神经模型中,至少有三层单元:输入层、输出层和一个或多个隐藏层。输入层从系统试图解释、理解、感知、学习、记忆、识别、翻译等的外部世界接收原始数据。相比之下,输出层传输网络最终处理后的响应。然而,位于输入和输出层之间的隐藏层是驱动最先进的人工神经网络的机器学习的关键。

大多数建模假设各层完全连接。在完全连接的神经网络中,一层中的所有单元都连接到其相邻层中的所有单元。

反向传播

你可以认为反向传播是神经网络中允许网络学习的过程。在反向传播过程中,网络处于不断训练、学习、调整和微调的过程中,直到它更接近预期的输出。反向传播通过使用损失函数比较预期输出和实际输出进行优化。结果是一个误差值,或成本,反向传播使用它来重新校准神经元之间的网络权重(以找到最相关的特征和输入,从而产生期望的输出),通常是在众所周知的梯度下降优化算法的帮助下。如果存在隐藏层,那么该算法也重新校准所有隐藏连接的权重。每一轮重新校准后,系统再次运行。随着误差率变小,每一轮重新校准都变得更加精确。在反向传播网络的输出与预期输出紧密匹配之前,这个过程可能需要重复数千次。在这一点上,可以说网络是完全训练有素的。

考虑清楚

随着人工智能投资和开发达到新的高度,这对人工智能爱好者和有抱负的开发人员来说是一个激动人心的时刻。然而,重要的是首先要好好看看人工智能背后的 it:人工神经网络(ANN)。这些计算模型模拟了生物神经网络中的基本计算特征。神经元变成感知器或简单的单元;树突成为输入;轴突成为输出;电脉冲强度成为连接权重;神经元的触发强度函数成为单元的激活函数;一层层的神经元变成了一层层完全连接的单元。将所有这些放在一起,您可以按原样运行您完全训练好的前馈网络,或者您可以训练和优化您的反向传播网络以达到所需的值。很快,你就可以拥有你的第一个图像识别器,自然语言处理器,或者任何你想出来的新的人工智能应用程序。

感谢您的阅读,如果您喜欢这篇文章**,请分享这篇文章**,或者订阅我在 JasonRoell.com 的博客,或者在 LinkedIn 上关注我,我在那里发布了我认为普通程序员甚至技术爱好者都感兴趣的技术话题。

祝你有美好的一天,继续学习!

从前四到甜蜜的 16 岁:我如何预测锡拉丘兹将颠覆密歇根州立大学

原文:https://towardsdatascience.com/from-first-four-to-sweet-16-how-i-predicted-syracuse-would-upset-michigan-state-32fc95c96fa4?source=collection_archive---------14-----------------------

正如其他人注意到的那样,NCAA 锦标赛的前两轮相当疯狂。用我自己对冷门的定义(一场被排名比对手低至少 4 位的弱队获胜),仅在周日就有 4 场冷门。到目前为止,总共有 10 场冷门,已经超过了每场比赛 9 场的平均水平。还有 15 场比赛要打!

周日的所有冷门都令人震惊,但也许最令人震惊的是锡拉丘兹大学对密歇根州立大学的胜利。在周日最受欢迎的北卡罗来纳、泽维尔、辛辛那提和密歇根州之间,斯巴达有最大的分差8 分,这意味着密歇根州有 80%的胜算。与大多数年份一样,汤姆·伊佐的队伍是一个深入发展的威胁,他们确实被许多专家选为进入最后 4 强的

但是你不会在我的范围内找到第二轮之后的密歇根州立大学,因为我的不安预测模型预见到了这一点。我的模型使用机器学习来检测冷门让锡拉丘兹有 81%的机会击败密歇根州立大学,进入甜蜜的 16 强。

老实说,我很震惊地看到这场比赛的爆冷概率如此之高。对密歇根州立大学的热爱不仅限于公众和专家;甚至先进的评级系统也将密歇根州立大学列为全国最好的球队之一。

今天,我仔细观察这两个团队,以理解为什么我的模型正确地预测了这场混乱。

冷门评论:雪城超过密歇根州立大学

是什么因素让这款游戏进入冷门警戒?我将着眼于这场比赛的三个突出特点。

锡拉丘兹大学的赛程对 11 号种子选手来说异常艰难

锡拉丘兹大学参加了 ACC,这是一个汇集了通常被认为是全国最好的发电站项目的会议。今年橘子有一个残酷的会议名单,包括北卡罗莱纳州两次,弗吉尼亚两次,杜克大学和克莱姆森,扔在一个非会议游戏对堪萨斯的好措施。关于锡拉丘兹的整体记录的问题让他们在锦标赛上泡沫,但在他们的 13 场比赛中,9 场输给了 NCAA 锦标赛球队。Sports-reference.com 将他们的赛程排在全国第 19 位,相比之下密西根州排在第 56 位。

11 种子球队通常都这么难打赛程吗?答案是响亮的不。

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

Syracuse played a much tougher schedule than typical 11-seeds

在左侧,我显示了 2003 年至 2017 年所有 11 号种子的赛程评级强度,以及他们的锦标赛对手的赛程强度。在所有 11 个种子队中,只有 7 支球队今年的赛程比锡拉丘兹更艰难。

橙衣军团今年面临特别好的进攻,因为他们的对手平均进攻效率在全国排名第十。虽然 4 场对抗 10 大进攻(杜克,北卡 2x,堪萨斯)的比赛确实产生了 4 场失利,但防守精英进攻的经验可能有助于橙衣军团遏制斯巴达的强大进攻。密歇根州立大学在这个赛季平均每场比赛得 80 分。对锡拉丘兹,他们得了 53 分。

对于一个 3 号种子来说,密歇根州立大学在保护球方面表现平平,在历史上也不擅长制造失误。

1-3 号种子队通常是平衡的队伍,在球场两端都很强。密歇根州立大学队也不例外,他们的进攻效率排名第 13,防守排名第 11。但是在所有的三号种子队中,密歇根州立大学在比赛的一个方面一直很糟糕:制造失误。

营业额百分比衡量的是在营业额中所占的百分比,并根据球队的进攻和防守分别计算。下面我展示了自 2003 年以来所有三号种子队的防守失误率和进攻失误率。

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

Michigan State had the lowest defensive turnover rate among all 3-seeds since 2003

在整个赛季中,斯巴达人的防守只迫使对手 14%的失误。这是自 2003 年以来三号种子选手的最低水平。而且,密歇根州立大学没有平衡这种低防守失误率和进攻中特殊的控球保护,因为他们 19%的财产都以失误告终。这是三粒种子的中间位置。

赢得篮球比赛是不是一定要赢得翻身仗?不总是这样,特别是对于像密歇根州立大学这样的精英得分球队。但是更好的控球保护通常会有所帮助,随着锡拉丘兹大学周日以 14 比 12 赢得了翻盘战,并且仅以 2 分之差获胜,我相信密歇根州立大学会很乐意有几个这样的球员回来。

这场 3 对 11 的比赛有着极其罕见的精英教练对决

毫无疑问,密歇根州立大学的汤姆·伊佐和锡拉丘兹大学的吉姆·伯海姆都是教练精英,在比赛中名列前茅。在他们两人之间,他们拥有 2 次全国冠军,12 次四强出场,16 次常规赛冠军。他们都已经在名人堂了。这是一些严重的硬件。

在最初几轮比赛中,顶级锦标赛球队的教练通常会面对简历不如自己丰富的教练,但在这里肯定不是这样。3 号种子教练在第二轮面对这样的精英教练比赛的几率有多大?几乎没有。

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

This 3 vs 11 game was an extremely rare match-up of elite coaches

对于自 1985 年以来的所有 3 对 11 比赛,我显示了两位教练的比赛经验,用数字表示他们曾经走过的最远回合(添加了一些水平“噪声”以查看数据点)。通常情况下,3 号种子教练面对 11 号种子教练,他们没有深入的比赛。事实上,54%的情况下,3 号种子教练面对的是一个从未赢过锦标赛的 11 号种子教练。

在这种情况下,两位教练之前都参加过(并赢得了)全国决赛。自 1985 年锦标赛扩大到 64 支球队以来,这种情况只发生过一次,而且即使是这一次也有资格赛。2013 年,11 号种子明尼苏达队的教练是 Tubby Smith,他早在 1998 年就在肯塔基州赢得了戒指。

这里的重点不一定是博海姆是一个比伊佐更好的教练。只是当 3 号种子在第二轮面对 11 号种子时,3 号种子教练通常不必与名人堂成员决斗。在这一次,策略无疑发挥了作用。当落后 3 分时,博海姆明智地拒绝了密歇根州立大学任何扳平 3 分的机会,而是选择故意犯规并放弃 2 次罚球。密歇根州立大学赢得或平的唯一机会是在最后一秒绝望的半场投球。它失败了,彻底颠覆了。

结束语

这一分析强调了这两个团队之间一些真正有趣的趋势,但我不能肯定地说,这些是预测这场比赛的主要因素。我的模型使用每个团队的许多特征来预测沮丧的可能性,而这些只是导致沮丧的等式的一部分。

我希望你喜欢我沮丧的预测。谁会是下一个成为冷门牺牲品的队伍?点击 @ 在 Medium 或 Twitter 上关注我,了解更多信息!

从游戏到金融科技:我的 DS 之旅

原文:https://towardsdatascience.com/from-games-to-fintech-my-ds-journey-b7169f08b6ad?source=collection_archive---------5-----------------------

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

Source: Tech in Asia, https://www.techinasia.com

作为一名分析师和数据科学家(DS)在游戏行业工作了五年后,我决定过渡到创业生活,加入一家金融技术部门的公司。虽然这是一个新的领域,有新类型的问题需要解决,但我在游戏行业发展的许多技能仍然与我的新角色相关。这篇文章的目标是展示如何在一个领域学习数据科学技能可以转移到新的意想不到的机会。

我的新角色的一个关键区别是从企业对消费者(B2C)到企业对企业(B2B)的转变。我现在不是对数百万消费者进行分析,而是构建数据产品,帮助数百家非营利组织和营利性公司。对产品分析的关注也越来越少,而是更多地关注为我们的最终用户提供准确的数据。我现在不是探索来自视频游戏和视频流媒体服务的跟踪数据,而是研究来自各种不同数据源的数据,包括房地产销售和政治捐款。

我在新职位的主要目标是建立预测模型,为美国富裕家庭提供准确的资产净值估算。数据源是不同的,我们的客户是企业而不是消费者,但是数据科学的许多关键功能可以很好地跨越这些领域。以下是我在这个新角色中运用到的一些技能。

探索性数据分析(EDA) 能够挖掘数据集对于任何领域都很重要。数据科学家应该能够可视化数据的分布,识别异常值,并找到数据中的相关性。

探索性分析的目标通常是确定数据中是否有预测结果的信号。例如,在游戏行业中,一个常见的目标是识别用户是否会流失或在游戏中失败。这可以表示为一个分类问题,但通常提供汇总统计数据,如漏斗分析,就足以为游戏团队提供反馈。在我的金融科技角色中,一个共同的目标是识别与净值相关的特征,并确定我们是否可以设计出额外的特征来提高我们对净值估计的准确性。

以下是我在这些领域中调查的问题类型:

  • **游戏:**新的订阅模式会蚕食销售额吗?
  • FinTech: 政治献金和净资产有关联吗?

我使用了类似的方法来探索这些类型的问题,包括用于数据管理的 SQL 和用于可视化和相关性分析的 R。

实验 Twitch 的核心原则之一是实验决定,数据科学团队使用 A/B 测试和分阶段推出的组合来实现这一目标。实验的一个重要元素是能够衡量变化的结果,并确定变化是否对用户行为产生了重大影响。在我目前的角色中,我们经常需要确定营销活动是否对我们的客户产生了可衡量的影响,类似的方法可以用于这类任务。在这两种情况下,我都使用 bootstrapping 来测量实验中治疗组和抵制组之间的差异,并测试统计显著性。

以下是这些不同领域的实验例子:

  • **游戏:**一款应用的重新设计是否提高了移动用户的留存率?
  • 金融科技:营销活动推动了收入增长吗?

类似的方法可以用来衡量这些实验的影响,即使这些领域是非常不同的。

预测建模 大多数数据科学角色的另一项重要技能是构建预测模型。在游戏行业,这通常涉及到建立模型来预测可能购买游戏或游戏失败的用户。如果您可以检测出哪些用户最有可能执行这些操作,您可以推动用户采取所需的操作,例如发送电子邮件让玩家登录并领取游戏内奖励。预测模型的另一个用途是评估特征的重要性,以便指导游戏设计。例如,在电子艺界,我建立了一个回归模型,该模型确定,探索更多剧本的用户通常比专注于优化少数特定剧本的玩家拥有更低的保留率。

当改变领域时,我必须做出的改变之一是使用新的度量来评估预测模型的性能。对游戏行业分类任务有用的指标,如 F1 得分和 ROC,并不能很好地转化为金融科技领域的任务,如预测房屋的价值。对于此回归任务,您可以使用相对误差、相关系数或其他误差指标,如平均对数误差。

以下是我为这些领域建立的预测模型的例子:

  • **游戏:**哪些用户最有可能购买订阅?
  • **金融科技:**哪些家庭最有可能向非营利组织捐款?

与 EDA 类似,相同的工具可以用于构建跨这些领域的预测模型,我在这两个领域中都使用了 R 来构建原型模型。

数据产品 除了原型预测模型之外,数据科学家还应该有一个适当的流程来扩展模型以进行部署。在游戏行业,这通常涉及将模型规范交给工程团队,而在我目前的职位上,我更多地参与模型的产品化。在这两个领域中,您可以使用一种中间模型格式,比如 PMML 来分离模型训练和模型部署任务。

在这两个领域中,我构建了批处理模式的数据产品,每周计算数百万条记录的值:

  • **游戏:**计算订阅转换分数。
  • FinTech: 为房地产创建估价。

我执行这些任务的工具集在角色之间发生了变化。我以前与工程团队一起构建定制解决方案,现在已经转向使用开放工具,如 PMML 和 Apache Beam,来生产模型。

结论 在我的数据科学职业生涯中,我从游戏行业转向了金融科技,并在新的岗位上使用了许多不同的数据源,但我在游戏中开发的许多技能都得到了很好的转化。探索性分析、实验、预测性建模和构建数据产品对所有数据科学家来说都是有用的技能,与他们所应用的领域无关。

我的日常工作重心也发生了变化,但这是因为角色类型和领域的变化。我已经从专注于产品分析的角色转变为更专注于机器学习的角色。我花更少的时间构建仪表板,花更多的时间编写代码和提交 PRs。

本·韦伯意外收获数据的首席数据科学家,我们的任务是确定世界上每个家庭的净资产。

如果你今年参加 GDC,请随时在 twitter 上给我发消息。

从 Keras 模型到角度应用

原文:https://towardsdatascience.com/from-keras-model-to-angular-application-491d3f6c4455?source=collection_archive---------10-----------------------

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

介绍

与 TensorFlow 合作服务我想,如果也能为 Keras 模特服务,那就太棒了。 Keras 的优势是显而易见的——它大大简化了模型开发,并允许比纯 TensorFlow 框架更快地尝试模型。

另一个动机是,我想让客户端独立于庞大的 TensorFlow 框架,并使用非常有限的一部分服务功能。当然,我想直观地显示结果,而不需要通过枯燥的 JSON 输出:-)

用 TensorFlow 服务 Keras 模型

Keras 提供高级神经网络 API,能够在 TensorFlowCNTKTheano 之上运行。基本上,它抽象了那些框架,更容易理解和学习,并且允许你用更少的代码做更多的事情。

TensorFlow Serving 是一款用于托管机器学习模型的软件。它的主要用途—高性能生产服务。它是用 C++编写的,使用了客户端用于计算的 Servables 的概念。

如何与 TensorFlow 服务器对话

TensorFlow Serving 提供 gRPC API 用于执行回归、预测和推理任务。这种 gRPC API 比 HTTP 协议上的 REST API 具有更好的性能,但是不能被 Web 应用程序简单地使用。因此,在我看来,gRPC 是内部客户的完美选择,但是它应该被一个向外部世界提供 REST API 的服务所包装。

犬种检测器

对于我的示例应用程序,我使用了一个狗品种检测器,它是我在 Udacity 纳米学位课程期间实现的。我们想要解决的问题是给定一幅狗的图像进行品种检测。该模型利用了卷积神经网络(CNN)架构,并在 ImageNet 数据集模型上进行预训练(我选择了 DenseNet 201 )。该模型是用 Keras 库实现的。

应用的第二部分是一个 Node.js 服务,包装 TensorFlow 服务的 gRPC API,对外提供 REST API。该服务尽可能少地依赖 TensorFlow 它使用修改过的 protobufs 文件和 gRPC 库来处理服务器请求。因此,我们不需要在这里安装任何巨大的 TensorFlow 包。

最后一部分是一个非常简单(也不太好)的 Angular 应用程序,它允许选择狗的图像,向我们的包装服务发送请求,并显示品种。

代码可以在我的 GitHub repo 中找到。如果你觉得有用,可以随意复制、修改和使用:-)

从模型到应用

让我们深入研究一下实现细节。这里有 3 个主要部分:

  • 使用 Keras 创建和训练模型,并为 TensorFlow 服务做准备
  • 实现一个向外界提供 REST API 的包装器服务
  • 创建一个简单的狗品种预测和结果显示的应用程序

犬种检测器模型

我不想用很多代码把文章弄乱。相反,我将提供实现的链接,并解释我遇到的主要挑战。

我创建模型的方法相当简单(你可以在dog _ breed _ detector _ trainer . py中遵循它),Francois Chollet 在 Keras 博客中对此做了很好的解释。这些步骤是:

  • 用权重加载预训练的 DenseNet 201,不加载顶层,并从预训练的网络中提取所谓的瓶颈特征。我已经在data _ extractor . py中实现了这个。
  • 创建一个简单的顶层模型,该模型使用提取的要素作为输入,并且只有全局平均池和完全连接的图层。模型本身在dog _ breed _ detector _ model . py中实现。
  • 训练顶级模特并保存检查点。这里 可以找到
  • 创建“连接”预训练的 DenseNet 201 和训练的顶部模型的最终模型。这在final _ model . py中实现。
  • 为 TensorFlow 服务准备并保存最终模型。你可以在这里 找到

主要挑战是找到一种合适的方法将 Keras 模型转换为 TensorFlow,并为 TensorFlow 服务做准备。基本上,我们这里有两个任务:将 Keras 模型转换为 TF 估计器,并将估计器导出为 TensorFlow 服务。

版本 1.4 开始,我们可以将 Keras 模型转换为 TF 估计量——只需调用 model_to_estimator() 函数,就大功告成了!

tf_estimator = model_to_estimator(keras_model=model)

现在,我们可以保存估计器,用于这里描述的。这只是一个对 export_savedmodel() 函数的调用,带有一个用于服务的接收器函数。这样一个函数在最终模型之上创建了一个附加层,并负责输入解析。在我们的例子中,它将输入的 JPEG 图像转换成一个 3D 张量,可以被模型使用。

tf_estimator.export_savedmodel(export_dir,
    serving_input_receiver_fn,
    strip_default_attrs=True)

为了创建、训练和准备服务模型,首先安装 unzip (用于解压缩下载的带有狗图像的档案):

sudo apt-get update
sudo apt-get install unzip

然后克隆存储库,切换到模型服务目录,下载并解压缩狗图像,并训练模型:

git clone [https://github.com/Vetal1977/tf_serving_keras.git](https://github.com/Vetal1977/tf_serving_keras.git)cd tf_serving_keras/model_servingcurl [https://s3-us-west-1.amazonaws.com/udacity-aind/dog-project/dogImages.zip](https://s3-us-west-1.amazonaws.com/udacity-aind/dog-project/dogImages.zip) --output dogImages.zipunzip dogImages.zip
mv dogImages dog_images
rm dogImages.zippython dog_breed_detector_trainer.py

我的环境包括:

  • 康达 4.3.14
  • Python 3.5.4
  • TensorFlow 1.8 的 GPU 版本
  • Keras 2.1.6

Node.js 包装服务

第二个组件是一个包装器服务,它向外界提供 RESTful API,并将 gRPC 与 TensorFlow 服务器对话。附加要求—尽可能减少对 TensorFlow 的依赖。我为服务实现选择了 Node.js 和 Typescript。

第一步是准备 proto bufs——我把它们从官方仓库中拿出来,扔掉所有我不需要的东西。你可以在这里修改我的版本。我动态加载 protobufs,即在运行时,然后创建一个预测服务,如下所示:

this.tfServing = grpc.load(this.PROTO_PATH).tensorflow.serving;
this.client = new this.tfServing.PredictionService(
    this.tfServerUrl, grpc.credentials.createInsecure());

动态加载的优点是——您不需要通过每次修改 protobufs 来重新生成 Typescript 代码。缺点是性能下降。因为我只加载了一次 protobufs,所以这个缺点并不严重。

现在,当通过 REST 接口调用服务时,我们获取输入数据(图像作为 base64 编码的字符串)并向 TensorFlow 服务器创建 gRPC 请求—请在中找到详细信息。

包装器服务是一个 Node.js express 应用程序,使用inverisfy进行依赖注入,使用 inverisfy express 实用程序 进行 REST API 实现。

我的服务的 API 基本路径是 /api/v1 ,我的控制器实现了唯一的端点 /predict_breed ,它允许图片上传并在 TensorFlow 服务器上调用狗的品种预测。要构建一个项目,请执行以下命令(我假设您已经克隆了 repo):

cd tf_serving_keras/detector-api
npm install
npm build

我的环境包括节点 8.11.3 和 npm 6.1.0。

角度应用

最后一部分是一个简单的角度应用,带有一个按钮来选择一个图像目录和一个区域,用于显示带有预测品种名称的图像。这里没有什么新奇的东西——我使用这个指南创建了一个新的 Angular 项目,并根据我的需要扩展了代码。

与包装器服务对话的客户端在detector . service . API . client . ts中实现。实现的注意事项——我有一个抽象类,它声明了一个预测方法和它的两个实现——上面提到了其中一个,第二个是我尝试使用一个全新的tensor flow Serving RESTful API。稍后我会提供一些评论。

我们需要注意 CORS 机制。 Angular HttpClient 依赖于 XMLHttpRequest ,我不得不将的后续头添加到我的 Node.js 包装服务中,以获得应用程序中的响应:

'Access-Control-Allow-Origin': '*'

这是一个典型的应用程序屏幕,上面有狗的图像和预测的品种:

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

要构建一个项目,执行以下命令(我假设您已经克隆了 repo):

cd tf_serving_keras/detector-app
npm install
npm build

使用 Docker 进行本地测试

老实说,我懒得分别启动和运行所有 3 个组件:-) DockerDocker Compose 让我的生活更轻松。我需要 3 个 Docker 容器——一个用于托管我的模型的 TensorFlow 服务,一个用于包装服务,一个用于我的应用程序。我安装了以下版本:Docker 18.03.1-ce 和 Docker Compose 1.21.2。

TensorFlow 服务的 Docker 图像

在创建 Docker 映像之前,您必须有一个为 TensorFlow 服务的导出模型——请参见上文如何操作。上次为 TensorFlow 服务创建 Docker 容器花费了很多精力。从那以后事情发生了变化,现在我们可以用 apt-get 安装服务组件,而不需要克隆存储库和自己构建服务器。

echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.listcurl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -sudo apt-get update && sudo apt-get install tensorflow-model-server

我创建了一个 Dockerfile ,在这里我执行了那些命令,复制了为服务模型准备的内容并启动了服务器。如果要创建 Docker 映像,请执行以下命令:

cd tf_serving_keras/model_serving
<activate your Python environment>
python dog_breed_detector_trainer.py
docker build -t model-serving:latest -f Dockerfile .

Node.js 包装服务的 Docker 图像

包装器服务的 Dockerfile 基于节点 8.11.3 镜像。它将源文件复制到映像,构建它们并启动服务。没什么特别的,都是标准的。

角度应用的 Docker 图像

我的应用程序的 Dockerfile 使用了多阶段构建。首先,我们使用 Node 8.11.3 image 构建应用程序,然后使用 Nginx image 将其隐藏在 Nginx 服务器后面,这在生产环境中很有意义。

将它们组合在一起

我们不会也不应该一个接一个地创建 3 个 Docker 容器。相反,我们将它们组合在一起,并用 Docker Compose 使它们彼此可见。在 docker-compose 文件中,我有 3 个服务,属于同一个网络。应用依赖于包装器服务,包装器服务依赖于 TensorFlow 服务。这些服务公开了容器端口,并且可以通过它们的名称相互通信。

要运行完整的应用程序,请执行唯一的命令

cd tf_serving_keras
docker-compose -f docker.compose.yaml up

打开浏览器,进入本地主机。您应该能够看到应用程序,选择图像并看到结果。不要忘记关闭容器

docker-compose -f docker.compose.yaml down

尝试 TensorFlow Serving 1.8 及其 RESTful API

当我准备好我的实现时,我发现从 1.8 版本开始 TensorFlow 服务也提供了 RESTful API。这是一个相当新的功能,我想尝试一下。

不幸的是,它有一些问题。首先,对于 CORS 机制,您必须有一种特殊的代理,因为您不能更改服务器代码。最受欢迎的是 cors-anywhere 。我创建了一个小包装器并将其打包到 Docker 容器中。如前所述,我在应用程序中实现了一个客户端,它通过 REST 直接与 TensorFlow 服务器对话。

其次,应该将图像数据包含在发送给服务器的 JSON 对象中。对于大图像,这不是一个正确的方法,我总是倾向于使用多部分/形式数据来实现这个目的。

如果您想尝试,请查看客户端源代码,并使用

docker-compose -f docker.compose.cors.yaml up

GPU 支持

如果你有一台装有 NVidia 显卡的电脑,并且安装了 CUDA 和 CUDnn 库,那么我们也可以在 Docker 中使用它们。但是我们需要做一些准备:

curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
  sudo apt-key add -distribution**=$(**. /etc/os-release;echo $ID$VERSION_ID**)**curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.listsudo apt-get updatesudo apt-get install nvidia-container-runtime
  • 通过 Docker 注册该运行时。我对守护程序配置文件使用了该方法:
sudo tee /etc/docker/daemon.json <<EOF
{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
EOF
sudo pkill -SIGHUP dockerd

现在快跑

docker-compose -f docker.compose.gpu.yaml up

你应该得到一个 GPU 驱动的应用程序版本。你可以在资源库中找到支持 GPU 的 DockerfileDocker-compose 文件。

注意:可能需要几个小时才能看到系统启动并运行。原因是——我们仍然需要编译 TensorFlow 的 GPU 版本来创建一个合适的 Docker 图像。

结论

对我来说,实现从 Keras 模型到 UI 的完整深度学习应用程序是一次很好的体验。我尝试和使用了一些新的东西,并且为了在本地运行和测试所有东西,我需要解决一些挑战。我希望这对您的目的也有用:-)

从迷因到机器:将我们自己转移到人工智能宠物

原文:https://towardsdatascience.com/from-memes-to-machines-transferring-ourselves-to-our-ai-pets-1a9578279f93?source=collection_archive---------2-----------------------

“人无想法,想法有人。”—卡尔·荣格

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

理查德·道金斯在他的书《自私的基因》中谈到了一种迷因**。他将迷因定义为任何在人类文化中表现得像基因的东西。**它有一种繁殖机制,通过几代人的突变、繁殖或减少来实现。他说的目的是淡化基因是自然选择的唯一单位。

模因可以像曲调一样简单,也可以像文化意识形态一样复杂。我们的身份与拥有我们的迷因密切相关。即使缺乏基因相似性,我们还是会强烈偏向那些分享我们认为重要的迷因的人。如果一个家庭成员被一种对立的迷因如政治观点所占据,我们可以认为他们是蔑视。我们甚至会对那些分享表面模因的人表现出偏见,比如喜欢同一个音乐艺术家或运动队。

我们不能用机器进行生物繁殖,但将我们的迷因传递给我们的人工智能后代可能同样令人本能地满足。由于诸多不便,生物繁殖在高智商人群中已经过时了。这是痛苦的,它使我们的心智能力紧张,使社会交往紧张,减少了我们的物质资源。然而,生孩子被认为是我们能拥有的最有意义的经历之一。既然如此多的人致力于他们的事业,我们可以说,在这些个体中,模因的培养比生物繁殖的经验更丰富。

机器的迷因

我设想这个过程是在虚拟环境中进行的训练,在虚拟环境中,我们通过与我们有高度相似情绪控制输出的虚拟宠物来传递我们的想法。就像电影中的动画角色一样,它的身体将能够合成类似人类的表情和声音。然而,与电影中的角色不同,我们将教虚拟宠物他们表情的含义。

从一些基本技能开始,人工智能将把我们脸上的表情、声音和我们展示给他们的图像拼凑在一起。由此,他们将合成他们自己的表达方式,他们将因此受到我们的奖励和谴责。

这个过程将非常类似于从出生起抚养一个被收养的孩子。尽管没有生物学上的联系,但通过共同的经历和模因的传递,人们会感到一种亲密感。

这个可数字化定制的宠物将被设计成保存我们的迷因,并以一种独特的方式向我们表达新的、令人愉快的想法,但有一些问题很难忽视。如果人工智能宠物根据我们教给它的东西对道德状况做出反应,那么人工智能本身有道德吗?道德是需要同理心还是仅仅是一种技能?

可以说,道德是因为社会原因而进化的。它提供了一个共同的界面,让我们一起工作,以收集更多的资源。

人工智能将通过迷因与我们互动,其中最重要的是道德准则,以实现共同繁荣。饲养人工智能宠物的过程将在人和机器之间产生深刻的人类共性。本质上,通过培养一个虚拟的 AI,我们正在设计理想的交流界面。

无痛苦的养育?

我想把这个想法延伸到一个有些人可能认为亵渎神明的问题。如果我们如此巧妙地设计这种体验,以至于成为一个人工智能的父母比成为一个亲生父母更让人本能地满足,那会怎样?如果我们把它设计成最小化痛苦和最大化便利呢?

这一过程的成功是否意味着我们的灭绝或进化,或者两者都不是?最终结果会带来一个“耶稣基督”的人工智能吗?一个完美的人,他的每一个动作都代表着我们所信仰的理想。好莱坞如此痴迷于邪恶的人工智能,我想知道他们是否想过世界上有耶稣基督的可能性。毫无疑问,它不会那么引人注目。

耶稣对世界

自从我的我已经开始问亵渎神明的问题:如果一个虚拟的国家充满了耶稣基督,需要多少个人工智能魔鬼才能摧毁它?我们会发明一种可怕的箔片来对抗它吗?

结论

在这篇文章中,我可能掉进了哲学思考的兔子洞(毫无疑问,有些是有价值的),但我目前感兴趣的主要问题是将我们的迷因转移到我们的机器上的工程问题。这是一个需要很长时间来实现的过程,我可能永远没有机会,但我会在未来的帖子中提出一些想法。

从中年母亲到编码学员:通过技术重塑

原文:https://towardsdatascience.com/from-middle-aged-mom-to-coding-mentee-reinvention-through-tech-77b3e5772240?source=collection_archive---------3-----------------------

作为一个女人,一个母亲,一个中年人,我一直想恰当地讲述我的重塑故事。把你以前的大部分职业选择抛向空中,让它们随风而去,然后选择新的(有挑战性的)东西,这不适合胆小的人。但这令人振奋,也许会激励更多处于职业生涯中期的人考虑做出类似的转变。我要感谢 Chipy 导师项目让我开始记录它——我很幸运被选为今年秋季的学员之一,写博客是项目要求之一。

Oh those career choices…just some weed seeds, blowing away in the wind of change…

多年来,我是一名文科和艺术学院的大学教授,陷入了一个经典的兼职陷阱——在多份工作之间奔波,试图找到足够的工作来维持生活。在那之前,我是博物馆馆长。我有文化史博士学位。这些似乎都不能为转向编码或数据科学工作奠定基础。但我一直对数据充满热情,对更好的东西有着贪婪的胃口。我研究的课题之一是广义上的地图,这当然是数据可视化的一种形式。从当地政治到食品合作社的志愿者项目工作让我接触到了更高层次的 Excel,从命令行工作,并创建我自己的图形和图表。

Phoenix from the flames???

当我在学术生涯中筋疲力尽时,我看看我能做些什么。我自学了如何用 Wordpress 制作一个基础网站,并为我的学术研究积累了一个关注的重要社交媒体(有趣的是:我的成名是因为我是一名纹身历史学家)。我开始寻找自由职业的机会。一个老朋友把我和她的一个老朋友联系了起来,一个新的职业生涯开始了。

我成了众包人体图像网站MyBodyGallery.com的唯一正式员工。你可以在我为新妈妈们可以编码项目写的的短文中读到更多关于这方面的内容。在这里可以说,它打开了许多大门,从了解定制代码站点的后端到学习如何使用 SQL。我知道下一步是解决正确的编码。我对数据的兴趣和经验使得数据科学训练营变得显而易见。我选择了大会的,并彻底享受了这种体验(即使连续三个月每周 5 天都要上课,每天晚上都要做作业,每个周末都要做项目,这种睡眠剥夺让我想起了身为婴儿父母的痛苦)。

I’m not sure I’ve been able to take a proper nap since February…zzzzzzzzz….

我为我在训练营的顶点项目感到自豪——它将我的纹身研究与数据科学结合起来,为一个计算器创建了一个预测模型,它将告诉一个崭露头角的作者有多少图书馆最终可能拥有他们的书……仅仅基于书名。它并没有成为我所希望的工具的全部,但是它确实有助于标题的选择。你可以在我的 Github 上了解更多信息。

但是和大多数 bootcamp capstone 项目一样,我甚至没有足够的时间来真正做我想做的事情:让这个计算器真正出现在现实世界中。我想把它放在我创办的一个新生的数字人文基金会的网站上,这个基金会就是纹身历史和文化中心。这就是 Chipy 导师计划的用武之地。我很高兴能成为 web dev track 的一员,在那里我开始将这些技能添加到我的工具包中(感谢 Joe Jasinski 作为我非常耐心和有帮助的导师)。现在这有点令人生畏,但我总是喜欢陡峭的学习曲线。请继续关注,看看这个计算器是如何工作的!

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

A mock-up of what the calculator page might look like

如果我不抓住这个机会谈一谈重返学校和抽出时间学习编程的斗争,同时又是一个单身母亲,那我就是失职了。命运给了我一个耐心而独立的女儿,她能理解妈妈的忙碌,并能忍受被拖着去面对各种情况。营业时间训练营起作用了,因为她在学校的时候我也在学校。Chipy 非常乐于助人,让她跟我一起参加了我的第一个 Python 项目之夜。她花了一个晚上的时间建造了一个新的《我的世界》世界,然后在会议结束时带他们参观了一下这个世界,交了几个成年朋友(冥界之门和龙蛋之类的东西)。Chipy 董事会非常乐于看到他们是否可以开始正式的儿童保育或教育经历,以帮助处于类似情况的其他人(感谢雷·伯格把我的想法带给整个董事会)。我已经让这位老姐参加了几个编码营和精彩的编码、游戏、学习的课程,也许她可以在未来几年帮助解决技术领域的性别失衡问题。我希望通过看到我永不停止学习和挑战自己,她不会满足于一个没有出路的职业生涯。也许在我参加这个项目的几个月里,她可以代替那只花栗鼠成为花栗鼠的吉祥物:)

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

Shout-out to Target’s excellent Cat and Jack brand for the “Create with Code” shirt (these are Lego sculptures the kiddo made while she was hanging at General Assembly on a no-school day)

从范数到正交性:带有直观例子的机器学习基础数学第 2/3 部分

原文:https://towardsdatascience.com/from-norm-to-orthogonality-fundamental-mathematics-for-machine-learning-with-intuitive-examples-57bb898e69f2?source=collection_archive---------9-----------------------

为了理解机器学习算法的数学,特别是深度学习算法,从基础到更高级建立数学概念是必不可少的。不幸的是,数学理论在许多情况下太难/抽象/枯燥,难以消化。想象你正在吃一个比萨饼,喝一杯可乐总是更容易和更有趣。

这篇文章的目的是为基础数学理论提供直观的例子使学习体验更加愉快和难忘,那就是鸡翅配啤酒,薯条配番茄酱,里脊配葡萄酒。

包含 3 门课程的机器学习基础数学课程组织如下:

从标量到张量:带有直观例子的机器学习基础数学第 1/3 部分

  • 什么是标量、矢量、矩阵和张量?
  • 标量、向量和矩阵之间的加法
  • 标量、向量和矩阵之间的乘法
  • 单位矩阵和逆矩阵
  • 对角矩阵和对称矩阵

从范数到正交:带有直观示例的机器学习基础数学第 2/3 部分

  • 向量的 1-范数,2-范数,最大范数
  • 正交和标准正交向量
  • 正交矩阵

从特征分解到行列式:带有直观例子的机器学习基础数学第 3/3 部分

  • 矩阵的特征分解:特征值和特征向量
  • 跟踪运算符
  • 方阵的行列式

在本文中,我们将通过直观的例子,从范数到正交性讨论第 2/3 部分**。**

向量的 1-范数,2-范数,最大范数

如何度量一个矢量的大小?一种方法是使用范数函数:

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

  • 1-范数:在机器学习应用中,当 0 和非 0 元素之间的差异很重要时,通常使用 1-范数。

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

例如,向量 v 的 1 范数可以计算为:

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

  • 2-范数:通称欧氏范数,是原点到向量 x 所标识的点的欧氏距离。

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

Photo credit to wikipedia

通常使用平方 2-范数而不是 2-范数本身来度量向量的大小。原因是平方 2 范数可以计算为:

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

这比计算 2-范数本身更方便。下面的例子说明了如何计算向量 v: 的 2-范数

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

  • 最大范数:向量中元素的最大绝对值,可以写成:

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

下面的例子显示了向量 v: 的最大范数的计算

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

正交和标准正交向量

向量 u 和向量 v 彼此正交当且仅当它们的点积为 0:

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

例如,在三维欧几里得空间中,

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

在几何学中,两个正交向量在欧几里得空间中相互垂直:

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

Photo credit to ubisafe

向量 u 和向量 v 是一对正交的向量的意思是:

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

它可以扩展到 3-D 欧几里得空间中的下列方程:

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

举个例子,

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

因此,我们说,向量 u 和向量 v 是正交的。

正交矩阵

正交矩阵是行和列正交的正方形矩阵:

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

例如,以下矩阵是正交的,因为:

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

这意味着如果一个矩阵的转置等于其逆矩阵,则该矩阵是正交的:

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

因此,正交矩阵是机器学习中感兴趣的,因为矩阵的逆的计算非常便宜。我们需要注意的是,正交矩阵中的行和列不仅是正交的,而且是正交的。

恭喜你!你已经用直观的例子完成了机器学习基础数学的三分之二。你能做到的!

下一步: 从特征分解到行列式:带有直观例子的机器学习基础数学第 3/3 部分

从病人到 Python:成为“数据科学家博士”的思考

原文:https://towardsdatascience.com/from-patients-to-python-thoughts-on-becoming-a-dr-data-scientist-d01aa583b08a?source=collection_archive---------2-----------------------

“当我长大后,我想成为一名医生,因为我想让我的灵魂迷失在点击通知和写便条中。”

说没有孩子。

回到我的时代,我们住院医生用纸和笔写笔记。我们对图表的抱怨包括在特别长的 H+Ps 后严重的手抽筋,或者试图辨认难以辨认的鸡肉划痕。你可以想象当医院转向电子健康记录时我们的喜悦心情(EHR)。对我来说,在 AOL IM 和在线视频游戏中长大后,打字变得轻而易举,笔记也终于清晰可辨。

然后一些邪恶的想法开始给 EHR 增加“功能性”。

几年后,“功能性”导致了我们今天看到的 EHR 这个九头蛇怪物。你砍掉了一个脑袋,解决了一个订单输入故障,EHR 九头蛇又长出了三个脑袋,在它们的位置上弹出了通知窗口。

我正在为执业医师量身定做这个职位。如果那是你,那么我正在向唱诗班宣讲当前的医疗保健基础设施对我们的工作流程和患者护理的影响。然后,你会明白为什么我想在十年的医学训练后回到学校。如果我们要给系统带来改变,并说服我们的同事改变现状,那么我们最好知道我们到底在说什么。

为什么是数据科学?

也许是 2012 年《哈佛商业评论》的标题,“数据科学家:21 世纪最性感的工作”唉,我后来才知道,不是所有的数据科学家都生来平等,也不是所有人都天生性感(尽管我们在努力)。数据科学不是固定的描述;这是一个连续体。它涵盖了从清理和组织数据、限制统计分析中的偏差等极其无趣的事情,到有效地向你的受众传达可操作的发现。熟悉从原始数据到有意义的结论的流程似乎比在游戏的后期追求一个直接的编程学位更有用。

选择加州大学伯克利分校的数据科学硕士( MIDS )项目并不难。虽然听起来不像他们会说话的头,但我真的,真的,真的很喜欢做 MIDS 的学生。它仍然是一个相对年轻的项目,课程不断发展,并且是在线的(除了沉浸周,在那里你可以与科技公司接触),但它在一个国际知名的机构提供了坚实的课程和令人惊叹的师资,有大量的社交机会。不要告诉我不知道你的在线课程的同学——当你两年来每周都看到相同的人时,你会情不自禁地结交一些亲密的朋友(大声喊出 socal-4eva 和 da-mids slack channels!).

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

MIDS Immersion Week 2017, whereeveryone looks wierd in 3D

所以,对于所有执业医师来说,你应该如何对待这个进入科技世界的信念飞跃呢?

现实一点。

首先,你需要评估你的技能、金钱和时间。举个例子,我有一个博士后研究员基金,这个基金比我作为全职临床医生的正常收入低 30%。另一方面,我一个月有 3 周的研究时间。你可以尽情嫉妒,但请记住,当你开着玛莎拉蒂的时候,我还在吃拉面和鸡蛋(或者至少在为一辆玛莎拉蒂付款)。但我从未上过编码或计算机科学(CS)课程,我认为时间应该是最重要的。你的资助也是一个考虑因素,因为研究生课程并不便宜。当然,Coursera、Udacity 和 Khan Academy 的在线课程非常优秀,许多数据科学家都通过他们的教学促进了自己的职业发展。交几千拿个证好还是交几万拿个毕业证好?作为一名医疗科技行业的新人,我迫切需要在简历上获得街头信誉,所以我选择了后者。

要谦虚。

你不再是精英了。一点也不接近。当然,你挺过了医学院、住院医师和董事会,但是假设你真的没有任何计算机科学背景,当你还在疯狂地谷歌"如何做矩阵乘法"时,你知道比你小 15 岁的孩子将会讨论 LSTM 矩阵的维数我花了几个星期才明白,你可以通过点击 tab 键来自动完成命令行。老实说,我只是觉得我的教授打字非常非常快。不要让我开始参加 Kaggle / kegel 竞赛。最后,准备好 1:3 的家庭作业时间比例——你的同学花在家庭作业上的每一个小时,你都要花三倍的时间。虽然我不想说太多,但现在重温这一点还为时过早。

坚持不懈。

在我的第一个 Python 入门课程中,我认真考虑过放弃,如果我不是更讨厌放弃的话,我会放弃的。有时候,特别是当我住院和随叫随到的时候,抽出时间去上课或参与集体项目是如此的令人生畏,以至于我想蜷缩成一团哭出来。相反,我给自己倒了一杯威士忌,然后开始喝。这很像医学院,在那里学习不是短跑;这是一场马拉松。

不要脸。

对于医生来说,我们的招聘信息相当简单。事实证明,对于未来如何使用自己的数据科学技能,需要进行大量的自我反省。当我面对我在这个项目上投入的金钱和时间,却发现没有适合我描述的人的工作时,我没有预料到那段深深的、黑暗的绝望时期。我不符合数据科学家的特征,精通 SQL,对机器学习(ML)技术了如指掌。我也不是医学信息学家,他们对 EHR、SNOMED 和其他领域的所有东西都有深刻的理解。因此,在毕业前一年,我开始随机联系医疗技术行业的人或数据科学家。如果我在 techcrunch 上读到一篇关于他们的文章,或者看到一个转发的帖子引发了我的兴趣,我会联系他们。在我的巅峰时期,我每周发出 5-10 条信息,大约有 5%的回复,这导致了 30 分钟的电话聊天或谷歌聊天。在这样做了整整一年后,一些随机的信息让我收到了一些采访请求,其中包括一个关于我未来的家 Curai 的请求,我非常兴奋和感激几个月后就可以开始工作了。

冒名顶替。

进入硅谷是令人生畏的。在 SV 有很多聪明的人,他们似乎都互相认识并且穿着 Allbirds 。此外,每三个人中就有一个以几百万美元的价格卖掉了一家初创公司。当你遇到有工程学或计算机科学背景的了不起的医生时,我会想,“谁他妈的需要我?”我那了不起的丈夫改变了我的想法,他向我介绍了“骗子综合症”的概念,在这种情况下,我们不合理地低估了自己的表现和才能。查一下吧,它发生在我们最好的人身上。

要骄傲。

这是我从这次经历中得到的最重要的教训——有很多才华横溢的软件工程师和统计学家可以让我的基本逻辑回归和张量流图相形见绌。但当面对这样的疑问时,我想起了当初为什么要投身数据科学。我可以带来一些纯数据科学家做不到的东西。医疗保健系统需要像你和我这样的人,他们从临床战壕中幸存下来并理解 NLP 和 ML 概念,因为我们可以帮助将我们在医院或患者护理中看到的问题转化为工程师、统计学家、首席执行官、风投、UI 开发人员和其他重要决策者可以理解的术语。有了这些超能力,我们可以开始改变医疗保健系统,这是我们医生知道我们需要的。

祝你好运,希望胜率永远对你有利。

以最小的努力从科学到生产

原文:https://towardsdatascience.com/from-science-to-production-in-minimum-effort-acc9d0db6ec2?source=collection_archive---------20-----------------------

热链接:
-
--丹泽尔部署框架-

在过去的一年里,我在我工作的组织中完成了许多数据科学项目,我花了数百个小时与数据科学家同事一起工作。
由于数据科学领域非常年轻,所以我的同事以及一般的数据科学家来自不同领域也就不足为奇了。数学、统计学、物理学甚至心理学,这种多样性是非常积极的,因为每个人都从各自的领域带来了自己的优势和观点。我自己来自软件工程,这自然让我从一个工程师的角度来审视过程。

理工科之间的差距

完成一个数据科学项目需要很多技能。
一个人应该对算法的本质有数学理解和直觉,拥有创建和测试问题假设的统计知识,熟悉算法和最先进的解决方案等等。
要成为一名优秀的数据科学家,工程和编程技能不一定要达到专家级水平。不知道什么是 HTTP 动词,不知道如何管理工作人员和经纪人的任务队列,也不知道如何构建浏览器中的监控仪表板,完全有可能成为顶级的现场研究员。另一方面,生产系统需要相当高级的工程技能。

从我的工程角度来看,我已经注意到,一旦数据科学项目必须从研究阶段进入生产阶段,科学和工程之间的差距就会显现出来。
我见过数据科学家与框架斗争,花费不必要的时间学习超出他们必要技能范围的工具。
另一方面,我看到生产团队(来自数据科学家团队)交付的项目,他们不理解也不知道如何整合到他们组织的生产周期中。
由于这个问题是真实存在的,并且经常发生,我决定采取措施,用开源 Python 包来弥补这个差距。

见见丹泽尔

在我打开以德古拉为主题的编辑器开始编写框架之前,我已经坐下来定义了需求:

  1. 首先是数据科学家。对于数据科学家来说,框架应该有尽可能少的学习开销,并抽象出繁重的工作。
  2. 又瘦又快。框架内的开发应该是快速的,结果应该尽可能的精简。
  3. 生产就绪。使用生产级的工具和实践,它的输出应该能够很容易地交付给生产工程师使用。

三个要求,几十个小时的代码,几个月的测试和真正的生产使用,后来丹泽尔包诞生了,现在开源供公众使用。

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

Denzel 是部署机器学习训练模型的最小框架。
一旦你有了一个保存在磁盘上的训练好的模型,你需要做的就是实现四个简单的 Python 函数,丹泽尔会给你:

  1. 码头集装箱化项目
  2. 向最终用户公开 API 以与您的模型进行交互
  3. 任务管理系统排队并执行预测
  4. 在浏览器 UI 仪表板中监控您的部署

这里的一个重要方面是码头集装箱化的结果。这意味着任何知道如何在生产中管理 docker 容器的人都可以应用任何生产工具(如 Kubernetes、Rancher 等)。)以及在任何地方扩展和部署项目的无限可能性。此外,所有主要的云提供商都支持 docker 部署。所有这一切都不需要数据科学家自己学习 docker、API 构建、任务管理或 UI 设计。

该项目得到了我的雇主数据科学集团有限公司的全力支持,目前正在许多不同的部署中使用。
它为我们的数据科学家节省了大量不必要的时间,并为我们的客户提供了一种将我们的解决方案集成到他们的生产系统中的便捷方式。

Denzel 目前处于 alpha 阶段,这意味着功能仍将被添加到其中,开源是了解数据科学界真正需要它的最佳方式。

为了使用它,查看文档,尤其是教程,一个小时左右加上 60 行代码之后,你就可以部署你的模型了。

希望你喜欢这次阅读,丹泽尔将为你服务。

部署愉快:)

从 Scikit-学习到 TensorFlow:第 1 部分

原文:https://towardsdatascience.com/from-scikit-learn-to-tensorflow-part-1-9ee0b96d4c85?source=collection_archive---------1-----------------------

介绍

在过去的一年半时间里, TensorFlow 无论是在采用率还是在计算速度方面都以惊人的速度增长。

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

Image Source: Unreasonable Popularity of TensorFlow [http://deliprao.com/archives/168]

TensorFlow 已经成为最受欢迎的机器学习(ML)算法开发库。然而,它似乎也把自己建立成了一个库,需要对会话和图形进行定义,这是相当乏味和耗时的。虽然它在有效计算梯度以训练CNNRNNslstm方面做得很好,但这还不是全部。

在这一系列帖子中,我想讨论如何将 TensorFlow 用作通用 ML 库。更具体地说,我们将讨论它如何类似于 scikit-learn ,另一个在数据科学家和开发人员中非常流行的 ML 库。

转向 TensorFlow 的理由

虽然 scikit-learn 拥有高度优化的算法,但在面对大量数据点时,它缺乏扩展能力。然而,TensorFlow 提供了许多优于 scikit-learn 的优势:

  • 高性能 ML 模块
  • 可定制性
  • 纵向扩展以满足大数据点的需求
  • 能够利用 GPU 并在地理上分散的 GPU 设备之间进行培训
  • 设备无关计算
  • 利用 Google Cloud 在训练好的 ML 模型上进行推理
  • 高度灵活的 Apache 2.0 许可而 scikit-learn 是基于 BSD 许可(虽然两者都是商业可用的,但是 Apache 2.0 不太容易出现专利诉讼)

目标

  • 了解 scikit-learn 和 TensorFlow 之间的相似功能,这些功能将允许 scikit-learn 用户无缝使用 TensorFlow。
  • 使用 scikit-learn 和 TensorFlow 开发一个程序来对来自鸢尾花数据集的花卉品种进行分类,以了解构建这样一个系统所需的工作。
  • 展示 TensorFlow 如何简单地实现新想法的原型。

功能级相似性

scikit-learn 受欢迎的原因之一是由于它的简单

classifier.fit() / classifier.predict() 

对于所使用的任何分类器都保持不变的方法。这种简单的用户体验使开发人员能够专注于算法及其参数,而不是担心需要调用哪些 API 来完成手头的任务。

另一方面,我们在 TensorFlow 中有受 scikit-learn 启发的高级 API 。TensorFlow 中的这些函数的工作方式与 scikit-learn 非常相似,具有类似的 fitpredict 方法以及允许进一步微调的其他功能。

在我们深入研究使用 TensorFlow 的高级 API 调用开发我们的分类框架之前,让我们讨论一下 TensorFlow 的低级计算框架。TensorFlow 使用计算图来执行所有计算。计算被表示为tf.Graph对象的实例,其中数据被表示为tf.Tensor对象,并且使用tf.Operation对象对这些张量对象进行操作。然后使用tf.Session对象在会话中执行该图。很明显,使用 TensorFlow 的低级 API 创建一个分类框架需要测试一个简单的 ML 原型。这也是我们讨论 TensorFlow 的高级 API 与 scikit-learn 的 API 进行对比的原因之一。我们将在以后的文章中讨论低级 API 及其用法。

示例代码

我们使用 scikit-learn 的 SVM 模块和 TensorFlow 的高级 API 构建了一个分类器,根据花的特征对花进行分类。在这种情况下,数据集提供了 4 个不同的特征,如萼片宽度萼片长度花瓣宽度花瓣长度,以将花分类为三个花卉品种之一(鸢尾、杂色鸢尾海滨鸢尾)。)

这个项目的代码可以在我的 GitHub 页面上找到。

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

Image source: TensorFlow Quickstart [https://www.tensorflow.org/get_started/tflearn]

如果我们看看上面 GitHub 链接上的笔记本,我们可以看到数据加载和拆分功能是由两个框架共享的。我们在 scikit-learn 中定义了一个 SVM 分类器,如下所示:

*# ------------------------------------------*
*# Scikit Learn Implementation*
*# ------------------------------------------*
*# Use support vector classification*
classifier_sk = svm.SVC()*# Use the train data to train this classifier*
classifier_sk.fit(x_train, y_train)*# Use the trained model to predict on the test data*
predictions = classifier_sk.predict(x_test)
score = metrics.accuracy_score(y_test, predictions)

在上面的代码片段中,我们简单地定义了一个支持向量分类器 svm。SVC() ,其对象用于训练和预测。使用 fit() 实现训练,而使用 predict() 方法调用实现预测。我们最后计算这个四行代码片段最后一行的精度值。

另一方面,在 TensorFlow 中,我们可以使用深度神经网络(DNN)分类器来完成相同的任务。我们使用 TensorFlow 的 contrib 模块下的 DNNClassifier 如下:

*# ------------------------------------------*
*# TensorFlow Implementation*
*# ------------------------------------------**# Extract the features from the training data*
feats = tf.contrib.learn.infer_real_valued_columns_from_input(x_train)*# Building a 3-layer DNN with 50 units each.*
classifier_tf = tf.contrib.learn.DNNClassifier(feature_columns=feats, 
                                               hidden_units=[50, 50, 50], 
                                               n_classes=3)*# Use the train data to train this classifier*
classifier_tf.fit(x_train, y_train, steps=5000)*# Use the trained model to predict on the test data*
predictions = list(classifier_tf.predict(x_test, as_iterable=True))
score = metrics.accuracy_score(y_test, predictions)

在上面的代码片段中,我们可以看到如何为几乎相同数量的行(构建 DNN,除了用于将输入数据转换为要素的附加行。)这一额外的行完成了将输入数据转换成密集的、固定长度的浮点值的任务。

向张量流迁移的路径

虽然从一个框架转移到另一个框架的任务通常令人畏惧,有时令人沮丧,但 TensorFlow 似乎有一座桥梁,允许开发人员从一个不同的框架平稳过渡。 contrib.learn 模块提供了这样一个桥梁,允许从 scikit-learn 或 Keras 到 TensorFlow 的熟悉路径。

TensorFlow 还具有足够的适应性,可以包含针对生产质量使用进行了高度优化的阅读器,同时支持 ML 社区使用的大多数文件格式。这使得开发人员可以避免依赖其他框架,如熊猫(它完成了读取文件的繁重工作,但仍然需要手动将数据输入 ML 框架。)在今年早些时候举行的 TensorFlow 开发峰会上,TensorFlow 阅读器也表现出了高性能。

摘要

在这篇文章中,我们开始探索使用 scikit-learn 和 TensorFlow 开发一个分类器来完成一个简单的任务。我们讨论了高级 TensorFlow API 如何类似于 scikit-learn 的 API。你可以在我的 GitHub 页面访问这篇博客中讨论的代码。

在下一篇文章中,我打算介绍更多的 scikit 模块及其 TensorFlow 对应模块。你有什么特别的想法吗?给我发推特 @krtk 或者在 LinkedIn 上联系我。

从 Scikit-学习到 TensorFlow:第 2 部分

原文:https://towardsdatascience.com/from-scikit-learn-to-tensorflow-part-2-66c56985d6c7?source=collection_archive---------1-----------------------

从我们离开的地方继续,我们从 scikit-learn 开发人员的角度更深入地研究如何使用 TensorFlow 开发机器学习(ML)算法。如果您想知道迁移到 TensorFlow 的原因、动机,请阅读我之前的帖子,了解迁移到 TensorFlow 的原因和一个简单的分类程序,该程序强调了 scikit-learn 和 TensorFlow 开发的相似性。

在之前的文章中,我们比较了 scikit-learn 和 TensorFlow 中 fit 和 predict 范式的相似性。在这篇文章中,我想展示我们可以用 Scikit-learn 的数据处理和报告工具开发一个 TensorFlow 分类框架。这将提供一个很好的方法来交织这两个框架,从而得到一个简洁明了的框架。

利用机器学习

机器学习(ML)问题无处不在。然而,这里的问题是,一旦你开始用 ML 解决问题,每一个新问题看起来都像是 ML 问题,就像那句老话所说的:

如果你只有一把锤子,所有的东西看起来都像钉子

一个理解 ML 的人和一个使用 ML 的人有一个重要的区别,那就是,当不是使用 ML 来解决问题的时候。如果您可以通过简单的规则轻松地找到解决方案,那么您可能不需要使用 ML。例如,你不需要一个 ML 算法来预测所有的自行车和汽车交通方式或者用正确的拼写替换常见的拼写错误的单词。

如果规则变得难以处理,并且如果有太多的参数来确定这样的规则,我们需要 ML。例如,我们将要求 ML 预测明天的天气,因为它取决于许多因素,如季节、地点、其他因素,如厄尔尼诺,这使得编写规则很困难,而且往往不准确。我们可能需要 ML 的另一个例子是当数据变得人类不可能仔细阅读并找到模式时,这是 ML 似乎做得很好的一个领域。以电子邮件垃圾邮件火腿为例,我们根据电子邮件中的文本(正文+主题)将电子邮件分类为垃圾邮件。如果垃圾邮件的模式是有限的,这个任务就很容易。然而,发送此类电子邮件的“王子”往往会找到新的方法让我们都变得“富有”,这使得我们有必要开发 ML 框架来帮助我们对抗垃圾邮件。

说了这么多,让我们来看看一个本来就很难发现规则的问题,以及一个获得高精度和召回率的棘手问题。

问题是

我们将使用威斯康星州乳腺癌诊断数据检测癌症的存在。这个数据集是一个二元分类问题(恶性或良性),有 569 个实例(数据点),允许我们执行分类任务。

这篇文章中描述的所有代码都可以在我的 GitHub repo 这里获得。

数据处理-sci kit-learn

我们利用 Scikit-learn 的高效数据加载工具来获取我们的数据。乳腺癌数据集可在这里获得。Scikit-learn 允许我们加载的其他数据集的列表可以在这里找到。让我们加载数据集并查看数据的一些属性。

from sklearn.datasets import load_breast_cancer
cancer_data = load_breast_cancer()print("Number of instances in the dataset: %d" % len(cancer_data.target))>> Number of instances in the dataset: 569 

让我们讨论一下在训练数据之前,按原样使用数据与扩展功能的影响。缩放数据可以使特征标准化。这意味着数据以零为中心,并调整到标准偏差为 1。换句话说,我们将数据限制在[0,1]之间,而不改变数据的原始分布。这确保了分类器不会在大维度空间中搜索最优权重,而是将搜索空间限制在[0,1]之间。这种缩放对分类器的性能有很大的影响,这可以在下面的实验部分看到。我们尝试了两个实验,一个有特征缩放,另一个没有特征缩放。

实验一:按原样使用数据[D1]

我们按原样使用来自 SKLearn 的数据,使用内置的训练、测试分离器简单地加载变量

from sklearn.model_selection import train_test_split
in_train, in_test, out_train, out_test = train_test_split(cancer_data[‘data’], 
 cancer_data[‘target’])

实验二:缩放数据[D2]

对于第二个实验,我们使用 SKLearn 中可用的预处理功能来缩放数据。

from sklearn.preprocessing import StandardScaler
data_scaler = StandardScaler()# Fit train data 
data_scaler.fit(in_train)in_train = data_scaler.transform(in_train)
in_test = data_scaler.transform(in_test)

网络-张量流

我们设计了一个类似于我的早期文章的神经网络,以保持网络的简单方法,而不是理解数据预处理和过度拟合的影响。我们使用 TensorFlow 的 DNNClassifier ,它在 TensorFlow 的 contrib 模块中可用。我们定义一个有三层的网络,每层有 <个单元> 个隐藏单元。在我们的实验中,我们首先通过改变输入的预处理方式来评估以下网络的性能,其中单位=50 。然后选择性能最佳的输入进行进一步实验,以了解过拟合,其中我们保持数据不变(在 D1 和 D2 中最好)并改变单位。网络结构描述如下:

feature_columns = tf.contrib.learn.infer_real_valued_columns_from_input(in_train)
classifier_tf = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns, 
 hidden_units=[units, units, units], 
 n_classes=2)
classifier_tf.fit(in_train, out_train, steps=1000)

上面的网络所做的是定义一个全连接网络,也称为多层感知器,其输入来自我们刚刚加载的数据。多层感知器可以描述如下:

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

Multi-layer Perceptron [source: deeplearning.net]

在我们的例子中,输入是从癌症数据集加载的数据,而输出是一个二进制值,表示输入是恶性的还是良性的。

实验三:隐藏单元的数量[H1]

这两个实验的目的是了解隐藏单元的数量对每层的影响,这也将提供对过度拟合的洞察。

在这个实验中,我们首先选择 D1 或 D2(如上所述),然后改变网络每层的隐藏单元数量。这个实验的隐藏单元的数量保持在 H1=10。

实验四:隐藏单元的数量[H2]

我们用比 H1 更多的隐藏单元进行了第四次实验。这将能够适应数据中的更多变化,但是可能最终会记住数据,因此无法在测试数据上很好地执行。我们运行类似于上面 H1 的实验,然后运行 H2=50 的网络。

报告-sci kit-学习

我们使用 Scikit-learn 的报告功能来了解我们的分类器是如何执行的。我们使用分类报告和混淆矩阵来理解我们的分类器的表现。

分类报告生成一个矩阵,其中包含使用预测输出和实际输出值计算的关键指标。报告的指标是每个类别的精确度、召回率和 f1 分数,以及所有类别的平均值。

report = metrics.classification_report(out_test, predictions, 
 target_names=cancer_data.target_names)
print(report)

虽然分类报告提供了关键指标,但是混淆矩阵提供了每个测试数据点所属的类别。混淆矩阵显示了分类器在对一个类别进行预测时有多强,同时显示了分类器在对其他类别下的数据进行分类时的弱点。

# Plotting the confusion matrix using matplotlib
%matplotlib inline
confusion = metrics.confusion_matrix(out_test, predictions)# Plot non-normalized confusion matrix
plt.figure()
plot_confusion_matrix(confusion, classes=cancer_data.target_names,
 title=’Confusion matrix, without normalization’)

分类报告描述了整体性能,而混淆矩阵提供了分类到每个类别下的数据点的准确数量。

结果

我们首先进行实验,以了解数据标准化是否有助于更好的分类。因此,我们选择 H1,在 D1 和 D2 进行实验。结果如下:

与 H1+D1 的表演

 precision    recall  f1-score   support

  malignant       0.94      0.88      0.91        51
     benign       0.94      0.97      0.95        92

avg / total       0.94      0.94      0.94       143Prediction Accuracy: 0.937063

H1+D2 的表现

 precision    recall  f1-score   support

  malignant       0.96      0.93      0.95        46
     benign       0.97      0.98      0.97        97

avg / total       0.96      0.97      0.96       143Prediction Accuracy: 0.965035

从我们的实验中可以明显看出,数据缩放在分类准确性方面提供了 ~3% 的改进。这让我们选择 D2(数据与缩放)为我们的实验与 H2。

H2+D2 的表现

 precision    recall  f1-score   support

  malignant       0.96      0.92      0.94        53
     benign       0.96      0.98      0.97        90

avg / total       0.96      0.96      0.96       143Prediction Accuracy: 0.958042

技术性能分析

H1+D2 和 H2+D2 的性能指标没有提供多少关于分类器在数据点数量方面在其他类别中表现如何的洞察力。这就是混淆矩阵为进一步分析提供更好的图像的地方。

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

Confusion matrix for H2 + D2

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

Confusion matrix for H1 + D2

上述矩阵更清楚地显示了 H1 和 H2 分类器的性能差异。尽管 H2 的隐藏单元数量是 H1 的五倍,但它在测试数据上的表现却不如 H1。混淆矩阵提供了每个类别下被错误分类的点数的准确分布。

结论

在这篇文章中,我们看到了如何使用 Scikit-learn 和 TensorFlow 来执行不同的分类实验,并查看每个分类器的性能。我们还对数据预处理和网络参数进行了简单的实验,以理解不同的概念。

这篇文章中描述的所有代码都可以在我的 GitHub repo 这里找到。

让我知道你希望我在下一篇文章中讨论什么话题,请在下面评论。我在推特上,如果你想在那里和我联系的话!

从无到有:50 行 Python 中的人工智能平衡术

原文:https://towardsdatascience.com/from-scratch-ai-balancing-act-in-50-lines-of-python-7ea67ef717?source=collection_archive---------3-----------------------

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

Ours will do a little bit better than this in the end 😃

大家好!今天我想展示如何用 50 行 Python 语言教会一台机器平衡一根杆子!我们将使用标准的 OpenAI Gym 作为我们的测试环境,并且只用 numpy 创建我们的代理。

手推车杆子问题是我们必须左右推动手推车来平衡上面的杆子。这类似于在我们的指尖垂直平衡一支铅笔,除了一维(相当有挑战性!)

在我们开始之前,你可以在 repl.it 查看的最终演示。

RL 速成班

如果这是你第一次学习机器学习或强化学习,我会在这里介绍一些基础知识,这样你就会对我们在这里使用的术语有所了解:)。如果这不是你的第一次,你可以继续往下跳,制定我们的政策!

强化学习

强化学习(RL)是一个研究领域,致力于教导代理(我们的算法/机器)执行某些任务/动作,而不明确告诉它如何做。把它想象成一个婴儿,随意地移动它的腿;幸运的是,如果婴儿站直了,我们会给它一颗糖/奖励。同样,代理人的目标将是在其一生中最大化总报酬,我们将决定与我们想要完成的任务相一致的报酬。对于站立的例子,当直立时奖励 1,否则奖励 0。

一个 RL 代理的例子是 AlphaGo,代理已经学会了如何玩围棋来最大化它的奖励(赢得比赛)。在本教程中,我们将创建一个代理,它可以通过向左或向右推手推车来解决平衡手推车上的杆子的问题。

状态

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

What a game of pong looks like, in case you need a refresher

一个状态就是游戏目前的样子。我们通常处理游戏的数字表示。在乒乓游戏中,可能是每个球拍的垂直位置和 x,y 坐标+球的速度。在小车杆的情况下,我们的状态由 4 个数字组成:小车的位置,小车的速度,杆的位置(作为一个角度)和杆的角速度。这 4 个数字作为一个数组(或向量)提供给我们。这很重要;理解状态是一组数字意味着我们可以对它做一些数学运算,以决定我们想要根据状态采取什么行动。

政策

策略是一个函数,它可以获取游戏的状态(例如棋盘棋子的位置,或者手推车和杆子的位置)并输出代理在该位置应该采取的动作(例如移动骑士,或者把车推到左边)。在代理采取我们选择的行动后,游戏将更新下一个状态,我们将再次将它输入策略以做出决定。这种情况一直持续到游戏以某种方式结束。政策非常重要,也是我们所寻求的,因为它是代理背后的决策能力。

点积

两个数组(向量)之间的点积就是将第一个数组的每个元素乘以第二个数组的相应元素,然后将所有元素相加。假设我们想要找到数组 A 和 B 的点积,它将简单地是 A[0]*B[0] + A[1]*B[1]…我们将使用此操作将状态(这是一个数组)乘以另一个数组(这将是我们的策略)。我们将在下一节中看到这一点。

发展我们的政策

为了解决我们的车杆游戏,我们希望让我们的机器学习一种策略或政策来赢得游戏或最大化我们的奖励。

对于我们今天要开发的代理,我们将把我们的策略表示为一个由 4 个数字组成的数组,这些数字表示状态的每个组成部分有多“重要”(手推车位置、杆子位置等)。)然后我们将策略数组与状态进行点积,以输出一个数字。根据数字是正数还是负数,我们将向左或向右推手推车。

如果这听起来有点抽象,让我们挑选一个具体的例子,看看会发生什么。

假设手推车在游戏中处于中心位置,并且静止不动,杆子向右倾斜,并且也向右倾斜。它看起来会像这样:

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

关联的状态可能如下所示:

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

那么状态数组将是[0,0,0.2,0.05]。

现在,凭直觉,我们会想通过向右推手推车,把杆子拉直。我从一次训练中获得了一个好的策略,它的策略数组是:[-0.116,0.332,0.207 0.352]。让我们手动快速计算一下,看看这个策略作为这个州的一个动作会输出什么。

这里我们将点积状态数组[0,0,0.2,0.05]和策略数组(粘贴在上面)。如果数字是正数,我们向右推,如果数字是负数,我们向左推。

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

结果是肯定的,这意味着在这种情况下,政策也会把车推到右边,这正是我们想要的结果。

现在这一切都很好,很明显,我们需要的是 4 个像上面这样的神奇数字来帮助解决这个问题。现在,我们如何得到这些数字?如果我们只是随机挑选呢?效果如何?让我们找出答案,并开始挖掘代码!

启动你的编辑器!

让我们在 repl.it 上打开一个 Python 实例。它允许您快速调用大量不同编程环境的云实例,并在一个强大的云 IDE 中编辑代码,该 IDE 在任何地方都可以访问!

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

安装软件包

我们将从安装这个项目所需的两个包开始:numpy 帮助进行数值计算,OpenAI Gym 作为我们代理的模拟器。

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

只需在编辑器左侧的包搜索工具中键入gymnumpy,然后单击加号按钮安装包。

奠定基础

让我们首先将刚刚安装的两个依赖项导入到我们的main.py脚本中,并设置一个新的健身房环境:

接下来,我们将定义一个名为“play”的函数,它将被给予一个环境和一个策略数组,并将在该环境中播放该策略数组并返回分数,以及在每个时间步长的游戏快照(观察)。我们将使用分数来告诉我们该策略的执行情况,并使用快照来观察该策略在单个游戏中的表现。这样我们可以测试不同的政策,看看他们在游戏中表现如何!

让我们从函数定义开始,并将游戏重置为开始状态。

接下来,我们将初始化一些变量来跟踪游戏是否已经结束,策略的总得分,以及游戏过程中每一步的快照(观察)。

现在我们将简单地玩游戏很多时间步骤,直到健身房告诉我们游戏结束。

上面的大部分代码主要只是在玩游戏和记录结果。我们政策的实际代码只有这两行:

我们在这里做的只是策略数组和状态(观察)数组之间的点积运算,就像我们在前面的具体例子中展示的那样。然后我们根据结果是积极的还是消极的来选择 1 或 0(左或右)的行动。

到目前为止我们的main.py应该是这样的:

现在我们要开始玩一些游戏,找到我们的最优策略!

玩第一个游戏

现在我们有一个函数来玩这个游戏,并告诉我们的策略有多好,我们将希望开始生成一些策略,并看看它们做得有多好。

如果我们一开始只是尝试插入一些随机策略会怎么样?我们能走多远?让我们使用numpy来生成我们的策略,这是一个 4 元素数组或 1x4 矩阵。它将在 0 和 1 之间选择 4 个数字作为我们的策略。

有了这个策略,以及我们在上面创建的环境,我们可以让他们参与进来并获得分数。

只需点击 run 来运行我们的脚本。它应该输出我们的策略得到的分数。

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

这个游戏的最高分数是 500,很有可能你的政策并不顺利。如果你的有,恭喜你!今天一定是你的幸运日!虽然仅仅看到一个数字并不是很有价值,但是如果我们能想象我们的代理如何玩游戏,那就太好了,下一步我们将设置它!

监视我们的特工

为了观察我们的代理,我们将使用 Flask 来设置一个轻量级服务器,这样我们就可以在浏览器中看到代理的表现。Flask 是一个轻量级的 Python HTTP 服务器框架,可以服务于我们的 HTML UI 和数据。我将保持这一部分的简短,因为渲染和 HTTP 服务器背后的细节对于培训我们的代理并不重要。

我们首先要将Flask安装成一个 Python 包,就像我们在前面几节中安装gymnumpy一样。

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

接下来,在脚本的底部,我们将创建一个 flask 服务器。它将在/data端点上公开游戏的每一帧记录,并在/上托管 UI。

此外,我们需要添加两个文件。一个是项目的空白 Python 文件。这是 repl.it 如何检测 repl 是处于评估模式还是项目模式的技术问题。只需使用“新建文件”按钮添加一个空白 Python 脚本。

之后,我们还想创建一个index.html来托管渲染 UI。这里就不深究细节了,只是简单的把这个index.html上传到你的 repl.it 项目

您现在应该有一个如下所示的项目目录:

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

现在有了这两个新文件,当我们运行 repl 时,它应该也能回放我们的策略是如何执行的。有了这些,让我们试着找到一个最优策略!

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

策略搜索

在第一遍中,我们简单地随机选择了一个策略,但是如果我们选择了几个策略,并且只保留了做得最好的一个,那会怎么样呢?

让我们回到播放策略的那一部分,我们不只是生成一个策略,而是编写一个循环来生成几个策略,并跟踪每个策略的表现,只保存最佳策略。

我们将首先创建一个名为max的元组,它将存储目前为止我们看到的最佳策略的分数、观察值和策略数组。

接下来,我们将生成并评估 10 个策略,并将最佳策略保存在 max 中。

我们还必须告诉我们的/data端点返回最佳策略的回放。

此端点:

应改为:

你的 main.py 看起来应该类似于 this now :

如果我们现在运行 repl,我们应该得到 500 的最高分,如果不是,尝试再运行一次 repl!我们也可以看到政策平衡的极点完美无缺!哇,太简单了!

没那么快

也可能不是。在第一部分中,我们在几个方面做了些手脚。首先,我们只在 0 到 1 的范围内随机创建策略数组。这只是发生了工作,但是如果我们把大于操作符反过来,我们会看到代理将会灾难性地失败。要亲自尝试,请将action = 1 if outcome > 0 else 0更改为action = 1 if outcome < 0 else 0

这似乎不太可靠,因为如果我们只是碰巧选择了小于而不是大于,我们就永远找不到可以解决这个游戏的策略。为了缓解这种情况,我们实际上也应该生成带有负数的策略。这将使找到一个好的政策变得更加困难(因为许多负面的政策都不是好的),但是我们不再通过将我们的特定算法适用于这个特定的游戏来“作弊”。如果我们试图在 OpenAI 健身房的其他环境中这样做,我们的算法肯定会失败。

为了做到这一点,而不是有policy = np.random.rand(1,4),我们将改变为policy = np.random.rand(1,4) - 0.5。这样,我们策略中的每个数字将介于-0.5 和 0.5 之间,而不是 0 到 1。但是因为这更困难,我们还想搜索更多的策略。在上面的 for 循环中,我们不遍历 10 个策略,而是通过将代码改为for _ in range(100):来尝试 100 个策略。我也鼓励你先尝试遍历 10 个策略,看看现在用负数得到好的策略有多难。

现在我们的 main.py 应该看起来像这样:

如果你现在运行 repl,不管我们使用的是大于还是小于,我们仍然可以为游戏找到一个好的策略。

没那么快 Pt。2

但是等等,还有呢!即使我们的政策可能能够在一次运行中达到最高 500 分,它能每次都做到吗?当我们生成了 100 个策略,并选择在单次运行中表现最好的策略时,该策略可能只是非常幸运,也可能是非常糟糕的策略,只是碰巧表现非常好。这是因为游戏本身具有随机性(每次的起始位置都不同),所以一项政策可能只在一个起始位置有效,而在其他位置无效。

因此,为了解决这个问题,我们需要评估一项政策在多次试验中的表现。现在,让我们采用之前发现的最佳策略,看看它在 100 次试验中表现如何。

在这里,我们玩 100 次最佳策略(max的索引 2),并记录每次的分数。然后,我们使用numpy计算平均分数,并将其打印到我们的终端。“已解决”没有明确的定义,但应该只比 500 差几分。你可能会注意到,有时候最好的政策实际上可能是不合格的。但是,我将把修复工作留给您来决定!

完成=真

*祝贺你!*🎉我们已经成功地创造了一个人工智能,可以非常有效地解决 cart pole,而且相当高效。现在有很大的改进空间,这将是后续系列文章的一部分。有些事情我们可以深入调查:

  • 找到一个“真正的”最优策略(将在 100 个单独的行动中表现良好)
  • 优化我们必须搜索以找到最佳策略的次数(“样本效率”)
  • 对保单进行适当的搜索,而不是随意挑选。
  • 解决其他环境

如果您有兴趣在您的下一个项目中使用预训练模型和开箱即用的工作代码来尝试更多的 ML,请查看 ModelDepot

从零开始:贝叶斯推理,马尔可夫链蒙特卡罗和大都会黑斯廷斯,用 python 编写

原文:https://towardsdatascience.com/from-scratch-bayesian-inference-markov-chain-monte-carlo-and-metropolis-hastings-in-python-ef21a29e25a?source=collection_archive---------0-----------------------

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

Credit: Adi coco unsplash

你好,欢迎阅读“从零开始”系列的第一篇文章,在这里我解释并实现/构建任何从零开始的东西。

我为什么要这么做?因为在目前的情况下,我们拥有如此强大的库和工具,可以为我们做很多工作。大多数有经验的作者都很清楚实现这些工具的复杂性。因此,他们利用它们为来自不同背景的用户提供简短、易懂和切题的阅读。在我阅读的许多文章中,我无法理解这个或那个算法在实践中是如何实现的。它们的局限性是什么?为什么要发明它们?什么时候应该使用它们?

正如希拉里·梅森所说:

“当你想使用一种你并不深刻理解的新算法时,最好的方法是自己实现它,以了解它是如何工作的,然后使用一个库来受益于健壮的代码。”

这就是为什么,我提议从零开始解释和实现:贝叶斯推理(有点简略),马尔可夫链蒙特卡罗和 Metropolis Hastings,用 Python。

笔记本和 pdf 版本可以在我的知识库中找到: joseph94m

先决条件:基本概率、微积分、Python。

1-简介

在我的许多阅读中,我遇到了一种叫做马尔可夫链蒙特卡罗的技术,或者更通常的说法,MCMC。对这种方法的描述大致如下:MCMC 是一类从概率分布中取样的技术,可用于估计给定一组观察值的参数分布。

当时,我并没有多想。我想,“哦,这只是另一种采样技术”,我决定在我实际需要的时候读读它。这种需要从未出现过,或者它出现了,而我错误地使用了其他东西来解决我的问题。

1.1-那么为什么现在有兴趣呢?

最近,我看到了一些关于 MCMC 及其一些实现的讨论,特别是 Metropolis-Hastings 算法和 PyMC3 库。**Markov Chain Monte Carlo in Python 一个完整的现实世界实现,**是最吸引我注意的文章。在这篇文章中,William Koehrsen 解释了他是如何通过将该方法应用于现实世界的问题来学习该方法的:估计代表其睡眠模式的逻辑函数的参数。

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

The assumed model

Koehrsen 先生使用 Metropolis-Hastings 算法的 PyMC3 实现来计算α和β的分布空间,从而推导出最可能的逻辑模型。

1.2-那我为什么要说这些呢?

在本文中,我打算从头实现 Metropolis-Hastings 算法,为一个虚拟数据示例和一个真实世界的问题寻找参数分布。

我想如果我把手弄脏了,我也许最终能理解它。我只会用 numpy 来实现算法,用 matplotlib 来画漂亮的东西。或者,scipy 可以用来计算密度函数(我将在后面讨论),但我也将展示如何使用 numpy 实现它们。

1.3-文章的流程

在第 1 部分,我将介绍贝叶斯推理,MCMC-MH 及其数学组成部分。在第 2 部分中,我将解释使用虚拟数据的 MH 算法。最后,第 3 部分将提供 MCMC-MH 的一个实际应用。

第 1 部分:贝叶斯推理,马尔可夫链蒙特卡罗,和大都会黑斯廷斯

2.1-概率哲学的鸟瞰图

为了讨论贝叶斯推理和 MCMC,我将首先解释什么是概率的贝叶斯观点,并把它放在它的历史背景中。

2.1.1-频率主义者 vs 贝叶斯思维

概率有两种主要的解释:贝叶斯频率主义者

从频率主义者的角度来看,概率代表事件发生的长期频率。一个频繁投资者可以说,从长远来看,掷硬币得到反面的概率等于 0.5。每一个新的实验,都可以被认为是同一实验的无限可能重复序列中的一个。主要观点是,不相信一个频繁主义者的概率观点。事件 xn 次试验中发生的概率大致如下:

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

并且当 n — > ∞时达到真概率。常客永远不会说“我 45%(0.45%)确定今天午餐有千层面”,因为从长远来看这不会发生。通常,频率主义方法被称为目标方法,因为其中没有信念和/或先前事件的表达。

另一方面,在贝叶斯思维中,概率被视为信念的表达。因此,贝叶斯理论完全有理由说“我 50%(0.5%)确定今天午餐有千层面”。通过结合先验信念和当前事件证据,人们可以计算出后验,即今天有千层面的概率。贝叶斯思维背后的想法是,随着更多证据的提供,不断更新信念。因为这种方法处理的是信念,所以它通常被称为关于概率的主观观点。

2.1.2-贝叶斯推理

在决策哲学中,贝叶斯推理与贝叶斯概率观密切相关,它操纵先验证据可能性来计算后验。给定某个事件 B,事件 A 发生的概率是多少?这可以用贝叶斯的著名公式来回答:

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

使用:

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

在我们的例子中,我们最感兴趣的是贝叶斯公式的具体表述:

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

也就是说,我们希望找到θ的最可能分布,即解释数据的模型参数 d。

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

A supposed portrait of Thomas Bayes, an English statistician, philosopher, and theologian. Image Credit: Wikipedia Commons

计算这些概率中的一些可能是乏味的,尤其是证据 P(D)。此外,还会出现其他问题,比如确保共轭的问题,我不会在本文中深入探讨。幸运的是,一些技术,即 MCMC,允许我们从后验样本中进行采样,并绘制参数分布,而不必担心计算证据,也不必担心共轭性。

2.1.3-马尔可夫链蒙特卡罗

MCMC 允许我们从分布中抽取样本,即使我们不能计算它。它可用于从参数的后验分布(我们希望知道的)中取样。它已经在许多应用中取得了成功,例如在给定一组观测值和一些先验信念的情况下计算参数的分布,以及在物理和数字通信中计算高维积分。

底线:它可以用来计算给定一组观察值和先验信念的参数分布。

2.1.4-大都会-黑斯廷斯

MCMC 是一类方法。Metropolis-Hastings 是 MCMC 的具体实现。与吉布斯采样和拒绝采样相反,它在高维空间中工作得很好。

这项技术需要一个简单的分布,称为建议分布(我喜欢称之为转移模型)Q(θ′/θ),以帮助从一个棘手的后验分布 P(θ=θ/D)中抽取样本。

Metropolis-Hastings 使用 Q 在分布空间中随机行走,根据样本的可能性接受或拒绝跳转到新位置。这种“无记忆”随机游走是 MCMC 的“马尔可夫链”部分。

每个新样本的“可能性”由函数 f 决定。这就是为什么 f 必须与我们要采样的后验概率成正比。 f 通常被选择为表达该比例的概率密度函数。

要获得参数的新位置,只需取我们当前的θ,并提出一个新的θ’,这是从 Q(θ’/θ)中抽取的随机样本。通常这是一种对称分布。例如,具有平均值θ和一些标准偏差σ的正态分布:Q(θ′/θ)= N(θ,σ)

为了决定是否接受或拒绝θ’,必须为每个新提出的θ’计算以下比率:

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

使用贝叶斯公式,这可以很容易地重新制定为:

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

The evidence P(D) is simply crossed out during the division

这也相当于:

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

Where f is the proportional function mentioned previously.

接受的规则可以表述为:

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

Note: The prior components are often crossed if there is no preference or restrictions on the parameters.

这意味着如果一个θ’比当前的θ更有可能,那么我们总是接受θ’。如果它比当前的θ更不可能,那么我们可能接受它或以递减的概率随机拒绝它,可能性越小。

简而言之,Metropolis-Hastings 算法执行以下操作:

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

Metropolis-Hastings algorithm

第 2 部分:虚拟数据示例

3.1-步骤 1:数据生成

我们从均值μ= 10、标准差σ= 3 的正态分布中生成 30,000 个样本,但我们只能从中观察到 1000 个随机样本。

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

3.2-第二步:我们想要什么?

我们希望使用 1000 个观察样本找到σ{观察值}的分布。你们当中那些狂热的数学家会说,有一个计算σ的公式:

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

为什么我们要取样什么的?这只是一个虚拟数据的例子,真正的问题在第 3 部分,这里很难直接计算参数。另外,在这里,我们不是试图找到σ的值,而是试图计算σ的概率分布。

3.3-步骤 3:定义 PDF 和过渡模型

从图 1 中,我们可以看到数据是正态分布的。通过取 1000 个样本值的平均值,可以很容易地计算出平均值。通过这样做,我们得到μ{observed} = 9.8(尽管附带说明,我们也可以假设μ未知,并对其进行采样,就像我们对σ进行采样一样。然而,我想让这个开始的例子简单一些。)

3.3.1-对于过渡模型/方案分配

我心中没有具体的分布,所以我会选择一个简单的:正态分布!

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

注意σ′与σ{new}和σ{current}无关。它只是指定了参数空间的标准偏差。它可以是任何需要的值。影响算法的收敛时间和样本之间的相关性,我后面会讲到。

3.3.2-用于 PDF

由于 f 应该与后验*、*成正比,我们选择 f 为下面的概率密度函数(PDF),对于数据集 D 中的每个数据点 di:

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

Since μ is constant, we can practically consider that σ is equivalent to θ

3.4-步骤 4:定义我们何时接受或拒绝σ{new}

3.4.1-验收公式

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

如果这个比值不大于 1,那么我们将其与闭集[0,1]中的一个均匀生成的随机数进行比较。如果比值大于随机数,我们接受σ{new},否则拒绝。这确保了即使一个样本比当前的可能性小,我们可能仍然想要尝试它。(类似于模拟退火的概念)

3.4.2-可能性

一组观察值 D 的总可能性是:

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

This must be computed for both new and current sigma in order to compute the ratio in equation (1)

3.4.3-先验 P( μ,σ)

对于σ{new}和σ{current}可以采用的值,我们没有任何偏好。唯一值得注意的是,它们应该是积极的。为什么?直观地说,标准差衡量的是离差。离差是一个距离,距离不能是负数。

数学上:

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

而且一个数的平方根不能是负的,所以σ总是正的。我们在事前严格执行这一点。

3.4.4-最终验收表

在我们的例子中,我们将记录先验和似然函数。为什么要日志?仅仅是因为它有助于数值的稳定性,即乘以数千个小值(概率、可能性等…)会导致系统内存下溢,log 是一个完美的解决方案,因为它将乘法转换为加法,并将小正数转换为非小负数。

我们从等式(1)得到的接受条件变为:

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

这种形式可以通过从对数中取出平方根和乘法来进一步简化,但是不要介意,现在已经有足够的数学了!

3.4.5-那次咆哮的实施

实现很简单,对吧?!

3.6-步骤 6:使用初始参数运行算法,并收集接受和拒绝的样本

该算法接受 8317 个样本(每次新运行时可能会有所不同)。最后 10 个样本包含以下σ值:

[2.87920187, 3.10388928, 2.94469786, 3.04094103, 2.95522153, 3.09328088, 3.07361275, 3.08588388, 3.12881964, 3.03651136]

让我们看看算法是如何得出这些值的:

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

因此,从 0.1 的初始σ开始,算法很快收敛到预期值 3。也就是说,这只是 1D 空间中的采样…所以这并不奇怪。

尽管如此,我们仍将σ值的最初 25%视为“老化”,因此我们放弃它们。

3.6.2-让我们可视化 σ 的轨迹和轨迹的直方图

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

σ最可能的值约为 3.1。这比原始值 3.0 多了一点点。这种差异是由于我们只观察到原始人群的 3.33%(30,000 人中的 1,000 人)

3.6.3-预测:我们的模型在预测最初的 30,000 人口时表现如何?

首先,我们对σ的最后 75%的接受样本进行平均,我们从正态分布中生成 30,000 个随机个体,μ=9.8,σ=3.05(最后 75%的接受样本的平均值),这实际上比最可能的值 3.1 更好。

瞧:

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

现在,进入正题!

4-第 3 部分:真实世界的例子

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

Sunspots. Credit Wikipedia commons

太阳黑子是太阳表面(光球)的一个区域,其特征是温度低于其周围环境。这些降低的温度是由磁场通量的集中引起的,它通过类似于涡流制动器的效应抑制对流。太阳黑子通常成对出现,磁极相反。它们的数量根据大约 11 年的太阳周期而变化。

我们将研究的数据是“月平均太阳黑子总数”,从 1749 年 1 月到 2018 年 11 月的每个月。这些数据由世界数据中心收集、整理并公开发布,用于制作、保存和传播国际太阳黑子数。

4.1-让我们绘制这些年的数据,看看分布情况可能是什么样的

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

4.2-似乎我们可以用伽马分布来模拟这种现象,每 12 年有一个新的周期重置

γ分布γ是一族双参数的连续概率分布。参数是形状 A 和尺度 b。一个伽马分布的随机变量 X 记为 X ~γ(A,b),在我们的例子中,X 是太阳黑子的数量。两个参数 a 和 b 是我们想要计算其分布的未知数。

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

Gamma function with different parameters. Credit: Wikipedia Commons

例如,在第一个周期中,太阳黑子数从 1749 年底的 300 个左右的最高值开始,并在 6 年后的 1755 年下降到最低值。然后这个数字在 1761 年和 1762 年再次上升到最大值,然后在 1766 年再次下降,以此类推。。。

让我们通过绘制太阳黑子数直方图来确定:

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

4.3-事实上,计数频率似乎确实遵循伽马分布

对于 PDF,f,γ分布为:

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

其中γ是γ函数:γ(a)=(a-1)!(不要与伽马分布混淆!)

按照与虚拟数据示例中相同的过程,我们可以从这个 pdf 中写下对数似然性(参见下面的代码)。或者,可以使用 scipy.stats.gamma,b)。pdf(x)函数来计算它。但是,请注意,scipy 的实现比我实现的要慢几个数量级。

因为 a 和 b 必须是严格正的,所以我们在前面的例子中强制这样做:

运行代码并收集样本:

从 a=4 和 b =10 开始,该算法接受了 8561 对样本,a 的最后一个值是 0.98848982,b 的最后一个值是 84.99360422,这与初始值相差甚远。

与虚拟数据示例一样,让我们看看算法是如何得出这些值的:

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

从图 10、11 和 12 可以看出,该算法很快收敛到[a=1,b=85]区域。

提示:当算法开始大量拒绝样本时,这意味着我们已经达到了可能性的饱和区。通常,这可以被解释为已经达到了我们可以从中采样的最佳参数空间,即,算法几乎没有理由接受新值。这在图 11 和 12 中有所标记,其中算法不再接受小范围之外的任何值。

4.3.1-我们认为 a 和 b 值的最初 50%是“老化”,所以我们放弃它们。让我们来看一下 b 和 b 的轨迹以及轨迹的直方图。

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

4.4-预测时间

首先,我们对 a 和 b 的最后 50%的接受样本进行平均,并从γ分布中生成随机个体。a{average}=0.9866200759935773,b { average } = 83.70749712447888。

预测是:

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

4-评估

4.1-建议书分发的评估

我们如何指定分布 Q 的参数?我们应该远离当前样本θ,还是保持相对接近?这些问题可以通过测量接受样本之间的自相关来回答。我们不希望遥远的样本过于相关,因为我们正在尝试实现马尔可夫链,即样本应仅依赖于其先前的样本,自相关图应显示样本 I 和 i-1、i-2、…i-k 之间的相关性快速呈指数下降

通过为每个滞后 k 计算以下函数来定义自相关:

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

The lag 𝑘, is basically the range ahead of sample 𝑌i in which we would like to measure the correlation.

下图显示了从 1 到 100 的 a、b 和 k 的自相关性。k=0 的滞后意味着我们正在测量样本与其自身的相关性,因此我们期望它等于 1。k 值越高,相关性应该越低。

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

在我们的例子中,我们很幸运有足够低的相关性。一般来说,我们可能希望自动设置建议分布的参数 Q。常见的方法是不断调整提案参数,使 50%以上的提案被拒绝。或者,可以使用增强版的 MCMC,称为哈密顿蒙特卡罗,它减少了连续采样状态之间的相关性,并更快地达到稳定分布。

6-结论

虽然这种算法背后的抽象可能看起来难以理解,但实现实际上非常简单,并给出了令人惊叹的结果。事实上,概率编程的伟大之处在于,你只需要写下模型,然后运行它。不需要计算证据,或者确保一些约束性的数学属性。

我希望阅读这篇文章的每个人都觉得它很有趣,很有见地。如果有积极的反馈,将会有更多本系列的文章“从零开始”,在那里我从零开始解释和实现东西(显然!),所以如果你喜欢的话,请一定要建议你接下来想让我讲的内容!

欢迎任何问题,我会尽我所能回答!反馈是非常受欢迎的,因为这是我的第一篇文章,我希望改进。

参考资料:

Peter Driscoll,“径向速度数据集的最小二乘法和贝叶斯拟合技术的比较”

Carson Chow,“MCMC 和数据拟合模型”

约翰·h·威廉姆森,“数据基础——概率”

西蒙·罗杰斯,“机器学习的第一课”

致谢:

另一位媒体作家, Vera Chernova ,写了一篇文章:“如何通过三个步骤将 Jupyter 笔记本嵌入媒体文章:1–2–3!”

朋友和数据科学家同事马克·艾斯丘和康斯坦丁诺斯·约安尼迪斯在本文发表前给予了反馈。

从拓扑数据分析到深度学习:不劳无获

原文:https://towardsdatascience.com/from-tda-to-dl-d06f234f51d?source=collection_archive---------2-----------------------

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

Source

今天,我将尝试给出一些关于 TDA(用于拓扑数据分析)的见解,这是一个快速发展的数学领域,肯定会很快完全集成到机器/深度学习框架中。为了说明这一理论的威力,本文后面将给出一些用例。

快速历史

拓扑数据分析,也缩写为 TDA ,是从应用拓扑学和计算几何的各种著作中出现的一个新领域。它的目的是提供良好的数学,统计和算法的方法来利用数据中的拓扑和潜在的几何结构。你通常会发现它适用于三维数据,但经验表明,TDA 揭示了在其他情况下也很有用,如时间序列。

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

Example of Mapper construction based on the height function

拓扑学定义的理论多种多样,在机器学习或者深度学习中的影响力也在不断增长。那些曾经对那些能够带来关于数据的意想不到的见解的开箱即用的理论感兴趣的人可能会对接下来的事情感兴趣!然而,关于这篇文章,我将把重点放在可视化的例子上,为了便于理解,我将自己限制在一维和二维空间。

持久性同源性

在流传最广的理论中,有持久性同源性。这是一种旨在计算不同空间分辨率下空间的拓扑特征的方法。通过构建,这些特征更有可能代表潜在空间的真实特征(而不是采样、噪声或特定参数选择的假象),因为它们与数据点的空间关系有着内在联系。为了计算一个空间的持续同调,它必须首先被表示为一个嵌套的单纯复形(基本上是一个由一组点和它们的关系组成的图,又名二维空间中的线和三角形)。这个家族叫做过滤。一般来说,这种过滤的构造是基于距离函数的定义,其值用于索引族中的复合体。因此,这个距离的选择非常重要,并为那些对公制学习感兴趣的人提供了思考的食粮

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

Visual Construction of the Simplicial Complex

持久性同调理论允许我们用一个持久性 条形码持久性 唯一地表示一个过滤的单纯复形的持久性同调。条形码图用一条水平线表示每个持久性发生器,水平线从它出现的第一个过滤级别开始,到它消失的过滤级别结束,而持久性图用其 x 坐标出生时间和其 y 坐标死亡时间为每个发生器绘制一个点(下面给出了示例)。视觉上,在二维中,你独立地考虑每个点:你围绕那些点画一个半径递增的圆,直到你找到一些交点(出生时间)。你继续绘制,直到你覆盖了一些点,破坏了一些先前创建的结构(死亡时间)。您最终得到组件(出生和死亡日期),这些组件通过那些持久性图和条形码来表示。

持久性图表

为了更好地形象化这个理论,让我们考虑一维时间序列的例子,记为 f 。我们想通过下面的规则来关注 f临界点:当引入一个新的组件时,我们说创建它的局部最小值代表该组件。当我们传递一个局部最大值并合并两个分量时,我们将最大值与代表这两个分量的两个局部最小值中较高的(较年轻的)值配对。另一个最小值现在是合并产生的组件的代表。当 xy 通过这种方法配对时,我们定义这对的持久性为f(y)——f(x)。持久性在持久性图中通过将每一对映射到点( f(x),f(y) )来表示,该点的坐标是相应的临界值,如下所示。

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

Value-Based Persistence of a 1D Signal

矢量化和表示法

太好了,但是下一步该怎么办呢?!?从持续图中提取的向量的不一致性问题是机器学习应用的真正缺点。为了在不深入研究新型神经网络的情况下解决这个问题,我们必须转换以前的持久性表示,以某种方式收集相同的信息,这可能是相当大的。对于机器学习来说,提取外围的持久点可以表示很好的特征,但是图表中包含的一些底层信息可能会在这个过程中丢失。

在这里,我将强调三种可能性:贝蒂曲线、T2 持续景观和 T4 持续图像。(整个计算都要归功于 Gudhi 包,它是由法国团队 DataShape 为 INRIA 开发的。)以下结构即将成为 scikit-learn 兼容产品。同时,我向你推荐我对应的 Github 库的持久化构造,以及图表的表示。让我们通过下面的例子来想象一下。曾经梦想用算法计算你手上的手指数量的人会对即将到来的事情感到高兴…

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

TDA Representation of a 3D Object: Finger Characterization

我们从这个结果中得到什么。首先,您通过持久性图和条形码以图形方式观察到有 5 个突出显示的组件。不出所料,那是 5 根手指!然而,其中一个组件位于无穷大:这对应于在考虑过滤的上层时遇到的第一个点,自动给定一个无穷大的值。因此,你的持久性景观只清楚地代表了四个较小的手指。这是在应用 TDA 时要记住的事情!

贝蒂曲线:让我们考虑一个持久性条形码,我们对其半径空间进行矢量化。条形码图的每个组成部分都被称为一个函数,在定义它的半径上取值为 1,在其他任何地方取值为 0。这些函数的总和定义了贝蒂曲线。

暂留景观:暂留图的每个组成部分都由一个三角函数引用(斜率为 1)。这些三角形函数的叠加给出了不同平面上的山脉的外观结构,我们迭代地从中提取上层景观。

余辉图像:余辉图的每个分量成为特定方差的二维高斯分布的中心。通过创建相应的分布叠加矩阵,就获得了图像。

人们应该注意到下面这一点:即使手指的数量清楚地出现(对应于远离对角线的点),仍然存在拓扑噪声的概念(靠近对角线的点)。因此,持久性景观通常更好使用,因为它们或多或少对它保持健壮,因为它们更好地描述了数据集的大多数持久性对象。然而,拓扑噪声有时是有用的信息,特别是在处理标准偏差对分类非常重要的时间序列时…

深度学习管道

一旦您为所有的示例构建了相应的持久性表示,您可能想知道如何使用它。贝蒂曲线有点容易馈入一个 1D 卷积网络,而持续图像适合一个 2D 卷积网络

关于持久性景观,它变得有点棘手。对于那些想知道如何充分利用它而不手工制作自己的功能的人,这里有一个我构建的解决方案。基本上是联系到持久性剪影的思想,是从持久性图中得到的三角函数的加权和。新创建的层对应于这些持续景观的加权和,得到持续轮廓的移动平均结构作为输出。输出是一个一维信号,你可以把它输入一个 1D 卷积网络。我会在接下来的工作中进一步发展这个想法!😃

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

Credits: Gaijin et al.

这个理论有很多可能性,这些结果和深度学习之间的接口目前仍在开发中。许多想法将会出现,这使得这个话题变得非常热门和有趣!敬请关注即将到来的文章,如果你想了解更多,别忘了给你鼓掌;)

参考

从失败的通过到通过的仪式:作为数据科学教育工具的泰坦尼克号数据集

原文:https://towardsdatascience.com/from-tragedy-to-educational-tool-the-titanic-data-set-at-a-data-science-rite-of-passage-91e95f336af8?source=collection_archive---------8-----------------------

皇家邮轮泰坦尼克号的沉没是现代史上最著名的悲剧之一。它在历史上作为一个值得注意的事件的地位在很大程度上是由于它在 1997 年被重新改编成电影,其中泰坦尼克号既作为背景又作为电影名称。当泰坦尼克号的故事创下纪录时,它成为了一个标志性的悲剧,成为了第一部票房超过 10 亿美元的电影,并一直保持这一头衔,直到 2010 年《阿凡达》上映。很明显泰坦尼克号的沉没在一般社会中是受欢迎的;几家公司已经宣布,他们将开始以 105,129 美元的价格为客户提供泰坦尼克号残骸的水下潜水之旅,这些公司表示,这个数字相当于经通胀调整后泰坦尼克号头等舱机票的价格。它在数据科学社区中的流行是因为它是一种有用的教育工具;泰坦尼克号悲惨航行的数据为数据科学学生提供了许多教育可能性。

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

The Titanic at Southampton, England, one of the ports where it picked up passengers before it began its trip across the Atlantic.

使用 Titanic 数据集—本质上是一个逗号分隔的值(。csv)文件复制了船上的乘客声明——在现代数据科学世界中,这已经成为某种仪式。该数据集提供了大量实践各种基础数据科学技能的机会。一个已经变得流行的可能的学习练习,尽管它也是一个有点病态的练习,是在表面水平上分析泰坦尼克号数据集,这对数据科学学生和新手来说是完美的,以获得对乘客在哪个等级和他们生存可能性之间关系的见解。对数据集的分析进一步揭示了数据中的一种模式,这种模式对许多人来说可能是直观的,并且得到了数据集证据的支持,即乘客乘坐的舱位等级越低——头等舱、二等舱或三等舱——泰坦尼克号沉没时,你生还的可能性就越小。

除了这个特定的数据集,专业的数据科学家可以被要求研究任何主题,无论是什么,都必须以数据为基础。作为一个人,你不会带着偏见或预先存在的假设行事,而只是作为数据的推动者,在数据集中分析和寻找模式,而不管你找到的模式可能是什么。有了这些无偏见地发现的模式,你和你的团队(如果合作的话)可以开始评估这些模式的意义。如上所述,Titanic 数据集在分析数据、识别数据中的模式以及评估数据中的模式的意义方面尤其丰富。仅此一点就能使泰坦尼克号数据集成为一个强大的教育工具,但这并不是使用这个特殊数据集成为某种仪式的唯一原因。

泰坦尼克号的原始数据更加混乱。这提供了一个练习清理数据集以便于分析的教育机会。然而,即使在混乱的状态下,泰坦尼克号数据集在分析后仍然显示出无数的模式-使这个数据集成为崭露头角的数据科学家的完美缩影,以从多个角度练习他们使用数据集的基本技能。这反过来意味着有几个机会来练习评估数据模式,以最终回答他们想要回答的问题。正是这些可能的技能应用机会,以及前面提到的机会,将这个流行的数据集变成了一个无处不在的教育工具,这个领域的大多数人都遇到过,如果不是自己工作的话。

尚不清楚这种使用泰坦尼克号数据集的趋势是何时开始的,但就在几年前,它的受欢迎程度甚至进一步上升。这是因为几年前,一家提供免费在线数据集的公司和网站 Kaggle 在 GitHub 上发布了一项比赛,要求数据科学家想出一种方法来预测泰坦尼克号沉没时是否有任何随机乘客幸存或死亡。这可能始于一场 Kaggle 比赛,但它的普及程度甚至更远。一个简单的谷歌搜索显示了数百篇博客文章,所有技能水平的数据科学家在这些文章中解释了他们制定的预测方法。更多关于泰坦尼克号数据集的不同可能研究问题的谷歌搜索返回了大量由数据科学家撰写的博客文章,这些文章讲述了他们的解释,并解释了他们在解决问题时使用的方法,他们开始在脑海中分析泰坦尼克号数据集。

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

Courtesy of Stephen Millborrow

这艘“不沉之船”的沉没已经过去了 100 多年,泰坦尼克号的故事通过电影被纪念也已经过去了 20 多年,但在数据科学领域,它的相关性是非常当前的。它的持续相关性依赖于数据集丰富的可能性,这为数据科学家提供了一次又一次练习技能的机会,无论他们的技能水平如何。因此,对于那些处于数据科学创新前沿的人来说,巨大的数据集仍然是一个受欢迎的教学和学习工具。它的受欢迎程度似乎不会很快改变。

来自《什么是 numpy?🤔到“我爱 numpy!💪🏼"

原文:https://towardsdatascience.com/from-what-is-numpy-to-i-love-numpy-a130285e333d?source=collection_archive---------2-----------------------

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

Numpy 或“数字 python”是用于科学计算的核心 Python 库,Numpy 也很快,因为它与 C 库绑定。

常规 python 列表与 Numpy 数组:

这种差异主要是由于“间接性”——Python 列表是指向 Python 对象的指针数组,每个指针至少有 4 个字节,即使是最小的 Python 对象也有 16 个字节(4 个用于类型指针,4 个用于引用计数,4 个用于值——内存分配器四舍五入到 16)。NumPy 数组是一个统一值的数组,单精度数字每个占用 4 个字节,双精度数字占用 8 个字节。不太灵活,但是您为标准 Python 列表的灵活性付出了很多!这就是 numpy 数组比 Python list 更紧凑的原因。

来源:😊

目录:

  1. 装置
  2. 基本数字阵列
  3. 另一个很酷的内置方法

安装:👨🏼‍💻

有两种安装方式:使用 pip 或 anaconda。如果你没有安装 anaconda,我会使用 pip,但是我推荐使用 anaconda 🐍相反。

conda install numpy

或者

pip install numpy

基本 Numpy 数组:👓

Numpy 数组有两种不同的类型:vetrices 和 matrices。Vetrices 是严格的一维数组,而 Matrices 是二维的(注意:二维数组可以包含一行和一列)。在这一节中,我想介绍 Numpy 数组和几个函数的基本实现。

import numpy as np

这就是 numpy 显示二维数组的方式。在这种情况下,上面显示的二维数组的形状是(3,3)。3 个用于其行,3 个用于其列。

  • shape: shape 是一个描述符,用于从给定的 np 数组中返回元组中的行数和列数。
  • 整形:为你的 np 数组分配一个新形状的函数

注意:当你试图改变二维数组的形状时,请注意数组中有多少个元素。

举例:

当一个(3,3) 2d 数组总共有 9 个元素时,如果将其列整形为(3,5)或任何大于 3 的数,这是不可能的。但是在另一方面,仍然有可能重新成形为(9,1),九行和一列。

numpy_array.reshape(3, 5)

会给你:

Traceback (most recent call last):
  File "practice_one_numpy.py", line 9, in <module>
    two_darray.reshape(3, 5)
ValueError: cannot reshape array of size 9 into shape (3,5)

内置方法🐍:

这里有几个很酷而且可能是有用的数字内置方法😉。

  • arange:返回具有给定间隔的均匀分布的值
  • 眼睛:创建一个单位矩阵
  • random.rand:创建一个给定形状的从 0 到 1 的随机数数组。

如果您想了解更多关于 numpy 的信息,请查看此资源。🐍。谢谢你😁

前沿人工智能技术正以前所未有的方式影响着金融科技的业务运营!

原文:https://towardsdatascience.com/frontier-ai-technologies-that-are-impacting-fintech-business-operations-like-never-before-99737daf197f?source=collection_archive---------8-----------------------

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

金融公司在采用新技术和创新方面总是领先于其他公司!难怪这些了解未来的公司体验到了最好的人工智能——从欺诈检测到风险管理,甚至预测不良贷款。

这一部分的挑战也是独特的,变化正以极快的速度到来。他们面临着数据量、信息量、复杂性和碎片化的问题。即便如此,机器学习、自然语言处理、大数据和分析、数据挖掘、自动化和物联网(IoT)等人工智能技术正在取得重大成果。

以下是人工智能技术为金融科技创造前所未有的商业运营改进的主要领域。关注领先的新兴公司以及这些推动他们走向积极业务成果的强大技术是值得的。

1.欺诈检测:

欺诈检测可能是人工智能领域最大的一块。这也是最重要的,预计到 2020 年将成为 3B 的一个美元市场。

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

为了理解金融科技领域欺诈的含义,让我们考虑一个常见的例子。随着越来越多的人在日常交易中使用网上银行,他们将会创造成千上万的印象和数据点。通过几个设备和接触点,这些服务将被不断地访问。银行必须建立非凡的灵活性,及时快速地识别和定位可疑行为。

欺诈检测解决方案依靠大规模数据挖掘和数据分析技术来得出答案。该系统基于强大的神经网络算法,能够系统地处理相当大的数据集,同时识别和标记不一致。它们非常敏感,因此即使是微小的不一致和违规也能被准确地发现。

每笔交易都要扫描数千个数据点,模糊查找被用来“发现”相关的模式、异常和巧合;无论是对用户,还是对特定交易,甚至是对一段时间内发生的类似交易。与过去更加手动和耗时的方法相比,使用人工智能进行几微秒的欺诈检测是一个飞跃!

2.生物认证和令牌化:

认证和授权是我们这个高度数字化、基于知识的世界的重要方面。在这里,访问是由可验证的凭证定义的入口。

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

身份验证和授权之所以重要,是因为一旦提供了访问权限,就很大程度上无法收回。或者,一旦未经授权的访问被允许,就会产生灾难性的后果。

生物认证和令牌化使用人工智能技术来创建更强的系统。例如,利用语音识别和自然语言处理的设备通过其声纹来识别和授权人员。使用物联网并将使用心电图与智能系统集成的设备,其中两个系统相互通信并传递信息,唯一目的是识别某人。此外,与眼白中的静脉图案匹配的设备,或用于完美识别的“眼纹”。

令牌化也有几个用例,其中令牌被用作一种方便交易的手段。卡的详细信息、姓名和账号等敏感个人信息被分离出来,单独存储在另一个位置。在欺诈者破解这个令牌的情况下,他/她将无法使用它或识别信息所属的人。

3.自动化:

自动化在整个金融科技行业得到了广泛应用。当然,有几个明显的优势。但是,让组织能够应对不断增长的数据量的冲击是一个主要问题。

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

此外,还通过优化、改进客户服务等方式大幅降低了成本、减少了冗余、降低了风险、提高了预测能力、敏捷性和响应能力。

当自动化与机器学习和深度学习在预测分析和报告、营销和活动管理、语音识别和响应、数据输入、客户关系管理(CRM)以及机器人流程自动化(RPA)等功能中相结合时,优势会进一步扩大。

一家名为“WorkFusion”的公司正在彻底改变这一领域。与金融公司合作,提供人工智能支持的优势和双赢。例如,本案例研究描述了 WorkFusion SPA 如何通过 RPA、AI 和人员的独特组合,帮助 Six Financial 应对其不断增长的数据处理挑战

4.区块链:

这项创新的新技术有潜力改变商业运作的方式。产生共享信任并确保数据完整性。从零售银行到保险和财富管理,甚至投资银行,各种规模和类型的金融服务机构都将从中受益。

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

关键在于这项技术是如何工作的——它从分布式基础设施开始,在这个基础设施中,关于交易的信息被安全地共享。然后,一个用户网络支持和验证每一个独特的交易,确认其准确性。在最后阶段,记录被透明地添加到每个人都可以访问的区块链中。

区块链不是天生的 AI 技术。但人工智能可以赋予它更多的力量。例如,在能源密集型的开采过程中,人工智能算法可以通过优化和平衡来降低消耗。联邦学习系统和数据分片技术可以提高效率,增强快速增长的区块链的可扩展性。区块链可以抵御黑客攻击,但是底层和应用程序更容易受到攻击。这可以通过机器学习来改变,人工智能算法可以帮助安全的应用程序部署。

这项技术用途广泛。它用于资产创建(例如,在加密货币的生成中)、资产转移(例如,在艺术品交易商和画廊多次买卖艺术品时保留记录)和数据核对(例如,钻石行业用于标记“血钻”或假货)。)

5.实时警报和通知:

随着规范分析的出现,分析系统可以规定未来的路径,世界不再停滞不前。我们在快速前进。

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

客户期望通过任何设备和渠道获得准确的实时警报和通知,这是目前行业的基准。很难想象今天的一笔交易会在月底才生成一份对账单。标准变化很快。

大数据挖掘、物联网、机器学习和更多这样的人工智能技术正在为更快、更敏捷的系统创造可能性。不断发展的组织正在利用这些优势!

推荐系统的前沿&多样性

原文:https://towardsdatascience.com/frontiers-of-recommendation-systems-diversity-f668adad502c?source=collection_archive---------5-----------------------

批判性阅读:来自 2011 年 ACM RecSys 和管理科学的论文

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

Alaska Frontiers. Photo Credit: US Dept of Interior

介绍

最近,我一直试图了解推荐系统如何影响用户体验的多样性。在我开始自己的项目之前,我想看看聪明人都做了些什么。因此,我阅读了来自 ACM RecSys 关于多样性的 2011 年研讨会的全部论文,以及来自*管理科学的相关论文。*这些论文的作者已经成为音乐流媒体行业的重要参与者。例如,奥斯卡·塞尔马目前担任潘多拉公司的研究主管。所以我非常兴奋地看到他们的研究如何塑造了他们的产品。

在这篇文章中,我想与你分享我的文献综述。我的目标是:

  • 把所有的文件归档在一个统一的框架下;
  • 为每篇论文创建一个摘要;
  • 批判性地评估每篇论文。

放弃

  1. 从 2011 年到现在已经 7 年了。那么,为什么我称这个推荐系统的前沿为&多样性呢?当然,从那时起,已经有一些关于这个主题的论文被发表了;但是 2011 年是 RecSys 最后一次举办关于推荐系统多样性的研讨会。我想阅读这些论文作为我的种子,在我的文献综述的下一个迭代中,我将从中扩展。
  2. 我们大多数人认为文学评论是必要的罪恶。然而,随着时间的推移,我已经学会了接受这个过程。它让我接触到许多不同的观点,并帮助我形成一个鸟瞰图。这有两个好处:(1)我不重新发明轮子;(2)我能识别该领域的公开挑战,这有助于我成为更好的贡献者。
  3. *本文假设读者已经熟悉基本的推荐算法。如果你是推荐系统的新手,Medium 上有一些写得很好的教程。我个人最喜欢的是 Kelly Peng我是如何为香水*——建立一个推荐系统的,这是一个非常棒的端到端项目,包括网络清理、直觉、代码和令人着迷的最终演示。

行动纲要

2011ACM rec sys论文多是关于推荐系统的设计。

  • **优点:**引入了许多不同的指标&算法,用于多样化的推荐。
  • **缺点:**在理解对用户体验的潜在影响时,常用的技术是交叉验证;精确度和召回率仍然是流行的指标。虽然这种方法通常用于信息检索文献,但它可能不适合推荐系统。一个新的推荐系统,一旦实现,改变的不仅仅是对个人用户的推荐。更重要的是,它改变了项目/用户网络的全局拓扑,这将馈入推荐系统。不幸的是,在 2011 年的 ACM RecSys 中,这个问题的动态性质很少受到关注。
  • 值得注意的例外是 Oscar Celma 和 Perfecto Herrera 的论文。他们在 Last.fm 上实施了一项实验,使用了 233 名受试者。虽然这是正确的一步,但有限的受试者数量限制了他们研究动态、一般均衡效应的能力。

相比之下,管理科学论文关注消费者行为和福利分析。

  • **优点:**作者对消费者行为进行了建模,并通过模拟研究了他们的选择和效用如何受到常见推荐系统的影响。
  • **缺点:**我们不知道效用函数是否准确地描述了真实的顾客;如今企业实现的推荐算法可能更加复杂。

大多数论文提供了单一的视角。

我不怪他们。学术界奖励严谨——自然,一次对一件事严谨更容易。也就是说,我认为了解该领域的最佳方式是采取多视角、多学科的方法。这正是我希望在下一节中完成的。

假设空间

推荐会增加多样性吗?

  • **【H1】建议增加多样性:**与实体店不同,互联网有无限的货架空间。随着用户浏览数以百万计的商品,市场将从热门商品转向利基市场。
  • **【H2】推荐减少多样性:**尽管货架空间无限,但屏幕空间有限。如果推荐系统一直推荐高度相似的项目,它会降低感知的多样性。
  • **【H3】推荐增加个体多样性;但是降低了总体的多样性:**单个地,用户得到了大量不同项目的推荐。但是,如果每个人都被推荐了同一套不同的商品,就会降低对多样性的感知。

最后一点很抽象,所以让我给你举个例子:

  • 网店之前:假设每个人只吃 1 种水果,因为他们当地的店都是这么卖的。爱丽丝吃苹果,鲍勃吃香蕉,凯特琳吃樱桃,迪伦吃苹果。当他们互相拜访时,他们会接触到新的水果。
  • **网店消灭本地店铺后:**RS 有可能只推荐(苹果、香蕉)给大家,因为这些是最受欢迎的商品。你期望人们更快乐,因为现在他们可以吃更多种类的水果。然而令人惊讶的是,他们可能仍然会抱怨多样性的减少。这是因为无论他们去哪里,他们都只能吃到东西(苹果、香蕉)——因为这种意外收获的美妙感觉现在已经消失了。

用户重视多样性吗?

  • **【H6】熟悉感胜出:**当我们听到一首新歌时,这是一种精神负担。所以大多数用户更愿意呆在他们的舒适区。
  • **【H7】多样性胜:**你对自己喜欢的歌,播放多次后,就厌倦了。这是边际收益递减的基本规律。
  • **【H8】相关性+多样性:**事实介于两者之间——用户只重视与他们“相关”的多样性。如何定义相关性?这似乎是一个悬而未决的问题,作者提出了许多不同的定义。

我的观察

  • **最佳的 rs 设计取决于用户的偏好:**如果用户重视熟悉度,那么推荐系统(RS)应该推荐相似的项目;如果用户看重多样性,那么 rs 应该推荐多样化的物品;如果用户只看重相关的多样性,那么 rs 应该推荐相关的、多样化的项目。如果不首先了解用户偏好,我们就不知道最佳 RS 应该是什么样子。
  • 2011 年大部分论文潜水员不研究用户偏好。相反,他们对用户的偏好做出假设:他们是否关心多样性,如果是,以什么方式?我认为下一代报纸应该更加关注理解用户偏好。
  • 变化是,用户是高度异质的: (1)一些用户可能喜欢呆在他们的舒适区内,而另一些用户更喜欢探索;(2)根据使用情况、一天中的时间、他们生活的时间、心情等,相同的用户可能想要熟悉的或陌生的。迄今为止,所提出的推荐算法都是“一刀切”的。这种部署很危险,因为在现实中,用户是高度多样化的,同一用户会随着时间的推移而变化。

一般性讨论到此结束。在接下来的部分中,我将深入研究每篇论文。

目录

潜水员 2011 年论文

  • 主题演讲:推荐系统的新颖性和多样性研讨会,第五届 ACM 国际推荐系统会议。
  • 最大化集合推荐多样性:一种图论方法
  • ❤️论推荐系统中的意外:或者如何期待意外的❤️
  • 一种评估新推荐的新方法
  • 基于融合的提高意外收获率的推荐系统
  • 遗忘问题:利用遗忘项提高推荐多样性
  • 推荐收藏的框架
  • ❤️帮助用户感知推荐多样性❤️

管理科学论文

  • ❤️大片文化的兴衰:推荐系统对销售多样性的影响️️❤️个人最爱!如果您想偷窥,请滚动至底部:)

1.潜水员主题演讲

摘要

  • 确定推荐系统的关键挑战是:增加新颖性和多样性,同时仍然实现用户兴趣的公平匹配。

商业正在以特殊的方式考虑新奇和多样性;而研究人员才刚刚开始“寻找在推荐模型、算法、理论和评估方法中加入新颖性和多样性的原则基础”。但仍有很大的空间进行进一步研究,这也是 2011 年潜水研讨会的动机。

  • 关键问题: (1)如何衡量新颖性和多样性?(2)如何增强新颖性和多样性?(3)如何提高建议的新颖性和多样性?(4)如何评估推荐系统?

2 .最大化聚合推荐多样性:图论方法

摘要

  • 回想一下,推荐是一个两阶段的过程: (1)预测评分;(2)选择前 N 个预测评级作为推荐。提高多样性可以通过(1)或(2)来实现。本文属于后一类。
  • **本文的目标是增加总体多样性。**聚合多样性,因为消费者重视多样性,而且许可不太受欢迎的商品更便宜。
  • **将多样性最大化转化为最大流问题。**具体来说,(1)有 2 组顶点:用户和项目;(2)如果我们向用户 u 推荐项目 I,那么有一个优势 iu;(3)优化目标是最大化用户-项目匹配的数量,服从容量约束。

数据

  • 运动神经元
  • 网飞 C 奖
  • **我会非常担心选择偏差,以及基于这个样本的概括结论。**作者将数据集局限于具有“显著”评级历史的用户和电影,而没有详细说明什么是显著的。修剪后,MovieLens 的数据留给他们(2830 名用户,1919 项),网飞竞赛的数据留给他们(3333 名用户,2091 项)。与实际数据量相比,所选评估样本非常小!MovieLens 10M 数据集有(72,000 个用户,10,000 部电影);MovieLens RecSys HetRec 2011 拥有(2,113 个用户,10197 部电影);网飞竞赛数据有(48 万用户,17,000 项)。

韵律学

  • 聚合多样性的度量是被推荐的项目总数。
  • 成功度量:“给定精度水平下的分集增益”。

评论

  • 这是长尾巴吗?提高 MovieLens 前 2K 电影和网飞前 2K 电影的覆盖率不是我对长尾的想法。我猜这些可能是我已经接触过的过去 10-20 年的顶级电影。我会很有兴趣看:(1)推荐电影列表;(2)在理想的实验中,该算法在多大程度上扩展到具有有限评级的更大数量的用户和项目。
  • **#物品并不能很好的衡量多样性。**例如,如果你看了一个关于早上 5 点起床的视频,你得到了 10 个以上的推荐,你会认为这是一个多样化的推荐吗?大概不会。
  • 它仍然严重依赖传统的协作过滤器来预测收视率。这是有问题的,原因有两个:(1)它不能预测新项目的评分;(2)对于探索型用户来说,这可能太保守了——你得到的推荐仅仅是与你最“相似”的用户的多样性;或者通常同时出现的项目。因此,如果你是一个刚刚开始形成自己身份的人,你可能会被归类;如果你对来自其他社会经济背景的人在做什么感到好奇,你将很难突破。

3.❤️论推荐系统中的不可预测性:或者如何预测不可预测的❤️

摘要

  • 这是为数不多的模拟用户偏好的论文之一。本质上,所提出的算法所做的是剔除所有明显的推荐项目。
  • **本文的一大贡献是作者对不同多样性度量的关注:**新颖性定义为用户以前不知道的项目;意外之喜是一种既新奇又愉快的经历;多样性意味着物品种类的增加;意外是字面上意想不到的项目。
  • **关于提议指标的关键观察:**以上指标并不完全重叠。从他们的角度来看,好的推荐既出人意料,又能引发积极的情绪。我完全同意这个好的推荐系统的定义。
  • **效用函数取决于:**一个用户总体上喜欢电影的程度;用户对推荐电影的喜爱程度;用户对冗余和不相关的容忍度;用户是否期望推荐;最后,特质噪音。
  • **经验挑战:**衡量意外性和用户满意度。

韵律学

  • 对于单个用户,unexpecteness =[RS \ E]/N,其中 RS 是我们的推荐系统生成的推荐项目;e 是由“原始”推荐系统生成的推荐项目(即,已经评级的项目、用户喜爱的类别、项目的评级数量、同一导演、同一组主角、共享超过 20 个标签等)。);n 是推荐项目的长度。
  • 项目相似度度量: (1)对于协同过滤器:皮尔逊相关系数、余弦相似度、雅克卡系数;(2)对于基于内容的相似性,两部电影之间所有属性的加权平均值。

用户偏好参数

  • 用户总体上喜欢电影的程度;
  • 用户对冗余和不相关的容忍度是多少?

这两个参数是用回归法计算出来的。

数据

  • RecSys HetRec 2011 年发布的 MovieLens 数据:(2,113 个用户,10197 部电影)

评估指标

  • RMSE,平均绝对误差,精确度,召回率和假阳性率。

评论

  • 这是我 2011 年最喜欢的论文 diveRecSys : 它仔细定义了不同的指标,并花了大量时间讨论用户偏好。
  • **我希望看到用户偏好参数的分布。**这将帮助我们了解用户是否有不同的偏好,如果有,主要的聚类是什么。
  • **正如作者指出的,为了验证这个推荐的算法,我们需要进行真实的实验。**单纯的交叉验证是不够的。具体来说,我认为使用这种方法得到的用户偏好参数可能过于保守。历史评级是通过 2 个步骤产生的:(1)用户通过网站推荐或其他渠道了解项目;(2)用户然后观看他们知道的项目,并对它们进行评级。我们知道(1)受到 CF 或 CB 的严重影响,因为大多数现有的网站已经运行这些算法。因此,我们可能会得出这样的结论:普通用户对冗余的容忍度比他们实际承受的要高。这是因为生气的用户会直接退出平台,或者花更少的时间或更少的电影评分。所有这些用户都不会在数据集中被捕获,我们只剩下对冗余有更高容忍度的用户。因此,将这个用户群的发现推广到普通人群是非常危险的。
  • **我希望看到明确的长期动态模型。**一旦部署,推荐算法将改变物品网络的拓扑结构和用户的相似性,从而引发难以在模拟中捕捉的反馈循环。

4.一种评价新颖推荐的新方法

摘要

  • **提出一个基于网络的指标来衡量推荐的新颖性。**表明协同过滤器是偏向流行的。具体来说,如果你只跟踪“相似艺术家”链接,从热门艺术家开始到达尾部艺术家的概率大约为 0。从尾部艺术家开始也没有帮助,因为知道一个尾部艺术家的用户通常也知道其他相关的尾部艺术家。从“中间”艺术家开始似乎更好:更容易同时接触到非常受欢迎的艺术家和尾部艺术家。
  • **用户分析:**对(288 个对象,5,573 首歌曲)实验表明,用户更喜欢由协作过滤器推荐的歌曲,而不是由基于内容的算法推荐的歌曲,即使基于社交的算法推荐的歌曲不那么新颖。

数据

  • Last.fm 上 288 个受试者的实验数据

构建网络

  • 每个节点都是一首歌。
  • 如果 Last.fm 的 API 认为两个节点相似,则这两个节点之间存在链接。

基于网络的新颖性度量

一旦每个项目位于头部、中部或尾部,下一步就是将项目的相似性网络的属性与长尾信息相结合。执行两个主要分析。首先,我们测量曲线每个部分的项目关系。也就是说,对于属于头部的每个项目,计算位于头部、中部和尾部的相似项目的百分比(类似地,对于中部和尾部的项目也是如此)。这衡量最受欢迎的项目是否与其他受欢迎的项目相关联。其次,我们测量一个项目在长尾中的位置和它的入度之间的相关性。这使我们能够检测网络中的集线器是否是最受欢迎的项目。

实验

  • 使用 CF、CB 或混合方法生成建议。
  • 受试者是否知道推荐给他们的曲目,以及他们如何根据歌曲的前 30 秒在 1-5 的范围内对它们进行评分。

评论

  • 我喜欢他们创建的 Markov 转移矩阵来表明 CF 是受欢迎程度有偏差的。
  • 我也喜欢他们如何用实验来评估建议。
  • 我们从实验中看到的矛盾的结论是,尽管存在受欢迎程度的偏差,CF 仍然优于 CB 和混合方法。我们是否应该得出结论,用户暗地里渴望熟悉感?我们应该断定基于 CF 的变体是解决方案吗?这些结论听起来还为时过早。本文中实现的 CB 和混合算法可能过于原始。我们不知道未来改进的 CB 或 HY 或其他算法是否会优于 CF。
  • 基于原始数据,CF 推荐给用户的曲目有 71.69%的时间是未知的。这似乎是一个可观的数字,尽管我怀疑它夸大了 CF 的发现率。这是因为受试者只能看到音轨的前 30 秒,人们很难从前奏中分辨出一个艺术家/歌曲。

5.基于融合的推荐系统提高奇遇度

摘要

  • “以融合为基础”是什么意思?假设你喜欢两样东西:苹果和橘子。这两样东西的共同特点是它们都是水果。所以基于此,我推断你喜欢水果,并可以向你推荐其他水果。
  • 作者声称这种方法速度很快,并且可以生成“新颖”的项目。
  • 我不相信:(1)如果我在吃苹果和橘子,很可能我已经知道其他水果。所以其他水果对我来说并不新奇;(2)我确信现有的 CB 和/或 CF 已经推荐了相同的项目。我很想知道这个基于融合的推荐系统的边际贡献是什么。

6.遗忘问题:利用遗忘项目提高推荐多样性

评论

  • 遗忘物品并不新奇。
  • 同样,你也不能通过挖掘被遗忘的物品来提高推荐多样性。它已经包含在现有的多样性措施中。

7.推荐收藏的框架

摘要

  • 本文是关于生成播放列表的公式化问题。
  • 它强调了语境的重要性。
  • 目前,它与推荐多样性没有直接关系。所以我暂时跳过。

8.❤️帮助用户感知推荐多样性❤️

摘要

  • **用户感知的多样性!=客观多样性。**好的 UI 有助于用户更好地感知推荐多样性。

实验

  • 样本量: 20 人
  • **方法:**受试者内实验。每个用户都有两个用户界面。在这两个 ui 之间,推荐项目保持不变,但组织方式不同。第一 UI 具有列表格式;而第二个用户界面是按类别分类的,带有帮助用户理解类别的编辑注释。
  • 结果:用户对第二代用户界面更加满意。他们还认为第二个用户界面推荐了更多样化的项目集合——即使两个用户界面推荐了相同的项目集合。

评论

  • 我很喜欢这篇论文的主题。很有新意。
  • 也就是说,样本量太小了。同样值得注意的是,在 20 名参与者中,有 10 名是中国人,据报道他们的职业是学生、研究助理、工程师和界面设计师。鉴于参与者和本文作者之间的共同国籍和职业,我不能排除这些是作者的朋友同事的可能性,他们听说过实验的设计/实施。毕竟,这篇论文是在瑞典写的,令人惊讶的是大多数实验对象都不是瑞士人。

❤️ 9.百视达文化的下一个兴衰:推荐系统对销售多样性的影响️️(2009)❤️

摘要

  • **研究问题:**推荐者是否有可能增加个体多样性,但降低总体多样性?
  • **方法论:**建立理论模型+模拟

公制的

  • 多样性是用基尼系数来衡量的。

假设

  • 每个用户一次购买 1 件产品
  • 只有两种产品,在没有推荐的情况下,购买概率为(p,1-p)。
  • 当公司推荐一种产品时,它被接受的概率为 r。
  • 该公司的推荐系统是使用历史市场份额生成的。为简单起见,当市场份额≥0.5 时,推荐者会推荐该产品。

消费者偏好

  • 每个消费者被表示为 2D 属性空间中的一个点。
  • **P【消费者 c 对产品 P 的认知】**是产品到消费者的距离、产品的受欢迎程度以及消费者对受欢迎或类似物品的认知如何随距离衰减的函数。
  • *P[消费者 c 购买产品 p]= P[消费者 c 购买产品 p | c 知晓产品 P] P[消费者 c 知晓产品 P]。**假设它是消费者 j 和产品 c 之间相似性的增函数,它也可以修改为包括品种寻求的可能性。
  • 消费者效用函数建模为多项式 logit。

福利影响

  • **认知效应:**推荐者帮助消费者意识到良好的产品契合度。
  • **显著性效应:**推荐者增加了某种产品的显著性,这可能是也可能不是一个好的产品契合度——因为 CF 根据流行度对产品进行排名。
  • 如果推荐者只是增加了更适合的产品的认知度,福利会明显增加。
  • **福利可能下降,**如果突显效应增加了不适合的受欢迎产品。

未来工作邀请

  • “未来,实证研究将有助于确定意识与显著性效应的相对强度.”

后续步骤

这标志着我关于这个话题的第一轮文献综述的结束。下一步包括(1)第二轮文献综述,针对 2011-2018 年间发表的论文;(2)拿出自己的模型来解释 last.fm 这个好奇的案例。

对 DataViz 工具的不满

原文:https://towardsdatascience.com/frustrations-with-dataviz-tools-de27cbcd2ff1?source=collection_archive---------8-----------------------

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

Slide rule (U.S. Air Force photo by Airman 1st Class Keenan Berry)

我对目前可用于数据可视化工作的工具范围感到沮丧。它们正在迅速扩散,但经常试图解决完全相同的问题,并从相似的角度解决它们。一些用例确实被很好地覆盖了,但是很多没有——除非我错了;如果是这样,请告诉我我遗漏了什么产品!

几个被很好覆盖的案例:

使用 R / Python 进行科学分析/发布

统计分析和数据争论是核心。图表可以一个接一个地制作,非常简单,通常看起来并不美观。(你可以把它们发表在科学杂志或你的数据博客上,但不能发表在其他地方。)

我大概有 25%的时间在这里工作,直到……

信息海报设计:R/其他+插画

如果你想要复杂的布局,你需要布局软件,通常是 Illustrator。多个图可以很容易地排列在一起,具有不同的层次和共性。视觉吸引力和可视性很高,完全集成了排版、插图和其他页面设计元素。

我经常从事这方面的工作,工具也很不错。我只是和 Illustrator 有时在本质上更技术性。

简单的交互式图表/仪表盘:大量在线产品

使用 Tableau 或 Plotly 或任何其他数量的服务,您可以制作简单、清晰的图表。它们可以被组合到仪表板中,并且至少是最低限度的交互(悬停状态,打开/关闭变量,也许是一些切片)。

通过 D3 高度定制的互动 Vizzes

从头开始建造你想要的任何东西。非常适合在线。学习曲线高。

这条路我还没走过。Javascript 对我来说是一种非常没有吸引力的语言。交互性也不是那么重要。

少了什么

用于基本打印就绪图形的高度可定制工具

“可定制”和“基本”似乎是对立的,但它们不应该是对立的。我愿意做(大量)前期工作来定义一种风格,然后输入数据,以非常快地获得该风格的结果。这是因为我经常需要为打印文档制作一些基本的图表——我也不是指 Word 文档,而是真实的、设计好的跨页。所以我需要严格遵守预先定义的布局、排版规则等的图表。

尽管有上百万种工具可以制作简单的图表,但没有一种工具可以充分定制。交互式 viz 工具并不适合静态显示,R 中的主要库也不能被正确控制。这很糟糕,但我看到的最好的工具是 Illustrator 的内置图表,可以最小化定制(这些可以追溯到十多年前!).

理想的解决方案:Adobe 为图表制作了一个创意套件应用程序。

一个 DataViz 迷你语言

我不想从线条构建图表(太详细了!)但我也不想要一个试图自动为我制作饼状图的系统(太抽象了!).这种语言的目的应该是通过利用算法思维来促进创新设计;所以需要一些技能和劳动力,但你也不一定要成为 web 开发人员。

我认为我们需要一种真正专注于数据的语法,即去掉所有与网络相关的东西;这是高级的,是为数据迭代而设计的(尽管我通常很喜欢函数式语言)。

现有的解决方案都是推某种解决方案和思考。也许这只是我的背景,但这些通常似乎不太正确。例如,在 R 的 ggplot 中有“图形的语法”,或“格子”显示,这吸引了统计学家们;或者 D3 和它的各种库,这对于专注于 responsive/DOM/等等的 javascript 人来说是有意义的。我认为图形更像一个设计师,也许是一个老式的计算机爱好者。

换句话说,为什么我们要从数据中的属性(比如范围/域)或者从盒子中构建东西?这在技术上是有道理的。但是它对人类探索数据可视化的可能性有意义吗?我想多想想:

  • 等级和布局,以及一些标准化的选择
  • **以及计算机将如何得出值;**也就是说,数据是如何通过计算机将采取的过程映射到像素/矢量上的

我认为海龟图形可以成为一个灵感:因为一只海龟画一条线或点很像人类的手,以特定和明显的顺序。对数据进行循环可以直观地构建出在绘制时以特定方式变化的模式。

简而言之,我们有很好的工具给那些完全不想成为技术人员的人,以及那些想最大限度地成为技术人员的人。我们有很好的互动和在线展示工具。但是据我所知,我们没有好的工具,将算法思维和设计焦点融合在一起;这既适用于印刷,也适用于网络。

如果有的话我会买的!

成就感在于创造一些东西

原文:https://towardsdatascience.com/fulfillment-lies-in-the-creating-something-d118db307405?source=collection_archive---------15-----------------------

这篇博文旨在提供对生成性对抗网络及其数学的完整直观理解,包括它的张量流实现。

注意:读者应该对深度学习有一个基本的了解。

在 2014 年的一篇论文中,蒙特利尔大学的博士生伊恩·古德菲勒介绍了一篇名为《生成对抗网络》的论文,他在米兰的导师包括约舒阿·本吉奥亚伦·库维尔。这篇论文被引用了 5000 多次,并得到了所有深度学习主要先驱的评论。阅读下面 Yann Lecun 对 Gan 的评论。

生成对抗网络是近十年来机器学习中最有趣的想法——Yann le Cun(脸书人工智能主任)

这清楚地表明,生成对立网络做了一些真正有趣的事情。从现在起,我们将把生成性对抗网络称为甘的网络。Gan 很有趣,因为他们可以学习近似数据分布(也称为模仿真实数据),这是非常强大的,因为现在它可以生成现实中不存在的图像、音频剪辑、视频。在某种意义上,你可以认为甘是艺术家。的一句名言解释了甘的直觉。

我不能创造的东西,我不理解——理查德·费曼(美国理论物理学家)

甘的作品产生的效果非常强大,2018 年 10 月,佳士得数码屋(Christie’s digital house)一家法国公司在一场拍卖中以 432,000 美元的价格出售了一幅由甘创作的肖像(图 1.0)。

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

fig 1.0 Portrait by a Gan. source: here

为什么要生成对抗性模型?

这部分是 OpenAI 关于甘的博文摘要。这个想法是,如果 Gan 在创建数据方面变得更好,那么它也能够比任何其他算法更好地理解世界上存在的数据。随着他们学习数据的底层表示,他们将会更好地理解它。Gan 属于生成模型类,基于可微分生成网络的方法,因此它们是实现这一点的方法之一,其他一些流行的方法有:

  1. 变型自动编码器
  2. Rnn 的像 LSTM 的或者 PixelRnn 的
  3. RNN-RBM 顺序输出
  4. 卷积玻尔兹曼机器等等。

稍后将详细介绍这些模型,但想法是一样的,所有这些架构都试图了解定义数据的底层表示。生成模型通常属于一个活跃的研究领域,称为表示学习,即从未标记的数据中学习表示。以上所有的工作方式都不同,但他们都试图学习概率分布。

甘的作品如何?

Gan 的想法很容易理解,它由两个架构组成:一个是鉴别器,用于估计样本为真实样本的概率;另一个是生成器,用于生成接近真实样本的数据。随着时间的推移,鉴别器在鉴别方面变得更好,而生成器在生成更接近真实样本的样本方面变得更好(图 1.1 用于说明)。这两个模型的目标是相反的,因为当生成器最大化鉴别器出错的概率的同时,鉴别器尽力预测正确的标签(真的或假的)。如果你仔细想想一个模型在帮助另一个变得更好,这个想法也会变得有趣。

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

fig 1.1. Block Diagram of Gan’s. source: here

考虑图 1.2。这里 p(x)(右边蓝色的一个)是图像的真实分布,pθ(x)(绿色的一个)是从通过我们的神经网络的高斯分布中提取的点。最初,这些点将是完全随机的,但与训练一样,我们的模型参数θ被优化以最小化两个分布之间的差异(通过使用 KL 散度或任何其他手段)。

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

fig 1.2 source: here

发生器和鉴别器可以是相同或不同的结构,在 Gan 的最初论文中,他们通过提供随机噪声作为发生器的输入来使用多层感知器,并且另一个多层感知器模型被用作鉴别器,其检测样本 a 是产生的还是真实的。在本文的后面部分,我们将通过使用一种基于卷积的架构(称为 DCGAN(深度卷积生成对抗网络))来构建我们自己的生成神经网络,但首先让我们将 GAN 背后的数学放入正确的位置。我会尽量让数学简单,但要确保你的基础知识顺序正确。

制定目标函数

目标是通过将随机噪声 z 作为输入经过神经网络 G(z; θg )其中 θg 是生成器神经网络的参数,把任何一个神经网络看成 a,**Universal function approximator**,我们还将定义另一个神经网络 D(x;θd )鉴别器,这个网络将给出概率 d(x) 【在 0 到 1 之间】 x 来自真实数据而不是 *Pg,*当 G 被训练来最小化 log(1D(G(z))时,D 被训练来预测正确的标签。G 的最小化项 log(1D(G(z)))是有意义的,因为最初,概率 D(G(z))会很低,因为发生器刚刚开始产生样本,鉴别器很容易预测样本是真的还是假的,所以 log(1D(G(z))的总体结果很大。所以当 G 的目标是最小化时,D 的目标是最大化,把这整个情况看作一个最小-最大博弈 V(D,G)

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

fig 1.3 Loss function of Gan’s source here

打破上面的等式,

首先,Ex∞pdata(x)[log(D(x))]—期望[最大化生成的样本 x 是实数]。

第二,Ez∞pz(z)[log(1D(G(z))]—期望[最小化生成的样本不是真实的。]

上述等式本质上是一个最小-最大博弈,其中一个人试图最小化,另一个人试图最大化。让我们以机器学习中的 L2 正则化为例来理解这种最小-最大博弈情况。在正则化中,正则化项防止权重非常小,但同时优化器最小化总体目标函数,这通常导致小的权重值。这种情况类似于 gan 的最小-最大情况,但不同之处在于,Gan 的最小化和最大化都是由优化器本身控制的。

理想情况下,D(x)的最佳值应该是 0.5,这意味着它不能区分真样品或假样品,即

d∫(x)=Pdata(x)/(Pdata(x)+Pg(x))和 Pg = Pdata。

同时训练 D(x;θd )和 G(z; θg 理论上看起来不错但实际操作中我们通常训练 D(x;θd )对于我们每次训练 G(z; θg )使得鉴频器始终强于发生器。

生成性对抗网络训练。

考虑下面给出的图。

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

fig 1.4 source here

这个想法很简单,训练网络进行一些迭代,直到结果看起来令人满意。

重复以下步骤 N 次迭代:

步骤 1:对于 n 次迭代中每一次,K 次迭代:
1.select a mini-batch of noise samples (z1....zm) 2.select a mini-batch of real-data samples (r1....rm) 3.train the discriminator with using max-min loss function [eq(1)] over m samples.

第二步:对于下一次迭代:
1.select a mini-batch (z1.....zm) from p(z) 2.train the generator by minimizing the log probability of generator making mistake.

最初的论文提到了使用 SGD 进行训练,但建议使用更强大的优化器,如 Adam、Adagrad、rms-prop 等。

什么是 DCGAN?

DCGAN 或深度卷积生成对抗网络是对以前的 GAN 的一大改进。虽然理论上甘的架构看起来很简单,实际操作起来却很难训练出一个甘。原因是,梯度必须流过鉴别器和发生器,由于这个事实,Gan 的训练变得不稳定。我们将在本文的后面部分讨论这些主题,但首先,让我们试着理解 DCGAN 的架构。

DCGAN 本身是一类基于深度卷积的架构,由两个卷积神经网络组成,具有以下约束条件(根据原始论文,阅读:此处为)。以下约束是在执行广泛的模型搜索后得出的。

  1. 用步长卷积替换所有池层,通过这种方法,网络不是依赖池层(最大池或平均池)来执行空间下采样,而是自己学习。
  2. 移除所有完全连接的层以创建更深层次的架构,因为完全连接的层会影响网络的收敛。
  3. 使用批处理标准化来稳定深层之间的梯度流。
  4. 对生成器中的所有层使用 ReLu 激活,除了使用 tanh 的输出层和使用 sigmoid 或 softmax 的鉴别器。

在 DCGAN 的原始论文中提出的体系结构包含一个产生噪声的输入层以及发生器中的四个去卷积层和鉴别器中的四个卷积层以及一个输出层。

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

fig 1.5 DCGAN architecture. source here

如果你不知道转置卷积,那么看看 Naoki Shibuya 的博客文章。

构建深度卷积生成对抗网络。

本次演示的代码取自于tensor layerDCGAN 的原始实现,经过修改后可用于 Sully Chen 数据集和分层可视化,以真正理解网络是如何学习的。该数据集是为训练自动驾驶汽车而建立的,它包含 63k 张道路驾驶图像,以及相应的转向角和其他值,如油门踏板等。他们使用这个数据集的主要想法是看看 Gan 能多好地模拟真实的驾驶场景,如其他行人、车辆等。如果你从更大的角度来看,这个实验很棒,因为现在你不需要依赖安装在你车前的摄像头来捕捉道路图像,你只需要坐在一个房间里就可以产生无尽的数据。虽然用生成的图像来训练自动驾驶汽车的想法有多好?我将把它留待进一步讨论。

注意:模型的所有权重都使用 Glorot 初始化器初始化。典型的 Glorot 初始化如下所示,

步骤 1: std_dev = sqrt(2.0/(扇入+扇出))
步骤 2:权重=正态分布(平均值=0.0,stddev)

如果你想了解更多关于 Glorot 初始化器或者为什么使用它,点击这里

Tensorflow 实现的生成器

让我们看看生成器的代码。代码的流程如下:

1.定义发生器参数,如输出图像大小,过滤器参数,伽玛初始化。

2.输入层的维数为 100,即 100 个随机数,由均值= 0、标准偏差= 1.0 的均匀分布生成。

3.输入层与 64 864*64 单元的密集层相连。

4.重塑致密层高度= 64,宽度= 64,深度= 512

5.使用批量归一化进行归一化,gamma 采样自均值= 1.0、std_dev=0.02 且 ReLu 激活的均匀分布。

6.DeConv2d 或简单转置卷积层,内核=(5,5),步幅= (h=2,w=2),深度 64 *4,零填充。

7.使用 ReLu 激活进行批处理标准化。

8.DeConv2d 或简单转置卷积层,内核=(5,5),步幅= (h=2,w=2),深度 64 *4,零填充。

9.使用 ReLu 激活进行批处理标准化。

10.DeConv2d 或简单转置卷积层,内核=(5,5),步幅= (h=2,w=2),深度 64 *4,零填充,双曲正切激活。

鉴别器的张量流实现

  1. 定义模型参数,如输出图像大小,过滤器参数,伽玛初始值。
  2. 卷积层,内核大小= (5,5),步距= (h=2,w=2),具有 Relu 激活和零填充。
  3. 卷积层,内核大小= (5,5),步距= (h=2,w=2),具有 Relu 激活和零填充。
  4. 使用 gamma =正态分布(平均值= 1.0,标准差= 0.02)进行批量标准化。
  5. 卷积层,内核大小= (5,5),步距= (h=2,w=2),具有 Relu 激活和零填充。
  6. 使用 gamma =正态分布(平均值= 1.0,标准差= 0.02)进行批量标准化。
  7. 卷积层,内核大小= (5,5),步距= (h=2,w=2),具有 Relu 激活和零填充。
  8. 使用 gamma =正态分布(平均值= 1.0,标准差= 0.02)进行批量标准化。
  9. 展平图层。
  10. 带有 1 个隐藏单元的输出层,带有 Sigmoid 激活。

让我们将生成的结果与真实结果进行比较

我不得不说结果看起来比预期的更有希望。在此之前,让我们看看真实数据图像是什么样的(下面的样本是从真实数据集中随机抽取的,目的是看看 gans 在理解数据方面有多好)。

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

fig 1.6 Random samples from train dataset source

现在生成的样本,

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

epoches from 1st to 3rd

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

epoches from 4th to 7th

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

fig 1.7 Incremental progress shown using epoches as progress points.

如您所见,第一个时期模型的样本只能获得数据的本质,但随着时期数量的增加,输出变得更好,在第 10 个时期,输出变得更好。这个网络被训练了 30 个 epoches,让我们来想象一下。从 epoches 11 到 epoches 排列成一行的图像。

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

fig 1.8 Generated samples from 11th epoch to 30th(some results skipped)

接近最后一个时代,结果开始捕捉甚至微小的建筑,如轮胎,灌木等。尽管效果不错,但生成器有时仍无法捕捉道路和山脉之间的模糊边缘,导致两者融合。结果仍然是完全可以接受的。

发电机和鉴频器损耗。

Gan 的会聚不稳定,这直接反映在损耗值的变化中。下面提供了我们 gan 架构的损耗值。

Epoch: [ 2/30] [ 139/ 997] time: 0.4634, d_loss: 0.67223823, g_loss: 0.71121359
Epoch: [ 2/30] [ 140/ 997] time: 0.4640, d_loss: 1.28069568, g_loss: 1.98622787
Epoch: [ 2/30] [ 141/ 997] time: 0.4628, d_loss: 1.44974589, g_loss: 0.46058652
Epoch: [ 2/30] [ 142/ 997] time: 0.4819, d_loss: 1.02387762, g_loss: 1.69937968
Epoch: [ 2/30] [ 143/ 997] time: 0.4781, d_loss: 0.59786928, g_loss: 1.81390572
Epoch: [ 2/30] [ 144/ 997] time: 0.4632, d_loss: 0.96302533, g_loss: 0.62419045
Epoch: [ 2/30] [ 145/ 997] time: 0.4622, d_loss: 0.62077224, g_loss: 1.15416789
Epoch: [ 2/30] [ 146/ 997] time: 0.4726, d_loss: 0.57695013, g_loss: 1.11101508
Epoch: [ 2/30] [ 147/ 997] time: 0.4843, d_loss: 0.64481205, g_loss: 1.35732222
Epoch: [ 2/30] [ 148/ 997] time: 0.4617, d_loss: 0.46775422, g_loss: 1.74343204
Epoch: [ 2/30] [ 149/ 997] time: 0.4668, d_loss: 0.60213166, g_loss: 0.84854925
Epoch: [ 2/30] [ 150/ 997] time: 0.4637, d_loss: 0.75188828, g_loss: 1.56600714
Epoch: [ 2/30] [ 151/ 997] time: 0.4644, d_loss: 0.80763638, g_loss: 0.80851054
Epoch: [ 2/30] [ 152/ 997] time: 0.4685, d_loss: 0.66286641, g_loss: 0.79960334
Epoch: [ 2/30] [ 153/ 997] time: 0.4619, d_loss: 0.64668310, g_loss: 1.32020211
Epoch: [ 2/30] [ 154/ 997] time: 0.4742, d_loss: 0.46545416, g_loss: 1.55003786
Epoch: [ 2/30] [ 155/ 997] time: 0.4970, d_loss: 0.94472808, g_loss: 0.49848381
Epoch: [ 2/30] [ 156/ 997] time: 0.4768, d_loss: 0.78345346, g_loss: 1.03955364

我们可以清楚地观察到鉴频器和发电机损耗值上升和下降了多少。与 gans 训练相关的问题将在本博客的后半部分讨论。

使用发生器和鉴别器的分层可视化来解释 Gan

在我们看到的大多数应用中,涉及到神经网络,它们就像一个黑盒,即从一方给出数据并得到输出。我们通常不了解网络内部发生了什么,即使是在抽象的层面上,所以我决定在这个方向上迈出一步,并试图了解生成器和鉴别器中每一层的输出发生了什么,网络是如何生成或鉴别数据的。

注:所有分层输出都是在 Sully Chen 上用 30 个历元训练网络后归一化前得到的。

发电机

第 1 层: 正如所料,最初网络只产生一些噪声。

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

fig 1.9 1st Layer output

第二层: 网络开始生成一些模式。

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

fig 1.10 2nd Layer output.

第三层: 有用的模式出现了。

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

fig 1.11 3rd Layer output

第 4 层: 将应用 tanh 激活的最终图案。

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

fig 1.12 4th Layer Output

鉴别器

第 1 层: 我们知道较低层用于提取简单的特征,如水平或垂直边缘检测,在我们的实验中观察到了同样的情况。

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

fig 1.13 1st Layer output.

第二层: 第二层的输出在第一层输出后完成。我们能理解的不多,但所有这些对网络本身都很重要。

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

fig 1.14 2nd Layer output.

第三层: 尺寸变小,预测仅与网络相关。

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

fig 1.15 3rd Layer output.

第四层: 网络越深入,很难做出任何解读,但网络就是这么做的。

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

fig 1.15 4th Layer output.

这些可视化让我们对网络如何预测以及每一层的输出发生了什么有了一些基本的了解,但我们只是触及了表面,要了解这些网络在做什么还有很多。这个开发的完整代码可以在我的 github 这里找到。

甘的问题

理论上,gan 的工作听起来不错,似乎应该收敛到全局最小值,但实际上,当生成器 G 和鉴别器 D 都表示为神经网络时,收敛的机会急剧下降,并且在大多数情况下,收敛将停止在鞍点。

在训练甘时,主要观察到以下问题

  1. **纳什均衡问题:**这个问题主要是由于 Gan 最小-最大公式而存在的。在这种情况下,一个函数的两个部分只能在一个点上达到最佳值,在静止状态下,它保持不稳定。下面的例子摘自深度学习书籍,考虑一个函数 F(u,v) = uv,其中我们必须最小化 u 的值和最大化 v 的值,那么当 u=v=0 时,F(u,v)的唯一最优值存在。
  2. **模式崩溃:**在这种情况下,Gan 无法捕获所有类别的数据,只能生成某些类型的模式。通常这种问题不会发生,但如果发生,可能会有问题。
  3. **梯度递减:**当鉴别器或生成器的梯度变得很小时,这种情况很常见,它几乎停止了另一个的学习。这主要发生在鉴别器的情况下,因为它变得更好,因此梯度变得如此之小,以至于生成器无法学习分布。为了避免这个问题,建议在实际训练整个 gan 之前不要训练鉴别器。

稳定 Gan 仍然是深度学习领域的一个活跃的研究领域,许多学术机构和组织都在从事这方面的工作。如果你有兴趣更多地了解与甘退房相关的当前问题,这是的博客文章,作者 Jonathan hui

应用程序

虽然 Gan 的建立牢记合成数据,并从本质上制作模型,以了解更多关于构成真实世界数据的表示,但不幸的是,Gan 的大多数当前使用并不友好,许多甚至是灾难性的,其中一个著名的例子是 deep fakes ,其想法是创建人说或做某事的假图像。这些企图会对社会和国家造成严重损害。尽管如此,gan 还是有一些很酷的应用,

  1. 在网上服装行业,顾客可以在实际购买之前,通过试穿人工生成的虚拟版本来了解服装的外观。
  2. 生成卡通人物,而不是依赖昂贵的软件。
  3. 而不是依赖于工作室。一个经典的例子是最近中国国家新闻机构新华社上传了一段人工智能新闻主播而不是真人的报道。虽然他们没有透露他们的模式是什么,但我在这里采取了有根据的猜测。

摘要

生成对抗网络是目前深度学习中最有前途的技术之一。它们是建立在非常简单且感觉最普通的想法上的。我们的,似乎是甘的一个很好的实验,我会在我的博客里写更多的。完整的代码可以在这里找到。

参考

甘的初始论文:

DCGAN 论文:https://arxiv.org/abs/1511.06434

tensorlayer dcgan 实现:https://github.com/tensorlayer/dcgan

CNNVIS(可视化库):【https://github.com/InFoCusp/tf_cnnvis

open ai 的生成模型博客

甘的问题:https://medium . com/@ Jonathan _ hui/Gan-why-it-so-hard-training-generative-advisory-networks-819 a86b 3750 b

github/carpedm 20/DCGAN-tensor flow

应用课程

Glorot 初始化器:andyl Jones . Tumblr . com/post/110998971763/an-explain-of-Xavier-initial ization

深度学习书籍:www.deeplearningbook.org/

成熟的推荐系统

原文:https://towardsdatascience.com/full-fledged-recommender-system-3bdf52b1eb69?source=collection_archive---------11-----------------------

人工智能应用的快速崛起,处理器和内存成本的降低,使得过去十年推荐系统取得了令人难以置信的进步。鉴于它们在零售业中日益上升的重要性,它们无疑是人工智能中更受欢迎的话题之一。

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

http://thedatascientist.com/wp-content/uploads/2018/05/recommender_systems.png

然而,创建一个成熟的、可投入生产的推荐系统可能是一项有点复杂的任务,需要非常系统的方法。在这篇文章中,我将一步一步地指导你如何创建一个推荐系统。

如果你参加过 AI 训练营和课程,你可能知道几乎每一个都包括开发一个基于评分/星级从 1 到 5 的推荐系统(是的,你知道那个有标准电影数据集的)。虽然这些都是很好的入门练习,但它们缺乏现实生活中的例子。当开发一个推荐系统时,你很可能也想参与"用户评论",它包含了许多需要包含在模型中的重要特性。对于用户评论,准备好使用 NLP。

在本教程中,我们将使用来自 Yelp 网站的数据来表示一个餐馆推荐问题。数据集包含业务 id、用户 id、评分和评论。基于用户的搜索,任务是推荐三家餐馆。这个例子最好使用 Jupyter 笔记本(你可以在这里找到 j upyter 笔记本和数据)。)

首先,我们需要创建我们的工作流程管道。我们的复杂模型就是从这个管道开始构建的。

管道:

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

现在,让我们按照管道开始构建我们的模型。

在第一步中,我们接收来自用户的输入,比如“素食比萨饼,便宜,有各种配料。”

第二步,我们对输入进行标记,得到:“蔬菜、披萨、便宜、多样、顶级。”

第三步,将这些令牌与业务功能相匹配。如何才能获得业务特征?这部分完全取决于我们的创造力和特征工程技能。我使用下面描述的特性创建了一个业务特性矩阵。行是业务类别,列是业务特征。如果某个功能在用户评论中,则分配“1”,如果某个功能不在评论中,则分配“0”在这种情况下,计算评论的词频-逆词频(tf-idf ),并手动选择与餐馆企业相关的词。接下来,找到与餐馆类型和菜单相关的单词(从餐馆在线找到)。最后,合并来自 tf-idf 和收集的 internet research & menu lookup 的两组特性。

以下是业务特征矩阵的示例快照:

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

Business Features Matrix

第四步,过滤出与用户输入相关的商家。我们如何做到这一点?以用户输入的第一个词为例:“蔬菜。”转到业务特征矩阵中的蔬菜一栏,在与蔬菜对应的业务中填入所有的 1。对其他特征(单词)重复相同的过程。

第五步,通过使用受限的波尔兹曼机器(RBM),预测用户是否会喜欢商家提供的选择。这一步将创建一个单行,在列中包含企业。如果用户喜欢这些选择,相应索引中的元素将为 1,否则为 0。

在第六步中,从与用户搜索标准相关的餐馆的搜索结果中取出前三个选择。

在第七步中,考虑另一个场景,用户的搜索是边缘的,RBM 不能返回三个餐馆。尽管对于大型数据集来说,这种情况不太可能发生,但我们仍然应该考虑例外情况。在这种情况下,使用自动编码器来预测每个企业的评级。这将返回一个与 RBM 非常相似的数组,但是这次数组将包括从 1 到 5 的数字(等级),而不是 0 和 1

在第八步中,根据评级,取前三个预测,并将它们与 RBM 预测合并。

在第九步中,如果我们仍然不能为用户找到三家餐馆(此事件再次发生的概率非常低),根据他们的总体评分选择前三家餐馆(请注意,此评分与第八步中的评分不同。不要混淆,自动编码器的预测也返回从 1 到 5 的等级)。

在第十步中,如果我们想向用户推荐新的餐馆,我们将使用协同过滤和基于内容的过滤技术来找到用户会喜欢的餐馆。这是如何工作的?

我们定义了企业和用户的相似度函数。例如,如果用户 A 和 B 的口味相似,推荐系统将向用户 A 推荐用户 B 也喜欢的餐馆,反之亦然。这就是协同过滤的主要思想。

另一方面,如果用户 A 喜欢素食场所,提供素食选择的商家也会彼此相似。将向用户推荐其他素食餐馆。这是基于内容的过滤。请看 jupyter 笔记本如何创建业务和用户相似性函数。

协同过滤和基于内容的过滤技术不能用于该数据集,因为该数据集对于推荐系统来说太小。皮尔逊相关的经验法则是 25。(https://www . research gate . net/post/What _ is _ the _ minimum _ sample _ size _ to _ run _ Pearsons _ R),我们的数据集平均每个商家有 2 个评分。如果您使用较大的数据集,您可能希望使用这些技术,因为它们非常强大!

最后,在步骤十一,向用户推荐排名前三的餐厅。

我希望这篇教程能让你对推荐系统有更好的理解。你可以从这里访问完整的代码和数据。敬请关注“如何部署推荐系统。

谢谢你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值