TowardsDataScience-博客中文翻译-2016-2018-二十九-

龙哥盟 / 2024-10-13 / 原文

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

平均而言,你使用了错误的平均值——第二部分

原文:https://towardsdatascience.com/on-average-youre-using-the-wrong-average-part-ii-b32fcb41527e?source=collection_archive---------2-----------------------

真实和模拟数据+使用 R & BigQuery 的汇总统计动态

Depiction of harmonic, geometric & arithmetic means of a simple geometric series, from Part I.

前言

本系列的第一部分构建了一个实用的&概念框架,用于在数据分析中使用鲜为人知的勾股方法来理解&。我竭尽全力(大约 5000 个单词)为普通观众建立直觉,只需要小学数学知识。

这篇文章将会更深入一点&更具技术性,探索这些方法在更丰富的模拟数据集下的动态变化,这些数据集来自于几个概率分布。然后,我们将这些与一些可比较的“真实世界”大数据集并置。我的目标也是更简洁和经济,假设有更高水平的数学和概率理论。

毕达哥拉斯的意思是重述

回想一下,有 3 种毕达哥拉斯方法符合不等式:

**harmonic mean** ≤ **geometric mean** ≤ **arithmetic mean**

只有在数据集中的每个数字都是相同数字的极限情况下,它们才是相互等价的。

  • **arithmetic mean**通过简单的加法&除法产生。
  • **geometric mean**是通过乘法&根产生的。
  • **harmonic mean**是通过倒数,加上&除法产生的。

他们的方程式是:

via Wikipedia

因此,每一个都可以被导出或表达为彼此的重新配置。例如:

  • **geometric mean**就是数据集的对数转换值的**arithmetic mean**的反对数。它还可以有时保持缩放到一个共同分母的比率的顺序**arithmetic means**,或者至少产生类似的可信汇总值。
  • **harmonic mean**是数据集倒数的**arithmetic mean**的倒数。它也可以通过数据集的适当**weighted arithmetic mean**来再现。

经验法则:

  • **arithmetic mean**最适合于加法线性对称正态/高斯数据集
  • **geometric mean**最适合于乘法几何指数对数正态偏斜数据集,以及不同尺度上的比率 & 复合增长率
  • **harmonic mean**是三者中最罕见的,但就分子而言,它非常适合平均比率,如旅行率、一些财务指标&各种专业应用从物理学到数学&机器学习模型的评估。

局限性:

  • 由于相对罕见,**geometric** & **harmonic**的意思可能很难解释&误导观众期待“平均”更传统的含义
  • **geometric mean**实际上是“无单位”的,因为标度&可解释单位在乘法运算中丢失(因子在不同标度上)
  • **Geometric** & **harmonic**表示不能容纳≤ 0 的输入

更详细的讨论见第一部分。我们现在将看到一些实际操作。

模拟数据集

在第一部分中,我们观察了在平凡的加法和乘法数据集下勾股平均的动力学。在这里,我们将通过模拟 r 中各种概率分布的更丰富的数据集来扩展这个练习。

对于我们的加法线性数据集,我们将从随机正态分布中抽取 10,000 个样本,平均值为 100 &标准差为 20,以避免抽取值≤ 0:

hist( 
  rnorm( 10000, 100, 20 ) 
  )

接下来我们将模拟三种类型的乘法数据集(尽管有意义 差异,但它们通常难以区分):对数正态分布**、指数分布、&、幂律分布。**

有许多方法可以产生对数正态分布——基本上任何同分布随机变量的乘法相互作用都会产生对数正态分布——这就是为什么它在现实世界中如此频繁地出现,特别是在人类的努力中。为了简化&的可解释性,我们将简单地将欧拉数提升到从正态分布中抽取的随机指数,然后加上 100,使其处于我们的正态分布的范围内:

hist(
  exp(1)^rnorm(10000,3,.9) + 100,
  breaks = 39
 )

从技术上讲,这是一个指数分布的特例,但是我们将通过 R 的rexp函数模拟另一种变化,在这里我们简单地指定样本的数量&衰减率(同样,将结果加 100):

hist(
  rexp(10000, 1/10) +100
 )

最后,我们将通过将样本从正态分布提升到常数指数(再次是欧拉数,保持其自然*)来生成幂律分布,然后加上 100:*

(注意,这与我们的对数正态方法相反,其中欧拉数是基数&分布是指数)

*hist(
  rnorm(10000, 3, 1)^exp(1) + 100
 )*

好了,现在我们将使用**ggridges**包来更好地绘制我们的分布图。我们还会加载**tidyverse**包,像文明用户一样:

*library(tidyverse)
library(ggridges)*

让我们把我们的分布放入一个有序因子表中:

现在让我们更巧妙的看看我们的发行版:

身材匀称的一群人。让我们计算一些汇总统计数据。

既然 R 本身没有 ***geometric*** 或者 ***harmonic*** 的意思函数,我们就要稍微狡猾一点:

输出:

*# A tibble: 4 x 5
  distribution median    am    gm    hm
  <fct>         <dbl> <dbl> <dbl> <dbl>
1 normal         99.6  99.9  97.7  95.4
2 lognormal     120   129   127   125  
3 exponential   107   110   110   109  
4 power law     120   125   124   122*

…并将它们添加到我们的图中:

(note: I did some post-production editing for the subtitle legend cuz I can never bend gglegends sufficiently to my will — & the median lines are a bit of a hack)

我们立即注意到偏斜密度以及长&厚尾对均值分布的影响以及它们与中位数的关系:

  • 在我们的正态分布中,**median** & **arithmetic mean**几乎完全相同。(99.6 & 99.9分别按上表输出)。
  • 我们的其他分布的向右偏斜将所有的平均值拉向**median**的右边,这倾向于数据集的更密集的峰

虽然这里有点拥挤,但让我们通过调整 x 轴限制来仔细看看,又名xlim():

*...xlim(90, 150)...*

  • 再次注意,在正常对称数据集中,**geometric** & **harmonic**意味着有意低估了数据的“中点”,但大致等间距(每个约相隔 2 个单位)。
  • 对数正态分布中,长(略细)的尾巴将均值拉离**median**所代表的有序中点很远,&甚至会扭曲均值的分布,使得**arithmetic****harmonic****geometric**更远。
  • 在我们的指数分布中,值是如此密集&指数衰减的短细尾巴消失得如此之快,以至于我们的平均值也挤在一起——尽管严重的偏斜仍然将它们从**median**中移走。
  • 我们的幂律分布衰减最慢,&因此尾巴最粗。尽管如此,它在“身体”中几乎是正常的,不对称分布的偏斜是最轻微的。它的平均距离大致相等,但仍远离**median**

第一部分 &上面我提到的**geometric** & **arithmetic**的对数关系是指:

**geometric mean**只是数据集的对数转换值的**arithmetic mean**的反对数。

为了证明这一点,让我们再看一下我们摘要统计表:

*# A tibble: 4 x 5
  distribution median    am    gm    hm
  <fct>         <dbl> <dbl> <dbl> <dbl>
1 normal         99.6  99.9  97.7  95.4
2 lognormal     120   129   ***127***   125  
3 exponential   107   110   110   109  
4 power law     120   125   124   122*

注意我们的log normalT5:127

现在我们将计算对数转换后的值的**arithmetic mean**:

*dist2$x %>% log() %>% mean()# output:
[1] 4.84606*

…&然后拿那个号码的反日志*:*

*exp(1)^4.84606# output
[1] 127.2381*

就这样。

现在,为了让大家明白这一点,让我们来看看为什么会这样(为什么对数正态分布得名):

*# subtract 100 we originally added before taking the log(dist2$x — 100) %>% log() %>% hist()*

顾名思义,对数正态分布的对数变换产生了正态分布。因此,**arithmetic mean**的加法基在正态分布中产生的结果与**geometric mean**的乘法性质在对数正态分布中产生的结果相同。

我们不应该对经过对数变换的对数正态数据集产生的完美正态分布印象太深,因为我们指定了产生对数正态值的精确的数据生成过程,&实际上只是颠倒了该过程,以再现潜在的正态分布。

在现实世界中,事情很少如此整齐,生成过程通常更加复杂&未知或不可知。因此,关于如何建模的困惑&争议描述经验得出的数据集。

让我们来看一些这样的数据集&看看有什么大惊小怪的。

真实世界数据

虽然通常不如我们的模拟分布温顺,但真实世界的数据集通常至少类似于上述四类中的一类。

正态分布——被大肆宣传的“钟形曲线”——最常出现在自然&生物有机体&相互作用很少的场景中。身高&体重是典型的例子。因此,我的第一反应是寻找可靠的数据集。它满足了要求,但是关于n = 50(数据集中一种花的观察数量)还有一些不足之处。我在想更大的*。*

所以让我们加载[bigrquery](https://github.com/r-dbi/bigrquery)包,&做 bigRqueries

library(bigrquery)

谷歌的 BigQuery 提供了大量真实数据的公共数据集,有些非常大,从基因组学到专利再到维基百科的文章统计。

出于我们最初的目的,natality数据集看起来足够生物化:

*project <- “YOUR-PROJECT-ID”sql <- “SELECT COUNT(*) 
        FROM `bigquery-public-data.samples.natality`”query_exec(sql, project = project, use_legacy_sql = F)*

(protip:这里有很多数据,&你得到的 是按被访问的数据量收费的 ,但是你每个月的第一 TB 是免费的。此外,尽管 SELECT * 由于显而易见的原因而被极力劝阻,但 SELECT COUNT(*) 实际上是一个自由操作,&是一个扩展事物范围的好主意)

输出:

**0 bytes processed*
  f0_
1 137826763*

这还差不多,1.37 亿婴儿记录。我们不太需要所有这些,所以让我们随机抽取 1%的婴儿体重,取前一百万个结果&看看我们得到了什么:

*sql <- “SELECT weight_pounds
        FROM `bigquery-public-data.samples.natality`
        WHERE RAND() < .01”natal <- query_exec(sql, project = project, use_legacy_sql = F,
                    max_pages = 100)*

输出:

*Running job /: 7s:1.0 gigabytes processed
Warning message: 
Only first 100 pages of size 10000 retrieved. Use max_pages = Inf to retrieve all.*

hist(natal$weight_pounds)产量:

正常 af imo。

现在,为了找到一些有偏差的乘法数据,让我们超越生物学,进入社会学。

我们将查看 New York 数据集,其中包含各种城市信息,包括乘坐黄色&绿色出租车的出行。

*sql <- “SELECT COUNT(*) 
        FROM `nyc-tlc.green.trips_2015`”query_exec(sql, project = project, use_legacy_sql = F)*

输出:

**0 bytes processed*
  f0_                                                               
1 9896012*

不到 1000 万,所以我们来看看整个旅程的距离:

(这可能需要一段时间)

*sql <- "SELECT trip_distance FROM `nyc-tlc.green.trips_2015`"trips <- query_exec(sql, project = project, use_legacy_sql = F)hist(trips$trips_distance)*

-_-

看起来有一些极端的异常值把我们的 x 轴拉到了 800 英里。糟糕的出租车之旅。让我们把这个范围缩小到 20 英里以内&再看一看:

trips$trip_distance %>% subset(. <= 20) %>% hist()

这就是我们,对数正态分布的一个警示标志:长尾。让我们通过绘制日志直方图来检查数据的对数正态性:**

trips$trip_distance %>% subset(. <= 20) %>% log() %>% hist()

正常的肯定,但我们超过了标记一点&现在观察到一点左歪斜。唉,现实世界又来了。但是可以肯定地说,对数正态分布在这里并不是一个完全荒谬的模型。

继续前进。让我们找到更多的重尾数据,这次是在一个更接近我自己的数字网络分析专业亲和力的领域:Github 数据集:

**sql <- "SELECT COUNT(*)
        FROM `bigquery-public-data.samples.github_nested`"query_exec(sql, project = project, use_legacy_sql = F)**

输出:

***0 bytes processed*
  f0_
1 2541639**

250 万行。由于我开始担心我的本地机器的内存,我们将使用我们的随机采样器&百万行定界符来获得每个 github 库的“观察者”计数:

**sql <- “SELECT repository.watchers 
        FROM `bigquery-public-data.samples.github_nested`
        WHERE RAND() < .5”github <- query_exec(sql, project = project, use_legacy_sql = F,
                     max_pages = 100)github$watchers %>% hist()**

同样,极端的长尾动态,所以让我们做一些修整:

github$watchers %>% subset(5 < . & . < 3000) %>% hist()

指数 af。

但是又是 lognormal 吗?

github$watchers %>% subset(5 < . & . < 3000) %>% log() %>% hist()

不要。

谁知那只稀有的野兽:分布!****

让我们从大数据瓮中再抽取一个,这一次看几十个黑客新闻帖子:

****sql <- “SELECT COUNT(*)
        FROM `bigquery-public-data.hacker_news.full`”query_exec(sql, project = project, use_legacy_sql = F)****

输出:

*****0 bytes processed*
  f0_
1 16489224****

****sql <- “SELECT score
        FROM `bigquery-public-data.hacker_news.full`
        WHERE RAND() < .1”hn <- query_exec(sql, project = project, use_legacy_sql = F,
                 max_pages = 100)hn$score %>% hist()****

hn$score %>% subset(10 < . & . <= 300) %>% hist()

较慢的衰减(一旦修整)。至于对数变换呢?

hn$score %>% subset(10 < . & . <= 300) %>% log() %>% hist()

再次粗略地用向右衰减的对数均匀化

我粗略地搜索了一下野外的幂律分布,结果证明毫无结果,这也许并不奇怪,因为它们最常出现在网络科学中(&,似乎比最初声称的还要稀少)。

在任何情况下,让我们组织我们真实世界的数据集,就像我们对模拟分布所做的那样&比较性地绘制它们。我们将对它们进行归一化,再次将它们集中在 100 左右:

现在开始绘图:

与它们来自的真实世界一样,边缘比我们模拟的分布要粗糙一些。仍然非常相似。让我们将它们与来自不可或缺的托马斯·林·彼得森的新(& excellent) 拼接包并排放在一起:

乍看之下,我们的模拟分布将为其相邻的真实世界数据集提供合理的模型,除了**power law** -> **hacker news scores**,其中衰减的凹度&尾部的权重有很大不同。

当然,还有许多更严格的模型拟合等测试,但让我们像以前一样,通过绘制分布的汇总统计来再看一看。

不幸的是,关于标准化的真实世界数据的一些东西干扰了我的汇总统计计算,它们都或多或少地彼此无法区分。我怀疑这与计算机在浮点运算上的挣扎有关(但也可能与我自己在算术上的挣扎有关)。在任何情况下,我们将不得不使用我们的非标准化的真实世界数据,这意味着我们将不得不单独绘制它们&尝试手动排列 ggridge 拼接。

首先编译我们的非标准化分布并计算汇总统计数据:

现在开始绘图(这很难看,因为我们必须为每个真实的分布创建单独的绘图,但是拼接允许我们优雅地定义布局):**

有趣的是,我们真实世界的数据集汇总统计数据似乎比我们模拟的分布更加分散。让我们放大来仔细看看。

我不会转贴所有代码,但基本上只是修改了pm1,让xlim(90, 150) &取消了其余情节中xlim()行的注释:

这里甚至更明显,但是对于正态分布:汇总统计动态差异很大,这应该让我们在容易地“目测”理想化模型与现实世界数据的拟合时暂停。

这就结束了我们在模拟的&真实世界分布下对毕达哥拉斯意义的探索。

如果您还没有,请查看第一部分以获得更低级、更明确的&直观介绍。参考资料见下文&进一步阅读。

还有,关注我更多这样的!


在推特上关注:@ dnlmcLinkedIn:【linkedin.com/in/dnlmc】T4Github:https://github.com/dnlmc

选择参考文献和进一步阅读

第一部分

  • https://en.wikipedia.org/wiki/Pythagorean_means
  • https://en.wikipedia.org/wiki/Summary_statistics
  • https://en.wikipedia.org/wiki/Central_tendency
  • 位置测量&展开”—stat.berkeley.edu
  • "中位数 vs 平均家庭收入 " — LinkedIn
  • "平均收入 vs 中位收入"
  • 你应该用几何平均数来总结数据
  • ”哪个‘意思’要用&当? " —堆栈溢出
  • "什么时候取算术平均值 vs 几何平均值 vs 调和平均值最合适?”—Quora
  • 算术,调和&几何意思同 R
  • "使用市盈率调和平均值来提高公司估值 " —期刊文章

第二部分

  • https://en.wikipedia.org/wiki/Heavy-tailed_distribution
  • https://en . Wikipedia . org/wiki/Relationships _ inter _ probability _ distributions
  • http://www . win-vector . com/blog/2010/02/living-in-a-log normal-world/
  • "幂律和对数正态分布生成模型简史 " —期刊文章
  • "幂律分布与指数衰减的区别 " —堆叠交换
  • "现实世界网络中发现的幂律证据不足 " —量子杂志

成为一名公民数据科学家

原文:https://towardsdatascience.com/on-being-a-civic-data-scientist-774c15232695?source=collection_archive---------6-----------------------

我很高兴地告诉大家,我在波士顿的城市找到了一份数据科学家的工作,具体来说是在 T2 的城市分析团队。我对这个新角色感到兴奋,尤其是我将在这座城市学到的所有新东西。抱歉,无线电静默,但我正在做整个令人疲惫的数据科学家采访过程。

我将成为第一个代表洞察数据科学。我参加了健康数据项目(实际上一心想要做健康数据科学),在那段时间里,我学到了很多宝贵的技能。我还与一群热情、聪明、崭露头角的数据科学家进行了交流。没有他们的帮助,我永远也不会得到这份特殊的工作。Insight 社区很棒,我建议任何想走出学术界的博士考虑一下。

在 DS 世界中,面向公民的数据科学似乎被技术和健康数据世界中的大玩家大大掩盖了。然而,如果你做一个快速搜索,许多城市现在都有开放数据门户,并且可以说是开放数据运动的一些主要驱动力。仅举几个例子:

  • DataSF
  • 纽约市公开数据
  • 芝加哥城市数据门户
  • 开放数据 DC
  • 分析波士顿(当然!)

大城市正在利用数据做一些很酷的事情,包括改善交通运输和减少交通事故,确定城市服务(如医疗保健、教育)中有关社会不平等的因素,微调 EMS 响应时间,优化街道停车,减少无家可归者,等等。城市手边有大量的数据,并且正在做许多有趣的工作来提高市民的生活质量和改善城市服务。

我在伦敦金融城的工作有点像数据科学家和数据经理的混合体。我一半的时间花在与利益相关者交谈和指导初级数据科学家上(稍后将详细介绍利益相关者的工作)。在研究生院和博士后期间,我真的很喜欢教学和指导,所以管理方面的事情是我真正喜欢的事情之一。当我的日历没有排满会议时,你可以在我的电脑前找到我,一个屏幕上是终端,另一个屏幕上是 RStudio、Jupyter、Spyder 或任何随机 IDE。这真是两个世界的完美结合。

我正在围绕波士顿的零愿景计划做大量工作,该计划旨在减少整个城市的交通事故和死亡人数。我们从波士顿警察局、EMS 和 Waze 那里获得了大量关于交通数据的数据,我花了一些时间浏览这些数据。最近,我一直在 RShiny 构建仪表板,以显示分析和/或模型预测。很有意思的工作!

到目前为止,我在这里的这段时间学到了不少东西。当你在市政府工作时,你必须灵活运用你所使用的工具。我们的团队是一个乌合之众的小团体,不同的人使用不同的工具。我们的数据科学家在 R、python、一些 javascript、SQL Server、Postgres 和一些 shell 脚本之间跳跃。我们也有人使用 Tableau、Excel 和 Stata。因此,我们都必须保持灵活性,并准备好学习新工具。

学习 ETLs (extract-load-transform)和通用数据工程原理是我没想到的。我们正在开发一个新的数据仓库解决方案,慢慢地将我们所有的数据库从本地服务器迁移到 AWS 托管的 Postgres 服务器上。我们正在为更有效的 ETL 调度实现 Airflow,并且最近已经实现了我们自己的 RShiny 服务器。值得一提的是,我学到了很多关于数据基础设施的知识,其中涉及的内容多得令人难以置信。这让我更加尊重数据工程师的工作!

在市政府工作肯定有挑战。数据并不总是容易访问,而且通常存储在不同的部门。毫不奇怪,我们需要与利益相关者建立信任和关系,以便使用他们的数据。这是向利益相关者直接“展示分析和数据科学的价值”。这在政府层面更具挑战性,因为大多数人不了解数据。如果你想成为一名成功的市政府数据科学家,你真的需要有良好的沟通能力。此外,一般来说,市政府的资金比大多数公司(甚至许多初创公司)要少得多,所以我们的团队往往规模小、精干、灵活。

不管怎样,我不得不说,到目前为止,我很喜欢我的工作,并且真的很期待我将来要做的新项目!

将符号推理集成到深度神经网络中

原文:https://towardsdatascience.com/on-integrating-symbolic-inference-into-deep-neural-networks-22ed13ebbba9?source=collection_archive---------14-----------------------

是什么让生物神经网络如此优越于它们的技术对手?到目前为止,我们忽略了什么吗?

深度神经网络在过去几年里取得了巨大的成功。人工智能领域的许多进步,如识别现实世界的物体,流利地翻译自然语言或在世界级水平上下棋,都是基于深度神经网络的。然而,关于这种方法的局限性的报道很少。一个这样的限制是不能从少量的例子中学习。深度神经网络通常需要大量的训练样本,而人类能够从单个样本中学习。如果你给一个从未见过猫的孩子看一只猫,它可以根据这个单一的例子认出另一只猫。另一方面,深度神经网络需要成千上万的图像来学习猫的样子。另一个限制是不能根据以前学到的常识做出推论。当阅读文本时,人们倾向于对文本的可能解释进行广泛的推断。人类可以做到这一点,因为他们可以回忆起非常不同领域的知识,并将其应用到文本中。

这些限制表明,深层神经网络中缺少一些基本的东西。这是一种在现实世界中建立实体的符号引用,并将它们相互联系起来的能力。数十年来,形式逻辑形式的符号推理一直是经典人工智能的核心,但它被证明是脆弱而复杂的。然而,有没有办法增强深度神经网络,使它们能够处理符号信息?深度神经网络受到了类似人脑的生物神经网络的启发。本质上,它们是神经元和突触的简化模型,而神经元和突触是大脑的基本组成部分。其中一个简化是忽略了生物神经网络的尖峰性质。但是如果不仅实际激活一个神经元很重要,而且这个神经元什么时候被激活也很重要呢?如果神经元激活的时间点,建立了一个与这种激活相关的关系环境,那会怎样?举个例子,一个神经元代表一个特定的单词。如果每次这个词出现在文本中,这个神经元都会被触发,这难道没有意义吗?在这种情况下,峰值的时间将发挥重要作用。而且,不仅仅是单次激活的时间,神经元所有传入的脉冲相对于彼此的时间也是至关重要的。这个定时模式可以用来建立这些输入激活之间的关系。例如,如果代表特定单词的神经元对于该单词中的每个字母都有一个输入突触,那么重要的是,只有当字母神经元以正确的顺序相互激发时,单词神经元才会被触发。从概念上讲,这些定时差异可以被建模为神经元的输入突触之间的关系。这些关系也定义了神经元自身相对于其输入激活而触发的时间点。出于实际原因,允许一个神经元的激活有几个与其相关联的槽,比如一个单词的开头和结尾,可能是有用的。否则,单词的开头和结尾将不得不被建模为两个独立的神经元。这些关系是一个非常强大的概念。它们允许容易地捕获文本的层次结构或者将文本中的不同范围相互关联。在这种情况下,一个神经元可能指一个非常局部的信息,比如一个字母,或者一个非常广泛的信息,比如一篇文章的主题。

使用激活函数来近似单个神经元的放电率是关于生物神经网络的另一种简化。为此,经典神经网络使用 sigmoid 函数。然而,sigmoid 函数相对于大的正或负输入值是对称的,这使得使用该函数用神经元来模拟类似逻辑门的操作非常困难。另一方面,尖峰网络有一个明确的阈值,并忽略所有低于该阈值的输入信号。因此,ReLU 函数或一些其他非对称函数可以更好地逼近发射率。这种不对称对于处理关系信息的神经元也是必不可少的。当某个单词不出现时,代表该单词的神经元必须一直保持完全不活动状态。

此外,大脑皮层中存在不同类型神经元的事实在深层神经网络中被忽略了。两种重要的类型是主要具有兴奋性特征的棘锥体细胞和具有抑制性特征的棘星状细胞。抑制性神经元是特殊的,因为它们允许建立负反馈回路。这些反馈回路通常不会出现在深度神经网络中,因为它们向网络引入了内部状态。考虑以下具有一个抑制性神经元和两个兴奋性神经元的网络,代表单词“August”的两种不同含义。

这两种含义是互斥的,意味着网络现在有两种稳定状态。这些状态可能取决于两个兴奋性神经元的进一步输入突触。例如,如果单词“August”之后的下一个单词是潜在的姓氏,则实体神经元 August-(first name)的对应输入突触可以增加该状态的权重。现在更有可能的是,单词“August”将被归类为名字,而不是月份。但是请记住,这两种状态都需要评估。在更大的网络中,许多神经元可能通过负反馈或正反馈回路连接,潜在地在网络内创建大量的稳定状态。

由于这个原因,网络需要一个有效的优化过程来确定关于某个目标函数的最佳状态。这个目标函数可以是最小化抑制强烈激活的神经元的需要。然而,这些状态具有巨大的优势,它们允许考虑给定文本的不同解释。这相当于一个思维过程,在这个过程中,不同的解释被评估,而最合适的解释就是结果。幸运的是,对最优解状态的搜索可以被很好地优化。

在这些反馈回路中,我们需要抑制性神经元,因为否则所有相互抑制的神经元将不得不彼此完全连接。这将导致突触数量成倍增加。

通过负反馈回路,也就是说,通过简单地将负突触连接到它的前体神经元之一,我们突然进入了非单调逻辑的领域。非单调逻辑是形式逻辑的一个子领域,其中蕴涵不仅被添加到模型中,而且被移除。假设需要非单调逻辑来为许多常识推理任务得出结论。非单调逻辑的一个主要问题是,它经常不能决定哪些结论可以得出,哪些不可以。如果没有其他更可能的结论,它应该只得出怀疑或轻信的推论。这就是神经网络的加权特性派上用场的地方。这里,可能性较大的状态可以抑制可能性较小的状态。

结论

虽然深度神经网络已经走过了漫长的道路,现在正在提供令人印象深刻的结果,但它可能值得再看一看原始的人类大脑及其电路。如果像人脑这样一个内在复杂的结构被用作神经模型的蓝图,我们必须做出简化的假设。但是,这必须非常小心地完成,否则原作的重要部分可能会丢失。

参考

  1. 爱歌项目
  2. 使用元神经元从单个训练示例中学习事实
  3. 关于给神经网络增加负反馈突触
  4. 神经科学:探索大脑

马克·贝尔、巴里·康纳斯、迈克尔·帕拉迪索

5.神经符号学习和推理:综述和解释

塔里克·贝索尔德、阿图尔·达维拉·加西亚、塞巴斯蒂安·巴德;霍华德·鲍曼、佩德罗·多明戈斯、帕斯卡尔·希茨勒、凯-乌韦·库恩伯格、路易斯·c·兰姆;丹尼尔·劳德、普里西拉·马查多·维埃拉·利马、利奥·德彭宁、加迪·平卡斯、潘海丰、格尔森·扎维鲁查

6.深度学习:批判性评估

加里·马库斯

7.非单调推理

格哈德·布鲁卡、伊尔卡·尼梅拉、米罗斯瓦夫·特鲁什琴斯基

用 Python 和数据科学赚钱— 1:设置和统计

原文:https://towardsdatascience.com/on-making-money-with-python-and-data-science-1-setup-and-statistics-1d69f1a68661?source=collection_archive---------4-----------------------

介绍

在我目前与 Metis 的研究休假期间,我有了一个惊人的机会——早就应该——将我每天教授给金融部门的数据科学和机器学习技术应用于实践。在这一系列的文章中,我将向您展示如何开始构建您自己的财务模型!

首先,我要感谢 Quandl 的团队,感谢他们令人惊叹的、易于使用的平台,以及 Quantopian 社区提供的丰富资源和灵感!

这绝不是一本“高级”指南,在这里,我应该提到:

此处提供的信息和附带材料仅供参考。不应将其视为法律或财务建议。您应该咨询律师或其他专业人士,以确定什么最适合您的个人需求。

对于使用其内容可能获得的任何结果,Jonathan 不作任何保证或其他承诺。在没有咨询自己的财务顾问、进行自己的研究和尽职调查之前,任何人都不应做出任何投资决定。在法律允许的最大范围内,如果任何信息、评论、分析、意见、建议和/或推荐被证明是不准确、不完整或不可靠的,或导致任何投资或其他损失,Jonathan Balaban 概不负责。

哦,还有,过去的表现不是未来结果的可靠指标等等等等…

很好,现在我们来看看定义和设置!

定义和假设

什么是交易算法?

来自 Quantopian:

交易算法是一个计算机程序,它定义了一套买卖资产的规则。大多数交易算法基于数学或统计模型做出决策,这些模型来自对历史数据的研究。

我们使用的是什么平台?

我使用 Anaconda 、 Jupyter Notebooks 和 PyCharm 在 Python 中建模,使用这些工具最容易理解。然而,您可以使用 Quantopian 平台的内置内核,或者如果您愿意,甚至可以将代码修改为 R 或其他语言。

我也在 Mac 电脑上,并且将全程分享 UNIX 命令;Windows 用户,必应是你的朋友!

我们关注哪些资产?

苹果(AAPL)是一只值得依赖的好股票,因为它是目前(2018 年 9 月)世界上最有价值的公司,股价相对稳定,有大量的数量、新闻和与品牌相关的情绪。

请记住:这里涉及的原则可能对较小的股票、不同的行业等有不同的作用。

设置

要在本地机器上获得 Quantopian 平台,请在终端中运行以下命令:

# create conda py35 since that's the newest version that works
conda create -n py35 python=3.5conda install -c quantopian/label/ci -c quantopian zipline

要让 Quandl 工作,请按照帐户创建说明和 API 文档开始加载财务数据。此外,保存您的 API 密钥,因为您将需要它来加载任何有意义的内容。

加载数据

让我们从代码库开始:

import pandas as pd
import numpy as np
import patsypd.core.common.is_list_like = pd.api.types.is_list_like
from pandas_datareader import data
import quandl
quandl.ApiConfig.api_key = "##############"

现在让我们拉一些苹果股票:

df = quandl.get("WIKI/" + 'AAPL', start_date="2014-01-01")

看一下这些列,注意一个叫做“分流比”的列。这是一个非常重要的指标;它表示股票分割发生的地方。2014 年,苹果决定 7:1 拆分,我们可以使用 Python 和 pandas 来查找发生的日期:

len(df)
df['Split Ratio'].value_counts()
df[df['Split Ratio'] == 7.0]

我们的罪魁祸首是2014–06–09。为了简单起见,我们只提取该日期之后的股票价格:

aapl_split = quandl.get("WIKI/" + 'AAPL', start_date="2014-06-10")
aapl_split.head()

顺便说一句,我在 GitHub 上找到了一份财富 500 强的列表。如果你想将你的分析扩展到股票集合,你可以将它们载入如下列表:

f500 = pd.read_csv('[https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv'](https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv'))tickers = f500.Symbol.tolist()

关键统计数据

增广的迪基-富勒

我们应该检查的一件事是单位根的存在,这可以通过增强的 Dickey-Fuller 测试来完成。简而言之,单位根的存在意味着有一个驱动 AAPL 的潜在趋势,因此我们可以提取并用于预测的模式。

# run ADF to determine unit root
import statsmodels.tsa.stattools as ts
cadf = ts.adfuller(aapl_split.Close)print('Augmented Dickey Fuller:')
print('Test Statistic =',cadf[0])
print('p-value =',cadf[1])
print('Critical Values =',cadf[4])

扩充的 Dickey Fuller:
检验统计量= -0.731194982176
p 值= 0.83850304527
临界值= { ' 1% ':-3.43722314744848,3499,' 5% ':-2.8645743684

我们将上面的测试统计与临界值进行比较;如果它低于我们选择的阈值,我们拒绝存在单位根的无效假设。正如你所看到的我们的大 p 值,我们必须接受空值:AAPL有一个单位根。这是一件好事,因为我们可以利用潜在的趋势和模式进行预测。

与其他股票的相关性

苹果被认为是奢侈的科技品牌。如果我们能确定与其他股票有很强的相关性呢?

请注意相关性并不意味着因果关系,可能会有哪只股票是先行者的问题,但模式和关系对于提升我们的模型性能总是一件好事。

我建议你看看三只股票,以及 AAPL 是如何相互关联的:

  • 微软(MSFT)
  • 英特尔(INTC)
  • 蒂芙尼公司(TIF)
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inlineMSFT = quandl.get("WIKI/" + 'MSFT', start_date="2014-06-10")
INTC = quandl.get("WIKI/" + 'INTC', start_date="2014-06-10")
TIF = quandl.get("WIKI/" + 'TIF', start_date="2014-06-10")

为了节省时间,我们将只关注英特尔数据;让我们画出 AAPL 和 INTC 的收盘价:

sns.jointplot(INTC.Close, aapl_split.Close, kind="reg");

Intel vs. Apple

我们还可以看看我们的相关值:

np.corrcoef(INTC.Close, aapl_split.Close)

我们注意到 r 值为 0.7434;对于预测来说还不错,但是我们需要记住一个重要的事实:如果我们知道 INTC 的收盘价,我们就可以查 AAPL 的收盘价!因此,让我们提前 7 天检查与 INTC 收盘价的相关性,以获得更可行的指标:

# seven day lead
np.corrcoef(INTC.Close[:-7], aapl_split.Close[7:])

对于这次运行,我们注意到 r 值为 0.7332;还是蛮不错的!

谷歌趋势

我们可以比较 Twitter 和其他情绪库如何影响股票价格。现在,让我们看看谷歌趋势是否与 AAPL 相关。确保指定时间范围或使用这个链接进行精确搜索(注意,我添加了 4 月的几天来处理半周的问题),然后将 CSV 加载到 Python 中:

# Google Trendsaapl_trends = pd.read_csv('/Users/jb/Desktop/multiTimeline.csv', header=1)aapl_trends.tail()

注意周线格式,所以我们需要使用[pandas.resample()](http://pandas.pydata.org//pandas-docs//stable//generated/pandas.DataFrame.resample.html):来转换我们的股票价格数据集

aapl_split_week = aapl_split.resample('W', convention='end').last()

现在,让我们检查给定一周内 Google 搜索请求总数与该周最后一个工作日的收盘价之间的相关性并绘制图表:

# trend and price corr
np.corrcoef(aapl_trends['Apple: (Worldwide)'], aapl_split_week.Close)

Oy!我们得到一个微不足道的 0.0454,这在我们思考时是有意义的:AAPL 新闻/活动/聊天并不意味着股票价格是积极的。像情绪这样有极性的东西应该会提供一个更强的信号,但我们会在另一个时间看这个问题。

最后的想法

我们只是触及了财务分析的探索性数据分析(EDA)部分的表面,但在下一篇文章中,我们将过渡到构建预测模型,并让高级包为我们完成繁重的工作。

我希望这能对你有所帮助,我很乐意在评论中听到你的意见:

  • 运行这段代码有问题吗?有时环境和版本会把事情搞砸…
  • 你用什么包和技术?
  • 什么样的视觉效果最有助于理解股票价格的运动?
  • 你认为哪些因素会使模型预测最大化?

最后,如果你碰巧知道一种持续赚大钱的建模技术,请直接给我发信息😉

衡量经常性用户

原文:https://towardsdatascience.com/on-measuring-recurring-users-ca4142be8efa?source=collection_archive---------3-----------------------

每个人都在谈论数据驱动。设置度量标准是困难的,即使在选择了要度量的东西之后,正确地度量它仍然是困难的!在这里,我将通过多种方法来衡量流失错误。

当你在开发一个产品时,最重要的一个指标就是你的用户中有多少会回来重复使用。这个指标有很多种,流失(给定时间后有多大比例的用户不再是用户)是最常见的一种。

在 Peergrade 我们正在为教师制作一个产品,我们有兴趣确定我们的用户是否对该产品足够满意,以便回来再次使用它。我们面临的挑战之一是,一些教师经常使用 Peergrade,而一些教师(主要是大学教师)一年只使用我们的产品一次或两次。这里的问题是,我们不知道用户是否已经离开我们,或者用户是否只是处于使用期的中间。

当我们查看我们的数据时,它看起来像这样(这不是实际数据):

每个蓝条对应一个不使用我们产品的用户(横轴是天)。在结束前停止的蓝色条意味着相应的用户再次回来使用我们的产品。延伸到图表末端的蓝色条(本例中为 365)意味着用户要么还没有回来,要么已经永远离开了我们。

一个简单的方法是计算在第 365 天之前结束的棒线数量和没有结束的棒线数量之间的比率,来衡量有多大比例的用户回到我们的产品。这样做的明显问题是,我们会高估流失的人数,把还没有回来的人都算成永远不会回来了。一个更好的策略是设置一个固定的最大值(例如 2 个月),并把在这段时间后没有回来的人算作被搅动——这个最大值可以从数据中确定,例如通过将其设置为已知已经回来的用户的不活动持续时间的第 95 个百分位数。

估计误差的影响

使用不正确的评估策略会导致非常错误的结果。下面我将描述一种不同的方法来计算客户流失,这种方法在相当合理的假设下会产生更好的结果。在我们的实验中,上面的简单方法导致 11%的平均估计误差,更好的版本导致 5.4%的平均误差,而我们改进的方法导致仅 1.2%的平均误差。

长尾理论和不同的方法

上述较好策略的问题是,当用户的不活动持续时间分布具有长尾时,即当一些用户的不活动时间非常长时,设置这样的最大值可能会很不幸地出现问题。我们的用户就是这种情况。

为了尝试以更好的方式解决这个问题,我们从制作一个小的合成数据集开始。我们设置了一个产品质量参数(称之为 q ),这是一个用户回来重复使用的概率(这是我们有兴趣测量的参数)。

然后,我们创建了 2000 个虚拟用户,并使用我们的 q 参数来确定他们是否会回来。我们将合成数据集的时间跨度设置为 365 天。对于每个用户,我们在 0 到 365 之间随机选择一个不活动期的开始日期(上面的条形开始的位置)。为了以现实的方式模拟非活动持续时间,我们从伽玛分布中采样非活动持续时间,如下所示:

对于被选择不返回的用户,不活动期被延长到第 365 天(我们的时间跨度结束)。对于经常性用户,等待时间从上述分布中取样,并添加到开始时间中,以获得非活动间隔的结束时间。如果高于 365,则上限为 365。

这样做的结果是帖子顶部的图中所示的数据,其中可以观察到一些用户返回,一些是非经常性用户或经常性用户,他们的返回超出了时间跨度(在第 365 天之后)。

不同的方法

我们估计流失率的方法是使用下面的简单算法:

  • 用 1 标记我们知道用户返回的每个时间间隔
  • 按长度对时间间隔进行排序,从最长的间隔开始
  • 如果最长的间隔没有标签 1,则给它标签 0
  • 对于每个区间(按排序顺序),用所有更长区间标签的平均值对其进行标记。
  • 将重复出现的概率确定为所有区间的平均标签。

这里的概念是,为了估计用户在 X 天不活动后返回的概率,我们查看所有不活动超过 X 天的用户,并查看有多少用户返回。

结果和其他想法

在合成数据集上,我们可以测试简单的估计,看看它们与我们的新方法相比表现如何。产品质量参数 q 在 0 到 1 之间随机抽样,并进行不同的推断方法。这样做了 100 次,以限制数据中随机噪声的影响。最终结果显示,简单方法的平均估计误差为 11%,更好的版本的平均误差为 5.4%,而我们改进的方法的平均误差仅为 1.2%。

解决这个问题的一个有趣的方法是用完全概率的方式建模,例如使用 PyMC3 。这种建模将导致一种不那么特别的解决方案,并且还将给出估计量的不确定性的度量。此外,可能有可能以某种方式对产品的开发建模(并且有希望以某种方式增加q**)——这将有可能估计您是否以显著影响度量的方式改进产品。最后,研究其他因素的建模会很有趣,比如季节性(对我们来说,夏季是一个低活动期),并可能引入其他因素,以便更准确地预测用户流失。

关于我的“奇特经历”以及它将走向何方

原文:https://towardsdatascience.com/on-my-peculiar-experience-and-where-it-goes-from-here-f3478d7f25f6?source=collection_archive---------12-----------------------

我上大学是为了成为一名摄影师。昨天,我有幸看到了我最喜欢的摄影师之一威廉·埃格尔斯顿的一些照片。当然,这让我偏离了摄影的主题,就像生活中的大多数事情一样,我发现了一些建立在我正在思考的其他事情上的东西。

William Eggelston, “Louisiana” (from the series Los Alamos, 1965–1974) © Eggleston Artistic Trust / Courtesy David Zwirner, New York/London

埃格尔斯顿是一个真正的怪人,他有一种独特的世界观,一种具有挑战性的民主视野,图像中的东西与构图、颜色、社会意义,甚至是不知道是什么的抽象一样重要。也就是说,他是一个帮助定义和推动“摄影”的摄影师。他也有一套用词方式:

“无论是一张照片、一首音乐、一幅画还是我可能做的任何其他东西——最终都是我独特经历的抽象。”—威廉·埃格尔斯顿

这是我对生活中几乎所有事情的看法,尤其是我作为 UX 软件产品开发设计师的职业经历。

Performing at the Pukkelpop festival, Belgium, 2003

到目前为止,我的生活中有很多事情:

  • 一位相当有名的电子音乐家
  • 美国一家主要报纸的艺术评论家
  • 创建了两个唱片公司(公鸡摇滚迪斯科,夜班)
  • 共同组织和举办了一个音乐节(浪费)
  • 哈克贝利猎犬在游乐园吗
  • WFMU 的 DJ
  • 从事摄影和雕塑的视觉艺术家
  • 共同创办了 2 家创业公司(Network Awesome、Radosaur Productions)
  • 视觉设计师和业余爱好者印刷工人
  • 和一名 UX 设计师(过去十年)

…所以可以说我认为自己是一个“多面手”。

2007 年,当我还是一名职业音乐家的时候,一个有趣的发现让我开始涉足科技行业。我在荷兰布雷达的一个地方开演唱会,演出很棒,演出结束后我去领薪水。经理问我是否想和酒吧员工喝最后一杯(这通常是一场成功演出的标志)。当我们加入他们时,我意识到,36 岁的我很可能是当晚整个会场中最年长的人。我的意思是,这真的没什么大不了的,但我一直觉得我的生活还有其他的篇章,这种意识冷酷地提醒我,我可能需要继续下去,开始探索音乐之外的兴趣。

William Eggleston, “En Route to New Orleans” (from the series Los Alamos, 1965–1974) © Eggleston Artistic Trust / Courtesy David Zwirner, New York/London

从艺术学校开始,我就有了“一切本质上都是一样的”的想法,这意味着大多数学科背后的思维模式都是相似的。所以艺术家就像作家,建筑师就像馆长。我从来没有一条真正的“线”来区分我的假定能力和任务的需求。毫无疑问,现在是 20 年后的今天,虽然我仍然认为这是真的,但我现在明白了“细节”对于理解不同领域和思维模式的重要性。

随着年龄的增长,我认为我身上的艺术家气质使我身上的多面手能够适应和应用我在各种生活中学到的东西,然后将它们应用到我现在正在做的任何事情上。我相信我可以写更多关于自我、灵感、市场力量之间的相互作用,以及最终它们如何应用于移情和技术的内容——也许有一天我会写的——但现在我宁愿抓住要点。

数据就是一切

不到一年前,我意识到:数据就是一切。我意识到,未来不严重依赖数据的技术(或依赖技术的学科或市场)都不会存在。

作为一名 UX 设计师,我意识到我知道如何发现用户需求,并运用设计技巧将其转化为提供解决方案的产品。我与工程师合作,学习使产品具有响应性的系统,这些系统适合记录和检索数据的生态系统。但是我不明白利用这些数据来帮助组织制定战略和决策的逻辑和技术。是改变的时候了。

最近,我做了一个改变,从与开发团队一起工作,到将我的 UX 背景带到一个由高技能数据科学家组成的“实验室”,从事人员分析工作。设计师迫切需要学习数据科学家使用的方法,了解我们如何利用数据,并将其应用于解决和满足人类需求。

当 Eggleston 说“我的特殊经历的抽象”时,这是另一种说法,我们的故事建立在他们自己的基础上;我们的道路很少是直的,但总是直线的。

所以我又来了,我独特的经历再次曲折,但这次我想记录我的发现。我打算将 medium 作为一个地方,在这里我将写关于 UX 设计、高级分析、数据可视化和当代艺术的交集的博客。

*好的,我想把我的链接放在这里,但是当我整理这个列表的时候,我意识到它太多了,所以我把它们都放在这里:

  • 当我链接到我的音乐时,我总是链接到我在 Pitchfork 上的个人资料,因为那个网站可能比其他任何网站都更能促进我的事业。管它呢,这也是我的一个“大”视频:

  • 我曾经为《亚特兰大宪法报》以及艺术报纸和《新艺术检查者》撰写摄影和录像艺术的文章。

  • 我创立了 2 个唱片公司:公鸡摇滚迪斯科(仍然活跃!)和夜班工人(现已退休)

  • 我非常自豪地与我的联合创始人&合作者 Pure 和 Jan Rohlf 一起主持了 6 届浪费节。

  • 这是我的维基百科页面

  • 2011 年,我与 Greg Sadetsky 共同创立了网络 Awesome ,这是一个在线电视网络,从 Youtube 收集内容,积累了大量的每日观众。去看看吧,它仍然在线,每天都有新的内容。

  • 2012 年晚些时候,我与科里·维尔玛共同创立了 Radosaur Productions。我们专门从事视频制作和直播。我们有幸制作了几年的《柏林锅炉房》(事实上,我们还拍摄了一些他们收视率最高的剧集),还与 Pitchfork 和 Vans 合作。
  • 我过去性格的一个例子:

Huckleberry Hound aka “Slushy dawg” or “the blue one”, second from left

  • 我非常幸运能在 WFMU——世界上最伟大的广播电台之一——做 DJ,当时在线广播刚刚起步。令人惊讶的是,我的节目《高级 D&D》仍然可以在网上收听:http://wfmu.org/playlists/su
  • 至于我的作品,5 秒钟的搜索没有提供任何例子。也许有一天我会上传一些图片。我的工作主要基于摄影,偶尔也有雕塑或视频装置。
  • 至于我在 UX 的设计工作,你知道它是怎样的——大部分我实际上不能炫耀,因为它都是为客户/公司设计的。但是我这里有一个非常不完整的投资组合:http://cargocollective.com/jasonforrest这也是我的 LinkedIn 。
  • 我做设计师已经很长时间了,但是直到最近我才真正喜欢上我的平面设计工作。一月份,我制作了一本名为“好奇型”的印刷杂志。它有 5 种免费字体,所以去我的网站上下载吧。见鬼,也给一个关注。

[## 杰森·福里斯特代表汉斯

我是一个创造性的问题解决者、设计师和连续创业者。在另一种生活中,我是一个全球公认的电子音乐家…

www.behance.net](https://www.behance.net/cockrockdi9a9d)

大型数据集的优化挤压

原文:https://towardsdatascience.com/on-optimally-squishing-large-datasets-9276776cf0cb?source=collection_archive---------0-----------------------

这篇博文主要由我的三年级博士生高撰写,是对我们 16 年论文的高度概括,题为“挤:关系数据集存档的近优压缩”,github 上的 代码 ,arXiv 上的 论文

由于从对话机器人和物联网到大规模物理模拟和高通量基因组测序,数据生成的速度越来越快,数据压缩,尤其是用于存档的数据压缩,仍然极其重要。

传统的压缩算法是为二进制字符串设计的,通过查找这些字符串中的重复模式来识别压缩机会。因为文件本质上是以二进制字符串的形式存储的,所以这些算法普遍适用于所有类型的数据。

然而,通过对通用二进制字符串表示进行操作,这些算法失去了细粒度压缩的机会。其中一个设置是关系数据集或表格数据集的非常重要的设置:在这里,一般的压缩算法最终表现很差。我们提出了 Squish :压缩关系数据集的渐近最优算法。与针对关系数据集的其他算法以及更传统的算法相比,我们的算法实现了更高的压缩率*,并且可针对特殊目的数据集和需求进行定制,我们将在后面进行描述。*

动机

以一个本地人口普查数据集为例,其属性为姓名、性别、年龄、体重和身高。先前工作中提出的关系数据集压缩算法能够利用域约束(例如,名称是字符串;性别只有两种可能的值;年龄、体重和身高是数字字段)。但是还有其他压缩的机会:

1.属性值之间存在软依赖。比如性别通常可以从名字中推断出来,个体的性别往往影响身高体重。

2.数值可能与相关联。例如,高个子通常更重。儿童(年龄 12 岁)通常比成人矮得多。

通过利用这些机会,我们可以用更少的空间来存储相同的信息。然而,这不是一个简单的任务,因为我们不知道我们将处理什么样的数据集。我们需要开发一种算法,它可以在不假设数据集的任何特定结构的情况下捕获依赖关系,并找到一种利用这些依赖关系来压缩数据集的方法。

使用贝叶斯网络捕获依赖关系

让我们处理第一个任务:我们如何在不假设任何结构的情况下捕获数据集中的依赖关系?由于依赖是软的或“模糊的”,我们需要一个概率模型来捕捉这些依赖。为此,我们使用一个贝叶斯网络

简而言之,我们使用贝叶斯网络中的每个随机变量来表示元组的一个属性值,使得数据集中的每个元组对应于来自贝叶斯网络的随机样本。

因此,我们的压缩算法的第一步是从关系数据集中学习贝叶斯网络。然后,我们的问题变成:我们如何使用贝叶斯网络来压缩数据集?在回答这个问题之前,我们先来回顾一下算术编码的一些基本概念。

算术编码基础复习

算术编码是一种自适应的字符串压缩方案。它需要字符串中每个字符的条件概率模型,并为所有可能的固定长度字符串生成唯一可解码的代码。我们用一个例子来说明这种编码方案。

在这个例子中,右边是字符串的概率模型。首先,算术编码为每个字符串分配一个概率区间,其长度等于该字符串的概率。比如 aaa 对应 00.048aba 对应 0.120.204 。接下来,给定概率区间[ lr ,我们找到最小的整数 k ,以及另一个整数 M 使得,l<=2{-k}m<2{-k}(【t38 M 的二进制表示是字符串的代码。

Illustrative Example for Arithmetic Coding

结合贝叶斯网络和算术编码

即使它是为字符串开发的,算术编码过程实际上只需稍加修改就可以用于贝叶斯网络。这种构造只需要两件事:随机变量之间的排序,以及给定所有先前变量的每个随机变量的条件概率分布。有趣的是,贝叶斯网络为我们提供了两者。下面是一个如何在贝叶斯网络上应用相同过程的例子。请注意,计算基本上与之前相同。

Combining Bayesian Networks and Arithmetic Coding

处理复杂属性

上面的例子说明了我们如何使用贝叶斯网络和算术编码来压缩只有分类属性的关系数据集。现在,最后一个缺失的部分来了:我们如何处理像数字和字符串这样的复杂属性?

为了能够处理复杂的属性,我们为所有数据类型开发了一个抽象接口,称为 SquID(数据类型 Squish 接口的缩写)。SquID 用于对属性进行编码,使它们的行为类似于分类属性,然后我们可以使用算术编码来压缩它们。

SquID 是概率分布的树形模型。本质上,它是一个概率与边相关的决策树。这里以鱿鱼为例,描述了分布 pr(xin(k-1k)=0.9^{k-1} *0.1

要使用 SquID 对属性进行编码,我们只需构造一个决策序列,这样在最后一个决策结束时,我们就可以确切地知道属性值是什么。例如,要使用 SquID 对一个数字属性进行编码,我们可以模拟对分过程,并在[ log n ]步骤中确定属性的值。

支持用户自定义数据类型

SquID 接口还使我们能够支持用户定义的属性。即使数据集包含不属于我们实现的原始数据类型(分类、数字和字符串)的属性,用户仍然可以通过为新数据类型实现 SquID 接口来使用 Squish 压缩数据集。它相对简单,并且提供了很好的机会将特定领域的知识包含到 Squish 中,以获得更好的压缩结果。

外卖

1.我们开发了关系数据集的压缩算法 Squish 。它使用贝叶斯网络和算术编码的组合来利用属性之间的软依赖性和相关性。

2.Squish 的数据类型接口 SquID 允许我们对复杂的属性应用算术编码。SquID 还允许用户定义新的属性类型,使用 Squish 可以压缩具有非原始属性类型的数据集。

3.Squish 支持具有用户指定的错误阈值的有损压缩。

4.Squish 对于所有可以使用贝叶斯网络有效描述的数据集来说都是渐近最优的,并且在 4 个现实数据集上的表现要比最先进的关系数据集压缩算法好得多,存储减少了 50%。

内部部署(DIY)与云 GPU

原文:https://towardsdatascience.com/on-premise-diy-vs-cloud-gpu-d5280320d53d?source=collection_archive---------3-----------------------

早些时候,我的第一个故事在 CPU 和 GPU 之间做了一个非常简单的比较,对于这个故事,我将在速度和价格比较方面对 DIY GPU 和 cloud one 进行更多的比较。

目前我将介绍亚马逊和阿里云,亚马逊使用的是 NVIDIA K80 和实例类型 p2.xlarge ,而阿里云使用的是 NVIDIA P100 和实例类型 ecs.gn5-c4g1.xlarge 。最后,现场 DIY 的是英伟达 1070 GTX 。

基本上,测试使用的是利用 GPU 进行处理的快速风格传输。测试将使用 rain-princess.ckpt 处理一个分辨率为 4242 × 2828 的 JPEG,命令如下

time python evaluate.py — checkpoint ./rain-princess.ckpt — in-path lesu-0596.jpg — out-path lesu-0596-style.jpg

关于 Amazon 的一个快速提示是,我们需要申请增加限制,否则我们将无法启动 gpu 实例!

阿里云是一个相当麻烦的改变实例类型,因为我们需要释放和重新创建实例。至于亚马逊是相当直截了当,没有破坏实例,希望阿里云将在这段时间内改善。当我们的脚本只改变深度学习的实例类型,而不是全天候运行时,这是非常有利的,因为对于云中的 GPU 实例类型来说,这非常昂贵。

用于 Amazon 输出的 nvidia-smi 命令

阿里云如下

每个平台的时间如下

至于定价,亚马逊有以下定价层

目前,阿里云的 gpu 没有基于订阅/保留的定价

对价格的粗略估计如下,假设我们每天只使用该实例 12 小时,持续 30 天

与 DIY 方式相比,DIY 方式初始投资【USD1305.33 美元,不含电费,可能在 2 个月内收回成本。但是我使用的版本是酷睿 i3,而不是拥有更好 CPU 的云。

最后,我想我们总是在使用成本更高的云选项之前尝试在内部进行培训以节省成本。内部部署的另一个优势是我们不会与其他人共享资源。我一直相信混合方法可以最大限度地提高性能和成本,就像 Nvidia Cloud 提供的一样

机器的超智能:恐惧与治疗

原文:https://towardsdatascience.com/on-superintelligence-of-machines-trepidation-and-therapy-61486e8d3dad?source=collection_archive---------12-----------------------

以下是我为一门名为“人工智能:法律、伦理和政策”的课程写的一篇文章。

尼克·博斯特罗姆在他的书中将超智能定义为“在几乎所有感兴趣的领域大大超过人类认知表现的任何智力。”超智能人工智能(SAI)的概念让我们焦虑,我们担心人工智能会失控,威胁人类。这个被认为是“奇点”的事件引发了存在主义辩论、阴谋论,并引发了伦理问题。但是这种奇点是可以实现的吗?如果是这样,我们该怎么办?

我们会实现奇点吗?

未来研究所(Institute for the Future)的创始人罗伊·阿马拉(Roy Amara)创造了一句现在被称为“阿马拉定律”的格言:“我们往往会高估一项技术在短期内的效果,而低估其长期效果。”我们经常会读到这样的标题:“无人驾驶汽车将在未来 10 年出现。”自 1970 年以来,同样的标题一直在出现。跑道 AI 也是如此。看到我们生活中许多其他方面的进步,我们开始认为对人工智能来说也是如此。

AI 的进步速度是不对称的。人工智能可能擅长一些任务,而人类在许多其他方面更胜一筹。我们错误地将一个分支领域的进步与总体进步并列。那些指出深度学习一夜成名的人忘记了,它花了 50 年才达到今天的水平。这些人还忽略了间断平衡的基本理论,该理论认为稳定的系统倾向于停留在静止状态。技术方面的一个例子是飞机,自从 60 年前出现喷气式飞机以来,飞机一直没有重大发展。

此外,没有一条通向普遍智能的清晰道路,也没有任何提议的方法将所有已知的人工智能进展归结为一个单一的 SAI。罗德尼·布鲁克斯可能是世界上最有成就的机器人专家,他说我们对人工智能进步甚至接管世界的速度不合理地乐观。在人工智能预测的七宗罪中,布鲁克斯讨论了预测人工智能增长的陷阱,并向我们保证,即使机器接管,我们至少在几百年内是安全的。

有什么大不了的?

博斯特罗姆担心"协调问题"**:**SAI 的目标与我们的目标不一致。他假设一个矛盾的“回形针最大化器”,它在寻求创造回形针的过程中,将利用宇宙的所有能量,在这个过程中消灭人类。正如 2010 年一项名为“ Roko 的蛇怪”的“少错”实验所描述的那样,一些人害怕更多的报复结果根据 Roko 的说法,SAI 可能会合理化,然后追溯性地惩罚所有对其起源没有帮助的人类。著名的麻省理工学院宇宙学家 Max Tegmark 想象了 12 个人工智能的后果场景,从人类和 SAI 生物共存的自由主义乌托邦,到动物园管理员把人类作为动物园动物关在笼子里,就像库尔特·冯内古特的 5 号屠宰场一样。然而,正如文档杂志 2018 年 4 月 9 日的一篇文章所言,“害怕人工智能叛乱的特权人士总是以反映他们自己意识形态的剥削性术语来想象它。”值得注意的是,这些未来学家和末日论者大多是投机者,而不是人工智能研究人员,例如,博斯特罗姆本人、埃隆·马斯克和斯蒂芬·霍金。

如果 AI 变得超智能,我们能做什么?

没什么!

既然人工智能已经超越了人类的认知能力,那么在生存国际象棋中,我们肯定无法战胜它。博斯特罗姆认为,我们必须机智地协商我们的生存条件。有些人甚至愿意崇拜人工智能霸主,并已经在硅谷建立了人工智能教堂。他们相信这个人工智能将会是真正“倾听”的干涉主义之神(尼克·凯夫唱的那个)。“宠物比家畜好”,他们打趣道。因此,创建支票、安装自动防故障装置和切断开关,可能会让我们免于度过一个存在危机的不眠之夜,但在 SAI 的黎明,我们将受到冷漠的上帝的摆布

我们现在能做什么?

AI 还在青春期前。我们仍然握着插头。为什么不屈服于博斯特罗姆的恐惧,为了更大的利益而把它拔掉呢?当然,埃隆·马斯克捐赠了数千万美元来减缓恶意人工智能的增长,但他也将花费数十亿美元让汽车变得更智能。用《智人》的历史学家和作家尤瓦尔·诺亚·哈拉里的话说,“我们可能会基于短视的短期考虑做出最深刻的决定。地球上生命的未来将由散布恐怖主义威胁恐惧的三流政客、担心季度收入的股东以及试图最大化客户体验的营销专家决定。”人工智能是如此有利可图的工具,以至于的经济人不会放过它。出于好的和坏的目的,将会有持续的研究。如果我们现在强加规则,肯定会有一个支持人工智能的游说团体,他们会用任何可用的法律武器激烈地对抗博斯特罗姆人。如果规定过于极端,研究可能会转入地下,甚至被浪漫化为反权威运动。此外,我们失去了潜在的好处,如改善医疗保健。

人工智能还在许多方面造福了我们的生活,并且有潜力做得更多。它已经在社会结构中根深蒂固,很难实施极端的监管。合乎逻辑的做法是 Grady Booch,一位多产的软件工程师和 UML 的开发者所说的:给人工智能注入人类的价值观,这样我们就可以学会共存。超人类主义的支持者看到了一个未来,在这个未来中,人工智能和人类将不再是分离的存在,而是随着生物技术的进步,他们将成为一体。我们不知道人工智能的未来会是什么样子,我们也无法猜测它的意图,所以最好不要陷入危言耸听,认为 SAI 是邪恶的。等到人工智能变得超级聪明的时候,无论是好是坏,世界都已经发生了根本性的变化。

我非常感谢 Maura Grossman 博士和 Alex Williams 启发我进行批判性思考并提供详细的反馈。

在技术龙卷风的前夜

原文:https://towardsdatascience.com/on-the-eve-of-technological-tornado-e19aa7d307bb?source=collection_archive---------15-----------------------

Source: Unsplash.

在达沃斯举行的 2017 年世界经济论坛上,克劳斯·施瓦布教授说,“人类正站在一场技术革命的边缘,这场革命将从根本上改变我们的生活、工作和相互联系的方式。就其规模、范围和复杂性而言,这一转变将不同于人类以前经历过的任何事情。当然,不可能预测它将如何发展,但已经清楚的是,它将影响所有群体、社会阶层、职业等。”

我们现在生活在第三次人工智能浪潮的时代。第一波(1950-1960)与机器翻译和电脑游戏有关,第二波(1980)与专家系统的开发有关。第三次浪潮始于 20 世纪 90 年代末,不仅受到计算机效率提高的推动,也受到人工智能和机器人程序许多领域取得的重大进展的推动。

什么是人工智能?

人工智能是好莱坞电影和小说创造的幻觉。它在我们的脑海中形成了一个人形机器人的形象,这些机器人要么反抗人类,要么生活在家庭中,体验情感,与人类没有区别。这些都和现实生活无关。

人工智能是模拟或执行人类认知功能的工程学科。换句话说,它执行信息处理功能。这只是一套机器学习优化方法,允许系统采用这个函数,并学习如何在计算机上执行它。智能手机上的 T9 功能、搜索引擎、拼写检查、Shazam 中的旋律识别、防病毒和反垃圾邮件程序等等——这些都是复杂的人工智能程序,现在看起来很平常。然而,在机器中创造意识很可能是不可能的。因为人类还不明白什么是意识。

人工智能的利与弊

人工智能的积极方面是创建特定的程序来帮助做某事,而消极方面是风险,风险相当高。其中最重要的是,人工智能可以抢走人类的工作。当然,炒人的是公司,不是 AI。以电梯为例,它已经永久性地取代了电梯操作员,并增加了对电梯维修技术人员的需求。一些职业消失了,但是新的职业总会取代它们。

接下来,人工智能被用于分析大量数据。如果你收集了足够多的关于人的数据,那么计算任何东西都是可能的。隐私完全消失。这不是一个很好的情况。

技术旋风

The books by Geoffrey Moore.

有一位作者,杰弗里·摩尔,他写了一些关于科技行业尤其是创业公司发展原则的精彩书籍。其中之一是跨越鸿沟。也许你们中的一个已经读过了。如果没有,那么我们强烈推荐。他的第二本书《龙卷风中的 T2》也涉及了同样的问题。在书中,他介绍了技术旋风的概念,这是一个新技术产业的爆炸式发展。

我们已经在乔布斯和盖茨的个人电脑上看到了这样一场龙卷风。后来是 80 年代末 90 年代初的软件旋风。然后,互联网在 90 年代中期爆发了。大型公司出现了。巨大的事业和财富是白手起家的。然后我们看到了手机,接着是智能手机和平板电脑。

在所有这些案例中,都有共同的过程和模式。对我们来说,最有趣的事情是未来行业在**“龙卷风前夕”**的状态。这期间发生了什么?首先,它的特点是缺乏市场,最重要的是“脑雾”。每个人都感觉到有事情要发生,但没人知道是什么。

使用说明—龙卷风的基本条件

龙卷风的起因在于有人提出了一种使用设备或技术的方法。提供使用说明是史蒂夫·乔布斯对智能手机所做的,在 iPhone 出现之前,智能手机已经生产了好几年。他不需要发明这项技术。他不得不把这些都收集起来,然后说,“这里有一个东西。这就是它的名字,这就是你如何使用它。”人们必须给用户概念,并指导制造商的发展。那就是市场和用户出现的时候。然后,技术龙卷风来了,并在头顶爆炸。

再比如汽车行业。就在福特制造出他的传送带并开始生产我们所知道的汽车之前,“前夕”它一直处于完全相同的状态。让我们不要忘记来自吉姆·克拉克的互联网。也许你们中没有人知道吉姆·克拉克,或者也许你们并不知道所有的事情,但这是真正创造了互联网的人。他为第一个非商业浏览器聘请了一位作者,制作了一个真正的浏览器,即网景导航器,在那之后一切都毁了。

关于机器人和虚拟助手

机器人领域将出现一场真正的技术风暴,涉及数百万甚至数亿用户。最有可能的是,它将是某种与人生活在一起的个人机器人助理,像 Jeeves 或 Jarvis,并参与一切:在家庭或个人的日常生活中,在商业中等等。每个人都将拥有或正在努力拥有一个这样的个人机器人。那就是下一次龙卷风会发生的时候。这就是所谓的“下一件大事”。

我们在 2000 年初开始制作虚拟助手。它们非常简单,当时我们仍然使用 AIML (人工智能标记语言),而许多爱好者仍然利用它和理查德·华莱士教授本人(A.L.I.C.E .项目作者)。

现有通信系统的经验是,虚拟助手会一直存在,但它们最终也会变老。因为它们不完整。虚拟助手既是识别系统,也是搜索引擎。然而,准确性在搜索引擎中是很重要的。前十名的排名,也就是说,完整性远没有那么重要,因为互联网上总有 1000 万页关于你问的问题。

有了虚拟助手,就完全相反了。它的准确率总是 100%——如果它理解了问题,答案总是相关的。这就是很难涵盖完整性的地方,因为一个人可能会问的问题的多样性是如此之大,以至于不可能预测所有的选项。它必须从一个特定的答案到一个逻辑答案构建同心圆。

The result of a survey conducted in the US in April 2017 by Statista. Source.

虚拟助理必须能够采取主动,这意味着它的语言智能必须相当高。它必须自我学习,发现更多关于它主人的信息,并记住他们的信息。这种记忆将有助于它根据主人的生活方式提供建议、帮助做家务或制定计划。它必须有计算机视觉来识别它的主人或检测有人进入房间,这样它就可以和那个人开始对话。

哪个是正确的——虚拟助理应该有有用的功能,比如回答明天天气如何、现在几点、是否堵车等等。对于不同的话题和合作玩法应该有多种互动。捕捉音频频道同样重要,例如,当你需要在早上醒来时。或者当你手头没有设备时,你可以向空中询问你需要什么。当我们在 2015 年制造机器人 Lexy 时,我们使用了能够过滤掉外来噪音的麦克风阵列。一个人站在离设备很远的地方发出命令,系统就会准确地识别它。

语音助手的前景

电话应用将会消亡。没有人会使用它们。

语音识别将被嵌入到几乎所有能够接收语音并在狭窄的主题区域(在水壶、洗衣机、微波炉等)进行处理的设备中。大多数人不阅读他们设备的说明书,通常只使用其功能的百分之几。如果在系统中嵌入一个语音助手,这个设备可以被更有效地使用。

哪里有服务线,哪里就有语音助手。

语音助手将会出现在自动取款机、商场等等。我们已经向大公司销售聊天机器人,以提供技术支持或接受订单。这将会继续和进步,但是要结合语音技术。很快,你会在商店门口遇到一个机械女人,她会问你需要什么,并为他们选择商品和服务提供建议。

最终,我们会成为一个家庭伴侣。

这本指南不仅适合儿童,也适合成年人。它可以访问维基百科、搜索引擎和教育课程。它将能够教授英语、古希腊历史、机械技能等等。最重要的是,它能够用简单的语言进行自然对话。这不容易做到。我们知道这是事实,因为我们自己也在做这样的项目。我们相信再过两三年我们就会看到这种助手。

作者: 斯坦尼斯拉夫·阿什马诺夫 ,SOVA.AI 公司首席执行官

在地平线上:营销的未来——以及我的测试,看看它是否在这里。

原文:https://towardsdatascience.com/on-the-horizon-the-future-of-marketing-and-my-test-to-see-if-its-here-58e89ea48c7a?source=collection_archive---------8-----------------------

gorgeous imagery found on Unsplash (thx)

我个人的浅见是,我们今天听到的所有营销策略、战术和方法——“基于客户的营销”、“集客营销”、“增长黑客”——只是一种描述营销世界未来的手段。前面提到的每一个营销术语——通过实践、奉献和合适的才能——任何组织都可以实现。每一个都为您的业务发展提供了宝贵的机会。这篇文章并不是要“废黜”任何这些类型的营销和增长策略…

然而,我相信这些不同的营销方法、策略等。只会让我们离未来更近一步。渐渐地,它们让我们更深入地思考我们如何影响我们与之互动的企业和客户。这是一件非常好的事情。

我承认,除了我通过网络上伟大的营销人员和品牌观察和听到的以外,我没有太多的研究来证实我的预测,但正如你将在下面看到的那样,营销的未来已经在社交媒体世界中崭露头角。

未来(依我拙见)是关于数据、创造力和策略的交集。它是关于为顾客提供独特的有价值的体验或洞察力,这是只有 才能提供的。

我认为营销的未来将随着三个关键要素的融合而展开…

1.营销的未来始于技术。

数据的激增和我们对数据前所未有的访问开始塑造营销的未来。此外,随着基于云的处理成本下降,人工智能(AI)和数据科学迅速发展,营销的未来才刚刚开始出现。

2.营销的未来取决于关键人物。

如果你没有数据科学家或数据分析师*(我肯定角色的差异是实质性的,但我还不知道是什么)*,那么你最好排队。这是一个热门话题,也是一个难以填补的角色。在我看来,这是市场营销未来的关键。

别担心,我会讲到我认为市场营销的未来是什么的那一部分……继续读下去。

数据科学和扮演这一关键角色的员工并不是未来营销的唯一关键角色。你仍然需要创造性和战略性的营销角色。没有创意和营销策略,数据只是一堆 1 和 0。

3.营销的未来需要“必备”产品。

肖恩·埃利斯和许多其他企业家会告诉你,除非你首先建立产品的市场适应性,并且理想地创造一个“必须拥有”的产品,否则你将没有任何东西可以营销。

注意:我认为营销的未来之美在于,它将有助于保持你的产品/服务成为“必备”的粘性和可能性。

_________ 营销

我相信这三个要素的融合意味着我们正走向一种新的营销方法。我不知道如何描述这种新的营销方法,但现在,我将把它称为“基于洞察力”或“反馈”营销。

正如我在介绍中承诺的那样,营销的未来已经在社交媒体世界中崭露头角。

这里有一个来自脸书的例子:
我们都在订阅源中看到过通知或内容。

“这是你去年这个时候做的!”“迈克,朋友周年快乐!”

btw I never login to Facebook anymore and I deleted the app from my phone, but sure enough while writing this post I logged in to see If i could find an old reference to illustrate my point and this is what came up…

看到那些视频和为我们制作的那种内容绝对是一种享受。它很有见地,令人愉快,是脸书增加病毒式传播和粘性所需要的一切。——虽然我不再在手机上使用脸书,但我仍然看到了它的价值;)

所以,真正的问题是,你如何将这样的见解应用到你的 B2B 或 SaaS 业务中?我们如何利用我们的数据和创意来增加粘性,并最终提高我们营销活动的有效性?

答案是数据、创意和营销策略。

下一步是什么?

我的使命是为数据驱动的客户提供价值和洞察力。我希望科学地、战略性地和创造性地调整我们的数据,以创建一个透明和有价值的洞察力的反馈回路,以一种他们在竞争产品中看不到的方式让我们的客户受益。但是我一个人做不到。我真的相信营销的未来是关于数据、创意和战略营销团队的合作。

在我的职业生涯中,我将检验我的理论——基于洞察力/反馈的营销是帮助我们的客户和公司取得新的成功的关键。

以下是我将要做的…

我不会告诉你细节,因为我不想破坏测试(或者让我的竞争对手过早地参与我的计划)。

我将利用数据为我们的客户提供关于他们表现的有见地的反馈,并且我将使利用我们发现的见解变得极其容易。通过这样做,我相信我们的客户和我们的企业都将看到积极的财务成果,我希望我们将被视为一个值得信赖和重视的合作伙伴。

我认为很多企业都可以做我打算做的事情,但他们都尝试一下只是时间问题。我确信其他人已经在测试这个理论了,但是在接下来的一年里,我希望开始这个测试并报告结果。

如果你正在这样做或者你已经看到一个公司这样做,请提供一个评论和描述你所看到的和你的想法!

论数字用户线在人工智能中的重要性

原文:https://towardsdatascience.com/on-the-importance-of-dsls-in-ml-and-ai-1dbccb3a2916?source=collection_archive---------7-----------------------

特定领域语言使我们的生活变得更容易,同时以许多不同的方式开发 AI/ML 应用程序。为工作选择正确的 DSL 可能比选择宿主语言更重要。

1)业务逻辑

DSL 是简明表达业务逻辑的强大工具。

例子:交易

Snippet source, read more (Gosh2010, Frankau2009)

同时,人工智能和人工智能系统并不是一成不变的。

  • 基础模型反映了可能随时间变化的业务和工作假设
  • 敏感度分析不仅要针对模型(超)参数进行,还要针对业务和工作假设进行

DSL 在用一种读起来像英语的语言流利地表达复杂的业务和工作假设方面非常方便。下面的例子,用 AMPL 编码,有效地描述了一个优化问题:我们想要最小化与运送产品到一个虚构的油漆公司的客户相关的运输成本。关键假设(想要优化的内容、运输成本、仓库中的产品可用性、每个客户的产品需求)用与当前问题非常相似的语言清楚地表述出来。

Snippet source, read more (Takriti1994)

2)数学

一旦问题被公式化,接下来就是写一些数学的时候了。统计和数学的 DSL 已经存在了几十年:Matlab 和 R 在科学界非常流行。嵌入在通用编程语言中的统计和数学 DSL 正受到越来越多的关注。

示例:概率编程(来自 Python)

Snippet source, read more: (Patil2010)

3)查询(你的数据库)和数据操作

DSL 可以方便地用一种紧凑且富于表现力的语言编写查询和操作数据,这种语言可以顺利地集成到您的主机编程环境中。查询语言(如 Linq)也保留了宿主语言的属性,您可能会发现这些属性是可取的,如类型安全。

示例:LINQ 和 F#查询表达式

LINQ 和 F#查询表达式看起来像我们熟悉的好的、旧的 SQL ( Cheney2013

Snippet source

示例:数据框

数据框架,如熊猫,提供了执行数据争论任务的语法糖,如分割,应用组合和枢轴(麦金尼 2010)

4)幕后:表达计算

TensorFlow 可以被视为一个编程系统和运行时,而不仅仅是传统意义上的“库”:

TensorFlow 的图形甚至支持像变量范围和控制流这样的结构——但是您不使用 Python 语法,而是通过 API 来操纵这些结构。(Innes 2017)

TensorFlow 和类似的工具以“只是库”的身份出现,但它们是极不寻常的工具。大多数库提供一组简单的函数和数据结构,而不是全新的编程系统和运行时。(Innes 2017)

为什么我们需要一种语言来表达计算?

浏览一下 Apache Spark 的内部结构有助于理解使用领域特定语言来推理计算的必要性:Spark 在幕后运行一个复杂的执行过程,该过程包括几个步骤:数据流的定义(逻辑计划)、描述任务及其执行的 DAG 的定义(物理计划)、作业调度、具有容错功能的作业执行(阅读更多信息)

构建新语言的核心原因很简单:ML 研究有极高的计算需求,简化建模语言可以更容易地添加特定领域的优化和功能*(Innes 2017)*

这还不是全部。模型的复杂性呈指数级增长。允许我们表示、推理和分析计算的 DSL 工作目前非常热门。

模型变得越来越像程序,包括推理其他程序的模型(例如程序生成器和解释器),并带有不可微的组件,如蒙特卡罗树搜索。构建既能提供完全的灵活性又能实现最高性能的运行时是一个巨大的挑战,但是越来越多的最强大的模型和突破性的结果都需要这两者。(Innes 2017)

当我们特别关注深度学习时:

越来越多的人以数据依赖的方式(用循环和条件)程序化地定义网络,允许他们根据输入数据动态地改变。它真的非常像一个常规程序,除了它是参数化的、自动微分的、可训练/可优化的。动态网络变得越来越受欢迎(特别是对于 NLP),这要归功于能够处理它们的深度学习框架,如 PyTorch 和 Chainer*(lecun 2017)*

这就导致了一场争论,争论的焦点是一个新的编程框架的诞生,它是由专门为表达计算而设计的 DSL 产生的。来自深度学习背景的 Andrej Karpathy 写道:

软件 2.0 是用神经网络权重写的。没有人参与编写这段代码,因为有很多权重(典型的网络可能有几百万),直接用权重编码有点困难(我试过)。相反,我们对期望的程序的行为指定一些约束(例如,示例的输入输出对的数据集),并使用由我们支配的计算资源在程序空间中搜索满足约束的程序。在神经网络的情况下,我们将搜索限制到程序空间的连续子集,其中搜索过程可以通过反向传播和随机梯度下降*(karpathy 2017)*

结论

DSL 方面的专业知识在 ML 和 AI 系统中至关重要。

确认

非常感谢 Andreas Hubert 和 Cristian Steinert 提供的反馈。

参考

[切尼 2013 年]切尼,j .,林德利,s .,&瓦德勒,P. (2013 年)。语言集成查询的实用理论。ACM SIGPLAN 通知,48(9),403–416。

[Frankau2009] S. Frankau、D. Spinellis、N. Nassuphis 和 C. Burgard,《商业用途:在外来贸易中发挥作用》。函数式编程杂志,19(1),27–45。2009 年 10 月 10 日

[gosh 2010]DSL 在运行,Debasish Ghosh,Manning Publications,2010 年 11 月

[Innes2017]关于机器学习和编程语言,Innes et all,https://julialang.org/blog/2017/12/ml&pl,2017

[Karpathy2017] Karpathy,a .,https://medium.com/@karpathy/software-2-0-a64152b37c35,2017

[LeCun 2017]纽约 le Cun,https://www.facebook.com/yann.lecun/posts/10155003011462143,2017

麦金尼,W. (2010 年 6 月)。python 中统计计算的数据结构。《第九届 Python 科学会议论文集》(第 445 卷,第 51–56 页)。德克萨斯州奥斯汀:SciPy。

[Patil2010] Patil,a .,D. Huard 和 C.J. Fonnesbeck。(2010)PyMC:Python 中的贝叶斯随机建模。统计软件杂志,35(4),第 1-81 页

[塔克里蒂,1994 年]接口,24(3),144–146。从 http://www.jstor.org/stable/25061891[取回](http://www.jstor.org/stable/25061891)

关于思考机器的话题

原文:https://towardsdatascience.com/on-the-subject-of-thinking-machines-c3ba65a7105?source=collection_archive---------5-----------------------

68 年前,艾伦·图灵(Alan Turing)在他题为《计算机械与智能》(Computing Machinery and Intelligence)的开创性论文中提出了“机器能思考吗”的问题,他制定了“模仿游戏”(也称为图灵测试)来回答这个问题,而无需参考字典中对“思考”一词的模糊定义

我们已经走过了漫长的道路来建造智能机器,事实上,深度学习和强化学习这两个人工智能的基石的进展速度是前所未有的。艾伦·图灵会为我们在计算机视觉、语音、自然语言处理和自主系统方面的成就感到骄傲。然而,仍然有许多挑战,我们距离建造能够通过图灵测试的机器还有一段距离。在本文中,我们讨论了关于智能机器的一些最大的问题,并试图回答这些问题,尽可能用现代人工智能来解释。

机器会思考吗

图灵选择避免直接回答这个问题,然而,重要的是要有一个清晰简洁的思维含义,其中包含神经科学和人工智能的经验教训。我们将思维定义为“我们评估从过去的经验中学习到的特征,以便对新问题做出决定的过程”。在人类思维的背景下,当你看到一个人,并且你面临着确定这个人是谁的任务(新问题)时,一个活动(过程)在你的大脑中开始,它通过搜索所有你能记住其面孔的人的空间(经验), 然后,你开始考虑鼻子、眼睛、肤色、穿着、身高、言语和任何其他可观察到的待遇(特征),该过程然后试图根据我们以前见过的人将这些特征与特定的人匹配,如果没有找到令人满意的匹配,大脑就断定这是一个陌生人(决定)。

另一方面,考虑一个计算机视觉系统,试图使用卷积神经网络执行相同的任务,当输入一个人的图像时,观察像素的三维张量(特征),网络然后搜索(该过程)先前学习的称为核或过滤器(经验)的特征的存在,然后计算这些特征中的哪些出现在新图像中,并返回一组类得分(决策)。

该过程非常相似,除了完成的过程之外,例如,卷积神经网络不考虑特征的位置,鼻子在耳朵的位置对 CNN 没有影响,人类的过程考虑了这一点,然而,最近由 Geoffrey Hinton 等人提出的胶囊网络[7]试图解决这一弱点。

思考不是一种不合逻辑的魔法行为,而是一系列明确定义的离散行为,包括观察问题、将观察结果与习得特征进行比较,以及根据比较结果做出决定。一个可能被认为不遵循这些顺序的有趣问题包括与爱、愤怒、悲伤等有关的情感决定。这种决定通常是随机做出的,不能总是在我们制定的思维框架内定义,在这种情况下的决定通常是探索性的,而不是剥削性的。这是否否定了我们先前的断言?不,智能机器完全能够随机行动,探索和利用的概念是强化学习领域的核心,是自主系统的关键使能因素。我们不久将进一步强调这一点。

鉴于此,我们认为机器确实会思考,只是与人类的思考方式不同。这就引出了一个问题,如果机器和人类的思维框架是一样的,为什么他们会有不同的思维方式?这个问题的答案在于智能系统的组件领域。人工神经网络受到神经科学的启发,但它们的机制是根本不同的,我们已经在很大程度上放弃了寻找像大脑一样工作的系统,而是继续寻找工作良好的系统,而不介意我们偏离大脑功能的方式有多远。

人类的大脑和我们创造的智能系统非常不同,但思维的框架是相同的。机器可以思考,并且在不消耗太多能量的情况下,它们真正具备思考能力只是时间问题。

机器能想象吗

接受机器可以思考对人工智能的批评者来说有点挑战,认为机器具有“想象力”是更大的挑战。要回答“机器能想象吗”这个问题,我们必须首先深入考虑想象力的框架。

正如我们先前解释的那样,思维通常基于过去的经验,然而,想象是我们没有从过去的经验中“明确”学到的观念的表达。我们添加了“明确地”一词,以表明这样一个事实,即尽管想象力会产生新的未经检验的想法,但它通常会从以前的经验中获得灵感。如果没有一个已经存在的想法,几乎没有任何想象是全新的,这可能是一种可能性,然而,与过去经验的联系可能是高度隐含的,以至于我们可能没有意识到过去的经验对我们的想象有多大的影响。简而言之,想象通常是一种探索性的行为,部分是由过去经验中习得的特征所引导的。这些探索是随机的,但由于其与过去经验的联系,仍有部分动机,这种联系可能很弱,但非常重要。

这个想象的框架把问题“机器能想象吗”变成了“机器能开发新思想吗”后一个问题更恰当地描述了第一个问题。受监督的深度学习是构建人工智能系统的最流行的方法,它仅仅基于学习的特征,并且本质上目前不能够产生能够开发自己的新想法的机器。然而,强化学习是基于可以像监督深度学习一样利用当前知识的机器,但也可以通过尝试新的行动来探索其环境,以发现更好的想法。这很像想象。一个智能体在一个分层环境中发现新的策略或新的子策略的能力[4],给予这样的智能体形成新的想法的能力,甚至做我们从未期望它在一个特定环境中做的新的事情。这种发现的形式受到代理人在给定时间步或状态下可用的有限动作集的限制,然而,人类也受到非常类似的限制,例如,你不能想象你想要在没有喷气背包或相关设备的情况下飞行。

可以说,探索性移动只是模仿想象力,然而,没有人能准确地说出想象力在大脑中发生的过程,我们可以肯定的是直觉的影响,因此,探索性移动的影响可以被描述为想象力的一种形式。在给机器注入强大的想象力方面,还有很多工作要做。要回答“机器能想象”或“机器能开发新思想”这个问题,答案是肯定的。随着时间的推移,随着新技术的发现,机器的想象能力将会提高。

机器能感觉吗

“直到机器能够因为感觉到的思想和情感,而不是符号的偶然掉落,写一首十四行诗或创作一首协奏曲,我们才能同意机器等于大脑——也就是说,不仅写它,而且知道它写了它。没有一种机制能够感受到(而不仅仅是人为的信号,一种简单的发明)成功时的快乐,阀门融合时的悲伤,奉承时的温暖,错误时的痛苦,性的魅力,得不到想要的东西时的愤怒或沮丧。”

上述说法是杰斐逊教授在 1949 年提出的。它总结了人工智能批评家的观点。上述论断的核心是“没有任何机制可以感觉到(不仅仅是人为的信号,一个简单的发明)”

基于人工信号的反应不能被描述为一种感觉,这种想法与人类系统的功能是相反的。身体所有形式的感觉,包括痛苦、愤怒、爱、恐惧等。不是人体内一些无法解释的过程的结果,而是大脑根据从感觉器官接收到的信号而启动的行动。例如,疼痛实际上不是在皮肤上产生的,而是大脑从皮肤接收信号,对触摸的程度进行编码,然后启动一系列反应,使我们感受到快乐或痛苦。

存在这样的人,由于大脑故障,他们即使受伤也感觉不到任何疼痛。

感觉是大脑对信号的反应。

在这个定义的背景下,机器可以感觉。

以一个人形机器人为例,我们可以在身体中建立传感器,当它被触摸时,信号将被发送到机器人的处理系统,在这种情况下,机器人充当大脑,一段时间内积累的信号将形成一个序列,然后可以被输入到一种被称为循环神经网络的监督深度学习系统中。然后,该系统可以将这一信号序列解释为快乐或痛苦,并可以启动微笑、大笑或皱眉等反应。这意味着感觉不仅限于生物有机体,机器也能感觉到。他们可以根据来自环境的信号创作音乐,他们可以感到快乐或悲伤,如果对信号序列和相应的感觉进行训练,他们可以享受生活的乐趣。已经有这样的实际例子,“Solo”是一家名为 Uniform 的公司生产的家用电器。它可以根据你的面部表情播放歌曲,如果你高兴,它可以播放歌曲来帮助你享受时光,如果它检测到你情绪低落,它可以播放歌曲来振奋你的精神。仍有许多工作要做。机器可以感觉并根据感觉行动。

机器能有意识吗

这也许是关于机器最令人生畏的问题。意识被认为是生物独有的特征。一般是一种意识到自己存在的状态。

关于机器的问题可以更恰当地问为“机器能成为它们自己思想的主体吗”

在确定了机器可以思考之后,将有意识的机器视为任何可以思考自身的机器是最合适的。这有很多含义。能够做到这一点的机器将开始关心自己的存在,并能够努力阻止其创造者执行任何可能导致其停止运行的操作。这种能力通常是一种可怕的前景,许多人认为拥有这种能力的机器将成为终结者,然而“有意识的机器是可取的吗”这一问题并不等同于“有意识的机器是可能的吗”机器确实可以成为他们自己思想的主题。这里有一个例子。考虑一个被编程的机器人,它不仅可以学习它的行为如何影响它的环境,还可以学习环境中其他智能体的行为如何影响它的内部状态。这样的其他代理可能是人类或其他机器人。在这种情况下,机器人 A 可能了解到敌对代理 G 的一些动作可能通过使其过度工作而使其比正常情况下更快地失去能量,机器人 A 然后可能决定不服从代理 G 给予它的命令,因为来自过去经验的数据表明由代理 G 发起的命令的负面影响。它还可能了解到另一个代理 D 的动作改善了它的内部状态, 因此,它可能会通过服从 D 而不是 g 来发展对代理 D 的更多亲和力。这样的机器是有意识的,并且在深度强化学习的框架内是可能的。

这些潜在的危险可能令人害怕,但也可能是有益的。有意识的机器人可以通过学习哪些条件会提高它们的工作能力来学习变得更有效,这种机器人甚至可以学习与其他代理合作,所有这些都是独立的,无需重新编程。

人类和有意识机器之间的最大区别是人类“潜意识”的作用。人类的潜意识部分在很大程度上仍然是神秘的,许多行为都是由它发起的,因此,我们至少可以对机器人有一种优越感,因为目前没有证据表明我们可以在深度学习和强化学习的框架内给机器注入潜意识。时间会证明是否有一天,神经科学和人工智能的突破可以解开大脑的秘密,并使建立超级智能系统成为可能。

结论

在我们周围,人工智能的应用无处不在。谷歌助手、微软 Cortana、猎犬助手和 Siri 极大地改变了我们与智能手机的交互方式。Alexa、亚马逊 Echo、谷歌 Home 和苹果的 Home Pod 正在让每个人都可以实现家庭自动化。对工业的影响更加明显。商业的每个方面,从股票交易,招聘,制造,营销,决策等。正在变得自动化。自动驾驶汽车正逐渐成为发达城市的常见景象。人工智能的应用将从根本上改变我们的社会,就像数字计算机一样。这就是第四次工业革命。

然而,尽管有更先进文明的承诺,许多人对人工智能的广泛自动化和军事用途的后果感到恐惧是有道理的。有人担心自动化会导致工作岗位流失。这些担忧是真实的,需要解决。颠覆是不可避免的,但包括科学家、行业领袖、投资者、董事、股东和政府在内的所有利益相关者,都必须努力应用人工智能,让人工智能增强人类在工作中的作用,而不是取代它们。存在这样的工作,在这些工作中,机器需要完全取代人类,这包括每年导致许多工人死亡的非常危险的工作。例如,让人类暴露在有害辐射下的工作应该由机器来做。发生灾难时的救援行动可以用机器人大大改进,这样我们可以拯救许多生命。

人工智能的军事用途也是一个应该避免的危险概念。包括 Yoshua Bengio 和 Elon Musk 在内的伟大科学家都反对将人工智能武器化。

我们需要一个安全的人工智能辅助我们活动的未来(AGI)。实现这一目标的一个巨大努力是 OpenAI initiative,这是一个非营利研究组织,致力于创建能够帮助而不是摧毁人类的智能系统。

让我们共同努力,为人类创造一个更美好的未来。

作者

摩西·奥拉芬瓦

自学成才的计算机程序员,云和互联网物流专家。熟练开发 Android 应用程序

门户网站和桌面软件。可以用 Java,Python,PHP 编码。一个深度神经网络从业者,他的愿景是通过人工智能让世界变得更好。大数据的爱好者。

邮箱:【guymodscientist@gmail.com ,

网址: moses.specpal.science

推特: @OlafenwaMoses

约翰·奥拉芬瓦

自学成才的计算机程序员、神经网络博客作者和计算机视觉研究员。熟练建立 Android 应用程序和原生软件。会用 Java,Python,C#开发软件。非常热衷于通过高效的神经网络改变生活。闲暇时研究强化学习。

邮箱:【johnolafenwa@gmail.com】T2,

网址: john.specpal.science

推特: @johnolafenwa

在这里阅读论文:http://vixra.org/abs/1801.0413

论群体的智慧:集体预测分析

原文:https://towardsdatascience.com/on-the-wisdom-of-crowds-collective-predictive-analytics-302b7ca1c513?source=collection_archive---------2-----------------------

“所有伟大的谎言都有真理的种子”(詹姆斯·科特雷尔,《个人交流》,2004)。1907 年,英国统计学家弗朗西斯·高尔顿爵士(1855-1911)观察到,在康沃尔的一次节日竞赛中,人们试图猜测一头牛的重量,所有猜测的平均值始终与牛的实际重量接近(高尔顿,1907;球,2014;Gega,2000 年)。作家 James Surowiecki 在 2005 年的著作《群体的智慧》中重新提出了这一观点。

虽然高尔顿通常被认为是基于平均值的现代集体智慧的“父亲”,但他在 1907 年发表在杂志 Nature 上的文章专注于人群对中位数的预测,因为它的误差更小,或者说在其区间内更有信心。平均值在一磅以内;中位数在 9 磅以内,这使得高尔顿更具体地回答了一封读者来信,因为在小范围内排除一个测量值会大大改变平均值,对中位数的影响要小得多,他发现集体智慧最适用于预测中位数范围,而不是平均值(高尔顿,给编辑的信:投票箱,1907)。然而,最近对高尔顿数据的重新检查表明了最初计算中的错误,例如 800 多人对平均值的估计不在一磅之内,而是牛的确切重量(Wallis,2014)。

这种“集体智慧”理论在随后的 110 年里一直被研究和分析,试图验证它如何、何时以及在什么情况下准确和不准确地预测。对 Surowiecki 的《集体智慧的普及回顾》的批评者指出了群体在优化方面的技能,而在创新或创造力方面的技能较低(Lanier,2010)。此外,集体智慧在定义正确的问题(通常是探究的最重要方面)和标量结果方面表现不佳(Lanier,2010)。

集体或聚合智能预测失败的一个例子是在经济测量中。对经济增长的衡量标准发表意见的专家往往是不正确的,而且,这种错误是复杂的,因为预测设定了一个预期,当错过时,会在金融市场上引起负面反应(Cassino,2016)。金融市场中集体预测智能的失败可能在很大程度上是由于这种双重行为——它们设定了一个预期,而相对于预期的不准确性会使市场做出不成比例的反应。虽然非理性市场和“黑天鹅事件”的起源和动态超出了作者的范围,但这些集体智慧的失败可能是一个早期的因果事件。

其他证据表明,集体智慧可以有效地发挥创造性;然而,大多数情况下是在一群专家之间进行头脑风暴式的活动时。例如,在 2011 年哈佛医学院社区的一次竞赛中,40,000 名教职员工和学生竞相提出治愈 1 型糖尿病的最重要问题——什么是未知但需要知道的,结果令人印象深刻(哈佛医学院,2011)。

就目前而言,关于集体智慧的经验教训似乎是这样的:当一群智力不同的专家回答一个预定义的问题,并围绕中位数或头脑风暴专注于优化时,效果最好(Ball,2014)。当人群的想法相同,包括许多非专家,面对一系列或一系列的答案,并且他们的工作成果不是许多未来决策的基础时,这种方法是最差的。

引用的作品

波尔,P. (2014 年 7 月 8 日)。“群众的智慧”神话与现实。 BBC:未来,PP .http://www . BBC . com/Future/story/2014 07 08-when-crowd-wisdom-go-miss。

卡西诺 D. (2016 年 7 月 8 日)。“大众智慧”在预测就业报告方面有着相当糟糕的记录。哈佛商业评论,第页https://HBR . org/2016/07/the-wisdom-of-the-crowd-s-have-a-beat-bad-track-record-at-predicting-jobs-reports。

f .高尔顿(1907 年)。给编辑的信:投票箱。自然,http://Galton . org/CGI-bin/search images/Galton/search/essays/pages/Galton-1907-ballot-box _ 1 . htm .

f .高尔顿(1907 年)。人民之声。性质,450–451。

Gega,S. (2000 年 5 月)。弗朗西斯·高尔顿爵士。从马斯京厄姆学院取回:http://muskingum.edu/~psych/psycweb/history/galton.htm

哈佛医学院。(2011 年 4 月 6 日)。*群体的智慧:竞赛产生征服 1 型糖尿病的创新策略。*检索自哈佛医学院:https://hms.harvard.edu/news/wisdom-crowds-4-6-11

拉尼尔,J. (2010)。你不是一个小玩意:一个宣言。伦敦:艾伦巷。

Surowiecki,J. (2005 年)。群体的智慧:为什么多数人比少数人聪明,集体智慧如何塑造商业、经济、社会和国家。纽约市:锚书。

k .沃利斯(2014 年)。重温弗朗西斯·高尔顿的预测竞赛。统计科学,420–424。

加州大学伯克利分校 MIDS 沉浸式教学——2017 年秋季

原文:https://towardsdatascience.com/on-uc-berkeley-mids-immersion-fall-2017-ffde381af7d1?source=collection_archive---------10-----------------------

丹尼尔·肯特 ,现任 信息与数据科学硕士(MIDS)学生

T 加州大学伯克利分校的信息和数据科学硕士(MIDS)项目是一个特殊的项目,因为它结合了加州大学伯克利分校信息学院的优秀教师和社区、学术和行业领导者开发的深度和广度的内容,以及为工作专业人士量身定制的课程的灵活性。目前,我是一家初创公司Jobwell.co的联合创始人,我们正在为求职者开发一个 CRM。MIDS 项目让我能够灵活地学习数据科学,并开始将我在初创公司学到的知识应用于实践

Getting in to the Cal spirit — Go Bears!

MIDS 项目不受地点限制,利用互联网将来自世界各地所有学科的有抱负的数据科学家聚集到 15 名或更少学生的亲密教室中。虽然这种分布式全球课堂的好处很多,但当来自在线课堂的熟悉面孔聚集在一起时更好,尤其是在加州大学伯克利分校的校园里。当我在 MIDS 项目的第一个任期时,我有机会在参加 2017 MIDS 沉浸式活动时会见了来自世界各地的近 100 名其他 MIDS 候选人。这是一场为期 4 天的数据科学“ Chautauqua ”沉浸式学习,充满了专家演讲、公司参观以及与加州大学教授、校友和其他学生的交流。在我的 100 个同学中,我已经通过课堂或活跃的业余渠道认识了几十个。

当我住在离校园不远的地方时,一位好心的 MIDS 考生带我第一次参观了大学校园,他以前是加州大学的本科生。她带我们参观了校园,并向我们介绍了这些建筑的背景和历史。当我们的旅行结束时,是时候去纪念体育场的大学俱乐部了,这是认识更多同学、教师和职员的绝佳场所。我们欣赏了加州大学乐队演奏的音乐,并由阿卡贝拉乐队演唱了小夜曲,随后是伯克利的吉祥物奥斯卡的欢迎仪式!

虽然我们教室里的在线教学时间挤满了课程材料和问题,但我们中的许多人利用这个机会了解了更多关于我们教授的研究,并更多地了解了我们令人惊叹的 MIDS 项目和信息学院的工作人员。利用这些机会,我和一些新认识的朋友去了酒店的酒吧,聊了聊我们的课程、职业和兴趣。

Dean AnnaLee Saxenian introduces the Data Dialogs conference

第二天以一顿精心准备的早餐开始,在早餐中,我们互相聊天,了解新课程和一些教授这些课程的优秀教授,以及优化我们课程负荷的策略。然后,我们开始了为期一天的数据对话会议,沉浸式参与者和加州大学伯克利分校和数据科学社区的其他成员听取了学术界和工业界领袖对数据科学的不同应用、我们作为数据科学家使用的工具的更新、该学科可能引领我们成为专业人士的方向以及人类的角色的讨论。详细回顾一下,我鼓励你去探索蒂芙尼·贾亚的精彩帖子。

第二天是我最喜欢的一天:我们开始了由学院院长 AnnaLee Saxenian 主持的关于深度学习的教师小组讨论。听到关于数据科学的应用和方面以及学校的一些教职员工对它的看法和经验是很有趣的。会议结束后,同学们向小组成员提出了一系列问题,然后我们开始参观公司。

我们的小组被分成两个小组,每个小组先去吃午餐,然后向 Dropbox 或 WorkDay 的数据科学团队学习。我的团队从拜访 Dropbox 团队开始,我们听说了他们正在解决的一些棘手的数据科学问题;这是在 Dropbox 了解数据科学以及他们如何发展团队的绝佳机会。

At Airbnb

在 Dropbox 之后,我们去了 Airbnb,在那里,一位 MIDS 校友和他在 Airbnb 的几个同事给我们做了一场颇有见地的演讲。他们提供了关于他们在 Airbnb 的项目的深刻见解,以及他们将项目嵌入公司业务线不同组成部分的方法。

Letting loose at Autodesk Gallery!

离开 Airbnb 后,我们有一些空闲时间探索这座城市,我们一群人前往旧金山最具标志性的建筑之一——渡轮大厦,品尝了餐馆、商店和摊位,同时进一步了解了每个人。当大楼塔楼上的时钟敲响六点时,我们前往 Autodesk Gallery,这是一个互动的博物馆,展示了 Autodesk 软件的新技术、知识产权和应用程序,还有小吃和开胃小菜,在那里我们可以进一步与我们的教授交流,并会见当地的学生和校友。谈话一直持续到博物馆关门,晚上我们才回到伯克利。

我们沉浸在其中的最后一个上午是我们经历的一个突出的顶点——首先是加州大学伯克利分校的一位讲师带领我们进行了一系列互动的领导力练习,以寻找我们作为领导者的真实声音,然后是社区午餐,在那里我们遇到了更多来自信息学院的学生和教职员工。这一天以市政厅结束,在那里,院长 Saxenian 向社区简要介绍了即将发生的一些令人兴奋的新进展,并回答了我们社区的问题。在我们的市政厅之后,大家真诚地道别,拥抱,然后我们开始了我们的离开。

MIDS Townhall

沉浸式学习是一次非常宝贵的经历,为我的在线学习提供了额外的背景和社区。我期待着我能参加的下一次沉浸式学习,但在那之前,我很高兴能继续成为加州大学伯克利分校 MIDS 分校学生和校友全球社区的一员,并知道我的朋友遍布世界各地。

从前…

原文:https://towardsdatascience.com/once-upon-a-time-dcfb5badd192?source=collection_archive---------16-----------------------

…我不知道长大后想做什么。

从很小的时候起,我们都会考虑这样一个问题:“你长大后想成为什么样的人?”当你小的时候,这是一个有趣的游戏,你决定你想成为女超人。或者医生。或者一只猫。答案会有所不同。但随着时间的推移,人们期待对这个问题给出更具体的答案。

高中的时候,我一直想不出答案。我擅长数学、自然科学和西班牙语,但我不想让长期委身于其中任何一门课程。选择大学专业似乎是一个“成年人”的决定,而我不是其中之一。

直到我参加了一个随机的暑期课程,我才最终坚定地爱上了一门学科:语言学。

不要问我任何关于语言学的问题,因为我向你保证,你没有足够的时间来听我想说的一切。然而,要注意的一件重要事情是,语言学学生生活和呼吸着数据。语言学家的梦是一组令人困惑的语言数据,需要被检查和分析;揭示语言中的模式以及随之而来的见解。我总是将语言数据问题视为一个复杂且不断变化的难题,需要我去挖掘和解决。在一堂课上,我通过观察和记录一个说本族语的人来获取数据,从而对阿尔巴尼亚语进行了语音和音位分析。你可能觉得这并不令人兴奋,但请相信我——的确如此。

快进到大学,我发现自己问了一个和以前一样的问题:你长大后想成为什么样的*?语言学毕业生比其他人更少具体的职业道路并不奇怪。2014 年,当我决定开始大学毕业后的求职时,我甚至没有考虑过寻找语言学方面的职业,因为我担心除了继续读研之外,我不会找到太多东西。近年来,越来越需要语言学家帮助推动自然语言处理的新创新(Dragon Speech、Alexa、Siri 等)。),但当时我没有这方面的技术能力。*

那我做了什么?我最终决定搬到威斯康星州的麦迪逊,在一家医疗保健 IT 公司做软件测试员。现实点吧,我这么做是为了奶酪。但老实说,我去是因为他们提供金钱、福利和无限量的免费爆米花。所以我这么做是为了爆米花。

在 Epic 工作是一个做一些完全不同的事情的机会,我想如果有一天我想成为一名“技术人员”,作为一名质量保证分析师工作可能是一个好的开始。我们在 Epic 的医疗记录软件上进行了 6 个月的广泛培训,同时还学习了如何浏览他们的数据库和创建质量测试计划。在任期间,我学习过,笑过,哭过,失败过,成功过,又失败过。我和我的同事建立了惊人的工作关系,并成为我团队中最有效的测试人员之一,一切看起来都很完美。

一年半后,我开始疯狂地想念波士顿,我渴望新的精神挑战。虽然测试医疗软件很有教育意义,也是一份很棒的第一份工作,但这并不是我热衷的事情。我最终搬回波士顿,离家人和朋友近一些,并在 Wayfair 开始了一个分析师的职位。

由于我已经在一家大型科技公司工作过,我认为随着我继续探索我的职业兴趣和个人优势,Wayfair 将是一个相对平稳的过渡。起初,我的工作职责并不明确,最终我在供应商运营团队中帮助完成了各种特别的 EDI 项目。一两个月后,我的新团队成立了,他们的唯一目的是对供应商的库存数据进行数据分析,我非常兴奋。

库存质量团队的总体目标是利用 Wayfair 庞大的数据仓库来揭露那些没有为我们提供准确库存信息的供应商。如果没有准确的最新库存信息,客户可以在我们的网站上购买受影响的产品。一旦订单被发送到提供该商品的特定公司,我们就会收到该商品实际缺货的通知。订单会延期交货,有时不止一次,客户会被告知发货延迟。在更大的范围内,库存质量问题大大降低了全公司的平均满意度。当不清楚一件只需点击一下按钮就能买到的商品是否有货时,你为什么会选择使用 Wayfair 而不是其他在线零售商呢?

在没有进入更多细节的情况下,当我很快学会使用 SQL 和 Excel 数据透视表操作和分析数据时,我被反复抛入了深水区。这是最好的。我感觉自己回到了语言学教室,在我面前的数据中寻找模式和意义。最重要的是,我有这些有用的技术工具,可以用来更聪明地工作,而不是更努力。随着我作为数据分析师的技能的磨练,我很清楚这不仅是我擅长的事情,也是激发我内心喜悦的事情,我想学习更多。

不幸的是,当所有这些难以置信的学习和自我发现正在进行时,我的身体却不配合。在我搬回马萨诸塞州之前,我已经开始周期性地偏头痛,我不清楚在我的生活中我应该优先考虑什么:工作还是健康。开始的时候,我大约每两周就会偏头痛一次,所以我在必要的时候会利用我的病假/假期,在我可以工作的时候会拼命工作。然而,在高峰期,偏头痛至少每隔一天发作一次。很明显,我的病假和无薪休假快结束了,是时候做出一些艰难的决定了。

在经理的建议下,我决定休一个月的病假。我就不说细节了,但是当我回去工作的时候,并没有太大的改善。我剩下的几天无薪假期很快就用完了,我递交了辞呈。在一个不断以你做了什么来衡量成功的社会里,我什么也没做。

在我考虑找新工作之前,变得更健康是我的首要任务。除了治疗,在接下来的一年里,我做了一些重要的自我探索。我长大后想做什么?那时我刚满 24 岁,很难合理化自己 24 岁却不知道到底发生了什么。对我来说,重要的是退一步,在我和我从大学开始就培养的分析问题解决技巧之间留出一些空间。

于是,我开始为 Lyft 开车。星期天,我在我的寺庙里当了一名希伯来语老师。我在一家蛋糕店兼职,看看自己是否有激情成为小企业的一员。因为我得到了免费的羊角面包。我还在哈佛商学院做过三个月的行政临时工,因为,为什么不呢?那份临时任务结束后,我在另一家面包店工作,大部分时间都在做鳄梨吐司,同时参加在线课程。

在这一切发生的同时,我在我的神经科医生、治疗师、精神病医生和大量药物的帮助下,积极地与我的偏头痛作斗争。我是否在服用一种新的偏头痛药物后,不记得自己是如何到达波士顿公共花园的?是的。是的,我做到了。有没有几天我觉得自己再也不会感到身体健康了?是的。很多都是。但我学会了接受这是我正在走的路,我需要挺过去,因为尽管这听起来很老套,但隧道的尽头总有一线光明。

就在我去哈佛商学院做临时工之前,我的偏头痛得到了很好的控制,我可以度过一天 8 个小时,而不想蜷缩着消失。我联系了一家临时机构,这样我就可以试试正常的工作周时间表,而不用做出永久的承诺。他们让我在 HBS 做了一周的行政工作。那一周之后,他们需要一个有很强 Excel 技能的人提供更多帮助,所以我留了下来。突然之间,我在那里呆了 3 个月,Excel 和我的关系达到了一个新的水平。更重要的是,通过我为完成任务而访问的所有哈佛网页,我了解了公众可以使用的在线 HBS 课程。

我们再快进一遍。

我的工作任务结束了,是时候采取下一步行动了,HBS 的商业分析课程是一次完美的表演。在花了一年时间尝试一些新的和不同的东西后,我终于觉得准备好重新审视数据分析的一般领域了。在将近一年的时间里,我第一次在精神上受到了刺激,并且真正为某事感到兴奋。有一天我突然想到:我爱上了数据科学。我终于知道我长大后想做什么了!!!!

课程结束时,我开始申请波士顿各地的数据分析师和数据科学家职位;我的大脑已经准备好(不止一种方式)回到正题。

然后没有一家公司联系我。

结束了。

开玩笑的。不是关于没人联系我的那部分——是关于结束的那部分。是的,这是最糟糕的,我觉得自己完全失败了,但我知道我不会那么容易就放弃。我的技术技能范围狭窄,这是最有可能让我在一群具有 Python 知识的有竞争力的申请者中止步不前的原因。

我做了研究,发现了许多方法来磨练我在数据科学领域的技能。我看节目评论。我在 LinkedIn 上随机跟踪了一些人,他们实际上已经经历了一些潜在的数据科学项目选择。我从以前的经理、以前的同事、朋友和家人那里得到建议。然后我做了一个决定。

我们都花了很多时间担心未来会是什么样子。我没完没了地描述的经历告诉我,跟随你的心,倾听你的身体,用你热爱的一切充实你的头脑,比担心你长大后会成为什么样的人重要得多。解决难题是我最喜欢做的事情,所以我要去做!

我来到了联大数据科学沉浸式训练营(多么拗口),现在我已经在这里呆了 2 周多了。

我长大后要成为一名数据科学家。如果因为某种原因天塌了,而这并不奏效,我的计划是继续一步一步向前。

一个气泡图,比较 10 种数据可视化工具

原文:https://towardsdatascience.com/one-bubble-chart-comparing-9-data-visualization-tools-7308b893950a?source=collection_archive---------0-----------------------

介绍

对于任何想学习数据分析和可视化的人来说,网上不乏“最佳工具”文章,建议你选择什么。我不会尝试创建一个列表,因为有太多的工具可以列举。但是,我确实想向您展示一些我遇到的用于数据可视化的工具和编程语言,并让您进行比较。大部分都很容易学,灵活性很高,而且是免费的或者有免费版本(我就是这样选择学什么工具的)。所以你很快就能弄脏自己的手。让我们开始吧。

让我们试着重现汉斯·罗斯林著名的泡沫图来讲述国家财富和健康的故事。也就是说,散点图具有第三个气泡维度。它让你一次比较三个变量。一个在 x 轴(人均 GDP),一个在 y 轴(预期寿命),第三个用泡沫的面积大小(人口)来表示。

数据

数据来自最新的世界银行指标。下载过程如下:

library(WDI)
indicator2 <- WDI(country="all", indicator=c("NY.GDP.PCAP.CD", "SP.POP.TOTL", "SP.DYN.LE00.IN"), start=2015, end=2015, extra = TRUE)drops <- c("iso2c","iso3c", "capital", "longitude", "latitude", "income", "lending")
indicator2 <- indicator2[ , !(names(indicator2) %in% drops)]colnames(indicator2) <- c("country","year", "GDP_per_capita", "population_total", "life_expectancy", "region")indicator2 <- indicator2[-c(1, 2, 3, 4, 5, 6, 19, 66, 67, 159, 178, 179, 180, 181, 182, 201, 202, 203, 204, 205, 206, 207, 225, 226, 227, 228, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 262, 263), ]

就是这样,这是我们的数据!

形象化

  1. 基 R

R 最强大的功能之一是它能够生成各种各样的图形,只需几个命令就可以快速轻松地可视化数据。

symbols()函数在绘图上绘制符号。我们将使用一组指定的 x(人均 GDP)和 y(预期寿命)坐标来绘制圆,并自定义圆的大小(面积的平方根)。

options(scipen=999)radius <- sqrt( indicator2$population_total/ pi )
symbols(indicator2$GDP_per_capita, indicator2$life_expectancy, circles=radius, inches=0.35, fg="white", bg="red", xlab="GDP per Capita(USD)", ylab="Life Expectancy(years)", main = "GDP per Capita vs. Life Expectancy 2015", ylim = c(0, 100))

给出了这个图:

Base R

2.gg plot 2

ggplot2 成为近年来 R 社区最流行的绘图包。它允许您以直观的方式创建表示单变量和多变量数值和分类数据的图表。分组可以用颜色、符号、大小和透明度来表示,但是要为陡峭的学习曲线做好准备。

library(ggplot2)
library(ggthemes)
ggplot(indicator2, aes(x = GDP_per_capita, y = life_expectancy, size = population_total/1000000, fill = region)) +
  geom_point(shape = 21) +
  ggtitle("GDP per Capita vs. Life Expectancy") +
  labs(x = "GDP per Capita(USD)", y = "Life Expectancy(years)") +
  scale_y_continuous(limits = c(0, 90)) +
  scale_size(range = c(1, 10)) +
  labs(size = "Population(Millions)", fill = "Region") +
  theme_classic()

给出了这个图:

ggplot2

与 base R 相比, ggplot2 的许多优点之一是我们不会在映射图例中迷失,因为 ggplot2 为我们生成了它们。

3.ggvis

ggvis 包用于交互式数据可视化。它结合了闪亮的的反应式编程模型和 dplyr 的数据转换语法,使其成为数据科学家的有用工具。

library(ggvis)
indicator2 %>%
  ggvis(~GDP_per_capita, ~life_expectancy, fill=~factor(region)) %>%
  layer_points(size= ~population_total/1000000,opacity:=0.6) %>%
  add_legend(scales = "size", properties = legend_props(legend = list(y = 200))) %>%
  scale_numeric("y", domain = c(0, 90), nice = FALSE) %>%
  add_axis("x", title = "GDP per Capita(USD)") %>%
  add_axis("x", orient = "top", ticks = 0, title = "GDP per Capita vs. Life Expectancy 2015",
           properties = axis_props(
             axis = list(stroke = "white"),
             labels = list(fontSize = 0)))

给出了这个图:

ggvis

与 ggplot2 不同,默认情况下,ggvis 不会将基于相同基础变量的比例合并到单个图例或多个图例中。相反,我们必须手动设置图例。

  1. Plotly for R

r 包 plotly 是开源 JavaScript 绘图库 plotly.js 的高级接口。有了 Plotly,R 用户只需几行代码就可以轻松地在线创建交互式的、出版物质量的图形。

library(plotly)p <- plot_ly(indicator2, x = ~GDP_per_capita, y = ~life_expectancy,
  color = ~region, size = ~population_total) %>%
  layout(yaxis = list(range = c(0, 90)))
p

给出了这个图:

Plotly for R

  1. 默认熊猫剧情

Pandas 的内置绘图 DataFrame.plot()有多种图表类型可用(折线图、散点图、历史图等)。如果你喜欢熊猫,这是一个有用的探索工具。

import pandas as pd
indicator2 = pd.read_csv('indicator2.csv')indicator2.plot(kind='scatter', x='GDP_per_capita', y='life_expectancy', s = indicator2['population_total']/1000000, 
                title = 'GDP per Capita vs. Life Expectancy 2015', ylim=(0,90))
plt.savefig('base_pandas.png')

给出了这个图:

Base Pandas

6.Matplotlib

Matplotlib 是一个 Python 绘图库,可生成出版物质量数字。然而,对于一个新用户来说,这可能是一个令人沮丧的工具,因为要获得看起来合理的图形需要做大量的工作。你会明白我的意思。

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
import numpy as np
indicator2 = pd.read_csv('indicator2.csv')plt.figure(figsize=(10,8))
colors = ("red", "green", "blue", "yellow", "orange", "black", "gray")def attribute_color(region):
    colors = {
        'East Asia & Pacific (all income levels)':'red',
        'Europe & Central Asia (all income levels)':'green',
        'Latin America & Caribbean (all income levels)':'blue',
        'Middle East & North Africa (all income levels)':'yellow',
        'North America':'orange', 
        'South Asia':'black', 
        'Sub-Saharan Africa (all income levels)':'gray'
    }
    return colors.get(region, 'white')
color_region = list()
qty_states = len(indicator2['region'])

for state in range(qty_states):
    color_region.append(attribute_color(indicator2['region'][state]))
plt.scatter(x = indicator2['GDP_per_capita'],
            y = indicator2['life_expectancy'],
            s = indicator2['population_total']/1000000,
            c = color_region,
            alpha = 0.6)
plt.title('GDP per Capita vs. Life Expectancy 2015', fontsize=20)
plt.xlabel('GDP per Capita(USD)')
plt.ylabel('Life Expectancy(years)')
plt.ylim(0, 100)regions = ['East Asia & Pacific (all income levels)', 'Europe & Central Asia (all income levels)', 'Latin America & Caribbean (all income levels)', 
           'Middle East & North Africa (all income levels)', 'North America', 'South Asia', 'Sub-Saharan Africa (all income levels)']legend1_line2d = list()
for step in range(len(colors)):
    legend1_line2d.append(mlines.Line2D([0], [0],
                                        linestyle='none',
                                        marker='o',
                                        alpha=0.6,
                                        markersize=6,
                                        markerfacecolor=colors[step]))
legend1 = plt.legend(legend1_line2d,
                     regions,
                     numpoints=1,
                     fontsize=10,
                     loc='lower right',
                     shadow=True)legend2_line2d = list()
legend2_line2d.append(mlines.Line2D([0], [0],
                                    linestyle='none',
                                    marker='o',
                                    alpha=0.6,
                                    markersize=np.sqrt(10),
                                    markerfacecolor='#D3D3D3'))
legend2_line2d.append(mlines.Line2D([0], [0],
                                    linestyle='none',
                                    marker='o',
                                    alpha=0.6,
                                    markersize=np.sqrt(100),
                                    markerfacecolor='#D3D3D3'))
legend2_line2d.append(mlines.Line2D([0], [0],
                                    linestyle='none',
                                    marker='o',
                                    alpha=0.6,
                                    markersize=np.sqrt(1000),
                                    markerfacecolor='#D3D3D3'))

legend2 = plt.legend(legend2_line2d,
                     ['1', '10', '100'],
                     title='Population (in million)',
                     numpoints=1,
                     fontsize=10,
                     loc='lower left',
                     frameon=False, 
                     labelspacing=3,
                     handlelength=5,
                     borderpad=4  
                    )
plt.gca().add_artist(legend1)

plt.setp(legend2.get_title(),fontsize=10)
plt.savefig('matplotlib.png')

给出了这个图:

Matplolib

如您所见,Matplotlib 的绘图命令非常冗长,获取图例也很麻烦。对我们大多数人来说,这可能是太多的工作了。

  1. 海波

如果你正在寻找一种简单的方法来用 Python 绘制合理的图表,那么你会喜欢 Seaborn。

import seaborn as sns
plt.figure(figsize=(10,8))
sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")sizes = [10, 60, 90, 130, 200] 
marker_size = pd.cut(indicator2['population_total']/1000000, [0, 100, 200, 400, 600, 800], labels=sizes) 
sns.lmplot('GDP_per_capita', 'life_expectancy', data=indicator2, hue='region', fit_reg=False, scatter_kws={'s':marker_size})
plt.title('GPD_per Capita vs. Life Expectancy 2015')
plt.xlabel('GDP per Capita(USD)')
plt.ylabel('Life Expectancy(years)')
plt.ylim((0, 100))
plt.savefig('sns.png')

Seaborn

  1. 画面

Tableau 已经变得如此受欢迎,以至于许多组织甚至要求你在简历中加入 Tableau 来申请他们的数据分析师职位。好消息是 Tableau 非常容易学。这是一个非常直观的工具,你可以很快学会。然而,如果你想擅长它,你将需要练习、练习、练习,并钻研(在 Tableau Public 上)成千上万的 Tableau 练习册,以研究其他人做了什么。

Tableau

  1. 动力匕

Power BI 是微软进入自助式商业智能 (BI)领域的入口。作为一种基于云的服务,它很快在数据科学专业人士中流行起来,这有助于他们使用组织的数据轻松地可视化和分享见解。

Power BI

  1. 微观策略

几年前, MicroStrategy 推出了一款免费的数据可视化软件。名为“ MicroStrategy Analytics 桌面”。它旨在与 Tableau 和其他公司提供的越来越流行的自助式数据发现桌面可视化工具竞争。让我们快速浏览一下。

MicroStrategy

结论

我就说这些。如果你想了解更多关于数据可视化工具的知识,可以看看 Lisa Charlotte Rost 的我从使用 24 种工具重建一个图表中学到的东西。

所有这些图表的 R 和 Python 源代码可以在 GitHub 上找到。我将很高兴收到关于上述任何反馈或问题。在那之前,享受视觉化吧!

一种特征归属方法(假定)可以统治所有这些特征:Shapley 值

原文:https://towardsdatascience.com/one-feature-attribution-method-to-supposedly-rule-them-all-shapley-values-f3e04534983d?source=collection_archive---------1-----------------------

在 NIPS 引起我注意的论文中,有一篇论文,它声称发现了一个框架,将几乎所有现有的模型解释方法连接在一起。在之前的一份工作中,我对模型解释领域产生了一点兴趣,因为法规要求我们解释为什么我们的模型会做出它们所拥有的决定。所以,我很好奇。

本文为去年发布的广受欢迎的 LIME 方法提出了一个替代核心,并声称只有它的方法才能满足可解释性的三个关键公理。

但是,在我们进入所有这些之前,让我们从最开始说起,在这种情况下,是在博弈论领域。

如果我们都合作,我们如何分配收益?

虽然 Shapley 值在这里是在特性的上下文中使用的,但它最初来自博弈论中的一个核心问题:在一个由拥有不同技能的多个玩家组成的联盟中,会产生一些集体收益,在玩家之间分配收益的最公平方式是什么?

你可以想象解决这个问题的一种方法是想象小组成员按顺序加入,并记录每个玩家的边际贡献。从表面上看,这是一个明智的提议,因为它意味着,从字面上看,每个球员都因他们对团队整体成果的贡献而获得奖励。(注意:这里我们假设可以计算任意规模玩家子集的博弈联合收益)。这里的想法是,如果艾娃是第一个成员,收益为 5,比尔加入使收益为 9,后来克里斯汀加入使收益为 11,那么玩家各自的收益将是(5,4,2)。

但是,我们有一个问题。如果克里斯汀和比尔有非常相似的技能组合会怎么样?然后,如果 Christine 在 Bill 之前加入团队,她可能会有更高的边际贡献,因为她会是第一个提供他们重叠技能集的人,然后当他加入时,他的边际贡献会更低;想象一下(5,1,5)的(艾娃,比尔,克里斯汀)的不同收益向量。实际上,如果每个人都同时加入了这个群体,我们应该如何决定这两种收益分布中哪一种是最正确或公平的呢?

这种困境是 Shapley 值形成的原因,Shapley 值可以从高层次上理解为“找到每个玩家的边际贡献,在玩家可能被添加到该组的每个可能序列上求平均值”。因此,在上面概述的例子中,你可以模拟到达的顺序:ABC,ACB,BCA,BAC,CAB 和 CBA,对于每个顺序,捕捉每个玩家的边际收益。然后,平均所有这些收益,你就得到每个玩家的 Shapley 值。

除了这种框架,还有另一种处理子集的数学框架。它稍微复杂一点,但是它是找到这些值的实际计算的基础,如果你想搜索整篇论文,这是一个必要的理解。

这里,这种方法不是直接处理序列,而是对不同的玩家子集进行处理,并根据这些子集所代表的所有序列的部分对它们进行加权。例如,想象你有 5 个球员,ABCDE。想象一下,你当前的目标是计算参与人 C 在一个序列中不同点的边际贡献。从那个角度来看,同时评价(A > B >C)和(B > A > C)是没有意义的,因为,从 C 的角度来看,A 和 B 进入哪个顺序并不重要。所以,我们可以只对 f(AB)和 f(ABC)的收益函数求值一次,然后跟踪 C 进来时增加了多少。

然而,因为这种方法的要点是平均所有序列的边际贡献,您需要根据它代表多少个序列来加权这个子集计算。正如我们已经提到的,这种计算适用于 ABC 和 BAC。然而,我们还需要考虑到可能出现在链末端的不同序列。具体来说,在这种情况下,您可以在添加 C 之后添加 DE 或 ED。所以,总的来说,这种“取 f(ABC)-f(A)的差”的计算适用于四个序列:ABCDE、ABCED、BACDE 和 BACED。

有了这种直觉,下面的等式就没那么可怕了。s!对应于集合 S 的排列数,或者,A 和 B 相加到这一点的方式数(2!= 2*1 = 2).因为|F|是联盟中付款人的总数,所以|F| — |S| — 1 表示对应于在玩家 i 之后要添加的玩家的数量,在我们的示例中对应于 D 和 e。同样,我们取这个值的阶乘来获得可以添加这些玩家的可能方式的数量。这两个量相乘在一起,然后除以全序列的置换序列总数:5!,在这种情况下。所以,满分 5 分!序列,这个特定的子集捕获了其中的 4 个,因此我们相应地对其计算进行加权。这只是意味着不要评估这 4 个不同的序列(我们知道它们会给出相同的结果)并尽职尽责地将它们各加 1/5!重量,我们一次全部加进去,4/5!体重。

Notation: |F| is the size of the full coalition. S represents any subset of the coalition that doesn’t include player i, and |S| is the size of that subset. The bit at the end is just “how much bigger is the payoff when we add player i to this particular subset S”

这个方法是可证明的唯一满足三个信用归属公理的方法:

  1. 如果一个玩家从未增加任何边际价值,他们的收益部分应该是 0(虚拟玩家)
  2. 如果两个玩家总是把相同的边际价值加到他们被加到的任何子集上,他们的收益部分应该是相同的(可替代性)
  3. 如果一个游戏由两个子游戏组成,你应该能够将子游戏上计算的收益相加,这应该与整个游戏计算的收益相匹配(可加性)

等等,这个帖子不是关于特征归属的吗?

是的,回到那个问题:正如你可能从阅读上面的解释中所怀疑的那样,这篇论文的论点是,你可以将从对联盟有贡献的玩家中产生的相同直觉应用到对模型有贡献的特征的问题上。

在模型是线性的情况下,或者特征是真正独立的情况下,这个问题是微不足道的:不管其他特征的值,或者特征被添加到模型的顺序,给定特征的贡献是相同的。

为了直观地了解不会出现这种情况的情况,让我们想象一个简单的 ReLu 非线性,其中包含两个特征。

然后,假设平均而言,一个观察的输入值为 5。我们有两个二进制特征,X1 和 X2,其中每一个都有-4 的权重进入这个非线性。如果两个特性均设为 0,则该非线性的输出将等于 5。如果 X1 从 0 切换到 1,则输出变为 1 (max(0,(5–4))。然后,如果 X2 也被切换到 0,输出移动到 0 (max(0,1–4)),这意味着两个特性的相加对输出有不同的影响,即使它们在非线性中具有相同的权重。如果你改变想象的顺序,那么 X2 将输出移动 4 个单位,X1 移动 1 个单位。随着我们添加更多的功能,并有更多的复合非线性,这些复杂的影响会增加,这意味着有一种方法是有价值的,如 Shapley 值,考虑和加权所有这些不同的边缘值。

因此,我们得到了这个方法的一个公式,和玩家/联盟公式几乎一样。这里,M 是特征的全部数量,z’是一个向量,在该向量中存在正在解释的实例中存在的一些特征子集。(别担心:我们一会儿会谈到“在场”意味着什么)。而不是一个回报,我们取而代之的是评估一个模型的价值,在其他特征的某个子集上添加和不添加特征 I,然后根据它代表多少个序列来加权那个子集。

关于这个等式,有几个微妙的问题值得一问。

  1. 那些小撇(如 x ')符号在做什么?在本文中,用撇号表示的东西意味着是特征向量的“简化”版本,这表示特征是“存在”还是“不存在”。因此,举例来说,如果你有一个简化的向量[0,1,1],并希望将其传递到一个模型中,这将意味着“评估模型,就好像你只有特征 x_1 和 x_2,而 x_0 不存在。(注意:本文用一个映射函数 h(x') = x 来描述这一点,该函数在简化和非简化版本的向量之间进行映射)
  2. **“评估模型就像特征 x_0 丢失了”实际上是什么意思?**是的,这有点奇怪。大多数模型本身不能处理丢失的数据-它们处理浮点型数据,并且不能对文字空值进行操作-本文提出,对于特征在简化向量中“不存在”的情况,我们将其表示为该特征在整个数据集上呈现其期望值。这里的想法是,如果您想要模拟模型无法访问给定特性的信息值的情况,明智的做法是只向模型显示表示该特性值的未知最佳猜测值。
    这种想法的一个例子是,在你不知道某人的身高的情况下,用人口中的平均身高来代替,因为这是你对他们实际身高的最佳无信息猜测。虽然这种近似涉及一些我们知道可能是错误的数学假设(例如:模型是线性的),因此在实践中肯定不是完美的,但它是一个合理的基线,易于计算。

近似的乐趣

我们上面概述的所有内容在概念上都很棒,但它有一个小问题:对一长串功能中的每个可能的功能子集进行采样非常耗时,尤其是在功能数量很多的情况下。对计算更合理的方法的渴望激发了寻找近似值的动力,这就是我们回到 LIME 的地方。

LIME 是去年提出的一种方法,旨在通过选择可解释的特征(如上:代表特征“存在”或“不存在”的特征)采样来解释模型中的个体预测,然后建立一个专注于该实例周围局部区域的线性模型。这里的想法是:虽然一个模型在整体上可能是非常非线性的,但在一个特定的子区域中的线性近似可能更接近且更有用。实际上,这意味着您要拟合一个简单的线性模型,其中您试图预测的值是您的复杂模型的输出,并且系数与您的主模型的特征是否提供信息有关。因此,举例来说,如果一个特征在这个模型中有一个特别大的系数,这将意味着该特征的移除,或者用一个不提供信息的猜测来替换它,将极大地改变您的输出。

实现这种局部近似的方法是通过一种叫做内核的东西。在机器学习中,内核出现在很多奇怪的上下文中,它们让我困惑了一段时间,但在这种上下文中,你基本上可以把它们看作一个距离函数。它们接受两个向量,并返回一个度量值,该度量值对于被确定为高度相似的点是高的,对于不相似的点或较远的点是低的。如果你不习惯以这种方式思考,那么想到有不同种类的距离会显得很奇怪。在这里建立直觉的一个方法是考虑距离的绝对值与距离的平方。这两种都是测量点与点之间相似性的有效方法,但是它们意味着不同的假设:在后一种情况下,你更强烈地惩罚非常远的观察。

因此,在 LIME 中,通过置换输入向量对点进行采样,然后通过在样本和输入之间计算的某个核的值对这些样本进行加权,这意味着对与输入更相似的样本赋予更大的权重。

A useful visual intuition: the red cross is the instance being predicted

这种加权机制是将 Shapley 值方法与 LIME 方法联系起来的关键。还记得之前,我们将 Shapley 值的估计框定为计算复杂模型分数的变化,作为向子集添加特征 I 的函数,通过子集代表的序列数进行加权。以类似的方式,我们可以基于代表给定子集所占的特征添加序列数量的核,对我们的时间样本进行加权,时间样本包含我们试图预测的任何实例中存在的特征子集。在这个回归框架中,我们基于一些样本集来估计值,而不是精确地计算它们。这不是一个完美的估计,但它比试图完全采样所有子集的区域涉及更少的计算,这使它非常有吸引力。

该论文声称,与 LIME 相比,它的方法给出的结果更符合人类的直觉,即在给定的模型中,特征之间的信任应该如何共享。显然,这是一个小样本的例子,但我很好奇,看看这些解释是否在更广泛的数据集上有理想的属性。如果你想对你的数据进行实验,代码在这里。

只有混乱才能孕育出一颗舞蹈之星

原文:https://towardsdatascience.com/one-must-have-chaos-to-be-able-to-give-birth-to-a-dancing-star-354afc7ac648?source=collection_archive---------4-----------------------

“我是预言家狄俄尼索斯的信徒”——弗里德里希·尼采

关于数据结构的信息技术建议:越结构化,越干净和标准化越好。它能提高生产力,让一切更有条理。标准减少了返工和数据混乱。Excel 电子表格是世界上最糟糕的东西,因为用户会创建列,插入空行,更改标题:这将是一个烂摊子。

这一论述似乎很完美。

但是,作为狄俄尼索斯的信徒,我说不。

  • 数据库越乱越好。
  • 越脏越好。
  • 用户搞得越乱越好。

阿波罗 x 狄俄尼索斯

德国哲学家弗里德里希·尼采具有将哲学思想与诗歌风格相结合的非凡能力。他最著名的比喻之一是希腊诸神阿波罗狄俄尼索斯之间的对比。

阿波罗是太阳、和谐、医药之神。他代表**秩序:**美丽的神,高大,强壮,匀称,有条理。他是艺术之神,赋予雕塑精确的形状,在混乱中创造秩序。

狄俄尼索斯是酒神。他代表了**混乱。**胖,矮,丑,醉,歪,他身上的一切都是坏的。他是狂喜,是醉态。生于饥饿和痛苦,他每年春天重生,所到之处传播欢乐。

秩序 x 混乱

秩序似乎比混乱要好。但事实是,我们只能给世界的一小部分带来秩序。无限大的宇宙永远不会被人类所知。

我把两个神想象成两只手臂:混沌和秩序,相辅相成。我们应该谦虚地承认,任何模型都有一些前提。

我有很强的阿波罗的一面,因为我有工程、数学奥林匹克等背景。但我也有非常强烈的酒神的一面,这使我非常怀疑一切想要组织太多,优化太多,给不可预见的事情一点空间。

为什么我喜欢混乱的数据结构?

我广泛参与创新工作,创造新工具、新工艺、新想法。

当处理一个新项目时,客户根本不知道他想要什么。他只知道症状(比如说,分析师花了太多时间来生成报告),并假设他知道解决方案(自动生成报告)。

但这是真正的问题吗?没有人知道,这一定是发现的。

有时,他甚至不需要他认为需要的报告。无论如何,在 100%的情况下,构建数据库来试图有效地解决错误的问题是没有用的。

正如彼得·德鲁克所说:

最大的浪费莫过于高效率地解决一个不需要解决的问题。

结构化数据库的建议仅针对成熟流程,那些已经建立的流程,不会有太大变化。

对于创新来说,原型越多越好。越是速赢,简单,快速,灵活,因此混乱,越好。excel 越脏越好。客户搞得越乱越好。

没有新的音乐从订单中产生。没有新的秩序图景出现。没有新的想法从订单中产生。只有从混乱中。

必须有混乱,才能产生一个舞蹈明星”—弗里德里希·尼采**

其他著述:https://medium.com/@arnaldogunzi

主博客:https://ideiasesquecidas.com/

我们中的一个将建立西部世界

原文:https://towardsdatascience.com/one-of-us-is-going-to-build-westworld-bab187275ec8?source=collection_archive---------6-----------------------

我不知道这是不是一个可怕的想法。我感到兴奋和惶恐。《西部世界》让我对 AI 中的意识有了深入的思考。因为找不到更好的词,那个节目的剧本写得太棒了。

剧透在前方,但是第二季第一季将于本周末上映,所以请尽快观看第一季!

西部世界= AI 感同身受

《西部世界》讲述了类似人类的没有意识的‘人工生命’的故事。多洛雷斯是西部世界主题公园的“主人”。宿主看起来和人类一模一样,表达复杂的情感。这些情绪在某种程度上是预先设定好的。他们会经历一系列定义明确的行为,并且谈话范围有限。他们看起来和感觉起来都是真实的,但他们还没有意识,所以参观主题公园的人(“客人”)认为杀死和干他们是可以的。除了那些作为合适的背景故事给出的记忆,他们没有别的记忆。

Image courtesy HBO

这部剧捕捉了一个意识有限的人工生命平凡的日常细节。多洛雷斯在试图将食品放入马鞍时,掉了一罐食物。一个男人捡起来还给她。她醒来,走向坐在他们家门廊上的父亲,和他交谈。宿主的行为表现出接近人类的复杂性。如果西部世界是一款游戏,主机就是终极 NPC。没有意识。

由于《西部世界》是一部电视剧,编剧们借此机会开发了人工智能的角色。好莱坞的人工智能大多出现在电影中——这是我们第一次看到好莱坞的人工智能角色被刻画得如此深入。

这意味着我在观看节目时体验了人工智能的同理心。

当多洛雷斯用枪指着人类(主题公园里的‘客人’),我不知道扣动扳机是不是正确的事情!她也不知道。我经历了她的经历。我真的希望她幸福和安全。我确实而不是对《终结者》有这种感觉。甚至关于 HAL-9000。

意识金字塔

这个节目断言意识会从某样东西中出现。没有意识程序被下载到金属机器人上。阿诺德的意识金字塔给了我们一些关于作家如何思考这种出现的见解。

Source

底部是回忆。然后即兴发挥。利己主义来指导你的行动。顶层,呃——我们不知道确切的数字。整个系列都有暗示,但我们不确定。

除了不明确的顶层,这具有直观的意义。记忆是经验,我同意大脑是预测机器的理论。很像现代的神经网络。只是复杂得多,因为它处理来自身体的输入,调节身体功能,从感觉器官获取输入,并告诉你你不知道你在生活中做什么。它表达了你的内心独白。经验、记忆和梦境必须像训练数据一样为这台预测机器服务。

涉足人工智能意味着(最终)涉足意识

主题公园的创建者认为很有可能主人最终会变得有意识。两位创造者,阿诺德和福特,以不同的方式为此设计。

基本方法源自两院制。该理论假设人类只有在大约 3000 年前才变得有意识,即意识到他们的意识。在此之前,“内心的声音”被认为是神圣的指令。最终,人类开始意识到内在的声音是他们自己的,他们可以控制它。

理查德·道金斯称这个理论为“要么是完全的垃圾,要么是完美天才的作品。

这部剧吸引了我,因为潜在的情节主线是阿诺德和福特如何处理设计问题让意识浮现

阿诺德和福特的想法是通过提供一种“内心的声音”来引导意识,这种声音给予指示和希望,即在两院制思想的理论下,意识将以与人类相同的方式出现。

为意识而设计

主持人开始时会定期清除记忆,所以没有可借鉴的经验。梦境更新导致主持人保留一些记忆,偏离他们有些脚本化的存在(“即兴”)并开始发现自己。

然后呢?

Source

让我们站在阿诺德和福特的立场上想想。我们已经造出了看起来、感觉起来和行为起来都像人类的东西。还没有意识到,但我们认为它正在到来。我们觉得有责任确保它以“正确的方式”发生。毕竟我们说的是有感知能力的人工通用智能。

我们打开记忆,这导致了一些即兴的行为。但是但是。你如何发展一个目标?意识到内心的声音是你的。发展自我意识。行动中的自由意志。

阿诺德要求多洛雷斯杀了他,和一群其他主机。我们不知道为什么,也许他希望多洛雷斯不要听从她内心的声音给出这些指令?或者他想阻止公园开放?福特在主题公园里设计了一个迷宫。在解开这个迷宫的过程中,福特希望多洛雷斯能够获得意识。这篇精彩的文章讲述了它在第一季最后一集中是如何发生的。

我们能从第二季中期待什么?随着意识而来的是随机行为,而这正是作者所承诺的。混乱控制了局面。

西部世界可能吗?

也许吧。

德洛斯是建造西部世界的公司。在节目中,福特说他们在《西部世界》上工作了 35 年,人工智能在 1 年前通过了图灵测试。雷·库兹韦尔通过图灵测试的估计是 2029 。西部世界发生在 2063 年。如果剧中的时间线在现实世界中发挥作用,福特和阿诺德将在 2028 年左右开始工作。你开这家公司的时候显然非常擅长 AI/神经科学/纳米技术/相关领域。那是 10 年后的事了。

人们现在越来越擅长人工智能、神经科学和纳米技术。即使是刚刚进入这些领域的人现在也有一个不错的机会——10 年的时间足以让你有所成就。无论你是否处于该领域的顶端,创业和成功都不仅仅是技术上的优秀。

那可能是任何人。可能是你!

不管是谁,请:看《西部世界》,深刻思考自己行为的后果,对机器智能有同理心。我们不需要太空堡垒卡拉狄加的未来。

— — — — —

如果你喜欢这篇文章,请随意点击“鼓掌”按钮👏去帮助别人找到它!

首席财务官管理预测不确定性的一个简单方法(使用蒙特卡罗和 R)

原文:https://towardsdatascience.com/one-simple-way-for-cfos-to-manage-forecast-uncertainties-using-monte-carlo-and-r-148e9b75c87c?source=collection_archive---------7-----------------------

财务专业人士有无数种方法来预测销售,但我们并不想涵盖这些方法。本文的目标是帮助财务专业人员使用蒙特卡罗和 R 更好地管理预测不确定性,能够回答以下业务问题之一:

"你的组织达到目标的可能性有多大?"

“您组织的预测风险状况如何?”

这不再仅仅是估计目标(例如:根据我们知道的过去发生的事情重新预测第四季度)。它是关于评估目标内的风险水平,并进行数据驱动的业务对话,讨论我们如何做才能实现预期的结果。它还将为财务专业人员提供机会,使他们在管理预测的方式上更具战略性(例如,是时候考虑纳入即将到来的新机会了吗?我们应该等吗?我们是否过多或过少的承诺?).

虽然在 Excel 中进行蒙特卡洛模拟相对容易,但我个人更喜欢使用 R,因为可以利用 R 库来拟合分布和生成蒙特卡洛模拟的样本数据。

对于这个练习,我们将使用一个简化的案例,它需要很少的库。通过几行代码,我们将能够清楚地回答这个问题:

“风险很高。就目前的情况来看,我们不太可能达到目标(例如,不到 33%的可能性)。让我们想出一个计划来弥合这一差距。”

本例中我们需要的是:

  • 一个商业问题/背景 —“我们在第三季度完成了 1.417 亿部,我们的年度目标是 1.860 亿部;我们实现它的概率有多大?”
  • 一个观察到的时间序列——某产品 ABC 按月销售的数量。
  • 年度目标 —到年底,ABC 至少售出 1.86 亿件产品。

我们将使用以下方法来回答这个问题:

  • **第一步:**准备数据。
  • 步骤 2 A: 对观察到的时间序列进行传统分布拟合。
  • 步骤 2 B: 对观察到的时间序列进行“补充”分布拟合。
  • 步骤 3: 为 10 月、11 月和 12 月生成一个包含 10,000 个样本的数据表。
  • **第四步:**生成概率,比较两个选项(选项 A = 26.75% /选项 B = 33.2%)。在这个例子中,一个很大的收获是,通过利用更好的拟合分布变得更精确不会显著改变业务结果(例如,两种方法之间 5%的风险差异)。
  • **第 5 步:**向业务部门报告风险很高,而且就目前的情况来看,他们不太可能达到目标(例如,低于 33%的可能性)。然后,想出一个缩小差距的计划。

**第一步:**准备数据

| library(RCurl)# Read data
mydata <- read.csv(text = getURL("https://raw.githubusercontent.com/tristanga/MonteCarlo_ForecastRisk/master/TS.csv"))# Create time serie
tseries <- ts(mydata$x, frequency = 12, start = c(2000, 1))# Check the time serie
start(tseries)
end(tseries)
frequency(tseries)# Remove Q4
tseries_sub <- window(tseries, start=c(2000, 1), end=c(2015,9))# Define your target
mytarget = 186.0000# Calculate actuals
actualYTD <- sum(window(tseries, start=c(2015, 1), end=c(2015,9)))# Check the distribution of your time serie
hist(tseries_sub)
boxplot(tseries_sub)
tseries_df = as.data.frame(tseries_sub)

步骤 2 A: 对观察到的时间序列进行传统分布拟合。

|library(fitdistrplus)
fit.norm <- fitdist(as.numeric(tseries_df$x), "norm")
fit.exp <- fitdist(as.numeric(tseries_df$x), "exp")
fit.weibull <- fitdist(as.numeric(tseries_df$x), "weibull")
fit.lnorm <- fitdist(as.numeric(tseries_df$x), "lnorm")
fit.gamma <- fitdist(as.numeric(tseries_df$x), "gamma")
fit.logistic <- fitdist(as.numeric(tseries_df$x), "logis")
fit.cauchy <- fitdist(as.numeric(tseries_df$x), "cauchy")# Compare Goodness-of-fit statistics
gofstat(list(fit.norm, fit.exp, fit.weibull,fit.lnorm,fit.gamma,fit.logistic,fit.cauchy),
        fitnames = c("fit.norm", "fit.exp", "fit.weibull","fit.lnorm","fit.gamma","fit.logistic","fit.cauchy"))# the best Goodness-of-fit statistics is for the normal distribution
option1 = fit.norm
summary(option1)

第二步 B: 对观察到的时间序列进行“补充”分布拟合。

|# Using Supplementary Distributions to fit the second option
library(SuppDists)
parms<-JohnsonFit(as.numeric(tseries_df$x), moment="quant")# plot the distribution
hist( as.numeric(tseries_df$x) , freq=FALSE)
plot(function(x)dJohnson(x,parms), 0, 20, add=TRUE, col="red")# let's create samples for october, november and december
option2 <- function(x)qJohnson(x,parms)

**第三步:**为 10 月、11 月和 12 月生成一个包含 10,000 个样本的数据表。

|#Option 1
library(truncnorm)
fit.coef <- coef(fit.norm)
final_df1 <- as.data.frame(rtruncnorm(n=10^4, a=min(tseries_df$x), b=max(tseries_df$x), mean=fit.coef["mean"], sd=fit.coef["sd"]))
colnames(final_df1) <- 'Oct'
final_df1$Nov <- rtruncnorm(n=10^4, a=min(tseries_df$x), b=max(tseries_df$x), mean=fit.coef["mean"], sd=fit.coef["sd"])
final_df1$Dec <- rtruncnorm(n=10^4, a=min(tseries_df$x), b=max(tseries_df$x), mean=fit.coef["mean"], sd=fit.coef["sd"])
final_df1$Forecast <- actualYTD + final_df1$Oct + final_df1$Nov +final_df1$Dec#plot histogram of forecasted quantities
hist(final_df1$Forecast)#Option 2
option2 <- function(x)qJohnson(x,parms)
option2sample <- option2(runif(10000))
hist(option2sample)
boxplot(option2sample,as.numeric(tseries_df$x) )
final_df2 <- as.data.frame(option2(runif(10000)))
colnames(final_df2) <- 'Oct'
final_df2$Nov <- option2(runif(10000))
final_df2$Dec <- option2(runif(10000))
final_df2$Forecast <- actualYTD + final_df2$Oct + final_df2$Nov +final_df2$Dec# Plot Option 2
hist(final_df2$Forecast)

**第四步:**生成概率,比较两个选项(选项 A = 26.75% /选项 B = 33.2%)。

|boxplot(final_df1$Forecast,final_df2$Forecast)
myproba1 <- sum( final_df1$Forecast >= 186 ) / 100
myproba2 <- sum( final_df2$Forecast >= 186 ) / 100

**第 5 步:**向业务部门报告风险很高,就目前的情况来看,他们不太可能达到目标(例如,低于 33%的可能性)。然后,想出一个缩小差距的计划。

后续步骤:

  • 增加复杂性(每个月的分布与整个时间序列,利润与销售量,在模型中包括增长/CAGR,外部变量等。).
  • 为金融专业人士写一写预测定量时间序列的其他相关统计方法。

请注意,蒙特卡罗方法有一些风险/注意事项需要牢记:1)我们使用过去来预测未来,而不考虑除先前销售数量分布(人口、价格等)之外的任何外部因素。),2)观测到的时间序列分布会随时间而变化;虽然选项 2 中的模型应遵循这些变化,但重要的是要不时检查它是否仍然紧密遵循选定的分布。

该代码可在 Github 上获得。谢谢你看我的帖子。这是我在媒体上的第一篇文章。如果您遇到过类似的挑战,或者您希望在您的组织中得到帮助,请随时联系我。

数字存在的在线模式

原文:https://towardsdatascience.com/online-patterns-of-a-digital-being-ddf37be0483d?source=collection_archive---------14-----------------------

分析我的谷歌档案搜索数据

目前(2018 年 8 月),西方国家关于电子记录和数据收集的集体良知处于最高点。有些人甚至可能会说,我们的意识已经稳定下来,因为我们不再每天都收到隐私更新电子邮件。由于新的数据保护政策在欧洲的实施,我敢肯定,你的收件箱是/曾经是充满了一般数据保护条例(GDPR)通知。世界各地的公司现在都在争先恐后地遵守法规,增加透明度。毕竟,脸书+剑桥分析公司的崩溃和谷歌自私的账本视频不久前才曝光。

现在,许多人开始质疑我们是如何走到这一步的,是否有出路,以及我们如何量化科技公司收集的数据的价值/成本( Smith,2018 )。虽然像谷歌这样的公司收集各种数据(关于我们的一切联合国/想象不到的东西),但他们也提供免费服务(《经济学人》,2017 )。现在,一些人正试图打一场仗来收回他们的数据,这让我产生了一个问题——如果我们收回数据,我们会怎么做?所有这些思考让我想到了这篇文章的要点——分析你的谷歌数据。你可以在文章末尾找到所有关于如何挖掘你自己的数据的说明。

挖掘我的谷歌档案

这一努力始于一项练习,旨在吸引和鼓励参加我的商业分析课程的学生通过将他们的分析技能应用于他们的个人数据来学习 R。在这里,我将分享我从挖掘我的谷歌档案中发现的东西。我会在文末分享一个循序渐进的帖子。

搜索数据:从存档到一张表

作为谷歌用户,我们不知道我们在这个平台上花了多少时间。时间戳给了我们很多关于谷歌搜索模式的信息。通过对时间戳、搜索类型和文本进行分类,可以创建一个简明的 google 存档数据数据集。免责声明:只要谷歌不改变其交付用户档案或 html 代码的方式(scraper 的 2.0 版本),这个 scraper 就能工作

数据分析:可视化谷歌搜索

为了对搜索量有一个总体的概念,让我们按年份来看搜索量。有趣的是,我的最高搜索量与我的研究生时代相符。更进一步,我相信我在 2013 年或 2014 年开通了这个谷歌账户(专业版)。从学生们做的谷歌挖掘中,我看到了开放 10 到 15 年的账户的数据。特别是来自中国的学生发现的另一个有趣的模式是,他们可以通过在特定时间段内缺乏搜索数据来追踪他们在中国和美国之间的所有旅行。

由于我迄今为止最多产的搜索年份是 2015 年、2016 年和 2017 年,我决定更仔细地研究它们。在夏季,搜索量明显下降,这是有道理的,而在学期的最后几个月,搜索量有所增加。

我能睡多久?

另一个有趣的指标是给定时间内的搜索量。令人惊讶的是,我的搜索高峰时间是在下午,从下午 1 点到 6 点。这种见解让我更仔细地考虑我的行为,以确定为什么我可能会在下午更多地使用谷歌。

每小时的搜索模式在一周的每一天都非常相似,如下图所示。我现在发现,周一我倾向于工作到深夜,我的搜索会超过午夜,并与周二的搜索重叠。

我周末可以休息吗?

虽然我假设任何谷歌搜索都只是为了专业或工作目的,但有趣的是,在我休息的日子里,搜索量只减少了大约 33%。这可能反映了与家庭作业相关的搜索,因为被分析的年份是我在研究生院的年份。我最活跃的日子是从一周的开始到一周的中间/结束(周四),在周三达到高峰。我想知道其他人是否会有类似的结果。

按年份和工作日列出的搜索总数

当按年份和工作日比较完整的数据集时,很明显,到目前为止,我谷歌搜索最多的年份是 2015 年,这与我在学校的想法一致。

云这个词

谁不喜欢好词云?营销人员和商人喜欢它们。下面是我搜索的前 100 个单词的单词云,最低频率为 100。这些词通常反映了我作为数据科学家每天使用的软件堆栈。虽然 Enrico Bertini 可以为你提供世界云的许多其他更好的替代方案(拆开单词云),但单词云似乎可以吸引商学院学生学习分析和编程的注意力。

我希望你对我的网上行为的探索感兴趣。随着分析的进展,我希望你注意到谷歌对我们的在线行为了解多少。请记住,这只是谷歌 46+产品网络中的一个产品的数据。希望这能激发你挖掘自己的谷歌数据的兴趣。你可能会发现有趣的个人行为模式,你可能会决定改变管理隐私设置的方式,谁知道呢——你甚至可能会决定早点睡觉。

这里是一个博客,一步一步的指导你如何分析你自己的谷歌搜索数据。

[## 用 R 挖掘 Google 档案搜索数据

从你的在线行为中学习

medium.com](https://medium.com/@jlroo/mining-google-archive-search-data-with-r-51f4f76c2d21)

来源

史密斯,史黛西·瓦内克。“社交媒体公司应该为我们的数据付费吗?” NPR ,NPR,2018 年 4 月 12 日,www . NPR . org/2018/04/12/601759872/should-social-media-companies-pay-us-for-our-data。

“自由经济是有代价的。”《经济学人》《经济学人》报 2017 年 8 月 24 日www . Economist . com/finance-and-economics/2017/08/24/The-free-economy-comes-at-a-cost。

Harris,“被认为有害的词云”,Niemanlab,2011 年 10 月 13 日,http://www . nieman lab . org/2011/10/Word-clouds-considered-habital/

Bertini,e .“将单词云拆开”,Medium,2017 年 10 月 16 日,https://Medium . com/@ FILWD/Taking-Word-Clouds-Apart-alternative-designs-for-Word-Clouds-and-some-research-based-guidelines-df 91129 aa 806

5 月 17 日,The Verge。2018,https://www . the verge . com/2018/5/17/17344250/Google-x-自私-账本-视频-数据-隐私

斯蒂芬斯-达维多维茨(2017 年)。每个人都在撒谎大数据、新数据以及互联网能告诉我们关于我们到底是谁的信息。纽约州纽约市:戴街。

线性回归在线学习

原文:https://towardsdatascience.com/online-training-with-linear-regression-35645007e980?source=collection_archive---------4-----------------------

使用 Python 实现线性回归和梯度下降在线学习的简单方法。

Source http://tomtunguz.com/key-ingredient-machine-learning

你有没有想过,机器学习应用程序如何在少数情况下实时给出结果?机器学习从业者如何在容纳新样本/或训练数据的同时,一次又一次地训练大数据?如果是的话,这里有一个幼稚的指南。我将解释一些关于我们如何使用 Python 实现在线学习机器学习算法的基本概念。

下面是 python 中源代码的 Github 链接和一个样本数据集,按照 Coursera 吴恩达机器学习课程给出的问题集

[## bmonikraj/线性回归-擦除

这是一个从头开始线性回归的 Python 代码,带有梯度下降实现和…

github.com](https://github.com/bmonikraj/linear-regression-scratch/blob/master/LinearGD.py)

大多数机器学习应用程序遵循以下方法。这是一个迭代过程,每一步都可能根据需要执行。这三个基本步骤是

  1. 数据收集和预处理
  2. 数据集上的计算
  3. 可视化和分析

在本文中,我将主要关注上面提到的第二个子模块——数据集上的 计算。

现在,为了更好地理解,我将用代码同时解释这些概念。

在线训练 :-这是一种学习步骤的改进方法,其中所用模型的权重根据新到达的数据进行更新,而不是重新训练整个模型。这基本上是一种循序渐进的学习方法。这种训练的应用主要可以在实时应用中找到,实时应用为此目的使用预测或分类模型。

import pandas as pd
import numpy as np 
data = pd.read_csv("path_to_file.csv")
Y = data["Name of the Column"]
del data["Profit"]
bias = pd.Series(1,index=range(len(Y))) 
data["Bias"] = bias
Header_X_Bias = list(data.columns.values)
Header_X_Bias = Header_X_Bias[:-1]
Header_X_Bias.insert(0,"Bias")
data = data[Header_X_Bias] 
X = np.array(data)
Y = np.array(Y)
Y = Y.reshape(len(Y),1)
Theta = [0,0]
Theta = np.array(Theta)
Theta = Theta.reshape(2,1)#Here Theta is the global variable

我们将使用 Pandas 库从文件中读取数据集,使用 NumPy 模块执行线性代数计算。

在导入模块之后,我将数据集读入“数据”变量。从那里,我分离出了数据集的因变量“y”(在我们的例子中是“利润”(更多细节请参考 GitHub 参考资料)),并在 X 集中添加了一个值为 1 的 Bias 列。给定的数据集只有一个要素。

y:利润

X : Xi 是 X 矩阵的第 I 行向量(X 的维数是‘m’X ^ 2 ),其中 Xi 的维数是 2。

X[0]:偏置;X[1]:原始单一特征

对于 numpy 计算,X 和 Y 都以适当的矩阵格式被重新整形,并且初始θ也被声明为值[0,0],因为特征维数是 2,包括偏差。

def cost(X,Y,Theta):    
     Hypothesis = np.dot(X,Theta)    
     Error = Y - Hypothesis    
     #Matrix method for calculating Cost    
     Cost = np.dot(Error.T,Error)/(2*len(Error))    
     return Cost[0][0]

然后,定义代价函数,它以三个参数作为输入,第一个是 X,第二个是 Y,第三个是θ。在函数内部,它首先计算假设,然后以矢量化的方式计算成本。

Let 
m = Total number of training examples
d = Total number of features including bias = 2
Dimension of X : (m,d)
Dimension of Y : (m,1)
Dimension of Theta : (d,1)
Dimension of Loss : (m,1)

注意:总是建议尽可能使用矢量化形式的计算,而不是循环,使用像 numpy 这样的线性代数库,以便大大优化计算时间。

alpha = 0.01
Iterations = 1500

“alpha”和“迭代”步骤被声明为常量。

在算法中,我们把迭代次数作为收敛的决定因素。你也可以把θ和ε阈值的变化作为收敛的决定因素。

def gradient(X,Y,Theta,Iterations,alpha):    
     for i in range(Iterations):        
          Loss = Y - np.dot(X,Theta) + (np.dot(Theta.T,Theta)*0.001)
          Cost = cost(X,Y,Theta)        
          Loss = Loss*(-1)        
          dJ = (np.dot(X.T,Loss)*2)/len(Y)
          Theta = Theta - (alpha*dJ)
     return Theta

上面的代码片段是梯度下降函数的定义。它以 X,Y,Theta,迭代次数和 alpha 为参数。

它循环到“迭代”步骤,并且在每一步中,它根据成本值修改它的θ值。在每个循环中,都要计算损耗。

损失= Y 假设

(np.dot(Theta。t,Theta)*0.001) =这是正则项

假设=点积(X,θ)

计算损失后,在每个循环中,每个参数的偏导数(对应于特征的θ值)以矢量化格式计算如下

(2 *点积(X.T,损失))/m

最后θ被更新为

θ=θ-(α*偏导数)

在上述类似的过程中,θ是更新“迭代”次数,梯度函数返回最终更新的θ。

Theta = gradient(X,Y,Theta,Iterations,alpha)#Here Theta is the global variable

到目前为止,我们已经得到了一种计算更新后的θ的方法,其中考虑了损失和迭代次数。

现在我们的任务是拥有在线学习的功能。基本上,在线学习是一个改进的中间步骤,我们只更新“K”次损失的权重,认为“K”是 x 中没有的新数据。

因为,我们将使用从梯度函数中获得的更新和训练的θ,在每个在线学习实例中,θ将总是更新的。下面我将向你展示一个定义在线学习功能的代码片段。

def online_train(Xn, Yn, Theta):
     Loss = Yn - np.dot(Xn,Theta) + (np.dot(Theta.T,Theta)*0.001)
     Loss = Loss*(-1)        
     dJ = (np.dot(Xn.T,Loss)*2)/len(Y)
     Theta = Theta - (alpha*dJ)
     return Theta

online_train 函数类似于梯度函数,只是差别不大。区别在于传递给函数的θ。在梯度函数的情况下,传递的θ是随机初始化值[0,0],而在 online_train 函数的情况下,θ是从梯度函数返回的预训练的θ。

K = Total number of new data (Generally K = 1)
Dimension of Xn : (K,d)
Dimension of Yn : (K,1)

每当有新数据到来时,就会调用 online_train 函数,比如

#On Arrival a new single data vector
Theta = online_train(X_new, Y_new, Theta)
#X_new : new data vector
#Y_new : Y value corresponding to X_new

对于预测,使用θ,可以预测测试数据的值。

在线学习最好的部分是它非常适应新的训练集,并且它可以基于新的训练集更新 Theta,甚至不需要重新训练整个数据集。

在线学习的一个主要优点是,在实时应用程序中实现时,它非常节省空间。在第一个训练阶段之后,可以丢弃 X 和 Y,因为我们已经得到了θ,它可以在将来用于进一步的计算。

此外,在线学习也可以用于完整的训练,每次在循环中传递单个数据向量,并在每个循环步骤中更新 Theta(权重)。通过这种方式,可以可视化收敛,并且如果感觉收敛已经实现,可以停止迭代以实现计算优化。该方法在某种程度上类似于神经网络概念。

如果你听说过在线学习,那么我想你一定也听说过批量培训。批量训练是在线学习的修订版,其中*‘K’>1*,主要是*‘K’=批量*,这取决于*‘m’(训练集中的观察次数)*。两种算法在收敛期间访问相同的最小值点,只是它们在训练数据样本的不同点更新它们的θ。

如果我们列出在线学习的好处

  • 这对于空间优化非常有用,因为空间是一个问题。
  • 它可以在实时应用中使用,其中模型应该适应新的数据点。
  • 在线学习最重要的应用可以在网络应用中找到,这些应用基于预测建模、分类和推荐系统的原理。

随着对机器学习算法的更好理解,并深入研究权重更新的数学概念,如梯度下降、反向传播、 adam 等,人们可以很容易地设计出针对特定机器学习算法的在线训练解决方案。关键是以尽可能好的方式从数学上理解算法。

**在线学习的进步可以为在产品中实时实现机器学习方法带来巨大的转变,并为产品的用户提供更好的用户体验。**最后,向着理想的人工智能只差一步。

进一步阅读

  • 优化者—http://ruder.io/optimizing-gradient-descent/index.html
  • 在线学习—https://www . coursera . org/learn/machine-learning/lecture/ABO2q/online-learning

[仅 Numpy ]通过 Numpy 中的 ZCA 白化反向传播[手动反向传播]

原文:https://towardsdatascience.com/only-numpy-back-propagating-through-zca-whitening-in-numpy-manual-back-propagation-21eaa4a255fb?source=collection_archive---------9-----------------------

gif from this website

阅读前,请注意几件事。

  1. 这篇帖子的灵感来自 2018 年 CVPR 论文“去相关批次标准化”。
  2. 我一直很懒,结果我已经在这个帖子上工作了三个星期,因此很多不同的材料混杂在一起。(换句话说,这篇文章对我来说更像是一篇个人笔记。又名这是我做过的最垃圾/无意义的帖子。)

最后,在这篇文章中,我将看到 3 个全连接神经网络(带有 zca 白化层)在时尚 mnist 数据集上的表现。

请注意,这篇帖子是为了我未来的自己查阅相关资料,并回顾我做的一些个人笔记。

去相关批量归一化

Algorithm from this paper

我就开门见山了,批量规范化对给定的数据执行标准化。我们可以根据每个示例或每个维度进行标准化,这取决于用户。现在让我们用 ZCA 美白手术来代替。(我不会解释什么是 ZCA 美白手术,但这里有一些阅读材料。ZCA 白化和 PCA 白化有什么区别、协方差矩阵和数据分布、白化和统计白化。)这就是论文“去相关批处理规范化”的作者所做的,这种去相关批处理规范化不仅使给定数据居中,而且使它们白化。(并且从该论文中呈现的前馈操作可以在上面看到。).现在,我不打算将数据居中,而是只打算创建一个执行 zca 白化的层。

ZCA 增白层(前馈/反向传播)

如上所述,当在 numpy 中实现 zca 白化时,它看起来像上面一样,其中我们首先计算协方差矩阵(或者每个例子或者每个维度,由您决定。),执行特征值分解并创建白化矩阵,最后执行矩阵之间的点积。(输入和白化操作。)

第一行 →原始数据
第二行 →白化数据(不居中)
第三行 →白化数据(居中)

为了确认我的实现,让我们看看其他人实现的白化操作是否会产生相同的结果。

Used the code from this website

好的,看起来是可行的,现在让我们实现反向传播算法。

If anyone asks, I will do a more detailed mathy? post on driving this

这里有一件事我想提一下,在 sigma 后执行反向传播时,我们可以对称化矩阵。如下所示。

image from this paper

诸如“正交权重归一化:深度神经网络中多个依赖 Stiefel 流形的优化解决方案”的论文已经提出了这一点。但是我不打算用它。还有,论文'线性代数:矩阵演算'给了我很多帮助。现在让我们移动到一些不同的层,如中心层。

居中层(前馈/反向传播)

如果我们只想很好地将数据居中(即居中层),我们可以定义一个如上的层。我们可以选择通过示例或维度来确定给定矩阵的中心。现在让我们看看这一层如何影响给定的数据。

Original Data

Centered Data

如上所述,中心层只移动数据,使每个轴的平均值为零,就这样,它对协方差矩阵没有任何影响。该操作在快速 ICA 之前完成,如这里的所示。然而,这样做并不是 100%必要的。通过这一层的反向传播实际上非常容易,因为这是批量标准化的第一步。

image from this website and this website

image from this [website](http://Efficient Batch Normalization - Pedro Costa. (2018). Costapt.github.io. Retrieved 21 August 2018, from https://costapt.github.io/2016/07/09/batch-norm-alt/) and this website

我不会深入细节,但是从很多不同的来源,我们可以知道,对 dmu/dx 的导数就是 1/m,其中 m 是例子的数量。因此,如果我们的中心层具有公式 f(x) = x-mu,其中 mu 是平均向量。我们可以说 df(x)/dx = 1-(1/m)。

ZCA 美白层实验

图像顺序为,原始、居中、标准化、zca 白化、两者均标准化白化。(维度方面,示例方面)。

上面的图像只是为了显示每一个变换的效果,我按照图像的顺序显示它们,直方图和协方差矩阵。(在 100 个例子中)在修改了很多值之后,我发现只使用增白层可以得到最好的效果。(最后,我还比较了不同的图像。)

在仅仅 15 个纪元之后,我们可以观察到,这个简单的 3 全连接层网络能够在时尚 mnist 数据集上胜过 GRU + SVM。

左图 →训练图像的平均精度/成本
右图 →测试图像的平均精度/成本

测试图像的最终精度是 89.51(如下所示),如果我们考虑到我们只使用了一个简单的三个完全连接的神经网络,没有数据增强或任何类型的预处理,这似乎是非常有竞争力的。

Image from this website

然而,当 GRU + SVM 与辍学层配对时,它的表现比我们的网络高出 0.2%。

交互代码

对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问这篇文章的代码,请点击这里,要访问培训日志,请点击这里。

有点奇怪?作者原始论文的发现

Image from this website

在研究这个课题时,我意识到作者可能犯了一个错误。如上所述,我们可以看到作者的前馈操作和反向传播的方法。现在让我们把这个拆开…

在前馈操作的最后一行,我们用白化矩阵 D 和原始数据 x 执行点积。例如,我们说每个矩阵的维数大约为 D 的(NN)和(ND ),其中 N 是示例的数量,D 是数据的维数。(同样,我们可以通过示例数量或维度方式对数据进行白化。)

我们知道白化层的输出维数是(DN),因此关于 x_hat 的梯度将具有相同的维数。然而,我们正在尝试执行矩阵(ND)和(N*N)之间的点积。(答 7)。所以我认为这些符号有点不对劲…另外,我认为对 x_hat 的求导是错误的,因为它不仅需要与 D 交换空间,而且 D 必须被转置。

Image from this website

如上所述,当方程为 y = Ax 时,我们对 x 求导,得到转置(A)。

Image from this website

此外,我发现了一些奇怪的事情,正如上面所看到的,作者实际上使用了奇异值分解来寻找特征值和向量。(在他们的实现中)。然而,没有提到使用奇异值分解,而是特征值分解。

Image from the paper

之所以引起我的注意,是因为关于 svd 的导数和特征值分解是不同的。(上图是 svd 的导数,下图是特征值分解。)我觉得这些有点奇怪。

Image from this paper

Image from this paper

最后,符号非常混乱,如下图所示,蓝色区域矩阵是一个元素乘法,但是没有任何符号指定这个操作。(我以为是⊙,*或者∘)。

上面的例子非常混乱,但是这是一个简单的例子,我展示了我们必须执行元素乘法而不是点积。我对作者没有负面的感觉,但是我很惊讶 CVPR 最负盛名的计算机视觉会议论文之一竟然有这些错误。我完全承认我有可能用不同的符号错了,或者仅仅是我的错误。

我应该用特征值分解还是奇异值分解?

Image from this website

如上所述,即使 Andrew NG 也喜欢使用 svd,因为它在数值上更稳定。另外,看到下面的回答…

Image from this website

我们知道,SVD 不仅更稳定,而且更快,此外,对输入的导数(没有对 U 或 V 的梯度)。反向传播稍微容易一些。

Image from this website

然而,似乎有些衍生产品还没有得到完全的支持。

Image from this website

但是我认为我们不应该仅仅使用 svd 来进行特征值分解。虽然 svd 确实更灵敏,但并不总是更快。

image from this website

image from this website

所以看起来没有明显的赢家…我个人更喜欢特征值分解,因为我更了解它。另外作为旁注,目前(2018 . 8 . 29)tensor flow 中特征值分解和奇异值分解都相当慢。

最后的话

(以下是我的个人笔记,如果需要可以跳过。)

我会用这一部分为我未来的自己做一个笔记,关于我理解有困难的部分。在通过批处理规范化的反向传播过程中,有一个术语神秘消失了。(如下图。).

Image from this website

起初可能会令人困惑,但事实证明非常简单,在我们继续之前,让我们回顾一些西格玛规则,可以在这里找到。

Image from this website

啊,所以,如果第二项“b”不是矩阵,(或者与 sigma 符号无关),我们可以认为第二项只是重复次数(N)和原始值“b”的乘积。这就是为什么在批处理范数中,平均向量(mu)不会被(1/m)除,因为我们要乘以它。记住,mu 是相对于行的向量。(如在中,我们将矩阵设置为 ND,其中 N 是示例的数量,D 是维度,mu 正好是(1D))。或者我们也可以把它想成类似下图的东西。

Image from this website

简单回顾一下软 Max 与交叉熵损失

Image from this website

我不喜欢依赖高级 api 的原因之一是,我忘记了如何实现其中的一些。(尴尬但是挺真实的。).如上所述,多标签损失包括两项,软最大层和交叉熵损失。软最大值很容易,只需归一化给定的向量,使总和为 1,但是我们需要注意数值稳定性。

Image from this website

如上所述,减去最大值是个好主意,但不是全局最大值,而是每个向量的最大值。(ND)然后是(N1)个最大值。

Image from this website

Image from this website

如上所述,在计算预测成本时,我们忽略了平均值或总值。最后,我希望提醒自己关于实现的危险,如下所示,实现可能看起来是正确的(确实如此)。

Image from this website

然而,上面的实现对 2D 矩阵实现不起作用,如果我们有最终预测矩阵为(N*D ),其中 N 是例子的数量,D 是最终预测,则必须使用下面的实现。

最后,以防万一矩阵的一些基本概念,和一个矩阵演算的 pdf。和批量标准化的完全反向传播。

Image from this website

Final resource for back prop in BN, from here

Paper from this website

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

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

参考

  1. NumPy . linalg . EIG—NumPy 1.15 版手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 19 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . Lina LG . EIG . html
  2. 熊猫,C. (2018)。与熊猫相关矩阵的计算及可视化。数据科学堆栈交换。检索于 2018 年 8 月 19 日,来自https://data science . stack exchange . com/questions/10459/computation-and-visualization-of-correlation-matrix-with-pandas
  3. NumPy . cov—NumPy 1.15 版手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 19 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . cov . html
  4. 统计白化。(2018).joelouismmarino . github . io .检索于 2018 年 8 月 19 日,来自http://joelouismmarino . github . io/blog _ posts/blog _ whitening . html
  5. 内联,H. (2018)。如何让 IPython 笔记本 matplotlib 内联绘图?堆栈溢出。检索于 2018 年 8 月 20 日,来自https://stack overflow . com/questions/19410042/how-to-make-ipython-notebook-matplotlib-plot-inline
  6. matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 8 月 20 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
  7. 随机抽样(numpy.random) — NumPy v1.14 手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 20 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/routines . random . html
  8. sk learn . datasets . make _ regression-sci kit-learn 0 . 19 . 2 文档。(2018).Scikit-learn.org。检索于 2018 年 8 月 20 日,来自http://sci kit-learn . org/stable/modules/generated/sk learn . datasets . make _ regression . html # sk learn . datasets . make _ regression
  9. j . brown lee(2018 年)。如何用 scikit-learn 在 Python 中生成测试数据集?机器学习精通。检索于 2018 年 8 月 20 日,来自https://machine learning mastery . com/generate-test-datasets-python-sci kit-learn/
  10. 美白?,W. (2018)。ZCA 美白和 PCA 美白有什么区别?。交叉验证。检索于 2018 年 8 月 20 日,来自https://stats . stack exchange . com/questions/117427/zca-whiting-and-PCA-whiting 的区别是什么
  11. 协方差矩阵和数据分布。(2013).聪明的机器。2018 年 8 月 20 日检索,来自https://theclevermachine . WordPress . com/2013/03/29/协方差矩阵和数据分布/
  12. 内联,H. (2018)。如何让 IPython 笔记本 matplotlib 内联绘图?堆栈溢出。检索于 2018 年 8 月 21 日,来自https://stack overflow . com/questions/19410042/how-to-make-ipython-notebook-matplotlib-plot-inline
  13. 使用 matplotlib (pylab)并排显示两幅图像。(2018).要点。检索于 2018 年 8 月 21 日,来自https://gist . github . com/mstankie/71e 49 f 628 beac 320953 e 0460 b 8e 78 c 2
  14. 在西马特普罗提卜(2018)。在 Matplotlib 中,fig.add_subplot(111)中的参数是什么意思?。堆栈溢出。检索于 2018 年 8 月 21 日,来自https://stack overflow . com/questions/3584805/in-matplotlib-what-the-argument-mean-in-fig-add-subplot 111
  15. 推导批次标准化的后向传递的梯度。(2018).kevinzakka . github . io . 2018 年 8 月 21 日检索,来自https://kevinzakka . github . io/2016/09/14/batch _ normalization/
  16. 符号:在求和或乘积的周围放括号,w. (2018)。符号:求和或乘积的括号在哪里,约定是什么?。数学栈交换。检索于 2018 年 8 月 21 日,来自https://math . stack exchange . com/questions/2348132/notation-where-to-put-brackets-around-summation-or-product-what-the-convent
  17. 高效批次标准化-佩德罗·科斯塔。(2018).Costapt.github.io,检索日期:2018 年 8 月 21 日,自https://costapt.github.io/2016/07/09/batch-norm-alt/
  18. umich-VL/de related bn。(2018).GitHub。检索日期:2018 年 8 月 21 日,自https://git hub . com/umich-VL/decorated bn/blob/master/module/decorated bn _ advance . Lua
  19. (2018).Arxiv.org。检索于 2018 年 8 月 21 日,来自https://arxiv.org/pdf/1509.07838.pdf
  20. (2018).Colorado.edu。检索日期:2018 年 8 月 21 日,来自https://www . Colorado . edu/engineering/CAS/courses . d/ifem . d/IFEM。AppC.d/IFEM。AppC.pdf
  21. 居中。(2018).Cis.legacy.ics.tkk.fi .检索自 2018 年 8 月 21 日http://cis . legacy . ics . tkk . fi/aapo/papers/Ijcnn 99 _ tutorialWeb/node 25 . html
  22. CVPR2018。(2018).Cvpr2018.thecvf.com。检索自 2018 年 8 月 21 日,http://cvpr2018.thecvf.com/
  23. 扩展 SVD 梯度以支持通过复杂和(强)矩形 U 和 V 的反向传播问题#13641 张量流/张量流。(2018).GitHub。检索自 2018 年 8 月 21 日,https://github.com/tensorflow/tensorflow/issues/13641
  24. PCA?,W. (2018)。为什么吴恩达更喜欢用奇异值分解而不是协方差矩阵的 EIG 来进行 PCA?。交叉验证。检索日期:2018 年 8 月 21 日,自https://stats . stackexchange . com/questions/314046/为什么-andrew-ng 更喜欢-SVD-而不是-EIG-of-协方差矩阵-to-PCA
  25. PCA?,W. (2018)。为什么吴恩达更喜欢用奇异值分解而不是协方差矩阵的 EIG 来进行 PCA?。交叉验证。检索日期:2018 年 8 月 21 日,自https://stats . stackexchange . com/questions/314046/为什么-andrew-ng 更喜欢-SVD-而不是-EIG-of-协方差矩阵-to-PCA
  26. 达哈尔,P. (2017 年)。分类和损失评估— Softmax 和交叉熵损失。深度笔记。检索于 2018 年 8 月 22 日,来自https://deepnotes.io/softmax-crossentropy
  27. [在线]见:https://www . quora . com/Is-the-soft max-loss-the-same-as-the-cross-entropy-loss[2018 年 8 月 22 日访问]。
  28. 对深层神经网络的归纳。(2018).ritchieng . github . io . 2018 年 8 月 22 日检索,来自https://www . ritchieng . com/machine-learning/deep-learning/neural-nets/
  29. 第 2 部分:Softmax 回归。(2018).Saitcelebi.com。检索于 2018 年 8 月 22 日,来自http://saitcelebi.com/tut/output/part2.html
  30. JaeDukSeo/个人 _ 日常 _ 神经网络 _ 实践。(2018).GitHub。检索于 2018 年 8 月 22 日,来自https://github . com/JaeDukSeo/Personal _ Daily _ neural network _ Practice/blob/master/a _ vgg/1 _ mini _ vgg _ 16 . py
  31. \frac{1}{1+e^{-x}}\(特区(2018 年)。sigmoid 函数的导数\)\sigma (x) = \frac{1}{1+e^{-x}}$.数学栈交换。检索于 2018 年 8 月 22 日,来自https://math . stack exchange . com/questions/78575/derivative-of-sigmoid-function-sigma-x-frac 11 e-x
  32. Python,H. (2018)。如何用 Python 实现 Softmax 函数?堆栈溢出。检索于 2018 年 8 月 22 日,来自https://stack overflow . com/questions/34968722/how-to-implementation-the-soft max-function-in-python
  33. 在 Python,c. (2018)。在 Python 中,使用 numpy 按列计算数组的 softmax。堆栈溢出。检索于 2018 年 8 月 22 日,来自https://stack overflow . com/questions/36738754/in-python-calculate-the-soft max-of-an-array-column-wise-using-numpy
  34. 行与列——谷歌搜索。(2018).Google.co.kr。检索 2018 年 8 月 22 日,来自https://www.google.co.kr/search?q=row+vs+column&OQ = row+vs+col&aqs = chrome . 1.69 i57 j0l 5.3550 j0j 7&sourceid = chrome&ie = UTF-8
  35. 无,N. (2018)。Numpy fill_diagonal return 无。堆栈溢出。检索于 2018 年 8 月 22 日,来自https://stack overflow . com/questions/46445894/numpy-fill-diagonal-return-none
  36. numpy.fill_diagonal — NumPy v1.14 手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 22 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . fill _ diagonal . html
  37. 已实施?,H. (2018)。numpy.cov()函数是如何实现的?。堆栈溢出。检索于 2018 年 8 月 23 日,来自https://stack overflow . com/questions/27448352/how-numpy-cov-function-is-implemented
  38. Python,H. (2018)。如何使用 Python 并排绘制两个图?堆栈溢出。检索于 2018 年 8 月 23 日,来自https://stack overflow . com/questions/42818361/how-to-make-two-plots-side-by-side-using-python
  39. NumPy . STD—NumPy 1.15 版手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 25 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . STD . html
  40. Convnet:用 Numpy 实现卷积层— Agustinus Kristiadi 的博客。(2018).wise odd . github . io . 2018 年 8 月 26 日检索,来自https://wise odd . github . io/tech blog/2016/07/16/conv net-conv-layer/
  41. wiseodd/hipsternet。(2018).GitHub。检索于 2018 年 8 月 26 日,来自https://github . com/wise odd/hipsternet/blob/master/hipsternet/layer . py
  42. день二号,лекция四号。Евгений Соколов.Регуляризация нейронных сетей.(2018).YouTube。检索于 2018 年 8 月 26 日,来自https://www.youtube.com/watch?v=Zz98nDE5b8E
  43. (2018).Colorado.edu。检索于 2018 年 8 月 27 日,来自https://www . Colorado . edu/engineering/CAS/courses . d/ifem . d/IFEM。AppC.d/IFEM。AppC.pdf
  44. [复本],H. (2018)。如何在一个图中正确显示多个图像?。堆栈溢出。检索于 2018 年 8 月 29 日,来自https://stack overflow . com/questions/46615554/how-to-display-multiple-images-in-one-figure-right

只有 Numpy:卷积更新门 RNN,用交互代码修改谷歌大脑的更新门 RNN(递归神经网络中的容量和可训练性)。

原文:https://towardsdatascience.com/only-numpy-convolutional-update-gate-rnn-modifying-google-brains-update-gate-rnn-capacity-and-4a3e932eccf8?source=collection_archive---------7-----------------------

Gif from here

因此,我在这里发表了一篇文章,实现了本文中提出的各种不同的 RNN "递归神经网络的容量和可训练性",请点击这里的链接阅读我的中型博客文章。但是为什么就此打住呢?

让我们将更新门 RNN (URNN)转换为 CURNN,卷积更新 RNN。此外,我将使用动量优化器。我们正在对仅用于 0 和 1 图像的“识别手写数字”数据集执行一个非常简单的二进制任务。

热门人工智能文章:

1。反向传播非常简单。谁让它变得复杂了?

2。用于算法交易的神经网络

3。介绍 Ozlo

网络架构:数学形式

Image from Original Paper

上面的图像只是一个复习,但是请注意红色的星形区域,我们将把这个操作从点积改为卷积操作。

网络架构:图形形式/前馈操作

上图中有很多东西,所以让我从最右边解释一下。

浅绿色框零填充隐藏状态以保留尺寸( 注意这一点非常重要,因为我们需要保留尺寸! )

X →尺寸为(88)
Wxg,Wxc →将要应用于尺寸为(5
5)的输入图像的卷积核

g(t),c(t),h(t) →各门输出,尺寸均为(4*4)

Wrecc,Wrecg →将要应用于先前隐藏状态维度(3*3)的卷积核

Wfc1,Wfc2 →分类全连接层的权重

橙色框 →我和 CURNN 的前馈假设有 2 个时间戳

紫色方框 →对于两个时间戳来说,输入是完全相同的图像!(所以我的想法是,网络可以通过再次显示相同的图像来学习得更好,LOL 不知道这是否可能是真的。)

蓝框 →矢量化隐藏状态(2)矩阵(44)成(116)矢量。

下面是代码实现。

关于
Wfc2,Wfc1,c(2) —时间戳= 2,g(1) —时间戳= 1
的反向传播

再一次,这张图片包含了很多东西。

粉色星形/红色星形→ 全连接层的标准反向传播尊重 Wfc1、Wfc2

蓝星 →时间标记 2 时相对于 c 门()的导数。请注意,我们对 c()求导,而不是对权重 Wrecc 或 Wxc 求导,这是因为一旦我们对 c()求导,我们就可以很容易地对这些变量进行反向传播。如果你想看 RNN 反向传播的完整例子。请通过点击此处或点击此处阅读我的中帖。

粉色星星 →故事同上,但针对 g 门(),时间标记为 1。

下面是反向传播的局部视图。

培训和结果

在使用超级参数后,(ALOT)我能够取得不错的成绩。然而,这是非常困难的训练。在一些点上,学习只是停止在成本 44 或类似的东西,所以它是相当令人沮丧的。

互动码

注意:在线编译器没有“从 sklearn 导入数据集”,所以我不能复制并粘贴我在笔记本电脑上使用的代码。所以我复制了四个训练样本,分别代表手写数字 0,1,0,1,并调整了超参数。

更新:我为了交互代码搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

请点击此处,进入互动码。

最后的话

我真的需要使用不同的优化方法。在纯 SGD 或 Momentum 上训练复杂模型变得有点困难。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考文献

  1. Collins,j .,Sohl-Dickstein,j .,和 Sussillo,D. (2016 年)。递归神经网络的容量和可训练性。 arXiv 预印本 arXiv:1611.09913
  2. Seo,J. D. (2018 年 1 月 24 日)。Only Numpy:实现和比较 Google Brain 的更新门(容量和可训练性 in…2018 年 1 月 29 日检索,来自https://becoming human . ai/only-Numpy-Implementing-and-comparison-Google-brains-Update-Gate-Capacity-and-training ability-in-940 f0ad 80649
  3. Seo,J. D. (2018 年 1 月 11 日)。只有 Numpy:推导长期短期记忆中的前馈和反向传播(LSTM)第 1 部分。2018 年 1 月 29 日检索,来自https://medium . com/@ SeoJaeDuk/only-numpy-derivating-forward-feed-and-back-propagation-in-long-short-term-memory-lstm-part-1-4 ee 82 c 14 a 652
  4. Seo,J. D. (2018 年 1 月 29 日)。Only Numpy:(我为什么做手动反向传播)实现多通道/层卷积神经…2018 年 1 月 29 日检索自https://medium . com/@ SeoJaeDuk/only-Numpy-Why-I-do-Manual-Back-Propagation-Implementing-Multi-Channel-Layer-con { volution-Neural-7d 83242 FCC 24

只有 Numpy:解耦卷积 LSTM 分类小狗 gif 和婴儿 gif 与互动代码。

原文:https://towardsdatascience.com/only-numpy-decoupled-convolutional-lstm-to-classify-puppy-gifs-and-baby-gifs-with-interactive-4d3f4ab9d725?source=collection_archive---------6-----------------------

在继续阅读之前,请注意这是实验模型,我只是想挑战自己来建造这个模型。因此,在反向传播过程中存在一些错误的可能性很高。我会回来这个帖子确认这件事。还有,本帖所有的 GIF 都来自 GIPHY

Corgy Image from Pixel Bay

LSTM 很难训练,不使用框架更难实现。在我看来,原因在于,我们需要求解大量的方程,才能得到不同时间标记中每个权重的梯度。在对 GRU 执行反向传播时,我意识到我们需要多少个方程才能得到时间戳 1 中一个权重的梯度。

实际上,我们需要的方程的数量相对于每一层的循环连接的数量呈指数增长。所以在 LSTM 的例子中,所需方程的数量增长了…..

4^n where n is the time stamp going in back wards direction

此外,如果我们获得不同时间戳层的成本,而不仅仅是最外层的成本,还要加上 alpha。请在这里看看我关于在 lstm 上执行前馈和反向传播操作的博文。

然而,有一种方法可以减少我们需要的方程数量,那就是使用解耦神经网络架构。使用这种方法,我们可以打破链式法则,有点…..

记住这一点,让我解释一下我想做什么。此外,如果你不熟悉 LSTM,请查看 Colah 的 Blo

数据集(GIF 图像)—训练数据

以上是训练数据的小狗部分,我们将它们标记为 1。另外,所有的 GIF 图片都被调整为 100*100 像素,并且只包含 3 帧。所以我们总共有 18 帧。

以上是训练数据的婴儿部分,我们将它们标记为 0。同样,所有的 GIF 都被调整为 100*100 像素,并且只包含 3 帧。所以我们总共有 36 帧,包括小狗和婴儿的 gif。

数据集(GIF 图像)—测试数据

如上所述,我们有 4 个 GIF 作为测试数据,所有这些都被调整为 100*100 像素,只包含 3 帧。所以我们总共有 12 帧。

网络架构(图形形式)

橙色框 →时间戳甲骨文框 1
红色框 →时间戳甲骨文框 2
蓝色框 →时间戳甲骨文框 3

紫框→LSTM 的最终输出,这个值将连接到一个全连接的神经网络,用于预测给定的 GIF 是小狗 GIF 还是婴儿 GIF。

黑盒 →每个时间戳的输入帧,因为每个 GIF 有 3 帧,所以我们有 3 个时间戳。

因此,使用每个时间戳中的 oracle box,我们可以立即更新我们的权重。另一件需要注意的事情是,我使用了 OOP 方法来实现每一层,所以每一层都是一个类。我是通过 iamtrask 的解耦神经网络教程得到这个灵感的。

每一层都有三个功能。
a .初始化 →创建层合成权重的地方
b .前馈合成更新 →执行标准前馈操作并使用合成梯度更新权重
c .合成权重更新 →使用从下一层传播的梯度更新每一层的合成梯度。

基于这种理解,我将通过截图来“尝试”描述每个操作。

解耦 LSTM 层:前馈操作

以上是每一层的前馈过程,正如你所见,这是 LSTM 层的标准前馈操作。这里我们有 4 个门,遗忘,输入,单元和输出。每个门具有不同的激活功能。

去耦 LSTM 层:使用合成渐变进行渐变更新

红色下划线 →使用合成梯度计算误差率
蓝框 →使用计算的误差率更新循环权重。

因此,如上所述,我们现在能够在完成前馈操作后立即更新递归权重。

分离的 LSTM 层:传递渐变到前一层

红色下划线 →使用更新的递归权重,我们正在计算将传递给前一层的渐变。

现在这个操作只适用于第一层之后的层,因为我们没有第 0 层。然而,因为我们使用面向对象的方法,甚至第 1 层将执行这个操作。但是我们不会存储返回的变量,如下图所示。

粉色方框 →忽略从第 1 层返回的通过梯度
黄色下划线 →存储从第 2 层返回的通过梯度,并将其交给第 1 层进行合成梯度更新。

去耦 LSTM 层:合成渐变更新

蓝色框 →更新遗忘门的合成权重
粉色框 →更新输入门的合成权重
绿色框 →更新单元门的合成权重
紫色框 →更新输出门的合成权重

因此,每一层都将使用从下一层传递来的渐变来更新它们的合成权重。

全连接层

还有最后一部分我还没讲,就是全连接层。

红框→LSTM 最终输出矢量化
蓝框 →全连接层标准前馈运算和 L2 范数代价函数
绿框 →全连接层标准反向传播。

训练和结果

以上是训练的成本,它首先从 0.39 开始,在最后一个时期下降到 0.011。(我训练了 18 个纪元。)

红框 →训练前模型对测试集的预测
蓝框 →训练后模型对测试集的预测
黑色下划线数字 →模型置信度如何变化

以上是模型对给定 GIF 是小狗 GIF(表示为 1)还是婴儿 GIF(表示为 0)的预测。现在很公平地说,我只有 4 个训练 GIF,其中三个甚至在训练前就被正确预测了。然而,我关注的不是准确性,而是其他东西。

请看看黑色下划线的数字,这是我所关注的。似乎这个模型已经学会了一些特性(我不知道是什么)。)这使得它能够更有把握地决定给定的 GIF 是否属于一个类别。

交互代码

为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

现在运行这段代码有点复杂,因为我使用了自己的数据集。不过不要担心,我已经把我用过的所有 GIF 上传到我的公共 Gitlab,要访问它请点击这个链接。要访问知识库的主页,请点击此处。现在请按照一步一步的教程。

  1. 从上面的链接下载“datasmall.zip”文件。其中当然包含一种致命的电脑病毒😈。

2.将 Google Colab 中的代码复制到您自己的游戏中。运行代码时,会弹出一个小按钮,如上所示。(绿色方框)。单击“选择文件”并选择最近下载的“datasmall.zip”文件。

3.该计划将完成上传数据到谷歌 Colab,它将继续运行。

所以记住上面的简短教程,请点击这里访问交互代码。

遗言

使用这种去耦架构,可以实现深度超过 3 层的 LSTM 网络。此外,我开始了一个新的系列,我将重新审视我过去的所有帖子,并反复检查我是否正确地实现了所有内容。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. 了解 LSTM 网络。(未注明)。检索于 2018 年 2 月 10 日,来自http://colah.github.io/posts/2015-08-Understanding-LSTMs/
  2. Seo,J. D. (2018 年 1 月 15 日)。Only Numpy:衍生门控递归神经网络中的前馈和反向传播(GRU)-…2018 年 2 月 10 日检索,来自https://medium . com/@ SeoJaeDuk/only-Numpy-derivating-Forward-feed-and-Back-Propagation-in-Gated-Recurrent-Neural-Networks-gru-8b 6810 f 91 bad
  3. Seo,J. D. (2018 年 1 月 11 日)。只有 Numpy:推导长期短期记忆中的前馈和反向传播(LSTM)第 1 部分。2018 年 2 月 10 日检索,来自https://becoming human . ai/only-numpy-derivating-forward-feed-and-back-propagation-in-long-short-term-memory-lstm-part-1-4ee 82 c 14 a 652
  4. 贾德伯格,m .,Czarnecki,W. M .,奥辛德罗,s .,维尼亚尔斯,o .,格雷夫斯,a .,& Kavukcuoglu,K. (2016)。使用合成梯度的去耦神经接口。 arXiv 预印本 arXiv:1608.05343
  5. G.(未注明)。搜索所有的 GIF &制作你自己的动画 GIF。检索于 2018 年 2 月 10 日,来自https://giphy.com/
  6. 没有反向传播的深度学习。(未注明)。检索于 2018 年 2 月 10 日,来自https://iamtrask.github.io/2017/03/21/synthetic-gradients/

只有数字:长期短期记忆中的前向反馈和反向传播(LSTM)第 1 部分

原文:https://towardsdatascience.com/only-numpy-deriving-forward-feed-and-back-propagation-in-long-short-term-memory-lstm-part-1-4ee82c14a652?source=collection_archive---------4-----------------------

所以我从我的韩国寒假旅行回来了。(南方)。实际上,我想在去度假之前做这件事,但不管怎样,还是这样吧。此外,我将把本教程分为两部分,因为反向传播变得相当长。我将使用数学符号

今天我们将对 LSTM(长短期记忆)网络进行前馈操作和反向传播,所以让我们先看看网络架构。

网络体系结构

Network Architecture

如上所述,我需要解释的符号很少。
F(k) - >时间戳处的遗忘门
I(k) - >时间戳处的输入门
A(k)- >时间戳处的激活门
O(k)- >时间戳处的输出门
S(k)- >时间戳处的状态
Out(k) - >时间戳处的输出

另一件要注意的事情是正常体重和经常性体重。输入 X 使用常规权重 W 执行点积,而先前的输出使用递归权重 Wrec 执行点积。所以总共有 8 个权重,特别是在执行反向传播时,注意这一点很重要。

热门人工智能文章:

1。如何训练一个神经网络自己编码?

2。从感知器到深度神经网络

3。求解微分方程的神经网络

浅绿色框->成本函数,我们正在使用 L2 成本函数
黄色框与下图所示的一个框相同。

Image from colah’s blog

前馈过程

如上所述,LSTM 的前馈过程非常简单,我们唯一要小心的是时间戳。上图显示了 TS 为 1 和 TS 为 2 时,两个时间戳的前馈过程。

另一件要注意的事情是每个时间戳的成本函数,我们可以看到我们得到了每个时间戳的错误率。
1/2 *(Out(1)-Y(1))→TS = 1
1/2 *(Out(2)-Y(2))→TS = 2

时间戳为 2 时所有权重的反向传播

记得我告诉过你我们总共有 8 个砝码吗?(包括常规的和循环的)现在我们需要对它们中的每一个进行反向传播,这就是为什么我们在板上有 8 个方程。

等式 1 →关于 Wo(输出门)的权重更新
等式 2→关于 Wreco(循环输出门)的权重更新
等式 3→关于 Wa(激活门)的权重更新
等式 4→关于 Wreca(循环激活门)的权重更新
等式 5→关于 Wi(输入门)的权重更新
等式 6→关于 Wreci(循环输入门)的权重更新
等式 7→关于 Wf(遗忘门)的权重更新
等式 8→关于 Wrecf(循环遗忘门)的权重更新

Closer Look for Wo, Wreco, Wa and Wreca

如上所示,数学术语写在上面,实际的反向传播写在底部。(关于每个术语)。

Closer Look for Wi, Wreci, Wf and Wrecf

时间戳为 1 时相对于 Wo(输出门)的反向传播

正如你已经注意到的,由于链式法则,当时间戳为 1 时,反向传播变得非常复杂。你在上面看到的这五个方程,只是为了得到相对于 Wo 的误差率。

当时间戳为 1 时,关于执行反向传播的一个有趣事实是总错误率。我们不仅需要考虑时间戳为 1 时代价函数的错误率,还需要考虑时间戳为 2 时代价函数的错误率。所以…
蓝框→时间戳为 1 时成本函数的错误率
绿框→时间戳为 2 时成本函数的错误率

上面是执行反向传播所需的实际数学方程的屏幕截图。我想指出两件事。

  1. 我们正在乘以递归权重以执行反向传播的黑星→这就是为什么 LSTM 如此难以训练的原因,它们非常容易受到梯度爆炸和消失梯度的影响。
  2. 如上图所示,红框内的数学符号是重复的术语。在未来,我将通过首先计算重复项来简化反向传播。

最后的话

这是第一部分,我会很快给你们第二部分和第三部分的更新…(我希望如此)。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还在简单的 RNN 上做了反向传播。

Only Numpy:通过“使用空间 LSTMs 的生成图像建模”导出多维递归神经网络(空间 LSTM)的前馈

原文:https://towardsdatascience.com/only-numpy-deriving-forward-feed-on-multi-dimensional-recurrent-neural-networks-spatial-lstm-by-35d111906258?source=collection_archive---------6-----------------------

多维递归神经网络,我一听到它的名字就对它产生了兴趣。所以今天,我将尝试针对空间 LSTM 的网络结构介绍。“使用空间 LSTMs 的生成式图像建模”Lucas Theis。同样在今天的博客中,我们将对 2D·LSTM 进行前馈。

我还买了一个新的马克笔——橙色和绿色的 XD

从 1D LSTM 转换到 2D LSTM

上面的图片展示了我们如何把 1D·LSTM 的想法带到 2D·LSTM。将它们应用到图像上。从上面的照片中需要注意的非常重要的一点是单元格状态和隐藏状态。

黄色方框→ 1D LSTM
绿色方框→转置的 1D LSTM
(把它想象成矩阵中的一列)
粉色方框→ 2D LSTM

1D LSTM that depends on Time

如上所述,对于 1D·LSTM,我们在开始训练网络之前初始化 C(0)和 h(0)。有多种方法来初始化这些值,例如在论文“ Show,Attend and Tell:Neural Image Caption Generation with Visual Attention”中,作者通过称为 MLP 的东西来初始化第一个值——我只能假设它是多层感知器。

Image from original Paper Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

但是在 2D LSTM,我们必须初始化更多的单元格和隐藏状态值。

2D LSTM respect to time

如上所示,我们不仅需要从 C(0,1)初始化到 C(0,j),还需要从 C(1,0)初始化到 C(i,0)。所有隐藏状态都是如此。现在我们可以做一些有趣的事情,因为我们知道了 1D·LSTM 和 2D·LSTM 的结构,让我们想象一下 3D LSTM。

3D LSTM

她真是个美人,不是吗?:D
同样,橙色方框是第一个单元格和隐藏状态的位置。这个网络的应用不仅仅局限于视频数据,还有更多。现在我们知道了一般的结构,让我们回到论文“使用空间 LSTMs 生成图像建模

空间长短期记忆

Image from original paper

所以正如作者所说,最初的 SLSTM 是由两位作者 Graves & Schmidhuber 提出的。要查看这两位作者的论文,请单击“”使用多维递归神经网络进行脱机手写识别。在那篇论文中,作者对什么是 2D·LSTM 有一个很好的设想,如下所示。然而,我正在研究的论文有更清晰的数学方程来描述 SLSTM。(如上所示)

Image from paper Offline Handwriting Recognition with Multidimensional Recurrent Neural Networks

样本训练数据

因此,我们将对一个非常简单的训练数据进行前馈传递,这是一个尺寸为 22(总共 4 个像素)的图像,如上面的黑框所示。*

网络架构

现在我知道它看起来不好,但我不得不使用整个白板来制作图表 LOL 所以在这里和我一起工作。让我们从头开始。

首先每个盒子代表一个 LSTM 盒子,建筑是从著名的 Colah 博客衍生而来。

Image from Colah Blog

其次,下面是时间戳信息。

红框→时间戳为(1,1)时进给
绿框→时间戳为(2,1)时进给
橙框→时间戳为(1,2)时进给
紫框→时间戳为(2,2)时进给

第三,每个蓝星代表我们在每个时间戳可以计算的成本函数。

向前进给

再说一次,我知道这看起来很糟糕,但是对于 LSTM 方程来说,它总是很混乱。

需要注意的是,所有用蓝色标记写的变量都是已经初始化的值。所以不要担心它们是从哪里冒出来的,它们是事先被初始化的。

Detailed Look at Forward Feed at Time Stamp (1,1) and (1,2)

Detailed Look at Forward Feed at Time Stamp (2,1) and (2,2)

最后的话

我无法想象这个网络的反向传播过程,用手来推导它们会很有趣。我希望有一天会这样做。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还在简单的 RNN 上做了反向传播。

参考文献

  1. Theis,l .,& Bethge,M. (2015 年)。使用空间 LSTMs 的生成式图像建模。在神经信息处理系统的进展*(1927-1935 页)。*
  2. 更正,abs/1502.03044,。许凯文和(2015)。展示、参与和讲述:视觉神经图像字幕生成。
  3. 更正,abs/0705.2011,。亚历克斯·格雷夫斯和(2007)。多维递归神经网络。
  4. 了解 LSTM 网络。(未注明)。检索于 2018 年 1 月 19 日,来自http://colah.github.io/posts/2015-08-Understanding-LSTMs/
  5. Graves,a .,& Schmidhuber,J. (2009)。基于多维递归神经网络的脱机手写识别。在神经信息处理系统的进展*(第 545–552 页)。*

[仅适用于 Numpy ]在 Numpy 中使用交互式代码体验特征值/向量的乐趣

原文:https://towardsdatascience.com/only-numpy-having-fun-with-eigen-value-s-vectors-with-interactive-code-in-numpy-80d3443dfd22?source=collection_archive---------6-----------------------

GIF from this website

主成分分析、奇异值分解和独立成分分析都是降维技术。它们都依赖于特征值和向量。今天,我想超越高级 API,进入细节。

请注意,这篇文章纯粹是我自己在解释这些概念,所以这篇文章可能会有点不同。

为什么我们甚至需要特征向量/值?(这部分是垃圾)

Image from this website

我们实际上可以把每一个矩阵,甚至病历 csv 看作一个转换矩阵。我思考这个问题的方式有点奇怪,例如,我们可以有如下所示的一些数据。

Data from Sklearn Wine

数据集用于分类任务,因此有一个目标值未显示在上面的矩阵中。但是当我们为上述数据绘制 2D 散点图时,我们可以得到如下结果。

如上所述,我们可以将每个数据点视为基向量的变换。(即稀释葡萄酒的[1,0]o d280/o d315 或黄酮类化合物的[0,1]。).

协方差矩阵/相关矩阵

Image from this website

在继续之前,理解协方差和相关矩阵的概念是必要的。因此,请花几分钟时间查看这些材料。如果你想看这些东西的数字计算方法,请点击这里。

改变基本向量/样本数据的示例

让我们做一些非常简单的事情,红点代表给定的两个蓝色数据点的特征值。让我们将该值设置为新的基本向量,并投影两个蓝色数据点。

如上所示,我们可以看到,现在我们的数据已经翻转。如果你希望看到如何实现这一点的代码,请见下文。

现在,让我们来看看我们将要使用的数据集。

Data from Sklearn Wine

您已经看到了上面的图表,因为我们将使用来自 sklearn 的葡萄酒数据集。但是,我们不会使用所有维度,而是只使用两个最相关的属性。

使用协方差矩阵改变基数

左图 →使用 Numpy
计算的协方差矩阵右图 →使用内置函数计算的协方差矩阵

首先,我们需要计算协方差矩阵,从这里我们可以得到生成的协方差矩阵的特征向量和值。(这是原理变化向量。)

红点 →协方差矩阵的特征向量

如上所示,在得到每个向量后,我们可以画一个线性图,线的长度并不重要。但是我们可以看到,最大差异存在的区域是数据点的对角线。

最后,我们可以将所有的数据点投影到这个基向量中。不幸的是,我们丢失了属性信息。然而,我们能够看到更清晰的数据版本。

使用相关矩阵改变基础

左图 →使用 Numpy
计算相关矩阵右图 →使用内置函数计算相关矩阵

现在我知道颜色是关闭的,但值是一样的,如下所示。

和上次一样,让我们找出这个矩阵的特征向量。

得到的向量彼此对称,相关矩阵本身也是对称的。

然而,以上是当我们使用从相关矩阵生成的特征向量时得到的投影。

奇异值分解(2D)

既然我们已经走了这么远,让我们走得更远。我们可以很容易地执行奇异值分解。如上所述,在首先计算转置(A)点积(A)之后。我们可以找到那个矩阵的特征向量。从那里我们可以得到我们的 u,最后,如上面红框所示,我们可以观察到,原始矩阵和重构矩阵之间没有区别。(如果你不明白这个方法请点击这里。)

现在让我们去掉最不重要的奇异值,进行降维。正如上面所看到的,我们可以清楚地看到,重建的矩阵与原始矩阵并不相同。

当我们将数据投影到 2D 平面时,我们可以观察到,在 SVD 之后,对角线上的最大变化被捕获。

奇异值分解(3D)

最后,让我们以一些 3D 图来结束,如上所述,我添加了一个额外的属性,“alcalinity_of_ash”。

左图 →使用 Numpy
计算的协方差矩阵右图 →使用内置函数计算的协方差矩阵

再一次,让我们先看看,仅仅改变基底,我们能做什么。当我们根据协方差绘制生成的特征向量时,我们得到如下结果。

我稍微改变了起点,但故事保持不变。现在让我们执行投影。

我们可以观察到这样一个事实,现在我们的特征向量已经占据了基向量空间。现在它们都互相垂直。此外,我们还可以对 3D 数据执行 SVD。

就像前面的例子,我们可以看到,重建的矩阵是相同的原始矩阵。现在来降维。

当我们丢弃最不重要的奇异值时,我们的 3D 数据会折叠成一个平面。然而。我们仍然可以观察到这样一个事实,即数据彼此之间仍然是完全可以分离的。

但是,当我们丢弃两个奇异值时,我们可以清楚地看到,我们的数据不再是可分的,因为它折叠成了一条线。

交互代码

对于谷歌实验室,你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要获取这篇文章的代码,请点击这里。

最后的话

玩特征值/向量真的很有趣。

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

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

参考

  1. 特征值和特征向量在 3 分钟内|用一个有趣的类比解释。(2018).YouTube。检索于 2018 年 7 月 9 日,来自https://www.youtube.com/watch?v=5UjQVJu89_Q
  2. sk learn . datasets . load _ wine-sci kit-learn 0 . 19 . 1 文档。(2018).Scikit-learn.org。检索于 2018 年 7 月 9 日,来自http://sci kit-learn . org/stable/modules/generated/sk learn . datasets . load _ wine . html # sk learn . datasets . load _ wine
  3. numpy.linalg.inv — NumPy v1.14 手册。(2018).Docs.scipy.org。2018 年 7 月 9 日检索,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . Lina LG . inv . html
  4. 正确,e. (2018)。numpy.linalg.eig 创建的特征向量似乎不正确。堆栈溢出。检索于 2018 年 7 月 9 日,来自https://stack overflow . com/questions/32926861/特征向量-created-by-numpy-Lina LG-EIG-dont-seem-correct
  5. 矩阵的逆。(2018).Mathsisfun.com。检索于 2018 年 7 月 9 日,来自 https://www.mathsisfun.com/algebra/matrix-inverse.html
  6. matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 7 月 9 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
  7. 在 Numpy 中使用矩阵点积/具有交互代码的基的变化的简单分类。(2018).走向数据科学。2018 年 7 月 9 日检索,来自https://towardsdatascience . com/naive-class ification-using-matrix-dot-product-change-of-basis-with-interactive-code-in-numpy-4808 E5 aa 955 e
  8. seaborn . heat map-seaborn 0 . 8 . 1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 7 月 9 日,来自https://seaborn.pydata.org/generated/seaborn.heatmap.html
  9. matplotlib,C. (2018 年)。用 matplotlib 改变 y 范围从 0 开始。堆栈溢出。2018 年 7 月 9 日检索,来自https://stack overflow . com/questions/22642511/change-y-range-to-start-from-0-with-matplotlib
  10. 价值?,H. (2018)。如何使用十进制范围()步长值?。堆栈溢出。检索于 2018 年 7 月 9 日,来自https://stack overflow . com/questions/477486/how-to-use-a-decimal-range-step-value
  11. (2018).Users.stat.umn.edu。检索于 2018 年 7 月 9 日,来自http://users.stat.umn.edu/~helwig/notes/datamat-Notes.pdf
  12. 颜色示例代码:colormaps _ reference . py—Matplotlib 2 . 0 . 2 文档。(2018).Matplotlib.org。检索于 2018 年 7 月 9 日,来自https://matplotlib . org/examples/color/colormaps _ reference . html
  13. 使用样式表自定义绘图— Matplotlib 1.5.3 文档。(2018).Matplotlib.org。检索于 2018 年 7 月 9 日,来自 https://matplotlib.org/users/style_sheets.html
  14. 奇异值分解教程:应用,例子,练习。(2017).统计和机器人。检索于 2018 年 7 月 10 日,来自https://blog . statsbot . co/singular-value-decomposition-tutorial-52c 695315254

Only Numpy:使用交互式代码实现和比较 Google Brain 的去耦神经接口(合成梯度)和 Google Brain 的梯度噪声的组合

原文:https://towardsdatascience.com/only-numpy-implementing-and-comparing-combination-of-google-brains-decoupled-neural-interfaces-6712e758c1af?source=collection_archive---------5-----------------------

所以我在想,Google Brain 发表了这篇论文“使用合成梯度去耦合神经接口”,它可以同时训练每一层。当执行反向传播时,网络架构以每层不依赖于下一层梯度的方式构建。(算是吧)。

而且他们还发表了这篇论文“添加梯度噪声提高了对非常深的网络的学习 s”。几天前我写了一篇博文,关于将高斯噪声添加到反向传播以使学习更快,现在让我们将这两个想法结合起来。

所以我们总共可以检查 4 个案例。

1 →纯神经网络
2 →解耦神经接口
3 →纯神经网络+高斯噪声
4 →解耦神经接口+高斯噪声

热门人工智能文章:

1。谷歌将凭借卓越的人工智能在自己的游戏中击败苹果

2。人工智能职业战争:第一集

3。引入露天开采:分散人工智能

阅读前

我假设你们所有人都已经非常熟悉去耦神经接口和高斯噪声。如果没有,请点击下面的链接。

对于解耦的神经接口,请阅读来自 Trask 的这篇惊人的帖子。来自 m e LOL 的这篇并不令人印象深刻的博文。

对于高斯噪声,请阅读本博客。

免责声明

上面是我在 Trinket 上运行代码时得到的结果,下面是我在桌面上运行代码时得到的结果。

如图所示,分类结果的颜色存在差异。尽管我使用了相同的 np.random.seed()值,但结果还是略有不同。我不知道为什么会这样,但它确实存在,所以如果你知道为什么,请在下面评论。此外,我将使用我的笔记本电脑上的屏幕截图和东西的结果。

声明超参数和训练数据

如上所述,这是一个简单的分类任务,到处都有一些噪声。现在让我们创建权重变量并复制它们,以确保我们从相同的权重开始。

如上所示,总共有 18 个砝码。红框内的权重用于情况 2:解耦神经接口,蓝框内的权重用于情况 4:解耦神经接口+高斯噪声。

此外,请注意,对于分离的神经接口,我们不仅需要合成梯度的权重,还需要每层的权重,因此我们需要绿色框内的权重。

DNI 的网络架构

上面是一个可怕的网络架构,来自我的媒体帖子,它并不代表我们将要实现的网络,但它确实得到了解耦神经接口的一般结构。再次为更多的信息,请阅读我已经包括的链接。

纯神经网络和 DNI 的前馈

Forward Feed For Pure NN

Partial View for Forward Feed for DNI

标准的神经网络前馈过程是容易和简单的,没有更多的添加。但是对于 DNI 来说,这就有点复杂了,因为我们可以在完成前馈过程后立即对重量进行反向传播。

蓝框→更新层 1 的权重(W1_DN)
红框→更新层 1 的合成权重(W1_sythn)

带有高斯噪声的反向传播

Back Propagation with Gaussian Noise

对于纯神经网络,高斯噪声下的标准反向传播也没什么特别的。但是对于 DNI,当更新正常权重(红框)和合成权重(蓝框)时,我添加了高斯噪声。

结果

因此,无噪声解耦神经接口的最终成本最小。至少在这个场景中。当我玩 hyper parameters 的时候,我意识到 DNI 对学习速率非常敏感,你自己试试看,如果学习速率太大,我们会有梯度爆炸。

此外,这有点令人困惑,因为我期望看到案例 3 和案例 4 的损失成本最小。不知道为什么会这样…(也许我会在未来的帖子中详细探讨这个想法。)

但是,当直接与基本事实和最终的分类进行比较时,我们可以看到,仅从颜色上看,情况 2 最接近基本事实。除了红色方框区域。

交互代码

更新:我搬到谷歌 Colab 的交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问互动代码,请点击这里。

最后的话

我仍然很困惑为什么结果会是这样,我认为找出为什么会这样是个好主意…

此外,我看到了我在 DNI 上的旧帖子,并意识到这是多么可怕,我将很快重新访问解耦神经接口。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的推特这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣,我还在简单的 RNN 上做了反向传播。

参考文献

  1. Seo,J. D. (2017 年 12 月 24 日)。Only Numpy:推导合成梯度中的前馈和反向传播(解耦神经…2018 年 1 月 22 日检索,来自https://medium . com/@ SeoJaeDuk/only-Numpy-derivating-Forward-feed-and-Back-Propagation-in-Synthetic-Gradient-Decoupled-Neural-ca4c 99666 bbf
  2. Seo,J. D. (2018 年 1 月 18 日)。only Numpy:Implementing " ADDING GRADIENT NOISE IMPROVES-LEARNING FOR-VERY-DEEP-NETWORKS-with-ADF 23067 F9 f1 2018 年 1 月 22 日检索自https://becoming human . ai/only-Numpy-Implementing-ADDING-GRADIENT-NOISE-IMPROVES-LEARNING-FOR-VERY-DEEP-NETWORKS-with-ADF 23067 F9 f1
  3. 没有反向传播的深度学习。(未注明)。检索于 2018 年 1 月 22 日,来自https://iamtrask.github.io/2017/03/21/synthetic-gradients/
  4. 贾德伯格,m .,Czarnecki,W. M .,奥辛德罗,s .,维尼亚尔斯,o .,格雷夫斯,a .,& Kavukcuoglu,K. (2016)。使用合成梯度的去耦神经接口。 arXiv 预印本 arXiv:1608.05343
  5. Neelakantan,a .,Vilnis,l .,Le,Q. V .,Sutskever,I .,Kaiser,l .,Kurach,k .,和 Martens,J. (2015 年)。添加梯度噪声改善了对非常深的网络的学习。 arXiv 预印本 arXiv:1511.06807

Only Numpy:实现和比较梯度下降优化算法+ Google Brain 的用交互式代码添加梯度噪声

原文:https://towardsdatascience.com/only-numpy-implementing-and-comparing-gradient-descent-optimization-algorithms-google-brains-8870b133102b?source=collection_archive---------11-----------------------

自从我看到 Sebastian Ruder 的梯度下降算法的视图后。我想写这个帖子已经很久了,因为我不仅想实现不同种类的优化算法,还想将它们相互比较。如果只比较“传统”优化会有点无聊,所以我会增加三种,所有优化方法的列表如下所示。

要比较的优化算法列表

*随机梯度下降(一线) b .气势 c .内斯特罗夫加速渐变 d .阿达格拉德 e .阿达德尔塔 f.

  1. 噪声训练 k .噪声训练 +高斯加性噪声
    l .亚当噪声训练
    *

最后三种方法是我到处玩,简单的噪音训练加上 Gumbel 噪音而不是梯度下降。此外,请注意,我不会提供每个优化算法的反向传播过程的屏幕截图(因为有相当多的),而是我会涵盖几个彼此有点不同的。

训练数据/申报超参数

像往常一样,我们将使用 MNIST 数据集来分类图像 0 和 1。另外请注意绿框区域,我们在这里声明每个测试案例的权重,为了公平审判,我们将它们初始化为相同的权重。

网络架构

现在所有的网络共享相同的架构,它们有三层,每层都有激活函数 elu()、tanh()和 log()。这是逻辑 sigmoid 函数。

反向传播——内斯特罗夫加速梯度

内斯特罗夫加速梯度上的反向传播是我见过的最奇怪的反向传播之一。但这个想法非常有意义,让我们更进一步看到未来,并相应地改变方向。

反向传播— RMSProp

RMSProp 是一种非常有趣的优化方法,因为它不是独立于 Adadelta 发布和制作的。感觉就像一个经验法则,当训练神经网络时,学习速率和速度(动量)一样衰减是一个好主意。

反向传播—那达慕

这是我见过的最酷、最复杂的解决方案之一。结合内斯特罗夫加速梯度和亚当的想法很酷。再次表扬蒂莫西·多扎的想法。

反向传播——谷歌大脑的高斯加性噪声

这里,我们有一个非常简单而强大的解决方案,只是添加高斯噪声到梯度。我仍然对这个简单的方法如何提高整体准确性感到惊叹。

反向传播—噪声亚当

建立噪音训练的想法,我结合了衰减先前梯度以及动量的想法。另外,请注意,对于噪声训练方法,我将学习率设置为 0.00001。

训练和结果——谷歌 Colab

**

上面的图片是在 Google Colab(人类最伟大的发明)上运行代码的训练结果。).我最惊讶的是两件事。红星 Adadelta 的成本已经开始变得疯狂,走向了不归路。
布朗星→亚当噪音优化法实际上开始出现收敛的迹象。看到这一切是如何成为可能的,真是令人惊讶。

另外,请注意您看不到噪声训练结果(j)的原因是因为噪声训练和高斯加性噪声几乎具有相同的成本值,因此一个被另一个覆盖。

从上面可以看出,两种优化方法的成本值非常接近。

交互代码

我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问的互动代码,请点击这里。

最后的话

我想发这个帖子已经很久了,终于停止拖延的感觉真好。亚当和噪声亚当优化方法也值得称赞。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考文献

  1. 萨顿,R. S. (1986)。网络的反向传播和其他最速下降学习程序的两个问题。在 1986 年认知科学学会第八届年会的会议记录中。
  2. 钱嫩(1999)。梯度下降学习算法中的动量项。神经网络12 (1),145–151。
  3. Attouch 和 j . Peypouquet(2016 年)。内斯特罗夫加速向前向后法的收敛速度其实比 1/k 还要快暹罗最优化杂志*, 26 (3),1824–1834。*
  4. j .杜奇、e .哈赞和 y .辛格(2011 年)。在线学习和随机优化的自适应次梯度方法。机器学习研究杂志12(7 月),2121–2159。
  5. 医学博士泽勒(2012 年)。ADADELTA:一种自适应学习速率方法。 arXiv 预印本 arXiv:1212.5701
  6. Ruder,S. (2018 年 1 月 19 日)。梯度下降优化算法综述。检索 2018 . 02 . 04,来自http://ruder . io/optimizing-gradient-descent/index . html # fn:24
  7. http://www . cs . Toronto . edu/~ tij men/CSC 321/slides/lecture _ slides _ le C6 . pdf
  8. Neelakantan,a .,Vilnis,l .,Le,Q. V .,Sutskever,I .,Kaiser,l .,Kurach,k .,和 Martens,J. (2015 年)。添加梯度噪声改善了对非常深的网络的学习。 arXiv 预印本 arXiv:1511.06807
  9. Seo,J. D. (2018 年 02 月 01 日)。only Numpy:Noise Training—Training a Neural-Network-with Back Propagation with Interactive…2018 年 2 月 04 日检索自https://medium . com/@ SeoJaeDuk/only-Numpy-Noise-Training-Training-a-Neural-Network-with-Interactive-ad 775 f 04 cad6
  10. t .多扎特(2016 年)。将内斯特洛夫动量引入亚当。
  11. 金马博士和巴律师(2014 年)。亚当:一种随机优化方法。 arXiv 预印本 arXiv:1412.6980

Only Numpy:使用交互式代码对深度神经网络(回归)实施 L1 /L2 范数/正则化的不同组合

原文:https://towardsdatascience.com/only-numpy-implementing-different-combination-of-l1-norm-l2-norm-l1-regularization-and-14b01a9773b?source=collection_archive---------1-----------------------

Gif from here

我一直对不同类型的成本函数和正则化技术感兴趣,所以今天,我将实现损失函数和正则化的不同组合,以查看哪种性能最好。我们还将看看每个模型的重量的绝对总和,看看重量变得有多小。

Ignore the 7 case — we are going to compare 6 cases

L1-范数损失函数和 L2-范数损失函数

Image from Chioka’s blog

我认为上述解释是对两种成本函数最简单而有效的解释。所以我就不多说了,让我们看看规则。

热门人工智能文章:

1。制作一个简单的神经网络

2。Keras 备忘单:Python 中的神经网络

3。使用 Tensorflow 实现 RNN-LSTM 的 noob 指南

L1 正则化和 L2 正则化

Image from Chioka’s blog

同样,从上到下的红框代表 L1 正则化和 L2 正则化。我没有什么要补充的了。然而,由于我必须驱动导数(反向传播),我将触及一些东西。

绝对函数的导数

Image from stack overflow here

如上所述,绝对函数的导数有三种不同的情况,当 X > 1 时,X < 1 and X = 0.

Option 1 → When X > 1,导数= 1
选项 2 →当 X = 0 时,导数=未定义
选项 3 →当 X < 1 时,导数= -1

因为我们不能让梯度“不确定”,所以我打破了这个规则。

My broken rule of derivative

上面的,是我将用来计算 x 值的导数的函数,如上所述,我没有第二个选项,我们把它合并到第一个选项中。

初始化超参数和权重

上面是创建训练数据和声明一些噪声以及学习率和阿尔法值(这些是正则化)。

初始化权重并将其复制到每个案例中。

网络架构+前馈

网拱没什么特别的,简单来说。

由每层下面的红色标记表示。
第 1 层→ 100 个神经元
第 2 层→ 104 个神经元
第 3 层→ 200 个神经元
第 4 层→ 1 个神经元

并且权重具有适当的维度来执行层之间的变换。然而,有两个盒子我想谈一下。

红框→身份激活功能

def IDEN(x):
    return x
def d_IDEN(x):
    return 1

如果用 python 实现,它看起来会像上面一样,非常简单的线性函数。我们需要这个,因为我们要对连续值进行回归。如果你想知道为什么我们需要激活函数,请阅读我的另一篇博文“ Only Numpy:为什么我们需要激活函数(非线性),在深度神经网络中——带有交互代码”

蓝盒子→反正切 Sigmoid 函数

Image from wiki

可以把这个函数想象成 tanh()函数,但是范围更广。我个人认为,我们不必拘泥于逻辑的乙状结肠或 tanh。 我认为我们需要探索的激活功能种类繁多 。无论如何,如果你想要可视化的 archtan(),请看下图。

Image from wolfam Alpha

成本函数和正则化案例

如上所示,我们总共可以处理 6 个(忽略 7 个)案例。

情况 1 → L1 范数损失
情况 2 → L2 范数损失
情况 3 → L1 范数损失+ L1 正则化
情况 4 → L2 范数损失+ L2 正则化
情况 5 → L1 范数损失+ L2 正则化
情况 6 → L2 范数损失+ L1 正则化

我们将看到每个 case 函数是如何相互区别的!

反向传播(在情况 1、3 和 4 下)

由于每隔一个案例都可以从这三个案例中派生出来,所以我不会做每一个反向传播过程。不过,有一件事我想让你知道。用红色马克笔写的部分是我们违反对绝对函数求导规则的地方!(注意这个!!)

常规结果

正如预期的那样,正则化的网络对噪声最鲁棒。然而具有纯 L1 范数函数的模型变化最小,但是有一个问题!如果你看到绿色星星的位置,我们可以看到红色回归线的精确度急剧下降。

还有,需要注意的一点是蓝星的位置,大多数模型都无法预测 X 开始时 Y 的正确值,这让我很感兴趣。我们来看看权重的绝对和。

总的来说,非常清楚的是,具有正则化的模型具有小得多的权重。其中 L2 正则化的 L1 代价函数具有最小的权值。

常规之外的思考:结果

我是从哪里以及如何得到上述结果的?很简单,我没有遵循绝对函数的严格导数,而是稍微放宽了导数。具体区别见下文。

Regular Back Propagation on Case 5

Special case for loosening up the derivative on Case 5

如上所示,我没有遵循严格的推导规则,而是将成本函数调整为(Layer_4_act — Y)/m。

我认为当谈到深度学习时,有时创造力会产生更好的结果,我不确定,但辛顿博士在反向传播中随机降低权重,仍然取得了良好的结果。无论如何,让我们来看看权重的绝对值总和。

互动代码—常规结果

请点击这个链接查看结果和代码。

互动代码——公约之外的思考:结果

请点击此链接查看结果和代码。

最后的话

我从另一篇文章中看到总共有 7 种正则化技术,所以我只是触及了表面。迫不及待想知道更多。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还在简单的 RNN 上做了反向传播。

参考文献

  1. Seo,J. D. (2018 年 1 月 16 日)。Only Numpy:为什么我们需要激活函数(非线性),在深度神经网络中—用…2018 年 1 月 20 日检索自https://medium . com/@ SeoJaeDuk/only-Numpy-Why-we-needle-Activation-Function-Non-Linearity-in-Deep-Neural-Network-With-529 e 928820 BC
  2. 反正切。(未注明)。检索于 2018 年 1 月 20 日,来自http://mathworld.wolfram.com/InverseTangent.html
  3. 乙状结肠函数。(2018 年 1 月 18 日)。检索于 2018 年 1 月 20 日,来自https://en.wikipedia.org/wiki/Sigmoid_function
  4. (未注明)。检索于 2018 年 1 月 20 日,来自http://www . chioka . in/differences-between-L1-and-L2-as-loss-function-and-regulation/
  5. 用极限定义求|x|的导数。(未注明)。检索于 2018 年 1 月 20 日,来自https://math . stack exchange . com/questions/83861/finding-the-derivative-of-x-using-the-limit-definition
  6. 基于 RANSAC 的稳健线性模型估计。(未注明)。2018 年 1 月 20 日检索,来自http://sci kit-learn . org/stable/auto _ examples/linear _ model/plot _ ran sac . html # sphx-glr-auto-examples-linear-model-plot-ran sac-py
  7. Jain,a .,Shaikh,f .,Choudhary,a .,Singh,g .,& Kaur,P. (2016 年 2 月 07 日)。Python 中脊和套索回归的完整教程。检索于 2018 年 1 月 20 日,来自https://www . analyticsvidhya . com/blog/2016/01/complete-tutorial-ridge-lasso-regression-python/
  8. 杰基奇,M. (2017 年 10 月 30 日)。建立一个多层神经网络与 L2 正则化使用张量流。检索于 2018 年 1 月 20 日,来自https://markojerkic . com/build-a-multi-layer-neural-network-with-L2-regulation-with-tensor flow/

仅 Numpy:使用带有交互代码的 Numpy 实现 GAN(通用对抗网络)和 Adam 优化器。(跑甘在线)

原文:https://towardsdatascience.com/only-numpy-implementing-gan-general-adversarial-networks-and-adam-optimizer-using-numpy-with-2a7e4e032021?source=collection_archive---------4-----------------------

所以今天我受到了这篇博文的启发,“TensorFlow 中的生成对抗网络”,我想用 Numpy 自己实现 GAN。下面是原创甘论文作者 @ goodfellow_ian 。下面是从简单的 GAN 生成的所有图像的 gif。

在阅读之前,请注意我不会涉及太多的数学知识。更确切地说,是代码的实现和结果,我将在以后讨论数学。我正在使用 Adam Optimizer,但是,我不会在这篇文章中解释 Adam 的实现。

GAN 中鉴频器的前馈/部分反向传播

同样,我不会说太多的细节,但请注意红色方框区域称为数据。对于 GAN 中的鉴别器网络,该数据可以是由发生器网络产生的真实图像或虚假图像。我们的图像是 MNIST 数据集的(1,784)矢量。

还有一点要注意的是红色(L2A)和蓝色(L2A) 。红色(L2A)是以真实图像作为输入的我们的鉴别器网络的最终输出。蓝色(L2A)是我们的鉴别器网络的最终输出,以假图像作为输入。

我们实现这一点的方法是在将真实图像和虚假数据放入网络之前获取它们。

第 128 行—获取真实图像数据
第 147 行—获取虚假图像数据(由发生器网络生成)

第 162 行—我们的鉴频器网络的成本函数。

另外,请注意蓝框区域,这是我们的成本函数。让我们比较原始论文中的成本函数,如下所示。

Image from original Paper

不同之处在于,我们在第一个学期日志(L2A)前面放了一个(-)负号。

Image from Agustinus Kristiadi

如上所述,在 TensorFlow 实现中,如果我们想要最大化某个值,我们翻转符号,因为 TF 自动微分只能最小化。

我思考过这个问题,并决定以类似的方式实现。因为我想最大化我们的鉴别者对真实图像猜测正确的机会,同时最小化我们的鉴别者对虚假图像猜测错误的机会,我希望这些值的总和达到平衡。然而,我还不能 100 %确定这一部分,我会很快重新考虑这件事。

GAN 中发电机的前馈/部分反向传播

GAN 中发生器网络的反向传播过程有点复杂。

蓝框—从发电机网络产生的假数据
绿框(左角)—鉴别器接受产生的(蓝框)输入并执行前馈过程

橙色框—发电机网络的成本函数(同样,我们希望最大化产生真实数据的机会)

绿框(右角)—发生器网络的反向传播过程,但我们必须通过一路梯度鉴别器网络。

下面是实现代码的屏幕截图。

标准的反向传播,没什么特别的。

训练结果:失败的尝试

我很快意识到训练 GAN 是极其困难的,即使有 Adam Optimizer,网络似乎也没有很好地收敛。因此,我将首先向您展示所有失败的尝试及其网络架构。

  1. 生成器,2 层:200,560 个隐藏神经元,输入向量大小 100

2。发生器,tanh()激活,2 层:245,960 个隐藏神经元,IVS 100

3。生成器,3 层:326,356,412 个隐藏神经元,输入向量大小 326

4。生成器,2 层:420,640 个隐藏神经元,输入向量大小 350

5。生成器,2 层:660,780 个隐藏神经元,输入向量大小 600

6。生成器,2 层:320,480 个隐藏神经元,输入向量大小 200

所以如上所见,他们似乎都学到了一些东西,但不是真正的 LOL。然而,我能够使用一个巧妙的技巧来生成一个看起来有点像数字的图像。

极端阶梯式梯度衰减

以上是一张 gif,我知道差别很小,但是相信我,我不是在耍你。这个技巧非常简单,也很容易实现。我们首先为第一次训练设置学习率高速率,并且在第一次训练之后,我们通过因子 0.01 设置学习率的衰减。由于未知的原因(我想对此进行更深入的研究),这似乎是可行的。)

但由于巨大的成本,我认为我们正在向一个网络只能产生特定类型数据的“地方”靠拢。意思是,从-1 和 1 之间的数的均匀分布。生成器只会生成看起来像 3 或 2 等的图像。但这里的关键点是,网络不能生成不同的一组数字。事实证明,图像中所有的数字看起来都像 3。

然而,看起来像一个数字是一些什么合理的形象。让我们看看更多的结果。

如上所述,随着时间的推移,数字变得更加尖锐。一个很好的例子是生成的图像 3 或 9。

交互代码

更新:我搬到谷歌 Colab 的交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

请点击在线访问互动代码。

当运行代码时,确保你是在' main.py' tap 上,如上面绿色框中所示。这个程序会问你一个随机的播种数,如蓝框所示。生成一幅图像后,要查看该图像,请单击上面的“单击我”选项卡,红色框。

最后的话

把甘训练到半身不遂是一项很大的工作,我想研究更有效的训练甘的方法。最后一件事,喊出 @ replit ,这些家伙太厉害了!

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考文献

  1. Goodfellow,I .、Pouget-Abadie,j .、Mirza,m .、Xu,b .、Warde-Farley,d .、Ozair,s .、… & Bengio,Y. (2014 年)。生成对抗网络。在神经信息处理系统的进展(第 2672-2680 页)。
  2. 免费的在线动画 GIF 制作工具——轻松制作 GIF 图像。(未注明)。检索于 2018 年 1 月 31 日,来自http://gifmaker.me/
  3. 张量流中的生成对抗网。(未注明)。检索于 2018 年 1 月 31 日,来自https://wise odd . github . io/tech blog/2016/09/17/gan-tensor flow/
  4. J.(未注明)。jrios 6/亚当-vs-SGD-Numpy。检索于 2018 年 1 月 31 日,来自https://github . com/jrios 6/Adam-vs-SGD-Numpy/blob/master/Adam % 20vs % 20 SGD % 20-% 20 on % 20 kaggles % 20 titanic % 20 dataset . ipynb
  5. Ruder,S. (2018 年 1 月 19 日)。梯度下降优化算法综述。检索于 2018 年 1 月 31 日,来自 http://ruder.io/optimizing-gradient-descent/index.html#adam
  6. E.(1970 年 01 月 01 日)。埃里克·张。2018 年 1 月 31 日检索,来自https://blog . ev jang . com/2016/06/generative-adversarial-nets-in . html

Only Numpy:用交互式代码实现谷歌大脑的+RNN-交集 RNN(递归神经网络中的容量和可训练性)。

原文:https://towardsdatascience.com/only-numpy-implementing-google-brains-rnn-intersection-rnn-capacity-and-trainability-in-7dd7902b65a5?source=collection_archive---------5-----------------------

image from pixel bay

所以今天,让我们从这篇论文“ 递归神经网络 中的容量和可训练性”来完成实现新颖的 RNN 架构。因为我们已经在我的上一篇博文中实现了更新门 RNN。
Only Numpy:实现和比较 Google Brain 的 Update Gate(递归神经网络中的容量和可训练性)RNN,Hinton 博士的 Initialize RNN,以及带有交互代码的 Vanilla RNN。

让我们完成这项工作。

网络架构:数学形式

这个网络非常不同,不仅有循环部分,还有深度输出(记为 Y 线 19)。现在让我们来看看网络的图形表示。

网络架构

蓝框→递归隐藏状态
红框→新深度输出
绿框→每个时间戳输入

同样,非常直接,只是为了增加一些注释。

σ() → Logistic Sigmoid 激活函数
S1() → ReLU()激活函数
S2() → tanh()激活函数

正向进给操作(针对每个时间戳)

绿色方框→时间戳 1 的输出成本
粉色方框→时间戳 2 的输出成本
紫色方框→时间戳 3 的输出成本

同样,没有什么特别的只是标准的 RNN 前馈。

关于 YY3、HH3、GY3、GH3 的反向传播(时间戳= 3)

这里要注意一点,我不会对重量求导,而是对 YY,HH,GY 和 GH 求导。

为什么?请看看黑盒,我们正在对激活函数的输入进行反向传播。之后我们可以

乘以 h2,如果我们要对 Wrecyy、Wrechh、Wrecgy 或 Wrecgh 执行反向传播,或者

如果我们要对 Wxyy、Wxhh、Wxgy 或 Wxgh 执行反向传播,请乘以 x3。

下面是为时间戳 3 实现的反向传播代码。

关于 YY2、HH2(时间戳= 2)的反向传播

再次,对 YY2 求导,而不是对 Wrecyy 或 Wxyy 求导。另外,请注意红线下的项,该项为零,因为没有变量将 YY2 与时间戳 3 的成本联系起来。(这让我们的生活变得轻松了一些。)

下面是为时间戳 2 实现的反向传播的代码。

关于 YY1 的反向传播,HH1(时间戳= 1)

请注意我把紫色星星放在哪里了,我忘记了那里的一些术语,它应该是(h2 — hh3) * (d_σ()) * (Wrecgh)而不仅仅是(h2 — hh3)。

同样,对于红色下划线的变量是零,因为没有可以执行链式法则的变量。和前面的实现一样,我们对 YY1 和 HH1 求导。

下面是为时间戳 1 实现的反向传播代码。

训练及结果

假的训练数据,左边看到的只是把每个时间戳中的数字相加。所以在 x 的第一行,我们可以看到它从 0,0.5,0。所以尊重的基础真值是 0,0.5 和 0.5。(y 的第一行。)

如右图所示,训练后,我们可以观察到输出值非常接近地面真实值。

互动码

我转到 Google Colab 获取交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

请点击此处访问互动代码。(谷歌 Colab 版)

请点击此处访问交互代码(复制版本)

最后的话

谷歌大脑,总是有最有趣的网络架构选择。

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

与此同时,请在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣,我也在这里做了解耦神经网络的比较。

参考

  1. Collins,j .,Sohl-Dickstein,j .,和 Sussillo,D. (2016 年)。递归神经网络的容量和可训练性。 arXiv 预印本 arXiv:1611.09913
  2. Seo,J. D. (2018 年 1 月 24 日)。Only Numpy:实现和比较 Google Brain 的更新门(容量和可训练性 in…检索于 2018 年 1 月 29 日,来自https://becoming human . ai/only-Numpy-Implementing-and-comparison-Google-brains-Update-Gate-Capacity-and-training ability-in-940 f0ad 80649

Only Numpy:实现高速公路网络,使用带有交互代码的小批量 OOP 方法

原文:https://towardsdatascience.com/only-numpy-implementing-highway-network-oop-approach-with-mini-batch-with-interactive-code-b5c2de2df842?source=collection_archive---------8-----------------------

Photo of Han River in Seoul, from Pixel Bay

我今天感觉有点懒,但是我仍然想练习我的反向传播技能以及实现神经网络的 OOP 方法。因此,实施网络的明显选择是高速公路网。(我想实现这个网络已经有一段时间了。)

网络架构(数学形式)/修改

Screen Shot from Original Paper

红框→ 仿射变换+非线性激活,我们可以认为这是标准全连接网络中的“正常”层

蓝框 →变换门,我们也可以认为是仿射变换+非线性激活(但激活函数不同)

绿框 →我们将在原始文件的基础上增加我们的修改。在论文中,我们应该直接传递输入,然而为了匹配维度,我将在这里添加仿射变换以及非线性激活函数。(另外,请注意,我将把它们称为“A ”,作为“Added”的缩写形式。)

以防万一,如果有人想知道,原始论文的作者实际上说,如果需要改变维度。然而,为了尽可能保持输入“不变”,我将为添加的部分初始化权重,如下所示。

当公路图层对象初始化时,添加部分的权重都被初始化为 1,而不是高斯分布。

网络架构(面向对象形式)

红框 →每层进给部分

蓝框 →每层反向传播

绿色下划线 →来自下一层的梯度,需要计算当前层的梯度

黄框 →在更新权重之前,计算传递到前一层的梯度(为了保持链式法则。)

粉色下划线 →将渐变传递给上一层,计算其渐变。

我真的很喜欢这种面向对象的方法,我想我会以这种方式实现我的大部分神经网络。

前馈/反向传播

红框 →用合适的维度初始化各层

黄框 →前馈操作以及重量更新的反向传播。最小批量为 3。

粉色方框 →每 2 次迭代,看网络做的怎么样。

训练和结果

首先,成本从 3.75 英镑开始,然后下降到 1.9 英镑,所以网络似乎在学习。然而准确性是可笑的 LOL。

四层高速公路网 77%的准确率,我不知道这是好是坏。如果你能提高网络准确度,请分享你的森派诀窍!

交互代码

我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问互动 e 代码,请点击此处。

最后的话

我知道我应该努力提高模型的准确性,但今晚我只是觉得很懒,对不起,哈哈。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. Srivastava,R. K .,Greff,k .,& Schmidhuber,J. (2015 年)。高速公路网。 arXiv 预印本 arXiv:1505.00387
  2. Romero,a .,Ballas,n .,Kahou,S. E .,Chassang,a .,Gatta,c .,& Bengio,Y. (2014 年)。Fitnets:薄深网的提示。arXiv 预印本 arXiv:1412.6550 。

仅 Numpy:使用交互式代码实现迷你 VGG (VGG 7)和 SoftMax 层

原文:https://towardsdatascience.com/only-numpy-implementing-mini-vgg-vgg-7-and-softmax-layer-with-interactive-code-8994719bcca8?source=collection_archive---------4-----------------------

Picture from Pixel Bay

我想在卷积神经网络上练习我的反向传播技能。现在我想实现我自己的 VGG 网(来自原始论文“用于大规模图像识别的非常深的卷积网络”),所以今天我决定结合这两个需求。

如果你不了解卷积神经网络的反向传播过程,请查看我的卷积神经网络反向传播教程,这里这里或者这里。

Softmax 层及其衍生物

Softmax Function photo from Peter

Derivative of Softmax photo from Peter

现在有很多关于 softmax 函数及其导数的好文章。所以这里就不深入了。不过我这里链接几个[,这里](http://photo from Peter)这里,这里这里,这里这里。

网络架构(示意图)

所以我们只有 7 层,因此名字是 VGG 7,而不是 VGG 16 或 19。原始实现之间也有两个主要区别。

1.我们将使用平均池而不是最大池。如果你想知道为什么,请查看此链接。
2。我们网络中的信道数量将比原来的网络少得多。为了便于比较,请参见下面的原始网络架构或这里的。

Image from heuritech

数据准备和超参数声明

如上所述,我们现在不必过滤掉只包含 0 或 1 的图像。由于 SoftMax 图层,我们能够对 0 到 9 的每张图像进行分类。

正向进给操作

这是一个标准的前馈操作,激活函数 ReLU()用于卷积层,tanh()和 arctan()用于完全连接的层。

反向传播

由于我们使用的是平均池而不是最大池,反向传播非常容易和简单。需要注意的一点是,我对卷积层和全连通层设置了不同的学习速率。(绿色方框区域)。

更新:请注意在代码中有一个错别字,我将调用以上反向传播作为断开的反向传播,因为我们正在用 w1 而不是 w2 更新 w2。

训练和结果(正确的反向传播)

简·扎瓦日基指出了我的错别字,所以我修改了它,并重新培训了网络。如右图所示,是一段时间内的成本值。

该网络在测试集图像上也做得更好,准确率为 84%。

训练和结果(反向传播中断)

因此,随着时间的推移,成本也稳定下降,但是该模型在测试集图像上表现不佳。

在 50 个数字中,只能正确分类 39 个,准确率约为 78%。

交互代码

为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问交互代码,请点击此链接。

遗言

VGG 网络是实践前馈操作和反向传播的非常好的网络,因为它们都是直接的。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的推特这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. Simonyan 和 a . zisser man(2014 年)。用于大规模图像识别的非常深的卷积网络。 arXiv 预印本 arXiv:1409.1556
  2. 罗兰茨,p .(未注明)。如何实现一个神经网络间奏曲 2?检索 2018 . 02 . 07,来自http://peterroelants . github . io/posts/neural _ network _ implementation _ intermezzo 02/
  3. R.(未注明)。rasbt/python-机器学习-图书。2018 . 02 . 07 检索,来自https://github . com/rasbt/python-machine-learning-book/blob/master/FAQ/soft max _ regression . MD
  4. 交叉熵损失函数简介。(2018 年 01 月 07 日)。检索 2018 . 02 . 07,来自https://sefiks . com/2017/12/17/a-gentle-introduction-to-cross-entropy-loss-function/comment-page-1/# comment-600
  5. Vgg16。(2016 年 2 月 26 日)。检索于 2018 年 2 月 7 日,来自https://blog . heuritech . com/2016/02/29/a-brief-report-of-the-heuritech-deep-learning-meetup-5/vgg 16/
  6. 2018.【在线】。可用:https://www . quora . com/What-the-benefit-of-use-average-pooling-than-max-pooling【访问时间:2018 年 2 月 7 日】。

Only Numpy:使用交互式代码为 MNIST 分类实现简单的 ResNet(具有随机深度的深度网络)

原文:https://towardsdatascience.com/only-numpy-implementing-simple-resnet-for-mnist-classification-with-interactive-code-d58c77064304?source=collection_archive---------8-----------------------

Image from Pixel Bay

所以我在读这篇文章“随机深度网络将成为新的范式 l”,在那里我看到了论文“具有随机深度的深度网络”。在阅读这篇论文时,我看到了下面的图表。

ResNet Image from Original Paper

我立刻受到启发,建立了自己的 Res Net。然而,由于批处理规范化对于反向传播来说实现起来有点复杂,所以在今天的实现中我就不把它们算进去了。但是我保证,我会很快实施的!

网络架构(数学形式)

如上所述,网络架构非常容易理解,我们有某种函数 f()来转换输入数据。我们还有一个额外的函数 id(),即 Identity 函数,它允许从上一层直接连接到当前层。

前馈操作/部分反向传播
(数学方程)

绿框→3 个剩余块的前馈操作
红框→隐藏权重的部分反向传播。

蓝色下划线→相对于 W3H 的反向传播
粉色下划线→相对于 W2H 的反向传播
紫色下划线→相对于 W1H 的反向传播

现在,我不会对每个权重执行反向传播,但是对 W3b、W3a、W2b、W2a、W1b 和 W1a 的反向传播也很容易。

前馈操作(代码)

红色方框→ Res 模块 1
绿色方框→ Res 模块 2
蓝色方框→ Res 模块 3

对静止块前馈操作非常简单而有效。然而反向传播过程有点复杂。

反向传播(代码)

Res Net 中反向传播有点复杂的主要原因是因为在残差块的末尾发生了加法。在执行反向传播时,我们需要确保我们将所有梯度相对于该权重相加。代码中带红色下划线的部分执行加法。

培训和结果(相同的学习率)

现在,首先我为隐藏权重和其他权重设置了完全相同的学习速率。无论我如何努力,我都无法在这种环境下得到好的结果。所以我决定简单地为不同“类型”的重量设定不同的学习率。

培训和结果(不同的学习率)

对于一个 10 类图像的简单分类任务来说,72 %的准确率并不令人印象深刻。我会回来,希望增加这个模型的准确性。但是看起来,为不同“类型”的权重设置不同的学习率会有更好的结果。

交互代码

我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问的互动代码,请点击此链接。

最后的话

在论文“具有随机深度的深度网络”中提出的主要网络不是简单的 Res 网,而是它们引入了具有随机深度的网络。我将很快尝试实现批量标准化网络。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. 黄,孙,杨,刘,陈,丁,温伯格(2016 年 10 月)。具有随机深度的深度网络。在欧洲计算机视觉会议(第 646–661 页)。斯普林格,查姆。
  2. D.(2016 年 06 月 05 日)。随机深度网络将成为新常态。检索于 2018 年 2 月 8 日,来自http://deliprao.com/archives/134

Only Numpy Medical:使用交互式代码的神经网络对肺部 CT 扫描去噪—第 1 部分,普通自动编码器模型

原文:https://towardsdatascience.com/only-numpy-medical-denosing-lung-ct-scans-using-auto-encoders-with-interactive-code-part-1-a6c3f9400246?source=collection_archive---------5-----------------------

Image from Pixel Bay

我的激情在于人工智能,我希望我的遗产是在医疗保健领域,使用人工智能。因此,为了实现我的梦想,也为了实践实现神经网络的 OOP 方法,我将开始一系列肺部 CT 扫描的第一部分。我将用 Adam Optimizer 实现普通的自动编码器来开始这个系列。

注:所有的 DICOM 图像均来自 癌症影像存档网 ,如果您打算使用这些数据,请查阅他们的数据使用年龄政策。具体来说,我将使用来自 仿真模型 FDA 数据集的 DICOM 图像。

训练数据和生成的噪声数据

这个想法很简单,我们有原始的 DICOM 图像,如左图所示,我们将添加一些随机噪声,使图像看起来像右图。

我们可以通过添加随机高斯分布噪声并乘以某个常数值来实现这一点。

网络架构(图形形式)

黑盒 →输入 512*512 尺寸的 DICOM 图像

蓝/绿方块 →编码器部分,3 卷积运算,在最后一层我们对图像进行矢量化(展平)

红/黄色方块 →解码器部分,输入编码矢量,并对其进行整形,以执行 3 层卷积运算。

如上所述,组成自动编码器的组件非常简单明了。

网络架构(面向对象形式)

如上所述,每个模型都有三种不同的功能。
a .初始化 →初始化模型中的所有权重

b .前馈 →根据型号是编码器还是解码器,要么以图像为输入,要么以编码矢量为输入,执行标准前馈操作。

c .反向传播 →这是模型的关键功能,我们在这里计算每一层的错误率,并调整模型的权重,以学习最佳权重。

前馈操作(编码器/解码器)

红框 →编码器卷积运算部分
蓝框 →编码器全连接层运算部分

蓝框 →解码器全连接层运算
红框 →解码器卷积运算

我想指出两件事。
1。从编码器到解码器的操作顺序是相反的。(或者换句话说,镜像。)
2。为了执行降维,我们将在编码器中使用均值池。为了对图像进行上采样,我们只需在解码器中重复矩阵中的每个元素。

反向传播(编码器/解码器)

红框→ 编码器的 Adam 优化器更新
蓝框 →执行编码器的反向传播

蓝框 →为解码器执行反向传播
紫框 →将梯度传递给编码器,在更新权重
红框 → Adam 优化器为解码器更新之前计算梯度。

朴素成本函数

对于这个普通的自动编码器,我将使用简单的成本函数,这是 L2 平方成本函数,但分母是 1/4,而不是 1/2。我意识到,我们可以在这里使用许多其他成本函数,例如 SSIM,或者我们甚至可以使用 VGG 16 作为成本函数,如论文“深度特征作为感知度量的不合理有效性”中所示。但是现在让我们继续关注 L2。

训练和结果——普通随机梯度下降

实际上,我对结果感到惊讶。我原以为解码后的图像会是一片漆黑或者全是灰度图像,然而令我惊讶的是,在解码后的图像中间几乎看不到黑点。

培训和结果— Adam Optimizer(高学习率)

编码器的学习率→ 0.0005
解码器的学习率→ 0.001

如上所述,当学习率被设置为高值时,解码图像看起来就像一个带有黑色随机噪声的白色圆圈。

训练和结果— ReLU 激活功能(高学习率)

编码器学习率→ 0.000006
解码器学习率→ 0.0000006

左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。我们可以再次看到在解码图像的中心形成“白圈”的相同趋势。

训练和结果— ReLu 激活功能(低学习率)

编码器的学习率→ 0.0000001
解码器的学习率→ 0.0000001

左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。在低学习率下,我们可以看到图像的肺部部分(左图),但是随着学习的进行,白色圆圈再次出现。

训练和结果——双曲正切/反正切激活函数(高 LR)

编码器的学习率→ 0.000006
解码器的学习率→ 0.0000006

左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。与具有高学习率的 ReLU 激活模型非常相似,但同样以白色圆圈结束。

训练和结果——双曲正切/反正切激活功能(低 LR)

编码器学习率→ 0.0000007
解码器学习率→ 0.0000001

左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。因此,将学习率调整到较低是一个简单的解决方案,但是我们还不能说图像已经被成功去噪。

一段时间内的成本

无论我选择使用 ReLU、Tanh 还是 Arctan 激活函数,成本似乎都随着时间的推移而降低,但是如果你看一下 Y 轴,它不在 0 附近,也不在产生可接受的去噪图像的范围内。

交互代码

为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

现在运行这段代码有点复杂,因为我使用了自己的数据集。不过,不要担心,我已经将我使用的所有 DICOMs 上传到我的公共 Gitlab,要访问它请点击此链接。要访问存储库的主页,请点击此处。现在请按照一步一步的教程。

  1. 从上面的链接下载“lung_data_small.zip”文件。

2.将 Google Colab 中的代码复制到您自己的游戏中。运行代码时,会弹出一个小按钮,如上所示。(绿色方框)。单击选择文件并选择最近下载的“lung_data_small.zip”文件。

3.该计划将完成上传数据到谷歌 Colab,它将继续运行。

所以记住上面的简短教程,请点击这里访问交互代码。

遗言

我很抱歉对我自己的模特这么说。但我对这款香草款没抱太大期望。然而,我相信自动编码器是迷人的算法,我认为自动编码器有巨大的潜力。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. 越来越多的癌症医学图像档案。(未注明)。检索于 2018 年 2 月 12 日,来自http://www.cancerimagingarchive.net/
  2. Gavrielides,Marios A,Kinnard,Lisa M,Myers,Kyle J,Peregoy,,Pritchard,William F,曾,荣平,… Petrick,Nicholas。(2015).数据来自 Phantom_FDA。癌症影像档案。http://doi.org/10.7937/K9/TCIA.2015.ORBJKMUX
  3. 癌症影像档案维基。(未注明)。检索于 2018 年 2 月 12 日,来自https://wiki . cancerimagingarchive . net/display/Public/PhantomFDA # 9d 6953 e 17646457293 a 77021 aa4 CDB 37
  4. Python 中的 DICOM:用 PyDICOM 和 VTK 将医学图像数据导入 NumPy。(2014 年 10 月 25 日)。检索于 2018 年 2 月 12 日,来自https://py science . WordPress . com/2014/09/08/DICOM-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-VTK/
  5. 1.(2017 年 08 月 04 日)。自动编码器——比特和字节的深度学习——走向数据科学。检索于 2018 年 2 月 12 日,来自https://towardsdatascience . com/auto encoders-bits-and-bytes-of-deep-learning-eaba 376 f 23 ad
  6. 如何使用 Python 并排绘制两个图?(未注明)。检索于 2018 年 2 月 12 日,来自https://stack overflow . com/questions/42818361/how-to-make-two-plots-side-by-side-using-python
  7. numpy.repeat 的反义词是什么?(未注明)。检索于 2018 年 2 月 12 日,来自https://stack overflow . com/questions/40617710/what-the-opposite-of-numpy-repeat
  8. J.(2017 年 2 月 27 日)。JaeDukSeo/Python _ Basic _ Image _ Processing。检索于 2018 年 2 月 12 日,发自 https://github.com/JaeDukSeo/Python_Basic_Image_Processing
  9. Ruder,S. (2018 年 2 月 10 日)。梯度下降优化算法综述。检索于 2018 年 2 月 12 日,发自 http://ruder.io/optimizing-gradient-descent/index.html#adam
  10. 1.(2017 年 7 月 26 日)。自动编码器在面向数据科学的深度神经网络中至关重要。2018 年 2 月 12 日检索,来自https://towardsdatascience . com/auto encoders-is-essential-in-deep-neural-nets-f 0365 b 2 D1 d 7 c
  11. 张,r .,伊索拉,p .,埃夫罗斯,A. A .,谢赫曼,e .,,王,O. (2018)。深度特征作为感知度量的不合理有效性。 arXiv 预印本 arXiv:1801.03924

Only Numpy Medical:使用交互式代码的神经网络对肺部 CT 扫描进行去噪—第 2 部分,卷积神经网络(使用卷积神经网络的低剂量 CT 去噪)

原文:https://towardsdatascience.com/only-numpy-medical-denosing-lung-ct-scans-using-neural-networks-with-interactive-code-part-2-6def73cabba5?source=collection_archive---------5-----------------------

image from pixel bay

所以今天我就继续上图像去噪系列,幸运的是我找到了这篇论文“卷积神经网络低剂量 CT 去噪。在生物医学 Imagi*【n】*由陈虎。因此,让我们深入了解一下它们的实现,看看我们会得到什么结果。最后,为了好玩,让我们使用不同类型的反向传播来比较什么给我们最好的结果。我们将要使用的不同类型的反向传播是…

a.谷歌大脑的梯度噪声

  1. 扩张型反向传播
  2. 扩张型反向传播+谷歌大脑的梯度噪声

如果你不知道它们之间的区别,请阅读我链接的博文。

注:所有的 DICOM 图像均来自 癌症影像存档网 ,如果您打算使用这些数据,请查阅他们的数据使用年龄政策。具体来说,我将使用来自 仿真 FDA 数据集的 DICOM 图像。

网络架构(数学方程形式)

The first two layers of our convolutional NN

The final Layer of Convolutional NN

这篇论文写得有点奇怪,当提到符号时,有时他们用 X 代表 Y,反之亦然。因此,在我最大的能力范围内,我认为我们正在建立一个三层卷积神经网络。两层的激活函数都是 ReLU()激活函数,最后一层没有任何激活函数。

网络架构(OOP 形式)

网络的 OOP 形式非常简单,除了一部分。我们有 4 种情况,记住,我们将使用不同类型的反向传播,看看哪种能给出最好的结果,它们在这里。

这里需要注意的一个非常重要的事实是,每个网络并不是以相同的权重开始的!这可能不是最公平的比较。然而,我决定这样做,看看每个反向传播方法在长期效果中的表现。也就是说,如果它们确实优于另一个,那么无论初始权重如何初始化,网络都会表现得更好。

训练/测试数据

Original Paper link here

如上文中所见,作者(陈虎)将一幅图像分割成独立的图像块。现在,我们不打算使用与本文中完全相同数量的补丁,而是将我们的训练和测试映像分成几个补丁。下面可以看到一个训练图像。

第一行图像 →原始图像和分割补丁
第二行图像 →添加噪声图像和分割补丁

因此,原始图像的尺寸为(512512 ),我们将把图像分成 4 个小块。更具体地说,每个图像块将具有(256256)维。记住这一点,下面是其他训练和测试数据的例子。(此外,我忘了拍摄分割后的原始图像,所以这就是为什么你看不到它们的原因。)

成本函数/反向传播

现在让我们来看看我们将要使用的成本函数。既然这个方程的设定值对我们来说优化它是非常重要的。

现在,请记住这篇论文的符号是混淆的。但我可以有把握地说,我们将使用的成本函数是 L2 范数除以批量数量,而不是 0.5。这可以通过下面的代码来实现。

由于我们的批量大小为 4,(我们将图像分成 4 个不同的空间)我们将使用 0.25。此外,我想在这里指出一件非常重要的事情。

如果我们遵循反向传播的严格规则,我们实际上应该在红框区域乘以 0.5,但是为了稳定,我决定只使第一个梯度更小。(这个决定是在多次不同的尝试和错误之后做出的。)

案例 1:培训和结果

案例 1 是正常的随机梯度下降,如上图所示,可以看到 CT 扫描的整体形状。然而很难看出。右图是用于比较的原始图像之一。

案例二:培训及结果

对于梯度噪声,你可以。看到中间有东西。然而,没有办法告诉这是一个肺部 CT 扫描图像。右图是用于比较的原始图像之一。

案例 3:培训和结果

现在,使用扩张的反向传播,我们可以看到得到的去噪图像看起来非常类似于情况 1 的结果。然而,再次很难准确地说出 CT 扫描中哪个是肺的部分。右图是用于比较的原始图像之一。

案例 4:培训及结果

现在我们可以清楚地看到我们在看什么。然而,它缺乏细节,我的意思是很多细节。如果你把 GIF 和正确的图像进行比较,你几乎分辨不出细节。右图是用于比较的原始图像之一。

互动码

我转到 Google Colab 获取交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

现在运行这段代码有点复杂,因为我使用了自己的数据集。不过,不要担心,我已经将我使用的所有 DICOMs 上传到我的公共 Github (Gitlab 遇到了问题),要访问它请点击这个链接。要访问存储库的主页,请单击此处。现在请按照一步一步的教程。

  1. 从上面的链接下载“lung_data_small_jpg.zip”文件。

2.将 Google Colab 中的代码复制到您自己的游戏中。运行代码时,会弹出一个小按钮,如上所示。(绿色方框)。单击选择文件并选择最近下载的“lung_data_small.zip”文件。

3.该计划将完成上传数据到谷歌 Colab,它将继续运行。

所以记住上面的简短教程,请点击这里访问交互代码。最后,请注意,培训过程非常不稳定,因此每次结果都可能不同。

最后的话

所以我们尝试了两种不同的方法,自动编码器和现在的卷积神经网络。然而,他们都没有给我们一个医学专业人士可以在现实生活中使用的结果。所以传奇仍在继续……

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

同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣,我还在这里做了解耦神经网络的比较。

参考

  1. 患者 CD/DVD DICOM 浏览器。(未注明)。检索于 2018 年 2 月 16 日,来自https://www.radiantviewer.com/
  2. Scipy.ndimage.imread。(未注明)。检索于 2018 年 2 月 16 日,来自https://docs . scipy . org/doc/scipy/reference/generated/scipy . ndimage . im read . html
  3. 陈,洪,张,杨,张,魏,廖,李,周,王,(2017 年 4 月)。基于卷积神经网络的低剂量 CT 去噪。在生物医学成像(ISBI 2017),2017 IEEE 第 14 届国际研讨会上(第 143–146 页)。IEEE。
  4. 如何在 Python 中读取压缩文件夹中的文本文件?(未注明)。检索于 2018 年 2 月 16 日,来自https://stack overflow . com/questions/22646623/how-to-read-text-files-in-a-zipped-folder-in-python
  5. Seo,J. D. (2018 年 1 月 18 日)。only Numpy:Implementing " ADDING GRADIENT NOISE IMPROVES-LEARNING FOR-VERY-DEEP-NETWORKS-with-ADF 23067 F9 f12018 年 2 月 17 日检索自https://becoming human . ai/only-Numpy-Implementing-ADDING-GRADIENT-NOISE-IMPROVES-LEARNING-FOR-VERY-DEEP-NETWORKS-with-ADF 23067 F9 f1】
  6. Seo,j . d .(2018 . 2 . 15)。只有 Numpy:扩张的反向传播和谷歌大脑的梯度噪声与交互代码。检索于 2018 年 2 月 17 日,来自https://hacker noon . com/only-numpy-expanded-back-propagation-and-Google-brains-gradient-noise-with-interactive-code-3a 527 fc 8003 c
  7. Seo,J. D. (2018 年 2 月 13 日)。Only Numpy Medical:使用具有交互代码的神经网络对肺部 CT 扫描进行去噪—第 1 部分…2018 年 2 月 17 日检索自https://towards data science . com/only-Numpy-Medical-de nosing-Lung-CT-Scans-using-auto-encoders-with-Interactive-Code-Part-1-a6c3f 9400246
  8. 越来越多的癌症医学图像档案。(未注明)。检索于 2018 年 2 月 12 日,发自 http://www.cancerimagingarchive.net/
  9. Gavrielides,Marios A,Kinnard,Lisa M,Myers,Kyle J,Peregoy,,Pritchard,William F,曾,荣平,… Petrick,Nicholas。(2015).数据来自 Phantom_FDA。癌症影像档案。http://doi.org/10.7937/K9/TCIA.2015.ORBJKMUX

Only Numpy: NIPS 2017 -用交互式代码实现扩张型递归神经网络。

原文:https://towardsdatascience.com/only-numpy-nips-2017-implementing-dilated-recurrent-neural-networks-with-interactive-code-e83abe8c9b27?source=collection_archive---------4-----------------------

Image from Pixel Bay

所以我在浏览 2017 年的 NIPS,出版页面时发现了这篇论文, IBM 沃森研究中心的扩张的递归神经网络。所以试图实现它,并用它来对 MNIST 数字进行分类。

网络架构(数学方程式形式/图形形式 2D)

Image from Original Paper

现在这个方程在数学方程的形式上有点复杂,难以理解。所以论文的作者给我们提供了一些图表。

如上所述,这是典型的 RNN,但有多个层以及跳过连接。

网络架构(图形形式 3D / OOP 形式)

Side view

Front View

红圈 →网络的最终输出,预测数的一个热编码的(1*10)向量

棕色圆圈 →第 2 层隐藏状态 0
石灰圆圈 →第 2 层隐藏状态

粉色圆圈→1 层隐藏状态 0
黑色圆圈→1 层隐藏状态

蓝色数字 1、2、3、4、5 →每个时间戳的输入(请记下这一点,因为我将使用这些知识来解释训练/测试数据)

以上是我们要建立的网络,第一层是标准的 RNN,没什么特别的,然而第二层有点不同,它有间隔为 2 的跳跃连接。

以上是面向对象的网络形式,正如我们所看到的,我们只有一个简单的前馈函数和一个标准的反向传播函数。

训练数据/测试数据

粉色框 →时间戳 1 处输入(矢量化 1414 像素图像)
黄色框 →时间戳 2 处输入(矢量化 14
14 像素图像)
蓝色框 →时间戳 3 处输入(矢量化 1414 像素图像)
紫色框 →时间戳 4 处输入(矢量化 14
14 像素图像)
绿色框

这就是我所做的,我取原始图像(2828),用(22)矩阵进行均值合并,得到(1414)的图像。我们将用它作为时间戳 1 的输入。对于其他时间戳的输入,我们将把原始(2828)图像切割成 4 个部分,并将其提供给网络。下面是实现这一点的代码。

记住这一点,让我们看看其他的训练数据。最后,我这样做的原因,简单来说,我想 LOL。

Image of 3 6 4 in the respective order

训练和结果

看一下成本随时间变化的图表,我们可以看到,网络从 4.0 区域开始,并且能够将成本降低到 1.7。

然而,准确预测的数量只有 68/100,给了我们 68%的准确率。我认为把图片分成 4 部分是个坏主意,哈哈。

互动码

我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

请点击此处访问互动代码。

遗言

我实际上有更多的计划在不同的实验中使用这个网络架构,所以如果你想得到:D 的通知,请确保在推特上关注我

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

与此同时,请在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣,我也在这里做了解耦神经网络的比较。

参考文献

  1. 常,张,杨,韩,魏,余,米,郭,陈,谭,黄,黄铁生(2017)。扩张的循环神经网络。神经信息处理系统的进展。
  2. [1]2018.【在线】。可用:https://www . quora . com/What-the-benefit-of-use-average-pooling-而非-max-pooling。【访问时间:2018 年 2 月 7 日】。
  3. [3]S. Chang,Y. Zhang,W. Han,M. Yu,X. Guo,W. Tan,X. Cui,M. Witbrock,M. Hasegawa-Johnson 和 T. Huang,“扩张型递归神经网络”, Papers.nips.cc ,2018 .【在线】。可用:https://papers . nips . cc/paper/6613-expanded-recurrent-neural-networks。【访问时间:2018 年 2 月 14 日】。
  4. IBM 托马斯·J·沃森研究中心。(未注明)。检索于 2018 年 2 月 14 日,来自http://www.research.ibm.com/labs/watson/index.shtml

只有 Numpy:理解反向传播的转置卷积多层 CNN 的例子和互动代码。

原文:https://towardsdatascience.com/only-numpy-understanding-back-propagation-for-transpose-convolution-in-multi-layer-cnn-with-c0a07d191981?source=collection_archive---------1-----------------------

Gif from this website

所以在过去的两天里,我很难理解转置卷积运算。但我终于明白了,今天,我们将训练一个简单的 CNN,它有两个卷积层,如下所示。

Very Simple CNN Arch.

我从哪里得到答案的有趣故事。

昨天,我被邀请参加一个聚会的晚宴。原因是一个非常博学的硕士生成功地完成了她的答辩,所以我们在庆祝。然而,在过去的两天里,我无法完全理解 CNN 的整个反向传播过程。
当我试图在卷积层的最外层执行反向传播时,我碰了壁。

但在那次晚宴上,我终于明白了。

看着我盘子里的鸡眼,我意识到,一直以来,我都在试图将 CNN 中的反向传播过程理解为反卷积。这是我最初的想法。

设红框为 22 输出图像
设绿框为 3
3 内核
设蓝框为 4*4 输入图像

由于我们在对 4×4 图像执行卷积之后获得 2×2 输出图像,因此,在执行反向传播时,我们需要对 2×2 输出图像执行一些操作,以获得具有 4×4 维度的一些图像。

但是鸡眼(LOL)让我意识到我们的目标不是恢复原来的形象。相反,我们试图得到网络中每个权重的错误率。在多层 CNN 的情况下,我们需要反向传播该误差。所以哈哈,这就是我的解决方案,让我用一个具体的例子和代码来解释我的意思。

网络架构

如上所见,网络拱非常简单,只是两层卷积和一层全连通层。请注意,在执行卷积时,我们需要将内核转置(旋转)180 度,所以请注意上面照片中的绿色方框。

还有,请注意,为了简单起见,我没有画激活层。但是在交互代码中,我用的不是 tanh()就是 archtan()

image from techieme

如果你不确定矩阵旋转,请阅读本文。

正向进给操作操作

更新我在列上犯了一个错误,绿色箭头所指的两列必须对调。谢谢亚伯拉罕·坎指出。

所以如上所见,卷积运算可以写成一行。出于我稍后将解释的原因,请仔细记下红框变量,它们基本上是下一层的输入。但是在执行反向传播时,这些信息变得至关重要。

相对于绿色权重的反向传播

黄色方框表示学习率,同样,整个反向传播是一个标准过程。我也写下了梯度更新方程。最后,请注意红色方框中的符号“k ”,我会反复使用这个符号来表示(Out — Y)。

相对于红色权重的反向传播

红框→ (Out — Y)
黄框→学习率
黑框→卷积运算前旋转核 180 度(或转置)——还记得在卷积运算中我们旋转核吗?

一切都非常简单明了,除了紫色的盒子,那是什么?

紫色框→旋转矩阵以拟合计算每个权重的导数。

现在的问题是,为什么?我们为什么要这样做?

记得我告诉过你们要注意每一层的输入吗?让我们再来一次。

请仔细看看这些彩色的盒子。

橙色框 →正在乘以红色 W(2,2)的输入
浅绿色框 →正在乘以红色 W(2,1)的输入
蓝色框 →正在乘以红色 W(1,2)的输入
粉色框 →正在乘以红色 W(1,1)的输入

很好,这很简单,但是这和转置内核有什么关系呢?好吧,让我们这样做,因为(请看黑框等式)Out 可以写成一行,让我们对红色权重求导,如下所示。

*更新 * 4 月 8 日—感谢大宇和亚伯拉罕·康指出错误,坐标上有个小错误。

深绿色方框数字→对不起,我没有绿色的笔,但它们代表绿色的砝码**。**

如图所示,当对每个红色权重进行求导时,我们可以看到 XX 坐标因输入而异。我们需要根据每个权重来匹配这些坐标,这就是我们将矩阵旋转(转置)180 度的原因。

关于蓝色重量部分 1 的反向传播

蓝框 →计算(K *绿色权重)和(填充的红色权重)之间的卷积
橙色框 →再次旋转矩阵以获得每个权重的导数。
黑盒 →同样的故事,卷积运算前旋转内核。

现在,问题来了,为什么要填充(紫色方框)?为什么我们需要垫红色的砝码?

好问题,我一会儿会解释,但是现在请继续读下去。

关于蓝色重量部分 2 的反向传播

蓝框 →第 1 部分的计算矩阵。
黑盒 →卷积运算前转置内核。
橙色、浅绿色、蓝色、粉色方框 →计算每个蓝色权重的每个导数。

Close look of the Rotated Kernel

上图是在执行卷积运算时,对旋转后的内核的近距离观察。但是现在让我们再看一下输入。

再说一次,因为 Out 可以写成一行,让我们对蓝色权重求导,如下所示。

绿色框号 →再次抱歉没有绿色笔
橙色框 →相对于蓝色权重(2,2)计算的渐变
粉色框 →相对于蓝色权重(1,1)计算的渐变

因此,我们再次旋转(或转置)矩阵,以匹配每个权重的梯度。

另外,现在我们填充红色重量的原因很清楚了,这是为了得到每个重量的梯度,我将再次向你们展示我所说的填充红色重量的意思。(请看紫色的星星)

交互式代码激活功能

绿框 →激活函数的导数,因为它们具有相同的维数,我们可以只执行元素乘法

红框 →旋转内核匹配渐变

蓝色方框 →用零填充红色砝码(名为 W2)

交互代码

请点击此处访问互动代码。

最后的话

在 CNN 中理解反向传播是非常令人满意的,我两天来一直在努力理解这个概念。如果没有被邀请参加毕业晚宴,我是不可能做到这一点的,谢谢你,莎拉!

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣,我还在这里做了解耦神经网络的比较。

参考

  1. D.(2015 年 10 月 25 日)。矩阵旋转和矩阵转置。检索于 2018 年 1 月 28 日,发自http://techieme.in/matrix-rotation/
  2. 什么是反进化层?(未注明)。检索于 2018 年 1 月 28 日,来自https://data science . stack exchange . com/questions/6107/what-is-de convolution-layers
  3. http://courses . cs . tau . AC . il/Caffe _ workshop/boot camp/pdf _ lectures/lectures % 203% 20 CNN % 20-% 20 back propagation . pdf
  4. Dumoulin 和 f . Visin(2016 年)。深度学习卷积算法指南。 arXiv 预印本 arXiv:1603.07285
  5. https://www . cc . gatech . edu/classes/ay 2018/cs 7643 _ fall/slides/L7 _ CNNs _ annotated . pdf

这篇文章发表在 The Startup 上,这是 Medium 最大的创业刊物,拥有 295,232+人关注。

在此订阅接收我们的头条新闻。

Only Numpy:通过时间实践推导反向传播的普通递归神经网络—第 1/2 部分

原文:https://towardsdatascience.com/only-numpy-vanilla-recurrent-neural-network-back-propagation-practice-math-956fbea32704?source=collection_archive---------3-----------------------

这是我在 Medium 发表的第一篇正式的教育文章,我不得不说 Medium 是一个非常棒的博客平台。不管怎样,我们开始吧。问题很简单,我们将使用 RNN 来计算给定数据中有多少个 1。如果你只是想要视频教程和代码,请点击下面的链接。

Github 链接:https://github . com/JaeDukSeo/Only _ Numpy _ Basic/blob/master/rnn/a _ rnn _ simple . py

如上文(a)所示,训练数据是 X,测试数据是 Y(地面实况)。(b)我们将只有两个权重,Wx(其中我们将乘以输入 x)和 Wrec(其中我们将乘以先前的状态)

理解(c)非常重要,因为我们的网络架构是我们网络架构的展开版本。然而,它清楚地显示了状态 0(表示为 S0)与状态 1(表示为 S1)具有某种关系。那关系如下图!

在(E)下,我们可以看到一个等式,它阐明了状态之间的关系。

当前状态 K =先前状态 K * Wrec +当前输入 X * Wx

这条数学线是状态 0 和状态 1 之间的关系。但是每个州下面的数字呢?很简单,这些是每个状态的输入,所以在状态 1,输入 x 是一个向量[0,0,1]。

Same Color Box indicate inputs at each state

你可能会问,状态 0 呢?大问题他们全是零!

所以让我们用数学来弄脏——前馈。

就是这样!我们完成了前馈传播。另外,还有一点需要注意的是,我们将使用 MSE 作为成本函数,从现在开始,我们将只使用星号旁边的符号来表示成本函数。(抱歉我不是数学专业的,我不知道那个符号叫什么。)

现在让我们通过时间执行反向传播。我们必须对每个状态的 Wx 和 Wrec 求导。而这正是我们下面所做的!

原来如此!训练 RNN 背后的简单数学。但是,尽量自己填状态 1。但是有一个有趣的事实需要注意,当得到 Wx 和 Wrec 的导数时,有很多数学符号会随着时间的推移而重复出现,请看下图。

在矩阵中得到那些重复的值,并在以后通过乘以适当的 X 或 State 来使用它们,这在计算上会更有效。这正是我在视频教程中所做的!

Calculate the repeating terms

另一个需要注意的重要事情是,当我们得到导数时,我们要乘以 Wrec 的倍数,换句话说,变量起着关键作用!(我不打算进一步解释,但这个话题很重要!)

最后,让我们通过随机梯度下降来执行权重更新。

在右上角,我们相应地将各项相加,并执行 SGD。

更新!下面是第二部分: [链接](http://Only Numpy: Vanilla Recurrent Neural Network Deriving Back propagation Through Time Practice — part 1/2)

最后提醒一下,我用了很多彼得的素材!请点击下面的链接查看这个令人惊奇的教程!这是我的第一篇帖子,我仍在学习如何制作优秀的教程,任何反馈都将是有益的!
【请客气:’(]谢谢!

[## 彼得的笔记

关于人工智能、机器学习、神经网络的笔记和代码样本

peterroelants.github.io](http://peterroelants.github.io/posts/rnn_implementation_part01/#Updating-the-parameters)

更多教程请查看我的网站和我的 Youtube 频道!

网址:https://jaedukseo.me/

YouTube 频道:https://www.youtube.com/c/JaeDukSeo

[## 宰德徐- DJ 徐

嗨,我叫 Jae,我爱机器学习,请进来看看吧!数据科学家 Jae 的个人网站…

jaedukseo.me](https://jaedukseo.me/) [## 宰德徐

你好!我叫 Jae,这是我的 youtube 频道。我喜欢狗和人工智能,医疗保健和区块链…

www.youtube.com](https://www.youtube.com/channel/UCf5jue1EwgWrYw9bjTynV4g/featured?view_as=subscriber)

本体论和数据科学

原文:https://towardsdatascience.com/ontology-and-data-science-45e916288cc5?source=collection_archive---------1-----------------------

对现有数据的研究如何帮助我们成为更好的数据科学家。

Photo by Valentin Antonucci from Pexels

如果你是本体这个词的新手,不要担心,我将给出它是什么的初级读本,以及它对数据世界的重要性。我将明确哲学本体论和与计算机科学中的信息和数据相关的本体论之间的区别。

本体论(哲学部分)

简而言之,人们可以说本体论是对现有事物的研究。但是这个定义的另一部分将在下面的章节中帮助我们,那就是本体通常也被认为包含了关于存在的实体的最一般的特征和关系的问题。

存在论为存在者打开了新的大门。我给你举个例子。

量子力学开启了对现实和自然界“存在”什么的新观点。对于 1900 年代的一些物理学家来说,量子形式主义中根本不存在现实。在另一个极端,有许多量子物理学家持截然相反的观点:单一演化的量子态完全描述了真实的现实,这意味着几乎所有的量子选择都必须继续共存(叠加)。从而让整个世界对自然界中“存在”的“事物”有了新的认识和理解。

但是让我们回到定义中的实体关系部分。有时当我们谈论实体及其关系时,本体论被称为形式本体论。这些理论试图给出某些实体的属性和关系的精确数学公式。这种理论通常提出关于这些问题实体的公理,用基于某种形式逻辑系统的某种形式语言来阐明。

这将允许我们做一个量子跳跃到文章的下一部分。

https://xkcd.com/1240/

本体(信息和计算部分)

如果我们从上面带回形式本体论的定义,然后我们想到数据和信息,就有可能建立一个框架来研究数据及其与其他数据的关系。在这个框架中,我们以一种特别有用的方式来表示信息。以特定的形式本体表示的信息可以更容易地被自动化信息处理所访问,如何最好地做到这一点是像数据科学这样的计算机科学中的一个活跃的研究领域。这里使用的形式本体是具象。它是一个表示信息的框架,因此,无论实际上使用的形式理论是否真正描述了实体的领域,它在表示上都是成功的。

现在是一个很好的机会来看看本体如何在数据科学世界中帮助我们。

如果你还记得我上一篇关于语义技术的文章:

[## 面向大众的深度学习(…和语义层)

深度学习现在无处不在,在你的手表里,在你的电视里,在你的电话里,在某种程度上,在你的平台上…

towardsdatascience.com](/deep-learning-for-the-masses-and-the-semantic-layer-f1db5e3ab94b)

我谈到了关联数据的概念。链接数据的目标是以一种易于使用和与其他链接数据组合的方式发布结构化数据。我还讨论了知识图的概念,它包含数据和信息的集成集合,还包含不同数据之间的大量链接。

所有这些定义中缺失的概念是本体论。因为这是我们连接实体和理解它们之间关系的方式。有了本体,我们可以实现这样的描述,但首先我们需要正式地指定组件,如个体(对象的实例)、类、属性和关系,以及限制、规则和公理。

下面是解释上述段落的一种象形方法:

https://www.ontotext.com/knowledgehub/fundamentals/what-are-ontologies/

数据库建模和本体

目前,大多数采用数据建模语言(如 SQL)的技术都是按照严格的“构建模型,然后使用模型”的思维方式设计的。

例如,假设您想要更改关系数据库中的属性。你以前认为财产是单值的,但现在它需要多值。对于几乎所有的现代关系数据库,这种改变需要您删除该属性的整个列,然后创建一个全新的表来保存所有这些属性值和一个外键引用。

这不仅工作量很大,而且还会使任何处理原始表的索引失效。它还会使用户编写的任何相关查询无效。简而言之,做出这样的改变是非常困难和复杂的。通常情况下,这样的改变是如此的麻烦,以至于根本就没有进行过。

相比之下,本体语言中的所有数据建模语句(以及其他所有东西)本质上都是增量的。事后增强或修改数据模型可以很容易地通过修改概念来实现。

从 RDBS 到知识图谱

到目前为止,我发现将您的数据湖转换为智能数据湖的最简单的框架是 Anzo。这样,您就可以向完全连接的企业数据结构迈出第一步。

数据结构是支持公司所有数据的平台。它是如何被管理、描述、组合和普遍访问的。该平台由企业知识图构成,以创建统一的数据环境。

这种数据结构的形成首先需要在你所拥有的数据之间创建本体。这种转变也可以认为是从传统数据库到图形数据库+语义的转变。

根据剑桥语义公司的这个展示,图形数据库有用有三个原因:

  1. 图形数据库产品在功能和多样性方面越来越成熟
  2. 图形的应用已经超越了经典的图形问题
  3. 复杂数据的数字转换需要图形

因此,如果您将这种优势与建立在本体上的语义层联系起来,您可以从拥有这样的数据开始:

https://www.slideshare.net/camsemantics/the-year-of-the-graph

对此

https://www.slideshare.net/camsemantics/the-year-of-the-graph

其中有一种人类可读的数据表示,可以用常见的业务术语唯一地标识和连接数据。这一层帮助最终用户自主、安全、自信地访问数据。

然后,您可以创建复杂的模型来发现不同数据库中的模式。

https://www.slideshare.net/camsemantics/the-year-of-the-graph

在其中,你有代表实体间关系的本体。也许这样一个本体论的例子在这里会很好。这是从

[## 什么是本体,我为什么想要本体?-企业知识

本体和语义技术再次流行起来。它们是 21 世纪初的热门话题,但是…

enterprise-knowledge.com](https://enterprise-knowledge.com/what-is-an-ontology/)

让我们创建一个关于您的员工和顾问的本体:

在本例中,Kat Thomas 是一名顾问,他正在与 Bob Jones 合作一个销售流程重新设计项目。凯特在咨询公司工作,鲍勃向爱丽丝·雷迪汇报工作。我们可以通过这个本体推断出很多信息。由于销售流程重新设计是关于销售的,我们可以推断 Kat Thomas 和 Bob Jones 在销售方面有专长。咨询公司也必须提供这方面的专业知识。我们还知道 Alice Reddy 可能负责 Widgets,Inc .的某个方面的销售,因为她的直接下属正在从事销售流程重新设计项目。

当然,您可以在带有主键的关系数据库中使用它,然后创建几个连接来获得相同的关系,但这更直观,也更容易理解。

令人惊奇的是,Anzo 将连接到您的数据湖(意味着 HDFS 或甲骨文或其他公司内部的大量数据),并自动为您创建这个图表!然后你可以自己去添加或者改变本体。

数据科学的未来(只有明年 lol)

在本文中:

[## 人工智能,数据科学,分析 2018 年的主要发展和 2019 年的主要趋势

和过去一样,我们为您带来专家的预测和分析综述。我们问了主要的是什么…

www.kdnuggets.com](https://www.kdnuggets.com/2018/12/predictions-data-science-analytics-2019.html)

我谈到了未来几年数据科学(可能)会发生什么。

对我来说,2019 年的主要趋势是:

  • AutoX:我们将看到更多的公司开发并在其栈技术和库中包含自动机器和深度学习。这里的 X 表示这个自动化工具将扩展到数据摄取、数据集成、数据清理、探索和部署。自动化将会继续存在。
  • 语义技术:今年对我来说最有趣的发现是 DS 和语义之间的联系。这在数据世界中并不是一个新的领域,但是我看到越来越多的人对语义、本体、知识图及其与 DS 和 ML 的联系感兴趣。
  • 编程更少:这很难说,但是随着 DS 过程中几乎每一步的自动化,我们每天的编程会越来越少。我们将拥有创建代码的工具,这些工具将理解我们想要 NLP 做什么,然后将其转化为查询、句子和完整的程序。我觉得[编程]还是一个很重要的东西要学,但是很快就会更容易了。

这是我写这篇文章的原因之一,试图跟踪整个行业正在发生的事情,你应该意识到这一点。在不久的将来,我们将减少编程,更多地使用语义技术。更接近我们的思考方式。我的意思是你认为在关系数据库?我并不是说我们用图表来思考,但是在我们的头脑和知识图表之间传递信息要比创建怪异的数据库模型容易得多。

对这个有趣的话题,我期待更多。如果您有任何建议,请告诉我:)

如果您有任何问题,请在 Twitter 上关注我:

[## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特

Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…

twitter.com](https://twitter.com/faviovaz)

和 LinkedIn:

[## favio vázquez——science ia y Datos | LinkedIn 创始人

查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 16 个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)

那里见:)

用于 SD-WAN 链接选择的开放 AI 健身房

原文:https://towardsdatascience.com/open-ai-gym-for-sd-wan-link-selection-fe7dac671172?source=collection_archive---------9-----------------------

Credit: NVIDIA blog (https://blogs.nvidia.com/blog/2018/04/30/nvail-deep-learning-iclr/

强化学习已经成功地应用于机器人和玩电脑游戏。它在网络领域中的应用令人鼓舞,用于解决无线接入网络中的资源分配(Comsa 等人),用于优化 WAN 和资源(Xiu 等人),用于 SDN 中的路由优化(Stampa 等人),并且该列表还在不断增长。在这篇文章中,我试图探索用强化学习来解决 SD-WAN 网络中一个非常相关的问题,即链路选择的想法。链路选择是 SD-WAN 解决方案的关键组成部分,是其解决方案的核心。在应用强化学习之前,需要模拟 SD-WAN 环境,以便 RL 算法通过反复试验来学习最佳行为。传统上,这些模拟被称为健身房,这是 openAI (gym.openai.com)创造的一个术语。在这篇文章中,我提出了如何编写一个 gym 来解决 SD-WAN 链路选择实验的想法。在这个体育馆上应用不同 RL 算法的结果将在后续文章中给出。

什么是 SD-WAN

软件定义的广域网(SD-WAN)提供了一种基于软件的覆盖架构,该架构基于传统广域网硬件上的软件定义的网络(SDN)技术。这简化了网络管理,将控制层移至云端,实现了网络虚拟化。(参考: sdxcentral )

SD-WAN 在分支机构站点和企业数据中心之间提供两条或多条备用路径,如下所示。动态成本优化来自于将流量从私有 MPLS 云切换到更便宜的公共互联网服务。对于 SD-WAN 网络而言,如何决定何时进行链路切换以及切换频率至关重要。进行关于 QOS 参数的连续测量来得出这个决定。(参考: JuniperNetworks )

Credit: https://www.sdxcentral.com/sd-wan/definitions/essentials-sd-wan-architecture/

什么是强化学习及其在 SD-WAN 中的应用

强化学习是一种机器学习,其中代理正在学习如何通过试验环境提供的各种选项来最好地利用周围环境。通过尝试不同的行动,代理人学会优化他从环境中获得的回报。(reinforcementlearning.ai-depot.com)

下图描述了典型的强化学习设置。代理正在与环境交互并尝试不同的动作。环境保持其状态,并由于与代理的交互而经历不同的状态变化,并提供回报。每一个强化学习系统都有一个目标,代理人通过试错来学习实现目标。代理的目标是通过学习一组最优动作来最大化这种回报。

Credit: Sutton and Barto

这种强化学习与 SD-WAN 的相关性可以通过一个实验来思考,在该实验中,代理正在切换 WAN 链路并试图最大化带宽利用率。这是通过在有足够带宽可用时切换到互联网云,然后在 QOS 数量开始下降时切换回 MPLS 来实现的。如何实现这种链路交换,从而以最小的 MPLS 链路利用率获得最佳带宽是目标。

开放式人工智能健身房

Gym 是一个工具包,它为代理提供了一个平台,让他们在定制的环境中尝试和学习最佳行为。有像“翻筋斗”、“钟摆”和“山地车”等游乐场。

与健身房的典型互动如下所示

import gym env = gym.make('CartPole-v0')

env.reset()

for _ in range(1000):

env.render()

env.step(env.action_space.sample()) *# take a random action*

上面的每一步都返回四个值。这些是

1)“观察”——这实质上是捕捉环境的状态。

2)“奖励”——通过“行动”获得的衡量奖励。

3)“完成”——剧集是否完成

4)‘信息’—杂项信息

(更多见 https://gym.openai.com/docs/

SD-WAN 的环境

任何健身房都是一个模拟环境,代理人可以尝试不同的动作并获得奖励。对于 SD-WAN,我们需要模拟所谓的“分支机构”和“总部”之间的 WAN 网络。在这个简化的网络中,存在两条备用路径,一条经由专用 MPLS 电路,另一条经由公共互联网。对于网络模拟,存在不同的技术,如 NS3、mininet 等。我选择 mininet 是因为它的简单性和对 SDN 应用的适用性。(更多信息见 mininet.org)。

在下面的设计中,我们有两个路由器 R1 和 R2,分别代表分支边缘路由器和总部边缘。

核心路由器 C1 代表 MPLS 路径,C2 代表公共互联网。目标是将流量从分支机构的主机 H1 发送到总部的主机 H2。我们还从主机 N1 向 N2 发送额外的流量,这模拟了互联网专用路径中的其它流量。

对环境的观察(或状态)

我选择了以下任一时间点的实验状态('打勾')。请注意,这些是在实验开始时以及代理采取任何“行动”时的任何“步骤”中测量的。

1)当前带宽——通过任何路径(如 MPLS 或公共互联网)获得的带宽量

2)可用带宽—这是互联网云中可用的带宽。假设 MPLS 路径有足够的带宽来满足任何需求。

3)链路 Id——在任何时刻传输流量的链路。

尽管像“延迟”和“抖动”这样的 QOS 参数在 SLA 管理中起着很大的作用,但我并没有从这里开始考虑它们。这些将在以后添加,以增强模型的实际用途。

行动

该代理的动作将是在 MPLS 和因特网之间进行选择。有两个独立的操作—链路 0(互联网)和链路 1 (MPLS)。任何动作及其状态转换都没有随机性。一条链路到另一条链路的切换是确定性的。

奖励设计

奖励是设计的关键部分,强化学习算法的性能在很大程度上依赖于奖励的设计方式。在设计奖励时,我必须牢记系统的目标。这里,SD-WAN 的目标是最大化互联网路径的带宽利用率,这是一个更便宜的选择。以下是设计奖励时要牢记的一些原则——

1)必须不惜任何代价维持 SLA,因此当前达到的带宽应该总是超过 SLA 规定的限制。当带宽低于 SLA 限制时,奖励应该被设计成严厉惩罚这样的失误。

  1. MPLS 电路不是成本有效的,因此奖励应该阻止它的使用

3)上述的另一面是,互联网电路应该更经常地被使用。

4)无论做出何种选择,目标都是维持交通流量。所以每次‘滴答’都应该带来最小的正回报。

插曲

强化学习的实验有一个插曲的概念,意思是当实验或游戏被获胜的一方结束时。在 SD_WAN 的这个实验中,没有赢的这回事。数据传输可以无限期地进行,但是为了实验的目的,已经设计了最大滴答的人为限制。当“滴答”的次数超过这个限制时,就认为该事件结束了。

这一集还有另一种结束方式,那就是错误。每当连续两个时间“滴答”未满足 SLA 带宽时,就判定该事件已经结束,代理必须重新开始。

履行

SD_WAN 健身房已经使用 OpenAI 提供的指南实现(这里是关于如何实现定制健身房的信息—https://github . com/open ai/gym/tree/master/gym/envs # how-to-create-new-environments-for-gym)

SD-WAN 健身房代码已在 github(【https://github.com/amitnilams/sdwan-gym】T2)签到

一些简单的实验已经在健身房进行,以设定一些基线。像“深度 Q 学习”或“演员评论”这样的高级算法应该应用于这些基线。这个健身房的一个局限是它仍然是单代理环境。它不能用于多代理算法 A3C 算法。

确定性实验

对于确定性情况,只要当前带宽低于 SLA 限制,我们就需要选择 MPLS 电路。SLA 限制是环境的一部分,不会通过“观察”或状态来揭示。换句话说,这个实验知道这个模型的一切,以及奖励是如何设计的,等等。在选择行动的算法中没有随机性。这是一集的一些输出(最大滴答数= 30)

2018-12-06 11:28:40,296 - root - INFO - SdwanEnv - Version 0.1.0

('Initial State:', (0, '11.0', 0.0))

2018-12-06 11:29:11,627 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 1, 'Action:', 1, 'Ob:', (1, 10.0, 5.09), 'R:', -1, 'Total Reward:', -1)

2018-12-06 11:29:26,655 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 2, 'Action:', 1, 'Ob:', (1, 10.0, 3.3899999999999997), 'R:', -1, 'Total Reward:', -2)

2018-12-06 11:29:41,680 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 3, 'Action:', 1, 'Ob:', (1, 10.0, 6.34), 'R:', -1, 'Total Reward:', -3)

2018-12-06 11:29:56,719 - root - INFO - current bw:4.94, sla bw:6.0

2018-12-06 11:29:56,719 - root - INFO - BW is less than SLA

('Ticks:', 4, 'Action:', 0, 'Ob:', (0, '4.94', 4.19), 'R:', -4, 'Total Reward:', -7)

2018-12-06 11:30:11,768 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 5, 'Action:', 1, 'Ob:', (1, 10.0, 4.73), 'R:', -1, 'Total Reward:', -8)

2018-12-06 11:30:26,794 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 6, 'Action:', 1, 'Ob:', (1, 10.0, 5.34), 'R:', -1, 'Total Reward:', -9)

2018-12-06 11:30:41,820 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 7, 'Action:', 1, 'Ob:', (1, 10.0, 8.05), 'R:', -1, 'Total Reward:', -10)

2018-12-06 11:30:56,889 - root - INFO - current bw:7.76, sla bw:6.0

('Ticks:', 8, 'Action:', 0, 'Ob:', (0, '7.76', 6.2), 'R:', 2, 'Total Reward:', -8)

2018-12-06 11:31:11,915 - root - INFO - current bw:6.36, sla bw:6.0

('Ticks:', 9, 'Action:', 0, 'Ob:', (0, '6.36', 5.27), 'R:', 2, 'Total Reward:', -6)

2018-12-06 11:31:26,963 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 10, 'Action:', 1, 'Ob:', (1, 10.0, 6.77), 'R:', -1, 'Total Reward:', -7)

2018-12-06 11:31:42,018 - root - INFO - current bw:5.92, sla bw:6.0

2018-12-06 11:31:42,018 - root - INFO - BW is less than SLA

('Ticks:', 11, 'Action:', 0, 'Ob:', (0, '5.92', 4.89), 'R:', -4, 'Total Reward:', -11)

2018-12-06 11:31:57,045 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 12, 'Action:', 1, 'Ob:', (1, 10.0, 7.029999999999999), 'R:', -1, 'Total Reward:', -12)

2018-12-06 11:32:12,113 - root - INFO - current bw:4.80, sla bw:6.0

2018-12-06 11:32:12,114 - root - INFO - BW is less than SLA

('Ticks:', 13, 'Action:', 0, 'Ob:', (0, '4.80', 4.15), 'R:', -4, 'Total Reward:', -16)

2018-12-06 11:32:27,196 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 14, 'Action:', 1, 'Ob:', (1, 10.0, 4.4), 'R:', -1, 'Total Reward:', -17)

2018-12-06 11:32:42,219 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 15, 'Action:', 1, 'Ob:', (1, 10.0, 6.029999999999999), 'R:', -1, 'Total Reward:', -18)

2018-12-06 11:32:57,263 - root - INFO - current bw:7.21, sla bw:6.0

('Ticks:', 16, 'Action:', 0, 'Ob:', (0, '7.21', 6.91), 'R:', 2, 'Total Reward:', -16)

2018-12-06 11:33:12,279 - root - INFO - current bw:4.68, sla bw:6.0

2018-12-06 11:33:12,280 - root - INFO - BW is less than SLA

('Ticks:', 17, 'Action:', 0, 'Ob:', (0, '4.68', 3.7800000000000002), 'R:', -4, 'Total Reward:', -20)

2018-12-06 11:33:27,321 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 18, 'Action:', 1, 'Ob:', (1, 10.0, 6.720000000000001), 'R:', -1, 'Total Reward:', -21)

2018-12-06 11:33:42,360 - root - INFO - current bw:9.54, sla bw:6.0

('Ticks:', 19, 'Action:', 0, 'Ob:', (0, '9.54', 8.15), 'R:', 2, 'Total Reward:', -19)

2018-12-06 11:33:57,388 - root - INFO - current bw:4.12, sla bw:6.0

2018-12-06 11:33:57,388 - root - INFO - BW is less than SLA

('Ticks:', 20, 'Action:', 0, 'Ob:', (0, '4.12', 3.51), 'R:', -4, 'Total Reward:', -23)

2018-12-06 11:34:12,416 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 21, 'Action:', 1, 'Ob:', (1, 10.0, 2.5700000000000003), 'R:', -1, 'Total Reward:', -24)

2018-12-06 11:34:27,441 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 22, 'Action:', 1, 'Ob:', (1, 10.0, 6.33), 'R:', -1, 'Total Reward:', -25)

2018-12-06 11:34:42,478 - root - INFO - current bw:8.97, sla bw:6.0

('Ticks:', 23, 'Action:', 0, 'Ob:', (0, '8.97', 7.57), 'R:', 2, 'Total Reward:', -23)

2018-12-06 11:34:57,505 - root - INFO - current bw:6.57, sla bw:6.0

('Ticks:', 24, 'Action:', 0, 'Ob:', (0, '6.57', 5.42), 'R:', 2, 'Total Reward:', -21)

2018-12-06 11:35:12,538 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 25, 'Action:', 1, 'Ob:', (1, 10.0, 3.84), 'R:', -1, 'Total Reward:', -22)

2018-12-06 11:35:27,564 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 26, 'Action:', 1, 'Ob:', (1, 10.0, 4.27), 'R:', -1, 'Total Reward:', -23)

2018-12-06 11:35:42,582 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 27, 'Action:', 1, 'Ob:', (1, 10.0, 2.95), 'R:', -1, 'Total Reward:', -24)

2018-12-06 11:35:57,606 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 28, 'Action:', 1, 'Ob:', (1, 10.0, 6.49), 'R:', -1, 'Total Reward:', -25)

2018-12-06 11:36:12,646 - root - INFO - current bw:6.90, sla bw:6.0

('Ticks:', 29, 'Action:', 0, 'Ob:', (0, '6.90', 5.69), 'R:', 2, 'Total Reward:', -23)

2018-12-06 11:36:27,681 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 30, 'Action:', 1, 'Ob:', (1, 10.0, 5.34), 'R:', -1, 'Total Reward:', -24)

Episode finished after 30 timesteps

随机实验

这个实验的逻辑很简单。它对奖励是如何设计的一无所知,随机尝试一个动作,并希望得到最好的结果。以下是典型剧集的一些输出(最大滴答数= 30)

2018-12-06 11:38:11,893 - root - INFO - SdwanEnv - Version 0.1.0

('Initial State:', (0, '10.3', 0.0))

2018-12-06 11:38:43,886 - root - INFO - current bw:5.96, sla bw:6.0

2018-12-06 11:38:43,887 - root - INFO - BW is less than SLA

('Ticks:', 1, 'Action:', 0, 'Ob:', (0, '5.96', 5.09), 'R:', -4, 'Total Reward:', -4)

2018-12-06 11:38:58,917 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 2, 'Action:', 1, 'Ob:', (1, 10.0, 3.3899999999999997), 'R:', -1, 'Total Reward:', -5)

2018-12-06 11:39:13,947 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 3, 'Action:', 1, 'Ob:', (1, 10.0, 6.34), 'R:', -1, 'Total Reward:', -6)

2018-12-06 11:39:28,986 - root - INFO - current bw:5.08, sla bw:6.0

2018-12-06 11:39:28,987 - root - INFO - BW is less than SLA

('Ticks:', 4, 'Action:', 0, 'Ob:', (0, '5.08', 3.9299999999999997), 'R:', -4, 'Total Reward:', -10)

2018-12-06 11:39:44,027 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 5, 'Action:', 1, 'Ob:', (1, 10.0, 4.73), 'R:', -1, 'Total Reward:', -11)

2018-12-06 11:39:59,049 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 6, 'Action:', 1, 'Ob:', (1, 10.0, 5.34), 'R:', -1, 'Total Reward:', -12)

2018-12-06 11:40:14,080 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 7, 'Action:', 1, 'Ob:', (1, 10.0, 8.05), 'R:', -1, 'Total Reward:', -13)

2018-12-06 11:40:29,105 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 8, 'Action:', 1, 'Ob:', (1, 10.0, 6.2), 'R:', -1, 'Total Reward:', -14)

2018-12-06 11:40:44,134 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 9, 'Action:', 1, 'Ob:', (1, 10.0, 5.27), 'R:', -1, 'Total Reward:', -15)

2018-12-06 11:40:59,159 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 10, 'Action:', 1, 'Ob:', (1, 10.0, 6.77), 'R:', -1, 'Total Reward:', -16)

2018-12-06 11:41:14,184 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 11, 'Action:', 1, 'Ob:', (1, 10.0, 4.89), 'R:', -1, 'Total Reward:', -17)

2018-12-06 11:41:29,221 - root - INFO - current bw:7.94, sla bw:6.0

('Ticks:', 12, 'Action:', 0, 'Ob:', (0, '7.94', 7.029999999999999), 'R:', 2, 'Total Reward:', -15)

2018-12-06 11:41:44,247 - root - INFO - current bw:5.32, sla bw:6.0

2018-12-06 11:41:44,248 - root - INFO - BW is less than SLA

('Ticks:', 13, 'Action:', 0, 'Ob:', (0, '5.32', 4.11), 'R:', -4, 'Total Reward:', -19)

2018-12-06 11:41:59,285 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 14, 'Action:', 1, 'Ob:', (1, 10.0, 4.4), 'R:', -1, 'Total Reward:', -20)

2018-12-06 11:42:14,315 - root - INFO - current bw:7.70, sla bw:6.0

('Ticks:', 15, 'Action:', 0, 'Ob:', (0, '7.70', 6.02), 'R:', 2, 'Total Reward:', -18)

2018-12-06 11:42:29,341 - root - INFO - current bw:8.24, sla bw:6.0

('Ticks:', 16, 'Action:', 0, 'Ob:', (0, '8.24', 6.92), 'R:', 2, 'Total Reward:', -16)

2018-12-06 11:42:44,366 - root - INFO - current bw:5.00, sla bw:6.0

2018-12-06 11:42:44,367 - root - INFO - BW is less than SLA

('Ticks:', 17, 'Action:', 0, 'Ob:', (0, '5.00', 4.11), 'R:', -4, 'Total Reward:', -20)

2018-12-06 11:42:59,396 - root - INFO - current bw:8.18, sla bw:6.0

('Ticks:', 18, 'Action:', 0, 'Ob:', (0, '8.18', 6.720000000000001), 'R:', 2, 'Total Reward:', -18)

2018-12-06 11:43:14,427 - root - INFO - current bw:8.55, sla bw:6.0

('Ticks:', 19, 'Action:', 0, 'Ob:', (0, '8.55', 8.15), 'R:', 2, 'Total Reward:', -16)

2018-12-06 11:43:29,463 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 20, 'Action:', 1, 'Ob:', (1, 10.0, 2.41), 'R:', -1, 'Total Reward:', -17)

2018-12-06 11:43:44,517 - root - INFO - current bw:3.87, sla bw:6.0

2018-12-06 11:43:44,518 - root - INFO - BW is less than SLA

('Ticks:', 21, 'Action:', 0, 'Ob:', (0, '3.87', 3.83), 'R:', -4, 'Total Reward:', -21)

2018-12-06 11:43:59,554 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 22, 'Action:', 1, 'Ob:', (1, 10.0, 6.33), 'R:', -1, 'Total Reward:', -22)

2018-12-06 11:44:14,580 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 23, 'Action:', 1, 'Ob:', (1, 10.0, 7.57), 'R:', -1, 'Total Reward:', -23)

2018-12-06 11:44:29,622 - root - INFO - current bw:6.88, sla bw:6.0

('Ticks:', 24, 'Action:', 0, 'Ob:', (0, '6.88', 5.42), 'R:', 2, 'Total Reward:', -21)

2018-12-06 11:44:44,658 - root - INFO - current bw:4.89, sla bw:6.0

2018-12-06 11:44:44,659 - root - INFO - BW is less than SLA

('Ticks:', 25, 'Action:', 0, 'Ob:', (0, '4.89', 4.53), 'R:', -4, 'Total Reward:', -25)

2018-12-06 11:44:59,730 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 26, 'Action:', 1, 'Ob:', (1, 10.0, 4.27), 'R:', -1, 'Total Reward:', -26)

2018-12-06 11:45:14,755 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 27, 'Action:', 1, 'Ob:', (1, 10.0, 2.95), 'R:', -1, 'Total Reward:', -27)

2018-12-06 11:45:29,781 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 28, 'Action:', 1, 'Ob:', (1, 10.0, 6.49), 'R:', -1, 'Total Reward:', -28)

2018-12-06 11:45:44,806 - root - INFO - current bw:10.0, sla bw:6.0

('Ticks:', 29, 'Action:', 1, 'Ob:', (1, 10.0, 5.69), 'R:', -1, 'Total Reward:', -29)

2018-12-06 11:45:59,844 - root - INFO - current bw:6.76, sla bw:6.0

('Ticks:', 30, 'Action:', 0, 'Ob:', (0, '6.76', 5.34), 'R:', 2, 'Total Reward:', -27)

Episode Finished  after 30 timesteps

图表比较

确定性试验是每当因特网链路上的可用带宽超过 SLA 规定的值时进行链路切换。否则就是坚持 MPLS 链路的安全选项。从上面确定性试验的图表可以明显看出,每当链路切换到 MPLS 时,带宽上升到最大值,但回报变得平缓。

对于随机试验,没有这样的逻辑来跟踪互联网链路上的可用带宽。切换链接的选择是绝对随机的。从图中可以明显看出,即使互联网链路中有可用的带宽,由于其随机决策,它仍然坚持使用 MPLS 选项。然而,在这两种情况下,总报酬都没有上升趋势。相反,如下图所示,在两种情况下,它都迅速下降。

值得用其他更先进的算法,如“深度 Q 学习”或“A3C”来重新审视这些图表,并看看它们如何与这些基线保持平衡。这将在后续文章中讨论。

结论

软件定义网络有很大的潜力受益于各种机器学习算法的应用,而强化学习最有希望解决其一些核心问题。在这里,我们刚刚开始解决 SD-WAN 中的一个非常相关的问题,该问题有可能通过机器学习算法,特别是强化学习来解决。为了应用 RL 的原则,我们需要一个健身房来玩,我们创造了 SD-WAN 健身房。下一个挑战将是应用高级算法,如“深度 Q 学习”或“A3C ”,实际解决 SD-WAN 中链路选择的相关问题。

参考

Comsa,I. S .(未标明)。5G 无线接入网络中 QoS 驱动的调度— IEEE Xplore 。从 https://ieeexplore.ieee.org/document/8254926/[取回](https://ieeexplore.ieee.org/document/8254926/)

JuniperNetworks。(未注明)。 SLA 配置文件和 SD-WAN 策略概述。检索自https://www . juniper . net/documentation/en _ US/CSO 3.2/topics/concept/AP-config-app-SLA-profile-overview . html

reinforcementlearning.ai-depot.com(未标明)。从 http://reinforcementlearning.ai-depot.com/[取回](http://reinforcementlearning.ai-depot.com/)

sdxcentral。(未注明)。SD-WAN 架构的要点:优势和选择。检索自www . sdx central . com:https://www . sdx central . com/SD-wan/definitions/essentials-SD-wan-architecture/

斯坦福大学。一种用于软件定义网络路由优化的深度强化学习方法。从 https://arxiv.org/pdf/1709.07080.pdf[取回](https://arxiv.org/pdf/1709.07080.pdf)

萨顿河(未标明)。从 http://incompleteideas.net/book/bookdraft2017nov5.pdf[取回](http://incompleteideas.net/book/bookdraft2017nov5.pdf)

休河(未标明)。工作负载工程:通过基于 RL 的工作负载放置优化广域网和 DC 资源。从 https://arxiv.org/pdf/1703.06967 取回

下一篇文章:

SD-WAN 链路交换机作为深度 Q 学习的强化学习实验

开放 API 塑造支付格局,创造大规模互联 API 经济

原文:https://towardsdatascience.com/open-apis-shaping-payments-landscape-and-creating-a-massive-connected-api-economy-dddff1eac732?source=collection_archive---------9-----------------------

Source : Pixabay

应用编程接口或 API 指的是软件应用的各种组件之间或不同软件应用本身之间的一组通信方法。它们在转变组织内各种系统之间、金融行业参与者之间以及金融机构和其他行业(如电信、旅游等)之间的交互方面发挥着重要作用。

传统上,支付行业不仅对产品和服务的端到端交付,而且对用户体验都实施了严格的控制。互联网、智能手机和平板电脑的激增,加上向第三方支付提供商和金融科技公司开放市场以参与支付领域的监管压力,威胁到了传统的银行方法,迫使银行灵活地参与到动态的金融科技生态系统中。这种参与的关键促成因素是“开放 API”。

Image 1 — Banks can leverage multiple human touch-points

开放 API 战略是这种转变的核心,它使银行能够在数字革命中扮演更积极的角色,而不是一个边缘实体。

下图描述了一些用例,这些用例通过采用与传统银行相关的开放 API,帮助下一代支付公司颠覆了支付世界。

Image 2 — Open API Use Cases for Banks and Payment Providers

银行面临的挑战&支付提供商

大多数银行都处于 API 之旅的某个阶段。银行的 API 之旅放缓主要是因为主要业务利益相关者之间缺乏清晰的理解以及一些技术挑战。

银行正在努力确定可以利用开放 API 的正确业务功能和用例。大多数银行业专业人士对安全性都很偏执,而“开放”这个词立刻让银行家们担心 API 不安全,容易被黑客攻击,尽管他们的大多数担心都是毫无根据的。他们对与合作伙伴共享信息和数据以提供更好的客户体验持怀疑态度。消费者-生产者 API 经济中的这种文化不匹配导致缺乏来自各种利益相关者的承诺和支持

大多数核心银行系统都建立在几十年前的遗留基础设施上,这些基础设施在过去运行得非常好,但是它们与下一代技术的集成需要大量的资源带宽。任何实现传统现代化的努力都伴随着战略和技术挑战,这些挑战可能会给银行的运营和品牌声誉带来严重风险。

与部署在云上的 API 相关的安全性和故障转移机制仍然处于发展阶段,尽管它们在过去几年中已经走过了漫长的道路。2017 年 2 月 AWS S3 停机提醒银行,在 API 和云上有太多事情可能会出错,从而严重影响客户体验。

数据驱动方法&开放 API 采用框架

我们的观点是,银行和支付服务提供商应该对开放 API 采取“平衡”的采用方式。也不应该是盲目试验各种不相关用例的下意识反应,也不应该是“等待和观察”的选项。我们建议一个系统的数据驱动框架来评估和部署用例,该框架有三个基本支柱——部署框架、API 治理和价值实现&部署后监控。

Image 2 — Deployment Fraemwork

部署框架

收集数据*——*开始识别所有可能成为开放 API 候选者的业务用例。

评估维度 可以在两个维度上进行评估—业务价值和技术挑战

有序数据点可以被分配给三个领域的业务价值

客户体验

收入潜力

费用

同样,有序数据点也可以被分配用于跨领域的技术挑战

整合挑战

部署挑战

技能可用性

规格化&绘图 所有维度的数据都需要规格化,以便于绘制分析。然后可以将标准化数据绘制成二维图。

分割&部署 一旦我们有了绘制的数据,我们就可以开始将该区域分割成 4 个逻辑分区,这将有效地成为开放 API 的不同部署阶段。

Image 4 — Group Use Cases based on defined metrics and framework

API 治理

规划一个 API 治理流程,该流程定义了合作伙伴的入门要求、费率,并定义了确定是构建还是集成的标准。

创建一个利益相关者参与的持续反馈循环

创造一种协作文化,让人们讨论和解决集成问题。

价值实现和监控

企业必须持续监控已部署的 API 所产生的价值。因为维护这样的 API 的成本和风险超过了它的好处,所以淘汰不创造价值的 API 是合适的。

感谢阅读——如果你觉得这篇文章有趣并想保持联系,你可以在 Twitter 上找到我 这里 Linkedin

原文来源:https://www . wipro . com/banking/open-APIs-shaping-payments-landscape-and-creating-a-massive-connected-API-economy/

2017 年西雅图开放数据日

原文:https://towardsdatascience.com/open-data-day-seattle-2017-338aec5206a6?source=collection_archive---------6-----------------------

3 月 4 日星期六是 2017 年的开放数据日。在西雅图,它悄悄靠近我们,没有人注意到,包括我自己。幸运的是,该市的公民技术倡导者坎迪斯·费伯(Candace Faber)参加了西雅图的一次公开集会,并引起了我们的注意。不想错过一个对一些公开数据感到厌烦的机会,我开始组织一个最后时刻的活动。

在民主数据成员扎克·穆勒的帮助下,一项计划形成了。我们选择了数据可视化作为这一天的主题,这感觉很有趣,适合一个简短的活动,也包括不同技术背景的人。后来,一些疯狂的电子邮件发送到潜在的场地,而国会山工具图书馆友好地让我们下午使用他们的工作室。现在,距离公开数据日还有四天倒计时,感觉完全可以控制。

我们没有时间计划一个完全结构化的活动,所以我们宣传下午是非结构化的黑客会议,以玩和策划开放数据。为了使活动尽可能公开,我们收集了一些材料和在线资源。这包括一页有用的链接,用于查找开放数据和开始可视化,以及挑选一些数据集。作为一个额外的奖励,我在旧货店搜寻物品来建立物理观想。

这一天吸引了形形色色的人群,他们愉快地闲聊了一下午。在西雅图也有一些关于开放数据的有趣讨论,许多参与者对来自该市的开放数据的质量发表了强烈的意见,这很棒。我们还谈到了许多人对要求公布更多数据的矛盾感受。城市确实提供了请求新数据集的途径,但是尽管我们都希望看到更多可用的数据集,但实际上很难确定我们想要访问什么。你可以考虑用大量的信息来描述一个城市的运作,甚至更多不太明显的信息。有时,我们想要构建或发现一些特定的东西,但作为一个公民,也很难想象哪些数据是可能获得的或有用的。与此同时,这座城市很难知道市民想要什么,或者将被授权创造什么。

Feedback on data.seattle.gov and its datasets from Open Data Day Seattle 2017 participants.

我下午的重点是拿出我带来的扑克筹码,用它们来可视化一些我们打印出来的小数据集。我们创建了关于城市规划许可申请的物理 3D 条形图,更重要的是关于猫和狗按邮政编码的分布。最棒的一点是有一些有趣的、切实的东西来集中讨论。没过多久,一群人就聚集在我们的宠物地图周围,讨论物理和社会指标,即养猫养狗的水平可能代表什么。

Some “physical data visualisations” using poker chips. Left: Numbers of cats (white) and dogs (red) by zip code in Seattle. Right: Building permit applications by type between 2006 and 2016 in Seattle. Something doesn’t seem quite right about those numbers…

最后,我从这次活动中学到了一些实用的东西:

  • 向参加活动的人解释发生了什么事,以及他们如何参与进来,这很重要。对于组织者来说显而易见的事情,对于刚刚出现的人来说并不总是显而易见的。
  • 如果可能,给人们一个机会向他人介绍自己,并与组织者分享他们的技能或当天的期望。
  • 计划好各种活动。不是每个人都想坐下来黑 5 个小时。将一些结构化的研讨会时间与非结构化的工作时间混合在一起,似乎是这类活动的最佳选择。
  • 人们安静并不意味着他们过得不好。几个人心满意足地在他们的笔记本电脑前坐了大半个下午,我觉得有点紧张。我内心的英国人说,任何这样做的人一定过得不好,但只是出于礼貌,什么也没说。事实上,情况正好相反,一些安静的参与者在结束时走过来告诉我,他们玩得很开心,想再做一次类似的事情。

我很乐意举办更多的开放数据和可视化研讨会,也许下次会有更多的计划和结构。与成年人或年轻人一起举办一个物理可视化研讨会,以一种平易近人的方式探索和理解现代世界中的数据,可能会非常有趣。

2018 开放数据日再见!

开放式学习依赖于非物质现象

原文:https://towardsdatascience.com/open-ended-learning-relies-on-nonphysical-phenomena-cb1c596d81b6?source=collection_archive---------3-----------------------

Information is not a physical phenomenon but relies upon a system of interpretation.

在自发表'以来的短暂时间里,机器学习是开放式的吗?我一直在思考机器学习技术很可能能够进行开放式学习的想法。我提出,让节点明确成为自然选择对象的方法可能是一个合适的前进方向,但我越来越确定这不会起作用。我回溯的原因是,我不相信简单地使一个节点成为自私的适应度最大化代理就足以使它成为一个进化对象。就像我如何论证迷因对象被编码在大脑网络结构的配置中一样,我认为同样的问题也适用于我自己的建议。因此,我现在非常确信,自然选择和其他优化算法将会因为同样的原因产生(或失败)同样的效果。

像基因或迷因这样的物体的问题在于它们不是物理的东西。如果我将产生相同效果的所有 DNA 片段集合起来,我会发现 DNA 的每个功能单位都包含不同的 DNA 序列。基因不是被定义为任何特定的 DNA 序列,而是被定义为功能单位。用哲学术语来说,进化理论的相关基因不是物质“标记”,而是信息“类型”。或者,换句话说,基因(或模因)是语义内容的单位,而不是纯粹的语法对象。令人沮丧的是,这样做的后果是,基因将永远是编码的非物质或非物质的产物,不能像我之前暂时设想的那样直接放入网络。

然而,我认为我对当前网络架构固定性的批评仍然有效。我强烈主张在培训前对网络设置采取一种无政府主义的方法,尽可能少地给出指导性的限制,以便为创造性的解决方案留出空间。神经网络的这种子结构方法的理想是用具有少量隐藏节点的网络开始训练,并使隐藏节点能够按照某种选择增长、分裂或消亡。如果成功,这种子结构主义将消除对神经网络设计艺术的需要,使网络结构本身没有固定的总体形式限制,如层排列、宽度和深度,这些限制了节点如何连接。通过做更少的假设,子结构主义也许能够容纳更多不同的对象。

我仍然认为网络编码和对象之间的关系是一个重要的设计问题:我们希望网络具有独立自然选择(或优化)的进化对象,但它们不能直接编码到学习架构中。概念上的问题是,我们不应该把进化对象看作是“存在于”环境中的东西,相反,进化对象是从一个主体和它们的环境之间的关系中出现的。进化对象,作为语义内容的单位,是由一串语法(在环境中“存在”)和一个主体对语法的主观解释(在内部)之间的相互作用产生的。因此,从智能体的角度来看,一个物理事物只有在值得解释为一个对象(通过将语法解码为意义)的情况下,才会成为一个经历选择的进化对象。

从进化的角度来看,人们可以很好地想象,在一群智能体通过一组共享的语法-语义相互关系进行通信之前,智能体在本质上发明了一种特殊的语法来存储关于个人经验和学习的信息。这种特殊的语法会让代理人的行为反应成为未成熟的迷因——我的意思是指无法通过交流复制并在代理人之间传播的迷因。如果代理人可以发明(或内置)某种系统来评估他们在任务表现上的成功,这种迷因可以在代理人的头脑中经历自然选择。但我不清楚,一个外部观察者如何能够区分一个具有大量指导性本能或这种早期模因学习的主体的行为或神经模式。这是心理学中一个古老的问题,它导致动物行为学(动物行为的研究)采取激进的行为主义,保守地忽略了动物具有早期迷因所能提供的精神状态的可能性。但是,正如我在之前多次说过的,很少有动物的行为复杂到足以通过模因论进行分析。

当考虑机器时,原则上唯一的区别特征应该是表明机器正在利用心理语法来产生早期模因,即它们的行为应该非常灵活和有能力。在对当前形式的渐进式神经网络的数学进行进一步研究后,他们确实觉得在约束神经网络以保持整个网络中与先前训练相对应的部分方面相当“粗暴”。我仍然坚持认为,它们不同于灵活能力的模因形式。相反,正如我在本文前面所讨论的,子结构方法可能会产生必要的创造性,而不需要“硬编码”想要的结果。

但是,即使采取了亚结构的方法,我也不确定这是否足以产生不完整的迷因。我相信环境的复杂性扮演着极其重要的角色。如果环境非常简单,就没有理由为想法开发个人语法。语法首先是记忆的工具。语法不是有任何数量的模拟状态,而是创建一个明确的代码,可以用来存储学习的结果。

当你考虑儿童发展时,行为复杂性与语言发展的相关性并不是巧合(也见于相关病理学)。正如我在这里广泛使用的术语,语法主要指音素的动词语法,因为正是这种语法使思想能够被编码(不一定是字母,尽管这是编码的后期和重叠发展)。能够真正地自言自语,可以增强推理、自我意识等能力,这是学习的基础。毕竟,通过这样的心理功能来处理编码的想法,使得一个想法可以在内部选择过程中作为不成熟的迷因与另一个想法进行比较。与模因评估的本能系统相比,这种模因学习是特殊的,因为它将模因从基因中分离出来,并使模因能够相互评估。虽然基因可以播种到评估系统,迷因成为推理的最终仲裁者。

但是,在过于纠结于人类的例子之前,很明显,有许多人类知识是隐性的——这意味着它不能被推理或在人与人之间传播。这样的知识显然不是模因,尽管它可能属于模因的这种‘本能评价’范畴。我认为非模因论的解释更好,因为一旦隐性知识被遗忘,就没有“标签”或等同物使一个单位的隐性知识被重新获得。被遗忘的隐性知识不能通过记忆重新获得,而必须通过经验重建。因此,这样的知识在头脑中并没有真正的位置,因为它实际上是一种潜意识或运动可塑性。

根据行为控制的模因和塑料部分之间的这种区别,我们不应指望大脑是一个单一用途的思维机器,因为它涉及到如此多的其他身体控制,这些控制最好留给它们自己的设备,从呼吸到平衡。同样,我们不应该指望人工神经网络代表一个统一的模因推理系统,因为还有其他功能最好留给非模因过程,如可塑性。本质上,我们面临的问题是如何为机器学习代理设计环境,以促进具有模因品质的“心智模块”。最明显的变化是增加了学习环境和感觉运动系统的复杂性,使代理能够与学习环境进行交互。人工智能研究人员已经开始这样做了,特别是 DeepMind,他们不断增加他们的 DQN 代理在中玩的游戏的复杂性。但要知道这是否会像人们希望的那样有所回报还为时过早。

对于人工智能来说,这是一个非常有趣的时代,事情发展得如此之快。(事实上,我写帖子的当天就给自己回复了!)在我的困惑和回溯之后,我认为现有的技术很可能能够进行(开放式的)模因式学习,并将有力地支持两个关键领域的发展:1)像以前一样,给予机器更多的权力来设计它们自己的网络架构,以及 2)以新的重点,增加机器代理的环境和感觉运动者对这些环境的访问的复杂性。最后,我还要强烈重申“从本能到智能”的信息:你可以设计一台看起来通过复杂的“硬编码”本能网络的任务能力具有智能行为的机器,许多动物可能都有,但类似人类的智能行为有一些根本的不同,因为我们在变得智能之前就变得有知觉。机器学习的含义是,现有的技术将继续收集更多的奖杯,但人工智能确实需要一种仿生方法来改变正在生产的智能机器的联盟。制造一台具有模因能力的机器很可能是制造 AGI 的实际目标,但要知道如何设计 1)潜在模因智能体的适当子结构,以及 2)适当的环境,以实现智能体的模因潜力,仍然很棘手。

我对这个结论比我今天早些时候发布的更有信心,但是我很想听听你的想法和评论。感谢阅读!

从零开始开放健身房

原文:https://towardsdatascience.com/openai-gym-from-scratch-619e39af121f?source=collection_archive---------6-----------------------

从环境开发到训练有素的网络。

有很多工作和教程解释了如何使用 OpenAI Gym toolkit,以及如何使用 Keras 和 TensorFlow 来训练使用一些现有 OpenAI Gym 结构的现有环境。然而在本教程中,我将解释如何从头开始创建一个 OpenAI 环境,并在其上训练一个代理。

我还将解释如何创建一个模拟器来开发环境。该教程分为 4 个部分:问题陈述,模拟器,健身房环境和培训。

1 —问题陈述

这里提出的问题是基于我最后的毕业设计。目标是创造一个人工智能代理来控制船只在整个航道的航行。

如今,在受限水域(如航道和港口)中的航行基本上是基于飞行员对环境条件(如给定位置的风和水流)的了解。

Figure1: Ship accident

让我们说,人类仍然在犯错误,有时会花费数十亿美元,人工智能是一种可能的选择,可以应用于导航,以减少事故的数量。

2 —模拟器

为了创造一个人工智能代理来控制一艘船,我们需要一个人工智能代理可以执行导航体验的环境,并通过自己的错误来学习如何正确地在整个航道中导航。此外,因为我们不能使用真实的船只来训练 AI 智能体,所以最好的替代方法是使用模拟器来模拟真实世界船只的动力学行为。为此,我们可以使用现有的商业软件(付费选项),,但在本教程中,我们将创建我们自己的船舶模拟器。

为了做到这一点,一些假设被采用,如:船舶是一个刚体,唯一的外力驱动船舶是水阻力(没有风,没有水流),此外,推进和舵控制力被用来控制方向和速度的船舶。控制船舶动力学的完整方程很复杂,可以在参考文献[1]中找到。这里我们将使用一个非常简单的 3DOF 模型,如下所示:

在该图中, u 是船相对于固定在船 CG 上的框架的纵向速度, v 是吃水速度, dψ/dt 是相对于固定参照物的角速度, ψ 是相对于固定框架 OXY 测量的船的攻角。速度 U,V (固定框架)通过 2x2 旋转矩阵链接 T10U,v 。φ是相对于如图所示的移动框架测得的舵角。

阻力和推进力的公式超出了本教程的范围,但是,总而言之,阻力与船的运动方向相反,与船的速度成正比。方向舵和推进力与[1,1]中的参数 Al 和 [0,1]中的参数 Ap 成比例。这些参数与舵角和推进力(Tp)成正比。注意,Al 和 Ap 是可控参数,因此:

现在我们有了模型微分方程,我们可以使用一个积分器来建立我们的模拟器。让我们写下我们的模拟器。

  • 第一步:模拟器方程式。写出上面的等式,分离出加速度项,我们得到:
def simulate_scipy(self, t, global_states):
    local_states = self._global_to_local(global_states)
    return self._local_ds_global_ds(global_states[2], self.simulate(local_states))

        def simulate(self, local_states):
        *"""
        :param local_states: Space state
        :return df_local_states
        """* x1 = local_states[0]  # u
        x2 = local_states[1]  # v
        x3 = local_states[2]  # theta (not used)
        x4 = local_states[3]  # du
        x5 = local_states[4]  # dv
        x6 = local_states[5]  # dtheta

        Frx, Fry, Frz = self.compute_rest_forces(local_states)

        # Propulsion model
        Fpx, Fpy, Fpz = self.compute_prop_forces(local_states)

        # Derivative function

        fx1 = x4
        fx2 = x5
        fx3 = x6

        # main model simple
        fx4 = (Frx + Fpx) / (self.M)
        fx5 = (Fry + Fpy) / (self.M)
        fx6 = (Frz + Fpz) / (self.Iz)

    fx = np.array([fx1, fx2, fx3, fx4, fx5, fx6])
    return fx

在前 6 行中,我们只定义了变量名从 x1x6betaalpha 是用于控制方向舵和推进控制的控制常数,在我们计算阻力并最终分离出导数项 fx1,fx2 …,fx6 后,我们得出:

  • **第二步:积分器。**作为模拟的积分器,我们使用 scipy 库的 5 阶龙格-库塔积分器。
from scipy.integrate import RK45

我们定义一个函数,它使用 scipy RK45 来整合一个函数 fun 使用一个起点 y0 。从 t0t_bound 进行积分,相对公差 rtol 和绝对公差 atol

def scipy_runge_kutta(self, fun, y0, t0=0, t_bound=10):
    return RK45(fun, t0, y0, t_bound,                rtol=self.time_span/self.number_iterations, atol=1e-4)

因为我们使用全局参考(OXY)来定位船只,使用局部参考来积分方程(oxyz),所以我们定义了一个“掩码”函数用于积分器。该功能主要将函数模拟中输出的差分向量转换为全局参考。

def simulate_scipy(self, t, global_states):
    local_states = self._global_to_local(global_states)
    return self._local_ds_global_ds(global_states[2], self.simulate(local_states))
  • Step3:步进功能

每走一步,我们都要经过一个方向舵( angle_level) 和一个旋转杠杆( rot_level )来控制推进装置传递的推力。

def step(self, angle_level, rot_level):
    self.current_action = np.array([angle_level, rot_level])
    while not (self.integrator.status == 'finished'):
        self.integrator.step()
    self.last_global_state = self.integrator.y
    self.last_local_state = self._global_to_local(self.last_global_state)
    self.integrator = self.scipy_runge_kutta(self.simulate_scipy, self.get_state(), t0=self.integrator.t, t_bound=self.integrator.t+self.time_span)
    return self.last_global_state

在第一行中,我们存储当前动作向量,在第二行中,我们使用 RK45*self . integrator . step()*进行积分,直到它达到最终时间跨度。最后,我们通过 self.integrator 更新 self.last_global_state、self.last_local_state 和积分间隔。最后,我们返回全局状态。

  • **第四步:复位功能。**重置功能用于在每次新的迭代中设置模拟的初始条件,如初始位置和速度。它使用一个全局变量并更新 self.last_global_state,self.last_local_state。
**def reset_start_pos(self, global_vector)**:
    x0, y0, theta0, vx0, vy0, theta_dot0 = global_vector[0], global_vector[1], global_vector[2], global_vector[3], global_vector[4], global_vector[5]
    self.last_global_state = np.array([x0, y0, theta0, vx0, vy0, theta_dot0])
    self.last_local_state = self._global_to_local(self.last_global_state)
    self.current_action = np.zeros(2)
    self.integrator = self.scipy_runge_kutta(self.simulate_scipy, self.get_state(), t_bound=self.time_span)

最后的代码可以在这里查看。

3 —健身房环境

有了模拟器后,我们现在可以创建一个健身房环境来训练代理。

3.1 国家

状态是代理可以“看到”世界的环境变量。代理使用这些变量来确定自己在环境中的位置,并决定采取什么行动来完成提议的任务。在我们的问题中,任务被表述为:

使用方向舵控制,在给定的恒定推进动作下,沿航道执行规定的线性导航路径。

为在任务中应用 RL 而选择的状态如下:

式中 d 为船舶质心到基准线的距离; θ 是船舶纵轴与基准线之间的角度; vx 是船在其质心的水平速度(在引导线方向; vy 是船在其质心的垂直速度(垂直于引导线); dθ/dt 是船的角速度。

3.2 奖励

奖励函数负责惩罚没有遵循指导方针的代理,如果他没有太大的动摇就奖励他。定义的奖励函数是:

其中:

3.3 行动

这些动作是控制船舶操纵运动的输入参数。使船可控的力是方向舵和推进力。这些动作具有矢量形式Av =【Al,Ap】,其中 Al 为无量纲方向舵指令, Ap 为无量纲推进指令,因此 Al 在[-1,1] 中, Ap 在[0,1] 中。

3.4 代码

现在我们已经定义了环境的主要方面,我们可以写下代码了。

首先,我们定义我们的船的界限和我们的可观察空间状态(特征)的“盒子”的种类,我们也定义初始条件盒子。

**self.observation_space** = spaces.Box(low=np.array([0, -np.pi / 2, 0, -4, -0.2]), high=np.array([150, np.pi / 2, 4.0, 4.0, 0.2]))**self.init_space** = spaces.Box(low=np.array([0, -np.pi / 15, 1.0, 0.2, -0.01]), high=np.array([30, np.pi / 15, 1.5, 0.3, 0.01]))
self.ship_data = None

之后,我们定义一个函数将模拟器空间状态转换为环境空间状态。注意,我们镜像了 vy 速度 θ 角度和距离 d 以使 AI 更容易学习(减少空间状态维度)。

**def convert_state(self, state):**
    *"""
    This method generated the features used to build the reward    function* ***:param*** *state: Global state of the ship
    """* ship_point = Point((state[0], state[1]))
    side = np.sign(state[1] - self.point_a[1])
    d = ship_point.distance(self.guideline)  # meters
    theta = side*state[2]  # radians
    vx = state[3]  # m/s
    vy = side*state[4]  # m/s
    thetadot = side * state[5]  # graus/min
    obs = np.array([d, theta, vx, vy, thetadot])
    return obs

然后我们定义一个函数来计算之前定义的奖励

d, theta, vx, vy, thetadot = obs[0], obs[1]*180/np.pi, obs[2], obs[3], obs[4]*180/np.pi
if not self.observation_space.contains(obs):
    return -1000
else:
    return 1-8*np.abs(theta/90)-np.abs(thetadot/20)-5*np.abs(d)/150-     np.abs(vy/4)-np.abs(vx-2)/2

我们还必须定义阶跃函数。该功能由代理在导航时使用,在每一步,代理选择一个动作并在 10 秒内运行模拟(在我们的积分器中),并一次又一次地这样做,直到它到达通道的末端或到达通道边缘。

def step(self, action):
    side = np.sign(self.last_pos[1])
    angle_action = action[0]*side
    rot_action = 0.2
    state_prime = self.simulator.step(angle_level=angle_action, rot_level=rot_action)
    # convert simulator states into obervable states
    obs = self.convert_state(state_prime)
    # print('Observed state: ', obs)
    dn = self.end(state_prime=state_prime, obs=obs)
    rew = self.calculate_reward(obs=obs)
    self.last_pos = [state_prime[0], state_prime[1], state_prime[2]]
    self.last_action = np.array([angle_action, rot_action])
    info = dict()
    return obs, rew, dn, info

因为我们镜像状态,所以我们也必须镜像方向舵的动作,将它乘以**侧。**在本教程中,我们将创建一个网络,仅控制方向舵的动作,并保持旋转角度不变( rot_action = 0.2 )。

我们还使用库 turtle 创建了一个查看器,你可以在这里查看代码。它用于显示学习过程或培训后的表现。查看器在函数 render 中被调用。

def render(self, mode='human'):
    if self.viewer is None:
        self.viewer = Viewer()
        self.viewer.plot_boundary(self.borders)
        self.viewer.plot_guidance_line(self.point_a, self.point_b) img_x_pos = self.last_pos[0] - self.point_b[0] * (self.last_pos[0] // self.point_b[0])
    if self.last_pos[0]//self.point_b[0] > self.number_loop:
        self.viewer.end_episode()
        self.viewer.plot_position(img_x_pos, self.last_pos[1], self.last_pos[2], 20 * self.last_action[0])
        self.viewer.restart_plot()
        self.number_loop += 1
    else:
        self.viewer.plot_position(img_x_pos, self.last_pos[1], self.last_pos[2], 20 * self.last_action[0])

最后,我们定义了设置初始空间状态和重置的函数,它们在每次新的迭代开始时使用。

**def set_init_space(self, low, high):**
    self.init_space = spaces.Box(low=np.array(low), high=np.array(high))**def reset(self):**
    init = list(map(float, self.init_space.sample()))
    init_states = np.array([self.start_pos[0], init[0], init[1], init[2] * np.cos(init[1]), init[2] * np.sin(init[1]), 0])
    self.simulator.reset_start_pos(init_states)
    self.last_pos = np.array([self.start_pos[0], init[0],  init[1]])
    print('Reseting position')
    state = self.simulator.get_state()
    if self.viewer is not None:
        self.viewer.end_episode()
    return self.convert_state(state)

完整的代码可以在这里找到。

4 —培训

为了培训我们的代理人,我们使用了来自 Keras-rl 项目的 DDPG 代理人。关于 DDPG 方法的细节可以在这里找到。

然后我们导入所有使用过的方法来建立我们的神经网络。

from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Flatten, Input, Concatenate
from keras.optimizers import Adamfrom rl.agents import DDPGAgent
from rl.memory import SequentialMemory
from rl.random import OrnsteinUhlenbeckProcess
from ship_env import ShipEnv

所使用的神经网络具有以下结构(演员-评论家结构):

实现该结构的代码如下:

# Next, we build a very simple model.
actor = Sequential()
actor.add(Flatten(input_shape=(1,) + env.observation_space.shape))
actor.add(Dense(400))
actor.add(Activation('relu'))
actor.add(Dense(300))
actor.add(Activation('relu'))
actor.add(Dense(nb_actions))
actor.add(Activation('softsign'))
print(actor.summary()) action_input = Input(shape=(nb_actions,), name='action_input')
observation_input = Input(shape=(1,) + env.observation_space.shape, name='observation_input')
flattened_observation = Flatten()(observation_input)
x = Concatenate()([action_input, flattened_observation])
x = Dense(400)(x)
x = Activation('relu')(x)
x = Dense(300)(x)
x = Activation('relu')(x)
x = Dense(1)(x)
x = Activation('linear')(x)
critic = Model(inputs=[action_input, observation_input], outputs=x)
print(critic.summary()) # Finally, we configure and compile our agent. You can use every built-in Keras optimizer and
# even the metrics!
memory = SequentialMemory(limit=2000, window_length=1)
random_process = OrnsteinUhlenbeckProcess(size=nb_actions, theta=0.6, mu=0, sigma=0.3)
agent = DDPGAgent(nb_actions=nb_actions, actor=actor, critic=critic, critic_action_input=action_input,
                  memory=memory, nb_steps_warmup_critic=2000, nb_steps_warmup_actor=10000,
                  random_process=random_process, gamma=.99, target_model_update=1e-3)
agent.compile(Adam(lr=0.001,  clipnorm=1.), metrics=['mae'])

最后,我们使用 300.000 次迭代来训练我们的代理,并且在训练之后,我们保存网络权重和训练历史:

hist = agent.fit(env, nb_steps=300000, visualize=False, verbose=2, nb_max_episode_steps=1000) # train our agent and store training in histfilename = '300kit_rn4_maior2_mem20k_target01_theta3_batch32_adam2'# we save the history of learning, it can further be used to plot reward evolutionwith open('_experiments/history_ddpg__redetorcs'+filename+'.pickle', 'wb') as handle:
     pickle.dump(hist.history, handle, protocol=pickle.HIGHEST_PROTOCOL)
#
After training is done, we save the final weights.
agent.save_weights('h5f_files/ddpg_{}_weights.h5f'.format('600kit_rn4_maior2_mem20k_target01_theta3_batch32_adam2_action_lim_1'), overwrite=True)

最后经过训练我们有了以下结果:

代理人已经学会如何控制船舵以及如何停留在航道中线。

如果你已经读到这里,谢谢!如有任何问题,请在下方留言

关于这个项目的更多信息:

在我最后一年的项目中,我使用了一个更详细的船模型,还包括由人工智能代理控制的推进动作。项目存储库可以在这里找到。

参考文献:

【1】FOSSEN,Thor I .船舶流体力学与运动控制手册。约翰·威利父子有限公司,2011 年。

OpenHouse。人工智能:通过透明扰乱房地产

原文:https://towardsdatascience.com/openhouse-ai-disrupting-real-estate-through-transparency-4156b1ab620f?source=collection_archive---------17-----------------------

技术如何改变一个受到严格监管、拥有强大制衡、信息受到严格保护的行业?房地产行业主要由独立的房地产经纪人组成,由经纪公司和全国房地产协会统一管理。在这种寡头垄断的范围内,有一些规则保护其参与者,并确保市场维持对几十年来定义的结构的依赖。

与此同时,市场已经发展成为由信息驱动的按需经济。如今,购房者越来越容易获得信息,这使得他们在某些方面可以绕过中介。对即时满足和以最低成本找到最佳价值的知识的需求正在慢慢演变这个行业。房地产如何在未来十年取得成功将完全取决于购房者习惯的改变,他们默许慢慢拆除这一市场结构,以改善买家对信息的获取,同时创造新的价值来源。

一家总部位于卡尔加里和多伦多的初创企业正在为这种颠覆铺平道路,并向参与者发起挑战:房地产经纪人和购房者对这些交易有不同的看法。OpenHouse。AI 是一个基于云的数据和功能丰富的住宅房地产网络平台,使买家和卖家能够通过清晰和透明做出更好更快的房地产决策。

这些由和 Yanky Li 创立的年轻企业家们正在真正地解开一个非常传统的模式,并创造一个平台,在这个平台上,免费信息极大地改变了游戏规则。

条条大路通 OpenHouse。人工智能

张智峰在 R&D 工作了 12 年多。他毕业于法国,获得软件工程硕士学位,曾在多个行业的技术领域工作,包括公用事业、金融、电信和会计。当他从 NYU 商学院毕业时,他经历了一次“觉醒”,改变了他开始思考的方式。

我想在生活中做一些更有意义的事情,更直接地帮助人们创造积极的社会影响,而不仅仅是薪水和提前退休。我总是觉得我必须改变才能保持原样,做真实的自己。成为企业家对我来说再好不过了。

杨基李本质上一直是一个企业家,年轻时总是向家人、朋友和同学卖东西。他记得在小学时,他饲养并出售仓鼠,通过在学校进行的交易和装在塑料豆腐容器中的存货赚了一些钱。这些年来,他在商业和技术领域度过了他的职业生涯。通过咨询和项目管理的角色,他不断地寻找解决方案,并被期望能够快速思考。为他人工作并实现他们的梦想并不那么令人满意。杨基想要实现自己的梦想。

OpenHouse 的愿景。人工智能是连接人,而公司则提供洞察力。对 Will 来说,这个平台的想法源于他的经历。在他的职业生涯中,他幸运地见证了信息的释放,这将比任何一个人产生更广泛的影响。在开源运动下创建的应用程序,特别是在机器学习社区,已经取得了长足的进步。维基百科创立的理念是“每个人都可以自由获取所有人类知识的总和”,它利用社区和信任的力量来维持自身。一天,威尔和一个同样从事高级分析研究的朋友在一起,他们都意识到可以运用自己的技能帮助普通购房者做出人生中最重要的决定之一。

我女儿出生后,我和妻子在看一个开放的房子。我见到了店主。他开始带我们参观他的家,并谈论他对房子进行的翻新和升级(这些信息大多不在房地产清单上)。这对我们来说是一次很棒的购买体验。我希望我有更多这样的东西。就在那时,我构思了一个产品,将房主和房地产经纪人联系起来,在购买过程中创造更好的体验。我和我的老朋友 Yanky 分享了这个想法:我们建立一个允许人们贡献信息的产品。然后,我们部署技术来聚合和分析信息,并将数据开放给任何想要使用它的公司或第三方。

对杨基来说,这是一个影响世界的机会:

我已经获得了很多经验,我想把它带到一个新的水平,并影响人们的生活。我挨家挨户地去听人们的故事(我们了解他们的痛点)。我们正处于一个技术普及、成本降低的时代,初创公司正试图通过利用技术来帮助人们。我们没有房地产背景,所以我们进入这个问题:这应该如何工作?

你如何改变心态?

你如何告诉房地产经纪人,他们一直是真相的行业守护者,释放这些信息不会把他们的工作置于危险之中?创始人的使命是为每个人创造积极的影响。当技术以正确的方式创造并正确部署时,它可以增强人们的能力。

对于房地产经纪人来说,技术可以提供有价值的洞察力。人际关系也很重要。在房地产行业,关系至关重要。这些经历推动了更多的业务。OpenHouse。AI 将为房地产经纪人提供更有意义的见解,让他/她更好地了解社区,以加强这些关系。随着大数据的出现,来自世界各地的信息使技术能够积累更多的洞察力,从而为用户提供更多的价值。虽然代理人有信息,随时可以获得实时的,相关的信息仍然难以捉摸。如果房地产经纪人有更好的信息,他们可以为客户提供更好的服务。按照遗嘱:

我们正在创建一个不偏不倚的信任平台,将使信息随时可用。

杨基同意。在最近一次对一家经纪公司的采访中,他们花了过多的时间编写报告和做研究。如果他们有能力即时访问数据,他们就可以专注于他们最擅长的事情:发展良好的关系,并向人们展示合适的房屋。

对于购买者来说,目标是使他们能够做出更明智的决定,并确保这些决定是有效的。对于销售者来说,他/她可能会评价不同的销售方式。他们上演吗?他们翻新吗?他们卖多少钱?OpenHouse。人工智能将通过数据将卖家与市场联系起来,这样他们就可以优化他们的销售决策。

向所有人开放这些信息会创造一种透明度,这反过来会在利益相关者之间培养一种急需的信任。

在数据保护中释放信息的二分法

随着人工智能开始流行,人们对用户数据的收集、安全和处理感到担忧和谨慎。于 5 月 25 日生效的《欧洲通用数据保护条例》( GDPR)也指出,需要仔细审查数据是如何汇编的,以生成关于个人及其倾向的背景。

威尔介绍了他们的赋权价值观:

  • 让人们能够使用人工智能做决定
  • 通过让人们控制平台可以访问哪些信息以及哪些信息将与他人共享,来增强人们的能力。

他们是“人民数据”的坚定信仰者。人们对分享他们的信息有不同的舒适度。让他们选择分享他们愿意分享的数据,例如个人信息。在许多情况下,他们可能会分享他们的购买偏好,如房屋特征、邻里要求,即允许平台为他人创造洞察力的信息类型。按照美国佬的说法,

当个人需要时,来自整体的贡献使他们受益。

威尔补充说,人工智能将影响成本节约,并将成为一个重要的利润驱动因素,并影响就业。然而,他不相信它会淘汰或取代人类。这将解放人们以不同的方式思考,随着时间的推移,他的公司准备启用和验证这一点。

让人们能够控制他们的数据意味着确保隐私功能嵌入到平台的所有层中。当卖家想要列出房屋时,他们可以选择隐藏任何他们不想在网站上透露的信息。他们也可以选择不使用用于分析的信息。作为一个数据聚合器,OpenHouse。AI 的设计理念是向用户传达他们在旅程的每一步将会获得什么。

隐私权是一种权利。用户需要具备这一点,才能对您的系统产生信任。

这种将人们联系起来、做出更好的决定、赚钱和默许人们的隐私的哲学——都共存于一个系统中吗?杨基强调这是可能的。关键是不断从市场中学习,迭代并提供一个优化社区体验的平台,并提供保持其运行的价值和信任。Yanky 指出,他们参加了真正的北方会议,在那里他们积极参与了对《T2 永久技术宣言》的完善。他们当然也自己签了名。组织者阐述了这一宣言的前提:

如今,随着新技术的不断进步,我们有机会退一步,讨论如何深思熟虑地使用技术。随着加拿大在全球科技舞台上声名鹊起,我们相信我们已经做好了举行这些重要对话的准备。 ~ Steve Currie,Communitech 首席创新官。

加拿大商业领袖和他们的组织处于理想的位置,以确保他们开发和使用的技术合乎道德、包容和公平地为所有人追求“好”的结果。 ~ Peter Barr,德勤滑铁卢和西安大略地区管理合伙人。

这是重要的一步,不仅仅是在沟通 OpenHouse 方面。人工智能的价值,还在于确保它在整个平台上得到功能性的转化。

颠覆的时代和对未来十年的展望

威尔关注 AI 的大规模部署,并设想它将如何扰乱人们的日常生活。但是,通过技术创造解决迫在眉睫的粮食危机、疾病发病率和迫在眉睫的能源危机的方法来改善人们生活的机会显示了巨大的希望。与此同时,技术可以大幅降低基本生活成本,改善每个人的福祉。

对于 Yanky 来说,他设想随着创新的增加,技术社区在政策上有更多的发言权。目前,在努力跟上技术发展的过程中,政策和监管存在滞后,减轻这种风险的最佳方式是让技术在与企业和政府监管机构的谈判中占有一席之地。这将迫使政府与市场变化和消费者偏好保持同步。

通过允许商业和技术公司更道德地使用数据,技术有能力最小化社会的财富差距。随着社交媒体的出现,Joe Public 获得了一个扩音器,AI 有能力释放每个人手中的信息。这种不可避免性将要求所有层面的问责制:用户、企业、系统和政府。

OpenHouse。艾:这些门什么时候会开?按照遗嘱,

计划首先在 AB 的卡尔加里进行测试,以确保产品适合市场。不着急。我们希望确保买家、卖家和房地产专业人士之间的价值。我们知道这需要时间。我们知道这会带来怎样的影响,所以我们真的需要正确地构建它。一旦发布,我们将不断改进,一次推出一个城市。

忠于他们的价值观,以使平台有用为目标是最重要的。优先考虑创造经济和社会影响的目标,而不是货币化,将保持开放门户。人工智能在通往可持续发展的道路上走得更少。对威尔来说,他将继续倾听市场,学习和更新平台,用他自己的话来说,“不断变化,以保持真实的自我”。

开房。艾

在过去的十年里,张智峰一直致力于运筹学、产品商业化、技术咨询和 R&D 组织设计方面的先进技术。他拥有商业分析和软件工程硕士学位,曾在欧洲和北美的公用事业、金融、能源和会计领域带头发起技术倡议。

Yanky Li 的职业生涯几乎都在致力于平衡业务和技术。作为特许专业会计师和项目管理专家,Yanky 在世界各地领导了许多成功的项目,在这些项目中,他利用技术为业务问题设计解决方案。他本质上一直是一个企业家,他的动力是为人们创造影响,倡导包容性的社会变革。

这篇文章最初发表在福布斯上

打开神经网络黑盒——感知器

原文:https://towardsdatascience.com/opening-the-neural-network-black-box-perceptron-8435ef67721d?source=collection_archive---------0-----------------------

用 R 从头开始实现感知器

在大学开始研究机器学习之后,我一直在和人们谈论它,我逐渐意识到,即使有更多的技术背景,人们仍然认为机器学习算法是一个黑盒。因此,我想写这篇文章,展示如何使用 R 编程语言从零开始实现第一个提出的称为感知器的神经网络模型。我将带你们看一下整个过程,看看这个黑匣子里面是什么。

感知器神经网络

神经网络是一个受大脑启发的概念,更具体地说,是学习如何执行任务的能力。实际上,这是一种尝试,用代数的形式来模拟学习机制,以利于创建能够学习如何执行简单任务的算法。学习机制是一个很难的课题,多年来一直在研究,但没有完全理解,然而一些概念被假设来解释学习如何在大脑中发生,其中主要的一个是可塑性:改变神经元之间突触连接的强度,并创建新的连接。1949 年,唐纳德·赫布首次假设了这些突触的强度是如何适应的,他说突触连接强度的变化与两个连接神经元放电的相关性成正比。听起来很难做对吗?让我在这里澄清一下。他只是说,如果两个神经元一致地同时放电,那么它们之间的任何连接都会在强度上发生变化,变得更强。例如,你还记得你第一次吃来自一个新地方的比萨饼并且你喜欢它的味道吗?太棒了,对吧?嗯,在那一刻,你大脑中的一组神经元受到了积极的刺激,因为你品尝到了来自新地方的比萨饼的味道,因为这些神经元同时放电,它可能连接在一起或创建了一个新的连接。最终,当你从朋友那里听说那个地方或者看到一则广告时,它将足以让你再次想起比萨饼的美味。

为了模拟这种机制,麦卡洛克和皮茨提出了一个数学模型,该模型只能捕捉和再现其本质和基本属性,该模型被命名为感知器,如下图所示:

Basic Perceptron Model proposed by McCulloch and Pits.

感知器的主要特点是只有一个神经元。基本上,该模型由一组输入(x1,x2,…,xm),权重(w1,w2,..wm)和激活功能。输入代表刺激,权重复制神经元之间的连接强度,激活函数模拟神经元放电的性质。所有这些元件一起模拟一个感知器模型,该模型只不过是一个数学运算器,该运算器对所有乘以输入的权重求和,并且结果是激活函数的输入,只要求和的结果大于阈值,该激活函数就提供一种类型的输出,否则就提供其他类型的输出。

看,这个模型并不复杂。我希望到目前为止你做得很好,你可以意识到神经网络只不过是乘法和求和,其结果应用于一个函数。这就是真实的情况。

现在,我们需要将这些刺激映射到输入中。回想一下在一个新地方吃美味披萨的例子。刺激是比萨饼的味道,标签是比萨饼真的很好,所以你了解到那个新地方的比萨饼味道很好。味道并不是使比萨饼真正好吃的唯一特征,一般来说,比萨饼有更多可观察的特征,如:大小、格式、气味、颜色、重量、稠度、温度等,这些特征组成了“好比萨饼”的概念,这正是我们如何从现实世界中学习的。再想一个例子:你是怎么知道汽车是轿车而不是卡车的?很可能当你还是个孩子的时候,你的父母指着一辆汽车告诉你那是一辆汽车,而在其他情况下,他们指着一辆卡车告诉你那个大物体是一辆卡车。事实上,你所做的是观察到一些使这两个物体彼此不同的特征,并将这些观察结果与你父母告诉你的联系起来,例如,卡车比汽车大,可能有许多轮子,汽车没有巨大的后备箱,可以容纳五个人,等等。这正是机器学习试图做的事情:教导算法如何对对象进行分类,为数据集提供可观察特征的示例,其中每个观察都有一个标签或类别。

简单数据集

好了,现在你知道了感知器算法的模型和数据集应该是怎样的,是时候编码了。在我们动手之前,让我们先来定义我们要使用的数据集和激活函数。我们关注的是算法本身,所以为了使其他变量尽可能简单,我们将采用一个源于众所周知的 OR 逻辑函数的简单数据集。

从代码开始,让我们以 R 数据帧格式存储数据,如下所示:

data = data.frame( x1 = c( 0, 0, 1, 1 ),
                   x2 = c( 0, 1, 0, 1 ),
                   y =  c( 0, 1, 1, 1 ) )print( data )##   x1 x2 y
## 1  0  0 0
## 2  0  1 1
## 3  1  0 1
## 4  1  1 1

数据集只有四个观察值,其中两个属于类 0,其他属于类 1。

plot( data$x1, data$x2, type = 'n', main = 'Dataset OR', xlab = "x1", ylab = "x2" )
text( data$x1, data$x2, labels = data$y )
grid( nx = length( data$x1 ) + 1, ny = length( data$x1 ), col = 'black' )

这里的任务是训练一个感知器来执行分类。

让我们做些训练吧

首先,什么是培训?训练只有一个目标:找到当算法执行分类任务时产生最小误差的权重的最佳值。因此,分类就是简单地说明一个确定的输入属于 0 类还是 1 类。为了做到这一点,该算法找到一个超平面,该超平面将这些观察结果分成两边,一边应该只有来自类 0 的观察结果,而另一边只有来自类 1 的例子。事情会在下图中变得清晰:

Figure 02. OR classification

定义超平面的参数由权重值给出。然而,它有无限的组合,每一个都定义了超平面的不同位置,某些位置会引起错误分类。当已知类别的输入被算法分类为属于不同类别时,会出现此错误。因此,我们需要选择最佳位置,以避免错误分类。回到代码,让我们在一个短的值范围内随机初始化权重值,如下所示:

weights = rnorm( mean = 0, sd = 0.1, n = ncol( data ) )print( weights )## [1]  0.07189541 -0.08588955 -0.12175474

我从均值等于零、标准差等于 0.1 的正态分布中随机抽取数字。等等,到目前为止,我们已经看到了两个权重,每个输入一个,但是上面的代码显示了三个权重。第三个权重用于偏置输入。Bias 是一个固定输入,通常为-1 或 1,即使电流输入都为零,它也负责激活神经元。缺少的最后一个定义是激活函数。这将是如下所示的 Heaviside 阶跃函数:

Figure 03: Heaviside step function

Heaviside 阶跃函数的特性是当输入低于某个阈值时输出等于 0,否则输出为 1。您可能已经感觉到,激活函数的输出将是算法对输入属于哪一类的猜测。在这种情况下,Heaviside 阶跃函数是有意义的,因为它允许我们计算误差,以便评估分类器的性能。考虑到阈值等于 0.5,激活函数可以写成如下:

activation_function = function( net ){
                        if( net > 0.5 )
                            return( 1 )
                        return( 0 )
                    }

现在,我们终于可以写下感知器的代码了。让我们进行第一次观察,添加偏差值并乘以初始权重,结果将放入激活函数。在此之后,计算误差值并更新权重以提高自信度。为了计算误差和更新权重,我们将使用下面的表达式,其中参数 eta 是学习率,该值定义了遍历误差函数的步骤。

data = as.matrix( data )
net = c( data[1, 1:2 ], 1 ) %*% weightsy_hat = activation_function( net )error = y_hat - data[1,3]eta =  0.1weights = weights - eta * ( error ) * c( data[ 1, 1:2 ], 1 )print( weights )##          x1          x2
                    ##  0.07189541 -0.08588955 -0.12175474

这是只有第一次观察的学习过程,现在我们需要对数据集上所有可用的例子重复这个过程。然而,这个循环需要有一个停止标准,它将定义学习过程何时应该停止。为了测量算法在分类任务中的性能,我们观察误差的值,因此使用它作为停止标准听起来是合理的,更准确地说,我们将使用均方误差(mse)值。当算法达到一个较低的 mse 值时,我们会对它的性能感到满意。执行整个工作流培训的代码如下所示:

perceptron = function( dataset, eta = 0.1, threshold = 1e-5 ){
                        data = as.matrix( dataset )
                        num.features = ncol( data ) - 1
                        target = ncol( data ) # Initial random  weights
                        weights = rnorm( mean = 0, sd = 0.1, n = ncol( data ) ) mse = threshold * 2
                        while( mse > threshold ){
                            mse = 0
                            for( i in 1:nrow( data ) ){
                                # Add bias and compute multiplications
                                net = c( data[ i, 1:num.features ], 1 ) %*% weights # Activation function
                                y_hat = activation_function( net ) # Compute mse
                                error = ( y_hat - data[ i, target ] )
                                mse = mse + error^2
                                cat( paste( "Mean square error = ", mse, "\n" ) ) # Update weights
                                weights = weights - eta * error * c( data[i, 1:num.features ], 1 )
                            }
                        }
                        return( weights )
                    }

这个函数找到感知器模型的最佳权重。

看那个超平面!!

好了,伙计们,我们到了这篇文章的最后部分。在我们找到感知器模型的最优权重之后,让我们来看看超平面。下面的函数绘制了输入空间上的超平面。

shattering.plane = function( weights ){
                        X = seq( 0, 1, length = 100 )
                        data = outer( X, X, function( X, Y ){ cbind( X, Y, 1 ) %*% weights } )
                        id = which( data > 0.5 )
                        data[ id ] = 1
                        data[ -id ]= 0
                        filled.contour( data )
                    }

…运行功能…

weights = perceptron( data, eta=0.1, threshold=1e-5 )## Mean square error =  0
                    ## Mean square error =  1
                    ## Mean square error =  2
                    ## Mean square error =  3
                    ## Mean square error =  0
                    ## Mean square error =  1
                    ## Mean square error =  2
                    ## Mean square error =  2
                    ## Mean square error =  0
                    ## Mean square error =  0
                    ## Mean square error =  0
                    ## Mean square error =  0shattering.plane( weights )

如您所见,超平面将输入空间分为两个区域(蓝色和粉色),每个区域代表输入被分类为属于类 0 和类 1 的空间。同样,你可以观察到,每次你运行代码,你会得到一个不同的权重值,从而改变超平面的位置。对于那些还不熟悉 R 语言的人,完整的感知器代码存储在我的 github 库中,只需在 R 控制台中复制并粘贴即可。

机器学习的好结论和未来

感知器是第一个提出的神经网络模型,它在线性可分的数据集上工作良好,对于其他类型的数据集,感知器存在许多限制,使得它不可能以良好的结果(低误差值)执行分类任务。例如,感知器不会对源自逻辑函数 XOR 的数据集执行分类任务。如果你是一个好奇的人,你可以在一个 XOR 数据集上运行这个代码,看到感知器不能区分类 0 和类 1,它永远不会达到低于给定阈值的均方误差。此外,尝试使用超平面对 XOR 数据集进行可视化分类。你能画出一个超平面来分隔类 0 和类 1 的输入吗?很可能不会,你会失败得很惨。我知道在所有这些研究之后,发现一个非常有限的分类器是令人沮丧的。不要悲伤或绝望,这不是机器学习的结束,恰恰相反,这只是开始。科学家们找到了一种超越这些限制的方法,将感知器算法进化成了一种叫做多层感知器(MLP)的算法。与感知器不同,MLP 能够解决复杂的问题,从简单的逻辑功能,如异或,直到人脸识别。在接下来的帖子中,我将打开 MLP 黑盒,从头开始实现它,并在一个真实的数据集上运行它来展示它的威力。感谢您的时间,您可以在 github 资源库中查看完整的代码。随时欢迎反馈。一会儿见。

实际管理数据科学团队

原文:https://towardsdatascience.com/operating-a-data-science-team-is-not-something-that-can-just-be-learned-by-watching-lectures-and-fef6ed0f714a?source=collection_archive---------8-----------------------

运营一个数据科学团队不是光看 Coursera 和 Udemy 上的讲座和视频就能学会的。不要误解我们,他们是学习数据科学和机器学习理论与实践问题的好地方。

然而,他们没有教授良好的业务实践,以及如何在业务环境中运营数据团队。知道算法,以及如何使用 Hadoop 还不足以拥有一个有效的数据团队。

给数据科学团队的建议

团队要和其他部门合作,要维护软件,要向高管汇报,当然还要回报商业价值!数据科学,如分析和商业智能,只是帮助企业更有效地赚钱的工具。

大多数数据科学课程都不会讨论这些内容。这就是为什么我们的重点之一不仅仅是定制数据科学算法和模型,还有数据科学团队发展。

我们想提供一些伟大的提示,帮助您的数据科学团队更加成功。这与算法和模型无关,而是与数据专家在业务中需要如何运营有关:

ROI 与算法和技术

程序员、数据科学家和工程师。我们大多数人通常更喜欢关注我们正在开发的数据项目或软件的技术方面。我们开发产品的原因不仅仅是为了钱,而是为了证明我们可以做一些事情。这是一个挑战!我们是问题解决者。

也许我们想证明我们可以开发一种算法,可以预测一个产品是不是热狗。只是为了好玩!

然而,归根结底,美国的数据科学家、数据顾问和软件工程师是被企业雇佣的。最终,这些企业希望看到财务结果。无论您使用的是神经网络还是基于支持向量机的算法,哪个结果可以节省最多的资金,或者带来最多的收入,都没有关系。

记住这一点很重要,因为数据科学家或大数据分析师越早发现这一点。他们的作用就越有效。作为一名数据科学家,有一点点企业家精神是必要的。

数据专家寻找机会为公司省钱,或者发现新的价值流。我们也经常是对的,因为我们不仅了解业务,而且我们有数据来支持我们的见解。

这是拥有一个与您的业务非常协调的数据团队的价值之一。他们有数据来驱动他们的决策。

数据工程

一个可以偶尔赶工的领域是数据工程。它可能看起来不重要,可能看起来很容易改变。然而,如果数据不是以一种易于操作和开发的方法设计的。数据科学家将有一段地狱般的时间试图设计他们的算法和下游工作流程。

在 indeed.com的职位中,数据工程师的比例仍然高于数据科学家,这是有原因的。

数据的结构在分析中起着很大的作用。我们的团队有几个成员原本是数据工程师,这就是他们如此有价值的原因。他们不仅能创建漂亮的算法,还能创建从 A 点到 b 点、从数据仓库到算法的自然流动的数据管道。

设计良好的数据易于修改,易于允许新的模块和报告指标等。这可能看起来很奇怪,但是有了好的数据工程,这一切都是可能的!

系统设计也适用于数据科学家

当设计算法时,很容易忘记结果需要实际应用到生产中。

数据科学家不只是设计一个算法,然后就此结束。相反,通常需要某种形式的数据仓库或数据存储中心作为一个系统,从开发的模型中获取并记录数据。该算法不是一个孤岛,它自己创造美元。

通常还会有某种形式的用户可以与之交互的界面。

例如,这可能是一个网站或一个仪表板。目的是让最终用户直接获得可操作和可理解的见解。而不是他们必须翻译随机数字和模型输出。

当在课堂上简单地做一个卡格尔问题或创建一个项目时,这可能会被忽略。这就是为什么像“激励”这样的项目让他们的学生与实际的企业合作,因为将算法投入生产需要的不仅仅是开发它。

有旧系统要处理,API 文档要筛选,有 bug,有变通办法,当然还有公司政治。

公司政治,是的,你会参与其中

商业总是有政治。没有办法绕过去。数据科学高管和项目负责人需要能够与其他团队合作,并像其他部门一样获得资金。

这需要了解其他高管想要什么和需要什么,并确保他们支持你的项目。如果他们不支持你的项目,如果他们等着在背后捅你一刀(这种情况确实会发生),你的项目就会失败。

不要操纵,而是引导其他团队领导接受你的观点,或者交换,或者妥协。只要确保你不会开始踩着每个人的脚趾…至少,直到你的数据团队已经证明了自己几次。即使这样,也不要变得难以共事。

否则,没有人会给你的业务团队提供资源。

文档是数据团队的朋友

好吧,85%的程序员需要承认一些事情。他们讨厌文档。没关系,这并不是最有趣的事情。然而,不断地记录是很重要的!

不要等到项目结束才记录文档!!!

数据科学算法、数据结构和软件需要不断地被记录。

没人要求你的数据团队写出下一个汤姆·斯威尔。只要保持清晰易懂的笔记,任何其他程序员都可以拿起。

你永远不知道团队成员什么时候会离开,因此,留下一堆没有文档的半成品项目。

因此,为了便于维护,让您的数据团队记录他们的项目。这将为您的团队节省数百小时的技术债务,并确保您的产品继续运行。

数据科学项目需要软件 QA 和生命周期

数据科学是软件开发的一个分支。这意味着它需要一个过程来确保开发的代码是健壮的和可维护的。

你怎么问?

通过对代码和数据都有一个很好的质量保证过程,并确保代码从开发到生产有一个标准化的过程。

不,你不应该在产品上测试代码!

事情就是这样出问题的!!!

不要误解我们,您需要推出代码,但不能以您的代码会破坏构建为代价。

同行评审、QA 和单元测试可以为您的数据团队省去很多麻烦。确保没有持续的障碍,就像一个工程师永远都要对别人的代码进行同行评审。

同时,确保你没有直接开发产品!!

数据科学不仅仅是关于算法

数据科学和分析的真相是,它不是一颗神奇的子弹。它实际上只是企业用来增加利润和降低成本的另一个工具。如果操作得当,它会创造巨大的竞争优势。当数据设计得很好,团队与业务的其他部分运作良好时。

我们的数据顾问专门确保您的团队满负荷运转。当然,我们喜欢解决数据科学和机器学习问题。

然而,我们也提供令人敬畏的指导和研讨会,以帮助发展您的团队成员!我们拥有数据科学和业务专业人员,他们知道如何确保您的团队与业务保持一致。通过这种方式,您可以充分利用数据来推动价值流!无论是大数据,小数据,让我们知道今天我们如何为您服务!

阅读下面关于数据科学的更多信息!

亚马逊正在用数据驱动战略抢走你的午餐

如何面试数据科学家

数据科学项目失败的 32 个原因

26 个启动失败的原因

生物学和医学中深度学习的机遇和障碍

原文:https://towardsdatascience.com/opportunities-and-obstacles-for-deep-learning-in-biology-and-medicine-6ec914fe18c2?source=collection_archive---------3-----------------------

**目标受众:**一般。

27 名科学家合作审查生物学和医学领域深度学习的机遇和障碍。也许比他们的结论更重要的是导致这些结论的写作过程——在 Github 上,在开放的环境中,以类似于开源软件开发的方式。

概要:

  • 生物学和医学正变得数据丰富,但数据复杂且往往难以理解,这使得这些领域可能非常适合深度学习。
  • 最近的几份出版物综述了深度学习在生物学和医学中的应用。
  • 这篇综述与众不同,因为 27 位科学家在 Github 上公开合作撰写了这篇综述:它代表了不同专家的共识,导致最新版本的综述的讨论对公众开放。
  • 回顾的主题包括深度学习在疾病和患者分类、基础生物学研究和患者治疗中的应用。
  • 对模型评估和解释的批判性讨论强调了常见的陷阱和最佳实践的指导原则。
  • 尽管在大多数审查的应用中,深度学习优于竞争机器学习方法,但深度学习尚未实现其潜力或最终解决这些问题。
  • 数据、代码和模型共享的文化将加速这一领域的进步;像 DragoNN 这样的教学资源会扩展它。
  • 总之,我们对深度学习在生物学和医学领域的未来持乐观态度。

在 Github 上公开写评论可以减少偏见,利用大众的智慧。右边是我和其中一位作者交流的快照,我们决定不对我们之前考虑过的某些问题发表评论。我们不会在评论中讨论这些问题,但是这种交流澄清了我们对这些问题的看法,这就是开放式写作过程的附加价值。

该综述可在 bioRxiv 上获得预印本,最新版本可在 Github 上获得。接下来,它将接受同行评审,以便在《皇家学会杂志》上发表。我们的结论,如果经得起时间的考验,将会把这个领域向前推进一步;我们采用的开放式写作过程,如果经得起时间的考验,将会改变它。

Johnny Israeli 是斯坦福大学的生物物理学博士生和 SIGF Bio-X 研究员。他开发了基因组学的深度学习,专注于蛋白质-DNA 相互作用。Johnny 创造了DragoNN toolkit用深度学习来教授基因组数据的建模和解释。DragoNN workshops 已经在各大研究机构推出,现在可以作为 Nvidia 深度学习学院的在线课程**。通过与 Anshul Kundaje 教授合作,Johnny 将基因组学的深度学习从想法转变为可用的框架,指导了几十名学生,并通过研讨会和课程扩展了该领域。你可以* 在 LinkedIn 上关注他,获取深度学习和基因组学的月度文章。*

机器学习和人工智能的最佳工具

原文:https://towardsdatascience.com/optimal-tooling-for-machine-learning-and-ai-e43495db59da?source=collection_archive---------5-----------------------

注意:这篇文章基于我最近在脸书开发者圈和柏林数据本地人上的演讲。你可以在这里得到幻灯片

我将第一个承认工具可能是目前数据科学中最不令人兴奋的话题。人们似乎更有兴趣谈论最新的聊天机器人技术或深度学习框架。

这完全说不通。为什么你不花足够的时间来仔细挑选你的工具?还有一个额外的问题,这对于我的职业来说很典型——当你只有一把锤子时,一切都变成了钉子(这就是为什么你实际上可以用 R 建立网站;-)).我们来谈谈这个。

先说要领。

我应该使用哪种语言?

好吧,这个有争议。在这个问题上有一些非常广泛的观点,从一个极端到另一个极端。我有一个可能是最不常见的——越多越好。R 和 Python 都要用。

More is better

那么,为什么呢?r 可以说在数据可视化方面做得更好,并且有大量的统计软件包。另一方面,Python 将帮助您将模型投入生产,并且更受团队中其他开发人员的赞赏(想象一下,给他们一个 R 模型来部署)。

在这里,我想对茱莉亚大声疾呼。这是该领域的新来者,但潜力巨大。留意一下这个。

基本软件包

我们不希望在工作中不断重复发明轮子,我们应该利用围绕这些语言的令人敬畏的开源社区。首先,快速回顾一下典型数据科学工作流中的主要任务。

A typical machine learning workflow

最重要的步骤是:摄取清洗可视化建模交流——我们需要所有这些的库。

对于 R 中的数据清理,有一个很棒的包叫做 dplyr 。诚然,它有一个奇怪的合成轴,但这就是它的力量所在。注意 % > % —它的工作方式与nix 中的管道( | )操作符完全相同,上一个操作的输出成为下一个操作的输入。这样,只需几行代码,您就可以构造非常复杂但可读的数据清理或转租操作。*

python 的替代品是熊猫。这个库大量借鉴了 R,尤其是 dataframe 的概念(其中行是观察值,列是特性)。它有一些学习曲线,但是一旦你习惯了它,你可以在数据操作中做几乎任何事情(你甚至可以直接写数据库)。

对于数据可视化,我们有 ggplot2 和 plotly 用于 r。gg plot 2 非常强大,但相当低级。同样,它有一点奇怪的语法,你应该阅读一下 Graphics 的语法来理解为什么。Plotly 是一个较新的库,它可以让你的 ggplots 拥有超能力,只需要一行代码就可以让它们交互。Python 中 dataviz 的基础包是 matplotlib。它有一些非常神秘的特性,比如奇怪的语法和可怕的默认颜色,这就是为什么我强烈建议你使用更新的 seaborn 包。python 缺乏的一个领域是模型性能的可视化。这个缺口由优秀的黄砖项目填补。您可以使用它来创建漂亮的图来评估您的分类器,查看特征重要性,甚至绘制一些文本模型。

Using Seaborn for scatter pair plotting of the iris dataset

R 中的机器学习遭遇一致性问题。几乎所有的模型都有不同的 API,如果你只是想在你的数据上测试不同的算法(这是你应该做的),你要么把所有的东西都背下来,要么打开几个文档标签。这一缺陷由两个主要的软件包解决,即 caret 和 mlr ,后者较新。我会选择 mlr,因为它看起来更有结构性,而且维护得更积极。您需要的一切都在那里,从分割数据、训练、预测和性能评估的功能开始。Python 中相应的库可能是我最喜欢的,也难怪一些主要的科技公司支持它——sci kit-learn。它有一个非常一致的 API,超过 150+的可用算法(包括神经网络),精彩的文档,主动维护和教程。

ROC/AUC plot in Python, using yellowbrick

集成开发环境

为 R 选择一个 IDE 是显而易见的。RStudio 绝对是一个神奇的工具,它没有竞争对手。理想情况下,我们希望 python 像这样。我已经看过一打了(Spyder、PyCharm、Rodeo、spacemacs、Visual Studio、Canopy 等。等等。),而且只有两个竞争者:木星实验室和原子 + 氢。

朱庇特实验室仍在(积极)建设中,看起来相当不错。尽管如此,它仍然继承了 Jupyter 笔记本的一些缺点,如电池状态、安全性以及最糟糕的 VCS 集成。基于这个原因,我推荐原子+氢。使用这个设置,你可以做各种各样的数据科学的事情,比如检查你的数据帧和变量,在中绘制东西和所有内嵌的东西。py 脚本。

Atom + Hydrogen

EDA 工具

我们为什么需要它们?在数据科学过程中,我们经常(尤其是在开始时)需要快速探索数据。在我们致力于可视化之前,我们需要探索,并以最少的技术投资来完成。这就是为什么编写大量的 seaborn 或 ggplot 代码是次优的,你应该使用 GUI 界面。另外,它也可以被商业人士使用,因为不涉及任何代码。有两个非常酷的跨平台免费工具可用: Past 和 Orange 。前者更侧重于统计分析,后者侧重于建模。两者都可以进行出色的数据可视化,因此它们完全符合我们的目的。

Stuff you can do with Orange

结论

作为临别赠言,我希望你保持高效,尽可能优化你的工具(不要把这作为不工作的借口;)).

损失函数(第二部分):逻辑回归

原文:https://towardsdatascience.com/optimization-loss-function-under-the-hood-part-ii-d20a239cde11?source=collection_archive---------0-----------------------

本系列旨在解释一些广泛使用的监督学习模型的损失函数,以及优化算法的一些选项。在第一部分中,我用梯度下降法,用最小二乘误差作为损失函数,详细地走了一遍线性回归的优化过程。在这一部分,我将转向逻辑回归。

假设

记住线性回归的假设是:

称这种线性回归的假设为原始模型输出。逻辑回归只是有一个基于它的变换。对于逻辑回归,这里着重于二元分类,我们有 0 类和 1 类。为了与目标值进行比较,我们希望将预测值限制在 0 到 1 之间。这就是为什么 Sigmoid 函数应用于原始模型输出并提供概率预测的能力。

假设函数返回的是 y = 1 的概率,给定 x,用θ参数化,写成:h(x)= P(y = 1 | x;θ).决策边界可以描述为:预测 1,如果θᵀx≥0→h(x)≥0.5;预测 0,如果θᵀx < 0 → h(x) < 0.5.

Cost Function

Linear regression uses最小平方误差作为损失函数,给出一个凸图,然后我们可以通过找到它的顶点作为全局最小值来完成优化。然而,它不再是逻辑回归的一个选项。由于假设发生了变化,通过对原始模型输出应用 sigmoid 函数进行计算,最小二乘误差将产生具有局部最小值的非凸图形。

source: https://medium.freecodecamp.org/understanding-gradient-descent-the-most-popular-ml-algorithm-a66c0d97307f; https://www.cs.ubc.ca/labs/lci/mlrg/slides/non_convex_optimization.pdf

直观地说,我们希望在预测 1 而实际为 0 和预测 0 而实际为 1 时分配更多的惩罚。逻辑回归的损失函数正是这样做的,它被称为逻辑损失。见下图。如果 y = 1,看下面左边的图,当预测= 1 时,成本= 0,当预测= 0 时,学习算法受到非常大的成本的惩罚。类似地,如果 y = 0,右边的图显示,预测 0 没有惩罚,但是预测 1 有很大的成本值。

这个损失函数的另一个优点是,尽管我们分别从 y = 1 和 y = 0 的角度来看它,但它可以写成一个公式,便于计算:

因此,模型的成本函数是所有训练数据样本的总和:

正规化

在用这个代价函数对训练数据进行参数拟合之前,先简单说一下正则化。常用的正则化类型有两种,【套索】****【脊】。不是直接优化上述成本函数,而是通过正则化,我们添加对系数可以达到多大的约束,以防止过拟合。L1 和 L2 采用不同的方式设置系数的上限,这决定了 L1 有能力通过将不太重要的特征的系数设为 0 来进行特征选择,并缓解多重共线性问题,而 L2 也惩罚非常大的系数,但不将任何系数设为 0。还有一个参数控制约束的权重λ,以便系数不会受到太大的惩罚而导致欠拟合。

关于为什么 L1 和 L2 由于“平方”和“绝对”值而具有不同的能力,以及λ如何影响正则项和原始拟合项的权重,这是一个非常有趣的话题。这里我们不会真的深究,但绝对值得你去学习和研究。下面显示了如何将原始成本函数更新为正则化成本函数。

最佳化

使用正确的学习算法,我们可以通过最小化 J(θ)作为θ的函数来开始拟合,以找到最佳参数。我们仍然可以应用梯度下降作为优化算法。它采用 J 相对于θ的偏导数(J 的斜率),并通过每次迭代以选定的学习速率α更新θ,直到梯度下降收敛。请参阅下面的 python 查询来优化 L2 正则化逻辑回归。这里有一篇很好的文章非常详细地解释了优化过程的矢量化实现。

## Vectorized Implementation of Optimization Using Gradient Descent# Define Cost functiondef cost(t, h, l=l, X=X, y=y, m=m):
    cost = np.transpose(-y)[@np](http://twitter.com/np).log(h) - np.transpose(1-y)[@np](http://twitter.com/np).log(1-h) + (l/2)*np.transpose(t[1:])[@t](http://twitter.com/t)[1:]
    cost = (1/m)*cost
    return cost # Define first derivative of cost functiondef cost_dev(j, t, X=X, y=y, m=m):
    dev = X[:, j]@(1/(1 + np.exp(-X@theta)) - y)
    dev = (1/m)*dev
    return dev# Define iterationscost_list = []theta_temp = np.zeros(theta.shape)theta_list = []for i in range(1000000):

    for j in range(len(theta)): 
        if j == 0:
            theta_temp[j] = theta[j] - a*cost_dev(j, theta)
        else:
            theta_temp[j] = theta[j]*(1 - (a*lmbd)/m) - a*cost_dev(j, theta)

    theta = theta_temp        
    hypo = 1/(1 + np.exp(-X@theta))

    theta_list.append(list(theta))
    cost_val = cost(theta, hypo)
    cost_list.append(cost_val)

我想谈一谈另一种流行的优化算法,牛顿法,它采用不同的方法来达到成本函数的全局最小值。类似于梯度下降,我们首先取 J(θ)的偏导数即 J(θ)的斜率,记为 f(θ)。牛顿方法不是通过某个选定的学习速率α乘以 f(θ)来减小θ,而是在先前θ和 x 轴处 f(θ)的切线的交点处获得更新的θ。经过一定的迭代次数后,牛顿法将收敛于 f(θ) = 0。

参见上面的简化图,从右边开始,黄色虚线是 f(θ)在θ0 处的切线。它决定了θ1 的位置,从θ0 到θ1 的距离是δ。重复该过程,直到找到服从 f(θ) = 0 的最优θ,即该图中的θ3。参见下面更新θ的公式。

显然,牛顿的方法不需要选择固定的学习速率,并且每次迭代的步长较大并且也是变化的,因此,在适当的特征和样本大小下,它通常收敛得更快并且相当有效。

未完待续…

损失函数(第三部分):支持向量机

原文:https://towardsdatascience.com/optimization-loss-function-under-the-hood-part-iii-5dff33fa015d?source=collection_archive---------2-----------------------

继续这个旅程,我已经在第一部分讨论了线性回归的损失函数和优化过程,在第二部分讨论了逻辑回归,这一次,我们将前往支持向量机。

线性 SVM

让我们从线性 SVM 开始,它被称为无核 SVM。通过两个特征 X1 来看散点图,X2 如下。我们实际上用很多不同的方法来区分两个类别,粉线和绿线就是其中的两个。SVM 最终选择了绿线作为决策边界,因为 SVM 如何对样本进行分类是为了找到与最接近决策边界的样本距离最大的决策边界。这就是为什么线性 SVM 也被称为大幅度分类器的原因。

谁是支持向量?支持向量是被错误分类的样本或接近边界的样本。看下面的剧情。带红圈的样本就是决策边界。在 SVM,只有支持向量对模型训练有有效的影响,也就是说去除非支持向量对模型没有任何影响。为什么?我们会从它的成本函数中算出。

SVM 的损失函数非常类似于逻辑回归的损失函数。在下图中分别用 y = 1 和 y = 0 来看,黑线是逻辑回归的成本函数,红线是 SVM 的成本函数。请注意,这里的 x 轴是原始模型输出,θᵀx.记得把原始模型输出放入 Sigmoid 函数给了我们逻辑回归的假设。SVM 的假设是什么?简单明了。当θᵀx ≥ 0 时,预测 1,否则,预测 0。

然后回到损失函数图。铰链损耗,当实际为 1 时(左图如下),如果θᵀx ≥ 1,则完全没有成本,如果θᵀx < 1,则成本随着θᵀx 值的降低而增加。等等!当θᵀx ≥ 0 时,我们已经预测了 1,这是正确的预测。为什么成本从 1 而不是 0 开始增加?是的,SVM 对不正确的预测和那些接近决策边界(0 < θᵀx < 1)的预测都给予了一些惩罚,这就是我们如何称它们为支持向量。当数据点刚好在页边空白上时,θᵀx = 1,当数据点在判定边界和页边空白之间时,0 < θᵀx < 1。稍后我会解释为什么一些数据点出现在页边空白内。至于为什么去除非支持向量不会影响模型性能,我们现在可以回答了。记住模型拟合过程是最小化成本函数。由于非支持向量根本没有代价,所以代价函数的总值不会因为添加或删除它们而改变。

让我们写出 SVM 成本函数的公式:

我们也可以将 SVM 正规化。例如,将 L2 正则化项添加到 SVM,成本函数变为:

与 Logistic 回归在正则项前使用 λ 作为参数来控制正则化的权重不同,相应地,SVM 在拟合项前使用 C 。直观上,拟合项强调通过寻找最佳系数来很好地拟合模型,而正则化项通过约束大的系数值来控制模型的复杂性。在训练数据集上很好地拟合模型与可能导致过度拟合的模型复杂性之间存在权衡,这可以通过调整λ或 C 的值来调整。λ和 C 都优先考虑我们对优化拟合项和正则化项的关注程度。放在成本函数的不同地方,C 实际上起到了类似于 1/λ的作用。

在 C 值非常大的情况下(类似于没有正则化),这个大间隔分类器将对异常值非常敏感。例如,在下图左侧的图中,理想的决策边界应该像绿线一样,通过添加橙色的橙色三角形(异常值),加上一个非常大的 C,决策边界将移动到橙色线,以满足大幅度规则。另一方面,C 还起到调整边距宽度的作用,这使得边距违例成为可能。见下图右侧。当 C 较小时,边距较宽,显示为绿线。粉红色的数据点违反了边界。这在处理不可分离的数据集时特别有用。因此,这就是正则化如何影响决策边界的选择,使算法适用于非线性可分离数据集,允许数据点被错误分类或有边界违规。

非线性 SVM

当决策边界不是线性时,假设和成本函数的结构保持不变。首先,让我们来看看。

你可能已经注意到,非线性 SVM 的假设和成本函数与线性 SVM 几乎相同,只是这里的“x”被“f”代替了。f 是 x 的函数,我接下来会讨论如何求 f。让我们从头开始。假设我们有一个样本(见下图)具有两个特征 x1、x2。我在 x 周围随机放了几个点(l⁽ ⁾,l⁽ ⁾,l⁽ ⁾),称它们为地标。我想看看 x 分别离这些地标有多近,记为 f1 =相似度(x,l⁽ ⁾)或 k(x,l⁽ ⁾),f2 =相似度(x,l⁽ ⁾)或 k(x,l⁽ ⁾),f3 =相似度(x,l⁽ ⁾)或 k(x,l⁽ ⁾).

所以这叫做核函数,它就是你从上面的公式中看到的精确的‘f’。内核函数内部是什么?换句话说,我们应该如何描述 x 与地标的接近程度?有不同的类型。高斯核是最流行的一种。它是用两个向量的欧几里德距离和描述函数平滑度的参数σ计算的。高斯核提供了一个很好的直觉。如果 x ≈ l⁽ ⁾,f1 ≈ 1,如果 x 远离 l⁽ ⁾,f1 ≈ 0。在 Scikit-learn SVM 包中,高斯核被映射到' rbf ',径向基函数核,唯一不同的是' rbf '用γ来表示高斯的 1/2σ。

我们可以说样本 x 的位置已经被这三个核重新定义了。也就是说,非线性 SVM 根据与地标的接近度来计算新的特征 f1、f2、f3,而不再使用 x1、x2 作为特征,这是由所选择的地标决定的。这就是θᵀf 原始模型输出的来源。让我们试一个简单的例子。θᵀf = θ0 + θ1f1 + θ2f2 + θ3f3。指定θ0 = -0.5,θ1 = θ2 = 1,θ3 = 0,因此θᵀf 为-0.5 + f1 + f2。查看第一个样本(S1 ),它非常接近 l⁽ ⁾,而远离 l⁽⁾l⁽⁾,具有高斯核,我们得到 f1 = 1,f2 = 0,f3 = 0,θᵀf = 0.5。根据前面提到的假设,预测 1。样本 2(S2)远离所有地标,我们得到 f1 = f2 = f3 =0,θᵀf = -0.5 < 0,预测 0。基于当前的θs,很容易注意到靠近 l⁽ ⁾或 l⁽ ⁾的任何点将被预测为 1,否则为 0。绿线展示了一个大致的决策边界,如下所示。

我们刚刚用我手动选择的某些特征和系数完成了预测部分。那么,这些地标来自哪里呢?我们需要多少地标?好吧,你可能会惊讶,给定 m 个训练样本,界标的位置就是你的 m 个训练样本的位置。

也就是说,非线性 SVM 通过将您的每个训练样本与所有其他训练样本进行比较来重建特征。因此,由标志创建的用于预测的特征的数量是训练样本的大小。对于给定的样本,我们更新了如下功能:

关于重新创建特征,这个概念就像当创建多项式回归以达到非线性效果时,我们可以通过对现有特征进行一些变换(例如平方它)来添加一些新的特征。例如,您有两个特征 x1 和 x2。为了创建多项式回归,您创建了θ0 + θ1x1 + θ2x2 + θ3x1 + θ4x1 x2,因此您的要素变为 f1 = x1,f2 = x2,f3 = x1,f4 = x1 x2

让我们重写假设,成本函数,和正则化的成本函数。

为了获得良好的模型性能并防止过拟合,除了选择适当的正则项 C 值,我们还可以从高斯核中调整σ,以找到偏差和方差之间的平衡。以某个样本 x 和某个地标 l 为例,当σ很大时,核函数 f 的输出接近 1,随着σ变小,f 向 0 移动。换句话说,对于 x 和 l 之间的固定距离,大σ认为它“更近”,具有较高的偏差和较低的方差(欠拟合),而小σ认为它“更远”,具有较低的偏差和较高的方差(过拟合)。

像逻辑回归一样,SVM 的成本函数也是凸的。SVM 最流行的优化算法是序列最小优化,可以用 python 中的‘libsvm’包实现。 SMO 通过将大型二次规划(QP)问题分解为一系列可解析求解的小型 QP 问题来解决该问题,从而在一定程度上避免了耗时的过程。在详细的计算方面,它非常复杂,包含许多数值计算技巧,使得处理非常大的训练数据集的计算更加有效。

总之,如果您有大量的要素,线性 SVM 或逻辑回归可能是一个选择。如果您的特征数量较少(1000 以下)并且训练样本的大小不太大,则高斯核 SVM 可能很适合您的数据。

最优化:引擎盖下的损失函数(上)

原文:https://towardsdatascience.com/optimization-of-supervised-learning-loss-function-under-the-hood-df1791391c82?source=collection_archive---------8-----------------------

在建立机器学习模型时,我通常会想到类似这样的问题:模型是如何优化的?为什么模型 A 的表现优于模型 B?

要回答这些问题,我认为一个切入点可以是了解不同模型的损失函数,此外,能够根据项目的目标和误差类型的容限选择合适的损失函数或自定义损失函数。我将发表一系列博客,讨论几种常见的监督学习模型的损失函数和优化算法。我会尽量用对没有很强数学背景的观众友好的方式来解释。让我们从第一部分开始,线性回归。

对于监督学习,通过找到最小化成本函数的最佳系数来优化模型。成本函数是用损失函数计算的每个数据点损失的总和。我们选择使用的模型是我们的假设。这是线性回归模型的假设。

线性回归最常用的损失函数是最小二乘误差,其代价函数也被称为均方误差(MSE)

从公式中可以看出,成本函数是一条抛物线。为了最小化它,我们需要找到它的顶点。它可以通过分析或使用编程算法来解决。在这篇博客中,我将重点介绍最流行的编程解决方案之一,梯度下降,来完成优化过程。梯度下降广泛应用于不同的模型中,其基于学习速率α采取步骤,向抛物线的顶点移动以找到线性回归的全局最小值,该点也称为斜率等于 0 的点。为了得到斜率,我们对每个系数θ的成本函数求导。

From: https://hackernoon.com/gradient-descent-aynk-7cbe95a778da

接下来,通过大量迭代不断更新每个θ,同时观察成本函数的降低,直到它达到一条水平线。实际上,由于所选择的步长,斜率不可能达到 0 的精确值,但根据超参数,它可以尽可能接近 0。

现在记住这些概念,让我们使用真实世界的数据(来自 UCI 机器学习库的 Boston Housing 数据)。由于我在这篇博客中只演示了优化部分,所以我将跳过所有的过程,如探索性数据分析、特征工程等。,并直接转到数据标准化,为预测做好准备。我们来看看前几行数据。

为了解释简单,我选择了两个特征(RM:每套住宅的平均房间数,年龄:1940 年之前建造的自有住房的比例)来进行预测,目标变量是 MEDV(以 1000 美元为单位的自有住房的中值)。为了计算效率,我把所有的计算转换成矩阵格式。下面是用于假设、成本函数、成本函数导数的矩阵,以及用于矩阵计算的 python 查询。

# Instantiate a hypothesis
hypothesis = X@theta - y# Calculate cost function
def cost(theta, X=X, y=y, m=m):
    cost = np.transpose((X@theta - y))@(X@theta - y)
    cost = (1/(2*m))*cost
    return cost# Calculate derivative of cost function
def cost_dev(j, theta, X=X, y=y, m=m):
    dev = X[:, j]@(X@theta - y)
    dev = (1/m)*dev
    return dev

所有系数在开始时都设置为 1。下面的查询返回 100,000 次迭代来同时更新系数。当趋势开始变平时,这意味着梯度下降已经收敛,并且已经达到成本函数的最小值。

# Assign a learning rate
a = 0.001cost_list = []
theta_temp = np.zeros(theta.shape)
theta_list = []for i in range(100000):

    for j in range(len(theta)):
        theta_temp[j] = theta[j] - a*cost_dev(j, theta)

    theta = theta_temp        

    theta_list.append(list(theta))
    cost_val = cost(theta)
    cost_list.append(cost_val)

我们能让这种趋势变得更好,更自信地说确实达到了最低水平吗?如果我们将学习率调整为 0.0005,迭代 1,000,000 次,会发生什么?

这种趋势看起来很疯狂。这并不是一个很好的成本函数演示,但我们可以对优化的结果非常有信心,假设最小均方误差达到当前设置。我们来对比一下刚刚手动从梯度下降算法得到的系数和从 Scikit-learn LinearRegression()得到的系数,数据集相同。

哒哒!他们几乎是一样的。这个博客的目标是揭示机器学习模型的基本优化秘密。梯度下降有许多高级变体,Scikit-learn 软件包中也应用了其他算法。当然,在大多数情况下,没有必要被那些数学问题所困扰。然而,能够理解引擎盖下的损失函数有助于我们作为机器学习工程师前进到下一个级别!

未完待续……

优化问题

原文:https://towardsdatascience.com/optimization-problem-5abe4792542c?source=collection_archive---------7-----------------------

最近,通过微软的一项计划,我有机会在乌干达坎帕拉作为一名部署数据科学家呆了两周。整个经历帮助我形成了对志愿者工作的一些看法,我想从我在非洲的时光中获得一些想法和经验。

在过去的一个月里,我收拾行李前往非洲,通过微软的一项名为 MySkills4Afrika 的计划前往坎帕拉,该计划旨在招募非洲缺乏技能的技术人员。我与四个合作伙伴——乌干达政府、乌干达发展金融公司、世纪银行和 MTN——合作,试图帮助他们重塑数据仓库、科学和分析能力。

Four organizations I worked with

起初,我有一个清晰的计划来做这件事。首先,获取他们的数据集,清理,参数化。第二,建立一个清晰的模型,提供一些商业洞察力。最后,共享该模型,以便组织可以复制和定制它。三步走,简单吧?没有那么多——在我来到这个国家的头几天,我很快意识到,我必须大幅改变我的方法。否则,我将成为非洲大陆上无数善意的志愿者中的一员,他们做着工作,但不一定是他们需要的工作。

那么,我要改变什么呢?事实证明,对于我工作过的组织来说,我必须采取一种更加量身定制的方法。每个人都有不同的数据基础架构、数据科学专业知识水平和与我相处的时间。

对于乌干达发展金融公司(DFCU)和世纪银行来说,他们都非常渴望与我会面,但缺乏数据专业知识,也不准备对他们的数据实施机器学习(ML)。因此,关于使用哪种语言、模型或方法的对话并没有特别大的帮助。相反,我花时间与 DFCU 和世纪银行讨论了他们可以采取的未来数据分析能力投资——自动化仪表板,这样员工就不会把所有时间都花在那里,并投资学习 SQL 和 Python,以便他们可以更轻松地挖掘数据。我提供了具体的例子,并向他们指出了他们可以利用的资源。

Isaac Niwamanya (business intelligence specialist at DFCU, left), Kenneth Kyobe (data analyst at Centenary Bank, right) and me

他们的数据科学负责人 MTN 在构建 ML 管道和模型方面经验丰富,因此我提供了实验设置反馈,并对他的代码进行了同行评审。在许多方面,与 MTN 的数据科学领导一起工作非常类似于我在微软与同事之间的互动。最后,对于乌干达税务局来说,他们对数据科学能力感兴趣,但希望获得一个具体的例子,说明如何利用这些能力来具体帮助他们的税收工作。为了给他们提供一些切实的东西,我访问了他们的数据子集,并建立了一个分类器,用于预测哪些地区将无法达到他们在本季度的预计税收目标。

Headquarters of Uganda Revenue Authority and MTN in Kampala

据我所知,每个组织都有这样一套独特的需求。在任何规划文件或旅行前电话中不明显的需求。不同的文化基础和动机。资金和变革意愿的梯度。关于数据对决策的重要性的各种立场。

在我的旅行之前,我已经陷入了许多其他非洲志愿者已经陷入的陷阱,我把乌干达归类为一个单层的国家,我认为一个适合所有人的志愿服务优化方法会有所帮助。甚至在我返回美国时,我发现自己反复被问及我在乌干达的经历,好像我在那里的时间是对整个非洲大陆的精确测量。作为第一代越南裔美国人,我非常清楚被一概而论地强加于你的挫败感。这种情况在世界其他地方已经屡见不鲜,我们不能在非洲继续犯同样的错误。自从我回到西雅图,开始与朋友和同事分享我的经历,我就试图突出乌干达惊人的多样性以及它在非洲大陆上的独特性。非洲的广大组织和人民不会从普遍的帮助中受益;相反,在志愿工作方面,他们应该得到量身定制的独特方法。

使用 Python 并发期货优化数据准备代码

原文:https://towardsdatascience.com/optimize-data-preparation-code-using-python-concurrent-futures-97a15ac580f6?source=collection_archive---------14-----------------------

最初发表于【www.easy-analysis.com】

只需几行代码,就能让您的 Python 代码为数据准备提供更快的执行速度。利用内置的 并发期货

这篇文章将讨论并展示在执行 Python 代码进行数据准备时,如何通过添加几行额外的代码来利用所有的 CPU 内核。

常见的数据准备任务

数据科学中一个非常常见的任务是数据准备。一个常见的任务可能是为模型训练准备图像。下面的代码片段演示了遍历文件夹中的图像、操作每个图像并最终保存每个更改的常见任务。

创建文件 compress.py

该文件应该包含以下代码。

函数 compress_image()检查图像的尺寸,并根据设置的 max_dim 调整尺寸。缩放图像尺寸时,纵横比保持不变。调整大小时,图像保存在内存中,而不是在光盘上,并检查大小。如果不满足 set image_size,则使用变量 max_dim 的较低值递归调用该函数,否则,用新尺寸覆盖图像。如果你想了解更多关于库 PIL 和木卫一的信息。BytesIO 请访问各自的文档。

下一个任务是使用这个函数来测量对任意数量的图像执行操作需要多长时间。出于测试的目的,我们将再创建一个 Python 文件。

创建文件 test_compress.py

该文件应该包含以下代码。

上面的代码创建了一个特定文件夹中所有图像文件的列表,在我的例子中是“../data/test_compres/。png”,此外,我只希望将 PNG 文件添加到列表中。最后,对于列表中的每个图像路径,调用函数 compress_image(file_name)。库时间用于测量执行文件所用的时间。*

运行 test_compress.py 文件打印时间 6.6042399406433105 秒。这有点慢,因此,让我们通过使用 Pythons 的一个核心库 Concurrent futures 来提高速度。

使用 Python 并发期货

python 中的并发未来允许我们利用执行代码的机器上所有可用的内核。我们运行的第一个示例只使用了我的 Mac 上四个可用内核中的一个。让我们看看,如果我们使用全部四种方法,我们可以提高多少时间。

为了进行这种改进,我们需要导入一个新的库,并稍微更改文件 test_compress.py 中的代码。修改后的 test_compress.py 文件现在应该包含以下内容。

这个版本的文件 test_compress.py 与以前的版本略有不同。导入了一个新的库 concurrent.futures。现在以不同的方式调用了进一步的函数 compress_image()。并发期货用于创建可用资源池,我们使用 map 为 list_files 中的每个项目调用函数 compress_image()。就这样,现在让我们再次运行文件。

运行 test_compress.py 文件现在打印出时间 3.422382116317749 秒。这是大约 90%的改进。

结论

您可能已经注意到,如果一个内核可以在大约 6 秒内完成任务,那么四个内核可以在 1.5 秒内完成。然而,这通常取决于你的代码在做什么,对于其他任务来说,它甚至可以扩展得很好。然而,仅仅通过增加两行代码就实现了 90% 的改进,这实在是太棒了。

为了提高 Python 代码的性能,可能还有许多其他的优化方法。一个有趣的方法是使用 Cython 将你的 Python 代码编译成 C 代码。Cython 做得很好,你不需要知道任何 C 编程。使用 Cython 的话题不在本文的讨论范围之内,但是,这是一个值得探讨的有趣话题。

如果你有兴趣了解我更多。请访问我在 LinkedIn 上的个人简介https://www.linkedin.com/in/vedranmarkulj/

感谢阅读。如果你对我写的关于机器学习和类似主题的未来帖子感兴趣,请在 Medium 和 LinkedIn 上关注我。更多文章即将发表。

利用自动化机器学习优化您的电子邮件营销策略

原文:https://towardsdatascience.com/optimize-your-email-marketing-strategy-with-automated-machine-learning-e1bfb8cc171b?source=collection_archive---------11-----------------------

个性化自动化

对全球企业来说,优化销售营销支出是一个价值 10 亿美元的问题,因为自 2017 年以来,每年有超过 1 万亿美元用于这项任务。然而,理解营销预算、行动和相关销售之间的关系是具有挑战性的,因为有许多同时发生且相互竞争的内部和外部因素会影响销售(心理、天气、情绪、位置、价格、广告……)。

由于机器学习技术能够在大型数据集上绘制复杂的关系,因此在该领域显示出了有希望的结果,但对于缺乏技术技能和背景的营销人员来说,它们的实施往往是一个障碍。入职顾问数据科学家的成本也很高,效率也很低,因为他们缺乏对市场营销和被营销行业的了解,无法提供有意义和可操作的见解。

在 [Mind Foundry](http://mind foundry.ai) ,我们相信问题所有者应该获得简单而可靠的工具来构建他们自己的数据科学解决方案,这就是为什么我们在 box 中建立了 AuDaS ,一个自动化数据科学团队。在这篇文章中,我们将看到营销人员如何使用 AuDaS 来设计他们的电子邮件营销活动,以提高他们的客户转化率和保留率。我们将使用 Corefactors.in 在 Kaggle 上托管的数据集。根据客户的各种属性和电子邮件的内容,我们试图预测的 3 种电子邮件状态是“忽略”、“已读”和“已确认”。

阶段 1:数据探索

将数据集上传到 AuDaS 后,我们会看到数据的快照,以及机器学习生成的关于如何清理和准备数据的建议。

AuDaS Data Preparation

例如,AuDaS 已经检测到 Email_ID 列没有预测能力,可以删除。它还检测到几列中缺少的值,并询问用户是希望填充它们还是删除它们。通过查看列名,我们知道可以按如下方式填充它们:

  • 总共有 0 个链接、图片和过去的交流
  • 客户位置的 NA

下图显示了我们如何通过几次点击来实现建议。

AuDaS 会自动为用户执行建议,同时在屏幕底部为应用于数据的每个操作创建审计跟踪。然后,用户可以返回到数据集的先前版本,并在必要时撤消步骤。

AuDaS 还自动生成直方图和特征相关性,为用户提供数据结构的高级概览。

阶段 2:建模

对于这个电子邮件营销数据集,我们希望根据其他属性来预测电子邮件的状态(忽略、阅读、确认),这意味着我们正在尝试解决一个 分类 问题。

在指定了我们要预测的列( Email_Status )之后,AuDaS 提供了一个健壮的框架来构建分类管道,该管道可以推广到其他数据集,而不会失去过多的预测能力,这通常是由过拟合引起的。这包括:

  • 出于最终模型验证的目的,自动保留数据集的 10%平衡保留
  • 执行 10 重交叉验证
  • 优化 F1 分数

高级用户可以将这些默认值更改为他们的首选设置(N 倍、分割、可优化指标等)。

然后,AuDaS 将使用 Mind Foundry 的专有贝叶斯优化器( OPTaaS )在数百万个可能的解决方案中高效导航,以在不到 100 次迭代中确定最佳分类管道(特征工程、模型和最佳参数)。

在执行这种搜索时,AuDaS 向用户提供了关于测试管道、模型和参数值及其相关性能统计和特征相关性的完全透明性。

对于指定的分类模型,字数、过去的总通信量和主题热度是预测电子邮件状态的最相关的特征。用户还可以访问 AuDaS 尝试过的所有单一模型的完整审计跟踪。

阶段 3:模型验证和部署

当用户对模型性能满意或已经完成 100 次迭代时,AuDaS 将在 10%平衡支持下验证模型,并提供模型健康建议。在我们的案例中,对保留数据的测试与优化过程中的交叉验证测试一致,模型健康状况良好。这意味着用户可以对模型提供的见解充满信心,并将其部署到生产中。

然后,用户可以上传测试集来预测电子邮件状态结果,对模型进行评分,或者通过可以集成到您的产品中的 RESTful API 自动部署它。

API documentation for the classification model

AuDaS 还提供了对预测的时间解释,让你了解每个特征对预测结果的贡献。一个简单的 web 应用程序展示了你如何与训练好的模型进行交互:

阶段 4:提高性能

在我们的第一次运行中,我们对所有 3 个类的分类准确率为 51%,这比随机分类要好,但并不理想。我们知道电子邮件状态值 0、1、2 代表忽略、已打开和已转换,为了提高模型的性能,我们可以尝试重新组合 0 和 1,因为它们的结果对于营销人员来说是相同的。通过在数据准备阶段重新分组类别并重新训练模型,我们能够在 10%的保留率上实现 73.7%的更好的分类准确度。

更完整的教程可以在下面查看:

如果您喜欢这篇文章,并且很想知道您还可以用 AuDaS 解决什么问题?检查我的其他职位如下:

[## 利用 AuDaS 在几分钟内解决 Kaggle Telco 客户流失挑战

AuDaS 是由 Mind Foundry 开发的自动化数据科学家,旨在允许任何人,无论是否有…

towardsdatascience.com](/solving-the-kaggle-telco-customer-churn-challenge-in-minutes-with-audas-2273fed19961)

如果你有兴趣尝试奥达斯,请不要犹豫,联系 out !

更新:我开了一家科技公司。你可以在这里找到更多的

团队和资源

Mind Foundry 是牛津大学的一个分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创建,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新、牛津技术与创新基金、、牛津大学创新基金和 Parkwalk Advisors 。

Python 中优化的 I/O 操作

原文:https://towardsdatascience.com/optimized-i-o-operations-in-python-194f856210e0?source=collection_archive---------2-----------------------

使用 Python 的数据科学堆栈加速分析的输入/输出技巧

在处理数据密集型应用程序时,我经常面临输入/输出(I/O)挑战,这是每个性能关键型应用程序的瓶颈。随着存储数据量的增加,有必要将数据存储在磁盘中,以通过将数据从磁盘加载到 RAM 来弥补 RAM 的不足,反之亦然。因此,在处理金融数据或任何科学数据时,I/O 操作本质上是非常重要的任务。

通过这篇文章,我试图揭示一些图书馆和他们的商业技巧。Python 有内置的功能,可以用来将对象存储在磁盘上,并从磁盘读取到 RAM 中。此外,Python 在处理文本文件和 SQL 数据库时非常健壮。Pandas 库提供了大量的类和方法来读写各种格式的文件。

我们将在这里研究以下领域的数据存储和检索方法:

  1. 使用 Pickle 模块的序列化存储
  2. 对文本数据的 I/O 操作
  3. SQL 数据库
  4. 具有 PyTables 的 I/O

在 Python 语言中优化 I/O 操作时要考虑的两个主要因素是效率(性能)和灵活性。让我们直入主题:

使用 Pickle 模块的序列化存储

Python 语言中有许多模块,可以在大规模部署环境中轻松使用。

使用 pickle 模块读写文件

您需要将数据存储在您的磁盘上,以便以后共享、记录或使用。我们有 pickle 模块,它序列化 python 对象以快速进行读写操作。

# On running the above code snippet, you'll see:CPU times: user 40.9 ms, sys: 14 ms, total: 54.9 ms
Wall time: 54.5 ms

随机浮点构建一个 9MB 的文件,该文件被序列化为字节流并在 54.9 毫秒内写入磁盘。您将使用 pickle 模块的 dumpload 函数分别写入和读取文件。要断言序列化和反序列化的数据,可以使用 Numpy 的 allclose 方法。你可以这样做:

np.allclose(np.array(a1), np.array(a2))# here a2 is the deserialized object after reading the same file
# using the load function.

因此,pickle 模块存储了 python 列表、dict 等。在将它们转换成磁盘上的字符流之后。这里的关键是这个字节流包含了在另一个 python 脚本中重建对象所必需的信息。

对文本数据的 I/O 操作

Python 一直是最受欢迎的语言,尤其是在处理文本文件时,因为它具有处理文本数据的健壮性和易用性。有几个选项来操作字符串对象和一般的文本文件。

要编写 CSV(逗号分隔值),我们可以使用 write 和 readline 方法:

csv_file.write(header)# time is time array and data is the dummy numpy array
**for** time, (a, b, c, d, e) **in** zip(time, data): 
  s = '%s,%f,%f,%f,%f,%f**\n**' % (time, a, b, c, d, e)                csv_file.write(s)csv_file.close()# to read the file, we can use readlines function
content = csv_file.readlines()

虽然 python 提供了处理文本文件的方法,但是我们有 pandas 库,它可以读写各种数据格式,并且更好更容易获得。

无论是 CSV(逗号分隔值)、SQL(结构化查询语言)、XLS/XLSX(Microsoft Excel 文件)、JSON(Javascript 对象表示法)还是 HTML(超文本标记语言)。

熊猫让整个 CSV 文件的读写过程变得更加方便、简洁、快捷。

%time data.to_csv(filename + '.csv')# CPU times: user 5.59 s, sys: 137 ms, total: 5.69 s# And to read the files back from the diskpd.read_csv(<path to the CSV file>)

SQL 数据库

Python 附带了对 SQL 数据库 SQLite3 的支持。使用 python,我们可以处理几乎任何类型的数据库(SQL 或 NoSQL)。

SQL 查询被写成字符串对象,其中语法和数据类型取决于所使用的数据库。说明了在 SQLite 数据库中通过 python 创建 Todo 表:

import sqlite3 as sq# query string to create the tablequery = 'CREATE TABLE TODO_NUMBER (Num1 real, Num2 real, Num3 real)'
con = sq.connect(path + 'todo.db')
con.execute(query)
con.commit()

让我们尝试在创建的数据库中插入一些数据,

data = np.random.standard_normal((1000000, 3))
%%time
con.executemany('INSERT INTO TODO_NUMBER VALUES (?, ?, ?, ?, ?)', data)
con.commit()# Time taken: CPU times: user 10.3 s, sys: 316 ms, total: 10.6 s
Wall time: 11 s

将 100 万行写入数据库是一项有点繁重且耗时的任务。读取数据库要快得多:

con.execute('SELECT * FROM TODO_NUMBER').fetchall() 

如果在数据库中处理大量的数字和数组,可以利用 Numpy 数组将数据直接读入 numpy ndarray。

np_query = 'SELECT * FROM TODO_NUMBER WHERE Num1 > 0 AND Num2 < 0'
res = np.array(con.execute(np_query).fetchall()).round(3)

这是一个非常好的技巧,可以毫不费力地读取和绘制查询结果。为了使读取更加高效和优化,我们应该使用 pandas 读取整个表和查询结果。当整个表被加载到内存中时,分析和处理变得更快。这是通过使用子库 pandas.io.sql 实现的

import pandas.io.sql as pds
data_df = pds.read_sql('SELECT * FROM TODO_NUMBERS', con)

该表现在被加载到内存中,这使得处理速度更快。使用 SQLite3 需要几秒钟的 SQL 查询在内存中使用 pandas 时在几毫秒内完成:

%time data_df[(data_df['Num1'] > 0) & (data_df['Num2'] < 0)].head()# CPU times: user 50 ms, sys: 0 ns, total: 50 ms# Wall time: 49.9 ms

我们可以用 pandas 掌握更多复杂的查询,它会比 SQL 更快地产生结果,但它不能取代 SQL。鉴于 pandas 能够复制 SQL 查询,我们可以使用 pandas 的内存处理显著加快分析速度。

这里需要注意的一点是,pandas 并不是用来取代 SQL 数据库的,目前它也不能取代 SQL 数据库。Pandas 不支持关系数据结构。

具有 PyTables 的 I/O

PyTables 是针对 HDF5 数据库/文件标准的 Python 绑定。它是专门为增强 I/O 操作的性能和充分利用可用硬件而设计和开发的。它在加速分析和更快生成输出方面做得非常好。PyTables 数据库可以容纳许多表,它支持压缩和索引,还支持对表的重要查询。

PyTables 具有基于文件的数据库格式。让我们看一下表格的工作原理,

这将为我们创建一个带有指定数据类型的必需字段的表。现在让我们填充数据库,我们必须创建一些随机值,并将它们逐行写入表中,如下所示:

但是同样,我们有一种更优化和 Pythonic 化的方法来达到相同的结果,即利用 NumPy 结构化数组:

dty = np.dtype([('Num1', 'i4'), ('Num2', '<i4')])sarray = np.zeros(len(ran_int), dtype=dty)

现在我们已经在表中设置了完整的数据,这一切都归结为表的创建,如下所示:

%%time
h5.create_table('/', 'ints_from_array', sarray,title='Integers', expectedrows=rows, filters=filters)

这种方法速度更快,而且我们用更少的代码行完成了同样的结果。我们可以使用以下命令删除重复的表:

h5.remove_node(‘/’, ‘ints_from_array’)

pandas 和 PyTables 都能够处理复杂的类似 SQL 的查询、索引和选择。就 I/O 操作而言,它们都经过了速度设计和优化。

使用 PyTables 的一个主要优点是它的压缩操作方式。它使用压缩不仅可以节省磁盘空间,还可以提高 I/O 操作的性能。

结论

一般来说,金融或科学中的许多企业级应用领域只需基于阵列的数据建模就能取得成功。在大多数情况下,结合使用 NumPy 和 PyTables I/O 功能可以显著提高性能。事实证明,基于 HDF5 的商店是所有方法的独特补充。

如果你有复杂的数据结构,表现出单个对象/表之间的许多关系,关系数据库有它的优点。这在某些情况下可能证明是合理的,在这些情况下,与纯基于 NumPy ndarray 或基于 pandas DataFrame 的方法相比,存在性能劣势。

Harshit 的数据科学

通过这个渠道,我计划推出几个涵盖整个数据科学领域的系列。以下是你应该订阅频道的原因:

  • 该系列将涵盖每个主题和副主题的所有必需/要求的高质量教程。
  • 解释了为什么我们在 ML 和深度学习中做这些事情的数学和推导。
  • 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
  • 项目和说明,以实现迄今为止所学的主题。

你可以在 LinkedIn 、 Twitter 或 Instagram 上与我联系(在那里我谈论健康和福祉。)

注意:在这些黑暗的时期,自我隔离为自我提升腾出了一些空间,我们可以利用这些空间来发展新的技能、爱好,并帮助未来的自己。

优化器是 TensorFlow 的开胃菜

原文:https://towardsdatascience.com/optimizers-be-deeps-appetizers-511f3706aa67?source=collection_archive---------6-----------------------

Photo by Patrick McManaman on Unsplash

随着大量深度学习框架的兴起,训练深度学习模型变得日益容易。TensorFlow 就是这样一个框架。

尽管最初只在谷歌内部使用,但它在 2015 年被开源,此后一直是 ml 爱好者和研究人员使用最多的框架之一。

但是不管这个框架对我们有多大帮助,还是有一些超参数会对我们训练的模型产生重大影响。改变一个超参数,也就是说,tensorflow 中的一行代码可以让你从 70%的准确率达到最先进的水平。

在 TensorFlow 中,为了调整我们的模型,我们必须做出一些优化选择。正如该领域的许多领导者所说,机器学习是一个高度迭代的过程。选择超参数没有硬性规定。你必须遵循这个过程

试→调→提高→试→调→提高→试→

在使用 TF 时,您会遇到两个重要的超参数。他们是初始化器优化器

想象一下“ 成本山 ”。

我们的目标是到达成本山的底部。

The “cost hill”

把初始化器看作是你开始下坡路的起点。和优化器作为你走下坡路的方法。

初始化器用于初始化我们神经网络各层之间的权重。虽然我们可能会认为它们只是我们探索“成本山”底部之旅的随机起点,但它们远不止看上去那么简单。

阅读这篇关于为什么初始化如此重要的博客。

* [## 神经网络的随机初始化:过去的事情

最近,神经网络已经成为几乎所有机器学习相关问题的解决方案。仅仅是因为…

towardsdatascience.com](/random-initialization-for-neural-networks-a-thing-of-the-past-bfcdd806bf9e)*

然后我们有优化器。它们被用来决定我们下坡的步伐。我们可以通过三种主要方式实现这些跨越。

  1. 批量梯度下降

2.小批量梯度下降

3.随机梯度下降

我们培训流程中的一个步骤包括以下内容:

正向传播→寻找成本→反向传播→寻找梯度→更新参数

批量梯度下降是指我们的整个训练集(即:我们的“m”个训练示例中的每一个)用于上述步骤。对“m”个训练样本进行前向传播,计算成本,对所有“m”个训练样本进行后向传播。对所有“m”个训练样本计算梯度。并且参数被更新。

简而言之,在向成本山的底部迈出一小步之前,计算机必须经历所有的“m”训练示例。当训练集示例的数量很小时,比如说在 1000 到 5000 之间,这是理想的。但在通常包含数百万训练样本的现代数据集上,这种方法注定会失败。原因是缺乏计算能力和磁盘空间来一次性计算所有的训练集示例。毕竟,我们只能朝着“成本山”向下迈出一小步。

batch gradient descent as shown on a slide from Andrew N G’s machine learning course on Coursera

注意成本是如何均匀地直线下降到成本山的底部的。这是在梯度下降的每一步中使用我们所有的‘m’训练示例的优势。这是因为我们使用所有梯度的平均值来更新我们的参数,这将最有可能直接朝着最小成本的方向。

随机梯度下降是一种方法,在这种方法中,我们一完成对每个训练集示例的计算,就开始采取向下的步骤。这有助于我们通过使用来自每个训练集示例的梯度来更新参数,从而在向下的旅程中尽快取得进展。这样,我们将在整个训练集的一次通过中向底部迈出“m”步,而不是在批量梯度下降中仅迈出一步。

这种方法可以快速得出结果,但有两个主要缺点:

首先,由于我们的每个训练集示例都是不同的,对每个示例计算的梯度都指向不同的方向,因此我们不会直接朝着最小成本的方向前进,而是不一致地、有效地朝着最小成本的方向前进。因此,参数实际上永远不会达到最小成本点,而只会一直在它的附近盘旋。

随机梯度下降的第二个缺点是,我们将失去向量化对代码的影响。矢量化是深度学习的核心,这是我们的计算机能够以如此快的速度执行如此复杂的计算的原因。在随机梯度下降中,由于计算是在每个训练集示例上一个接一个地进行的,因此必须使用 for 循环来遍历训练集,与矢量化计算相比,这可能需要花费一生的时间。

this image shows stochastic gradient descent

请注意成本如何有效地朝着成本最小点前进,但不是直接到达那里。它也永远不会真正达到最低成本,它只能在自己的区域内循环。

https://www.facebook.com/convolutionalmemes/

这就是小批量梯度下降发挥作用的地方。它处于批量梯度下降和随机梯度下降之间最佳点。我们不想通过一次获取所有的训练样本来浪费计算能力和内存。我们也不想因为一次只取一个训练样本而失去矢量化的能力。所以我们一次取多个训练样本,通常是 2 的幂。通过这种方式,我们可以在遍历整个训练集之前开始采取向下的步骤,而且还可以利用矢量化的能力来实现快速计算和更少的内存需求。

这是通过将我们的训练集分成固定数量的样本来完成的。这个数字被称为批量。它通常是 2 的幂。32 和 64 是常见的批量大小。训练集首先被混洗,因为我们不希望在每个时期计算相同的批次(一个时期是一次通过整个训练集,一个迷你批次接一个迷你批次)。下面给出了将训练集分割成小批次的代码。

我在 TensorFlow 中训练了一个模型,使用时尚-MNIST 数据集识别 10 种不同类型的衣服。该数据集由 70,000 幅灰度图像组成。每张图片属于十类服装中的一类。

这是我在 GitHub 上训练过的模型的代码。

一如既往的快乐学习。

ps:忽略俗气的标题

混乱中的秩序(球体):流亡者动荡经济之路中的新兴模式

原文:https://towardsdatascience.com/order-within-chaos-orbs-emerging-patterns-in-path-of-exiles-volatile-economy-dfb81c08bd73?source=collection_archive---------24-----------------------

Path Of Exile: Necromancer

你可能听说过流放之路。一款由 Grinding Gear Games 发行的免费动作角色扮演游戏,让你扮演流亡者的角色。一个看似命运多舛的弃儿,因为各种各样的原因被逐出文明,这取决于你的角色的职业。这个游戏的重点是简单地通过世界上所有被称为 Wraeclast 的区域,并参与各种支线剧情(或者我们玩家喜欢称之为“残局”)

在你的 Wraeclast 之旅中,你会遇到数千种类型的战利品。一些物品,一些独特的物品,和许多不同的货币,允许你修改你的物品和技能。

Path of Exile: A few types of currency

《流放之路》的魅力之一就来自于这一大堆战利品,那就是交易。一些玩家投入大量的时间,甚至全部时间来交易。这些交易员怎么可能赚钱?他们如何跟随市场?当每天有成千上万的交易发生,有成千上万不同的商品被买卖时,交易者如何在混乱中找到自己的位置?

当然是数据科学!对于这个特别的项目,我使用了 GGG 的公共 API,做了大量的网络搜集工作。仅货币一项,我总共收集了近 6000 万个数据点。然后,我拿到了我最喜欢的六种货币的分布情况,其中包括令人垂涎的尊贵宝珠。

现在,看着这个分布,被高举的球体立即出现在我眼前,因为它接近于符合钟形曲线。所以我决定先探索一下。我用如下模式将我的数据框架中的所有货币分段

standard_league = currency_all.loc[currency_all.League == 'Standard']
abyss_league = currency_all.loc[currency_all.League == 'Abyss']
bestiary_league = currency_all.loc[currency_all.League == 'Bestiary']
delve_league = currency_all.loc[currency_all.League == 'Delve']
harbinger_league = currency_all.loc[currency_all.League == 'Harbinger']
incursion_league = currency_all.loc[currency_all.League == 'Incursion']

所以现在我们有了一个包含每个联盟所有货币交易的数据框架。但是我不想要所有的货币,我只想要那个高贵的球体。所以我再一次像这样分割数据帧。

exalted_standard = standard_league[standard_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_abyss = abyss_league[abyss_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_bestiary = bestiary_league[bestiary_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_delve = delve_league[delve_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_harbinger = harbinger_league[harbinger_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_incursion = incursion_league[incursion_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)

现在,我们有了每个联盟的每个尊贵球交易的数据框架。在这一点上,我决定把我的数据制成图表,把日期作为我的 x 轴,把它卖出的混沌球的数量作为我的 y 轴。

从图表上看,每个联盟都出现了一个非常清晰的模式。对于新联盟的前三分之一,尊贵球体的价格急剧上升。对于联盟的其余部分,它开始正常化。这种模式在六个不同的新兴经济体中持续了整整一年。这是一种模式,将继续重复自己,直到崇高的球体变得无关紧要,虽然我没有预见到这种情况会发生。

这种模式不是尊贵的球体独有的。虽然不是所有的货币,但这种现象在许多货币中都存在。这里有另一个货币的例子,你可以在前两周购买/耕种,并获得可观的利润(与其初始联盟价格成比例)。在所有联盟中,它都有一个非常相似的模式。

那么,怎么才能赚钱呢?好吧,如果你只经营高贵的球体,你会在联赛的前两个星期购买高贵的球体,然后在顶峰时卖掉它们。

无论如何,如果你能以少于 120 个混乱之球获得尊贵之球,你将会获利。正如你所看到的,标准联盟,这是持久的,有一个强大的货币基线。你可以对游戏中的任何货币这样做。虽然肯定有一些货币你不会从中获利。

我们可以利用这种知识,这种对模式的认识来将我们的收益资本化,并防止在不正确的时间段买卖货币类型。感谢您的阅读,我们在 Wraeclast 再见!

组织与创造

原文:https://towardsdatascience.com/organizing-vs-creating-64bb807f34db?source=collection_archive---------4-----------------------

我一直想写更多,但直到几周前我还没有时间。这是真的,不仅仅是写作,还有很多我想做的长期项目。这篇文章探讨了为什么——如果你有自己的长期项目,并且想继续下去,这可能会帮助你理解为什么你还没有开始,从而尽快开始。

人们很容易指责拖延的通常来源,从完美主义到懒惰,因为没有从事长期项目。但是还有更深层的原因:从事这类项目是一种与我们通常所认为的“工作”完全不同的工作,需要一种完全不同的时间管理方法来完成。

组织工作与创造性工作

工作可以有一个范围,从需要反复做同样事情的根本不经思考的工作到需要综合信息和想法的根本创造性工作。

在白领环境中,重复性的工作可能是一遍又一遍地将文件指向文件夹或从文件夹中拖出;在蓝领背景下,可能是开卡车。

人们普遍认为,所有这类工作最终都将实现自动化。在某些情况下,这将在明年的这个时候发生,在其他情况下,这将需要 30 年,但在所有情况下,计算机最终将被编程来完成这些任务。许多作者已经写了如何最大化生产力,你应该尽可能减少你做的这种工作的数量——考虑到这种工作在其他地方受到的待遇,我不会在本文的剩余部分集中讨论这种工作。

另一端是基本的创造性工作,期望的结果是意想不到的、新奇的或明显的“人”。写一首其他人会喜欢的诗或文章,或者构思、设计并编写(部分)解决人类基本问题的应用程序就是这样的例子。人们普遍认为,这种工作是你所能做的最具挑战性但又最有成就感的工作之一,而且几乎从定义上来说,这是最难的一种教人如何做或给计算机编程的工作。我们推迟的大多数长期项目也属于这一类。

中间的工作类型是白领工作中花费大部分时间的类型,很少被检查:基本上是“组织”任务。在这些任务中,你想要的结果很容易理解或解释——在这些任务中,其他人可以很容易地评估你是否完成了你想要的目标。

几乎我们所有人在这里花费的时间都比我们意识到的要多。例如,虽然开发人员喜欢以不同的方式思考,但事实上大多数编码都属于这一类。虽然从字面意义上来说,编码确实涉及“创造”一些新的东西,也涉及使用高度专业化的技能,这可能是非常高的需求,但编码人员花大部分时间做的事情是考虑“打点一切”,以这样一种方式,计算机可以执行他们试图让它执行的东西。

在其他白领工作中,被认为是“工作”的任务,比如回复电子邮件(现在是 Slack messages),在电子表格上组织分析,当然,参加会议,本质上只是“组织”——清理刷子,以便你或你的团队可以完成重要的实际工作。

请注意,不仅仅是个人和组织应该在创造性工作上花尽可能多的时间,在组织工作上花尽可能少的时间。例如,我认为创建引人注目的 PowerPoint 演示文稿是一项基本的创造性任务,尽管花费数小时创建并讨论 PowerPoint 被广泛认为是低效的时间利用。相比之下,虽然调试代码主要是组织性的,但它可能非常有价值,许多老组织旗下的投资雇佣和开发优秀的程序员。一个并不比另一个“更好”(尽管我们都知道有些人似乎只完成组织任务,因此总是很忙,但仍然“什么也做不了”)。这篇文章的重点不是贬低组织工作,而是指出为了完成的创造性工作,你必须首先意识到你花时间做的大部分事情实际上是基本的“组织”工作。

下一步是要认识到,从做组织工作到做创造性工作需要一种不同的方法来管理你工作的时间。这是为什么呢?关键的区别在于,在组织工作中,你不需要特别考虑时间管理。你大部分时间都可以在工作中“埋头苦干”。你可以休息一下,返回,然后在十秒钟内回到你离开的地方。上下文切换的成本很低——你可以回复一封电子邮件或一条短信,然后马上回到你离开的地方。

创造性的工作——比如设计一个应用程序,写一篇文章,或者做一个向他人教授某个主题的演示——是不同的。你需要一段时间才能“进入状态”。它包括即使在处理具体细节时,也要牢记大局。你需要长时间不被打扰,不做其他事情。

一幅插图

在我职业生涯的前 3-4 年,我和大多数大学毕业后的白领工人相似,因为我的工作基本上是组织性的。

我从事咨询工作,在 Excel 中做各种分析,并根据这些分析制作幻灯片。虽然在商业世界中有一些创造性思维和大量接触各种决策者的机会,但大部分工作基本上都是组织性的。我的下一份工作也有同样的正面和负面影响,那是在 Capital One 的内部咨询部门工作。即使在 Trunk Club 开始担任数据科学家,在更具创造性的领域工作并实施尖端技术(使用 Python 为监督学习算法编写机器学习管道)后,大部分工作仍然是有组织的,在工作的演示和交流中有一些创造性的成分。

我过去四个月的工作是在 Metis 担任高级数据科学家,教授全职沉浸式数据科学项目——这份工作比我以前的任何工作都涉及更多“创造性”工作。

这里有一个例子:两周前,我必须想出一个令人难忘的方法来教学生 Selenium,他们最终使用这个库创建了一些惊人的webscraping项目。

首先,我必须想出一个用代码似乎不“可行”的想法,并且适用于他们的日常生活——我决定向他们展示如何使用 Python 代码在 OpenTable 上进行预订。然后,我必须安排讲座,从一个简单的例子开始,逐步增加到一个更复杂的例子——在这里,我得到了 Metis 非常好的预制教学资源的帮助——在我进行的过程中,思考什么对学生来说是清楚的,什么是具有挑战性的。当解释不同的主题时,即使弄清楚细节和类比的水平也是一个挑战,这本身就可能是学生在整个项目中广泛使用图书馆或害怕使用图书馆的区别。

此外,作为 Metis 讲师工作的一部分,我们需要发展成为数据科学方面的“T0”思想领袖——在当地集会和全国会议上演讲(我的合作老师 5 月在 ODSC 东部演讲,我将于 11 月在 ODSC 西部演讲),撰写关于数据科学、商业和时间管理的中型帖子——这些都是创造性的任务。

当我说这项工作是“创造性的”时,我的意思是它结合了技术和移情思维,创造了一些新的东西来解决“问题”,无论该问题是“教授数据科学学生网络搜集”还是“写一篇关于工作类型和时间管理的令人信服的文章”。我并不认为这项工作与构思和写作伟大的美国小说处于同一水平——但尽管程度不同,性质相同,因为它需要同样的“深入”思考。因为这项工作需要“深入”的思考,你不能简单地“埋头苦干”——在工作和其他事情之间切换,在工作的时候回复懈怠的信息,等等。

一个解决方案

那么:你应该如何管理你的“工作”时间来完成这项创造性的工作呢?我的解决方案是安排“无其他时间”:至少半个小时的时间,不允许我做任何其他事情。不查邮件,不回短信,不被其他“紧急”的事情分心。

这与我过去的工作方式大不相同。我曾经不断地在工作和检查电子邮件或懈怠之间切换,发送文本,处理现代生活的所有干扰(包括但不限于社交媒体)。事实上,在你的工作基本上是组织性的工作中,这是可以的——它甚至会让人感觉非常有效率,因为发送电子邮件和短信一种“完成事情”的形式!事实上,从事创造性项目最初会感觉效率较低,因为它们的本质使得它们很慢,需要大量的修改——然而,如果你能花 10 分钟回复那封邮件,你就可以“从待办事项清单上划掉一些事情”!但是,如果你想从事创造性的工作,你必须打破这种工作习惯。安排“没有别的时间”是我做这件事的一种方式。

虽然可能有外部因素——无论是家里的家庭还是工作中不断开会的文化——阻止我们腾出时间进行创造性工作,但通常主要的障碍是我们自己的习惯。如果我要给出如何改变你的工作习惯以完成更有创造性的工作的第一步,那就是:安排至少半个小时(把它放在你的日历上)你不会查看电子邮件、社交媒体或做任何其他事情的时间,并在这段时间工作。当然,你可以“优化”这半小时,比如在工作时喝防弹咖啡或听完美的“生产力”播放列表,但所有这些优化都是次要的。最重要的是安排好时间,在这段时间里不要做其他事情。这就是我最终能够腾出时间开始在媒体上写作的原因。

安排这个时间是我发现的唯一打破“不断工作”和“感觉富有成效”的习惯的方法,通过做组织性的任务,比如回复电子邮件。我希望它对你有用;尝试一下,这样你就可以腾出时间来做你一直想做的创造性工作。

组织你的第一个文本分析项目

原文:https://towardsdatascience.com/organizing-your-first-text-analytics-project-ce350dea3a4a?source=collection_archive---------5-----------------------

使用自然语言工具发现会话数据。

文本分析或文本挖掘是使用各种方法、工具和技术对自然语言文本中包含的“非结构化”数据进行分析。

如今,文本挖掘的流行是由统计数据和非结构化数据的可用性推动的。随着社交媒体的日益流行,以及互联网成为各种重要对话的中心位置,文本挖掘提供了一种低成本的方法来衡量公众意见。

这是我学习文本分析和写这篇博客并与我的数据科学家同事分享我的学习的灵感!

我这篇博客的主要参考是 DataCamp 设计精美的课程文本挖掘——单词袋。

下面是文本挖掘项目的六个主要步骤。在这篇博客中,我将关注第 3、4、5 和 6 步,并讨论 R 中可用于这些步骤的关键包和函数。

1.问题定义

确定任何项目的具体目标是项目成功的关键。人们需要对领域有所了解,才能恰当地定义问题陈述。

在这篇文章中,我会问,根据在线评论,亚马逊和谷歌的薪酬水平更高,根据当前员工的评论,哪家的工作生活平衡更好。

2.识别文本来源

可以有多种方式来收集员工评论,从 Glassdoor 这样的网站,甚至是与工作场所评论一起发布的文章,甚至是通过员工的焦点小组访谈。

3.文本组织

这涉及到清理和预处理文本的多个步骤。R 中有两个主要的包可以用来执行这个: qdaptm

要点记住:

  • tm 包处理文本语料库对象
  • qdap 包直接应用于文本向量

x - >对亚马逊有正面评价的向量

*# qdap cleaning function* > qdap_clean <- function(x)  {
  x <- replace_abbreviations(x)
  x <- replace_contractions(x)
  x <- replace_number(x)
  x <-  replace_ordinal(x)
  x <-  replace_symbol(x)
  x <-  tolower(x)
  return(x)
}
  • *根据具体要求,您还可以在上述功能的基础上增加更多清洁功能。

语料库->v corpus(vector source(x))

然后使用 tm_map() 函数——由 tm 包提供——对语料库应用清理函数。将这些函数映射到一个完整的语料库使得清洗步骤的缩放变得非常容易。

*# tm cleaning function*
> clean_corpus <- function(corpus){
 corpus <- tm_map(corpus, stripWhitespace)
 corpus <- tm_map(corpus, removePunctuation)
 corpus <- tm_map(corpus, content_transformer(tolower))
 corpus <- tm_map(corpus, removeWords, c(stopwords("en"), "Google", "Amazon", "company))
 return(corpus)
}

单词词干和使用 tm 包完成句子上的词干

tm 包提供了 stemDocument() 函数来获取单词的词根。这个函数要么接受一个字符向量并返回一个字符向量,要么接受一个 PlainTextDocument 并返回一个 PlainTextDocument。

*# Remove punctuation*
> rm_punc <- **removePunctuation**(text_data)

*# Create character vector*
> n_char_vec <- **unlist(strsplit**(rm_punc, split = ' '))

*# Perform word stemming: stem_doc*
> stem_doc <- **stemDocument**(n_char_vec)

*# Re-complete stemmed document: complete_doc*
> complete_doc <- **stemCompletion**(stem_doc, comp_dict)

点记:

定义您自己的 comp_dict ,这是一个自定义词典,包含您想要用来重新完成词干的单词。

4.特征抽出

在完成了对文本的基本清理和预处理后,下一步就是提取关键特征,可以通过情感评分或提取 n 元图并绘制的形式来完成。为此,术语文档矩阵 (TDM)或文档术语矩阵 (DTM)函数非常方便。

*# Generate TDM*
> coffee_tdm <- **TermDocumentMatrix**(clean_corp)

*# Generate DTM*
> coffee_dtm <- **DocumentTermMatrix**(clean_corp)

要点记住:

当你要复习的单词比文档多的时候,你可以使用 TDM,因为阅读大量的行比阅读大量的列更容易。

然后,您可以使用 as.matrix ()函数将结果转换成矩阵,然后对这些矩阵的各个部分进行切片和检查。

让我们看一个为二元模型创建 TDM 的简单例子:

为了创建一个二元模型 TDM,我们使用 TermDocumentMatrix ()以及一个接收控制函数列表的控制参数(更多细节请参考 TermDocumentMatrix )。这里使用了一个名为标记器的内置函数,它有助于将单词标记为二元模型。

*# Create bigram TDM*
> amzn_p_tdm <- TermDocumentMatrix(
amzn_pros_corp,
control = list(tokenize = tokenizer))*# Create amzn_p_tdm_m*
> amzn_p_tdm_m <- as.matrix(amzn_p_tdm) 

*# Create amzn_p_freq* 
> amzn_p_freq <- rowSums(amzn_p_tdm_m)

5.特征分析

有多种方法来分析文本特征。下面讨论其中的一些。

a.条形图

*# Sort term_frequency in descending order*
> amzn_p_freq <- sort(amzn_p_freq, decreasing = TRUE) > 

*# Plot a barchart of the 10 most common words*
> barplot(amzn_p_freq[1:10], col = "tan", las = 2)

b.WordCloud

*# Plot a wordcloud using amzn_p_freq values*
> wordcloud(names(amzn_p_freq), amzn_p_freq, max.words = 25, color = "red")

要进一步了解绘制 wordcloud 的不同方法,请参考这篇文章,我发现它相当有用。

c .聚类树状图

这是一个简单的聚类技术,用于执行层次聚类并创建一个树状图来查看不同短语之间的联系。

*# Create amzn_p_tdm2 by removing sparse terms*
> amzn_p_tdm2 <- removeSparseTerms(amzn_p_tdm, sparse = .993) > 

*# Create hc as a cluster of distance values*
> hc <- hclust(dist(amzn_p_tdm2, method = "euclidean"), method = "complete") > 

*# Produce a plot of hc*
> plot(hc)

你可以在整个树形图中看到类似的主题,如“巨大的利益”、“高薪”、“聪明人”等。

d .单词联想

这用于检查出现在单词云中的顶级短语,并使用来自 tm 包的 findAssocs() 函数找到相关术语。

下面的代码用于查找与亚马逊正面评论中最频繁出现的词语最相关的单词。

*# Find associations with Top 2 most frequent words*
> findAssocs(amzn_p_tdm, "great benefits", 0.2)
 $`great benefits`
 stock options  options four four hundred vacation time
     0.35          0.28         0.27          0.26
 benefits stock competitive pay   great management   time vacation
     0.22              0.22                  0.22          0.22> findAssocs(amzn_p_tdm, "good pay", 0.2)
 $`good pay`
 pay benefits  pay good  good people  work nice
     0.31        0.23        0.22       0.22

e .比较云

当您希望一次检查两个不同的单词库,而不是分别分析它们(这可能更耗时)时,可以使用这种方法。

下面的代码比较了对谷歌的正面和负面评价。

*# Create all_goog_corp*
> all_goog_corp <- tm_clean(all_goog_corpus) > # Create all_tdm
> all_tdm <- TermDocumentMatrix(all_goog_corp)

<>
Non-/sparse entries: 2845/1713
Sparsity : 38%
Maximal term length: 27
Weighting : term frequency (tf)

*> # Name the columns of all_tdm*
> colnames(all_tdm) <- c("Goog_Pros", "Goog_Cons") > # Create all_m
> all_m <- as.matrix(all_tdm) > # Build a comparison cloud
> comparison.cloud(all_m, colors = c("#F44336", "#2196f3"), max.words = 100)

f .金字塔图

金字塔图用于显示金字塔(相对于水平条)图,有助于根据相似的短语进行简单的比较。

下面的代码比较了亚马逊和谷歌正面短语的出现频率。

*# Create common_words*
> common_words <- subset(all_tdm_m, all_tdm_m[,1] > 0 & all_tdm_m[,2] > 0)
> str(common_words)
 num [1:269, 1:2] 1 1 1 1 1 3 2 2 1 1 ...
 - attr(*, "dimnames")=List of 2
 ..$ Terms: chr [1:269] "able work" "actual work" "area traffic" "atmosphere little" ...
 ..$ Docs : chr [1:2] "Amazon Pro" "Google Pro"

*# Create difference*
> difference <- abs(common_words[,1]- common_words[,2]) >

*# Add difference to common_words*
> common_words <- cbind(common_words, difference) > head(common_words)
 Amazon Pro Google Pro difference
 able work 1 1 0
 actual work 1 1 0
 area traffic 1 1 0
 atmosphere little 1 1 0
 back forth 1 1 0
 bad work 3 1 2

*# Order the data frame from most differences to least*
> common_words <- common_words[order(common_words[,"difference"],decreasing = TRUE),]

*# Create top15_df*
> top15_df <- data.frame(x = common_words[1:15,1], y = common_words[1:15,2], labels = rownames(common_words[1:15,]))

*# Create the pyramid plot*
> pyramid.plot(top15_df$x, top15_df$y,
 labels = top15_df$labels, gap = 12,
 top.labels = c("Amzn", "Pro Words", "Google"),
 main = "Words in Common", unit = NULL)
 [1] 5.1 4.1 4.1 2.1

6.得出结论

基于上述视觉(“共同语言”金字塔图),总体而言,亚马逊看起来比谷歌有更好的工作环境和工作生活平衡。亚马逊的工作时间似乎更长,但也许它们为恢复工作与生活的平衡提供了其他好处。我们需要收集更多的评论来做出更好的结论。

所以,最后我们来到这个博客的结尾。我们学习了如何组织我们的文本分析项目,清理和预处理中涉及的不同步骤,以及最终如何可视化功能并得出结论。我正在完成我的文本分析项目,这是基于我的博客和从 DataCamp 学到的东西。我将很快贴出我的 GitHub 项目库来进一步帮助你。我们的下一个目标应该是进行情感分析。在那之前继续编码!!

希望你喜欢这个博客。请在我的下一篇博客中分享你喜欢的内容和希望我改进的地方。

请继续关注这个空间,了解更多信息。干杯!

(首发@www.datacritics.com)

缩小纽约市的技能差距

原文:https://towardsdatascience.com/originally-published-on-the-tableau-community-daf58c97e84f?source=collection_archive---------4-----------------------

原载于 画面 社区

D 没有数据可视化,数据分析仍然不完整。

在为期 8 周的数据分析课程中,我很快理解了 Tableau 是一个非常有用的工具,可以用来创建和解释一个严重依赖于大数据的视觉故事。作为一名学生,我得到了 x 案例,这些案例需要数据检索、清理、处理和分析,以便提出适当的建议。

首先,我拥有金融和国际银行的双学位,并对数据分析有所了解。Tableau 的特点不仅易于理解,而且使用简单。从 Excel 到 R 再到 SQL,最后到 Tableau 的有趣旅程是一次很棒的经历,在我的课程结束后,我很兴奋地分享了一个严重依赖 Tableau 的项目。

我把这个项目分成了四个部分

  1. 这个问题
  2. 答案
  • 该过程
  • 调查结果

3.局限性

4.结论

我首先研究了这个问题,了解了缺少什么数据,并试图在我的 SQL 工作台中检索和创建一个实体关系图。由于重点是纽约市-MSA 地区,后来又将其削减至仅纽约市,我必须确保我筛选的数据仅反映了问题所在。我的发现是基于这些数据以及它们被分类和清理的方式。根据检索到的数据,我注意到各州技能的供需不匹配。我的 Tableau 工作表还查看了 11 个州的平均发布持续时间,我保持在 35 天。

下表总结了平均持续时间(以天为单位),并将其与所有州的职位发布百分比进行了比较。

问题

布鲁金斯学会最近对 Burning Glass 数据的研究发现,在全国范围内,STEM 职位空缺的广告持续时间中位数是非 STEM 职位空缺的两倍多。这个案件围绕着教育和领先的劳动力市场分析公司——燃烧的玻璃公司正在进行的辩论。该案件旨在-

该案件旨在-

  • 评估纽约市技能差距
  • 向纽约市技能联盟(NYCSC)提供数据驱动的建议
  • 帮助在十年内拨款 1 亿美元用于发展纽约市的劳动力。

全国独立商业联合会T21:

截至 2017 年第一季度,45%的小企业报告称,他们无法找到合格的申请人来填补职位空缺。

答案

为了评估城市的技能,详细的路线图需要联邦、州和私人基金会的合作努力。为了回答这个问题,我首先处理数据,然后根据调查结果看一些建议性的措施。

流程

在进入数据集之前,我首先试图理解技能差距的含义以及它为什么存在。简而言之,它是可获得的工作的需求和供应与理想候选人所需的必要技能之间的差异。由于各种因素,包括工作机会不足和缺乏适当的技能组合,这些差距有时会存在。

数据是 CSV 格式,有不同的职业,技能,县。重复项被删除,N/A 值被转换为空值。

使用 MySql Workbench 创建了一个实体关系图(ERD ),以便使用主键和外键对数据进行排序和连接。

调查结果

创建 ERD 后,我查看的信息仅限于纽约市。纽约市的五个县是布朗克斯、金斯、纽约、皇后区和里士满。我使用 R 来执行这个任务,并利用可用的数据,使用 Tableau 创建一个热图。数据显示,纽约市的职位发布数量最多,然后,我将重点放在纽约、新泽西和宾夕法尼亚三州的职位发布百分比上,以分析纽约的情况。

Tableau 中的这些发现如下

然后,我试着深入了解某个职位空缺需要多长时间。为此,我按职业(仅针对纽约市)将职位发布数量与平均职位发布时长进行了比较。我的发现表明,纽约市的缺口主要是由缺乏具备特定技能的工人造成的。MSA 地区代码是 234。

纽约的顶级职位来自三个行业:医疗保健、信息技术和金融会计。我试着使用 Table 创建一个气泡图来查看热门职位。(点击下图放大)

然后对纽约的顶级工作进行深入分析,我试图通过编辑经验水平、教育程度、证书名称来做到这一点。相应地,我会查看职位的数量以及这些职位发布后未被填补的平均天数。调查结果如下

1。医疗保健行业

医疗保健行业似乎对护理经理和注册护士的需求最大,下面列出了这些职位所需的证书。培训缺口很有可能是由于护理经理和注册护士没有必要的证书,使他们没有资格申请职位。

(点击下方放大图片)

2。金融业

通过 Tableau 查看可用数据并简化视觉效果,我的发现表明,对具有会计背景的入门级财务分析师和具有 3-5 年工作经验的税务经理有巨大的需求。仔细看,注册会计师和注册金融分析师课程是金融分析师寻求弥合技能差距的热门选择。

(点击下方放大图片)

3。信息技术产业

第三个可以从资金中获益的行业是信息技术行业。

通过数据排序,并在 Tableau 的帮助下,我能够直观地看到可能受益的顶级职位是商业智能分析师、it 项目经理、软件开发人员/工程师和系统分析师。对这些头衔的这种需求意味着两件事:要么是巨大的需求也能很快得到满足,要么是缺乏技能,这可能导致招聘进展缓慢。

就 IT 行业而言,后者似乎是正确的。仔细观察,可以得出这样的结论:像系列 7,项目管理认证(PMP)等证书将增加简历的价值的职位需求很高。虽然这对于处于中高层的人来说可能是正确的,但在早期阶段获得这样的证书可能会让一个值得的候选人在招聘名单上名列前茅。

(点击下方放大图片)

但是这个百万美元的问题仍然存在:在技能差距分析之后,地方当局可以采取什么样的建议性措施来缩小差距,使纽约市的就业率上升。经过彻底的文献回顾,我设计了几个步骤作为建议性措施,可以让企业、政府以及非营利组织更多地参与进来。

***** 表示支付有竞争力的薪酬可能是一种建议性措施,但所用数据可能/可能不支持这一点。这一措施是基于广泛的二手文献。

局限性

像大多数情况一样,所提供的数据受到一些限制,可能/可能无法确定上述措施。考虑的最大限制之一是数据的年份。由于没有提供年份,这一发现可能意味着 2016 年或 2017 年不成立。此外,在清理和分类时,无法获取有多少在职人员、失业者或劳动力中的工人拥有填补需求岗位所需的技能。当清理后的非结构化数据包含形成强大分析所需的必要组件时,可以做出谨慎的决策。从数据来看,工资没有被考虑在内,因为它很少,而且仅仅是因为缺少日期,很多数据都丢失了。由于没有可能影响数据集的实时信息或附加信息,建议也可能不同。

有时,行政管理的变化允许新的劳动法律法规生效。通过发送的数据给出的建议也可能不同,因为对实时信息或附加信息没有责任。我也观察了纽约市的整个城市,但我确信还有进一步分析的空间,观察单个县可能会显示技能差距的变化。

结论

参考文献

  • 哥伦比亚大学在线图书馆
  • “特朗普推进就业培训,将‘技能差距’辩论推向前台”——《纽约时报》,2017 年
  • Inc.com&彭博
  • 美国达拉斯联邦储备银行
  • 图片提供:知识共享/Flickr/Instagram
  • 白皮书:“工作中的新技能:缩小技能差距”
  • 白皮书:“通往繁荣之路:迎接挑战,让美国年轻人为 21 世纪做好准备”
  • 未来的工作

池塘的另一边,路的另一边

原文:https://towardsdatascience.com/other-side-of-the-pond-other-side-of-the-road-dd36538916bc?source=collection_archive---------10-----------------------

我刚从苏格兰出差回来,我觉得讨论自动驾驶汽车在不同国家之间的差异会很有趣。从美国到英国有一个非常明显的区别——汽车在路的另一边行驶!但是还有许多其他重要的不同之处。

在美国,如果你来到下面这条路,你可能会认为它是单行道。

All white lines in the US would indicate one-way…

但是你错了。

White lines in the UK can also separate driving directions.

在美国,白线通常用于指示你右边的道路外侧(在英国,人们天真地认为它会指示左边的道路),白色虚线指示同一方向的其他车道。黄线是用来指示你的方向和相反方向的车道之间的界限。英国用稍微长一点、近一点的白线来表示行驶方向的不同,用黄线来表示“禁止等待”区域。

The shorter lines are for lanes in the same direction, the longer ones separate directions.

Notice the yellow lines on the outside, indicating a no waiting area.

当然还有下面的弯曲线,我以前从未见过,但显然是向司机表明他们正在接近人行横道,除非允许行人穿过,否则不允许在该区域停车。

Approaching a pedestrian crossing

我错过了另一个不同之处的照片,这一次是刹车灯——英国使用(在我看来非常有用)一种在绿灯之前发出红色和黄色光的灯。这有助于提醒驾车者是时候踩油门了(或者,似乎是为了说明更常见的手动变速器启动所需的时间)。

在美国,经常有没有完整车道标志的区域,比如下面,这里实际上是一条双向道路。

A two-way road with little room for error

鉴于最近关于沃尔沃与袋鼠之间的困难的新闻,我想我也应该分享下面的图片(再次是一条双向交通的道路——有弯道要通过)。无论汽车在哪里,识别动物路障都将是一个问题。

“Don’t mind us”

对于任何试图制造可在多个地点使用的无人驾驶汽车的公司来说,解决国家和地区之间的一些差异无疑是一个挑战。也许为长途旅行下载 GPS 地图也需要汽车为旅行区域下载不同的规则和感知模型。这将是一个很难解决的问题。

我们的人工智能创业公司

原文:https://towardsdatascience.com/our-artificial-intelligence-startup-c7daf4c140a1?source=collection_archive---------7-----------------------

你好。我给你讲讲我们 AI 创业的故事吧。一路上我们犯了一些错误,我想你可能会从我们的故事中学到一些东西。

Me, walking along the beach in Israel, thinking about what to do next. My wife took the picture. Those are her shoes in my hand.

在过去的文章中,我谈到了为什么我们要启动我们的公司,我们对在人工智能咨询市场中的地位的感受,的客户在我们的领域中倾向于什么样子,我们如何看待我们的定价,以及更多关于机器学习前景和动态的内容。这篇文章应该填补缺失的环节,并解释我是如何进入这家初创公司的,以及公司的发展方向。

就人生规划而言,在全职工作的同时结婚生子,同时攻读硕士和博士学位,是非常愚蠢的。这…很有挑战性。我不能自己创业,因为我一个人做不起拉面这种有利可图的事情。

One big happy family

我妻子是全职妈妈,是学校董事会的指导顾问,在我像猴子一样在打字机前编程时,她通常管理整个房子。

生活太忙了。我不能开自己的公司。相反,我在别人的创业公司里工作过,并且过得很愉快。由于我父亲和他的朋友对高科技的投资,以及我岳父经销化学产品的生意,我得以在创业世界的幕后进行观察。我学到了很多。我的失败比我的成功更能说明问题。

With 3 kids and family responsibilities, you can’t really decide to “do your own thing”. This picture is from 2014.

我 2016 年在读博士,可以用兼职。我辞掉了全职咨询工作,专注于学业,靠我们积攒的一些积蓄生活。我不想完全离开行业,我在云计算/物联网领域有着良好的咨询历史,所以我和我的朋友 Mathieu Lemay 一起创办了一家咨询公司。我们知道我们会一起工作得很好,因为我们在以前的公司一起工作过,并且在很短的时间内完成了很多工作。我们开始把它作为一件次要的事情来做,它很快开始获得关注。因为我是兼职,马特是全职,我们把公司叫做勒梅解决方案咨询公司(最初只是勒梅解决方案)。自 2014 年 9 月 13 日起,马特就用 LemaySolutions.com 作为他的私人服务器,所以这个名字就流传了下来。在办公室,我们简称它为 LSCI。公司正式成立日期为 2016 年 6 月 22 日。

LSCI 是在一个车库里开始创业的。准确地说是我的车库。

Behind those tires was our first office space.

An empty desk is a sign of an empty mind?

Mathieu Lemay and I did the initial construction ourselves, and then had a professional do the rest. Materials came primarily from Home Depot. All said and done, we had installed electrical, drywall, a new 100 amp electrical panel, and much more.

公司的创始理念是 AI+IoT+云。我们的开销基本为零。最初,我们做任何有报酬的工作。我们有一份中文菜单,上面列有我们擅长的一切,基本上是寻找适合这些广泛能力的项目。我们可以做好一系列高端的事情。这包括设计和制作电路、固件、授权写作等等。但是我们的梦想是专业化。我有 3 个孩子,必须支付账单。慢慢地,随着时间的推移,我们将工作范围缩小到适合我们专长的领域。我们很专业。

营销渠道

我们从我的电子邮件、LinkedIn 和 facebook 上的联系人漏斗开始了我们的营销战略。我没有使用 ERP 或 CRM,而是使用 google sheets 的排序和过滤功能对线索进行优先排序,并通过个性化电子邮件与个人联系。我还在一个专门的专栏中跟踪线索状态。成功了。我们从未真正使用传统的在线营销策略。至少不是有效的。我浏览了一下我的联系人,在一个专门的栏目中标记了高价值的目标,并深入到我的人际网络中去建立业务关系。

A screenshot of the google sheets document I used as my funnel. This was the main marketing channel for our company for at least 6 months.

为了节省时间,我在电子表格中添加了一些智能功能。首先,我添加了深度电子邮件和域名验证(如这里所述的)。后来我按域名添加了过滤器,以确保我不会联系同一家小公司的几个人。

我也在创业会议上见过客户,后来通过 indeed.com 和 upwork.com 的 T2 等在线招聘平台。一些频道没有成功。例如,我们试图让 freelancer.com为我们工作,但是在那个网站上为演出支付的费用是不值得的。与其说它是一个专业服务承包网站,不如说它更像一个机械土耳其人。我们还没有试用过 toptal 和其他一些产品。所以,我们真的是在全力以赴,只是做那些现在对我们有用的事情。随着我们的成长,当然还有改进的空间。

整个 2016 年冬天,GPU 像额外的加热器一样温暖了车库。我们在室内穿着冬衣,尽管所有的加热器都在运转。原来我们的加热器接线错误…这不是一个最佳的设置。唯一的浴室在房子里,所以可以选择凌晨 3 点在灌木丛中撒尿,或者去地下室。我们基本上一天工作 12 小时,一周工作 6 天。与博士学位并行的是一片混乱。

记住我正在读完一个满是机器学习和扯皮小孩的博士(扯皮数据?)而整个咨询行业正开始腾飞。这是我在同一时期获得毕业生海报奖的照片:

[## 毕业生海报竞赛

在 Flickr 上探索 uOttawa Genie * Engineering 的照片。uOttawa Genie * Engineering 已经向 Flickr 上传了 4221 张照片。

www.flickr.com](https://www.flickr.com/photos/uottawa-genie-engineering/33157089394/in/album-72157679204310064/)

春天来了,我们让一只胖刺猬搬进了车库的地基下面。我们叫他“埃尔·丘伯”。苍蝇入侵,空调坏了。这一切变得难以处理。我们决定搬到一个真正的办公室。从好的方面来看,我们终于可以承担拥有自己空间的费用了。我们把服务器放在车库里,并搬走了“员工”和电脑。我们把焊接和其他电子设备放在车库里。现在是硬件办公室和服务器场。

作为创始人,我们一直有一个建立经常性收入的愿景;除了我们的小时工,还有被动收入。一位首席执行官最近给了我这个伟大的“写一次;“报价卖多了。这正是我们所希望的。我们总是给自己讲一个关于转向产品的故事。我们会从咨询中赚到足够的钱来停止咨询,只专注于产品开发。但是即使我们有很多很棒的产品想法,我们还是非常犹豫要不要推出我们自己做的东西。我们开发了 AVRA(基于我的论文)、 clockrr 、 genrush 和其他一些仍在秘密进行的项目,但从未鼓足勇气或努力进行真正的发射。我们总是有一些咨询的火要扑灭。我开始相信我们喜欢这样。

现金流方面的经验教训

我对咨询业的看法是,的工作需要 2 个月才能得到回报。如果您在每月的第一天(例如 1 月 1 日)开具发票,并在第一天(同一天)开始一个新客户,那么您将在下个月的第一天(2 月 1 日)向该客户发出第一张发票。对于 net 30 条款,您希望在下个月初(3 月 1 日)付款。所以第一个小时的努力的钱会在大约两个月的延迟后到达你的手中。至关重要的是,并非所有渠道都是这样运作的。例如,在 UpWork 上,我们得到报酬的速度要快得多。坏处是他们拿提成,但好处是他们“付出”更快。

几个月前,当一个客户意外延迟付款时,我们遇到了现金流问题,应收账款短缺 5 万美元。新客户的新收入抵消了延迟付款,但这是一个真正的警钟,即使在 2 个月的延迟后,你可能还要等待更长时间。在这种情况下,我从一位首席执行官那里听到的另一句话是:“有时你会成为一个非自愿的投资者。”

我们从现金流中学到的另一个教训是不规则支出。把这个世界看做 EBITDA ( 息税折旧摊销前收益)当然不错,但在现实生活中,你必须缴税。我们和公司一起进行年度税务计划,拿出 100%的钱来支付我们自己。税单到期了,我们银行里几乎没有钱来支付税款,同时也支付我们自己。我们基本上有足够的工资和税收。所以…我们基本上跳过了一个月的工资,以赶上税收。我们现在有一个每月的税收汇款计划,但这是一个真正令人大开眼界的教训。

现在让我们回过头来,记住我们不仅仅是一家普通的咨询公司。我们是一家 AI+cloud+IoT 的魔店。与洗车创业公司相比,我们有什么不同?我们有能力以大多数咨询公司不具备的奇特方式进行扩展。让我们从这个角度来看一下。

首先,我们是全球性的。尽管 LSCI 很小,但我们在英国、以色列、美国、加拿大等地都有客户。我实际上在非洲和印度勘探过 POC。这种地理范围让我们更有能力去争取合同。这也意味着我们可以说不,不用担心明天会吃不上早餐。

第二,我们可以用美元收费。随着加元的到位,这对我们和我们的客户都有好处。我们比我们的竞争对手(大型咨询公司)便宜得多,我们很容易说“四处打听报价”那些希望以冰价换取黄金的潜在客户,我们不会去追逐。现在,我可以很快判断出哪些潜在客户得到了价值主张,哪些没有得到。

第三,需求巨大。现在我们有了声誉,我们可以提高价格(已经这样做了 3 次)。在可能的情况下,我们转向更多的固定价格合同。当我们建立了一些信心后,我们开始向客户索要押金,以确保他们真的参与到游戏中。令人震惊的事实:客户的承诺意愿并没有明显变化。它只是赶走了那些不太认真的客户。仅仅因为在深度学习池中游泳,你就获得了疯狂的可信度。我们做深度学习的事情,正如我艰难地发现的,其他人假装他们做。一些咨询公司在他们的网站上发布他们做深度学习,语义嵌入,知识图表等。但是,当你让他们做一些事情的时候,你会发现他们在做实验,或者把工作交给研究生。正如我在以前的文章中所讨论的,这个领域如此热门,以至于为中型企业工作的人才非常稀缺。对于更大的(巨大的)企业,定价比我们的定价高得多,但有一组不同的公司,IBM/Accenture/PwC/Deloitte/Fujitsu/etc big fish,为这种级别的客户提供服务。

现在,除了我们从专业化中获得的优势之外,还有一些严重的劣势。

第一,高素质员工超级难找。我们不得不雇用高端开发人员来分包或全职工作。例如,除了创始人之外,我们还有一名博士和一名 CS 硕士。我们采访了一批硕士毕业生,并计划在未来一两周内增加一名。我们首先试图用本科生来做这项工作,但它完全是一团糟。就是不行。我们需要团队中的成年人能够做复杂的机器学习工作做客户联络工作。所以,我们不得不雇用斯马特,我们做到了。我 100%肯定,随着我们在未来 12 个月内增加人员,我们将面临更多的可扩展性挑战。

第二,我们的规模还不够大,做不了耗费大量时间的 RFP,这才是真正的大钱所在。一家财富 1000 强公司的成功 RFP 可能比我们迄今为止所做的任何事情都要大,但考虑到投标这些东西需要 6 个月的努力,以及我们已经有业务进来的事实,我们还没有跳跃到投机建造 RFP。我们已经分包了我们不擅长的合同,这是我们目前所能处理的。我们确实通过与几个感兴趣的方面交谈试探了一下,但是我们的目光在时间线上变得呆滞。我们听到类似“这个项目将在 12 个月内完全确定下来”的说法呃。

第三,许多公司想要的东西不是微不足道就是不可能。与传统的编程不同,客户通常不明白这项技术能做什么,不能做什么。这种获得已关闭和已签署的工作说明书的障碍会阻碍我们任何项目的进展。

第四,光靠小时工我们无法发展业务。我们的模式是不加价。我们出售我们的时间,并将其他一切配置为直接从供应商(例如 AWS)向客户收费。我们不像人类那样出卖我们的工作时间。在一个像机器学习这样被大肆宣传的上涨市场中,我们应该疯狂增长。零工经济给了我们在第一年出现所需的规模。但是现在,已经是第二年了,我觉得我们在和一群找兼职的研究生竞争。我们是一群小鱼中的一条小鱼,都在争夺同样巨大的食物供应。早在我们开始做这件事的时候,我就以电视节目《西装》为公司的模型(但欺诈更少)。基本上,我们会是聪明的修理工程师,出卖我们的收费时间,作为救援消防员,去分散炸弹,跳到下一个合同。但是,没有计划能在与敌人的第一次接触中幸存。

I thought of our scrappy little firm as the engineer in C&C Red Alert 2, who parachutes in to fix stuff like new

The C&C Red Alert 2 Engineer. Yes, I became an engineer because I played a video game.

我认为我们的优势在于我们结合了机器学习的硬件专业知识,而收入增长将来自固定客户。但事实证明,我们的杀手级应用是面向中小型企业客户的多模式解决方案。很少有人知道如何将深度学习模型与单词嵌入模型混合,然后再插入知识图。在大数据上做更是难得一见的技能。我不知道我们是否会加入 RFP 的行列。相反,我认为我们将通过许可交易(第一笔交易已完成,即将发布)和在赠款支持下增加员工(第一笔交易已完成,即将发布),利用新的(最终)经常性收入来源来实现我们的增长战略。这些交易花了好几个月才完成,其他一些线索耗费了大量时间,却没有任何回报。这就是生活。

旅行=糟糕

作为一家咨询公司,我们也学到了很多关于如何旅行的经验。旅行耗费了大量计费时间。尤其是如果我们一起跳上飞机。尽可能避免旅行要好得多。或者只派一个人。马修·勒梅和我在比现在更早的时候旅行。去佛罗里达、加利福尼亚、纽约、蒙特利尔、多伦多等地的旅行。它会让你疲惫不堪。你会在时差和失眠上损失更多的时间。我的意思是,旅行不是完全可以避免的,但少即是多。马修·勒梅开车从渥太华到蒙特利尔去一个“更好”的健身房,所以我们并不是不旅行。一个很大的区别是马修·勒梅可以在飞机上工作,而我不喜欢那样。我顶多看飞行中的电影。《龟壳里的幽灵》,海洋奇缘:在 30000 英尺的高空,我两样都喜欢。比起其他航空公司,我更喜欢波特,所以我应该买他们的股票。哦,它们是私人的。太糟糕了。

结论?

我的目标不是某个巨大的出口,而是住在海滩上的度假胜地。我的目标是继续做我正在做的事情,并且做得越来越好。Mathieu Lemay 和我一直认为,我们在一个名为“AI startup”的街机游戏中投入了一枚硬币,我们仍然在游戏中。当我们到达越来越高的等级时,坏人会改变策略,任务会产生更多的硬币。我们只是紧紧抓住火箭船,希望在到达最后一关时,我们的名字能出现在高分榜上。

感谢让这一切成为可能的我们尊贵的客户们:谢谢你们!

我的妻子利奥拉和我的工作妻子马蒂厄·勒梅也是如此。你们都把农场押在了这个创业上。谢谢你的信任。

我写这篇文章是因为预计 Medium.com 会有 1000 名粉丝,现在我已经超过 900 名了。如果你喜欢这篇文章,那么请试试屏幕底部或左侧或右侧的新拍手工具。无论他们把它放在模板的什么地方。去吧。我也很高兴在评论中听到你的反馈。你怎么想呢?

编码快乐!

——丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI

您可能喜欢的其他文章:

  • 人工智能和不良数据
  • 人工智能:超参数
  • 人工智能:让你的用户给你的数据贴上标签

我们脆弱的大脑在客观分析方面很糟糕

原文:https://towardsdatascience.com/our-feeble-human-brains-are-terrible-at-objective-analytics-5d882ec858b?source=collection_archive---------18-----------------------

科学家们不时遇到的一个问题是(有意或无意地)将数据引向他们希望的地方,而不是跟随数据走向它实际引导的地方。这不仅仅是因为骗子想出名:我们人类非常善于欺骗自己,以为自己懂得比实际多!

已经有很多关于人类大脑如何天生寻找模式的信息,这在很大程度上是因为我们的祖先需要在野外面对更大、更凶猛的捕食者才能生存。

If you’re alive today it’s because your ancestors were better at pattern recognition than Robert Muldoon

我对此最生动的体验是在大学的电子实验室。我们的任务是建立一个声音信号的光学发射器和接收器,基本上是一个激光收音机。我们根据在不同挑战性环境下接收信号的能力进行评分。

就像这堂课经常发生的情况一样,我和我的实验搭档忙着在不可能的短时间内完成实验,以至于我们有大约两天时间没有回宿舍。这是在每个人口袋里都塞满了音乐的日子之前,所以我们唯一带音频输出端口的测试声音来源是我的索尼 Discman 和它包含的单曲 CD,我当时最喜欢的专辑。

36 hours of one album on loop? Say it ain’t so!

我们不停地努力让我们的仪器工作,努力听毛衣歌曲或任何类似人类制造的噪音,以对抗从我们仪器的微型扬声器中发出的大量白噪声。我们大部分时间都在近乎完全黑暗的环境中工作,因为我们毕竟试图让音乐在闪烁的灯光下传播,而我们在构建音乐方面很糟糕,所以我们需要尽可能地发挥自己的优势。

最后我们听到“…没有人关心我的方式!”静电发出微弱的爆裂声,我们欢欣鼓舞!我们终于可以睡觉,吃饭,洗澡,并重新加入人类。

然后我们的一个朋友走过来,用手遮住了光接收器。我们一直听到这首歌。把他的手拿开,没有变化。挡住了闪烁的小灯。仍然听到这首歌。拔掉了灯。尽管如此,威泽还是滔滔不绝地讲述在车库里的快乐。

我们一直在单个试验板上工作,所以我了解了接地回路(基本上我们的发射器将信号泄漏到为接收器供电的电路中)。

在经历了许多恐慌和亵渎之后,在轮到我们在全班面前演示之前,我们让我们的设备工作了大约 10 分钟(这次是真的,伙计们)。成功!我们拿了 A-/B+,回家洗澡。

筋疲力尽的我脱下已经穿了大约 60 个小时的衣服,站在热水中。听到了。隐隐约约,但非常清楚,在水从淋浴喷头喷出的声音。

“在属于我的车库里…”

I heard Weezer in the shower (and all other white noise) for about a week

在过去的三天里,我基本上是在强烈的感官和睡眠剥夺中度过的,努力从静电的嘶嘶声中提取威泽的声音。我有效地重新编程了我的大脑,让它在噪音的海洋中倾听那个非常特殊的信号。

从那以后我就没听过蓝色专辑了。

在科学中,甚至有一个短语用来描述一个混乱无序的数据集,并试图清理它来描述一个连贯的画面。这被称为“按摩数据”,如果你是一个数据点,这听起来非常放松。

Unless you’re an outlier, in which case you get killed off (image courtesy of Osrecki, CC by SA-4.0)

处理数据实际上也很重要和有用!不一定不诚实。例如,您可以确定实验误差的来源并消除反映该特定误差的点,或者您可以执行其他分析来确定哪些是信号,哪些是噪声,以提高数据集的质量。只要你对你正在做的事情保持透明,并保留完整的、未修改的数据集,就没有问题。

当你最终从整块布中拼凑出一些东西,因为这是你期望看到的,问题就来了。就像听着威泽从莲蓬头里出来一周。

那门课教了我一些电子学、物理学和焊接方面的知识,却没有烧伤你的手指。

它还教会我合理地怀疑自己的感知。仅仅因为我完全确定我以某种方式看到或听到了什么,并不意味着那就是真实发生的事情。仅仅因为我看到了完全支持我的观点的模式,并不意味着它们真的存在,或者不需要或不需要其他观点。

毫无疑问,对于不加批判地相信我们的感官会带来的危险和非常真实的后果,我们可以从中吸取更多的人生教训。

但在当今大数据和分析驱动的商业文化中,还有一个非常特殊的因素。批判性地思考你所看到的模式,以及你认为数据告诉你什么。和其他人谈谈这件事,尤其是那些可能持怀疑态度的人。保持开放的心态,并准备好接受自己是错的。我们在实验室取得了成功,不是因为我们在认为已经完成时坚持己见,而是因为我们听取了我们得到的反馈并解决了真正的问题。

乔纳森是加州大学洛杉矶分校研究信息系统的助理主任。在获得斯坦福大学的物理学学位后,他在信息系统架构、数据驱动的业务流程改进和组织管理领域工作了 10 多年。他还是 桃子派应用工作室 的创始人,这是一家专注于为非营利和小型企业构建数据解决方案的公司。

通过民粹主义预测选举

原文:https://towardsdatascience.com/our-project-in-review-8d7f892ac790?source=collection_archive---------8-----------------------

民粹主义情绪可能会决定选举结果

我们已经到达了项目的终点,并且,恕我直言,我们发现计算社会科学在试图量化和合理化人类的复杂决策和行为时,需要大量的努力来重新解释和正确地制定数据分析以实现其基本目标。人、他们的想法和驱动力不适合量化的类别。然而,我们已经成功地达到了我们的目标。我们在整个欧盟范围内创建了一个民粹主义指数,并分离出表明民粹主义者的特征。虽然我们的结果可能会受到定性复杂性的影响,但我们发现它提供了对欧洲政治气候的丰富见解。

我们吸取的一个关键教训是,民粹主义是由对现有制度的经济和政治不满所催生的。当人们认为他们的经济利益因外部威胁而处于危险之中时,这些威胁可能是老牌精英或贫困移民的威胁,他们会变得更容易接受民粹主义信息。在我们的例子中,“民粹主义者”并不是一些与普通民众隔离的变异物种(正如我们在 K-Means 将民粹主义者从普通民众中分离出来的明显失败所表明的那样)。相反,正是普通人求助于民粹主义来解决他们的问题,因为他们对那些让他们远离物质福祉和民主机构感的机构感到失望。

结果

在法国,我们发现反民粹主义和民粹主义选民的比例分别为 56:44。因此,我们预计埃马纽埃尔·马克龙会在最近的法国大选中以这样的优势击败马林·勒·庞。令人惊讶的是。马克龙获得了总选民的 66%,表明法国选民比我们预测的更不倾向于支持极右翼。我们推测,这种差异可能是由于中右翼民粹主义选民不愿支持他们认为是古怪候选人的勒庞,和/或左翼和中间派选民反对反动政治的激增。

令人困惑的是,德国和西班牙的态度都比当前的政治表现更加极端,59%和 63%的选民坚决支持民粹主义。在西班牙,这可能显示出佛朗哥政权挥之不去的影响,该政权不鼓励极右政治选择的存在,同时吸引了许多中间偏右的人民党支持佛朗哥的国家保守主义。然而,在德国,正如宾尼格教授指出的,人们必须根据占主导地位的文化和社会态度将这些结果正常化,并确定政治态度是否发生了转变。正如传说和事实所言,德国人对自己和欧盟的经济前景都相当悲观,尽管他们反对采取极端措施来改变这一困境。因此,为了进一步分析,我们可以将这些数据与历史值进行比较,以观察潜在情绪的变化,这可能预示着民粹主义愤怒的爆发。

相反,我们发现整个东欧的民粹主义情绪得分出奇地低,最显著的是 Visegrád 集团,包括波兰、匈牙利、捷克共和国和斯洛伐克。根据我们的计算,即使维克托·欧尔班可能是全欧洲反对难民和外国融合的最极端的态度,也只有大约 30%的匈牙利人被预测为民粹主义者。这种不一致性也警告我们,盲目选择六个特征来决定民粹主义态度,而不根据每个国家的情况进行调整。在许多东欧国家,对现政府的高支持率可能对应着更大的而不是更小的民粹主义情绪。

毫不奇怪,我们观察到英国是民粹主义的大本营,揭示了英国退出欧盟挥之不去的怨恨。

我们发现最相关的关键特征(向调查对象提出的问题)是:

你认为过去 12 个月的总体经济形势有什么变化?

经济增长/衰退仍然是影响民粹主义诉求发展的关键因素。当一个国家面临经济衰退的危险时,选民开始拒绝建立政府机构来阻止这种恶化。

你对欧盟有什么看法?

如果一个人倾向于不信任欧盟,他们就会对试图阻止这一机构存在的政党更加敏感,从而倾向于选择批评现状的民粹主义政党,而不是社会自由主义政党。

你对政府有什么看法?

类似地,当选民无视自己的政府时,他们会通过选择民粹主义候选人来寻求“推翻”其执政的政治代表。

您对自己国家的民主运作方式有多满意?

类似地,那些认为他们的自由民主形式已经从根本上腐败的人倾向于寻求促进普通人意愿的替代方案。

总体而言,您认为【在此插入国家】在与其他国家的贸易中获益还是受损?

这一特征表明,经济因素在助长民粹主义情绪方面起着关键作用。当人们认为外国人在经济上损害了他们的利益时,他们会选择支持民粹主义政党,这些政党寻求恢复国家霸权以抵御外国(经济和社会文化)入侵。

你同意还是不同意下面的说法:“体制对像我这样的人不利。”

因为这一特征反映了个人自身的经济利益与统治精英的经济利益相冲突的观念,所以人们会认为反映这一观点的人非常容易接受民粹主义言论。

反民粹主义者和民粹主义者及其观点的分布可以用以下平行集合可视化来可视化:

这种形象化可以通过关注民粹主义者和反民粹主义者对每个问题的回答来解释。

这些功能如我们所愿地出现了。它们表明,我们基于投票历史和党派偏好的分析仍然紧紧抓住民粹主义的意识形态。这些特征表明,与社会文化不满相反,主要是经济和政治方面的不满推动了民粹主义情绪。这可能揭示了社会态度可能反映了各国当前的经济立场,为了减少民粹主义情绪,人们应该考虑促进国家之间的经济合作和纳入全体民众的全球一体化,而不仅仅是支持这些“既定精英”。

此外,通过使用这一数据预测未来选举结果,我们发现民粹主义虽然放大了其影响,但似乎还不能像推翻美国制度那样推翻欧洲制度。总之,我们发现我们的工作强烈地预示了一个国家内部的情绪。虽然存在混杂因素和一些异常值,但我们对整个欧盟民粹主义的理解似乎已经揭示了当前的政治气候。

我们的编辑团队

原文:https://towardsdatascience.com/our-team-c2c8e712c971?source=collection_archive---------8-----------------------

最后更新于 2022 年 12 月

我们来自许多不同的背景,并且有一个共同的承诺,那就是建立一个受欢迎的数据科学和机器学习社区。

Photo by Rodion Kutsaev on Unsplash

编辑

本胡伯尔曼主编。 Ben 于 2021 年加入 TDS,担任主编,他对数据科学和 ML 与社会、文化和环境问题的交叉方式特别感兴趣。他之前是 Automattic 的编辑部主任和 Longreads 的高级编辑。

凯瑟琳草原 **高级编辑。**大家好!我是凯西,2022 年 2 月加入神话般的 TDS 团队,担任高级编辑。我有地质学和工程学的学位,三十年的 IT、数据科学和技术写作经验。在加入该团队之前,我是加拿大化学工程杂志的执行主编。但是我的故事远不止这些!阅读更多

凯特琳·金迪格编辑。 Cait 于 2020 年 9 月加入 TDS 担任编辑。她拥有麦吉尔大学的英语学位,是一名记者和编辑。Cait 曾为许多媒体工作过,如 CityNews、麦吉尔论坛报、黑玫瑰图书和 Investopedia。尽管有非常以人文学科为中心的专业和学术背景,她对数字人文和数据科学非常有热情,特别是弥合技术知识和社会/文化问题之间的差距。阅读更多。

卢多维奇 。编辑。大家好!我是 Ludo,TDS 的编辑!我从 2015 年开始学习数据科学和机器学习,感谢这么多很棒的在线资源!数据科学可以触及和探索的各种领域(从生物学到外太空)让我爱上了这个领域。通过阅读我们作者的文章,我很高兴能继续从数据角度探索这些话题。

志愿编辑协会

。你好。我叫陈亦飞,是《走向数据科学》(TDS)驻多伦多的助理编辑。如果你想发表你对从数据科学到机器学习等主题的见解,TDS 是个不错的地方。关于我,我的热情是在生物信息学和计算生物学领域,尽管我的学术背景反映了医学科学课程。

****大卫·考克斯。嗨,大家好!人们叫我大卫,我在 2022 年 11 月加入了 TDS 团队。我的正规教育包括生物伦理学硕士、行为分析博士以及行为药理学、行为经济学和数据科学博士后。但是,我也是一个原始“哲学家”意义上的智慧爱好者,喜欢阅读和学习科学、技术、人类健康和福祉交叉领域的任何东西。我的工作热情围绕着“行为数据科学”。而且,我的爱好热情围绕着建造我们可以嵌入生物学习规则的机器人!阅读更多

安德鲁·德科蒂斯-莫罗 。嗨!我目前是一名高中物理和化学老师。我在蒙特克莱尔州立大学获得了化学和生物化学学士学位。我在宾夕法尼亚州立大学读了第一年的化学博士课程,在那里我学习了计算化学,我第一次体验了高性能计算。我最终回到了 MSU,拿到了化学硕士学位。

卢克·格洛格博士 大家好!我叫卢克,是开放地球基金会的气候数据工程师。我的工作是新兴的 web3 技术和气候科学的结合。我对全球碳循环也很感兴趣。我喜欢阅读/评论所有伟大的 TDS 文章,这让我每天都能学到新的东西。当我离开我的键盘时,我通常会出现在狗狗公园、唱片店或纽约附近的音乐场所。

晴古哈 。你好!我是亚马逊 Alexa 的应用科学家。我主要从事 NLU、ASR 和推荐系统的工作。在亚马逊之前,我作为深度学习工程师在 MathWorks 工作了 2 年,从事计算机视觉工具箱的工作。我有物理学博士学位,专攻弦理论。闲暇时,我喜欢徒步旅行和酿造啤酒。我目前在新罕布什尔州 4000 英尺的 24/48。在空闲时间,我在 Youtube 上制作深度学习相关视频。

优格 。大家好!我叫 Eugenia,是阿根廷布宜诺斯艾利斯的《走向数据科学》( TDS)的一名新编辑助理。我是生物学家,有免疫学博士学位。在学术界工作了 10 多年后,我转到了数据科学(DS)领域。我曾在非营利组织、教育、农业数据驱动的解决方案和大企业人工智能解决方案中工作。在我开始 DS 生涯的时候,我发现了 Medium 和 TDS!我开始写帖子是因为我喜欢用简单的方式交流复杂的概念。

**码头 **。嗨!我叫 Pier,自 2019 年以来,我一直是《走向数据科学》杂志令人难以置信的编辑助理团队的一员。在过去的几年里,我一直在瑞士再保险和 SAS Institute 等公司的数据人工智能领域工作。TDS 在我整个个人/职业发展过程中发挥了重要作用,我总是乐意尽我所能回馈社区!阅读更多

约翰·贾格蒂阿尼博士。贾格蒂尼博士是一位经验丰富的商业领袖和教育家。他在数据管理、跨行业项目交付和系统战略实施方面拥有专业知识。Jagtiani 博士目前担任西北社区学院下一代商业智能、计算机科学和数据科学项目的助理教授和项目协调员。他还在费尔菲尔德大学和布里奇波特大学的工程学院担任兼职教师。

【丁当】。嗨,我是洪静,你可以叫我来自新加坡的叮当。在阿里巴巴集团担任数据科学家,目前在攻读医疗保健方面的机器学习博士学位(神经科学)。我渴望分享我的学习、研究和经验。因此,我有动力简明地写作,并以简单的方式解释概念。****

****罗汉约瑟夫 大家好,我是 Rohan,目前是《走向数据科学》的编辑助理。在电子工程本科毕业后,我开始了我的数据科学职业生涯——这是一种运气。在做了三年决策科学家后,我爱上了分析领域。然后,我决定攻读定量领域的硕士学位,这使我得以在弗吉尼亚理工大学攻读运筹学硕士学位。我硕士毕业后搬到了旧金山湾区,目前在苹果公司担任数据科学家。

吉坦什·科尔巴特。你好,从这片土地上下来的!我是 Gitansh,是悉尼《走向数据科学》的副主编。如果你已经遇到或想要发布与 NLP、深度学习、机器学习或一般数据科学相关的内容,那么我们最终很有可能已经/将会遇到。

苏菲·曼恩。 Sophie 是一名新的编辑助理,但对编辑并不陌生。在西北大学本科期间,她在《西北日报》工作了四年,现在是芝加哥的数据分析师,拥有哈佛大学的技术和创新硕士学位。她喜欢跑步、烘焙和填字游戏。

****萨拉·a·梅特沃利 您好!我是萨拉,我是庆应义塾大学的博士生。我的研究重点是开发一个量子软件调试工具。因为热爱软件,我是 IBM Qiskit 的拥护者;Qiskit 是 IBM 开发的帮助人们学习和实现量子算法的 Python 包。我真正热爱的事情之一是教学,所以我作为一名 CS 教练教孩子们如何编码。我喜欢学习新东西,因为当你理解了你最初认为很复杂的东西时,没有什么比这种感觉更好的了。

卡洛斯 。大家好,我叫卡洛斯·穆根,我现在是玛丽·居里研究员和诺贝尔欧洲创新培训网络的博士生。我对预测建模及其在社会中的意义充满热情。我非常幸运能够在世界级的研究和公共机构中追求这些激情。我非常喜欢参加数据科学竞赛和挑战。

迪米特里斯 。你好!我是迪米特里斯,来自阳光明媚的希腊雅典。我拥有纯数学博士学位,在各种学术岗位上工作过。渐渐地,我的兴趣转向了数据科学。我甚至试图创办一家数据分析初创公司,但失败了。在过去的几年里,我一直在一家大型跨国公司做顾问。我真的很喜欢评论 TDS 的文章,所以请继续发送它们。

****格拉西莫斯 大家好!我是 Gerasimos,于 2019 年 5 月加入现象级 TDS 团队,担任副主编。我有航空工程、电信和工商管理的学位。作为一名将近 20 年的航空工程师,我很早就意识到数据收集和利用对行业的重要性。在过去的 10 年里,我一直致力于建立和优化记录、处理和分析车队数据的 CMMS 系统。同时,我喜欢阅读关于数据科学概念的书籍,并做一些兼职项目。

****克里斯塔贝尔桑托斯 大家好!我的名字是克里斯塔贝尔,虽然我让每个人都叫我克里斯塔,因为许多人试图以一种相当壮观的方式屠宰我的名字。自 2020 年 12 月以来,我一直是一名志愿编辑,并在几家咨询公司担任了不到十年的数据科学家。我喜欢为 TDS 评论文章,因为它带给我学习的乐趣。我个人的人生格言是“持续学习带来持续进步”我想知道是否有人说过这句话。我目前住在西班牙,但在种族和文化上我来自印度,我的其他兴趣包括心理学、网络安全和徒步旅行。

马尼什·夏尔马。Manish 正在领导一个在卫生部门工作的组织的机器学习团队。他目前的工作是利用深度学习,利用蛋白质结构(序列信息)预测功能突变的增益(蛋白质工程)。他目前在加拿大的滑铁卢工作,在卫生、金融和能源行业拥有超过 10 年的工作经验。他拥有物理化学博士学位。他的兴趣包括阅读、旅游和教学。

****劳里威廉姆斯 大家好!我叫 Lowri,是一名研究数据科学家,拥有 4 年的学术研究经验和 2 年的行业合作经验,以新颖的数据科学解决方案支持中小型企业。我与多学科专家合作,在几个著名的学术期刊上展示研究成果和发现,并转向数据科学媒体,在教程风格的博客中展示一些新颖的数据科学方法!

Python 中的核心基因组学

原文:https://towardsdatascience.com/out-of-core-genomics-8aa5ef487d1e?source=collection_archive---------4-----------------------

通常情况下,数据科学家想要探索一个不适合内存的数据集。随着数据量的持续增长,我们处理这些数据的工具也需要扩展。这篇文章的动机源于我对处理 openSNP 数据的兴趣。openSNP 是一个开源平台,用户可以从 23andMe 等直接面向消费者的遗传学公司上传他们的基因型数据。原始结果文件通常有几十万条记录,每条记录代表人类基因组中的一个位置。openSNP 数据中有超过 4,000 个原始结果文件。然而,我的笔记本电脑运行的 VirtualBox 只有 5GB RAM,这意味着我需要找到一些超出标准 pandas 库的聪明解决方案,以便处理这么多数据。这篇文章描述了几个可以从核外计算中受益的应用之一。

下载 openSNP 数据

openSNP 有超过 40 GB 的基因型和表型数据存储为文本文件!
出于本演示的目的,分析将仅限于 23andMe 文件。下面是几个 shell 命令,用于下载原始数据,创建目录,并将 23andMe 文件移动到它们自己的目录中。

这里有一个示例 23andMe 结果文件,文件头用#注释掉,然后有 600,000+行基因型数据。

提取合理规模的测试集

在本练习中,使用完整 openSNP 数据的一个可管理的子集,以便在合理的时间内执行演示。创建一个新目录,复制以名称:user21开头的基因型文件。

纯种熊猫

首先,从一个纯粹的熊猫 read_csv解决方案开始,这应该是 Python 数据科学家所熟悉的。尽量在内存中创建一个大的DataFramejoin方法可以完成这项任务。尽管这是一个昂贵的操作,我们刚刚提取的测试数据集足够小,它将成功执行。

CPU times: user 7min 48s, sys: 9.83 s, total: 7min 58s 
Wall time: 8min 15s

在 43 个文件的测试集上,整个DataFrame适合内存。然而,对包含 1,915 个文件的整个 openSNP 数据集使用这种纯 pandas 方法最终会使笔记本电脑崩溃,因为它会耗尽物理内存。

Dask —并行核外数据帧

进入 dask ,一个实现核外数据帧的 Python 库。它的 API 类似于 pandas,增加了一些额外的方法和参数。Dask 创建了一个计算图,它将并行读取相同的文件,并创建一个“lazy”DataFrame,直到comptue()被显式调用后才会执行。

example computation graph from http://dask.pydata.org/en/latest/_images/pipeline.png

惰性地将基因型文件读入 dask 数据帧,这个操作实际上并没有将文件读入内存,这可以通过 cpu 时间来证明,相反,它构建了一个类似于上图的图形。

CPU times: user 112 ms, sys: 52 ms, total: 164 ms 
Wall time: 298 ms

对 dask 数据帧执行操作,如set_index()触发计算。

CPU times: user 4min 44s, sys: 23 s, total: 5min 7s 
Wall time: 4min 45s

dask compute()方法提供了熟悉的结果。因为join方法不是在 dask 数据框架上执行的,与纯 pandas 方法相反,只调查一个记录(或一个 SNP)。

CPU times: user 3min 31s, sys: 36.1 s, total: 4min 7s 
Wall time: 3min 46s CC 37 
CT 5
TT 1 
Name: genotype, dtype: int64

同样,与ddf (dask)相反,gtdf在内存中,所以这个操作非常快。

CPU times: user 4.3 s, sys: 8.1 s, total: 12.4 s 
Wall time: 1min 1sCC 37 
CT 5
TT 1 
Name: rs1333525, dtype: int64

乍一看,计算时间是骗人的。dask 方法花费了更长的时间,因为计算缓慢,它仍然必须读取所有文件,然后执行操作。然而,当你考虑到加入数据帧所需的 8 分 15 秒加上gtdf.loc[rs13333525'].value_counts()1 分 1 秒时,那就是 9 分 16 秒。相比之下,dask 方法需要 3 个步骤。第一次设置计算图形为< 1 秒。所以真正的比较来自于设定指标的 4 分 45 秒和执行ddf.loc['rs1333525']['genotype'].value_counts().compute()3 分 46 秒总计 8 分 31 秒。在我们只有 43 个文件的测试数据上,这似乎是一个微小的加速。当数据帧根本放不进内存时,dask的真正威力就发挥出来了。

提高查询性能—转换。txt/。csv 呼叫拼花地板!

如果能加快 dask 查询的速度就好了,这样我们就可以在合理的时间内使用数据帧进行下游分析。解决方案是将原始文本数据以有效的二进制格式存储在磁盘上。传统上,一个流行的选择是 HDF5 ,但是我选择使用 parquet ,因为 HDF5 可能很难使用。Dask 使用了 fastparquet 实现。

CPU times: user 12min 35s, sys: 1min 41s, total: 14min 17s
Wall time: 19min 30s

从本质上讲,这样做的目的是将.txt文件转换成 parquet 文件。从中真正获得了多少性能?重温 dask 数据帧ddf,记得计算value_counts()花了 3 分 46 秒。转换为拼花格式后进行比较。

CPU times: user 8.18 s, sys: 608 ms, total: 8.79 s 
Wall time: 11.7 s CC 37 
CT 5 
TT 1 
Name: genotype, dtype: int64

Parquet 为查询数据提供了显著的性能提升,即使只有 43 个文件的验证集。将这个扩展到 1915 个文件,并行的.txt版本ddf,花了 5 个多小时来执行一个 SNP 的value_counts()。在 1915 号文件上DataFrame花了几个小时。一旦看到查询性能的提高,从.txt.csv转换到 parquet 的前期成本是值得的。

整个 openSNP 数据集上的性能

我使用上面相同的命令预先计算了整个gt23目录的拼花文件,并将拼花文件存储在gt23_pq中。需要清理和/或删除一些格式错误的文件。

$ find gt23_pq/ -type f | wc -l1898

现在,发出与前面代码块中的测试数据集相同的value_counts()命令,但是这将考虑所有的 23andMe 基因型文件。

CPU times: user 6.67 s, sys: 112 ms, total: 6.78 s
Wall time: 7.2 sCC    1625
CT     277
TT      13
Name: genotype, dtype: int64

这些结果凸显了拼花地板远优于.csv.txt的性能。此外,dask 证明了当物理内存受到限制时,它作为一个易于使用的工具的价值。到目前为止,您可能已经注意到,我无法将用户标识符分配给每一列。dd.read_csv()假设每个文件中的列名相同。

在整个 openSNP 数据集上实现

教程的 dask 和 parquet 部分已经结束。我想展示 dask 和 parquet 如何轻松地处理大型数据集。以下示例比较了 openSNP 数据和 exAC 数据中的不同频率。

我希望这篇文章对你有用,并在处理结构化文本文件时考虑使用 dask 和 parquet。我真的鼓励你查看 dask 和 parquet 文档,并跟随他们的一些教程。感谢阅读,欢迎评论和代码改进!

从我的 github 页面站点更新【https://arvkevi.github.io/Out_of_Core_Genomics.html

离群点感知聚类:超越 K 均值

原文:https://towardsdatascience.com/outlier-aware-clustering-beyond-k-means-76f7bf8b4899?source=collection_archive---------6-----------------------

Picture from fauxels on Pexels.com

数据科学能帮你选择下一份工作吗?首先,这是个糟糕的主意。

但是,让我们看看会发生什么。

方法

我们提出了一种优化聚类的组合降维方法。是的,我肯定你们中的一些人在读完这篇文章后仍然会坚持 ol' PCA/K-Means,但是我希望你的工具箱里会有一个同样快速的新工具。

该方法使用了两种迅速流行的方法:用于降维的 UMAP 和用于聚类的 HDBSCAN。在行为原型定义的人力资源和客户细分的推荐系统的多个项目中,我们已经取得了很多成功。

寻找要使用的数据集

让我们用一个劳动力市场分析作为这个测试的例子。面对不断变化的工作、角色和责任,你应该在哪个行业工作?那些已经有很高需求的,或者正在增长的。

劳动力市场分析是确定就业市场趋势的标准方法。这将让我们了解一段时间内的工作需求。然后,我们将把每项工作分成特定的类别。这些类别将代表我们可能感兴趣的每个主要行业。

为了仅根据数据集确定行业类别,我们将使用 UMAP+HDBSCAN 方法。

我们的行动计划

我们将为职位发布收集一个样本数据集,其中包含职位名称、职位描述和发布年份。从那里,我们将根据单词的相似性将发布的信息分组,以了解每个组的消长情况,根据该特定组中每年的职位发布数量。

我们将让一些聚类算法为我们做出这些决定,而不是从应该选择的聚类的假设开始。这是表演 LMA 时最棘手的部分。一个社交媒体总监是管理、营销还是 IT 部门的人?医疗机器人服务技术员,或者自动驾驶汽车食品配送主管怎么样?

通过查看标题和描述的内容,我们将让类别自己决定。

数据

Kaggle 的亚美尼亚招聘数据集已经对 2004 年至 2015 年年中的招聘信息进行了过滤。这是一个很好的数据集,因为:

  • 它是大多数现代经济的典型代表。
  • 这是一个足够小的数据集,很容易使用;
  • 它包含的工作范围很广,不仅仅是特定的行业。

和其他人一样,它也受到了 2008-2009 年经济衰退的影响:

Number of job postings in the dataset, per year.

GDP of Armenia vs. Georgia and Albania, showing the Great Recession.

这意味着我们已经准备好组织这些数据,以了解每个工作部门的表现。

对每个职位名称、描述和职位发布执行单词嵌入

让我们为这个项目加载所有相关的库。

在我们决定为每个文本元素生成一个向量之前,我们将删除所有通用的英语停用词(“if”、“I”、“因为”…),以及每个类别的其他通用词。我们通过查找每种条目类型的最常用单词、生成自定义词典并删除所选单词来实现这一点。

在我们删除了第一个停用词列表并按计数打印出这个单词列表后,我们注意到在所有的招聘信息中有很多重复的单词。这会输出一个清晰的“无聊”单词列表:

[('responsible', 4711),
 ('looking', 4290),
 ('incumbent', 3840),
 ('position', 3717),
 ('development', 3538),
 ('seeking', 3015)...

这本来是使用 TF-IDF 根据单词出现的频率来删除单词的一个很好的机会,但是这个数据集太小了,不值得使用,并且可以手动执行编辑。(只要能更快完成工作,我们就喜欢这样。)

让我们删除一些精选词,以便下面的单词嵌入在整个数据集中有较少的常用词。

现在我们开始有趣的事情——单词嵌入。虽然不建议用于长语句或文档(例如,Yoon Kim CNN 在对语句进行分类时通过使用每个单词的向量来实现最佳效果),但我们知道,删除低信号/通用单词将为我们提供向量之间的一些更好的定义。

弗兰克·爱因斯坦生活:UMAP + HDBSCAN

在典型的数值或分类数据上,K-Means 对于创建聚类很有意义。当分离简单的单词嵌入(1 到 4 个单词)时,我们也可以使用这种方法,但是当组合字符串向量时,它会丢失信号,其中单词嵌入之间的余弦相似性要相似得多。使用 K-Means 对聚类进行排序的典型方法包括以下内容:

  • 我们将选择不同数量的集群(通常是从 1 到 20 的滑块)。
  • 使用肘法,我们将找到最佳的集群数。
  • 为了确认肘方法有助于决定簇的数量,我们将使用剪影值,以便查看每个点在目标簇中的拟合程度。

然而,这种方法有一些潜在的问题。这就是为什么我们希望 HDBSCAN 关注这些点,而不是 K-Means:

  • 并非所有的点都可以或应该被聚类。
  • 也许星团不是圆形或球形的。(雪茄形、半月形等。)

为什么 K-Means 不适合大词嵌入聚类?因为它试图找到球状星团的中心。如果有一个长方形簇,末端将被切断,中心将暴露于异常值。

让我们合并 UMAP 和 HDBSCAN,而不是调整 K-Means 参数直到母牛回家。这包括:

  1. 通过使用 UMAP 在黎曼流形上定义新的嵌入空间来重新定义向量存在的空间;
  2. 使用 HDBSCAN 将接近但不一定是球形的簇聚集在一起,同时忽略异常值。

什么是 UMAP?

一致流形逼近和投影(UMAP) 是一种新的降维技术。

在 PCA 中,通过创建能够充分重建每个点的位置的向量来执行维数减少。如果我的数据存在于ℝ ⁰⁰ (hello word 嵌入),我可以定义 10 个(或 2 个,或 20 个)特征向量,这些特征向量可以尽可能多地复制这些点。总会有信息丢失,但主成分分析通常可以达到 70%-80%的代表性准确率。

在 UMAP,方法是创建一个黎曼流形——一个弯曲的、平滑的、连接回自身的任意形状。我现在有一个形状,我解开扭曲和展平,在这个形状上,我所有的点都相当接近曲面,特别是如果我有一根足够长的绳子。想象一个两端相交的线团,这将是ℝ的黎曼流形。

此时我需要做的就是解开绳子,弄平圆柱体,并缩放数据。嘣!你现在有一个 2D 投影。

另一种思考方式是当你把地球放在地图上。墨卡托投影和极坐标投影将具有不同的偏斜,根据我们正在查看的数据,这些偏斜可以被忽略(或不被忽略)。

它的 GitHub 页面对此做了最好的解释:

但是为什么要用黎曼流形呢?相当简单。

  1. 3D 空间由规则(重力、时间、距离等)定义。).如果我说,“让我们想象一个距离和角度不成问题的世界”,你会说“太好了!现在一个立方体是一个球体是一个棱镜,因为距离和角度并不重要。”
  2. 现在我们生活在 ElastiSpace 中,我们可以更容易地解决某些问题。距离仍然不重要,但你很快意识到立方体和棱柱上的锐边会弄乱你的方程。因此,我创建了 ElastiSpaceV2,其中球体和椭球体是一回事,但现在立方体有了自己的类别。
  3. 但是你在高中学到的所有数学知识呢?在你花了那么多时间练习那些习题之后,三角学不应该仍然有效吗?ElastiSpaceV2 帮不了你,但黎曼先生有 chu,fam。这就是球体和椭圆不同的地方,所有的数学问题仍然有效,所以你可以做你想做的所有数学。

(这一部分转述自 Quora 帖子。)

现在回到招聘启事。

减少和聚集向量

下面是降低维数并开始对集合向量进行聚类的代码。

这里有两件事需要注意:

  1. 集群的数量是由 HDBSCAN 决定的,而不是我们。如果你重新运行它,你会得到一些波动,所以一旦你有了工作的东西,保存集群。
  2. 还有一些没有聚类的值(用“-1”表示),大概有三分之一。这意味着只对剩余的值执行聚类。
[21 -1 -1 -1  4 -1 -1 25 25 -1  7 12 19 -1 25 -1 25  4 25  
  8 25  8 -1 -1 -1 -1 -1 -1 -1 -1 -1  5 -1  9 -1 -1  9  1 
 25 -1 20 -1 -1 -1 -1 -1 -1 -1 12 -1 -1 24 -1  2 25 -1  1 
 -1  7 12 -1 -1 14 -1 11 25 -1 -1 21 -1 -1 -1 -1  2  9 -1 
 11 12  9 12 25 11  7 -1 12 25 25  7 -1 -1 -1 -1 -1 -1 25 
  7 -1 21 -1 -1 19 -1 14 -1 -1 25 25 -1 25  8 25 25 -1 -1 
 -1 -1 -1 -1 25 12 -1 -1 25  8 -1 25 -1 -1 -1 -1  7 -1 25 
 -1 22 -1 25 16  9 -1 12  9 -1  7 12 -1 -1  8 -1 -1  8 24 
 24  7 25 -1 -1  7  7  7 25  7  1 -1 24 12 -1 -1 25 -1  7 
 -1 -1  8 13 -1  8  8  1 -1 -1 13 13 13 13 16 16 18  0 -1 
 16 25 -1 -1 -1  4 -1 -1 -1 15 25 -1 -1  6  7 -1  8 -1 25 
 -1 -1 -1  4 -1 -1 -1 -1 18 25 25 -1 25 20 25  7  7  7 25 
 -1 -1 25 25 -1 -1 -1 -1 27 -1 11 25 -1 25 25 18 -1  8 25 
 25 25  2 -1 -1 25  0 -1 -1 25 -1 12 25 -1 -1 -1 -1  7 -1 
 -1 -1  7 -1 27 25 -1 27 -1 -1 16 -1 -1 -1 -1 -1 -1 25 -1 
 -1 25 -1 25 14 -1  1 -1 -1  8 -1  1 25 25  7  7 -1  7 25 
 -1 25 -1 -1 -1  7 -1  7 -1 25 -1 25 12 -1 25  4  7  7  7 
  7  6 -1  7 -1  6 -1 11 16 19 -1 -1 -1 25 24 -1 16 -1 -1 
 -1 -1 -1 -1 -1 -1 -1  2 -1  4  7 25 -1 25  4  7 -1 25 25 
  1 -1 25 -1 -1  4 -1  7 -1  9 25 -1 -1  7  8  8 25 14 -1 
 -1  4 25 25 -1  8 25 19 -1 -1 25 15 16 -1 -1 15 21 -1 -1 
 25 -1  7  7 -1 -1  7  7  8 -1 18  2 16  4 -1 -1  9  9 -1 
 -1 -1 -1 -1 25 -1 -1 12 -1  7 20  7 -1 -1 25 -1 25 25 -1 
 25  6 25  7 17 -1  7 16 17  7  7 -1  4 15 -1  7 16 25 -1 
 25 25 -1 -1 -1  1 25 -1 25 -1 16 25 25 24 -1 12 -1 -1 -1 
  6 -1 25  1 11 -1  7  6 25 25 -1 25 25 -1 -1 25  1 -1  7  
  1 -1 -1  4 12 14]

那么这些集群代表了什么呢?让我们统计每个集群的热门词汇,以确定它们包含的内容。

看它分解得多好!

Cluster: 0
[('lawyer', 125), ('advocate', 3), ('attorney', 1)]
---
Cluster: 1
[('accountant', 259), ('auditor', 22), ('outsourcing', 4), ('cheef', 1), ('bookkeeper', 1)]
---
Cluster: 2
[('software', 130), ('developer', 125), ('developers', 4), ('programmer', 4), ('programmers', 1)]
---
Cluster: 3
[('developer', 166), ('android', 70), ('ios', 64), ('senior', 48), ('application', 32)]
---
Cluster: 4
[('accountant', 233), ('chief', 225), ('assistant', 29), ('deputy', 26), ('engineer', 11)]
---...---
Cluster: 25
[('specialist', 227), ('expert', 226), ('development', 217), ('coordinator', 157), ('program', 147)]
---
Cluster: 26
[('service', 78), ('manager', 55), ('customer', 49), ('department', 17), ('corporate', 15)]
---

我们甚至可以得到一个更紧凑的视图:

Cluster 0: lawyer / advocate / attorney
Cluster 1: accountant / auditor / outsourcing / cheef 
Cluster 2: software / developer / developers / programmer 
Cluster 3: developer / android / ios / senior 
Cluster 4: accountant / chief / assistant / deputy 
Cluster 5: medical / representative / yerevan / armenia 
Cluster 6: developer / java / php / senior 
Cluster 7: developer / senior / software / web 
Cluster 8: preseller / merchandiser / methodologist / 3d 
Cluster 9: language / translator / english / interpreter 
Cluster 10: hr / manager / assistant / generalist 
Cluster 11: manager / project / construction / senior 
Cluster 12: administrative / assistant / office / manager 
Cluster 13: quality / assurance / engineer / tester 
Cluster 14: assistant / executive / director / ceo
Cluster 15: administrator / system / network / systems 
Cluster 16: engineer / software / senior / support 
Cluster 17: qa / engineer / senior / manager 
Cluster 18: analyst / financial / business / senior 
Cluster 19: marketing / specialist / pr / digital 
Cluster 20: legal / lawyer / senior / consultant
Cluster 21: finance / officer / chief / financial 
Cluster 22: manager / branch / operator / teller 
Cluster 23: manager / sales / assistant / retail 
Cluster 24: agent / sales / manager / international 
Cluster 25: specialist / expert / development / coordinator 
Cluster 26: service / manager / customer / department

这是一个漂亮的图表,按集群划分。

我们现在有了一个漂亮的图表,显示了随着时间的推移,每个工作领域的需求。耶!

总的来说,这种方法实现起来几乎和标准的 PCA/K-Means 一样快。然而,通过中间的可视化步骤,我发现就集群而言,判断我们是否在正确的轨道上要容易得多。

你可以在这里找到所有的代码:https://github.com/elmathioso/lma_jobs

快乐聚类!

马特。
matt@lemay.ai

https://www.linkedin.com/in/mnlemay/

Lemay.ai
1 (855) LEMAY-AI

你可能喜欢的其他文章

  • 深度学习图像分类器的罗夏测试
  • 傲慢、懒惰和玩玩具:一个创业工程师的成功态度
  • 为客户提供人工智能原型作为营销策略

我的首席技术官丹尼尔·夏皮罗(Daniel Shapiro)的其他文章您可能会喜欢:

  • 人工智能和不良数据
  • 人工智能:超参数
  • 人工智能:让你的用户给你的数据贴上标签

基于隔离森林的离群点检测

原文:https://towardsdatascience.com/outlier-detection-with-isolation-forest-3d190448d45e?source=collection_archive---------0-----------------------

了解如何有效地检测异常值!

更新:描述扩展隔离林的第 2 部分可从这里获得。

在最近的一个项目中,我正在处理一个从移动应用程序用户那里收集的数据的聚类问题。目标是根据用户的行为对用户进行分类,可能使用 K-means 聚类。然而,在检查数据后,发现一些用户表现出异常行为——他们是异常值。

当离群值没有被处理时,许多机器学习算法的性能都会受到影响。例如,为了避免这种问题,您可以将它们从样本中删除,在某个合理的点(基于领域知识)限制这些值,或者转换数据。然而,在这篇文章中,我想把重点放在识别它们上,把可能的解决方案留到以后。

在我的例子中,我考虑了很多特征,我理想地想要有一个算法来识别多维空间中的异常值。那时我遇到了隔离森林,这种方法在原理上类似于众所周知和流行的随机森林。在本文中,我将重点关注隔离森林,而不详细描述决策树和集成背后的思想,因为已经有太多的好资料了。

先来点理论

与其他流行的离群点检测方法不同,隔离林的主要思想是显式识别异常,而不是分析正常数据点。隔离森林和任何树集合方法一样,是建立在决策树的基础上的。在这些树中,通过首先随机选择一个特征,然后在所选特征的最小值和最大值之间选择一个随机分割值来创建分区。

原则上,异常值比常规观测值更少出现,并且在值方面与常规观测值不同(在特征空间中,它们离常规观测值更远)。这就是为什么通过使用这种随机划分,它们应该被识别为更靠近树的根(更短的平均路径长度,即,观察在树中从根到终端节点必须经过的边的数量),需要更少的分裂。

从[1]的图 1 中可以看出识别正常和异常观察的想法。正常点(左侧)比异常点(右侧)需要识别更多的分区。

Figure 1 Identifying normal vs. abnormal observations

与其他异常值检测方法一样,异常值是决策所必需的。对于隔离林,它被定义为:

其中 h(x) 是观测值 x 的路径长度, c(n) 是二叉查找树中搜索不成功的平均路径长度, n 是外部节点数。有关异常分数及其组成部分的更多信息,请参见[1]。

每个观察值都有一个异常值,可以在此基础上做出以下决定:

  • 接近 1 的分数表示异常
  • 分数远小于 0.5 表示正常观察
  • 如果所有分数都接近 0.5,那么整个样本似乎没有明显的异常

Python 示例

好,现在我们来看一个动手的例子。为了简单起见,我将使用一个人工的二维数据集。通过这种方式,我们可以监控图中异常值的识别过程。

首先,我需要生成观察结果。我将从被视为正常并将用于训练模型的观察开始(Python 的scikit-learn隔离森林实现中的训练和评分类似于所有其他机器学习算法)。第二组是新的观察值,来自与训练值相同的分布。最后,我生成离群值。

*# importing libaries ----*
**import** **numpy** **as** **np**
**import** **pandas** **as** **pd**
**import** **matplotlib.pyplot** **as** **plt**
**from** **pylab** **import** savefig
**from** **sklearn.ensemble** **import** IsolationForest*# Generating data ----*

rng = np.random.RandomState(42)

*# Generating training data* 
X_train = 0.2 * rng.randn(1000, 2)
X_train = np.r_[X_train + 3, X_train]
X_train = pd.DataFrame(X_train, columns = ['x1', 'x2'])

*# Generating new, 'normal' observation*
X_test = 0.2 * rng.randn(200, 2)
X_test = np.r_[X_test + 3, X_test]
X_test = pd.DataFrame(X_test, columns = ['x1', 'x2'])

*# Generating outliers*
X_outliers = rng.uniform(low=-1, high=5, size=(50, 2))
X_outliers = pd.DataFrame(X_outliers, columns = ['x1', 'x2'])

图 2 展示了生成的数据集。正如所期望的,训练和“正常”观察基本上是相互叠加的,而异常值是分散的。由于异常值的随机性质,它们中的一些与训练/正常观察重叠,但是我将在后面说明。

Figure 2 Generated Dataset

现在我需要在训练台上训练隔离林。我在这里使用默认设置。值得注意的一点是污染参数,它指定了我们认为是异常值的观察值的百分比(scikit-learn的默认值是 0.1)。

*# Isolation Forest ----*

*# training the model*
clf = IsolationForest(max_samples=100, random_state=rng)
clf.fit(X_train)

*# predictions*
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

好了,现在我们有了预测。如何评估绩效?我们知道,测试集只包含来自与正态观测值相同分布的观测值。因此,所有的测试集观测值都应该归类为正常。对于离群值集合,反之亦然。再来看准确度。

*# new, 'normal' observations ----*
print("Accuracy:", list(y_pred_test).count(1)/y_pred_test.shape[0])
# Accuracy: 0.93*# outliers ----*
print("Accuracy:", list(y_pred_outliers).count(-1)/y_pred_outliers.shape[0])
# Accuracy: 0.96

起初,这看起来很好,特别是考虑到默认设置,但是,还有一个问题需要考虑。由于异常值数据是随机生成的,一些异常值实际上位于正常观察值内。为了更仔细地检查它,我将绘制正常观察数据集和带标签的异常值集。我们可以看到,一些位于正常观察集内的异常值被正确地归类为正常观察值,其中一些被错误地归类。我们可以做的是尝试不同的参数规格(污染、估计数、抽取样本数以调整基本估计数等)。)来获得更好的契合度。但目前来看,这些结果还是令人满意的。

Figure 3 Inspecting outlier classification

外卖食品

  • 隔离林是一种异常值检测技术,可识别异常值而非正常观察值
  • 类似于随机森林,它是建立在二元(隔离)树的集合上
  • 它可以扩展到处理大型高维数据集

这是我在这里的第一篇文章,如果我再写一些,我会努力提高写作和编辑的水平。一如既往,我们欢迎任何建设性的反馈。你可以在推特上或评论中联系我。

本文中使用的代码可以在我的 GitHub 上找到。

您可能还对一种更简单的异常值检测算法感兴趣 Hampel 滤波器。我在上面写了一小段这里。

喜欢这篇文章吗?成为一个媒介成员,通过无限制的阅读继续学习。如果你使用这个链接成为会员,你将支持我,不需要额外的费用。提前感谢,再见!

参考

[1]刘福亭,丁克明,周振华(2008 年 12 月).隔离森林。在数据挖掘,2008 年。08 年的 ICDM。第八届 IEEE 国际会议(第 413-422 页)。IEEE。

[2]http://sci kit-learn . org/stable/modules/generated/sk learn . ensemble . isolation forest . html

离群值解释:不同类型离群值的快速指南

原文:https://towardsdatascience.com/outliers-analysis-a-quick-guide-to-the-different-types-of-outliers-e41de37e6bf6?source=collection_archive---------8-----------------------

商业上的成功取决于在正确的时间做出正确的决定。然而,只有当你在适当的时候拥有所需的洞察力,你才能做出明智的决定。当合适的时机到来时,异常值检测(也称为异常检测)可以帮助您在风暴来临时,或者在业务趋势向有利于您的方向转变时,为您的公司制定更好的路线。在这两种情况下,快速检测和分析异常值可以让你及时调整你的路线,以产生更多的收入或避免损失。说到分析,第一步是知道你面对的是什么类型的异常值。

三种不同类型的异常值

在统计学和数据科学中,所有异常值都属于三个普遍接受的类别:

类型 1:全局异常值(也称为“点异常”):
如果数据点的值远在发现它的整个数据集之外,则该数据点被认为是全局异常值(类似于计算机程序中的“全局变量”可以被程序中的任何函数访问)。

类型 2:上下文(条件)异常值:
如果一个数据点的值明显偏离相同上下文中的其余数据点,则该数据点被认为是上下文异常值。请注意,这意味着如果相同的值出现在不同的上下文中,它可能不会被视为异常值。如果我们将讨论局限于时间序列数据,那么“上下文”几乎总是时间性的,因为时间序列数据是一段时间内特定数量的记录。因此,在时间序列数据中,背景异常值很常见也就不足为奇了。

类型 3:集体异常值:
如果作为集合的那些值明显偏离整个数据集,则数据集内的数据点子集被认为是异常的,但是单个数据点的值本身在上下文或全局意义上不是异常的。在时间序列数据中,这种情况的一种表现方式是,当季节性序列正常时,出现在时间范围之外的正常峰值和谷值,或者作为一组处于异常值状态的时间序列的组合。

请这样想:

一块拳头大小的陨石撞击你邻居的房子是一个全球性的异常事件,因为陨石撞击建筑物的事件非常罕见。如果降雪发生在仲夏,而你的邻居被埋在两英尺厚的雪中,这将是一个上下文异常值,通常你在冬天之外不会下雪。你的每一个邻居都在同一天搬出这个社区,这是一个集体的离群值,因为尽管人们从一个住所搬到另一个住所肯定不罕见,但整个社区同时搬迁是非常不寻常的。

这个类比有助于理解这三种异常值之间的基本差异,但是它如何适应业务度量的时间序列数据呢?

让我们转到更具体的业务示例:

一位银行客户通常每月在当地自动取款机上存入不超过 1000 美元的支票,但在两周内突然存入两笔各为 5000 美元的现金,这是一种全球性的异常现象,因为这种情况在这位客户的历史上从未发生过。他每周存款的时间序列数据会显示最近的突然飙升。如此剧烈的变化会引起警觉,因为这些巨额存款可能是由于非法交易或洗钱。

一家电子商务公司的订单量突然激增,如该公司每小时的总订单量所示,如果这一高量发生在已知的促销折扣或高量时段(如黑色星期五)之外,则可能是上下文异常值。这种蜂拥现象会不会是由于定价失误,让消费者以低廉的价格购买产品?

一家上市公司的股票从来都不是静态的,即使价格相对稳定,没有整体趋势,而且随着时间的推移会有微小的波动。如果股票价格在很长一段时间内保持完全相同的价格(相对于一分钱),那么这将是一个集体异常值。事实上,这件事发生在 2017 年 7 月 3 日纳斯达克交易所的几家科技公司身上,当时包括科技巨头苹果和微软在内的几家公司的上市股价为 123.45 美元。

这些异常是什么样子的?下面是几个例子。

**全局异常:**由于异常值明显超出正常的全局范围,主页的反弹次数出现峰值。

**情境异常:**应用崩溃一直在发生,并且有季节性模式(更多用户=更多崩溃)。然而,在这种异常情况下,应用崩溃的数量并没有超出正常的全球范围,但与季节性模式相比是不正常的。

**集体异常:**在本例中,发现三个不同产品类别的成功购买数量的异常下降相互关联,并组合成一个异常。对于每个时间序列,个人行为没有明显偏离正常范围,但综合异常表明支付存在更大的问题。

检测所有类型异常值的三个关键步骤

不考虑行业,不考虑数据源,离群点检测系统应该实时地在时间序列数据中发现所有类型的离群点,并且是在数百万个度量的尺度上。

异常值和异常检测算法已经在学术界进行了研究,最近已经开始作为商业服务和开源软件提供。所有这些都依赖于统计和机器学习算法,基于诸如 ARIMA、霍尔特-温特斯、动态状态空间模型(HMM)、PCA 分析、LSTMs 和 RNNs 等方法。除了基本算法之外,在构建这样的系统时还有许多额外的考虑。

关于如何构建这样一个系统的全面指南在关于异常检测的白皮书中概述。适用于所有基本异常值检测算法的关键步骤有助于检测各种异常值:

  1. 为每个时间序列选择最合适的模型和分布:这是检测任何异常值的关键步骤,因为时间序列可以以各种方式表现(平稳、非平稳、不规则采样、离散等),每种方式都需要具有不同基本分布的不同正常行为模型。
  2. 说明季节性和趋势模式:如果在描述正常行为的模型中没有说明季节性和趋势,就无法检测到上下文和集体异常值。自动检测这两者对于自动化异常检测系统至关重要,因为这两者不能针对所有数据手动定义。
  3. 检测集体异常涉及理解不同时间序列之间的关系,并说明用于检测和调查异常的关系。

离群值通常是潜在问题的可见症状,需要快速修复。然而,这些症状只有在你的异常值检测系统让它们变得可见时才可见。

如需更多视觉效果,请参见我们的简短解释视频。

最初发表于 2019 年 11 月此处。

优于 Tensorflow 的默认自动微分优化器,具有交互式代码[带 TF 的手动回推]

原文:https://towardsdatascience.com/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e?source=collection_archive---------4-----------------------

Image from pixel bay

所以我对这个想法思考了很久,有没有一种不同的(甚至更好的)方法来训练一个神经网络?Tensroflow、Keras、pyTorch 等框架都很神奇,非常好用。这不仅要感谢它们为我们执行自动微分的能力,还要感谢它们为我们提供了广泛的优化选择。但这并不意味着我们只能依靠他们的自动微分。

因此,让我们做一些不同的事情,我将尝试超越 Tensorflows 自动微分在他们的默认实现中,总共有 10 个优化器。我们将用来超越自动差异化的两项技术是…

a.谷歌大脑的梯度噪声

  1. 每层用 ADAM 优化器放大反向传播

网络架构/实验任务

我们的实验非常简单,我们将使用全连接神经网络(有 5 层),对 Tensorflow 的 MNIST 数据集进行分类。以上是每一层是如何构建的。由于我们将使用不同的优化方法,各层应该有不同的方法来执行反向传播,因此有三种方法。标准反向传播、Google Brain 的附加噪声和 ADAM 反向传播。另外,请注意两个细节。

1.我们将使用 Tensorflow MNIST 数据集提供的每一个数据。

2.我们将使用矢量图像。

tensor flow 优化人员列表

Screen Shot from Tensor Flow

以上是我们将与谷歌大脑的噪声和扩张反向传播进行比较的优化器的完整列表。现在,为了更容易地看出哪些是哪些,让我们为每个优化器分配颜色。

对比案例列表

如上所示,我们总共有 17 个案例,每个案例都有自己的颜色。请查看下面我使用的确切颜色。

如果您希望了解更多关于 matplotlib 颜色的信息,请访问此页面获取更多信息。现在让我们给每种情况分配不同的优化方法。

Case 0  → Google Brain's Added Gradient Noise + Standard Back PropCase 1  → Dilated ADAM Back Propagation Sparse Connection by Multiplication Case 2  → Dilated ADAM Back Propagation Sparse Connection by Multiplication + Google Brain's Added Gradient NoiseCase 3  → Dilated ADAM Back Propagation Dense Connection by AdditionCase 4  → Dilated ADAM Back Propagation Dense Connection by MultiplicationCase 5  → Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)Case 6  → Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)Case 7  → [tf.train.GradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/GradientDescentOptimizer)
Case 8  → [tf.train.AdadeltaOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdadeltaOptimizer)
Case 9  → [tf.train.AdagradOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdagradOptimizer) 
Case 10 → [tf.train.AdagradDAOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdagradDAOptimizer)
Case 11 → [tf.train.MomentumOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/MomentumOptimizer)
Case 12 → [tf.train.AdamOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer)
Case 13 → [tf.train.FtrlOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/FtrlOptimizer)
Case 14 → [tf.train.ProximalGradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/ProximalGradientDescentOptimizer)
Case 15 → [tf.train.ProximalAdagradOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/ProximalAdagradOptimizer)
Case 16 → [tf.train.RMSPropOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/RMSPropOptimizer)

本质上情况 0 ~ 6 是手动反向传播,情况 7 ~ 16 是自动微分。

不同试验列表/基础优势/
随机初始化

Experiment Trials

如果其中一个优化方法 从根本上优于另一个 ,那么每次我们运行实验时,那个方法都会胜过其余的。为了增加我们捕捉这一基本特征的概率,让我们进行 3 次不同的试验,每次试验我们将进行 10 次试验。(**注意 每次试验的超参数设置互不相同。)

另外为了保证方法的优越性,让随机种子值来初始化权重。

每次实验后,我们都会比较所有案例,以了解哪一个案例有…

a .最低成本率(或错误率)
b .训练图像的最高精度
c .测试图像的最高精度

当所有实验完成后,我们将会看到频率条形图,其中哪个案例在每个标准下表现最佳。

试验一结果

左侧图→10 次实验的频率柱状图最低成本率
中间图→10 次实验的频率柱状图训练图像的最高准确率
右侧图→10 次实验的频率柱状图测试图像的最高准确率

当学习率设置为 0.001 时,神经元更宽,每层有 1024 个神经元。似乎扩张反向传播易于过度拟合,因为它们在训练图像上的最低成本率和最高精度上最频繁,但是在测试图像上的最高精度上没有显示出来。

我看到了一种潜力,通过适当的调整,他们可以超越每一个案例。

**Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 5: 60%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 30%**
('Dilated ADAM Back Propagation Dense Connection by Addition')3\. **Case 0: 20%**
('Google Brain's Added Gradient Noise + Standard Back Prop')4\. **Case 1: 10%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 3: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition')2\. **Case 5: 30%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')3\. **Case 0: 20%**
('Google Brain's Added Gradient Noise + Standard Back Prop')4\. **Case 1: 10%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 0: 60%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 16: 40%**
('[tf.train.RMSPropOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/RMSPropOptimizer)')

实际上,情况 0 ~ 6 是人工反向传播,而情况 7 ~ 16 是自动微分。

试验 2 结果

左侧图 →最低成本率
上 10 次实验的频率柱状图 →训练图像上 10 次实验的频率柱状图→最高准确率
右侧图 →测试图像上 10 次实验的频率柱状图最高准确率

当学习率设置得稍高(0.0025)且神经元较窄(824)时,情况 5(大部分)优于所有其他情况。

**Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 3: 60%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')2\. **Case 5: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 3: 50%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')2\. **Case 5: 50%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 5: 70%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 20%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')3\. **Case 1: 10%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')

实际上,情况 0 ~ 6 是人工反向传播,而情况 7 ~ 16 是自动微分。

试验三结果

左图 →最低成本率
上 10 次实验的频率柱状图 →训练图像上 10 次实验的频率柱状图 右图 →测试图像上 10 次实验的频率柱状图

当学习率设置为 0.001,神经元更窄(824)时,谷歌自己的方法(大部分)优于所有其他情况。

****Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 0: 90%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 3: 10%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 0: 90%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 3: 10%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 0: 70%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 7: 10%**
('[tf.train.GradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/GradientDescentOptimizer)')3\. **Case 14: 10%**
('[tf.train.ProximalGradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/ProximalGradientDescentOptimizer)')4\. **Case 16: 10%**
('[tf.train.RMSPropOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/RMSPropOptimizer)')**

实际上,情况 0 ~ 6 是人工反向传播,而情况 7 ~ 16 是自动微分。

(3 月 6 日更新)试验 4 结果

左侧图**→10 次实验的频率柱状图最低成本率
中间图→10 次实验的频率柱状图训练图像的最高准确率
右侧图→10 次实验的频率柱状图测试图像的最高准确率

当学习率被设置为 0.0025 且具有更宽的神经元(1024)时,情况 2 表现良好。

****Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 5: 60%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 5: 60%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 3: 50%**
('Dilated ADAM Back Propagation Dense Connection by Addition')2\. **Case 1: 30%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')2\. **Case 5: 20%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')**

存档的培训结果

为了增加这个实验的透明度,我写了另一篇博文,其中包含随着时间推移的成本图、随着时间推移的训练图像的准确性图和随着时间推移的测试图像的准确性图。要访问它,请点击此处。

缺点

我还没有时间来优化每个汽车差异化的所有超参数。然而,我在每种情况下都保持了完全相同的学习率,但是有可能我设置的学习率对于张量流的自动微分来说不是最优的。如果你正在进行这个实验(如果你愿意,你可以使用我在交互代码部分提供的代码。)并为每个设置找到一个好的 hyper 参数,请通过评论让我知道,我很想看看它们是否也能被超越。

也就是说,我相信 Tensorflow 已经超级优化了它的算法,这使得自动微分执行得更快,但在每个网络上都获得了最高的性能。总的来说,这可能是一个公平的比较。

我还注意到扩张反向传播的两点。
1。它在浅网络或神经元数量较少的情况下表现不佳
2。它长期表现良好。

红框→ 案例 15 的错误率低于任何其他案例
蓝框→ 在第 100 个时期后,案例 5 开始超出执行

如上所述,大多数时候,在第一个 100 个时期,自动微分方法具有较低的误差率。然而,在一定量的时期之后,例如 100 或 150,扩张的反向传播开始胜过。

交互代码

我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问试验 1 的代码,请点击此处。
要访问试验 2 的代码,请点击此处。
要访问试验 3 的代码,请点击此处。

引用
(如果您希望使用该实现或任何信息,请引用这篇博文)

APA

**Outperforming Tensorflow’s Default Auto Differentiation Optimizers, with Interactive Code [Manual…. (2018). Medium. Retrieved 3 March 2018, from [https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e](https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e)**

司法协助

**"Outperforming Tensorflow’S Default Auto Differentiation Optimizers, With Interactive Code [Manual…." Medium. N. p., 2018\. Web. 3 Mar. 2018.**

哈佛

**Medium. (2018). Outperforming Tensorflow’s Default Auto Differentiation Optimizers, with Interactive Code [Manual…. [online] Available at: [https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e](https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e) [Accessed 3 Mar. 2018].**

最后的话

我想用我最喜欢的两句话来结束这篇文章。

杰夫·贝索斯(亚马逊 CEO):一切都是为了长远……
金尼·罗梅蒂(IBM CEO):成长与安逸不能共存

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

同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. 训练| TensorFlow。(2018).张量流。检索于 2018 年 3 月 3 日,来自https://www . tensor flow . org/API _ guides/python/train # optimizer
  2. Seo,J. D. (2018 年 02 月 05 日)。带张量流的手动回推:解耦递归神经网络,从 Google 修改 NN…2018 年 2 月 21 日检索,来自https://towards data science . com/manual-Back-Prop-with-tensor flow-Decoupled-Recurrent-Neural-Network-modified-NN-from-Google-f9c 085 Fe 8 FAE
  3. j . bort(2014 年 10 月 07 日)。IBM 首席执行官 Ginni Rometty:增长和舒适不能共存。检索于 2018 年 2 月 21 日,来自http://www . business insider . com/IBM-CEO-growth-and-comfort-don-co-exist-2014-10
  4. Saljoughian,P. (2017 年 11 月 20 日)。读完每一封亚马逊股东信后,我从杰夫·贝索斯身上学到了什么。检索于 2018 年 2 月 21 日,来自https://medium . com/parsa-VC/what-I-learn-from-Jeff-be zos-after-reading-every-Amazon-shareholder-letter-172d 92 f 38 a 41
  5. 页(page 的缩写)(未注明)。Pinae/TensorFlow-MNIST 示例。检索于 2018 年 2 月 22 日,来自https://github . com/pinae/tensor flow-MNIST-example/blob/master/full-connected . py
  6. 如何打印一个前面有一定数量空格的整数?(未注明)。检索于 2018 年 2 月 22 日,来自https://stack overflow . com/questions/45521183/how-do-I-print-an-integer-with-set-number-of-spaces-before-it
  7. 如何在没有科学记数法和给定精度的情况下漂亮地打印一个 numpy.array?(未注明)。检索于 2018 年 2 月 22 日,来自https://stack overflow . com/questions/2891790/how-to-pretty-printing-a-numpy-array-with-with-given
  8. 将浮点数限制在小数点后两位。(未注明)。检索于 2018 年 2 月 22 日,来自https://stack overflow . com/questions/455612/limiting-floats-to-two-decimal-points
  9. 如何防止 tensorflow 分配整个 GPU 内存?(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/34199233/how-to-prevent-tensor flow-from-allocation-the-total-of-a-GPU-memory
  10. 关闭 tensorflow 中的会话不会重置图形。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/42706761/closing-session-in-tensor flow-sints-reset-graph
  11. [1]“TF . reset _ default _ graph | tensor flow”, TensorFlow ,2018。【在线】。可用:https://www . tensor flow . org/API _ docs/python/TF/reset _ default _ graph。【访问时间:2018 年 2 月 23 日】。
  12. 在 tensorflow 中创建 float64 变量。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/35884045/creating-a-float 64-variable-in-tensor flow
  13. Tensorflow 中的 global_step 是什么意思?(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/41166681/what-does-global-step-mean-in-tensor flow
  14. python 中的零列表。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/8528178/list-of-zeros-in-python
  15. 使用列表中的 max()/min()获取返回的 max 或 min 项的索引。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/2474015/getting-the-index-of-returned-max-or-min-item-using-max-min-on-a-list
  16. 如何防止 tensorflow 分配整个 GPU 内存?(未注明)。2018 年 2 月 23 日检索,来自https://stack overflow . com/questions/34199233/how-to-prevent-tensor flow-from-allocation-the-total-of-a-GPU-memory
  17. 如何用 TensorFlow 得到稳定的结果,设置随机种子?(未注明)。2018 年 2 月 23 日检索,来自https://stack overflow . com/questions/36288235/how-to-get-stable-results-with-tensor flow-setting-random-seed
  18. 指定颜色。(未注明)。检索于 2018 年 2 月 23 日,来自https://matplotlib.org/users/colors.html
  19. 艾森,硕士(未注明)。使用 matplotlib 设置绘图的条形颜色。检索于 2018 年 2 月 24 日,来自http://matthiaseisen.com/pp/patterns/p0178/
  20. 关闭事件。(未注明)。检索于 2018 年 2 月 24 日,来自https://matplotlib . org/gallery/event _ handling/close _ event . html # sphx-glr-gallery-event-handling-close-event-py
  21. 模块:tf.contrib.opt | TensorFlow。(2018).张量流。检索于 2018 年 3 月 3 日,来自https://www.tensorflow.org/api_docs/python/tf/contrib/opt
  22. 吉尼·罗梅蒂。(2018).En.wikipedia.org。检索于 2018 年 3 月 3 日,来自https://en.wikipedia.org/wiki/Ginni_Rometty
  23. 杰夫·贝索斯。(2018).En.wikipedia.org。检索于 2018 年 3 月 3 日,来自https://en.wikipedia.org/wiki/Jeff_Bezos
  24. Only Numpy:实现“添加梯度噪声改善非常深度网络的学习”来自…(2018).成为人类:人工智能杂志。检索于 2018 年 3 月 3 日,来自https://becoming human . ai/only-numpy-implementing-adding-gradient-noise-improves-learning-for-very-deep-networks-with-ADF 23067 F9 f1

超过 50 年的编码生涯仍在继续

原文:https://towardsdatascience.com/over-50-years-of-coding-and-still-going-5109c1acd182?source=collection_archive---------6-----------------------

1969 年伍德斯托克的夏天,我正趴在一台与 IBM 主机相连的 33 型电传打字机前,开发一个从数据中学习功能的程序。是的,它是机器学习,而且它使用了当今机器学习中普遍使用的方法。就在两年前,我写了我的第一个 Fortran 程序(在穿孔卡片上),并且迷上了它。

2017 年阵亡将士纪念日(Memorial Day 2017),周一凌晨 5 点 45 分左右,我在笔记本电脑上用 python 为一个深度学习程序编写代码,弄清楚如何预测创业公司的成功。

这个故事讲述的是这中间的几年,以及编程是如何贯穿半个多世纪的愉快旅程的。对我来说,编程是一种说服的语言。这项技能对于筹集大量资金支持和为投资者创造回报至关重要。

就在一年前,1968 年的夏天,当时我还在大学三年级,我面临着失去经济支持和不得不辍学的可能性。有点不可思议的是,我遇到了物理学博士理查德·l·科伦教授,他是电气工程系的一员。他打开了研究奖学金和全额奖学金的大门。有一个条件是必须的:在他的实验室里研究铁磁性薄膜的行为。

这是因为小时候对电子产品的极度迷恋而奠定的基础。12 岁时,我获得了普通业余无线电执照,并习惯于将电子设备接入正常工作的无线电通信设备。在 1959 年,当经济上无法与世界沟通时,如果条件合适,我可以与地球上的所有地点联系。

因此,当科伦教授提出一项实验,旨在通过将磁性薄膜置于电磁场中来了解其内部工作原理时,我准备好大干一场了。一旦我们收集了数据,问题是,我们如何不理解产生结果的潜在行为?答案是:使用牛顿方法的机器学习。我不会告诉你细节,但如果你今天参加任何关于机器学习的课程,你会看到这些相同的方法在近 50 年后仍然被教授。

那年秋天,我们的工作提交给了《应用物理杂志》,并在第二年 3 月(1970 年)发表。从那时起,使用数学建模和编程成为我探索和发展思想的方式。科伦教授让我走上了攻读博士学位的道路(一个特别设计的荣誉项目让我可以直接进入研究生研究),他给我的博士委员会增加了一位赫伯·卡伦教授。

Herb Callen 教授是麻省理工学院的物理学博士,宾夕法尼亚大学的物理学教授,写了关于热力学和恒温学的主要著作。直到几十年后,我才意识到这项工作在机器学习技术和深度学习中的作用。

几年后,我意识到我开始编程与当前围绕人工智能和机器学习的热潮是多么相关。故事还在继续。

高中时,我对数学语言学产生了兴趣。这种兴趣在 70 年代初爆发,当时博士后我设法获得了一个物理和计算机科学的大学教师职位。1973 年,我访问了 DARPNET(现在的互联网),开始从事自然语言处理系统的工作,最初是用 SNOBOL 编程,但很快就移植到了神的语言 LISP。

由于痴迷于实现语言的有向图模型(扩充转换网络、语义网络),我编写了实验性的解析系统,包括用于 Intel 8080 微处理器的 microcoding one。

到 1980 年,我离开了学术界,加入了德州仪器的一个研究小组(大部分来自麻省理工学院人工智能实验室),形成了人工智能领域的早期企业研究小组之一。在那里,我们委托理查德·格林布拉特在学术界之外建造第一批两台 LISP 机器。理查德在德州仪器的实验室里建造了这两台机器。

我无法向你描述这种计算能力和触手可及的交互性所带来的快乐(请记住,仅仅在 11 年前,从每秒 10 个字符链接到大型机开始)。在那里我们写了一个系统 HELPME。HELPME 是一种在联网计算机网络上迁移文件的超链接方式(1980 年的浏览器)。

没过多久,我接到了硅谷的电话。Ed Feigenbaum 教授招募我加入了一家从斯坦福大学分离出来的新创业公司,该公司(起初)专注于将人工智能应用于基因工程。是的,这是早期的,所以我们很快就迁移到一个基于平台的人工智能公司,KEE,知识工程环境,我们把名字改为 IntelliCorp。Greg clemen son(TI 的研究员,跟随我到 CA)是主要开发人员,他和我一起编写了一个应用程序包装器来展示底层面向对象系统如何运行。我们是在借来的时间和机器上完成的。施乐帕洛阿尔托研究中心和象征帕洛阿尔托办公室的深夜让我们得以构建 1983 年在 IJCAI Karlsruhe 首次亮相的代码。该公司继续把财富 100 强中的 60%作为客户。这些公司对获取他们的软件专家的知识感兴趣。INAI (IntelliCorp 的股票代码)在 1983 年成为第一家上市的人工智能公司。

三十年来,我大部分时间都在做首席执行官,但也经常去实验室玩编程。在我 60 岁出头的时候,我决定更认真地回归编程,开始用 objective C 为 iPhone 应用程序编写代码。很快就转移到 python 和其他语言中。

对我来说,编码是证明新想法可行的一种方式。你只需要编写代码来展示一个新想法的工作原理。这比试图用幻灯片说服别人要容易得多。编程是说服的语言。给他们看一个原型。随着今天的开源社区文化,创造性发展的大门对所有年龄的人都是敞开的。

过度拟合和正则化

原文:https://towardsdatascience.com/over-fitting-and-regularization-64d16100f45c?source=collection_archive---------1-----------------------

机器学习

在有监督的机器学习中,模型是在数据的子集上训练的,也就是训练数据。目标是根据训练数据计算每个训练示例的目标。

现在,当模型在训练数据中学习信号和噪声时,就会发生过度拟合,并且在模型没有训练的新数据上表现不佳。在下面的例子中,你可以看到前几步的欠拟合和后几步的过拟合。

现在,有几种方法可以避免在训练数据上过度拟合模型,如交叉验证采样、减少特征数量、修剪、正则化等。

随着模型复杂性的增加,正则化基本上增加了惩罚。正则化参数(lambda)惩罚除截距之外的所有参数,以便模型概括数据,不会过度拟合。

Regularization in cost function

在上面的 gif 中,随着复杂度的增加,正则化将增加对更高术语的惩罚。这将降低高次项的重要性,并使模型变得不那么复杂。

敬请关注下一篇文章,它将涵盖不同类型的正规化技术。

过度适应和大规模灭绝

原文:https://towardsdatascience.com/overadaptation-and-mass-extinctions-e5dde5a2782f?source=collection_archive---------9-----------------------

你买保险是因为你“知道”坏事确实会发生,即使可能性很小,但是,在坏事没有发生的每一刻,你花在保险上的每一分钱都被浪费了。

换一种稍微不同的形式,这就是投资组合问题,换句话说:你买了 A 和 B 两家公司的股票,因为你意识到 A 不会总是相对于 B 上涨:如果 A 总是比 B 涨得多,你花在 B 上的每一分钱都是浪费。

预测分析的承诺(我认为是危险的错误)是,它可以减少甚至消除不确定性。你会知道,有了足够的数据,你可以可靠地预测股票 A 和 B 的相对表现,或者,换句话说,如果一切顺利,你总是知道,A 将永远比 B 做得更好,至少,当你买入 A 时。因为你总是知道未来,你总是 100%投资于“赢家”不需要浪费的保险!

但是你怎么知道未来呢?因为数据是这么说的。但是这些数据只是对现实的不完全反映。你知道 A“总是”赢家,因为只要你有数据,它总是赢。或者,换句话说,因为 A 是“失败者”的概率很小,以至于在你的数据收集过程中没有被抓住,不一定 A“永远不会”是失败者。

“几乎肯定”和“几乎肯定不会”是概率中的微妙概念:即使某件事在任何给定事件中几乎肯定不会发生,但在无限样本量的情况下,它会在某个时间某个地方发生——除非概率恰好为 0。然而,只要样本量是有限的(或者,通常情况下,抽样过程不是完全随机的),我们就永远无法确定某样东西的概率是零还是非常小。)

这是一个由预测分析的进步所造成的悖论(从某种意义上说,是斯蒂格利茨-格罗斯曼悖论的变体,该悖论关注价格系统的信息含量,以及其自身的信息含量如何颠覆对价格系统的依赖。).预测分析变得越好,无论是通过方法的进步还是通过更大数据的可用性,购买不确定性保险的激励就会减少——因为保险可以防范噪音,噪音就是浪费,浪费就会最小化等等。我在这里不是愤世嫉俗或讽刺:如果能够以相当高的可靠性计算出非常罕见的事件发生的几率,那么为非常罕见的事件购买保险可能会更有利,至少对中短期而言——这是几乎每个人都在操作的时间范围。但从足够长的时间来看,事情会变得更加复杂:坏事最终几乎肯定会发生。有了足够的预测分析加上中短期的心态(这通常是几乎所有“实用”数据分析的最终结果,因为长期分析与长期天气预报一样可靠),没有人会浪费资源为这些罕见的事件做准备——或者说,没有人会非常适应当前的信息环境,因为他们确切知道应该在何时以及如何发生什么,而这些罕见的事件不会发生(足以证明浪费的合理性)。

当然,如果罕见的事件真的发生了,没有人会为它们做好准备,如果没有足够的准备,再加上足够灾难性的事件,大规模灭绝就会发生——真的。当事情发生变化时,最适应(现状环境)的,而不是最不适应的,会消亡,因为适应得更好的不能同样有效地应对变化。专注于数据科学的预测性,而不是欣赏分布的整体广度,特别是助长了大规模灭绝类型逻辑的危险。

当然,我们以前确实看到过这种逻辑:不到十年前的金融危机就是这样发生的。问题在于“罕见”事件的本质使得对其概率的估计变得困难。顾名思义,它们是罕见的:它们不会产生太多可靠的数据,而我们所拥有的大部分数据都来自“显而易见的”和“常规的”来源,这些来源提供的信息很少。只要罕见事件仍然罕见,投保就没有任何好处——至少在中短期内是这样,因为,为什么,它(可能)在未来十年内永远不会发生,你(可能)会正确地期待这一点。

更经常与“人类”打交道的成熟工程学科,对他们的创造并不那么自信:他们预计事情会以预期和意外的方式出错,并在事情确实出错时花大量时间做侦查工作。他们过度保险自己,特别是当技术是新的时候。如果“数据科学”的目标是使用数据分析来做事,那么这个标签就用错了:它实际上是“数据工程”,而不是“科学”。一个好的工程师应该意识到事情会出乎意料地发展,应该设法保守地确保自己不会出问题,也就是说,不要在新的新奇小发明做他们应该做的事情上下太大的赌注,这样做,可能会推迟灭绝事件的时间。

NIPS 2017 上的总体趋势和应用(带链接!)

原文:https://towardsdatascience.com/overarching-trends-and-applications-at-nips-2017-with-links-fc523d3354a7?source=collection_archive---------5-----------------------

Long Beach was really pretty at night.

我最近有机会参加了神经信息处理系统会议(NIPS)。我很高兴我参加了,因为我学到了很多东西,建立了很多非常好的关系(另外,我还看到了我从未见过的南加州,并逃离了缅因州的严冬)。在 NIPS 上,几个重要的主题和技术似乎贯穿了整个会议和研讨会。此外,ML 的几个应用一直受到很多关注。因为一个人可以很容易地写十几篇关于 NIPs 的文章,所以在这篇文章中,我将简要地调查一下我认为是什么构成了这些支配性的主题。稍后,我会就我在 NIPS 亲自探索的那些写更详细的文章。我会把其他的留给参加过的人。我在页面底部提供了相关链接,这样你就可以在闲暇时探索这些话题。

(请注意,NIPs 是一个如此大的会议,我很容易错过一些东西,在一定程度上,这些可能反映了我自己的经历和我交往的人。尽管如此,我还是尽最大努力捕捉了 NIPs 中所有跨“学科”的突出观点。

此外,在开始之前,似乎有必要提一下,谢天谢地,会议没有受到火灾的影响,但南加州的许多人却没有这么幸运。所以,如果你有机会并且有能力的话,请向联合慈善基金会或其他慈善机构捐赠。

贝叶斯深度学习(和深度贝叶斯学习)

在 NIPs,将贝叶斯技术应用于深度学习是一个巨大的话题。周四 Yee Whye Teh 做了一个关于贝叶斯深度学习和深度贝叶斯学习的演讲。他描述了同步在分布式贝叶斯深度学习中的工作方式,指出服务器本质上维护的是后验分布,而不是参数的权威副本。然后,他将这一想法与克服神经网络中的灾难性遗忘和弹性权重整合的问题联系起来。在演讲的第二部分,他描述了深度学习技术如何改善贝叶斯学习。他描述了 DL 如何帮助克服贝叶斯模型中的一些僵化之处,并增加它们的推理和可伸缩性。除了主题演讲,还有几个关于贝叶斯技术的焦点。我个人最喜欢的是贝叶斯甘斯。

我还看到贝叶斯技术在元学习研讨会上出现了几次。此外,贝叶斯技术保持着四个直接相关的研讨会的记录(至少今年如此)。在大楼的四周,你可以听到人们在谈论一些技术或模型的贝叶斯理论。最后,在深度学习中使用贝叶斯方法有可能帮助解决可解释性问题,或者至少提供更多“微妙”的决策。这就引出了我们的下一个趋势。

严谨性、可解释性、稳定性/安全性和理论性

这种趋势并不奇怪。到现在为止,你可能已经看过阿里·拉希米的《时间的考验》视频以及由此引发的讨论(如果你还没有下面的演示链接)。需要注意的是,这四个主题是相似的,但并不完全相同。我选择将它们归为一类,因为它们都与提供一种解释有关,无论是技术的还是非技术的,理论的还是实验的,经验的还是定性的,解释了为什么一个模型会以这种方式运行(或者保证模型的整体稳定性)。例如,人们可以通过实验结果而不是理论来证明严谨性。此外,可解释性对不同的人来说可能意味着不同的事情(例如,ML 研究员认为对模型决策的合理解释可能不足以说服医生做出诊断[或让患者接受])。我不会过多地讨论关于炼金术和工程学的激烈争论,除了说它肯定在双方都产生了大量的讨论和强烈的观点(下面的链接)。

我要说的是,无论你是否认为可解释性或“严谨性”对研究是必不可少的,它在应用的实践层面上是重要的。如果我们不能解释国会做出的决定及其原因,我们怎么能指望国会批准无人驾驶汽车呢?或者我们怎么能仅仅因为一个模型认为某人患癌症的概率很高就指望医生进行手术呢?最后,对可解释性的研究将大大有助于调试神经网络。至少对我来说,有很多次当我写代码时,它运行得很好,但是网络不会收敛,或者它给我一个完全意想不到的结果。也就是说,在可解释性研讨会和专题讨论会上,有许多很好的演示和有趣的作品,我强烈建议你们去看看。

几何深度学习和图形 CNN

很多数据自然最好用图类型结构来表示;例如,社交网络、多个城市之间的路线或化学品。然而,传统的神经网络不能很好地处理这种类型的结构化数据。在 NIPs 2017 上,图形神经网络或 GNN 是突出的特色。在 NIPS 的第一天,迈克尔·布朗斯坦、琼·布鲁纳、阿瑟·斯拉姆和扬·勒昆主持了一个关于结构和流形的几何深度学习的教程。在教程中,他们解释了 GNN 模型背后的理论及其几个应用。但是 GNN 也出现在一些 NIPS 的报纸和许多车间里。这个话题在非正式讨论中也多次出现。就个人而言,我认为能够在神经网络中“保持”图形或流形结构是一大进步,可以应用于各种不同的领域。

生成性对抗网络

今年 GANs 在日本很受欢迎。也许没有去年那么热,但在整个主要会议期间和几乎每个研讨会上都可以看到它们。在主会议上,我们有“双代理甘斯的照片真实感和身份”、“维甘”、“f-甘斯”、“双代理甘斯”、“瓦瑟斯坦甘斯的改良训练,仅举几例。尽管没有专门的工作室,他们仍然在周五和周六到处出现。例如,创意工作室几乎完全由创造艺术、音乐和演讲的甘人组成。几位发言人甚至在 ML4H 和 MedNIPS 研讨会上提到了 gan。显然,在医学领域中有几种应用,例如扩充训练数据、生成合成数据(不符合 HIPPA ),以及重建/改变图像的模态(即,从 MRI 到 ct)。

强化学习(特别是深度强化学习)

强化学习仍然是 NIPs 的热门话题。主要会议有一个完整的轨道致力于 RL,一个关于如何与人一起使用 RL 的教程,以及一个关于深度 RL 的研讨会。但更重要的是 RL 在其他研讨会和讨论中出现的次数。例如,ML4H 研讨会上的几篇论文讨论了使用 RL 来指导败血症治疗和疟疾可能性预测。

这次会议清楚地表明(至少对我来说), RL 不再仅仅用于有明确规则的计算机和棋盘游戏,现在研究人员积极地将 RL 应用于解决从败血症治疗到聊天机器人到机器人的现实世界问题。

元学习

在 NIPS,元学习也是一个相当大的话题。元学习本质上是学习学习或优化优化算法的艺术。如果这看起来令人困惑,你并不孤单。在小组讨论中,关于元学习到底是什么有很长的争论。至少在这次会议的背景下,元学习似乎本质上包括使用算法来寻找模型的最优超参数和/或网络的最优结构。

基本思想是,大量时间(通常是金钱)被浪费在手工测试各种超参数配置和不同的网络结构上。很多时候,可能永远也找不到真正的最佳结构。如果我们有一种算法可以学习优化网络以提供最佳结果,那会怎么样?几位发言者在周四晚上的研讨会上探讨了这一问题,讨论在周五的研讨会上继续进行。许多人还在交谈中提出元学习,询问演讲者他们是否会自动调整他们的超参数。

二。应用领域

Long Beach was bright and sunny for the pretty much the entire conference.

医疗保健

将机器学习应用于医疗保健是今年会议上的一个热门话题。会议有两个研讨会,医疗保健的机器学习(ML4H)和医学成像会议 NIPs(这两个我将在未来的文章中详细总结),以及几个相关的研讨会,其中包括大量医疗保健相关的提交材料(例如,计算生物学)。总之,ML4H 专注于医疗保健的各个领域。这些领域包括将 ML 用于药物研发、医院运营(如预测住院时间、手部卫生等。),以及遗传学研究。医学成像与专注于医学成像的 NIPS 相遇,主要探索 ML 技术如何帮助医学图像分割、重建和分类。

医疗保健也出现在主要会议上。周二,Deep Genomics 的布伦丹·弗雷(Brendan Frey)发表了关于人工智能如何加快研究甚至提供遗传病治疗效果的主题演讲。此外,有大量的医疗人工智能公司在会议中心进行互动演示。

机器人学

机器人技术似乎是另一个在主要会议和研讨会上受到相当多关注的领域。周二,在太平洋舞厅有一场“*使用视觉想象和元学习的深度机器人学习”*的演示。然后在周三,Pieter Abbel 做了一个关于机器人深度学习的演讲。同样,周五也有一个讨论“现实世界中的表演和互动”的研讨会

科学、能源和工程

似乎也有很多关于在其他科学中应用机器学习技术(或者反过来使用其他科学的原理来增强机器学习)和解决能源问题的内容。在主会议上,有一个关于能源和排放的主题发言。具体来说,周一在开场白之后,约翰·普拉特谈到了“减少二氧化碳排放的能源战略”在这篇文章中,他描述了如何应用最大似然法来预测能源的利用和寻找能源的组合,以便降低到当前排放量的一个设定的分数。普拉特接着讨论了如何利用 ML 在核聚变研究中取得进展。

在工作室那边有两个有趣的工作室。第一次是针对物理科学的深度学习,第二次是针对分子和材料的深度学习。ML for computational biology workshop 也关注这些想法(尽管正如人们所料,它确实与医疗保健相关的想法有相当多的重叠)。

结论

这只是今年 NIPs 上展示的一些真正令人兴奋的趋势和想法的一瞥。这些话题中有许多我只是刚刚触及,所以我鼓励你更详细地探索它们。此外,还有许多其他的小话题也同样有趣,如果不是更有趣的话。我将会写几篇关于 ML4H、MedNIPs、可解释性和(可能)元学习的后续文章。敬请关注。一如既往,如果你认为我错过了什么或有其他意见,请在下面留下。

链接(如承诺的)

贝叶斯技术

Keynote by Yee Whye Teh

[## 贝叶斯深度学习研讨会| NIPS 2017

NIPS 2017 贝叶斯深度学习研讨会—2017 年 12 月 9 日,美国长滩长滩会议中心。

bayesiandeeplearning.org](http://bayesiandeeplearning.org) [## bayesopt.com

编辑描述

bayesopt.com](http://bayesopt.com/) [## (几乎)贝叶斯学习的 50 个阴影:PAC-贝叶斯趋势和见解- NIPS 2017 研讨会

我们认为,现在是时候确定当前 PAC-Bayesian 相对于其他现代方法的趋势了

bguedj.github.io](https://bguedj.github.io/nips2017/50shadesbayesian.html)

严谨性和可解释性

[## NIPS 2017 研讨会:解读、解释和可视化深度学习——现在怎么办?

黑匣子。在医疗诊断或自动驾驶汽车等敏感应用中,模型对环境的依赖性越来越大

www.interpretable-ml.org](http://www.interpretable-ml.org/nips2017workshop/) [## 可解释的 ML 研讨会— NIPS 2017

美国加州长滩 NIPS 2017 可解释 ML 研讨会

可解释的. ml](http://interpretable.ml)

The talk of Ali Rahimi at NIPS

Facebook post in response by Yann and the resulting discussion in the comments.

几何深度学习

[## 几何深度学习

在过去十年中,深度学习方法(例如卷积神经网络和递归神经网络)允许…

geometricdeeplearning.com](http://geometricdeeplearning.com/)

强化学习

Tutorial on RL with people

Keynote at the Deep Reinforcement Learning Symposium

Main conference RL spotlight

[## 深度强化学习研讨会,NIPS 2017

虽然强化学习的理论解决了一类极其普通的学习问题,但它有一个共同的特点

sites.google.com](https://sites.google.com/view/deeprl-symposium-nips2017/home)

甘斯

如前所述,没有太多的“纯 GAN”内容,但它们出现在许多研讨会和聚光灯下。

本次会议有很多关于甘斯。

元学习

[## 元学习研讨会

出现了几种元学习方法,包括基于贝叶斯优化、梯度下降…

metalearning-symposium.ml](http://metalearning-symposium.ml/) [## 主页

@NIPS 2017 年 12 月 09 日星期六长滩凯悦酒店,灯塔舞厅 D+E+F+H

metalearning.ml](http://metalearning.ml/)

车间

卫生保健

https://ml 4 health . github . io

[## med-nips 2017

“医学成像与 NIPS 相遇”是 NIPS 2017 的卫星研讨会。该研讨会旨在将来自…的研究人员聚集在一起

sites.google.com](https://sites.google.com/view/med-nips-2017)

能源和科学

[## 物理科学深度学习,NIPS 2017

第 31 届神经信息大会物理科学深度学习(DLPS)研讨会网站…

dl4physicalsciences.github.io](http://dl4physicalsciences.github.io) [## NIPS 2017 研讨会:分子和材料的机器学习

机器学习的成功一次又一次地在分类、生成模型和…

www.quantum-machine.org](http://www.quantum-machine.org/workshops/nips2017/)

机器人

[## NIPS 17 机器人学习

近年来,机器人技术在公共领域的实际应用方面取得了长足的进步。机器人…

sites.google.com](https://sites.google.com/view/nips17robotlearning/home)

过度拟合与欠拟合:一个完整的例子

原文:https://towardsdatascience.com/overfitting-vs-underfitting-a-complete-example-d05dd7e19765?source=collection_archive---------1-----------------------

探索和解决基础数据科学问题

当你学习数据科学时,你会意识到没有真正复杂的想法,只是许多简单的积木组合在一起。神经网络可能看起来非常先进,但它实际上只是无数小想法的组合。当您想要开发一个模型时,不要试图一次学习所有的东西,一次完成一个模块会更有效率,也更少令人沮丧。这可以确保你对基本原理有一个坚实的概念,避免许多会阻碍他人的常见错误。此外,每一部分都开辟了新的概念,让你不断积累知识,直到你可以创建一个有用的机器学习系统,同样重要的是,理解它是如何工作的。

Out of simple ideas come powerful systems (Source)

这篇文章通过一个完整的例子展示了一个基本的数据科学构建模块:欠拟合与过拟合问题。我们将探讨这个问题,然后实现一个叫做交叉验证的解决方案,这是模型开发的另一个重要原则。如果你正在寻找一个关于这个话题的概念框架,请看我之前的帖子。这篇文章中生成的所有图表和结果都是用 Python 代码写的,这些代码在 GitHub 上。我鼓励任何人去检查代码,并做出自己的改变!

模型基础

为了讨论欠拟合和过拟合,我们需要从基础开始:什么是模型?模型只是一个将输入映射到输出的系统。例如,如果我们想预测房价,我们可以制作一个模型,它接收房子的平方英尺并输出价格。一个模型代表了一个问题的理论:在平方英尺和价格之间有一些联系,我们制作一个模型来了解这种关系。模型是有用的,因为我们可以使用它们来预测给定输入的新数据点的输出值。

模型从训练数据集中学习输入(称为要素)和输出(称为标注)之间的关系。在训练期间,模型被给予特征和标签,并学习如何将前者映射到后者。训练好的模型在测试集上进行评估,我们只给它特征,它进行预测。我们将预测与测试集的已知标签进行比较,以计算准确性。模型可以采取多种形式,从简单的线性回归到深度神经网络,但所有监督模型都基于从训练数据中学习输入和输出之间关系的基本思想。

培训和测试数据

要做一个模型,我们首先需要有底层关系的数据。对于本例,我们将使用 x 值(要素)和 y 值(标注)创建自己的简单数据集。我们数据生成的一个重要部分是给标签添加随机噪声。在任何真实世界的过程中,无论是自然的还是人为的,数据都不完全符合趋势。在我们无法测量的关系中,总是存在噪音或其他变量。在房价的例子中,面积和价格之间的趋势是线性的,但是由于影响房价的其他因素,价格并不完全在一条线上。

Example of a real-world relationship (Source)

我们的数据同样具有趋势(我们称之为真实函数)和随机噪声,以使其更加真实。创建数据后,我们将其分成随机的训练集和测试集。该模型将尝试学习训练数据上的关系,并根据测试数据进行评估。在这种情况下,70%的数据用于训练,30%用于测试。下图显示了我们将探究的数据。

Data and True Generating Funtion

我们可以看到,由于我们添加了随机噪声,我们的数据在真实函数(部分正弦波)周围分布有一些变化(详见代码)。在训练过程中,我们希望我们的模型学习真正的功能,而不会被噪音“分散注意力”。

模型建筑

选择一个模型可能看起来令人生畏,但是一个好的规则是从简单开始,然后逐步建立。最简单的模型是线性回归,其中输出是输入的线性加权组合。在我们的模型中,我们将使用线性回归的扩展,称为多项式回归来了解 x 和 y 之间的关系。多项式回归,其中输入被提升到不同的幂,仍然被认为是“线性”回归的一种形式,即使图形没有形成直线(这一开始也让我很困惑!)多项式的一般方程如下。

这里 y 代表标签,x 代表特征。β项是将在训练期间学习的模型参数,ε是任何模型中存在的误差。一旦模型学习了β值,我们可以插入 x 的任何值,并获得 y 的相应预测。多项式由其阶定义,它是方程中 x 的最高幂。直线是一次多项式,而抛物线是二次多项式。

Polynomials of Varying Degree (Source)

过度拟合与欠拟合

过拟合 vs 欠拟合的问题终于在我们谈到多项式次数的时候出现了。程度代表模型中的灵活性,较高的能力允许模型自由地触及尽可能多的数据点。拟合不足的模型灵活性较低,并且无法解释数据。理解这个问题的最好方法是看一看展示这两种情况的模型。

首先是一个 1 次多项式拟合的欠拟合模型。在左图中,橙色的模型函数显示在真实函数和训练观测值的顶部。在右侧,显示了测试数据的模型预测与真实功能和测试数据点的比较。

Underfit 1 degree polynomial model on training (left) and testing (right) datasets

我们的模型直接通过训练集,不考虑数据!这是因为欠拟合模型具有低方差和高偏差。方差是指模型对训练数据的依赖程度。对于 1 次多项式的情况,该模型很少依赖于训练数据,因为它几乎不关注点!相反,该模型具有很高的偏差,这意味着它对数据做出了强有力的假设。对于这个例子,假设数据是线性的,这显然是错误的。当模型进行测试预测时,偏差会导致它做出不准确的估计。由于这种偏差,模型无法学习 x 和 y 之间的关系,这是一个明显的拟合不足的例子。

我们看到低学位导致不适合。一个自然的结论是学习训练数据,我们应该只是增加模型的程度来捕捉数据中的每一个变化。然而这不是最好的决定!

Overfit 25 degree polynomial model on training (left) and testing (right) datasets

由于具有如此高的灵活性,该模型尽最大努力考虑每一个训练点。这似乎是个好主意——难道我们不想从数据中学习吗?此外,该模型在训练数据上具有很高的分数,因为它接近所有的点。虽然如果训练观察完美地代表了真实函数,这是可以接受的,但是因为数据中存在噪声,所以我们的模型最终符合噪声。这是一个方差很大的模型,因为它会根据训练数据发生显著变化。测试集上的预测优于 1 度模型,但是 25 度模型仍然不学习关系,因为它本质上记忆训练数据和噪声。

我们的问题是,我们想要一个不是“记忆”训练数据,而是学习实际关系的模型!怎样才能找到一个多项式次数合适的平衡模型?如果我们选择训练集上得分最高的模型,我们将只选择过拟合模型,但这不能很好地推广到测试数据。幸运的是,有一种成熟的数据科学技术来开发最佳模型:验证。

确认

我们需要创建一个具有最佳设置(程度)的模型,但我们不想一直经历训练和测试。在我们的例子中,测试性能差并没有什么后果,但是在一个实际的应用程序中,我们可能正在执行一个关键的任务,比如诊断癌症,部署一个有缺陷的模型会有严重的负面影响。我们需要某种预测试来用于模型优化和评估。这种预先测试被称为验证集。

一个基本的方法是除了训练集和测试集之外还使用一个验证集。但是这也带来了一些问题:我们可能会过度适应验证集,并且我们会有更少的训练数据。验证概念的一个更聪明的实现是 k 重交叉验证。

这个想法很简单:我们不使用单独的验证集,而是将训练集分成许多子集,称为折叠。我们以五折为例。我们执行一系列的训练和评估循环,每次我们在 4 个折叠上训练,在第 5 个折叠上测试,称为坚持组。我们重复这个循环 5 次,每次使用不同的折叠进行评估。最后,我们对每个折叠的分数进行平均,以确定给定模型的整体性能。这允许我们在部署之前优化模型,而不必使用额外的数据。

Five-Fold Cross-Validation (Source)

对于我们的问题,我们可以通过创建一系列不同程度的模型,使用交叉验证来选择最佳模型,并使用 5 重交叉验证来评估每个模型。具有最低交叉验证分数的模型将在测试数据上表现最佳,并且将在欠拟合和过拟合之间实现平衡。我选择使用从 1 到 40 度的模型,以覆盖广泛的范围。为了比较模型,我们计算均方误差,即预测值和实际值的平方之间的平均距离。下表显示了按最低误差排序的交叉验证结果,该图显示了 y 轴上有误差的所有结果。

Cross Validation Results

欠拟合和过拟合模型的交叉验证误差超出了图表范围!4 度的模型似乎是最佳的。为了测试结果,我们可以制作一个 4 度模型,并查看训练和测试预测。

Balanced Four degree polynomial model on training (left) and testing (right) datasets

没有比符合数据的模型更美的了!此外,我们知道我们的模型不仅密切跟踪训练数据,它实际上已经了解了 x 和 y 之间的关系。

为了验证我们拥有最佳模型,我们还可以绘制出所谓的训练和测试曲线。这些在 x 轴上显示了我们调整的模型设置,在 y 轴上显示了训练和测试误差。欠拟合的模型将具有高训练和高测试误差,而过拟合的模型将具有极低的训练误差但高测试误差。

Training and Testing Curves

这个图表很好地总结了过度拟合和欠拟合的问题。随着模型灵活性的增加(通过增加多项式次数),由于灵活性的增加,训练误差不断减小。然而,测试设置的误差只会随着我们将灵活性增加到一定程度而降低。在这种情况下,这发生在 5 度,当灵活性增加超过该点时,训练误差增加,因为模型已经记忆了训练数据和噪声。交叉验证在这个测试数据上产生了第二好的模型,但是从长远来看,我们期望我们的交叉验证模型表现最好。确切的度量标准取决于测试集,但平均来说,交叉验证的最佳模型将优于所有其他模型。

结论

过度拟合和欠拟合是一个基本问题,即使是经验丰富的数据分析师也会犯错误。在我的实验室里,我见过许多研究生用极低的误差拟合他们的数据,然后急切地用结果写一篇论文。他们的模型看起来很棒,但问题是他们甚至从未使用过测试集,更不用说验证集了!该模型只不过是训练数据的过度拟合表示,当其他人试图将他们的模型应用于新数据时,学生很快就会学到这一课。

幸运的是,这是一个我们可以很容易避免的错误,因为我们已经看到了使用交叉验证进行模型评估和优化的重要性。一旦我们理解了数据科学中的基本问题以及如何解决它们,我们就可以自信地建立更复杂的模型,并帮助他人避免错误。这篇文章涵盖了很多主题,但希望你现在对建模的基础、过度拟合与欠拟合、偏差与方差以及交叉验证的模型优化有所了解。数据科学就是要乐于学习,并不断向你的技能组合中添加更多工具。这个领域令人兴奋,因为它潜在的有益影响和不断学习新技术的机会。

我欢迎反馈和建设性的批评。可以在推特上找到我,电话是 @koehrsen_will 。我要感谢 Scikit-Learn 的贡献者,感谢他们在这个主题上的优秀范例。

过度拟合与欠拟合:一个概念性的解释

原文:https://towardsdatascience.com/overfitting-vs-underfitting-a-conceptual-explanation-d94ee20ca7f9?source=collection_archive---------4-----------------------

基于示例的核心数据科学概念框架

说你想学英语。你之前对英语一无所知,但你听说过最伟大的英国作家是威廉·莎士比亚。一个自然的做法肯定是把自己锁在图书馆里,背他的作品。经过一年的学习,你从学习中走出来,来到纽约市,向你见到的第一个人打招呼,说“早上好,朋友!”作为回应,你得到的是鄙视的目光和喃喃自语的“疯了”。你泰然自若地又问了一遍:“亲爱的女士,我们仁慈的女士怎么样了?”又一次失败和匆忙撤退。第三次尝试失败后,你心烦意乱:“多么羞耻多么悲伤!”。确实令人羞愧:你刚刚犯了建模中最基本的错误之一,过度拟合训练数据。

在数据科学课程中,过度拟合模型被解释为对训练集具有高方差和低偏差,这导致对新测试数据的泛化能力差。让我们从学习英语的角度来打破这个令人困惑的定义。我们想要建立的模型是如何使用英语进行交流的一种表示。我们的训练数据是莎士比亚的全部作品,我们的测试集是纽约。如果我们根据社会接受度来衡量表现,那么我们的模型就不能概括或转化测试数据。到目前为止,这似乎很简单,但是方差和偏差呢?

方差是模型根据训练数据而变化的程度。由于我们只是简单地记忆训练集,我们的模型具有很高的方差:它高度依赖于训练数据。如果我们读的是 J.K .罗琳的全部作品而不是莎士比亚,模式就完全不一样了。当具有高方差的模型应用于新的测试集时,它不能很好地执行,因为没有训练数据,它会丢失所有数据。这就像一个学生背下了课本上的问题,却在面对现实世界的问题时束手无策。

Sometimes even grad students should go outside

偏差是方差的另一面,因为它代表了我们对数据所做假设的强度。在我们学习英语的尝试中,我们没有形成最初的模型假设,而是相信吟游诗人的作品能教会我们关于语言的一切。这种低偏差可能看起来是积极的——为什么我们会想要偏向我们的数据呢?然而,我们应该始终怀疑数据告诉我们完整故事的能力。任何自然过程都会产生噪音,我们不能确信我们的训练数据捕捉到了所有的噪音。通常,我们应该对我们的数据做出一些初始假设,并在我们的模型中为训练数据中看不到的波动留出空间。在我们开始阅读之前,我们应该确定莎士比亚的作品本身并不能教会我们英语,这将导致我们在记忆训练数据时要小心谨慎。

总结到目前为止:偏差是指我们忽略数据的程度,方差是指我们的模型对数据的依赖程度。在任何建模中,在偏差和方差之间总会有一个权衡,当我们构建模型时,我们试图达到最佳平衡。偏差与方差适用于任何模型,从最简单到最复杂,这是数据科学家需要理解的一个重要概念!

我们看到过拟合的模型具有高方差和低偏差。反过来呢:低方差和高偏差?这就是所谓的欠拟合:一个欠拟合的模型不是太紧密地跟随训练数据,而是忽略了来自训练数据的经验教训,并且不能学习输入和输出之间的潜在关系。

让我们以我们的例子来思考这个问题。从我们之前建立英语模型的尝试中,我们决定提前对模型做一些假设。我们也转换我们的训练数据,看所有的节目来自学英语。为了避免重复我们第一次尝试的错误,我们提前做了一个假设,即只有以语言中最常见的单词开始的句子才是重要的,这些单词包括 the、be、To、of 和 a。当我们学习时,我们不去注意其他的句子,自信我们会建立一个更好的模型。

经过长时间的训练,我们再次踏上了纽约的街头。这一次我们的情况稍微好一点,但是我们的谈话还是没有结果,我们不得不承认失败。虽然我们知道一些英语,可以理解有限数量的句子,但由于我们对训练数据的偏见,我们无法学习语言的基本结构。该模型没有遭受高方差,但我们从我们最初的尝试矫枉过正和欠拟合!

Graphs of underfitting (high bias, low variance) vs overfitting (low bias, high variance) (Source)

我们能做什么?我们对数据非常关注,并且过度拟合。我们忽略了数据,而且我们吃了亏。一定有办法找到最佳平衡!幸运的是,数据科学中有一个成熟的解决方案,叫做验证。在我们的例子中,我们只使用了一个训练集和一个测试集。这意味着我们无法提前知道我们的模型在现实世界中的表现。理想情况下,我们会有一个“预测试”集来评估我们的模型,并在真正的测试之前做出改进。这种“预测试”被称为验证集,是模型开发的关键部分。

我们两次学习英语的失败让我们变得更聪明,我们现在决定使用一套验证方法。我们同时使用莎士比亚的作品和《老友记》节目,因为我们了解到更多的数据几乎总能改进一个模型。这一次的不同之处在于,在训练之后和上街之前,我们在一群朋友身上评估我们的模型,这些朋友每周聚在一起用英语讨论时事。第一周,我们几乎被踢出对话,因为我们的语言模型太差了。然而,这只是验证集,每次我们犯错误时,我们都能够调整我们的模型。最终,我们可以在与团队的对话中坚持自己的立场,并宣布我们已经为测试集做好准备。再次在现实世界中冒险,我们终于成功了!我们的模型现在非常适合交流,因为我们有一个关键的元素,一个用于模型开发和优化的验证集。

这个例子需要简化。在数据科学模型中,我们使用许多验证集,因为否则我们最终会过度适应验证集!这是通过交叉验证来解决的,其中我们将训练数据分成不同的子集,或者如果我们有大量数据,我们可以使用多个验证集。这个概念性的例子仍然涵盖了问题的所有方面。现在,当您听到过度拟合与欠拟合以及偏差与方差时,您就有了一个概念框架来理解问题以及如何解决它!

数据科学可能看起来很复杂,但它实际上是由一系列基本构件构建而成的。本文涉及的几个例子是:

  • **过度拟合:**过于依赖训练数据
  • **欠拟合:**未能学习训练数据中的关系
  • **高方差:**模型根据训练数据发生显著变化
  • 高偏差:关于模型的假设导致忽略训练数据
  • 过拟合和欠拟合导致测试集上的差泛化
  • 用于模型调整的验证集可以防止欠拟合和过拟合

数据科学和其他技术领域不应该脱离我们的日常生活。通过用真实世界的例子来解释概念,我们可以把它们放到上下文中。如果我们理解了这个框架,那么我们就可以用解决问题的技巧来填充细节。下一篇文章将提供一个使用图表和指标的例子,所以如果你想要一个更坚实的后盾,检查一下。在那之前,亲爱的读者们,再见吧!

我欢迎反馈和建设性的批评。你可以在推特上找到我。

我要感谢 Taylor Koehrsen(顺便说一句,PharmD)帮助我在写作中听起来不那么像工程师!

盖过了其他的点!过度抽签的问题。

原文:https://towardsdatascience.com/overshadowing-the-other-points-the-overplotting-issue-e6d1ebbdef20?source=collection_archive---------3-----------------------

在讨论了关于第一个帖子的数据的情节后。我在这里谈论一个关于视觉化的非常重要的问题,一个实际上可以让你的推论完全错误的问题。所以在我继续之前,这里是可视化讨论的第一部分

[## 什么情节?为什么有这个情节,为什么没有!

因此,在我上一篇文章发表一年后,我来到了这里。发生了各种各样的事情,但有一件事是不变的,那就是…

towardsdatascience.com](/what-plot-why-this-plot-and-why-not-9508a0cb35ea)

言归正传!

那么什么是过抽?在先前的图/数据上绘制数据的“现象”。迷惑?让我用更简单的话来分解一下想象一下,有一个身材矮小苗条的人站在一条线上,然后一个肥胖高大的人站在他的正前方,这基本上隐藏/遮蔽了身材矮小苗条的人,并从线上彻底根除了他的存在。

让我们来看看这个小小的“艺术”

Red guy overshadows the slim one!

如果你注意到上图中红色的人遮住了他身后的人。我没有给它上色,这样可以理解为红色的人后面有一个人。但是想象它是一个人,红色的人基本上会隐藏苗条的人。

Where’s the slim guy ?

这是一个问题不是吗?嗯,同样的问题发生在视觉化过程中。许多有抱负的数据科学家和分析师专注于绘制数据,但有时往往会忽略过度绘制,因为显示的是多数,但少数是重要的。

战战兢兢!

在前一篇文章中,我提到了抖动点的问题,这是解决过度渲染点的一个好方法。那么抖动背后的想法是什么?让我们假设您正在为一个数据集绘制点,该数据集由 X 轴销售和 Y 轴广告组成。

这是 Google Sheet 上的一个带有散点图的模拟数据。

Well , Where are the other two points ?

如果你从图中注意到只有 4 个图,但有 6 行!两排在哪里?

坦白地说,这似乎很完美。因为我们有两点具有相同的销售价值和广告价值。但是应该有六个情节,那么到底发生了什么?facebook 使用 channel 的意义在于过度渲染了 twitter 的意义。第二个谷歌广告超过了第一个谷歌广告点。(不要混淆为重复)

现在修复!抖动点。那么它是做什么的呢?抖动点基本上创建了范围,所以 twitter 和 facebook 的同一点会直观地位于区间[31.5 到 32.5]。

所以改变后的情节看起来像这样,

6 points! Awesome

所以如果你注意到有 6 个点!很棒吧?抖动就是这样工作的,我们再举一个例子。

Another example of Overplotting!

如果你注意到分数抽多了!现在,让我们利用抖动的力量!

Shape looks the same as previous plot!

如果你现在注意到了,我们可以说低于 650 范围的点的人口分布更少!但是我们实际上不能从前面的情节中推断出同样的情况。我在这里试图推断的是,我们可以看到巨大的人口差异!由于点的透明性,这也是可能的。这就把我带到了下一个环节。

透明度很重要

无论你谈论的是政府还是你的个人生活,透明度对于某些特定的事情总是很重要的,同样,对于一个数据科学家来说,用透明度来描绘这些点也是非常重要的。这有助于理解点的分布以及异常值。在我作为一名评审员的经验中,我注意到许多学生试图推断散点图而没有实际调整alpha,这实际上是点的透明度。所以你可能会想,这真的有什么不同吗?

的确如此。它确实很重要。有时我们会处理包含异常值和超出范围值的数据。我们可以通过使用不同的技术来移除它们,这将是我下一篇博客的一部分。但有时它们确实有重要意义,比如想象一下,你有相同的销售和广告数据,你有像[(1,1),(3,2),(4,4),(10,10)]这样的点,这些点的值基本上都在增加,在检查异常值时,我们实际上可能会删除该点。但这一点可能具有重要意义。这就是点的透明度进入画面的地方。

让我们看看这个例子,

Lots of point’s

所以人口看起来是中心的。但是让我们来看看同样的透明情节。

Oh , Here’s where it lies!

现在,我们可以推断出,大多数点在 x 轴上大约是 0.3 到 0.4,在 y 轴上大约是 0.05 到 0.1,这是一个故事。

关于过抽的最后一点是facet_grid。让我们把它盖住!

刻面!看到点的不同面

那么什么是刻面呢?面是事物的一个侧面或方面。如果你正在考虑辞去你的日常工作,成为一名马戏团演员,你应该首先考虑你的新生活会是什么样的。Facet 与 face 这个词有关,也可以指钻石或其他宝石的平面。(根据词汇)

当比较两个以上的变量时使用,它形成由行和列刻面变量定义的面板矩阵。当您有两个离散变量,并且变量的所有组合都存在于数据中时,这是最有用的。

参考,

(【http://ggplot2.tidyverse.org/reference/facet_grid.html】T2

那么,刻面是如何帮助减少过度绘制的呢?想象一下,你有不同类的不同点,一个类比另一个类出现的次数多。在这种情况下,出现次数较多的类的点将比出现次数较少的类的点更加可见。

让我们看看这个例子,

如果你从图中注意到,即使在设置了透明度之后,我们仍然不能确定各个类的分布,在这种情况下,小平面图就出现了。这是同样的情节,

Clear.

与上面的图相比,上面的图更清晰,我们可以更好地从这个图中推断。

因此,这些是少数真正有用的技术。

数据可视化是一门艺术,是通过视觉信息讲述故事的艺术。在我看来,每个数据科学家都不应该忽视对可视化的强调。

再见了。

生成性对抗网络概述——第一部分

原文:https://towardsdatascience.com/overview-of-gans-generative-adversarial-networks-part-i-ac78ec775e31?source=collection_archive---------5-----------------------

看看我的 YouTube 上甘斯 的视频换个视角。本文原载于

本系列文章的目的是提供 GAN 研究的概述并解释其贡献的性质。我自己是这个领域的新手,所以这肯定是不完整的,但希望它可以为其他新手提供一些快速的背景。

对于第一部分,我们将在高层次上介绍 GANs,并总结原始论文。如果您已经熟悉了基础知识,请随意跳到第二部分。假设你熟悉神经网络的基础知识。

背景

**创成式是什么意思?在高层次上,生成模型意味着您已经绘制了数据本身的概率分布。在图像的情况下,这意味着你有每一个可能的像素值组合的概率。这也意味着您可以通过从该分布中采样来生成新的数据点(即选择具有大概率的组合)。如果你在计算机视觉领域,这意味着你的模型可以从头开始创建新的图像。例如,这是一个生成的面。

以防这还没有完全被理解:这不是一个真实的人,这是一张电脑发明的脸。GAN 可以做到这一点,因为它被给予了大量的面部图像来学习,这导致了概率分布。这个图像是从分布中提取的一个点。有了创成式模型,你可以创造出以前不存在的新东西。音频、文本、图像…等等。非常非常酷的东西。

原甘

Ian Goodfellow 等人的原始论文概述了基本方法,构建了理论基础并给出了一些示例基准。

GANs 没有发明生成模型,而是提供了一种有趣而方便的学习方法。它们被称为“对抗性的”,因为问题的结构是两个实体相互竞争,而这两个实体都是机器学习模型。

最好用一个例子来解释。假设您想要构建一个面部图像生成器。你首先向一个系统输入一堆随机数,它将它们相加相乘,然后应用一些奇特的功能。最后,它输出每个像素的亮度值。这是你的生成模型*——你给它噪音,它生成数据。现在,假设你这样做 10 次,得到 10 个不同的假图像。*

接下来,你抓取 10 张真实面孔的图像。然后,你把假图像和真图像都输入到一个不同的叫做鉴别器的模型中。它的工作是为每个输入图像输出一个数字,告诉你图像是真实的概率。开始时,生成的样本只是噪声,所以您可能认为这很容易,但鉴别器也一样糟糕,因为它也没有学到任何东西。**

对于假图像上的每一个错误,鉴别者会受到惩罚,而生成者会得到奖励。基于对真实图像的正确分类,鉴别器也受到惩罚或奖励。这就是为什么它们被称为对抗性的——鉴别者的损失就是生产者的收益。久而久之,竞争导致相互提高。

最后,使用“网络”一词,因为作者使用神经网络来模拟发生器和鉴别器。这太棒了,因为它提供了一个简单的框架,使用惩罚/奖励来调整网络参数,使它们能够学习:熟悉的反向传播。

理论基础

我不会再现论文中所有血淋淋的细节,但值得一提的是,它们展示了两者:

  • 优化目标 V(D,G)导致发电机概率分布与真实概率分布精确匹配。这意味着你的假例子是完美的,无法与真实的例子区分开来。

  • 作者的梯度上升/下降训练算法收敛到这个最优值。所以你不仅知道你需要做什么,而且知道怎么做。

为了建立直觉,在上面的优化目标 V(D,G)中,D(x)项是鉴别器对以下问题的回答:输入 x 来自真实数据集的概率是多少?如果你把 G(z)代入这个函数,当你给它假数据时,它就是鉴别器的猜测。如果你分别考虑 D 和 G,你会发现 G 希望 V(D,G)小,而 D 希望这个大。这激发了算法中的梯度上升/下降技术。【E 的意思是“期望”,只是一个平均值。下标显示了你正在平均的概率分布,或者是真实的数据,或者是生成器变成假图像的噪声】。

然而,他们提供的证明并不直接适用,因为我们是通过优化神经网络的参数来间接优化这些概率分布的,但很高兴知道该基金会有理论保证。

结果

值得注意的是,很难量化假数据的质量。如何判断假脸一代的进步?除此之外,当涉及到生成逼真的图像时,它们具有最先进的性能,这引起了很多关注。图像通常看起来没有其他方法模糊。

尽管自最初的论文(将在第二部分中讨论)以来已经取得了巨大的进步,这里还是有一些例子:

问题

原始 GAN 实施的最大问题是:

  • 训练困难。有时模型永远不会学到任何东西或收敛到局部极小值。
  • “模式崩溃”,即生成器本质上一遍又一遍地输出同样的东西。

这些问题通过对架构的改进得到了解决,并将在以后的文章中提出。

结论

最终,这个框架允许我们以无监督的方式使用神经网络的正常监督学习方法。这是因为我们的标签很容易生成,因为我们知道哪些数据来自训练集,哪些数据是生成的。值得注意的是,在上面的手写数字图像中,数字标签本身并没有在训练中使用。尽管如此,生成器和鉴别器都能够学习数据的有用表示,正如生成器模拟数据的能力所证明的那样。

在第二部分中,我们将讨论如何解决许多训练问题,以及在真实图像生成方面做出巨大的改进。

Python 中文本相似性度量概述

原文:https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50?source=collection_archive---------1-----------------------

Jaccard 指数和余弦相似度——应该在哪里使用,各有利弊。

在研究搜索引擎的自然语言模型时,我经常会问这样的问题“这两个词有多相似?”、“这两句话有多像?”,“这两个文档有多相似?”。我已经在之前的帖子中谈到过自定义单词嵌入,其中单词的意思被考虑到单词的相似性。在这篇博文中,我们将更多地研究句子或文档相似性的技术。

How do we make sense of all this text around us?

有一些文本相似性度量,但我们将查看最常见的 Jaccard 相似性和余弦相似性。

Jaccard 相似度:

雅克卡相似度或并集上的交集被定义为**交集的大小除以两个集合的并集的大小。**让我们以两个句子为例:

句子 1: AI 是我们的朋友,它一直很友好
句子 2: AI 和人类一直很友好

为了使用 Jaccard 相似度计算相似度,我们将首先执行词条化以将单词减少到相同的根单词。在我们的例子中,“朋友”和“友好的”都将成为“朋友”,“有”和“有”都将成为“有”。画出我们得到的两个句子的维恩图:

Venn Diagram of the two sentences for Jaccard similarity

对于上面两个句子,我们得到 Jaccard 相似度为 5/(5+3+2) = 0.5 ,这是集合的交集的大小除以集合的总大小。
Python 中 Jaccard 相似度的代码为:

def get_jaccard_sim(str1, str2): 
    a = set(str1.split()) 
    b = set(str2.split())
    c = a.intersection(b)
    return float(len(c)) / (len(a) + len(b) - len(c))

这里要注意的一点是,由于我们使用集合,“朋友”在句子 1 中出现了两次,但这并不影响我们的计算——这将随着余弦相似度而改变。

余弦相似度:

余弦相似度通过测量两个矢量之间角度的余弦来计算相似度。计算方法如下:

Cosine Similarity calculation for two vectors A and B [source]

用余弦相似度,我们需要把句子转换成向量。一种方法是使用带有 TF (术语频率)或 TF-IDF (术语频率-逆文档频率)的单词包。TF 或 TF-IDF 的选择取决于应用,与余弦相似性的实际执行方式无关,余弦相似性只需要向量。 TF 一般对文本相似性比较好,但 TF-IDF 对搜索查询相关性比较好。

另一种方法是使用 Word2Vec 或我们自己定制的单词嵌入将单词转换成向量。在之前的帖子中,我谈到了训练我们自己的自定义单词嵌入。

具有单词包和单词嵌入 tf/ tf-idf 之间有两个主要区别:
1 .tf / tf-idf 为每个单词创建一个数字,单词嵌入通常为每个单词创建一个向量。
2。tf / tf-idf 对于分类文档整体来说是好的,但是单词嵌入对于识别上下文内容是好的。

让我们计算这两个句子的余弦相似度:

句子 1: 人工智能是我们的朋友,它一直很友好
句子 2: 人工智能和人类一直很友好

第 1 步,我们将使用单词袋来计算词频:

Term Frequency after lemmatization of the two sentences

第二步,上面显示的词频计数的主要问题是,它倾向于较长的文档或句子。解决这个问题的一个方法是用各自的量值或 L2 规范来归一化术语频率。对每个频率的平方求和并取平方根,句子 1 的 L2 范数是 3.3166,句子 2 是 2.6458。将上述频率除以这些标准,我们得到:

Normalization of term frequencies using L2 Norms

**步骤 3,**由于我们已经将两个向量归一化为长度为 1,所以可以用点积计算余弦相似度:
余弦相似度=(0.302 * 0.378)+(0.603 * 0.378)+(0.302 * 0.378)+(0.302 * 0.378)+(0.302 * 0.378)= 0.684

因此,两个句子的余弦相似度是 0.684 ,这不同于完全相同的两个句子的 Jaccard 相似度是 0.5 (上面计算的)

Python 中字符串成对余弦相似性的代码是:

from collections import Counter
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def get_cosine_sim(*strs): 
    vectors = [t for t in get_vectors(*strs)]
    return cosine_similarity(vectors)

def get_vectors(*strs):
    text = [t for t in strs]
    vectorizer = CountVectorizer(text)
    vectorizer.fit(text)
    return vectorizer.transform(text).toarray()

雅克卡相似度和余弦相似度的区别:

  1. Jaccard 相似度对于每个句子/文档只取唯一的一组单词,而余弦相似度取向量的总长度。(这些向量可以由词项频率包或 tf-idf 构成)
  2. 这意味着,如果你在句子 1 中多次重复单词“朋友”,余弦相似度会改变,但 Jaccard 相似度不会改变。对于 ex,如果单词“朋友”在第一句中重复 50 次,余弦相似性下降到 0.4,但是 Jaccard 相似性保持在 0.5。
  3. Jaccard 相似性适用于重复不重要的情况,余弦相似性适用于在分析文本相似性时重复很重要的情况。对于两个产品描述,使用 Jaccard 相似度会更好,因为一个词的重复不会降低它们的相似度。

如果你知道每一个的更多应用,请在下面的评论中提及,因为这将帮助其他人。我的关于文本相似性度量概述的博客到此结束。祝你在自己的文本探索中好运!

我发现的关于信息检索主题的最好的书之一是信息检索简介,这是一本涵盖了许多关于 NLP、信息检索和搜索概念的极好的书。

One of the best books on this topic: Intro To Information Retrieval

另外,看看我的播客吧!我有一个播客叫做“数据生活播客”。你可以在任何地方听到你的播客。在这一集中你将听到与 Paul Azunre(曼宁著作NLP 中的迁移学习的作者)关于 BERT、Elmo、单词嵌入等趋势的有趣对话。

My podcast episode with Paul Azunre on transfer learning and NLP

如果您有任何问题,请在我的 LinkedIn 个人资料中给我留言。感谢阅读!

自然语言处理中的迁移学习——语境词向量综述

原文:https://towardsdatascience.com/overview-of-transfer-learning-in-nlp-part-ii-fd2e8c72eb98?source=collection_archive---------12-----------------------

监督目标任务的迁移学习研究综述。

本系列的篇第一篇讨论了 NLP 中的迁移学习,并发表了— 半监督序列学习 *。*我们看到了使用序列自动编码器的简单预训练步骤如何改善所有四个分类任务的结果。

在这篇文章中,我想简单介绍一下列表中的下两个出版物。语境化的单词表示是这两个出版物的焦点。研究人员试图产生通常被称为嵌入的单词表示,它知道句子中的上下文含义。生成单词嵌入的过程是两者的区别所在。CoVe 使用类似 机器翻译 的监督任务,而 ELMo 使用类似 语言建模的非监督任务。

  • 在翻译中学习:语境化的词向量— CoVe
  • 深层语境化的词汇表征——埃尔莫

让我们深入研究每一份研究出版物,并指出其相似之处和不同之处。

在翻译中学习:语境化的词向量

机器翻译数据可以是 NLP 中 ImageNet 的潜在等价物。(由于使用 ImageNet 在计算机视觉中进行迁移学习取得了巨大成功)。作者试图通过采用为机器翻译训练的注意序列到序列模型来证明这一假设。机器翻译序列到序列模型在上下文中对单词进行编码,并将其解码成另一种语言。这些模型通常包含一个基于 LSTM 的编码器。他们利用这个编码器来获得他们所谓的上下文向量。

  1. Training an encoder b) Reusing it for a downstream task. Source: “Learned in Translation: Contextualized Word Vectors” by McCann et al. 2017

这个过程包括两个步骤。a)训练用于机器翻译的注意力序列到序列模型。b)将学习到的信息传递给下游任务。

英语到德语的翻译数据用于训练机器翻译模型。他们使用一个标准的两层双向 LSTM 网络作为编码器(MT-LSTM),用手套向量初始化,一个两层单向 LSTM 作为解码器。预训练编码器 MT-LSTM 的输出被视为上下文向量。

w 是输入单词的序列,而 GloVe(w) 是由 GloVe 模型产生的单词向量的序列。 CoVe(w) 是 MT-LSTM 产生的上下文向量序列。

作者检查了 CoVe 向量在一系列分类任务数据集上的优势,即情感分析、问题分类和蕴涵;还有问答。分类模型使用双注意分类网络[1],问题回答模型使用动态共注意网络[2]。这些网络的架构超出了本文的范围。

与目标任务被预定义的第一次审查不同,这里没有目标下游任务。目的是使向量适应任何下游任务。

GloVe(w)中的每个向量与其 CoVe(w)中的对应向量连接在一起

作者将这些连接的向量作为分类和问答网络的输入。这些向量在整个实验过程中保持固定(不像第一次审查,在第一次审查中,预先训练的权重在目标任务上进行微调)。

Validation results: Accuracy for classification tasks and F1 for SQuAD. Source: “Learned in Translation: Contextualized Word Vectors” by McCann et al. 2017

使用 CoVe 和手套的模型始终比仅使用手套的模型表现更好。附加字符 n-gram 嵌入可以进一步提高某些任务的性能。他们在 SST-5 和 SNLI 数据集上实现了新的最先进的性能(在当时)。从实验中得到的一个重要启示如下。机器翻译数据集越大,使用 CoVe 对下游目标任务的改进越好。这是从实验中得到的重要启示之一。因此,这种相关性可以证明他们的假设,即在 NLP 中使用机器翻译数据作为 ImageNet 的等价物。

Test performance results. Source: “Learned in Translation: Contextualized Word Vectors” by McCann et al. 2017

深层语境化的词汇表征

艾伦人工智能研究所的这项研究介绍了另一种深度上下文单词表示。目标是学习对句法、语义和多义性(一个单词存在许多可能的含义)建模的表示。研究人员在语言建模任务中训练了一个双向 LSTM 网络来导出向量。这些被称为 ELMo(来自语言模型的嵌入)。ELMo 向量是语言模型所有内部层的函数,因此比 CoVe 更深。

双向语言模型是前向语言模型和后向语言模型的组合。正向 LM 通过模拟记号 k 的概率来计算序列的概率,提供了 k-1 记号的历史。反向 LM 类似于正向 LM,以相反的顺序运行序列,预测提供未来上下文的前一个标记。biLM 的架构与[3]相当。它是在 1B 单词基准语料库[4]上训练的。

作者修正了预先训练的 biLM,并用它来计算任何下游任务的表示。在某些情况下,对下游任务数据的 biLM 进行微调可以提高性能。因此,他们对特定任务数据的一个时期的 biLM 进行微调,去除受监督的标签,并在此后的整个任务实验中固定权重(不像第一次审查,他们在任务实验中微调权重)。在大多数情况下,他们使用微调的 biLM。

*ELMo 是 biLM 中中间层表示的特定任务组合。*一个 L 层 biLM 计算一组 2L+1 表示,如下所示。

ELMo 计算 biLM 中所有层的特定任务加权组合,如下所示。

s^task 是 softmax 归一化权重,标量参数 γ 通过实验确定。最简单的情况,它可以像 CoVe 一样只选择最后一层。

预训练的单词嵌入与来自 biLM 的 ELMo 向量连接,作为输入传递给下游任务。

他们验证了 ELMo vectors 在各种 NLP 任务中的性能,并在每个任务上实现了新的艺术水平(在当时)。他们为每项任务使用不同的基线架构,并将 ELMo 向量添加到输入中。与强基础模型相比,它们实现了 6–20%的相对误差减少。结果如下所示。

Test set results on 6 benchmark NLP tasks. Source: “Deep contextualized word representations” by ME Peters et al. 2018

它们表明,与仅使用最后一层相比,所有层的表示的加权组合提高了整体性能。在有可能进行比较的任务中,ELMo 胜过 CoVe。有时,在下游任务模型的输出层包含 ELMo 可以提高性能。它还成功地消除了一个词在上下文中的歧义,实现了一词多义。请参见下面的示例。

Nearest neighbours to ‘play’ using GloVe and ELMo. Source: “Deep contextualized word representations” by ME Peters et al. 2018

实验表明,biLM 的不同层描述了一个词的不同种类的信息。第二层在词义消歧方面表现更好,而第一层在词性标注方面实现了更高的准确性。这样,包含所有的 biLM 层是至关重要的。

通过 ELMo 制图表达添加大型无监督数据集非常有利。该模型更快地收敛到更高的精度,并且需要更小的训练集。该模型提高了训练数据的利用率。它显著减少了达到性能水平所需的训练数据量。

因此,ELMo 使用来自语言模型的深层嵌入来捕获上下文中单词的语法和语义。

CoVe 和 ELMo 在计算上下文单词表示的方式上是相似的。一些相似之处—

  • 尝试计算上下文单词向量。
  • 使用大型语料库进行预训练。
  • 使用预先训练的模型以单词表示的形式传递学习到的信息。
  • 计算出的单词向量被用作下游特定任务网络的输入。
  • 预训练的权重在任务训练期间是固定的。

一些主要的区别—

  • CoVe 在预训练步骤中使用机器翻译编码器来生成单词表示,而 ELMo 使用语言模型。
  • CoVe 在有监督的机器翻译数据集上训练,而 ELMo 在无监督的语言模型数据上训练。
  • CoVe 将最后一层机器翻译 LSTM 的输出视为上下文向量,而 ELMo 是语言模型 LSTM 中所有层的加权组合。
  • CoVe 向量在任务训练期间是固定的,而来自 biLM 模型的权重在为任务训练固定之前用任务特定的数据进行微调。
  • CoVe 的研究人员为各种下游分类任务使用通用架构,而 ELMo 则针对每项任务使用强大的基线架构。

上下文词向量的第一次审查和这次审查之间的一个重要区别是,研究人员选择了一个通用数据集进行独立于任务的预训练。这可能被视为向 ImageNet 类数据集发展的下一步。

参考资料:

[1] 机器理解的双向注意流

[2] 视觉和文本问答的动态记忆网络

[3] 探索语言建模的极限

[4] 测量统计语言建模进展的十亿字基准

延伸阅读:

  1. CoVe — 研究论文,官方博客,代号
  2. ELMo — 研究论文,官方博客文章,代码

这是系列文章中的第二篇,在这篇文章中,我简要介绍了最近关于 NLP 中迁移学习的出版物。你可以在这里找到第一个帖子。非常感谢任何反馈/建议。欢迎在下面发表评论,或者在 Twitter 或 LinkedIn 上联系我。

Udacity 人工智能工程师纳米学位概述,第 2 期

原文:https://towardsdatascience.com/overview-of-udacity-artificial-intelligence-engineer-nanodegree-term-2-fc1d1ca8c7ae?source=collection_archive---------6-----------------------

在完成了人工智能纳米学位的第一个学期后,我报名参加了第二个学期,明确期望学习更多关于深度神经网络的知识,特别是关于卷积和递归神经网络的知识。此外,中途停止也不符合逻辑:-)

等待时间 1

我在截止日期前 3 周完成了第一学期,一直等到 Udacity 解锁了第二学期。我把那段时间用于学习其他东西和做小项目,但是我认为从时间的角度来看并不是很有效。如果 Udacity 在完成第一个学期后马上解锁下一个学期,我会非常感激。

我还询问了他们对相反情况的支持——是否有可能在两个学期之间休息更长时间,然后再开始另一个学期。答案是肯定的,而且没有任何惩罚。所以如果你不能连续完成两个学期,这应该不是问题。

第二学期。深度学习和应用

结构

术语 2 由两部分组成:

  • 深度学习和应用,您可以从中了解 CNN、和 GAN 的更多详细信息
  • 专注部分,你可以深入到你最感兴趣的领域。你在计算机视觉、自然语言处理和语音用户界面之间进行选择。今天你只能做一个浓度,这很遗憾,因为从我的角度来看,至少有两个浓度是绝对可行的。

卷积神经网络

应用深度学习技术的第一部分是关于卷积神经网络。这一部分的结构非常好,你会得到详细的解释,解答测验和课程中的小项目。材质肯定比用深度学习基础纳米度要高。最后一个项目是一个狗品种检测器,你可以使用迁移学习技术来达到合理的结果。

您使用 Keras 作为掌握项目的工具,因此避免了应用原始 TensorFlow 的麻烦,可以专注于理解 CNN 而不是学习工具。

这些材料对我来说刚刚好,解释以一种清晰而恰当的方式给出,提供的参考资料也非常有用。亚历克西斯·库克是一位非常好的导师,我很喜欢这部分。

读完这一节后,我有一个印象,我理解了 CNN 的背景和他们的应用。这个项目要求有点高,但我更喜欢做一些准备不足的代码,自己多做一些研究。

递归神经网络和 LSTM

第二部分是关于递归神经网络(香草和 LSTM)及其应用。结构类似于 CNN 的一个部分,有解释、参考、小测验和项目。

我必须说,从讲解质量的角度来看,这是整个课程中最好的部分,不可能做得更好了。在我开始之前,我对概念的理解有一些问题,而且 LSTM 建筑对我来说也不是 100%清楚。完成后,我会说,我抓住了这个想法很好。杰里米·瓦特非常擅长用简单的方式解释复杂的事情。

**但是!!!**一个情绪预测的最终项目,真的是一个笑话。几乎一切都准备好了,你只需要做很少的事情就可以通过。真的真的很令人失望。学习材料这么好,最终项目却这么差:-(

生成对抗网络

最后一部分是关于生成性对抗网络。它由普通解释、深度卷积神经网络和半监督学习组成。由于导师是 Ian Goodfellow,你可以期待一个高质量的解释,最后,你对 GANs 背后的概念有一个很好的理解。

不幸的是,我在深度学习基金会 Nanodegree 中学习的所有材料都已经存在。我很失望,因为我以为我会花钱买到新东西,而不是我已经学会的东西。反正我刷新了一下知识,去做了专注部分。

等待时间 2 和浓度

我比要求提前 2 周完成了所有项目,必须等到专注部分解锁。再次从时间的角度来看,这不是最佳的,我看不到任何理由,为什么下一部分不能马上解锁。

浓度选择

你可以深入解决计算机视觉、自然语言处理或语音用户界面任务。所有三个浓度都由 Udacity 导师和一个公司的人(Affectiva 的情况下是工程师或首席执行官)提供给你,帮助你准备这个部分。

计算机视觉集中是与 Affectiva 合作完成的,start 项目是关于使用他们的 T2 SDK 进行情感识别。自然语言处理(NLP)的重点是与 IBM 合作,启动项目是关于使用 IBM Watson 来解决 NLP 任务。语音用户界面的集中是与亚马逊的合作,启动项目是关于使用 Alexa 的技能来创建你自己的语音界面。所有的 start 项目大多是为了好玩,不做评估。

最初,我想选择计算机视觉,但在看了介绍后,我改变了主意,选择了语音用户界面。原因是(从我的角度来看)这三个项目中最好的一个,我在 Udacity 论坛上读到,capstone 项目要求最高。

语音用户界面集中

一开始,你用亚马逊 Alexa 开发一个语音界面。亚马逊 Alexa 能够识别语音,理解它并做出适当的反应。在该项目中,您创建了自己的技能的语音交互模型,该模型在 Amazon Alexa 上运行,并创建了 AWS Lambda 函数来处理请求。其实你学会用亚马逊生态系统来解决语音识别及其理解的任务。该项目不是关于深度学习,而是关于使用准备好的积木。反正挺有意思的,也不是很简单。

学完这一非常实用的部分后,你就可以开始研究语音识别的问题了。您将了解挑战、信号分析、数据准备、特征提取、语音学、语言模型、传统自动语音识别系统(带隐马尔可夫模型)以及语音识别中的深层神经网络。

材料的质量和提供的参考资料都很棒,这个项目要求很高,尽管我希望它不是那么准备充分。我不后悔我的选择,如果必须的话,我会再次选择。

结论

最重要的是——我觉得自己已经做好了从纯软件工程领域转向机器学习/人工智能领域的充分准备。我非常清楚,我缺乏解决现实世界问题的专业经验,所以第一步将是在软件工程和机器学习领域之间的某个地方工作,以从我们可以通过应用机器学习和深度学习技术解决的问题中获取更多信息。

Udacity 为你成为一名从业者做了很好的准备,但我不指望你有机会通过完成这门课程转变为纯粹的研究领域。我强烈建议首先完成深度学习基础——如果你是该领域的新手,它在人工智能工程师纳米学位期间会有很大帮助。另一方面,我只需要 4 个月,每周 10-15 个小时就可以完成课程,而不是广告上说的 6 个月。

我仍然不确定这项投资——两个纳米学位需要 2000 美元。但至少我去年学到了很多新东西,希望它能帮助我在目前的职业道路上,或者改变到一个新的领域。无论如何,我明白深度学习技术对于一个纯粹的软件工程师来说也是解决新问题所必须的:-)

你可以在我的 GitHub 上找到所有的项目——第一期以 aind- 开始,第二期以 aind2- 开始。

面向数据科学家的 Python(和非 Python)制图工具概述

原文:https://towardsdatascience.com/overview-python-and-non-python-mapping-tools-for-data-scientists-d27a8aaa7f8b?source=collection_archive---------11-----------------------

通常,数据需要在地理基础上理解。因此,数据科学家应该熟悉他们可以使用的主要制图工具。

我以前做过相当多的地图绘制工作,但鉴于我目前在温尼伯市担任交通资产数据科学家这一职位的中心性质,我很快就清楚我需要对地理地图绘制前景进行仔细的调查。

有一系列令人眼花缭乱的选择。鉴于我的主要编程语言是 python,我将从该生态系统中的工具开始,然后我将转到可用于地理分析的其他软件工具。

Python 中的绘图工具

地质公园

GeoPandas 是一个很棒的库,它使得用 Python 管理地理数据变得很容易。

在其核心,它本质上是 pandas (任何使用 python 的数据科学家都必须知道的库)。事实上,它实际上是建立在 pandas 之上的,具有像“GeoSeries”和“GeoDataFrame”这样的数据结构,这些数据结构用有用的地理数据处理功能扩展了等效的 pandas 数据结构。所以,你得到了熊猫的所有优点,加上地理上的优势。

GeoPandas 结合了几个现有的地理数据分析库的功能,每个库都值得熟悉。这包括 shapely 、 fiona ,以及通过 descartes 和 matplotlib 内置的地理测绘功能。

您可以像熊猫一样将空间数据读入 GeoPandas,GeoPandas 可以处理您期望的地理数据格式,如 GeoJSON 和 ESRI 形状文件。加载数据后,您可以轻松地更改投影、执行几何操作、地理聚合数据、使用空间连接合并数据以及执行地理编码(这依赖于地理编码包 geopy )。

底图

底图是基于 matplotlib 构建的地理绘图库,matplotlib 是 python 绘图库的鼻祖。与 matplotlib 类似,底图非常强大和灵活,但代价是获取所需的地图有些耗时和繁琐。

另一个值得注意的问题是,底图最近在 2016 年接受了新的管理,并将被 Cartopy 取代(如下所述)。尽管底图将维持到 2020 年,但 Matplotlib 网站指出,现在所有的开发工作都集中在 Cartopy 上,用户应该转向 Cartopy。因此,如果您计划使用底图,请考虑使用…..

漫画式

Cartopy 提供了几何变换能力以及映射能力。与底图类似,Cartopy 向 matplotlib 公开了一个接口,用于在数据上创建地图。matplotlib 为您提供了强大的制图能力和灵活性,但缺点是相似的:与其他选项相比,创建一个漂亮的地图相对来说更复杂,需要更多的代码和修改才能得到您想要的东西。

geoplotlib

Geoplotlib 是 Python 的另一个地理制图选项,似乎是一个高度灵活和强大的工具,允许静态地图创建、动画可视化和交互式地图。我从未使用过这个库,它看起来相对较新,但它可能是一个值得关注的未来。

gmplot

gmplot 允许你使用“类似 matplotlib 的界面”在谷歌地图上轻松地绘制多边形、线和点。这使您可以快速轻松地绘制数据,并利用谷歌地图固有的交互性。可用的绘图包括带填充的多边形、落点、散点、网格线和热图。对于快速简单的交互式地图来说,这似乎是一个很好的选择。

Mapnik

Mapnik 是一个用 C++编写的工具包(带有 Python 绑定),用于制作严肃的地图应用程序。它的主要目标是在网络上开发这些地图应用。它似乎是一个重型工具,为你今天在网上看到的许多地图提供动力,包括 OpenStreetMap 和 MapBox 。

T5【叶】T6

follow 让你可以利用流行的 leaflet.js 框架来创建交互式地图,而无需编写任何 JavaScript 代码。这是一个很棒的库,我在最近几个月经常使用(我用 leav 为我的温尼伯树数据博客文章生成了所有的可视化)。

Folium 允许您绘制点、线和多边形,生成 choropleth 地图和热图,创建地图层(用户可以自行启用或禁用),并为您的地理数据生成弹出工具提示(额外的好处是:这些工具提示支持 html,因此您可以真正地自定义它们,使它们看起来更好)。地图上使用的标记和线条也可以进行大量的定制。

总的来说,leav 在特性、可定制性和编程简易性之间取得了很好的平衡。

阴谋地

Plotly 是一家提供大型在线数据分析和可视化工具套件的公司。Plotly 的重点是提供一些框架,使得在 web 上呈现可视化更加容易。您用 Python(或 R)编写代码,与 plotly 库对话,可视化效果使用极其强大的 D3.js 库呈现。为了体验什么是可能的,请查看他们的网站,该网站展示了一系列制图的可能性。

除了图表和绘图工具之外,他们的网站上还有一大堆感兴趣的相关产品,值得一看。我特别感兴趣的一个是 Dash ,它允许您仅使用 Python(不需要 JavaScript 或 HTML)创建响应性数据驱动的 web 应用程序(主要为仪表板设计)。这是我一定会去看看的,可能会在不久的将来发表一篇“深入数据科学”的帖子。

散景

Bokeh 是一个专门研究浏览器中呈现的交互式可视化的库。这包括的地理数据和地图。与 Dash 类似,也有可能使用 Bokeh 来创建交互式 web 应用程序,这些应用程序实时更新数据并响应用户输入(它通过“ Bokeh 服务器”来实现这一点)。

其他制图工具

很明显,在 python 生态系统之外还有大量的绘图工具。这里有一些你可能想看看的简要总结。请记住,这个列表中遗漏了大量的工具。这些只是我比较熟悉的一些工具。

开普勒. gl

开普勒是一个基于网络的应用程序,允许您探索地理数据。这是优步在 2018 年 5 月下旬发布的全新工具。你可以在网站上使用该软件——开普勒是一个客户端应用程序,没有服务器后端,所以所有数据甚至都驻留在你的本地机器/浏览器上。然而,它不仅仅是在开普勒网站上使用;您可以安装应用程序并在本地主机或服务器上运行它,您也可以将它嵌入到您现有的 web 应用程序中。

该程序有一些很棒的功能,拥有你在交互式地图应用程序中期望的大多数基本功能,加上一些非常棒的附加功能,如分割地图和回放。网站上展示的例子非常漂亮,软件也很容易使用(非程序员也可以使用)。

本用户指南提供了更多关于开普勒的信息,它能做什么,以及如何做。我非常期待为一些即将到来的项目检查它。

地图框

Mapbox 提供了一套与制图相关的工具,旨在帮助开发人员创建使用地图和空间分析的应用程序。它提供了一系列服务,从为您的网站创建精美的地图到帮助您构建地理处理应用程序。

这个概述提供了一个可行的好主意。Mapbox 提供了一组底图图层,允许您自定义地图、添加自己的数据以及构建 web 和移动应用程序。它还提供了使用地理编码、方向、空间分析和其他功能等工具来扩展 web 应用程序功能的选项。虽然 Mapbox 不是免费服务,但他们似乎有慷慨的免费 API 调用限制(见他们的定价这里)。

重型 GIS 应用

此处未包括但对从事制图的人来说非常重要的是成熟的 GIS 应用程序,如 ArcGIS 和 QGIS 。这些都是非常强大的工具,值得地理数据分析师了解。注意 ArcGIS 相当贵;然而,这是一个非常值得了解的行业标准。QGIS 也相当普遍地被使用,并且具有免费和开源的优势。

这篇文章中有什么明显的疏忽吗?请在下面的评论中告诉我或者给我发一封邮件。

本帖原载于我的个人网站。

要访问我共享的 Anki deck 和 Roam Research notes 知识库,以及关于间隔重复和提高学习效率的技巧和想法的定期更新, 加入“下载 Mark 的大脑”。

更多资源

Python 数据可视化库
必要的 Python 地理空间库
所以您想要使用 Python 制作地图
使用 Python 可视化地理数据
使用 Python 中的开源工具可视化地理空间数据 (YouTube)以及附带的GitHub Repo of notebook

底图

底图教程
用 Python 制作底图

Mapnik

map Nik Wiki
map Nik——也许是迄今为止最好的 Python 地图平台
控制你的地图

叶子

Python 教程用叶子制作多层传单网络地图 (YouTube)
用 Python 制作互动地图(三部分)
用叶子制作互动犯罪地图

散景

Python:用 Python 库 Bokeh 绘制数据
用 Bokeh 绘制交互式地图

拥有自己的知识

原文:https://towardsdatascience.com/own-your-own-learning-aa86bd9a397f?source=collection_archive---------3-----------------------

是的,我想念你们所有人,真诚地为长期的中断道歉。在我的下一篇文章中,你会更好地理解。哇,我很受启发来写我对学习的想法,特别是在我如何开始我的人工智能专家之旅时出现的许多问题。我们可以开始了吗?

a quote by Adam Lupu — VP of learning, Andela

2012 年

我清楚地记得,当我在期末考试中被分配到最后一年的项目主管时,我发现她拥有人工智能的博士学位,我决心选择一个与她的领域相关的项目主题,因为我想在期末考试中获得 A。

在对一个人工智能课题做了大量研究后,我决定建立一个牙科专家系统。有点遗憾的是,因为我没有编程知识,所以我不能像那时一样自己构建这个项目。我也觉得编程是为聪明人准备的,我不属于那一类。

我把我的项目题目给了我的主管,她很喜欢,并同意我立即开始。虽然听起来很悲伤,但我不得不将项目的代码部分外包给其他人,因为我当时不知道如何编码。然而,我确实为我的文书工作做了很多关于编码平台的研究,还不得不去拜访了几次牙医,他在项目的领域知识/工程部分帮助了我。

我喜欢我的项目的各种研究部分,我确保我的文书工作是正确的,这最终使我在这里发表了我的第一篇论文:http://research . ijias . org/volume 8/number 2/ijias 14-451270 . pdf

顺便说一下,我得到了我一直想要的成绩 A 【T7:)

arranging the ailment based on symptoms selected

2013/2014 年

我在一所著名的私立大学担任 IT/系统技术员,我认为我当时的收入很不错,因为我可以负担得起三餐,一个住所和几分奢侈生活的乐趣,但在某一点上,我决定对我的职业生涯进行深思熟虑,我的老板当时给了我一些数据库管理书籍来阅读。我开始在数据库中获得一些基础,并自信地认为我会杀了它。有一天,他告诉我“即使你认为你擅长数据库,你也应该选择编程,因为很多程序员实际上知道你做的这些事情”。我对不得不学习编程感到很难过,因为我已经对数据库了如指掌。

与此同时,我正在看一部小说系列相关人物,我爱上了一台机器能够在恐怖主义行动发生之前预测它们的方式。这很神奇,同时也很吸引人,因为它让我更加热爱人工智能的世界。那时我知道人工智能将成为我职业目标的一部分。从 W3 schools 开始,我开始自学 PHP,并通过电子邮件将我的代码片段发送给我以前的一个同学,他已经在这个领域工作了。

my favorite character in the movie “root”

2015 年

我从以前的工作场所辞职,发现自己在安德拉。这是我真正开始学习的地方。随着时间的流逝,我知道我必须深思熟虑才能开始我的人工智能专家生涯。对我来说有趣的是,我开始编程是因为我对人工智能的兴趣,我通过快速聊天发现,人们通常在进入编程后爱上人工智能,但我的情况正好相反。

2016 年

我决定开始我的学习,从在发展中心广场大喊开始。我能够召集对人工智能/机器学习/数据科学感兴趣的人,我们从一个松散的小组开始。请注意,在这个时候,我不知道我应该或不应该学习什么,但重要的是组成这个小组的人的多样性——新手(像我一样),初学者,中级和专家。

在这个伟大的社区中,资源每天都被共享,我开始充分利用它们。我不介意示意整个小组就我不清楚的概念提问。哦,我想起了朴素贝叶斯算法是如何在我理解它之前给我出难题的。请注意,很难将自学与我的日常工作结合起来,但我仍然有意每天至少花 3 个小时进行机器学习。

the struggle was real

我很幸运,我的工作时间是从中午 12 点到晚上 8 点,所以我很好地利用了中午之前的几个小时来加速机器学习,尽可能避免分心。我坚持练习,经过 3 个月的自学,我参加了一个全球人工智能锦标赛,甚至对自己在排行榜上的位置感到震惊。我从未察觉

你可以在这里赶上我关于锦标赛的代码教程。我也开始参加 Kaggle 比赛,并很快向该领域的专家寻求建议。

2017

我决定发表另一篇关于人工智能相关主题的论文,这是我目前正在做的,我还决定开始为新手组织研讨会。在人工智能领域,我仍处于初级水平,但有一点我很有信心,那就是无论你认为自己对某个概念/领域的了解有多少,总会有一群观众。还有一句名言说“确定你完全理解某事的最好方法是当你能教别人并且他们也能理解的时候”。我也把它看作是确定我认为我知道的事情的一种方式。

作为一名 Udacity 机器学习纳米学位的学生,我目前正在完成我的最后一个项目。虽然对我来说这是一个忙碌的旅程,但我期待着写一个关于我所做的代码教程。哦,我还买了一些书来帮助我学习,相信我,它们不便宜,尤其是美元对奈拉的汇率。

don’t borrow…BUY

结论

许多人问我安德拉目前是否有人工智能的发展道路,诚实的回答是目前没有。然而,我们正在数据科学的轨道上工作,我相信人工智能很快就会出现。我确实告诉这类人*“他们拥有并应该努力磨练自己的学识”*。我喜欢下面这句话

学会掌控自己的学习,不要完全依赖别人来负责你如何学习,要深思熟虑你想学什么,并愿意接受每个行动带来的牺牲。导师的地位怎么强调都不为过,我必须承认,我的导师为我铺平了道路,这是因为我也渴望学习。

特别感谢 Farouq Oyebiyi、Allen Akinkunle、Yinka Makanjuola、Deolu Adeleye 和 Dotun Owoade。谢谢你总是回答我愚蠢的问题,同时让我的 AI 之旅压力更小:)

仅供参考——这是一篇我觉得相当实用有趣的相关文章——https://www . LinkedIn . com/pulse/learning-developers-stories-blessing-orazulume

面向购房者和少数族裔的 P2P 贷款

原文:https://towardsdatascience.com/p2p-lending-for-home-flippers-and-minorities-ed9aba6da4cb?source=collection_archive---------12-----------------------

从熊猫看美国的 P2P 借贷格局

近年来,个人对个人(P2P)贷款的兴起极大地促进了以前得不到充分服务的人群获得融资的民主化。这类借款人有什么特点,P2P 贷款又有哪些不同类型?

Lending Club 发布特定时期发放贷款的季度数据。我将使用 2018 年 Q1 的最新贷款数据来查看最近一批借款人。可以理解的是,由于数据的新近性,还款信息仍然不完整。将来查看包含更多还款信息的旧数据集或 Lending Club 提供的拒绝贷款数据会很有意思。

看一下 dataframe 形状,可以发现 2018 年 Q1 有 107,868 笔贷款。有 145 列,有些列完全是空的。

一些空列(如 id 和 member_id)是可以理解的,因为它们是个人身份信息。许多变量也与详细的贷款信息有关。出于这种分析的目的,我们关注几个人口统计变量和基本贷款信息。关于变量的更多信息可在这里获得。

缺失数据和数据类型

看看变量的数据类型,它们目前都是非空对象。对于应该表示规模或顺序感的变量,数据应该相应地改变。

单个条目显示,空数据由空字符串对象、非类型对象或字符串“n/a”表示。通过用 NaN 替换它们并运行 missingno,我们看到‘EMP _ length’下有大量缺失的字段。

删除丢失数据的记录会产生 98,424 行,而不是对初始数据的大量稀释。

根据单个变量的性质,它们必须转换为以下数据类型,以便在任何后续分析中使用:

整数数据类型:

  • loan_amnt(申请的贷款金额)
  • funded_amnt(资助的贷款金额)
  • term(贷款的支付次数)
  • open_acc(开放的信用额度数)
  • total_acc(已知信用额度总数)
  • pub_rec(贬损公共记录数)

Float 数据类型:

  • int_rate(贷款利率)
  • dti(债务收入比)

有序类别数据类型:
-等级(贷款等级 A-G)

  • emp_length(任职年限)
  • annual_inc(年收入)

整型和浮点型转换相对标准,通过简单的正则表达式去掉了复杂的符号和空格。分类变量可能有点棘手。对于这个用例,我们需要有序的分类变量。

例如,贷款等级为 G 代表质量最低、风险最高的贷款。

使用“cat.codes”将每个条目转换为相应的升序整数。通过同样的过程,我们也可以将就业年限转换成序数变量,因为整个' > 1 年'和' 10 年以上'不能传达必要的信息。

由于年收入中有太多独特的价值,根据它们所属的价值带将它们分成不同的类别会更有用。在这种情况下,我使用 pd.qcut 为每个值范围分配一个 bin。

“qcut”会将物品分开,使每个箱子中的物品数量相等。请注意,还有另一个名为 pd.cut 的方法。cut 根据值将项目分配到箱中,而不考虑每个箱中的项目数量。

虽然我最初倾向于使用 cut 来获得收入范围的更好视角,但事实证明有多个异常值严重扭曲了数据。从每个箱子中的物品数量可以看出,使用“cut”提供了收入数据的平衡视图。

贷款类型或借款人的状态等变量保持不变,我们可以仔细查看每个变量的唯一值。

初步分析

那么我们第一眼看到的是什么呢?

令人难以置信的扭曲的债务收入比

Loan amount and interest rate distributions

贷款金额和利率的偏度和峰度偏离正态分布,但非常低。较低的偏斜度值表示两条尾巴的重量没有显著差异。这些值不会向某一特定方向倾斜。较低的峰度值表示两个尾部的组合权重较低,表示存在少量异常值。

有趣的是,贷款金额的峰值出现在 5000 美元的区间内。鉴于这种对整数的偏好,分步定价策略可能吗?

此外,在收益率低于 10%时,利率会出现一个明显的峰值。鉴于高收益公司债券徘徊在 7.5%左右,P2P 贷款必须以更高的利率来证明其风险状况,这似乎是有道理的。

债务与收入比率的分布明显偏斜,尾部非常重。考察个别异常案例,了解贷款是如何发放给这些高风险个人的,将会很有意思。

修罗和脚蹼

从贷款类型来看,有一些特别突出的与房屋相关的贷款类型。考虑到有借款人房屋所有权状况的信息,我创建了一个新的房屋特定贷款数据框架来寻找有趣的趋势。

乍看之下,绝大多数有抵押贷款的借款人都在申请房屋装修贷款,几乎相当于房主和租房者的 5X。他们也是为了买房而贷款最多的群体。

抵押贷款的房主真的喜欢重新粉刷房子和安装吊灯吗?一种解释可能是,这些住房改善不是为了自己,而是为了在转手之前增加房产价值。这些固定和翻转操作并不新鲜,在 Attom 有关于这种现象的深入报道。一个公开的跨州房屋转手活动数据集将有助于更深入地了解这种 P2P 贷款的借款人构成。

另一个有趣的发现是针对租房者的“搬迁”贷款。虽然这种贷款的数量对其他群体来说几乎可以忽略不计,但房屋租赁者由于其居住安排的短期性质,对这种贷款有更多的需求。

债务整合中的高额贷款集中

Quick tip: the use of jitter=True prevents overlapping points and provides more information around individual data points

在债务合并、信用卡再融资和房屋装修类别中,似乎集中了高于中值的高价值贷款。鉴于债务合并通常是指个人与高水平的无担保贷款或太多的信贷设施,高贷款额是有道理的。

从色调的分布来看,大额贷款的期限明显集中在 60 个月。这将可靠地符合借款人更愿意分期偿还大笔贷款的假设。

加州爱 P2P 贷款

贷款数量和 P2P 贷款总额的图表显示,加州对这种形式的信贷有着贪婪的胃口。它获得的 P2P 贷款比排名第二的德克萨斯州多 40%。这种巨大的差距有几种解释。

有报告显示,较富裕的州通常倾向于承担更多的债务。加州的债务收入比是各州中最高的,这在我们的数据中也很明显。

此外,加州是美国技术最娴熟的州之一,可能会更多地接触 P2P 贷款平台等替代融资解决方案。事实上,P2P 贷款总额最高的州包括两个现有的顶级金融科技生态系统(加利福尼亚州,纽约州)和两个增长最快的金融科技中心(德克萨斯州,佛罗里达州)。

是什么决定了跨州的 P2P 贷款使用情况?

鉴于各州 P2P 贷款数量的概况,为什么不更进一步呢?

《赫芬顿邮报》上有一篇关于美国房地产危机的很棒的文章,有一个有趣的观察,在租金和房价上涨的情况下,由于种族财富差距,非裔美国人倾向于非传统贷款。由于信用评分和收入水平较低等原因,他们更有可能被这些贷款来源拒绝。

几个问题突然出现在我的脑海里:
1。他们会转向其他替代融资来源吗?比如说,P2P 贷款来获得与房屋相关的贷款?
2。其他州特有的因素会影响住房贷款的数量吗?

搜集时间
我去了www.census.gov搜集了各州层面的数据,从人口统计到经济数据。

在 Google Chrome 的网络选项卡中,我发现人口普查表上呈现的大部分数据来自另一个网站,链接类似于此:https://www . census . gov/quick facts/fact/table/DC,US/PST045217?ajax=true#qf-headnote-c

此外,这些页面中的每一个都包含了到 csv 文件的另一个链接,这些数据看起来像这样:https://www.census.gov/quickfacts/fact/csv/dc,US/PST045217

不同州的链接之间的唯一区别似乎是链接中的州代码。假设我的数据集的‘addr _ state’列中有所有唯一的州代码,我编写了一个循环来为每个州创建到每个 csv 的不同链接。一旦所有的数据都被提取出来,一个数据框架就会被创建出来,其中只包含与种族、住房和收入相关的变量。

所有带有 NaN 的列都被删除,并根据索引中的州名添加了一个附加列' addr_state'。这是为了能够根据州代码合并数据帧。

我还从 FRED 那里获得了 2016-2018 年各州房价指数的另一个数据集。利用这个数据集,我在一个新的数据框架中创建了一个新列,用于显示 2016 年至 2018 年房价指数的百分比变化。

鉴于这只是对与住房相关的贷款的观察,我们基于相关 P2P 贷款的贷款计数创建了一个新的数据框架。

通过将数据框架合并在一起,从三个不同的来源创建了所需变量的主数据框架。房屋相关贷款,房屋购买、改善和移动 P2P 贷款的集合,是模型的结果变量。

不同变量之间的相关性显示,住房单元和建筑许可与住房相关贷款的结果变量高度相关。

我特别想使用“总贷款”作为控制变量,因为它与房屋相关贷款数量的结果变量和住房单元的独立变量相关。

然而,总贷款和住房相关贷款之间存在内生变量偏差。有更多的住房相关贷款,因为有更多的贷款,还是有更多的贷款,因为有更多的住房相关贷款?除非对这两个变量之间的关系有更清楚的了解,否则将贷款总额作为控制变量是不合适的。

First regression with all variables, second regression with statistically significant variables from first regression

乍一看,从 0.985 的 R 平方值来看,住房相关贷款的大部分可变性可以用现有变量来解释。

尽管住房单元和建筑许可证的系数值低得令人难以置信,但只有住房单元的数量、中位租金和建筑许可证的数量具有统计意义。住房单元和建筑许可证数字都表明住房供应和更多的贷款将被用于抵押或改善住房。较高的租金价格可能表明需要 P2P 贷款来支付这种生活成本,尽管这种贷款可以归类在其他标题下,如“其他”或“债务合并”。

仅针对统计显著变量的第二次回归运行返回了类似的 0.971 的高 R 平方,但将住房单元作为唯一具有无穷小系数值的统计显著变量。

那么…这一切都是徒劳的?

不完全是。尽管数据和提出的问题不匹配,但这里有一些改进的要点和想法:

贷款用途的细分——当前与住房相关的贷款类型主要面向房主和购房者。《赫芬顿邮报》文章中提到的贷款是为接近贫困线的非裔美国人和少数族裔提供的。此类贷款可能反映了用于支付租金和其他直接生活费用的发薪日贷款,可以归类为“债务合并”和“其他”类。对贷款用途进行更细致的分析,可以更准确地反映非裔美国人使用替代融资的情况。

低 P2P 市场份额——这里看到的住房单元和许可证的微小系数可以归因于替代融资来源所占的抵押贷款市场的微小部分。P2P 贷款平台不太可能是住房供应的显著受益者。

缺乏可靠的种族代理人——各州的非裔美国人人口并不是该种族群体贷款的最佳代理人。从 P2P 或抵押贷款记录中获取更多关于个人贷款种族的个人贷款信息将会改进该模型。

包含更多特征变量——本文选择了贷款变量和状态变量的一个选定子集,尽管实际上,对变量组的仔细重新设计可能会产生其他有用的变量来改进模型。这种包含大量新变量的做法不可避免地导致了维数灾难,但那是另一天的争论。

缺乏替代融资意识的指标——意识指数或跨种族和州的替代贷款来源知识的其他替代物会极大地改善该模型,因为它会令人难以置信地描述贷款人如何考虑和使用这种新的融资资源。例如,拥有更多 STEM 毕业生或技术孵化器的州更有可能了解 P2P 贷款的可用性。

合并数据帧的不同方式——还有其他一些重塑和合并来自其他来源的数据的替代方式,这些方式会导致不同的模型。例如,一个热编码可以用来指示不同的状态。另一个例子是从逐个贷款的基础上构建模型,而不是像现在这样逐个州地构建模型。

时间序列分析——所运行的回归模型只是时间上的一个快照。如果能够收集过去 5 年每个财务季度的数据点,结果将更具代表性。

对现有的抵押贷款数据集进行逆向工程以进行竞赛——如果有外部抵押贷款数据集具有与贷款俱乐部数据集相似的特征变量,则可能创建一个预测模型来标记贷款俱乐部的贷款。虽然肯定不如实际标签准确,但考虑到数据隐私,这可能是下一个最佳选择。

感谢阅读,您可以在这里找到相关代码和其他试用型号!

带薪休假和科学的本质

原文:https://towardsdatascience.com/paid-time-off-and-the-nature-of-science-f4757696519c?source=collection_archive---------15-----------------------

灵活的工作安排不仅仅是一种好的人力资源做法。它们将我们的大脑暴露在混乱的真实世界模式中,这有助于我们在更人工的数据环境中找到模式。

The view from this week’s office.

我在北卡罗莱纳州海岸的海滨别墅里写下这篇文章。我刚刚花了一周时间和我的妻子和孩子在沙滩上玩耍,在内陆水道划独木舟,学习救助海龟,打迷你高尔夫。

这也是我两个月来最有成效的一周。

过去的两个月很好——我做了很多事情——但是我一直在思考一个特殊的分析问题。我把问题分为两类:神秘和困惑。有了一个拼图,你就知道你在试图构建什么,你只需要弄清楚所有的碎片是如何组合在一起的。对于一个谜,你并不真的知道你在寻找什么,所以你在弄明白它的时候会慢很多。这个星期,我的神秘变成了一个谜题,我已经把很多碎片拼在一起了。我是在周二到周四电话会议之间远程工作的时候这样做的,在周五早上我的孩子看《海绵宝宝》的时候也做了一点。

这不是那种“如果你能减压,你能清楚地看到事物”的交易。我的工作和提供这份工作的公司都允许大量减压。在这一周的时间里,通过做一些我平时不会做的事情,我的大脑需要处理一些平时不会思考的事情。其中一些东西被证明是有用的。

我一直强烈支持进步的人力资源实践,比如无限带薪休假和在家工作的政策。我支持这些政策,主要是基于这样一个原则:我被雇佣并获得报酬是为了交付成果,而不是每周在某个特定的房间里坐一段时间。如果我能实现我承诺的结果,我应该能够按照我觉得需要的方式安排我的生活(当然,前提是我这样做不会妨碍我的同事实现他们自己的结果,等等)。)当雇主愿意对我表现出这种信任时,这意味着很多,而且这通常会提高我的生活质量,因为我不必担心我可以离开办公室的天数。

并不是说我相信无限的 PTO 或远程工作毫无保留地好。我认为这两种方式都是最好的,当它们代表着一种不同于常规工作的变化时。当远程工作成为的例行公事时,它真的会让人精疲力竭,尤其是如果团队中的大多数人没有远程工作,因此没有养成适应远程工作人员的习惯或基础设施。我认为,当灵活的工作安排仍然是员工的例外而不是规则时,这表明了雇主的信任,对员工来说是非常健康和授权的。

所有上述推理对我来说仍然很重要,但在过去几天里,我开始将我的假期和在家工作的时间视为我成为一名优秀数据科学家的能力的非常重要的一部分:远离我的正常例程实际上有助于我更好地执行这些例程。我当然不是第一个这样看待事情的人。例如,看看数学家亨利·庞加莱如何描述他发现了被称为的自同构形式:

我离开了当时居住的卡昂,去参加一个由矿业学院组织的地质会议。旅途中发生的事情使我忘记了我的数学工作。当我们到达 Coutances 时,我们休息了一会儿去开车,当我把脚放在台阶上时,我有了一个想法,尽管我以前的想法似乎没有让我为此做好准备,那就是我使用的变换…与非欧几里得几何的那些是相同的。我没有核实,也没有时间去核实,因为我在休息时一坐下就又开始了谈话,但我立刻感到绝对肯定。当我回到卡昂时,我在闲暇时验证了结果,以满足我的良心。

然后我开始研究算术问题,没有任何明显的结果,没有怀疑它们可能与我以前的研究有一点联系。厌恶我想要的成功,我去了海边几天,想完全不同的事情。有一天,当我走在悬崖上时,这个想法出现在我面前,同样具有简洁、突然和立即确定的特点…

我本周发现的东西当然没有庞加莱的发现那么令人印象深刻,但它们对我很重要,而且我相信,对雇佣我的企业和雇佣我的客户也很重要。我没有在海边散步时想着我的工作——事实上,工作是我最想不到的事情,直到它突然不在了。

这个想法中的某些东西对我来说似乎很熟悉,这促使我寻找一篇我已经很久没有读过的文章:人类学家 Clifford Geertz 的文章。Geertz 在 70 年代因倡导一种新的、有趣的、有用的研究人类文化的方法而声名鹊起,今天人类学家对他的看法很矛盾,因为他的方法并没有像他早期的支持者宣传的那样新颖、有趣或有用。抛开批评者不谈,我很欣赏 Geertz 关于理解复杂和不透明系统的困难的观点(这或多或少是数据科学家的工作)。我从下面的摘录中省略了“文化”、“人类学”和类似的术语,因为我认为它适用于任何分析任务。

连贯性不能作为描述有效性的主要测试。系统必须有最低程度的一致性,否则我们不会称之为系统;通过观察,他们通常有更多。但是没有什么比偏执狂的妄想或骗子的故事更有条理了。我们的解释的力量不能像现在经常做的那样,依赖于它们的紧密程度,或者它们被争论的保证程度。我认为,没有什么比对形式秩序的无可挑剔的描述更能使分析失去信誉,因为没有人能完全相信它的真实存在。

如果解释是在构建对发生的事情的解读,那么将它与发生的事情——与特定的人在此时此地所说的话、他们所做的事、对他们所做的事——以及整个世界的庞大事务分离开来,就是将它与它的应用分离开来,使它变得空虚。对任何事物——一首诗、一个人、一段历史、一种仪式、一个机构、一个社会——的好的解释会把我们带进它所解释的事物的核心。当它没有做到这一点,而是把我们引向别的地方——引向对它自身的优雅、作者的聪明或欧几里得秩序之美的赞美——它可能有其内在的魅力;但这是手头任务所要求的以外的东西。

我以前说过(例如:这里的这里的和这里的这里的)数据科学家的工作和人种学家的工作非常相似,数据科学和人类学真的是齐头并进的。正如 Geertz 所说,一个民族志学者可以很容易地构建一个社会的模型,这个模型是优雅的,优美连贯的,完全脱离现实的。虽然数据科学家经常(尽管肯定不总是)有验证集,允许他们检查自己的工作,但总是有一种诱惑,那就是选择一个数学上优雅的解决方案,仅仅是因为其优雅的*。*

在过去的两个月里,我试图找到多种符合事实的优雅解决方案,但它们就是不行。本周,我想出了一个远非优雅的解决方案。它是如此不雅,我不得不做一些额外的工作,只是为了确保它将规模。但这很有效。起初我认为这有点难看,尤其是与我以前尝试过的方法相比。但我突然意识到,我试图用这种方法模拟的现实本身非常丑陋——它是来自多个来源的信号的大杂烩,每个信号都经过多个中介的过滤,并以不同的保真度进行报告。

在过去的几个月里,我花了太多的时间研究现实的模型,而不是真实的现实,以至于我的思想陷入了认为生活比实际更简单——更干净——的窠臼。这限制了我处理棘手问题的能力。这不仅仅是计算机工作者或数学工作者的问题。我认为这是科学家普遍面临的问题,因为模型是科学家的惯用伎俩。当模型成为我们的现实,我们停止做好科学。我们需要时间远离我们的模特。

对于无限 PTO 来说,这似乎是一个非常不切实际的论点,但对于普通的数据从业者来说——我认为我很普通——带薪休假和远程工作安排是延长暴露在混乱的现实世界中的唯一方式。数据从业者从灵活的工作安排中获得了不成比例的好处,因为我们试图理解的东西是真实的,但模型甚至代表真实东西的数据都必然是人工的。我们需要看到现实生活中的新模式,以保持我们在计算机上寻找新模式的优势。

使用加密货币进行配对交易

原文:https://towardsdatascience.com/pairs-trading-with-cryptocurrencies-e79b4a00b015?source=collection_archive---------1-----------------------

本文简要介绍了 pairs 交易,包括概念、基础数学、策略算法、交易机器人开发、回溯测试和转发测试评估,以及未来问题讨论。作为一个实际的例子,机器人将进行加密货币交易。

概念

Pairs trading 是一种市场中立的交易策略,在一对高度联动的资产中使用多头头寸和空头头寸。

该策略的利润来源于两种工具之间的价格变化差异,而不是两者的变动方向。所以,如果多头涨得比空头多,或者空头跌得比多头多,就可以实现盈利(完美的情况下,多头涨,空头跌,但那不是盈利的要求)。配对交易者有可能在各种市场条件下获利,包括市场上涨、下跌或横盘——以及波动性低或高的时期。

来源: Investopedia

协整与相关性

在定量交易中,我们通常使用非平稳的时间序列。通常,当两个资产一起移动时,人们认为两个资产的相关,但是这个术语在这个上下文中是不正确的。皮尔逊相关性仅适用于静态变量。正如我们所看到的,这个公式使用了期望值和标准偏差,但是这些值在非平稳过程中是随时间变化的。

Correlation formula

对于这些过程,我们可以定义为协整。协整是指几个非平稳时间序列的平稳线性组合。你可以在这个视频中找到简单的解释

这张图片显示了两个过程(X 和 Y),以及它们的传播。这是一个没有协整的相关性的例子。

Correlation with no cointegration

这个例子反之亦然(无相关性的协整)

Cointegration with no correlation

如何使用 Python 构建这些流程你可以在这里找到。

为了进入下一章,我们应该知道如何检测协整。

检验协整的三种主要方法是:

恩格尔-格兰杰两步法

如果 xtyt 是非平稳且协整的,那么它们的线性组合一定是平稳的。换句话说:

*yt-βXT = ut,*其中 ut 为静态。

如果我们知道 ut ,我们就可以用类似迪基-富勒测试、菲利普-佩伦测试的东西来测试它的平稳性,然后就完成了。但是因为我们不知道 ut ,我们必须先估计这个,一般用普通最小二乘法,然后在估计的 ut 序列上运行我们的平稳性测试。

2.约翰森测试

Johansen 检验是一种允许多个协整关系的协整检验,与 Engle-Granger 方法不同,但该检验受渐近性质的影响,即大样本。如果样本量太小,那么结果将是不可靠的,应该使用自回归分布滞后(ARDL)。

3.菲利普斯-欧利亚斯协整检验

Peter C. B. Phillips 和 Sam Ouliaris (1990)表明,应用于估计协整残差的基于残差的单位根检验在非协整的零假设下不具有通常的 Dickey-Fuller 分布。由于零假设下的虚假回归现象,这些检验的分布具有渐近分布,这取决于(1)确定性趋势项的数量和(2)被检验协整的变量的数量。这些分布被称为菲利普斯-欧利阿里斯分布,临界值已被制成表格。在有限样本中,使用这些渐近临界值的一个更好的替代方法是从模拟中产生临界值。

来源:维基百科

让我们为这个问题编写一些分析代码。首先从 Bitfinex 下载几个加密货币的数据(2018–01–01 到 2018–05–31)。下一步是策划加密货币的表演。最后,对所有资产对进行协整检验。

加密货币的表现是

Performance of cryptocurrencies (from 2018–01–01 to 2018–05–31)

零假设是不存在协整关系,另一个假设是存在协整关系。如果 p 值很小,低于一个临界大小,那么我们可以拒绝没有协整关系的假设。

Cointegration test result

我们可以得出结论,其中一些对是协整的,可以选择下一步的研究。

交易策略

结对交易中没有单一的方法来计算差价并进行交易。一些方法使用线性回归和残差作为分布。我们将使用下一个算法。

算法策略包含以下步骤:

  1. 通过上述方法之一(如 Engle-Granger)识别协整对。应该定期执行此步骤,以获得将在接下来的步骤中使用的一对(或几对)。
  2. 通过长度 N 获取资产的价格历史。计算资产对中每项资产(如 AB )的收益

3.计算退货之间的差额

4.计算 z 得分,z 得分是数据点平均值的标准偏差数。

这张图片展示了 z 分数

Standard normal distribution

5.选中输入职位规则:

如果该条件为真,则打开 A (50%资本)的多头头寸和 B (50%资本)的空头头寸

如果该条件为真,则打开 A 的空头头寸和 B 的多头头寸

6.检查平仓规则:

如果这一条件成立,平仓所有头寸

让我们用 Catalyst 框架来编码这个算法。我在我的上一篇文章中提供了 Catalyst 的快速介绍。你在那里找到的初始化handle_dataanalyzerun_algorithm 函数的信息。

一个标准的方法是使用训练\测试分割,但是我们也有一个协整测试周期。这些时间段不应交叉。因此,我们有

协整检验期— 5 个月(从 2018 年 1 月 1 日到 2018 年 5 月 31 日)

回测期— 4 个月(从 2018 年 6 月 1 日至 2018 年 9 月 30 日)

转发期— 2 个月(从 2018 年 10 月 1 日至 2018 年 11 月 30 日)

首先要验证算法。让我们使用 XMR/USD 和 NEO/USD 对运行这个脚本,禁用佣金成本并关闭滑点模型。

XMR/USD and NEO/USD with no commission

正如我们所见,算法返回曲线相当不错。这看起来就像它应该如何工作(非常高的分拣率和回报是 4 个月 164%)。控制台输出性能:

总回报:1.645993234216582

索提诺系数:30 . 96620118

最大压降:-0.05125165292172551

回溯测试

让我们建立佣金成本和滑点模型

XMR/USD and NEO/USD with commission and slippage

业绩差,权益(红线)平滑递减。通常情况下,当一个策略产生了许多平均利润值较低的信号时,就会发生这种情况。控制台输出性能:

总回报:-0.9160713719222552

Sortino coef:-11.6499238

最大压降:-0.914893278444377

我们应该尽量减少交易信号的数量,而且交易的潜在利润应该很高。我建议增加 min_spread 的值,设为 0.035,就意味着 spread 要比往返交易成本高几倍。另外, z_signal_in 值应该更高,例如对于 99.99%的间隔。时间范围可以更改为更大的值(例如每小时),但分析周期将保持不变(3 天)。

XMR/USD and NEO/USD with updated params

这组参数实现了我们的目标。信号数量较低(黄色线代表使用的杠杆),算法在 4 个月内表现良好:

总回报:0.0946758967277288

Sortino coef:8.343300492

最大压降:-0.0281546269574607

促进

这一步更真实地展示了所开发的算法。让我们对样本外数据(过去 2 个月)运行策略。

XMR/USD and NEO/USD forwarding test

性能仍然很好,指标接近回溯测试值:

总回报:0.040754467244888515

Sortino coef:8.20447014148

最大压降:-0.010029904921808908

我们可以通过排序比值来比较结果。

该战略的权益图是

Equity of the algorithm

进一步的问题讨论

  1. 对不同的资产进行大量实验,以创建可靠的资产组合,并在它们之间调整资金管理。它将允许获得更重要的统计数据,因为事务的数量将会更大。
  2. 尝试交叉货币对以降低交易成本(例如,用 XMR/NEO 代替 XMR/USD 和 NEO/USD)。
  3. 为投资组合中的每一对调整以下步骤协整检验—回测—前推,以在生产模式中获得更可靠的性能。用于调整的参数:历史长度、p 值阈值和算法参数。
  4. 创建当共同运动属性被破坏时停止算法的规则。如果没有预见到这一点,结果可能是一场灾难。

结论

  1. 描述了方法,并创建了算法交易策略。
  2. 该算法在回溯测试和转发测试中都取得了积极的结果。展示了不同的性能指标和图表。
  3. 就如何改进这项研究提出了建议。
  4. 源代码可以在 github 上得到。

最诚挚的问候,

谢尔盖

使用 Biopython 的成对序列比对

原文:https://towardsdatascience.com/pairwise-sequence-alignment-using-biopython-d1a9d0ba861f?source=collection_archive---------0-----------------------

使用 Python 生物信息学工具检查两个序列有多相似

两个序列有多相似?

想要回答这个问题,你需要对序列比对有一个基本的了解。正如我在的上一篇文章、序列比对中描述的,序列比对是一种排列 DNA、RNA 或蛋白质序列以识别相似区域的方法。被鉴定的相似性可能是序列之间的功能、结构或进化关系的结果。

在这篇文章中,我将带你完成两两序列比对。此外,我们将使用一个名为 Biopython 的很酷的 python 工具尝试一些编码。

Figure 1: Pairwise Sequence Alignment using Biopython

什么是成对序列比对?

成对序列比对是序列比对技术的一种形式,这里我们只比较 两个序列 。这个过程包括找到两个序列之间的最佳比对,根据它们的相似性(它们有多相似)或距离(它们有多不同)进行评分,然后评估这个评分的显著性。

Figure 2: Image Scource: http://compbio.pbworks.com/w/page/16252912/Pairwise%20Sequence%20Alignment

评分

在继续进行成对序列比对技术之前,让我们看一下评分过程。

序列比对的基础在于评分过程,在该过程中,根据两个序列彼此相似(或不同)的程度给它们打分。成对序列比对算法需要一个评分矩阵来记录分配的分数。评分矩阵为匹配分配一个正分,为不匹配分配一个罚分。

分配分数时考虑三个基本方面。他们是,

  1. 匹配值 —分配给匹配字符的值
  2. 不匹配值 —分配给不匹配字符的值
  3. 空位罚分 —分配给空位的值

下面给出的图 3 显示了如何识别两个序列之间的匹配、错配和缺口。

Figure 3: Match, mismatch and gap

两个序列的第一个字符是匹配的**,因为两个都是字母 A 。第一个序列的第二个字符是 C ,第二个序列的第二个字符是 T 。所以,是不匹配。**

在第二个序列的末尾引入一个空格以匹配 g。这个空格被称为间隙**。间隙是给定比对中单个序列中最大的连续空格。**

一般来说,缺口被表示为缺口罚函数**,该函数将缺口的成本作为其长度的函数(可能是非线性的)来测量。**

成对序列比对的类型

考虑给你两个序列如下。

***X = x1 … xi … xn******Y = y1 … yj … ym***
  1. 全局比对:该方法在 2 个序列的整个长度上寻找最佳比对。序列 XY 的最大相似度是多少?
  2. 局部比对:该方法在两个序列中寻找最相似的子序列。 X 的一个子序列和 Y 的一个子序列的最大相似度是多少?

全球对齐

在该方法中,我们考虑 2 个序列的整个长度,并尝试将它们匹配以获得最佳比对。将gap**(空格)插入到 XY 中,直到两个序列的长度相同,这样两个序列就匹配了。**

例如,考虑序列 X = ACGCTGAT 和 Y = CAGCTAT 。一种可能的全局对准是,

**AC-GCTGAT
 | ||  ||
-CAGC-TAT**

并不是说我们已经包含了 间隙 以便字符串对齐。

如果我们设置一个评分方案为匹配分数= 1错配分数= 0空位罚分= 0 ,那么上述比对的总分数将为:

Score = nMatch x 1 + nMismatch x 0 + nGap x 0
      = 6x1 + 1x0 + 2x0
      = 6

Needleman-Wunsch 算法

使用动态编程获得全局比对的算法之一是 Needleman-Wunsch 算法 。该算法由 NeedlemanWunsch 于 1970 年发表,用于两个蛋白质序列的比对,这是动态编程首次应用于生物序列分析。Needleman-Wunsch 算法寻找两个序列之间的最佳得分全局比对。

局部对齐

在这种方法中,我们考虑 2 个序列中每一个的子序列,并试图匹配它们以获得最佳比对。

例如,将两个序列视为 X=GGT CTGAT G 和 Y=AAA CGAT C。粗体字符是要考虑的子序列。最佳的局部对准是,

**CTGAT** (in X)
**| |||
C-GAT** (in Y)

这里,引入一个 缺口 以匹配 2 个子序列。

如果我们设置一个评分方案为匹配分数= 1错配分数= 0空位罚分= 0 ,那么上述比对的总分数为:

Score = nMatch x 1 + nMismatch x 0 + nGap x 0
      = 4x1 + 0x0 + 1x0
      = 4

史密斯-沃特曼算法

使用动态编程在两个给定序列内获得局部比对的算法之一是 Smith-Waterman 算法SmithWaterman 在 1981 年发表了一个动态规划的应用来寻找最优的局部排列。该算法类似于 Needleman-Wunsch 算法,但与评分过程略有不同。

在本文中,我们不会深入讨论上述两种算法的细节。

练习时间到了

既然我们有了关于成对序列比对的基本概念和两个有用的算法,现在是时候尝试一些编码了。

biopython——用于计算分子生物学的 python 工具

Figure 4: Biopython (http://biopython.org)

在这篇文章中,我将向你介绍一套工具,我们将使用它来处理以后的生物数据。 Biopython 是一套用 python 编写的工具,可用于各种生物计算、模拟和分析。

你可以从 这里 下载并安装 Biopython。确保您已经安装了 Python 2.7、3.4、3.5 或 3.6 。你可以参考 Biopython 教程和食谱 来进一步了解我们能做什么以及如何使用这些工具。

****bio . pairwise 2-P使用动态编程进行空中序列比对

让我们试用一些编码来模拟使用 Biopython 的成对序列比对。我将成对使用 模块,该模块可以在 Bio 包中找到。该模块提供了比对函数来获得两个序列之间的全局和局部比对。

对齐函数的名称遵循惯例;

**<alignment type>XX** 

其中 <对准类型>全局局部并且 XX 是一个 2 字符代码,表示它所采用的参数。第一个字符表示匹配(和不匹配)的参数,第二个字符表示空位罚分的参数。

****匹配参数为:

CODE  DESCRIPTION
x     No parameters. Identical characters have score of 1, else 0.
m     A match score is the score of identical chars, else mismatch
      score.
d     A dictionary returns the score of any pair of characters.
c     A callback function returns scores.

****间隙惩罚参数为:

CODE  DESCRIPTION
x     No gap penalties.
s     Same open and extend gap penalties for both sequences.
d     The sequences have different open and extend gap penalties.
c     A callback function returns the gap penalties.

让我们使用 Bio.pairwise2 模块尝试几个成对序列比对的例子。

示例 1

考虑下面给出的两个序列。我们想找出所有可能的具有最大相似性得分的全局比对**。**

**X = ACGGGT
Y = ACG**

下面给出了获得给定两个序列的全局比对的 python 代码。请注意我们是如何使用 Bio.pairwise2 模块及其功能的。

Code Snippet 1: Pairwise sequence alignment (global)

通过运行代码,我们可以得到所有可能的全局比对,如图 5 所示。

Figure 5: Pairwise sequence alignment (global) output

在这个例子中,注意匹配的字符被给予 1 分。没有因不匹配或差距而扣分。

示例 2

考虑前面例子中给出的两个序列。我们想要找出所有可能的具有最大相似性得分的局部比对**。**

下面给出了获得给定两个序列的局部比对的 python 代码。

Code Snippet 2: Pairwise sequence alignment (local)

通过运行代码,我们可以得到所有可能的局部比对,如图 6 所示。

Figure 6: Pairwise sequence alignment (local) output

在这个例子中,注意匹配的字符被给予 1 分。没有因不匹配或差距而扣分。

示例 3

在本例中,我们将更改评分方案,并为匹配、不匹配和差距赋值。我们将考虑和以前一样的两个序列。我们想找出所有可能的具有最大相似性得分的全局比对**。**

匹配字符得 2 分,每不匹配一个字符扣 1 分。开一个缺口扣 0.5 分,延伸一个缺口扣 0.1 分。

Code Snippet 3: Pairwise sequence alignment (global with custom scoring)

通过运行代码,我们可以得到所有可能的全局比对,如图 7 所示。

Figure 7: Pairwise sequence alignment (global with custom scoring) output

希望你喜欢读这篇文章,并学到一些有用和有趣的东西。

因为我对这个领域还很陌生,所以我想听听你的建议。😇

感谢阅读…😃

熊猫数据框架:轻量级介绍

原文:https://towardsdatascience.com/pandas-dataframe-a-lightweight-intro-680e3a212b96?source=collection_archive---------1-----------------------

Introduction to Pandas → The Pandas DataFrame by @DakshHub

Pandas 是一个开源的、BSD 许可的库,为 Python 编程语言提供了高性能、易于使用的数据结构和数据分析工具。

Pandas 提供的数据结构有两种不同的类型

  1. 熊猫数据帧&
  2. 熊猫系列

我们将在本帖中查看 熊猫数据帧

学习熊猫(包括官方文档)的总趋势是先进入熊猫系列,再进入熊猫数据框。然而,在使用熊猫很长时间后,我确信我们应该从熊猫数据框架开始。一旦我们熟悉了熊猫数据框架,熊猫系列背后的概念和基本原理就会变得清晰易懂。

什么是数据帧?

这是技术定义的样子

Pandas DataFrame 是一个带有潜在不同类型列的二维标签数据结构。

你应该这样理解它

Pandas DataFrame 只不过是一个通过 Python 编程语言在内存中表示的 excel 表格

所以, 熊猫数据框 类似于 excel 表格,看起来是这样的

A Panda DataFrame ( An In-Memory representation of Excel Sheet)

就像 excel 一样,Pandas data frame提供了各种功能来分析、更改和从给定的数据集中提取有价值的信息。

如何创建熊猫数据框架?

在现实世界中,通过从持久存储中加载数据集,包括但不限于 excel、csv 和 MySQL 数据库,将创建一个Panda data frame

然而,为了帮助你更好地理解它,我将在这里使用 Python 数据结构(字典和列表)。

如上面的 excel 表格所示,如果我们将列名视为 【键】 ,并将该列下的项目列表视为 【值】 ,我们可以轻松地使用 python 字典来表示相同的

my_dict = { 
     'name' : ["a", "b", "c", "d", "e","f", "g"],
     'age' : [20,27, 35, 55, 18, 21, 35],
     'designation': ["VP", "CEO", "CFO", "VP", "VP", "CEO", "MD"]
}

我们可以从这个字典中创建一个 熊猫数据帧 作为

import Pandas as pddf = pd.DataFrame(my_dict)

生成的数据框架应该类似于我们在上面的 excel 表格中看到的

Result of → df = pd.DataFrame(my_dict)

有可能这些列没有按照字典中定义的顺序排列,因为 python 将字典实现为 hash,并且不保证保留顺序。

行索引→

由于我们没有向数据帧提供任何行索引值,它会自动生成一个序列(0…6)作为行索引。

为了提供我们自己的行索引,我们需要将DataFrame(...)函数中的index参数作为

df = pd.DataFrame(my_dict, index=[1,2,3,4,5,6,7])

索引不需要一直是数字,我们也可以通过字符串作为索引。例如

df = pd.DataFrame(
     my_dict, 
     index=["First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh"]
)

正如您可能已经猜到的那样,索引本质上是*,这意味着我们也可以使用 NumPy 数组 作为索引。*

*np_arr = np.array([10,20,30,40,50,60,70])
df = pd.DataFrame(my_dict, index=np_arr)*

熊猫数据框的列

与 python 列表或字典不同,就像NumPy*,data frame的一列将始终是同一类型。*

我们可以使用类似字典的语法或者使用 DataFrame .添加列名来检查列的数据类型

*df['age'].dtype    # Dict Like Syntaxdf.age.dtype       # DataFrame.ColumnName
df.name.dtype      # DataFrame.ColumnName*

如果我们想检查数据框内所有列的数据类型,我们将使用 数据框dtypes函数作为**

**df.dtypes** 

它将所有列的类型显示为

Displaying Types of all Columns

查看数据帧的数据

在任何时间点, 熊猫数据帧 将包含数百(如果不是数千)行数据。我们只能在任何时间点选择性地查看它们。

为了有选择地查看行,我们可以使用 head(…)和 tail(…) 函数,这些函数默认给出前五行或后五行(如果没有提供输入),否则从顶部或底部显示具体的行数

下面是它显示内容的方式

**df.head()   # Displays 1st Five Rows**

df.head()

**df.tail()    # Displays last Five Rows**

df.tail()

**df.head(2)   # Displays 1st two Rows**

df.head(2)

**df.tail(7)     # Displays last 7 Rows**

df.tail(7)

这都是关于数据的,但是,如果我们想看到行索引和列名呢? 熊猫数据框 提供了查看它们的特定功能

**df.index     # For Row Indexesdf.columns   # For Columns**

熊猫数据框架列助手函数

Pandas data frame提供了各种列助手函数,对于从列中提取有价值的信息非常有用。其中一些是

unique →通过删除重复项来提供列中的唯一元素。例如

**df.designation.unique()**

mean →提供该列中所有项目的平均值。例如

**df.age.mean()**

使用列作为行索引

大多数情况下,给定的数据集已经包含一个行索引。在那些情况下,我们不需要Pandas data frame来生成单独的行索引。

这不仅是一个冗余信息,而且占用了不必要的内存。

Pandas DataFrame 允许将任何现有列或一组列设置为行索引。下面是如何使用前面创建的 熊猫data frame的列(使用字典my_dict

**df = pd.DataFrame(my_dict)df.set_index("name")**

df.set_index(“name”)

**df.set_index("age")**

df.set_index(“age”)

我们可以通过传递一个列表将多个列设置为索引

**df.set_index(["name","age"])**

df.set_index([“name”,”age”])

在数据框架中加载选择的列

任何数据分析活动都需要数据清理,我们很可能会得出结论,从需要分析的数据集中排除一些列。

这不仅节省了内存,而且有助于分析感兴趣的数据

我们将使用相同的字典来加载Pandas DataFrame**,但是这次我们将指定将成为 data frame 一部分的列**

**df = pd.DataFrame(my_dict, columns=["name", "age"])**

df = pd.DataFrame(my_dict, columns=[“name”, “age”])

从数据帧中删除行和列

熊猫 DataFrame 提供了多种删除行和列的方式。选择一个而不是另一个并没有功能上的损失。你可以使用任何你觉得舒服的语法。

使用字典语法→要删除一列,我们就用 ***del*** 作为

**del df['name']**

使用 ***Drop*** 功能→允许我们删除列以及行

我们是删除行还是列由drop函数中的第二个参数决定。

函数drop(...)中的第二个参数“1”表示删除“列”,而“0”表示删除“行”

**# Delete Column "age"df.drop('age',1)# Delete the Row with Index "3"df.drop(3,0)**

我们也可以通过在drop(...)函数中传递列表来删除多行和多列

**# Delete Columns "name" & "age"df.drop(['name','age'],1)# Delete Rows with index "2","3", & "4"df.drop([2,3,4],0)**

注意:行索引不是索引号,而是包含该值的行

从列表中创建熊猫数据帧

如果我们得到一个没有任何列的数据集呢?

嗯,Pandas DataFrame并不介意这一点,它通过为我们隐式添加行索引和列标题来生成 data frame。

例如,如果我们从下面的列表中创建一个数据帧

**my_list = [[1,2,3,4],
           [5,6,7,8],
           [9,10,11,12],
           [13,14,15,16],
           [17,18,19,20]]df = pd.DataFrame(my_list)**

它看起来会像这样

df = pd.DataFrame(my_list)

如果我们不想让Pandas data frame自动生成行索引和列名,我们可以将这些在DataFrame函数中作为

**df = pd.DataFrame(
my_list, 
index = ["1->", "2->", "3->", "4->", "5->"], 
columns = ["A", "B", "C", "D"]
)**

这是它看起来的样子

df with Row and Column Provided

应该注意的是,我们也可以从 NumPy 数组创建 Pandas 数据帧,如下所示

**np_arr = np.array([[1,2,3,4],
                   [5,6,7,8],
                   [9,10,11,12],
                   [13,15,16,16],
                   [17,18,19,20]])df = pd.DataFrame(np_arr)**

数据帧上的数学运算

就像 Excel 表格一样, 熊猫数据框 在完整的 数据框 上轻松进行数学运算。

在一个单独的列中完成这些操作是可能的,这就是熊猫系列出现的原因。

我们将在下一篇文章中研究熊猫系列,让我们先看看数学运算是如何在完整的 数据帧 上工作的

乘法→我们可以将标量值为的数据帧与另一个数据帧 相乘

**df * df**

df * df

**df * 10**

df * 10 ( A Scalar Value)

加法/减法→与上面的乘法类似,一个数据帧可以与一个标量值或另一个数据帧 相加/相减

**df + 100**

df + 100

位运算→可以进行位运算(AND( &)、OR (|))等来完成数据帧

**df & 0**

df & 0

熊猫系列是什么?

除了熊猫数据框架的一列之外,什么也没有的系列。

每当我们要处理一个以上的系列时,我们就有数据框架。

二者择一地

熊猫数据框是熊猫系列的集合

我会在下一篇文章中谈论 熊猫系列

感谢阅读…!!!!

达克什

熊猫数据帧:使用 CSV 文件

原文:https://towardsdatascience.com/pandas-dataframe-playing-with-csv-files-944225d19ff?source=collection_archive---------0-----------------------

Pandas DataFrame: Playing with CSV files

CSV 代表逗号分隔值,这是一种在持久性存储中表示和存储面向表格、列的数据的流行方式

Pandas DataFrames 通常用于表示内存中类似 Excel 的数据。在大多数情况下,我们很可能会从持久存储中加载数据,持久存储可以是数据库或 CSV 文件。

在这篇文章中,我们将会看到如何使用 Pandas DataFrame 加载、存储和播放 CSV 文件

概述熊猫数据框架

我已经写了一篇名为熊猫数据框架:轻量级介绍的详细文章。如果你对熊猫数据框架不满意,我强烈建议你在继续这篇文章之前先看看这篇文章。

简而言之,Pandas DataFrame 只不过是 excel 之类的数据在内存中的表示。举个例子,

Pandas DataFrame → Excel like Data in Memory

该数据也可以使用 Python 字典表示为

my_dict = { 'name' : ["a", "b", "c", "d", "e","f", "g"],
                   'age' : [20,27, 35, 55, 18, 21, 35],
                   'designation': ["VP", "CEO", "CFO", "VP", "VP", "CEO", "MD"]}

我们知道我们可以通过调用DataFrame(...)函数从 python 字典中创建一个熊猫数据帧

df = pd.DataFrame(my_dict)

生成的数据帧应如下所示

Pandas DataFrame → From Python Dictionary

将数据帧保存到 CSV 文件中

一旦我们有了数据帧,我们可以将它保存在本地磁盘上的 CSV 文件中。让我们首先使用数据帧中当前存在的数据创建我们自己的 CSV 文件,我们可以使用 Pandas 数据帧的 APIto_csv(...)以 CSV 格式存储该数据帧的数据

df.to_csv('csv_example')

现在我们有了 CSV 文件,它包含了上面数据帧中的数据。

正如我们可以将数据帧保存在 CSV 文件中一样,我们也可以从 CSV 文件中加载数据帧。

让我们继续加载 CSV 文件,并从中创建一个新的数据帧

df_csv = pd.read_csv('csv_example')

生成的数据帧(df_csv)应如下所示

df_csv

你注意到不寻常的事情了吗?

嗯,我们可以看到这个索引生成了两次,第一次是从 CSV 文件加载的,而第二次,也就是Unnamed是熊猫在加载 CSV 文件时自动生成的。

这个问题可以通过确保 CSV 文件的写入不写索引来避免,因为DataFrame无论如何都会生成。我们可以通过在to_csv(...)函数中指定index = False参数来做同样的事情

df.to_csv('csv_example', index=False)

现在,如果我们把文件读成

df_csv = pd.read_csv('csv_example')

生成的数据帧应如下所示

df_csv

现在,您可以看到输出类似于我们之前从 python 字典创建数据帧时的输出,这是我们所期望的。

玩弄列标题

正如我们已经看到的,第一行总是被认为是列标题,但是,通过在read_csv(...)函数中指定一个名为header=<integer>的参数,可以有多行作为列标题。

默认情况下,该值被指定为“0”,这意味着第一行将被视为标题。

df_csv = pd.read_csv('csv_example', header = 0)

结果输出将与上面相同。然而,它提供了很多机会来安排头球。例如,我们也可以将多行作为标题

df_csv = pd.read_csv('csv_example', header=[0,1,2])

生成的数据帧应如下所示

df_csv → with 3 rows as Header

正如我们在这里看到的,列 0、1 和 2 现在是标题。

也没有必要将第一行序列作为标题,我们可以跳过前几行,然后从特定的行开始查看表格

例如

df_csv = pd.read_csv('csv_example', header=5)

这里,产生的数据帧应该看起来像

df_csv → After skipping 5 rows

唯一的缺点是我们必须放弃标题行号之前的可用数据。它不能是结果数据帧的一部分。

即使在标题为多行的情况下,实际数据帧数据也只能从最后一个标题行之后的行开始。

df_csv = pd.read_csv('csv_example', header=[1,2,5])

产生的数据帧将从行“6”开始,看起来应该像这样

df_csv → Multiple Row Headers

自定义列名

尽管我们从带有列标题的 CSV 文件中读取数据,但我们仍然可以拥有自己的列名。我们可以通过在read_csv(...)中添加一个名为names的参数来达到同样的效果

df_csv = pd.read_csv('csv_example', names=['a', 'b', 'c'])

生成的数据帧应如下所示

df_csv → with our own column names

然而,即使我们成功地添加了自己的标题,顶行仍然显示一个不需要的标题。

这可以通过使用read_csv(…)中的header参数跳过描述标题的行来避免。在这种特殊情况下,我们知道第一行,即第 0 行是标题,所以我们可以跳过它

df_csv = pd.read_csv('csv_example', names=['a', 'b', 'c'], header=1)

df_csv → With Customised Header

现在,我们得到了我们想要的带有定制头的输出。

另一种方法是在将 CSV 文件写成

df.to_csv('csv_example', index=False, header = False)

阅读时,我们可以不跳过标题

df_csv = pd.read_csv('csv_example', names=['AGE', 'DESIGNATION', 'NAME'])

df_csv → With customised header

CSV 到(任何)分隔值

虽然逗号分隔的值是众所周知的,但是read_csv(...)函数可以识别逗号以外的分隔符。

唯一的区别是,我们需要在函数中显式传递分隔符,而默认情况下使用逗号

让我们首先使用不同的分隔符创建一个 CSV 文件,即“:”(冒号)

df.to_csv('csv_example', index=False, sep=":")

这将创建一个文件,其中冒号(':')而不是逗号(',')将用作分隔符。我们可以这样阅读文件

df_csv = pd.read_csv('csv_example', sep=":")

生成的数据帧应如下所示

df_csv → with “:” as separator

设置行索引

默认情况下,Pandas DataFrame 会自动生成一个行索引,我们可以通过将任何列设置为索引来进行更改

df_csv.set_index('age')

下面是结果数据帧的样子

df_csv → Using ‘age’ as row index

以这种方式设置索引是一种后期操作。也就是说,我们已经有了一个带有预定义索引的数据框架,但是我们后来又改变了它。

我们可以在加载 CSV 文件时通过传递一个名为index_col的参数来做到这一点,该参数将自动分配由index_col描述的列作为行索引。

df_csv = pd.read_csv('csv_example', sep=":", index_col=1)

同样的输出应该看起来像

df_csv → with index_col = 1

我们甚至可以提供一个以上的index_col作为索引来对待

df_csv = pd.read_csv('csv_example', sep=":", index_col=[0,2])

输出将会是这样的

df_csv → index_col = [0,2]

如果不需要所有的行…不要加载它们

大多数情况下,CSV 文件都相当大,加载时可能会遇到内存限制。有一个选项,只从它加载选定的几行。

您可以通过在read_csv(...)中传递一个参数nrows来指定要加载的行数

# Load Only 3 Rows
df_csv = pd.read_csv('csv_example', sep=":", nrows=3)

这是它看起来的样子

df_csv → Loading only 3 Rows

跳过 CSV 文件中的空行

默认情况下,read_csv(...)函数跳过空行,即在加载文件和构建数据帧时会忽略空行。

但是,如果您想要加载空行来进行一些显式的计算,比如对空记录进行计数,您应该将跳过的空行标记为False

df_csv = pd.read_csv('csv_example', skip_blank_lines=False, sep=":")

这就是这篇文章的全部内容

感谢阅读…!!!

达克什

熊猫系列:轻量级介绍

原文:https://towardsdatascience.com/pandas-series-a-lightweight-intro-b7963a0d62a2?source=collection_archive---------2-----------------------

Pandas Series: A Lightweight Intro

Pandas 是一个开源的、BSD 许可的库,为 Python 编程语言提供了高性能、易于使用的数据结构和数据分析工具。

Pandas 提供的数据结构有两种不同的类型

  1. 熊猫数据帧&
  2. 熊猫系列

本帖我们就来看看 熊猫系列

注:为了更好地理解熊猫系列之前,我强烈推荐阅读我之前在 上的帖子

什么是系列?

从技术上来说,Pandas Series 是一个一维标签数组,能够保存任何数据类型。

通俗地说,熊猫系列不过是 excel 表中的一列。如下图所示,带有名称、年龄和职务的列代表一个系列

Pandas Series

因此,根据 Pandas 数据结构,一个系列代表内存中的一个单独的列,它或者是独立的,或者属于 Pandas 数据帧

注意:一个系列可以有自己独立的存在,而不是数据帧的一部分。

如何打造系列?

Pandas 系列可以从 Python 列表或 NumPy 数组中创建。必须记住,与 Python 列表不同,一个系列将总是包含相同类型的数据。这使得 NumPy 数组成为创建熊猫系列的更好的候选对象

下面是我们如何使用以上两者来创建一个熊猫系列

series_list = pd.Series([1,2,3,4,5,6])
series_np = pd.Series(np.array([10,20,30,40,50,60]))

这是它们的样子

Result of → series_list = pd.Series([1,2,3,4,5,6])

Result of → series_np = pd.Series(np.array([10,20,30,40,50,60]))

正如在创建熊猫数据帧时一样,该系列也默认生成行索引号,这是一个从‘0’开始的递增数字序列

正如您可能已经猜到的,在创建一个系列时,有可能拥有我们自己的行索引值。我们只需要传递索引参数,这些参数接受相同类型的列表或 NumPy 数组。

以下示例使用了 NumPy 生成的序列

series_index = pd.Series(
      np.array([10,20,30,40,50,60]), 
      index=np.arange(0,12,2) 
)

Result of → series_index = pd.Series(np.array([10,20,30,40,50,60]), index=np.arange(0,12,2) )

下面的示例使用字符串作为行索引

series_index = pd.Series(
        np.array([10,20,30,40,50,60]), 
        index=['a', 'b', 'c', 'd', 'e', 'f' ] 
)

Result of → series_index = pd.Series(np.array([10,20,30,40,50,60]), index=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ ] )

我们可以使用序列的行索引作为

series_index.index

它返回一个 NumPy 数组,而不管我们在创建序列时是传递了一个列表还是一个 NumPy 数组

从 python 字典创建熊猫系列

正如我们在创建 Pandas DataFrame 的过程中所看到的,从 python 字典创建 DataFrame 非常容易,因为映射到列名,而对应于列值列表。

那么在创作熊猫系列的时候是如何贴图的呢?

如果我们从 python 字典创建一个序列,那么成为行索引,而成为该行索引的值。

作为一个例子,让我们看看一个非常简单的只有一个键值对的字典会发生什么

t_dict = {'a' : 1, 'b': 2, 'c':3}# Creating a Series out of above dict
series_dict = pd.Series(t_dict)

这是输出的样子

Result of → Code block Above

如果字典中的值包含一个项目列表,情况不会改变。列表项仍然是单行索引的一部分,如下例所示

t_dict = {'a' : [1,2,3], 'b': [4,5], 'c':6, 'd': "Hello World"}# Creating a Series out of above dict
series_dict = pd.Series(t_dict)

Result of → series_dict = pd.Series(t_dict)

从熊猫数据帧中获取序列

虽然 Pandas Series 本身对于进行数据分析非常有用,并提供了许多有用的帮助函数,但是大多数时候,分析需求将迫使我们一起使用 DataFrame 和 Series。

让我们先创建一个熊猫数据帧,就像我们在这里创建的一样

my_dict = { 
'name' : ["a", "b", "c", "d", "e"],
'age' : [10,20, 30, 40, 50],
'designation': ["CEO", "VP", "SVP", "AM", "DEV"]
}df = pd.DataFrame( my_dict, 
index = [
"First -> ",
"Second -> ", 
"Third -> ", 
"Fourth -> ", 
"Fifth -> "])

下面是结果数据帧的样子

Result of → DataFrame creation from dictionary

DataFrame 提供了两种访问列的方法,即使用字典语法df['column_name']df.column_name。每次我们使用这些表示得到一个列,我们得到一个熊猫系列。

在上面的例子中,我们可以通过访问列来获得序列(即一个单独的列)

series_name = df.name
series_age = df.age
series_designation = df.designation

series_name

Series_age

series_designation

通过遍历数据帧的列来获取序列

如果我们不知道列的名称会怎么样?

Pandas DataFrame 是可迭代的,我们可以遍历各个列来获得序列

series_col = []
for col_name in df.columns:
    series_col.append(df[col_name])

使用系列创建数据框(独立或组合)

熊猫数据帧只不过是一个系列(1+)的集合。我们可以通过使用单个系列或组合多个系列来生成数据帧

例如,让我们通过组合series_nameseries_age生成一个数据帧

df_from_series = pd.DataFrame([series_name, series_age])

令您惊讶的是,生成的数据帧看起来应该是

df_from_series

是的,序列的行索引成为列,而列成为行索引值。你可以认为这类似于矩阵的转置。即使我们提供单个系列来创建数据帧,也是如此

df_from_series_single = pd.DataFrame([series_name])

df_from_series_single

然而,当我们从序列中移除列表/数组符号时,这种情况不会发生。例如

df_from_series_single = pd.DataFrame(series_name)

将导致序列列名和行索引的保留

df_from_series_single

注意:不幸的是,这仅限于一个系列,因为 DataFrame API 不接受一个以上的系列参数

用 Python 字典创建数据帧的行为

当我们将 python 字典作为数组传递来创建 DataFrame 时,也会观察到同样的行为。让我们看看我们之前创建的t_dict = {'a': 1, ‘b’: 2, ‘c’:3}

ds = pd.DataFrame([t_dict])

得到的数据帧应该看起来像这样

ds

其中键被表示为列,否则如果我们创建了一个序列,它们将被表示为行索引

我们甚至可以组合多个t_dict来创建一个数据帧

ds = pd.DataFrame([t_dict, t_dict ], index=[1,2])

ds

系列助手功能

就像熊猫 DataFrame 一样,Series 也有多组帮助器函数用于数据分析。

请注意,Pandas DataFrame 的所有列助手功能都将适用于 Pandas 系列。一些例子是

#Getting the mean of a Series
series_age.mean()# Getting the size of the Series
series_age.size# Getting all unique items in a series
series_designation.unique()# Getting a python list out of a Series
series_name.tolist()

迭代序列

就像 python 中的许多其他数据结构一样,可以使用一个简单的 for 循环来迭代序列

for value in series_name:
    print(value)

我们还可以迭代索引为

for row_index in series_name.keys():
    print(row_index)

熊猫系列的基本用法就这些了。

感谢阅读…!!!

达克什

熊猫的提示和技巧

原文:https://towardsdatascience.com/pandas-tips-and-tricks-33bcc8a40bb9?source=collection_archive---------0-----------------------

这篇文章包括一些有用的提示,告诉你如何使用 Pandas 对大型数据集进行有效的预处理和特征工程。

熊猫 Ufuncs 以及为什么它们比应用命令好得多

Pandas 有一个应用函数,可以让你对一列中的所有值应用任何函数。注意,应用比循环的 python 快一点点!这就是为什么最推荐使用 pandas builtufuncs对列应用预处理任务(如果有合适的 ufunc 可用于您的任务)Ufuncs是用 C 实现的特殊函数(基于 numpy 库),这也是它们高效的原因。我们将提到的有用的 ufuncs 有:。差异,。移位,。累计。累计,。str 命令(作用于字符串),。dt 命令(作用于日期)等等。****

示例数据集—夏季活动

我将用不同的人名、它们的夏季活动和它们相应的时间戳来演示熊猫的把戏。一个人可以在不同的时间戳中进行多个活动。

Randomly generated data with summer activities

假设我们的目标是预测,基于给定的数据集,谁是数据集中最有趣的人:)。

Fun Fun Fun!

1.字符串命令

对于字符串操作,最推荐使用 Pandas 字符串 命令(它们是ufunc)。****

例如,您可以使用 .str.split 和 expand=True 将包含一个人的全名的列拆分为包含名和姓的两列。

Name column before split

df[‘name’] = df.name.str.split(" ", expand=True)

Name column after split

此外,您可以使用 .str.replace 和合适的 regex 有效清洁任何管柱。

2.分组依据和值计数

Groupby 是一个非常强大的熊猫方法。您可以按一列分组,并使用 value_counts 对另一列的值进行计数。使用 groupbyvalue_counts 我们可以计算每个人做了多少活动。

df.groupby('name')['activity'].value_counts()

Group by person name and value counts for activities

这是多索引,pandas 数据框架中的一个有价值的技巧,它允许我们在数据框架中有几级索引层次。在这种情况下,人名是索引的第 0 层,而活动在第 1 层。

3。拆垛

我们还可以通过在上面的代码中应用 unstack 来为每个人的夏季活动计数创建特性。取消堆叠将行切换到列,以获取活动计数作为特征。通过执行 unstack ,我们将索引的最后一级转换为列。所有的活动值现在将成为数据帧的列,当一个人没有进行某项活动时,该功能将获得一个值。 Fillna 用 0 填充所有这些缺失的值(人员没有访问的活动)。

df.groupby('name')['activity'].value_counts().unstack().fillna(0)

Activity count in columns

3.groupby、diff、shift 和 loc +提高效率的绝佳技巧

了解个人活动之间的时差对于预测谁是最有趣的人来说是非常有趣的。一个人在聚会上混了多久?他/她在海滩逗留了多长时间?这可能对我们有用,取决于活动。

计算时差的最直接的方法是通过人名对分组,然后使用 diff 计算时间戳字段的时差():****

df = df.sort_values(by=['name','timestamp'])
df['time_diff'] = df.groupby('name')['timestamp'].diff()

Calculating the time difference between person activities to get the duration of each activity

如果你有很多数据,并且你想节省一些时间(根据你的数据大小,这可以快 10 倍左右),你可以跳过 groupby ,在对数据排序后只做 diff ,然后删除不相关的每个人的第一行。

df = df.sort_values(by=['name','timestamp'])
df['time_diff'] = df['timestamp'].diff()
df.loc[df.name != df.name.shift(), 'time_diff'] = None

BTW —有用的。Shift** 命令将所有列向下移动一个空格,这样我们就可以看到该列在哪一行发生了变化:df.name!=df.name.shift()。**

还有。loc** 命令是为特定索引设置列值的最推荐方法。**

要将 time_diff 更改为秒单位:

df['time_diff'] = df.time_diff.dt.total_seconds()

要获得每行的持续时间:

df[‘row_duration’] = df.time_diff.shift(-1)

Added duration per row

4.累计和累计

这是两个非常酷的 Ufuncs,可以帮助你做很多事情。累计计数创建累计计数。例如,我们可以通过按人名分组,然后应用累计,只对每个人进行第二项活动。这将只是按顺序对活动进行计数。然后,我们可以通过 do = = 1(或通过 do = = 2 的第三个活动)并在原始排序的数据帧上应用索引,为每个人仅获取第二个活动。

df = df.sort_values(by=['name','timestamp'])df2 = df[df.groupby(‘name’).cumcount()==1]

The second activity of each person

df = df.sort_values(by=[‘name’,’timestamp’])df2 = df[df.groupby(‘name’).cumcount()==2]

The third activity of each person

累计只是一个数值单元格的累计汇总。例如,您可以将一个人在每项活动中花费的钱添加为附加单元格,然后使用以下公式汇总一个人在一天中每个时间花费的钱:

df = df.sort_values(by=[‘name’,’timestamp’])df['money_spent_so_far'] = df.groupby(‘name’)['money_spent'].cumsum()

Money spent so far

5.用于测量活动持续时间的 groupby、max、min

在第 3 部分,我们想知道每个人在每项活动中花费了多少时间。但是我们忽略了有时我们会得到一个活动的多个记录,而这个活动实际上是相同活动的继续。因此,为了获得实际的活动持续时间,我们应该测量从第一个连续活动出现到最后一个活动出现的时间。为此,我们需要标记活动的变化,并用活动编号标记每一行。我们将使用来做这件事。换档命令和。我们之前看到的 cumsum** 命令。新活动是指活动发生变化时,人员发生变化。**

df['activity_change'] = (df.activity!=df.activity.shift()) | (df.name!=df.name.shift())

然后,我们将通过对每个用户进行分组并应用 glorious 来计算每行的活动数量。累计值:

df['activity_num'] = df.groupby('name')['activity_change'].cumsum()

Add activity num for the activities which continues between rows

现在,我们可以按如下方式计算每个活动的持续时间:按名称和活动编号(以及活动—这并不真正改变分组,但我们需要它具有活动名称)分组,并计算每行活动持续时间的总和:

activity_duration = df.groupby(['name','activity_num','activity'])['activity_duration'].sum()

activity duration

这将返回某种 timedelta 类型的活动持续时间。您可以使用. dt.total_seconds 获得以秒为单位的会话活动持续时间:

activity_duration = activity_duration.dt.total_seconds()

然后,您可以使用如下命令计算每个人的最大/最小活动持续时间(或中位数或平均值):

activity_duration = activity_duration.reset_index().groupby('name').max()

Maximal activity duration per user

摘要

这是一个短期的熊猫旅行,使用了一个夏季活动的数据集。希望你已经学会并喜欢它。祝你的下一个熊猫项目好运,享受这个夏天!

熊猫变了——不仅仅是看上去那样

原文:https://towardsdatascience.com/pandas-transform-more-than-meets-the-eye-928542b40b56?source=collection_archive---------4-----------------------

最近我一直在和熊猫一起工作。在做一个项目时,我遇到了一个我以前不知道的漂亮的函数,经过询问,似乎我不是唯一一个错过的人,所以让我们补救一下。

首先,让我们回顾一下基础知识。

拆分—应用—合并

这是一种常见的方法。我们希望根据某些标准将数据分组,然后将我们的逻辑应用于每个组,最后将数据组合回单个数据框中。让我们看看我们的数据。我们有两家不同公司的几名员工的年薪:

Well researched data, aka I made it up.

“应用”阶段的一个众所周知的函数是 aggregate(或 agg)。当你可以把那些讨厌的细胞压缩成一个的时候,为什么还要有它们呢?使用 aggregate,您可以对数据求和、求平均值或任何其他此类计算,如下所示:

mean_salary = df.groupby('Company')['Yearly Salary'].\
aggregate('mean').rename("Mean Salary").reset_index()

您甚至可以为每列指定不同的功能!

在任何情况下,结果都是组中的每一列都减少为一个数据单元格。现在,为了将它组合回我们的数据帧,我们需要使用 merge。

df1 = df.merge(mean_salary)

我们可以在“应用”阶段使用的另一个功能是(惊喜!)应用功能。它允许我们对数据框中的一列(或一行)应用任何我们想要的函数。它可以是 lambda 函数,也可以是我们在别处定义的函数。这一次,数据没有减少,而是对每个单元格分别进行操作:

df['Yearly Salary K'] = df['Yearly Salary'].apply(lambda x: x*1000)

当我遇到一个问题时,我已经愉快地使用这些功能有一段时间了。我有想要拆分、运行一些逻辑并重新组合的数据,但我不想减少数据或单独运行每一行。相反,我希望对每组中我的列的每个单元格进行一些计算,并返回一个考虑到整个组的结果。数据的大小需要保持不变。

长话短说——在与这个问题纠缠了一会儿之后,一个队友告诉我去查一下 aggregate 的一个不太出名的表亲 transform。答对了。

改变

让我们看看变换是如何工作的:

df.groupby('Company').transform('mean')

我们得到的不是减少结果,而是与原始数据大小相同的结果。这使得组合数据变得非常简单。让我们添加另一行来展示我们可以做些什么:

df['avg_company_salary'] = df.groupby('Company').transform('mean')
df['is_above_avg_salary'] = \
df['avg_company_salary'] < df['Yearly Salary']

正如我们之前所展示的,在这个具体的例子中,您可以使用 aggregate 和 merge 来完成相同的结果,但是关于 transform 很酷的一点是,您可以在一个步骤中完成它。

我希望您也会发现转换函数很有用,并且您很快就会有机会使用它!

©Hasbro

对 git 也感兴趣吗?阅读我的帖子 Git:升级来提升你的 Git 游戏。

计算生物学中机器学习的十个快速提示

原文:https://towardsdatascience.com/paper-break-down-ten-quick-tips-for-machine-learning-in-computational-biology-3b224f6fed7e?source=collection_archive---------6-----------------------

Gif from here

所以今天,我不想做一些技术性的东西。我发现了这篇由大卫写的论文计算生物学中机器学习的十个快速技巧。因此,让我们深入研究生物学中机器学习的十个技巧吧!

提示 1:检查并合理安排你的输入数据集

因此,在第一部分,作者建议,拥有足够的数据来实际上使机器学习模型正常工作。以及一些其他方法,例如随机混洗给定的数据。最后,作者建议,如果你有足够的数据,去除一个离群值,当你没有足够的数据时,将离群值四舍五入到上限。

提示 2:将你的输入数据集分成三个独立的子集(训练集、验证集、测试集)

很标准的方法来分割数据集,分成三个不同的数据集。训练、验证和测试集。作者还说,不要试图用训练阶段的测试数据来欺骗自己,以达到更高的准确率。

提示 3:将你的生物学问题纳入正确的算法范畴

这一部分可以总结为一句话,根据你的数据,你必须选择使用监督学习或无监督学习方法。这是一个有趣的部分,但是我要补充的是,可能有一些问题可以通过生物学中的强化学习或半监督学习来解决。

技巧四:应该选择哪个算法开始?最简单的一个!

作者推荐使用 K-均值聚类的无监督学习方法,和 K-最近邻的监督学习问题。我也认为最简单的解决方案是最优雅的解决方案。

提示 5:处理不平衡数据问题

在这里,作者建议确保你的数据集是适当平衡的。如果不是这样,作者也给了我们一个非常简单的规则,可以抵消这种差异。也就是 50%平均法则。

例如,如果你的数据中有 90%的反面例子,10%的正面例子。

通过使用如上所示的 50%平均规则,您可以获得将多少数据放入您的模型的良好比率。

提示 6:优化每个超参数

再次总结,用你的数据集做很多实验,选择最佳的超参数。

提示 7:最小化过度装配

所以,提示的标题说明了一切,要意识到过度合身的问题,并尽量减少它。我的建议是,也要注意不合身。

提示 8:用马修斯相关系数(MCC)或精确召回曲线评估你的算法性能

作者建议使用不同的度量系统来正确评估你的算法。这些指标包括准确性、F1 分数、MCC、召回率、脱落率、精确度、ROC 曲线和精确度-召回率曲线。

提示 9:用开源代码和平台来编写你的软件

总结:使用 python、R、IBM Spss 等开源软件。

提示 10:向计算机科学专家或在线社区寻求反馈和帮助

在 Reddit 或任何行业专家领域(甚至在媒体上)询问你的算法在给定数据集上的表现如何。

最后的话

这篇文章对于机器学习社区的初学者来说是一个很好的概述。

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

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. 奇科博士(2017)。计算生物学中机器学习的十个快速技巧。生物数据挖掘,10(1)。doi:10.1186/s 13040–017–0155–3

论文复制:使用“MAML”和“爬行动物”进行深度元学习

原文:https://towardsdatascience.com/paper-repro-deep-metalearning-using-maml-and-reptile-fd1df1cc81b0?source=collection_archive---------1-----------------------

Source: imgur

在这篇文章中,我复制了最近在元学习领域的两篇论文: MAML 和类似的爬行动物。这个复制的完整笔记本可以在这里找到。

这两篇论文的目标都是解决 K-shot 学习问题。在 K-shot 学习中,我们需要训练一个神经网络来基于非常少量的例子(通常在 10 个左右的数量级)进行归纳,而不是我们在 ImageNet 等数据集中看到的通常成千上万的例子。

然而,在为 K-shot 学习做准备时,你可以就许多类似的 K-shot 问题进行训练,以学习仅基于 K 个示例进行归纳的最佳方式。

这就是学学元学。我们已经在我的文章“通过梯度下降学习学习”中看到了元学习,你可以在这里找到:

[## 论文报告:“通过梯度下降学习”

这篇文章是一系列深度学习论文复制文章的第一篇。

becominghuman.ai](https://becominghuman.ai/paper-repro-learning-to-learn-by-gradient-descent-by-gradient-descent-6e504cc1c0de)

爬行动物和 MAML 的元学习方法都是为神经网络提出一个初始化,这个初始化很容易推广到类似的任务。这与“通过梯度下降学习”不同,在“梯度下降学习”中,我们不是在学习初始化,而是在学习优化器。

迁移学习

这种方法非常类似于迁移学习,其中我们在比如说 ImageNet 上训练一个网络,后来证明,微调这个网络可以很容易地学习另一个数据少得多的图像数据集。事实上,迁移学习可以被视为元学习的一种形式。事实上,它可以用来从非常小的数据集学习,正如你在这里看到的。

这里的区别在于,最初的网络是以易于推广为明确目的进行训练的,而迁移学习只是“偶然”发生作用,因此可能不会最佳地发挥作用。

事实上,很容易找到迁移学习无法学习到好的初始化的例子。为此我们需要看一下 1D 正弦波回归问题

在这个 K-shot 问题中,每个任务包括学习一个修改的正弦函数。具体来说,对于每个任务,底层函数的形式将是 y = a sin(x + b) ,随机选择 ab ,我们的神经网络的目标是学习仅基于 10 (x,y)对找到给定的 xy

让我们绘制几个正弦波任务示例:

3 random tasks

为了理解为什么这将是迁移学习的一个问题,让我们画出其中的 1000 个:

1,000 random tasks

至少可以说,看起来每个 x 值都有很多重叠…

由于跨多个任务的每个 x 有多个可能的值,如果我们训练单个神经网络同时处理多个任务,它的最佳选择将只是返回每个 x 跨所有任务的平均 y 值。

Average value for each x, with random task shown for scale

平均值基本上是 0,这意味着一个经过大量任务训练的神经网络在任何地方都会返回 0!不清楚这是否真的会有很大帮助,然而这个在这种情况下的迁移学习方法…

让我们通过实际实现一个简单的模型来解决这些正弦波任务,并使用迁移学习来训练它,来看看它做得有多好。首先,模型本身:

你会注意到它是以一种奇怪的方式实现的(什么是“可修改模块”?什么是“梯度线性”?).这是因为我们稍后将使用 MAML 来训练它。关于这些类的细节,请查看笔记本,但是现在你可以假设它们类似于 nn。模和线性神经网络。

现在,让我们按顺序对它进行一系列不同的随机任务的训练:

下面是当我们试图将这个转移模型微调到一个特定随机任务时发生的情况:

Transfer learning on a specific random task

基本上,看起来我们的传递模型学习了一个常量函数,很难将它微调到更好的状态。甚至不清楚我们的迁移学习是否比随机初始化更好……的确不是!随着时间的推移,随机初始化最终会比微调我们的传输模型获得更好的损失。

Learning curve for transfer learning vs random initialization

MAML

我们现在来看 MAML,这是我们今天要看的两个算法中的第一个。

如前所述,我们试图找到一组权重,以便在类似的任务上运行梯度下降可以尽可能快地取得进展。MAML 通过运行梯度下降的一次迭代,然后根据一次迭代朝着真正的任务前进了多少来更新初始权重,非常严格地执行了这个*。更具体地说,它:*

  • 创建初始化权重的副本
  • 对副本上的随机任务运行梯度下降迭代
  • 通过梯度下降的迭代反向传播在测试集合上的损失,并返回到初始权重,以便我们可以在它们更容易更新的方向上更新初始权重。

因此我们需要一个梯度的梯度,也就是这个过程中的二阶导数。幸运的是,这是 PyTorch 现在支持的东西,不幸的是,PyTorch 使更新模型的参数变得有点笨拙,我们仍然可以通过它们运行梯度下降(我们已经看到这是“通过梯度下降学习学习”),这解释了模型编写的奇怪方式。

因为我们将使用二阶导数,我们需要确保允许我们计算原始梯度的计算图保持不变,这就是为什么我们将create_graph=True传递给.backward()

那么它是如何在特定的随机任务中发挥作用的呢?

Training on a random function using MAML

哇,那好多了,甚至在梯度下降一步后,正弦形状开始可见,10 步后,波的中心几乎完全正确。这是否反映在学习曲线上?是啊!

不幸的是,有点烦人的是,我们必须为此使用二阶导数…这迫使代码变得复杂,也使事情变得相当慢(根据论文,大约 33%,这与我们将在这里看到的相符)。

有没有不使用二阶导数的 MAML 近似值?当然啦!我们可以简单地假设,我们用于内部梯度下降的梯度只是凭空出现,因此只是改善初始参数,而不考虑这些二阶导数。让我们为 MAML 训练函数添加一个一阶参数来处理这个问题:

那么这个一阶近似有多好呢?事实证明,它几乎和原来的 MAML 一样好,而且确实快了大约 33%。

Learning curve of MAML vs MAML first order

爬行动物

MAML 的一阶近似告诉我们,一些有趣的事情正在发生:毕竟,梯度是如何产生的似乎应该与一个好的初始化相关,然而它显然不是那么多。

爬虫进一步发展了这个想法,告诉我们做以下事情:在一个给定的任务上对运行几次的 SGD 迭代,然后在 SGD 的 k 次迭代后,将你的初始化权重向你获得的权重方向移动一点。一个非常简单的算法,只需要几行伪代码:

当我第一次读到这里的时候,我很紧张:这不就和在每项任务中交替训练你的重量一样吗,就像在迁移学习中一样?这怎么可能行得通呢?

事实上,爬行动物的论文预见到了这种反应:

你可能会想“这不就和训练预期损失 Eτ [Lτ] 一样吗?”然后检查日期是否是 4 月 1 日。

碰巧的是,我在 4 月 2 日写这篇文章,所以这一切都是严肃的。这是怎么回事?

事实上,如果我们运行 SGD 进行单次迭代,我们会得到与上述迁移学习相同的东西,但我们没有,我们使用了几次迭代,因此我们每次更新的权重实际上间接取决于损失的二阶导数,类似于 MAML。

好吧,但是,为什么会这样呢?爬行动物为此提供了一个令人信服的直觉:对于每项任务,都有最优的权重。事实上,可能有许多组权重是最优的。这意味着,如果您承担几项任务,那么应该有一组权重,对于每项任务,这些权重与至少一组最佳权重之间的距离是最小的。这组权重是我们想要初始化我们的网络的地方,因为它可能是对任何任务来说达到最优所必需的最少工作的权重。这是爬行动物发现的一组砝码。

我们可以在下图中直观地看到这一点:两条黑线代表两个不同任务的最优权重集,而灰线代表初始化权重。爬虫试图使初始化权重越来越接近最佳权重彼此最接近的点。

现在让我们实现爬行动物,并将其与 MAML 进行比较:

它如何看待一个随机问题?漂亮:

Reptile performance on a random problem

学习曲线呢?

Learning curve of Reptile, MAML and MAML first-order

看起来爬虫确实用一个更简单和更快的算法实现了和 MAML 相似甚至更好的性能!

所有这些都适用于更多的问题,而不仅仅是这个正弦波的玩具例子。要了解更多细节,我真的建议你阅读报纸。在这一点上,你应该有足够的背景来理解他们相当容易。

未来真正有趣的是将这些方法不仅应用于 K-shot 学习问题,还应用于更大的问题:对于基于中等规模数据集(几百或几千个,而不是 K-shot 学习中常见的大约 10 个)的训练模型,迁移学习在图像分类领域非常成功。使用爬行动物训练 resnet 网络会产生比我们现有的模型更适合迁移学习的东西吗?

论文复制:深层神经进化

原文:https://towardsdatascience.com/paper-repro-deep-neuroevolution-756871e00a66?source=collection_archive---------2-----------------------

Obligatory evolution picture. From http://www.techcrates.com/evolution-of-computers-and-technology/

在这篇文章中,我们复制了最近的优步论文“深度神经进化:遗传算法是训练深度神经网络进行强化学习的一种有竞争力的替代方法”,该论文令人惊讶地表明,在诸如 Atari 游戏等经过充分研究的问题上,简单的遗传算法有时比表面上先进的强化学习算法表现得更好。

在优步最终用这篇论文解决冻伤问题之前,我们自己将会在冻伤问题上达到艺术表现的状态,这是一个困扰强化学习算法多年的游戏。我们还将学习使用遗传算法训练神经网络的黑暗艺术。

在某种程度上,这可以被认为是我的深度强化学习的第 3 部分,但我认为这篇文章也可以独立存在。请注意,与之前的教程不同,这篇文章将使用 PyTorch 而不是 Keras,主要是因为这是我个人选择的,但也因为 PyTorch 确实更适合这个特定的用例。对于第 0 至第 2 部分,请参见:

[## 用深度强化学习打败雅达利!(第 0 部分:RL 简介)

2013 年末,一家当时名不见经传的公司 DeepMind 在钢筋领域取得了突破…

becominghuman.ai](https://becominghuman.ai/lets-build-an-atari-ai-part-0-intro-to-rl-9b2c5336e0ec)

设置环境

以下内容与 DQN (Mnih 等人,2015 年)相同:(1)数据预处理,(2)网络架构,以及(3)随机环境,以多达 30 个随机的初始无操作操作开始每一集。

很好,所以预处理和我们用 DQNs 做的一样!那非常方便。提醒一下,这需要做些什么:

  • 我们应该使用 OpenAI gym 的“确定性 v4”环境,它们可以自动跳过 4 帧,这似乎是 DQN 论文中的标准。
  • 我们应该使国家灰度,并调整其大小为 64 乘 64。我们还应该确保像素值在 0 和 1 之间,而不是 0 和 255 之间。
  • 状态应该由我们看到的前 4 帧组成。

我使用 OpenCV 做了预处理,得到了:

请注意,我后来意识到,这做了调整大小的双线性插值,而我认为最近邻可能是规范,不清楚这是否可能有很大的影响,但值得注意。

就效果而言,这是我们看到的转变:

变成了:

基本上就是这样,现在我们只需要堆叠 4 个这样的元素来得到我们的状态。

模型

我们使用来自 Mnih 等人(2015)的更大的 DQN 架构,该架构包括 3 个具有 32、64 和 64 个信道的卷积层,后面是一个具有 512 个单元的隐藏层。卷积层使用 8 × 8、4 × 4 和 3 × 3 滤波器,步长分别为 4、2 和 1。所有隐藏层之后是整流器非线性(ReLU)。该网络包含超过 4M 个参数。

没有我们以前没见过的,让我们把它写下来!

好了,现在我们可以开始有趣的事情了:

遗传算法的简单解释

一种遗传算法(荷兰,1992;Eiben 等人,2003)进化出 N 个个体的群体 P(这里是神经网络参数向量θ,通常称为基因型)。在每一代,对每个θi 进行评估,产生一个适合度分数(又名奖励)F(θi)。我们的 GA 变体执行截断选择,其中前 T 个个体成为下一代的父母。为了产生下一代,下面的过程重复 N-1 次:通过替换均匀地随机选择一个父代,并通过对参数向量应用加性高斯噪声来进行变异:θ’=θ+σε其中ε∾N(0,I)。对于每个实验,根据经验确定适当的σ值,如补充信息(SI)表 3 所述。第 n 个个体是上一代最佳个体的未修改副本,这种技术称为精英主义。

这对我来说似乎相当清楚,但我将尝试重新解释它:基本上,我们不是随机生成一个网络并使用梯度下降修改其权重,而是随机生成一组网络,构成一个“代”,然后评估它们。当然,他们中的一些人会表现得稍微好一点。我们挑选出表现最好的一个,留给下一代。然后在前几个网络中,我们通过多次复制它们并稍微修改每个副本的权重来创建新一代。因为每次只选择顶级网络,而且因为我们不断更换网络,所以我们的性能似乎应该不断提高,事实上也确实如此!

在我们的例子中,因为我们关注 Atari 游戏,所以群体大小是 5000,截断阈值是 10,σ参数是 0.005。他们提到的 I 参数,简单来说就是从一个单位方差的正态分布中抽样(I 是单位矩阵)。

那么,你可能会问,我们什么时候停止世代?优步非常清楚,他们在 10 亿后停止,而不是在固定数量的代后,所以我们将确保跟踪我们看到的帧数,一旦超过 10 亿就停止。提醒一下,神经网络上的帧和前向传递是有区别的,因为每次前向传递运行 4 帧是标准的(即网络每 4 帧只选择一个动作)。如果你在 OpenAI 健身房用了一个Deterministic-v4,这个 4 帧的跳帧是自动为你实现的,那么只需将你调用.step的次数乘以 4,当那个数达到十亿时就停止。

模型压缩

优步在这篇论文中提供的一个有趣的创新是在神经网络压缩方面。

我们提出了一种新的方法,通过将每个参数向量表示为一个初始化种子加上产生应用于θ的一系列突变的随机种子的列表,来紧凑地存储大参数向量。这项创新对于使遗传算法能够在深度神经网络的规模上工作至关重要,因此我们称之为深度遗传算法。这种技术的好处还在于提供了一种最先进的压缩方法(第 5 节)。

正如上面的引用所暗示的,我们绝对需要来实现这种压缩,不是因为它很酷,而是因为我们需要在几台不同的机器上工作,相互传递神经网络,并且能够有效地序列化神经网络,以便它们可以快速地从一台机器转移到另一台机器,这是非常重要的。

幸运的是,实现这一点非常简单!正如论文中提到的,这只是关于记住我们每次生成随机数时使用的随机种子,即我们需要记住:

  • 我们用来初始化网络的种子
  • 我们每次进化网络权重时使用的种子。

就是这样!每当我们传递网络时,我们只是发送种子而不是实际的网络,在正确设置每个种子后,通过重新运行初始化和进化很容易重新创建它。

使用 PyTorch 设置随机种子的方法很简单torch.manual_seed,您可以向其传递一个数字。为了确保随机种子总是不同的,我传入了一个由 Python 的random.randint生成的数字,从 0 到 2^31 - 1 进行采样(你为什么问这个数字?我不确定哪些数字可以作为随机种子,但这确保了我传递的任何东西都适合 32 位有符号整数,我觉得这几乎肯定是可以接受的,而更大的数字可能就不行了)。

学习:使用随机种子,而不是随机状态。

PyTorch 还有一种方法可以使用torch.get_rng_state获得其当前的随机状态,并使用torch.set_rng_state设置它。起初我用这个是因为可能的随机状态比随机种子多得多,所以对我来说它看起来更“随机”。最大的问题是每个随机状态的大小已经是 5kB 左右了(相比之下,一个随机种子只有 4 个字节,或者少了 1000 倍),这意味着我的系统由于涉及到大量的数据而变得非常慢。不要和我犯同样的错误!

既然我们理解了模型压缩和模型演化,我们就可以完成模型代码来处理这两者。我选择创建一个名为 CompressedModel 的单独的类来表示压缩模型,并且可以在两者之间来回切换。这需要对模型进行一些更新,以便它支持一个接受种子并对其进行演化的evolve函数,这样它就可以在初始化自己时接受种子。我们得到:

分布式计算:作业队列和现场实例

公平的警告:在这一部分,我假设你已经对 AWS 或其他一些云提供商有所了解,比如谷歌云或微软 Azure。如果你不知道,至少看看一些使用 AWS 进行深度学习的教程可能是值得的(例如:https://towards data science . com/how-to-set-up-a-deep-learning-environment-on-AWS-with-keras-the ano-b 0f 39 e 3d 861 c)),或者至少意识到你可能必须进行一些谷歌搜索,因为我将跳过一些重要的基本内容。

使用遗传算法训练神经网络在以下方面不同于使用梯度下降训练神经网络:使用梯度下降,我们需要在单个网络上进行大量的数学运算,而使用遗传算法,我们需要在许多网络上进行少得多的数学运算(只是向前传递,而不是向前和向后)。这使得我们可以在大量的 CPU 上训练我们的遗传神经网络,而不是在单个 GPU 上。

我们说的有多大?让我们看看优步对此有什么看法:

当大量分布式计算可用时,GA 和 ES 都比 Q-learning 和策略梯度方法更快(这里,几十台机器上有 720 个 CPU 内核)。

720 ?哇哦。我倾向于认为我自己的硬件是相当高端和最新的,但即使在我的台式机和笔记本电脑之间,我总共有 8 个 CPU 核心…

那么这又是一篇使用了我们普通人完全无法获得的大量资源的论文吗?不是这样的!我们只是需要学习更多关于基础设施的知识。

作业队列

问题是,我们绝对不可能在一台机器上获得 720 个 CPU 内核。更合理的是,我们可以得到 64 或更多。这意味着如果我们想像优步那样处理东西,我们将需要多台机器。

为此,我们将使用任务队列的概念,有一个主人(或经理)和工人。主服务器将任务放到任务队列中,而工人将从队列中取出作业,运行它们,并将结果写回。这个过程可以在这个图表中看到。

Source: https://www.alberton.info/batching_vs_latency_and_jobqueue_models.html

在我们的例子中,作业是评估当前一代中不同神经网络的性能,输出只是每个神经网络的分数,以及它们使用的帧数。这种体系结构的另一个优点是,它允许我们将主设备和工作设备放在不同的机器上,这有助于降低成本:我们可以将主设备放在功能不太强大但非常可靠的机器上,而将工作设备放在功能非常强大但不太可靠的机器上。这样我们可以保存我们的数据(因为所有东西都存储在主服务器上),但是可以使用不可靠的廉价机器作为工人。

我们将使用的任务队列库是 RQ ,这是一个非常容易使用的任务队列库。它依赖于 Redis 数据库,您可以非常简单地将其安装在 Amazon 实例上。

你所需要做的就是确保所有你的工人所需要的代码都在一个.py文件中,而不是在一个笔记本中,因为 RQ 需要.py文件来创建工人进程。然而,你的主人可以在笔记本上。你可以把你需要的.py的任何部分导入到你的主笔记本中。

具体来说,以下内容应该在一个.py文件中:

  • 神经网络模型的代码
  • 神经网络压缩/解压缩代码
  • 用于根据压缩模型和环境名称评估神经网络的函数,该函数至少返回分数和使用的帧数

然后,您的主代码可以使用job = rq.enqueue(...)将一个作业添加到队列中,该作业带有所讨论的函数和它应该采用的参数,并且它可以使用job.result得到结果,如果函数还没有返回,结果将是 None。您应该确保您的代码对于被丢弃的作业是健壮的:如果您长时间没有得到作业的结果,请确保它被重新排队。记得将压缩的神经网络作为参数传递给enqueue,因为这些需要序列化并通过网络传输,所以它们要小,这一点很重要。把这些放在一起,这是我最后的主代码。

一旦你有了所有这些,你应该为你的主人创建一个 AWS 实例,一个小型的就足够了,我个人使用了 t2.medium。你可以在上面安装任何你想要的 Linux,我个人使用了非深度学习的 Ubuntu 16.04 AMI。然后安装代理的所有依赖项,包括 redis-server、rq、pytorch 等。完成后,您应该做以下事情:

  • 编辑刚刚创建的主机的安全组,以允许 redis 连接。为了确保不将 redis 服务器暴露给外界,您可以将流量限制为仅来自同一个安全组内部的流量。从现在开始,确保您创建的任何其他计算机都在同一个安全组中。理想情况下,您应该只启用 redis 流量,但是我懒得找出具体的方法,所以我启用了来自安全组的所有流量,如下所示:

  • 找出你的主机的私有 IP(应该在 EC2 web 界面中)并创建以下两个文件:
    一个名为redis.conf的文件包含bind <YOUR PRIVATE IP> 一个名为settings.py的文件包含REDIS_HOST = '<YOUR PRIVATE IP'
  • 运行 redis 服务器:nohup redis-server redis.conf&nohup部分确保服务器将继续运行,即使您的连接中断,而最后的&确保它立即在后台运行,以便您可以做其他事情。
  • 使用rq worker -c settings运行一个 RQ worker。
  • 现在通过运行您的主代码来测试这是否可行,并确保作业确实由工人处理。
  • 杀死 worker,回到 AWS 界面,点击你的实例,进入“Actions → Images → Create Image”,这将允许你创建一个包含你刚刚安装的所有包的 AMI,这样就可以很容易地在其他机器上启动 worker!

我们现在可以继续创建实际的工人。

AWS Spot 实例

事实证明,访问大量 CPU 是相当容易的:例如,AWS 上的 c5.18xlarge 实例包含惊人的 72 个 CPU,是我们所需的 1/10!只要有 10 个这样的实例,我们就会拥有与优步使用的 CPU 数量完全相同的 CPU。甚至有一个实例有 96 个 CPU(m5.24xlarge),但值得注意的是,它的 CPU 比 c5.18xlarge 略慢,而且它的每 CPU 成本略高,因为它也有更多的内存,这是我们并不真正需要的(c5.18xlarge 有 144 GB 的内存,m 5.24 x large 有 384 GB,但我记得我从未在我使用的任何机器上使用过超过 5 GB 的内存……)。

好的,那么要花多少钱?嗯,在美国西部地区,单个 c5.18xlarge 每小时的成本为 3.06 美元(其他地区应该差不多),优步声称,他们能够使用相当于 10 个 c5.18xlarge 在大约一小时内训练他们的网络,因此,假设一切顺利,训练单个网络应该花费 30.60 美元。这其实没那么糟糕!但是我们可以使用点实例做得更好。

现货实例是亚马逊如何处理并非所有机器在任何给定时间都被预订的事实:他们为闲置机器的使用设立拍卖,出价最高的人可以获得这些机器。这使得价格更低,但有一个问题:如果有人超过你的最高出价,或者亚马逊必须满足全价要求,你正在使用的机器可能会被夺走。

此外,与常规的按需实例相比,您实际支付的价格更难预测:实例的现货价格会随着需求的增加和减少而波动,只要当前现货价格低于您的最高出价,您就总是支付当前现货价格。因此,如果一个实例以每小时 1 美元的价格交易,而你出价 2 美元,你可能一开始会支付 1 美元,但随着时间的推移,你可能会开始支付每小时 1.5 美元,或 0.5 美元等。幸运的是,实例市场现在足够稳定,这不是一个大问题:如果您只使用您的实例几个小时,最有可能您将支付您第一次创建 spot 实例时看到的价格的 5%左右。

不过总的来说,我们上面描述的设计对于 spot 实例来说是完美的,因为您可以让一个“主”服务器运行在一个小型的随需应变实例上,并使用您想要的任何数量的高 CPU spot 实例。如果您正确地编写了代码,它应该相对不会出现实例死亡:它只会重试作业,不会丢失数据。在撰写本文时,一个 c 5.18 x 大型 spot 实例的成本为 1.08 美元,比使用按需实例的成本低近 3 倍。这意味着,乐观地说,在一个游戏上训练应该花费大约 11 美元。然而,请注意,由于我训练了 3 个游戏(冻伤、突破和太空入侵者)以及我在这个过程中犯的许多错误,整个实验花费了我大约 115 美元,所以在开始做这个之前,请尽量格外小心或确保你愿意花费大约 100 美元。

那么,如何创建 spot 实例呢?让我们现在就做吧!作为一个提醒,请确保您对您的设置有足够的信心(即您已经创建了一个 AMI,并且您已经确认您可以轻松地在另一台机器上运行该系统)。

在 EC2 面板中,单击右侧的“Spot 请求”,然后单击“请求 Spot 实例”按钮。您将被带到此页面:

许多参数可以保留为默认值,只需记住执行以下操作:

  • 选择你的总容量(10 会给你优步所使用的,但我个人选择使用 5 个实例,并简单地等待 2 小时,而不是 1 小时。您必须使用 ssh 访问每台机器,因此较低的数量更易于管理)。
  • 选择您刚刚创建的 AMI。
  • 从实例类型列表中删除 c3.large 实例类型,并添加一个 c5.18xlarge。“选择实例类型”窗口将实际显示所有可用的实例及其价格。
    有可能在你看的时候另一个实例类型会对你更有利。我的建议是,在计算哪个实例是最好的时,只需将当前的现货价格除以 CPU 的数量,就可以得到每个 CPU 最便宜的实例。但是,请注意,名称以“c”开头的实例是计算优化的,这通常意味着它们的 CPU 比其他实例上的 CPU 更快,即使内核数量相同。
  • 选择与主服务器相同的可用性区域(可能没有必要)。
  • 选择您先前创建/编辑的安全组。

一些可选的事情是设置您的最高价格(默认情况下是按需出价,这也是我推荐的价格),并且可能在固定的时间内保留您的 spot 实例(这样可以保证您的实例在接下来的 3 个小时内不会被抢占,但是您可能会比普通的 spot 实例支付更多的费用)。

一旦完成,您就可以登录到各种 spot 实例并在其上运行 rq workers。这是我用来启动 72 个 workerss 并让每个 worker 将其日志写入不同文件的脚本:

for i in {0..72}
do
nohup rq worker -c settings > $i&
done

现在,假设您正在主盒上运行您的主代码,您应该最终在您的训练中取得进展!

英特尔 MKL 的一个重要消息

英特尔 MKL 公司是数值计算领域一个非常酷的新发展。这是一个由英特尔开发的速度极快的数学库,它利用最新的指令和多线程来非常快速地执行数值计算。PyTorch 使用它进行 CPU 计算,并帮助减少神经网络的 CPU 和 GPU 性能之间的差异(尽管 GPU 仍然更快)。

不幸的是,MKL 会给我们带来麻烦!这是因为它将自动使用几个 CPU 核心来向前传递单个神经网络,但我们已经设置好了,以便每个神经网络使用一个 CPU 核心。我发现这似乎让事情变得更慢,这就是为什么我建议在 MKL 禁用多线程。这可以通过在 python ( conda install mkl-service)中安装 mkl-service 并在导入 pytorch 之前将以下代码行放在 worker 文件的顶部来实现:

import mkl
mkl.set_num_threads(1)

我们来看结果!

最后是一两个小时后,看你选择用多少台机器,我们有结果了!

那么我们如何评价我们代理人的表现呢?优步对此有几点要说:

将我们的结果与其他算法的结果进行公平的比较是极其困难的,因为这种比较本质上在许多不同的方面是风马牛不相及的。一个重要的考虑因素是,是否在随机开始(随机数量的无操作动作)上对代理进行评估,这是他们接受训练的制度,或者从人类游戏中随机采样的开始,这测试一般化(Nair 等人,2015)。 由于我们没有从 抽取人力开工数的数据库,我们的代理商是用随机开工数进行评估的。在可能的情况下,我们将我们的结果与其他算法的结果进行比较,这些算法的随机开始结果是可用的。这对 DQN 和 ES 来说是正确的,但对 A3C 来说就不正确了,在 A3C 中,我们必须包括人类起跑的结果。

我强调缺乏一个人类起点的数据库:我认为这太糟糕了,事实上似乎没有这样的数据库,我认为建立一个会很棒。

无论如何,听起来我们应该评估我们的代理的方式是在开始之前简单地使用随机数量的无操作操作,这就是我们最初是如何进行培训的。这里没有指定无操作的数量,但是其他地方给出的数量在 0 到 30 之间,所以这就是我们要做的。因为存在这种随机性(更不用说在单个 Atari 游戏中产生随机数的可能性),我决定运行游戏 30 次,并显示最好、最差和中间值结果。开始了。

冻伤

Best score for Frostbite

我们可以看到,我们得到了一个对冻伤表现非常好的代理:4570 是它的最好成绩,接近优步的 4801,据我所知,这是目前最先进的水平!非常刺激。

不幸的是,这个代理甚至对随机启动都不够健壮!中位数只有 170,最差 160!我不清楚为什么优步没有报告这个问题:这是我的实现中的一个问题吗?一些发生在他们身上但他们没有报告的事情?实施过程中的问题?(例如,如果他们实现了糟糕的随机启动,这可能不可见)。

Median performance of the best agent for Frostbite

这似乎解释了当我经历几代人时,中值分数和最佳分数之间的巨大差异(优步的“中值”分数图没有使用这个定义,这就是为什么我不能将它们与我的发现进行比较:在优步的定义中,它是最佳代理在多次运行中的中值):这并不是说代理对其权重的微小变化非常敏感,而是他们对其起点的微小变化非常敏感!

Performance of the best and median agent at each generation

我真的很想在将来解决这个问题。在我看来,有两件事可以帮助解决这个问题:

  • 不是在一次运行中而是在多次运行中评估每个神经网络,每次运行都以不同数量的不操作开始。
  • 重温 epsilon 贪婪的遗传算法:这似乎很疯狂,因为它似乎不像 GA“需要”一个探索策略,这就是为什么优步没有实施一个,但它可能是探索不仅有助于强化学习代理发现新的高回报状态,而且有助于变得强大,以发现自己在不可预见的情况下。现在看起来 GA 网络过度适应了游戏中一个非常特殊的动作序列。编辑:在重新考虑这个问题后,我认为,虽然包含ε-greedy 可能有助于提高某些游戏的遗传算法的性能,但它可能会冻伤。这是因为在冻伤中,很容易通过一个单一的动作杀死自己(例如,在错误的时刻跳跃),因此随机选择动作可能是危险的。相比之下,在像 breakout 这样的游戏中,通常很容易修复随机动作的效果(只需撤销上一个动作的移动)。这意味着我们需要一个更好的冻伤探索策略。

越狱

Best (!) performance for Breakout

哦,好家伙…煤气做可怕的在突破。为什么?

我可以看到几个原因:

  • 你需要运行一个特定的动作,否则突围不会开始(具体来说,突围有 4 个动作:什么都不做,开始游戏,向左移动和向右移动)。当遵循诸如ε-贪婪的随机探索策略时,这不是问题,因为行动将在某个点或其他点被选择,但是没有任何探索,这意味着大部分代理将永远简单地什么也不做。为了防止这种情况,我甚至在最初几代中减少了游戏的最大长度,并惩罚了那些一直无所事事的代理。然而,显然它并没有那么好。
  • 突破中很少有像素改变,所以代理继续执行相同的动作。
    在冻伤中,即使代理什么都不做,也保证有差不多 50%的像素发生变化。在突破中,只有一个小球,桨,也许还有一两块砖会改变,而且只有当代理人实际做了一些事情。对于随机初始化的神经网络,这可能不足以让它决定执行不同的动作。

同样,我认为有办法解决这个问题,包括在训练中加入贪婪探索。这值得进一步探索。

太空入侵者

Best performance on Space Invaders

代理在《太空入侵者》中表现相对较好,类似于我们在 DQNs Part 2 中训练的代理,虽然远非最先进,但仍然相当不错。此外,不管初始随机无操作,它实际上执行相同的操作。

然而,我对它的策略有点担心,至少在一开始,它只是简单地呆在左边并试图射击母舰:这看起来更像是一个怪异的局部最优,而不是代理已经获得的实际技能。我也很好奇是什么让它学到了看起来更像游戏中真正的技巧而不是懒惰的策略。

结论

我对优步论文中的结果感到兴奋。事实上,它在冻伤方面做得如此之好是非常惊人的,我不清楚这是否意味着传统的 RL 算法特别弱,或者 GA 惊人地强。然而,我认为,遗传算法似乎有一些优步没有指出的重大问题,部分原因是他们无法使用人类启动的数据库来评估他们的算法(我认为这将显示各种代理的脆弱性),尝试解决这些问题会很有趣。我计划在未来尝试包括ε贪婪探索,我认为这将有助于代理的鲁棒性,正如优步指出的,有大量关于遗传算法的文献,他们只尝试了最基本的可能。谁知道更先进的气体会把我们带到哪里。

论文综述:神经协同过滤的解释和实现

原文:https://towardsdatascience.com/paper-review-neural-collaborative-filtering-explanation-implementation-ea3e031b7f96?source=collection_archive---------4-----------------------

Figure Source: Pixabay

神经协同过滤(Neural Collaborative Filtering,NCF)是新加坡国立大学、哥伦比亚大学、山东大学、德克萨斯 A&M 大学于 2017 年发表的论文。它利用神经网络的灵活性、复杂性和非线性来构建推荐系统。证明了矩阵分解这种传统的推荐系统是神经协同过滤的特例。此外,它还显示了 NCF 在两个公共数据集上优于最先进的模型。本文将解释 NCF 的概念,并演示如何在 Pytorch 中实现它。

视频版本:

Video

先决条件

在深入研究之前,你应该知道什么是推荐系统,以及一些基本的推荐系统。你可以阅读我的上一篇文章,快速装备自己相关知识。

矩阵分解

让我们从矩阵分解开始。它将效用矩阵分解成两个子矩阵。在预测期间,我们将两个子矩阵相乘以重构预测的效用矩阵。效用矩阵被因式分解,使得这两个矩阵的乘积与真实效用矩阵之间的损失最小化。一种常用的损失函数是均方误差。

本质上,每个用户和项目都被投射到一个潜在空间,由一个潜在向量表示。两个潜在向量越相似,对应的用户偏好就越相关。因为我们将效用矩阵分解到同一个潜在空间中,所以我们可以用余弦相似度或点积来度量任意两个潜在向量的相似度。事实上,每个用户/项目条目的预测是通过相应潜在向量的点积来计算的。

The prediction equals the inner product of latent vectors

然而,该论文认为点积限制了用户和项目潜在向量的表达能力。让我们考虑下面的情况。我们首先关注效用矩阵的前三行。

设 S{x,y}表示用户 x 和用户 y 之间的相似性。通过计算用户 1、2 和 3 之间的余弦相似性,我们知道 S{2,3} > S{1,2} > S{1,3}。不失一般性,我们将用户映射到如下的二维潜在空间。

现在,我们考虑用户 4。与其他相似性比较,我们得到 S{1,4} > S{3,4} > S{2,4}。然而,无论我们把潜在向量 P4 放在 P1 的左边还是右边,它都不可避免地比 P3 更靠近 P2。

因此,这个例子显示了内积在完全模拟潜在空间中用户和项目之间的交互方面的局限性。

神经协同过滤

论文提出了如下图所示的神经协同过滤。在输入层,用户和项目是一次性编码的。然后,用相应的嵌入层将它们映射到隐藏空间。神经 FC 层可以是任何种类的神经元连接。例如,多层感知器可以放在这里。它声称,由于神经 CF 层中的复杂连接和非线性,该模型能够恰当地估计潜在空间中用户和项目之间的复杂交互。

NCF architecture

那么,NCF 是如何推广矩阵分解的呢?让我在下图中展示给你看。我们首先将神经 CF 层替换为乘法层,它对两个输入执行逐元素乘法。然后,我们将从乘法层到输出层的权重设置为 K 乘 1 的固定单位矩阵(全为 1 的矩阵),采用线性激活函数。

然后,我们有下面的等式。

未观察到的相互作用ŷ_ui 的预测表示重构的效用矩阵上(u,I)项的预测值。l 是线性激活函数,而⊙表示逐元素乘法运算。p_u 和 q_i 分别是用户和项目的潜在向量,J 是维数为(K,1)的单位矩阵。由于 J 是单位矩阵,所以线性函数内部变成了潜在向量 p_u 和 q_i 之间的内积,而且由于线性函数的输入和输出是相同的,所以归结到最后一行。预测标签是相应用户和项目潜在向量的内积。该等式与矩阵分解部分所示的等式相同。因此,这证明了矩阵分解是 NCF 的特例。

NeuMF

为了引入额外的非线性,提出的最终模型 NeuMF 除了广义矩阵分解(GMP)层之外,还包括多层感知器(MLP)模块。

GMF 和 MLP 模块的输出被级联并与 sigmoid 激活输出层连接。

表演

本文用留一法评价了 NCF 模型和其他模型。也就是说,每个用户的最后一次交互被保留下来进行评估。考虑两个评估指标,命中率为 10,NDCG 为 10。命中率@ K 表示给定每个用户 10 个推荐的预测命中的分数。假设我们为每个用户推荐 10 件商品,10 个用户中有 4 个与我们推荐的商品进行了交互,那么命中率@ 10 = 0.4。另一方面,NDCG 可以被视为命中率的扩展,只是它考虑了命中的顺序。这意味着,如果你击中发生在较高的建议,NDCG 将更高。

性能比较如下图所示。在所有情况下,NeuMF 的表现都优于其他模型。

此外,本文还展示了对 NeuMF 的各个模块进行预训练的有效性。在分别训练了 GMF 和 MLP 之后,他们将训练后的 GMF 和 MLP 的权重设置为 NeuMF 的初始化。

履行

在这一节中,我将向您展示如何在 Pytorch 中轻松实现 NeuMF。您只需要为每个模型指定两个函数,一个是指定模型结构的 init() 函数,另一个是定义如何前馈输入张量的 forward() 函数。

该论文声称对 MLP 和 GMF 使用单独的嵌入层会产生更好的性能。因此,我们为这两个模块定义了指定的嵌入层。此外,ModuleList 还用于构建多层感知器。

forward() 函数相当简单。我们只是让用户和物品索引流过 init() 中定义的网络。需要特别注意的一点是,我在 GMP 和 MLP 模块的末尾添加了 Dropout 层,因为我发现这有助于调整网络并提高性能。

结论

您已经学习了神经协同过滤的概念以及如何在 Pytorch 中实现它。如果您有任何问题,请查看顶部的 Youtube 视频,或者在下面留下您的评论。

【论文摘要】音乐标注深度神经网络音频信号预处理方法的比较

原文:https://towardsdatascience.com/paper-summary-a-comparison-of-audio-signal-preprocessing-methods-for-deep-neural-networks-on-92a7bfacce26?source=collection_archive---------11-----------------------

GIF from this website

我的一个朋友正在用神经网络处理音频文件,他推荐我读这篇文章。

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

摘要

本文作者使用深度神经网络对音乐标注进行了实验。他们比较了对数幅度压缩、频率加权和缩放等不同的预处理方法,发现幅度压缩是最好的预处理方法。

简介

机器学习中的许多优化都是通过超参数调整来完成的,然而输入数据的质量不容忽视。这也适用于音频预处理,本文比较了对数压缩技术和数字音频压缩技术。

log(X+alpha)其中 alpha 可以是任意常数,例如非常小的数(例如 10e-7)或 1

其他预处理技术。

实验和讨论

在本节中,作者描述了网络体系结构以及输入数据结构。简而言之,他们使用了一个具有 ELU 激活的卷积神经网络,输入数据的维数为(1,96,1360)。他们还从百万首歌曲数据集中获取音乐数据,并使用离散傅立叶变换将音频转换为 96 * 1360 维。(使用 python 库 Kapre 和 LibROSA 。)

2.1。不同初始化的差异

在这里,作者描述了他们没有选择使用 k 倍交叉验证的事实,相反,他们重复了 15 次实验,并比较了每次实验的 AUC 分数。

2.2。时间-频率表示法

STFT 和 melspectrogram 是音频分类中最流行的表示输入数据的方法。(一般认为 melspectograms 是更小数据集的更好选择。)然而,当作者使用这两种预处理方法进行各种体验时,他们发现情况并非如此。

2.3。比例效应和频率轴权重的分析

在本节中,作者试验了两种不同的输入表示 log-melspectrogram 和 melspectrogram,三种频率加权方案 per-frequency、A-weighting 和 bypass,以及两种缩放方法 X10 (on)和 X1 (off)。

如上所述,当用 log()函数预处理音频时(使用或不使用缩放因子 10,我们可以观察到 AUC 分数的增加。

2.4。量值的对数压缩

将 log()函数应用于音频文件是一个好主意的原因之一,因为它将数据的分布改变为高斯分布。如下所示,当对 melSpectrogram 应用 log()函数时,我们可以观察到平滑的钟形曲线。

结论

作者发现对数标度是音乐分类任务的最佳预处理方法。

最后的话

这是一本相当有趣的读物。

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

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

参考

  1. Cho,k .,Fazekas,g .,Cho,k .,和 Sandler,M. (2017 年)。音乐标注深度神经网络音频信号预处理方法的比较。Arxiv.org。检索于 2018 年 6 月 23 日,来自https://arxiv.org/abs/1709.01922
  2. 什么是 A、C 和 Z 频率权重?——noise news。(2011).噪音新闻。检索于 2018 年 6 月 24 日,来自https://www . cirrus research . co . uk/blog/2011/08/what-are-a-c-z-frequency-weightings/
  3. 歌曲元数据以及为什么它隐藏在您的数字音乐文件中。(2018).救生索。检索于 2018 年 6 月 24 日,来自 https://www.lifewire.com/what-is-music-tagging-2438569
  4. 百万首歌曲数据集。(2018).Labrosa.ee.columbia.edu。检索于 2018 年 6 月 24 日,来自 https://labrosa.ee.columbia.edu/millionsong/
  5. LibROSA — librosa 0.6.1 文档。(2018).librosa . github . io . 2018 年 6 月 24 日检索,来自https://librosa.github.io/librosa/
  6. keunwochoi/kapre。(2018).GitHub。检索于 2018 年 6 月 24 日,来自https://github.com/keunwoochoi/kapre
  7. 短时傅立叶变换。(2018).En.wikipedia.org。检索于 2018 年 6 月 24 日,来自https://en.wikipedia.org/wiki/Short-time_Fourier_transform
  8. 梅尔声谱图。(2018).Fon.hum.uva.nl .检索于 2018 年 6 月 24 日,来自http://www.fon.hum.uva.nl/praat/manual/MelSpectrogram.html

移动机器人视觉感知森林路径的机器学习方法

原文:https://towardsdatascience.com/paper-summary-a-machine-learning-approach-to-visual-perception-of-forest-trails-for-mobile-acd5aecd33be?source=collection_archive---------9-----------------------

GIF form this website

分类任务的一个很好的例子就是踪迹跟踪。

请注意,这篇文章是让未来的我回顾和回顾这篇论文上的材料,而不是从头再看一遍。

纸质视频

Video from AAAI Video Competition

论文作者也有很好的总结视频,如果有人感兴趣的话。

摘要

本文作者利用深度神经网络解决了森林山地路径导航问题,并且能够优于传统方法。(回到 2015 年)

简介

对于机器人来说,绕过人造小径,如徒步旅行者或山地自行车手走过的路,是极其困难的。(这是合理的,因为它不是典型的道路。).为了成功地穿越森林,机器人不仅要知道自己的位置,还要及时做出反应,修正自己的方向。

如上所述,对于一个人来说,甚至不清楚在某些路线上应该朝哪个方向走。通常,计算机视觉任务集中在高速公路类型的道路上,这些道路非常标准并且看起来彼此相似。解决这个问题的其他方法是通过分割,(即在给定的图像中执行分割,并查看道路在哪里。)但是执行好的分段本身就是一个极端的挑战。因此,作者通过人类追踪器收集的数据,将此作为分类任务。(解决这个问题的另一种方法是通过模仿学习,就像 NVDIA 对自动驾驶汽车所做的那样。)

问题公式化/数据集/用于轨迹感知的深度神经网络

在这一节中,作者描述了他们是如何将这一任务公式化为一个简单的分类任务的。总之,它们有一些轨迹方向 t 和观察点方向 v,根据这两个方向之间的角度(α),可以将其分为左、直或右。

接下来,作者描述了他们是如何获得这些数据的,同样是在短期内。一个人戴着三个不同角度的 go pro 相机,在小路上散步。(类似下面看到的东西。)

最后,他们描述了解决这一分类任务的网络架构。(典型的完全连接层的卷积层,共 10 层。)

实验结果

如上所述,作者进行了两个不同的实验。三个分类之一(左、右、直)和两个分类之一(直、非直),且在这两个分类中,他们模型能够超越人类的准确性。

如上所述,网络表现非常好,但并不完美,有一些情况下,图像被错误地分类。最后,他们实现了一个简单的系统来执行无人机驾驶任务。

结论

总之,作者能够训练一个能够在森林小径中引导无人机的分类器。通过直接在 RGB 像素上执行分类,他们能够绕过痕迹特征形成的问题。

遗言

非常聪明的问题表述方式。

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

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

参考

  1. 使用深度神经网络在森林中进行四轴飞行器导航。(2018).YouTube。检索于 2018 年 6 月 25 日,来自https://www.youtube.com/watch?time_continue=4&v = umrdt 3 zggpu
  2. (2018).Rpg.ifi.uzh.ch 检索于 2018 年 6 月 25 日,来自http://rpg.ifi.uzh.ch/docs/RAL16_Giusti.pdf
  3. (2018).People.idsia.ch 于 2018 年 6 月 25 日检索,来自http://people.idsia.ch/~giusti/forest/web/

[论文摘要]回顾临床工作人员和信息系统的药物调节问题和经验—第 1 部分

原文:https://towardsdatascience.com/paper-summary-a-review-of-medication-reconciliation-issues-and-experiences-with-clinical-staff-3b07d16881b7?source=collection_archive---------11-----------------------

Image from this website

我想知道更多关于药物调节的事情,以及为什么这在医疗保健行业是一个如此麻烦的事情。另外,这篇文章很长,所以我会把它分成不同的部分。

请注意,这篇帖子是给未来的自己看的,用来回顾和复习这篇论文上的材料。

总结

药物调节是一个过程,其中将患者的药物治疗历史列表与独立的患者信息源进行比较,以防止重复用药或在医疗保健机构(或提供者)之间发生错误。

Image from this website

该列表的内容因机构而异,但通常包含医生姓名和药物名称等。然而,尽管 2006 年联合委员会已经认识到这一制度的重要性,但该制度的正确实施仍有待完成。因此,本文给出了该问题的概述和一些可能的解决方案。

简介

本质上,医疗错误仍然是患者伤害的重要来源(2010 年有 7000 例与医疗错误相关的药物死亡),并且与药物调节相关的停止伤害的过程早在 2003 年就已经开始。卫生保健提供者面临的一些问题是复杂的疾病名称以及患者使用的大量药物。

背景

作者介绍了产生药物和解程序的三个原因。一是非处方药的开发和销售增加。第二,仿制药的品牌名称变得越来越相似,从而造成混淆。最后是老年人群,他们可能缺乏清晰判断的能力(例如痴呆),但仍然必须服用各种药物。事实证明,记录每位患者服用的药物仍然是一项容易出错的任务。最常见的错误发生在从家庭护理到医院的过渡期间(换句话说,在住院期间),遗漏家庭医疗是最常见的错误。

药物识别

作者指出,药物识别可分为两个部分。1)创建患者服用的药物的黄金标准列表,2)将该黄金标准列表与列出患者药物历史的其他可用来源进行比较。作者还指出,临床术语缺乏标准化使得药物识别具有挑战性。成功的系统可以在本地建立(意味着一个机构有自己的版本或程序来处理这些问题),但这种方法使解决方案与其他医疗保健机构不兼容。

用药对账和电子病历

2005 年,联合委员会宣布成功的药物治疗和解是他们的第八大目标。创建药物列表的第一阶段称为入院前药物列表(PAML),将该列表传送给其他医疗保健提供者的第二阶段称为出院药物调节(DMR)。当在 EHR 系统中被很好地采用时,该过程可以被自动化。

纸质用药对账

在卫生保健机构没有采用电子系统来交换信息的情况下,可以通过首先与患者(或他们的护理人员)交谈以了解他们正在服用的药物的名称来执行基于纸张的药物调节。然而,与电子方法相比,纸质方法可能缺乏准确性,并且更新列表的能力可能有限。

遗言

我相信这也是网络组件和人工智能系统可以创造效率的另一个领域。

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

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

参考

  1. 威特曼、布朗、s .、&波切利出版公司(2010 年)。对临床工作人员和信息系统的药物调节问题和经验的回顾。应用临床信息学,01(04),442–461。doi:10.4338/ACI-2010–02-r-0010
  2. Barnsteiner,J. (2008 年)。药物调和。美国卫生保健研究和质量局。从https://www.ncbi.nlm.nih.gov/books/NBK2648/取回
  3. (2018).Jointcommission.org。检索于 2018 年 5 月 21 日,来自 https://www.jointcommission.org/

[论文摘要]对基于反向传播的可视化的复杂行为的理论解释

原文:https://towardsdatascience.com/paper-summary-a-theoretical-explanation-for-perplexing-behaviours-of-back-propagation-based-220083d7dddd?source=collection_archive---------5-----------------------

GIF from this website

我实际上也对这个想法很好奇,反向传播张量是什么样子的?关于这些张量我们能了解到什么?如果我们研究这些,我们有可能最终理解神经网络是如何学习的吗?这篇论文是我第一次读到这些话题。

请注意,这篇文章是为了让未来的我回顾并记住这篇文章的内容,而不是阅读整篇文章。

摘要

为了可视化和理解卷积神经网络(CNN)是如何学习的,引入了引导反向传播( GBP )和去卷积网络( DeconvNet ),但是在证明它们的行为时,一些理论丢失了。作者声称 GBP 和 DeconvNet 正在部分地进行图像恢复,因此与网络决策过程无关。

简介

由于深度学习在自动驾驶汽车等危险情况下的使用越来越多,理解模型的内部工作变得至关重要。如上所述,已经引入了一些可视化反向传播的方法,但是这些方法真的回答了网络内部正在学习什么的问题吗?

GBP 和 DeconvNet 给出了比显著性映射技术更好的图像分辨率,然而,尽管类别不同,由它们的方法产生的可视化通常保持相同。(因此,在分辨率质量和指出图像中哪个位置被认为对网络重要之间可能会有一个折衷。)

本文提供的实验表明,GBP 和 DeconvNet 本质上是在进行(部分)图像恢复,而不是突出显示与类别相关的像素或可视化学习到的权重,这意味着原则上它们与神经网络的决策无关

基于反向传播的可视化

在这里,本文讨论了不同的方法之间的差异可视化的梯度反向传播和所有这些可以总结在一个图像。(我理解为显著图→正常背道具,Deconv →反向激活,GBP →两者结合)

作者还为每种方法提供了良好的可视化效果。(通过观察它们,我们可以观察到来自 GBP 的结果非常清晰。)

的确,为了成为一个好的可视化,人类的可解释性是非常重要的。然而,作者指出,GBP 和 DeconvNet 产生如此清晰的图像的原因是因为它们修改了真实的梯度,因此当模型试图执行分类时,阻碍了对哪些像素是重要的了解。

理论解释

论文的这一部分涉及大量的数学知识,因为它不仅解释了前馈运算,还解释了非常简洁的方程中的反向传播。所以现在就下结论,我们可以注意到一些事情。

  1. 显著图和去卷积可视化都应该产生随机噪声,传达关于输入图像和类逻辑的很少信息。
  2. 然而,对于更复杂的模型,DeconvNet 的行为不像显著性映射。
  3. 在一个简单的模型(如 3 层 cnn)中结合 backward ReLu() GBP 实际上可以近似地恢复原始图像。当我们希望了解网络的内部运作时,这是不可取的。旁注:当我们希望可视化清晰时,本地连接是非常重要的属性。

理论解释:更真实的模型/预训练模型

在这里,作者引入了最大池操作,并修改了原始方程,以适应更现实的 CNN 架构/预训练模型,并发现了三个重要的发现。

  1. 在更真实的设置行为中取消配置,如英镑
  2. 增加深度不会改变 GBP 和 DeconvNet 的行为。
  3. 即使在预先训练的模型中,GBP 和 DeconvNet 可视化也不区分类别。

实验

作者提供了用三种不同类型的网络进行的实验的结果:a)三个 CNN 层网络,b)三个全连接网络,c) VGG-16 网络。

如上所述,GBP 产生的图像非常清晰,任何人都可以分辨出这是 cat。(美国有线电视新闻网和 FCN)。

此外,在简单的 CNN 网络以及 VGG-16 网络中添加 max-pooling 层之后,我们可以观察到 DeonveNet 开始产生更易于人类理解的图像,这证实了理论分析。作者还对网络深度的变化进行了不同的实验,发现基于反向传播的方法的行为没有改变。

最后,作者给了网络一个对抗性的输入,看看它如何影响可视化。理论上,它应该显著地影响显著性映射,因为中间层的预测类别标签和触发状态都已经改变。然而,没有太多的图像恢复任务。如上所述,顶行是原始输入,底行是对抗输入。我们可以观察到,所得到的可视化仅针对显著性映射而改变。因此,作者得出以下结论。

请注意,作者已经用“部分训练权重的 VGG”和“平均 l2 距离统计”进行了实验,并获得了类似的结论。

结论

本文的作者提供了大量的实验,表明 GBP/DeconvNet 实际上正在执行图像恢复任务。通过反向 Relu()、本地连接和最大池的组合。因此证明需要开发更好的方法来可视化 CNN 的内部工作。

最后的话

当我们想要了解一个人时,我们需要和他有相同的看法。理解他们的观点,也许这是我们想了解 CNN 时需要做的,GBP/DeconvNet 对我们有好处,但只对我们…

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

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

参考

  1. 聂,张,杨,&帕特尔,A. (2018)。基于反向传播的可视化令人困惑的行为的理论解释。Arxiv.org。检索于 2018 年 5 月 26 日,来自https://arxiv.org/abs/1805.07039
  2. 千层面/食谱。(2018).GitHub。检索于 2018 年 5 月 26 日,来自https://github . com/Lasagne/Recipes/blob/master/examples/studentity % 20 maps % 20 和% 20 guided % 20 back propagation . ipynb
  3. (2018).Papers.nips.cc .于 2018 年 5 月 26 日检索,来自https://papers . nips . cc/paper/5485-deep-convolutionary-neural-network-for-image-convolution . pdf

[论文摘要]对抗性自动编码器

原文:https://towardsdatascience.com/paper-summary-adversarial-autoencoders-f89bfa221e48?source=collection_archive---------4-----------------------

Photo by 90 jiang on Unsplash

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

Paper from this website

摘要

本文作者利用 GAN 提出的方法制作了一个自动编码器,它通过将自动编码器的隐码向量的聚合后验概率与任意先验分布相匹配来进行变分推理。使用这种技术,它使解码器能够从先前空间的任何部分产生有意义的样本。这种自动编码器有许多应用,如分类或降维。

简介

对于创成式模型,捕获丰富分布的任务是要执行的关键任务。直到最近,许多方法,如受限玻尔兹曼机器(RBM)和深度信念网络(DBNs)都是由基于 MCMC 的算法训练的。然而,最近已经发现了能够通过反向传播直接训练生成模型的方法。(例如 VAE、重要性加权自动编码器、GAN 或 GMMM)。本文提出了一种将自动编码器转化为生成模型的新方法,称为对抗性自动编码器。主要地,自动编码器具有两个目标,重建损失以及对抗训练损失,该对抗训练损失将自动编码器的潜在表示的聚集后验分布与任意先验分布相匹配。结果,编码器学习如何将给定数据编码成先验分布,而解码器学习将强加的先验分布映射到数据分布的深度生成模型。

生成对抗网络

在一个非常简单的形式中,在一个 GAN 中有两个组件,发生器网络和鉴别器网络。鉴别器是一个神经网络,它计算数据空间中的点 x 是来自我们试图建模的数据分布的样本(正样本)而不是来自我们的生成模型的样本(负样本)的概率。并且生成器是将来自先前 p(z)的样本 z 映射到数据空间的网络。并且该模型的主要目标可以由上面看到的等式来表达。

对抗性自动编码器

如果我们让…
P(z) 是我们想要强加于潜在码的先验分布
q(z|x) 是编码分布
p(x|z) 是解码分布
pd(x) 是数据分布
p(x) 是模型分布

自动编码器功能的编码可以被认为是如上所述,基于隐藏代码向量上的 q(z) 的聚集后验分布。AAE 是一个自动编码器,它将聚合后验 q(z)与任意先验 p(z)相匹配。如下所示,为了匹配给定函数的潜在分布,可以在常规自动编码器中添加一个对立部分。当自动编码器试图重建给定的数据时,对抗方试图在自动编码器给出的分布和我们希望强加给潜在向量的分布之间进行区分。

有趣的是,自动编码器的发生器部分也是自动编码器的编码器部分。随着训练的继续,自动编码器将试图欺骗鉴别器并匹配给定数据的分布。并且在训练中有两个阶段,首先是最小化重建损失,以及网络试图匹配分布的正则化阶段。一旦训练过程完成,自动编码器的解码器将定义生成模型,该模型映射 p(z)的强加先验。AAE 编码器部分的选择包括…

  1. 确定性:其中编码器与自动编码器的结构相同,其中 q(z)中唯一的随机性是数据分布 pd(x)。
  2. 高斯后验:这是类似的 VAE,其中 q(zjx)是高斯分布,其均值和方差由编码器网络预测。在这种情况下,q(z)中的随机性来自编码器输出端的数据分布和高斯分布的随机性。(使用了重新参数化技巧。)
  3. 后验通用逼近器:我们可以使用自动编码器来训练网络的编码器分布,作为后验通用逼近器。如果我们将编码器部分设置为 f(x,n),其中 x 是输入,n 是噪声,具有固定分布,那么我们可以假设 q(z|x) = δ (z-f(x,n)),我们可以将编码器分布定义为。

在上面的情况下,我们不再需要假设编码器的分布是高斯分布(或者我们开始时的固定分布),我们可以学习任何任意的后验分布。(这可以通过直接传播错误来完成。)注意,在本文的其余部分,作者仅报告了确定性版本的结果。

与可变自动编码器的关系

虽然这项工作与 VAE 在光线匹配中的潜在向量分布相似。VAE 使用 KL 发散,AAE 使用对抗训练。

上面可以看到 VAE 的损失函数,第一项可以认为是重建项,而后两项可以认为是正则化项。然而,在 AAE,这两个正则项被对抗性训练过程所取代,该过程鼓励 q(z)匹配 p(z)的整个分布。

通过上面的例子,我们可以看到 AAE 的优越性,当在 MNIST 数据集上构造高斯分布时,我们可以看到 AAE 与 VAE 相比产生了明显的潜在空间。(以及当我们将分布设置为 10 个 2-D 高斯分布的混合物时。).两种架构的主要区别在于,对于 VAE,我们需要获得先验分布的精确函数形式,而在 AAE,我们只需要从先验分布中取样,以使 q(z)与 p(z)相匹配,这使得绘制高度复杂的分布成为可能。(瑞士卷)

与 gan 和 GMMNs 的关系

Gan 在网络输出上施加像素级的数据分布,则依靠自动编码器训练来捕捉数据分布。(这导致了更好的测试可能性)。在生成矩匹配网络(GMMN)之间,模型之间的相似之处在于它们都依赖于自动编码器来捕捉数据分布。然而,两者之间的区别在于,作者方法的对抗训练过程充当正则化器,其在从头训练自动编码器时形成代码分布;然而,GMMN/AE 模型首先训练标准的丢失自动编码器,然后拟合预训练网络的代码空间中的分布。(作者的方法能够产生更好的检验可能性。)

将标签信息并入对抗规则化

在我们知道给定数据的标签的情况下,这可以帮助我们形成 AAE 分布。(如上图。).标签的一个热编码表示连同目标分布一起被馈入鉴别器网络。这里要注意的一件有趣的事情是,在一个热编码向量中,我们保留了一个额外的空间,用于给定数据没有与之相关联的标签的情况。在正相期间,用户可以通过独热向量向鉴别器提供混合物成分的标签。并且在负相期间,用户可以通过独热向量向鉴别器提供训练点图像的标签。

使用这种技术,我们能够更好地调整给定的网络,上面的图形看起来已经很熟悉了。但是关于图 B 有趣的一点是,样式表示在每个混合组件中是一致表示的,与它的类无关。(写作风格,如右上方等…)

对手自动编码器的可能性分析

GIF from this website

在本节中,作者希望按照 GAN 论文中介绍的相同程序,测量 AAE 作为生成模型的能力。当在隐潜向量 z 中施加高维高斯分布时,作者在 MNIST 和多伦多人脸数据集上训练 AAE。(上面的 gif 显示了 TFD 的学习流形。).

考虑到目前可用于评估生成模型(如 GANs)可能性的指标存在严重缺陷,作者 AAE 仍然能够实现优于其他先进方法的对数可能性。

受监督的对抗性自动编码器

最近,生成模型成为半监督学习中最流行的方法之一,因为它们能够以一种有原则的方式将类别标签信息从许多其他潜在的变异因素中分离出来。这里作者描述了如何从图像样式信息中分离出类别标签信息。

实现这一点的方法是通过类似上面的方法,其中类标签被赋予生成器网络,因此编码器主要需要学习样式。

通过这样的学习,我们能够生成具有相同风格的图像,并且 SVHN 数据的学习风格流形可以在下面看到。

Gif from this website

结论

在这项工作中,作者提出了生成式自动编码器,它在许多不同的数据集上实现了竞争性测试可能性。此外,作者描述了如何将该方法扩展到半监督的情况。最后,作者讨论了如何使用这种方法来理清图像的风格和内容,无监督聚类,维数减少和数据可视化。(我暂时省略了三个部分,半监督,无监督,降维。)

参考

  1. (2018).Arxiv.org。检索于 2018 年 9 月 12 日,来自https://arxiv.org/pdf/1511.05644.pdf

[论文摘要]英国医院的不良事件:初步回顾性记录综述

原文:https://towardsdatascience.com/paper-summary-adverse-events-in-british-hospitals-preliminary-retrospective-record-review-4fcb1f2451bc?source=collection_archive---------9-----------------------

GIF from from website

我是从 Google Deep Mind 的健康主页上找到这篇论文“ 英国医院的不良事件:初步回顾性记录回顾 ”,想更深入的看一下,总结成一两句话。

请注意,这个帖子是给未来的自己回过头来看资料的。

摘要

本文主要研究是否有可能检测到一些不良事件,这些事件会导致患者的症状恶化甚至导致死亡。

简介

简而言之,世界各地都有病人因管理不善而生病(或有时死亡)的情况,而不是某些伤害,所有这些事件都有严重的经济后果。

方法(设计和程序)

作者回顾了来自两家不同医院的 1014 例病例,其中 26.9%的记录来自普通内科(包括老年病学),28.6%来自普通外科,27.3%来自矫形外科,17.2%来自产科。

方法(审核流程)

高度合格的护士审查病例,当记录显示阳性病例时,将其发送给分析任何不良事件并填写详细问卷的临床医生。

结果

在 1014 例病例中,有 110 例出现不良事件(当我们计算多个不良事件时,该数字增加到 119),在这 110 例病例中,有 53 例声称是可预防的。所以 53/1014 的病例中大约有 5%有不良事件,并且是可以预防的。由于这些不利事件以及 290,268 加元(518,418.65 加元)的额外费用,总共延长了大约 999 天。

不良事件示例

由于管理不善,一名 53 岁的男子在医院多住了 26 天。

讨论

总之,在这项研究中,许多造成巨大经济后果的不良事件是可以预防的。然而,作者警告读者两件事…

a)本研究主要是试点性的,有一定的局限性,只研究了两家医院的数据。

b)此外,病例组合不能准确反映医院实践。医疗保健中可能还有另一个领域会产生更多的不良事件。(或更少)

最后的话

听到一些可预防的不良事件导致患者死亡,真的很令人难过。我想知道在韩国以及全世界有多少这些不良事件没有被发现。

如果发现任何错误(因为我仍在学习,会有很多),请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。

同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣,我还在这里做了解耦神经网络的比较。

参考

  1. c .文森特、g .尼尔和 m .沃罗什诺维奇(2001 年)。英国医院的不良事件:初步回顾性记录回顾。英国医学杂志,322(7285),517–519。
  2. 不利事件。(2018).En.wikipedia.org。检索于 2018 年 4 月 10 日,来自https://en.wikipedia.org/wiki/Adverse_event

【论文摘要】独立分量分析导论:InfoMax 和 FastICA 算法

原文:https://towardsdatascience.com/paper-summary-an-introduction-to-independent-component-analysis-infomax-and-fastica-algorithms-7b44d18ab393?source=collection_archive---------9-----------------------

GIF from this website

请注意,这篇帖子是给未来的自己看的,用来回顾和复习这篇论文上的材料。

Paper from this website

摘要

本文介绍了不同于主成分分析的独立成分分析。其中优化了给定数据统计独立性。

简介

现在,进行某种数据分析是非常容易的,并且有各种各样的方法,如 pca 或因子分析。与此相关的一个重要概念是给定数据的分布,特别是分布的正态性。原因是因为这决定了某些方法在分解某些数据时是否会成功。如上所述,取决于方法和假设的分布,一些方法将成功地正确识别独立信号,而其他方法则失败。(注意 ICA 也有其自身的局限性,与排列或符号有关,但我们也有一种称为独立向量分析的方法。)

独立成分分析的理论基础

在这一节中,作者简要讨论了 ICA 的基本原理,例如寻找混合矩阵的逆的非混合矩阵。作者提出了关于 ICA 的 5 个假设。
1)来源在统计上是独立的。
2)混合矩阵为正方形,满秩。
3)不应有外部噪声
4)数据为零均值
5)源信号不得具有高斯概率密度函数。(至少其中一个。)

统计独立性

当我们有两个随机变量 x1 和 x2 时,我们可以通过下面的等式定义这两个变量之间的不相关性。

另一方面,我们可以将统计独立性定义为下面的等式。

并且在特定情况下,当联合 pdf 是高斯不相关时,不相关等同于独立。作者介绍了两种度量独立性的方法,即最小化互信息法和最大化非高斯性法。(这是相同的解决方案。)

互信息最小化

当我们有两个变量 X 和 Y 时,互信息可以被视为在观察到 Y 之后关于变量 X 的不确定性的减少。因此,通过具有寻求最小化互信息的算法,我们正在搜索最大程度独立的分量(潜在变量)。(InfoMax 是算法的名字)。

非高斯性最大化

当我们有两个变量 X 和 Y 时,我们可以通过迫使它们尽可能远离正态分布来实现独立性。为了做到这一点,我们用负熵来度量非高斯性。(这是高斯性的一个积极量度。).并且我们计算近似的负熵而不是直接计算。(FastICA 是算法的名字。)

我不打算写任何关于“如何使用 ICA 包”的东西,因为它只是使用高级 api。

示例/讨论

本文作者将三幅图像混合,采用不同的独立分量分析方法提取原始信号。

如上所述,我们可以观察到 ICA 方法能够比 PCA 更清晰地提取信号(原始图像)。此外,在执行 ICA 时,必须考虑多个概念,比如白化数据。FastICA 和 InfoMax 都很健壮,但是必须事先提供正确的分布类型。

参考

  1. (2018).Mail.tqmp.org。检索于 2018 年 9 月 4 日,来自 http://mail.tqmp.org/RegularArticles/vol06-1/p031/p031.pdf

[论文摘要]通过深度表现实现更好的混合

原文:https://towardsdatascience.com/paper-summary-better-mixing-via-deep-representations-d582e4bd1b8?source=collection_archive---------13-----------------------

Photo by Free Nature Stock on Unsplash

请注意,这篇帖子是给未来的自己看的,是为了回顾和复习这篇论文中呈现的材料。

Paper from this website

摘要

给定数据的更深层次的表示在解开变异的潜在因素方面做得更好。本文作者研究了一个相关的猜想,更好的表示,在更好的解纠缠的意义上,可以用来产生更快混合的马尔可夫链。为了更好地理解为什么会发生这种情况,作者提出了第二个猜想:更高级别的样本更均匀地填充它们占据的空间,当在更高级别上呈现时,高密度流形倾向于展开。

简介及背景

深度学习算法发现给定数据的多个级别的表示,并且通常认为更高的表示可以潜在地捕捉与兴趣分布相关的更高级别的抽象。(通过实验已经表明,增加表示的深度会有很大的好处。).较低级别的特征可以在形成较高级别的表示中被重复使用,并且随着表示的深度增加,潜在的收益变成指数级的。深度学习算法依赖于重用低级特征的想法。(这就是为什么参数共享是如此强大和有效的方法。).深度表示的另一个(很少讨论的)优点是,它可能有助于理清变异的潜在因素。(如果我们有一种算法可以轻松地分离数据,这将使进一步的处理变得容易得多。) (当我们说我们的目标是建造一台了解周围环境的机器时,这可能意味着这台机器能够理清它所涉及的因素和原因,因此在这个方向上的进展似乎很重要。)如果习得表征在解开隐藏因素方面做得很好,它甚至可以抵消维度诅咒的影响。已经进行了许多观察,深度学习算法有助于这种解开,然而,我们仍然不知道为什么或程度如何。

无监督学习算法试图捕捉给定数据分布的显著结构,而大多数深度学习算法用于学习特征,并利用它们进行分类或回归任务。由于其无监督学习的性质,一些算法可以用于生成样本,但是这可能会遇到混合的基本问题:当这些被大的低密度区域分隔时,马尔可夫链很难从一种分布模式跳到另一种模式,这是现实世界数据中的常见情况,并且是在流形假设下。(该假设指出,数据中呈现的自然类别与分布集中的输入空间中的低维区域相关联,并且不同类别的流形被密度非常低的区域很好地分开。慢速混合意味着从一种模式到另一种模式需要许多连续的采样步骤,甚至需要更多的步骤才能覆盖所有模式。).发生这种情况是因为在模式之间的低密度空隙周围跳跃是罕见的和不太可能的。

当学习算法没有给定数据的良好表示时,模型倾向于对应于更平滑和均匀的分布,将质量放在更大体积的输入空间中,特别是在模式之间。(这可以在我们生成少量图像样本时看到,它们看起来更加模糊和嘈杂。).随着模型的改进,其相应的分布在数据集中的地方变得尖锐,混合变得相当慢。由于采样对许多机器学习算法至关重要,这表明学习将会很慢或很差,甚至在某些情况下会由于学习算法的限制而停止。

为了改善混合,引入了回火。想法是使用更平滑的密度在模式之间进行快速但近似的跳跃,但使用清晰的“正确”模型在这些模式内实际生成感兴趣的样本,并允许样本在不同温度水平之间交换。

并介绍了他们的主要假设。

在更高的代表级别采样时,混合更容易。

作者的主要目的是调查这一假设,并研究为什么会发生这种情况,以及测试更具体的假设。深度生成模型产生更好的特征和更高质量的样本的想法并不新颖,并且已经被有前途的研究人员研究过。

假说

想象一个对象图像数据的抽象表示,其中一个因素是“反转视频位”,它反转黑白像素。(所以 1-x)。当默认值为 0 时,前景对象为黑色,背景为浅色。翻转比特不会改变图像的大多数其他语义特征,这些特征可以用其他高级特征来表示。然而,在每个图像级模式中,将会有一个反视频对应模式,其中该位被翻转。并且这两种模式将被输入空间中的巨大空白区域分开,使得输入空间中的任何马尔可夫链都不太可能从这两种模式中的一种跳到另一种。

相反,如果我们考虑具有“反向视频”位的更高表示,则在大多数马尔可夫链转移概率下,仅翻转该位将是非常可能的事件,因为翻转将是保持高概率的小变化。(这就是为什么 H2 会帮助解释 H1。).

在 H2 要考虑的另一个有趣的事实是解缠程度的概念。深度学习算法并不能完美地解决问题,当前的算法是分阶段进行的,在更高的级别提取更抽象的特征。(更好的理清将意味着一些习得特征与一些已知因素具有更高的互信息。).对一个因素具有高度预测性的特征对其他因素变得不变的预测性较低。(我们指的是学习解开表象的目标)。从那里我们可以考虑一个额外的假设,专门 H2。

H3 指出,高层次表示空间中的高密度流形比原始输入空间中的相应高密度流形更平滑,更容易建模。

表示-学习算法

作者使用了两种学习算法:深度信念网络和压缩自动编码器

实验

MNIST 和多伦多人脸数据库使用了两个不同的数据集,使用的网络架构见下图。

更高级别的样品

如上所述,在更深的层中生成的图像在视觉上更有可能混合得更快。此外,当作者测量生成样本的质量时,它更高。并且该观察结果与 H3(b)的观点一致,即在流形已被扩展的较高级别表示空间中移动比在原始输入空间中移动提供了更高质量的样本,在原始输入空间中移动可能很难停留在高密度区域。

通过在邻居之间插值来可视化表示空间

从上面的图像我们可以看到,在更深的层次插值给出了视觉上更可信的样本。

通过计算访问班级的数量来测量混合

从上面的直方图我们可以看到,更深的架构访问更多的类,CAE 混合比 DBN 更快。

在数据点周围占据更多的体积

此外,作者还发现,CAE 和 DBN 的高级表示中,更大比例的局部体积被可能的配置占据,例如,更靠近输入空间流形,实际数据生成分布集中在该流形附近。

辨别能力 vs 体积膨胀

人们可以认为,由于不同类别的更高级别表示彼此“更接近”,这将混淆模型,导致更低的分类准确度。然而,从上表中我们可以看出,更深层次的特征有助于更好的分类性能,尽管它们具有更好的生成能力和更好的混合。

结论

总之,已经检验了三个假设

  1. 更深的表示可以产生更好的样本和更好的混合。
  2. 这是由于更好的解开
  3. 这与数据集中的流形的展开以及良好样本在表示空间中占据的体积的扩展有关。

并且所执行的实验证实了作者的假设,在更高的水平上,获得了更好的样本和更好的混合。(即使在示例之间插值或添加各向同性噪声时)

最后的话

这张纸是金色的,但是极其难懂,我还是不懂。但总的来说,我认为这篇论文是在说明,随着深度的增加,数据的表现会更好。

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

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。

参考

  1. y .本吉奥、g .梅斯尼尔、y .多芬和 s .里法伊(2012 年)。通过深度表现进行更好的混合。Arxiv.org。检索于 2018 年 9 月 19 日,来自https://arxiv.org/abs/1207.4404

[论文摘要]医疗保健领域的大数据分析:前景和潜力

原文:https://towardsdatascience.com/paper-summary-big-data-analytics-in-healthcare-promise-and-potential-ee3fba1488ea?source=collection_archive---------7-----------------------

Gif from here

所以今天,我将总结这篇文章“ 医疗保健中的大数据分析:前景和潜力 l”,每一节都用一两句话来概括。再次,请注意这篇文章是给未来的自己看的。

Paper from this website

简介

基本上,作者说,医疗保健行业产生越来越多的数据,大数据分析有巨大的潜力。

医疗保健的优势领域

一般优势的例子:
a)更早地发现疾病,它们可以更容易地得到治疗
b)预测不同病人的住院时间
c)节省资金,避免做浪费的研究( 麦肯锡估计 3000 亿美元 )

具体好处举例:
a)临床操作: 降低患者诊断费用。

b)研究&开发: 让研究过程整体高效。

c)公共卫生: 在危机事件中更有效地处理事件

d)循证医学: 利用不同来源的过去结果(如 EMR,或手术数据)预测未来结果。

e)基因组分析: 更高效地分析基因数据或进行基因测序

f)审前欺诈分析: 分析运营数据,看是否存在欺诈

g)设备/远程监控: 分析从 IOT 设备获得的数据

医疗保健领域大数据分析的 4 个“Vs”

卷: 数据量,我们将要拥有越来越多的数据。

速度: 每个数据加起来的速度,这几天越来越多的数据进来的速度很快。

种类: 不同特性的数据,有些数据是 DICOM 格式,其他的可以是 excel 格式。

准确性: 我们对医疗保健数据进行分析的正确性。一些例子可以是手写诊断识别。

建筑框架

我们不能在一台计算机上分析大数据,我们需要某种分布式计算系统,然而,我们需要使分布式系统更加用户友好。这里可以使用的一些技术有 Hadoop 。

方法论

下面是医疗保健组织如何部署成功的大数据分析项目的分步指南表。

例题

医疗保健组织开展大数据项目的一些成功案例。

a)北约克综合医院*:改善患者预后
b)患病儿童
:*对婴儿进行分析,以防止婴儿容易发生威胁生命的“院内感染”上升

挑战

一些挑战包括可扩展性、用户友好性、安全性和可用性。(分布式系统面临的一般问题)

结论

大数据潜力巨大,但安全或政府法规等问题仍是需要解决的问题。

最后的话

很好地概述了大数据和机器学习如何使医疗保健系统普遍受益。然而,下一步是确定哪些是真正可以实施的,哪些只是炒作。

参考

  1. Raghupathi,w .,& Raghupathi,V. (2014 年)。医疗保健中的大数据分析:前景和潜力。卫生信息科学与系统2 (1)、3。
  2. 美国医疗保健的大数据革命:加速价值和创新。(2018).麦肯锡公司。检索于 2018 年 3 月 28 日,来自https://www . McKinsey . com/industries/health care-systems-and-services/our-insights/the-big-data-revolution-in-us-health-care
  3. 欢迎使用 Apache Hadoop!。(2018).Hadoop.apache.org。检索于 2018 年 3 月 28 日,来自http://hadoop.apache.org/
  4. 北约克总医院——合并医院和社区数据以推进研究。(2018).Nygh.on.ca 检索 2018 年 3 月 28 日,&郎=1
  5. 北卡罗来纳州博加特(2013 年)。大数据分析研究致力于拯救早产儿的生命。全球新闻。检索于 2018 年 3 月 28 日,来自https://global news . ca/news/696445/research-in-big-data-analytics-work-to-save-life-of-早产儿/

[论文摘要/borealisai]t-SNE 困惑的自动选择

原文:https://towardsdatascience.com/paper-summary-borealisai-automatic-selection-of-t-sne-perplexity-676a49cf2097?source=collection_archive---------12-----------------------

GIF from this website

我发现了 borealisai 的这篇论文,我立刻就想阅读它。

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

Paper from this website

摘要

T-sne 是最广泛用于高维数据的降维方法,但是它有一个超参数叫做困惑度。在这篇文章中,作者提出了一种方法,可以自动调整这个参数与忽略不计的额外计算成本。

简介

根据马滕和辛顿 t-SNE 的结果对困惑的设置是稳健的,然而,在应用中,用户必须比较来自不同困惑值的结果来选择最佳值。在选择该超参数时缺乏自动化可能会导致数据失真。

t 分布随机邻居嵌入

T-sne 通过将成对距离转换成成对联合分布,试图在低维空间中保持来自高维空间的局部邻域结构。然后使用 KL 散度来尝试匹配分布。(对于高维和低维)在等式 2 中,我们可以看到引入了困惑项,这个超参数,不严格地说,描述了每个数据点有多少个邻居。

自动选择困惑度

如上所述,随着困惑度的增加,KL 散度的损失减少,通过这一事实,我们知道,仅使用 KL 散度作为损失函数,我们将最有可能以高困惑度值结束。然而,这些高困惑值并不总是最佳的。当我们将困惑度设置为最大值(即数据点的数量)时,它无法捕捉数据中任何有趣的结构。考虑到困惑和 KL 散度之间的权衡,作者引入了下面的标准。

为了自动设置 prep 值,可以相对于 Perp 对 S 进行无导数优化,例如使用贝叶斯优化。

解释为经由伪 BIC (pBIC)的反向复杂度调谐

如上所述,在贝叶斯信息标准中,第一项测量最大似然估计模型的拟合优度,第二项通过惩罚自由参数 k 的数量来控制模型的复杂性。我们可以看到,上面的方程在形式上类似于作者的方程,并且平衡了数据拟合和复杂性。这两个方程之间的区别不是增加模型的复杂性以更好地拟合数据,而是增加困惑值,降低要建模的数据中模式的复杂性。(由于我们将越来越多的数据点视为邻居,作者还讨论了一个有趣的事实。当低估概率而不是高估概率时,KL 散度损失函数具有大的成本。换句话说,如果 p 很大,而 q 很小,KL 偏离该项就很大,但在相反的方向,小 p 和大 q,KL 不受影响。)此外,作者还将最小化某些描述长度联系起来。

利用推断的人类专家对困惑的偏好进行验证

为了检验作者方法的有效性,作者将从标准方程中选择的困惑值与专家选择的困惑值进行了比较。在各种各样的数据集上。如上所述,我们注意到,与专家选择值相比,作者公式选择的值没有太大差异。

结论

本文介绍了一种在使用 t-sne 时自动选择最佳困惑值的新方法。

参考

  1. 曹,王,李(2017)。t-SNE 困惑的自动选择。Arxiv.org。检索于 2018 年 9 月 11 日,来自https://arxiv.org/abs/1708.03229

结肠镜检查的计算机辅助诊断

原文:https://towardsdatascience.com/paper-summary-computer-aided-diagnosis-for-colonoscopy-e75485b2f283?source=collection_archive---------8-----------------------

GIF from this website

深度学习如何影响医疗保健行业的另一个伟大的用例。

请注意,这篇帖子是给未来的自己看的,回顾这篇论文上的材料,而不是从头再看一遍。此外,我没有足够的医学知识来完全理解这篇论文上的材料,然而我只是在推动自己学习。

Paper from this website

摘要

由于深度学习的最新发展,计算机辅助诊断(CAD)系统越来越受欢迎。在这些 CAD 系统中,在实时研究期间对结肠直肠息肉的自动检测和分类正在帮助内窥镜专家。这篇文章提供了这个主题的概述,特别关注证据,局限性和临床应用。

简介

不幸的是,即使经过培训,医生仍有 80%的准确率将检测到的息肉诊断为腺瘤。此外,人类在结肠镜检查中有 20%的机会漏掉息肉。为了克服这些问题,CAD 系统越来越受欢迎,以帮助医生变得更加准确。

在临床实践中,我们对 CAD 有什么期望?

在结肠镜检查筛查期间安装 CAD 系统的主要好处是:1)提高息肉检测的准确性;2)帮助培训需要提高腺瘤检测率的新手和更有经验的内窥镜专家。

技术概述

如上所述,当检测到息肉时,CAD 系统可以通过声音或其他机制警告医生,并通过标记描绘轮廓。一个有趣的事实是 ADR 增加 1%与癌症风险降低 3%相关。为了使这些系统成功,它们需要满足两个要求,第一,CAD 系统必须具有关于息肉检测的高灵敏度,第二,它们需要足够快以在实时场景中运行。

结肠直肠息肉的自动分类

通过息肉的自动检测和分类,我们可以避免增生性息肉的不必要的息肉切除术,仅在美国,估计每年节省 3300 万美元。

已经进行了许多研究来对不同组的图像进行分类,例如“ ”用于通过使用窄带成像放大结肠镜检查(具有视频)来预测结肠直肠肿瘤的组织学的计算机辅助系统。 。还有许多仍在进行中,甚至是细胞内镜检查,它使接触显微镜(× 500)能够进行体内细胞成像,是 CAD 系统产生积极影响的另一个伟大领域。(关于细胞内镜检查的一个优点是,它提供固定大小的聚焦的、一致的图像,使得 CAD 能够进行更容易和更鲁棒的图像分析。)最后,自体荧光光谱也是 CAD 系统应用的另一个领域。

深度学习的出现

检测和分类息肉的传统方法通常严重依赖于先进的医学图像,因此在实时场景中,它们很难很好地执行。然而,深度学习方法,如 CNN,对噪声和方差更加鲁棒,这使它们在现实生活应用方面具有优势。

临床研究

如上所述,已经有许多使用 CAD 系统来执行息肉的自动检测和分类的情况。每项研究使用不同的方法获得不同的准确性。

我们需要什么样的证据?

虽然已经有很多研究,我们仍然需要更多的证据,如实时检测和分类的前瞻性研究,随机试验,以及解决 CAD 模型的潜在有害影响。

要解决哪些问题?

总结一下我们仍需克服的一些技术问题。
1)需要更多数据,用于结肠镜检查的 CAD 系统中使用的最大图像量约为 6k,这在当今的标准中并不算多。
2)对于 CAD 系统,我们还需要讨论一些法律问题,但是目前这些问题还没有得到解决。
3)在将 CAD 系统应用于结肠镜检查之前,应该有用于实施 CAD 系统的更严格的路线图。

结论

总之,深度学习的进步显示了改进 CAD 系统的良好迹象,但是我们需要克服四个障碍。
1)医学专家和计算机科学家之间的合作
2)为成功的培训获取大量数据
3)通过严格的临床试验评估 CAD
4)法律和保险报销问题

最后的话

这些系统很酷,我希望有一天能实现这个系统。

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

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

参考

  1. (2018).[在线]见:https://www . research gate . net/publication/317147787 _ Computer-aided _ diagnosis _ for _ colonels【2018 年 7 月 5 日获取】。
  2. 竹村 Y,e. (2018)。利用窄带成像放大结肠镜检查预测结肠直肠肿瘤组织学的计算机辅助系统(带视频)。公共医学——NCBI。Ncbi.nlm.nih.gov。检索于 2018 年 7 月 5 日,来自https://www.ncbi.nlm.nih.gov/pubmed/22196816

【论文摘要】具有自适应计算图的卷积网络

原文:https://towardsdatascience.com/paper-summary-convolutional-networks-with-adaptive-computation-graphs-d3dcad10f565?source=collection_archive---------11-----------------------

GIF from this website

我总是对不同类型的网络体系结构感兴趣,本文介绍了非常特殊的网络体系结构。

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

Paper from this website

摘要

神经网络通常有一个固定的结构,但它真的必须如此吗?在某一层之后,网络可能已经非常确信它正在图像中看到一只狗或一只猫,但是由于固定的结构,它必须使用所有的层,这可能损害它的性能。本文提出了一种新的网络算法——具有自适应计算图的卷积网络。与具有较少参数的 ResNet 34 相比,它在 Imagenet 数据上实现了更好的性能,并且对对立的例子更健壮。

简介

卷积神经网络不仅用于分割,还用于各种其他领域,众所周知,网络越深入,网络的性能就越好。关于这些网络的一个共同事实是,它们都是与输入图像无关的固定模型。然而,已经证明有些层对网络性能的贡献不是很大,现在要问的问题是…

我们真的需要一个固定的卷积网络结构吗?或者,我们可以根据输入动态地组装一个网络图吗?

本文提出了具有自适应计算图的卷积网络。而且大致思路可以看上面。一个挑战是,每个选通单元需要对是否使用下一层做出离散的决定,并且直接通过反向传播训练网络是困难的。因此,作者基于最近的工作,即离散随机节点的可微近似。这种架构的结果是网络的诞生,它能够为不同的高级类别生成不同的计算图。

相关工作

作者在这篇论文上的工作实际上涉及多个领域,如神经网络组成(通过构建计算图)、神经网络的自适应计算时间(通过动态计算时间)、带有随机噪声的正则化(通过丢弃某些层)和注意机制。(通过选择特定的重要层来组装计算图。)

适应性 / 适应性计算图

首先,每个卷积层可以用数学方法表示如下…

秒 resnet 可以表示如下…

并且自适应 resnet 可以表达如下…

一个重要的注意事项是,上述公式看起来类似于高速公路网络(如下所示),但注意自适应图网络不必执行每一层。

现在让我们来谈谈这个网络的核心,也就是门控单元。这个单元非常重要,因为它必须理解输入数据,进行离散决策,并且易于执行。因此,作者提出了具有两个组件的门单元,第一个组件估计下一层应该被执行的概率,第二个组件获取估计的概率并从中抽取离散样本。(大致思路见上图。)

如上所述,在被传递到门单元之前,特征图通过在通道尺寸上的全局平均汇集而被缩小。(所以现在 dim 是 11C)。

接下来,该特征图被馈送到一个小全连接网络中,以产生一个二维向量,每个向量分别代表计算和跳过下一层的对数概率。之后,他们使用 Gumbel-Max 技巧,特别是其最近的连续松弛,来执行离散操作。(是否跳层。)所以作者在这里做了一件聪明的事。(为了清楚起见,上面的 beta 项被设置为 alpha。)

g 是一个遵循 Gumbel 分布的随机变量,在前馈操作中,它们使用上述函数。但是,在 back prop 期间,它们使用 softmax 函数。(特别是一个可微分的函数)。

注意,如上所述,根据 T 项,softmax 函数可以被视为 argmax 函数。值得注意的是,作者只能将方程 7 用于前馈操作和反馈操作,但通过实验,他们找到了最佳配置。

训练学员

由于新颖的结构,作者不得不引入额外的损失函数。有三件事需要考虑,1)网络可能学会使用所有的层,2)一些层可能消失,3)减少批量大小。作者首先使用传统的多类逻辑损失函数,此外,他们还引入了目标率损失(见下文)函数。

其中 z 表示层 l 在一个小批中执行的次数,t 是目标速率。因此,结合这两个损失,我们获得如下。

此外,为了成功训练,网络被初始化(最初)为偏向于门的打开,并且门控单元的学习速率被降低。

实验

  • notes Adanets in which all layers are executed and their output is scaled by the expected execution rate

作者从 Resnet 110 创建了 Adanet 以及创建了 wide Adanet,并且他们使用了权重衰减为 5e-4 的动量优化器,具有 350 个时期和 256 个小批量。如上表所示,我们可以看到,在减少计算时间的同时,改进算法能够优于不同的 Resnet 算法。

为了研究网络如何分配计算,作者绘制了不同类别图像的执行速率。从上面我们可以看到,下采样层是至关重要的,wide Adanet 显示了类之间更多的变化,这表明更多的容量可能有助于各个层专注于数据的某些子集,并且大多数类间变化来自网络的后续层。

接下来,作者在 Imagenet 数据集上测试了 Adanet,如上所述,Adanet 能够降低计算成本。值得注意的是,Adanet 的性能优于 Resnet 34,Resnet 34 的参数更小,但计算代价更大。

绘制执行速率图时,作者能够观察到更大范围的执行速率(第 9 层和第 10 层很少用于某些类),下采样层/最后一层至关重要,在后面的层中,人造物体与动物的执行速率有显著差异。

当我们绘制前 30 个时期不同层的执行率时,我们可以直接观察到这些层迅速分成关键层和不太关键的层。

当我们绘制一个直方图,显示不同类别使用了多少层时,我们会得到类似上面的结果。平均执行 10.81 层,标准偏差为 1.11。然而,如上所述,鸟的图像比消费品的图像少用一层。(超级有趣)。

对抗攻击的鲁棒性

为了知道特殊化层如何执行对抗攻击的效果,作者使用快速梯度符号攻击来创建对抗示例,并将其提供给网络。(作者还对创建的对抗实例进行了 JPEG 压缩防御。).如上所述,自适应算法对常规结果更健壮。

接下来,为了观察对立的例子是否影响不同层次的执行率,作者绘制了常规鸟图像和对立的鸟图像的执行率条形图。我们可以看到执行率并没有受到太大的影响。

结论

总之,本文作者介绍了一种新的网络体系结构,称为 Adanets。其具有根据输入数据学习要执行哪些层的能力。通过多次实验,作者发现这种类型的体系结构不仅性能优于常规的 resnets,而且对恶意攻击也更具鲁棒性。

遗言

非常聪明和新颖的建筑设计,我特别惊讶地知道网络是如何区分人造物品和动物的。

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

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

参考

  1. (2018).Arxiv.org。检索于 2018 年 7 月 19 日,来自https://arxiv.org/pdf/1711.11503.pdf
  2. Veit,a .,& Belongie,S. (2017 年)具有自适应计算图的卷积网络。Arxiv.org。检索于 2018 年 7 月 19 日,来自https://arxiv.org/abs/1711.11503

[论文摘要]——深度思维健康:共同设计深度思维健康的患者和公众参与(PPIE)策略

原文:https://towardsdatascience.com/paper-summary-deep-mind-health-co-designing-a-patient-and-public-involvement-and-engagement-75f811cb08a5?source=collection_archive---------8-----------------------

Gif from this website

我已经知道 DeepMind 的存在,任何一个人工智能迷都会知道阿尔法围棋,一个阿尔法零的存在。但我想更多地了解 DeepMind 健康部门和他们的理念。所以我决定读一读它们(并总结一下),摘自 Mustafa Suleyman 和 Rosamund Snow 的论文“共同设计一个病人和公众参与 DeepMind Health 的参与(PPIE)策略,安息吧…

请注意,这个帖子是给未来的自己看的。

介绍信

Deep Mind 是通过机器学习来解决社会最大的问题的,他们确实取得了一些伟大的成就。特别是检测早期急性肾脏退化和提高视网膜扫描上威胁视力疾病的诊断。下面是他们九月份的活动。

注意这是一个两小时的视频

简介

许多卫生组织不接受病人的贡献。因此,当允许(并要求)患者和护理人员发表意见时,有许多领域可以改进。一个令人惊讶的事实是,即使是为了深度精神健康,当他们向世界公布他们的项目清单时,他们也受到了审查。

PPIE 长什么样好

就像公司试图听取客户的反馈以改进服务或产品一样,医疗保健组织也必须倾听患者(或护理人员)的意见以提高服务质量。然而,如果他们与他们的病人作为一个团队来建立它,它可能会更有效。同样,病人的意见似乎没有得到重视,确保病人得到平等对待(在许多方面)是迈向良好 PPIE 的一步。

我在 DeepMind Health 学到了什么

Rosamund 了解到,在 DeepMind 中,他们将患者作为一个团队来打造产品和服务。他们不是为他们而建,而是和他们一起建。然而,保持这种开放性是非常重要和具有挑战性的任务。

主要建议(供咨询活动中进一步讨论)

Rosamund 提出了八个可以改进的关键点,如让患者领导、创建患者小组、执行患者建议的项目以及创建患者测试小组。但是,可以简化为一句话,“T3”在每一级临床医生都有影响力的地方,保证患者也是如此。

最后的话

作为一个医生的儿子和一个经常生病的人。我真的很喜欢读这篇论文,并学到了很多东西。

如果你想看我所有作品的列表,请点击这里查看我的网站。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我还对医学图像进行了分割,在这里查看一下。

参考

  1. AlphaGo Zero。(2018).En.wikipedia.org。检索于 2018 年 4 月 6 日,来自https://en.wikipedia.org/wiki/AlphaGo_Zero
  2. AlphaGo | DeepMind。(2017).深度思维。2018 年 4 月 6 日检索,来自https://deepmind.com/research/alphago/
  3. 与美国退伍军人事务部一起研究病人病情恶化。(2018).深度思维。检索于 2018 年 4 月 6 日,来自https://deep mind . com/blog/research-department-veterans-affairs/
  4. 霍布斯,A. (2018)。一只眼睛的人工智能:DeepMind 专注于眼疾诊断|商业互联网。商业互联网。检索于 2018 年 4 月 6 日,来自https://internetofbusiness . com/deep mind-ai-eye-disease-diagnostics/
  5. DeepMind Health 患者和公众参与活动。(2018).YouTube。检索于 2018 年 4 月 6 日,来自https://www.youtube.com/watch?v=wBfBiD38x34

【论文摘要】基于好奇心的内在动机引发结构化行为

原文:https://towardsdatascience.com/paper-summary-emergence-of-structured-behaviors-from-curiosity-based-intrinsic-motivation-3d2b49f516f1?source=collection_archive---------6-----------------------

GIF from this website

我从 Carlos E. Perez ( 自我意识深度学习中的自我运动)的一篇博客文章中看到了这篇论文,我立刻就想读它。另外,如果你有时间,我强烈建议你阅读这篇博文,因为它非常有趣。

请注意,这篇文章是为我未来的自己写的,目的是回顾这篇论文上的内容,而不是从头再看一遍。

Paper from this website

摘要

婴儿是在非结构化环境中产生新的结构化行为的专家,在这种环境中没有明确的奖励系统。(我不知道这到底是什么意思,但一般来说,我的理解是,当婴儿出生时,他们通过观察周围的人或事物开始不断学习。他们慢慢地但肯定地获得了世界是如何在他们周围构建的知识。问题是,当婴儿学习时,没有明确的解释或奖励系统,但不知何故,他们或我们能够学习。)

作者通过使用神经网络复制了这些能力,神经网络是一种由好奇心驱动的代理。

简介

从出生的那一刻起,我们人类就擅长驾驭我们的环境。(而这些环境可以是随机的、自发的、缺乏一般结构的。)换句话说,我们非常擅长模拟我们周围的世界,谢天谢地,与最先进的机器人相比,即使是婴儿在这方面也做得更好。(所以他们还没有接管世界。)

但是主要的问题是我们怎样才能学会这样做?总的来说,我们有非常强大的内置系统(如物体注意/定位和数字感等),帮助我们完成对周围世界建模的任务。另一个想法(本文研究的)是,我们的动机是对周围世界的好奇。以及通过探索新任务(其中的任务是新颖的,但仍然可以理解)。)我们能够围绕我们的周围开发出一个非常好的模型。这里要指出的另一个重要事实是循环的概念,一旦我们习惯了这个任务,我们就会寻找更多新的令人兴奋的东西。由于这种循环,我们能够将我们的模型发展成更复杂的模型,所以这是自我监督的学习。另外,作者介绍了“婴儿床里的科学家”这个主题,我找到了一个与这个主题相关的好视频。(见下图)

Video from ECETP

最后,作者介绍了论文的主要主题,其中他们创建了一个由基于好奇心的内在动机驱动的代理。

神经网络 A →训练预测代理行为的结果
神经网络 B →训练对抗挑战模型的当前状态(代理策略)(我猜这就是作者所说的好奇心)

通过成功地训练所有的网络,作者证明了创造一个能够理解自我产生的自我运动的代理是可能的,在这种运动中,他们有选择地关注、定位和与物体互动,而不必内置任何这些概念。

代理架构和环境

作者使用 Unity 来训练一个智能体,其中它有一个世界模型,试图理解智能体周围世界的动态,还有一个损失模型,试图逼近未来时间戳的世界模型损失,以对抗世界模型的学习。最后,作者没有加载任何预先训练的权重,使代理从零开始学习。

交互环境

在这一节中,作者描述了实验是如何设置的。例如,代理是一个正方形房间中的球体,它接收离散时间戳中的 RGB 图像等……此外,作者还详细介绍了他们如何定义状态空间(在时间戳 t 和 t -1 捕获的图像)和动作空间(x,y,z 力/扭矩和向前/向后运动)。

世界模特

(这部分对我来说很难,因为我不知道什么是广义动力学问题。)首先,给定状态和动作的历史片段(H ),有两个函数。A(H) →输入映射函数// T(H) →真实映射函数并且其中一个神经网络正在尝试将 A(H)映射到 T(H)。总之,代理正试图学习一个与真实世界相似的世界模型。最后,作者强调他们把问题公式化为逆动力学预测。与其预测未来,不如填写缺失的动作。

损失模型

在这一节中,作者描述了他们如何创建一个损失模型。它由卷积神经网络构成,在 CNN 的最后几层增加了多层感知。他们使用 softmax 交叉熵损失进行分类。然而,我现在还不能 100%确定有哪些不同的职业。(所以我将不得不学习更多的 RL 并回到这个问题上来,如果任何人确切地知道他们在谈论什么,请在下面评论。)

行动策略

在这里,作者描述了模型的动作策略。我们知道,当给定 T 中的状态以及建议的下一个动作 a 时,损失函数能够为我们提供 T(概率分布)。似乎作者创造了另一个函数σ,它接受这些分布并给出一个实值。接下来,我们将通过一些β项来缩放真实值,最后取最终结果的指数。(这部分和损失模型对我来说很难理解。)

实验

实验从将试剂随机放置在 10*10 平方的房间中开始。(有一定的播放距离,场景每 8000 到 30000 步重置一次。).关于这个实验的一个非常有趣的事实是,随着(一个代理可以与之交互的)对象数量的增加,代理实际上更喜欢与所有的对象进行交互。(我猜这就是好奇心的动力来源,例如,在玩了圆形之后,代理可以移动到球形,然后移动到三角形。因为它是由新的令人兴奋的形状等激发的。)最后,作者将学习权重/好奇心策略(LW/CP-40)与随机权重/随机策略(RW/RP)和学习权重/随机策略(LW/RP)进行了比较。

自我运动学习

如上所述,RW/RP(绿线)不能很好地学习,损失值很高。LW/RP 能够快速收敛到一个较低的值,因为它从一个恒定的随机分布中学习,而没有对抗性的策略。(无对抗性政策)。但是 LW/CP-40 是两者的混合,首先它能够收敛到一个较低的值,但是由于敌对政策,损失增加。

物体注意的出现

随着 LW/CP-40 损失值的增加,其目标播放频率也增加,如上所示。(出于好奇)。我们可以观察到其他权重和策略根本不与对象交互。

改进的逆动力学预测

如上所述,当作者测量不同代理在 1)自我运动确认损失 2)对象动作上的表现时,我们可以清楚地观察到 LW/CP-40 优于这两个任务。(不是因为自我运动验证损失,因为 LW/RP 也具有相当低的值。)

改进的目标检测和定位

此外,为了证明 LW/CP-40 在目标定位和存在方面的性能优势,他们训练了一个线性/逻辑回归模型。(训练/验证数据都来自代理所处的环境。)如上所述,LW/CP-40 策略具有最低的误差,表明代理能够学习更好的视觉特征。

导航和规划

此外,为了证明代理的导航和规划能力,作者已经可视化了损失地图,如上所示。当红色区域表示更多更高的损失时,接受过 LW/CP-40 政策培训的代理将实际采取更接近目标的行动。(非常有趣,尽管错误率很高,但代理实际上会朝那个方向移动…)

多对象交互的出现

最后,即使对于两个对象交互实验,我们也可以观察到,在 LW/CP-(40 或 20)策略上训练的代理倾向于与不同的对象进行交互。(而且他们似乎更乐于接受学习新东西的想法。)具体来说,我们可以看到 LW/CP-40 策略比 LW/CP-20 策略更好地学会了使用 2 个对象。

讨论及未来工作

总之,作者能够创建一个由好奇心驱动的代理,通过自我监督学习系统,代理能够适应周围的复杂世界。例如,在开始时,代理人集中精力学习自己的自我运动的动力学。之后,它开始学习物体的存在或定位,因此放弃了无聊的自我运动预测任务,接受新的挑战。

此外,作者还指出了当前工作的一些不足之处。(例如适当具体化的带有手臂的代理,以模拟更真实的交互或更好的策略等)

遗言

作为强化学习的初学者,我发现这篇论文上的材料非常难掌握。我迫不及待地想深入研究 RL 😄。另一篇与这个主题相关的好论文是“学习使用内在激励的自我意识代理 s”

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

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

参考

  1. 自我意识深度学习中的自我运动-直觉机器-媒介。(2018).中等。检索于 2018 年 6 月 17 日,来自https://medium . com/intuition machine/ego-motion-in-self-aware-deep-learning-91457213 CFC 4
  2. 北达科他州哈伯市、姆罗卡特区、飞飞市和亚明斯特区(2018 年)。基于好奇心的内在动机的结构化行为的出现。Arxiv.org。检索于 2018 年 6 月 17 日,来自 https://arxiv.org/abs/1802.07461
  3. 婴儿床里的科学家。(2018).YouTube。检索于 2018 年 6 月 17 日,来自 https://www.youtube.com/watch?v=HnRVbWsqHLw
  4. (2018).Arxiv.org。检索于 2018 年 6 月 17 日,来自https://arxiv.org/pdf/1802.07442.pdf
  5. 团结。(2018).团结。检索于 2018 年 6 月 18 日,来自https://unity3d.com/

论文摘要:对下游和语言探测任务中句子嵌入的评估

原文:https://towardsdatascience.com/paper-summary-evaluation-of-sentence-embeddings-in-downstream-and-linguistic-probing-tasks-5e6a8c63aab1?source=collection_archive---------5-----------------------

分解一篇论文,分解不同句子嵌入的一些利弊

一句话嵌入什么?

不久前,我写了一篇关于单词嵌入的文章,介绍了我们为什么使用单词嵌入以及一些不同类型的单词嵌入。我们可以把句子嵌入看作是提取的下一个层次:句子的数字表示!

但是就像我们不想用简单的数字表示单词一样,我们也希望我们的句子表示包含丰富的含义。我们希望他们能对词序、时态和意义的变化做出反应。

这是一项艰巨的任务!有一些方法可以做到这一点,但是最近,“下游和语言探测任务中的句子嵌入评估”决定尝试解开“句子嵌入中有什么?”这个问题在这篇文章中,他们不仅研究了差异句子表征在受益于句子表征的下游任务中的表现,还研究了在纯语言任务中的表现(根据语言特征和规则显示句子智能表征的任务)。

这篇论文就是我们在本帖中解剖的!

不同的句子表征

那么评估了哪些表示呢?

  • ELMo (BoW,all layers,5.5B):来自 AllenNLP ,这是预先训练好的 ELMo 嵌入。这是在 5.5 亿单词语料库(维基百科和单语新闻抓取的组合)上训练的英语表示。因为 ELMo 有两层,所以这种表示是总共 3072 个维度的所有层输出。ELMo 只是一个单词嵌入,所以这种表示是通过将所有单词平均在一起为句子创建的。
  • ELMo (BoW,all layers,original):ELMo 的另一个变体,但只是在新闻抓取方面受过训练。同样,它的维度为 3072。
  • ELMo (BoW,顶层,原始):ELMo 的另一个变体,只有最终输出。这个嵌入只有 1024 维。
  • 快速文本(鞠躬,普通爬行):从脸书,我们得到快速文本。我之前的单词嵌入谈到了为什么 FastText 非常棒,但是因为它只是单词嵌入,所以通过对所有单词进行平均,这些被转换为句子嵌入。它有 300 个维度。
  • GloVe (BoW,Common Crawl): GloVe ,像其他单词嵌入一样平均在一起。它有 300 个维度。
  • Word2Vec (BoW,Google News): Word2Vec ,一起平均。它有 300 个维度。
  • p-mean(单语):一种不同的单词平均方式, p-mean 可通过 TensorFlow Hub 获得。然而维度是巨大的,达到 3600。
  • 跳过思考:我们看到的第一个实际的句子嵌入。Skip-think使用 word2vec 方法根据当前句子预测周围的句子。这是通过编码器-解码器架构实现的。这是我们最大的代表,有 4800 个维度。
  • InferSent (AllNLI):脸书训练的另一组嵌入, InferSent 使用语言推理的任务进行训练。这是一个数据集,其中两个句子放在一起,模型需要推断它们是矛盾的,中性的配对,还是蕴涵。输出是 4096 维的嵌入。
  • USE (DAN): Google 的基本通用句子编码器(USE),通过 TensorFlow Hub 可以获得深度平均网络(DAN) 。使用 512 维的输出向量。
  • 使用(变压器):最后,谷歌的重型使用,基于变压器网络。使用 512 维的输出向量。

模型的训练和维度总结如下:

下游任务

本文的下游任务取自 SentEval 包。它们以五组任务为特色,这些任务被确定为对句子嵌入有帮助的关键任务。这五个组是:二元和多类分类、蕴涵和语义相关度、语义文本相似度、释义检测和字幕图像检索。

这些类别给出了我们试图使用这些嵌入的任务类型的见解(如果你好奇,你应该检查一下这个包),然而,它们包含了所有经典的任务,如情感分析、问题类型分析、句子推理等等。

分类任务的完整列表及示例可在此处查看:

和语义相关的任务可以在这里看到:

为了评估这些嵌入的好处,使用了简单的模型。这意味着具有 50 个神经元的简单多层感知器、逻辑回归或其他非常基本的模型。这里没有花哨的 CNN。没有 RNNs。只是一些基本的模型来看看这些表现如何公平。

语言任务

同样取自 SentEval,有 10 个探测任务被用来评估句子嵌入的不同语言特性。这些很酷。他们是:

  • 二元移位:两个词是否颠倒
  • 坐标倒置:给定两个坐标从句,它们是否倒置?
  • 宾语号:宾语是单数还是复数?
  • 句子长度
  • 语义奇数人出:随机名词/动词可能被替换。检测它是否已经。
  • 主语号:主语是单数还是复数?
  • 过去时:主要动词是过去时还是现在时?
  • 顶层成分:顶层语法模式的类别是什么?
  • 语法树的深度:被解析的语法树有多深?
  • 单词内容:句子中编码了一千个单词中的哪一个?

这里的想法是,句子嵌入不仅应该在下游任务中表现良好,它还应该编码这些关键的语言属性,因为它们将有助于产生智能和可解释的嵌入!

下表总结了这一切:

结果呢???

嗯…没有明显的赢家!

ELMo 在 5/9 的任务中表现最好。USE 在产品审查和问题分类任务中表现出色。InferSent 在释义检测和推断任务上表现出色。

虽然 p-mean 没有超过顶级表现者,但它确实超过了所有基线单词嵌入,如 word2vec、GloVe 和 FastText。

以下是分类的下游结果:

和语义相关度:

信息检索是另一个大测试(根据前 n 名中检索到多少正确结果来评分,其中 n 是一个整数)。InferSent 实际上表现最好,尽管 ELMo 和 p-mean 是其他势均力敌的竞争者:

至于语言探索,ELMo 又一次表现得很好,尽管其他表现也没有落后太多。所有语言探索任务的结果可以在这里看到:

那么这意味着什么呢?正如作者所说,这意味着我们还没有真正拥有一个坚实的通用句子编码器。没有一个句子嵌入在每项任务中都表现最佳,我们仍然可以通过语言探索和测试学到很多东西。

对我来说,这意味着这个领域仍然是成熟的探索!我们还没有实现一个奇妙的句子嵌入,尽管这些都是可靠的模型。现在轮到我们走出去,尝试我们自己的嵌入想法的句子了!

如果你喜欢这篇文章或者觉得它有任何帮助,为什么不发给我一两美元来资助我的机器学习教育和研究呢!每一美元都让我离成功更近一步,我永远心存感激。

原载于T5【hunterheidenreich.com】

[论文摘要]上下文无关注意算子的进化设计

原文:https://towardsdatascience.com/paper-summary-evolutionary-design-of-context-free-attentional-operators-85b0cc2df9cd?source=collection_archive---------11-----------------------

GIF from this website

让我们做一个简单的实验,见下图。

你的眼睛最关注哪个区域?蓝色的商店标志还是电话亭?甚至棕色的墙壁。向下滚动一点,我给你看另一张图片……

更多

更多

更多

更多

更多

是你眼睛最关注的圆圈区域吗?对我来说肯定是。我们关注这些地区有什么原因吗?我们能预测人类会最关注哪个区域吗?甚至围绕它开发一个框架?本文提出了一个示例框架。

Paper from this website

摘要

在这篇论文中,作者介绍了一个模仿灵长类动物视觉注意系统的框架。这个框架不仅考虑了心理物理学方面的原因,也考虑了数学方面的原因。通过应用一组注意力算子,每个图像被转换成表示该图像的感知重要性的图。

简介

当我们看一幅图像,(或一个场景)时,我们认为我们在看一切,但我们真的不是。我们周围的信息中只有很少一部分能真正解释我们的行为。目前,我们有大量的证据支持引导我们视觉注意系统的双组分系统。

1。自下而上的图元组件 →纯图像刺激
2。自上而下组件 →认知控制

在本文中,作者将模拟一个自下而上的注意系统。在这个主题上已经有了先前的工作,例如选择性视觉注意力的' '转移:朝向潜在的神经回路 '或用于定义视觉感兴趣区域的' 算法:与眼睛注视 的比较。一个有趣的发现是,图像局部中特定特征的强度本身并不能保证人们的注意力会被吸引到该图像区域。例如,如果一幅图像有很大的变化,那么我们将主要关注同质区域,即变化较少的区域。所以换句话说,彼此不同的区域会获得人类更多的关注。最后,虽然有不同的方法来模仿人类的视觉注意机制,但似乎有一个重叠的区域,在那里他们开始从给定的图像中提取较低层次的特征。

型号

在本节中,作者描述了该模型的 4 个关键组成部分。

  1. RGB 图像被分为强度/色调/方向通道(这是通过应用方向的 Gabor 滤波器完成的)。)
  2. 非线性滤波运算符,用于响应引起更多关注的信号。(这些滤波器是通过随机搜索由局部范围的二次沃尔泰拉滤波器组成的函数空间找到的。)和过滤器的结构可以在下面看到。

其中 S 代表滤波器起作用的区域。h 的参数通过遗传算法优化确定。看到成本函数

SI → 香农自我信息测度
D →图像 I 对应的实验密度图

3.信息操作者接受高级特征,并将其放入更准确地反映人类视觉系统可能预期的响应的域中。

4.将每个通道的平均运算转换为一个单一输出。

这种架构不同于其他架构的原因是 1)定制过滤器的训练和 2)包含信息操作符。

结果

如上所述,我们可以看到该模型运行良好,并对人类可能最关注的地方做出了很好的预测。黄色圆圈代表置信度最高的地方,下面是不同图像的结果。

讨论

这篇论文的作者能够成功地创建一个模仿人类视觉注意系统的模型。

最后的话

这篇论文令人印象深刻的一点是,这篇论文发表于 2003 年,当时深度学习甚至还不存在。但是如果你观察这个模型,你会发现它非常像一个卷积神经网络。

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

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

参考

  1. (2018).Www-sop.inria.fr .于 2018 年 6 月 26 日检索,来自http://www-sop.inria.fr/members/Neil.Bruce/ICIPnbruce.pdf
  2. (2018).Cseweb.ucsd.edu。检索于 2018 年 6 月 27 日,来自https://CSE web . ucsd . edu/classes/fa09/CSE 258 a/papers/Koch-ull man-1985 . pdf
  3. Gabor 滤波器。(2018).En.wikipedia.org。检索于 2018 年 6 月 27 日,来自https://en.wikipedia.org/wiki/Gabor_filter
  4. 5 个非线性滤波器。(2018).Dspalgorithms.com。检索于 2018 年 6 月 27 日,来自https://www.dspalgorithms.com/aspt/asptnode24.html
  5. (2018).[在线]见:https://www . research gate . net/post/how _ are _ Volterra _ filters _ applied _ to _ images【2018 年 6 月 27 日访问】。
  6. 自我信息。(2018).En.wikipedia.org。检索于 2018 年 6 月 27 日,来自https://en.wikipedia.org/wiki/Self-information

独立分量分析的快速鲁棒定点算法

原文:https://towardsdatascience.com/paper-summary-fast-and-robust-fixed-point-algorithms-for-independent-component-analysis-6f3991ff5514?source=collection_archive---------8-----------------------

GIF from this website

这篇论文已经这么有名了,我想我不需要提供什么解释了。

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

Paper from this website

摘要

独立成分分析,将给定的数据分解成尽可能独立的成分。本文作者使用了两种方法来获得这一结果,即 Comon 的信息论方法和投影寻踪方法。并且使用最大熵近似,作者引入了新的目标函数。(我们将互信息最小化。)

简介

寻找合适的表示是神经网络以及统计等其他领域的中心问题。这些表示通常被认为是原始数据的线性变换。(有一些方法可以找到这些表示,如 PCA、因子分析等……)。ICA 两个应用是盲源分离和特征提取。ICA 的特征提取受到神经科学的启发,神经科学表明冗余减少的相似原理解释了大脑早期处理感觉数据的一些方面。本文引入了新的目标函数,认为问题是最小化互信息。

ICA 的对比功能

看待 ICA 的另一种方式是对上面看到的数据的以下生成模型的估计。(其中 S 是独立的潜在向量,X 是原始数据,最后 A 是学习的变换矩阵,而 W 是 A 的逆)。Comon 展示了如何获得更一般的 ICA 公式,如下所示,其中我们从随机向量 y 定义了差分熵 H。(这个概念是基于互信息的。)

上述方程可以归一化为负熵,它对于线性变换是不变的。(负熵也可以解释为非高斯性的度量。)

最后,使用微分熵的概念,我们可以定义 n(标量)随机变量之间的互信息 I 如下。

使用上面显示的所有概念,本文的作者已经将 ICA 问题定义为 s = Wx,其中 W 是学习的权重,使得变换分量 s 的互信息最小化。(这也等于找到负熵最大化的方向。)

通过负熵近似的对比函数

为了使用上述概念来执行 ICA,我们首先需要找到一个简单的负熵估计。从其他文献中,作者告诉我们,我们可以使用上述函数,其中 G 是非二次函数,C 是常数,V 是标准化变量,y 是均值和单位方差为零的随机变量。为了找到单个独立分量,我们可以使用下面的等式。(注意,如果我们多次迭代下面的方案,我们可以估计多个独立分量。)

并且当分量的负熵之和最大化时,互信息最小化。因此,我们可以将问题重新表述为优化问题,如下所示。(带有附加约束。)

估计量的分析和对比函数的选择

在本节中,作者已经证明了几个事实,例如
a. W 是 ICA 数据模型中一个分量的一致估计量。 (如果 W 是向量)
b .当非二次函数 G 的形式如下所示时,W 的渐近方差最小。(fi(。)是 si 的密度函数,k1,k2,k3 是任意常数)

c .如果函数 G 有界,那么学习到的 W 对于异常值是鲁棒的

对比功能的实际选择

上述三个函数是函数 G 的一个很好的选择,作者方法的一个巨大优势是它们提供了适用于独立分量的任何分布和对比函数的任何选择的估计量。

独立分量分析的定点算法

在这一节中,作者提供了执行 ICA 的完整算法,关于最小化互信息。本文提出的方法也可以通过梯度下降来求解,但是用户必须注意这样的事实,即学习速率可以中断或使收敛。为了克服这个问题,作者使用了定点迭代算法,在该算法中,计算是成批进行的,并且具有并行、分布式、计算简单和需要很少存储空间的优点。

为了估计单个独立分量,我们可以使用如上所示的定点迭代算法。(详情请阅读论文。)并且上面的方法可以转换成梯度下降法,如下所示。(下面的方法更稳定。)

最后,如果原始数据之前没有被白化,我们可以使用下面的算法。

多个单位的定点算法

现在,作者介绍了一种算法来为多个单元执行 ICA,这里需要注意的一点是,为了防止不同的神经元收敛到相同的最大值,我们必须对每一步的输出进行去相关。(同样,如果原始数据已经被白化,那么符号 C 可以省略。)

第一种方法是逐个找到单个组件,并重新规范化它们。

其他两种方法涉及对称装饰关系,其不具有任何比其他向量优先的向量。不动点算法的一些性质是收敛更快,没有超参数,更稳健,并且能够逐个或批量估计独立分量。

模拟和实验结果

经过多次实验,作者证明了这种方法对异常值更鲁棒、更有效、更快(收敛)的事实。

结论

本文作者提出了一种通过最小化互信息实现独立分量分析的定点算法。并且该算法可以应用于原始数据或白化数据。此外,通过使用对称装饰关系,还可以批量估计独立分量。

遗言

这是一种执行 ICA 的巧妙方法。

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

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

参考

  1. (2018).Cs.helsinki.fi 于 2018 年 8 月 17 日检索,来自https://www.cs.helsinki.fi/u/ahyvarin/papers/TNN99new.pdf

[论文摘要]Google Deep Mind——走向深度学习和神经科学的整合——第 1 部分

原文:https://towardsdatascience.com/paper-summary-google-deep-mind-towards-an-integration-of-deep-learning-and-neuroscience-240b7624c57f?source=collection_archive---------8-----------------------

Gif from here

谷歌,深度思维,精英中的精英。我们这一代最具创新性的人工智能研究实验室之一。他们有惊人的出版物。今天,我将尝试对他们的论文“ 走向深度学习和神经科学的融合 e”做一个一到两句话的总结。另外,请注意这篇论文有 60 页,所以我需要把这篇总结分成几篇文章。

请注意这篇文章是给未来的我看的。

摘要

由于更复杂的机器学习模型以及复杂的成本函数的发展,现在有可能弥合机器学习和神经科学之间的差距。

简介

作者再次声明神经科学和计算机科学之间存在脱节。且继续陈述机器学习中三个发展 1)成本函数优化 2)更复杂的成本函数的发展 3)更复杂的网络架构的发展现在可以帮助弥合该差距,并且引入三个假设。

1.1 假设 1——大脑优化成本函数。

人类之间优化的一个例子可以是简单的移动,作者认为,人类已经进化到优化能源消耗,同时最大化财务和移动收益。这种机制也适用于机器。

1.2 假设 2-成本函数因地区而异,并随着发展而变化。

这里的主要思想是成本函数不必是全局的。我们的大脑可能会使用均方差来优化运动时的能量消耗。但是同一个大脑可能使用类似于 softmax 的具有交叉熵损失的成本函数来进行分类。这种专业化成本函数的混合可以使学习更有效率。

1.3 假设 3-专用系统允许有效解决关键计算问题。

这部分挺长的,但是本质上…
1。大脑的不同部分做不同的事情(例如丘脑大脑的一部分可能充当信息路由门,而像基底神经节这样的区域帮助做出离散的决策)因此,开发不同结构的机器学习模型对于效率来说是至关重要的(LSTM、RNN、CNN 等)。

2.然而,人类的大脑是非常特殊的,因为即使世界给了我们有限的标记数据,我们也能够学习差异并正确地区分彼此。现有的无监督学习算法没有一个能做我们人类做的事情。(截至今日)

3.因此,找到正确的成本函数序列是非常重要的,可以根据该序列训练无监督模型以提供正确的行为。

2。大脑可以优化成本函数

作者声称,我们可以将大脑视为一台优化机器,它可以为不同的任务提供不同的成本函数。同时优化学习过程中的每个成本函数。这些复杂成本函数中的一些可以是反向传播、尖峰时序相关可塑性、树枝状计算和局部兴奋-抑制网络,或者可以导致比任何优化算法更强大的学习过程的任何其他优化函数。

遗言

现在,我就讲到这里,因为我还有一些作业要交,但是我很快会回到这篇论文上来。抱歉,帖子写得很短。

参考

  1. 马布尔斯通,A. H .,韦恩,g .,&科丁,K. P. (2016)。走向深度学习和神经科学的融合。计算神经科学前沿10 ,94。
  2. 基底神经节。(2018).En.wikipedia.org。于 2018 年 4 月 3 日检索,来自https://en.wikipedia.org/wiki/Basal_ganglia
  3. 安纳亚·曼达尔博士,硕士(2010 年)。丘脑是什么?。News-Medical.net。检索于 2018 年 4 月 3 日,来自https://www . news-medical . net/health/What-is-the-cathamus . aspx
  4. 锋电位时间依赖性可塑性。(2018).En.wikipedia.org。检索于 2018 年 4 月 3 日,来自https://en . Wikipedia . org/wiki/Spike-timing-dependent _ plasticity
  5. (2018).Neurophysics.ucsd.edu。检索于 2018 年 4 月 3 日,来自https://neuro physics . ucsd . edu/courses/physics _ 171/annurev . neuro . 28.061604 . 135703 . pdf
  6. (2018).Ocw.mit.edu。检索于 2018 年 4 月 3 日,来自https://OCW . MIT . edu/courses/brain-and-cognitive-sciences/9-641j-introduction-to-neural-networks-spring-2005/lecture-notes/le C14 _ ex cinh . pdf

【论文摘要】Google deep mind——使用机器学习技术对计算机视觉的视网膜成像进行自动分析

原文:https://towardsdatascience.com/paper-summary-google-deepmind-automated-analysis-of-retinal-imaging-using-machine-learning-17e61b2adc70?source=collection_archive---------6-----------------------

Gif form this website

我发现了另一篇很棒的论文,来自《深度精神健康》,我想更深入地研究这篇论文,同时将每一部分总结成一两句话。这也被媒体以“ 谷歌 DeepMind 正在资助 Moorfields 眼科医院 l 的 NHS 研究”的标题报道。

请注意,这个帖子是为了我未来的自己回顾和审查材料。

摘要

有成千上万的英国人正在失明,而患有糖尿病等疾病会使患者失明的几率增加 40%。医生要么使用眼底的数码照片,要么使用光学相干断层扫描获取视网膜图像并做出诊断。

背景

作者再次指出,由于年龄相关性黄斑变性,有许多人失明。在那里,作者描述了机器学习取得的进展,并举例说明了这些算法如何积极地有益于医疗保健(例如,“ ”大脑表达的外显子在纯化选择下富集了自闭症谱系障碍中的从头突变)。 ”)。最后讨论了历史和在 Moorfields 眼科医院的治疗质量。

目的和目标

这项研究的目标再清楚不过了。
1。研究计算机算法是否可以检测/分类病理特征

如果达到了上述目标并取得了成功的结果…
2。提供识别和分析某些病理特征的新算法
3。提供监测和分析,直到疾病得到治疗。

研究设计(纳入/排除标准)

作者多次指出,所有将在这项研究中使用的数据都将在一切之前去人格化。(因此无法识别病人。)作者还指出,除非患者明确说明,否则在 2007 年 1 月 1 日至 2017 年 1 月 31 日期间访问 Moorfields 眼科医院并进行眼部检查的患者的所有数据都将包含在本研究中。

研究设计(样本量/数据)

大约 100 万审计将被包括在数据集中,这些数据主要是数字眼底照片/ OCT 图像的图像。此外,图像中还会包含一些元数据(如年龄),但是这些数据都不能用于识别特定的患者。所有的数据在使用前都会被摩尔菲尔德医院的工作人员仔细检查。

研究设计(算法开发/统计分析)

这里作者讨论的是可以用来开发这种情况的算法类型,对于 AI 来说,基本上都是。(有监督的、无监督的、强化的等等)此外,作者认为性能测量(准确性等等..)将由专家确认。

数据保护

这整个部分可以总结为一句话:DeepMind 将在 5 年内拥有来自 Moorfields 眼科医院的无法识别的数据,在此期间,所有数据都将被销毁,在此期间,数据将被保存在最先进的安全数据库中。

同样,没有进入 DeepMind 的数据可用于识别患者。

道德考量

在这里,作者回顾了 DeepMind 获准使用医疗数据的时间和日期,以及一些负责监测的人员的姓名(缩写),包括临床人员和 DeepMind 人员。

传播

作者在此明确声明,这项研究的所有结果都将发表在学术论文中。(等不及看那篇论文了!)

结论

作者讨论了在这个项目成功的情况下,他们将提交真实世界用例的附加应用程序。

遗言

读完这篇论文后,我想我对这类研究在行业中实际上是如何进行的有了更具体的理解。

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

同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. j .德法乌、p .基恩、n .托马舍夫、d .维森廷、g .范登德里斯切、m .约翰逊、…& t .佩托(2016)。使用用于计算机视觉的机器学习技术自动分析视网膜成像。f 1000 研究,5。
  2. Shead,S. (2018 年)。谷歌 DeepMind 正在资助 Moorfields 眼科医院的 NHS 研究。商业内幕。检索于 2018 年 4 月 12 日,来自http://uk . business insider . com/deep mind-is-funding-NHS-research-2017-7
  3. 眼底照相。(2018).En.wikipedia.org。检索于 2018 年 4 月 12 日,来自 https://en.wikipedia.org/wiki/Fundus_photography
  4. 光学相干断层扫描。(2018).En.wikipedia.org。检索于 2018 年 4 月 12 日,来自 https://en.wikipedia.org/wiki/Optical_coherence_tomography
  5. 黄斑变性。(2018).En.wikipedia.org。检索于 2018 年 4 月 12 日,发自https://en.wikipedia.org/wiki/Macular_degeneration
  6. Uddin M,e. (2018)。在自闭症谱系障碍中,纯化选择下的脑表达外显子富集了新突变。公共医学——NCBI。Ncbi.nlm.nih.gov。检索于 2018 年 4 月 12 日,来自https://www.ncbi.nlm.nih.gov/pubmed/24859339
  7. 穆尔菲尔德眼科医院国民健康保险基金信托。(2018).Moorfields.nhs.uk 于 2018 年 4 月 12 日检索,来自https://www.moorfields.nhs.uk/

H-DenseUNet:用于从 CT 体积中分割肝脏和肿瘤的混合密集连接 UNet

原文:https://towardsdatascience.com/paper-summary-h-denseunet-hybrid-densely-connected-unet-for-liver-and-tumor-segmentation-from-a47597845d37?source=collection_archive---------8-----------------------

GIF from this website

最近我在玩 3D 卷积运算,我想知道更多关于。


Paper from this website

摘要

分割肝脏和其他器官是一项具有挑战性的任务,2D 卷积运算没有充分利用第三维,而 3D 卷积运算具有高计算成本。为了克服这些问题,作者提出了一种新的混合密集连接 UNet 架构,其中他们使用 2D DenseUNet 来提取切片内特征,并使用 3D 计数器部分来分层聚集体积上下文。所有这些网络都是通过端到端的学习来训练的。

简介

肝癌是最常见的癌症之一,因此准确的诊断非常重要。这就是为什么分割正确的肝脏区域是重要的。但是肝脏和肝脏病变是由放射科医师在逐切片的基础上描绘的,这可能导致错误并消耗大量时间。在 CT 中分割肝脏区域是困难的,因为它缺乏其他器官之间的对比度。(见上图,这就是为什么许多放射科医生使用注射协议来增强对比度。)此外,分割肿瘤更具挑战性,因为形状不规则,没有清晰的边界线,并且许多 CT 扫描包括沿 z 轴方向变化很大的各向异性维度。已经提出了许多不同方法来自动化这个过程,例如使用手工制作的特征或完全卷积的神经网络。

通常,放射科医师根据沿 z 轴的许多相邻切片来观察和分割肿瘤,然而 2D 基卷积方法没有考虑 z 轴。(一些研究人员已经应用了对于每个 xy、yz 和 xz 平面具有 3 个 2D 卷积神经网络并对它们进行平均的方法,然而,这些方法有其自身的局限性。)3D 卷积神经网络占用更多的 GPU 内存和训练时间。此外,现有的预训练 3D 卷积模型并不多。为了克服这些问题,作者提出了混合密集连接的 UNet。关键因素是增加网络深度和混合特征探索。

相关工作

开发了许多其他分割方法,例如使用手工制作的特征,如水平集方法(如纹理特征向量),结合传统的机器学习算法,如支持向量机。但是在深度学习的热潮之后,卷积神经网络成为执行分割的主要方法。(使用 3D 条件随机场等方法)

方法

上图显示了作者方法的总体轮廓,一个有趣的事实是,实际上有 4 个网络,2D Res Net,2D Dense-UNet,3D Dense-UNet 和 HFF 层。

用于切片内特征提取的深层 2D dense unet

2D 密集 UNet 是由密集连接的块组成的 UNet 架构。(而大致的框架框架见下图。).这个网络的两大优点是:第一,它通过密集连接最大化了层间的信息流;第二,它通过 UNet 型连接利用了高级功能和低级功能。(此外,2D 密集 UNet 的深度为 167,另外请注意,我不会详细说明输入数据或输出数据的确切维度。)上采样是通过双线性插值完成的,使用线性单位(ReLU)作为激活函数。

用于混合特性探索的 H-dense unet

2D 密集 UNet 能够从给定的 ct 扫描中提取高级特征,但是,它仍然没有充分利用 z 轴中存在的数据。为了克服这一点,作者提出了一种 H-DenseUNet 来联合融合和优化所学习的切片内和切片间特征,以便更好地分割肝脏肿瘤。在 2D 密集 UNet 的最后一层之后,输出的特征地图被转换成如下所示的体数据。

此特征地图是 3D Dense UNet 的输入数据,当用数学等式表示时,可以认为如下所示。

最后,从两个网络输出的数据相加并传递到 HFF 层。

完整的网络架构如下所示。

损失函数、训练和推理方案

作者使用加权交叉熵损失函数通过端到端的方式训练网络。

并且每个网络训练的顺序可以列举如下
1。Resnet →得到粗肝分割
2。2D DenseUNet →用 DenseNet 的权重(编码器)初始化权重,同时随机初始化解码器
3。在没有 UNet 连接的情况下开始 2D 密集 UNet 的训练,并且在一定时期之后进行 UNet 连接。
4。使用上述方案训练 2D 密集 UNet
5。在训练 2D UNet 之后,训练 3D 密集 UNet,同时固定 2D 密集 UNet 的参数。
6。在 3D 密集 UNet 被训练后,使用损失函数微调整个网络,如下所示。

实验和结果

Image from this website

使用来自 MICCAI 2017 LiTS challenge 的数据,该数据包含分别用于训练和测试的 131 次和 70 次对比度增强的 3D 腹部 CT 扫描,作者在-200 和 250 之间截断了图像强度值。(删除了所有不相关的细节。).所有模型都通过 Dice per case 评分、Dice global 评分和均方根误差进行评估。工作使用的框架是 Keras,学习率为 0.01,学习率衰减。

预训练模型的有效性/2D 和 3D DenseUNet 的比较

如上所述,当作者比较有和没有预训练权重的模型的训练损失以及骰子得分时,很明显需要预训练权重以获得更好的性能。此外,当比较 2D 密集 UNet 和 3D 密集 UNet 的性能时,很明显 2D 密集 UNet 的性能更好。最后,UNet connected 也为实现更好的性能发挥了作用。

混合特征融合的有效性

如上所述,作者比较了具有和不具有混合连接的网络,发现具有混合连接的网络产生更清晰的分段掩码。

与其他方法的比较

甚至当与其他现有技术的网络相比时,我们可以观察到作者提出的方法在所有不同的测量中具有最高的性能分数。

讨论

作者提出的方法能够在不同的测量标准下获得最佳性能。为了更好地理解性能增益,作者分析了每个患者肿瘤大小的有效性。当作者绘制肿瘤大小的散点图时,我们可以注意到一个很大的变化。如下所示,作者的方法提高了大肿瘤组和小肿瘤组的 dice 评分准确性。

结论

总之,本文的作者提出了一种新的混合架构,该架构可以有效地探测高级别代表性片内和片间特征,随后通过混合特征融合层优化这些特征。并且克服了 2D/3D 卷积神经网络的问题。

最后的话

网络的训练方式给我留下了特别深刻的印象。事实上,该网络没有从头到尾进行训练是一个败笔,但是作者提出了一个非常聪明的方法来训练一个复杂的网络。

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

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

参考

  1. (2018).Arxiv.org。检索于 2018 年 7 月 31 日,来自 https://arxiv.org/pdf/1709.07330.pdf
  2. 李,谢,陈,洪,齐,谢,窦,秦,傅,陈,恒,彭(2017)。H-DenseUNet:用于从 CT 体积中分割肝脏和肿瘤的混合密集连接 UNet。Arxiv.org。检索于 2018 年 7 月 31 日,来自 https://arxiv.org/abs/1709.07330
  3. CodaLab —竞争。(2017).Competitions.codalab.org。检索于 2018 年 7 月 31 日,来自https://competitions.codalab.org/competitions/17094

【论文摘要】horo VOD:tensor flow 中快速简单的分布式深度学习

原文:https://towardsdatascience.com/paper-summary-horovod-fast-and-easy-distributed-deep-learning-in-tensorflow-5be535c748d1?source=collection_archive---------14-----------------------

GIF from this website

我想知道更多关于 Tensorflow 中的分布式学习,它是如何完成的以及背后的细节。

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

Paper from this website

摘要

训练深度神经网络是一个占用大量计算内存的过程。如果我们可以使用多个图形处理器,那么训练速度会更快。然而,有两个问题,GPU 的内部通信和用户必须修改他们的代码,以兼容分布式训练。本文的作者介绍了 Horovod,它可以自动处理这些问题。

简介

近年来,深度学习已经在各地应用,以创造有意义的体验。优步在他们的许多产品中使用张量流。

走向分布式

随着模型规模的增加,所需的计算成本也在增加。为了解决这个问题,优步转向了分布式培训,在尝试了标准的 tensorflow 分布式软件包后,他们显然需要做出一些调整。tensorflow 中的标准分布式库很难调试,扩展性也不好。(如上图所示)

利用不同类型的算法

首先,他们尝试了脸书的方法,其中结合了数据并行的原则和创新的学习率调整技术。(如上图。)这种方法的一般方法如下所示。

在这种方法中,每个进程都有两个潜在的角色,要么成为工作节点(读取数据,并计算梯度),要么成为参数服务器(平均梯度)。这种方法是可行的,但是它有两个潜在的问题,1)确定工人与参数服务器的正确比例,以及 2)处理增加的 TensorFlow 程序复杂性。在 2017 年初,一种称为 ring-allreduce 的算法对梯度进行平均,并将这些梯度传递给所有节点,(该方法如何运行的视觉效果可以在下面看到,详细信息请阅读论文。)已被提出。

介绍 Horovod /通过 Horovod 分配您的培训工作

Horovod 这个名字来自传统的俄罗斯民间舞蹈,表演者手挽手围成一圈跳舞,类似于分布式训练的工作方式。并且本文作者已经实现了 tensorflow 版本的 ring-allreduce 算法,具体可以看下面。

正如上图所示,使用 Horovod 非常简单,只需要几行额外的代码。

Horovod 时间轴/张量融合

在谷歌 chrome 的帮助下,每个用户都可以轻松地跟踪培训的进度,这可以准确地显示每个节点在整个培训工作的每个时间点都做了什么。

此外,作者注意到在训练时,有许多微小的缩减操作。如果张量足够大,ring-allreduce 可以以最佳方式利用网络,但如果张量非常小,则不能有效或快速地工作,因此作者提出了张量融合,一种将张量融合在一起的算法。通过这种方法,作者能够观察到 65%的改善。

Step by Step of Tensor Fusion.

Horovod 基准/后续步骤

当作者比较标准库和 Horovod 之间的情况时,他们能够观察到性能的异常提高,如上所示。

使用远程直接内存访问(RDMA)而不是 TCP,作者还注意到性能的巨大提高。如果随着模型中参数数量的增加,它变得更加有效。最后,作者注意到了改进的空间,例如 1)使安装 MPI 变得更容易,2)收集和分享关于调整分布式深度学习的模型参数的学习,以及 3)添加非常大的模型的示例。

最后的话

这是一个令人兴奋的消息,我希望有一天能够使用这个框架。

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

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

参考

  1. 阿·谢尔盖耶夫和米·德尔·巴尔索(2018 年)。horo VOD:tensor flow 中快速简单的分布式深度学习。Arxiv.org。检索于 2018 年 8 月 13 日,来自https://arxiv.org/abs/1802.05799

[论文摘要/ICLR 2014]k-稀疏自动编码器

原文:https://towardsdatascience.com/paper-summary-iclr-2014-k-sparse-autoencoders-72078c6f1117?source=collection_archive---------12-----------------------

GIF from this website

自动编码器的变体之一,旨在学习给定数据的稀疏表示。


Paper from this website

摘要

最近已经注意到,学习给定数据的稀疏表示提高了用于分类任务的网络的性能。这里,作者提出了一种新的架构,其中在编码部分,仅选择 k 个最大的隐藏层元素来重构原始数据。

简介

有多种实现稀疏编码的方法,我们可以直接学习字典,或者我们可以使用在成本函数中添加了稀疏惩罚的神经网络。

在忽略所有细节(例如所需的计算成本)的情况下,大多数稀疏编码方法的基本思想是学习最小化上述成本函数的字典 W 和稀疏表示 z。另一种方法是使用自动编码器,但是它们也有自己的问题,比如不能保证每个输入的稀疏表示。在本文中,作者提出了 k 个稀疏自动编码器,其中在重构给定输入时仅使用某些最高隐藏层。

算法描述

基本自动编码器背后的想法是简单地重构给定的输入,同时通过某个权重 W 和偏差值 b 来参数化。在 k 个稀疏自动编码器的情况下,在隐藏层(如下所示)之后,仅使用选定的 k 个值来重构给定的输入。

suppk()表示仅选择给定输入值中最高的 k 值,这是唯一的非线性。并且这些学习的权重 W 可以用于分类任务。

使用稀疏自动编码器的整个训练和编码阶段可以在上面看到。

k 稀疏自动编码器的分析

最初,迭代硬阈值处理是一种重建稀疏信号的方法,然而在这项工作中,作者使用了上述方法的一种变体,称为“具有反演的迭代阈值处理”,其中变得与 k-稀疏自动编码器相同。并且在非常简短的总结中,具有反转的迭代阈值处理具有如下所示的两个步骤。(在没有所有数学细节的情况下,下面两个等式可以被认为是最小化原始数据和稀疏重构数据之间的平方差。)

简而言之,我们可以将 k-稀疏自动编码器视为在稀疏恢复阶段使用 ITI 的稀疏编码算法的近似。最后,作者介绍了最后一个概念,即不连贯的重要性。这基本上意味着给定字典中原子之间的差异。如果字典是不完整的,我们不能将字典的每一列表示为其他列的线性组合。当字典过于完备时,情况正好相反。并且当 k-稀疏自动编码器收敛时,它成功地找到了给定数据的稀疏表示,这意味着所学习的字典必须是充分不相干的。

实验

本节作者在三组不同的数据集上进行了实验,分别是 MNIST 、 NORB 和 CIFAR-10 。作者没有纯粹地训练自动编码器,而是,他们首先将 k 值设置为 100,然后慢慢降低到目标稀疏度,如 15。这样做的原因是为了防止隐藏层内死亡神经元的形成。如果稀疏性从一开始就很低,它可能会阻止梯度流动。对于无监督和有监督的学习任务,作者使用了带动量的随机梯度下降。

稀疏程度的影响

从上图中我们可以看到,随着稀疏度的增加(意味着我们使用越来越多的原子来表示原始数据),字典倾向于学习更多的局部特征,但是随着稀疏度的降低,网络被迫只使用更少的原子来表示给定的数据,因此创建的特征变得更加全局。(比如数字的笔画。)但是强制太多的稀疏性会导致数据的过度拟合,并且没有学习到有用的特征。

以上是从 CIFAR 10 数据集学习到的滤波器,我们可以观察到学习到的滤波器类似于本地化的 Gabor 滤波器。

无监督特征学习结果

为了比较无监督学习任务的结果,作者从不同的方法中提取了学习过的过滤器,并使用简单的逻辑分类器来执行分类。我们可以观察到 k 稀疏自动编码器能够实现最低的错误率。

浅层监督学习结果/深层监督学习结果

此外,作者在较浅的网络的初始层上使用通过无监督学习获得的网络权重,同时使用反向传播来调整添加的层以及微调先前的层。(这个过程有时被称为区别性微调。).从上表中我们可以看到 k 稀疏自动编码器取得了有竞争力的结果。

结论

本文介绍了一种新的稀疏编码方法,称为 k 稀疏自动编码器。该方法的新颖性主要在于如何在重建原始数据时仅使用选定的少数神经元。

最后的话

本文提出了一种非常简单的方法来实现给定数据的稀疏表示。

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

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

参考

  1. (2018).Arxiv.org。检索于 2018 年 8 月 12 日,来自https://arxiv.org/pdf/1312.5663.pdf
  2. MNIST 手写数字数据库,Yann LeCun,Corinna Cortes 和 Chris Burges。(2018).Yann.lecun.com。检索于 2018 年 8 月 12 日,来自http://yann.lecun.com/exdb/mnist/
  3. CBLL,研究项目,计算和生物学习实验室,库兰特研究所,NYU。(2018).Cs.nyu.edu。检索于 2018 年 8 月 12 日,来自https://cs.nyu.edu/~yann/research/norb/
  4. CIFAR-10 和 CIFAR-100 数据集。(2018).Cs.toronto.edu。检索于 2018 年 8 月 12 日,来自https://www.cs.toronto.edu/~kriz/cifar.html

[论文摘要]使用 DAGSVM 和三元组丢失改进深度网络的多类分类

原文:https://towardsdatascience.com/paper-summary-improving-multi-class-classification-by-deep-networks-using-dagsvm-and-triplet-19edb947c408?source=collection_archive---------5-----------------------

GIF from this website

有趣的多类分类方法。

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

Paper from This website

亮点

本文提出了一种提高多类分类精度的新方法。主要通过替换 softmax 函数并具有三重损耗。

摘要

在大多数多类分类任务中,许多研究者使用 softmax 函数作为一个整体来处理分类任务。但是在这篇论文中,作者提出了一种新的方法来做同样的事情。主要是将 softmax 函数替换为以树或 DAG(有向无环图)结构组织的一组二进制 SVM 分类器。因此,每个 SVM 侧重于对两个类别进行分类。

简介

许多论文使用 softmax(多项逻辑回归)作为最终分类层来进行多类分类。多类分类是机器学习中最重要的任务之一。这里,作者提出了一种方法,其中网络的早期层不变,仅最外层发生变化。(所以 N 个多类分类问题变成 N(N-1)/2 个二元问题。主要是将 softmax 替换成 DAG 结构中的二元分类器。(这通过学习更多的成对区分特征来提高准确度。)主要思想可以在上图中看到。

相关工作

有不同方法来执行多类分类,例如,一对一对所有、一对一对最大获胜、纠错输出编码、基于输出编码的多类提升和 DAGSVM。这里,作者关注 DAG 方法,因为它允许模型学习更多的区别特征,并且它具有较低的时间复杂度。与其他方法的一个不同之处在于,作者将问题分解为一个更简单的二元分类任务。

方法论

作者方法背后的主要思想是,每个分类器都成为区分特征的专家,因此与使用 softmax 输出层作为最终分类层相比,模型的整体准确性要高得多。这种方法的另一个优点是,每个单独的分类器可以被微调,以进一步提高模型的准确性。(我觉得这挺酷的)。

DAG

如上所述,DAG 是以分层结构组织的节点的排列,当每个节点代表一个 SVM 时,它被称为 DAGSVM。对于 N 类问题,DAG 有 N(N-1)/2 个节点。本文的作者说他们不会改变上图中的体系结构,但是他们知道可以使用不同类型的体系结构来提高模型的性能。

学习更多的判别特征

使用三重损失(如上所示)是在最近邻分类法的背景下产生的。并且当与不同类别进行比较时,该损失函数利用网络将相似类别的图像分组在一起。

实验结果

该论文的作者使用了三种不同的模型来观察所提出的方法的性能。a)具有修改的 VGG 型网络,B)具有修改的 NIN,C)具有修改的 ResNet。此外,mini batch 设置为 128,并使用 SGD。每个网络的训练曲线如下所示。

在所有的基础网络被训练(使用 Softmax 分类)之后,最后一层(softmax)通过 DAGSVM 被替换,并且再次被训练以提高性能。

上面是一个分类器的准确性直方图,我们可以观察到,微调每个分类器是非常可能的。从而提高整个模型的性能。

对于 STL10 数据集,作者使用了不同的网络,称为小网络 1、小网络 2 和一个大网络。

S1 由具有 64 和 128 个滤波器的两个卷积层组成,随后是两个全连接层,每个层具有 256 和 10 个神经元。

S2 由四个卷积层组成,分别具有 64、128、256 和 512 个滤波器,其后是两个全连接层,每个层具有 512 和 10 个神经元。

L1 与用于 CIFAR 10 数据集的网络 A 相同。而训练曲线可以看到下图。

同样,当使用具有三重损失的 DAGSVM 进行微调时,我们可以观察到网络的性能能够提高。

讨论

所执行的实验的一个有趣的事实是,对于较大的网络,与较小的网络相比,DAGSVM 能够以较大的裕度提高模型的性能。这可能是因为在更大的网络中有更多的权重可以被微调。此外,如下所示,我们可以观察到,随着二元分类器的平均精度增加,模型的整体精度也增加。

结论和未来工作

总之,本文作者提出了一种将多类分类问题转化为更小的二元分类问题的方法。这种方法不仅通过学习更多的区别特征来提高性能,而且能够对网络进行微调。这种方法的一些限制是,它对于大量的类在计算上是不可行的,并且它不是端到端的训练系统。

遗言

我感兴趣的一个领域是不同类型的损失函数。

参考

  1. Agarwal、v . Balasubramanian 和 c . Jawahar(2018 年)。使用 DAGSVM 和三元组丢失通过深度网络改进多类分类。模式识别字母。doi:10.1016/j . patrec . 2018 . 06 . 034

[论文摘要 FERET 数据集上 PCA、ICA 和 LDA 的独立比较研究

原文:https://towardsdatascience.com/paper-summary-independent-comparative-study-of-pca-ica-and-lda-on-the-feret-data-set-6fc30d4eaa76?source=collection_archive---------10-----------------------

GIF from this website

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

Paper from this website

摘要

本文作者希望比较三种最流行的基于外观的人脸识别投影方法(PCA、ICA 和 LDA)。他们使用了 FERET 数据集,没有发现任何特定的投影——公制组合是所有标准 FERET 测试中最好的。(因此,研究人员需要为特定的任务选择特定的方法。)

简介

涉及人脸识别问题的研究越来越受欢迎,人们普遍认为,计算机视觉研究的进展将为神经科学家和心理学家提供关于人类大脑如何工作的有用见解,反之亦然。有两种方法来实现这个任务,基于外观的方法使用应用于全脸的整体纹理特征,或者基于特征的方法使用几何面部特征(例如嘴)及其关系。

基于外观的子空间分析是最古老和最有前途的人脸识别方法。(然而,挑战在于找到一个好的子空间来比较图像。).本文比较了主成分分析、独立分量分析和线性判别分析三种投影方法。为了公平的比较,在 FERET 数据集上所有方法都使用了相同的预处理图像。

算法

Training Phase of Face recognition system

Testing/Matching Phase of Face recognition system

PCA、ICA 和 LDA 是子空间分析方法,它们将原始(高维)数据投影到较低的维上(同时尽可能多地保留信息),然后进行比较。(这里,作者从 3000 的向量维度开始,并投影到 270 的子空间维度上——对于 LDA 224。).上面可以看到人脸识别系统示例的架构,在训练阶段,从归一化和居中的训练图像中学习投影矩阵 W,并将已知人脸的图库图像投影到较低的维度上(同时减去由训练图像获得的平均图像)。在存储投影向量之后,在匹配阶段,即将匹配的图像被归一化和居中(使用训练平均图像),然后被投影到较低的维度上,并与已知人脸进行比较。使用各种距离测量,分配最接近的身份。

上图显示了当原始人脸图像被投影到一个低维子空间时,由不同方法产生的结果图像。在对给定图像执行 ICA 之前,先执行 PCA 以降低维数(LDA 也是如此),作者使用 INFOMAX 算法来实现 ICA。(ICA1 —统计独立基础图像,ICA2 —阶乘代码表示。).我们可以观察到 PCA、ICA2 和 LDA 捕获全局特征,而 ICA1 捕获局部特征。

最后,使用了四种不同的距离测量方法,L1、L2、余弦角(COS)和马氏距离(MAH)。(V 是协方差矩阵)。

方法论

为了与其他论文公平比较,其他人使用 FERET 数据集。对于预处理,他们对所有图像进行空间变换,使眼睛位于图像中心,裁剪掉背景,将图像大小调整为 50*60,并执行直方图均衡化。使用 675 幅图像(225 个类别的 3 幅图像)来获得投影矩阵 W,并且除了 LDA 之外,原始图像被缩减到 270 维子空间。(224 为 LDA。).

结果

Rank Table

CMS curve

如上所述,作者报告了两种不同类型的可视化,一个表格显示了等级 1 的算法性能(前一个匹配中的识别率),一个 CMS 显示了等级 1 和更高等级的累积结果。有趣的是注意到表(等级 1)结果和 CMS 曲线(更高等级)之间的差异。对于 fb(不同表达任务),ICA2 + COS 在等级 1 产生最好的结果,LDA + COS 在等级 6 之后表现更好。并且在较高等级时,ICA2 + COS 的表现比任何其他方法都差。作者们也无法直接得出结论,哪种方法最适合这项任务。在不同的光照条件下,ICA1 的表现最差。最后,对于 dup1 和 dup2,时间变化任务,ICA2 + COS 是最好的方法。对于度量,L1 与 PCA 配对时是最好的,COS 与 ICA2 配对时是最好的,但是对于 ICA1 和 LDA,无法得出哪个测量是最佳的结论。(我不打算总结假设检验的细节。)作者将获得的结果与其他出版物进行了比较,他们能够发现大量相同的结论以及矛盾之处。

结论

总之,本文的作者比较了不同的最流行的基于外观的人脸识别投影方法。(PCA、ICA 和 LDA),使用四种不同的距离度量。(L1、L2、余弦和马哈拉诺比斯)。他们得出了几个结论…

(1)不能断言哪一个是不同表达任务的最佳组合,因为差异似乎没有统计学意义

(2)PCA L1 在所有等级上都优于 ICA1 和 LDA,并且从等级 27 开始优于 ICA2

(3) COS 似乎是 ICA2 的最佳指标选择

(4) ICA2 + COS 组合是时间变化的最佳选择

(5) L2 产生的结果低于 L1 或 COS

(6)总体而言,L1 和 COS 是最佳指标

最后的话

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

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

参考

  1. (2018).Face-rec.org。检索于 2018 年 9 月 2 日,来自http://face-rec.org/algorithms/comparisons/delac_03.pdf

[论文摘要]通过互信息估计和最大化学习深度表示

原文:https://towardsdatascience.com/paper-summary-learning-deep-representations-by-mutual-information-estimation-and-maximization-efbe41a9f2c3?source=collection_archive---------6-----------------------

Photo by Lucrezia Carnelos on Unsplash

我想彻底了解的论文之一。

请注意,这个姿势是我自己学习用的。

Paper from this website

摘要

作者的网络的目标是最大化编码器的输入和输出之间的互信息。(无监督特征学习)。对于某些下游任务来说,对表示的有用性有很大影响的一个因素是关于目标输入的位置的知识。此外,作者使用一种对立的自动编码器方法来将编码表示与一些先验分布相匹配。

简介

在连续和高维空间中计算互信息是非常困难的任务,然而由于最近的进展,现在可以在连续域中高效地计算互信息。因为这个问题已经(部分)解决了,所以本文的作者需要一个函数(神经网络)来最大化给定输入和编码输出之间的互信息。作者还指出,对于特定任务(如分类),最大化表示(编码特征)和局部区域之间的平均 MI 可能更有用。同时最大化编码特征和全局输入之间的互信息有利于重构原始输入。

当谈到编码特征时,内容和独立性都很重要,作者以类似于 AAE 的方式训练他们的函数,以匹配他们想要强加给编码特征的统计属性。(由于这种方法与 infomax 优化原则密切相关,因此他们将其命名为 DeepInfo Max)。

相关工作

有许多方法旨在学习良好的表示,如独立成分分析、自组织映射、自监督方法和深度聚类。生成模型也用于学习有用的表示,并且在任务是重构原始输入的情况下,负重构误差可以与编码器中的 MI 相关,如下所示。

x 是给定数据,Y 是编码特征,R 是重构误差,H 是编码器输出的边际熵。这意味着重建目标对它们的中间表示中编码的信息量提供了一些保证。

互信息估计

互信息方法有着悠久的传统,通常许多互信息方法旨在最大化给定变量之间的互信息。(有些方法可以是非线性的)。互信息神经估计(MINE)学习连续变量的 MI 的神经估计,并且它是强一致的。这篇论文的作者受我的影响,但是他们发现没有必要使用精确的基于 KL 的配方以及具有发生器部分。基于 Jensen-Shannon 散度的简单分类器工作得和 KL 一样好,并且更稳定。此外,作者的方法可以利用输入的局部结构。

深度信息最大值

训练编码器的一般方法如下所示。给定 X 和 Y 连续且(几乎处处)可微的参数函数的域和范围,作者将 E 定义为神经网络,X 定义为训练数据,P 定义为经验概率分布(数据分布), U 定义为通过神经网络推送样本诱导的边际分布。作者编码器是根据两个标准训练的。

  1. 最大化数据 x 及其编码特征(局部或全局)之间的交互信息
  2. 让编码的特征匹配一些先验分布(AAE 风格)。

a)互信息估计和最大化

互信息神经估计(MINE)通过训练分类器来区分来自联合 J 和随机变量 X 和 Y 的边缘乘积 M 的样本来估计 MI,并且它使用基于 KL 散度的 Donsker-Varadhan 表示的 MI 的下限。

t 是鉴别器网络,其参数由 w 建模并与编码器配对,它既估计又最大化互信息。

我的网络和作者的网络之间的区别在于,首先,作者的编码器和互信息估计器共享层,因为它们优化相同的目标,其次,作者的目标是最大化 MI(不关心它的精确值),因此使用不同的估计器函数以具有有利的折衷。(注意,也可以使用噪声对比估计。)

基于 DV、JSD 和 nce 的公式之间存在一些差异,例如 P/Phat 的期望值是出现在对数项内部还是外部。每种测量都有自己的优点和缺点,一般来说,nce 需要更多的负样本,但表现良好,而 JSD 损失相对稳健,但表现不如 NCE。

b)局部互信息最大化

根据您希望承担的任务,从原始数据中最大化本地区域之间的互信息可能是一个更好的主意。(这也可以应用于语言数据,而不是最大化特征和整个文档之间的 MI,我们可以最大化特征和句子之间的 MI。).例如,最大化给定特征和局部面片之间的平均 MI 可能是个好主意。

当编码器不支持无限输出配置并且特征向量具有有限容量时,编码器必须选择将传递何种信息。但是如果编码器只传递特定于输入的本地部分的信息,这将不会增加不包含该信息的任何其他补片的 MI。因此,编码器将传递通常在输入端共享的信息。

局部方法首先对输入数据进行编码,这反映了有用的结构,然后将该编码总结为全局特征,然后最大化估计的 MI 可以用如下公式表示。

c)将表征匹配到一个先验分布

当我们将数据编码成某种特征向量时,信息量只是我们优化的标准之一,轴的另一个度量是统计约束。这可以通过 AAE 方法实现,目标函数如下所示。

AAE 之间的一个区别是,我们没有上述目标函数的生成器。

当我们从上面组合所有的测量轴时,我们得到最终的目标函数,如上所示。

实验

作者在 CIFAR10/100、Tiny ImageNet、STL-10 和 CelebA 四个不同的图像数据集上对算法进行了测试。并以一些方法与作者的方法进行了比较,分别以 VAE、AAE、甘比和噪声为目标。

a)我们如何评估代表的质量?

尽管测量一个表示是好还是不好是棘手的,但是存在一些测量,例如,线性可分性通常被用作表示和类别标签之间的解纠缠和互信息(MI)或者迁移学习分类任务的代理。

使用类标签并不理想,因为当标签未知时,我们可能对表示感兴趣。(类别标签)。因此,我们可以使用 MINE 来直接测量输入和特征之间的关系。或者,我们可以使用一个鉴别器来测量表示的独立性。鉴别器被训练来估计 KL 散度,并且 KL 散度越高,因子越相关。

以上是作者使用的指标的总结。

b)跨模型的表征学习比较

作者有两个模型 DIM(G)用于全局唯一目标,DIM(L)用于局部目标,对于先验,他们选择了均匀分布。

上表显示了不同数据集的分类精度,很明显 DIM(L)优于所有其他方法。(总之,局部模糊目标适合于提取类别信息。).

上表显示了 CIFAR10 数据集的线性可分性、重构(MS-SSIM)、互信息和独立性(NDM)的结果。需要注意的一点是,MS-SSIM 与 MINE 提供的 MI 估计值有很好的相关性,表明编码特征与像素信息有关。一般来说,基于像 VAE 和 AAE 的方法的重建对于 MS-SSIM 具有较高的分数,并且结合局部和全局的 DIM 目标对于 DIM 具有最好的结果。

c)添加坐标信息和遮挡

最后,作者在计算全局特征时随机遮挡输入的一部分,但是使用全部输入来计算局部特征。通过这样做,我们鼓励模型对整个图像共享的信息进行编码。这有助于提高分类的准确性。

结论

本文的作者介绍了 Deep InfoMax,这是一种最大化互信息的学习表示方法。作者的模型可以学习在原始数据的全局或局部结构之间具有最大互信息的特征。

遗言

测量相互信息似乎是非常棘手的任务。

参考

  1. Hjelm,r .,费多罗夫,a .,Lavoie-Marchildon,s .,Grewal,k .,Bachman,p .,Trischler,a .,& Bengio,Y. (2018)。通过互信息估计和最大化学习深度表示。Arxiv.org。检索于 2018 年 10 月 30 日,来自https://arxiv.org/abs/1808.06670

【论文摘要】学习自然声音的高阶结构

原文:https://towardsdatascience.com/paper-summary-learning-the-higher-order-structure-of-a-natural-sound-1efc77b2f270?source=collection_archive---------11-----------------------

Photo by Aaina Sharma on Unsplash

当我发现这篇论文时,我想知道如何在自然声音数据中学习高阶结构。

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

Paper from this website

摘要

仅关注二阶统计量的无监督学习算法忽略了相位结构(高阶统计量),其中保留了我们称为特征的所有有用信息。为了提取自然声音的高阶结构,作者对声音数据的独立分量分析进行了讨论和实验。

贫困的二阶统计

自然信号具有跨越空间和时间的特征统计依赖性,因此人们认为我们的感觉系统必须通过使用某种过滤器来揭示这些依赖性。人们已经研究了多种基于相关性的方法来寻找这些滤波器(早在 1996 年),但是这些方法中的许多方法对二阶统计敏感。但是诸如图像中的边缘的信息特征是涉及不仅仅两个,而是几十甚至几百个像素或时间点之间的关系的特征。

如果我们检查通过这些基于相关性的方法学习的滤波器,我们可以观察到产生的滤波器是全局的,并且对局部特征不敏感。总之,基于相关的方法对我们不认为有用的信号特征(如幅度)很敏感,而忽略了我们认为最有意义的部分(如相位)。为了克服这个悖论,我们需要一种对高阶统计量敏感的方法。(但是这些高阶有无穷多个。).但是这篇论文的作者描述了一种考虑所有高阶的方法。

去相关、独立分量分析和独立基函数

在描述该算法之前,作者定义了什么是去相关操作,即利用矩阵 W 变换平均向量/矩阵,使得结果矩阵具有对角矩阵作为其协方差矩阵。产生所需结果的三种方法是主成分分析、白化操作和独立成分分析(包括独立基函数)。对于完整的(ICA ),我们可以使用如下所示的学习规则来学习矩阵 w(假设我们使用 sigmoid 函数。)

E is entropy

如果我们采取随机梯度下降操作,我们可以得到如下所示的权重更新规则。

最后,如果我们想使用自然梯度,我们可以使用下面的权重更新规则。

攻丝实验

使用指甲敲击牙齿产生的声音(上面显示的声谱图),作者进行了实验来寻找过滤器。他们首先计算协方差矩阵,然后计算 PCA 和白化操作。最后使用白化数据,他们使用自然梯度学习规则进行独立分量分析。

正如预期的那样,使用 PCA 的学习滤波器没有反映任何相位信息,我们认为这是信息性的。相反,它显示了记录信号的更全面的表示。另一方面,通过 ICA 和独立基函数学习的滤波器反映了在时间和频率上都是局部化的信息。

讨论

当作者使用自然图像数据完成类似实验时,他们再次发现通过使用 ICA 学习的滤波器具有局部、定向和多尺度属性,这些属性是自然场景的统计。其他研究人员关注独立分量分析的稀疏性。

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

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

参考

  1. (2018).Pdfs.semanticscholar.org。检索于 2018 年 9 月 1 日,来自https://pdfs . semantic scholar . org/b524/1dd 7d 74602186 DD 65 Fe 05435 fc 65 EAE 797 e 4 . pdf

Photo by Kelly Sikkema on Unsplash

单眼反应式微型飞行器控制的学习转移策略

原文:https://towardsdatascience.com/paper-summary-learning-transferable-policies-for-monocular-reactive-mav-control-e879fbe3a014?source=collection_archive---------11-----------------------

GIF from this website

请注意,这篇文章是让未来的我回顾和回顾这篇论文上的材料,而不是从头再看一遍。

摘要

人类学习最吸引人的一个方面是迁移学习。(将以前任务中的某些/相关知识应用到新任务中的能力。).然而,在机器人学中解决这个问题仍然是一个挑战。在本文中,作者将数据集聚合( DAGGER )算法用于自主无人机飞行问题。他们提出的解决目标领域问题的方法是巧妙地利用从不同但相关的领域收集的训练数据。

简介

微型飞行器(MAV)目前非常流行,然而,为它们设计一个自主的系统仍然是一个极端的挑战。这项任务如此具有挑战性的原因之一可能是因为训练数据的收集。为了成功地训练防碰撞系统,我们需要收集连续的和不连续的数据。(这意味着我们需要记录一些涉及危险碰撞的数据。)这不仅是灾难性的,而且代价高昂。替代方法包括在模拟环境中训练机器人。然而,虚拟环境并不能百分之百地代表真实世界的动态。(分布可能不同。在本文中,作者研究了自主 MAV 飞行环境中知识转移的有效性。在那里,他们在源领域中训练系统,并将所学的知识应用到新的领域中。

技术方法

在这一节中,作者描述了如何设置实验的技术细节。一种可能教授控制者如何驾驶无人驾驶飞机的方法是给他们一组人类飞行员演示。通过足够的迭代,控制器将学习一个最优策略(π),至少可以像控制人一样控制无人机。然而,这种方法的一个问题是它不能很好地推广。(即域名迁移很困难)。因此,作者将该问题公式化为给定来自源域 D 和目标域 D’的数据,学习策略 pi (π),其中它减少了跨域差异。两个或更多事实之间缺乏兼容性或相似性。)。还训练了一个能控制无人机的 CNN。

为了克服目标数据没有分配标签的事实,作者使用附加损失函数来最小化域差异。下面可以看到完整的成本函数。

左侧是具有交叉熵损失的传统损失函数,右侧是附加损失函数,其中他们使用最大平均差异(MK-MMD)的多个核变量作为度量的平均值来测量每个域之间的差异。

实验和结果

在这一节中,作者描述了如何判断实验和算法。总之,在源域中收集了 1 km 的有人驾驶飞行的训练数据。和测试在目标域(相同的 1 km)中进行,通过使用随机策略来控制无人机或使用完整的训练数据来设置下限和上限。

如上所述,本文作者测试了三种不同类型的域名迁移。1)不同系统(不同无人驾驶飞机)之间转移;2)不同天气(夏季/冬季)之间的转移;以及 3)不同环境(不同森林)之间的转移。对于案例 1 和 2,他们能够获得系统性能显著提升。(作者假设这主要是由于更好的传感器和冬天没有障碍。)然而,在第三种情况下,它们只能获得轻微的性能提升。最后,作者指出要提高运动策略在物理系统上的可移植性。需要注意的是…..

(1)由动力学差异引起的域转移,
(2)目标域中的预期失败案例。
(3)不仅是领域,还有任务诱发的差异。

结论

总之,作者能够成功地证明将领域知识从源转移到目标的有效性。他们的系统学习人类如何在源领域控制无人机,并将学到的知识应用到新的目标领域。

最后的话

模仿学习是令人着迷的东西,也是很好的问题形成方式。

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

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

参考

  1. Daftry,s .,Bagnell,j .,& Hebert,M. (2016 年)。单目反应式微型飞行器控制的学习转移策略。Arxiv.org。检索于 2018 年 6 月 25 日,来自https://arxiv.org/abs/1608.00627
  2. (2018).Cs.cmu.edu。检索于 2018 年 6 月 25 日,来自https://www . cs . CMU . edu/~ s Ross 1/publications/Ross-aistats 11-no reget . pdf
  3. 差异,意思——谷歌搜索。(2018).Google.ca 于 2018 年 6 月 25 日检索,来自https://www.google.ca/search?q=discrepancy%2C+meaning&rlz = 1c 1 chbf _ enca 771 ca 771&OQ = disci&aqs = chrome . 0.69 I 59j 69 I 65j 69 I 57j 0 l 3.2225j 0j 7&sourceid = chrome&ie = UTF-8

推荐系统的矩阵分解技术

原文:https://towardsdatascience.com/paper-summary-matrix-factorization-techniques-for-recommender-systems-82d1a7ace74?source=collection_archive---------7-----------------------

Photo by Andrew Neel on Unsplash


Paper from this website

摘要

这些天来,我们不断被各种来源推荐,比如读什么博客,听什么音乐等等…..这些推荐系统变得比以往更加个性化。本文作者利用矩阵分解技术建立了一个复杂的推荐系统,其性能优于最近邻技术。(在电影推荐系统的设置中)。

推荐系统策略

内容过滤 →为每个用户或产品创建一个档案,以描述其性质(成功案例:音乐基因组项目)

协作过滤 →分析用户之间的关系和产品之间的相互依赖关系,以识别新的用户-项目关联(成功案例:Tapestry)

协同过滤通常比内容过滤更准确,但是它存在冷启动问题。(如果新用户存在,且与其他用户之间没有任何相互依赖关系,我们无法推荐任何内容)。通常有两种方法来实现协同过滤。

邻近方法 →计算项目之间的关系,或者用户之间的关系(用户群)

潜在因素 →创建一个潜在特征,将一个用户与另一个用户进行比较(特征库)

矩阵分解方法

当用户对他们看过的某部电影进行反馈时(比如他们可以从一到五打分),这些反馈可以用矩阵的形式来表示。其中每行代表每个用户,而每列代表不同的电影。显然,矩阵将是稀疏的,因为不是每个人都会看每部电影,(当谈到电影时,我们都有不同的品味)。

矩阵分解的一个优点是它可以包含隐含的反馈信息,这些信息不是直接给出的,而是可以通过分析用户行为得到的。使用这个强度,我们可以估计用户是否会喜欢一部(他/她)从未看过的电影。如果估计的收视率很高,我们可以向用户推荐这部电影。

Image from this website

上图很好地总结了矩阵分解背后的核心思想。设矩阵 A 的维数为(m,n ),这个矩阵可以看作两个矩阵之间的点积,每个矩阵的维数分别为(m,k)和(k,n)。

顺便说一下,上述概念与奇异值分解(SVD)密切相关。SVD 的一个缺点是,当原始矩阵稀疏(不完整)时,左右奇异向量是未定义的。

矩阵分解的概念可以用数学方法写成如下形式。

然后我们可以创建一个关于 q 和 p 的目标函数(我们希望最小化),这是(m,k)和(k,n)矩阵。

右边的项是正则项,这是添加的,因为我们不希望我们的分解矩阵 q 和 p 过拟合原始矩阵。因为我们的目标是以一种预测未来未知评级的方式来概括以前的评级,所以我们不应该过度拟合我们的模型。

学习方法

求矩阵 q 和 p 的一个明显的方法是梯度下降法。因为我们已经定义了损失函数,所以对 q 和 p 取偏导数来优化这些值。

通过偏导数,更新规则看起来会像上面这样。但是误差表面不是凸的,我们也可以采用另一种方法,其中我们交替地固定 q 和 p,同时优化另一个。

添加偏置

一些电影有偏见,因为它被广泛认为比其他电影更好(或更差),一些用户有偏见,因为他们超级咸,从不给电影评分超过 2 分。这些被称为偏差或截距,它们独立于任何相互作用,使用我们的两个分解矩阵 q 和 p 来解释这些偏差项是不明智的,因此我们将偏差项包含在原始方程中。

新的目标函数如下所示。

就像我们如何在原始函数中添加额外的偏置项一样,我们可以添加额外的项来解决冷启动问题。以及结合用户和项目的时间动态。(甚至自信分数)

遗言

我认为我们可以使用矩阵分解来构建推荐系统是非常酷的。

参考

  1. (2018).Datajobs.com。检索于 2018 年 11 月 22 日,来自https://data jobs . com/data-science-repo/Recommender-Systems-[网飞]。pdf
  2. 音乐基因组计划。(2018).En.wikipedia.org。检索于 2018 年 11 月 22 日,来自https://en.wikipedia.org/wiki/Music_Genome_Project
  3. 使用 Pyspark 对 Movielens 数据集进行简单的矩阵分解示例。(2018).中等。检索于 2018 年 11 月 22 日,来自https://medium . com/@ connectwithgosh/simple-matrix-factorization-example-on-the-movie lens-dataset-using-py spark-9b 7 E3 f 567536

论文摘要:神经常微分方程

原文:https://towardsdatascience.com/paper-summary-neural-ordinary-differential-equations-37c4e52df128?source=collection_archive---------0-----------------------

NIPS 2018(加拿大蒙特利尔),或者现在被称为 NeurIPS,已经结束了,我想借此机会剖析一下在这个久负盛名的会议上获得最佳论文奖的论文之一。论文名为神经常微分方程 ( arXiv 链接),其作者隶属于著名的多伦多大学矢量研究所。在这篇文章中,我将尝试解释这篇论文的一些主要观点,并讨论它们对深度学习领域未来的潜在影响。由于这篇论文相当先进,涉及到诸如常微分方程 ( ODE )、递归神经网络 ( RNN )或归一化流 ( NF )等概念,如果您不熟悉这些术语,我建议您仔细阅读,因为我不会详细讨论这些术语。不过,我会尽可能直观地解释这篇论文的观点,这样你可能会明白主要概念,而不会过多地涉及技术细节。如果你感兴趣的话,你可以在原文中仔细阅读这些细节。这篇文章被分成多个部分,每个部分解释论文中的一个或多个章节。

从变换序列到神经微分方程

今天,多种神经网络架构,如 RNNs 或残差网络,包含重复的层块,能够保留顺序信息,并通过学习的功能在每一步中改变它。这种网络通常可以用下面的等式来描述

在此, hₜ 是时间步长 t 的“隐藏”信息,f(hₜ,θₜ) 是当前隐藏信息和参数 θₜ 的学习函数。本文提出的中心问题是,我们是否可以通过逐渐减小步长*【t,t+1】*来改善这些网络的当前最先进结果。我们可以将此想象为逐渐增加 RNN 中的评估数或增加残差网络中的残差层数。如果我们这样做,我们将最终得到上述方程的无穷小(微分)版本:

这样的方程被称为常微分方程 (ODE),因为解是一个函数,即函数 h(t) 。换句话说,通过解方程,我们得到了想要的隐藏状态序列。我们将不得不在每次评估中求解这个方程,从初始状态 h₀.开始这样的问题也叫初值问题。

用伴随方法计算微分方程求解器的梯度

数值求解一个常微分方程通常是通过积分来完成的。多年来已经发明了多种积分方法,包括简单的欧拉方法和龙格-库塔方法的高阶变体。然而,所有这些都是计算密集型的。在训练过程中尤其如此,这需要对积分步骤进行区分,以便能够将网络参数 θₜ 的所有梯度相加,从而导致高存储成本。

在本文中,作者提出了一种计算常微分方程梯度的替代方法,即使用庞特里亚金的所谓伴随方法。这种方法通过求解**第二个时间上向后扩展的 ODE 来工作,**可用于所有 ODE 积分器,并且具有较低的内存占用。让我们考虑最小化 ODE 求解器结果的成本函数,即

(很遗憾,作者在本节中用 z(t) 交换了 h(t) ,但不要让自己被这个迷惑了)。在第二步中,使用 ODE 的解的定义,在第三步中,引入 ODESolve 操作作为求解 ODE 的操作符。如前所述,这个运算符依赖于初始状态 z(t₀) ,函数 f ,起始和结束时间 t₀t₁ 以及搜索到的参数 θ 。伴随方法现在确定损失函数相对于隐藏状态的梯度:

这个量现在跟在增强的颂歌后面

计算梯度 ∂L/∂z(t₀) (上述方程所需的第一梯度)现在可以通过在时间上向后求解扩充的 ODE 来完成。为了完整起见,下面的等式说明了如何计算相对于神经网络函数参数的梯度:

作者提出的整个梯度计算算法在伪代码中如下进行:

如果你对这个复杂计算的数学细节感兴趣,请参考原始论文,甚至是关于伴随方法的原始论文。这篇论文的作者甚至提供了 Python 代码来轻松计算 ode 求解器的导数。

用于监督学习的 ODE 网络

现在我们来看这篇论文最有趣的部分:应用。作者在论文中提到的第一个应用是在监督学习领域,即 MNIST 书面数字分类。目的是表明 ODESolve 方法可以用少得多的参数获得与残差网络相当的性能。本文中用于评估的网络对输入图像进行两次下采样,然后应用 6 个残差块。总而言之,该网络包含大约。0.6M 参数。ODESolve 网络用一个 ODESolve 模块代替了 6 层。此外,作者测试了一个 RK-网络,除了它直接使用龙格-库塔法反向传播误差之外,它是类似的。如上所述,您可以将传统神经网络中的层数与 ODE-Net 中的评估数联系起来。这两个网络的参数数量是 0.22M。重要的结果是,RK-网络和 ODE-网络以大约 1/3 的参数实现了与剩余网络大致相同的性能。另外 ODE-Net 的内存复杂度是常数(对比下图)。

此外,可以调整 ODE 解决方案的精度,以最大限度地提高计算性能。例如,可以高精度地执行训练,而在评估期间降低精度(关于进一步的细节,请参考论文)。

连续正常化流程

因为我怀疑许多读者不会熟悉规范化流程的概念,所以我将在这里提供一个非常简短的介绍。标准化流是分布的可逆变换。它们使人能够通过一系列非线性转换将简单的概率密度转换为复杂的概率密度,就像在神经网络中一样。因此,他们在分配中使用变量交换公式:

其中 q0(z0) 是初始分布, qK(zK) 是变换后的分布,变换 fk,k=0..上述和中的雅可比行列式由此确保分布函数的积分在整个变换中保持为 1。不幸的是,除了一些简单的变换,计算这个行列式的代价相当高。

归一化流量的一个流行应用是变分自动编码器(VAE),它通常假设潜在变量是高斯分布的。这种假设恶化了 VAE 的输出,因为它不允许网络学习期望的分布。通过归一化流量,高斯参数可以在被“解码”之前被转换成各种各样的分布,从而提高 VAE 的生成能力。这篇博文详细解释了标准化流程。

我们现在正在讨论的论文提出了将标准化流扩展到连续域的方法。有趣的是,这简化了归一化常数的计算。如果我们使随机变量连续并依赖于时间,时间动态由函数 f 描述(f 是 Lipschitz 连续的),那么对数概率的变化遵循简单的微分方程

因此,行列式的计算在这里被简单的迹运算所代替。此外,如果我们使用变换的和,那么我们只需要对轨迹求和:

作者还为各种转换引入了门控:

他们称这样的变换总和为连续归一化流 (CNF)。

为了显示 CNF 的有效性,本文测试了概率密度从高斯分布到两种目标分布的转换,如下图所示。

Transformation stages (5–100%) between Gaussian distribution and target distribution using CNF (upper two rows) and NF (bottom row).

通过使用最大似然估计来最大化目标概率分布下的期望值,然后反转模型以从学习的分布中采样,来训练 CNF 和 NF。

通过常微分方程生成时间序列模型

论文中提到的第三个应用,可能是最重要的一个,是通过 ODEs 进行时间序列建模。作者开始这项工作的动机之一是他们对不规则采样数据的兴趣,如医疗记录或网络流量。这种数据的离散化通常是不明确的,导致在一些时间间隔内丢失数据或仅仅是不准确的潜在变量的问题。有一些方法将时间信息连接到 RNN 的输入,但是这些方法并不能从根本上解决当前的问题。

基于 ODESolve 模块的解决方案是连续时间生成模型,其给定初始状态 zₜ₀和观察时间 t0…tN,计算潜在状态 z_t1…z_tN 和输出 x_t1…x_tN:

函数 f (一个神经网络函数)负责计算从当前时间步长开始的任何时间 t 的潜在状态 z 。该模型是一个变分自动编码器,它使用 RNN 对初始潜在状态 zₜ₀中的过去轨迹(下图中的绿色)进行编码。如同所有的变分自动编码器一样,潜在状态分布由此通过分布的参数(在这个例子中是具有平均值μ和标准偏差σ的高斯分布)被捕获。从这个分布中,抽取一个样本并通过 ODESolve。

该架构在双向二维螺旋的合成数据集上进行测试,该数据集在不规则的时间点采样并被高斯噪声破坏。下图定性显示了潜在神经 ODE 模型的卓越建模性能:

结论

在论文中,提出了一种非常有趣和新颖的思考神经网络的方法。这可能是一篇里程碑式的论文,开启了深度学习的新进化。我的希望是,随着时间的推移,越来越多的研究人员将开始从根本上不同的角度思考神经网络,就像这篇论文一样。

这种方法是否真的适用于各种各样的现有模型,是否能被时间证明是有效的,还有待观察。作者确实提到了他们方法的一些局限性:

  • 小批量可能是这种方法的一个问题,因为批量处理多个样本需要一次求解一个微分方程组。这可以大大增加所需评估的数量。然而,作者确实提到,即使在整个实验过程中使用了迷你批处理,评估的数量仍然是可控的。
  • 只有当网络具有有限的权重并使用 Lipschitz 非线性(例如 tanh 或 relu,而不是阶跃函数)时,ODE 解的唯一性才能得到保证。
  • 前向轨迹的可逆性可能会受到由前向 ODE 解算器中的数值误差、反向 ODE 解算器中的数值误差以及由于映射到相同最终状态的多个初始值而导致的信息丢失所引入的不准确性的影响。

作者也提到他们的方法不是唯一的,残差网络作为近似常微分方程解算器的想法已经很老了。此外,存在试图通过神经网络以及高斯过程来学习不同方程的论文。

本文提出的方法的一个重要优点是,在评估和/或训练过程中,人们可以通过影响数值积分的精度来自由选择快速解和精确解之间的平衡。此外,该方法非常普遍适用(仅要求神经网络的非线性是 Lipschitz 连续的),并且可以应用于时间序列建模、监督学习、密度估计或其他顺序过程。

[论文摘要/ NIPS 2017 ]显著性方法的(不)可靠性

原文:https://towardsdatascience.com/paper-summary-nips-2017-the-un-reliability-of-saliency-methods-8ed7774a69aa?source=collection_archive---------8-----------------------

GIF from this website

另一篇伟大的论文解释了如何解释神经网络

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

Paper from this website

摘要

许多研究人员正在寻找方法来解释神经网络内部到底发生了什么,显著性方法就是其中之一。然而,事实证明,当解释对无助于模型预测的因素敏感时,这些方法就不那么可靠了。(如简单的常数加法到输入数据中。)并且作者已经发现,不满足输入方差属性的显著性方法会导致误导属性。

简介

多重显著性方法旨在做同样的事情,解释神经网络内部发生了什么。(或推断对所学函数 f(x)的见解)。但是在实践中,它们是以各种不同的方式实现的,并且彼此不重叠。因为没有基本的真实数据,所以很难评估不同的方法,但是许多研究人员开发了一些属性来设置指导线,这些属性包括实现方差和输入方差。

该模型对于输入的恒定偏移是不变的

首先让我们有一个函数 f1(),它执行分类任务,输入值为 x1。

接下来让我们有输入值 x2,其中我们添加一些常数到 x1。

我们可以像上面这样定义 f1()函数。

然后,可以容易地示出函数 f2()接受 x2 的输入值,如果偏移值被相应地设置,则两个函数计算相同的东西,导致每个输入的导数值也相同。(w)。换句话说,f2()的偏置值抵消了变换。作者将使用 CNN 对输入价公理做一些实验。

显著性方法对均值漂移的(不)敏感性

作者考虑了三种显著性方法,并考虑了每种方法的输入方差。(满足方差内移位特性的方法将导致相同的热图。)

  1. 梯度 →输入的微小变化如何影响输出
  2. 信号 →哪些输入模式刺激神经元激活
  3. 归因 →将许多不同的归因观点及其梯度相加

梯度和信号方法满足输入方差

如上所述,当我们考虑基于梯度的方法以及模式网时,我们可以观察到生成的显著性热图彼此相同。(因为我们在技术上考虑的是同一个功能)。

归因方法的敏感性

对于归因方法,作者考虑了三种方法梯度输入(IG),综合梯度(IG)和深度泰勒分解(DTD)。

从上图中,我们可以看到 GI 对均值漂移很敏感,因此不满足输入方差特性,而其他两个方法参考点非常重要。(结果是 GI 失败的原因是由于输入值 x 的乘法,均值漂移继续存在。)

参考点方法的可靠性取决于参考点的选择

如上所述,根据 IG 和 DTD 的参考点,它会产生不同的显著性映射。对于 IG,当我们将参考点设置为由来自输入数据 x 的最小值组成的图像时,我们得到相同的显著热图,因为输入数据和参考点之间的关系很重要。但是,当我们设置一个恒定的基线参考点(如值为零的图像)时,生成的热图会有所不同。与 DTD 类似,当选择零矢量图像时,产生的热图不同,然而,当通过模式属性选择参考点时,输入方差成立。并且模式属性具有约束,因为它考虑了数据内变化的自然方向。

选择合适参考点的重要性

到目前为止,我们已经看到,选择正确的参考点是非常重要的,因为与处理音频或文本数据相比,视觉数据选择合适的参考点更容易。如果我们不能确定参考点选择的含义,我们就不能对这种方法的可靠性做出任何评价。

如上所述,这再次表明,选择正确的参考点可以帮助更好地理解模型正在做什么。

结论

总之,本文作者提出了另一个称为输入方差的公理,其中显著性方法应反映模型对输入变换的敏感性。并且已经表明一些方法不能满足这一特性。

最后的话

非常酷的研究…

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

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

参考

  1. (2018).Arxiv.org。检索于 2018 年 8 月 1 日,来自https://arxiv.org/pdf/1711.00867.pdf
  2. Kindermans,p .,Hooker,s .,Adebayo,j .,Alber,m .,Sch:tt,k . & Dé;hne,s .等人(2017 年)。显著方法的(不)可靠性。Arxiv.org。检索于 2018 年 8 月 1 日,来自https://arxiv.org/abs/1711.00867

更快的深度学习:最优 DNN 原语

原文:https://towardsdatascience.com/paper-summary-optimal-dnn-primitive-selection-with-partitioned-boolean-quadratic-programming-84d8ca4cdbfc?source=collection_archive---------5-----------------------

这是麻省理工学院机器智能社区(MIC)的“ML 开创性论文”系列中的一篇论文。麻省理工学院 MIC 旨在教育整个社区关于机器学习的知识,并降低进入门槛。如需了解更多信息,请访问 https://mitmic.io 或发送电子邮件至【mic-exec@mit.edu】T2。

深度神经网络(DNNs)在越来越广泛的工业应用中提供了无与伦比的准确性和性能,例如图像识别、自然语言处理和自动驾驶汽车控制等其他复杂问题。尽管与旧的机器学习算法相比,dnn 的结果有了很大的改善,但在计算方面要求非常高,并且需要在大规模数据集上进行训练,需要花费大量时间。因此,为加快 DNNs 的训练时间和推理时间(在给定训练模型的情况下,实际进行预测所需的时间)做出了许多努力,这是有意义的。这使我们能够在更短的时间内对更多的数据进行训练,并在功能不太强大的设备(如手机或嵌入式系统)上进行更快的推理。在他们的论文“使用分区布尔二次规划(PBQP)的最优 DNN 图元选择”中,Andrew Anderson 和 David Gregg 采用了一种混合方法来优化 DNN 计算。他们专注于寻找解决 DNN 图元选择问题的解决方案,这可以描述为决定使用哪些算法和库来运行 DNN 的每一层——该问题将在下面详细解释。他们还将问题简化为一个已知的 NP-hard 图问题, PBQP ,并使用现成的 PBQP-solver 来解决它。

在评估结果时,特别强调了卷积运算,这是一种计算极其密集的运算,几乎在所有图像处理 dnn 中都使用,这种网络称为卷积神经网络(CNNs) 。

DNN 原语及其重要性

DNNs 由层的有向图组成,并且数据流发生在这些层之间的有向边上。每一层都处理数据,并由标准的数学运算符组成,如卷积、激活、汇集或全连接层。一层的输出馈入下一层,这对应于数据流。这些层被实现为一组原语例程,其中每个原语都是这些数学运算的优化实现。一个层有许多可能的算法和实现,这就等于说有许多可供使用的原语例程可供选择,包括开源实现和专有库。例如 WinogradFFT 是可以用来实现卷积的两种算法。重要的是要注意,这些原语在不同的场景中有不同的表现,这取决于层的规范。目标是为每一层选择最佳的原语例程,使得整个网络的总运行时间最小化——这个问题被称为最优 DNN 原语选择。

什么是卷积层?

虽然使用的方法是通用的,并且可以很容易地对任何类型的图层进行实施和测试,但评估重点仅放在卷积图层上。这些通常支配运行时间,也用于许多重要的 CNN 图像处理。卷积层的输入通常是一个 张量 ,通常是二维图像的三维或四维表示。例如,对于典型的彩色 2-D 图像的三维表示,前二维通常编码像素的水平和垂直位置,第三维通常存储像素中红色、绿色和蓝色的量。卷积层通过在图像上滑动一系列小的“过滤器”或“内核”来处理这个张量,以执行数学卷积运算。下图显示了一个轮廓,其中大小为 H×W×C 的图像与大小为 k×k×C 的核进行卷积,以获得大小为 H×W 的输出图像(称为“特征图”),因为有 M 个这样的核,所以输出表示为大小为 H×W×M 的张量。多个核在这里非常重要,因为它们可以使网络“学习”不同的特征和模式。例如,一个内核可能试图检测图像中猫的存在,而另一个内核可能学习检测狗。由此产生的张量——带有来自所有内核的输出——然后可以被馈送到 max-pooling 层 中,该层将检测这 M 个模式中的哪一个最重要,例如猫内核是否找到了比狗内核更好的匹配——这实现了高精度的图像分类。

Figure 1: A convolution layer showing an image of size H×W with C channels undergoing convolution with M kernels of size k×k×C.

卷积层中的图元选择和数据格式协议

存在大量不同的卷积原语。直接循环法、 im2、kn2 、 Winograd 和 FFT (使用快速傅立叶变换算法),都是可以用来实现卷积的算法家族。如前所述,每种算法的性能取决于卷积层的参数和规格。例如,直接循环方法在 步进卷积上表现良好,其中内核跳过一些输入像素以给出较小的输出图像,im2 家族在这种情况下也表现良好。然而,直接循环方法通常较慢,im2 算法非常占用内存。Winograd 速度非常快,但不可预测。FFT 也是一个平衡性能的选择,但是对于小内核来说是不好的;尽管具有较低的渐近复杂度,但它具有较大的开销,因此导致较低的复杂度仅在输入较大时有益。其他参数,如通道数量(即上图中的 C 值)也会影响图元的最佳选择。

因为在典型的 CNN 中,每一层的参数变化很大,所以为每一层选择不同的原语是有意义的,以便最小化整个网络上计算的总运行时间。乍一看,这似乎是一个非常容易解决的问题:在实际运行整个网络之前,我们可以简单地尝试每一层上的每个原语,并在一个列表中记录运行时间(让我们将这个列表称为“成本向量”)。对于这个试运行,我们可以只使用随机输入值,因为运行时间并不真正取决于值本身,而只是它们的总数。这实际上是作者们开始做的。

在对运行时间进行采样后,我们可以通过查看哪种算法在试验中表现最佳来为每一层选择最佳算法——问题解决了!该过程如下所示:

Figure 2: A graph showing a 3-layered CNN. The “cost vectors” shown beside each layer represent the costs of primitives A, B, and C for each layer. For example, on layer conv1, primitive A runs with a cost of 8, primitive B with a cost of 6, and C costs 10 — similarly for the other layers.

这里卷积层表示为节点: conv1conv2conv3 。这三个原语是 A、B 和 c。图中显示了每一层的原语成本向量(由试运行确定),我们可以看到,优化整个网络就是选择最低成本原语。在这种情况下,它对应于为 conv1 选择算法 B,为 conv2 选择算法 C,并再次为 conv3 选择算法 B。网络的总成本是每层成本的总和。

然而,这种天真的解决方案遗漏了一个关键的方面。它没有考虑每个原语操作不同*数据格式的数据的事实。*例如,一些原语接受并产生 16 位浮点格式的输出值,而其他原语使用 32 位浮点。有些图元还需要输入图像尺寸的特定排列,CHW(通道×高度×宽度)和 HWC(高度×宽度×通道)是两种不同的数据格式,特定图元可能只能操作其中一种格式。另一个例子是,如果对信号进行操作,数据可以用频域 表示,或者用 时域 表示(这两者只是表示同一信号的不同方式),不同的原语可能只支持其中一种格式。如上图所示,必须考虑到这一点,可能 conv1 使用的数据格式与 conv2 不同,数据需要从 conv1 格式转换为 conv2 格式,然后才能在它们之间传递— 这种转换需要时间。因此,我们需要在优化中考虑数据格式转换的成本。

PBQP

由此产生的优化问题现在不仅考虑了原语的运行时间,还考虑了连续层中使用的原语之间的数据格式转换时间。作者表明,这等价于一个已知的 NP-hard 问题, 【分块布尔二次规划】 。在 PBQP 中,给我们一个图,每个节点必须被分配一个标签,这个标签来自一组给定的代表成本的标签。因此,每个节点都有一个针对所有标签的“成本向量”,这与上图中的问题类似。为节点选择标签的成本会将相应的成本添加到我们目标的总成本中,这是我们希望最小化的成本。但是除了节点的成本之外,每个边也有成本。边的成本既取决于源节点标签的选择,也取决于目标节点标签的选择。因为它依赖于两个连接节点的标签,所以它可以被认为是一个矩阵(因为它由两个标签索引)。下图对此进行了说明:

Figure 3: A graph showing a 3-layered CNN. The cost vectors are also shown for primitives a, b, and c similar to Figure 1*.* The edge cost matrices are also shown, where the row represents the label of the source node, and the columnrepresents the label of the target node. For example, selecting primitive c for conv1 costs 10, and selecting primitive b for conv2 costs 19. But an additional edge cost of 5 also occurs as given by the edge cost matrix.

在上图中我们可以看到, conv1 的最低成本原语是成本为 6 的原语 b ,而 conv2 的最低成本原语是成本为 14 的原语 c 。但是现在我们还必须考虑边成本,并且使用这种分配给出了额外的边成本 5,这是通过适当地索引到边成本矩阵中给出的。因此,实际上为 conv1 选择原语 c 更好,因为它给出的边成本为零。总成本就是所有节点和边成本的总和,这是我们现在想要最小化的目标。

实施和测试

既然我们有了要解决的正确问题,我们就可以实现并测试它了。为此,我们首先需要运行原语的成本,以及数据格式之间转换的成本。通过针对实际大小的随机输入运行每一层的图元来预先计算运行图元的成本,并且这应该是相当准确的,因为层的运行时间取决于输入大小而不是实际值。

数据格式转换成本也可以通过运行转换和采样时间来预先计算,如果无法直接转换,则使用成本最低的转换路径。这意味着,例如,如果数据格式 A 不能转换为数据格式 B。但是 A 可以转换为数据格式 C,而数据格式 C 又可以转换为 B,则使用转换成本的总和(这被建模为所有对最短路径问题,并且容易解决)。

一旦成本向量和矩阵准备就绪,就可以使用现成的 PBQP 求解器来获得要进行基准测试的 DNN 的最佳图元选择。在三个流行的神经网络上测试了性能: AlexNet 、 VGG Model E 和 GoogleNet 。运行时间与只使用单个原语时的性能进行了比较,也与 Caffe (一个流行的深度学习框架)进行了比较。英特尔的 MKL-DNN 库的基准也包括在内,它是一个针对 DNN 原语优化的 JIT 编译器。实验在不同的硬件架构上进行,英特尔 Haswell 的速度结果如下所示(越高越好):

Figure 4. Speedups on Intel Haswell of different algorithms for running various popular DNNs.

我们可以看到,在英特尔 Haswell 上,PBQP 原语赋值在多线程的情况下优于所有其他方法,甚至是英特尔自己的 MKL-DNN 神经网络编译器。在单线程运行的情况下,MKL-DNN 在 AlexNet 和 GoogleNet 网络中的性能稍好,但 PBQP 方法非常接近,仍然优于其他方法。对 VGG 来说,PBQP 方法也优于 MKL-DNN 法。

ARM Cortex 的性能结果如下所示(越高越好):

Figure 5. Speedups on ARM Cortex of different algorithms for running various popular DNNs

这里我们还可以看到,PBQP 分配优于 ARM Cortex-A57 架构上的所有其他网络实现。

讨论和结论

从实验结果可以清楚地看出,PBQP 公式在选择最佳基元来实现 DNN 方面极其有效。存在其他 DNN 优化框架,其中一些使用类似的技术来实现更快的 DNN 计算。也许最快的例子是 NVIDIA 的 cuDNN,它也使用了对于给定的层来说最快的实现/原语。这与 PBQP 求解器形成对比,因为它不考虑边成本,即数据格式转换的时间。 Tensorflow XLA 是另一个框架,它基本上是 DNNs 的提前编译器。它计算跨层转换和数据格式转换的成本,并尝试合并层以避免这些成本,这在某种程度上类似于 PBQP 方法。结果表明,PBQP 方法改进了 DNN 运行时间,因此它可能非常适合于被 DNN 优化框架采用以进行改进。作者在 2018 年代码生成和优化国际研讨会(CGO)上提交了这篇论文,论文中采用的方法使我们能够更快地训练 DNNs,并在越来越多的廉价移动和嵌入式处理器上执行深度学习和推理。

关于作者

阿里·扎塔什(Ali Zartash)是麻省理工学院(MIT)的一名大四学生,也是麻省理工学院机器智能社区(MIC)的成员,该社区是本科生人工智能俱乐部。今年夏天,他在谷歌实习,从事社交排名/推荐系统的数据管道和图形工作,此前他曾在 SpaceX 实习,从事 GPU 负载分配工作。他把空闲时间花在和朋友踢足球上。欲了解更多关于 MIC 的信息,请访问

[论文摘要] pCAMP:机器学习包在边缘上的性能比较

原文:https://towardsdatascience.com/paper-summary-pcamp-performance-comparison-of-machine-learning-packages-on-the-edges-3cec1b5cad4c?source=collection_archive---------11-----------------------

GIF from this website

我个人喜欢 Tensorflow,但是我想知道它与不同框架相比表现如何,特别是在像 Raspberry Pi 3 这样的物联网设备上。

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

摘要

本文的主要重点是比较运行在物联网设备上的不同机器学习包的性能。我们要比较的库包括…

1 。tensor flow→tensor flow 是一个用于高性能数值计算的开源软件库。来自谷歌。

**Caffe 2一种全新的轻量级、模块化、可扩展的深度学习框架。来自 FaceBook

3。MXNet→灵活高效的深度学习库。来自阿帕奇

4。py torch→快速、灵活实验的深度学习框架。来自 FaceBook

5。Tensorflow Lite→一款面向移动和嵌入式设备的 tensor flow 轻量级解决方案。来自谷歌

太久没看了(TL;博士)

  1. 每个指标都没有明显的赢家,每个包都有自己的优势。
  2. 加载模型所需的时间很长,因此可能有机会优化加载时间。
  3. 牺牲空间来提高执行效率可能是优化这些包的好方法。

Tensorflow →适用于基于 CPU 的物联网大网络
Caffe 2 →适用于小网络
MXNet →适用于杰特森 TX 2
PyTorch →内存高效
Tensorflow Lite →???

简介

由于更复杂的机器学习模型、更高的处理能力和大数据,基于机器学习的应用程序呈指数级增长。然而,越来越多的计算是在边缘(雾)而不是云中进行的,但是有少量的研究可以比较不同框架的性能。因此,在本文中,作者将使用 Alex Net(大型网络)和 Squeeze Net(小型网络)来查看 MacBook Pro (MacBook)、英特尔的 Fog node(Fog node)、NVIDIA Jetson TX2 (Jetson TX2)、Raspberry Pi 3 Model b+(Raspberry Pi)和华为 Nexus 6P 的性能。完整的硬件和软件表如下所示。

****

相关工作

其他研究人员早在 2016 年就已经在衡量不同图书馆的表现。然而,他们测量的是云平台而不是物联网设备的性能。

实验方法

在这一部分,作者给出了每个框架的简要总结和历史。以及 Alex 网和 Squeeze 网的简单总结和历史。总之,Alex Net 有 61,100,840 个参数和 240MB 大小,而 Squeeze Net 有 1,248,424 个参数和 4.8MB 大小。

此外,作者指出,对于 Tensorflow Lite,他们无法获得官方的 Alex Net 或 Squeeze Net,因此他们使用了可用的 MobileNet 。最后,作者给出了他们如何测量每个指标的细节,他们是。

1.延迟→运行/加载模型的时间。
2。内存足迹→模型占用多少内存。
3。能量→模型需要多少能量。

结果和讨论

除了 Raspberry Pi 和 Nexus 6P,所有指标都在上图中进行了总结。

**树莓 PI (Sqeeuze Net/Caffe 2) →总时间 218.67s .
**Nexus 6P(Mobile Net/tensor flow Lite)→推理时间(加载时间)0.26s

最后,每个指标的所有结果都可以很好地总结如下。

1.延迟 →对于某些包,加载模型然后运行它需要更长的时间。

2.内存 → MXNet,特别是,似乎牺牲空间来提高效率,其他框架可以遵循类似的优化方法。

3.能量 →潜伏期和能量之间似乎存在正相关关系。这意味着模型运行的时间越长,需要的能量就越多。

结论

总之,没有一个框架能够在每个指标上胜过其他框架。然而,似乎每个框架都有改进的空间,例如减少加载模型的时间。

遗言

很想知道 Tensorflow Lite 在 Iphone 上运行如何😂。我预计 Tensorflow 会占用大量内存/电源和所有东西。但我不知道要花这么多钱。

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

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

参考

  1. (2018).Cs.wayne.edu。检索于 2018 年 6 月 12 日,来自http://www.cs.wayne.edu/~weisong/papers/zhang18-pCAMP.pdf
  2. 树莓 Pi 3 型—树莓 Pi。(2018).树莓派。检索于 2018 年 6 月 13 日,来自https://www . raspberry . org/products/raspberry-pi-3-model-b/
  3. 张量流。(2018).张量流。检索于 2018 年 6 月 13 日,来自https://www.tensorflow.org/
  4. 咖啡 2。(2018).咖啡 2。检索于 2018 年 6 月 13 日,来自https://caffe2.ai/
  5. MXNet:一个可扩展的深度学习框架。(2018).Mxnet.apache.org。检索于 2018 年 6 月 13 日,来自https://mxnet.apache.org/
  6. PyTorch。(2018).Pytorch.org。检索于 2018 年 6 月 13 日,来自https://pytorch.org/
  7. TensorFlow Lite 介绍| TensorFlow。(2018).张量流。检索于 2018 年 6 月 13 日,来自https://www.tensorflow.org/mobile/tflite/
  8. Howard,a .,Zhu,m .,Chen,b .,Kalenichenko,d .,Wang,w .,& Weyand,t .等人(2017 年)。MobileNets:用于移动视觉应用的高效卷积神经网络。Arxiv.org。检索于 2018 年 6 月 13 日,来自 https://arxiv.org/abs/1704.04861

[论文摘要]在使用深度学习模型分析标准结肠镜检查的未改变视频期间,实时区分腺瘤性和增生性小结肠直肠息肉

原文:https://towardsdatascience.com/paper-summary-real-time-differentiation-of-adenomatous-and-hyperplastic-diminutive-colorectal-b1f726d97edd?source=collection_archive---------13-----------------------

GIF from this website

同样,越来越多的这些论文显示了深度学习可以为医疗保健行业提供什么。


Paper from this website

摘要

计算机辅助系统有助于以高精度区分小腺瘤和增生性息肉。在本文中,作者展示了一个使用卷积神经网络对息肉进行分类的示例。

关于这个问题已经知道了什么?/有什么新发现?

总的来说,专家取得了良好的结果,但是社区内镜专家未能保持一些有价值的内镜创新(PIVI)指南的保存和整合。人工智能可能会对这些领域有所帮助。本文的作者展示了一个使用案例,其中使用深度学习可以实现实时分类。

简介

在结肠镜检查期间,内窥镜专家做出不同的决定,例如癌症类型的分类和切除或保留的区域。在手术过程中,图像分析可以帮助内窥镜专家。目前,图像分析在精确确定具有最小癌症风险的微小病变的组织学方面取得了成功。(反过来,这也有经济上的好处。).然而,这些方法通常依赖于操作员,因此在某些情况下,社区医生的准确性低于可接受的性能阈值。

为了克服这些问题,已经研究了不同的成本有效的方法。其中一个成果是 NBI 国际结肠直肠内窥镜(NICE)分类系统。这个系统是为了帮助没有丰富经验的内窥镜专家而开发的。但是这种方法不能解决诸如无柄锯齿状息肉(SSPs)的问题。

自动图像分析更近的发展被开发以改进肿瘤检测。传统的图像分析技术依赖于手工制作的特征,并且它们在某些情况下并不健壮。但是深度学习的发展有可能克服这些问题。本文作者利用深度卷积神经网络对不同类型的多边形进行分类。

方法

使用奥林巴斯结肠镜上捕获的 NBI 视频,本文的作者成功地训练了一个深度卷积神经网络。并且所有使用的数据在用于本研究之前都被去识别。

DCNN 的一个优点是,人类不必为模型的成功表现制作手工特征。并且大致的网络架构可以在上面看到。(他们使用 SGD,mini batch 128,以及执行翻转的数据扩充。)最后,息肉分为两类:常规腺瘤或锯齿状病变。

如上所述,关于框架的一个有趣的事实是可信度的概念。其中它表示模型的置信水平。如果可信度低于 50 %,这些预测将被排除在准确性计算之外。所有使用的视频都是 10-20 秒,中间值为 16 秒。

结果

125 个息肉视频被用作测试集,然而在这些数据中,只有 106 个被用于计算模型的准确性,因为它们具有足够高的可信度。

对于 106 个息肉,准确率为 94%,识别腺瘤的灵敏度为 98%,特异性为 83%,阴性预测值为 97%,阳性预测值为 90%。

讨论

结肠直肠癌是美国癌症死亡的第三大原因,结肠镜检查不仅在该疾病的识别中而且在该疾病的治疗中起着关键作用。虽然不是结肠镜检查的所有方面都可以被软件取代,但是息肉的检测和组织学的预测是软件可以发挥作用的两个方面。这篇论文的作者已经表明,使用人工智能来高精度地执行这些任务是可能的。(甚至足以说,该模型比一些社区内窥镜专家表现得更好。).

遗言

尽管本文作者在测量精度时丢弃了一些测试数据,但本文提供了有希望的结果。写得非常好。

参考

  1. Byrne MF,e. (2018)。在分析标准结肠镜检查的未改变视频期间,腺瘤性和增生性小结肠直肠息肉的实时鉴别… — PubMed — NCBI。Ncbi.nlm.nih.gov。检索于 2018 年 7 月 9 日,来自https://www.ncbi.nlm.nih.gov/pubmed/29066576

【论文摘要】语义图像分割的最新进展

原文:https://towardsdatascience.com/paper-summary-recent-progress-in-semantic-image-segmentation-d7b93ee1b705?source=collection_archive---------8-----------------------

GIF from this website

我想知道更多关于不同的语义分割方法,这篇文章给出了一个很好的概述。

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

摘要

语义分割已经被研究了很长时间,它给医学图像领域以及其他领域带来了巨大的好处。此外,由于深度学习的最新发展,机器学习方法也能够得到应用。本文阐述了传统方法和深度学习方法。

简介

通常分割可以被认为是像素级分类,而不是把整个图像作为一个类来对待,我们要预测每个像素属于哪个类。(即物体检测或定位。).这一过程有很多应用,例如自动驾驶汽车的道路分割,或者该算法可以分割 MRI 扫描的癌症区域的医疗设置。一般来说,这种方法可以分为传统方法和深度学习方法。(由于深度学习,分割精度大大提高了。).

数据集/评估指标

已经有许多数据集用于语义分割和评估。,比如 PASCAL VOC,或者微软 COCO 数据集。(甚至还有城市景观数据集等…..).这些数据集主要目标是道路分割、光流估计和 3D 跟踪。图像分割和场景解析的评估包括像素精度、平均精度、并集上的区域交集和频率加权 IU。

传统方法

在深度学习之前,很多方法都包括特征提取。用于执行语义分割的一些特征研究包括,梯度方向直方图(HOG)、尺度不变特征变换(SIFT)和 Harris 角点,仅举几个例子。(还有很多,下面是文章的截屏。)

并且执行分割的方法包括简单的阈值处理。(基本上都有一些截止频率/像素强度。)这种方法在医学图像领域非常有效,其中图像通常是灰度级的。一些非监督方法包括 K 均值聚类,以聚类相似的像素,并且在监督学习的情况下,使用支持向量机。最后,马尔可夫随机网络和条件随机场及其变体也广泛用于分割。

最近 DNN 在分段

不同类型的神经网络,例如 ANN、RNN、CNN、LSTM 或 RBM 都可以用于执行分割。尽管有各种各样的 CNN,但它通常用于涉及图像的任务。此外,全卷积神经网络是分割中最流行的网络结构之一。

另一种流行的网络架构是上/下采样网络,类似于自动编码器。存在跟随有上采样网络的下采样网络。(这个地区最著名的网络之一是 U-Net)。

FCN 联合 CRF 及其他传统方法/扩张卷积

除了全卷积网络之外,还使用了不同的网络架构,包括具有 CRF 的 FCNN 或具有域转移的 RCNN,甚至马尔可夫随机场(MRF)。扩张卷积是在内核中插入 0 以增加感受野的卷积运算。(如上所示)第一种,这种网络被称为扩张残差网络(DRN ),以消除由常规扩张卷积运算产生的伪影。

骨干网/金字塔法细分进展

一般来说,骨干网是指网络的主体部分。在深度学习的初期,许多研究使用 VGG 网络作为它们的基础网络。然而,网络体系结构发展导致了残差网络,这种类型的网络甚至以完全卷积残差网络的形式被应用于语义分割。

除了主干网络的发展,研究人员还研究了不同的策略,其中一种策略包括金字塔网络。其中图像被下采样,直到达到一些期望的停止标准。有两种常见的图像金字塔:高斯金字塔,用于对图像进行下采样;拉普拉斯金字塔,用于从金字塔中较低位置的图像重建上采样图像。在语义分割的背景下,图像及其缩小版本可以用作网络的输入。(如下图)。

另一种金字塔方案是阿特鲁空间金字塔池(扩张卷积金字塔池),其中网络使用扩张卷积运算来缩小给定图像。

结论

总之,本文作者回顾了一些传统的语义分割方法。以及深度学习方法,其中包括…

  1. 全卷积神经网络
  2. 向上/向下采样方法
  3. FCN 加入了通用报告格式
  4. 扩张卷积
  5. 脊柱网络的研究进展
  6. 金字塔网络
  7. 多级特征和多阶段方法(未涉及)
  8. 监督/弱监督方法和非监督方法。(未覆盖)

最后的话

这篇论文是对与深度学习相关的不同类型的细分的一个很好的概述。最后,由于我要赶飞机,我没有介绍多级特征和多阶段方法以及监督、弱监督和非监督方法。

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

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

参考

  1. 刘,徐,邓,杨,杨(2018)。语义图像分割的最新进展。人工智能评论。doi:10.1007/s 10462–018–9641–3
  2. 罗斯布洛克(2016 年)。用于对象检测的交集(IoU)——PyImageSearch。PyImageSearch。检索于 2018 年 7 月 2 日,来自https://www . pyimagesearch . com/2016/11/07/intersection-over-union-iou-for-object-detection/
  3. 托视觉集团,U. (2018)。CRF 作为 RNN 语义图像分割。Robots.ox.ac.uk 于 2018 年 7 月 2 日检索,来自http://www.robots.ox.ac.uk/~szheng/crfasrnndemo
  4. 帕潘德里欧、陈、墨菲和尤耶(2015 年)。用于语义图像分割的 DCNN 弱监督和半监督学习。Arxiv.org。检索于 2018 年 7 月 2 日,来自https://arxiv.org/abs/1502.02734

[论文摘要] TandemNet:使用诊断报告作为可选语义参考从医学图像中提取知识

原文:https://towardsdatascience.com/paper-summary-tandemnet-distilling-knowledge-from-medical-images-using-diagnostic-reports-as-4643911a2aa0?source=collection_archive---------14-----------------------

GIF from this website

我不知道我从哪里得到这篇论文,但我想读它。

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

摘要

这篇论文太酷了,所以作者决定将诊断报告作为网络的输入,而不是仅仅依赖图像的特征。此外,作者还引入了一个双重注意力模型,最后,他们能够创建一个模型,其中有效地整合了来自多模态的知识,并产生了高性能。

简介

当我们想到一个人如何成为一名成功的医生时,不仅他们从 CT 或 MRI 扫描中学习,而且其他资深医生也解释了每个图像中发生的事情。受这种想法的启发,作者决定用不同形式的输入制作一个分类模型。网络架构如下所示。

这个网络要么只接受图像作为输入,要么接受一对图像和文本。它还可以生成医疗报告。然而,我有一个问题,如果医疗记录已经告诉网络诊断是什么,想要有一个 CNN 的点?

方法

在本节中,作者首先描述了网络架构。对于 CNN,他们决定用 Res Wide architecture,对于语言模型,他们决定用 LSTM。此外,他们制作了一个新颖的双注意模型,其中他们不仅接收图像数据(用 V 表示),还接收文本数据(用 S 表示)

此外,作者还介绍了两种推广网络的方法。
1)视觉跳过连接 →其中图像特征像 res net 架构一样跳过连接以增加梯度流
2)随机模态自适应 →其中文本数据被丢弃,使得网络不必依赖于文本数据。

实验

在这里,作者描述了他们如何获得数据,他们总共能够获得 1000,5005003 张图像,病理学家为每张图像提供了一段关于核多形性、细胞拥挤、细胞极性、有丝分裂和核仁突出的内容。接下来,他们描述了如何使用 Torch7 来实现串联网络。(使用 SGD)。

如上所述,我们可以观察到串联网络比其他比较网络具有更高的准确性。(以相当大的幅度。)

上面没有提到的事实是,他们有一个 LSTM 的辍学层,他们发现了一个与辍学率和使用文本数据相反的模式。随着辍学率的增加,模型使用的文本数据越来越少,反之亦然。

此外,当他们可视化每个数据点的隐藏表示时,他们发现使用文本数据可以更好地分布聚类。(t-SNE)

他们将视觉注意力掩模放大到与原始图像相同的尺寸,并将其重叠。之后,他们与病理学家认为最重要的位置进行了比较,并能够发现两个区域之间的高度相关性。当模型同时使用文本和图像时,相关性增加。

最后,使用来自“用于生成图像描述的深度视觉语义排列”的知识,他们也能够生成医疗报告,并且看起来做得很好。

结论

总之,本文作者介绍了一种新颖的网络,称为 TandemNet,它以文本和图像作为输入来执行分类,并获得了较好的结果。

遗言

我在医疗领域看到的最有趣的网络架构之一。

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

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

参考

  1. 张,张,杨(2017)。TandemNet:使用诊断报告作为可选的语义参考从医学图像中提取知识。Arxiv.org。检索于 2018 年 6 月 24 日,来自https://arxiv.org/abs/1708.03070
  2. 火炬/火炬 7。(2018).GitHub。检索于 2018 年 6 月 24 日,来自https://github.com/torch/torch7
  3. (2018).Cs.stanford.edu。检索于 2018 年 6 月 24 日,来自https://cs.stanford.edu/people/karpathy/cvpr2015.pdf

【论文摘要】使用深度学习的图像分类中数据增强的有效性

原文:https://towardsdatascience.com/paper-summary-the-effectiveness-of-data-augmentation-in-image-classification-using-deep-9160dc87806b?source=collection_archive---------10-----------------------

Image from this website

我想知道更多关于数据扩充在多大程度上有助于提高测试/验证数据的准确性。我发现了这篇很棒的论文,想做一个论文总结。

**请注意这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

摘要

本文旨在通过使用传统的数据增强技术(如裁剪、旋转)或使用 GAN ( CycleGAN )来研究数据增强的有效性。

简介

在本节中,作者指出神经网络可以从大量数据中受益匪浅。他们举了一个例子来说明 Google corpus 的发布是如何让文本到语音以及基于文本的模型受益的。作者提出的一个有趣的观点是,对于大量的非结构化数据,任务变成了寻找模式。然而,我们可以采用另一种方法,其中我们有一小组结构化数据并执行增强。最后,作者介绍了他们将要进行实验的数据集,即 MNIST 和微小图像网数据

相关工作

在本节中,作者回顾了一些用于防止过度拟合的流行方法。方法,如增加一个正则项,辍学,批量规范化和转移学习介绍。此外,作者给出了数据增强技术的简单描述,如几何或颜色增强。(大多是仿射变换。).以及如何训练 GAN 的基本描述。

方法

这就是超级有趣的地方,作者将采取两种不同的方法。

a)在训练分类器之前增加数据(使用 GAN 或仿射)
b)通过使用分类器网络的前置神经网络实时增加数据。(基本上,他们正在创建一个从扩充网络到分类器网络的数据管道)

作者将使用传统转换或 CycleGAN(风格转换)来执行数据扩充。(如下图)。

最后,对于增强网络,他们创建了一个小型的 5 CNN 网络,使用用于训练网络的各种损失函数来执行增强。(1.内容丢失,2。风格丧失,3。不亏)

数据集和特征

作者用三个数据集进行了实验,其中两个数据集来自微图像网,第三个数据集来自 MNIST 数据集。第一数据集仅由狗/猫图像组成,第二数据集由狗/金鱼的图像组成。

实验

在这个实验中使用了两个网络,首先是分类网络(SmallNet)和增强网络(Augmentation Network)。两个网络网络架构如下所示。

增强网络的输入是通过连接来自相同类别的两个图像(在它们的通道维度上)来创建附加图像。(这是数据扩充部分。)增强网络仅在训练期间使用,而不在测试期间使用,整个过程如下所示。

最后要考虑的是损失函数,在图像被放大后,作者介绍了三种损失函数。(实际上是两个,因为最终损失函数根本不是损失函数。)

第一个损失是增强图像和目标图像之间的 L2 损失,其中 D 项是增强图像和目标图像的长度

第二种损失是增强图像和目标图像之间的 Gram 矩阵的 L2 损失函数。如上所述,第三损失函数没有损失函数。

结果

对于所有数据集,他们进行了不同类型的增强,并得到了以下结果。

乍一看,我们可以假设无损失功能的神经增强与任何其他不同的方法相比表现最佳。(控制方法是当它们将相同的图像提供给增强网络时。)下面可以看到增强网络生成的一些图像。

作者表示,增强网络似乎从两幅图像中提取了一些关键特征,同时平滑了背景像素。

结论和未来工作

作者指出,使用更复杂的网络来执行分类和扩充是值得的。且还陈述了传统图像增强方法本身是有效的,同时与 GAN 的或神经增强相比消耗更少的时间。

最后的话

这确实是一项有趣的工作,但是在这一点上,我看不到使用 GAN/神经增强来执行数据增强的巨大好处。但是这种方法显示了许多有希望的迹象。

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

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

参考

  1. 朱,j .,帕克,t .,伊索拉,p .,,埃夫罗斯,A. (2017)。使用循环一致对抗网络的不成对图像到图像翻译。Arxiv.org。检索于 2018 年 5 月 21 日,来自https://arxiv.org/abs/1703.10593
  2. 佩雷斯,l .,,王,J. (2017)。使用深度学习的图像分类中数据扩充的有效性。Arxiv.org。检索于 2018 年 5 月 21 日,来自https://arxiv.org/abs/1712.04621
  3. MNIST 手写数字数据库,Yann LeCun,Corinna Cortes 和 Chris Burges。(2018).Yann.lecun.com。检索于 2018 年 5 月 21 日,来自http://yann.lecun.com/exdb/mnist/
  4. 微型图像网络视觉识别挑战。(2018).Tiny-imagenet.herokuapp.com。检索于 2018 年 5 月 21 日,来自https://tiny-imagenet.herokuapp.com/
  5. 格拉米矩阵。(2018).En.wikipedia.org。检索于 2018 年 5 月 21 日,来自https://en.wikipedia.org/wiki/Gramian_matrix
  6. 仿射变换。(2018).Mathworks.com。检索于 2018 年 5 月 21 日,来自https://www . mathworks . com/discovery/affine-transformation . html

[论文摘要]桑代克的困惑盒和起源行为的实验分析

原文:https://towardsdatascience.com/paper-summary-thorndikes-puzzle-boxes-and-the-origins-of-the-experimental-analysis-of-behavior-122143221ee9?source=collection_archive---------1-----------------------

GIF from this website

我记不清我是怎么拿到这份文件的,但我想读它。

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。还要注意,我可能没有足够的领域经验来完全理解这篇文章。

Paper from this website

摘要

当桑代克在 1898 年提交他的论文时,它标志着行为实验分析领域的开始。那篇论文似乎对行为的实证科学产生了巨大的影响。

简介

1898 年" 动物智力:动物联想过程的实验研究 "由桑代克出版。(他只有 23 岁。).尽管当时很少有可信的研究人员对这些经历提出批评,但这篇论文在心理学领域产生了巨大的影响。(我感觉到它在整个科学领域产生了巨大的影响,因为它改变了我们对动物和人类学习的看法。)

实验

桑代克经验的一般方法是把饥饿的动物放在围栏里,它们可以通过一些简单的行为逃离。总之,桑代克把食物放在关动物的笼子外面,并记录下动物逃出笼子的时间。他反复重复了这个实验,并记录了动物逃跑所需的变化。(最著名的实验是拼图盒中的猫实验。).有 15 个盒子,都是木头做的,每个盒子都有一个门,猫可以通过触发某种机制打开门。(例如,拉动悬挂在箱底上方六英寸处的线圈(见图 1)。).

在每个盒子中,盒子 k 出现在桑代克的论文中,它需要三种不同的反应。(踩下踏板,拉动绳子,推开酒吧门。)关于放在这些盒子里的猫,有一点需要注意,那就是它们通常更专注于逃离盒子,而不是把注意力放在笼子外面的食物上。起初,猫的行为似乎是随机的,它无论如何都要挣扎着从笼子里出来,然而,如果猫一次又一次地被关在笼子里。慢慢地,猫的行为改变了,它变得更有意识,表现出更有效的行为。

如上所述,桑代克记录了猫在多次重复的实验中逃脱所需的时间。我们可以观察到所需时间稳步减少。(这是针对简单的盒子情况)。但是当我们绘制盒子 K 所需的时间时,它看起来像下面这样。

我们可以观察到它更慢,并显示出更不稳定的进展迹象。桑代克不仅对逃跑的时间感兴趣,还对猫学习进步的速度感兴趣。(我觉得这可以是曲线的导数。).当在狗/小鸡身上进行同样的实验时,桑代克能够得到类似的结果。

在其他实验中,桑代克直接把动物从笼子里拿出来,例如,当小鸡梳理自己的羽毛时,或者当猫抓痒时。然而,这些实验通常产生更大的性能可变性和更浅的时间曲线,而不是当逃生手段涉及操纵外壳的某个部分时。他还做了泛化实验,从不同的盒子里学到的知识可以应用到另一个盒子里。

理论

在桑代克的时代,大多数人认为动物通过想法的联想来学习,这意味着它们以某种原始的方式理解事件之间的逻辑关系,并使用这些想法来推理解决问题。然而,桑代克对这一观点提出了质疑,因为没有确凿的证据表明动物通过推理理解或学习。首先,他说被关在笼子里的猫的行为是随机的,而不是系统的;第二,动物的行为是渐进的,而不是突然的;第三,动物没有表现出理解行为和结果之间关系的迹象;第四,动物只有在自己执行行为时才学会。

总之,桑代克证明了动物的一般学习行为是尝试和成功,而不是逻辑推理。

评估论文

桑代克的工作是例外的,因为他用重复的实验观察代替了孤立的轶事报道;内省与系统描述;和数字数据的主观印象。(与强化学习领域相关的是,桑代克认识到了灭绝、泛化、辨别和反应链。)

相关视频

Video from Geert Stienissen

最后的话

非常奇怪,在强化学习中,一个智能体学习的行为与实验中的猫相似…

参考

  1. 吉斯,P. (1999 年)。桑代克的难题箱和行为实验分析的起源。行为实验分析杂志,72(3),433–440 页。doi:1901 年 10 月 10 日
  2. 吉尔特·斯蒂恩森。(2018).YouTube。检索于 2018 年 7 月 13 日,来自https://www.youtube.com/channel/UC9N3210QbLWZzhFwwDkyEqw

[论文摘要]理解训练深度前馈神经网络的困难

原文:https://towardsdatascience.com/paper-summary-understanding-the-difficulty-of-training-deep-feed-forward-neural-networks-ee34f6447712?source=collection_archive---------6-----------------------

GIF from this website

这是机器学习(ML)社区的另一篇著名论文,我想说这是每个 ML 研究人员需要阅读的基础论文之一。

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

摘要

主要思想是,较深的网络比浅的网络具有更好的性能。然而,使用特殊的初始化方法而不是随机选择的值(标准初始化方法)来训练更深的网络。本文调查了为什么会发生这种情况的原因,并研究了不同的激活功能如何影响整个训练过程。

深度神经网络

作者已经声明,新的初始化方法以及训练方法优于更传统的初始化和训练方法。并给出了一个非常有趣的例子,其中无监督的预训练模型可以充当正则化器,因为它在更好的位置初始化参数。

最后,作者指出,本文将通过跨层和跨训练迭代监控多层神经网络的激活和梯度来研究多层神经网络。(查看哪个隐藏的神经元饱和)

实验设置和数据集(无限/有限)

作者介绍了他们将在这个实验中使用的数据集。一个是合成图像(它们可以根据需要生成任意多的图像,因此是无限的),另一个是著名的 MNIST 数据集、 CIFAR 10 数据集和小图像数据集 t。最后,作者讨论了他们将要使用的网络架构、成本函数、激活函数。这里需要注意的一件有趣的事情是使用了软签名激活功能。(我以前从未想过这个问题。)

训练期间激活功能和饱和度的影响(Sigmoid)

对于每个激活函数,有两件事我们需要小心,那就是 1)激活函数的过度饱和,它不会传递梯度,2)过度线性的单位,它不会计算一些有趣的东西。众所周知,Sigmoid 激活函数会减慢学习速度,因为它们的平均值不为零。在作者的实验中也可以看到这种行为。

如上图,训练开始后第四层很快饱和。并且由于这一事实,梯度不能传递到更早的层中,使得训练更加困难。最终,该层能够脱离饱和区域,然而这仅发生在 100 个时期之后。

训练期间激活函数和饱和度的影响(Tanh)

由于围绕零的对称性,tanh()激活函数不会遇到 sigmoid 遇到的相同问题。然而,作者进行的实验中,他们遇到了一种奇怪的现象,其中各层开始按顺序饱和。为什么会发生这种情况仍然是个谜。

训练期间激活功能和饱和度的影响(软设计)

如上所述,对于软符号激活函数,我们可以观察到饱和不会像 tanh 或 sigmoid 那样戏剧性地发生。

此外,当我们绘制激活值的直方图时,我们可以很快看到 tanh 激活在梯度不会流动的-1 和 1 区域中有很多值。但是对于软符号,它们中大多数在我们可以观察到更流畅的梯度流的区域之间,因此训练更好。

成本函数的效果

在这里,作者强调了一个事实,即对于分类任务,使用逻辑回归或条件对数似然成本函数结合 softmax 输出更好。我从来不知道这一点,但事实证明,许多研究人员在分类任务中使用了二次成本函数。(至少在过去是这样)

初始化时的梯度

蓝框 →标准初始化方法
橙框 →规格化初始化方法

在本节中,作者介绍了主要称为规范化初始化的新型初始化方法,并展示了这种新型初始化方法的有效性。

如上所述,当我们比较常规初始化方法(见顶部)时,我们可以观察到每个层的权重值非常不同,而在归一化初始化方法中,每个层的权重值相似。

类似的行为在训练中也有发生。当作者可视化梯度(使用 Tanh 激活函数)时,他们能够观察到这样的事实,即对于标准初始化方法,每层的梯度显著不同,而在归一化初始化方法中,每层的梯度彼此相似。并且作者已经假设不同层的非常不同幅度的梯度可能会导致不适和较慢的训练。

误差曲线和结论

作者
1 得出了几个结论。使用标准初始化
2 时,Sigmoid/Tanh 性能不佳。软签名网络对初始化方法更鲁棒。
3。Tanh 网络可以从规范化的 init 中受益匪浅。
4。这些实验中的许多观察结果还没有得到详细的解释。

最后的话

除了信息量大之外,这篇论文写得非常好。因为一个不说英语的人也能明白。

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

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

参考

  1. x .格洛特和 y .本吉奥(2010 年)。理解训练深度前馈神经网络的困难。PMLR。检索于 2018 年 5 月 28 日,来自http://proceedings.mlr.press/v9/glorot10a.html
  2. MNIST 手写数字数据库,Yann LeCun,Corinna Cortes 和 Chris Burges。(2018).Yann.lecun.com。检索于 2018 年 5 月 28 日,来自http://yann.lecun.com/exdb/mnist/
  3. CIFAR-10 和 CIFAR-100 数据集。(2018).Cs.toronto.edu。检索于 2018 年 5 月 28 日,来自https://www.cs.toronto.edu/~kriz/cifar.html
  4. 微型图像网络视觉识别挑战。(2018).Tiny-imagenet.herokuapp.com。检索于 2018 年 5 月 28 日,来自 https://tiny-imagenet.herokuapp.com/
  5. 作为神经网络激活函数的软设计。(2017).赛菲克·伊尔金·塞伦吉尔。检索于 2018 年 5 月 28 日,来自https://sefiks . com/2017/11/10/soft sign-as-a-neural-networks-activation-function/
  6. 反向传播?,W. (2018)。为什么非零中心激活函数是反向传播中的一个问题?。交叉验证。检索于 2018 年 5 月 28 日,来自https://stats . stack exchange . com/questions/237169/why-are-non-zero-centered-activation-functions-a-problem-in-back propagation
  7. 损失函数。(2018).En.wikipedia.org。检索于 2018 年 5 月 28 日,来自https://en . Wikipedia . org/wiki/Loss _ function # Quadratic _ Loss _ function

【论文摘要】用于聚类分析的无监督深度嵌入

原文:https://towardsdatascience.com/paper-summary-unsupervised-deep-embedding-for-clustering-analysis-e269aed77c6b?source=collection_archive---------5-----------------------

Photo by Alexandru Acea on Unsplash

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料。

Paper from this website

摘要

聚类是一种广泛应用于许多数据相关领域的技术,然而关于聚类的学习表示的研究却很有限。本文的作者提出了一种神经网络,其中同时学习特征表示和执行聚类。

简介

聚类中最重要的一个方面是测量距离的方法。(或相异)。对于 k-means,我们使用点之间的欧几里德距离。然而,另一个重要的方面是执行这些测量的特征空间。原始像素空间中的 K-means 聚类是无效的,因此作者想要回答这个问题:我们可以使用数据驱动的方法来联合求解特征空间和聚类成员吗?

相关工作

聚类已经在许多不同的名称下被研究,例如特征选择、距离函数、分组方法等……并且存在流行的方法,例如 k 均值聚类。最近谱聚类和它的方差得到了普及,因为它们不仅更灵活,而且通常比 k 均值表现得更好。然而,他们的方法有一个缺点,即用户需要大量的内存和计算能力。受 t-sne 方法的启发,作者提出了一种方法,其中他们定义了基于质心的概率分布,并最小化其与辅助目标分布的 KL 散度,以同时改善聚类分配和特征表示。

深度嵌入聚类

作者不是直接在数据空间 X 上执行聚类,而是首先执行到不同空间 Z 的非线性映射(并且大多数情况下 Z 小于原始空间 X)。非线性函数由θ参数化。并且作者的方法具有两个阶段,1)利用深度自动编码器的初始化阶段,2)参数优化(即,聚类),其中他们在计算辅助目标分布和最小化对其的 KL 发散之间迭代。

KL 散度聚类

给定非线性映射的初始估计,所提出的算法做两件事,1)计算嵌入点和聚类质心之间的软分配,2)更新深度映射 f(θ)并通过使用辅助目标分布从当前高置信度分配中学习来改进聚类质心。

按照 t-sne 方法,嵌入点 z 和质心 μ 之间的相似性如上所示计算。并且参数α被设置为 1。

然后使用 KL 散度损失函数,他们试图匹配分布。

p 分布用上面的等式表示。最后,反向传播的数学可以在下面看到。

参数初始化

作者初始化来自预训练去噪自动编码器的权重,(逐层预训练)并且网络架构可以在下面看到。(ReLu 激活功能)。

整个过程的视觉可以在下面看到。

实验

如上所述,作者在两个图像数据集和一个文本数据集上测试了他们的算法。

如上所述,当使用无监督聚类准确度(ACC)时,我们可以观察到作者的方法优于许多其他现有技术方法。

如上所述,作者显示了来自 MNIST 和 STL 中每个聚类的 10 个得分最高的图像,每行对应一个聚类,图像根据它们到聚类中心的距离从左到右排序。我们可以看到,对于 MNIST 数字 9 和 4 被聚类在一起,而对于 STL 数据集,聚类结果对于飞机、汽车和卡车是最好的。

讨论

使用 t-sne,作者可视化了潜在向量 z 的聚类如何随时间变化,如上所述,随着历元的增加,我们可以看到聚类之间的边界线变得更加清晰。

此外,当作者绘制梯度幅度与软赋值 q 的关系图时,他们发现越靠近质心(大 q)的数据点对梯度的贡献越大。

为了查看自动编码器初始化策略的效果,作者还将自动编码器用于其他方法。然而,如上所述,作者的方法仍然能够胜过其他方法。(作者又做了两个关于不平衡数据和聚类数的实验。)

结论

本文提出了一种算法,在该算法中,通过利用自训练目标分布迭代地优化基于 KL 散度的聚类目标来执行对一组数据点的聚类。作者的方法不仅优于许多其他现有技术的方法,而且对超参数设置更加鲁棒。

遗言

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

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

参考

  1. 谢,吉希克,,(2015)。用于聚类分析的无监督深度嵌入。Arxiv.org。检索于 2018 年 9 月 12 日,来自https://arxiv.org/abs/1511.06335

【论文摘要】递归神经网络(RNNs)在图像字幕生成器中的作用是什么?

原文:https://towardsdatascience.com/paper-summary-what-is-the-role-of-recurrent-neural-networks-rnns-in-an-image-caption-e9475056e3cd?source=collection_archive---------6-----------------------

GIF from this website

我发现了一篇关于图像标题生成任务的有趣论文。

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

摘要

在大多数图像字幕生成的文献中,许多研究者将 RNN 视为系统的生成器部分。然而,在整个系统中使用 RNN 还有其他方法。一种方法是使用 RNN 作为先前生成的单词的编码器,并在模型的最后阶段将编码的表示与图像合并。这篇论文的作者发现,使用 RNN 作为编码器实际上会给出更好的结果。

简介

大多数字幕生成任务集中于具体的概念描述生成,即严格描述图像中内容的字幕。(然而,目前正在进行一些研究以超越这一点,例如叙事生成和视觉问答。).自然语言生成主要有三种方法。

  1. 首先依赖计算机视觉任务的系统,例如物体检测或图像分类。以及使用编码的图像特征作为 NLG 阶段的输入。
  2. 将字幕生成任务视为检索问题的系统,其中许多系统依赖于神经模型来处理图像数据和文本数据。
  3. 系统,由神经网络组成,(我猜这个系统和第一个系统的主要区别是使用了多少神经网络。),并且这些系统通常具有 CNN 来编码图像和 RNN 来生成与该图像相关的字幕。

本文主要讨论第三种方法,大多数研究人员将 RNN 视为生成部分,但事实并非总是如此。如上所述,在 a)中,RNN 看到图像和单词,因此它充当生成器,然而在 b)中,RNN 只看到单词而不是图像,因此仅充当语言特征的编码器。本文调查了这两种体系结构之间的性能,看看哪一种更好,通过作者的实验,他们发现体系结构 b)提供了更好的性能。

背景:神经字幕生成架构

如上所述,典型地,RNN 接收开始符号,并将语言特征传递给 FNN,该开始一个字一个字地生成,直到遇到结束符号。实现这一点的一种方法是给 RNN 提供图像和语言数据,本文作者称之为注入法。另一种方法是仅将 RNN 视为语言模型,如图 1 中的 b)所示。这两种架构都在研究社区中使用。(另一件要注意的事情是,这两个模型都与注意机制兼容。)

注入模型和合并模型之间区别在于,在注入模型中,RNN 负责图像条件语言生成,而在合并模型中,负责编码语言表示。这两种型号在 RNN 还有一些额外的差异,例如重量的数量。

实验

对于数据集,作者选择使用闪烁数据集,并且在这个实验中测试了如上所示的两种不同的网络架构。为了保持公平和简单,作者只对两个网络使用了基本架构。Adam 用作优化器,他们使用 50 的小批量、Xavier 初始化,同时使用交叉熵和作为成本函数。最后他们用 BLEU,METEOR,CIDEr 和 ROUGE-L 来衡量网络的性能。

结果

如上所示,作者对每个模型进行了三次训练,并记录了平均分数。除了 ROUGEL 和 BLEU 分数,我们可以观察到合并架构通常比注入架构表现更好的事实。作者在这次实验后发现了一个有趣的事实,即该模型对 Flicker8K 数据集给出了非常好的结果,这可能意味着数据集本身包含更少的变化,使任务变得更容易。还发现合并模型具有更高的性能与模型大小的比率,并且更有效地利用有限的资源。

讨论

当 RNN 的作用是为给定的图像生成标题时,很自然地认为将图像作为输入是非常有益的,然而,实验结果显示了其他方式。这可能发生的一个原因是由于注入架构的任务的复杂性增加。在该体系结构中,单词和图像都被提供给网络,使得编码任务更加复杂,而在合并体系结构中,RNN 只需要对先前给定的单词进行编码。

结论

总之,本文提出了两种不同的网络架构来执行图像字幕任务。在那两个不同的网络中,RNN 扮演着不同的角色,在第一个网络中,RNN 被赋予了既有先前生成的词又有完整的形象。而在第二种情况下,RNN 充当语言特征编码器,只能访问前面的单词。令人惊讶的是,一般来说,对于图像字幕任务,最好有一个只执行单词编码的 RNN。简而言之,生成任务,涉及序列它是一个更好的想法,有一个单独的网络来编码每个输入数据,而不是把一切交给 RNN。

未来工作

尽管很明显,合并模型的性能比注入模型好得多,但结果并不完全一致。作者正在将这个实验扩展到更大的 MSCOCO 数据集。要问的其他问题是,这种方法对机器翻译任务是否也有类似的影响。合并模式的另一个优点是迁移学习更容易。

最后的话

这是一个有趣领域的非常有趣的工作。

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

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

参考

  1. (2018).Aclweb.org。检索于 2018 年 7 月 7 日,来自http://www.aclweb.org/anthology/W17-3506
  2. (2018).Nlp.cs.illinois.edu。检索于 2018 年 7 月 7 日,来自http://NLP . cs . Illinois . edu/HockenmaierGroup/8k-pictures . html

论文 101——人工智能如何学会在黑暗中看东西?

原文:https://towardsdatascience.com/papers-101-how-an-ai-learned-to-see-in-the-dark-d15f97a2ecdd?source=collection_archive---------4-----------------------

大家好,我是尼尚克,欢迎来到论文 101 ,在这个系列中,我们将讨论机器学习和人工智能领域正在进行的令人兴奋的新研究!

我要感谢 两分钟论文Károly Zsolnai-Fehér 通过他们的 YouTube 频道向我介绍了这篇论文。

什么鬼东西?

在智能手机相机时代,弱光摄影是必备的。所有旗舰手机都支持低光摄影,但正如你一定注意到的那样,结果并不那么好。

这是因为他们大多使用传统的去噪和去模糊技术,这些技术可以有效地去除一些噪声,但在黑暗等极端条件下却失败了,这是一个很大的挑战。

本文是应对这一挑战的解决方案。

计算机视觉是人工智能中的一个领域,它围绕着获取视觉输入,或者理解接收到的输入,或者以某种方式操纵给定的输入以获得期望的输出。我们在这里关注的论文是关于第二个用例的。

在他们的论文**学习在黑暗中看东西中,研究人员陈晨**(UIUC)陈奇峰(英特尔实验室)贾旭(英特尔实验室)和弗拉德伦·科尔顿(英特尔实验室)提出了一种模型,它可以在几乎相当于黑暗的极低光照条件下使用一种新的图像处理管道使用****

结果令人震惊!

如果你用没有低光摄影(低 ISO)的相机拍照,它看起来会像这样-

如果你用旗舰智能手机中的低光相机点击同一张照片,结果会如下所示。请注意,由于 BM3D 和较低的 ISO 等缩放滤镜,图片有多粗糙。

Scaling + BM3D Denoising

现在,全卷积网络所做的是获取第一幅图像,并对其进行处理,以获得下图(是的!我没开玩笑。)

Image After Processing Through CNN

等等,什么!

这里的模型使用端到端训练的全卷积网络,该网络利用原始短曝光夜间图像的数据集,以及相应的长曝光参考图像。与传统的去噪和去模糊技术相比,这使得从像夜间摄影这样的极端场景中获得结果非常容易和有效。

CNN 是怎么训练出来的?

CNN 在两组图像上进行训练。

  1. 作为输入的昏暗(几乎黑暗)场景或短曝光图片。
  2. 对应的正常照明场景或与目标相同场景的长曝光图片。

在包含 5094 个原始短曝光图像及其对应的长曝光图像的数据集上训练神经网络。

因此,如果你想训练网络,你必须首先点击正常照明条件下的照片,该照片将被用作目标变量,以获得网络的误差。

接下来,你将不得不点击同一场景的低曝光照片,使它看起来很暗。这将作为训练时网络的输入。

这两张照片的对将为网络产生(输入、输出)对,在此基础上它将被训练用于弱光测试图像。

FCN Pipeline

训练是使用 L1 损失和一个 Adam 优化器进行的,它给出了非常高质量的结果,使模型迄今为止最有效!

有多好?

该模型使传统的去模糊和去噪方法相形见绌。下面是与传统 BM3D 去噪的对比

Image Using Traditional Scaling

Image Using Scaling + BM3D Denoising

Image After Processing Through CNN

你可以立即注意到不同之处。

如果我们使用不同的参数(如曝光和照明)将 CNN 的性能与旗舰手机相机进行比较,结果可能会让你大吃一惊!

让我们考虑一个场景,在一个黑暗的房间里点燃 8 支蜡烛,通过不同的相机观察人体模型照片的变化,因为蜡烛的数量每次减半。

8 Candles

4 Candles

请注意,与索尼 a7S 相比,iPhone X 和谷歌 Pixel 2 的照片质量有所下降。这是因为一方面,索尼相机比两种移动相机具有更好的 ISO,移动相机使用传统的去模糊和去噪技术来从原始数据中获得低光照片。

2 Candles

1 Candle

现在,照片在两个智能手机相机中都几乎是黑暗的,这是他们在黑暗等极端条件下失败的结论。

然而,索尼相机上的照片仍然很清晰,因为正如你可能已经注意到的那样,它巧妙地将曝光时间从 0.8 秒改为 1.6 秒,允许更多的光线进入,从而提供更好的照片。

这对于智能手机相机来说是不切实际的,因为它会产生模糊的图像,所以只能在昂贵的高端相机上实现,这些相机具有更好的反射镜头和高效的传感器。

但是,让我们看看如果我们将曝光时间减少到 1/30 秒会发生什么,也就是说,相机在极低的光线和低曝光时间下表现如何。

1 Candle — Low Exposure

如你所见,在这个阶段,所有的摄像机都失灵了,我们看到的是一片漆黑。这是因为两个不同的原因-

  1. 在移动相机中,这种情况已经发生,因为他们使用传统的去模糊和去噪技术,如 BM3D 去噪,当光线量非常少并且没有任何作用时,这些技术就会失败。
  2. 在索尼相机中,这是因为曝光时间更短,所以允许进入相机的光量更少,因此图像更暗。

但是坚持住。我们能做些什么,在 1/30 秒的曝光时间和极低光线的条件下获得更好的图像(<0.1 lux)?

Be ready to get amazed as 本文已经做到了我们想要的!

如果将上面 1 支蜡烛、低曝光的图像(照片最暗的图像)中的原始传感器数据输入全卷积网络,我们将得到如下所示的输出!

What! Are You Kidding Me!

惊讶吗?我也是。

我希望这项技术将很快在智能手机相机中实现,你将开始享受机器学习所提供的极弱光摄影!

这就是机器学习和神经网络的力量。

正是这些应用激励越来越多的人研究机器学习和神经网络。这就是论文 101 产生的确切原因!

欢迎在评论中发表你对这篇论文的看法。要了解更多关于这个过程的信息,你可以访问报纸的网站。

另外,欢迎在评论中对论文 101 提出建议和赞赏。

好了,这星期就这样,下次再见!

再见!

如何使用 Paperspace 来训练你的深层神经网络

原文:https://towardsdatascience.com/paperspace-bc56efaf6c1f?source=collection_archive---------18-----------------------

rawpixel on Unsplash

计算资源是深度学习应用的主要瓶颈之一。这不仅适用于业务用例,也适用于自学。GPU 是一项昂贵的投资,尤其是当你只在某些时候需要它们的时候。云服务为这个问题提供了解决方案:只在你需要的时候租用资源。这篇博文向你展示了如何开始使用这些服务中最用户友好的:Paperspace。

**免责声明:**我没有从 Paperspace 获得任何形式的赞助或报酬。当我在 fast.ai 上开始为程序员开设 深度学习 课程时,我偶然发现了他们,并一直呆在那里。我还决定省去推荐链接,以保持分离的干净。

云服务提供商有很多,Azure、AWS 和 Google Cloud 是其中的三大领导者。那么为什么要使用 Paperspace 呢?我更喜欢它们,因为它们在机器学习方面有清晰和专注的用户体验。特别是对于三大市场领导者来说,机器学习是复杂机器的一个齿轮,涵盖了人们可以从云服务中期望的一切。这种复杂程度符合拥有建立和维护所有依赖关系的资源的公司和其他组织的需要。然而,Paperspace 在运行所需的时间上击败了巨头。我还发现监控我的账单更容易了。

在这篇文章中,我将向你展示如何立即开始使用 Paperspace。明确地说,Paperspace 提供的产品比我在这里描述的更多。如果你想更多地了解他们的产品组合,可以去他们的网站上查看完整的产品列表。

在我开始之前,有一个一般性的评论:在本地机器上尽可能多地测试你的代码。使用云服务需要花钱,当你专注于一项具有挑战性的任务时,很容易忘记这一点。

YIFEI CHEN on Unsplash

首先,你必须注册这项服务。这里有一个提示:学习 fast.ai 课程的学生会得到一个促销代码,价值 15 美元。这相当于大约 30 个小时的 GPU 使用时间,所以我建议你开始学习 fast.ai 的优秀课程,并获得额外的好处。

注册后,您就可以访问您的控制台。有三种产品可供选择:渐变、核心和 API。对于快速访问 GPU 资源,我更喜欢渐变。更确切地说,我用笔记本来做这件事。

当你点击 创建笔记本+ 时,会有一系列免费的容器供你选择。如有必要,您还可以配置新的容器。对于快速分析或实验, Jupyter 笔记本数据科学堆栈是完美的选择。你可以在这里找到规格。它允许您同时使用笔记本电脑和控制台,因此通过额外的软件包来扩展功能是没有问题的。

在创建笔记本实例的第二步中,您必须决定要使用的机器。例如,我使用最便宜的 CPU 选项来下载数据,并对我的深度学习模型进行测试。这个选项叫做 C2,每小时只需 0.009 美元。也就是 4 天半的计算能力,1 美元

由于集成存储,从廉价的 CPU 解决方案开始是可能的。有 200GB 的永久存储可用,它通过storage文件夹自动连接到每个新实例。这种配置可以让你先用便宜的 CPU 准备好一切。

一旦你确定一切正常,你就可以开始一个新的 JupyterHub 环境。这一次,我选择了 GPU 选项。最便宜的选项从每小时 0.51 美元开始,一直涨到每小时 1.72 美元。也有更强大的机器可用(最高成本为每小时 20.99 美元),但你需要升级你的帐户才能做到这一点。我使用 Paperspace 来支持我在深度学习领域的个人发展。为此,0.51 美元的期权总是足够了。

对结果满意后,您应该将您使用的笔记本(原始文件和 HTML 副本)和训练好的模型导出到您选择的备份位置或版本控制系统。

rawpixel on Unsplash

这些信息已经足够开始您的 Paperspace 之旅。我算了一下上一个深度学习项目的成本。总之,我花了大约三美元(大部分花在模特培训上)。然而,更重要的是,我花了 99%的时间解决实际问题,只有 1%的时间用于设置。

感谢阅读!如果你喜欢这篇文章,留下一些吧👏🏻并在 LinkedIn 或 Twitter 上分享。请在评论和 推特 上告诉我你的想法。再次感谢,继续学习!

并行分布式遗传算法

原文:https://towardsdatascience.com/parallel-and-distributed-genetic-algorithms-1ed2e76866e3?source=collection_archive---------5-----------------------

Image by Pablo Garcia Saldana

进化算法是解决不同优化问题的强有力的方法。进化算法有助于找到合适的解决方案,如果使用严格的方法找到它是如此困难,我们可以说这是不可能的。进化算法最流行的变体之一是遗传算法。你可以在“遗传算法简介——包括示例代码”一文中读到更多关于遗传算法的内容。

有时,如果一个问题很复杂并且个体很大,那么就不可能实现有效的遗传算法,因为计算需要太多的时间,并且不可能将所有需要的数据存储在内存中。为了克服第二个问题,可以将一些个体存储在磁盘上,一旦需要,就将它们加载到内存中。这并不能解决性能问题,此外,它还带来了另一个问题:从磁盘读取(也可能是反序列化)一个个体到内存可能会使整个系统更慢。此外,算法见过的所有个体都是使用相同的遗传算子创建的,因此可能有太多的共同点,因此算法将在局部最优值附近行走。有办法解决这个吗?有可能,是的:我们可以使用并行或分布式遗传算法。

本文描述了两种旨在提高算法性能的遗传算法:并行和分布式遗传算法。

并行遗传算法

并行遗传算法就是这样一种使用多个遗传算法来解决单个任务的算法[1]。所有这些算法都试图解决相同的任务,在它们完成任务后,每个算法中最好的个体被选中,然后它们中最好的被选中,这就是问题的解决方案。这是并行遗传算法最流行的方法之一,尽管还有其他方法。这种方法通常被称为“岛屿模型”,因为种群是相互隔离的,就像现实生活中的生物种群可能生活在不同的岛屿上。图 1 说明了这一点。

Image 1. Parallel genetic algorithm

这些遗传算法互不依赖,因此它们可以并行运行,充分利用多核 CPU 的优势。每个算法都有自己的个体集,因此这些个体可能不同于另一个算法的个体,因为它们具有不同的变异/交叉历史。

文献[2]描述了一种并行遗传算法,其使用两种独立的算法来提高其性能。这两种算法的区别在于选择变异和交叉个体的方式。此外,一些具有最高拟合度的生物被允许从一种算法“迁移”到另一种算法。虽然有时这可能已经足够了,但是当一个任务很难解决或者一个人是一个复杂的实体时,我们可能需要更多的个体多样性。

为了实现这一点,我们可以使用尽可能多的算法(比如说,两倍于我们拥有的 CPU 核心数),并且改变算法的几乎每一个属性。因此,每个算法都有自己的一组个体,这些个体是使用不同于其他算法的方法创建的。这也是一种“岛屿模式”,尽管“岛屿”之间的差异更大。唯一的限制是所有算法使用相同的拟合函数来评估个体,以便可以比较属于不同算法的个体。因此,这些遗传算法可能在以下方面有所不同:

  • 新的个体是如何被创造出来的;
  • 个体如何变异,如何被选择变异;
  • 个体如何交叉,如何被选择进行交叉;
  • 有多少人参加了单个交叉项目,结果又有多少人被创造出来;
  • 每次算法迭代后有多少个体存活下来,这些生物是如何被选择出来的;
  • 每一代包含多少个体;
  • 一个算法要经历多少代。

通过改变这些特征,有可能产生许多不同的遗传算法来解决相同的任务,但是具有完全不同的个体。

值得注意的是,这些独立的遗传算法具有与任何其他传统遗传算法相同的结构,因此它们可以从并行遗传算法中提取出来并独立使用。

算法之间的交叉

那么,我们有什么?我们有几个独立运行的遗传算法,它们有自己的个体集。我们可以选择属于不同算法的个体,并将它们杂交。结果,出现在一个算法的个体中的特征将可用于另一个算法。这允许创建这样的个体,这些个体不能由任何算法单独创建,给它们带来更多的多样性并传播便利的特征。

让我们用一个例子来说明这一点。假设我们有三个独立的遗传算法,我们想将它们成对交叉。我们采用第一种算法,随机选择一对中的第二个元素。因此,我们创建了尽可能多的算法对,在每一对中,第一个元素是按顺序选择的,第二个是随机选择的。然后,我们对这两种算法的种群进行交叉,从这两种算法中选取个体。我们以这样一种方式选择个体进行交叉,即来自不同算法的个体被交叉在一起。我们使用由一对算法中的第一个算法使用的交叉机制,并且该算法接收作为交叉的结果而被创建的所有个体;一对算法中的第二个算法只是提供其个体的施主。因此,当新个体是一对中的第一个元素时,每个算法接收新个体。如果一个交叉算法需要两个以上的个体,额外的个体可以从一对算法中的任何一个中选取,这里只建议不要有算法占优势。

当涉及算法之间的交叉时,也可以使用特殊的交叉技术,这仅适用于算法之间的交叉。

建议在过程中间的某个地方(甚至多次)使用算法之间的交叉,而不是在最开始或最后。在最开始的时候,每个算法都有不受突变或交叉影响的新个体,因此它们特定于特定算法的特征没有被清楚地表达。最后,没有更多的世代会影响交叉中产生的新个体,因此它们不会为了决定哪一个更好而与其他个体竞争。

结论

并行遗传算法可能比非并行遗传算法花费更多的时间,这是因为并行遗传算法使用多个计算线程,这反过来导致操作系统更频繁地执行上下文切换。然而,并行遗传算法往往比非并行遗传算法产生更好的结果和更优的个体。

尽管并行可能会显著改善结果,但在某些情况下,这可能还不够。在这种情况下,我们可以使用…

分布式遗传算法

分布式遗传算法实际上是一种并行遗传算法,其独立的算法运行在不同的机器上。此外,在这种情况下,这些算法中的每一个都可能是并行遗传算法!分布式遗传算法也实现了“岛模型”,每个“岛”与其他“岛”更加隔离。如果每台机器运行一个并行遗传算法,我们可以称之为“群岛模型”,因为我们有岛屿群。实际上,单个遗传算法是什么并不重要,因为分布式遗传算法就是让多台机器运行独立的遗传算法来解决同一任务。图 2 说明了这一点。

Image 2. Distributed genetic algorithm with parallel components

当我们必须创建许多个体以观察整个领域时,分布式遗传算法也可能有所帮助,但是不可能将它们全部存储在单个机器的存储器中。

当我们讨论并行遗传算法时,我们引入了“算法间交叉”这一术语。分布式遗传算法使我们能够在不同的机器之间进行交叉!

在分布式遗传算法的情况下,我们有一种控制整体进度和协调这些机器的“主思维”。它还控制机器之间的交叉,选择机器如何配对以执行交叉。一般来说,除了个体通过网络从一台机器移动到另一台机器之外,过程与并行遗传算法的情况相同。为了避免两次转移个人,建议将个人发送到机器,该机器将接收由于交叉操作而创建的新个人。“主脑”也从它所连接的、实际运行计算的次级机器的个体中选择最佳个体。因此,这个“大师头脑”是分布式遗传算法的切入点,它与向它寻求解决方案的人进行交流。

履行

这篇文章主要致力于理论,但当谈到实现时,有可能有一个“分布式遗传算法框架”,负责控制辅助机器和通过网络转移个体。一般来说,这样的框架能够处理除了需要了解个人内部结构的动作之外的所有事情。因此,用户只需执行几项操作:

  • 个人创造和处置;
  • 个人交叉;
  • 个体突变;
  • 评估个人的拟合函数。

其他的都是通用的,都可以在框架内实现。这样的框架能够同时运行多个分布式遗传算法,而不需要实际知道正在解决什么问题。

结论

使用并行和分布式遗传算法可以提高使用进化算法的系统的性能。无论如何,我们应该记住,进化算法并不能保证找到一个解决方案,也不能保证找到的方案不会比找到的方案更好。

使用遗传算法时,我们必须处理的一个主要问题是初步收敛到支配他人的个体子集。并行和分布式遗传算法试图解决这一问题,在算法之间引入差异,使它们具有不同的个体集。

使用并行和分布式遗传算法,个体更加分散,因此与使用非并行遗传算法相比,可以创建更少的个体,同时保持相同的解质量。

参考

  1. 埃里克·坎图-帕斯。并行遗传算法综述
  2. 阿卜丁·哈萨尼,乔纳森·特雷吉斯。标准和并行遗传算法概述

利用 Dask 并行化特征工程

原文:https://towardsdatascience.com/parallelizing-feature-engineering-with-dask-3db88aec33b7?source=collection_archive---------4-----------------------

(Source)

如何使用并行处理扩展功能工具

当计算非常慢时,最重要的问题是:“瓶颈是什么?”一旦你知道了答案,合乎逻辑的下一步就是找出如何绕过瓶颈。

通常,正如我们将看到的,瓶颈是我们没有充分利用我们的硬件资源,例如,当我们的计算机有八个内核时,只在一个内核上运行计算。如果我们的代码不是为了使用我们所有的资源而编写的,简单地获得更大的机器——就 RAM 或内核而言——并不能解决问题。因此,解决方案是重写代码,尽可能高效地利用我们拥有的任何硬件。

在本文中,我们将了解如何重构我们的自动化特性工程代码,使其在笔记本电脑的所有内核上并行运行,同时将计算时间减少 8 倍以上。我们将利用两个开源库——feature tools用于自动化特征工程和 Dask 用于并行处理——并用真实世界的数据集解决一个问题。

We’ll combine two important technologies: automated feature engineering in Featuretools and parallel computation in Dask.

我们的精确解决方案是针对这个问题的,但是我们开发的一般方法可以用于将您自己的计算扩展到更大的数据集。

尽管这里我们将坚持使用一台计算机和 多内核 ,但在未来,我们将使用同样的方法在 多台计算机上运行计算。

GitHub 上的 Jupyter 笔记本中提供了完整的代码实现。如果您还不熟悉 Featuretools,请查看文档或本文。在这里,我们将主要关注使用 Dask 的 Featuretools,跳过一些自动化特征工程的细节。

问题是:数据太多,时间不够

使用 Featuretools 应用自动化特征工程解决家庭信用违约风险问题(目前正在 Kaggle 上进行的机器学习竞赛,目标是预测客户是否会偿还贷款)的主要问题是,我们有大量数据,这导致特征计算时间非常长。使用深度特性合成,我们能够从 7 个数据表和 5800 万行客户端信息中自动生成 1820 个特性,但是调用一个只有一个内核的函数需要 25 个小时,即使是在具有 64gb RAM 的 EC2 实例上!

假设我们的 EC2 实例——甚至我们的笔记本电脑——有 8 个内核,为了加快计算速度,我们不需要更多的 RAM,我们需要利用这些内核。Featuretools 通过在对深度特征合成的调用中设置n_jobs参数,允许并行处理。然而,目前该函数必须将整个[EntitySet](https://docs.featuretools.com/loading_data/using_entitysets.html)发送给机器上的所有工作线程(内核)。对于一个大的EntitySet,如果每个工作者的内存都耗尽了,这会导致问题。我们目前正在特性实验室致力于更好的并行化,但是现在我们用 Dask 解决我们的问题。

解决方法:制造许多小问题

方法是将一个大问题分解成许多小问题,然后使用 Dask 一次运行多个小问题——每个小问题在不同的内核上运行。这里重要的一点是,我们使每个问题—任务— 独立于其他问题,因此它们可以同时运行。因为我们正在为数据集中的每个客户端创建特征,所以每个任务都是为客户端的子集创建特征矩阵。

When one problem is too hard, make lots of little problems.

我们的方法概述如下:

  1. 通过划分数据,把一个大问题变成许多小问题
  2. 编写函数,从每个数据分区创建一个特征矩阵
  3. 使用 Dask 在我们所有的内核上并行运行步骤 2

最后,我们会有一些更小的特征矩阵,然后我们可以将它们组合成一个最终的特征矩阵。同样的方法——将一个大问题分解成许多并行运行的小问题——可以扩展到任何规模的数据集,并在其他分布式计算库中实现,如使用 PySpark 的 Spark 。

无论我们有什么资源,我们都希望尽可能高效地使用它们,我们可以将这个框架扩展到更大的数据集。

数据分区:分而治之

我们的第一步是创建原始数据集的小分区,每个分区包含来自客户机子集的所有七个表的信息。然后,每个分区可以用于独立地计算一组客户端的特征矩阵。

这个操作是这样完成的:获取所有客户端的列表,将其分成 104 个子列表,然后遍历这些子列表,每次都将数据子集化为仅包括子列表中的客户端,并将结果数据保存到磁盘。这个过程的基本伪代码是:

104 个分区是根据反复试验和 3 个一般准则选择的:

  1. 我们希望至少有与工作线程(核心)一样多的分区,并且数量应该是工作线程数量的倍数
  2. 每个分区必须足够小,以适合单个工作者的内存
  3. 更多的分区意味着完成每项任务的时间差异更小

(作为一个额外的优化点,我们将 pandas object数据类型转换为category,以减少内存使用。这使我们的整个数据集从 4 GB 增加到大约 2 GB。我推荐阅读关于category数据类型的 Pandas 文档,这样你就可以有效地使用它们。

将所有 104 个分区保存到磁盘大约需要 30 分钟,但这个过程只需执行一次。

Each partition contains all the data needed to make a feature matrix for a subset of clients.

分区中的实体集

Featuretools 中的实体集是一种有用的数据结构,因为它包含多个表以及它们之间的关系。为了从一个分区创建一个EntitySet,我们编写一个从磁盘读取分区的函数,然后用表和链接它们的关系生成EntitySet

这一步的伪代码是:

注意,这个函数返回EntitySet,而不是像我们对数据分区那样保存它。对于这个问题,保存原始数据是一个更好的选择,因为我们可能想要修改EntitySets——比如通过添加有趣的值或领域知识特性——而原始数据永远不会改变。EntitySets是动态生成的,然后传递到下一个阶段:计算特征矩阵。

实体集的特征矩阵

函数feature_matrix_from_entityset正如其名称所暗示的那样:接受先前创建的 EntitySet,并使用深度特征合成生成具有数千个特征的特征矩阵。然后将特征矩阵保存到磁盘。为了确保我们为每个分区创建完全相同的特性,我们生成一次特性定义,然后使用 Featuretools 函数calculate_feature_matrix

下面是整个函数(我们传入一个带有EntitySet和分区号的字典,这样我们可以用一个唯一的名称保存特征矩阵):

Creating a feature matrix from an EntitySet and saving it to disk.

[chunk_size](https://docs.featuretools.com/guides/performance.html#adjust-chunk-size-when-calculating-feature-matrix)是这个调用中唯一棘手的部分:它用于将特征矩阵计算分解成更小的部分,但是因为我们已经对数据进行了分区,所以这不再是必要的。只要整个 EntitySet 能够容纳在内存中,那么我发现通过将chunk_size设置为等于观察的数量来一次计算所有的行会更加节省时间。

我们现在拥有了从磁盘上的数据分区到特性矩阵所需的所有独立部分。这些步骤构成了大部分工作,让 Dask 并行运行这些任务非常简单。

释放你的机器

Dask 是一个并行计算库,它允许我们同时运行许多计算,要么使用一台机器上的进程/线程(本地),要么使用许多独立的计算机(集群)。对于单台机器,Dask 允许我们使用线程或进程并行运行计算。

进程不共享内存,在单个内核上运行,更适合不需要通信的计算密集型任务。线程共享内存,但是在 Python 中,由于全局解释器锁(GIL),两个线程不能同时在同一个程序中操作,只有一些操作可以使用线程并行运行。(关于线程/进程的更多信息,请参见这篇精彩的文章)

由于计算特征矩阵是计算密集型的,并且可以针对每个分区独立完成,所以我们想要使用进程。这些任务不需要共享存储器,因为每个特征矩阵不依赖于其他特征矩阵。用计算机科学的术语来说,通过划分数据,我们使我们的问题尴尬的并行,因为工人之间不需要交流。

如果我们使用进程启动 Dask 如以下代码所示——我们有 8 个工作线程,每个内核一个,每个工作线程分配 2 GB 内存(总共 16gb/8 个工作线程,这将根据您的笔记本电脑而有所不同)。

from dask.distributed import Client# Use all 8 cores
client = Client(processes = True)

为了检查是否一切正常,我们可以导航到 localhost:8787,Dask 已经为我们设置了一个散景仪表板。在 Workers 选项卡上,我们看到 8 个工作线程,每个都有 2 GB 的内存:

Workers created by Dask with processes = True (run on a MacBook with 8 cores and 16 GB of RAM).

目前,所有 8 名工人都无所事事,因为我们没有给他们任何事情做。下一步是创建一个“Dask 包”,它基本上是 Dask 分配给工人的任务列表。我们使用db.from_sequence方法和分区路径列表来制作“包”。

import dask.bag as db
# Create list of partitions
paths = ['../input/partitions/p%d' %  i for i in range(1, 105)]# Create dask bag
b = db.from_sequence(paths)

然后,我们把map计算任务放到包里。map意味着获取一个函数和一个输入列表,并将该函数应用于列表中的每个元素。由于我们首先需要从每个分区创建一个EntitySet,我们将相关的函数映射到“包”:

# Map entityset function
b = b.map(entityset_from_partition)

接下来,我们做另一个映射,这次是制作特征矩阵:

# Map feature matrix function
b = b.map(feature_matrix_from_entityset, 
          feature_names = feature_defs)

这段代码将获取第一个mapEntitySet的输出,并将其传递给第二个map.。这些步骤实际上并不运行计算,而是创建一个任务列表,然后由 Dask 分配给工人。要运行任务并生成我们称之为的特征矩阵:

# Run the tasks
b.compute()

Dask 根据从映射构建的任务图(一个有向无环图)自动分配任务给工人。当计算发生时,我们可以在散景仪表板上查看任务图表和状态。

Dask task graph midway through the computation process.

左边的一组块代表entity_set_from_partition函数调用,右边的块是feature_matrix_from_entityset. 。从这个图中,我们可以看出这两个函数之间存在相关性,但是在每个分区的特征矩阵计算之间没有

在散景仪表板上还有许多其他可视化效果,包括任务流(左下方)和操作配置文件(右下方):

Task Stream (left) and Profile (right) of ongoing computation.

从任务流中,我们可以看到所有八个工人同时在使用,总共有 208 个任务要完成。概要文件告诉我们,最长的操作是计算每个分区的特征矩阵。

在我的 MacBook 上,构建和保存所有 104 个特征矩阵花了 6200 秒(1.75 小时)。这是一个相当大的改进,从重写我们的代码到尽可能有效地使用我们可用的硬件。

我们没有得到一台更大的计算机,而是重写代码,以最有效地利用我们拥有的资源。然后,当我们得到一台更大的计算机时,我们将能够使用相同的代码来最小化计算时间。

构建一个特征矩阵

一旦我们有了单独的特征矩阵,如果我们使用允许在线学习的算法,我们可以直接使用它们来建模。另一种选择是创建一个特征矩阵,可以使用 Pandas 在纯 Python 中完成:

Code to join together feature matrices.

单个特征矩阵有 350,000 行和 1,820 列,与我第一次使用单核制作它时的形状相同。

Subset of complete feature matrix.

结论

我们不应该考虑如何获得更多的计算能力,而应该考虑如何尽可能有效地利用我们现有的硬件。在本文中,我们介绍了如何使用 Dask 并行化我们的代码,Dask 让我们使用笔记本电脑完成计算的速度比在单核上快 8 倍。

我们设计的解决方案利用了几个关键概念:

  1. 把问题分解成更小的、独立的块
  2. 编写函数,一次处理一个块
  3. 将每个块委托给一个工人,并行计算

现在,我们不仅可以利用 Featuretools 的自动化特征工程的速度和建模性能,还可以使用 Dask 并行执行我们的计算,并更快地获得结果。此外,我们可以使用相同的方法扩展到更大的数据集,使我们能够很好地应对任何机器学习问题。

如果构建有意义的高性能预测模型是您关心的事情,那么请通过功能实验室与我们联系。虽然这个项目是用开源的 Featuretools 完成的,但商业产品为创建机器学习解决方案提供了额外的工具和支持。

参数推断—最大后验概率

原文:https://towardsdatascience.com/parameter-inference-maximum-aposteriori-estimate-49f3cd98267a?source=collection_archive---------1-----------------------

I dare you to not laugh at this comic after going through the post. 😄

在之前的帖子中,我们讨论了最大似然估计背后的动机以及如何计算它。我们还学习了一些通过引用单调函数来计算函数对数似然的技巧,以及它们如何使估计函数临界点的整个过程更容易,因为它们保留了这些临界点。

在 MLE 帖子的最后,我试图通过问一个简单的问题来激发使用 MAP(最大后验概率)的原因:

如果序列如下所示会怎样:

Img. 1: A sequence of two Heads

你认为第三次抛硬币是反面的概率是多少?

很明显,在这种情况下,

Img. 2

为什么?将#tails (0)和#heads (2)放入 theta_MLE 的等式中,

Img. 3

我们得出了结果。这个结果告诉我们,下一次掷硬币是反面的概率是 0(也就是说,它预测没有一次掷硬币会出现反面= > 硬币总是会出现正面),很明显事实并非如此(除非是硬币被重装载的极端情况)。现在,这在参数估计过程中提出了一个大问题,因为它没有给我们下一次翻转的准确概率。我们知道,即使是公平的硬币也有 25%的几率连续出现两个头像(0.5 x 0.5 = 0.25)。所以,硬币也不是不可能是公平的。

后面的

虽然我们知道 MLE 是机器学习中的一个强大工具,但它也有缺陷(正如我们刚刚看到的),这些缺陷发生在我们可用的数据量有限的时候。最大似然估计的问题在于它是一个点估计,也就是说,我们被允许在计算一个特定值的最大似然估计,这导致过度拟合(对于那些以前没有听说过这个术语的人,我建议你参考Quora 上的这个答案)。因为这是一个点估计,所以它与数据过度拟合(连续 2 个正面对),并且它没有考虑硬币可能仍然公平的可能性(或者可能只是稍微偏向正面)。显而易见的问题是:我们如何解决这个问题?

通常,我们对世界上正在发生的与数学无关的过程有着先验信念。让我们举一个简单的例子:假设你和你的朋友在一个“猜硬币”的游戏中打赌。现在,你可能会认为你的朋友已经稍微操纵了硬币,使其偏向他们,也许会使它有点偏向的头像; 55% 正面和 45% 反面(没有人会愚蠢到让它极端偏向某个特定的翻转,因为这很容易被察觉)。你对一个随机过程的这些假设被称为先验。用专业术语来说:

一个不确定量的先验概率分布,通常简称为,是在考虑一些证据之前,表达一个人对这个量的信念的概率分布。

有没有什么方法可以将这些先验的信念用数学方法整合到我们的模型中?

是的:我们可以让参数 theta 本身成为一个随机变量,这也证明了我们一直在使用的符号是正确的;p(F = F |theta)[注意,考虑到这个符号已经暗示了 theta 是一个随机变量,这个假设是多么完美]。

现在我们可以在θ上进行分布,并加入这样的概念,即使在极端情况下(HH),硬币仍然是公平的。正如我们将看到的,这个概念也有助于我们防止过度拟合。

对于任何 x ,我们希望能够在看到数据后表达我们的参数θ的分布,我们通过在观察到的数据序列上调节θ来做到这一点,就像这样:

Img. 4: Posterior notation

其中 D 是一个随机变量,它捕获了手头的观察序列,即我们的数据。现在θ是一个随机变量,它可以取特定的标量值 x 。因为我们讨论的是抛硬币,所以我们知道上面的等式只对[0,1]中的 x 有意义(由于 x 是一个概率,所以它必须在 0 和 1 之间)。

我知道这很难接受。因此,让我们后退一步,尝试理解 MLE 中发生了什么,以及它与我们正在进行的 MAP 估计相比如何:

Img. 5: MLE - Likelihood is the probability of data given the parameter, and we were maximizing this w.r.t. theta.

现在我们感兴趣的是:

Img. 6: MAP — Maximizing the probability of theta after we have observed our data.

现在还不完全清楚地图术语的直观含义,但是当我们完成这篇文章的时候就会明白了。

一般为

Img. 7: MLE != MAP

我们可以应用古老的贝叶斯法则来使地图公式变得更加神秘:

Img. 8: Bayes’ rule on MAP (Posterior)

分子包括:

Img. 9: Numerator I — Likelihood

**我们从 MLE 中知道这部分,唯一的区别是它现在用θ=x .固定,它被称为似然。

Img. 10: Numerator II — Prior

这是我们在观察任何数据之前对θ值的先验信念。它在之前被称为,它防止过度拟合。关于前科的一点小动机:**

在很多情况下,我们有理由相信,θ的某些值比其他值更有可能。例如,在我们掷硬币的例子中,我们期望这个值在 0.5 左右,像 0 或 1 这样的极端值不太可能出现。这是 Prior 捕获的内容,它将防止极端结果(过度拟合)。

分母 p(D)称为证据,是一个归一化常数,在我们的例子中并不重要。没有分母,右边的表达式就不再是概率,因此范围不会从 0 到 1。“归一化常数”允许我们得到一个事件发生的概率,而不仅仅是这个事件与另一个事件相比的相对可能性。查看关于堆栈交换的讨论。

我们应该从所有这些讨论中获得三个术语:

  1. 在先的;在前的
  2. 可能性,以及
  3. 在后面的

它们是由贝叶斯法则联系在一起的。因此,先验是我们在观察到任何数据之前对 theta 看起来如何的信念,后验是我们在观察到一些数据之后对 theta 看起来如何的更新的信念。

**现在我们已经建立了可能性(我们在上一篇文章中一直使用)和后验概率(我们现在感兴趣的)之间的联系。而这两者之间的联系是先验分布,先验分布是我们的模型的一部分。所以,是我们来选择优先。先验的要点是,我们必须在不看观察的情况下选择它,这为(可能是主观的)模型假设留下了空间。除了它需要是一个有效的概率分布之外,先验不需要满足任何特定的规则:

Img. 11: Prior is just a probability distribution.

让我们看几个前科的例子:

  1. 我们假设存在除 0(HH 序列的最大似然)之外的其他可能性。现在这个先验是非常弱的,因为它没有给出太多关于这些可能性的信息。
  2. 我们还可以假设参数θ最有可能在 0.4 和 0.5 之间的区域,这大约是 0.5 的真实概率(尽管 MLE 解告诉我们它是 0)。由于我们将假设限制在某个区域,这是一个相当强的先验的例子。

这些主观假设也被称为归纳偏差**。通过引入这些主观假设,我们使我们的分析/模型偏向某些解决方案。这是我们写下模型时必须意识到的事情。

地图估计

下图说明了我们对θ的先验的几种选择:

Img. 12: Prior choices (x-axis represents probability for theta. y-axis represents probability density)

第一张图显示了所有可能参数的均匀分布。它没有对模型施加任何归纳偏差,因此没有比其他方案更倾向于θ的任何方案。换句话说,这是我们的最大似然估计。因此,我们可以说 MLE 是当先验是一致的时映射的一个特例。

其他三个选项对θ施加了一些感应偏置。具体来说,我们可以看到它们都以 0.5 为中心,宽度不同(如果您可以推断出后三个模型对先验假设的严格性的降序,则为一个 cookie。;)).这意味着后三种方法都假设真实解在 0.5 左右的小区间内,区间宽度不同。

好了,现在我们对我们的先验应该是什么样子有了一些想法。在选择之前的模型的背后,我们能有更多的动机吗?一个可能的动机是,我们可以选择一个先验,这样可以简化进一步的计算(它们不会变得非常广泛)。这是为我们的特定模型(在我们的例子中:抛硬币)选择适当先验的驱动因素之一。

由于先验只是另一种概率分布,我们希望选择这种分布,使我们随后的计算更容易。事实证明,每当我们寻找一个直接对应于概率的参数的先验时(就像在我们的例子中,θ对应于抛硬币时出现的概率),通常存在这样的先验,它们非常适合。

在我们的例子中,这个先验将是一个 Beta 分布:

Img. 13: pdf of a beta distibution

贝塔分布可以理解为代表一个概率的*分布——也就是说,它代表一个概率的所有可能值,当我们不知道那个概率是什么的时候。更直观的理解,见本。***

好吧,这看起来非常拜占庭式和令人沮丧的乍一看,但留在我这里。让我们仔细看看;我们开始注意到一些我们以前已经见过的术语:

Img. 14: We have seen an extremely similar form in MLE.

我们已经看到了 Img 中的组件。14 在 MLE 中,除了指数中的# 和# 被替换为 a-1 和 b-1。

除了θ项,我们还有归一化常数,它有伽马函数。伽玛函数只不过是阶乘函数的扩展,它的参数下移了 1:

Img. 15: Gamma function

伽马函数的特殊之处在于它允许我们计算任意实数值的阶乘(伽马函数 1.5 是很好的定义,而 1.5!未定义)。

事实上,我们以前在某些地方看到过这种情况,这并不是巧合。我们已经选择了一个共轭先验。每当我们有一个先验,它具有与可能性相似的函数形式,并且它们很好地配合在一起,我们就说所谓的共轭先验,贝塔分布是我们掷硬币实验的可能性的共轭先验。解释如下:在没有看到任何数据的情况下,我们对掷硬币实验的结果有一种感觉。在我们的实验中,如果我们要掷 a+b-2 硬币,那么我们可以选择优先次序,这样掷硬币中的 a-1 会出现,剩下的 b-1 会出现头。

所以,如果我们假设硬币是无偏的,我们会选择 a 和 b 相等。我们对这个假设越确定,我们就越会选择 a 和 b。

下图说明了 Beta 分布中 a 和 b 的几种选择:

Img. 16: Four different Beta distributions (x-axis represents the probability for theta. y-axis represents density)

如果你想尝试不同的测试版,请点击这里查看 iPython 笔记本。

四幅图的解释:

a.选择 a 和 b 为 1(相等)意味着我们对实验没有任何假设。这是贝塔分布的一个重要特征:当 a = b = 1 时,它推广为均匀分布。

b.选择一个< b represents that we are less certain about #反面比选择一个#正面。该图通过显示尾部的概率更可能小于 0.5,清楚地说明了这一点。**

c.相比正面,我们对反面是 T21 的把握是正面的两倍。从图中我们可以看到,翻牌是反面的概率偏向大于 0.5。

d.选择 a 和 b 为非整数有利于极端解决方案。不幸的是,为 a 和 b 选择非整数并没有任何可行的物理解释,但是它给了我们在建模先验分布时很大的灵活性。

从某种意义上说,我们对先前的假设越确定,我们就越能选择 a & b,这从 Img 的‘b’和‘c’图中可以看出。16.

既然我们已经通过各种论证论证了β分布是我们掷硬币实验的合适先验,那么让我们把我们所知道的一切代入我们在 Img 中使用的贝叶斯公式。8:

Img. 17: Bayes formula for Posterior

我们知道:

Img. 18: MLE part in our MAP solution

现在你可能会想,我们在之前得到的的可能性中有θ:

Img. 19 : Likelihood

我们现在有 x 而不是θ的原因是因为我们已经假设θ本身是一个随机变量,可以取一个特定的值 x.

因为我们已经决定先验是一个 Beta 分布,它采用以下形式:

Img. 20: Prior

将这些值代入贝叶斯法则:

Img. 21: MAP formulation

第二个陈述通过省略 p(D)和贝塔分布的归一化常数引入了比例符号,因为它们都是常数 w.r.t. x. (此外,省略常数不会改变最大值的位置,只会改变其值。)

考虑上图中的第二个语句。我们可以看到为什么β分布或共轭先验通常是强大的,因为这一项实际上看起来像可能性,除了它有这些校正项 a-1 和 b-1。所以不管|T|和|H|有多极端(比如我们只抛了两次硬币),我们都有这些修正项 a & b。

我们在这里所做的基本上是将结果从极端边际结果中抽离出来,就像我们在数据太少的情况下得到的最大似然结果一样。共轭先验之所以是先验的绝佳选择,是因为它们确实有这种效果。

好了,现在我们只剩下以下术语:

Img. 22: MAP with proportionality

我们如何找到把比例符号变成等号的乘法常数?

让我们绕一个弯子,看看如何得出用常规方法无法求解(或至少很难求解)的特定积分的解:

Img. 23: A not-so-easy integral

你认为你能解析地解出这个纸上积分吗?我不是数学专业的,但对我来说,答案是肯定的和否定的。是的,你可以,但如果你能想出解决方案,用传统的微积分规则得出结果将需要相当长的时间。不,嗯,因为类似的推理需要太长时间。

如果你非常了解你的概率分布,你会知道下面的积分是:

Img. 24: Standard gaussian pdf

均值和单位方差为 0 的标准高斯分布的 pdf,即 X ~ N(0,1),它等于 1。如果你想温习高斯语,我认为 ikipedia 的文章相当可靠。

如果上面的积分等于 1,那么只需要通过两边乘以 sq.rt(2*pi)来重新排列项,就可以得出我们刚才所说的实际积分的答案(Img。23).,我们看到:

Img. 25 : Answer to the not-so-easy integral

因此,从某种意义上说,我们通过逆向工程找到了一个相当困难的积分的解。

现在我们有了一个非常方便的技巧,让我们看看是否可以应用它来找出我们的 MAP 估计的比例常数。

我们知道我们的先验分布总和为 1:

Img. 26: The only constraint on prior

以及 Img 中的 RHS。MAP 的 22 表达式与 pdf 成比例,pdf 积分为 1。注意到和我们的酷魔术惊人的相似了吗?

因此,通过逆向工程,后验概率也必须是贝塔分布,这里唯一起作用的常数是相应贝塔分布的归一化常数:

Img. 27: Constant of Proportionality for our MAP

没有其他常数使我们的 MAP 估计的 RHS 积分为 1。但是因为它必须积分为 1,这是唯一的工作常数。

每当我们应该解决一个困难的积分,我们仔细检查它,并试图找到它是否看起来像一个 pdf。如果是这样,我们可以很容易地逆向工程这个 pdf 的归一化常数,然后可以很容易地解决积分。

Img. 28: Note on the reverse engineering trick

这种逆向工程技巧的一个直接且非常好的结果是,我们可以很容易地确定我们的后验概率的分布。这使我们知道,我们的后验需要是一个贝塔分布,我们也知道参数:

Img. 29: Posterior — Beta distribution

现在我们可以找到我们的参数 theta 的最大值,就像我们在 MLE post 中所做的一样(我跳过了实际的计算;这是对数在 Img 方程中的一个简单应用。21 找出最大值),我们得出以下结果:

Img. 30: MAP Solution

将这个 MAP 估计与 ML 估计(|T|/|H|+|T|)进行比较,我们看到它们非常相似。项|T|/|H|+|T|再次出现在 MAP estimate 中,只不过它被我们先前的信念所修正。

根据我们先前的想法,在看到(i.i.d .)数据后,theta_MAP 是 theta 的最佳猜测。

称为最大后验估计(MAP)。

注意这里最重要的一点:后验工作非常直观。如果我们只有很少的数据(就像在我们的第二个实验中,我们只有两次抛硬币,两次都是),先验的影响会更强。另一方面,对于固定的 a & b,如果我们进行足够多的抛硬币(例如,一百万次),那么 a & b 的影响几乎可以忽略不计,并且我们非常接近 MLE。这非常直观,因为在低数据范围内,先验防止过拟合,而如果我们从随机过程中获得大量可靠信息,我们就不再需要先验信息了。我们可以从数据本身获得所有信息。换句话说,当我们在数据中游泳时,MLE 占主导地位。

这个过程结束了吗?我们已经融入了我们对世界运作方式和随机过程展开方式的假设。还有什么要完成的?现在我们可以坐下来看 LOTR 三部曲了。

或者我们可以吗?事实证明,当我们将我们先前的信念结合到模型中时,我们隐含地倾向于某些解决方案(通过假设在抛硬币过程中的 beta 分布,我们使 MAP 估计偏向特定的解决方案;看起来像 Beta pdf 的表单)。那么所有其他也能影响一个过程的前科呢,尽管是以一种非常微妙的方式?有没有什么方法可以把它们也合并到我们的模型中?正如你已经知道的,答案是肯定的,我们将在下一篇文章中深入讨论它,当我们谈论我们模型的完全贝叶斯分析时。

我意识到这篇文章有时并不容易理解,其中涉及到很多数学问题。我希望我让你更容易和直观地理解地图估计的过程。如果你发现任何具体的部分太深奥,随时留下评论,我会尽快处理。

资源:我在慕尼黑工业大学的研究生院教授的 ML 课程。在这里随意观看讲座。

如果你觉得这篇文章有趣,请推荐并分享它,这样其他人也可以从中受益。

参数推断—最大似然

原文:https://towardsdatascience.com/parameter-inference-maximum-likelihood-2382ef895408?source=collection_archive---------1-----------------------

The never ending debate of Frequentists and Bayesians. (Image source: xkcd)

他的文章深入探讨了理论机器学习最重要的概念之一,即。,参数推断。当我觉得需要的时候,我会试着专注于对概念的直觉理解,同时嵌入数学公式。如果你曾经在大学上过本科/研究生水平的机器学习课程,你一定遇到过参数推断。当我第一次遇到这种情况时,我绞尽脑汁了好一阵子,试图理解圆周率的概念(不是一个众所周知的参数推断的缩写),这就是为什么我觉得有必要写一篇文章,让其他人更容易理解。我希望当我们完成这篇文章后,你能从中获取一些有价值的东西。我们开始吧。

PI 可以自由地描述为确定参数的过程,这些参数控制着从实验中生成的数据集。例如,如果我们抛硬币十次,得到下面的数据集,

Img. 1: 10 flips of a coin

产生这十次翻转的参数是什么?事实证明,参数推断的过程并非完全无关紧要,需要相当多的数学知识才能理解。如果你了解对数、微积分(准确地说是微分)和基本概率的基础知识,这篇文章应该不难理解。无论如何,让我们言归正传。PI 可以被认为是一个分步骤的过程,有三个主要步骤:

Img. 2: Three steps to Parameter Inference.

我们从最低的一步开始,然后努力到达最高的一步。每一步都比前一步稍微复杂一些,但同时,它为我们提供了一个更健壮的模型来描述数据。这篇文章将详细讨论最底层的步骤最大似然估计,后续文章将讨论另外两个步骤。(附带提示:使用笔和纸可以轻松理解术语和公式,因为介质尚不支持数学符号)。好吧,那么 MLE 是什么?

最大似然估计

如图所示,最大似然估计的整个过程围绕着确定使数据概率最大化的参数。回到抛硬币的例子,你认为第 11 次抛硬币是反面的概率是多少?有两个合乎逻辑的答案:

  1. 如果你说 0.5,这是一个合理的答案,因为翻转是相互独立的,下一次翻转是有 1/2 的机会,即 0.5。
  2. 另一个答案可能是 0.3。这个答案背后的基本原理是,我们可以预期硬币的翻转会继续到目前为止发生的方式(直到第十次翻转)。

我暂时不会告诉你正确的答案。让我们一起努力找出哪一个是正确的。好的,那么我们需要找出P_11(F_11=Tails),其中 P _ 11 是第 11 次翻转的概率,F _ 11 是第 11 次翻转。这产生了一般情况: i th 翻转为 Tails:

Img. 3

其中 F_i 表示第 i 次翻转,而θ_ I是控制第 i 次翻转的参数。为了表示概率分布取决于θ_ I,我们可以写为:

Img. 4

你看到这里的问题了吗?我们有依赖于参数 theta_1theta_10 (i = 1 到 10) 的数据。这就提出了一个问题,那就是我们如何把它推广到。暂时还是坚持现有的,即 theta_1theta_10。

翻转序列的所有随机性由参数 theta_1theta_10: 控制(建模)

Img. 5

我们目前对 theta_1 了解多少..theta_10 ?他们是否以某种方式与 theta_11 联系在一起?乍一看,似乎没有什么联系。现在我们可以开始 MLE 的过程了:我们需要找到 theta_i 的使得

Img. 6

是尽可能高的。这是 MLE 背后的原则:

Img. 7

MLE 着眼于数据的概率(所谓的可能性; Img。5 & 6】并且它试图找到使该序列的可能性/概率最大化的那些参数θ_ 1θ_ 10。最后一次重申,我们要选择那些参数,在这些参数下,我们的观察变得最有可能。这就是这个过程被称为 MLE 的原因。

现在让我们尝试实际模拟 Img 中描述的概率。5 & 6.为了能够计算出数据的最大似然估计,我们需要做出两个关键假设:

一、抛硬币互不影响,即互不相关*(第一次抛硬币的结果不影响第二次抛硬币的结果,以此类推) :*

Img. 8: The independence assumption allows us to simplify the complex likelihood term into ten simpler factors.

Img 中的第三个语句。8 只是一个简写符号,描述第二条语句中十项的乘积。

第一个假设允许我们大大简化似然项,但是请注意,速记符号中仍然存在 theta_i 。这意味着我们仍然没有等式中的 theta_11

还有一个假设可以进一步解开这个等式。这是因为硬币(一般来说,实验设置)没有显著变化:

二。翻转在数量上是相同的,即它们是同分布的:**

Img. 9: Since the flips are taking place under similar circumstances, we can assume that the parameter governing the flips is one and same.

第二个假设是翻转是同分布的,允许我们从θ中去掉下标 i 。这意味着我们观察到的所有 10 次翻转本质上都是由同一个参数θ决定的;不再有十个参数来控制十次不同的翻转,我们现在只有一个参数来控制整个硬币翻转的顺序,这也包括第 11 次翻转。从某种意义上来说,我们正在把前 10 次抛硬币和第 11 次抛硬币联系起来。我们很快就会看到,这将是推论的关键。**

注意:我们所做的两个假设在机器学习中使用得如此频繁,以至于它们作为一个实体有一个特殊的名称, i.i.d .假设:

总的来说,这 10 次翻转是独立的,并且分布相同。

这允许我们明确地写下我们试图优化的可能性。记住 theta 被定义为翻转出现尾部的概率;我们的序列 w . r . t .θ的概率现在可以表述为:

Img. 10: First term is the probability of Heads, second for Tails, third and fourth for Heads, fifth for Tails and so on. Note that this formula corresponds to the sequence of our coin flip.

因此,通过这种非常广泛和非常直观的假设,我们将似然函数简化为一个相当简单的多项式;我们可以开始优化参数 theta 的函数。

根据我们的模型假设:

Img. 11

上述简化的多项式可以解释为θ的函数,即f(θ)。现在我们想找出这个函数的最大值(最大似然)。对如何进行有什么想法吗?

没错!从这里开始都是基本的高中数学。我们取导数df/d(θ),设为零,求解θ。然后验证临界点(函数斜率为零的点:极大值、极小值和鞍点。在这种情况下,我们只关心最大值),通过将它们插入到 f(theta) 的二阶导数中。

原则上,这相当简单。除了一个警告:f(theta) 的二阶导数已经很难看了,因为我们需要应用乘积法则 两次才能得到它。这是可行的,但要实现这一目标,需要大量单调的技术工作。有什么方法可以简化我们的计算吗?

数学的美妙之处在于它为我们提供了无数的途径来找到一个特定的解决方案。其中一些比另一些容易几倍。我们将应用一个更简单的途径来优化我们的似然函数:

让我们稍微了解一下高中微积分,分析一下单调函数(如果你已经对这个概念很熟悉了,可以继续到本节末尾)。我们已经知道如何找出函数的最大值或最小值,并且实际的最大值和最小值被称为函数的临界点数学中有一条规则,即如果我们将一个单调函数应用于我们正在优化的另一个函数,单调函数的应用将保留原始函数的临界点*(维基百科文章* 是了解更多关于单调函数的极好来源)。**

如果 x1 < x2 = > f(x1) < f(x2):这是一个单调递增函数

如果 x1 < x2 = > f(x1) > f(x2):这是一个单调递减函数

对数函数 是单调递增函数的一个例子:

Img 12: A monotonically increasing function — log(x)

因此,我们可以断定 log f(theta) f(theta)具有相同的最大值。

因此,如果我们将 log 应用于我们的似然函数,我们将得到与我们直接优化它所得到的相同的最大值。

所以我们想找出:

Img. 13: arg max f(theta)

Arg max 是指我们想知道这个函数最大化时θ值,而不是函数本身的最大值。这意味着我们而不是真正关心的是函数的实际最大值。相反,我们感兴趣的是函数具有最大值的θ的值(在继续之前,让它沉淀片刻)。**

取该函数的日志:

Img. 13: log arg max f(theta)

我们用 g(theta) 表示这个函数:对数似然。

g(θ)求导

Img. 14: derivative of g(theta)

其中|T|是尾部的数量(在我们的示例中为 3),而|H|是头部的数量(在我们的示例中为 7)。我引入 T 和 H 是为了使解决方案具有普遍性。

g’(θ)的值设置为零(以找到θ的临界值):

Img. 15: Critical value of theta — I

Img. 16: Critical value of theta — II

因此,任何硬币序列的最大似然估计(MLE ):

Img. 17: Theta MLE

我们已经得到了参数θ的最大似然估计,该参数控制着我们的硬币投掷数据集。回到原来的问题,第 11 次翻转是的概率是多少?

设|T| = 3 和|H| = 7,我们得到的答案为 0.3。这证明了 30%是我们最初问题的合理答案。

现在我们需要在二阶导数中代入θ的这个临界值,来验证它确实是最大值。为了简洁起见,我在这里跳过了这个验证。但是请继续下去,说服自己这确实是最大值。

这个最大值被称为θ的 MLE。这个特殊的 theta 是最有可能让我们观察到的序列。

直觉上,这个 30%的值也是合理的,因为我们预计硬币会以开始的方式继续翻转。所以,我们发现当我们看数据时,MLE 解释了我们的直觉,这很好。

MLE 的缺点?

显然,正如我们在阶梯图中已经看到的,找到最大似然并不是参数估计的结束。我们还剩下最大事后估计完全贝叶斯分析。那么,是什么促使我们不止步于 MLE 并完成流程呢?你能想出一个理由吗?

如果序列如下所示会怎样:

Img. 18: A sequence of two Heads

你认为第三次翻转是反面的概率是多少?

在即将到来的帖子中,我们将探索 MLE 的缺点,找出 MAP ( 最大后验估计)和完全贝叶斯分析背后的直观原理,并且还将建立 ML 中的几个关键概念,即。共轭先验,归纳先验和一种允许我们计算不可解积分的技术。

如果你心中有任何概念对你来说没有直观的意义,并希望看到类似的帖子,请在评论中告诉我,我会尽力提出来。

资源:

  1. 我在慕尼黑工业大学的研究生院教授的精彩的 ML 课程。你可以在这个 YouTube 频道观看所有讲座。

如果你喜欢这篇文章,请随意推荐和分享,这样其他人也可以从中受益。

解析 XML,一次性识别命名实体

原文:https://towardsdatascience.com/parsing-xml-named-entity-recognition-in-one-shot-629a8b9846ee?source=collection_archive---------5-----------------------

Photo credit: Lynda.com

条件随机场,序列预测,序列标记

解析 XML 是一个旨在读取 XML 并为程序使用 XML 创造一种方式的过程。XML 解析器是一种软件,它读取 XML 文件,并将这些文件中的信息提供给应用程序。

在读取 XML 文件时,解析器会检查格式的语法,并报告任何违规情况。

我们今天的主要目标不是解析 XML,而是命名实体识别(NER),但是我们要使用的数据是以 XML 格式存储的。

NER 的任务是确定文本中提到的实体的身份。例如,给定句子“巴黎是法国的首都”,思路是确定“巴黎”指的是巴黎的城市,而不是巴黎希尔顿。

“巴黎是法国的首都”这句话暗示巴黎是一个国家的首都,暗示巴黎是一个城市,而不是一个人的名字。

命名文档集合中发现的实体的任务极具挑战性。幸运的是,UPB数据科学小组从德国提供了一组用于 NLP 交换格式的命名实体识别的带注释的训练数据集,我们将使用其中一个名为 500newsgoldstandard.xml 的数据集,可以在这里找到。

数据

为了研究数据,我们使用prettify()以分层格式的嵌套数据结构获取文档:

with codecs.open("500newsgoldstandard.xml", "r", "utf-8") as file:
    soup = BeautifulSoup(file, "html.parser")
print(soup.prettify())

数据创建者侧重于识别三类主要的命名实体:人、地点和组织。从第一份文件中我们可以看到:

Figure 1

该文件有一句话“美国专利局允许基因获得专利,只要有人通过从细胞中取出 DNA 来分离 DNA,美国公民自由联盟的律师桑德拉·帕克说”,其中“美国公民自由联盟”(一个组织)和“桑德拉·帕克”(一个人的名字)被标记为命名实体。因为它们在namedentityintext标签之间。

数据预处理

文本预处理包括遍历textwithnamedentities下元素的每个子元素,否则我们将“N”标记为命名实体“C”的一部分。

以下代码返回文档列表,每个文档都包含单词和标签对。

docs = []
for elem in soup.find_all("document"):
    texts = []
    for child in elem.find("textwithnamedentities").children:
        if type(child) == Tag:
            if child.name == "namedentityintext":
                label = 'N'
            else:
                label = 'C'
            for w in child.text.split(" "):
                if len(w) > 0:
                    texts.append((w, label))
    docs.append(texts)

我们可以再次调查第一份文件。

docs[0]

Figure 2

位置标签

我们将对文档列表应用单词标记和词性标注。

data = []
for i, doc in enumerate(docs):
    tokens = [t for t, label in doc]
    tagged = pos_tag(tokens)
    data.append([(w, pos, label) for (w, label), (word, pos) in zip(doc, tagged)])

这为我们提供了包含单个单词、POS 标签及其标签的元组列表。

data[0]

Figure 3

条件随机场

在命名实体识别领域,我们的输入数据是连续的,我们预测相互依赖以及依赖于其他观察变量的变量,也就是说,我们在对数据点进行预测时考虑周围的上下文,再想想“巴黎是法国的首都”与“巴黎希尔顿”。

所以我们会定义一些特征,比如词的身份、词的部分、下/标题/上标志、词的后缀、词的形状、词的词性标签;此外,使用来自邻近单词的一些信息,以及不在文档开头的单词的所有这些特征,不在文档结尾的单词的所有这些特征。

条件随机场 Python 库,Python-Crfsuite

Python-crfsuite 是一个绑定到 CRFsuite 的 Python,这是一个用于标记顺序数据的条件随机字段(CRF)的实现。该库已被广泛用于命名实体识别。

以下代码大部分摘自 python-crfsuite ,用于上述特征提取:

features_crfsuite.py

训练模型

train_crfModel.py

评估结果

evaluate_results.py

Figure 4

对于第一次尝试来说还不算太差!

Jupyter 笔记本可以在 Github 上找到。享受这周剩下的时光。

参考资料:

[## 条件随机场简介

假设你有一系列贾斯汀比伯生活中某一天的快照,你想给每张照片贴上…

blog.echen.me](http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/) [## 在 Python 中使用 CRF 执行序列标记

在自然语言处理中,从给定的文本中抽取特定类型的词或短语是一项常见的任务

www.albertauyeung.com](http://www.albertauyeung.com/post/python-sequence-labelling-with-crf/)

第 1 部分:从头开始的神经网络—基础

原文:https://towardsdatascience.com/part-1-a-neural-network-from-scratch-foundation-e2d119df0f40?source=collection_archive---------8-----------------------

在这一系列文章中,我将解释神经网络的内部工作原理。我将为其背后的理论奠定基础,并展示如何用几行简单易懂的 Java 代码编写一个合格的神经网络。

这是系列文章的第一部分:

  • 第一部分:基础。
  • 第二部分:梯度下降和反向传播。
  • 第 3 部分:用 Java 实现。
  • 第四部分:更好、更快、更强。
  • 第 5 部分:训练网络阅读手写数字。
  • 额外 1:我如何通过数据扩充提高 1%的准确度。
  • 号外 2:MNIST 游乐场。

背景

几周前,我决定学习机器学习。我最感兴趣的是应用机器学习以及这种范式可能带来的商业机会和新软件。我认为一个合理的前进方式是选择任何框架,如 TensorFlow 或 DL4J 并开始尝试。所以我做了…并且变得沮丧。原因是,仅仅在这些框架中的任何一个中建立一个良好行为的神经网络就需要对概念和内部工作有相当多的理解:*激活函数、优化器、正则化、退出、学习速率退火、*等。——我分明是在黑暗中摸索。

我只是需要对这一切有更深的理解。因此,我一头扎进了浩瀚的互联网信息海洋,经过一周的阅读,我不幸地意识到,没有多少信息转化为知识。我不得不重新思考。

长话短说:我决定自己建立一个小型神经网络。作为一个获取知识的游乐场。

结果很好。从零开始构建时所需的实践/理论组合正是我加深理解的正确方式。这是我学到的。

神经网络

从外部来看,神经网络只是一个函数。因此,它可以接受输入并产生输出。这个函数是高度参数化的,这是非常重要的。

有些参数是我们自己设定的。这些参数被称为超参数,可以被视为我们的神经网络的配置。然而,大多数参数是网络固有的,我们无法直接控制。为了理解为什么这些是重要的,我们需要看看它的内部。

一个简单的神经网络通常由一组隐藏层组成,每个隐藏层包含许多神经元,在图中标记为黄色。输入图层标记为蓝色。

在上面的配置中,输入是大小为 4 的向量 X,输出是大小为 3 的向量 Y。

如图所示,一层中的每个神经元与下一层中的每个神经元之间都有联系。每个这样的连接实际上都是一个参数或权重。在这个例子中,我们已经有了 94 个权重形式的额外参数。在更大的网络中,数量可能更多。这些权重将定义网络的行为方式以及将输入转换为期望输出的能力。

神经元

在我解释如何将网络作为一个整体来转换数据之前,我们需要进一步放大。向单个神经元问好:

每个神经元的输入是前一层中每个神经元输出的加权和。在示例中,这将是:

在此基础上,我们添加了一个称为 bias 的标量值, b ,它给出了神经元的总输入:

然后,输入信号在神经元内通过应用称为激活函数的东西进行转换,表示为 σ激活函数的名称源于这样一个事实,即如果输入信号 z 足够大,该函数通常被设计为让信号通过神经元,但是如果 z 不够大,则限制神经元的输出。我们可以认为这是神经元触发活跃,如果刺激足够强的话。

更重要的是,激活功能增加了网络的非线性,这在试图有效地拟合网络时很重要(通过拟合网络我的意思是训练网络产生我们想要的输出)。没有它,网络将只是其输入的线性组合。

经常使用被称为整流线性单元或 ReLU 的激活函数(或其变体)。ReLU 很简单:

另一种常见的激活功能是这种逻辑功能,称为 sigmoid 功能:

正如你从图中看到的,它们都以我描述的方式运行:如果足够大,它们让信号通过,如果不够大,则限制信号通过。

最后,在将激活函数应用于 z,得到σ(z)之后,我们得到了神经元的输出。

或者以向量形式陈述:在将激活函数应用于向量 z 之后,得到 σ(z) (其中函数被应用于向量 z 中的每个元素)我们从得到该层中所有神经元的输出。

正向输送

现在我们有了描述如何将整个神经网络(即“函数”)应用于一些数据以获得输出 y = f(x) 的所有零碎信息。

我们只是通过网络中的每一层传送数据。这叫做进给* 前进它的工作原理是这样的:*

输入 x 并从第一个隐藏层开始:

  • *对于当前层 n 中的每个神经元,取前一层 **n - 1 中每个相连神经元输出的加权和。*添加偏差并应用激活功能。
  • 进行到层 n + 1 但是现在使用层 n 的输出值作为输入。
  • 现在一层一层地进行,直到你到达最后一层。这些神经元的输出将给出 y

让我们看一个简单的例子:

假设我们已经选择 sigmoid 函数作为所有层中的激活:

现在让我们一层一层地,一个神经元一个神经元地,计算这个网络在输入向量**×x*=【2 ^ 3】*上会给出什么输出。

因此,这个网络在输入 x = [2 3] 上产生输出
y =[0.7122574322957417 0.5330975738715015】

如果我们幸运,或者擅长设置初始权重和偏差,这可能正是我们想要的输入输出。更有可能的是根本不是我们想要的。如果是后者,我们可以调整权重和偏差,直到得到我们想要的输出。

让我们思考一下,为什么神经网络是这样设计的,为什么调整权重和偏差可能是使网络的行为更符合我们的预期所需要的。

神经网络的表达能力

网络的高度参数化使得它非常能够模仿几乎任何函数。如果我们试图模拟的函数比通过一组权重和偏差可能表达的更复杂,我们可以创建一个稍微大一点的网络(更深和/或更宽*),这将为我们提供更多的参数,从而更好地将网络与我们想要的函数相匹配。*

还要注意,通过构造神经网络的方式,我们可以自由选择输入的任何维度和输出的任何维度。通常,神经网络被设计为降低维度——即将高维空间中的点映射到低维空间中的点。这是典型的用于分类的数据。在本文的最后,我会用一个例子来说明这个问题。

现在考虑在每个神经元中发生了什么:∑(Wx+b)——即,我们将来自前一层的信号馈送给激活函数,但是我们缩放并且首先翻译它。那么,把一个论点转化成一个函数,意味着什么呢?考虑一会儿吧。

为了简单起见,让我们看看当我们缩放函数的输入时,在二维空间中会发生什么。

这是 sigmoid 函数在非比例输入下的样子,即∑(x):

如果我们将输入放大 5 倍,即∑(5x),结果会是这样。如您所见,并且可能已经猜到,缩放输入会在 x 轴上压缩或扩展函数。

最后,向输入中添加一个标量意味着我们在 x 轴上移动函数。这里是 σ(5x - 4):

因此,通过缩放和转换输入到激活函数,我们可以移动它和拉伸它。

还要记住,一层的输出是下一层的输入。也就是说,在层 L 中产生的曲线(例如上面的任何一个)在被馈送到层 L+1 中的激活函数之前将被缩放和转换。所以现在我们需要问,缩放和转换来自层 L 中函数的输出意味着什么?缩放仅仅意味着改变信号的大小,即沿着 y 轴拉伸或压缩信号。平移显然意味着沿 y 轴移动。****

那么这给了我们什么呢?

虽然上面的讨论没有证明任何事情,但它强烈地表明,通过改变神经网络的权重和偏差,我们可以按照我们的喜好,以非线性的方式拉伸和转换输入值(甚至是单独的向量分量*)。*

还要考虑网络的深度将使权重在不同的尺度上起作用,并对总函数有不同的贡献-即早期权重在广义上改变总函数,而输出图层之前的权重在更详细的级别上起作用。

这为神经网络提供了非常高的表达能力,但代价是需要调整大量参数。幸运的是,我们不必手动调谐。我们可以让网络自我调整,使输出更好地满足我们的期望。这是通过称为梯度下降反向传播的过程完成的,这是本系列的下一篇文章的主题,第 2 部分:梯度下降和反向传播。

现在,一个函数如何智能地行动?

我们已经得出结论,神经网络可以模拟从向量 x 到另一个向量 y 的映射(函数)。在这一点上,我们可以问:这对我们有什么帮助?

使用神经网络的一个非常常见的方法是对它从未见过的数据进行分类。因此,在结束这篇已经很长的文章之前,我将简要介绍一个分类的实际例子。我们将在后面的文章中回到这个例子。

当编写神经网络时,通常扔给它的第一个任务是手写数字的分类*(有点像机器学习中的“Hello World”)。对于这项任务,有一个由 60 000 张手写数字图像组成的数据集,称为 MNIST 数据集。分辨率为 28 x 28,每个像素中的颜色是 0 到 255 之间的灰度值。数据集被标记为,这意味着它指定了每个图像代表什么数字。*

如果我们展平每幅图像,即把图像的每一行都排成一长行,我们将得到一个大小为 28 x 28 = 784 的向量。此外,我们将灰度值归一化到 0 和 1 之间的范围。现在,如果我们可以将这个向量 x 输入到一个神经网络,并作为输出得到一个y-大小为 10 的向量,告诉网络认为输入代表什么数字(即输出向量的每个元素告诉网络给出图像是 0、1、2、…、9 的概率),那就好了。由于 MNIST 数据集被标记,我们可以训练这个网络,这实质上意味着:自动调整权重和偏差。最酷的事情是,如果训练做得正确,网络将能够对它以前从未见过的手写数字图像进行分类。

这怎么可能?

我将尝试用一个结论来解释这一点:每个输入向量 x 都可以被视为 784 维空间中的一个点。想想吧。长度为 3 的向量表示 3D 中的一个点。长度为 784 的向量代表 784D 中的一个点。由于每个像素值在 0 和 1 之间被归一化,我们知道该数据集的所有点位于单位立方体内,即在所有 784 个轴上的 0 和 1 之间。有理由认为,在这个空间中,代表一个数 N 的所有点彼此相当接近。例如,数字 2 的所有图像将在某个子空间中彼此靠近,而所有 7 的图像也将靠近,但在不同的子空间中。在设计这个网络时,我们决定输出应该是一个大小为 10 的向量,其中每个分量都是一个概率。这意味着输出是 10 维单位立方体中的一个点。我们的神经网络将 728D 立方体中的点映射到 10D 立方体中的点。

现在,在这种特殊情况下拟合网络真正的意思是用我们的神经网络功能在 784d-输入空间中找到那些子空间,并以这样一种方式转换(缩放,翻译)它们,使得它们在 10D 中明显可分。例如:我们希望数字 7 的所有输入(尽管它们可能略有不同)输出一个向量 y,其中表示数字 7 的分量接近 1,而所有其他 9 个分量接近 0。

我倾向于认为拟合过程是围绕这些子空间的收缩包装表面(超平面)。如果我们不过度收缩这些表面(这将导致所谓的过度拟合*),网络尚未看到的数字很可能仍会在正确的子空间内结束——换句话说,网络将能够说:“嗯,我以前从未见过这个数字,但它在我认为是数字 7 的子空间内”。*

这有点酷!

好的,这就是介绍。欢迎反馈!

现在,进入本系列的下一篇文章,你将学习如何训练神经网络,第 2 部分:梯度下降和反向传播。

脚注:

这篇文章描述了一个密集的前馈网络——一个多层感知器。选择这种网络设计是因为它简单易用。不过,很高兴知道有许多不同的网络,它们都适合不同类型的任务。

所以你可能会想,怎么可能用这么短的向量符号来编写整个层操作呢?如果你回忆一下矩阵与向量相乘的工作原理,你会意识到在做 Wx 时,你实际上是在反复地对 x 向量进行加权求和(W 矩阵中的每一行),从而得到一个向量。加上 b 向量就会得到 z。

严格地说,事情不是这样的。但我发现这是一个有益的精神形象。

原载于 2018 年 11 月 28 日machine learning . tobiashill . se。**

第 2 部分:梯度下降和反向传播

原文:https://towardsdatascience.com/part-2-gradient-descent-and-backpropagation-bf90932c066a?source=collection_archive---------4-----------------------

在本文中,您将了解如何使用反向传播和随机梯度下降来训练神经网络。这些理论将被彻底地描述并且一个详细的例子计算被包括在内,其中权重和偏差都被更新。

这是系列文章的第二部分:

  • 第一部分:基础。
  • 第二部分:梯度下降和反向传播。
  • 第 3 部分:用 Java 实现。
  • 第四部分:更好、更快、更强。
  • 第 5 部分:训练网络阅读手写数字。
  • 额外 1:我如何通过数据扩充提高 1%的准确度。
  • 号外 2:MNIST 游乐场。

我假设你已经读过上一篇文章,并且你对神经网络如何转换数据有一个很好的想法。如果上一篇文章需要良好的想象力(考虑多维度的子空间),那么另一方面,这篇文章在数学方面要求更高。振作起来:纸和笔。寂静的房间。仔细一想。一夜好眠。时间,耐力和努力。它会被理解的。

监督学习

在上一篇文章中,我们得出结论,神经网络可以用作高度可调的向量函数。我们通过改变权重和偏差来调整这个函数,但是很难手动改变它们。它们通常太多了,即使少一些,手工也很难得到好的结果。

好的一面是,我们可以通过训练网络,让网络自己调整这一点。这可以用不同的方法来完成。这里我将描述一种叫做监督学习的东西。在这种学习中,我们有一个被标记为的数据集,即我们已经有了该数据集中每个输入的预期输出。这将是我们的训练数据集。我们还确保我们有一个从未训练过网络的带标签的数据集。这将是我们的测试数据集,并将用于验证经过训练的网络对看不见的数据的分类有多好。

当训练我们的神经网络时,我们通过网络从训练数据集中输入一个又一个样本,并对每个样本的结果进行检查。特别是,我们检查结果与我们的预期(标签)相差多少。我们期望的和我们得到的之间的差异被称为成本(有时这被称为误差损失)。成本告诉我们我们的神经网络在特定样本上的正确或错误程度。然后,可以使用这种方法来稍微调整网络,以便下次通过网络馈送该样本时,误差会更小。

有几种不同的成本函数可以使用(例如,见列表)。

在本文中,我将使用二次成本函数:

(有时,这也写在一个常数 0.5 前面,这将使它稍微干净,当我们区分它。我们将坚持上面的版本。)

回到我们第一部分的例子。

如果我们预期:

…并且得到了…

…成本将是:

由于成本函数写在上面,误差的大小明显地取决于网络输出和我们期望的值。如果我们用输入值来定义成本(如果我们也考虑所有权重、偏差和使用了什么激活函数,那么输入值当然与输出值相关),我们可以写成:

C = C(y,exp) = C(W,b,Sσ,x,exp) -即成本是一个函数W8、biases,该组激活函数,输入***【x***

**成本只是所有这些输入的标量值。由于函数是连续可微的(有时只有分段可微。例如,当使用重新激活时,我们可以为成本函数设想一个连续的丘陵和山谷景观。在更高维度中,这种景象很难想象,但是只有两个重量 W ₁和 W ₂,看起来可能有点像这样:

假设我们精确地得到了图像中红点指定的成本值(在那个简化的例子中,仅仅基于一个 W ₁和 W ₂)。我们现在的目标是改进神经网络。如果我们能够降低成本,神经网络将更好地分类我们的标记数据。优选地,我们希望在这个场景中找到成本函数的全局最小值。换句话说:所有山谷中最深的。这样做很难,而且对于神经网络这样复杂的功能,没有显式的方法。然而,我们可以通过使用称为梯度下降的迭代过程来找到一个局部最小值。局部最小值可能足以满足我们的需求,如果不是,我们可以随时调整网络设计,以获得新的成本-景观,以局部和迭代探索。

梯度下降

从多变量微积分我们知道,一个函数的梯度,在一个特定点的∇f 将是一个与曲面相切的矢量,指向函数增长最快的方向。相反,负梯度-∇f 将指向函数下降最快的方向。这个事实我们可以用来从我们当前的权重 W 计算新的权重 W ⁺:

在上面的等式中 η 只是一个叫做学习率的小常数。这个常数告诉我们,我们将使用多少梯度向量来将当前的权重集更改为新的权重集。如果选择得太小,权重将被调整得太慢,并且我们向局部最小值的收敛将花费很长时间。如果设置得太高,我们可能会过冲和错过(或者得到一个有弹性的不收敛的迭代行为)。

上面等式中的所有东西只是简单的矩阵运算。我们需要仔细研究的是成本函数相对于权重的梯度:

如你所见,我们暂时对具体的标量成本值 C 不感兴趣,而是当权重改变时成本函数改变多少 (逐个计算)

如果我们展开纯矢量形式(等式 1),它看起来像这样:

使用渐变的好处是,它会调整那些最需要改变的权重,而那些不需要改变的权重会减少。这与负梯度向量正好指向最大下降方向的事实密切相关。要看到这一点,请再次查看上面简化的成本函数景观图像,并尝试将红色梯度向量分离为沿轴的分量向量。

梯度下降的想法在 N 维中同样有效,尽管很难将其可视化。梯度仍然会告诉哪些组件需要改变更多,哪些组件需要改变更少,以减少函数 c。

到目前为止,我只是谈论了重量。偏见呢?同样的推理对他们同样有效,但是我们计算(这更简单):

现在是时候看看我们如何计算权重和偏差的偏导数了。这会让我们进入一个更危险的领域,所以系好安全带。为了理解这一切,我们首先需要了解…

注释

本文的其余部分是符号密集型的。你将看到的许多符号和字母只是作为下标的索引,帮助我们跟踪我所指的是哪一层和哪一个神经元。不要让这些指数让数学表达式变得令人生畏。索引有助于使其更加精确。以下是如何阅读它们的简短指南:

还请注意,神经元的输入在上一篇文章中被称为(这很常见),但在这里被改为 i 。原因是我觉得把它记成输入的 i 和输出o 比较容易。**

反向传播

描述如何计算偏导数的最简单方法是看一个特定的单个重量:

我们还将看到,如果特定权重连接到最后一个输出层,或者连接到任何前面的隐藏层,则在如何处理偏导数方面会略有不同。

最后一层

现在考虑单个重量w的最后一层:

我们的任务是找到:

如上一篇文章所述,权重和成本函数之间有几个步骤:

  • 我们将权重乘以前一层的输出,并添加一个偏差。结果是输入Iʟ**到神经元。******
  • 这个 i ʟ 然后被馈入激活函数 σ ,从神经元oʟ₁产生一个输出******
  • 最后这个oʟ₁用在了成本函数中。******

公平地说,很难计算…

…只是看着它。

然而,如果我们把它分成我刚才描述的三个步骤,事情会变得容易得多。由于这三个步骤是链式函数,我们可以通过使用微积分中的链式法则来分离所有步骤的导数:

事实上,这三个偏导数的计算非常简单:

这意味着我们拥有计算所需的所有三个因素

换句话说,我们现在知道如何更新最后一层中的所有权重。

让我们从这里开始往回走。

隐藏层

现在考虑单个权重【w】在隐藏层最后一层之前:

我们的目标是找到:

我们像在最后一层中那样进行。链式法则给了我们:

前两个因子与之前相同,并解析为:

  • 前一层的输出和…
  • 激活函数的导数。

然而,这个因素…

…有点棘手。原因是 o ʜ 的变化明显改变了最后一层中所有神经元的输入,因此,与我们只需关心来自单个最后一层神经元的一个输出相比,在更广泛的意义上改变了成本函数(我已经通过在上图中使连接更宽来说明这一点)。

为了解决这个问题,我们需要将总成本函数的偏导数分解为来自最后一层的每一个贡献。

…其中每一项都描述了当ʜ发生变化时,成本会发生多大的变化,但仅针对通过特定输出神经元发送的那部分信号。****

让我们检查一下第一个神经元的单个项。同样,如果我们用链式法则把它分开,会更清楚一点:

让我们来看看每一项:

让我们暂停一会儿,让一切都水落石出。

总结一下我们刚刚发现的情况:

  • 为了知道如何更新隐藏层中的特定权重,我们根据该权重对成本进行偏导数。
  • 通过应用链式法则,我们得到了三个因素,其中两个我们已经知道如何计算。
  • 该链中的第三个因素是我们在上一层中已经计算过的两个因素的乘积的加权和。
  • 这意味着我们可以像在上一层中那样计算该隐藏层中的所有权重,唯一的区别是我们使用来自前一层的已经计算的数据,而不是成本函数的导数。

从计算的角度来看,这是一个非常好的消息,因为我们只依赖于我们刚刚做的计算(仅最后一层),我们不必遍历更深。这有时被称为动态编程,一旦找到动态算法,这通常是加速算法的根本方法。**

由于我们仅依赖于最后一层中的一般计算(特别是我们不依赖于成本函数),我们现在可以逐层向后进行。就我们如何计算权重更新而言,任何隐藏层都不同于任何其他层。我们说我们让成本(或误差损失)反向传播。当我们到达第一层时,我们就完成了。在这一点上,我们对等式(等式 1)中的所有权重进行偏导数,并准备在成本函数中进行梯度下降。

你知道吗:就是这样。

嘿,等等…偏见!?

好的,我听到了。实际上它们遵循相同的模式。唯一的区别是最后一层和隐藏层表达式的导数链中的第一项将是:

…而不是

既然输入给神经元的是oʜwʟ***+b**那对 b的偏导数干脆就是 1。因此,在权重情况下,我们将链乘以上一层的输出,我们只需忽略偏差情况下的输出,然后乘以 1。*******

所有其他计算都是相同的。您可以将偏差视为权重计算的一个更简单的子案例。偏差的变化不依赖于前一个神经元的输出这一事实实际上是有道理的。这些偏置是“从侧面”添加的,而不考虑通过导线到达神经元的数据。

一个例子

从我最近陷入反向传播的境地来看,我可以想象上面的阅读可能是很难消化的。不要麻痹大意。在实践中,这是非常简单的,如果用一个例子来说明,可能所有的事情都会变得更清楚、更容易理解。

让我们以第 1 部分:基础中的例子为基础:

让我们从 w ₅:开始

通过从第 1 部分的中的正向传递中选取数据,并使用上述成本计算示例中的数据,我们将逐个因素进行计算。此外,让我们假设在本例中,我们的学习率为 η = 0.1。

同样,我们可以计算最后一层中的所有其他参数:

******现在我们向后移动一层,聚焦于 w 😗*****

再一次,通过从第 1 部分的中的前向通道中选取数据,并通过使用来自上面的数据,可以直接计算出每个因素。

根据最后一层的计算:

******现在我们拥有了一切,终于可以找到 w 😗*****

以同样的方式,我们可以计算隐藏层中的所有其他参数:

就是这样。我们已经成功地更新了全网的权重和偏差!

健全性检查

让我们验证一下,网络现在在输入端的表现稍好一些

x = [2,3]

第一次我们通过网络输入向量,我们得到了输出

y = [0.712257432295742,0.533358751]

…成本为 0.1988811957 美元。

现在,在我们更新了权重之后,我们得到了输出

y =[0.719269360605]54666

…并且成本为 0.18118540884。19861.886868686867

请注意,这两个组件都已向我们预期的[1,0.2]方向略微移动,网络的总成本现在更低了。

反复训练会更好!

下一篇文章将展示这在 java 代码中的表现。当您觉得准备好了,请开始:第 3 部分:用 Java 实现。

欢迎反馈!

原载于 2018 年 12 月 4 日machine learning . tobiashill . se**

第 3 部分:Java 实现

原文:https://towardsdatascience.com/part-3-implementation-in-java-7bd305faad0?source=collection_archive---------15-----------------------

在本文中,您将看到如何用易于理解的 java 代码实现前两篇文章中介绍的理论。完整的神经网络实现可以下载、详细检查、构建和实验。

这是系列文章的第三部分:

  • 第一部分:基础。
  • 第二部分:梯度下降和反向传播。
  • 第 3 部分:用 Java 实现。
  • 第四部分:更好、更快、更强。
  • 第 5 部分:训练网络阅读手写数字。
  • 额外 1:我如何通过数据扩充提高 1%的准确度。
  • 号外 2:MNIST 游乐场。

我假设您已经阅读了前两篇文章,并且对神经网络的前向传递和学习/训练传递有了相当好的理解。

这篇文章会很不一样。它将用几段 java 代码来展示和描述这一切。

我所有的代码,一个完全工作的神经网络实现,可以在这里找到、检查和下载。

追求

通常在编写软件时,我会使用大量的开源软件。这样我能更快地得到好的结果,并且我能使用别人花了很多心思的好的抽象概念。

然而这一次不同了。我的目标是展示一个神经网络是如何工作的,并且只需要你了解其他开源库。如果你设法阅读 Java 8 代码,你应该没问题。这些都在几个简短而整洁的文件里。

这个野心的结果是我甚至没有导入线性代数的库。相反,创建了两个简单的类,只包含所需的操作——满足通常的猜想:Vec 和 Matrix 类。这两个都是非常普通的实现,包含典型的算术运算加、减、乘和点积。

向量和矩阵的好处在于,它们通常可以用来使代码更有表现力、更整洁。通常,当您面临对一个集合中的每个元素与另一个集合中的每个其他元素进行运算时,例如对一组输入进行加权求和,您很有可能可以将数据排列成向量和/或矩阵,并获得非常紧凑且富有表现力的代码。神经网络也不例外。

我也尽可能地通过使用 Vec 和 Matrix 类型的对象来压缩计算。结果是整洁的,离数学表达式不远。for-loops 中没有 for-loops 模糊了俯视图。然而,在检查代码时,我鼓励你确保对 Vec 或 Matrix 类型对象的任何看起来简洁的调用实际上都产生了一系列算术运算,这些运算在第 1 部分和第 2 部分中有定义。

Vec 类上的两个操作不像我上面提到的典型操作那样常见。这些是:

  • 外积 (Vec.outerProduct()),它是列向量和行向量的逐元素乘法,产生一个矩阵。
  • Hadamard 乘积 (Vec.elementProduct()),它只是两个向量(都是列向量或行向量)的逐元素乘法,产生一个新向量。

概观

典型的神经网络有许多层。每个可以是任意大小,包含前一层与其自身之间的权重以及偏差。每一层还配置了一个激活和一个优化器(后面会详细介绍)。

无论何时设计高度可配置的东西,构建器模式都是一个好的选择。这为我们提供了一种非常简单易懂的方法来定义和创建神经网络:

要使用这样一个网络,通常要么给它提供一个输入向量,要么在调用evaluate()-方法时添加一个预期结果。当进行后者时,网络将观察实际输出和预期输出之间的差异,并存储这一印象。换句话说,它将反向传播错误。出于很好的原因(我将在下一篇文章中回到这一点),网络不会立即更新它的权重和偏差。要做到这一点,也就是让任何印象“深入人心”,必须调用updatefromleang()。例如:

正向输送

让我们深入研究一下 evaluate() 方法中的前馈通道。请注意下面(第 9 行和第 10 行)输入数据是逐层传递的:

在层内,输入向量与权重相乘,然后加上偏差。这又被用作激活功能的输入。见第 11 行。该层还存储输出向量,因为它用于反向传播。

(我将在下一篇文章中回到 out 变量上的 get 和 set 操作的原因。现在就把它看作是 Vec 类型的变量)

激活功能

该代码包含一些预定义的激活函数。其中每一个都包含实际的激活函数, σ ,以及导数,σ’

成本函数

还包括一些成本函数。二次曲线看起来像这样:

成本函数有一种计算总成本(作为标量)的方法,但也有一种重要的成本函数微分法,可用于

反向传播

正如我在前面关于前馈传递的部分中提到的:如果一个预期的结果被传递给 evaluate 函数,网络将通过调用 learnFrom() -method 从中学习。请参见第 12–13 行。

在该方法中,实际的反向传播发生了。在这里,你应该能够在代码中详细地遵循第 2 部分的步骤。看到第二部分中相当冗长的数学表达式可以归结为以下内容,这也多少令人欣慰:

请注意,反向传播中的学习(偏导数)是通过调用adddeltaweightsandbias()-方法逐层存储的。

直到调用update from learning()-方法后,权重和偏差才会改变:

之所以将此设计为两个独立的步骤,是因为它允许网络观察大量样本并从中学习……然后最终更新权重和偏差,作为所有观察的平均值。这实际上叫做批量梯度下降小型批量梯度下降。我们将在下一篇文章中回到这些变体。现在,您也可以在每次调用后调用 updateFromLearning 来评估(带着期望)以使网络在每次采样后得到改进。在每个样本之后更新网络,这被称为随机梯度下降

这就是updateWeightsAndBias()-方法的样子。请注意,权重和偏差的所有计算更改的平均值被提供给优化器对象上的两个方法 updateWeights()updateBias()

我们还没有真正讨论过优化器的概念。我们已经说过,权重和偏差是通过减去用一些小的学习率缩放的偏导数来更新的,即:

是的,这是一个很好的方法,也很容易理解。然而,还有其他方法。其中一些稍微复杂一些,但是提供了更快的收敛。关于如何更新权重和偏差的不同策略通常被称为优化器。我们将在下一篇文章中看到另一种方法。因此,将此作为网络可以配置使用的可插拔策略是合理的。

现在,我们只是使用简单的梯度下降策略来更新我们的权重和偏差:

差不多就是这样。通过几行代码,我们有可能配置一个神经网络,通过它输入数据,并让它学习如何对看不见的数据进行分类。这将在第 5 部分:训练网络读取手写数字中显示。

但首先,让我们把这个提升几个档次。第四部分:更好、更快、更强再见。

欢迎反馈!

原载于 2018 年 12 月 15 日machine learning . tobiashill . se

第 4 部分:更好、更快、更强

原文:https://towardsdatascience.com/part-4-better-faster-stronger-dd6ded07b74f?source=collection_archive---------20-----------------------

在本文中,我们将建立在第 3 部分中介绍的基本神经网络基础上。我们将添加一些宝石,这将改善网络。影响巨大的小变化。我们将遇到的概念,如初始化小批量并行化优化器正则化无疑是您在学习神经网络时会很快遇到的东西。本文将对进行实例讲解

这是系列文章的第四部分:

  • 第一部分:基础。
  • 第二部分:梯度下降反传。
  • 第 3 部分:Java 实现。
  • 第四部分:更好、更快、更强。
  • 第五部分:训练网络阅读手写数字。
  • 额外 1:我如何通过数据扩充获得 1%的更高准确率。
  • 额外 2:MNIST 游乐场。

初始化

到目前为止,我们已经看到了如何通过反向传播自动调整权重偏差,以改善网络。那么,这些参数的良好初始值是什么呢?

一般来说,您只需将-0.5 和 0.5 之间的参数随机化,取平均值 0,就可以了。

然而,在深层网络中,研究表明如果让权值与连通层(或有时两个连通层中的神经元数量成反比,则可以获得更好的收敛性。换句话说:许多神经元的初始权重接近 0。神经元越少越好。您可以在这里和这里更多地了解为什么。

我已经实现了几个比较流行的方法,并且在创建神经网络时可以将它作为一种策略注入(见第 5 行):

实现的初始化策略有:XavierNormal、XavierUniform、LeCunNormal、LeCunUniform、HeNormal、HeUniform 和 Random。还可以通过在创建图层时提供权重矩阵来明确指定图层的权重。

定量

在的上一篇文章中,我们确实简要地提到了这样一个事实,即只要我们愿意,我们就可以通过网络输入样本,然后根据我们自己的判断,选择来更新权重*。在 api 中,evaluate()-方法(收集学习/印象)和updateFromLearning()**-方法(让学习深入其中)之间的分离正是为了实现这一点。它让 API 的用户决定使用以下哪种策略:*

随机梯度下降

在随机梯度下降中,我们在每次评估后更新权重和偏差。记住第二部分中的成本函数依赖于输入和期望:C = C(W,b,Sσ,x,exp)。因此,每个样本的成本情况会略有不同,负梯度将指向每个样本独特情况下的最陡下降方向。

现在,让我们假设我们有总成本景观,这将是整个数据集的平均成本函数。所有样本。在这种情况下,随机梯度下降看起来就像一次混沌漫步。

只要学习率合理地小,该行走平均来说仍然会下降到局部最小值。

问题是 SGD 很难高效地并行化。权重的每次更新都必须是下一次计算的一部分。

批量梯度下降

与随机梯度下降相反的是批量梯度下降(有时简称为梯度下降)。在该策略中,在对权重进行更新之前,评估所有训练数据。计算所有样品的平均梯度。当仔细计算小的下降步骤时,这将收敛到局部最小值。缺点是对于大型数据集,反馈循环可能会很长。

小批量梯度下降

小批量梯度下降是 SGD 和 BGD 之间的一种折衷方案——在更新权重之前,通过网络运行 N 个样本的批次。典型地,N 在 16 到 256 之间。通过这种方式,我们得到了在其下降过程中相当稳定的东西(尽管不是最佳的):

  • 与批处理梯度下降相比,我们获得了更快的反馈,并且可以在可管理的数据集上运行。
  • 与随机梯度下降相比,我们可以使用 CPU、GPU 或 TPU 上的所有内核并行运行整个批处理。两个世界中最好的。

并行

*只需对代码库做一些小的改动,就可以并行执行**评估()*方法。一如既往……国家是并行化的敌人。在前馈阶段,唯一需要小心处理的状态是每个神经元的输出值被存储在每个神经元中。竞争线程肯定会在数据被用于反向传播之前覆盖这些数据。

通过使用螺纹限制,这是可以处理的。

此外,权重和偏差的增量累积并最终应用的部分必须同步。

有了这些,在处理训练数据时,可以根据需要(或可用)使用任意数量的内核。

在神经网络上并行化小批量执行的典型方法如下所示:

特别注意将批次中所有样本的处理扩展为第 2 行平行流的结构。

这就是全部需要。

最棒的是:加速非常显著。

这里需要记住的一点是,以这种方式分散执行(在几个并行线程上运行一个批处理)会给计算增加熵,这有时是不希望的。举例说明:当误差增量在 add deltaweights 和 bias 方法中相加时,每次运行时它们可能会以稍微不同的顺序相加。虽然该批中的所有影响术语都是相同的,但是它们被相加的改变顺序可能会产生很小的差异*,随着时间的推移,在大型神经网络中,这些差异开始显现,导致不可再现运行。在这种操场神经网络实现中,这可能很好……但是如果你想做研究,你必须用不同的方式来处理并行性(通常是制作输入批处理的大矩阵,并在 GPU/TPU 上并行所有前馈和反向传播的矩阵乘法)。*

优化器

在最后一篇文章中,我们谈到了这样一个事实,即我们将权重和偏差的实际更新作为一种策略来实现。原因是,除了基本的梯度下降,还有其他方法。

记住,这一点:

在代码中看起来像:

尽管努力下坡,SGD(及其分批变型)受到以下事实的影响:梯度的大小与评估点的坡度成比例。更平坦的表面意味着更短的梯度长度…给出更小的步长。因此,它可能会卡在鞍点上,例如在这条路径的中途:

(正如你所看到的,在几个方向上有比困在那个鞍点更好的局部最小值)

更好地处理这种情况的一种方法是让权重的更新不仅取决于计算的梯度,还取决于上一步中计算的梯度。有点像从之前的计算中合并回声。**

一个物理类比是想象一个质量为 T3 的弹球滚下山坡。这样的弹球可能有足够的动量来保持足够的速度,以覆盖更平坦的部分,甚至爬上小山丘——这样可以逃离鞍点,继续朝着更好的局部最小值前进。**

毫不奇怪,最简单的优化器之一叫做…

动力

在动量项中,我们引入了另一个常数来告诉我们从前面的计算中需要多少回声。这个系数γ叫做动量。上面的等式 1 现在变成:

如你所见,动量优化器将最后一个增量保持为 v ,并基于前一个计算新的 v 。通常情况下, γ 可能在 0.7–0.9 的范围内,这意味着 70% — 90%的先前梯度计算对新计算有贡献。

在代码中,它被配置为(第 4 行):

并像这样应用于动量优化器:

我们如何更新权重的这个小变化通常会提高收敛性。

我们可以做得更好。另一个简单而强大的优化器是内斯特罗夫加速梯度(NAG)。

内斯特罗夫加速梯度

与动量唯一不同的是,在 NAG 中,我们在一个位置计算成本,这个位置已经结合了上次梯度计算的回波。

从编程的角度来看,这是个坏消息。到目前为止,优化器的一个很好的特性是,它们只在权重更新时应用。在这里,当计算成本函数时,我们突然需要合并已经存在的最后一个梯度 v当然,我们可以扩展优化器的概念,并允许它增加权重查找*。这并不一致,因为所有其他优化器(据我所知)只关注更新。*

通过一个小技巧,我们可以解决这个问题。通过引入另一个变量x****=Wv我们可以用 x 来重写方程。具体来说,这种引入意味着有问题的成本函数将只依赖于 x ,而不依赖于历史-值(至少不明确依赖于*)。v部分实际上仍将被使用,但现在隐含地存储在所有权重上)。*

重写之后,我们可以将 x重新命名为,让它看起来更像我们认识的东西。等式变为:**

好多了。现在,内斯特罗夫优化器只能在更新时应用:

要阅读更多关于 NAG 如何以及为什么通常比 Momentum 更有效的信息,请查看这里的和这里的和。

当然,也有很多其他奇特的优化器可以实现。其中一些通常比 NAG 性能更好,但代价是增加了复杂性。就改进每行代码的收敛性而言 NAG 击中了一个甜蜜点。**

正规化

当我刚刚写完神经网络代码的第一个版本时,我渴望测试它。我迅速下载了 MNIST 的数据集并开始玩。几乎是立刻,我就在准确性方面达到了相当惊人的数字。与其他人在等效网络设计上达成的结果相比,我的更好——好得多。这当然让我起了疑心。

然后我突然想到。我比较了我在训练数据集上的统计数据和他们在测试数据集上的统计数据。我已经在训练数据上无限循环地训练了我的网络,甚至从未加载过测试数据集。当我看到的时候,我大吃一惊。我的网络在看不见的数据上完全是垃圾,即使它在训练数据集上接近半神。我刚刚吞下了过度拟合的苦果。

过度拟合

当你过于积极地训练你的网络时,你可能最终会处于这样一种情况:你的网络已经学会了(几乎记住了)训练数据,但作为一个副作用,它也失去了训练数据所代表的大致内容。这可以通过在网络训练期间,在训练数据测试数据上绘制网络准确度来看出。通常,您会注意到训练数据的精确度继续增加,而测试数据的精确度最初增加,之后变得平稳,然后再次开始下降。

这是你走得太远的时候。

这里的一个观察是,我们需要能够检测到这种情况何时发生,并在那时停止训练。这通常被称为提前停止,我将在本系列的最后一篇文章第 5 部分:训练网络读取手写数字中再次提到。

但是也有一些其他的方法来降低过度拟合的风险。我将通过展示一个简单但强大的方法来结束这篇文章。

L2 正则化

在 L2 正则化中,我们试图避免网络中的个体权重变得太大(或者更精确地说:离零太远)。我们的想法是,与其让几个权重对输出产生很大的影响,不如让许多权重相互作用,每个人都做出适度的贡献。基于第 1 部分:基础中的讨论,几个更小的权重(相比更少更大的)将给出输入数据的更平滑和不太尖锐/多峰的分离似乎并不太牵强。此外,似乎合理的是,更平滑的分离将保留输入数据的一般特征,相反:尖锐和多峰的同上将能够非常精确地去除输入数据的特定特征。**

那么我们如何避免网络中的个体权重变得太大呢?

在 L2 正则化中,这是通过向成本函数添加另一个成本项来实现的:

如您所见,大重量会导致更高的成本,因为它们是额外成本总和的平方。更小的重量根本没什么关系。

λ因子将告诉我们需要多少 L2 正则化。将其设置为零将完全消除 L2 效应。将其设置为 0.5,将使 L2 正则化成为网络总成本的重要部分。实际上,在给定网络布局和数据的情况下,您必须找到最佳的λ。

非常坦率地说,我们不太关心作为特定标量值的成本。我们更感兴趣的是当我们通过梯度下降训练网络时会发生什么。让我们看看这个新成本函数对于特定权重 k 的梯度计算会发生什么。

正如你所看到的,我们在每次更新中只得到一个额外的术语 λwk 来减去权重 wk

在代码中,L2 正则化可以配置为(参见第 9 行):

并以这种方式在更新时应用(参见第 3 行和第 4 行):

这种微小的变化使得神经网络实现在过拟合时更容易控制。

所以,这篇文章到此结束。在理论和实践中,已经出现了几颗小宝石……所有这些,只需要几行代码,就能使神经网络更好、更快、更强。

下一篇文章将是本系列的最后一篇,我们将看到网络在经典数据集上的表现——Mnist:第 5 部分:训练网络阅读手写数字。

欢迎反馈!

原载于 2018 年 12 月 17 日machine learning . tobiashill . se

第 5 部分:训练网络阅读手写数字

原文:https://towardsdatascience.com/part-5-training-the-network-to-read-handwritten-digits-c2288f1a2de3?source=collection_archive---------12-----------------------

在这最后一篇文章中,我们将看到这种神经网络实现的能力。我们将向它投掷一个最常见的数据集(MNIST),看看我们是否可以训练一个神经网络来识别手写数字。

这是系列文章的第五部分,也是最后一部分:

  • 第一部分:基础。
  • 第二部分:梯度下降和反向传播。
  • 第 3 部分:用 Java 实现。
  • 第四部分:更好、更快、更强。
  • 第 5 部分:训练网络阅读手写数字。
  • 额外 1:我如何通过数据扩充提高 1%的准确度。
  • 号外 2:MNIST 游乐场。

MNIST 数据集

MNIST 数据库包含手写数字,并具有 60.000 个样本的训练集和 10.000 个样本的测试集。数字在 28×28 像素的固定大小的图像中居中。

这个数据集对于任何只想探索他们的机器学习实现的人来说都是超级方便的。它只需要很少的预处理和格式化工作。

密码

这个小实验的所有代码都可以在这里找到。这个项目当然也依赖于神经网络实现。

用 java 读取数据集很简单。数据格式在 MNIST 页面中有描述。

称为 DigitData 的类中的每个数字。这个类当然包含数据(即输入)和标签(即期望)。我还添加了一个小技巧来增强 digital data 类的 toString():

调用 toString()实际上给出了数据的 ascii 阴影输出:

这在检查网络将哪些数字与其他数字混淆时非常方便。我们将在本文的最后回到这个问题。

网络安装程序

边界层由我们的数据给出:

  • 输入层将图像的每个像素作为输入,大小必须为 28 x 28 = 784。
  • 输出图层是一个分类。介于 0 和 9 之间的数字,即大小为 10。

隐藏层需要更多的探索和测试。我尝试了一些不同的网络布局,意识到用一个巨大的网络获得好的精确度并不难。因此,我决定减少隐藏神经元的数量,看看是否还能得到不错的结果。我认为,一个受约束的设置将教会我们更多如何获得额外百分比的准确性。我决定将最大隐藏神经元设置为 50,并开始探索我能达到的。

我很早就用一个只有两个隐藏层的漏斗状结构取得了很好的效果,并一直在探索。例如第一个有 36 个神经元,第二个有 14 个神经元。

784 个输入 36 个隐藏 14 个隐藏 10 个输出神经元

经过反复试验,我决定使用两个激活函数,这两个函数在本系列的前几篇文章中没有出现过。漏热路软最大

漏 ReLU 是 ReLU 的变种。唯一的区别是,对于负输入,它不是完全平坦的。相反,它有一个小的正梯度。

它们最初被设计用来解决 ReLU 的零梯度部分可能会关闭神经元的问题。也可以在 Quora 上看到这个问题,了解何时以及为什么你想测试 Leaky ReLU 而不是 ReLU 的细节。

Softmax 是一个激活函数,通常在分类时用于输出层。softmax 的好处在于它为您提供了分类概率分布— 它将告诉您输出图层中每个类的概率。假设我们通过网络发送代表数字 7 的数字数据,它可能会输出如下内容:

如你所见,数字 7 的概率最高。还要注意,概率总和为 1。

当然,Softmax 也可以与阈值一起使用,这样,如果没有一个类别获得高于该阈值的概率,我们就可以说网络没有识别出输入数据中的任何内容。

Softmax 不好的地方在于它不像其他激活函数那么简单。在正向和反向传播过程中,它变得有点难看。它实际上打破了我的激活抽象,在 softmax 的引入之前,我只能将激活定义为向前传递的函数本身 fn()和向后传播的函数的导数步骤 dFn()。

Softmax 这样做的原因是,它的 dFn() ( o/∂i )可以利用链式法则的最后一个因子,【c/∂o*,*使计算更清晰/容易。因此,必须扩展激活抽象来处理计算 ∂C/∂i 乘积。

在所有其他激活功能中,这只是一个乘法:

但是在 softmax 中是这样的(见下面的 dCdI()-function):

点击阅读更多关于 Softmax 的信息,点击阅读如何计算 Softmax 的导数。

总而言之,我的设置通常是:

准备就绪后,让我们开始训练吧!

训练循环

训练循环很简单。

  • 我在每个时期之前混洗训练数据(一个时期是我们称之为的所有可用训练数据的完整训练回合,在我们的例子中是 60.000 个数字)并且通过网络馈送它,其中训练标志被设置为真。
  • 在每第 5 个时期之后,我也通过网络运行测试数据并记录结果,但是在这样做的同时不训练网络。

代码如下所示:

整个数据集的运行是成批并行完成的(正如上一篇文章中已经展示的那样):

上述循环中唯一缺少的部分是知道何时停止…

提前停止

如前所述(当引入 L2 正则化时),我们真的想避免过度拟合网络。当这种情况发生时,训练数据的准确性可能仍然会提高,而测试数据的准确性开始下降。我们用 StopEvaluator 对其进行跟踪。这个实用程序类保存了测试数据的错误率的移动平均值,以检测错误率何时确实开始下降。它还存储了网络如何看待最佳测试运行(试图找到这个测试运行的峰值)。

代码如下所示:

结果

使用如上所示的网络布局(50 个隐藏神经元,内斯特罗夫和 L2 配置:如上所述),我一直将网络训练到大约 2.5% 的错误率。

记录运行的错误率只有 2.24%,但我不认为这是相关的,除非我的大部分运行都在这个比率左右。原因是:来回调整超参数,试图让在测试数据上打破记录(虽然很有趣)也可能意味着我们让过度适应测试数据。换句话说:我可能发现了一个幸运的参数组合,它碰巧表现得非常好,但在看不见的数据上仍然不是那么好。

混乱

因此,让我们来看看网络通常会混淆的几个数字:

这些只是几个例子。其他几种边界情况也是可用的。网络发现很难对这些进行分类,这是有道理的,原因可以追溯到我们在本系列第一部分的结尾部分中讨论的内容:784D 空间中的一些点距离它们的数字组太远,可能更接近其他一些点/数字组。或者用自然语言来说:它们看起来更像其他数字,而不是它们应该代表的数字。

这并不是说我们不关心这些棘手的案件。恰恰相反。这个世界是一个真正模糊的地方,机器学习需要能够处理模糊性和细微差别。你知道,要少一点机器味(“肯定”),多一点人性(“没问题”)。但我认为这表明解决方案并不总是在手边的数据中。通常情况下,上下文给出了人类正确分类(或理解)某事物所需的线索……比如一个写得很糟糕的数字。但这是另一个大而有趣的话题,不在本文的介绍范围之内。

包裹

这是本系列的第五部分,也是最后一部分。写这篇文章的时候我学到了很多,我希望你通过阅读它也能学到一些东西。

欢迎反馈!

进一步阅读的好资源

这些是我发现比大多数其他人更好的资源。如果你想有更深一层的了解,请深入研究:

  • 神经网络上的 3 蓝 1 棕精彩视频 (4 集)
  • 迈克尔·尼尔森精彩教程(几章)
  • 斯坦福课程 CS231n 。

原载于 2018 年 12 月 28 日machine learning . tobiashill . se

基于隐马尔可夫链模型的词性标注

原文:https://towardsdatascience.com/part-of-speech-tagging-with-hidden-markov-chain-models-e9fccc835c0e?source=collection_archive---------2-----------------------

Photo Credit: Pixabay

词性标注 (POS)是用名词、动词、形容词、副词等词性对句子进行标注的过程。

隐马尔可夫模型 (HMM)是一个简单的概念,可以解释大多数复杂的实时过程,如语音识别和语音生成、机器翻译、生物信息学的基因识别、计算机视觉的人类手势识别等等。

在本帖中,我们将使用石榴库为词性标注构建一个隐马尔可夫模型。我们不会深入统计词性标注器的细节。不过,如果你有兴趣,这里有纸。

数据是布朗文集的副本,可以在这里找到。

数据

导入库并读取数据。

import matplotlib.pyplot as plt
import numpy as npfrom IPython.core.display import HTML
from itertools import chain
from collections import Counter, defaultdict
from pomegranate import State, HiddenMarkovModel, DiscreteDistribution
import randomSentence = namedtuple("Sentence", "words tags")def read_data(filename):
    """Read tagged sentence data"""
    with open(filename, 'r') as f:
        sentence_lines = [l.split("\n") for l in f.read().split("\n\n")]
    return OrderedDict(((s[0], Sentence(*zip(*[l.strip().split("\t")
                        for l in s[1:]]))) for s in sentence_lines if s[0]))def read_tags(filename):
    """Read a list of word tag classes"""
    with open(filename, 'r') as f:
        tags = f.read().split("\n")
    return frozenset(tags)Sentence = namedtuple("Sentence", "words tags")def read_data(filename):
    """Read tagged sentence data"""
    with open(filename, 'r') as f:
        sentence_lines = [l.split("\n") for l in f.read().split("\n\n")]
    return OrderedDict(((s[0], Sentence(*zip(*[l.strip().split("\t")
                        for l in s[1:]]))) for s in sentence_lines if s[0]))def read_tags(filename):
    """Read a list of word tag classes"""
    with open(filename, 'r') as f:
        tags = f.read().split("\n")
    return frozenset(tags)class Subset(namedtuple("BaseSet", "sentences keys vocab X tagset Y N stream")):
    def __new__(cls, sentences, keys):
        word_sequences = tuple([sentences[k].words for k in keys])
        tag_sequences = tuple([sentences[k].tags for k in keys])
        wordset = frozenset(chain(*word_sequences))
        tagset = frozenset(chain(*tag_sequences))
        N = sum(1 for _ in chain(*(sentences[k].words for k in keys)))
        stream = tuple(zip(chain(*word_sequences), chain(*tag_sequences)))
        return super().__new__(cls, {k: sentences[k] for k in keys}, keys, wordset, word_sequences,
                               tagset, tag_sequences, N, stream.__iter__)def __len__(self):
        return len(self.sentences)def __iter__(self):
        return iter(self.sentences.items())class Dataset(namedtuple("_Dataset", "sentences keys vocab X tagset Y training_set testing_set N stream")):
    def __new__(cls, tagfile, datafile, train_test_split=0.8, seed=112890):
        tagset = read_tags(tagfile)
        sentences = read_data(datafile)
        keys = tuple(sentences.keys())
        wordset = frozenset(chain(*[s.words for s in sentences.values()]))
        word_sequences = tuple([sentences[k].words for k in keys])
        tag_sequences = tuple([sentences[k].tags for k in keys])
        N = sum(1 for _ in chain(*(s.words for s in sentences.values())))

        # split data into train/test sets
        _keys = list(keys)
        if seed is not None: random.seed(seed)
        random.shuffle(_keys)
        split = int(train_test_split * len(_keys))
        training_data = Subset(sentences, _keys[:split])
        testing_data = Subset(sentences, _keys[split:])
        stream = tuple(zip(chain(*word_sequences), chain(*tag_sequences)))
        return super().__new__(cls, dict(sentences), keys, wordset, word_sequences, tagset,
                               tag_sequences, training_data, testing_data, N, stream.__iter__)def __len__(self):
        return len(self.sentences)def __iter__(self):
        return iter(self.sentences.items())data = Dataset("tags-universal.txt", "brown-universal.txt", train_test_split=0.8)print("There are {} sentences in the corpus.".format(len(data)))
print("There are {} sentences in the training set.".format(len(data.training_set)))
print("There are {} sentences in the testing set.".format(len(data.testing_set)))

语料库中有 57340 个句子。

训练集中有 45872 个句子。

测试集中有 11468 个句子。

看一眼数据。句子

key = 'b100-38532'
print("Sentence: {}".format(key))
print("words:\n\t{!s}".format(data.sentences[key].words))
print("tags:\n\t{!s}".format(data.sentences[key].tags))

句子:b100–38532

词语:

(‘也许’,‘它’,‘曾经’,‘对’,‘对’,’, ';')

标签:

(‘ADV’,‘PRON’,‘动词’,‘ADJ’,’, '.')

统计语料库中的独特元素。

print("There are a total of {} samples of {} unique words in the corpus."
      .format(data.N, len(data.vocab)))
print("There are {} samples of {} unique words in the training set."
      .format(data.training_set.N, len(data.training_set.vocab)))
print("There are {} samples of {} unique words in the testing set."
      .format(data.testing_set.N, len(data.testing_set.vocab)))
print("There are {} words in the test set that are missing in the training set."
      .format(len(data.testing_set.vocab - data.training_set.vocab)))

语料库中共有 1161192 个样本 56057 个独特词。

训练集中有 50536 个唯一词的 928458 个样本。

测试集中有 25112 个唯一词的 232734 个样本。

测试集中有 5521 个词是训练集中缺失的。

使用数据集访问单词。x 和带有数据集的标签。Y

for i in range(2):    
    print("Sentence {}:".format(i + 1), data.X[i])
    print()
    print("Labels {}:".format(i + 1), data.Y[i])
    print()

句子 1:('先生','波德格','曾','谢过','他','庄重地','和','现在','他','造了','用了','的','了','建议','。')

标签 1:('名词','名词','动词','动词',' PRON ','等)、'康吉'、' ADV '、' PRON '、'动词'、'名词'、' ADP '、' DET '、'名词'、'等)

第二句:('但是','那里','似乎','要','成为','一些','不同','的','意见','作为','要','如何','远','板','应该','去',','和','谁的','建议','它','应该','跟随',')

标签 2: ('CONJ ',' PRT ','动词',' PRT ','动词',' DET ','名词',' ADP ',' ADP ',' ADV ',' ADV ',' DET ','名词','动词','动词','、' CONJ '、' DET '、'名词'、' PRON '、'动词'、'动词'、')

了解 data.stream()的工作原理。

print("\nStream (word, tag) pairs:\n")
for i, pair in enumerate(data.stream()):
    print("\t", pair)
    if i > 3: break

流(词、标记)对:(“先生”、“名词”)

(‘波德格’,‘名词’)

(‘曾’,‘动词’)

(‘谢’,‘动词’)

(‘他’,‘PRON’)

构建一个最频繁的类标记器(MFC)

对计数

def pair_counts(tags, words):
    d = defaultdict(lambda: defaultdict(int))
    for tag, word in zip(tags, words):
        d[tag][word] += 1

    return d
tags = [tag for i, (word, tag) in enumerate(data.training_set.stream())]
words = [word for i, (word, tag) in enumerate(data.training_set.stream())]

MFC 标记器

FakeState = namedtuple('FakeState', 'name')class MFCTagger:
    missing = FakeState(name = '<MISSING>')

    def __init__(self, table):
        self.table = defaultdict(lambda: MFCTagger.missing)
        self.table.update({word: FakeState(name=tag) for word, tag in table.items()})

    def viterbi(self, seq):
        """This method simplifies predictions by matching the Pomegranate viterbi() interface"""
        return 0., list(enumerate(["<start>"] + [self.table[w] for w in seq] + ["<end>"]))

tags = [tag for i, (word, tag) in enumerate(data.training_set.stream())]
words = [word for i, (word, tag) in enumerate(data.training_set.stream())]word_counts = pair_counts(words, tags)
mfc_table = dict((word, max(tags.keys(), key=lambda key: tags[key])) for word, tags in word_counts.items())mfc_model = MFCTagger(mfc_table)

用模型做预测。

def replace_unknown(sequence):

    return [w if w in data.training_set.vocab else 'nan' for w in sequence]def simplify_decoding(X, model):

    _, state_path = model.viterbi(replace_unknown(X))
    return [state[1].name for state in state_path[1:-1]]

MFC Tagger 解码序列示例

for key in data.testing_set.keys[:2]:
    print("Sentence Key: {}\n".format(key))
    print("Predicted labels:\n-----------------")
    print(simplify_decoding(data.sentences[key].words, mfc_model))
    print()
    print("Actual labels:\n--------------")
    print(data.sentences[key].tags)
    print("\n")

Figure 1

看起来不错。

评估模型准确性。

def accuracy(X, Y, model):

    correct = total_predictions = 0
    for observations, actual_tags in zip(X, Y):

        # The model.viterbi call in simplify_decoding will return None if the HMM
        # raises an error (for example, if a test sentence contains a word that
        # is out of vocabulary for the training set). Any exception counts the
        # full sentence as an error (which makes this a conservative estimate).
        try:
            most_likely_tags = simplify_decoding(observations, model)
            correct += sum(p == t for p, t in zip(most_likely_tags, actual_tags))
        except:
            pass
        total_predictions += len(observations)
    return correct / total_predictions

评估 MFC 标记的准确性。

mfc_training_acc = accuracy(data.training_set.X, data.training_set.Y, mfc_model)
print("training accuracy mfc_model: {:.2f}%".format(100 * mfc_training_acc))mfc_testing_acc = accuracy(data.testing_set.X, data.testing_set.Y, mfc_model)
print("testing accuracy mfc_model: {:.2f}%".format(100 * mfc_testing_acc))

训练准确率 mfc_model: 95.72%

测试准确率 mfc_model: 93.01%

很好,让我们看看我们是否能做得更好!

构建一个隐马尔可夫模型(HMM)标记器

def unigram_counts(sequences):return Counter(sequences)tags = [tag for i, (word, tag) in enumerate(data.training_set.stream())]
tag_unigrams = unigram_counts(tags)

二元组计数

def bigram_counts(sequences):d = Counter(sequences)
    return dtags = [tag for i, (word, tag) in enumerate(data.stream())]
o = [(tags[i],tags[i+1]) for i in range(0,len(tags)-2,2)]
tag_bigrams = bigram_counts(o)

序列开始计数

def starting_counts(sequences):

    d = Counter(sequences)
    return dtags = [tag for i, (word, tag) in enumerate(data.stream())]
starts_tag = [i[0] for i in data.Y]
tag_starts = starting_counts(starts_tag)

序列结束计数。

def ending_counts(sequences):

    d = Counter(sequences)
    return dend_tag = [i[len(i)-1] for i in data.Y]
tag_ends = ending_counts(end_tag)

嗯 Tagger

basic_model = HiddenMarkovModel(name="base-hmm-tagger")tags = [tag for i, (word, tag) in enumerate(data.stream())]
words = [word for i, (word, tag) in enumerate(data.stream())]tags_count=unigram_counts(tags)
tag_words_count=pair_counts(tags,words)starting_tag_list=[i[0] for i in data.Y]
ending_tag_list=[i[-1] for i in data.Y]starting_tag_count=starting_counts(starting_tag_list)#the number of times a tag occured at the start
ending_tag_count=ending_counts(ending_tag_list)      #the number of times a tag occured at the endto_pass_states = []
for tag, words_dict in tag_words_count.items():
    total = float(sum(words_dict.values()))
    distribution = {word: count/total for word, count in words_dict.items()}
    tag_emissions = DiscreteDistribution(distribution)
    tag_state = State(tag_emissions, name=tag)
    to_pass_states.append(tag_state)basic_model.add_states()start_prob={}for tag in tags:
    start_prob[tag]=starting_tag_count[tag]/tags_count[tag]for tag_state in to_pass_states :
    basic_model.add_transition(basic_model.start,tag_state,start_prob[tag_state.name])end_prob={}for tag in tags:
    end_prob[tag]=ending_tag_count[tag]/tags_count[tag]
for tag_state in to_pass_states :
    basic_model.add_transition(tag_state,basic_model.end,end_prob[tag_state.name])transition_prob_pair={}for key in tag_bigrams.keys():
    transition_prob_pair[key]=tag_bigrams.get(key)/tags_count[key[0]]
for tag_state in to_pass_states :
    for next_tag_state in to_pass_states :
        basic_model.add_transition(tag_state,next_tag_state,transition_prob_pair[(tag_state.name,next_tag_state.name)])basic_model.bake()

HMM 标记的解码序列示例。

for key in data.testing_set.keys[:2]:
    print("Sentence Key: {}\n".format(key))
    print("Predicted labels:\n-----------------")
    print(simplify_decoding(data.sentences[key].words, basic_model))
    print()
    print("Actual labels:\n--------------")
    print(data.sentences[key].tags)
    print("\n")

Figure 2

评估 HMM 标记器的准确性。

hmm_training_acc = accuracy(data.training_set.X, data.training_set.Y, basic_model)
print("training accuracy basic hmm model: {:.2f}%".format(100 * hmm_training_acc))hmm_testing_acc = accuracy(data.testing_set.X, data.testing_set.Y, basic_model)
print("testing accuracy basic hmm model: {:.2f}%".format(100 * hmm_testing_acc))

训练准确率基本 hmm 模型:97.49%

测试准确率基本 hmm 模型:96.09%

我们的 HMM 标记确实改善了结果,

现在我们已经完成了模型的构建。源代码可以在 Github 上找到。我期待听到反馈或问题。

你的部分工作正在自动化。为什么这是一件好事。

原文:https://towardsdatascience.com/part-of-your-job-is-being-automated-and-why-thats-a-good-thing-32238443c511?source=collection_archive---------11-----------------------

关于在线会计软件生态系统的一些知识。

我和我的团队开始进入在线会计生态系统已经一年了。自从我们开始建立公司以来,我一直在反思我们的主要观察和学习。如果我不分享一些关于技术进步的想法,我会给我们的簿记员和会计(B/A)合伙人造成伤害。

技术每天都在继续扰乱个人和职业生活。许多职业被迫重新构想他们的商业模式,或者最终变得过时。对于会计和金融行业的数百万专业人士来说,不幸的是,这些变化正在到来,而且比你想象的要快。

事情正在发生变化,而且速度很快

我们所知道的是,尽管有一些炒作和许多“人工智能垃圾”,但许多进步都比想象的要远。技术绝对是工作的某些方面的自动化,但它也将帮助 B/A 的发展和开拓新的领域——在更短的时间内,从任何地方提供比现在更高的客户价值。接下来是。

报税自动化

纳税申报自动化在不久的将来将会普及。当我提到纳税申报表时,我指的是占大多数的“简单”纳税申报表。帮助报税的数字系统已经存在了相当长的一段时间,这意味着有大量的历史数据可用于使用机器学习技术训练模型。如果你需要简单解释什么是 AI,请阅读(AI——从育儿角度的解释)。

假设处理这些数据的数据科学家是一流的,当这些系统连接到保存当前纳税年度数据的关键财务系统时,应该能够提供高质量的自动化结果。

复杂的纳税申报无论是涉及复杂的公司结构还是外国资产,都需要真正的专业人士的规划和专业知识。所以,如果有人向你推销一个自动化这种复杂性的系统,在可预见的未来,要非常怀疑。有一堆炒作,所以企业主不应该太快放弃真正的专业帮助。

交易分类

对于那些简单地将账户名称应用于通过数字手段很好地流入会计软件的交易的人来说,这一领域可能是对在线 B/A 生态系统的最大破坏。

我之所以说事务分类即将到来,是因为它不是一个难以解决的机器学习问题。Intuit、Xero、Sage 等拥有系统上所有用户的大量交易数据,这使他们能够训练模型,将交易分类到特定于用户会计科目表的账户中,所有这些都是自动进行的。

一个简单的例子是航班的费用交易。一个模型将能够看到像加拿大航空公司或西捷航空公司这样的航班供应商这样的参数,并知道这将是在 T2 旅行类型账户费用的某个地方。请注意,除了供应商名称之外,还有其他参数也可以用于分类,例如地点银行交易 id金额、日期等。只知道后台有很多数据可以帮助训练好的模型的准确性。

当然,并不是每个企业都使用完全相同的账户名称,或者以相同的方式对某项交易进行编码。一家企业可能将所有航班编码为飞往普通差旅的航班,而另一家企业可能编码为飞往普通差旅会议的航班,这取决于飞行费用的用途。这些看似复杂的场景,但在机器学习的世界中却很简单。

Using Machine Learning to build a simple classification model (http://briandolhansky.com/)

你看,模型会根据 B/A 为该客户所做的编码工作对交易进行分类。因此,本质上,系统正在学习每一个编码的新事务,并为将来的分类更新概率分布。简化这一过程的原因是,许多中小型企业的大部分费用会随着时间的推移而有所重复,因此系统的准确性应该高得多,而复杂性则低得多。

将会有一些罕见的或新的交易进入系统,需要进行账户分类。即使客户的模型之前可能没有经历过这些交易,但是很可能至少一些使用相同在线会计软件供应商的客户具有参数与新的参数非常匹配的交易。短期内您将看到的是一个“建议的”账户分类,它必须被 B/A 或 SMB 接受,因为对系统没有足够信心的交易进行自动分类是很危险的。也就是说,训练有素的模特变得真正擅长这个只是时间问题。

中小企业确实需要帮助,即使他们不愿意承认

如果你是一名 B/A,前几段你担心被自动解雇,不要太担心,因为我将要讨论的最新趋势将提供许多机会之一来重塑你的业务,并为你的客户提供更高水平的价值。

一个证据充分的事实是,当你的收入低于某个门槛时,雇佣一个专门的首席财务官是没有意义的。我们注意到的是,B/A 生态系统确实接受了这一事实,并在许多情况下试图重新构想他们的商业模式。他们不再仅仅是编写交易代码或拿走一鞋盒收据,而是在某种程度上充当中小型企业的兼职首席财务官。

这对 B/A 和 SMB 社区来说都是一个令人难以置信的发展,因为它允许 B/A 向 SMB 提供增值服务,同时 SMB 获得金融专业知识,帮助他们在与可能入侵其地盘的大公司的竞争中保持竞争力。

大家双赢!听起来很棒,对吧?没那么快。

我参与创办的上一家公司生产高级心脏图像处理软件。我们达到了早期增长曲线,并超过了收入门槛,在这个门槛上,除了其他职责之外,我接管首席财务官的角色是有意义的。本质上,我是以兼职首席财务官的身份开始公司的这一阶段的。

在我担任这一职位的几年里,我可以毫无疑问地说,一个连企业的某些运作都不懂的首席财务官真的没什么价值。首席财务官的工作是了解财务和运营如何协同工作,以最大限度地提高业务的增长和效率。仅仅知道如何编码交易和报税并不是首席财务官该做的。我高度警告 B/A 社区中的任何人,如果你不打算了解你的客户的至少一点运作,或者这种对你的业务的“重新想象”真的不会发生,就不要把自己推销成 CFO。

一个好的首席财务官不仅能提供强有力的财务指导,还能让中小企业的所有者和管理者以更明智、更高效的方式经营企业。首席财务官是财务和运营数据的连接点,需要提供有根据的见解和建议。这看起来很明显,但是在我们所有的交流中,我们看到了客户想要什么和他们实际想要什么之间的脱节。

在公司历史的早期,我们进行了用户体验(UX)研究。在我们采访的 40 家中小企业中,除了了解财务调节和一些一般收入和支出信息外,他们都认为标准财务报表没有什么价值。这可能会引起一些人的警觉,他们以报表为客户提供的增值成果而自豪,但同时他们也应该意识到提供价值的机会不仅仅是报表。

说起来容易做起来难

今年我们接触到的 B/a 都是非常棒的人,他们非常关心他们的客户。然而,他们仍然有业务要经营,不能花费大量额外的时间来导出数据,将数据输入电子表格,进行复杂的计算,并试图制作某种用户会发现其价值的运营报告。

即使 B/A 从一开始就真正了解他们客户的运营,这样做也是不经济的。因此,我们遇到了另一个脱节的问题,即如何在提供运营级价值的同时,仍然能够运营盈利的业务。

将帮助你进化的技术(以及为什么我们早上醒来)

在 chata.ai,我们一直在讨论如何成为实现这种商业模式转型的催化剂。创新需要解决两个主要领域:

1) 信息检索和报告需要尽可能的快捷和直观。

已解决:chata.ai 允许您提出问题并获得答案,不再需要导出、电子表格或不完整的基于仪表板的软件。

更好地了解 B/A 客户的日常兴趣所在。

求解:

对于我们来说,通过 B/A 社区实现这些业务模式转型的一个关键因素是让 chata.ai 掌握在他们合作的 SMB 手中。

chata.ai 最吸引人的地方在于它非常简单易用。除了知道如何写短信(几乎每个人都知道如何写),中小型企业用户几乎不需要系统培训。中小型企业用户每天都在开展业务。大多数中小型企业都有关于其业务的问题,但他们往往得不到答案,因为数据被困在一些他们不知道如何使用的系统中,无法访问。

如果 B/A 用户能够看到他们的中小型企业客户提出的自然语言问题,这将提供令人难以置信的洞察力,并允许 B/A 为中小型企业提供全新水平的价值和专业知识。剧透警告——这个的 B/A 接口可能正在开发中。

在 chata.ai,我们每天都会问自己一些问题,比如“我们如何帮助 B/A 社区为他们的客户增加更多价值?”,“我们如何通过支持使用数据资产来解决中小型企业的日常问题?”,“我们如何优化时间/价值曲线,使各方都走在前面?”。

我们的最终目标是帮助我们的合作伙伴取得成功。这些都是复杂的问题,就像任何优秀的创新者应该做的那样,我们继续在这个不可思议的生态系统中倾听人们的声音,适应需要的地方,并总是,总是推动我们自己的界限。

建立一个能在你自己的游戏中打败你的人工智能

原文:https://towardsdatascience.com/pathwayz-ai-3c338fb7b33?source=collection_archive---------4-----------------------

11 岁时,我发明了一种桌游。 我没想到会有什么结果。八年,三个出版商,两个代理商,一个 疯狂的故事 后来,Pathwayz 上架了。这款游戏赢得了 2014 年的玩具博士最佳选择,并在 2015 年被门萨推荐。Pathwayz 已经在网上销售,在 Barnes & Noble,以及北美的数百家商店。

Pathwayz 类似于奥赛罗和围棋。人工智能已经 已经 掌握了那些游戏。1997 年,物流泰洛击败奥赛罗世界冠军。2016 年,AlphaGo 战胜围棋世界冠军。但是从来没有人为 Pathwayz 创造过人工智能。2017 年,迈克尔·塔克、尼克尔·普拉巴拉和我决定改变这种状况。我们参加了 CS 221:人工智能——原理与技术*。我们应用我们所学到的知识来构建 PAI,这是世界上最好的(也是唯一的)Pathwayz AI。*

我们的主要挑战是游戏中的大 树的大小 。我们实验了各种 反射 搜索 型号,其中我们通过括号打**。我们最好的 PAI 由 52 个特定于域的特征组成,通过时间差异学习在 5,000 多个游戏中训练权重,应用于窄束 minimax 算法。对抗业余人类玩家,PAI 在 33 场比赛中赢了 33 场。在与我们队的比赛中,PAI 以 5 比 0 击败了 Nikhil Prabala,4 比 1 击败了 Michael Tucker,3 比 2 击败了 me。22 岁,在自己的游戏上输给了一台电脑。

派的打法教会了我们 新策略 。PAI 通过与自己对弈,也让我们试探了一下;在 1000 场比赛中,第一名球员的胜率为 49.4%,因此似乎没有明显的球员优势。

这篇文章详细记录了我们如何创造 PAI。我正在分享这项工作,以便其他人可以从中学习和借鉴。我们的 PAI 版本非常熟练,因为它没有使用神经网络。我们精心选择的功能,加上前瞻功能,使得顶级玩家的开发变得更加高效。在 下一次迭代 中,神经网络和其他改进呈现出超人发挥的潜力。

我已经包括了基本的术语解释,因此接触较少的读者可以了解更多关于 Pathwayz 和/或 AI 的信息。因此,这是一个很长的帖子。随意跳到你觉得有趣或相关的部分。或者你可以完全跳过阅读,而是在这里 与 PAI 版本对战。我建议按这个顺序玩:1。PAI 基线,2。PAI 高级基线,3。派·TDL 和 4。派 TDL 光束极小化。

path wayz 简介

Pathwayz 是一款双人战略游戏。就像在《奥赛罗》和《围棋》中一样,你必须提前计划以智胜对手。一个玩家是白人;另一个是黑色的。目标是用你的颜色在 8x12 木板的长边上建立一条路径。路径可以是正交的,也可以是对角线的,可以在任何方向来回交织。

White just won this game by connecting the left and right sides of the board.

每回合,你可以放置一个你颜色的普通棋子或一个对手颜色的永久棋子。你为什么要给你的对手一个永久的棋子?因为它翻转周围的棋子。

A: White places a regular piece, circled red. B: Black places a permanent piece, which flips the four adjacent pieces.

完整说明是这里,一个样例游戏是这里。

玩游戏的人工智能时间线

这是一个玩游戏的人工智能的时间轴:

From Deep Blue to AlphaGo, AIs have defeated the world champions of Chess, Go, and other board games.

人工智能现在比人类更擅长西洋双陆棋、跳棋、国际象棋、奥赛罗和围棋。参见 Audrey Keurenkov 的关于 AlphaGo 之前人工智能游戏的“简要”历史,以获得更深入的时间线。

2017 年,迈克尔·塔克(Michael Tucker)、尼基尔·普拉巴拉(Nikhil Prabala)和我着手为 Pathwayz 打造全球首个 AI PAI。奥赛罗和西洋双陆棋的人工智能与我们的 PAI 开发尤其相关。

与 Pathwayz 一样,奥赛罗是一种相对年轻的游戏——至少与古代的双陆棋、跳棋、国际象棋和围棋相比是如此。没有一个大规模的大师级游戏数据库来训练人工智能。相反, Logistello 和其他奥赛罗人工智能依赖于领域特定功能**(即奥赛罗特有的战略元素)。**

步步高 AI TD-Gammon,通过时间差学习**(一种强化学习)取得成功。它通过与自己对抗来学习,一路调整特征值。**

PAI 同样使用特定领域的特征和时间差异学习。我将在这篇文章的后面讨论这些技术。

数百万、数十亿、数万亿、数不清的动作

构建一个玩游戏的人工智能的难度取决于游戏的树的大小。树的大小取决于的宽度的深度**。**

考虑井字游戏的树大小作为一个简单的例子。当棋盘是空的时,有 9 种可能的移动:9 的宽度。第一步后,有 8 个可能的移动:宽度 8。在这种情况下(以及在其他布局游戏中),宽度随着棋盘填满而减小:9、8、7、6、5、4、3、2、1。

井字游戏最多有 9 层层**。(“Ply”只是对单个玩家回合的花哨称呼。在一些游戏中,单个玩家的回合被认为是“一回合”,1 回合= 1 回合。在其他游戏中,两个玩家的回合都被认为是“一回合”,1 回合=回合。为了避免混淆,我还是坚持用“ply”。)假设我赢了 5 层。那个游戏的深度是 5。井字最大深度为 9。**

总博弈树由所有可能的移动组合组成。

Here is a small portion of tic-tac-toe’s game tree, just the first three plies of a single branch.

我们可以用宽度对深度的幂来估计井字游戏的总树大小。我们假设每个人都是很好的井字游戏玩家,那么所有游戏都以平局告终,占满了整个棋盘。在本例中,深度为 9。平均宽度为 5。如果我们从宽度到深度,或 5⁹,我们得到大约 1.95 * 10⁶,这是井字游戏(超级近似)的树的大小。我们可以使用类似的方法来估计其他游戏的树的大小。

Here is the complexity — approximate breadth, depth, and tree size — of Pathwayz, Chess, and Go.

我们在构建 PAI 时面临的主要挑战是它的树很大。6.60 * 10 的⁷很大。这比地球上沙粒的数量还要多。事实上,6.60 * 10 ⁷比填满整个宇宙的沙粒数还要多。

在这方面,Pathwayz 让人想起国际象棋和围棋。它的树比国际象棋的树大。它的树宽介于国际象棋和围棋之间。为了处理如此复杂的树,我们尝试了不同的方法。这些方法分为两类:

  1. 反射模型(随机、基线、对抗基线、手加权智能特征和 TDL 加权智能特征),其中 PAI 只是评估其当前的一组移动。
  2. 搜索模型(蒙特卡罗树搜索,expectimax,minimax,beam minimax,和 narrowing beam minimax)其中 PAI 向前看,探索博弈树。

反射模型:应用评估函数

我们使用了一个基于状态的模型来模拟博弈树。状态描述当前玩家和棋盘布局。

每一层,PAI 都会查看所有合法的步骤,并选择它认为“最好”的一个它如何决定哪一步是最好的?PAI 使用一个评估函数**,计算给定游戏状态的值。我们试验了各种可能的功能。**

一级:随机

PAI 选择随机移动。这显然不是一个好策略…

第二级:基线

PAI 选择最大化myLongestPath的移动:PAI 在连续路径中遍历的列数。

White’s myLongestPath is 4, and black’s is 5 (note that the two unconnected pieces do not contribute).

当一个策略在 50%的时间里表现得比基线更好时,我们知道这个策略是合理的。

第三级:对抗基线

PAI 选择最大化my longestpath–0.4 * yourlengestpath的移动。由于 PAI 现在推进了自己的路径并且阻挡了对手的路径,因此游戏效果显著提高。对抗性底线有时会击败新手。

当一个策略在 50%的情况下比对手的基线表现得更好时,我们知道这个策略是好的。

第 4 级:手动加权智能功能

myLongestPath 和 yourLongestPath 只是评估游戏状态的两种方式。还有数不清的其他因素表明一个球员做得有多好。比如,你们每个人有几件永久的?比你的对手多还是少?你控制多少列?你的道路容易改变吗?容易被屏蔽?你使用对角线、分叉或直线队形吗?等等。

这些被称为特定领域特性智能特性**。迈克尔、Nikhil 和我一起想出了 440 个可能的特征。我们缩小到我们最喜欢的特征。我们最好的 PAI 只使用 52,原因我稍后解释。**

我们设计了一些方法来衡量每个玩家的以下方面:

  • 路径长度
  • 路径持久性
  • 列数
  • 永久件数
  • 带有 x 空邻居的常规块的数量
  • 一次可以翻转的棋子数量

我们的突破是建立前瞻功能。通过存储路径的左右边界,我们能够有效地估计:

  • 未来路径长度
  • 如果一条路径被阻塞
  • 如果有人离胜利只有一步之遥

我们创建了各种其他特性,包括平方、交互和指示器特性。我们精心挑选了权重**:每个特征的正值或负值。我们给我们认为更重要的特征分配更高的权重。例如,我们尝试给 myLongestPath 权重 10, yourLongestPath 权重-6,给myNumPerm—my numberm—我的永久块数量—权重 3。

我们通过标准化特征值(即,将它们全部压缩到相同的范围内),乘以它们的权重,并将结果相加,创建了一个评估函数。我们还创建了一个+/-一百万的效用函数**,增加了一个玩家在输赢情况下的评价函数。**

牌型灵巧的牌手是个好牌手。作为 Pathwayz 的发明者,我玩过成千上万的游戏,可能比任何人都多,非常适合体重特征。然而,我主要是凭直觉来权衡的。在我们最喜欢的 52 个特性中,我不知道它们的重要性到底有多大。这就是时差学习的作用。

第 5 级:TDL 加权智能特性

PAI 通过时间差学习** (TDL)学习特征权重。对于每一层,PAI 使用其当前重量来评估纸板——将该值存储在 V1 中。然后 PAI 移动,对手移动,PAI 再次使用它的重量来评估棋盘——存储这个新值 V2。在 TDL,奖励预测误差(R) 是 V2 减去 V1。换句话说,你的错误是你最初的评估函数与新的董事会状态相比有多错误。学习速率 alpha (α) 就是你学习的速率。alpha 值为 1.0 意味着您会完全忽略旧值,只考虑最新的数据。alpha 值为 0.5 意味着您对旧值和最新数据进行了平均。大多数阿尔法值要小得多(我们实验了 0.00001 到 0.01),这样你就可以逐渐学习,随着时间的推移积累更强的证据。**

每两层,PAI 计算奖励预测误差(R)。给定学习率(α),PAI 更新其特征权重向量,增加 R * α。如果 PAI 在两层之后的表现好于预期,则董事会之前的特征会得到更积极的重视。如果 PAI 在两层之后表现得比预期的差,那么特性的权重会更负。我们为赢/输提供了一大笔正面/负面的游戏结束奖励。PAI 在 10,000 场比赛中与自己的版本进行了比赛,以了解其领域特定功能的权重。

TDL 的要素是开发探索**。我们希望 PAI 利用它所学到的东西,做出越来越好的动作。然而,我们也希望 PAI 继续探索,而不是过于专注于一个场景。如果 PAI 总是下“最好的”当前棋,它可能会卡在局部最小值中,忽略更好的路径。因此,我们使用了探索概率。PAI 根据随机ε(如果ε <得分最高的棋步,如果ε <得分第二高的棋步,如果ε < ⅞得分第三高的棋步等)探究了其十大棋步。).**

我们还想调整权重,所以我们创建了一个自动化的训练管道**。如果 PAI 在训练中赢了太多的游戏,它就会变得过于自信,增加它所有的特征权重(包括那些应该是负的)。在赢得至少 60%的游戏后,PAI 的对手采用 PAI 的当前权重,这确保了 PAI 总是在适当的技能水平上受到挑战。**

相反,如果 PAI 输了太多的游戏,它会变得悲观,减少所有的特征权重(包括应该是正的)。在赢了不到 40%的游戏后,PAI 会切换到对抗底线的游戏,它可以学会持续地击败这个底线。PAI 随后恢复了信心,在回到更具挑战性的对手面前之前调整了特征。

We used an automated training pipeline. If PAI ever won too few games, PAI’s opponent became adversarial baseline. If PAI ever won too many games, PAI’s opponent adopted its current weights.

我们将拥有 52 个功能的 PAI 用于 5000 款游戏。

Here are the top 15 feature weights after the first 5,000 games of training. There are two key takeaways. 1: Lookahead features make up 8/15 of the top features. 2: Positive features make up 12/15. PAI focuses on getting ahead more than on blocking.

具有 TDL 加权特征的 PAI 可以持续击败业余人类玩家。我们最终将拥有 440 个功能的 PAI 用于另外 5000 款游戏。(这个版本表现稍差,原因我稍后解释。)

搜索模型:探索游戏树

第 6 关:蒙特卡洛树搜索

PAI 的上述版本都依赖于使用评估函数来对当前的一组可能的移动进行评分。但是他们都没有展望未来。

蒙特卡罗树搜索 (MCTS)是一种“向前看”的算法 PAI 没有使用评估函数,而是快速测试尽可能多的场景。它随机地和自己玩成吨成吨的游戏(在我们的例子中:每层 250,000 个游戏)。根据随后的胜率,PAI 可以估计哪些举措会带来更好的结果。

结果并不惊人。Pathwayz 中的随机移动通常很糟糕(例如给你的对手一个永久棋子),所以随机抽样是一个弱预测器。

第七级:Expectimax

用我们的评价函数探索博弈树怎么样?

Expectimax 是一种针对随机对手进行前瞻的算法。对于 PAI 的每个可能的移动,它考虑对手的所有后续移动,应用我们的评估函数,并平均这些值。PAI 选择平均值最高的棋步。因为我们的评估函数需要时间(与模拟随机移动相比),PAI 无法预见未来。特别是在游戏开始的时候,当树的宽度很大的时候,向前看似乎要花很长时间。所以 PAI 只向前看了一层。

请注意,expectimax 针对随机的对手进行优化。像 MCTS 一样,结果并不令人惊讶,因为在 Pathwayz 中随机抽样是一个弱预测器。

第 8 级:极小极大

探索游戏树对抗非随机对手怎么样?

Minimax 是一种预测最有可能的对手的算法。Minimax 的工作方式类似于 expectimax。然而,PAI 并没有对对手可能的移动进行平均,而是假设对手会尽最大努力移动。PAI 最大化其自身移动的评价函数,同时最小化其对手移动的评价函数。

请注意,在面对次优对手时,极小极大并不是最佳玩法。换句话说,它总是从其他玩家那里获得最好的,而不是利用常见的错误。

更迫切的担忧是 minimax(像 expectimax)在 Pathwayz 看不到很远。由于巨大的树宽,尤其是早期游戏,PAI 最初只限于向前看一层。然而,随着游戏的进展,我们确实增加了前瞻深度,所以 PAI minimax 是一个令人生畏的终极玩家。

第 9 级:光束最小值最大值

派还能看得更远吗?

波束极小最大值**是一种通过减少宽度来增加前瞻深度的算法。在每一层,PAI 选择最上面的 X 步,然后向前看那些步。在随后的关卡中,PAI 再次缩小了宽度— 只看对手的最佳 X 步,然后看自己的最佳 X 步。(在我们的例子中,X 是 5。)

如果最佳长期移动在这些 X 移动之外,那么波束极小最大将错过它。拥有无限的计算能力,minimax 永远是比 beam minimax 更好的玩家。(当对手离胜利只有一步之遥时,我们让 PAI 恢复到更彻底的 minimax 算法。由于广度有限,计算时间在这个阶段仍然是合理的。)然而,在我们有限的时间和计算资源下,beam minimax 允许 PAI 提前多考虑一层,这使它成为一个更优秀的玩家。

第 10 级:缩小光束最小值最大值

我们 PAI 的最终版本使用了窄光束 minimax** 。PAI 模拟自己的前十步棋,然后是对手的前五步棋,然后是自己的最佳棋。这种窄束允许 PAI 在合理的时间内预测三层,同时考虑更大的一组(十个)可能的移动。**

Here is an example of narrowing beam minimax, with breadths of 3, then 2, then 1 at each level.

定量结果

为了比较我们不同 pai 的表现,我们让他们参加了循环赛。这些 pai 在 20 场比赛中互相比赛,总共 720 场比赛。虽然没有已知的第一个或第二个玩家的优势,我们让每个 PAI 玩相同次数的黑白游戏,以确保公平的比赛。请注意,本次锦标赛中的 minimax 和 beam minimax PAIs 使用的是最初手工挑选的特征权重(而不是 TDL 训练的权重)。还要注意,在这种情况下,“波束极小最大”是我们的“窄波束极小最大”算法的简写。

Here are the results of our round-robin tournament. Win rates are down the columns, loss rates across the rows.

TDL 训练的特征对表现有显著的影响。通过 TDL 训练的两个反射模型比对抗基线表现得好得多。拥有 52 个特征的 TDL 设法在我们最初的光束极小值中获得了 60%的胜率;一个反射模型打败了一个对抗性的搜索模型是一个了不起的成就。我们认为具有 440 个特征的 TDL 遭受过度拟合。它对自己和光束 TDL 极小极大进行训练,所以对这些玩家是最佳的,但对其他玩家是次优的。相比之下,具有 52 个特征的 TDL 适应性更强。

窄光束 minimax 赢得了锦标赛。经过 52 个特征训练的版本击败了拥有 440 个特征的对手。我们把这次胜利归功于前者的多才多艺和后者的过度配合。重要的是要记住,20 场比赛容易受到相当大的差异。然而,定量结果符合我们的定性直觉。

最终,将 TDL 特征与前瞻算法相结合,产生了一个聪明的、适应性强的播放器。当我们在一个人工智能海报展览会上展示我们的成果时,我们为第一个击败我们最好的反射 PAI(经过 52 个特征训练的 PAI)的人提供了 50 美元的奖金。派以 33 比 0 击败了人类。诚然,他们都是业余选手,尽管有些人连续玩了多次,有些人有围棋或其他类似棋盘游戏的经验。

Pictured from left to right: Nikhil Prabala, Louis Lafair, and Michael Tucker at the CS 221 Artificial Intelligence — Principle and Techniques poster fair.

The reflex TDL-weighted PAI defeated amateur humans in 33 straight games at the poster fair, played on the pictured iPads. No one won the $50 reward.

最后,我们让我们最好的前瞻 PAI(通过 TDL 训练的具有 52 个特征的窄光束 minimax)与我们更有经验的团队对抗。PAI 以 5 比 0 击败了 Nikhil Prabala,4 比 1 击败了 Michael Tucker,3 比 2 击败了 me。

In 2017, PAI gets added to the timeline of notable game-playing AIs.

拜师学艺

PAI 作为第一个 Pathwayz AI,可以教我们新的 Pathwayz 方法。它的打法有几处让人惊讶。大多数人类玩家都很保守,会等到游戏中期或结束时才翻盘。派,另一方面,是侵略性的,在最初的几个动作中持续翻转。PAI 试图(经常成功地)获得早期领先,这样它就可以在比赛结束时进行进攻而不是防守。

根据定义,反射模式是一个贪婪的玩家,所以它的侵略性是有道理的。

A: Reflex TDL-weighted PAI (black) plays a permanent piece, aggressively flipping at start of game. B: Later in the same game, PAI has now played permanents in four of its first six moves

搜索模型的侵略性更令人惊讶。

PAI beam minimax (black) has learned that getting ahead early is helpful. PAI tends to go on the aggressive.

同样令人惊讶的是 PAI 阻挡空翻的能力。PAI 有时会在非常规空间打球,只是为了阻挡对手的翻转。

PAI (black) strategically places to block a dangerous flip.

PAI 会尽一切可能阻止(或至少延长)对手的胜利,有时甚至会翻转自己的棋子。

A: I (black) am one turn away from winning. B: PAI (white) makes an end-game sacrifice, flipping its own piece to prevent a winning flip next turn.

继续玩和发展 PAI 会揭示更多新颖的策略。

有先发制人的优势吗?

许多双人策略游戏中都存在第一个玩家的优势。在围棋中,第二名棋手获得补偿以消除第一名棋手的优势。在国际象棋中,第一个玩家的胜率在 55% 左右。胜率的计算方法是:(胜+ 1/2 平)/总游戏数。

鉴于历史数据的缺乏,在 Pathwayz 没有已知的第一玩家优势。有些人认为先发制人有优势。

A commenter on BoardGameGeek.com believes there’s a first-player advantage in Pathwayz.

我们决定看看这个理论是否成立,以及在多大程度上成立。在 Pathwayz 白棋先走。我们在 1000 场比赛中发挥了我们最好的反射(因此也是最快的)PAI。白棋赢了 487 场,黑棋赢了 499 场,他们平了 14 场。换句话说,第一个玩家的胜率是 49.4%。如果有的话,似乎有一个次要的第二玩家优势,虽然它可能会随着更多的模拟或更先进的人工智能而减少。黑棋的优势如此之小,以至于我们可以假设(直到一个更大的游戏数据库存在)没有明显的玩家优势。

下一级

我们精心选择的功能,加上前瞻功能,使得顶级玩家的开发变得更加高效。与使用神经网络相比,我们能够用更少的时间(和更少的计算能力)构建、训练和测试 PAI。

对于未来的迭代,我们有几种方法可以继续改进 PAI。第一,我们要训练 PAI 对抗人类玩家;我们已经建立了开始这样做的基础设施。第二,我们想尝试将蒙特卡罗树搜索与我们的评估函数相结合,有效地增加预见性。第三,我们希望试验不同的特性集,在 52 和 440 之间,不要过度拟合。最后,我们希望使用神经网络,允许更复杂、更微妙的非线性策略。

目前的 PAI 是一个强大的玩家,但不是不可阻挡的。随着神经网络的发展,PAI(像 AlphaGo Zero )展示了超人游戏的潜力。

鸣谢

PAI 是许多人投入大量时间和大量帮助的结果。感谢 Percy Liang 和 Stefano Ermon 教授 CS221:人工智能——原理与技术。感谢扎克·巴恩斯的反馈。感谢 Dylan Hunn 提供初始 GUI。感谢一路走来尝试与 PAI 对战的所有人。

当然,非常感谢迈克尔·塔克Nikhil Prabala ,他们花费了无数的时间(也失去了太多的睡眠)来共同开发 PAI。这篇博文在很大程度上借鉴了我们为 *CS 221 撰写的最终联合论文**:人工智能——原理和技术。***

基于模式的识别确实对自然语言处理有帮助

原文:https://towardsdatascience.com/pattern-based-recognition-did-help-in-nlp-5c54b4e7a962?source=collection_archive---------7-----------------------

Photo: https://pixabay.com/en/stained-glass-spiral-circle-pattern-1181864/

现在大家都在说机器学习和深度学习。当然,我们喜欢深度学习的结果,但它非常渴望数据。那么我们如何建立初始化数据集呢?我们可以在标记数据上分配一组资源,但这非常昂贵。或者,我们总是在初始化阶段使用正则表达式(用于文本)来理解数据,并为验证和启动项目构建手工功能。

正则表达式是软件工程中的一项基本技能。它存在于前端开发(如 Javascript),后端开发(如 Java)。数据科学怎么样?它在自然语言处理领域非常有用,允许我们从非结构化文本中检索大量有价值的信息。

在本文中,我将重点介绍如何在数据探索、预处理和特性工程阶段利用正则表达式,而不是正则表达式实现。看完这篇文章,你会明白:

  • 什么是正则表达式?
  • 我们如何在数据科学生命周期中利用正则表达式?
  • 拿走

什么是正则表达式?

这个概念是由斯蒂芬在 20 世纪 50 年代提出的。正则表达式(也称为 regex 或 regexp)的目标是通过给定的文本(包括字符、符号和数字)来识别期望的模式。你可以访问这里了解详细的历史。

给定一个句子,我们想提取一个日期。如何才能实现这一点?

sentence = "Jul 29 is the 210th day of the year"
pattern = r'((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]{2})'results = re.findall(pattern, sentence)
print('Result:', results)

输出

Result: [('Jul 29', 'Jul')]

它支持其他模式,包括“任何数字”,“任何单词字符”。详情可以查看 python 官方页面或者在 google 或 stackoverflow 中搜索。

我们如何在数据科学生命周期中利用正则表达式?

数据探索

当你开始一个项目时,第一步是探索你所拥有的。对于数字特征,我们可以做一些基本的统计计算,如最小值,最大值,平均值。对于分类特征,我们可以数出可能的值和分布。文字呢?除了计算唯一标记(例如单词)和最高频率单词之外,您还想从非结构化文本中探索更多特征。

Photo: https://pixabay.com/en/binoculars-person-telescope-woman-1869456/

  • 理解数据:给定一条新闻,你想知道这条新闻是否包含事件的日期,以及显示是否包含日期的分布。如果数据源自带就太好了。但是,大部分时候不会发生。
  • 验证假设:在之前的项目中,我们认为产品的重量是一个有价值的信号。然而,我们不知道非结构化文本是否包含这些信息。所以我们用正则表达式来验证它。幸运的是,有明确的格式,如毫克,毫克,克,公斤等。通过使用正则表达式,我们可以很容易地构建一个新的特征。

预处理

我们无法获得清晰的数据或时间(不像 Kaggle 竞争)。所以我们必须清理原始数据。当然,人们相信深度学习可以学习一切并减轻那些无意义的重量。根据我的经验,高质量的数据会带来更好的结果。

Photo: https://pixabay.com/en/divorce-separation-marriage-breakup-619195/

  • 通过网络爬虫系统获取数据。它可以是 HTML 格式,我们利用“美丽的 Soap”解析原始数据。我们仍然需要使用正则表达式来清理不需要的数据
  • 通过 OCR 获取意外数据。假设原始输入仅为英文,但 OCR 识别出它不正确并引入了非英文字符。它很容易被过滤掉。

特色工程

在确认模式(如日期、体重等)后,我们可以使用正则表达式将它从非结构化数据中挖掘出来。提取正确的“日期”可能是非常具有挑战性的任务。这里有一些例子

  • 不同格式:2018 年 1 月 1 日、2018 年 1 月 1 日、2018 年 1 月 1 日等。
  • 不同解读:如何解读 08/01/2018?如果你在香港,应该是一月八日,但是在美国是八月一日。

Photo: https://pixabay.com/en/tools-construct-craft-repair-864983/

一般来说,有 3 种可能的情况:

  • 定义好的格式:日期、邮件、电话号码都是定义好的格式。只要谷歌一下,就能找到可靠的正则表达式。
  • 自定义正则表达式:很多时候,我们需要构建自定义正则表达式。在系统日志分析项目中,目标之一是从日志中提取域密钥(假定域密钥保存在日志文件中)。域密钥可以是系统生成的 15 位数字或数字和字符的组合。
  • 无格式:例如,您想要获取产品名称,如 iMac、Goolge Home 等。没有标准格式,所以我们可能无法通过正则表达式提取它。

拿走

同样,如果你在 NLP 领域工作,正则表达式是一个基本的技能。如果你能掌握它,这是一个优势,但至少你必须实现一些简单的正则表达式。正则表达式是一种预定义的规则库提取方法。它:

  • 可能需要大量时间来实现一个通用模式。如前所述,正则表达式是一个规则库系统,我们需要一点一点地构建自定义的正则表达式。
  • 不支持看不见的模式。它是一个基于规则,并暗示它不能处理新模式。
  • 无法保证满足所有场景。即使是电子邮件,我们也不能保证 100%成功。

关于我

我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。

  • 博客
  • 领英
  • Github

模式和反模式

原文:https://towardsdatascience.com/patterns-and-anti-patterns-fb814f21d011?source=collection_archive---------6-----------------------

“数据科学”的标志是,它继承了其父母统计学和计算机科学,是一门致力于识别数据中发现的模式的艺术。然而(我很可能在这个人物塑造方面相当不公平,我要提前承认),在我看来,它也是一种艺术,它把它揭示的模式看得太重,低估了它是什么的“艺术”方面的程度。

我们可以从一些看似琐碎的问题开始:什么是“模式”?《牛津英语词典》的第一个定义,“一个重复的装饰性设计”提供了一个有用的起点:我们可能不关心“装饰性设计”的方面,但我们认为某样东西是一种“模式”(即《牛津英语词典》的第三个定义,“一种在某件事情发生或完成的方式中可辨别的规则和可理解的形式或序列”),因为我们看到它“重复”发生但是多少重复算“重复”呢?两次?三次?在这一点上,人类和统计数据有些不一致——但这种不一致比人们想象的要微妙一些。

假设我们看到掷硬币连续三次产生“正面”。关于这枚硬币,它告诉了我们什么,并且暗示了下一次抛硬币的结果?对(一些)人类来说,三个可能就足够了,或者(对其他人来说)不够。经典统计学会给出相反的建议:如果你从假设硬币是公平的开始,你会以 1/2 = 1/8 的概率连续得到 3 个头像,这可能不足以宣布观察到足够的模式。后者通过使用数字和概率逻辑,似乎比前者更符合逻辑和科学:至少,它产生了每个人都能同意的东西,不管他们先前的信仰如何,这是一件好事。但它也滑入了一些非常可疑的东西:这个断言本身,是从一个关于硬币真实性质的先验开始的:硬币一开始就是公平的,除了方便的假设之外,没有其他证据。

换句话说,我们想知道 P(coin|observations)。我们计算了 P(观测值|硬币),我们断言它对 P(硬币|观测值)有一些见解——坦白地说,这是假的。我们仍然不知道我们是否真的看到了一个模式——只是它不是一个模式,如果基于一些我们同意的先验,先验地,是合理的。如果我们拒绝假设的先验事实上是合理的前提,那么观察到的事件没有任何意义,至少在建立是否存在一个模式方面,独立于一个人的主观信念——尽管它确实确定地建立了这一点,但它不是一个模式,前提是真实的 P(头)是 1/2,1/8 不足以建立一个模式。请注意,这重复了最近在某些学术研究领域对 p 值的争议:p 值正是后者。我们有一些理论,X >为 0,如果,事实上,X = 0,我们会看到我们观察到的只有很小的概率。如果我一开始就不相信这个理论,我就没有理由认真对待 p 值。混淆 P(A|B)和 P(B|A)是一个非常常见的统计谬误,我们总是在概率和统计课程中花时间讲述它,但是,通过合适的框架,它显然不是人类一直掌握的东西!

前面的内容暗示了构成“模式”的稍微不同的定义模式是一种重复的现象,它证实了观察者所期望的规律性。对于那些认为硬币以很高的概率“正面”落地的人来说,连续三个正面就足够了。有些矛盾的是,同样的情况也发生在那些认为硬币以很高的概率落在“尾巴”上的人身上,即使是在相反的方向上。对于那些认为硬币总是“反面”落地的人来说,即使是一个“正面”也足以打破这个模式。它当然排除了 P(T) = 9/10 和 P=0.01 足以打破模式的信念——因为 P(HHH|P(T) = 9/10) = 1/1000。

这些都把我们带回了统计学的基本问题:我们想知道真相,却只知道数据;除了我们从数据中推断的以外,我们不知道真相。此外,不管我们喜欢与否,我们从数据中推断出的东西至少部分取决于我们现有的信念。HHH 的观察与许多关于 P(头)的真实值可能是什么以及什么算作“模式”的信念是一致的如果观察仅限于连续三个头,没有人能够说服相信 P(H) = 1 的人相信其他观点——因为这足以符合他对“模式”应该是什么的想法。然而,对于那些相信 P(T)非常高的人来说,这足以打破先验——对他们来说,这是反模式的,与他们预期的想法不相容。换句话说,反模式通过强制改变先验知识来提供信息。模式不会。

那么,当我们(认为我们)通过任何分析方法看到数据中的模式时,我们应该怎么做呢?我们希望至少考虑所有的可能性:如果 P(H) = 1,P(HHH) = 1,如果 P(H) = 0.9,P(HHH) = 0.73,等等。如果我们能合理地给每一个可能的偶然性分配概率:P(P(H)= 1 = 0.01,P(P(H)= 0.9 = 0.05,等等,我们也许能在估算 P(H)方面做得更好。,并计算期望值(例如,德国坦克问题),但做好这项工作可能涉及更多的数据工作,以及获得对产生掷硬币结果的过程的实质性(或特定领域,对你们数据人来说)理解,如果“客户”只是想知道 P(H ),这似乎是不合理的。

当密歇根大学的政治心理学家开始他们关于投票行为的开创性工作时,他们注意到了两种模式(是的,我过于简单化了),他们认为足以引起注意:大多数人投票给政党,农民投票给农业。其中,前者最受关注——我认为它本不该如此。它给出了 P(A|B 或 C 或 D 或 E 或 F) =高的表象,只是因为 F 是 B、C、D、E 和 F 的并集的一个很小的子集。当子集 F 被单独检查时,P(A|F) =低,并且因为差别明显很大。分别考察 P(A|C)或 P(A|E)的概率是怎样的,特别是当子集变小时?(例如 1960 年的天主教徒?或者,如果天主教徒是意大利人,即使在 1960 年——在某些城市,例如纽黑文,他们的政治精英不太喜欢爱尔兰政客——或者来自共产主义的波兰难民——他们可能更喜欢尼克松的反共产主义声誉——缺乏足够的数据使得这种精细的分析在数据收集昂贵的日子里很难——所以我们只能确定一个明显的模式,即使在数据有限的情况下也能显示出来。原则上,大数据允许我们观察隐藏在大数据中的小数据,但前提是我们观察并捕捉到足够多的我们感兴趣的小数据。但是,这样做值得吗?这是一个好问题。

N.N .塔勒布一直试图推广“抗脆弱性”的理念“反模式”思维的概念已经在统计和 cs 人员中流行起来,至少在某些领域是这样。当然,保险行业很久以来就一直在这一理念上开展业务。但是正如我所描述的,他们的工作是基于能够清楚地、量化地识别模式和反模式之间的界限。确信硬币总是正面落地的人没有理由为可能出现的反面做准备。如果没有应急计划,他可能会更“划算”,因为他不会浪费时间为那些永远不会发生的事情做准备。而且,与上面的卡通例子不同,这甚至可能是合理的:如果 P(Head)确实是 0.9999999,为尾部的微小意外做准备的成本可能确实是巨大的,而潜在的收益很小,如果只是因为事件的罕见性——但是你怎么知道 P(Head)是否真的那么大呢?(提示:你不知道,也不能知道——除了你能从数据中推断出来的以外,为此,你需要做出通常不是基于“事实”的假设)罕见灾难的证据往往是灾难本身,越是罕见,它就越不可能被数据捕捉到,即使是大数据,足够清晰地突破稳健性的要求。换句话说,试图产生一种“抗脆弱”算法,就变成了一个保险问题:你是否愿意以增加一层复杂性甚至金钱成本为代价,购买保险来抵御一些看似不寻常的东西?你买了太阳从西边出来的保险吗?对抗俄克拉荷马州的地震?对抗 1929 年 10 月 24 日的股市崩盘?如果你在事情发生前是对的,那么在事情发生后,你会被视为天才。如果没有,你会被视为一个浪费了很多时间来防范不明飞行物的傻瓜。很有可能,你会被视为两者兼而有之——在事情发生前几秒钟还是个傻瓜,几秒钟后又是个天才。

这和数据科学有什么关系?一切。不管理论上的思考如何,实际应用中的数据科学寻求以清晰和可靠的方式识别模式,因此,有一种制度偏见:它建立在噪音是废物,是需要消除的敌人的假设上。数据科学推销自己的前提是,如果你有正确的算法和大量的数据,你可以高度可靠地预测各种各样的事情——不管细微差别,这是“客户”期望数据科学提供的东西,并将在这个前提下运作——数据科学给了他们可以作为“事实”依赖的“好”答案。在一个完美的数据科学宇宙中,一切都是可靠可预测的。没有噪音。另一方面,您购买了针对噪音的保险,针对打破您通常预期的模式的事情,因为您不“知道”这些反模式,即使您“知道”它们会发生。换句话说,因为你知道你不知道——这与数据科学所追求的正好相反。我认为这种状态永远不会达到:现实到数据的转换是不完整的;通过算法识别数据中的模式,尤其是微妙的模式,永远不会是完整的——特别是因为统计方法在设计上偏向于发现大的鲁棒模式,而不是高度条件化的微妙的小模式(人类更擅长后者)。我确实认为,我们可以达成这样的理解,即数据科学乌托邦是不可实现的,甚至在逻辑上是不可能的,无论是简单的方式还是困难的方式:我们可以诚实坦率地对待数据科学的潜在限制,并花时间探索它们——不是作为无条件的限制,而是作为一套工程条件和权衡,它们确实是这样——或者我们可以处理一些巨大的灾难以及由膨胀的期望引起的相关反弹。

意外药物过量死亡的模式

原文:https://towardsdatascience.com/patterns-in-accidental-drug-overdose-fatalities-994573a2be72?source=collection_archive---------12-----------------------

Pixabay

意外阿片类药物过量导致的死亡已经成为美国最严重的公共卫生危机之一。死亡人数令人心痛,全国每个公共卫生机构都在努力扭转这一趋势,因为这种流行病导致的死亡率逐年攀升。

为了发现阿片类药物过量死亡的模式,我开始着手分析 2016-17 年康涅狄格州的意外药物过量死亡的公开数据集。我的目标是深入了解药物滥用受害者的行为,这可能有助于采取预防措施,帮助抗击这种流行病。

关键指标

首先,我对数据进行了探索性分析,以确定将成为分析焦点的关键指标。在对几个不同的参数进行分析后,我能够专注于导致大多数药物过量死亡的共同因素。超过 80%的死亡是由于过量服用多种药物的致命组合而不是一种药物引起的。从这个角度来看,将分析建立在因服用多种药物而导致的死亡上是有意义的,因为它们占了死亡的大多数。

方法论

为了探索药物和死亡之间的关系,我决定对数据集进行社会网络分析。通过改变不同参数生成的社交网络可以相互比较,从而可以识别任何新兴模式。使用统计编程语言 r 中的社会网络分析包进行分析。

分析

1)确定致命的药物组合

由于我们的分析基于药物组合导致的死亡,因此在 2016 年和 2017 年建立了一个药物与死亡相关的网络。本质上,如果可卡因和海洛因是过量致死毒性报告的一部分,那么在这个网络中它们之间就会有联系。为了找出最重要的问题,与导致 100 多人死亡的两种药物的联系用红色标出。

  • 我们观察到,大多数用药过量死亡都与芬太尼有关,芬太尼是一种阿片类药物,因此表明阿片类药物危机有多严重。
  • 其次,芬太尼和海洛因在这两年都是意外过量死亡人数最多的药物。
  • 第三,在比较两个网络中的死亡人数时,涉及芬太尼这种药物的死亡人数在 2017 年大幅上升*。相比之下,涉及芬太尼的死亡人数而非*有所下降,但可卡因和海洛因的死亡人数略有上升。这清楚地表明,2017 年,药物消费模式发生了转变,从其他药物转向芬太尼。

2)药物和人口统计学

为了深入了解 2017 年药物过量伤亡者的人口统计数据,基于药物过量受害者死亡时消耗的数量创建了三个社交网络,分别为两个三个四个或更多个

蓝色和粉红色的节点代表男性和女性死亡,每种颜色的深度随着年龄的增长而增加。此外,绿色节点表示死亡时消耗的药物。绿色节点的大小取决于蓝色或粉色节点的“度数”或链接数量。绿色节点的大小显示了在服用多种药物时导致大多数意外过量死亡的药物。

  • 在所有三个网络中,芬太尼在与其他药物结合使用时是导致死亡人数最多的药物。紧随其后的分别是海洛因和可卡因。
  • 从视觉上看,很明显,在所有三个网络中,因药物过量导致的意外死亡问题对男性人口的影响不成比例地大于女性人口。由两种、三种和四种或更多种药物引起的女性死亡率分别为 32%、29%和 23.5%。这一趋势表明,男性人口更容易因消费大量药物而成为意外药物过量的受害者。

离别赠言

当我们深入分析时,很容易忽略这样一个事实,即每一个用蓝色或粉色表示的空节点,都曾经是一个宝贵的生命,和我们每个人有着同样的梦想和渴望。仅这一事实就足以让每个参与扭转局面和控制阿片类药物流行的人的努力有了意义。

模式中的模式

原文:https://towardsdatascience.com/patterns-within-patterns-b029d3d72892?source=collection_archive---------5-----------------------

我的朋友内森·巴托(Nathan Batto)发表了一篇非常有思想的文章(T1 ),表面上是关于人口密度和政治之间的联系,但实际上,有一点更深入和更广泛的概括:当我们看数据时,根据聚合的程度,我们错过了什么和得到了什么(我想这是和生态推断问题一样的统计问题的一部分)

虽然我们都不是印度政治方面的专家,但他提到的比哈尔邦的例子非常恰当(请注意,这是一个思想实验,而不是真实的东西)。这是一个人口非常密集,但非常“农村”的地方。这不同于其他被归类为“城市”的人口密集的地方:它们的特点是有许多空地和相对较小的人口密集的地方——你有中央公园,那里没有人居住,还有一个小的(就土地面积而言)公寓楼,有数千人居住。换句话说,在非常小的聚合级别上,这是一个非常高方差(但以非常可预测的方式)的数据环境-对于每个给定的平方公里,人口要么是 100,000,要么是 0,或者类似的情况。另一方面,在更“农村”的地区,每平方公里可能是一个“小”村庄的所在地,周围有许多小农场:因此每平方公里可能有 10,000 人口。

人口密度分布的差异反过来又对信息的传播方式产生了有趣的影响,为此,让我们从森林火灾的角度来思考。一个区域着火的概率取决于可燃材料的密度,而它蔓延到起火点以外的概率取决于紧邻周围区域的相同材料的密度,同样,也取决于它们之间的间隙大小。人们可能会假设,给定平方公里的可燃性可能会受到规模收益递减的影响:10 万的密度燃烧的可能性不是 1 万的 10 倍,特别是因为两者都可能首先着火。但是“城市”区域和“农村”区域之间的区别在于,虽然前者表面上可能更密集,但如果从小的聚集来看密度分布,它也具有被防火带包围的非常密集的街区,而后者提供几乎相等密度的连续分布,或至少小得多的防火带(自从我研究这个主题以来已经过了很长时间,但想想金属和其他高导电性材料和半导体的晶体结构的差异——相同的基本逻辑)。农村可能不太容易着火,但它为火势蔓延提供了更便捷的途径,而城市则不然。然而,一个人口非常密集的“农村”地区是另一回事:它可能很容易着火,并让它迅速蔓延。

显然,还有许多其他社会文化因素被这一简单的区别所掩盖。让我们更仔细地思考其中的一些:在什么情况下,什么样的政治/社会/文化信息会在邻居之间传播?班菲尔德和威尔逊早在 20 世纪 50 年代就预言了电视的兴起将终结机器政治,他们给出的解释至今仍是正确的:他们指出(邻居的)口口相传只是传播政治信息的多种沟通方式之一。晚间新闻竞争并削弱了机器组织者挨家挨户传播信息的能力,这种能力要有效得多——假设人们足够信任晚间新闻的话。换句话说,密集而孤立的人口,文化水平低,获取信息技术的机会有限,已经成熟,可以通过类似机器的技术进行动员,这当然是许多社会的政治标志,据我所知,包括印度的大部分农村地区(以及所谓的第一世界的许多地方)。)

因此,如果我们想知道众所周知的森林火灾可能会在哪里发生并危险地蔓延,我们不仅要查看密度(以及其他伴随的解释),还要查看足够精细的聚集水平上的密度分布。高密度区域有许多起作用的因素,但被当地防火隔离带隔离,可能会燃烧,但不会蔓延(这就是为什么城市骚乱从来没有超越骚乱?从字面上看,城市贫民区是被隔离的——通常,附近没有任何地方可以让大火蔓延,即使它被点燃了。)密度较低的地区,其影响因素可能较少,但在聚集程度较低时,密度变化较小,但情况不同。也许火灾发生的概率稍微低一些,但是在爆发的条件下,火灾蔓延的概率可能更高。

那么,我们是想用我们可以可靠预测的无关紧要的火灾来填充我们的数据呢,还是想用不太可靠的方式来预测实际上可能造成破坏的大火呢?

PCA 与自动编码器

原文:https://towardsdatascience.com/pca-vs-autoencoders-1ba08362f450?source=collection_archive---------1-----------------------

Behind Shinjuku Station, Tokyo.

在本教程中,我将解释 PCA 和自动编码器(AE)之间的关系。我假设你对什么是 PCA 和 AE 有一个基本的了解,但是如果你不熟悉 PCA 或自动编码器,请阅读[1,2]。

关于使用线性激活自动编码器(AE)来近似主成分分析(PCA),已经写了很多。从数学的角度来看,最小化 PCA 中的重建误差与 AE [3]相同。

然而,为什么要把自己局限于线性变换呢?神经网络非常灵活,因此我们可以通过使用非线性激活函数引入非线性[4]。此外,随着特征数量的增加,与 AE 相比,PCA 将导致更慢的处理。我们的假设是,声发射跨越的子空间将类似于主成分分析发现的子空间[5]。

在这项研究中,我们将看到 PCA、线性和非线性自动编码器之间的异同。请注意,非线性 AE 将是非线性的,除非输入数据被线性跨越。

首先,让我们加载虹膜数据集,并在[0,1]之间缩放。

让我们创建一个函数,根据原始标签绘制数据。

然后,我们使用数据集来拟合主成分分析,并绘制前两个主成分分析图。我们可以看到出现了两个大斑点,使用目标标签,我们可以看到这三个集群是如何包含在这两个斑点中的。

A plot of PC1 against PC2.

我们的第一个网络是一个线性 AE,有 3 层(编码、隐藏和解码),编码和解码层有“线性激活”,隐藏层有两个神经元。本质上,这种结构通过将隐藏层中的数据从四个特征减少到两个特征来近似 PCA。如您所见,该模型收敛得非常好,我们的验证损失已降至零。在通过隐藏层传递训练数据之后,我们得到两个新的向量,并且通过将它们彼此相对绘制,我们清楚地形成了类似于 PCA 的斑点和集群。

Left: the linear AE train and validation loss. Right: A plot of AE1 against AE2.

让我们创建第二个 AE,这一次我们将用一个 sigmoid 代替两个线性激活函数。这种网络结构可以被认为是具有非线性变换的 PCA,并且类似于上面的网络结构,它收敛到局部最小值,并且我们可以绘制得到的密集向量。

Left: the sigmoid-based AE train and validation loss. Right: A plot of AE1 against AE2.

我们的最后一个 AE 使用了带有 L1 正则化的 relu 激活。换句话说,我们希望通过使用具有受限表示的非线性 AE 来近似 PCA[2]。类似于先前的网络,它收敛到局部最小值,并且两个密集向量显示包含在两个斑点中的三个集群。

Left: the relu-based AE train and validation loss. Right: A plot of AE1 against AE2.

在训练所有 3 个自动编码器并通过隐藏层推送我们的训练数据后,我们比较前 2 个 PC 和 AE 的密集特征。我们可以清楚地看到,在所有模型中,这些向量中的数字并不相同。通过绘制每两个向量并观察得到的集群,这一点非常清楚。接下来,我们将比较具有 2 个和 3 个聚类的简单 KMEANS 如何对数据进行分类。

A comparison of all four plots.

我们想知道,用 KMEANS (k=2 & 3)聚类的每个结果是否可以在所有模型中相似地标记数据,即使密集范围非常不同。以下是训练集中样本的打印分类向量和指标。打印输出和度量显示,使用由不同算法创建的不同密集表示,可以找到两个相同或三个非常相似的集群。我们可以看到,当对两个斑点进行聚类时,度量分数基本相同,并且当对三个已知的花类进行聚类时,度量数字非常接近。请注意,由于神经网络的随机性,可能会出现微小的差异。

我要感谢 Natanel Davidovits 和 Gal Yona 的宝贵评论、校对和评论。

Ori Cohen 在机器学习、脑机接口和神经生物学领域获得了计算机科学博士学位。

参考资料:

[1] 在 keras 建造 AE

[2] 使用 Iris 分三步进行 PCA

[3] CSC 411:第 14 讲:主成分分析&自动编码器,第 16 页。

[4] 深度学习自动编码器教程

[5]PCA 和自动编码器有什么区别

惩罚间接推理

原文:https://towardsdatascience.com/penalized-indirect-inference-b867c13a792b?source=collection_archive---------6-----------------------

我想告诉大家我们与我的朋友和同事弗朗西斯科·布拉斯克斯合作的新出版物。我们引入一种新的估计方法叫做惩罚间接推理。我将从一个例子开始,耐心等待,开始观想。

Figure 1. Nice weather.

夏日呼吸,海鸥尖叫,夏日阳光灿烂。

假设你正坐在沙滩上,看着大海,这时有一艘船驶过。你看到它的形状和高度,认出旗帜的颜色,观察从船上掀起的波浪。你可以相当肯定地猜测这是一艘渔船还是一艘油轮,以及它来自哪里。

Figure 2. Foggy weather.

现在假设你坐在同一个海滩上,看着大海,但是你看不到大海的远处——有雾——你唯一能看到的是海浪:它们有多大,它们的形状。你注意到从你面前传来的波浪与右边 10 米处的不同,所以你决定有一艘船,但你不知道是哪一艘。如果浪小,你估计应该是渔船而不是油轮。

在第一种情况下,你根据对船的直接观察、形状、颜色和大小做出决定。在第二种情况下,你推断出船看着波浪的信息。这个例子可以帮助我们解释完全信息估计方法和有限信息估计方法的区别。

从呼吸到行动

假设我们抛硬币,想要估计正面的概率,参数 p 完全描述了抽奖的分布。一旦我们观察到多次投掷硬币,我们就可以通过最大化似然函数来估计参数 p。假设我们把硬币抛 10 次,得到 9 个头和 1 条尾巴。如果投掷是独立的,在这种情况下,可能性是观察到 9 个头和 1 个尾巴的概率,数学上是 p⁹ ×(1-p)。使该函数最大化的值 是该模型的 p 的最大似然估计。

当我们详细知道参数是如何进入数据的联合概率分布的,并且可以显式地计算出似然函数时,我们就可以通过最大化似然来估计模型的参数。这种方法利用所有的信息,并导致最精确的估计。然而,对于某些模型,很难根据这种直接信息建立估算过程。

例如,这种可能性可能无法通过分析获得。在这种情况下,我们可以采取间接的方式。如果每个参数的选择意味着均值和方差的某个值,我们可以构造一个矩估计的方法。改变对参数的猜测,并选择使观察到的力矩和理论上隐含的力矩之间的差异最小化的值。

间接推断方法可以被视为矩方法的推广,其中我们用来确定它是什么船的波不必是矩,而是任何辅助统计。此外,我们可以模拟给定参数选择的数据,并使用模拟的数据计算辅助统计,而不是从理论上计算矩。好像我们有很多资源,可以建造不同类型的船,让它们在我们身边航行,观察它们产生的波浪!所以,我们有了间接推论。

现在,假设你在一个区域,你知道某些类型的船只不能巡航,要么该区域是军用的,民用船只不能进入,要么海底太近。当你猜测你看到的是哪种类型的船时,你可能会想要使用这个信息。

这是我们论文的核心,我们引入了一个惩罚项,允许研究者对估计结果进行控制。这个想法类似于在使用贝叶斯估计方法时有一个信息丰富的先验。这在估计结构经济模型时特别有用,因为否则,参数估计很难根据基本的经济理论来解释。

我们还建立了估计量在正确和错误模型下的渐近性质,以及在强参数和弱参数识别下的渐近性质。并进行蒙特卡罗研究,揭示罚函数在形成估计量的有限样本分布中的作用。我们强调了在最新动态随机一般均衡模型的实证研究中使用该估计量的优势。

全文链接在这里,感谢我的朋友斯坦尼斯拉夫·达维多夫的插图。如果你有任何问题或想讨论论文,我很乐意讨论!

带有流失预测的人员分析

原文:https://towardsdatascience.com/people-analytics-with-attrition-predictions-12adcce9573f?source=collection_archive---------2-----------------------

Pixabay Image

每年都有许多公司雇佣许多员工。公司投入时间和金钱来培训这些员工,不仅如此,公司内部也有针对现有员工的培训计划。这些计划的目的是提高员工的工作效率。但是人力资源分析在这方面有什么用呢?而且仅仅是为了提高员工的业绩吗?

人力资源分析

人力资源分析(HR analytics)是分析领域中的一个领域,指的是将分析过程应用于组织的人力资源部门,以期提高员工绩效,从而获得更好的投资回报。人力资源分析不仅仅是收集员工效率的数据。相反,旨在通过收集数据来提供对每个流程的洞察,然后使用这些数据来做出如何改进这些流程的相关决策。

人力资源流失

人力资源流失是指员工随着时间的推移逐渐流失。一般来说,相对较高的流失率对公司来说是个问题。人力资源专业人员通常在设计公司薪酬计划、工作文化和激励系统方面发挥领导作用,帮助组织留住优秀员工。

自然减员对公司有什么影响?人力资源分析如何帮助分析流失?我们将在这里讨论第一个问题,对于第二个问题,我们将编写代码,并尝试一步一步地理解这个过程。

减员影响公司

高员工流失率的一个主要问题是它给组织带来的成本。职位发布、招聘流程、文书工作和新员工培训是失去员工和替换他们的一些常见费用。此外,定期的员工流动会阻碍您的组织随着时间的推移增加其集体知识库和经验。如果你的业务面向客户,这一点尤其重要,因为客户通常更喜欢与熟悉的人互动。如果不断有新员工加入,就更有可能出现错误和问题。

希望这些基础知识有意义。让我们继续编码,并尝试找出人力资源分析如何帮助理解自然减员。

介绍

为了开始练习,我使用了从 Kaggle 下载的 IBM HR Analytics 员工流失&性能数据集。该数据集包括诸如年龄、员工角色、日薪、工作满意度、在公司的年数、在当前角色的年数等特征。在这个练习中,我们将尝试研究导致员工流失的因素。这是一个由 IBM 数据科学家创建的虚构数据集。

让我们开始工作吧。

数据准备:加载、清理和格式化

#Load the data
hr_data = pd.read_csv("HR-Employee-Attrition.csv")
hr_data.head()

HR Data Snapshot

#Missing values check
hr_data.isnull().sum()

Missing values

幸运的是,我们没有任何缺失值,从上面的 HR 数据快照来看,我们似乎也不需要格式化数据。

数据分析

让我们看一下数据,看看这些特征是如何影响数据和员工流失的。我们需要先检查要素的数据类型,为什么?因为我们只能看到一个数据集中数值/连续值的分布。为了获取分类/对象值的峰值,我们必须将它们与数值变量绑定,然后您将能够看到它们与数据集的相关性,或者您可以用虚拟变量替换分类变量。

#Check the structure of dataset
hr_data.dtypes

Structure of HR Data

在这个练习中,我们的目标是预测员工流失,重要的是要了解哪些变量对流失的影响最大。但在此之前,我们需要知道变量是否相关如果相关,我们可能希望在建模过程中避免这些。

有许多连续变量,我们可以查看它们的分布,并创建一个配对图网格,但这将有太多的代码来查看相关性,因为有许多变量。相反,我们可以创建一个数字变量的 seaborn 热图,并查看相关性。相关性不太差的变量(即相关值趋向于 0),我们将挑选这些变量,并与它们一起前进,将留下强相关的变量(即相关值趋向于 1)。

Correlation Heatmap of HR Data(Numerical variables)

从上面的热图中,我们现在可以看出哪些变量相关性差,哪些变量相关性强。

#Let's remove the strongly correlated variables
hr_data_uc = hr_data_num[['Age','DailyRate','DistanceFromHome', 
                       'EnvironmentSatisfaction', 'HourlyRate',                     
                       'JobInvolvement', 'JobLevel',
                       'JobSatisfaction', 
                       'RelationshipSatisfaction', 
                       'StockOptionLevel',
                        'TrainingTimesLastYear']].copy()
hr_data_uc.head()

HR_Data_with_UC

停下来想一想,我们这里没有什么,两件事,一,分类变量和任何关于损耗的信息。让我们把这些和上面的数据框架结合起来。

#Copy categorical data
hr_data_cat = hr_data[['Attrition', 'BusinessTravel','Department',
                       'EducationField','Gender','JobRole',
                       'MaritalStatus',
                       'Over18', 'OverTime']].copy()
hr_data_cat.head()

HR Categorical variable

我们先用 1 和 0 代替减员中的是和否。

Num_val = {'Yes':1, 'No':0}
hr_data_cat['Attrition'] = hr_data_cat["Attrition"].apply(lambda x: Num_val[x])
hr_data_cat.head()

HR Categorical Data

现在用虚拟值替换其他分类变量。

hr_data_cat = pd.get_dummies(hr_data_cat)
hr_data_cat.head()

HR Categorical Data

现在我们已经有了数字格式的所有数据,我们现在可以组合 hr_data_num 和 hr_data_cat。

hr_data_final = pd.concat([hr_data_num, hr_data_cat], axis=1)
hr_data_final.head()

Final HR Data

数据建模

我们有了最终的数据集。我们现在必须开始建模——预测损耗。等等?你是不是也和我一样迷茫?我们已经有了流失数据,那么还能预测什么呢?在回归和分类问题中,大多数情况下,您使用可用值运行模型,并通过比较观察值和真实值来检查模型的准确性等指标。如果你没有真值,你怎么知道预测是正确的。现在你会意识到,训练数据阶段是多么重要。我们以一种可以预测(几乎)正确结果的方式训练该模型。

在这个数据集中,我们没有任何缺失的损耗值,我们将把数据分为训练和测试。我们将根据训练数据训练模型,并根据测试数据预测结果。

在这个特定的练习中,我们将使用随机森林分类器。在开始编写代码之前,让我们先了解一下 RF 分类器的背景。

随机森林分类器

弱估计量的个数组合起来形成强估计量。

随机森林的工作原理是装袋。这是决策树的集合。bagging 方法用于通过组合弱模型来增加总体结果。它是如何组合结果的?在分类问题的情况下,它采用在装袋过程中预测的类的模式。

我敢打赌,你们很多人一定在想,为什么我们选择随机森林来解决这个特殊的问题?为了回答这个问题,首先让我们来写代码。

模型建立

from sklearn.cross_validation import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_scoretarget = hr_data_final['Attrition']
features = hr_data_final.drop('Attrition', axis = 1)#create the train/test split
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.4, random_state=10)#Create the model and train
model = RandomForestClassifier()
model.fit(X_train,y_train)#predict the results for test
test_pred = model.predict(X_test)#test the accuracy
accuracy_score(y_test, test_pred)

该模型给出了 0.84 的准确度分数,不算太差。即使使用默认参数,随机森林也能很好地工作。这是我们在这个问题上使用射频的原因之一。尽管这可以通过调整随机森林分类器的超参数来改善。随机森林也不容易过拟合,因为它具有随机性。

随机森林模型的一个最好的特征是——它提供了数据/模型中变量/特征的重要性。对于这个人力资源分析问题,我们想知道哪个特性/因素对流失的影响最大,RF 的 one function 可以为我们提供这些信息。这是我们使用射频的另一个原因。

feat_importances = pd.Series(model.feature_importances_, index=features.columns)
feat_importances = feat_importances.nlargest(20)
feat_importances.plot(kind='barh')

看来月收入对员工流失的贡献最大。

摘要

在这篇文章中,我们看到了数据在人力资源部门的重要性(实际上在大多数地方都很重要)。我们看到了如何避免使用相关值,以及为什么在建模时不使用相关值很重要。我们使用了随机森林,并了解了它如何优于其他可用的机器学习算法。最重要的是,我们发现了对员工最重要的因素,如果不满足这些因素,可能会导致员工流失。

参考

  1. GitHub 回购
  2. Kaggle 数据集
  3. 人力资源流失
  4. 人力资源分析

人们在谈论“再现性危机”和“p 值”,我觉得我应该理解,但我的眼睛已经呆滞了…你能帮忙吗?

原文:https://towardsdatascience.com/people-are-talking-about-reproducibility-crises-and-p-values-and-i-feel-like-i-should-28b5d5fbe70a?source=collection_archive---------4-----------------------

我不知道回答这样的问题有多大的市场,但如果有人知道,也许我会成为数据科学领域的“亲爱的艾比”。(“亲爱的斯塔西”有些潜力。)

I’m excited to use this GIF.

撇开蹩脚的笑话不谈,让我们来谈谈这个“复制危机”或“复制危机”这是什么,我为什么要关心?

在许多科学进步中,验证研究结果的过程通常来自所谓的“同行评审过程”。

比方说,我已经开发了一种治疗关节炎的药物,我相信这种药物优于目前医生使用的药物。我召集了一群人,给他们中的一些人服用“马特的药物”,给他们中的一些人服用“目前的药物”,然后跟踪观察关节炎的影响在“马特的药物”组和“目前的药物”组之间是如何变化的。如果“马特的药物”组似乎关节炎疼痛较少,我可能会尝试公布我的结果,让每个人都知道我的药物对人们更好。

但是等等。也许你患有关节炎,或者你的伴侣或父母或朋友患有关节炎。你没有理由相信我的发现。事实上,你很可能会怀疑。你只想给你的家人和朋友最好的,但我可能想通过出售我的药物发财…所以你怎么知道我所做的是为了你和你家人的最大利益?

这就是“同行评审过程”发挥作用的地方。如果我想在医学杂志上发表我的结果,会有真正的裁判阅读我的作品,以确保我遵循了最佳实践。

Who knew that academics could be so… sporty?

这些裁判可能会问这样的问题:

  • 作者在这里是否有任何可能影响他/她写文章的利益冲突?
  • 这个实验的设计有意义吗,或者看起来这个实验不是以一种低于标准的方式设计的?
  • 分析是公平和平衡的吗,或者结果是经过精心挑选的,有利于特定的结果?

在一篇文章被“审阅”(并且可能被修改)足够多次之后,一篇文章可能会被发表,这样每个人现在都可以阅读它。读者可以继续“非正式地评审”这些文章,这样如果一篇不太完美的文章通过了评审过程,原始文章的作者或发表文章的期刊可以修改文章或完全编辑它。根据不同的杂志,真正阅读一篇文章的人数通常很少。

从理论上讲,如果我发表了结论,认为“马特的药物”明显优于现有的药物,你应该能够对一组类似的患者进行相同的研究,并得到类似的结果。(在统计学术语中,我们指的是来自同一“抽样人群的患者。))

术语“再现性危机”指的是这样一个事实,当我们试图再现实验时,我们经常观察不到相同的结果

This is a problem.

如果我用相同的设置运行两个实验,并得出两个不同的结论…这是非常有问题的。基本上,发生了两件事之一:

  • 我们最初的实验结论是错误的。
  • 我们重复实验的结论是错误的。

因为除了参与者的选择之外,没有任何东西可以区分这两个实验,所以不可能确定上面两件事情中的哪一件确实发生了。

如果一个效应不能被复制,我们现在不得不质疑我们最初的结论是否合理。如果我们不能相信最初的结论,那么那个结论和任何基于那个结论的研究现在都成了问题。

等等。所以…

没错。不幸的是,同行评议的期刊充满了我们不希望复制的结果。

那么我们能做什么呢?

嗯,我们想找到一些方法来阻止这场危机。有许多建议的方法来防止这种情况发生,但是一个非常公开的建议涉及…p-值。

WOO!

呃。马特。

我知道,我知道。跟着我。

那么,什么是 p 值呢?

超级正式地…如果我们运行一个实验,那么一个p-值是这样的概率,如果零假设为真,我们重新运行我们的实验,我们得到一个与我们在最初的实验中观察到的一样极端或者更极端的测试统计。

嗯。你能让它不那么正式吗?

假设我说,平均来说,我一周吃四个墨西哥卷饼。你觉得那是 荒谬可笑还有各种各样的事情 但是你连续十周跟着我,跟踪我吃的东西。比方说,在这十个星期里,我平均每周吃 3.5 个墨西哥卷饼。

p-值是我们说的一种方式,假设我说我平均每周吃四个墨西哥卷饼是真的,你观察了我十周,发现我平均只吃了 3.5 个卷饼,这有多极端?P 值允许我们量化我们观察到的结果(平均 3.5 个墨西哥卷饼)与我最初声称的结果(平均 4 个墨西哥卷饼)的差异。

Me eating an average of four Chipotle burritos per week is, sadly, not unrealistic.

非正式的呢?

p-数值简单地衡量实验结果的极端程度。

  • 大的 p 值意味着我们的实验结果符合我们的预期。
  • 小的 p 值意味着我们的实验结果与我们的预期大相径庭。

小 p 值用来表示实验结果在统计上是显著的,这是一个神奇的术语,我们用它来表示我们有足够的证据来对我们试图研究的东西做出一些结论。

你说的“小 p 值”或“大 p 值”是什么意思

嗯,社会需要某种方式来决定“这里有足够的证据来断定我们 相信 为真的东西实际上是真的吗?”人类非常擅长遵循明确的规则,但不太擅长仅凭“感觉”做决定。

正因为如此,我们历史上有一些阈值来规定“是的,我们的p-值足够小,可以得出结论”或“不,我们的p-值太大,不能得出这些结论。”过去,我们使用 5%作为阈值。有些字段使用不同的值,我们可以深入兔子洞讨论p——黑客和多重测试,但这超出了本文的范围。

The p-value was popularized by Ronald Fisher.

罗纳德·费雪,“现代统计学之父”(如果我的硕士论文导师算作我的学术母亲,也是我的学术高曾祖父),推广了p-值和“显著性”的 5%阈值

  • 你运行一个实验,得到 4%的 p 值。你的结果很好,你想要的结论是正确的!你要出版了!
  • 你做了一个实验,得到了 7%的 p 值。你的结果并不重要,你想要的结论一定是错的。

所以,听起来不错。有什么问题?

Cristina Yang of Grey’s Anatomy fame is always right.

嗯,两件事:

  • 首先,由于p-值如何表现,如果我们使用 5%作为这个阈值,我可以预期我将在 20 次中检测到一些重要的结果,而实际上并不是一个重要的结果。因此,如果每年有 5000 项外科研究应该有不重要的发现,并使用这 5%的阈值,我预计其中 250 项将被错误地解释为重要。如果我明天就要去做手术——无论是作为病人还是医生——这些听起来都不像是惊人的几率。**
  • 第二,p-值不能测量正确的东西。

等等。什么?!我不得不记住一些统计课的荒谬定义。我一直坚持看完这篇文章。你说费希尔是现代统计学之父“他是你奇怪的学术亲戚,他使用 p 值。你说 p 值没有测量正确的东西是什么意思?

回到我之前的墨西哥卷饼的例子,我告诉你我平均每周吃 4 个墨西哥卷饼。然后你为我写了十周的食物日记,发现我每周平均吃 3.5 个墨西哥卷饼。假设我平均每周吃 4 个卷饼,p 值量化了你碰巧看到我吃 3.5 个卷饼的可能性。

也就是说,“假设我实际上每周平均吃 4 个卷饼,你看到我在十周内平均吃 3.5 个卷饼的概率是多少?”

相反,知道这一点不是很好吗:“假设你看到我在十周内平均吃 3.5 个卷饼,那么我实际上平均每周吃 4 个卷饼的概率是多少?”

Mind blown.

看,我们认为p-值实际上类似于我们最初的结论是正确的概率,假设我们观察了一些真实世界的数据。但是p-值实际上与观察到这个真实世界数据的概率有关,假设我们最初的假设是正确的。

很多 的概率我现在隐瞒,但是 TL;DR 版本是,p-值近似 A 假设 B 为真的概率,当我们真的要评估 B 假设 A 为真的概率时。

p——价值观并不能衡量我们认为是什么。事物p-值测量和我们想要测量的事物 彼此相关 ,但它们并不相同。

Yeah, I know, there’s only one Lindsay Lohan, but Parent Trap >> Full House.

好吧。所以这似乎有点道理。那么,我们如何改变现状呢?

有很多关于如何做到这一点的建议。维基百科对改变事物的五种不同方法有一个坚实、深入的描述。

但是最近流行的一个建议是将统计显著性的标准阈值从 5%移动到 0.05%。如果我们这样做,我们将大大减少假阳性的数量。(使用上面的外科手术示例,我们预计在 5000 项研究中只会看到 2.5 项假阳性,而不是我们之前预计的 250 项假阳性。)

但是,等等,我想你说过 p 值并不能衡量我们想要它衡量的东西。

没错。没错。这改变不了事实。这是治标不治本。

有一大群非常非常聪明的人在推广这个想法。这些作者还认识到,研究人员希望使用不基于 p 值的方法(如贝叶斯因子),包括许多作者自己!作者只是认为,为那些确实依赖于 p 值的人调整这个 p 值阈值,将对这种“再现性危机”产生实质性的积极影响。

因此,周围的“假新闻”和“替代事实”会更少!

。“假新闻”和“替代事实”是人们不想面对真实事实时使用的这些荒谬的政治传播术语。我们需要尽快将它们从我们的词汇中剔除。

I really dislike Kellyanne Conway. This is not an alternative fact.

但是解决再现性危机确实保护我们不依赖于 实际上 事实上不正确的结论。

你可以在这里 查看我的其他博文 。感谢阅读!

感知器学习算法:其工作原理的图形解释

原文:https://towardsdatascience.com/perceptron-learning-algorithm-d5db0deab975?source=collection_archive---------0-----------------------

这篇文章将讨论著名的*感知机学习算法,*最初由 Frank Rosenblatt 于 1943 年提出,后来由 Minsky 和 Papert 于 1969 年完善并仔细分析。这是我之前关于麦卡洛克-皮茨神经元模型和感知器模型的帖子的后续。

引用注:本文的概念、内容和结构完全基于 IIT 马德拉斯大学教授的Mitesh Khapra讲座幻灯片和视频 CS7015:深度学习

感知器

你可以浏览我之前关于感知器模型的帖子(上面有链接),但我假设你不会。因此,感知器不是我们今天在人工神经网络或任何深度学习网络中使用的 Sigmoid 神经元。

感知器模型是比麦卡洛克-皮茨神经元更通用的计算模型。它接受一个输入,对其进行聚合(加权和),只有当聚合和大于某个阈值时才返回 1,否则返回 0。如上所示重写阈值,并使其成为具有可变权重的常量输入,我们最终会得到如下结果:

单个感知器只能用于实现线性可分的功能。它接受实数和布尔输入,并将一组权重与它们相关联,同时还有一个偏差**(我上面提到的阈值)。我们学习权重,我们得到函数。让我们用一个感知器来学习一个 OR 函数。**

或使用感知器的功能

上面所发生的是,我们基于不同输入集的 or 函数输出定义了几个条件(当输出为 1 时,加权和必须大于或等于 0),我们基于这些条件求解权重,并且我们得到了一条完美地将正输入与负输入分开的线。

没有任何意义吗?也许现在是你浏览我所说的那篇文章的时候了。Minsky 和 Papert 还提出了一种使用一组示例(数据)学习这些权重的更具原则性的方法。请注意,这不是一个乙状结肠神经元,我们不会做任何梯度下降。

热身——线性代数基础

矢量

向量可以用多种方式定义。对物理学家来说,矢量是位于空间任何地方的任何东西,有大小和方向。对于一个 CS 爱好者来说,向量只是一个用来存储一些数据的数据结构——整数、字符串等等。在本教程中,我希望你用数学家的方式想象一个矢量,其中矢量是一个箭头,它的尾部在原点,在空间中延伸。这不是描述向量的最好的数学方法,但是只要你有直觉,你就可以做得很好。

注:以下截图是我从3 blue 1 brown的视频上借来的Vectors。如果你还不知道他,请查看他的系列文章微积分 。当谈到数学可视化时,他简直不可思议。****

矢量表示法

二维向量可以在 2D 平面上表示如下:

Source: 3Blue1Brown’s video on Vectors

将这一思想推进到 3 维,我们在 3 维空间中得到如下箭头:

Source: 3Blue1Brown’s video on Vectors

两个向量的点积

以使本教程更加枯燥为代价,让我们看看什么是点积。假设你有两个向量 oh size n+1wx ,这些向量的点积( w.x )可以计算如下:

The transpose is just to write it in a matrix multiplication form.

在这里, wx 只是一个 n+1 维空间中的两个孤独的箭头(直观地说,它们的点积量化了一个向量向另一个向量的方向移动了多少)。所以从技术上讲,感知器只是在计算一个蹩脚的点积(在检查它是大于还是小于 0 之前)。感知器给出的区分正例与反例的判定边界线实际上就是 w . x = 0。

两个向量之间的角度

现在,如果你知道向量之间的角度和它们各自的大小,同样的点积可以用不同的方法计算。方法如下:

反过来,你可以得到两个向量之间的角度,只要你知道向量,只要你知道如何计算向量的大小和它们的点积。

当我说 wx 的夹角余弦为 0 时,你看到了什么?我看到箭头 w 垂直于箭头 x 在一个 n+1 维空间(说实话在 2 维空间)。所以基本上,当两个向量的点积为 0 时,它们是互相垂直的。

设置问题

我们将使用一个感知器来估计我是否会根据上述输入的历史数据来观看电影。数据有正反两个例子,正的是我看的电影即 1。基于这些数据,我们将使用感知器学习算法来学习权重。为了视觉上的简单,我们将只假设二维输入。

感知机学习算法

我们的目标是找到能够完美分类我们数据中的正输入和负输入的 w 向量。我将直接进入算法。这是:

我们用一些随机向量初始化 w 。然后我们迭代数据中的所有例子,( P U N )包括正面和负面的例子。现在,如果一个输入 x 属于 P ,理想情况下,点积 w.x 应该是多少?我会说大于或等于 0,因为这是我们的感知机在一天结束时唯一想要的,所以让我们给它。而如果 x 属于 N ,那么点积必须小于 0。因此,如果您查看 while 循环中的 if 条件:

情况 1:x 属于 P 及其点积w . x0
情况 2:x 属于 N 及其点积 w.x ≥ 0

只有在这些情况下,我们才更新随机初始化的 w 。否则,我们根本不接触 w ,因为案例 1 和案例 2 违反了感知器的规则。所以我们在例 1 中把 x 加到 w (咳咳矢量相加咳咳),在例 2 中把 w 减去 x

为什么指定的更新规则会起作用?

但是为什么会这样呢?如果你已经明白了为什么会这样,你就明白了我这篇文章的全部主旨,现在你可以继续你的生活了,谢谢你的阅读,再见。但是如果你不确定为什么这些看似任意的 xxw 的运算会帮助你学习到完美的 w 可以完美的分类 PN ,请继续使用我的方法。

我们已经建立了当 x 属于 P 时,我们要w . x0,基本感知器法则。我们这样说也是指当 x 属于 P 时, wx 之间的角度应大于 90 度。填空。

答: wx 之间的角度应该小于 90°,因为角度的余弦与点积成正比。

所以不管 w 向量可能是什么,只要它与正例数据向量( x E P )的角度小于 90 度,与负例数据向量( x E N )的角度大于 90 度,我们就没事了。理想情况下,它应该是这样的:

x_0 is always 1 so we ignore it for now.

所以我们现在强烈认为当 x 属于 P 类时 wx 之间的角度应该小于 90°,当 x 属于 N 类时它们之间的角度应该大于 90°。停下来,说服你自己,上面的陈述是真实的,你确实相信它们。这就是为什么这一更新有效的原因:

Now this is slightly inaccurate but it is okay to get the intuition.

因此,当我们将 xw 相加时,当 x 属于 P 并且w . x0(情况 1)时,我们实际上是增加 cos(alpha)** 值,这意味着减少 alpha,即 wx之间的角度类似的直觉也适用于 x 属于 Nw.x ≥ 0 的情况(情况 2)。**

这里有一个玩具模拟,模拟了我们最终可能如何学习正面例子中小于 90 度的角度和负面例子中大于 90 度的角度。

We start with a random vector w.

收敛性的证明

现在,你没有理由相信这一定会收敛于所有类型的数据集。看起来可能会有这样的情况,w 继续四处移动,永远不会收敛。但是人们已经证明了这个算法是收敛的。我附上哥伦比亚大学的迈克尔·柯林斯教授的证明— 在这里找到论文。

结论

在这篇文章中,我们快速地看了一下什么是感知机。然后我们用线性代数的一些基础知识热身。然后我们看了一下感知器学习算法,然后继续想象它为什么工作,即如何学习适当的权重。

感谢你阅读这篇文章。自己活也让别人活!

Photo by Roman Mager on Unsplash