TowardsDataScience-博客中文翻译-2019-九-
TowardsDataScience 博客中文翻译 2019(九)
ARIMA 模型与图灵. jl
使用概率编程语言(PPL) Turing.jl 进行时间序列分析和预测。茱莉亚的实现可以在这里 (Jupyter 笔记本)或者这里(。jl 文件)。

Time Series Models often have useful applications in the field of finance; Photo by Markus Spiske on Unsplash
你好!
本文是我在 Julia Season of 投稿(JSoC) 2019 中完成的工作的一部分。它使用概率编程语言(PPL) Turing.jl 描述了 ARIMA 模型的 Julia 实现,这为定义概率模型提供了极大的便利。当我们在本文后面查看模型定义时,图灵的这一方面将变得更加明显。此外,图灵支持使用定制分布来指定模型。
好吧,那我们就直入主题吧!
导入库
加载和可视化数据集
我们将使用包含 1995 年至 2015 年标准普尔 500 调整后收盘值的数据集,每月一次。数据集可以从这里(麻省理工学院许可)下载。
运行上面的代码后获得了下面的图。这就是我们的数据看起来的样子,绘制了每个时间指数的值:

Complete Data
我们将数据分为训练集和测试集,将 95%的数据作为训练集:

Train Data
检查稳定性
从图中我们可以看出,这个数列的平均值在接近尾声时上升。所以,级数不是平稳的。这通过针对平稳性的增强 Dickey-Fuller (ADF)测试得到了加强:

ADF test before differencing
因此,我们对时间序列进行差分,试图消除平稳性:

Plot of the differenced time series
这个数列似乎有一个大致不变的平均值,尽管这并不一定意味着这个数列是平稳的。我们再次使用 ADF 测试:

ADF test after differencing
成功!由于 p 值很低,我们可以有把握地假设这个序列是平稳的。借助于 ACF 和 PACF 图,我们现在可以继续为我们的差分时间序列选择 AR 和 MA 项。
借助 ACF 和 PACF 图选择 MA 和 AR 术语
为我们的训练数据获得的 ACF 和 PACF 图如下所示:
这些图可以用以下方式来解释:
- 我们可以有一个一阶自回归项,因为在滞后 1 处有正自相关。
- PACF 曲线逐渐衰减,ACF 曲线在几个滞后之后突然截止。这表明移动平均项的存在。这一项的顺序应该是 1,因为所有大于 1 的滞后没有显著的相关性。
在 ARIMA 模型中同时包含 AR 和 MA 术语并不常见。所以,我们不会考虑这种情况。从以上两点来看,似乎模型更有可能存在移动平均项。然而,我们将考虑 ARIMA 模型的两种可能情况:
- ARIMA(1,1,0)
- ARIMA(0,1,1)
ARIMA(p,d,q) 模型的符号定义如下:
- p:自回归项的个数
- 问:移动平均线的条数
- 差分的顺序
我们实现了这两种情况,并使用赤池信息标准(AIC)对模型进行了比较。这个网页作为定义下面的 ARIMA(1,1,0) 和 ARIMA(0,1,1) 模型的参考。
ARIMA(1,1,0)
ARIMA(1,1,0) 模型定义如下:
[@model](http://twitter.com/model) ARIMA110(x) = begin
T = length(x)
μ ~ Uniform(-10, 10)
ϕ ~ Uniform(-1, 1)
for t in 3:T
val = μ + # Drift term.
x[t-1] + # ARIMA(0,1,0) portion.
ϕ * (x[t-1] - x[t-2]) # ARIMA(1,0,0) portion.
x[t] ~ Normal(val, 1)
end
end
这里, x 是原始时间序列,因为我们已经考虑了模型定义本身的差异。注意,我们将有一个自回归项,因为 p = 1。
ARIMA(0,1,1)
ARIMA(1,1,0) 模型定义如下:
[@model](http://twitter.com/model) ARIMA011(x) = begin
T = length(x) # Set up error vector.
ϵ = Vector(undef, T)
x_hat = Vector(undef, T) θ ~ Uniform(-5, 5) # Treat the first x_hat as a parameter to estimate.
x_hat[1] ~ Normal(0, 1)
ϵ[1] = x[1] - x_hat[1] for t in 2:T
# Predicted value for x.
x_hat[t] = x[t-1] - θ * ϵ[t-1]
# Calculate observed error.
ϵ[t] = x[t] - x_hat[t]
# Observe likelihood.
x[t] ~ Normal(x_hat[t], 1)
end
end
与前面的模型定义一样, x 是原始时间序列。注意,我们将有一个移动平均项,因为 q = 1。
这里要注意的一点是,用图灵编写的代码与写在纸上的代码在本质上是一样的。从上面的模型定义中可以明显看出这一点,只要看一下代码就可以理解这些模型定义。
抽样
使用螺母取样器对链条进行取样。你可以查看文档来了解更多关于 NUTS 和图灵支持的其他几个采样器的信息。用于采样的代码如下:
要获得参数的可视化和汇总统计数据,您可以查看代码这里 (Jupyter 笔记本)或这里(。jl 文件)。
比较 AIC 值
阿凯克信息标准(AIC)衡量不同统计模型的相对“良好性”。因此,它可以用于模型比较的目的。AIC 值越低,模型越好。此外,人们必须记住,AIC 的绝对值并没有多大意义,相对值才是重要的。数学上,AIC 由下式给出:

Formula for AIC
使用这个公式,我们可以计算两个模型的 AIC 值。该 PDF 已被用作计算两个模型的 AIC 值的参考。
- ARIMA(1,1,0)
function calculate_aic_ARIMA110(β::Float64, μ:: Float64, σ::Float64, s::Array{Float64, 1})
T = length(s)
ϵ = Vector(undef, T)
s_pred = Vector(undef, T)
s_pred[1], s_pred[2] = s[1], s[2]
ϵ[1], ϵ[2] = 0.0, 0.0
for t in 3:T
s_pred[t] = μ +
s_pred[t-1] +
β * (s_pred[t-1] - s_pred[t-2])
ϵ[t] = s_pred[t] - s[t]
end
log_likelihood = (-(T - 1)/2)*2*π*σ^2 - (1/σ^2)*sum(ϵ.^2)
- π*σ^2/(1 - β^2) - ((s[1] - μ/(1 - β))^2)/(2*σ^2/(1 - β^2))
aic = -2*log_likelihood + 2
return aic
end
使用此函数,我们得到 ARIMA(1,1,0)的 AIC 值约为-299655.26
- ARIMA(0,1,1)
function calculate_aic_ARIMA011(β::Float64, σ::Float64, s::Array{Float64, 1})
T = length(s) ϵ = Vector(undef, T)
s_pred = Vector(undef, T) s_pred[1] = s[1]
ϵ[1] = 0.0
for t in 2:T
s_pred[t] = s[t-1] - β * ϵ[t-1]
ϵ[t] = s[t] - s_pred[t]
end
log_likelihood = -(T/2)*log(2*π) - (T/2)*log(σ^2) + (1/2*σ^2)*sum(ϵ.^2)
aic = -2*log_likelihood + 1
return aic
end
使用此函数,我们得到 ARIMA(1,1,0)的 AIC 值约为 6.22 x 10⁷.
显然,我们可以看到 ARIMA(0,1,1)模型更好。
我用 Turing.jl 写的关于 ARIMA 模型的文章到此结束,希望你会觉得有趣。如果你对这篇文章有任何问题或疑问,请随时联系我,邮箱是 s shah@iitk.ac.in,或者你可以在 Julia slack 上用@Saumya Shah 给我加标签。
参考
[1]ARIMA 模型介绍。(2019).检索于 2019 年 8 月 26 日,来自https://people.duke.edu/~rnau/411arim.htm
[2]托马斯·s .(2009 年)。估计 AR/MA 模型【电子书】。检索自http://www . igi dr . AC . in/faculty/susant/TEACHING/TSA/print 06 . pdf
ARIMA 简体。
对最流行的时间序列预测模型的简单解释
背景
时间序列预测背后的基本直觉是,某个时间段内某个变量的度量将取决于前一个时间段、前两个时间段、前三个时间段等同一变量的度量。
时间序列预测在许多预测问题(尤其是在商业领域)中都有应用,而 ARIMA 是最好的起点之一!
本文的目标是突出这个模型背后的构建模块(即 AR 、 I 和MA】)和底层概念(即自相关和部分自相关 ) 。
相关和滞后因子
让我们考虑一个在任何特定的一天,比如说星期天,预测汽油价格的例子。显而易见,周日的价格将取决于周六的价格。
现在让我们考虑一下周五的价格对周日价格的影响

由于周日的价格取决于周六的 (2) ,而周六的价格又取决于周五的 (1) ,周五的价格和周日的价格之间可能存在间接传递关系。
上述关系如下图所示。

Auto-correlation
除此之外,还有一个关系可能一开始很难想象,即周五的价格对周日价格的直接影响 (3) 。
这里日价格之间的这种相互关系,就叫做。如果两个变量的值一起增加(或减少),那么就说它们有正相关性。如果一个变量的值增加而另一个减少(反之亦然),那么它们有一个负相关性。**
相关性是时间序列的一个重要概念,
- 自相关,同时考虑直接和间接效应的**(如上图所示),
- 部分自相关,仅考虑的直接影响,如下图所示

Partial auto-correlation
滞后因素
因为我们已经考虑了基于前两天(即周五)价格的周日价格的影响…这里的滞后因子是 2。

Lag factor concept
自相关和部分自相关*在继续学习 ARIMA 之前理解很重要,因为它们对于为你的模型选择正确的参数至关重要。你可以在这里找到一个很好的解释。*
自回归(AR)
自回归(AR)模型是一种特殊类型的回归模型,其中因变量依赖于自身的过去值。
这必然意味着当前值与先前时间步骤中的值相关。更具体地说,这里的相关类型是部分自相关。
AR 模型的方程式如下所示

AR equation
相应滞后观测值的相应权重(ф1,ф2…фp)由滞后观测值和当前观测值之间的相关性决定。如果相关性越大,对应于滞后观察的权重越高(反之亦然)。
注意等式中的 (p)
这个 (p) 叫做滞后阶。它代表我们在模型中包括的先前滞后观察的数量,即与当前观察有显著相关性的滞后的数量。
移动平均线
移动平均(MA)模型的工作原理是分析你在预测前一个时间段的值时的错误程度,从而对当前时间段做出更好的估计。
基本上,这个模型考虑了滞后观测的误差。这些先前(滞后)观测误差对当前观测的影响取决于它们之间的自相关。这在某种意义上类似于考虑部分自相关的 ar 模型。

MA equation
ε项表示在相应滞后处观察到的误差,权重(ω1,ω2 …ωq)根据相关性进行统计计算。
注意等式中的(q)…
(q) 表示移动窗口的大小,即对当前观测有重大影响的滞后观测误差的数量。它类似于滞后顺序 (p) ,但是它考虑的是误差而不是观测值本身。
MA 模型补充了 AR 模型,考虑了以前时间段的误差,从而有助于获得更好的估计。
当我们结合 AR 和 MA 等式时,我们得到

Combined equation for ARMA
平稳性
到目前为止,我们讨论的模型(ar 和 MA)都假设序列是平稳的。这也意味着【平稳性】是利用这些模型进行任何时间序列的必要条件。
但是…什么是平稳性?
基本上,一个时间序列要成为平稳,应该满足以下三个条件…
在大多数情况下,通过研究相对于时间的曲线,可以直观地分析这些条件。
你会遇到许多显然不是平稳的数列。
这是否意味着预测不能应用于这些情况?
嗯…这就是子缩写 I 的由来…
综合(一)
比方说,你遇到一个具有“非常数”平均值的数列。可以清楚地观察到,平均值随着时间的推移而增加,即序列不是稳定的。**

Amazon stock value over time
如果我们能以某种方式消除这种上升趋势,我们就可以走了。
一种方法是考虑连续时间步长之间的差异。这相当于执行形式的转换…

Transformation
应用这种变换,我们得到了具有可观测的常数平均值的下列趋势。标准差也是恒定的,季节性不存在,即该系列现在是稳定的。**

Transformation applied
I 代表集成* (虽然与集成无关)。这只是意味着,我们不是预测时间序列本身,而是预测序列从一个时间步到下一个时间步的差异。*
注意,这里我们采用了一阶差分,即连续项差分的单个相位。这可以多次进行以使系列静止。

这个差分顺序(d)是 ARIMA 的一个重要参数,决定了模型的成功与否****
因此,为了修正,最终的 ARIMA 模型将采取以下形式。

外卖食品
ARIMA 由于其简单性和对非平稳序列的泛化能力,是一种广泛使用的预测模型。
尽管如此,了解什么时候使用 ARIMA,什么时候不使用它是很重要的。ARIMA 不适用于季节性的数据。比如农作物产量预测或者人造圣诞树的销售!
在这些情况下,最好使用季节性 ARIMA。
用直观的可视化解释搜索算法的基础

本文比较了应用于 85 个城市的旅行商问题的几种搜索算法。目标是向刚接触优化主题的人展示一些众所周知且有效的搜索算法背后的直觉。我选择构建不太复杂的算法,并试图将它们描述得尽可能容易理解。如果你感兴趣,你可以使用提供的 R 代码自己运行它们或者创建你自己的修改(向下滚动链接)。
旅行推销员问题
给定一组城市以及每对城市之间的旅行成本,旅行推销员问题(TSP)就是找到一种最便宜的方式来访问所有城市并返回起点。问题陈述的简单性是欺骗性的;TSP 是计算数学中研究最深入的问题之一。对于这个项目,“成本”被定义为两个城市之间的直接距离(即欧几里德距离),单位为千米。
资料组
根据 2006 年的统计,需要访问的 85 个城市都是全球人口超过 100 万的首都城市。今天可能会有更多人口超过 100 万的首都城市,但这与优化问题本身无关。我为美国首都(华盛顿)、加拿大首都(渥太华)和荷兰首都(阿姆斯特丹)开了一个例外。他们在 2006 年没有超过 100 万的居民,但我还是添加了他们,只是为了好玩。该数据集是从一个源文件构建的,该文件可以在 R 的“地图”包中免费获得,包含超过 40,000 个城市的信息。当然,我们所有的路线都从阿姆斯特丹开始。

方法
一种方法是计算所有可能的路线并选择最佳路线。对于这个有 85 个城市的 TSP 的例子,可能的解的数目是 1.65712e+126,或者 16571200672826435296943171271229587838132927197483106469639871841941940477704。这比宇宙中的恒星数量还要多(来源,或者撒哈拉沙漠中的沙粒数量还要多(来源)。使用这种方法需要很多年和一台量子计算机来解决这个问题。因为我两者都没有,所以这种方法是不可行的。
另一种方法是使用精确的算法,如分支定界法或单纯形法。这些都是非常稳健的方法,将为高达+/-200(在普通 PC 上)的 TSP 问题找到最佳解决方案。然而,以一种直观的方式将这些可视化是具有挑战性的,如果不是不可能的话。由于这个项目的主要目标是向刚接触这个主题的人展示算法的直觉,这些是不合适的。此外,这些方法不能很好地扩展,因此将它们应用到更多的城市(源文件总共包含 40.000 个城市)是不可行的。因此,玩大型游戏的机会就少了。
相反,我使用了另一种强有力的方法来解决这个问题:搜索试探法。这些方法的优点是,您可以保持它们相对简单和直观,同时它们仍然可以找到(接近)最优的解决方案。此外,它们的伸缩性更好,因此将它们应用于更大的 TSP 将更不容易使您的机器崩溃。缺点是你不知道你离最优值有多远。我使用的搜索试探法是最近邻、随机最近邻和(重复)2-Opt。正如我将向你展示的,这些方法相对简单,但也非常有效和直观,尤其是结合使用时。
最近的邻居
最近邻居(NN)是最简单的搜索试探法之一。它是建设性搜索试探法家族的一部分,这意味着它会逐渐建立一条路线。从一个城市开始,仅在访问完所有城市后停止。它本性贪婪;在每一步中,它选择离当前位置最近的位置。

Nearest Neighbours
应用于我们的问题,我们找到一条总距离为 112.881 KM 的路线。每次我们运行算法,都会产生完全相同的解。这看起来让人放心,但这也是这种算法的一大缺点。由于其贪婪的本性,它总是追求眼前的利益,错过了在更长时间内会有回报的机会。NN 给了我们一个可行的解决方案,第一次尝试看起来一点也不差。但是我们能进一步改进它吗?
具有 2-Opt 的最近邻
2-Opt 是来自局部搜索家族的算法。这些算法从初始解开始,迭代地在该解的邻域中寻找改进机会。这个初始解可以是任何类型的解,只要它是可行的。例如,像 NN 这样的构造性算法的结果或者从专家知识构建的解决方案。
2-opt 算法的工作方式如下:从路径中提取两条弧线,将这些弧线重新连接起来,然后计算新的行驶距离。如果此修改导致总行驶距离缩短,则更新当前路线。该算法继续建立在改进的路线上,并重复这些步骤。重复该过程,直到没有发现更多的改进,或者直到完成了预定次数的迭代(在该实现中为 100 次)。
比如,让我们走以下路线:阿姆斯特丹—布鲁塞尔—巴黎—柏林—哥本哈根—赫尔辛基—伦敦—阿姆斯特丹。一个拱门可能是布鲁塞尔-巴黎,另一个可能是哥本哈根-赫尔辛基。2-Opt 交换这些拱门中的连接,即现在的路线从布鲁塞尔-哥本哈根和从巴黎-赫尔辛基运行。
- 目前航线:阿姆斯特丹—布鲁塞尔—巴黎—柏林—哥本哈根—赫尔辛基—伦敦—阿姆斯特丹
- 修改后的航线:阿姆斯特丹—布鲁塞尔—哥本哈根—柏林—巴黎—赫尔辛基—伦敦—阿姆斯特丹

Nearest Neighbours with 2-Opt
为了方便起见,这个可视化只显示了一次迭代(即阿姆斯特丹-布鲁塞尔弧线),但是在我的实现中可能有多达 700,000 次这样的迭代。因此,对于一个小的实例,最终的解决方案可能看起来与初始的解决方案非常不同。NN + 2-Opt 找到的最终解是 99.242 KM。万岁!我们改进了我们的旅行!
随机最近邻
虽然 2-Opt 能够改善我们的游览,NN 扩展的最初的缺点仍然存在。我们可能仍然只是在改进一个局部最优的解决方案,而永远无法利用大的长期改进机会。为了增加我们“偶然发现”其中一个重大改进机会的机会,我们需要多样化我们最初的开始解决方案。这意味着我们可能会提出最初看起来“愚蠢”的初步解决方案,但实际上是伟大事业的基石。
这就是随机最近邻算法(RNN,不要被误认为是递归神经网络)发挥作用的地方。与常规 NN 算法的唯一区别是,它不是完全“贪婪的”,因为在构建路线的每一步,它都会考虑多个候选项(在我的实现中是 3 个最短距离选项)并随机选择 1 个。您可以通过增加或减少候选项的数量来调整算法的“贪婪性”。不太贪婪的算法会在生成的路由中产生更多的差异。

Randomized Nearest Neighbours
当应用到我们的问题时,最终的解决方案几乎增加了一倍的旅行距离,194.936 公里,而且情节看起来非常混乱。但是等等!先不要把你的电脑扔出窗外。由于我们算法中的随机性(即它的随机性质),这可能只是运气不好。或者我们可能非常幸运,它可能被证明是本地搜索的一个极好的构建块…让我们调查一下!
具有 2-Opt 的随机最近邻
接下来,我们将 2-Opt 应用于 RNN 的最终解决方案,看看它实际上是否是伪装成怪物的天才积木。

Randomized Nearest Neighbours with 2-Opt
是啊!!!2-Opt 将我们开始时的这条丑陋的东西变成了一条只有 99.430 公里的美丽的新路线。这几乎就像一个童话故事…但是等等,我们还没有去酒吧庆祝。这条路线比从 NN+2op 开始的路线稍长,所以我们有更多的工作要做。
RNN 的随机结果给了我们一个很好的工作基础。但是,如果有更好的积木呢?由于这一过程的随机性,每次重复都会产生不同的结果,即不同的开始路线。如果我们重复这个过程很多次呢?也许我们会偶然发现一个更好的积木!
具有 2-Opt 的重复随机最近邻
该算法多次运行 RNN 算法,并对每个结果应用 2-Opt。通过一遍又一遍地重复这个过程,我们正在探索许多不同的初始解决方案的邻域。这样做,我们大大扩大了搜索范围,我们有更好的机会找到局部和全局最优解。在我的实现中,我重复这个过程 100 次,以确保 GIF 不会变得太大。

Repeated Randomized Nearest Neighbours with 2-Opt
哇!应用这种算法组合,我们目前的最佳总旅行距离减少了 10%!总行驶距离现在是 90.414 公里。现在是庆祝的时候了。这个算法已经能够在我们之前的最佳路线上找到 8 个改进。通过在探索的初始解中引入方差,我们能够探索许多不同的解,并迭代地改进它们。这样做,我们可以覆盖很多领域,也可以探索最初看起来不太有希望的解决方案。该算法从非常静态、贪婪和没有灵感的东西变成了能够调查许多选项并为问题生成创造性解决方案的东西。

Total distance for each iteration
最后的改进是在第 90 次迭代中发现的,所以在下一次运行中增加迭代次数是值得的。
结论
优化问题看似简单,但实际上往往非常复杂,并且有大量的潜在解决方案。解决这些问题可以用精确的方法,但这些方法通常需要时间和大量的计算能力,尤其是较大的优化问题通常太复杂而难以解决。但是,运用常识和一些创造力,我们可以构建需要更少处理能力并且可以执行得非常好的算法。事实上,如果时间有限,这些解决方案甚至可以优于精确的方法。我希望这篇文章能帮助不熟悉优化的人对算法如何工作产生一些直觉,并感受到它们巨大的潜力。

Result of each algorithm applied to TSP instance
Mikko Venhuis
自己运行代码:【https://github.com/Mik3000/SearchAlgorithms】T2
我没有时间去做但已经在我的待办事项清单上的事情
- 使用 Gurobi 生成该问题的最优解
- 制作区域版本。例如,游览欧洲所有的首都城市
- 应用替代搜索试探法,如遗传算法、模拟退火或禁忌搜索
如果您想了解更多信息:
艺术育种家。给我画一只电动羊。
如何以用户友好的方式应用生成式对抗网络?

N 没有什么是原创的。然而一切都是。早在二十世纪初,达达主义者、超现实主义者、以及后来的默茨艺术家库尔特·施威特斯就已经探索了这个事实。他们将发现的材料混合到新的拼贴画和 3D 组合中。无数现实的无数碎片变成了无数新的幻象。
与人工智能同时代的实验结出了类似的美丽果实。你可能会意识到新作品背后的互文性,但它们就在这里——给你的新世界。最初开始于 的谷歌深度梦境 变成了机器人梦境的多面可视化。
我们现在可以看到人工智能对电羊、世界和其他事物的梦想了。
去年,我写了一篇关于 GANbreeder 的文章,这是乔尔·西蒙和 http://www.joelsimon.net/的申请。一个用户友好的 BigGAN 模型集,在 ImageNet、Kaggle 集和其他可视化数据库上进行了预训练。数据可视化的大众化和民主化。它允许从现有的 DNA 生成视觉杰作——在与其他用户/艺术家/观众的协作过程中,即使没有详细的数据科学知识(不是每个艺术家都会 Python )。
乔尔的最新项目将带你进入人工智能作品的下一个维度。令人惊叹:
艺术育种家
让我们参观 Android Dreams。
目前有五个板块:普通、人像、相册、风景、和动漫人像。(该项目正在开发中,因此新的模型和功能一直在出现)。

让我们在这本全面的艺术育种指南中探索所有的模型

Portraits (random selection)
画像
谷歌大脑的研究人员科学家 Ian Goodfellow 提到了人工智能在人脸生成方面的巨大飞跃:
当 2014 年人工智能生成的脸看起来仍然几乎像一张 pareidolia Mars 脸时,2018 年已经是照片逼真的假脸生成的突破(提醒一下病毒页面ThisPersonDoesnotExist.com用 StyleGAN 生成的绝对惊人的结果)。

现在你可以自己做了。在肖像部分,你会发现四个功能:
- 随机。
显示的是已经生成的随机画像。你可以拿起它们并修改它们。 - 混合图像
将现有的肖像和基因交叉——生成全新的人物角色。 - 上传上传
比较新的功能——你可以上传图片来操控它们。 - 制作简短的变形视频。
创作肖像。
因此,让我们从现有的肖像集创建一个新的人。选择“随机”会将您带到“Artbreeder”中现有图像的列表:

Fig 1: Random browse
正如你所看到的,不仅照片真实感的脸可用,而且风格不同的模型。 StyleGAN 在这里以最佳方式展示风格转移。让我们选择戴眼镜的男性。

Fig 2: Children
你在这里看到的是最初的一组可能性。右上角是实际的修改面板
- 儿童
- 杂交的
- 编辑-基因
下面你可以看到不同用户已经生成的图像。
所有图像特征都是神经网络层,你可以主动或随机改变。
儿童
这种修改方法是您最不能控制的方法。你能做的一切就是改变相似性与差异的百分比。定义的不同图像越多,得到的不同结果就越多(图 2) 。当图片几乎符合您的预期时,您可以对其进行微调。
杂交的

Fig 3: Crossbreed
经典的风格转移模式。您选择另一个图像(存在于 Artbreeder 中)作为目标(或源,视情况而定)——通过修改面和样式参数,您可以在两个选择的图像之间转换样式。因此您可以合并图片或更改它们的样式。
编辑-基因

Fig 4: Edit-Genes
最有效的修改方式:通过主动改变每一层的百分比,你可以直接改变特定的功能。在图 4 中。你可以看到之前的男性戴眼镜者(T1)的肖像,但是通过变换层次(T2、年龄、T4、眼镜、性别),几乎完全不同的图像出现了。参数 Concept_art 是一个隐藏的样式传输层从照片级逼真图像切换到手绘草图或绘画。
血统
图像下的第二个图标是血统。它显示了肖像的“系谱树”:

Fig 5: Lineage
在我们的例子中,它是一个简短的家谱。你还会在 Artbreeder 中发现经过反复修改的图片,故事很长。

Fig 6. Sample for big-scale lineage
上传
这是一个新功能,它使艺术培育者更像是一个艺术实验室。它不再是纯粹的甘农场了。它的意思是:你可以上传你的图片。它们可能被敌对的网络以这样或那样的方式处理和改变。有时候并不像你想象的那样。
例如,上传这张著名的前卫派达达派【汉斯·阿尔普】(用一张纸碟遮住左眼)的肖像,在 发生器和 鉴别器的相互作用中,引起甘的“纠正”——恢复他看不见的眼睛(改变凝视):
这是与现实世界的实际交集(涉及版权、数据隐私等所有问题)。—用户要明智使用)。然后就是使用期限,当然。
如果你把上面汉斯·阿尔普肖像的风格转移到我的照片上,就会发生这种情况:

Fig 6. (Crossbreed with uploaded image: Vladimir Alexeev + Hans Arp)
或者我和克劳斯·诺米的风格转换:

Fig 7. (Crossbreed with uploaded image: Vladimir Alexeev + Klaus Nomi)
上传功能极大地增加了可能性。
动画
静态图像生成的重要补充。选择关键帧(现有的肖像)——AI 会以一种近乎神奇的方式生成图像之间的过渡。您可以选择持续时间以及过渡模式。

Fig 8. (Keyframes)
这个关键帧序列产生引人入胜的镜头:
您可以注意到关键帧之间的各种风格转换,非常奇怪。
通用模式

General
这是前ganbreader(也由 Joel Simon 制作)背后的实际核心——经过打磨并与新模型一起运行。在这里你可以生成很多东西。
还记得,回到 2018 年,和比根的大突破?你可以给基于 Tensorflow 的 GAN 模型一个任务来生成一个特定的主题——结果已经令人信服了(用 Colab 笔记本 试试看)。
使用 Artbreeder,您可以从头开始生成世界。

像肖像画一样,这里有以下功能:
- 随机。
显示随机已经生成的图像。你可以拿起来修改。 - 混合图像
跨越现有的肖像和基因——生成全新的视觉效果。 - Mix-Genes
组合特定的语义网络层(基因) - 制作动画
制作简短的变形视频。
溜进随机大概最多把你搞糊涂。除了面孔,你会在这里找到所有可能的嵌合体、幻影和无法解释的视觉效果。

Fig 9. Random images from General Topic
这里的修改功能类似于生成肖像。
突出的例外是“编辑基因”。

Fig 10. Edit-Genes in General.
正如你所看到的,这里的图层不像肖像中那样表现面部特征——它们更像是表现主题,几乎是柏拉图式的精神境界。这些“基因”是来自 BigGAN 中的“类别条件采样”的“类别”:视觉数据库的主题,它们被标记并用于训练。
在图 10 中,你可以观察到哪些类别是视觉效果的基础(以及比例):漫画、爱斯基摩犬、宫殿等。
我们甚至可以在这里讲述图像的语义词源。
这种变革性的艺术一代是一种真正重新描绘我们现实的新方式。所以让我们在下一个函数中从头开始创建一个新的图像。
混合基因
首先,你需要选择一个基因(一个标记层,BigGAN 内部的一个神经网络突触):

Fig 11. Select a gene
这是一个隐藏了内容列表的类别库。让我们选择 架构 作为我们的第一个基因。

Fig 12. Gene “Architecture”
正如您所看到的,这是一项仔细的标记工作(并非总是如此)。BigGAN 在同一类别的无数图像上进行了训练,因此选择一个基因可以产生同一主题的非常不同的图像。所以让我们把“种姓作为第一个基因——第二个基因将来自于“类器具。

Fig 13. Select a gene
现在你明白我说的标注的意思了吧。总是一个人的因素。来自 ImageNet (以及很多其他图像数据库)的图像被人们贴上标签,有时对其目的没有一个清晰的概念。这里被标为的乐器实际上在大多数情况下是一个人在演奏这个乐器。其含义是显而易见的——它将产生人类,而不是物体。对于弱人工智能来说,一切都是关于要定义的模式。
但是现在让我们把“城堡”和“机关”结合起来:

Fig 14. General results (you can change the intensity of a gene with slider)
两者——城堡和机关——都是可以辨认的,即使人们无法区分里面和外面。相当梦幻的意象。当你醒来并试图回忆最近的梦时,你知道这种感觉——画面在互换、变形、消失、滑动。迷惑你的大脑,试图找到最简单的概念。
动画
几乎和肖像画一样——结果是压倒性的。同样,这就像一个梦的可视化,只是在这种情况下,你甚至可以看到——或暂停——视频,这不会帮助你的意识更好地识别。
以下是一般动画的示例:
相册

Album mode
10.000 专辑封面是用于在“专辑”部分训练神经网络的数据库。
这是非常特别的东西——不同于肖像或一般的,相册是文本、布局和图像的模拟混合。远的是人工通用智能的时代。我们仍在与弱人工智能(T21)合作——文本背后的语义丢失了。这是一种通过计算来重建文本的尝试。

与以前的模型类似,我们在这里有以下功能:
- 随机。
浏览随机生成的相册图片。 - Mix-Images
跨越现有相册,生成全新的视觉效果。 - 制作短片和变形视频。
记住,这里的“字体”和“字迹”属于构图。它不能作为层单独修改。
这与其说是理解,不如说是美感。
风格、图案和标识的多样性激发了更多灵感。
风景

Landscapes
这一部分展示了神经网络在无数图像上的训练是多么完美。在这种情况下——风景基本上是完美的。或者可能是我们的感知——我们的大脑在自然意象上比在其他动机上受到更好的训练。因此,我们没有意识到现有的故障或视觉错误,因为我们的感知跳过了不必要的元素。

您已经知道这些函数是如何工作的:
- 随机。
浏览随机生成的风景图片。 - Mix-Images
跨越现有的风景,生成全新的视觉效果。 - 制作动画
制作简短的变形视频。
就像在专辑里一样——在这里你必须尝试,混合,修改。没有真正的景观“基因”(至少目前是这样),但是通过参数的随机化,您可以生成精彩的样本:



作为最近的补充,乔尔扩大了动漫肖像的选择,传奇人物格温的动漫模型(也可以访问格温的项目ThisWaifuDoesNotExist.com)。

Anime model by Gwern
发展
乔尔·西蒙是 Artbreeder 背后的英雄。但在art breader Discord-Server中也有一些人,他们讨论、交流想法,建议如何改编最好的 UX,讨论最新的人工智能成就,讨论服务条款和隐私,分享最新的 art breader 创作的作品。卓越的团队合作。
Artbreeder 的开发是非常动态的——因为 Joel 对用户的想法和修改反应迅速。
迄今为止,这是我使用数码产品的最佳用户体验。
这就是为什么可能在这篇文章发表后的几天,Artbreeder 可能会获得新的功能,或者可能会改变它的界面。那么,你还在等什么?潜入并加入 艺术培育者 。
用法?
事实上,哪些用例与 Artbreeder 的图像生成相关?如何应用这些结果?
以下是一些尝试:
- 概念设计理念
- 角色设计(视频游戏,桌上游戏,自发的 D&D 角色生成有人吗?)
- 艺术项目(图像和视频装置)
- 灵感
…仅举一些有趣的用法。
你还有其他应用人像生成的想法吗?
创造!实验!受到启发!
你的,炼金术士。

Alchemist. Generated by Merzmensch with Artbreeder.
更新。我在 GANs 上找到了一篇标题类似的文章,它是一年前由 Libre AI 的联合创始人兼首席执行官埃内斯托·迪亚兹-阿比莱斯博士发表的,讲述了在 AI/ML 的帮助下绘制绵羊的有趣尝试。免责声明:也许安托万·德·圣·埃克苏佩里和菲利普·K·蒂克的结合是我们理解创造力和人工智能的典型。所以,我没有抄标题,怕你纳闷。这是 21 世纪的明显后果。😃
这是:
带 AI/ML
medium.com](https://medium.com/libreai/draw-me-an-electric-sheep-9a3e0b5fe7d5)
人工智能和人类智能

规定分析是人工智能领域,致力于规定最佳可能的下一步行动。它依赖于一套技巧,我将用一个大家都知道的简单而熟悉的问题来说明:打包行李。我的妻子和孩子可能不知道,但他们正在使用业务规则(BR)、机器学习(ML)和决策优化(DO)。
人类
人工智能(AI)就是“机器展示的智能”。开发但也理解人工智能的一个好方法是理解人类的智能。人类的决定来自于情感、直觉和推理的混合。关于这一点有大量的文献。重要的是,人类受到几个因素的影响:
记忆力有限。人类的记忆力有限,有时,即使面对与以前完全相同的情况,他们也能做出完全相同的错误决定。我的曾祖母重复最多的建议是:“犯一个错误不是问题,但是犯两次同样的错误是非常愚蠢的”。一些经常听到的类似建议是“要么我们成功,要么我们学习”。
有限加工。当需要计算或者演绎逻辑的时候,当问题规模变大的时候,需要很强的理性技能,人类肯定是有限的。
情绪。人类有情感。情绪可能是对人类决策影响最大的因素。研究表明,一个人并不总是对同样的问题做出同样的决定,因为这取决于他们当天的情绪状态。
环境。在压力下,当疲劳时,由于恶劣的天气,人类的决策也会受到影响。
让我们举一个例子
抛开这些限制,我们使用一系列技术来做决定,这些技术也是人工智能的基础。最近,我开始用一个简单而熟悉的例子来说明这些不同的技术:
去年夏天,我和我的家人乘飞机去度假,我们都必须收拾行李。这是一个简单而常见的决策问题。我应该在我的手提箱里放什么?多少件 t 恤?我应该带一本书还是两本?我应该带泳衣还是毛衣?

阿德里安
我的小儿子 Adrián 只是遵循他母亲提供的规则:“妈妈告诉我每天放一双袜子和一件衬衫,然后放一本书,如果我能放得下的话,再放一些玩具”
能够执行规则就是智能。事实上,我们的大多数教育系统都致力于教导我们的孩子理解规则形式的指令并执行它们的能力,顺便说一下,这一水平在很大程度上足以在人类社会中维持最低限度的生存。在家里,在学校,在工作中,许多人不需要或不使用任何其他类型的智力。
这些技术对应于业务规则管理系统。
决策的质量主要受(1)规则的质量和(2)正确执行规则的能力的影响。因此,除了规则执行之外,一个重要的先决条件是能够将决策过程公式化为一组优先的 if-then 规则。
BR 的一个重要好处是规则的明确化。决策很容易预测、理解和解释。

雨果
我的大儿子雨果的做法不同。基于多次看着妈妈为暑假打包行李,他自己学会了。
事实上,在我们这个复杂的世界里,不可能总是明确地向你的孩子提供所有事情的所有规则,所以你希望他们学习,看着你,看着你告诉他们好的其他模型。你吃健康的食物,做运动,读书,期望你的孩子看着你,并复制这些好习惯。
这是另一个层次的智能,人类可以自己学习。一些人类(不是全部)使用这种智能。一种非常有限的学习类型至少是不重复两次同样的错误(见上面奶奶的建议)。
这个例子当然对应的是机器学习。
它强调了历史培训数据的重要性。雨果要看妈妈收拾行李很多次才能自主。这是像机器学习这样的数据驱动技术的一个好处:你不需要理解和制定业务问题,也不需要你将解决它的确切方式。但是雨果包装的质量很大程度上取决于他是向某人学习还是单独学习,以及他向谁学习。如果他通过看着我来学习,那么结果可能会更糟。
有趣的是,这个例子很好地说明了机器学习的训练和偏见的困难:Hugo 已经看到他的母亲为暑假(去海滩)打包了很多次,如果我们必须打包行李去滑雪,他会有麻烦…

莫尼卡
第三种智慧是我妻子莫妮卡使用的。她知道航空公司的行李重量限制是 23 公斤,她知道哪些物品是强制性的,哪些不是,她还会考虑目的地的天气来设置可选物品之间的偏好。
基于这些约束和偏好,她可以在心里计算出这个物品加上那个物品不符合重量限制,或者这组物品比另一组提供了更好的整体满意度。
这里没有那么多的决定、约束和目标,所以她可以在精神上优化这些决定。
包装错误的原因可能是,例如,对目的地天气的糟糕预测,或者对航空公司规定的误解。
这就是决策优化的工作方式。
就像业务规则一样,决策优化是一种知识驱动的技术。做决策需要一些数据(限于当前问题,你不需要历史数据),还需要业务问题的一些提法,这就是我们所说的优化模型。实例数据加上优化模型被输入优化引擎,该引擎使用数学返回最优解。
那么如何决定呢?
理想情况下,聪明的人知道何时使用每一级别的智能。有时候,决定并不需要你开发一个优化模型(例如,决定今晚去哪里吃饭),但有时候它会有所帮助(例如,决定如何投资你的储蓄)。有时候不遵守某些法律是对的。
对于人工智能,会出现类似的情况,不同的方法仍然不容易结合,可能会有不同的好处和不便。这就是为什么理解这些不同的技术并能够识别每种技术何时更适用以及它们何时可以有效地结合是至关重要的。
每种技术的优缺点总结如下。
业务规则:
- 优点:规则明确,结果易于解释
- 缺点:需要陈述规则,决策不一定是最优的
机器学习:
- 优点:不需要制定或甚至精确地理解问题
- 缺点:偏见的风险和解释结果的困难
决策优化:
- 优点:最佳解决方案
- 缺点:需要制定业务约束和目标
Watson Studio 是一个数据科学平台,提供描述性、预测性和规范性分析工具,机器学习和决策优化可以轻松结合。
关于数据科学其他领域的规定性分析的介绍,你可以阅读这本。
alain.chabrier@ibm.com
https://www.linkedin.com/in/alain-chabrier-5430656/
这个帖子的一些内容和观点之前已经发表过这里。
人工艺术家:人工智能能创造艺术吗?
开发具有艺术能力的人工智能的挑战

Photo by Anna Kolosyuk on Unsplash
rt 是一个非常重要的工具,它允许人类表达我们想象中创造的情感和想法。它在社会环境中扮演着重要的角色,可以带来洞察力和理解,也可以带来娱乐。
开发具有艺术功能的计算方法的愿望并不是最近才有的。150 多年前,艾达·拜伦表达了她开发一台能够创作音乐的计算机的梦想[1]。
一个能够理解和创造艺术的人工智能将代表着在创造更接近人类的机器方面迈出了一大步。一个大问题是:机器创造的东西能被认为是艺术吗?
什么是艺术?
由于艺术固有的主观性,定义艺术并不是一件容易的事情。根据牛津词典,艺术被定义为:
人类创造性技能和想象力的表达或应用,通常以绘画或雕塑等视觉形式,创作出主要因其美或情感力量而被欣赏的作品。
有一个哲学分支研究艺术和美的概念,叫做美学。《牛津词典》中有以下关于美学的定义:
“一套关于美的本质和欣赏的原则。哲学中有关美和艺术品味问题的分支
在美学中,一个观点负责定义某个对象如何被归类为一件艺术作品,这取决于几个因素,如个人品味、文化背景、艺术形式等,如[2]中所指出的:
“审美观点决定了如何将一件物品理解为艺术品,以及当以这种方式理解时,如何判断一件物品的质量。一个观点可以被认为是一个观察者用来将物体视为艺术作品的构想,也可以被认为是一个艺术家用来创作新作品的构想。
有许多可能的美学观点。它们因不同的人、不同的文化和不同的艺术形式而异。当两个不同的人以两种不同的方式理解和欣赏作为艺术作品的同一件物品时,或者当两个不同的艺术家创作出两种不同的物品并都被称为好的艺术作品时,观点的多样性就显而易见了。”
有了这些定义,很明显人工发展(或学习)一种美学观点应该是人工艺术家的基础。
AI 能创造艺术吗?
简短的回答是:是的,为什么不呢?如前所述,如果我们对审美观点有一个好的定义,就有可能开发出一种能够评估艺术的算法。
主要问题是缺乏关于驱动人类艺术创作/评价的规则的知识。这使得精心设计一个能够产生艺术作品的封闭算法变得困难。最好的方法可能是使用元启发式算法,在一大组可能的解决方案中搜索,以发展自己的美感。
在3中,Penousal Machato 等人提出了人工智能成为艺术家必须具备的 5 个特征:
- 学习:系统必须能够像人类艺术家一样,根据新的刺激来提高技能和调整艺术表现力。
- 自己的审美标准:对于任何一个艺术创作者来说,能够评价自己和其他艺术家的艺术创作是至关重要的。即使没有评判艺术的普遍标准,每个人也必须根据自己的个性发展出自己的特定标准。
- 创造力:创造新颖和创新的艺术作品是杰出艺术家的标志。该系统不应该对现有的艺术品进行小的改动,而是创造全新的东西(尽管它可能会受到其他艺术家作品的影响)。
- 平等:制度不应受制于人的意志;它应该在同等水平上与人类或人工智能体相互作用。
- 没有社会背景,艺术是无法被创造出来的。人工智能必须能够将艺术作品作为灵感的来源。
在同一篇论文中,提出了两个模块的方法。第一个模块是一个基于基因编程的进化引擎,负责创造新的艺术品。第二个是基于神经网络的自适应分类器,能够“捕捉相关的文体属性”并“成功区分作者和风格”。然而,即使具有良好的结果,该系统也仅部分满足上述要求。
我将展示一些其他的出版物,它们都是用人工系统来创造艺术的,尽管就我所知,目前还没有一个艺术系统能满足所有 5 个要求。

Photo by Franck V. on Unsplash
音乐分析与作曲
在[4]中,作者提出了一个通过使用 992 首音乐作品的流行度作为审美标准来训练的人工网络。这个系统自主地创造了巴赫的小调 (BWV 784)中的发明#13 的变体,这些变体被发现对许多听众来说是审美愉悦的。这篇论文中提出的突出问题是很难找到真正糟糕的音乐(这里定义为不受欢迎的音乐),因为大多数古典音乐的糟糕例子都没有存档。
机器人动作画家
Leonel Moura 开发了一个可以创作新颖画作的机器人。RAP[机器人动作画家]通过随机性、散斑性和色序性来实现人工创造性。此外,该机器人能够自行确定绘画完成的时刻。

Artwork from RAP robot [5].
DeepArtificialComposer
在这项工作[6]中,提出了一种用于旋律自动作曲的音符过渡的递归神经网络模型,称为深度人工作曲器(DAC)。DAC 可以生成与训练示例的风格一致的旋律(例如,爱尔兰和 Klezmer 音乐)。DAC 生成的旋律的创造性由音乐序列的新颖性来衡量,这导致 DAC 创建的旋律与人类作曲家创作的旋律相比具有新颖性。
结论
创造和欣赏艺术是人类区别于其他生物的独特之处之一。一个能够培养艺术感觉的系统将代表着向更复杂的人工智能迈进了一大步,并能更好地理解人类大脑的运作。
即使现有的人造艺术家不符合被认为是真正艺术家的一套严格的规则,我们也有系统能够创造杰出材料的例子。在我看来,这种能力让机器更加人性化。
参考
[1]摩尔,多丽丝·l . .爱拉斯伯爵夫人阿达:拜伦的合法女儿哈珀柯林斯出版社,1977 年。
[2]吉普斯、詹姆斯和乔治·史蒂尼。“算法美学的调查” 莱昂纳多8.3(1975):213–220。
3马查多、佩努萨尔等《论进化人工艺术家的发展》 计算机&图形学31.6(2007):818–826。
[4] Manaris,Bill,et al. “一种基于语料库的混合音乐分析与作曲方法。” 全国人工智能会议论文集。第 22 卷。№1.加利福尼亚州门洛帕克;马萨诸塞州剑桥;伦敦;AAAI 出版社;麻省理工学院出版社;1999, 2007.
[5]莱昂内尔·莫拉。一种新的艺术:机器人动作画家×生成艺术会议,意大利米兰理工大学大学 (2007)。
[6] Colombo,Florian,Alexander Seeholzer 和 Wulfram Gerstner。“深度人工作曲:用于自动旋律生成的创造性神经网络模型。” 进化和生物灵感音乐艺术国际会议。施普林格,查姆,2017。
人工智能如何变得好奇?
人工好奇心可能是机器学习和人工意识之间缺失的一环

Photo by Joseph Chan on Unsplash
任何人都会因为书籍、电影和电视剧中出现的一些非凡情节而对机器学习(或更广泛的研究领域——人工智能)产生兴趣。研究和实现能够在解决许多任务方面专业化并超越人类的算法确实非常令人着迷。然而,当谈到我们通常处理的大多数问题时,感觉我们离阿齐莫夫故事和终结者电影中存在的智能实体很远。在现实中,没有公开的关于人工智能的信息,人工智能具有必要的复杂性,能够变得有意识,并能够自愿开始自己做事情。
那么,我们要达到那个人工智能水平,还缺什么呢?答案并不简单,但我会说大多数机器学习方法都过于依赖人类的监督。对于监督学习,必须提供带有人工分类示例的大数据集,而在强化学习中,代理高度依赖于奖励函数。从这个意义上说,这些算法与它们被编程来解决的任务紧密相关。
但是,如何让一个系统在没有明确编程的情况下能够学习呢?一种选择是让这个系统对新奇的事物感到好奇。

Photo by Joseph Rosales on Unsplash
什么是人工好奇心?
在这个上下文中,好奇心被定义为一个智能体学习未知规律的兴趣。这个想法是奖励系统,如果它发现一些意想不到的东西。另一方面,当面对可预测或固有不可预测的模式时,这样的代理应该会感到厌烦。第二种说法可能听起来很奇怪,但是对于代理人来说,花费大量时间试图理解某个随机事件是如何工作的是不合理的。例如,来自无线电的静态噪声代表未知数据的连续流。然而,不可能从中提取有意义的信息。
人工好奇心一词代表实现这一机制的算法。好奇心奖励被添加到代理学习过程中,与给定输入的预期结果和实际输出之间的差异成比例。如果这种差异很大,这意味着代理人“创建”的关于周围世界的模型不包括这一特定事件。收到好奇心奖励后,代理人被刺激去了解更多发生的事情。然而,对它了解得越多,预期/实际产出的差异(以及收到的回报)就会越小,导致兴趣降低。
当我们正确看待人类行为时,这种好奇心范式很有意义。当面对未知但可学习的情况时,我们有一种内在的动力去更好地理解它。然而,当解决一些太简单的任务,或者已经解决了很多次的任务(例如,重复的例程),我们会感到无聊,好奇心不足以成为继续工作的动力。
人工好奇心如何帮助解决问题?
人工好奇心是探索的有力工具。这对于解决优化问题尤为重要。在这样的问题中,有时很难避免陷入次优解。在强化学习中,这通常是通过强迫代理在开始时探索来实现的。然而,定义一个好的勘探/开发比率并不容易。
对于好奇的代理人来说,探索是自然发生的。推动他们前进的动力是内在的:好奇心奖励是发现新事物的内在刺激。这可以很容易地与代理试图解决的任务相结合。结果是一个受两种不同动机影响的主体:外在动机(学习如何解决任务时获得奖励)和内在动机(发现新事物获得的奖励)。
例如,OpenAI 在使用好奇心驱动的代理人之后,只能在蒙特祖马的复仇上开发出超过人类平均表现的人工智能[1]。这是一款 Atari 游戏,具有特殊的机制,使得大多数机器学习方法很难学习。
结论
E 即使我们无法开发出能够实现诸如持续学习、人工意识和自我意识等范式的人工系统,但许多可以帮助我们实现这一目标的方法已经存在。
参考
[1]纽约州布尔达市、爱德华兹市、斯托尔基市和克里莫夫市(2018 年)。用随机网络蒸馏探索。arXiv 预印本 arXiv:1810.12894 。
使用 Python、OpenCV 和 Dlib 在 LIVE Feed 上绘制人工眼线
有没有想过自己制作类似 Snapchat 的滤镜?这里有一个简单易懂的教程,它将带你一步步地在 live feed 上画出令人惊艳的眼线。

This is how our final output will look like. (Video by Wolfgang Sauerwald from Pexels)
计算机视觉是最令人兴奋的领域之一,具有广泛的应用范围,从医学成像到创建最有趣的面部过滤器。在这篇文章中,我试图创建一个人工眼线来模仿 Snapchat 或 Instagram 滤镜。希望你喜欢阅读。
这篇文章是为计算机视觉的初学者准备的,他们想做一些令人兴奋的事情。我会尽可能简单地解释。我建议在阅读这篇文章的同时浏览一下 GitHub 上的代码,以便有更好的理解。
在开始之前,设置一个新的虚拟环境并安装所有必需的依赖项非常重要。您可以访问我的 GitHub repo 获取说明。
我们将在这个项目中使用 OpenCV、NumPy、imutils、SciPy 和 Dlib。下面是在我们的项目中使用这些库的简要描述——如果您已经很熟悉,可以跳过这一部分。
- OpenCV:它是最流行的图像处理模块之一。我们将使用 OpenCV 来读取、写入和绘制图像。
- NumPy:在处理 OpenCV 项目时经常使用 NumPy。图像本质上是一个像素数组,OpenCV 使用这些以 NumPy 数组形式存储的数组对图像执行操作。
- Imutils: Imutils 带有自制功能,使您的计算机视觉工作更加轻松。在这里,我们将使用它将 dlib 对象转换为 numpy 数组,这种数组非常灵活并且被广泛接受。
- Scipy:顾名思义,SciPy 用于 python 上的科学计算。我们将使用它来创建插值(如果它现在没有意义也没关系)。
- Dlib: Dlib 最初是作为包含各种 ML 算法的 C++库出现的。我们将使用 dlib 提取面部标志点。
项目概述
简单解释一下——程序首先从每张脸上提取 68 个标志点。在这 68 个点中,点 37-42 属于左眼,点 43-48 属于右眼——见下图。

Visualisation of 68 landmark points. (Image from pyimagesearch)
因为我们的目标是画眼线,所以我们只对 37-48 点感兴趣,我们提取这些点。我们将对这些提取的点进行插值。插值意味着我们试图在两个给定点之间插入点。我们可以使这种插值线性或平滑-详情见下图。

Types of interpolation. (Image by Ultrafractal)
眼线算法流程图如下图。

接下来,我们更详细地描述该算法。如果您只是对运行代码感兴趣,请跳到下一节。
深入项目
我们将首先提取包围面部的边界框的坐标。
OpenCV 将图像转换为 NumPy 数组。这个numpy.array(图像的矩阵表示)存储在名为frame的变量中。我们使用一个名为face_detector()的函数,返回一帧中所有面周围的边界框的坐标。这些边界框坐标存储在一个名为bounding_boxes.的变量中,我们在bounding_boxes上迭代一个循环,在一帧中检测到的每张脸上画眼线。face_landmark_points存储 68 个标志点。eye_landmark_points是从getEyeLandmarkPts()接收的眼睛标志点阵列。
getEyeLandmarkPts()将 68 个标志点作为输入,并返回具有左上眼睑(L_eye_top)、左下眼睑(L_eye_bottom)和右眼(R_eye_top & R_eye_bottom)坐标的 4 个元素的数组。这是通过简单的 NumPy 索引完成的。我们正在转移极端点(第 37、40、43 和 46 点。见 68 个标志点图)向外再移 5 px。这在第 6–9 行完成。这是为了给出更真实的外观。
注意:在一个数组中,索引从 0 开始。因此,我们在代码中更改了 pt 编号 36、39、42 和 45。
现在我们需要通过这些点插值得到一条平滑的曲线,从这条曲线我们可以画出眼线。我们需要区别对待每条曲线。(即L_eye_top、L_eye_bottom、R_eye_top、R_eye_bottom)。因此,我们为每条曲线使用一个单独的变量名。interpolateCoordinates()用于在每条曲线上生成插值。scipy 模块的函数interp1d()用于生成插值。kind='quadratic'表示生成这些点的曲率。
interpolateCoordinates()被getEyelinerPoints()反复调用,为每条曲线生成插补坐标。它返回每条曲线的插值点数组。
drawEyeLiner()将生成的插值点作为自变量,在两个连续点之间画一条线。这在两个循环中对每个曲线进行,一个用于左眼,另一个用于右眼。这些画出来的线就是我们的眼线。它返回一个有眼线的新帧op。然后轰!我们完成了:d
使用项目
这个项目的用法非常简单。就从这里克隆 github repo。
git clone [https://github.com/kaushil24/Artificial-Eyeliner/](https://github.com/kaushil24/Artificial-Eyeliner/)
接下来,打开命令提示符并键入以下代码来运行示例测试
python3 eyeliner.py -v "Media/Sample Video.mp4"
通过将视频路径放在参数中,您可以使用自己的视频。完整的 CLI 命令如下:
python eyeliner.py [-i image] [-v video] [-d dat] [-t thickness] [-c color] [-s save]
-i:要画眼线的图像的路径-v:要画眼线的视频的路径。-v:如果给webcam的话,网络摄像头视频的活眼线。python3 -v webcam -s "Webcam output"-t:设置眼线粗细的整数(int)。默认=2。1-5 之间的推荐数值-d:您的shape_predictor_68_face_landmarks.dat文件的路径。默认路径在根目录中。除非您将shape_predictor_68_face_landmarks.dat文件存储在其他位置,否则您不需要使用此参数。-c:改变眼线颜色。语法-c 255 255 255。默认=0 0 0。其中每个数字代表它的 R G B 值。-s:您想要保存输出的位置和文件名。注意程序会在保存文件时自动添加扩展名。如果同名文件已经存在,它将覆盖该文件。
摆弄一下代码,如果你添加了有用的东西,一定要发出一个拉取请求。让我们把它变成一个合作项目。
GitHub 回购:https://github.com/kaushil24/Artificial-Eyeliner/
这就把我们带到了终点。
嘿,这是我的第一篇文章。请评论您的疑问和反馈,我将很乐意解决它们。希望你喜欢阅读这篇文章!祝你愉快。
人工通用智能(AGI) Vs .狭义人工智能

供应商和理论家可以向世界承诺,但为了做出明智的决定,区分人工通用智能(AGI)和狭义人工智能是必不可少的。
简单来说,当代所有的人工智能都是狭义或弱人工智能。即使是最聪明的系统也无法执行与人类智能相当的常识。虽然计算机可以在特定任务上超越人类,如国际象棋、危险或预测天气,但它们仍然无法进行抽象思维、解释回忆或用复杂的解决方案解决创造性问题。
影响深远,但仍然狭窄
为了开发窄范围的人工智能,数据科学家定义要整合哪些数据,确定合适的算法,并指定要应用的最佳模型。虽然“弱”这个词带有负面内涵,但狭义 AI 绝不令人失望;企业不断利用目前由狭义人工智能执行的任务的赏金。
在自动驾驶汽车和面部识别的发展之间,当前的人工智能模型正在彻底改变全球的行业。各种规模的企业都想方设法将最佳实践与人工智能相结合,以实现整个组织决策的自动化。这些大大小小的自动化为员工创造了更高层次的工作空间,让他们专注于解决更复杂的问题。一个接一个的行业领导者正在使用人工智能来脱离群体,以获得对竞争对手的优势。
狭义人工智能在很大程度上间接为公司创造价值,无论是通过提高效率还是作为内部增强功能,如亚马逊的产品推荐。客户不会因为人工智能而涌向公司,但狭义人工智能正在迅速改变客户(和员工)的体验。
根据德勤的报告,企业对认知技术的使用正以惊人的速度增长,早期采用者正在加倍投资。这项技术比以往任何时候都更容易测试和使用,这使得它成为下一波公司效仿的理想时机。
从历史上看,人工智能的进步以爆发的形式出现,并创造了一个波峰和波谷的时间线;开发人员将这些低谷称为“人工智能冬天”,这意味着技术扩张最小化的时代,这是由于缺乏资金和公众对技术能力的不兑现承诺和不切实际的希望造成的。
随着物联网收集数据的繁荣、图形处理单元(GPU)的诞生以及计算机速度、内存和存储的快速发展,当前的兴奋气氛到来了。在过去的 10 年里,艾不仅熬过了最后的严冬,而且现在正以前所未有的速度获得资助。
随着人工智能的发展,高管和商业领袖开辟了新的领域。随着互联网和行业巨头为保护技术的未来而战,投资在飙升。随着谷歌和微软等科技巨头宣布他们自己的“人工智能优先”战略,许多人都在问:人工智能终于全面开花了,还是世界正濒临另一个人工智能冬天?
当理论家们争夺视野,比较最后的场景(“谁会赢,人类还是机器人?”),理解当前技术的局限性、设定合理的期望值并制定考虑这些因素的策略是至关重要的。
人工智能之路(AGI)
如前所述,过度承诺人工智能的现有能力是有风险的。过去,当公众开始期待人工智能进步的冲击,并遇到令人失望的结果时,公众舆论急剧下降,并放弃了对可能性的希望。
企业和公众都在问:人类何时能实现 AGI?技术是处于风口浪尖,还是对遥远的未来一代人来说是现实?
最近在深度学习和神经网络方面的革命归功于人脑。深度学习革命的领导者之一, Terry Sejnowski 说,“在过去的 50 年里,人工智能取得的唯一进步,真正对经济和科学产生影响的,是真正受到自然和大脑的启发,这就是我们的现状。”
这个典故的自然演变是,深度学习和机器学习的进步为计算机很快实现类似人脑的功能铺平了道路;然而,这不一定是真的。事实上,即使深度学习成熟到神经网络相当于人脑的程度,人工智能专家仍然不清楚如何开发实际的智能。
脸书首席人工智能科学家 Yann LeCun 表示“虽然深度学习从生物学中获得了灵感,但它离大脑实际做的事情非常非常远。把它描述成大脑给了它一点魔法的光环,这是很危险的。导致炒作;人们声称事情不是真的。人工智能已经经历了许多人工智能冬天,因为人们声称他们无法交付的东西。”
当被问及实现 AGI 需要多长时间时,专家们给出了各种各样的答案,从 10 年到永远不会。总体共识是明确的:如果有办法做到这一点,实际上还没有人知道如何做到。
利用手边的技术实现业务目标
在冬天之外,人工智能技术不断进步,每一项发现都让科学家离创造 AGI 更近了一步。就目前情况而言,虽然人工智能在广义操作方面无法与人脑相比,但人工智能的能力正在日益扩展。微软研究实验室主任 Eric hor vitz解释说当前技术的能力允许一种由不同的狭义人工智能组成的“智能交响乐”。
当杰夫·贝索斯说这是人工智能的“黄金时代”时,也许他是对的。虽然这项技术仍处于萌芽阶段,但对于企业来说,事情再好不过了。狭义人工智能让生活变得更容易,尽管它以多种方式影响着几乎每个行业,但人类的智能仍然是不可替代的。
当人类最终到达 AGI 时,伦理困境的数量很可能开始一个后黄金时代的困境。更多关于企业如何使用人工智能的信息,请阅读我们的博客这里。
原载于 2019 年 7 月 28 日https://www.quickpath.com。
用简单的英语说人工智能

人工智能的圣杯,人类成就的顶峰,终极武器,我们未来的主人,以及我们所知的世界末日。这够清楚了吗?
先不要惊慌。
用道格拉斯·亚当斯的话说,不要惊慌。Siri、Cortana、Alexa 和 Google Assistant 并没有密谋接管人类。让我们真正明确一件事,尽管我们到处都有人工智能的例子,但人工通用智能还没有发明出来,可能还要几十年。
什么是人工智能?
让我们快速复习一下。AI 只是软件,它只是一个为完成一项任务而编写的应用程序。它不是有生命的,它没有灵魂或意识,它没有善良或邪恶的意图,它只是为了完成一项任务而编写的软件。
当大多数人想到人工智能时,他们会想到电影中描绘的东西,无所不知的超级智能,通常是危险的,可以接管世界的计算机。想想 HAL9000 或者天网。在电影中,这些虚构的人造生物不仅能进行完整的对话,它们知道一切并控制一切。
然而,我们每天对人工智能的体验是非常不同的,人工智能今天就在我们周围,但它们都不像电影中描绘的那样。想想脸书的面部识别技术,它会建议你标记人名;想想银行用来发现可疑信用卡交易的欺诈检测技术;想想能让你的房间保持舒适温度的自我调节 Nest 恒温器。
专业化与通用人工智能。
人工智能主要有两种类型,专业的和普通的。如今,专门的人工智能无处不在,Siri、面部识别、Snapchat 过滤器、Amazon.com 推荐、Nest 恒温器以及数百个我们几乎视为理所当然的例子。专门的 AI 也就那么回事,专门的。它擅长做一件特定的事情(识别照片中的人脸,推荐你接下来想读的书,判断你的信用风险是否良好,检测皮肤癌)。在某些情况下,专门的人工智能现在甚至比人类做得更好。
然而专业的 AI 却有着非常愚蠢的蚯蚓的智商,这是对蚯蚓的侮辱。专门的 AI 只是一个软件应用程序,它只做一件事,那件事取决于你使用哪个专门的 AI 应用程序。我之所以使用 app 这个术语,是因为我们都可以理解手机上做一件事的应用的概念。我的手机上有一个天气预报应用程序,一个货币兑换应用程序,还有一个点咖啡的应用程序。他们都很好地完成了他们的任务,你可以说货币转换应用程序在计算我的新运动鞋以英镑计的价格时比我聪明,但如果我试图用它来点一杯咖啡,它完全没有用。
专门的 AI 就跟那些 app 一样。亚马逊(Amazon.com)的专业人工智能应用程序可以推荐你可能想买的其他东西,在寻找人们愿意花更多钱购买的东西方面非常出色。但是问它一张照片里有没有猫完全没用,想都别想让它点一杯大豆拿铁。
专家人工智能就是我们今天所知道的人工智能。我们已经编写了数以百万计的专业人工智能应用程序(当我说应用程序时,它们通常只是一个更大的应用程序的一部分,或者对老派极客来说是一个“子例程”),它们都做特定的事情,其中许多都非常擅长它们所做的事情。但是,除了专门为他们编写的任务之外,他们在做任何事情时都是完全无用的。
这就是艾将军是完全不同的野兽的地方。专门的人工智能擅长于专门的任务,一般的人工智能擅长于任何任务(在合理的范围内)。专门的人工智能是用来做一件事的,而一般的人工智能是用来学习做任何事的。
专门的人工智能是用来做一件事的,而一般的人工智能是用来学习做任何事的。
我喜欢称它为通用人工智能,因为这比人工通用智能更容易输入和说出,但别担心,它们是一回事。有时候也可以叫全 AI,强 AI,或者真 AI。考虑到它还不存在,让我们不要太纠结于语义,通用 AI 现在就可以了。
你问的 Siri/Alexa/Cortana 呢,她不是一般的 AI 吗?你可以问她任何问题,她会回答,这是不是让她成为一个通用人工智能?没有。Siri(和她的所有同行)只是一个专门人工智能的集合,她可以识别自然语言,她可以检测问题的上下文,她可以查看你的日历或在互联网上搜索答案。但你可以问 Siri 羊驼毛是什么颜色,并不意味着她实际上知道答案。她所做的只是复述她在网上找到的与你问题中的几个关键词相匹配的东西。Siri 甚至不知道羊驼是什么,或者皮毛,或者颜色。一个五岁的孩子比 Siri 聪明得多,我的狗比 Siri 聪明,我的狗没那么聪明。
如果 Siri 不是一般人工智能的例子,那什么是呢?一句话,什么都没有。我们还没有造出一个,这对人类来说是个好消息。
在我解释为什么构建一个通用 AI 可能真的是个坏消息之前,让我们先解释一下什么是通用 AI。
专门的人工智能专门用来做一件事,就像十字螺丝刀一样,它很适合用十字头拧螺丝。如果你想钉一颗钉子,或者切一点木头,或者开一个罐头,那都是没用的。你可以把一堆专门的人工智能粘在一起,组成一把人工智能的瑞士军刀(Siri 就是这样),但一旦你遇到一个你的刀无法处理的任务,你就卡住了。试过用瑞士军刀粉刷栅栏吗?
艾将军
通用人工智能是一种非常不同的动物,它是一种可以学习做不同事情的人工智能。想象一下,一把十字螺丝刀可以变成一把锯子、一把油漆刷或一把卷尺。一个智能螺丝刀,它可以看到问题,然后适应成为解决问题的正确工具。
现在你可能正在想象第二部《终结者》电影,里面有一个来自未来的闪亮变形机器人,它可以变成任何形式来解决它所面临的问题。这是一个合理的类比,但我不是在谈论一个物理变形的人工智能,请记住,“ AI ”只是一个计算机程序,它只是一个软件。想象一个软件应用程序可以改变以适应你正在做的事情,想象 PowerPoint 变成 Photoshop,然后是 WhatsApp、Excel 和 SAP。该应用程序是多用途的,可以用于任何任务,从照片编辑到时间表,再到社交媒体。
这是专业人工智能和通用人工智能的关键区别。专业人工智能擅长做它被设计的事情,而通用人工智能擅长学习如何做它需要做的事情。更具体地说,通用人工智能将能够学习、计划、推理、用自然语言交流,并将所有这些技能集成到任何任务中。
听起来不错吧。这几乎不是世界末日。
一个计算机程序可以用来解决一系列不同的问题,并学习做比它被编程做的更多的事情,这有什么害处呢?听起来没那么可怕,实际上也不是。
总的来说,通用人工智能是一件好事,它将帮助我们解决目前超出我们精神和技术能力的问题,例如不仅预测气候变化,而且确定平衡我们正在争论的所有因素的最佳行动(经济增长,可持续性,主权国家对自己的森林和土地的权利,土著人民的权利,眼前利益与长期利益,以及一长串使人类目前不可能达成理想解决方案的其他因素)。通用人工智能通常在预测天气、经济变化、社会变化、人类行为和自然灾害等方面非常有用。
如果使用得当,一般的人工智能将会给人类带来巨大的好处,也会给与我们共同生活在这个星球上的其他物种带来巨大的好处。不幸的是,在一些情况下,使用不当会导致灾难。这才是你应该开始担心的地方。
不是世界末日,只是人类统治的终结。
在两个关键场景中,通用人工智能可能会出现可怕的错误,我的意思是可怕的,不是在删除所有宠物照片的 ios 升级中,而是在人类文明的终结中。
场景一——人类做坏事
与所有新技术和工具一样,它们有可能极大地造福社会,但如果用于错误的原因,它们可能会带来灾难。青铜时代的金属冶炼让我们能够制造新的工具来更好地耕种土地,但它也创造了剑和武器来更好地自相残杀。核裂变创造了一种新的能源,但另一方面,它也给了我们有史以来最具毁灭性的武器。互联网将社会连接成一个全球社区,但它也允许网络流氓和恐怖分子出于各种错误的原因使用它。
通用人工智能可以用来解决社会面临的巨大问题,也可以用作网络武器,一种监控、影响和控制社会的手段。它可以用来策划经济危机,推翻一个国家,剥削,计划和领导军事入侵。更微妙的是,它可以被用来大规模影响社会以获取经济利益(想想脸书和剑桥分析)。
下一个主要的军备竞赛是创造第一个通用人工智能的竞赛。第一个创造通用人工智能的民族国家将成为下一个世界超级大国,也可能是最后一个超级大国。
通用人工智能的使用是我们可以绝对控制的,作为人类,我们可以决定我们使用它做什么,以及我们同意不使用它做什么。这正成为联合国层面的一场关键辩论,但与所有协议一样,它依赖于人们遵守这些协议。几十年来,我们遵守了核裁军条约,但只需要一个朝鲜、普京或特朗普,这些条约就变得毫无意义。然而,与核武器不同的是,普通人工智能的使用要微妙得多。当愤怒时使用核武器是相当明显的,但是使用一般的人工智能来影响政治和社会几乎是看不见的。我们可能永远也不会知道它发生了。
那句可怕的话“枪不杀人,人杀人”在这里其实很恰当,艾将军不是一件坏事,而是我们用它来做什么可能是坏事。非常糟糕。
第二种情况是我们无法控制的,不管我们达成了多少协议,遵守得有多好。第二种情况最有可能终结人类文明。放松,这也是最遥远的事,我们可能还有 50 年才会发生。
场景二——超级智能
超智能,某物超过人类智力的点。
这只是一个视角的问题,只要一般的人工智能软件没有我们聪明,我们都会没事。你看,人类已经非常习惯于成为世界上最聪明的物种(我不会说最聪明,因为你可能会认为我们对地球所做的离聪明还有很长的路要走)。我们可能不是最快、最强、最大的,但我们是迄今为止最聪明的,这是帮助我们生存和繁荣的原因。
如果我们遇到一个比我们聪明两倍、三倍或一百万倍的物种,会发生什么?如果新物种如此聪明,以至于它用我们看待蚂蚁或蟑螂的方式来看待人类,那会怎样?我们会被视为地球上的害虫或瘟疫,而不是一个聪明、有创造力、和平的物种吗?它会认为消灭人类符合地球和所有其他与我们共享地球的物种的最大利益吗?
这可能看起来很牵强,而且有点偏离了技术文章的主题,但这正是我们与通用人工智能一起前进的道路。通用人工智能的一个关键特征是学习和进化的能力。关于进化,每一代都比上一代更好。在自然界中,进化的速度受到繁殖率的限制,对于人类来说,这通常是 20 年左右,所以我们每 20 年进行一次非常小的进化,但在人工智能的世界中,进化可以在几分钟内发生。
在创造通用人工智能的过程中,我们潜在地创造了一个能够以比我们自己更快的速度学习和进化的系统。可能对气候变化建模有用的通用人工智能可以通宵运行,每分钟都在进化,变得更准确、更智能、更擅长完成任务。到第二天早上,它将比前一天晚上提前 720 代。用人类的术语来说,那将是一夜之间 14400 年的进化史。在 11 天的时间里,这个系统的进化次数将超过我们作为智人存在的 315,000 年中整个人类的进化次数。假设一分钟的进化周期,随着系统的进化,它的进化速度可能会加快,几天后它可能只需要几秒钟就能进化。
经过一个月不断加速的进化,这个系统将会进化数百万次,它将会超越地球上所有生命的整个进化过程。它的能力将远远超出我们的想象,它的工作方式也将超出我们的理解。它会达到远远超过我们人类的智能水平。
在宇宙的眨眼之间,我们将创造出我们的上级,一个如此聪明的存在,它将把我们仅仅看作居住在地球上的许多生命形式中的一种。我们在智力食物链顶端的地位将彻底结束。
它用这种智慧做什么是未知的部分。它会把人类视为它的创造者,它的上帝吗?它会视自己为上帝,视我们为威胁吗?它会不会认为人类不仅仅是一种低级的生命形式?
这是技术、哲学和伦理结合的地方。当谈到开发通用人工智能时,我们需要问自己这样一个问题:“仅仅因为我们可以,我们应该吗?”。
意识?
还有意识的问题。如果机器能够学习、推理和进化,它是有意识的吗?什么时候它不再是一个软件,而成为一个生命体?关掉它就等同于谋杀吗?那是另一篇文章,以后再说。
摘要
不要害怕人工智能,害怕那些出于错误原因使用它的人类。怕的不是超智能,怕的是认识到人类只是生命进化的一步。在某些时候,我们总是会被下一次进化所取代。我们只是从未想过会有一个我们自己创造的生物来取代我们。
人为的不人道

Photo by Daniel Hjalmarsson on Unsplash
几个月前,菲利普·拉雷神父出版了一本名为《人造人性》的书。它讨论了开发人性化人工智能(AI)的必要性。在这篇文章中,我们将解释如果我们有一个不人道的人工智能会发生什么。
首先,不人道是什么意思?
****非人的——“缺乏同情心和怜悯心的人性;残忍野蛮。”
首先,当我们说人为的不人道时,我们指的是与人类无关的人工智能。它没有表现出任何人类的感觉,人类只是在我们的世界中漫游的有生命的物体。尽管人工智能最初是为人类服务的,但我们并不排除最终拥有一个最终只为其利益服务的人工智能的可能性。如果发生这种情况,我们肯定会有大麻烦。
机器可以人性化吗?

Is Ava humane? Photo Ex Machina
计算机科学先驱 Edsger Dijkstra 曾经说过:
机器能否思考的问题和潜艇能否游泳的问题一样重要。
用同样的思路,如果机器表现出人性,是不是就说明它们是人?
当艾伦·图灵面临一个类似的问题,但是关于智力的概念,他没有为智力下定义,而是创造了一个基于不可分辨性的测试。在这项通常被称为模仿游戏(或图灵测试)的测试中,他质疑机器智能是否可以复制人类智能。这种方法的问题是,如果我们无法区分人类和机器智能,并不一定意味着它们是同一种智能。尽管研究界接受这种方法已经有几十年了,但是是时候找到一些真正的答案了。
在电影 2001:太空漫游中,很明显,哈尔 9000,机载人工智能,与宇航员戴夫一起展示了一些人性。它对不能执行戴夫的命令表示遗憾。我们可以在电影《玛奇纳》中看到同样的事情。艾娃,这个酷似人类的机器人和凯莱布一起展现了很多人性。然而,在电影的结尾,它毫无顾忌地让他被困在这个设施里,并判他必死无疑。这两个例子的共同点是人道的一面完全是伪造的。哈尔 9000 没有感到任何悲伤,艾娃也没有表现出任何同情。
假人性是不够的;我们教人工智能如何感受真正的人性,并据此采取行动。
直觉有多重要?

Photo by Lucas Benjamin on Unsplash
人工智能系统能够处理和消化大量数据。如果我们看看驾驶,每个人一生中驾驶 4 到 5 年。我们会认为那个人是一个有经验的司机。由于自动驾驶汽车共享它们的数据,今天的自动驾驶汽车有 60 年的驾驶经验。没有人能在一生中达到这样的专业水平。这里的问题是,仅仅有经验是不够的;我们也需要直觉。
令人大开眼界的是 90 年代初在匹兹堡大学发生的事情。研究人员进行了一项旨在预测肺炎患者并发症风险的研究。目标是找出哪些肺炎患者是低风险或高风险的。低风险患者被送回家,并开出抗生素鸡尾酒,而其他人则被送入医院。该系统是围绕人工神经网络架构设计的,分析了 23 个州 78 家医院的不少于 75 万名患者。令人惊讶的是,它的精度达到了 86%左右,对于这样的系统来说已经很不错了。
当该系统在实际病人身上进行测试时,医生们注意到了一个严重的问题。同时患有哮喘的肺炎患者被归类为低风险。医生们立即意识到这是一个严重的缺陷,所以他们标记了这个问题,系统被送回了绘图板。软件开发人员对它进行了彻底的分析,但是他们没有发现任何问题。然而,当他们试图进一步探究这个系统是如何得出这样一个结论的时候,他们立刻遇到了一堵墙。在这种情况下使用的人工智能被认为是一个黑盒;我们给它一个输入,我们得到一个输出,但是我们看不到它在内部是如何工作的。这个问题使得寻找解释的任务变得异常复杂,在某些情况下,对于人类来说是不可能完成的。为了克服这个障碍,他们在人工神经网络架构的基础上建立了一个基于规则的系统。这样做,他们能够阅读和理解系统生成的规则。
研究人员发现,根据数据,患有肺炎和哮喘的患者比其他人的恢复率更高。算法漏掉的是他们变好的原因。这绝对不是因为他们有哮喘!对此的解释是,这类患者被医生自动标记为高风险,并自动接受重症监护,最终导致比普通患者更有效的康复。
这证明了两件事:首先,人类的直觉是必不可少的,因为当面对自动化系统的结果时,医生立即标记了这个问题。其次,它应该提醒我们,相关性并不意味着因果关系。
仅仅建立一个充满过往经验的海量知识库是不够的;我们必须用直觉来构建人工智能系统。
谁适应谁?

Photo by Lenny Kuhne on Unsplash
人工智能一直在我们的日常生活中帮助我们。在大多数工作中,是人类在执行任务,但各种人工智能组件在协助他。然而,形势正在逆转。
世界各地的工业都在向最大程度的自动化发展,人类的角色变得越来越无关紧要。在这种情况下,他们正在实施无人值守制造方法。从本质上讲,这意味着工厂在完全黑暗的环境中运行,因为它们是全自动的,因此不需要人在场。在这样的工作场所,仍然需要一些工人来搬运原材料甚至成品,因为很少有工厂是 100%自动化的。当人类和机器之间的平衡向有利于机器的方向倾斜时,人类将不得不做出调整。

Image: World Economic Forum
当然,许多人可能会争辩说,这些都是孤立的案例,自动化仍然与少数行业隔绝,人类仍然主宰着工作场所。根据世界经济论坛,这种情况正在迅速改变。而在 2018 年,工作场所的自动化率仅为 29%;到 2025 年,这一比例将升至 52%。第一次,人会变成少数!
尽管自动化是不可避免的,但我们必须考虑到人的因素,创造出对我们的需求敏感的人工智能系统。
AI 会不会制造新的不平等?

Photo by Micheile Henderson on Unsplash
在今天这个时代,我们已经可以感受到数字鸿沟。根据联合国(UN) 的数据,我们这个星球上超过一半的人无法接入互联网。不出所料,在每个地区,男性都比女性有更多的机会。联合国更进一步强调了这个问题;他们把数字鸿沟称为数字鸿沟。
人工智能将释放新的可能性,其中许多是有代价的。它已经在创造一个新的公民阶层,有买得起人工智能的,也有买不起的。试想一家小型家族企业在社交平台上为其产品做广告。那些能够负担得起使用人工智能定向广告来提升广告的人比那些没有这样做的人卖得更多。但这将更进一步。有些人可能会在享受生活的同时开始发送他们的数字角色来为他们工作。其他没有数字角色的人将不得不用老方法手动完成!然而,这个问题超出了财务方面,因为它也可能危及生命。未来几十年将成为主流的工作之一是器官创造者。从本质上说,它是为特定的人专门设计的人造身体部分的制作。当然,这是有代价的。因此,如果负担得起的话,一个心脏有问题的人也许可以委托他人做一个新的心脏。如果没有,运气不好!
人工智能应该用来消除不平等,而不是制造新的不平等。
人工智能会控制我们的生活吗?

Photo by Stanislav Kondratiev on Unsplash
在某种程度上,我们已经是技术的奴隶,我们的目光盯着数字屏幕。但是 AI 在多大程度上控制了我们的生活?
中国政府引入了社会信用体系。其背后的想法是根据人们对社会规范和法律的遵守程度对他们进行评级。该系统通过使用无人机、超过 2 亿个监控摄像头、脑电波监视器和从聊天等在线互动中进行数据挖掘等技术来跟踪用户。谁得分低,谁就受到惩罚。事实上,根据媒体报道,似乎有超过 1200 万人受到旅行禁令的影响,这是对他们迄今行为的惩罚。现在任何技术系统的问题是没有系统是绝对可靠的。对中国使用的相机系统的快速分析表明,图像识别软件的准确率为 95%。当然,有人可能会说这个系统的精确度相当高。然而,当一个人看数字时,95%意味着每一百个人中有五个人可能被错误分类。考虑到中国有大约 14 亿人口,这可能导致大约 7000 万人的错误分类。这个错误可能会产生比恼人的旅行禁令更严重的后果。中国的一体化联合作战平台(IJOP) 负责监控行为异常的人。它识别嫌疑人,对他们的行为进行分类,并采取行动防止潜在的犯罪。这与科幻电影《T4》中发生的事情非常相似,在电影《少数派报告》中,预知者(拥有预见未来事件的精神能力的人)预测犯罪。因此,曾经是科幻小说的领域,今天它是现实的一部分。
即使西方世界离制度化的社会信用体系还很远,我们已经受到各种人工智能的影响。如果我们看看几年前剑桥分析公司发生的事情,他们从脸书窃取了个人数据,并用这些数据来对付他们。美国大选和英国退出欧盟被操纵,以迎合参与选举的人的愿望。在肯尼亚选举中,剑桥分析公司针对所有支持他们候选人的选民进行投票。那些反对的人也成为目标,并被敦促不要投票。然而,他们工作中最糟糕的部分是对真相的操纵。在美国大选中,希拉里·克林顿被视为罪犯。在英国退出欧盟的竞选中,每周都有数百万英镑被承诺用于帮助国民健康服务。我们今天都知道,这些都是赤裸裸的谎言。
然而,即使剑桥分析公司早已不复存在,可能仍有其他公司在同一领域经营。此外,我们在脸书、谷歌等网站上看到的。本质上是算法想让我们看到的。所以即使在今天,我们可能在不知不觉中被操纵了!
基于人工智能的系统在向用户提供信息时应该是透明和客观的。
人类的生命对于 AI 的价值是什么?

UBER self-driving car accident
真的,人类的生命对于人工智能系统来说没有价值。一个智能系统避免伤害我们,只是因为我们对它进行了编程,而不是因为它重视人类的生命。今天的大多数人工智能在特定任务方面表现得令人难以置信,但在处理工作参数以外的事情时,它面临一些困难。这就是问题开始出现的地方。
2016 年,一辆自动驾驶的特斯拉汽车直接撞上了一辆面包车,导致司机死亡。事故的发生似乎是因为它的传感器没有检测到车前的障碍物。当然,该系统在这种情况下没有施加任何额外的警告,因为它知道一个人被委托给它照顾。它只是在执行一个程序。
2018 年,一辆优步自动驾驶汽车撞死了一名正在过马路的行人。车辆依赖于传感器提供的信息,在这种情况下,这些信息碰巧是错误的。再一次,这只是一个执行程序的问题。
但是我们的计划必须超越这一点。1942 年,著名的科幻小说家艾萨克·阿西莫夫提出了一套指导机器人与我们的世界互动的规则。这三个定律是在《 I,机器人》一书中首次提到的,第零定律是在稍后阶段引入的。这些是:
第零定律
一个机器人不能伤害人类,或者不作为,让人类受到伤害。
第一定律
机器人不得伤害人类,也不得坐视人类受到伤害。
第二定律
机器人必须服从人类给它的命令,除非这些命令与第一定律相冲突。
第三定律
机器人必须保护自己的存在,只要这种保护不违反第一或第二定律。
如果我们在我们的人工智能中实施这些法律(可能还有其他法律)作为标准,我们将确保我们未来的自主系统在与人类打交道时小心谨慎。想想自主武器吧。向潜在威胁发射的导弹可能会注意到它将击中一些平民,并决定自行调整其路线。
应该教会人工智能重视人类的生命,应该在自主系统中编程特定的安全措施来保护人类。
AI 的进化能否超出我们的预期?

Multi-Agent Hide and Seek — OpenAI
答案简直是个大胖子,是的!这已经在各种实验中反复证明了。
但也许最令人印象深刻的是 OpenAI 几周前发布的实验,他们创造了一个可以玩捉迷藏的 AI。使用的人工智能技术被称为强化学习,其中代理人(他们不知道游戏规则),如果他们成功地走了一步好棋,就会得到奖励。
游戏规则很简单;当搜索者看到隐藏者时,他们会得到点数。隐藏者在开始时有一定的回旋余地来找到一个隐藏的地方,如果搜索者找不到他们,他们会得到分数。他们都可以使用随处可见的物品来实现他们的目标。
这个人工智能以前从未玩过这个游戏。最初,代理人开始随机移动。以下是事情的经过。
- 人工智能制定了游戏的基本规则。
- 隐藏者学会了建造一个庇护所,而探索者看不见他们。
- 探索者学会了建造一个斜坡来进入庇护所并看到隐藏者。
- 然后隐藏者学会了一个冻结斜坡的技巧,这样搜索者就不能使用它们了。
- 然后,寻求者学会了他们可以跳到箱子上,把箱子移近庇护所,然后跳到隐藏者身上。
- 隐藏者于是采取冻结所有移动的物体来阻挡搜索者。
在每一步之间,人工智能玩了数百万次游戏。总的来说,要进化通过上述六个阶段,人工智能必须玩近 5 亿个游戏。令人印象深刻的是,上面讨论的行为没有一个是教给代理人的,也没有一个是直接奖励的。奖励只给赢得比赛的人,而不是采取适当措施的人。
随着人工智能系统变得越来越强大,我们需要确保人类仍然保持对技术的控制。
AI 会变邪恶吗?

Profile picture of Microsoft TAY
考虑到 AI 可以进化,我们很容易假设它也可以变好或变坏。这种选择不一定是有意识的,因为据我们所知,人工智能没有良心。然而,与任何人工智能互动的结果都可能导致善或恶的行为。
2016 年,微软发布了一款名为 TAY(想你)的 Twitter 聊天机器人。它被设计成模仿一个 19 岁的美国女孩,并从 Twitter 上与其他人的互动中学习。这实际上是一个对话理解的实验,旨在观察对话将如何发展。事实上,泰并没有走得很远。
一些 Twitter 用户开始与聊天机器人对话,其中包括辱骂信息。TAY 以同样的方式回应,因为它正在向其他用户学习。最终,网上讨论不再好玩。泰对女性产生了强烈的偏见,并成为种族主义者和纳粹的同情者。微软随后几乎立即决定关闭它。这件事告诉我们,AI 对数据非常敏感,如果我们用垃圾喂养它,我们最终会从中获得更多的垃圾。

Real tweets generated by TAY.
人们可以找到各种其他类似的情况。在三藩市闯红灯的优步自动驾驶汽车。名为 Promobot IR77 的俄罗斯机器人决定逃离正在对其进行编程的实验室。这个清单还可以继续列下去。为了减少这些威胁,DeepMind 正在开发一个框架,确保人工智能代理不会学习阻止人类取得控制权。
大多数人工智能系统都是从一张白纸开始的,要靠我们用正面的例子来影响它们。
AI 会接管世界吗?

很多人听到 AI 都会问这个问题。最有可能的是,我们在电视上看到的好莱坞大片助长了投机。一些知名人士如比尔·盖茨、斯蒂芬·霍金斯、史蒂夫·沃兹尼亚克和埃隆·马斯克也表达了他们对此事的关注。因此,询问这种威胁的真实性是非常恰当的。
近年来,艾在各个领域都出类拔萃。不管怎样,像《T2》国际象棋或围棋以及最近的星际争霸这样的游戏。自动驾驶汽车和智能家居正在引领未来的世界。尽管取得了这些成就,但这些系统中的人工智能种类非常有限,通常被称为狭义人工智能。这意味着人工智能非常擅长处理特定的任务,但在处理其他任务时却毫无用处。因此,一个已经达到国际象棋大师水平的人工智能不能被要求提供天气信息,因为它会失败。由于这种限制,世界各地的许多研究人员正在努力研究所谓的人工通用智能(AGI),其中人工智能可以处理几种不同的任务。然而,在这种情况发生之前,让智能烤面包机演变成邪恶天才并接管世界的威胁是令人难以置信的渺茫。
尽管 AGI 听起来很可怕,但它并不是人工智能未来中最可怕的一章。那一章是留给所谓的奇点的。奇点是指人工智能的进化速度如此之快,以至于人类永远无法达到的时间点。然而,不要在这个问题上失去太多的睡眠,因为我们离今天的技术达到这个阶段还很远。
当然,如果我们设法破解量子计算(QC),情况可能会改变。质量控制侧重于创造基于原子和亚原子水平上的物质和能量的性质和行为的计算机技术。要了解这些技术的威力,在今天最快的超级计算机上需要 10,000 年的任务,在量子计算机上只需要 3 分钟。这些数字不是理论上的,但它们是几周前由谷歌研究人员获得的。尽管谷歌声称他们达到了量子优势(即计算能力超过现有最快的超级计算机),但这是在一个非常有限的任务上实现的。因此,我们离拥有能够处理任何工作的主流 QC 还很远。
尽管我们正在经历技术上的巨大飞跃,但我们必须学会如何管理所有这些处理能力。
结论

Photo by Marc-Olivier Jodoin on Unsplash
AI 会留在这里。我们的社会已经在各种应用中部署人工智能。因此,最大的问题不是人工智能革命是否会发生,而是如何控制未来强大的人工智能。这就是为什么我们需要人性化的人工智能。理解、重视和尊重人类生命的人。这不会偶然发生,但我们必须教会人工智能这样做。只有这样做,我们才能确保未来不是人类对抗机器,而是人类和机器共同努力解决明天的挑战。
本文灵感来自菲利普·拉雷神父的《——一篇关于人工智能哲学的论文。

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。
银行业中的人工智能:双刃剑

Photo by Franck V. on Unsplash
人工智能对银行业来说是一把双刃剑。在金融行业的闲聊中,有两个主题浮现出来。首先,在数据、人工智能(AI)和云方面实力雄厚的“大科技”可能会对银行业利润、并最终对金融体系的稳定性造成巨大压力。其次,人工智能算法和模型的使用带来了行业或监管机构尚未完全理解和理解的风险。换句话说,不管你做不做。
人工智能是不可避免的,风险也在不断加剧,这一事实令世界各地的监管机构感到担忧。但是,当谈到在金融行业使用人工智能模型的问题时,语言不是很清楚或一致。当监管者谈论人工智能的风险时,他们指的是什么?他们到底担心什么?美国和澳大利亚监管机构最近对人工智能使用的警告似乎表明,他们意识到正确处理这一问题的战略重要性,但仍没有迹象表明在这个问题上有任何正式指导。
在为人工智能在银行业的应用设定明确的政策方向方面,监管机构的惰性可能会放大监管机构非常担心的金融稳定风险。
一段时间以来,银行一直在使用先进的模型,包括可以被归类为人工智能的模型。《新巴塞尔协议》在信用风险、市场风险和运营风险等领域引入了一大堆统计学习模型。银行一直在投资模型风险管理功能,并建立了管理这些模型风险的能力。那么,在使用人工智能模型时,监管机构到底关注什么?是什么阻碍了政策方向?让我们从基础开始。
AI 是什么?
如果我有一分钱…!当然,人工智能已经被有限的学者、研究人员和行业从业者很好地定义和理解,但它远不是整个行业的共识。《大英百科全书》将人工智能定义为“数字计算机或计算机控制的机器人执行通常与智能生物相关的任务的能力”。智慧生物?这可能是另一个棘手的问题。虽然这个定义是正确的,但它很难成为一个实用的解释。另一方面,我们有技术解释,其中 AI 被用作机器学习(ML)、深度学习(DL)、统计、数学和其他高级分析技术等技术组合的总称。业界迫切需要一个可行的人工智能的解释和分类,这将有助于提高围绕人工智能及其相关风险的讨论质量。
美国国防高级研究计划局(DARPA),人工智能前沿创新的旗手,已经提出了一种新颖的方式来解释人工智能处理信息的能力。
DARPA 将人工智能定义为“处理信息的编程能力”。处理信息的概念智能分为四类感知、学习、抽象和推理。人工智能的发展分为三个阶段,分别是手工知识、统计学习和上下文适应,它们可以用来理解人工智能在金融行业中的应用
第一波:手工知识
人工知识模型是基于规则的人工智能模型,其中人类定义知识的结构,而机器探索细节。基于规则的引擎是一个基本的人工智能应用程序,能够对“狭义定义的问题”进行推理,但尽管如此,它们仍然是 DARPA 的人工智能。例如,银行计算新巴塞尔协议监管资本的方式,其中预先确定的资本公式应用于一组预先定义的产品。如果有新的信息,如新产品,则需要更新规则。这些人工智能模型没有任何学习能力,处理不确定性的能力也很差。这些第一波人工智能模型仍然与网络安全等新兴和加速的风险相关。最近,在 DARPA 的网络大挑战 (CGC)中,一个基于第一波原则的名为‘Mayhem’的系统解决了一个十年之久的安全挑战。
银行已经制作了大量的知识人工智能模型,但很少有人将它们视为模型,更不用说人工智能了。它们通常被认为是“确定性工具”或“软件”。治理和风险管理并不明确,但通常在技术风险的保护伞下进行管理。
第一波人工智能模型的固有风险(如其处理不确定性的能力所解释的)是非常高的。然而,这些模型存在于高度受控的环境中,因为它们不能很好地应对自然界的动态变化。意识到第一波人工智能模型的风险可以非常低,因为它们被应用于狭义定义的问题,这首先减少了不确定性。尽管如此,如果这些模型正在做出实质性的决策,那么模型的使用可能会带来灾难性的风险。

Courtesy: The DARPA
第二波:统计学习
S 统计模型能够在 【定义的 问题域内学习。例如,领域可以是语言处理或视觉模式识别。问题的复杂程度用数据来表示。更丰富的数据将产生更多的信息,需要更复杂(非线性)的学习算法来表示它们。例如,如果你有 10 张狗的照片,你可以开发一个简单的算法,从 10 张照片中学习并以合理的准确度识别一只狗。然而,如果你有一千张不同品种狗的照片,你可以开发一个更复杂的模型,它不仅可以识别狗,还可以识别品种。统计学习人工智能模型拥有细微的分类和预测能力,但只有最低限度的推理能力,没有上下文能力。
金融行业充斥着统计学习模型。确定个人或公司违约概率的信用评级模型和估计洗钱倾向的反洗钱模型就是其中的一些例子。
这些现有的统计学习人工智能模型大多是现实世界的简单表示,并遵循奥卡姆剃刀原理。一些较新的模型用于模拟行为、欺诈等。开始利用大数据和自然语言处理(NLP)等复杂概念。
第二波模型的内在风险是高,正如他们处理不确定性的能力所解释的那样。他们很好地处理了不确定性,但是依赖于代表不确定性的数据。使用大数据的更复杂的算法在统计上令人印象深刻,但在个体上并不可靠。他们容易产生可以被利用的固有偏见。这些模型的任何自主性都需要被监控和管理,因为不良适应和不希望的行为是可能的。总的来说,意识到的这些人工智能模型的风险可能非常高,因为问题领域的不确定性可能会有很大差异。与第一波模型一样,基于决策的重要性,统计人工智能模型的使用可能导致灾难性风险。

Courtesy: The DARPA
第三波:背景适应
上下文适应人工智能模型解释决策,通常由对现实世界现象进行上下文解释的系统构建。这里的关键是可解释性和自动化。生成模型创建解释,为决策和概率提供上下文。这是打着可解释人工智能旗号的前沿研究(XAI)。这在处理复杂的决策时是很重要的,比如涉及道德困境的决策。上下文适应对于降低模型风险和最终决策风险至关重要,因为预计未来大多数决策都将实现自动化。
由于该领域的不成熟,第三波人工智能模型的固有和现实风险非常高。虽然可解释性对意识到人工智能决策很重要,但管理风险绝对至关重要。

Courtesy: The DARPA
总之……
金融行业已经在使用第一波和第二波人工智能模型中讨论的先进技术来做出决策或为决策提供信息。任何关于在银行业使用人工智能的担忧都需要被衡量和具体化。对人工智能模型带来的风险一概而论,并不一定包含这样一个事实,即银行已经建立了处理第一波和第二波人工智能模型中讨论的大多数风险的重要能力。监管需要跟上并加快政策制定和指导的步伐,以减轻实施人工智能的任何惰性。存在相当大的风险,要么阻碍人工智能使用银行业的进展,要么没有适当认识到人工智能模型给银行业带来的风险。人工智能治理工作需要从人工智能模型的适当识别和分类开始。这里讨论的 DARPA 方法可能不是最终目的地,但肯定是起点。
最后,人工智能意味着反映人类的智能。我们越害怕它,它看起来就越可怕。现在是时候直面人工智能风险,并在银行业推广人工智能的使用了。
人工智能 AI-到 2025 年收入超过 1000 亿美元
我们没办法,嗡嗡的 AI 这个词,无处不在。这个行业有很棒的营销人员,但还有更多。

人工智能是热门的技术创新和研究之一。人工智能将扰乱人类生活的所有部分,最终,它将接管我们的星球。人们往往会忘记代码是由人类生成的,而人工智能最终只是自动逻辑调整软件的和平。我们不应该害怕人工智能机器人接管地球。我们应该更害怕心怀不轨的人染指强大的 AI 工具。科技行业充斥着铺张浪费。有时我们会忘记现实。
炒作和创新吸引资本
从一年前对物联网市场状况的研究中可以看出,超过 15 万亿的经济体将围绕物联网行业增长。当然,它肯定不会纯粹靠炒作,而是靠现实生活中的解决方案在那里发展。
人工智能营销非常成功,这导致了资本的吸引力。尽管投资者变得越来越聪明,但我们喜欢行动和活力。成功的营销带来的正是这一点。部分是因为市场营销,人工智能的发展已经吸引了大量的初创公司、组织和大学的融资。资本使得大规模的实验成为可能,从而加快了发展的速度。由于快速发展,我们现在看到人工智能产生的收入数量在增长。
收入增长
据 Tractica 称,到 2025 年,来自使用人工智能的软件的收入将从 2018 年的 95 亿美元增加到 1186 亿美元。

Chart by Statista outlining the industries.
此外,Tractica 认为,在人工智能开发方面,我们现在终于从宣传转向现实,即将看到真正的工作解决方案进入市场。可以看出,Tractica 的信念已经实现。例如,人脸识别、机器人技术和语音软件。这些是按计划使用的工作解决方案。
Tractica 报告对人工智能在消费者、企业、政府和国防领域的市场机会进行了量化评估。
据 MarketWatch 估计,2024 年,人工智能的总市值为 1910 亿美元,CAGR 为 37%。
MarketWatch 也指出缺乏有才能的工人,以及人工智能可能威胁人类尊严的风险。这是增长的潜在风险。然而,《市场观察》估计,由于引入了更新的技术,它的影响微乎其微。
大观研究:全球人工智能 AI 市场
有了这样的技术预测,人们就可以预测资本开始流动。政府、风险资本家和其他投资者在人工智能的发展上投入了大量资金。
在开发人工智能解决方案的初创公司和项目上投入了大量资金
自主技术的前景就像一块吸引资本的磁铁。

Photo by Austin Distel on Unsplash
欧盟投资 12 亿美元给 人类大脑项目,该项目是关于在机器中复制人类大脑。这不仅是关于人工智能,但它肯定是它的一部分。
美国初创公司场景:“2019 年迄今为止的 66.2 亿美元,这使我们有望略高于 2018 年 86.7 亿美元的总额”——Crunchbase research。
Crunchbase News 对与人工智能和机器学习相关的公司的风险投资进行了分析,发现对美国初创公司的投资继续增加。到目前为止,该领域的公司在 2019 年筹集了 66.2 亿美元,这使我们有望略高于 2018 年的 86.7 亿美元。— Crunchbase ,2019 年 9 月 9 日。
****从 2011 年到 2019 年,全球范围内增加了四分之一:2019 年第二季度,AI 资助额为74.1 亿美元。—Statista

Quarterly AI funding from 2011 to 2019 by Statista.
****软银新的专注于人工智能的 100 美元基金:软银以其庞大的基金规模在硅谷引起轰动。现在它推出了一个 1000 亿的基金来投资人工智能的发展。
软银在 2017 年推出了 1000 亿美元的愿景基金,并进行了积极的投资,震惊了风险投资界。现在,亿万富翁孙正义宣布了一个更大的基金,以 1080 亿美元投资于公司,开发人工智能。— 福布斯2019 年 7 月 26 日。
****微软 10 亿美元投资成 OpenAI 项目。
微软对 OpenAI 的 10 亿美元投资可以实现什么— 观察者2019 年 7 月 23 日
难怪人工智能会吸引资本——除了炒作之外,它也产生收入。
到 2025 年,人工智能解决方案预计将产生超过 1000 亿美元的收入。人工智能不仅仅是炒作。我们可以看到影响和机会,人工智能提供。资本流入开发是有原因的。

Photo by Erik Mclean on Unsplash
让我们举几个例子:
预测性维护:
国际自动化协会估计每年机器停机的成本为 6470 亿美元。借助人工智能和机器学习,我们可以改善维护操作,并引入令人兴奋的东西:预测性维护。提高效率,延长机器寿命。
有了空调,按时清洗过滤器可以减少多达 15%的能耗。通过预测性维护,机器的生命周期预计将延长 3-5 年。
根据国际能源署(IEA)冷却的未来报告 2018 显示,全球每年空调消耗的电力高达 2020 TWh,而且数量还在不断增加。越来越多的空调安装。让我们算一算,明白这是什么意思。
根据 IEA 的数据,冷却每年消耗 2020 TWh = 20.2 亿千瓦时的电力。
使用全球平均电价, 每千瓦时0.14 美元,我们可以推测冷却所用能源的总成本。成本= 20.2 亿千瓦时 0.14 美元/千瓦时= 282.8 亿美元。***
为了继续简化计算,我们接着说我们将从中节省 15%。总计可节省 424.2 亿美元。
282 8 亿美元 0.15 = 424 亿 20 00 万美元节省。这个非常简化的计算的主要目的是给出一个人工智能潜力的概念。*
环境与人工智能
人工智能解决方案正在开发中,以帮助应对气候变化。
以下是人工智能对可持续环境影响的一些想法:
预测性维护
例如,预测性维护,确保设备得到良好维护并按时运行。美国能源部研究了延长机器的生命周期,同时减少 15%的能源节约。
根据美国能源部的数据,清洗空调的过滤器可以节省 15%的能源消耗。
无人驾驶汽车
有了自动驾驶汽车,我们就有希望进入没有人拥有汽车的未来。我们可以有自动驾驶的汽车,100%被占领。你有一个手机应用程序,像优步,你可以从那里订购一辆车去下一个目的地。

Photo by Vlad Tchompalov on Unsplash
关于人工智能如何帮助我们应对环境问题的更多想法,请看看下面的文章。
****该领域顶级思想家The Verge2019 年 6 月 25 日以下是人工智能如何帮助应对气候变化
利用人工智能进行气候科学— 欧洲联合空间欧空局**2019 年 9 月 18 日**
ResearchGate 一直在研究人工智能如何帮助我们处理数据,以做出最佳的环境决策。从他们的论文中找到更多有趣的想法:人工智能和环境决策支持系统。****
带着自主代码走向未来
未来将属于自治法典。自主代码并不意味着人类变得一无是处。恰恰相反。
然而,还需要更多的教育,以及人们学习新技术的意愿。
自主这个词并不意味着不需要人类。更多的技能和教育使我们能够利用人工智能的潜力。这是一个非常受欢迎的让我们轻松生活的附加工具。
人工智能和 5G

Photo by @perchekindustrie
为什么 5G 与 AI 领域相关?
我本周的重点是探索人工智能和 5G 的交集。当考虑这种组合的潜在风险和可能性,或者与行业专家讨论他们的想法时。谁在研究这将导致的影响或变化?电信公司在这些领域进行了大量投资,许多人对可能的不利后果表示担忧。它可能会改变我们在人工智能领域使用应用程序的方式,你可以用一个小设备做更多的事情,因为你的连接允许数据更快速地移动。因此,在一个界面上,许多应用程序将被云分散(在一个服务器上)。很明显,如果好的方面可以延伸,那么不好的方面也可以。
我将解释并说明:
- 5G 是如何工作的。
- 频谱分配。
- 机器人和 5G。
- 欧盟关于 5G 的安全政策。
- 中国的 5G 扩张。
- 谷歌以 21 亿美元收购 Fitbit。
1.5G 是如何工作的?
5G 网络是数字蜂窝网络,其中提供商覆盖的服务区域被划分为称为小区的小地理区域。
在数字趋势中已经尝试了一个很好的解释。

文章解释了频谱:低频段,中频段和高频段。
“低频段频谱 也可以描述为 sub 1GHz 频谱。它主要是美国运营商用于 LTE 的频谱频段,并且正在迅速耗尽。虽然低频段频谱提供了很大的覆盖范围和渗透率,但有一个很大的缺点:峰值数据速度将达到 100Mbps 左右。
中频段频谱 提供比低频段更快的覆盖范围和更低的延迟。然而,它不能穿透建筑物以及低频带频谱。在中频段频谱上,预计峰值速度可达 1Gbps。
高频段频谱 是大多数人想到 5G 时想到的。也就是通常所说的 毫米波 。高频段频谱可以提供高达 10Gbps 的峰值速度,并且延迟非常低。高频段的主要缺点是覆盖面积小,建筑物穿透性差。”
在花哨的连结点上有很多令人毛骨悚然的 5G 展示。

这还以进化的方式表现出来,就像技术领域经常做的那样。

成为第一个 5G 技术覆盖的城市本身就是一个目标。从某种意义上说,是技术的推动者。

2.人工智能、5G 和频谱分配
10 月 25 日,麻省理工学院技术评论的 Karen Hao 写了一篇文章,名为:“ DARPA 正在押注人工智能将下一代无线设备带入网络”本文将重点放在无线通信的一个重要方面。因为有一个关于带宽如何通过无线电频谱工作的计划。无线电频谱频率范围内的电磁波被称为无线电波,它们被广泛应用于现代技术,尤其是电信领域。为了防止不同用户之间的干扰,无线电波受到国家法律的严格管制,由国际机构国际电信联盟(ITU)协调。Karen Hao 的文章讨论了最近由国防高级研究计划局(DARPA)组织的一次黑客马拉松。她在文章中写道:
“这一挑战是由于人们担心无线技术的日益普及可能会导致我们的设备用来相互通话的电波过度拥挤。”
由于频率是在不同的商业和政府实体之间划分的,那些拥有一点频谱权利的人很少 100%使用所有的时间。正在出现的新 5G 网络使这一点变得更加紧迫,因为预计它将随着时间的推移而大幅增长。

麻省理工学院技术评论中显示的图表检索于 2019 年 10 月 28 日
DARPA 发布的竞赛中要解决的挑战是设计一种新型的通信设备,它不会每次都在相同的频率上广播。建议的提议是使用机器学习算法来找到可用的频率。他们希望从通过“笔和纸”管理的系统转移到由“机器自主”管理的系统。
郝凯伦描述了 10 名决赛选手相互竞争的决赛。这包括在军事任务、应急响应和音乐会场地中支持通信的场景。佛罗里达大学的一个团队赢得了 200 万美元的大奖。
2.1 物联网和人工智能革命
为了看到 5G 最突出的可能性,看看三星等几个从其扩张中受益匪浅的参与者可能会很有意思。三星在 2019 年 10 月 28 日撰写的一篇新闻文章中描述了物联网和人工智能革命。
这篇文章声称,5G 连接将允许不同的解决方案实时访问更多数据,这将使解决方案变得非常不同。5G 使用“少得多的电力”,利用可以持续一年的物联网传感器。在农业中调节灌溉水平,在制造业中检测设备状况何时改变。
除此之外,还有可能为医生开辟多种用途,以确保对患者数据的处理。该文章指出:
“5G 的速度比 4G 快 20 倍。但这种最新一代的网络不仅仅是“更快的 4G”加上创纪录的低延迟,5G 的速度将允许开发人员创建最大限度地利用改进的反应时间的应用程序,如体育赛事或安全目的的近实时视频传输。"
2.2 但这是一场比赛吗?
正如今年早些时候指出的那样,希望扩大 5G 连接的公司做出了巨大努力,将竞争框定为一场竞赛。这是来自行业游说组织 CTIA 的一个完整的微型网站,题为“5G 竞赛频谱中存在严重的折衷,由于部署的速度,这些折衷被忽略了。
“一旦在大城市建设 5G 的‘竞赛’获得‘胜利’,在该国其他地方扩大接入的压力将会消失,从而使这种差距变得更加严重。在仓促行事之前,仔细考虑所有这些事情是值得的。”
因此,我们不应该被这场“竞赛”冲昏头脑,而对这种扩张可能带来的不利后果视而不见。
3.人工智能和 5G 机器人
3.1 可能使机器人和人工智能得到进一步应用的速度
如果我们忽略人工智能和机器人可能造成的环境破坏,考虑到它对资源的大量需求,让我们想想它实际上可以做什么。电话公司和电信公司吹捧你可以用你的手机做的惊人的新事情,如果你能“提高你的速度”或把它带到一个新的水平。然而说实话,你会怎么做?不比以前多多少。流媒体已经运行得相当好了,你还可以玩 candycrush 等等。然而,在它到来之前,我们无法想象我们会用这种速度或连接做什么。每个人,或者大多数人,坐在公共交通工具上,眼睛盯着电话。公共场所挤满了不知何故拿着手机漫不经心地走在前面的人,他们在旅途中导航、阅读、玩耍或社交。除了您的直接使用,我们还应该了解行业中的几个使用案例。
3.2 人工智能结合 5G 机器人技术
有一点可以肯定的是,这种类型的技术可能会使机器人以不同的方式和“智能”机器人在更广阔的环境中工作。我们可以立即考虑将这种技术用于防御目的和监测人口。然而,另一方面,在医院和卫生技术领域,这可以通过技术发明实现不同的工作环境或跟进。
运行与人工智能领域相关的解决方案已经在外部完成,所以你真的会注意到不同吗?如果视频、文本或其他表达/输入被转移到不同的地方,那么对用户来说有什么不同。看到这将如何有所帮助可能是具有挑战性的,人工智能用例在以前的文章中提到过。在 5G 网络中使用机器学习技术来提高所分配的无线电频谱的利用率。目前看来
- 无人驾驶的自动驾驶汽车,
- 自动化或管理公共交通,
- 时间紧迫的工业自动化,
- 远程医疗
这些都是硬件和软件能够改变运营的领域。当然,流程自动化已经在影响工作生活,来自工人的数据被监控,绩效被衡量。然而,可以在医疗保健、运输和工业中操作的机器人可能会因物联网中的这些新技术而得到增强。
3.3 区块链、5G 机器人和人工智能
无论这个标题看起来多么像一个时髦的词,这些新型解决方案所需要的安全性还是有一些值得一提的。考虑到谁在这个物联网领域工作的问题,我们可以说像 IOTA 这样的参与者将会看到巨大的增长。
“我们的愿景是通过验证真实性和交易结算来支持所有互联设备,这将激励设备实时提供其属性和数据。这催生了全新的通用应用和价值链。”
IOTA 协议是由 IOTA 基金会开发的分布式分类帐技术。这是下一代…
www.iota.org](https://www.iota.org/)
因此,我认为在这些进步中所要求的安全性,像 IOTA 这样的公司参与者将是必要的,以使其网状或至少能够工作。
3.4 一个迫在眉睫的问题——维持 5G 机器人和人工智能
正如在引言中提到的,我们必须严肃地质疑这种进步,我们不能一边把双手举到耳朵上,一边继续跑进“现代性”和“进步”。如果我们忽视前面提到的时髦词宾果的潜在不良后果,我们就有大麻烦了。将人工智能传输到高度加密的 5G 网络的能源和资源要求听起来绝对荒谬,这样做甚至有道理吗?
4.欧盟国际安全政策、人工智能和 5G
4.1 连通性增加和新出现的风险
2019 年 10 月 9 日,Techcrunch 写了一篇关于 5G 技术的新联合风险评估报告的文章。迄今为止,欧盟顶住了以国家安全为由抵制华为作为 5G 供应商的压力。2019 年 3 月,美国建议欧盟阻止华为进入其市场。该报告确定【安全挑战】更有可能出现在 5G 网络中。
“攻击风险增加,攻击者的潜在进入点更多:随着 5G 网络越来越多地基于软件, 风险 与主要的 安全 缺陷相关,例如源自供应商内部糟糕的软件开发流程的缺陷变得越来越重要。”
- 某些设备变得越来越敏感,例如基站或网络中的管理功能。
- 移动网络运营商对供应商的依赖可能会导致更多的“攻击途径”。这些都可能被威胁者利用。非欧盟国家或国家支持的国家被认为是最严重的国家,最有可能以 5G 网络为目标。
- 单个供应商的风险状况将变得很重要。
- 存在严重依赖供应商的风险。依赖性会带来很高的风险。
- 对可用性和完整性以及隐私和机密性的威胁。
据 TechCrunch 报道,下一步将是:“……在 12 月 31 日之前,开发一个缓解措施工具箱,由网络和信息系统合作小组商定,旨在解决国家和联盟层面的已识别风险。”
“这意味着 5G 安全业务需要相应地扩大规模,以应对与下一代技术密切相关的多维安全挑战。仅仅禁止一家供应商并不能解决问题。”
4.2 5G 领域的最佳英国科技创业公司
毕马威为初创公司举办了一场比赛,在这场比赛中,我看到了进步(我与毕马威合作)。我将列出本次竞赛中提到的两个创业公司:
- 卫戍科技 开创了一种创新的安全平台,以应对持续和有针对性的攻击威胁,这些攻击利用了企业互联网连接。加里森科技公司的首席执行官大卫·加菲尔德在下面的采访中告诉我们更多。
- SenSat Technology利用主要城市地区的模拟现实,利用机器学习技术提取可操作的见解。这降低了电信公司的 5G 部署成本,并最终降低了消费者的 5G 成本。
安全平台变得越来越重要,尤其是当 5G 的推出处理敏感数据时。使用人工智能来增强这些通信对于机器人的良好工作至关重要。
根据安全报告:“…还应考虑欧洲在软件开发、设备制造、实验室测试、符合性评估等方面的工业能力发展”因此,我们可以预计未来几年将会有更多投资投入到欧盟的 5G 工业扩张中,或者大量投资于 5G 安全。
5.2019 年的中国和 5G
5.1 作为 5G 技术的领导者,超越全球竞争
据说中国正在率先实施 5G,我将在 2019 年底探索当前形势的轮廓。为了这篇文章,我研读了高岗的文章。EY 关于中国和 5G 的报告;最近在彭博的文章;在财富方面。中华人民共和国官方国营新闻机构 新华社在 2019 年早些时候报道了中国目前扩大 5G 网络的计划。其表示,工信部正式向中国电信、中国移动、中国联通、中国广电发放 5G 商用牌照。

西环通讯社检索 2019 年 10 月 31 日信息图
“中国信息通信研究院《5G 产业经济贡献》认为,预计 2020 至 2025 年,我国 5G 商用直接带动的经济总产出达 10.6 万亿元,5G 将直接创造超过 300 万个就业岗位。”
中国信息通信研究院《5G 产业经济贡献》认为,从 2020 年到 2025 年,中国 5G 商用直接经济产出将达到 10.6 万亿元,5G 将直接创造超过 300 万个就业岗位。
在这方面,中国也表示欢迎外国公司在中国工作。
商务部和生态与环境部发布了一项 2019-2020 年短期计划,通过促进依赖 5G 的电子产品和汽车的消费来共同解决这一问题。在被特朗普列入黑名单后,华为等商业公司已经开始快速迈向开发自己的技术,以摆脱美国正在进行的贸易战。
EY 的一份报告概述了中国准备好赢得‘5G 竞赛’。他们制作了一个贴切的信息图表来说明这一点,显示中国在当前的 5G 连接中占有很大份额;收入和很大程度上的本地关系。

EY 于 10 月 31 日检索的信息图
尽管某些国家对中国的信任度有所下降,但仍有共同开发 5G 的明确兴趣,并有 5G 解决方案的预算支出。
10 月 30 日,《彭博》杂志发布了一篇名为中国推出全球最大 5G 手机网络的文章。与中国三大国有无线运营商首次推出 5G 手机服务相关的新闻。该文章指出:
中国最大的运营商中国移动有限公司 在北京、上海、深圳等 50 个城市推出网络,套餐价格低至每月 128 元(18 美元)
这是在华为及其 5G 技术拒绝我们的背景下发生的。这是一年后的计划,但现在比计划提前推出。这意味着中国拥有世界上最大的商用 5G 网络。

Retrieved from Bloomberg on the 31st of October
此外,彭博写道,在中国占据主导地位是华为的重要战略举措:
在全球最大市场的主导地位可以削弱美国针对其他国家安装华为设备的行动的影响,美国指责这些国家构成了 安全威胁 。尽管面临美国的压力,华为在 7 月份表示,它已经签署了 60 多份商业合同,在全球范围内提供 5G 网络,其中至少有 28 份在欧洲。
咨询公司 EY 此前概述了商业发射的途径,但似乎中国正在加速超越这些预期:

EY 于 10 月 31 日检索的信息图
此外,还有一系列用例需要考虑。我之前提到过一些,但是我们可以看到在个人和商业用例中有更多的可能性需要考虑。

2019 年 10 月 31 日,外交关系委员会数字和网络空间政策项目主任艾伦·西格尔(Alan Segal)在《财富》在线上指出:
“这很大程度上也是因为意识到(美国)在这一领域没有制造商,所以,让我们试着让中国慢下来,”
将这一点与世界上最雄心勃勃的人工智能政策结合起来,似乎是一种取得技术领先地位的有趣方式。
至少从表面上看,中国似乎已经取得了 5G 的领先地位。
在这样说的时候,我们必须适度地添加一些关于 5G 以及与这些技术和分布式相关的知识。规模不是一切,我们可能不知道谁正在推动 5G 技术超越中国投资的当前范围和规模。
6.Fitbit + Google AI + 5G =?
6.1 谷歌以 21 亿美元收购 Fitbit
the Verge 发表的一篇文章2019 年 11 月 1 日宣布谷歌收购 FitBit:
谷歌刚刚宣布 以 21 亿美元收购可穿戴公司 Fitbit。在宣布这一消息的博客文章中,谷歌设备和服务 SVP 公司的里克·奥斯特洛表示,收购 Fitbit 是“一个在 Wear OS 上进行更多投资以及将谷歌可穿戴设备引入市场的机会。”****
这可能是一项复杂的投资,但我看到了一些关于为何进行此次收购的不同观点:
- 谷歌希望投资可穿戴设备,但未能独自开发出足够可行的解决方案。因此,它收购 FitBit 是为了提供这种服务。
- 谷歌收购 FitBit 是为了专有技术。
- 谷歌收购 FitBit 是为了它的数据——不是为了增加广告,而是为了协助其在健康技术方面的投资(这构成了 Alphabet 投资组合的很大一部分)。
可能有更多的原因,然而,在保护消费者健康数据方面,消费者似乎有很强的意识。11 月 1 日直接来自 FitBit 的声明如下:
“消费者信任对 Fitbit 至关重要。强有力的隐私和安全指导方针从第一天起就是 Fitbit DNA 的一部分,这一点不会改变。Fitbit 将继续让用户控制他们的数据,并将对其收集的数据及其原因保持透明。该公司从不出售个人信息,Fitbit health and wellness 数据也不会用于谷歌广告。”
Rick Osterloh,谷歌设备与服务高级副总裁。表示他们将把 FitBit 在硬件方面的人才与软件和人工智能结合起来,打造更好的可穿戴设备。
与此同时,拥有谷歌的 Alphabet 正在扩大对 Verily 和 Calico 的投资。这是 Alphabet Inc .的季度报表中反复提到的两家公司。健康数据是一个热门话题。
尽管谷歌可能不会将 FitBit 数据用于广告,但它很可能会将这些聚合数据用于 Verily 和 Calico 的药物开发或健康洞察。是什么阻止了 Google/Alphabet 这样做?
我从 Alphabet 的投资者关系页面的 2019 年第三季度(Q3)页面中获取了一份描述。以下两节摘自 Q3。
6.2 印花棉布
Calico 是一家生命科学公司,其使命是利用先进技术来增加我们对控制寿命的生物学的了解。
【2014 年 9 月,艾伯维公司(AbbVie)和 Calico 签署了一项研发合作协议,旨在帮助两家公司发现、开发和向市场推出针对年龄相关疾病患者的新疗法,包括神经退行性疾病和癌症。在 2018 年第二季度,艾伯维和 Calico 修订了合作协议,导致总承诺量增加。截至 2019 年 9 月 30 日,艾伯维已根据协议出资 7.5 亿美元资助合作,并承诺额外出资 5 亿美元,将于 2019 年第四季度支付。截至 2019 年 9 月 30 日,Calico 已出资 5 亿美元,并承诺追加 7.5 亿美元。
Calico 利用其科学专业知识建立了世界级的研发机构,专注于药物发现和早期药物开发;艾伯维提供科学和临床开发支持及其商业专业知识,将新发现推向市场。两家公司平等分享本协议项下项目的成本和利润。艾伯维的出资在 Calico 的财务报表中被记录为负债,由于 Calico 产生了符合条件的研发费用,因此该负债被减少并反映为研发费用的减少。
截至 2019 年 9 月 30 日,我们已向 Calico 出资 4.8 亿美元,以换取 Calico 可兑换优先股单位,并承诺根据需要和特定条件额外出资 7.5 亿美元。
确实地
Verily 是一家生命科学公司,其使命是利用世界健康数据,让人们享受更健康的生活。2018 年 12 月,Verily 获得了 10 亿美元投资轮的 9 亿美元现金。剩余的 1 亿美元于 2019 年第一季度收到。截至 2019 年 9 月 30 日,Verily 已从向外部投资者出售股权证券中获得总计 18 亿美元的收入。这些交易作为权益交易入账,没有确认任何收益或损失。
6.4 你对 21 亿美元有什么期待?
当你以难以想象的金额(对大多数人来说)收购一家公司时,预期投资回报并非不可思议。
另据Quartz:Alphabet报道称,来自谷歌广告业务的收入为 326 亿美元,比去年同期增长了约 16%**
尽管 Alphabet 收益丰厚,但这是一个相当大的赌注。自 2015 年首次公开募股以来,Fitbit 的股票下跌了~ 80。
在收购之前的几年里,FitBit 的销售额和收入似乎一直在下降。
谷歌正在购买进入可穿戴设备市场的方式,并可能大幅增加 FitBit 的扩张以及该平台的可能性。

Retrieved from IDC on the 2nd of November
6.5 赌注开始了
这个赌注会有回报吗?有关系吗?
这为理解人类提供了更多的力量,这无疑是谷歌成功的一部分。
亚马逊 Alexa 可能会和你说话,但随着 5G 的发展,在你身上安装一个可以做到这一点的设备,同时持续传输结果可能会达到更高的程度。
今年早些时候,有人预测 5G 将提振 FitBit 的股价:
“通过让可穿戴设备做更多的事情,让它们变得更加不可或缺,5G 将让可穿戴设备变得更加流行和有价值,提振这些公司的财务状况。”
5G 的到来还将使可穿戴设备能够更精确地监测个人的身体、情感和精神健康。
换句话说,谷歌的这项投资有望获得回报。
投资的另一个原因可能是意识到“搜索”正在发生变化。越来越多的人在问 Alexa,也会问自己的设备。因此,设备的“战斗”或竞争可能会影响谷歌目前的战略投资。
结论
5G 网络正在扩张,它们拥有潜力,但我们不应屈服于“竞赛”心态。虽然从安全的角度来看这是可以理解的,但从环境后果的角度来看,这是一个两难的选择。中国在将覆盖范围扩大到几个城市方面“领先”,这或许是为了表明他们没有被正在进行的贸易战吓倒。5G 可能会使较小的连接设备在连接方面更好地工作。因此,或许谷歌通过收购 FitBit 大举进军可穿戴设备是一场有意义的赌博。然而,人工智能和 5G 的问题既是一个个人安全问题,也是一个国际安全问题,甚至更多。毫无疑问,现在这些解决方案正在推出,政府和独立研究人员必须在公司内部密切跟进。
人工智能和或多或少合乎道德的工作未来

Photo by @fabiolucas_foto
格雷格·爱泼斯坦,麻省理工学院人文主义亿万富翁
11 月 28 日,TechCrunch 上发表了一篇关于工作未来的文章。这篇文章是哈佛大学和麻省理工学院的人文主义牧师格雷格·m·爱泼斯坦(Greg M. Epstein)和《纽约时报》畅销书《没有上帝的好》的作者——以及两位主要组织者 EmTech 之间的对话。这两个关键组织者是吉迪恩·利奇菲尔德和卡伦·郝。我不能访问它,因为它在付费墙后面。然而,这伴随着另一篇文章,叫做:
未来的工作会伦理吗?在经历了几代人日益加剧的不平等之后,我们能教会科技领袖爱邻居胜过爱算法和利润吗?
那篇文章是公开的,我推荐阅读。今年 EmTech 的主题似乎是人工智能、机器学习和工作的未来。这就是格雷格所描述的“…存在危机的机会;我甚至可以说是一场宗教危机,尽管我不仅是一名坚定的无神论者,还是一名职业无神论者。”他思考未来的领导人是会更有效地开发还是会找到一条不同的道路。
他首先谈到一个来自麻省理工学院的 17 岁少年梅利·古普塔,她主持了一场辩论。她在物质杂志埃克塞特的 STEM 杂志上发表了关于人工智能和气候变化的文章。"她认为技术伦理是她这一代人的工作."
阿南德·吉里达拉达斯出席。作家阿南德·吉里达拉达斯在他的书《赢家通吃》中批评了他所谓的“双赢主义”宗教。提到的几个例子是:
- 马克·扎克伯格 拥护言论自由作为民主的核心信念,同时通过带数百万人发布虚假政治广告来破坏民主
- 马克·贝尼奥夫 宣布资本主义的终结和一个新的伦理时代,而 维持着自己的亿万富翁地位*为 Salesforce 的支持辩护 ICE ,甚至为无证儿童与家人分离。*
格雷格想知道:“未来的工作会不会是一个反乌托邦,像古普塔这样有思想的年轻人告诉自己他们想拯救世界,但最终却统治了世界?”
他提到了自己自 2005 年以来在哈佛大学担任人文主义牧师的时光。2018 年,他加入了麻省理工学院的宗教生活办公室(该办公室很快更名为宗教、精神和伦理生活办公室或 ORSEL ),担任其人文主义牧师。在麻省理工学院,一个非常世俗的机构,只有大约 49%的学生认为自己是宗教徒(显然这个数字很低)。
格雷格讲述了他是如何发现,尽管在并不富裕的环境中长大,他仍然拥有特权:“……奴隶制不仅是我一直认为的道德罪恶——它还是《T4》中的单曲。最大。随着唐纳德·特朗普(Donald Trump)当选,我再也无法回避这样一个结论:白人至上和盗贼统治就在此时此地依然存在。他谈到了美国的精英制度,以及吉里达拉对扎克伯格和比尔盖茨的批评,他们捐出了数十亿美元,但他认为,这样做主要是为了掩盖贪婪、剥削和对民主的颠覆。
正因为如此,格雷格意识到他没能批判他发现自己所处的权力结构。
顺便提一下,这听起来很讽刺,因为关于道德的讨论超出了 TechCrunch 称之为“Extra Crunch Exclusive”的最昂贵的付费墙。

Screenshot taken on the 1st of December 2019.
很高兴在过去的一个月里,在这里推出了一个调查技术伦理问题的每周系列…
techcrunch.com](https://techcrunch.com/2019/04/02/expert-panel-what-even-is-tech-ethics/)
一方面,当人们谈论把东西放在昂贵的付费墙后面,让它们变得更容易获得时,总是很有趣。另一方面,我也不能说我有多好,因为我在中等收入的付费墙后面发布了几篇帖子。
格雷格涵盖了很多领域,并提到安东尼·莱万多夫斯基试图建立一个崇拜未来人工智能之神的教堂。他质疑技术是否更像一种宗教而不是一个产业。气候问题再次出现,为所有这些“改变世界”的人工智能提供动力的巨型数据中心对气候的影响比数百次跨大西洋飞行还要糟糕。
加州州长加文·纽瑟姆甚至宣布了一个有声望的“未来工作委员会”,这是第一个在全州范围内服务的委员会。Greg 提到了一个关于工作的时代封面和对第二个机器时代的的快速评论。格雷格若有所思地说:
“我想知道,对‘工作的未来’进行哲学思考,是否只是世界上最富有、最有影响力的人说服自己深切关心他们的员工的一种方式,而他们所做的更像是制定战略,如何在未来几十年继续保持强大?”
亿万富翁人文主义
他提出了一个术语“亿万富翁人文主义”。他提到了麦肯锡全球研究所(McKinsey Global Institute)的一份报告,“美国工作的未来”,这或许是站在愤世嫉俗的立场上说的——“他们的观点相当明确:两极分化的加剧意味着健康和 STEM 等某些行业将大有斩获。”
“亿万富翁人道主义是当我们说我们把每个人的生命都视为原始和平等的时候发生的事情,但在实践中,如果大多数人从出生到死亡都遭受各种不稳定的压力,那么我们就很好,所以相对少数的人可以过上非常自由和奢侈的生活。”
他的批评是对迈克尔彭博 2017 年发表的有影响力的《工作的未来》报告的猛烈抨击。每个场景都以一个游戏命名:石头剪刀布,城堡之王,跳绳,走。这让我想起了某个推特迷因:
绝对没有人:
根本没有人:
实际上没有人:
轮班委员会:“嘿,让我们来讨论一下,从现在起的一代人中,人们是否能够找到体面的工作,或者除了我们之外的几乎所有人是否都会陷入贫困,成为一个可爱的游戏!”
他热情地谈到了麻省理工学院经济学教授大卫·奥特(David Autor)展示他的最新论文“过去的工作,未来的工作”Autor 研究了失业工人:没有受过大学教育,大多是经历过自动化的制造业男性。然后,他严厉谴责了奥斯特曼的书《谁来照顾我们》,他在这里的讲话是关于改善数百万“直接护理人员”的条件——改善为富人收拾残局的机会。
“解决市场驱动的不平等的权宜之计是我们所能期待的最好结果吗?”
他引用了尼尔·波兹曼在他 1992 年的著作《技术垄断》中的话:“经济学确实是道德神学的一个分支”。他提到了使命驱动型科技公司(mission-driven tech)和凯伦·郝(Karen Hao),她进入一家科技公司,只是为了在首席执行官被董事会罢免后退出。
“召开会议的媒体实验室大楼是在 伊藤约伊、 的指导下进行的,这位技术伦理学家是如此传奇,以至于当巴拉克·奥巴马在 2016 年作为客座编辑接管一期 Wired 杂志时——作为现任美国总统——他要求就人工智能的未来亲自采访伊藤。就在我和郝坐在那里大约两个月后,有消息称伊藤与杰弗里·爱泼斯坦(Jeffrey EP stein)(没有他妈的关系,谢谢)(Jeffrey EP stein)建立了长期关系,后者是臭名昭著的儿童性骚扰者,也是某些精英科学、技术和写作圈子中无处不在的人物。
他同时提到了比尔和梅林达·盖茨基金会:
谁决定每一个生命具有“同等价值”是什么样子?
格雷格提到这听起来可能有些自命不凡,但正如他所说:“……在一天结束时,比尔·盖茨决定了建立在他 12 位数净资产基础上的基金会的方向。”作为一个例子,盖茨在 2011 年被定罪后会见了爱泼斯坦。他提到了税收:“我们可以向他们征收更多的税,并将所得重新分配给穷人和受剥削的人,这可能会从一开始就消除他们对慈善机构的需求。”
麻省理工学院以社会公益为使命,但它长期致力于发展大规模杀伤性武器。耗资 10 亿美元的斯蒂芬·a·施瓦茨曼计算机学院以一位与唐纳德·特朗普关系密切的捐赠者的名字命名。
“给我看看你的预算,然后我会告诉你你的价值观是什么。”
在这篇文章的结尾,吉迪奥·利奇菲尔德给了格雷格一个最悲观的答案,这显然是他迄今为止在我 40 多次采访中得到的最悲观的答案。“我并不特别乐观……从长远来看,你知道,这些都不重要。这个物种消失了。短期内我也相当悲观。]"
《按需工作的阴暗面》由《人工智能》记者郝主持,其中 玛丽·格雷、 一位人类学家兼科技研究员。《幽灵工作:如何阻止硅谷建立新的全球下层阶级》(与计算机科学家西达尔特·苏里合著)
“亚当·诺伊曼(Adam Neumann)在他的白金降落伞套现(总计 10-20 亿美元)前几个月,将他创立的公司置于如此糟糕的财务状况,以至于它甚至无力支付数千名被解雇员工的遣散费。”
另一名技术研究员谈到密歇根弗林特与【2,500 铅服务线仍然在那里。
Greg 建议,整个科技行业可以用一个首席社会工作官来帮助我们应对持续的焦虑和不足感,并让更多女性进入领导层。
“……我们不需要一个对更美好未来的完美预言就能知道很多被认为是“工作的未来”的讨论并不是这样。很明显,这样的讨论排除了,事实上,排除了大多数将不得不真正经历未来的人。”
我认为 Greg Epstein 的文章是我在相当长的一段时间内读过的关于伦理的最好的文章之一,它是对技术行业的一个宏伟的咆哮,这是在一次会议上与在场的各种人交谈中探讨伦理的一个灵感。*
这里是#500daysofAI,您正在阅读第 180 篇文章。500 天来,我每天都写一篇关于人工智能或与之相关的新文章。
人工智能和商业价值

数字技术无处不在。世界上现在有近 50 亿人拥有移动电话连接,超过 70 亿部移动电话正在使用中(有些人有不止一部电话)。大约有 25 亿部手机是智能手机。手机的普及率现在正接近电力的普及率——约 88%的世界人口,即 67 亿人用上了电。
与此同时,先进的数字技术,特别是人工智能,正在嵌入各种物理“东西”,从汽车到烤面包机到恒温器。每部智能手机都有一些人工智能的元素,这意味着人工智能正在影响世界上至少 25 亿人口。过去三年来,每家公司都在努力理解数字冲击,并确保某种程度上的战略到位。在这段时间里,各种各样的人和资源都在努力预测公司、人和世界将从数字技术,更具体地说,从人工智能中获得的价值。这是 techland 创造兴奋和 FUD(恐惧、不确定性和怀疑)的自然循环的一部分,随后是可预测的投资狂热,导致一些重大突破和一些同样重大的失败。
以下是我读过的一些当今关键技术的商业价值主张(转述):
- 人工智能大于电和火。
- 区块链的经济价值是互联网的 10 倍。
- 到 2025 年,IOT 的经济影响预计将在 3.9 至 11.1 万亿美元之间。
- 到 2030 年,区块链的全球经济增加值预计将达到 3 万亿美元。
- 2018 年,人工智能(AI)产生的全球商业价值预计将达到 1.2 万亿美元。
- 人工智能衍生的商业价值预计将在 2022 年达到 3.9 万亿美元。
浮夸还是真货?
我们该如何理解这些宣言?这是一块劣质的劳力士手表,还是真货?从远处看,你真的分不清一块浮华的劳力士和真品;只有仔细观察,你才能知道它是不是赝品。那么,让我们仔细看看。
累计值不能超过收入
在我职业生涯的早期,我在一家财富 50 强制造公司从事供应链转型项目。在此计划的第一阶段,团队执行了一个流程来制定转型计划。在第一阶段,我们绘制了现有流程,确定了未来愿景,确定了从 A 点到 B 点的解决方案,量化了从 A 点到 B 点的价值,并制定了分时段的价值交付计划。该交付计划包括基于交付的经济利润(也称为 EVA 或 ROIC)的回报分析。然后,总体计划被提交给 C 级主管批准。这种方法现在在软件行业相当标准。(虽然这种方法在当时的软件行业是新颖的,但公司已经使用类似的方法几十年了,至少从 1915 年杜邦模型的开发开始)。
尽管我后来参与了几十个转型项目,但在这个早期转型项目开始时发生了一件有趣的事情,这件事在当时非常突出,此后我一直记得。这位聪明、经验丰富且有点讽刺的客户项目负责人召集团队讨论了该过程中价值发现部分的状态。他做了一个有趣的评论,“记住,每个改进领域的累积价值不能超过收入。”在对改进的狂热中,许多项目追求相同的改进桶;例如,库存是供应链项目的常见目标。项目负责人想说的是,如果公司将所有单个部门和公司的库存改善项目目标相加,它们可能会超过资产负债表上的库存数量。因此,重要的是要仔细检查个别改进目标的价值,并确保项目之间没有二次探底。
数万亿美元的数字技术改进索赔也是如此。
什么是商业价值?
大价值宣言的一个问题是,它们背后没有太多的定义或科学。有人说销量增加就是商业价值;其他人可能会说降低成本。两者都是商业价值,但是更正式的定义也要考虑成本。商业价值的一个常见正式定义是经济利润:
经济利润=税后净利润减去资本成本。
换句话说,它是我的收入减去我所有的运营成本,再减去我需要用来创造收入的所有资本成本。这是一个相当标准的定义,在商业界已经存在了 100 多年。让我们用这种思维来看看是否有任何万亿美元的价值陈述通过了嗅探测试。
假设世界经济是一门生意。如果是这样的话,全球企业将拥有约 82 万亿美元的收入和约 6.2 万亿美元的税后净利润。全球增长率约为 3.7%。现在,让我们说商业价值意味着利润(因为全球经济很难获得资本配置的成本),人工智能将创造约 1 万亿美元的年增量价值。这意味着艾将净利润提高 16%;如果增量价值为 2 万亿美元,那么 AI 将为净利润带来 32%的巨大增长。现在,假设没有利润扩张,但 AI 通过销售增长创造了这样的价值。对于 2 万亿美元的增量利润,人工智能必须创造 26 万亿美元的额外 GDP。这需要全球增长率大幅上升,而这是极不可能的。10 万亿美元的增量价值呢?Fuhgeddaboudit。
你大概可以看到这是怎么回事。这些数字没有通过最基本的嗅探测试,至少在使用商业价值的标准定义时没有。
我们可能遗漏了什么?
电对人工智能
电的商业价值是什么?那就好比问水对人体的价值是什么。思考它的价值的一个合理的方法是把它拿走。如果你从人体中取走水,人体将不复存在。如果你把现代公司的电拿走,它也将不复存在。像人工智能这种东西的商业价值是不一样的;一点也不像电。它不像水;更像是酒,或者音乐,或者甜点。如果它不复存在,商业仍将继续,但生活将少了很多乐趣。换句话说,在马斯洛的需求层次中,人工智能和类似技术的商业价值的最大份额将朝着金字塔的顶端增长,从而实现更高水平的启蒙。例如,在零售业,更高层次的启示来自于产品和履行选择的高度个性化的体验。
那么,如果这是真的,那么如何对它进行估价呢?答案很简单——会有赢家,也会有输家。一个 1 万亿美元的价值馅饼可能看起来像这样:赢家获得 8000 亿美元,输家损失 8000 亿美元,2000 亿美元的价值浪潮提升所有船只。在这个简单的例子中,整个经济和社会将获得 20%的份额,而 80%将是一个零和游戏。我的猜测是,这 20%比代表赢家和输家的 80%更接近真实的经济价值。
因此,如果今天的商业竞争主要发生在马斯洛层次结构的顶端,正如个性化所表现的那样,如果人工智能是提供这些能力的关键成分,那么人工智能的价值确实是巨大的。在成熟市场尤其如此,消费者不再将葡萄酒、音乐和甜点视为必需品。越来越多的人开始变得必须拥有。人工智能将越来越多地决定赢家和输家,即使它不会显著增加整体蛋糕的大小。不幸的是,它的价值可能会不平衡地增长,那些已经被过度服务的人会变得越来越不平衡。
无所事事的情景
对于企业来说,这实质上意味着考虑所谓的“无所事事的情况”这是克里斯滕森、考夫曼和施在《哈佛商业评论》经典文章、、中提出的思维模式。正如作者所言,“[回报分析]的第一个错误是假设不投资于创新的基本情况——无所事事的场景,与创新产生的现金流进行比较——是如果不投资,公司目前的健康状况将无限期地持续到未来。”这基本上意味着如果你不投资,你必须考虑倒闭的可能性。
因此,人工智能和数字技术的任何数万亿美元的价值陈述大多都是关于避免价值破坏,而不是以增加销售或利润的形式创造增量价值。与无所事事的情景相比,这一价值将是巨大的增量,但与当前的收入和利润基线相比,这一价值非常小。
兜了一圈
如果这听起来有点像循环讨论,那是因为确实如此。前面列举的数值有对有错。他们说人工智能将为社会创造和传递那么多价值,这是错误的;但就获胜者而言,他们是对的。用赢家的累计价值减去输家的累计价值,然后再减去所需投资,可能只会给全球 GDP 增长率带来增量正增长。一度,电力也决定了赢家和输家,但它同时也显著扩大了整体蛋糕。
那么,结果如何?劳力士是真的还是假的?答案是两者都不是。这块表是真的,是真的,但它既不是真正的劳力士,也不是华而不实的劳力士。这是一种完全不同的手表——姑且称之为卡地亚,而且是真正的卡地亚。
原载于 2019 年 2 月 8 日【www.worldlocity.com】。
人工智能及其在金融中的应用
金融中的人工智能
人工智能将如何驱动行业的未来

Snapchat’s IPO on the New York Stock Exchange (Source: Hollis Johnson)
“交易大厅”。当你听到这些话的时候,你会想到什么?你可能会想到西装革履的男人疯狂地打手势,不停地咒骂对方,或者类似的混乱环境。然而,这些曾经无处不在的场内经纪人正被高速计算机程序所取代。
例如,Citadel Securities 每天交易 9 亿股股票(占美国股票交易的八分之一)。只有 40 人在该公司的交易大厅工作,监督使用算法来完成股票订单的计算机。高盛雇佣的程序员和工程师比脸书还多。2018 年,金融科技(fintech)公司筹集了 400 亿美元。如果事情还不清楚的话,技术将会扰乱金融部门。人工智能是引领这一变革的技术之一。在我们了解人工智能在金融服务中的应用之前,我们必须了解技术本身。
机器学习
机器学习是人工智能的一个子集,专注于开发无需显式编程即可根据经验自主学习和改进的计算机程序。机器学习的三大类型是监督学习、非监督学习和强化学习。
监督学习

监督学习的目标是创建预测模型。最初,带有标记的输入和输出示例的训练数据集被馈送给算法(因此命名为受监督的)。然后,算法在调整了参数的训练集上运行,直到达到令人满意的准确度。通过这种分析,算法创建了一个可以预测未来输出的函数。在上面的图像中,人工智能模型被赋予了被标记为“猫”的猫的图片。然后,该模型根据猫的标记数据进行训练,直到它可以识别猫图像中的模式。因此,该模型将能够通过对先前识别的模式做出反应来预测后来的图像是否显示猫。
无监督学习

无监督学习的目标是在数据中发现模式。与监督学习相反,无监督算法被赋予一个没有分类或标记样本的训练集(因此得名无监督)。为了辨别模式,该算法使用聚类。每个集群由满足其要求所需的标准来定义;然后,将该标准与处理后的数据进行匹配,以形成聚类。然后,根据共同特征将训练集分成多个簇。在上图中,输入数据没有类别标注,由鱼类和鸟类组成。使用此输入数据建立的无监督模型将通过基于共同特征对数据进行分组来创建一个鱼类集群和另一个鸟类集群。
强化学习

强化学习的目标是训练一个模型做出一系列决策,使总回报最大化。在强化学习中,机器学习模型面临类似游戏的情况,在这种情况下,它使用试错法来解决它所面临的问题。程序员通过增加奖励和惩罚来操纵模型以某种方式行动。结果,模型被激励去执行有奖励的行为,而被阻止去执行招致惩罚的行为(这个反馈就是“强化”)。一旦该模型自行找出最大化回报的最佳方法,它就会从随机试验发展到复杂的策略。例如,谷歌的 Alpha Go 计算机程序训练来玩围棋,最终击败了世界冠军。这是一个巨大的成就,因为有 10 种⁷⁰可能的棋盘配置(比已知宇宙中的原子数量还要多),而且以前没有计算机程序击败过职业围棋选手。
自然语言处理

自然语言处理是人工智能的另一个子集,用于金融领域。自然语言处理的首要目标很简单:破译和理解人类语言。语音识别软件(例如 Siri)从语音音频中分离出单独的声音,分析这些声音,使用算法找到最佳匹配的单词,将声音转录成文本。在将自然语言转换成计算机可以理解的形式后,计算机利用算法从文本中推导出意义并收集必要的数据。现在我们了解了机器学习和自然语言处理,我们可以更好地理解金融中的人工智能。
金融中的人工智能例子

人工智能在卖方(投资银行、股票经纪人)和买方(资产管理公司、对冲基金)都有多种多样的应用。
卖方
- 公司正在使用机器学习来测试投资组合(信贷/交易)
- 银行正在试验自然语言处理软件,该软件可以监听客户的对话,并检查他们的交易,以建议额外的销售或预测未来的请求(信贷/销售)
- 银行正在使用机器学习算法,为公司的资产负债表推荐最佳利率互换(利率/交易)
- 自然语言处理软件监控收件箱和电子平台中的客户信息,以确定他们希望如何在基金之间分配大宗交易(利率/销售额)
- 受监督的机器学习算法寻求资产价格和其他数据之间的相关性,以预测未来几分钟或几小时的货币价格(外汇/交易)
- 强化学习人工智能运行数百万次模拟,以确定执行客户订单的最佳价格,同时降低市场影响(现金/交易)
- 自然语言处理软件可以阅读合同,并通知客户互换到期和其他条款(衍生品/销售)
买方
- 计算机正在筛选历史数据以识别潜在的股票、债券、商品和货币交易,使用机器学习来预测它们在各种经济情景下的表现。历史数据也被检查以帮助设置赌注的大小、时间和持续时间(识别交易/投资组合结构)
- 机器学习算法分析市场变化的数据,以相应地模拟交易的变化。此外,对估价进行分析,并预测价格(监控交易)
- 算法分析不同的数据集,如消费者对品牌的情绪和石油开采特许权。卫星图像和房产清单等数据可以用来追踪经济趋势。自然语言处理还分析盈利电话的文字记录,阅读新闻,监控社交媒体。还对来自央行和会议的评论进行关键词和情绪分析(正在进行的研究)
总体而言,金融机构以各种方式利用人工智能来改善他们的运营。随着华尔街进入一个新时代,技术只会在金融行业变得更加普遍。
先别走!
我是 Roshan,16 岁,对人工智能和金融的交叉领域充满热情。要查看人工智能在金融领域的更具体的项目,请查看这篇关于使用自动编码器检测日志条目异常的文章。
在 Linkedin 上联系我
人工智能和非营利组织

Photo by @joelfilip
非营利组织如何善用人工智能?
AI 安全的一部分可能是确保分配或致力于平等吗?我以前写过关于 AI 中的公平;数据质量的重要性;和与性别有关的平等。然而,最具挑战性的文章是《不平等与人工智能》。如果人工智能恶化或加剧了不平等,那么它真的安全吗?最大的不平等之一是什么?
对于非营利组织来说,重要的是与新技术的制造商联系,看看是否有任何一部分收入可以用于人道主义目的或项目。尽管我们可以质疑这些技术,因为它们当然不是完美无缺的,但非营利组织能够筹集资金和解决问题无疑是重要的。这些组织面临的问题通常是一个迫在眉睫的大问题“如何做”?在一个理想的世界里,他们的运作是不需要的,然而在目前的情况下,慈善部门有一席之地,而且他们的运作方式肯定在改变。
随着这些服务转移到应用程序或社交媒体,参与者多种多样,跟上这些服务似乎是一个挑战。在许多情况下,人工智能或人工智能等技术被集成到现有的产品或服务中。有必要协作吗?我们继续假设它可以与机器学习项目一起产生,并且一部分钱应该捐给慈善机构。让我们探索几个选项,但首先快速看一下人工智能。
AI 为好
由于我一直在集中撰写关于人工智能的文章,我已经看到了人工智能的崛起趋势。看起来部分慈善机构对此很感兴趣,但是让我们先看看可能性和一些可能的问题。我首先回顾一下 Salesforce 最近发布的名为AI for Good non profit Trends&用例的报告。
来自 Salesforce 报告覆盖五个方面:(1)对 AI 的描述;(2)为什么非营利组织应该参与进来;(3)想象美好的未来;(4)利用 AI 推进你的使命;(5)如何保持 AI 的伦理性。
首先,我发现他们对人工智能的描述有点令人困惑,因为它把一切都放在一个篮子里。在这方面,我认为芬兰著名的人工智能课程《AI 的人工智能元素》所做的区分,与之前的另一篇文章提供了更恰当的区分:
“狭义 AI”或“应用 AI”是利用软件来研究或完成特定的问题解决或推理任务。也许可以说,在这种意义上,应用人工智能是最常见的用法,比其对应的 广泛/强烈的人工智能 更容易定义,后者据说在时间上接近 AGI 的思想——更有能力体验意识。”
这一点更清楚,我们的具体重点是狭窄的人工智能,我们可以进入报告的描述,他们提出了几个一行的例子:语音助手 Siri 照片的脸书推荐引擎;亚马逊,推荐产品;和谷歌地图提供最佳路线到一个理想的位置。在这之后,他们尝试销售 Salesforce 产品,并概述非营利组织如何开始使用人工智能(了解更多关于应用人工智能的信息):
- 采集数据
- 从数据中学习
- 根据洞察力采取行动
这听起来像是一个简单的三步过程,但却带来了很大程度的复杂性。以良好的方式处理信息变得越来越重要,因此高质量的数据也是非营利组织可以发挥作用的地方。他们从《经济时报》的一篇文章中为盈利组织提供了一个令人信服的论据。
“人工智能和机器学习正在成为盈利领域的热门话题。事实上,拥有人工智能的盈利组织预计到 2020 年其收入将平均增长 39%,成本将下降 37%。”— 《经济时报》(印度时报)2017 年 1 月 17 日【加粗】
除此之外,非营利组织对人工智能的使用预计将在未来两年增长 361%。这可能更能说明目前使用人工智能的非营利组织数量很少,以及人工智能或机器学习劳动力有多昂贵。有人认为,在全球层面上,非营利组织体现的价值观和原则有助于塑造人工智能的未来。这些应用程序可以被识别并获得支持,而不是利用易受攻击的人。
在报告中还提到了人工智能的五项原则。
- 有益:资助研究以确保人工智能的有益利益不应该只用于国防或健康——必须有对人工智能的有益使用,可以解决非营利组织长期以来一直在处理的严重挑战性任务。
- 人类价值调整:随着《T4》《黑客帝国》 等纪录片的推出,以及欧盟因脸书和谷歌对数据或竞争规则的监管而对其处以数十亿美元的巨额罚款,数据公民权正受到越来越多的讨论。这些公司认为的“好”是什么?这可能与非营利组织中人们所认为的“好”不相符。参与这一价值调整至关重要。
- 科学与政策之间的公开辩论:科学与政策之间的健康交流对于造福人类的进步至关重要。如果私营公司、科学、决策者和非营利组织之间就可能的“好”或对社会的风险进行公开辩论,这可能是有益的。
- 系统和人工智能社区之间的合作、信任和透明度:如果我们考虑合作的方面,非营利组织决定开始让不同类型的社区参与发展其对战争或国防中这一新技术的理解,尽可能多地了解使用这一技术进行筹款的潜在财务好处,这是至关重要的。如果欧盟除此之外还决定采取伦理和以人为本的方法来发展人工智能,那么这可能会与更广泛的欧洲战略保持一致。
- 安全与责任:那里似乎是越来越多的数据科学家和开发人员使用机器学习技术,然而人工智能安全的上升及其是否一致是一个很难回答的问题。从表面上看,我们可以得出一个不一致的结论,事实上,如果我们正在为社会构建这些应用程序,而在这些领域的投资却少得多,那么这似乎不是一个优先考虑的问题。网络安全很重要,但跨学科团队为非营利组织和企业提供安全服务似乎越来越有必要。毕马威灯塔有安全、编程和社会科学背景的人。该团队也紧邻直接从事国际发展和可持续发展工作的毕马威 IDAS。由于我目前在这种环境下工作[ 作为毕马威的实习生,我可以看到这些组合对于确保负责任的运营可能很重要,因为不是所有的慈善机构或小型组织都可以拥有一个运营团队来解决该领域的各种问题。如果我们将这一点与金融专业知识结合起来,那么就相对容易证明,在非营利项目中实施人工智能的过程中,开始朝着更安全的方向迈进。
我们站在数字鸿沟面前,面对严重的不平等,我们必须尽最大努力负责任地采取行动。

为什么这对非营利组织有更大的好处?
Salesforce 的报告概述了相对于商业而言,个人非营利组织 AI 的好处。我采纳了他们的两条建议(因为我觉得第三条更像是推销),并加入了一些我自己的想法:
- 非营利组织的资源和员工的时间有限,在这方面,负责任地使用技术的人工智能辅助运营可能是有益的。这可能是日常工作中的情况,也可能是紧急通信出现危机的情况。我之前在挪威人工智能研究中心(CAIR)采访过 Morten Goodwin,他们最近写了一些关于机器学习如何在灾难中更快地识别出需要帮助的人的论文。
- 具有宣传目标的非营利组织可以从访问更复杂的指标(通常显示得更好)中受益,从而更好地了解他们的受众以及对态度和行为的影响。指标并不能说明一切,但它们有时有助于提供更大图景的概览,而且除此之外,显示信息的新方式可能有助于委托人、成员或资助者更好地了解他们正在帮助解决的情况(当然,在这方面保持隐私的需要非常重要)。
在这方面提到的一个有趣的倡议是 GovLab,这是一个智囊团,经常与政府有关的主题合作,如激进主义和卫生保健。技术的成功确实完全取决于开发该技术的参与者之间的关系,并且已经有几个不太成功的治理项目(即使是微软的)。我看了一份由万维网基金会(互联网的创造者)写的关于在阿根廷和乌拉圭的人工智能治理的报告。人工智能领域内不加批判的应用很可能会损害当前的信任和未来新项目的实施。
什么是伦理 AI?
有许多可能的方法来解决这个问题。一个经典案例是关注捐赠者。有了捐赠者的数据,你只需点击一个按钮,就可以进行分析。可以预测给予的可能性,志愿服务的历史。程序结果可以用历史数据进行分析和显示,但这当然不应该总是作为判断的一部分,而是为了更好地理解。
然而,这当然提出了几个关于伦理(道德原则)的问题。随着脸书开始在培训和研究领域进行大规模投资,解决这一问题的趋势越来越明显。谷歌正试图开发隐私技术,如由半结构化机器学习的进步辅助的联合学习。因此,试图在没有任何方法深入了解他们是谁的情况下学习人们做什么,这似乎是一项具有挑战性的任务。Salesforce 报告概述了“保持人工智能道德”的六种不同方式。
- 建立多样化的团队。建议招聘多种背景。然而,在这种情况下,必须提到的是 Equal AI 和其他人认为机器学习领域目前可能是最不多样化的领域之一。
- 培养道德观念。道德是一种心态,而不是一份清单。授权员工做正确的事情很重要。公司可以和非营利组织一起培养道德观念。
- 进行社会系统分析。让利益相关者参与流程的每个阶段,以纠正人工智能数据中系统性社会不平等的影响。开源平台可以从社区获得信息,并创建所谓的“社区冲刺”,这在灾难或危机的情况下尤其重要,以支持不同群体的参与。
- 透明。理解价值观,知道谁受益谁付费,以及让用户控制数据以提供反馈是绝对必要的。探索发展尤其重要,因为有可能混淆或告知。数量越多,责任越大非政府组织最不想要的就是一个“黑匣子”和算法,这些东西无法向资助者解释,或者你知道可能存在外部性(损害),这些外部性会让你措手不及。
- 了解自己的价值观。如前所述,哪些关键应用程序应该自动化或不应该自动化?在做决策时,检查可能产生冲突并导致妥协的结果和权衡是至关重要的。做出取舍时,必须让每个受影响的人都明白。如果人工智能算法阻止人们确切了解决策是如何做出的,这可能会很困难。 Cassie Kozyrkov 谷歌的首席决策工程师写了很多关于这个话题的文章。
- 让用户控制他们的数据。非营利组织收集用户数据是不可避免的,由于非营利组织的角色,这个部门可以成为比其他公司或组织更专注于考虑数据公民的参与者。该报告建议您允许用户更正或删除您收集的关于他们的数据。非营利组织最终可以通过各种在线接触点或物联网获得大量关于其成员的数据。
- 保护您的数据。非营利组织很少提到数据安全(或者说不够经常)。2019 年 5 月,纽约最大的非营利组织之一 People Inc 发生了一次重大数据泄露(多达 1000 名客户)。同样,许多非营利组织没有大量专门的 IT 人员,但网络攻击是一个真正的威胁,GDPR(2018 年 5 月生效)必须考虑。小型慈善机构可能会因为不遵守规定而破产,大型慈善机构可能会面临巨额罚款。
- 接受反馈。允许用户反馈他们对狭义人工智能的看法。在这种情况下,将你的产品命名为人工智能可能是获得关注的一种快速方式,但如果技术没有得到解释,这也是一种从客户那里获得抽象不信任的快速方式。或许谈论机器学习技术比谈论人工智能更明智?如果是这样的话,不管怎样,它必须被清楚地解释,并且有可能让人们与你的方法互动。人工智能开发解决方案领域的社区似乎有一种开放源代码的态度,然而并非如此。如果没有反馈,当您处理治理问题时,您的产品会变得更弱更不符合。
金融科技领域的毕马威智能自动化
在这份报告中,毕马威将 人工智能 描述为:机器模仿智能人类行为的能力。
【机器学习(ML) :机器学习是人工智能的一种应用,它使系统能够自动从经验中学习和改进,而无需显式编程。机器学习专注于开发可以访问数据并使用数据进行自我学习的计算机程序。
【认知计算(CC) :认知计算是在计算机化的模型中模拟人类的思维过程。认知计算涉及自学系统,这些系统使用数据挖掘、模式识别和自然语言处理来模仿人脑的工作方式。
【RPA】:机器人流程自动化使组织能够配置计算机软件或“机器人”来捕获和解释现有的应用程序,以处理交易、操纵数据、触发响应并与其他数字系统通信。
当我们谈论人工智能时,自动化中的这些技术是高度相关的。作为自动驾驶汽车中使用的一个例子,它通常是这些技术的组合。这更多的是关于非营利组织的运营模式,而不是简单的一次性收入解决方案,它可以解决所有问题。有一个名为人工智能:增强、加速和自动化决策的概述网站已经收集了关于这个主题的不同报告。
如果我们看看 salesforce 报告以外的内容,根据 2019 年第二季度 KPMG Venture Pulse 报告人工智能和机器学习(特别是在网络安全领域)在过去十年左右的时间里,计算方面的进步已经开始产生重大优势,以利用智能算法的力量实现关键流程的自动化。瑞士瑞信银行的其他预测预测,全球人工智能领域的收入将会上升。其中的一部分可以用于非营利部门。

倡议的三个例子
在我们深入三个简短的案例研究之前,我们可以问问非营利组织目前是如何运作的。通过对非营利案例和人工智能的简短搜索,你可能会在 2017 年 8 月 7 日的当前时间体验到,你会发现很少有案例容易理解。相反,想得多,做得少;可能有必要采取谨慎的方法。非营利组织不使用应用人工智能是因为他们不确定或者没有意识到吗?这是一个不容易立即回答的问题。甚至以人工智能为目标的非营利组织似乎也不愿意使用或展示他们对这些技术的使用。
谷歌人工智能造福社会
Google.org 向世界各地的组织发出公开呼吁,要求他们提交如何利用人工智能来帮助应对社会挑战的想法。他们收到了来自 6 大洲 119 个国家的申请,项目范围从环境到人道主义。从这些申请中,他们选择了 20 个组织来支持。这是一个关于不同组织如何使用人工智能应用程序或至少尝试可能用途的有趣信息宝库。我将提到几个我觉得有趣的例子:
- Nexleaf 分析:疫苗的储存条件会显著影响其有效性,这在基础设施有限的偏远地区尤其具有挑战性。他们将利用人工智能技术建立预测疫苗降解的数据模型,量化面临风险的疫苗价值,并最终开发出一个端到端的系统,以确保安全、有效的疫苗交付。
- 。人权律师目前被要求从大量的文件库中筛选出与他们的案件最相关的事实。他们正在使用自然语言处理和机器学习方法来提取、探索和连接法律、判例、受害者证词和决议中的相关信息。
- 危机短信热线公司 :危机中的人们和危机短信热线的顾问之间迄今已交换了超过 1 亿条消息,要平衡数量的高峰和顾问的可用性是一项挑战。危机短信热线将使用自然语言处理和辅导员能力数据来优化他们如何为辅导员分配短信,目标是减少等待时间,同时仍然确保有效的沟通和降级。
- 雨林连接 。雨林正受到非法砍伐和全球变暖日益严重的威胁。雨林连接正在使用普通的移动技术和深度学习进行生物声学监测,以检测即时威胁和跟踪雨林健康。
数据种类
Datakind 的使命是:“利用数据科学的力量为人类服务。”他们令人信服的论点是,公司用来提高利润的算法和技术可以被使命驱动的组织用来改善世界,从抗击饥饿到倡导儿童福利等等。这必须有所保留,但在某些情况下,现有的应用程序也可以用于非营利部门。他们将顶级数据科学家与领先的社会变革组织聚集在一起,在前沿分析和高级算法方面进行合作,以最大限度地提高社会影响。

Photo by @alexacea
格雷夫蒂
亚当·马特尔是 Gravyty 的首席执行官和联合创始人。Gravyty 通过可操作的人工智能提高筹款人的效率,帮助非营利组织筹集更多资金。Gravyty 让筹款人能够在正确的时间最大限度地利用他们的时间与正确的捐赠者建立关系。Gravyty 最近被《慈善纪事报》评为第一名“行之有效的新筹款想法”。在一篇文章中(奇怪的是,又是一位 Salesforce 成员写的),他给出了一系列建议,他主张:
- AI 和预测分析集成到一个平台
- 人工智能不会取代筹资者,而是让他们更加成功和投入
- 主动式人工智能应用将优化性能和业务成果
- 非营利组织有机会通过人工智能驱动的应用引领规范分析的使用
结论——与技术相关的非专利产品
它需要非营利组织、私人和政府行为者之间的合作。出于公平、安全、问责和透明的考虑。
随着对人工智能的日益关注以及其预计的收入增长,非营利组织应该更加明确地了解如何与技术领先者保持联系,以在未来筹集资金。这些趋势确实指向一个错综复杂的空间,其中数据不成比例,甚至不平等现象恶化,这种完全无视数据质量或安全的大批量生产加剧了这种不平等现象。
在这个充满不负责任和负责任的行为者的混乱空间中,非营利组织可以发挥桥梁作用,负责任地和合乎道德地使用技术,同时引导资源解决我们在这个星球上看到的最严重的不平等。
这是第 500 天的第 89 天。我目前第 50-100 天的重点是人工智能安全。如果你喜欢这个,请给我一个答复,因为我确实想提高我的写作或发现新的研究,公司和项目。
人工智能和机器人过程自动化
最简单的形式是,机器学习是机器利用历史数据(监督和半监督案例)从过去的经验中学习来解决给定问题的能力。它使用不同的算法来实现一个或多个(数学)模型,作为产生所需结果集的基线,同时消耗输入数据参数(维度)。这是与任何计算机程序的根本区别,在任何计算机程序中,不是逻辑或算法的编程实现,而是使用经过训练的模型来产生输出。
通过将 RPA 与机器学习、语音识别和自然语言处理等认知技术相结合,公司可以在人工智能的帮助下自动化更高阶的任务,而这些任务在过去需要人类的感知和判断能力。
文档结构
本文分为四个主要部分;
- 第节第节稍微谈了一下过程自动化及其优势。
- 在的第二个部分,我描述了 AI/ML 如何被利用来改善用户体验。
- 第三部分主要是设计概念的表示和关于技术的叙述,触及一些最佳实践。
- 最后,在第第四节中提到了一个示例案例,该案例显示了该联盟(RPA 和 AI 之间)的优点。
1.工序自动化
公司充分认识到,提高业务效率和员工生产力对于在竞争激烈的数字环境中茁壮成长至关重要。只要有明确的操作程序,任何过程都可以自动化。
“从手动到自动驾驶”——
有时候,软件脚本可以(半自动地)执行日常事务,如网络供应、系统管理等。非常希望提高运营效率。虽然有人参与管理这些任务,但是软件方法的好处很快就显现出来,并开始在业界流行起来。随着系统设计的发展,主要是趋势转向面向服务的架构(SOA),系统变得更大更复杂。与外部和/或内部服务的各种集成模式开始出现,为无缝执行创造了对编排和自动化的更多需求。
利用应用工程的低级知识以及对不同工具和应用界面的访问,为任务蓝图创建软件模块,以便这些任务可以作为软件例程按需或按预定义的时间表触发,而无需人工参与。
过程自动化的优势
公司开始认识到,提高业务效率和员工生产力对于在竞争激烈的数字环境中取得成功至关重要。
通过软件实现自动化对于企业保持竞争力和通过满足(或超越)服务水平协议(SLA)实现卓越运营至关重要。这些工程公司利用所谓的软件机器人的力量,为 IT 行业的流程工程开辟了新的途径。现在创建的信息处理机制将 RPA 视为比以往任何时候都更可行、更易实现的选项。
将人工智能融入过程自动化
为了项目的成功,必须清楚地识别和理解在人工智能驱动的策略下成功实现 RPA 背后的机制。将人工智能视为核心的 RPA 系统需要对两种技术如何以协作方式共存有基本的了解。在进入实现阶段之前,需要从两个角度清楚地定义设计结构。
从整体来看,历史数据对于模型训练是不可避免的。此外,其他方面,如参与者、触发点、子系统边界、领域知识、接口 API/hooks、规则,以及可能需要人工干预的极限情况、异常处理等。都将是至关重要的。
在接下来的章节中,我们将从不同的角度来看一看它。
2.在过程自动化策略中引入人工智能/人工智能
到现在为止,除非你住在山洞里,否则每个人都非常熟悉 AI 和 ML 的定义。像监督/非监督学习和深度学习这样的术语听起来并不陌生。
关于 AI/ML 的描述超出了本文的范围。有空的时候,你可以浏览这些参考资料,对这个主题有更好的了解
本节进一步讨论我们的协作方法,我们在前面的“将人工智能纳入流程自动化”中已经看到了。
就像任何专门构建的轻量级自动化一样,完整的流程理解包括流程设计、MOP、环境、可变因素(活动部件)、参与者等。在实施 RPA 之前是必要的。
好消息是,AI 和 RPA 可以共存,并且可以顺利运行。
与“RPA/AI 合并”、相关的一些问题可以列在下面——
- 这个过程中涉及到多大程度的人工干预?
- 哪些流程步骤是重复的?
- 你有足够的对话和其他人工智能相关的训练数据吗?
- 在你的案例中,对话式人工智能如何增强用户体验?
- AI/ML piece 可能会带来哪些陷阱?
- AI/ML 是否在不增加太多成本和复杂性的情况下增加了价值?
- 你的成功标准是什么?KPI,满意度指数等。
- 影响过程改进的参数/因素是什么?
- 有现成的工具可以满足您的部分或全部需求吗?
- 你有必要的资源吗?什么是成本和时间限制?
必须对主题有清晰的理解。此外,系统架构知识以及对功能、流程、子系统接口、互连逻辑等细节的了解。是你设计策略的蓝图。
为了成本效率和投资回报,您还需要清楚地了解目前哪些解决方案是商业化的,哪些是开源的。例如,如果现成的解决方案非常合适,那么它比重新发明轮子更受欢迎。更长的周期和浪费会损害项目。利用可用的解决方案和技术(在可能的情况下)提供额外的缓冲,以最小化风险,并让您专注于其他领域,以更快地实现您的目标系统。
3.设计和实现技术
图 1 显示了一个典型的端到端组件设计,描述了全功能人工智能驱动的机器人流程自动化(RPA)的实现。

Figure 1. Architecture of Robotic Process Automation with Conversational AI.
生产过程说明
从顶部开始,我们有一个允许捕捉用户请求的用户界面。用户的意图通过使用 NLU 管道将分类到预定义的类别中来理解。这些管道通常由几个 NLP 库组成,如 SpaCy 或 NLTK ,为多种语言中的词向量/嵌入、标记化等提供支持。该层执行的另一项重要任务是从用户请求中提取实体(上下文数据)。实体是数据科学家或企业感兴趣的文本的一部分,例如人名、地址、账号、位置等。这些然后被传递到下游进行进一步处理。先进的技术和算法,如 CRF(条件随机场),词干分析等。用于训练用于执行命名实体识别(NER)的模型。SpaCy 等库中提供了对 NER 的支持,它允许通过了解实体的模式和其他统计属性来提取实体。此外,可以使用像ducking这样的库来提取特定的信息,比如日期和时间。
当提取意图和数据对象时,它们通过下一级,即机器到机器的接口。此时,可以插入一个软件机器人来驱动编排和(主要)自动化方面。例如,“创建并发送报告”、“提供或配置网络设备”或“使用 paypal 帐户购买电影票”。
我在这里减少了每个子系统要求的细节,但是,你可以理解不同的部分如何以一定的精度粘合在一起,以创建一个有凝聚力的系统。
政策和最佳做法
上图可能过度简化了实现该架构所涉及的工作。这里有几个移动的部分,每个组件(子系统)都需要相当大的努力和适当的领域知识来有效地实现和协调。明智的做法是在设计阶段进行全面深入的研究,并解决诸如协议、数据结构、访问要求、性能和效率、可用性、日志记录和监控、异常处理以及技术杠杆等具体问题。
在可能的情况下,控制逻辑的外部化和解耦可以在灵活设计和系统更新方面产生好处。

Figure 2. Required skill set along with technology domains.
如何处理异常?
将会出现一次性条件的情况,例如,“余额不足以购买杂货”、“无效的送货地址”、“不满意或丢失的数据”、“不利的(天气)条件”等。为了正确处理这种情况,可以起草几个策略,并通过单独的异常控制机制输入到系统中。
对错误消息采取纠正措施增加了用户体验的价值。隐藏细节,您向用户显示的错误消息应该反映问题的准确描述和下一步最佳操作的建议。这为机器学习提供了另一个机会,由此,经过训练的模型可以根据变量和上下文数据预测后续行动。
4.一个案例——医疗
让我们看一个例子。有消息称,医疗保健行业正越来越多地采用人工智能来改善患者护理和流程效率。那么,让我们看看 RPA 在这里是如何发挥作用的。
有效的 RPA 可以改善护理管理,显著提高协调护理、人群健康、远程监控和利用管理的质量。当医疗保健专业人员不再被许多日常任务所困扰时,他们可以自由地专注于更重要的活动,如与患者一对一的互动。
那么 RPA 与此有何关联呢?有一些组织陷入困境的手工密集型活动,可以通过将工作负载转移给机器人来缓解。以编码或计费为例。一个适当定义的过程可以通过自动化来增强,其中可以评估来自一个或多个表单的多个条目,并且在没有任何人工干预的情况下生成最终账单并呈现给收银台。向病人收取费用只是另一个步骤。此外,还可以毫不费力地将编码报告/索赔发送给保险公司(付款人)。
同样,采用人工智能辅助图像识别来发现恶性痕迹的情况可以与警报和通知系统集成,以便癌症、肿瘤等敏感问题可以在公布之前由领域专家进行最终审查。
除了成本节约方面,提供商还可以实施一个适应性强的系统,该系统的行为可以在需要时快速改变,从而最大限度地提高运营效率。
“数据设计”方法——对我们有什么好处?
确定人工智能在规模、适应性和熟练程度方面可以超越传统逻辑实现的领域。可能会有这样的情况,一个过程应该基于数百个因素来决定下一个最佳行动。在设计和构建阶段考虑所有这些变量(尺寸)可能会变得具有挑战性。此外,程序逻辑必须针对每个新添加的参数进行修改,而基于 ML 的方法仅需要重新训练模型,而核心业务逻辑保持不变。
在传感器或监控工具生成大量数据的情况下,解析和提取相关信息就成了一项艰巨的任务。
把所有的放在一起
在这篇博客中,我主要从融合的角度简要描述了 RPA 和对话式 AI。我们研究了影响设计和策略的重要因素。除了从行业标准中汲取价值之外,还需要牢记业务案例,以制定一个从基本内容到本质细节的完善的实施方案。
对对话式人工智能的基本理解是提高设计质量和彻底建立功能准确性的必要条件。机器学习管道是产生精确结果的基本构件。
许多人认为机器人流程自动化是数字化转型中最需要的元素。当软件机器人与人工智能一起使用并通过策略和历史数据进行指导时,可以实现效率的提高,获得自动化、人工智能/人工智能的好处,并为田园诗般的用户体验创造机会,提高用户信任水平,获得卓越的运营并提高投资回报率。
脸书如何定义与人工智能相关的恐怖主义?

Photo by @jankolar on Unsplash
人工智能与社交媒体中的恐怖主义定义
恐怖主义这个术语有多大用处?我认为这是没有用的,因为它把具体的辩论模糊成一种以暴制暴的反动模式。然而,从政治学的角度来看,这在某种程度上是一种社会建构主义的 T2 方法。日益证券化的人工智能将不可避免地被掺入这些大型社交媒体公司的政策过程中。让我来探讨一下脸书是如何解决这个问题的。
在这篇文章中我将关注:
(1)脸书及其对恐怖主义的定义;
(2)进入人工智能的陈述方法;
(3)脸书日益壮大的安全团队;
(4)人类中庸的现实一面和可能的创伤;
(5)以美国为中心关注社交媒体上的恐怖问题;
(6)政府对用户数据的要求;
(7)即将成立的全球监督委员会可能为组织和政府使用人工智能树立先例;
(8)模糊的 Snapchat 恐怖主义,比较的展望 outro。
1.脸书及其对恐怖主义的定义
2018 年,地球上最大的社交平台之一决定尝试定义恐怖主义,其内容如下:
“为实现政治、宗教或意识形态目的,对人员或财产实施有预谋的暴力行为以恐吓平民、政府或国际组织的任何非政府组织。”
在 2018 年 4 月 23 日发表的名为困难问题的博客文章中:科技在阻止恐怖分子进入脸书方面有多有效?根据我自己的估计,中间有一段是这样的:
互联网的民主化力量给全世界的个人、活动家和小企业带来了巨大的好处。但是糟糕的演员一直试图利用它来达到自己的目的。白人至上主义者在 20 世纪 80 年代使用电子公告板,第一个亲基地组织的网站在 90 年代中期建立。虽然网络恐怖主义的挑战并不新鲜,但随着数字平台成为我们生活的核心,它变得越来越紧迫。在脸书,我们认识到保障人民安全的重要性,我们利用技术和我们的反恐团队来做到这一点。[粗体字已添加]
脸书在这篇博客中声称:
- 我们的定义与一个团体的意识形态或政治目标无关。
- 我们的反恐政策不适用于政府。
- 脸书的政策禁止恐怖分子使用我们的服务,但仅有政策是不够的。我们需要执行它。
尽管做出了这一声明,他们同时表示,他们的重点是 ISIS、基地组织及其附属组织,这些组织目前构成了最广泛的全球威胁。然而,这些也是美国最感兴趣和最优先考虑的问题。
2.脸书如何利用人工智能反恐?
这篇博文还提到了脸书写的一篇名为 难题:我们如何反恐 的文章。由全球政策管理总监莫妮卡·比克特 和反恐政策经理 布莱恩·菲什曼 撰写。本帖已于 2017 年 6 月 15 日发出。
这个帖子的顶点是人工智能。我们希望在我们社区的人看到之前,立即找到恐怖内容。脸书显然至少从 2017 年就开始使用人工智能来删除与恐怖主义相关的帖子(他们声称这是最近的事情)。当时,他们似乎把精力集中在 ISIS 和基地组织上。
- 图像匹配:当有人试图上传恐怖分子的照片或视频时,他们的系统会寻找图像是否与已知的恐怖分子照片或视频匹配。这样他们可以避免人们上传相同的视频。
- 语言理解:脸书已经开始尝试使用人工智能来理解可能鼓吹恐怖主义的文本。当时,他们正在尝试删除与之前已经删除的内容(历史数据)相关的文本
- 清除恐怖分子集群:脸书声称从对恐怖分子的研究中了解到,他们倾向于激进化和集群行动。这种线下趋势也反映在线上。他们使用一些信号,如某个帐户是否是大量因恐怖主义而被禁用的帐户的朋友,或者某个帐户是否与被禁用的帐户具有相同的属性。
- 惯犯:脸书表示,他们在检测惯犯创建的新虚假账户方面速度更快了。通过这项工作,他们已经能够大大减少恐怖分子惯犯帐户在脸书的时间。他们认为这个过程是“对抗性的”,因为对方一直在开发新方法。
- 跨平台合作:因为他们不希望恐怖分子在脸书应用程序家族中有一席之地,他们已经开始开发系统,使我们能够在我们所有的平台上对恐怖分子账户采取行动,包括 WhatsApp 和 Instagram。
在 2018 年第一季度,报告称已经删除了 8.37 亿条垃圾邮件和 250 万条仇恨言论,并在全球禁用了 5.83 亿个虚假账户。这与该声明有关,该声明称,它是通过使用以下技术来辅助的:“…机器学习、人工智能和计算机视觉..”检测“坏演员”并更快地行动。他们特别提到了与选举有关的这一点。
2019 年,他们特别消除了他们所谓的“来自伊朗、以色列和俄罗斯的不真实行为”。
像克赖斯特彻奇枪击案这样的直播攻击需要人类的节制。LeCun 在最近的一次活动中表示,脸书还需要几年时间才能使用人工智能来实现大规模的视频直播。LeCun 缺乏训练数据的问题。“谢天谢地,我们没有很多真实的人开枪打其他人的例子,”你可以使用电影镜头训练识别暴力,但随后包含模拟暴力的内容将被无意中与真实内容一起删除。
自动化系统据称主要用作人类版主的助手。
人工智能不是适可而止的灵丹妙药。在这种背景下理解人工智能当然是不够的 。脸书有一个社区运营团队,该团队必须将个人资料和新闻故事区分开来。这种‘更细致入微的方法’需要人类的专业知识。了解脸书如何使用人工智能当然是不够的,如果不了解他们的实际安全团队如何管理这些工具以及框架。
3.脸书不断壮大的安全和安保团队
脸书饲料,因为该公司的 200 人反恐小组删除了他们。在剑桥分析公司隐私丑闻之后,脸书面临着压力,需要证明它能够监管自己。)2018 年报道。
脸书计划在 2017 年成为增加 3000 人的——每天 24 小时用数十种语言工作,审查这些报告并确定背景。该链接指的是马克·扎克伯格发布的一篇帖子,该帖子称,除了他们计划雇佣的人之外,他们已经雇佣了 4500 人。
2018 年 7 月 6 日(12 月 4 日更新)来自脸书的运营副总裁 Ellen Silver 声称要在全球范围内扩展,覆盖每个时区和 50 多种语言。他们还迅速增加了安全和安保方面的工作人员:
“在脸书从事安全和安保工作的团队现在超过 3 万人。这个团队中大约有一半是内容审查人员,包括全职员工、承包商和我们合作的公司。”
4.不安全给脸书工人造成创伤
2019 年 2 月,The Verge 发表了一篇名为创伤楼层:美国脸书版主的秘密生活的文章。这篇文章当然描述了这些主持人工作的挑战性条件,但是它也提到了在世界各地工作的 15,000 名主持人的统计数据。看起来确实有相当一部分是通过 Cognizant 等公司分包出去的,这些公司必须签署保密协议,因为保密是为了保护员工。
”总体而言,员工们描述了一个永远徘徊在混乱边缘的工作场所。在这种环境下,工人们通过讲关于自杀的黑色笑话来应对,然后在休息时间抽大麻来麻木他们的情绪。在这个地方,员工可能会因为一周犯几个错误而被解雇,而那些留下来的人则生活在对前同事回来寻仇的恐惧之中。”
也许具有讽刺意味的是,在试图处理恐怖事件时,会给处理者造成一定程度的创伤。《The Verge》报告中的某些关键发现似乎值得强调或至少考虑:
- 凤凰城的版主年薪仅为 28800 美元,而脸书普通员工的总薪酬为 240000 美元。
- 员工被微观管理到上厕所。两名穆斯林雇员被勒令在每天分配的九分钟“健康时间”内停止祈祷。
- 主持人通过讲述关于自杀的黑色笑话来应对看到的创伤性图像和视频,然后在休息时间吸食大麻来麻木他们的情绪。主持人通常在工作中很兴奋。
- 员工在离开公司后出现类似 PTSD 的症状,但不再有资格获得脸书或 Cognizant 的任何支持。
- 员工们已经开始接受他们应该节制的视频和模因的边缘观点。凤凰城遗址是一个扁平地球人和一个大屠杀否认者的家。一名前雇员告诉我们,他不再相信 911 是一次恐怖袭击。
根据这篇文章,这些中心通过准确性标准运作,这意味着被审查的帖子正在被审查。脸书设定的目标是 95%的准确率,但 Cognizant 通常没有那么高(接近 80–92%)。版主必须建议正确的社区标准违反或风险失去准确性。The Verge 的文章提到了版主必须考虑的几个不同的事实。
- 社区指南、公开发布的指南和内部文档。
- 已知问题。一份 15000 字的第二份文件,附有评注。
- 试图达成共识的主持人之间的讨论。
- 脸书自己的内部信息发布工具。
此外,据说保住一份工作的挑战可能相当困难:“这份工作就像一个高风险的电子游戏,你一开始得 100 分——一个完美的准确性分数——然后抓啊抓,尽可能多地保留这些分数。因为一旦跌破 95,你的工作就有风险了。”
被解雇的员工经常威胁要回去工作,并伤害他们的老同事。据 The Verge 报道,NDA 人通常会阻止你谈论你正在做的工作,甚至声明你曾经为脸书工作过:“他们尽可能长时间地工作——当他们离开时,NDA 人会确保他们更深地隐藏起来。对脸书来说,他们似乎从来没有在那里工作过。从技术上讲,他们从来没有。”
脸书对如何管理他们的政策有一个清晰的想法:
“我们希望将个人观点和偏见完全排除在外——因此,理论上,两个评论相同帖子的人总是会做出相同的决定。”
在一份与《The Verge》的文章相矛盾的声明中,他们表示:“对内容审查者的一个常见误解是,他们受到配额的驱使,被迫做出仓促的决定。”据称,他们在三个地区有四名临床心理学家,负责设计、实施和评估弹性计划。然而,考虑到这些员工必须经历的工作,这种没有专业人员在现场的分散式精神护理是否可取是值得怀疑的。
5.以美国为中心的全球反恐
我们可以问一个简单的问题:当我们为世界设计政策和指导方针时,在给定的框架中什么观点是普遍的?正如你可能已经猜到的那样,我怀疑一个基于一个地点的通用框架是否能在全球范围内很好地运行。
他们的执法重点是伊斯兰恐怖组织,而不是右翼极端主义或其他形式的“恐怖”。他们与微软、Twitter 和 YouTube 在与恐怖分子内容相关的哈希上有合作关系。这些都是总部设在美国的公司。
反语音程序。脸书支持几个主要反间谍计划。例如,去年我们与战略对话研究所合作发起了在线公民勇气倡议。项目的挑战是设计、试点、实施和衡量旨在抵制仇恨和暴力极端主义的社交或数字倡议、产品或工具的成功。据报道,它与欧洲 100 多个反仇恨和反极端主义组织进行了接触。
他们还与 Affinis Labs 合作,在马尼拉、达卡和雅加达等地举办黑客马拉松,在这些地方,社区领袖与科技企业家联手开发创新的解决方案,以抵制网络上的极端主义和仇恨。
我们希望脸书成为恐怖分子的敌对之地。
说到这里,他们引用了 1984 年,在一次失败的暗杀后,爱尔兰共和军(IRA)的声明:“今天我们是不幸的,但是记住,我们只能幸运一次——你必须永远幸运。”从某种程度上来说,这句话很有道理,但你不可能永远回避一切。如果没有失败的余地,那么完美表面上的任何污点都会污染图像——当然这对脸书来说很重要。我们可以问,这种去中心化的适度决策,是否更容易将任何与安全和安保相关的“外部性”归咎于外部行为者。
6.政府对用户数据的要求
如果有安全事件需要访问,当然可以访问脸书的数据。2018 年下半年,政府对用户数据的请求在全球范围内增长了 7%,从 103,815 次增加到 110,634 次。美国继续提交数量最多的请求,其次是印度、联合王国、德国和法国。据脸书称,这反映了正常的增长。
作为请求的一部分,58%包括禁止脸书通知用户的保密命令。在对他们的美国国家安全报告指标的内部审查中,脸书发现它少计了来自《外国情报监视法》( FISA)的请求。脸书将这些请求分为紧急请求和法律程序。

Facebook may voluntarily disclose information to law enforcement where we have a good faith reason to believe that the matter involves imminent risk of serious physical injury or death.
理解这两种不同的数据请求可能是有用的:
法律程序请求: 我们从政府那里收到的请求都伴随着法律程序,就像搜查令一样。我们仅根据我们的服务条款和适用法律披露账户记录。
紧急公开请求: 在紧急情况下,执法部门可以不经法律程序提交请求。根据具体情况,如果我们有充分理由相信该事件涉及严重人身伤害或死亡的紧迫风险,我们可能会自愿向执法部门披露信息。
作为官方调查的一部分,政府官员有时会要求提供使用脸书的人的数据。这些请求绝大多数涉及刑事案件,如抢劫或绑架"
在此期间,脸书和 Instagram 根据 511,706 份版权报告删除了 2,595,410 条内容;基于 81243 条商标报告的 215877 条内容;以及基于 62,829 个假冒报告的 781,875 条内容。
脸书最近开始与专注于人工智能的伦理机构合作。这种合作关系的重点似乎是在安全方向,至少在慕尼黑,他们合作的研究所将解决影响人工智能使用和影响的问题,如安全、隐私、公平和透明。我之前已经描述过这可能是有问题的:一个自律道德行为的问题。
7.全球监督委员会确保全球视角
脸书正在创建一个全球监督委员会。在 2019 年 1 月新任全球事务和沟通副总裁 Nick Clegg 的帖子中,发布了一份章程草案。草案列出了 11 个问题以及考虑因素和建议的方法。最近在 2019 年 6 月下旬,脸书就此话题发表了另一篇文章。
据称,他们(脸书)已经在世界各地举办了 6 次深入的研讨会和 22 次圆桌会议,有来自 88 个不同国家的 650 多人参加。他们与 250 多人进行了个人讨论,并收到了 1,200 多份公众咨询意见。

随后,脸书发布了一份 44 页的报告,名为脸书内容决策监督委员会的全球反馈&输入。这涉及全球章程、董事会成员、内容决策和治理。尼克·克莱格在导言中指出:
“我们的任务是建立保护言论自由的系统,帮助人们与他们关心的人联系,同时仍然保持在线安全。我们认识到,我们不仅要公平行使我们的酌处权,还要建立与时俱进的结构,这是一项巨大的责任。我们现在面临的挑战是,在创建这个监督委员会的过程中,要支持、平衡和保障世界各地在我们平台上的每个人以及那些即将进入我们平台的人的言论自由和安全。”
这份报告认为脸书需要更多的民主。需要有 一个系统来上诉 。报告给出了不同的温和例子。报告还指出,脸书对全球现有的一系列监督模式进行了研究,确定了监督设计的六个“系列”。他们展示的网格是这样的。

According to the report public reason giving will be a crucial feature of the Oversight Board, one which drives at the heart of the legitimacy of its decisions.
章程草案建议,脸书将选择第一批成员,未来的选择将由理事会自己接管。该报告指出,将未来的选择留给理事会本身的提议引发了质疑,因为这可能导致“递归问题”和“偏见的永久化”针对理事会成员提出了几种方法:
- 会员资格将由脸书用户通过完全民主的投票产生。
- 一种混合方法,结合选择程序,使脸书、外部团体和用户都可以参与。
- 征求公众对申请人名单的意见。
- 邀请民间社会团体挑选一些董事会成员。
- 要求政府对名字和候选人进行权衡。
- 公开提名程序。
- 从脸书用户中选择成员的随机抽签系统。
人们一致认为多样性很重要,尽管有人提到完美的代表性是不可能的。大多数人同意,脸书的雇员(现任和前任)应该被排除在董事会之外。有人建议固定期限为三年,可展期一次。
在报告中建议了两种提交方式,既可以让脸书发送重要或有争议的内容,也可以让用户使用。脸书提议,较小的陪审团,而不是整个董事会,将听取和审议案件。很明显:“一个强烈的共识是理事会的决定应该影响脸书的政策制定。”
有人指出,脸书将设立一个独立的信托基金来支付董事会成员的薪酬。有人认为,该委员会需要自己的工作人员,他们应该完全独立于脸书。董事会的范围将是内容治理。然而,有人指出,理事会可以听取其他政策问题,如:“…算法排名、隐私、当地法律、人工智能、货币化、政治广告和偏见。”
因此,可以说,脸书和人工智能领域可能会受到该委员会在未来做出的决定的影响,如果该委员会可能成立的话。事实上,考虑到脸书的规模,这既可以影响私营公司采取某些做法,也可以影响国家根据这个半独立的委员会作出的决定立法。内部报告的结论指出:
“脸书发现自己处于历史上独特的地位。它不能剥夺或给予任何人言论自由,但它是实现全球言论自由的渠道。”
模糊的 Snapchat 恐怖主义?比较研究 outro
在他们的社区指南中,Snapchat 没有定义恐怖主义,但是他们写道:“恐怖组织被禁止使用我们的平台,我们不能容忍宣扬或推动恐怖主义的内容。”然而,我们可能会问自己两个问题:什么是恐怖组织,如果恐怖主义仍未被定义,那么鼓吹恐怖主义在实践中意味着什么?你可以采取“当我看到恐怖主义时我就知道”的方法,但这种方法会留下很多模糊的选择,而不透明的决策。这似乎是恐怖主义邪恶问题的一部分:定义。
国际政治中的恐怖主义很难定义,你如何定义它也很大程度上说明了你如何更广泛地思考政治。虽然众所周知很难界定,但如果脸书的监督委员会出现,这可能是未来要进行的讨论之一。脸书一直关注伊斯兰恐怖主义,而不是美国的右翼极端主义或枪支暴力,这是一个令人担忧的例子。然而,他们建立董事会的举动可能是一个恰当的回应。
不同政府要求用户数据的监管或方式应继续受到透明的严格审查。国家是一个可以施加暴力的行为者;国家造成的暴力可能是模棱两可的,特别是当有人声称 T2 支持恐怖主义的时候。最肯定的是,国家可以使用恐怖手段,而且它正在发生,所以恐怖分子必须在少数群体中;是种族灭绝还是恐怖;这种区别重要吗?
在某些情况下,恐怖是为了吓唬人——暴力被用在限制性的情况下。非国家行为者非法使用暴力是为了传播意识形态吗?如果是这样的话,那么在一个由脸书管理的董事会中,谁的意识形态以及对多样性的担忧是真实的。何时证明干预是正当的,而不是如何证明干预是正当的,这可能很重要,因为实用主义的定义是普遍利益的产物。
在不对称的权力分配中,什么时候暴力行为是弱者的武器?毒枭和资助政治权力的大型资源利益集团有什么区别?目标方面值得考虑:知道某人的意图,但是形成这个意图的环境同样重要。在恶劣的工作条件下缓解恐惧只是众多例子中的一个。
如果我们认真看待我们是有想法的个体,有一些模式,但很多是很难预测的。如果很难预测人类的行为,那么就很难知道人们的目的,也很难看出人们的意图。
钱从哪里来?我们有数据经纪人,但目前没有足够的监管来确保数据流是负责任的,或者无意中被出售给打算将数据用于此目的的团体。恐怖主义模糊了——它不是一个价值中立的术语。技术根本不是价值中立的。它与证券化和国家权力的理念以及技术为善的伦理话语联系在一起。
给它贴上恐怖分子的标签是另一种分类。理解是如何预防它的一个重要工具。在内容适度的快速发展中,把 T 字放在上面是诱人的,然而我们需要参与其中。
尽管我们有必要尊重大公司试图缓和与国家机构合作的方式,但我们也需要持批评态度。罗伯特·考克斯说得好:“理论永远是为了某人或某事。”在这方面 也许技术总是对某人或某事过于 。我将以今天在课堂上分享的一段视频作为结束,这段视频对恐怖主义的标签提出了一个批判性的观点:
这是第 500 天的第 53 天
我已经坚持每天写一篇文章 50 天了。这些文章在探索人工智能领域中社会科学和计算机科学的交叉方面表现一般。
人工智能与联合国开发计划署

A screenshot of page 62 of the compendium United Nations Activities on Artificial Intelligence from 2018
用人工智能消除贫困和减少不平等
我以前曾评论过,人工智能安全的话题应该同样涉及确保人工智能领域为气候变化或减少不平等等重要目标服务。在这方面,我觉得开发计划署的战略很有意思。
开发署致力于通过国家的可持续发展消除贫穷和减少不平等。这项任务正在 170 多个国家和地区进行。最近,联合国开发计划署发布了 2019-2021 年数字战略。由于这可能会对开发署正在开展的工作产生影响,并且人工智能被提到是他们战略的一个突出方面,我决定深入研究人工智能和开发署。
在联合国开发计划署 2019-2021 数字战略中,人工智能是一个重要的机遇
在他们名为重大机遇的 2.1 版新战略中,他们首先提到了人工智能,以及一系列其他技术‘在各个层面震撼我们的世界’。根据他们最近的报告,开发署正在这方面进行组织变革:
“数字化转型是全面的,它不仅仅是一个 it 问题,也不仅仅是一个关注运营和管理的问题。我们的数字化转型将把开发署内部和我们的合作伙伴网络之间的知识联系起来,为我们的服务对象提出更好的想法。”
他们分成三个“工作流”。
- 在第一个工作流程中,他们的目标是建立领导力并使其成为可能。因此,可以说他们正在扮演一个更加积极的角色。他们可能已经聘请了一名联合国开发计划署首席数字官(CDO),至少在 2019 年 3 月发布了该职位的招聘广告。他们也将在实践网络社区中招募数字冠军。
- 在第二个工作流程中,他们致力于支持 IT,协调 IT 战略和数字战略以“利用”数字信息。他们旨在聚合和收集第三方数据,并建立面向客户的主动服务。他们提到 DevOps 和设计思维是这方面的重要方法,可以更好地响应内部和外部客户的请求。
- 作为补充,第三个工作流的重点是增强企业的数字化能力。他们将通过促进创新来做到这一点;数字素养;数字通信;联盟和生态系统;和灯塔计划。
“数字灯塔”项目(据联合国称): 是一个短期的、明确的、可衡量的方案,使用数字技术,可以作为一个榜样——整个组织内类似方案的“灯塔”。
他们确实在战略中简单提到了数字鸿沟,并不是所有的问题都能通过技术解决。有一篇来自 2018 年的 UNDP 博客帖子,对将 AI 视为一系列积极项目中的救星进行了批判性思考。在这一战略中,没有太多的重点放在规划问题上,而是更多地关注要采取的行动。一个战略毕竟可以说是一个行动计划,旨在实现一个长期或总体目标。尽管联合国开发计划署是一个被认可的大型组织,但他们无法独自取得很大成就。
开发署于 2018 年加入人工智能伙伴关系
8 月 1 日——联合国开发计划署(UNDP)加入了人工智能伙伴关系(Partnership on Artificial Intelligence,AI) ,这是一个由公司、学者和非政府组织组成的联盟,致力于确保人工智能以安全、道德和透明的方式发展。2016 年由科技巨头——亚马逊、deep mind/谷歌、脸书、IBM 和微软——成立,此后埃森哲、英特尔、牛津互联网研究所——易贝牛津大学,以及联合国儿童基金会和人权观察等非营利组织以及更多加入。
开发署加速器实验室
我确实同意开发计划署正在与这些公司建立的伙伴关系,我要说的是,在它们的数字战略中非常清楚地表明,这有一个明确的业务重点(有人会说是创业——自下而上)。除此之外,他们还与联合国开发计划署加速器实验室一起扩大规模。它们是:“围绕发展挑战构建全球最大、最快的学习网络。”然而人工智能在他们的网站上被迅速提及:“人工智能对失业的影响”,(检索 2019 年 8 月 13 日)。

The Accelerator Labs are UNDP’s new way of working in development. Together with our core partners, the State of Qatar and the Federal Republic of Germany, 60 labs serving 78 countries will work together with national and global partners to find radically new approaches that fit the complexity of current development challenges. (UNDP)
“这些实验室是由人种学家、企业家、工程师和设计师组成的团队,我们将他们带入联合国开发计划署,与我们在生物多样性、性别平等和减贫方面的专家合作。”然而,这些实验室表面上确实有一种明显的“科技感”,然而我可能错了。
与大型科技公司合作
我将快速说明美国几家大型科技公司的经济实力,这只是为了暗示这些公司现在的重要性。此外,在与开发相关的问题中,这些参与者将扮演越来越重要的角色,因为他们进入了讨论治理相关问题的空间,至少这是我温和的预测。
美国五大科技巨头(亚马逊、苹果、脸书、微软和 Alphabet)在 2018 年的总收入超过 8000 亿美元,这将使成为世界上 GDP 排名前 20 位的国家。
开发署的创新基金将通过这一伙伴关系与社区合作,负责任地测试和推广人工智能的使用,以实现可持续发展目标。“通过利用数据的力量,我们可以为风险、政策和项目评估提供信息,我们还可以利用机器人和物联网(IoT)来收集数据,并达到以前认为无法达到的目标——不让任何人掉队。”
联合国关于人工智能的活动
2018 年人工智能全球峰会汇集了人工智能创新者和公共及私营部门决策者,包括 30 多个联合国机构,以制定人工智能战略和支持项目,加快实现联合国可持续发展目标(SDG)的进展。
在"联合国伙伴会议"上进行了讨论,并有一份关于联合国人工智能活动的汇编,其中包括 27 个联合国机构的两页报告汇编:列于附件——禁核试组织、民航组织、劳工组织、国际电联、UNAIDS、贸发会议、经社部、开发署、欧洲经委会、环境署、教科文组织、人口基金、联合国全球脉动、难民署、儿童基金会、犯罪司法所、裁研所、工发组织、联合国减灾办公室、训研所、裁军厅、外空办、联合国大学、WFP、世卫组织、知识产权组织和世界银行集团。
2018 年 9 月 24 日,在纽约联合国人口基金总部举行的 AI for Good UN Partners 会议上,首次讨论了该简编。
会上商定,联合国人工智能活动简编将与联合国行政首长理事会所有成员共享。

A screenshot of page 62 of the compendium United Nations Activities on Artificial Intelligence
与开发署一起建立人工智能组合
开发署的人工智能组合正在迅速增长。无人驾驶飞机和遥感被用于改善数据收集和知情决策:在马尔代夫用于备灾,在乌干达让难民和收容社区参与共同发展基础设施。他们与 IBM 合作,使开发计划署的快速综合评估自动化,使国家发展计划和部门战略与 169 个可持续发展目标保持一致;联合国开发计划署与联合国环境规划署合作,在 T2 启动了联合国生物多样性实验室。空间数据平台将帮助各国支持保护工作,加快实现 2030 年议程。
这符合开发署 2018-2021 年战略计划,其中创新在完成该组织的使命和实现可持续发展目标方面发挥着核心作用。
这是第 500 天的第 72 天。我目前第 50-100 天的重点是人工智能安全。如果你喜欢这个,请给我一个答复,因为我确实想提高我的写作或发现新的研究,公司和项目。想聊什么或者讨论什么请联系!
人工智能和训练数据

Photo by @maxvdo
什么是数据,如何在机器学习中使用数据,如何收集数据?
在脸书的一个关于人工智能和深度学习的小组上发布了一个帖子,要求探索一些主题,其中最有趣的一个是训练数据。
问题是:
“你能试着写一篇关于训练数据的重要性以及如何获得它们的文章吗?对于一些模型来说,训练数据真的很难获得,就像定制语音到文本一样,很难有人获得那么多小时的语音数据。”
—赛·拉格哈瓦
我在各种文章中写过数据,但是我还没有具体写过测试数据,所以我会尽力而为。
首先解释什么是人工智能环境中的测试数据,特别是机器学习技术,然后讨论如何解决这个问题。
测试数据 是 数据 ,其已经被专门识别用于 测试 ,典型地是计算机程序。
“在机器学习中,一个常见的任务是研究和构建可以从数据中学习并对数据进行预测的算法。这种算法通过从输入数据建立数学模型,做出数据驱动的预测或决策。”
但首先,什么是数据?
什么是数据?
虽然这应该是一个简单的问题,但事实并非如此。
在最近的一次会议上,我与布鲁塞尔自由大学的法学教授 Gloria González Fuster 进行了交谈。
她职业生涯中的大部分时间都在尝试浏览数据的法律定义,她也有通信科学的背景。
许多输入人工智能系统的数据是法律描述的“个人数据”,因为它们与可以被识别的人有关。
这些人在法律上又被称为“数据主体”,而那些决定数据处理的人是“数据控制者”。
她建议将所有参与数据制作和处理的人重新定义为“数据制作者”。
她认为我们对数据的理解存在一些重大差距。
她让观众闭上眼睛几秒钟,试着想象什么是数据。
试着闭上眼睛,想象几秒钟数据是什么。
当然,播放这个视频。
Gloria 讲述了一个有趣的故事,一名女子向 Tinder 询问帮助算法确定应该向她展示哪些男性的数据。她发现这是一个相当具有挑战性的过程。
认识到数据定义和数据所有权是复杂的,我们可以转向更二元的定义。
结构化数据是指驻留在记录或文件内固定字段中的任何数据。这包括关系数据库和电子表格中包含的数据。
非结构化数据 (或非结构化信息)是没有预定义的数据模型或者没有以预定义的方式组织的信息。
机器学习中的输入数据
我以前写过不同类型的学习框架。因此,我总结和概括了这可能看起来像在这里的数据。
监督学习从标注为 的训练数据** 中推断出一个函数。
无监督学习在没有预先存在标签的情况下,帮助在数据集中发现以前未知的模式。
强化学习关注的是软件代理应该如何在一个环境中采取行动,以最大化某种累积回报的概念。
社会科学家马克斯·韦伯在建立这样的模型时描述了理想类型:抽象的、假设的概念的构建。

From an article by M. Tim Jones written in 2017 retrieved the 19th of October 2019.
将这些方法结合起来并添加到其他方法中也正在发生。
半监督学习利用未标记数据进行训练——通常是少量标记数据和大量未标记数据。
数据扩充是一种策略,使从业者能够显著增加训练模型可用数据的多样性,而无需实际收集新数据。
谷歌人工智能提出的一篇研究文章中的最后两个组合就是我之前写的内容。
为什么对人工智能领域很重要?
towardsdatascience.com](/advancements-in-semi-supervised-learning-with-unsupervised-data-augmentation-fc1fc0be3182)
用于构建最终模型的数据通常来自多个数据集。这用于拟合参数,例如人工神经网络中的权重,然而,它也可以来自少数数据集,这些数据集正在被增强或实验,直到得到结果。它甚至可以从没有或很少的数据开始,而不是在头脑中有一个特定的目标,技术定义有点松散。

Cartoon by xkcd
聚合还是不聚合,这是一个问题
我想说,爱是聚合数据问题的答案,其实不是。
数据汇总 是收集信息并以汇总形式表示的任何过程,用于统计分析等目的。一个常见的聚合目的是基于特定变量(如年龄、职业或收入)获取特定群体的更多信息。
答案是,聚合数据是一个巨大的业务和不断增长的行业,已经成为使用各种技术来实现它。如果我们回到问题的一部分:
…有人很难获得这么长时间的语音数据
我们可以后退一步或横向考虑这个问题。
…某人很难获得…数据
很难获得数据。当你要求数据时,你所期望的可能不是对数据获取的批判性的看法,然而这就是你所得到的。下面是我写的两篇文章来说明这一点。
数据存储(动词;):通过引发情绪反应诱使某人提交数据。
获取数据的有趣方式
towardsdatascience.com](/databaiting-d26cad4c49ca) [## 使用 FaceApp 进行数据绑定🤷
除了对国家归属和人工智能恐惧的痴迷
medium.com](https://medium.com/zero-equals-false/databaiting-with-faceapp-1d810089f61d)
我举的一个例子是 spit → 23andMe 被葛兰素史克部分收购,葛兰素史克是世界上最大的制药公司之一,现在使用你的 spit 进行药物测试(如果你把你的 spit 发给他们)。
如果我们以“语音数据”为例,让我们考虑一下 Alexa。亚马逊 Alexa 正在收集前所未有的大量语音数据,它不确定他们是否会完全删除这些数据,即使你要求他们,尽管我们应该希望他们在一定程度上遵守 GDPR。
如果你问某人:“嘿,你能给我关于你家的布局和你的生活模式的所有信息吗?”听起来很唐突。
如果你说:“嘿,我有一个神奇的新吸尘器,它可以清洁你的地板,而你不需要动一根手指。”更简单。
让我们以言语为例。
“嘿,只要把你的声音上传到这里,你就可以得到一个真实的声音版本来愚弄你的朋友。”听起来不错,很有深度。
Voicepods 是一种易于使用的服务,可以使用最先进的技术将您的内容转换为真实的声音
www.voicepods.com](https://www.voicepods.com/)
你可以看看 Mozilla 让你捐出你的声音来考虑一下不同之处:
Common Voice 是一个项目,旨在帮助让语音识别对所有人开放。现在你可以捐出你的声音来帮助我们…
voice.mozilla.org](https://voice.mozilla.org/en)
你可以让你的朋友为你的机器学习项目贡献他们的声音。如果你有 10-100 个朋友,这是你可以利用的数据。如果你在你要处理的领域内有更具体的数据,那么这些数据可能更具体地针对你要解决的问题。
尽管你应该记住技术债务和知识债务。如果您不了解哪些培训数据在 IT 基础架构的什么地方使用过,情况可能会很糟糕,甚至是灾难性的。同样,如果你不理解你所接受的决策训练,也许是因为庞大的数据集,它可能会带来自身的风险。
- 什么是数据,什么不是数据,可能没有我们想象的那么简单。
- 如果你不这么认为,那么非结构化数据和结构化数据是一个相当实际的区别。
- 不同的学习形式可能会对您的培训数据提出不同的要求。
- 记住你的训练数据在哪里,什么时候训练的,它可能会过时。
这些是由一个有趣的问题引发的一些即时想法。
另一个问题是:你愿意在聚合数据方面走多远?
你有多确定你的数据值得使用?

Gif by @yipan
我希望你喜欢这篇短文。*这是第 500 天的第 137 天。500 天来,我每天都写一篇关于人工智能或与之相关的新文章。**
2020 年你应该读的人工智能书籍
为自动化时代的未来做好准备
人工智能成为 2019 年最流行的话题之一。由于人工智能在许多行业和我们日常生活中的实际应用,它将继续存在。这就是为什么你应该通过阅读顶级人工智能书籍,为我们的技术未来做更好的准备。我把它们分成三大类:社会学、哲学和商业导向。

Best Artificial Intelligence books to read in 2020
社会学人工智能书籍
最紧迫的问题是,人工智能将如何影响我们人类,以及它将为我们带来什么样的未来。我们生活在自动化时代,因此我们必须制定正确的政策——既要促进现在的增长,又不能浪费我们的未来。

《德乌斯人:明日简史》现在是一本关于技术,尤其是人工智能如何影响社会的经典书籍。作者提出了一个历史的观点,并讨论了我们现在和未来的分歧。必读!

奇点临近普及了术语“技术奇点”,并展示了它将对我们产生的社会学影响。作者是一位著名的未来主义者,他按照自己的原则生活。
哲学人工智能书籍
如果我们想展望未来,等待我们的是一个技术奇点,一个人工智能能力将超过人类的时刻。这将是一个巨大变化的时刻,虽然它可能永远不会到来,但从未来的角度思考我们现在正在做的事情是值得的。

超智能是思考人工智能和人工通用智能的经典参考。尼克·博斯特罗姆列出了其他作者经常使用的所有理论。不容易读懂,但非常令人满意。

Life 3.0 是对人工智能的又一次尝试,如果人工智能比我们聪明得多,这对人类意味着什么。它有非常好的例子,并以一个迷人的故事开始,讲述了 AGI 如何进入世界并让一家公司占据主导地位。
面向商业的人工智能书籍
如果不是在这么多领域发现了这么多应用,人工智能也不会那么受欢迎。以机器学习的形式使用 AI 无处不在。这里有一个非常实用的专注于人工智能的商业书籍列表。

《人工智能的超能力》不仅是中国如何利用人工智能造福人类的绝佳参考,也是中国初创企业生态系统的绝佳参考。和硅谷有多么不同。

Artificial Intelligence Business
人工智能商业是为商业人士和商业导向的数据科学家提供的人工智能简明指南。注重实际,关注最新趋势。

应用人工智能是为商业领袖设计的。它为你提供了一个思考机器学习、深度学习、AGI、人工智能的框架,并展示了当今商业世界中的多个用例。
请留言告诉我你对这些书的看法。
如果你想看更多的技术书籍,请看我列出的 2020 年你应该看的数据科学书籍。
让我们保持联系——每周或每两周一次关于技术和人工智能的电子邮件。](https://creative-producer-9423.ck.page/c3b56f080d)
最后,如果你想了解成为一名数据科学家意味着什么,那么看看我的书数据科学工作:如何成为一名数据科学家,它将指导你完成这个过程。

Data Science Job
人工智能永远不可能是真正的智能
不要称机器是智能的——至少现在还不要

假设我被锁在一个房间里,给了我一大堆中文写作。我不懂中文,既不会写也不会说。我甚至无法将文字与其他类似的文字区分开来,比如日语。现在,我收到了第二批作品,但这次是一套英文说明(我知道如何将第一批作品与第二批作品联系起来)。我使用这些英文说明来寻找写作中的模式和常见符号。
然后我收到了第三批文章,同样是一套英文说明,这有助于我把它与前两批联系起来。这些说明还帮助我用相同的符号和字符来组织一个回答。这样下去。
过了一段时间,我对这个游戏变得如此精通,以至于没有人仅仅通过看我的回答就能判断出我是否是一个母语为汉语的人。但这是否意味着我懂中文?当然不是。
这个聪明的例子,叫做中文房间论点,来自约翰·r·塞尔的头脑、大脑和程序(1984)【1】强调了我们对人工智能理解的根本缺陷。这篇文章歌颂了这样一种观点,即我们试图人为制造的“智能”并不是真正的“智能”,你和我都认为这是我们人类的固有特征。这不过是对人类智慧的模仿或幻想。
什么是智能?
多年来,心理学家、研究人员和哲学家试图正式定义智力的概念。尽管有长期的研究和争论,人们已经对智力的定义进行了多次不同的尝试,但是至今还没有一个标准的定义。
通俗地说,我们在日常对话中使用“智能”一词;但是这里的上下文只意味着对人的相对“聪明”的主观测量。当非正式使用时,这个词暗指在个人水平上达到非常具体的程度的智力。在这篇文章中,我们只关注一般智力作为人类的一个定义特征。
莱格和赫特,通用智能:机器智能的定义(2007)【2】试图定义一个智能的通用衡量标准。他们提出了一个通用定义,该定义考虑了迄今为止提出的大多数定义3:
智能衡量代理在各种环境中实现目标的能力。
这可能是我们最接近的一次,但仍有不足。这个定义集中在一个基于目标的,可观察的代理特征。它意味着,为了让智能存在,它必须被观察者感知,并且主体必须被某种目标的完成所驱动。
这篇文章对智力提出了不同的看法,它与人类的本性有着千丝万缕的联系。澄清一下,这不是科学的观点,而是哲学的观点。
智慧的人性
人类已经进化成智慧生物。Yuval Noah Harari 在《智人:人类简史》中用认知革命的理论阐述了这一点,这一理论将我们与地球上的其他物种区分开来,并使我们成为今天地球上的主导物种。因此,我们可以假设人类的智力是我们“智力”的黄金标准。
但是为什么我们从智力的正式定义中排除了我们与生俱来的人性呢?仅仅是关于计算能力,信息处理和记忆吗?为什么只衡量生产率和效率?
除了执行任务的能力,我们还需要考虑无形的因素——智慧、幽默、道德、伦理、自由意志、自我意识、直觉和意识——更不用说创造小说的能力了。正如哈拉里提到的,讲故事的能力是推动我们物种成为地球主人的原因。
不用说,这也意味着要考虑到人类更黑暗的一面——欺骗、自私、撒谎和欺骗的能力。这种创造小说的能力——讲故事的艺术——就是我们所说的想象力。如果爱因斯坦之所以是爱因斯坦,仅仅是因为他拥有庞大的信息和知识储备,加上处理这些信息的超常能力,那么任何一台超级计算机都将能够取代他,我们今天就能够复制数百万份他的大脑。

“Imagination is more important than knowledge” — Albert Einstein
人工智能呢?
人工智能研究人员使用许多可用的智能定义中的一个作为他们创造人工“智能”代理工作的基础。在谷歌上快速搜索一下,就能得出人工智能的定义:“能够执行通常需要人类智能的任务的计算机系统的理论和发展,如视觉感知、语音识别、决策和语言之间的翻译。”
那我们一起玩吧。想象一台遵循指令、执行任务并做出决策的机器——然而它不知道它是什么,不知道它在做什么,为什么它在做,或者它的目的是什么。它甚至不想知道。机器比你更快,更擅长存储海量数据,效率更高。它能以光速进行计算,服从 T 的指令,听从命令,还能下一盘非常好的棋。
然而,无论移动有多快,游戏玩得有多有效率,策略看起来有多“聪明”——它仍然被限制在棋盘的四个角上,并且机器在一套预定的规则下工作。这台机器要么被预先编程,要么吸收大量数据并从中学习。不管怎样,它的知识仅限于它接触过的东西。
机器会作弊吗?它会不会愤怒地突然发飙,沮丧地掀翻棋盘?它的目标很明确:赢得比赛。没有古怪和不可预测的空间。例如,机器感觉不到来自对手恐吓战术的压力,因为它不理解恐吓的概念。情绪与游戏无关。另一方面,当我们在国际象棋比赛中与 Vishwanathan Anand 对决时,我们可能会流汗、紧张和恐慌。
AlphaGo 可能会在围棋比赛中击败 Lee Sedol,DeepBlue 可能会在国际象棋比赛中击败加里·卡斯帕罗夫,但这些都是只有一个目标的“弱人工智能”。他们不是多面的智慧生物。像那样的机器只不过是一种超高产、高效率的工具——一种达到目的的手段;本身不是一个独立的存在。一个高效的工厂工人当然可以被一台高效得多的机器取代——但是自动化并不等同于智能。

“It’s a human thing. You wouldn’t understand” — A fantastic movie called “I, Robot” (2004)
人类,还是“像人类”?
我们今天所知道的人工智能正在拼命地玩模仿游戏。这就引出了一个问题——如果我的行为完全像人类,那我是人类吗?
聊天机器人在这方面做得很好。现在很多聊天机器人都可以轻松通过图灵测试。它们模仿人类情感的程度令人恐惧。这并不意味着机器人是人类。这意味着机器人在创造情感幻觉方面非常出色,即使它们没有情感幻觉。自然,你似乎从机器人那里得到的“情感支持”是一场闹剧。
人工智能可以创作音乐、绘画并模仿人类的声音调制和语音[4]——但它们仍然遵循一种算法;一套预编程的规则和模式。就算他们有能力创作艺术,他们的创作中有没有感悟?他们对自己的工作感到自豪吗?他们会有意识地把情感和它联系起来吗?
对错的问题在这里也不重要。有些人可能会说,如果机器没有“感觉”会更好,这样它就可以在人们可能失去判断力或在情感压力下反应迟钝的情况下工作。当涉及到决策时,没有感情的代理人也确保公平和冷酷的理性。但是如果人性是智力的障碍,那么这些特工肯定没有资格坐在桌子旁边。
今天,我们试图达到的目标和真正的智能相距甚远。我们目前的定义和观点是错误的——我们只考虑基于目标的方法来衡量智力,但我们没有考虑到将人与机器分开的特征:自我意识。只要我们继续把头脑和大脑分开,我们可能永远无法实现机器的真正智能。
参考资料:
[1]塞尔,J. R. (1984)。头脑、大脑和程序; 中的文章行为与脑科学3(3):417–457:https://www . law . upenn . edu/live/files/3413-sear le-j-minds-brains-and-programs-1980 pdf
**【2】http://www . vetta . org/documents/legg-hut ter-2007-universal-intelligence . pdf
**【3】http://www . vetta . org/documents/A-Collection-of-Definitions-of-intelligence . pdf
**【4】https://blogs.microsoft.com/ai/xiaoice-full-duplex/
中国人工智能发展计划与气候危机

Mount Fanjing, Tongren, Guizhou, China — Photo by @renran
中国的人工智能计划解决了气候危机吗?
In one of the most extensive analysis of AI Policy around the world which I have found so far has been undertaken by Jessica Cussins Newman and is focused on AI Security. To begin I would say clearly that climate is not mentioned specifically in China’s A New Generation of Artificial Intelligence Development Plan (新一代人工智能发展规划), AI Policy from 2017. On the other hand ‘sustainable’ is mentioned four times. There was two mentions of environmental protection. I will discuss these four mentions of sustainable; two of environmental protection; and the context within which they are mentioned. I have found six focal points that can be linked to addressing the climate crisis within China’s AI strategy from 2017.
1.以可持续发展为中心的智能化
“发展智能经济,建设智能社会,维护国家安全,构建知识、技术、产业集群融合,人才、制度、文化相互支撑的生态系统,预见风险与挑战, 以智能 为核心推进可持续发展,全面提升社会生产力。 国力和国家竞争力为宗旨,加快建设创新型国家和世界科技强国,为实现“两个一百年”奋斗目标和民族伟大复兴提供有力支撑。”
The first mention of sustainable is mentioned in the second section called ‘Overall Requirements’ within the first point ‘(A) Guiding Thought’. Towards the end the 200 year goals are mentioned. The Two Centenaries (Chinese: 两个一百年) is a set of goals advanced by General Secretary XXX following the 18th National Congress of the Communist Party of China held in 2012. It is said to be the basic foundation for achieving the “Chinese Dream”, another ideology advanced by Xi. They were formed back in the 80’s. The goal for 2020 is the elimination of extreme poverty in China, linking it to GDP.
Sustainability可持续性Kě chíxù xìng
“能保持持续的自然”,同样地,这可能与生态学以及其他有关持续能力的概念有关。
可持续发展一直是中国当前战略的重要组成部分,然而,将可持续发展与 GDP 部分挂钩可能是不幸的,因为越来越多的证据表明,这是一个可能产生负面影响的指标。更换这种测量工具可能是幸运的,但这可能不是一种简单的追溯方法。
2.人工智能的健康和可持续发展
“人工智能的发展是一项关系全局的复杂系统工程。按照“构建体系、把握双重属性、坚持三位一体、强化四大支撑”的布局,形成人工智能健康持续发展的战略路径。”
这里说的三位一体是半信半疑的,我可能是错的。然而,卡尔·冯·克劳塞维茨试图通过连接人民、军队和政府之间的关系来阐明战略的“三位一体”,孙子着眼于这些行为者之间的相互依存关系,同时考虑到自然、地形和法律在形成战略中的作用。就算我可能错了。
另一方面,它更有可能指的是(1)稳定的人民币,(2)开放边境,(3)控制自己的利率。这被称为不可能的三位一体。
这一部分不仅谈到了目标,以及可持续发展是核心,它还坚持认为通往目标的道路必须是健康和可持续的。
3.跨学科可持续发展
“聚焦人工智能重大科学前沿问题,兼顾当前需求和长远发展,以突破人工智能基础理论瓶颈为重点,确保超前布局可能引发人工智能范式变革的基础研究, 促进可持续发展的学科交叉融合, 为人工智能深度应用提供强大的科学储备。”
在翻译的文档中提到了交叉整合,我选择将其翻译成跨学科的。
它不确定如何确保这一点,以及应该涉及哪些“类型”的学科。对学科整合的关注是一个有趣的想法,因为这在许多情况下被证明是具有挑战性的。在学术、商业或政府环境中,强大的科学储备也有助于促进这种合作,这当然是必要的。
4.促进基础设施持续发展的可持续生态系统
“高性能计算基础设施。继续加强超级计算基础设施、分布式计算基础设施和云计算中心建设。 为高性能计算应用的持续发展构建可持续的生态系统 。推动下一代超级计算机研发应用。”
由于通往人工智能的道路必须是“可持续的”,因此需要一个可持续发展的生态系统是有意义的。可持续和一致当然可以有不同的解释,发展的速度可能是对项目可持续性的挑战。
5.人工智能在环境保护中的应用
“人工智能为社会建设带来新机遇。我国正处于全面建成小康社会阶段,人口老龄化、资源环境约束等挑战依然严峻,人工智能在教育、、城市运行、司法服务等领域的应用将极大提升公共服务的精准化水平 ,全面提升人民的生活质量。”**
这个目标太笼统,不能说得太具体,但又特别提到人工智能是一系列不同领域的机会。这里要强调的要点是,人们希望提高公共服务的精确性。各国政府一直希望在一个人口众多的模糊世界中更准确、更具体地运作。中国是世界上人口最多的国家,2017 年估计有 1379302771 人。很难将定量理解等同于生活质量,但是对于如此大的数量,很明显,理解这些数据或做出决策可能涉及很大程度的自动化。
6.智能环保
智能环保 。建立大气、水、土壤等环境领域智能监测的大数据平台。构建陆海互动、大地互动、信息共享的智能环境监测网络和服务平台。研究开发资源能源消耗和环境污染物排放智能预测模型和预警方案。 加强京津冀、长江经济带等国家重大战略区域环境保护和突发环境事件智能防控体系 。”
这涉及到确保保护环境遗址和预测环境的突然变化。随着时间的推移,突然的变化预计会更频繁地发生,因此,能够使用更准确的模型来预测或了解大范围内正在发生的事情非常重要。预测必然是一种合作,世界各地的天气数据都是如此,然而,测量和预测的意愿并不新鲜——将人工智能加入其中并不是一件奇怪的事情。
总结
我们可以看到 2017 年中国人工智能战略中与解决气候危机相关的六个焦点。我认为它在战略中得到了解决,可以在这些要点的基础上制定计划,或者在这些要点中提出论点,使项目具有生命力。每一点我都加了一个问题。
- 以智能为中心的可持续发展。 我们如何让可持续发展成为 AI 发展的中心?
- 人工智能健康可持续发展的战略路径。AI 本身的发展路径如何才能可持续,这样目标和方式才有?
- 跨学科可持续发展或/和学科整合。 哪些学科需要整合,在国内外可以通过哪些方式实现?
- 基础设施持续发展的可持续生态系统。 中国政府如何审计其云提供商或资源提供商,以确保开发是负责任的?在不同的解决方案中可以看到哪种类型的能源使用?
- 人工智能在环保领域的应用,提升公共服务的精准化水平。 中国政府可以探索哪些与人工智能相关的政府技术来改善公共服务?
- 通过大数据实现智能环保和监控。 中国如何与其他国家在环境保护和监测方面开展合作,5G 网络可以以何种方式用于此目的?
最后,我意识到关于中国的争议并不能使这些观点没有问题。我对这些并不视而不见,但是理解我们如何共同努力解决气候危机是很重要的——因为这是一个可怕的危机,而中国是地球上人口最多的国家,我们都依赖于中国如何处理这个普遍的问题。
我是#500daysofAI,你正在阅读第 155 篇文章。500 天来,我每天都写一篇关于人工智能或与之相关的新文章。
人工智能:用更多的精力更快地做蠢事!
在数据推动的时代,我们为什么需要新一代的领导者
选择题时间!什么样的工人最好?
可靠的工人,他们准确、快速、高效地执行订单。
B)不可靠的工人,他们可能想做也可能不想做被告知的事情。

如果你认为这是一个简单可靠的选择(A)是显而易见的答案,请三思。这真的取决于给工人下达指令的人的技能。
In case you’d prefer the video version, here’s me talking you through the same ideas.
可靠的员工会有效地扩大一个好领导的明智决策,但不幸的是,他们也会放大一个愚蠢的决策者。还记得那些经典的咖啡馆海报吗?“咖啡:用更多的精力更快地做蠢事!”当一个领导无能(或者堕落)的时候,不靠谱的工人是一种福气。不能把专一的决心从他们身上拽出来?太棒了!当狂热者全心全意地追求糟糕的决策者设定的目标时,事情会变得可怕。
决策者的素质很重要!当一个领导无能或者堕落的时候,不可靠的工人是一种福气。
如果你有一个傻瓜在负责,不可靠的选项(B)是你最好的希望:没做多少事,领导者的愚蠢失败了。
计算机是最可靠的工作者,它们能以惊人的速度大规模满足你的愿望。
现在是坏消息!计算机是最可靠的工人。他们只做让他们做的事。不多也不少。他们不为自己着想。他们根本不思考!除了你告诉他们想要的,他们什么都不想要。(事实上,神经科学家将动机——想要——等概念视为一种生物特权。说一台机器真的想要任何东西是没有意义的。)如果你告诉你的电脑想对这个世界说一百万次“你好”,你不会得到任何抱怨。指望我为你做同样的任务?不行,我已经厌倦了。

与机器相比,人类是不可靠的。如果你选择一项人类和机器能够在个体水平上同样出色地完成的任务,并将其分配给 1000 台机器和 1000 个人,我不会赌人类团队会获得最佳总分。原因如下。
如果你最痴迷于个人层面的绩效或模型复杂性,你可能会错过一个重要的概念:系统层面的激励复杂性。
我们都是珍贵的雪花,伴随而来的额外好处是在我们各自的方面都不可靠。我们每个人都花了一生的努力来培养,没有两个人从我们的环境中获得相同的一系列输入。结果是,员工们的各种激励令人眼花缭乱——从和孩子玩耍到寻找垃圾食品,再到偶尔看起来很忙。随着他们的不可靠性拉向不同的方向,它给糟糕的决策者踩了刹车。
我们人类所有的不可靠性都指向不同的方向,给糟糕的决策者踩刹车。
这就是为什么人类通常不像机器那样高效地放大领导者的意图。(也就是说,如果人们像铁屑和磁铁一样站在一起,历史表明我们会做出一些可怕的事情。)

计算机系统倾向于遵循更简单的激励机制,因为这些机制是由建造它们的人类决定的。作为头脑简单的生物,我们倾向于选择像“收益最大化或“ 准确识别猫 ”这样的目标。如果我们觉得有趣的话,也许我们可以一次结合两到三个。
今天的应用程序背后是大量的机器,它们都遵循着相同的简单命令。
相比之下,这个星球上所有不同的思想都经历了各种各样的激励,都朝着不同的方向努力。即使是一个单一的大脑也充斥着处于反叛边缘的竞争目标的宇宙。一个开发者如何手工制作这样一个系统?你不知道……或者也许机器辅助的超复杂激励设计是下一个巨大的类人智能( HLI )突破的来源。抛开猜测不谈,今天的应用程序背后是大量的机器,它们都遵循着相同的简单命令。
技术是衡量人类决策者意愿的杠杆。
谁下的命令?不管是谁负责这个项目。我希望我们停止使用暗示有任何技术是自主的或者独立于人的语言。难道不是人类建造的吗?(还是有什么我不知道的外星事件?)
For those who prefer watching to reading, here’s a keynote I gave on this topic
因为它总是来自于人并由人设计,所有的技术都是建造它的人的愿望的回声。有时,这种回声在按下按钮后会持续很长时间,以至于很容易忘记人们在其中扮演的角色。它总是做人们建造它要做的事情……可悲的是,这往往不是人们希望它做的事情。(Devs,你知道那个 bug 是你的错,不是电脑的,对吧?)
头发尖尖的老板是天启四骑士之一。
技术衡量人类决策者的意愿。这是一个杠杆,它越大,它就越是一个杠杆。当杠杆变得足够长,足以推动世界时,为什么我们不要求知道使用杠杆的人是否有能力负责任地使用杠杆?

Image: SOURCE.
在过去的几个世纪里,糟糕的决策者相对来说是自我限制的,所以培训人们的决策技能并没有被认真对待。当然,你可以从婴儿时期就开始辅导皇室成员,但为什么要为其他平民费心呢?
今天,随着计算机系统的规模扩大到触及更多的生活,我们经常被提醒,你的花园品种技术产品经理有幸拥有一个更美好的童年,并没有通过快速赶上来做好准备,以承担他们在技术推动的世界中日益增长的责任。
地位太高,手艺不够。
最糟糕的是那些只把决策视为捶胸顿足和施加地位的另一种方式的领导者。把杠杆拉得足够长,这个尖头发的老板就变成了天启四骑士之一。也许是时候重新思考决策作为一门科学和一项需要培养的技能了。
这些和人工智能有什么关系?
到目前为止,我们的讨论一般都是关于可伸缩技术的。没有一个是特有的人工智能。
ML/AI 的问题在于,有效且负责任地构建它需要可扩展技术的所有决策技巧,甚至更多。更像是决策智慧和决策愚蠢的放大器(我希望你会同意其中一个听起来更合胃口)。
就当是神灯泛滥吧。
当我想到机器学习和 AI 的时候,我想到了一个神灯的泛滥。忘记人形机器人吧——这些技术要强大得多。与传统编程不同,它们允许你解决一个问题,即使你自己想不出解决方案的步骤。
AI 可以让你把不能表达的东西自动化。
那是因为他们让你用例子和目标来表达你的愿望,而不是明确的指令,这意味着你可以超越人类表达的自动化。

人工智能代表了人类进步的一个根本性飞跃……但是你还记得每个小心你的愿望故事的寓意吗?
危险的不是精灵,而是不熟练的许愿者。
在那些故事中,危险的不是妖怪。是不熟练的许愿者。精灵的魔法可能会给人类带来巨大的好处,但这取决于你把它指向哪个方向。如果我们的物种被赋予了巨大的力量,我会比众多善意的骗子更不害怕好莱坞漫画中的恶棍(严重的精神变态非常罕见)。
与传统编程相比,ML/AI 涉及到用更接近那些神灯故事的风格来表达你想要的东西。
在其核心,ML/AI 范式是一种与机器交流的新方式。与传统的编程(一步一步的指令)相比,ML/AI 涉及到以更接近那些神灯故事(目标和例子)的风格表达你想从精灵那里得到什么。
当你把与数据大规模交流的权力交给轻率的交流者时,会发生什么?
人工智能的可怕之处不在于机器人。是人民。
一个 ML/AI 系统要么测试失败,什么也不提供(因为你的精灵太无能了,以至于你把灯送回了阁楼),要么通过测试,并提供决策者想要的。不是决策者想要或希望的,而是确切地说决策者要求的。如果他们许了一个愚蠢的愿望呢?
测试一个 ML/AI 系统保护你免受一个无效的精灵,而不是一个愚蠢的愿望。
如果你怀有以下情绪,请非常害怕:“我从来不做老板让我做的事,我只做老板真正想做的事。”

Less hoping and more training, please. SOURCE.
你的意思是你的老板不知道如何负责任地许愿。让他们负责一个人工智能项目是一场迟早会发生的灾难。取而代之的是,他们需要训练或者被放到安全的地方?)在那里他们不能造成任何伤害。把你的视线从他们身上移开一会儿,他们会要求一个人工智能系统制造尽可能多的回形针。
我们需要比以往更加努力地工作,以确保参与决策角色的任何人都拥有负责任地实现愿望的技能。
或许最危险的许愿者是那些其愿望会产生意想不到的后果,从而逃脱脆弱的安全网的人。即使许愿者有最好的意图,如果他们不能充分考虑他们的要求,使愿望的精神与其文字相符,他们也是一个危险。权力越大,责任越大……明智地使用这种权力。这需要技巧,而不仅仅是良好的意愿。但是你如何为人工智能时代建立负责任的许愿技能呢?通过投入时间和寻找他们。
可扩展的技术就像不断加长的杠杆,我们不能忘记在这些杠杆的末端有一个人类决策者。
规模强大的技术变得越来越容易使用,因此认识到它们融入了多少的人性元素比以往任何时候都更加重要。
如果你习惯于指责没有生命的物体,你在这里没有帮助。睁开你的眼睛,看看机器后面的人。
如果你想担心人工智能,不要担心人或机器人。担心规模、速度、范围和寿命。工具的效果越大,你就越需要小心使用它。你的决定影响的人越多,你的责任就越大。
如果你问我是否害怕人工智能,我听到你问我的是我是否害怕人类的疏忽。
如果你问我是否害怕人工智能,我听到你问我的是我是否害怕人类的疏忽。这是这个问题对我来说唯一有意义的方式。我的回答?不。我对我们人工智能的未来很乐观。我相信人们可以学会负责任地建立安全有效的系统,推动进步,让周围的人生活得更好。
这与智商无关,这是关于站出来选择建立一些新的精神肌肉。一旦人们意识到某件事值得认真对待,他们通常会给你留下深刻印象。想象一下,试图向从未见过汽车的人解释高速公路。(“你的速度有多快?!周围还有其他人吗?怎么还有人活下来?”)不知何故,我们大多数人都设法获得了安全驾驶技能……尽管显然不知道如何正确地走路。(为什么是的,我确实住在纽约— 是什么泄露了这个秘密?)
同样,我相信如果你有决心,你可以发展你的决策技能。这些东西可以教。这就是为什么我(和其他像我一样的人)选择站出来,为培养一批精通决策智能的新一代领导者做出贡献。
如果我们教人们如何建造神灯,我们也必须教授负责任地许愿的技巧。否则,巨大的规模会带来巨大的问题。
决策智能是一门新的学术学科,涉及选项选择的所有方面。作为一项运动,它建立在这样一种认识上,即如果我们教人们如何建造神灯,我们也必须教他们负责任地许愿的技巧。否则,巨大的规模会带来巨大的问题。
如果你的团队缺乏在项目开始时负责任地许愿的技能,那么所有美丽的工程都没有意义——最终只会带来有毒的垃圾。另一方面,如果我们培养有技能的领导者,那么人类可以享受前所未有的安逸和富足。在有能力的决策者手中,可扩展技术可以帮助我们解决人类面临的一些最大问题。
我们花了太长时间坚持用简单的解决方案来解决问题——简单是指我们可以用头脑去思考它们。简单的方法不能解决所有的问题,所以是时候把复杂的解决方案加入到我们的清单中了。人工智能是我们如何越过那些低挂的水果到达星星的方法。
如果你很好奇,你可以从这里开始学习决策智能:
人工智能时代领导力的新学科
towardsdatascience.com](/introduction-to-decision-intelligence-5d147ddab767) [## AI 入门?从这里开始!
深入项目所需了解的一切
medium.com](https://medium.com/hackernoon/the-decision-makers-guide-to-starting-ai-72ee0d7044df)
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
Enjoy the entire course playlist here: bit.ly/machinefriend
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。
人工智能——伦理与世界统治?

Photo by @deko_lt
对挪威来说,这是一个奇怪的问题
一个朋友联系了我,他正在挪威的一个大型商业会议上帮忙主持一个活动,这个会议是工业界和政界人士聚会的地方。活动的名称是“人工智能——伦理与世界统治?”。在这种情况下,有人问了我几个问题,我将尽力回答。然而,我将首先讨论我收到的与该主题相关的一系列问题。这些问题涉及竞争力、以人为中心的人工智能、挪威利益和社会责任人工智能。首先让我们从事件的描述开始。
(安全)困境
人工智能被选为国家竞争力的战略性重要技术。在全球范围内,存在着实现最雄心勃勃的目标和战略的军备竞赛。欧盟希望在全球范围内发挥领导作用,以加强业务发展和欧盟在世界上的战略地位。与此同时,欧洲国家在数据安全、道德和“以人为中心”的技术发展方面有着明确的目标。根据一些人的说法,这些目标可能与赢得“人工智能军备竞赛”的目标相冲突,而中国和美国等全球竞争对手的限制较少,例如获取人工智能开发的原材料,特别是数据。
在这种情况下,我被问了四个问题:
- 应该联系哪些与此主题相关的挪威教授?
- 欧盟如何加强其在人工智能中的地位,追求“以人为中心”的人工智能意味着什么?
- 挪威在这幅图景中的角色和可能性是什么?谁在维护挪威的利益?
- 发展 AI 对挪威和欧洲的竞争力有多重要?
- 具有社会责任感的人工智能如何在地缘政治游戏中成为竞争优势?
应该联系哪些与此主题相关的挪威教授?
不同领域的各种教授都值得联系。每个人都有自己的专业领域,就像教授一样,划分出一个重点领域。这是我按优先顺序列出的三个人的短名单:
- 比约恩·海兰。我今年春天完成的社会科学中的机器学习模块的老师名叫比约恩·霍兰德,他是政治学研究所的教授。他既教授 STV2500 欧洲决策过程和政策领域,也教授 STV1515 — 机器学习和社会科学家编程。他的背景是 2005 年伦敦政治经济学院的博士学位。他是《欧盟政治》编辑委员会的成员。他的研究兴趣是立法政治、应用政治方法论和计算社会科学。
- Lene Pettersen 是奥斯陆大学的副教授,她最近写了一篇关于新闻参与式商业模式的文章。她的背景是人类学、媒体研究和商业的混合体。此外,她还是跨学科媒体研究中心(STM)委员会(STM)的成员,也是 STM 关于数字媒体领域的算法、自动化和数据分析的《Norsk medietidsskrift》特刊(2019 年 1 月 17 日)的两位编辑之一。
- 两位挪威学者即将出版一本关于数字伦理的书。Leonora Onarheim Bergsj 和 kon Bergsjø是这本书的两位作者。因此,他们可能对这个问题有一些清晰的想法。利奥诺拉拥有奥斯陆大学的伦理学和宗教哲学博士学位。她的研究重点是数字伦理。
对于 UiO 教授本周在阿伦达尔苏卡参加的活动,我还有什么进一步的建议吗?这是一个棘手的问题。因为半年来我一直试图在奥斯陆大学寻找对社会科学相关课题感兴趣的教授。我已经通过人工智能社会研究组织了一系列关于人工智能应用的社会科学问题的演讲。
欧盟如何加强其在人工智能中的地位,追求“以人为中心”的人工智能意味着什么?
毫无疑问,这是一个具有挑战性且抽象的问题。人工智能领域内的大部分努力不都是以人为中心的吗?它毕竟是由人类创造的,并被灌输了基于我们决定的行动。人工智能不是【它】或【物】,至少在大多数情况下还不是,我们把它比作我们自己,陈词滥调已经变成拥有一只机器手臂和一只人类手臂。这是一个持久的形象。
想要“通过我们的图像进行重建”听起来很直观,特别是深度神经网络(DNN)的焦点,这是最受欢迎的机器学习技术,它重振了该领域,是以神经元(一种发射神经脉冲的专门细胞)为模型的。因此,由于一系列(几乎)类似人类的机器人,这似乎已经成为科学家或超人类学家的痴迷,他们倡导通过技术增强人类生理来改变人类状况。我们在谈论超人、奇点等等。它当然有一种宗教氛围。
我以前写过关于 AI 和冒名顶替综合症 的文章,谈到拟人化(赋予人类特征)以及为什么它可能为开发人员创造一种危险的文化,并可能导致一系列关于给定项目能力的误解。从某种意义上来说,如果成为人类本身就是一个伟大的目标的话,这可以比作争取永生或追逐圣杯。我并不是说有些人不应该追求它,但是如果这种看法成为人工智能发展中的主导思想或教条,这将是潜在的危险。
我们必须看到技术应用的局限性和不同之处,甚至麻省理工学院提出的机器行为也暗示了人类和机器的对立。就像:这不是人类的行为,这是不同的,必须这样研究或理解。另一方面,如果我们采取一种不那么社会建构主义的方法(与这种政治观点相关),并从国家权力的角度考虑现实主义,我们可以大胆地进行完全不同的讨论。然而,让我们更长时间地坚持建构主义的观点。
发展 AI 对挪威和欧洲的竞争力有多重要?
欧盟正在加强其在人工智能中的地位,因为人工智能已经证券化。沃尔和布赞的证券化理论在这方面很有意思。理论家们常用的一个例子是,恐怖主义是安全讨论中的重中之重,尽管人们更有可能死于汽车或可预防的疾病,而不是恐怖主义。证券化研究旨在了解“谁证券化(证券化行为者),在什么问题上(威胁),为谁(参考对象),为什么,有什么结果,同样重要的是,在什么条件下。”
从这个意义上说,欧盟(行动者)正在将人工智能(威胁)安全化,以采用以人为中心的方法(参照对象,必须保护的理想)来保护欧盟公民以及欧洲社区(观众)。当然,这可以被重新定义和简化。然而,以人为中心的观点认为这种选择有些不人道,可以说他们是对的。
我写了关于脸书对欧盟人工智能和数据政治以及欧盟对脸书违反隐私条例的罚款。在本文中,我重点关注欧盟基本权利机构(FRA)的报告,名为 数据质量和人工智能——减少偏见和错误以保护基本权利 。这个概念更接近于所谓的公平,我也探讨了它与性别和平等的关系。
值得一提的是,这种做法并非欧盟独有。最近,斯坦福大学开设了以人为中心的人工智能研究所。然而,当它从微软获得如此大一部分资金时(如果我错了,请纠正我),欧洲的伦理研究所,如慕尼黑的研究所,从脸书获得如此多的资金,这可能会有问题。如果以人为中心是明显的利益冲突,那么这些机构就是高度以人为中心的。我们很难下定决心。
挪威在这幅图景中的角色和可能性是什么?谁在维护挪威的利益?
我还没有完全回答这个问题,但我确实之前概述了 2019 年所有斯堪的纳维亚人工智能战略。我们所有人面临的最大风险是气候危机,我们不应忘记这一点。是的,开发负责任的机器学习应用程序很重要,然而现在人工智能安全的最大威胁是而且应该是气候变化。如果我们将出口产生的排放包括在内,那么挪威是世界上最大的二氧化碳排放国之一。削减石油和天然气,专注于可再生能源以及人工智能领域的高科技发展,可能是一种方法。
人们普遍认为,如果我们要履行对《巴黎协定》的承诺以及确保人类生存的责任,就必须这样做。我不是在暗示 AI 不是威胁。与此同时,重要的是要考虑到挪威没有核武器,尽管它以出口形式出售大量武器。一段时间以来,核战争的威胁一直笼罩着人类,这可能是因为我们问自己一些问题,例如在这场辩论中提出的问题。
如果我们追溯到政治学和国际关系,美国是影响力最大的霸权国家,尽管它受到中国等新兴大国的挑战,未来我们可能会有一个两极世界,有两个大国,而不是一个大国(单极)。谁在维护挪威的利益?中国最近收购了一系列挪威公司,一位富有的商人也在挪威购买土地。
中国的采矿(铜矿)和觅食(购买 Norske Skog)可能导致挪威在更大程度上成为中国的供应商。美国通过以延斯·斯托尔滕贝格为首的北约对挪威的兴趣似乎相对清晰。欧盟正在扩大与挪威的能源合作,因此也有一些既得利益。然而,如果我们更具体地问自己“谁”是一个人,我发现很难回答这个问题。
如果我们问“谁”是一个机构,挪威的利益在于和平,那么奥斯陆和平研究所似乎是一个重要的机构。此外,挪威国防研究机构(FFI)与挪威国防部门在维护我们的国防利益方面有着浓厚的兴趣。挪威网络防御系统正在大规模招募各种角色——这一点似乎很清楚。
具有社会责任感的人工智能如何在地缘政治游戏中成为竞争优势?
很难知道是否会考虑采取激烈的行动,比如将挪威所有的政府系统都建立在区块链的基础上。量子计算与人工智能相结合的黑客努力(特别是递归神经网络)似乎是一种威胁,可以随着加密的增加而减轻(尽管这不是我的领域)。
爱沙尼亚已经通过电子爱沙尼亚这样做了。鉴于最近对佐治亚州法院的勒索攻击或挪威金融科技公司最大的之一 VISMA 的黑客攻击,这一点可能很重要。由于网络攻击正在发生,这导致安全意识的增加或缺乏。然而,在这种情况下考虑人工智能的能量使用是至关重要的。此外,由于气候危机的恶化,这种数字安全困境或数字不安全性可能会威胁到我们的生存。
安全困境与数字相关,但在这种情况下,这种对数据安全化的关注可能导致 Putnam 所描述的与国际和国内政策相关的两级博弈。也可以说,这可以创造出一定的政治人物,当他们对“俄罗斯”(例如face app)或“中国”的数据干扰构成威胁时。
在这种情况下,对脸书或谷歌处以巨额罚款可能被视为一种保护措施,同时也证明了政治实力。因此,人工智能或人工智能应该是什么的“想法”或意识形态可以在政治环境中被利用。人们担心新技术会在某些社会中变得无处不在(当然这是有充分根据的),表现出政治意愿当然可能是一种战略举措。
挪威已经开始在 NAV(国有福利系统)中开发机器学习能力。我知道这一点,因为他们试图通过会谈在大学里招募我们。将编程与社会科学相结合是一种越来越需要的结合,至少这是哥本哈根大学在创立社会数据科学硕士项目之前的研究显示的。人工智能可以社会民主吗?AI 安全能不能考虑工作安全?
社会责任人工智能当然会考虑社会科学、自然科学和其他科学领域。我认为英国作为一个例子犯了一个大错,他们的重点是投资 2 亿英镑在纯粹的自然科学上。然而,他们当然可以证明我错了。为什么不走独特的道路,专注于被认为是斯堪的纳维亚人参与民主进程以及关注社会民主人工智能?我们能否将可持续发展作为人工智能发展的重点?对我来说,这是有趣的问题,需要提出来,而不是挂在世界统治上。
对于小小的挪威来说,这确实是一个奇怪的问题,然而我们经历了入侵,除了应对我们面临的严峻的气候危机之外,我们还必须考虑这种发展可能带来的影响,同时照顾我们的公民(新老公民)。
这是第 500 天的第 65 天。我目前第 50-100 天的重点是人工智能安全。如果你喜欢这个,请给我一个答复,因为我确实想提高我的写作或发现新的研究,公司和项目。
人工智能:可以用任何语言解释

什么是 Ai?
这要看你问谁了。当这个术语在 1956 年被创造出来的时候,“人工智能”已经忍受了一生的误解。
可解释性是缺失的一环,也是它被误解的原因。问题出在对“智力”这个词的解释上。用传奇计算机科学家 Edsger Dijkstra 的话说:“计算机能否思考的问题并不比潜艇能否游泳的问题更有趣。
如果我问你谁是更好的游泳运动员,你会选择迈克尔·菲尔普斯还是伊利诺斯号?游泳是人的活动,当然不是潜艇做的事。然而,潜水艇游得比任何游泳者都快得多,距离也远得多。
智力就像游泳;我们把它和生物联系在一起。更令人困惑的是,人类长期以来一直在“转移目标”智力的构成要素。1642 年,帕斯卡写道,一个设备“最终将在不依赖人类智能的情况下完成所有四种算术运算。”看起来,帕斯卡会把加、减、乘、除的能力看作是智能,而在计算器上这样做的能力会是人工(机器)智能的一种形式。快进到今天,计算器被认为是最基本的。问题就在这里:通过承诺智能,人工智能设置了一个高的、模糊定义的障碍,破坏了它实际上可以和已经实现的一切。
人工智能通常至少展示了以下一些与人类智能相关的行为:规划、学习、推理、解决问题、知识表示、感知、运动和操纵,以及在较小程度上的社会智能和创造力。
Ai 类型
高级 Ai 可以分为两大类:狭义 Ai 和广义 Ai。
狭义人工智能是我们今天在计算机中看到的一切:智能系统已经被教会或学会如何执行特定的任务,而没有被明确编程如何这样做。
这种类型的机器智能在 iPhone 上苹果 Siri 虚拟助手的语音和语言识别中,在自动驾驶汽车的视觉识别系统中,在根据你过去购买的东西推荐你可能喜欢的产品的推荐引擎中,都很明显。与人类不同,这些系统只能学习或被教会如何完成特定的任务,这就是为什么它们被称为狭义 Ai。
通用人工智能非常不同,它是在人类中发现的适应性智力类型,是一种灵活的智能形式,能够学习如何执行完全不同的任务,从理发到建立电子表格,或者根据积累的经验推理各种各样的主题。这是一种在电影中更常见的人工智能,像 2001 年的哈尔或终结者中的天网,但今天并不存在,人工智能专家对它多久会成为现实存在激烈的分歧。
人工智能研究人员文森特·C·穆勒和哲学家尼克·博斯特罗姆在 2012/13 年对四组专家进行的一项调查报告称,2040 年至 2050 年间,AGI(人工通用智能)有 50%的可能性被开发出来,到 2075 年这一比例将升至 90%。该小组甚至更进一步,预测所谓的“超级智能”——博斯特罗姆将其定义为“在几乎所有感兴趣的领域中大大超过人类认知表现的任何智力”——预计将在 AGI 成就约 30 年后出现。尽管如此,一些人工智能专家认为,鉴于我们对人脑的了解有限,这种预测过于乐观,并认为 AGI 仍有很长的路要走。
是什么推动了人工智能的复兴?
近年来人工智能研究的最大突破是在机器学习领域,尤其是深度学习领域。这在一定程度上是由数据的易获得性推动的,但更重要的是由最近并行计算能力的爆炸推动的,在此期间,使用 GPU 集群来训练机器学习模型变得更加普遍。
这些集群不仅为训练机器学习系统提供了强大得多的系统,而且它们现在可以作为互联网上的云服务广泛使用。主要的科技公司,如亚马逊、谷歌和微软,已经开始使用专门为运行和最近的训练机器学习模型量身定制的处理器。
这些定制处理器的一个例子是谷歌的张量处理单元(TPU),其最新版本加快了使用谷歌 TensorFlow 软件库建立的机器学习模型从数据中推断信息的速度,以及它们可以被训练的速度。
这些处理器不仅用于训练 DeepMind 和谷歌大脑的模型,还用于支撑谷歌翻译和谷歌照片中的图像识别的模型,以及允许公众使用谷歌的 TensorFlow 研究云建立机器学习模型的服务。第二代处理器在两年前的 5 月份谷歌 I/O 大会上亮相,这些新的 TPU 阵列能够训练用于翻译的谷歌机器学习模型,时间是高端图形处理单元(GPU)阵列的一半。
什么是机器学习?
机器学习(ML)是对算法和统计模型的科学研究,计算机系统使用这些算法和统计模型来执行特定任务,而不使用显式指令,而是依赖模式和推理。它被视为人工智能的一个子集。
简而言之,ML 用数据来回答具体问题。今天,享受某种复兴,ML 是计算机系统被输入大量数据的地方,然后它使用这些数据来学习如何执行特定的任务,例如理解语音或为照片添加字幕。
ML 有哪些要素?
一般来说,ML 可以分为两大类:有监督的和无监督的学习。
有监督的学习
教授人工智能系统的一种常见技术是通过使用大量带标签的例子来训练它们。这些模型被输入了大量的数据,这些数据被注释以突出感兴趣的特征。这些可能是贴有标签的照片,以表明它们是否包含一只狗,或者是有脚注的书面句子,以表明“bass”一词是与音乐还是鱼有关。一旦经过训练,模型就可以将这些标签应用于新数据,例如刚刚上传的照片中的一只狗。
这种通过例子来教授模型的过程被称为监督学习,标记这些例子的角色通常由在线工人来完成,他们通过亚马逊机械土耳其公司这样的平台来雇佣。
训练这些模型通常需要大量数据,一些模型需要搜索数百万个例子,以学习如何有效地执行任务——尽管在大数据和广泛数据挖掘的时代,这越来越有可能。训练数据集非常庞大,而且规模还在不断增长——谷歌的开放图像数据集约有 900 万张图像,而其标记的视频库 YouTube-8M 链接到 700 万个标记的视频。ImageNet 是这种类型的早期数据库之一,拥有超过 1400 万张分类图像。历时两年,由近 5 万人(其中大部分是通过亚马逊土耳其机械公司招募的)整理而成,他们检查、分类并标记了近 10 亿张候选照片。
从长远来看,访问巨大的标记数据集也可能不如访问大量计算能力重要。最近,GANs(生成对抗网络)展示了被输入少量标记数据的 ML 系统如何产生大量新数据来自学。
这种方法可能会导致半监督学习的兴起,在这种学习中,系统可以学习如何使用比今天使用监督学习的训练系统所需的更少量的标记数据来执行任务。
无监督学习
相比之下,无监督学习使用了一种不同的方法,算法试图识别数据中的模式,寻找可以用来对数据进行分类的相似性。
例如,将重量相似的水果或发动机大小相似的汽车聚集在一起。
该算法并没有预先设置来挑选特定类型的数据,它只是寻找可以根据其相似性进行分组的数据,例如,谷歌新闻每天将类似主题的故事分组在一起。
强化学习
强化学习的一个粗略类比是当宠物表演一个把戏时奖励它一份食物。
在强化学习中,系统试图根据其输入数据最大化奖励,基本上经历一个试错过程,直到达到最佳可能结果。
强化学习的一个例子是谷歌 DeepMind 的 Deep Q-network,它在各种经典视频游戏中的表现超过了人类。该系统从每个游戏中获取像素,并确定各种信息,例如屏幕上物体之间的距离。
通过查看每场比赛中获得的分数,系统建立了一个模型,该模型显示在不同情况下哪个动作将使分数最大化,例如,在视频游戏“突围”的情况下,为了截住球,应该移动球拍。
什么是神经网络?
机器学习过程的关键是神经网络。这些是大脑启发的算法互连层网络,称为神经元,它们将数据输入彼此,并可以通过修改输入数据在层间传递时的重要性来训练它们执行特定任务。在这些神经网络的训练过程中,附加到不同输入的权重将继续变化,直到神经网络的输出非常接近所期望的,此时网络将已经“学会”如何执行特定的任务。
机器学习的一个子集是深度学习,其中神经网络被扩展为具有大量层的庞大网络,这些层使用大量数据进行训练。正是这些深度神经网络推动了计算机执行语音识别和计算机视觉等任务的能力的飞跃。
有各种类型的神经网络,具有不同的优点和缺点。RNNs(递归神经网络)是一种特别适合于语言处理和语音识别的神经网络,而 CNN(卷积神经网络)更常用于图像识别。神经网络的设计也在不断发展,研究人员最近改进了一种更有效的深度神经网络形式,称为 LSTM(长短期记忆),使其运行速度足够快,可用于谷歌翻译等按需系统。
人工智能研究的另一个领域是进化计算,它借鉴了达尔文著名的自然选择理论,看到遗传算法在世代之间进行随机突变和组合,试图进化出给定问题的最优解。
这种方法甚至被用来帮助设计人工智能代理,有效地使用人工智能来帮助构建人工智能。这种使用进化算法优化神经网络的方法被称为神经进化,随着智能系统的使用变得更加普遍,特别是在数据科学家的需求经常超过供应的情况下,它可能在帮助设计高效人工智能方面发挥重要作用。这项技术最近由优步人工智能实验室展示,该实验室发布了关于使用遗传算法来训练深度神经网络以解决强化学习问题的论文。
最后,还有专家系统,其中设备被编程有规则,允许它们基于大量输入做出一系列决定,允许机器模仿特定领域的人类专家的行为。这些基于知识的系统的一个例子可能是,例如,驾驶飞机的自动驾驶系统。
人工智能将如何影响我们的世界?
自动驾驶汽车和机器人
对机器人能够自主行动、理解和导航周围世界的渴望意味着机器人和人工智能之间有天然的重叠。虽然人工智能只是机器人技术中使用的技术之一,但人工智能的使用正在帮助机器人进入新的领域,如自动驾驶汽车、送货无人机,以及帮助机器人学习新技能。通用汽车(General Motors)最近表示,将在 2019 年前制造出没有方向盘或踏板的无人驾驶汽车,而福特承诺在 2021 年前做到这一点,谷歌母公司 Alphabet 内部的自动驾驶集团 Waymo 将很快在凤凰城提供无人驾驶出租车服务。假新闻
我们即将拥有能够创造照片般逼真的图像或以近乎完美的方式复制某人声音的神经网络。随之而来的是巨大的破坏性社会变革的可能性,比如不再相信视频或音频片段是真实的。人们也开始担心这些技术将如何被用来歪曲人们的形象,因为已经有工具被用来令人信服地拼接著名女演员。语音和语言识别
机器学习帮助设备识别人们在说什么,准确率接近 95%。最近,微软的人工智能和研究小组报告说,他们已经开发出一种系统,能够像人类转录员一样准确地转录英语口语。随着研究人员追求 99%的准确率,预计对设备说话将与更传统的人机交互形式一起成为常态。面部识别和监控
如今,面部识别系统的准确性已经向前迈进了一大步,中国科技巨头百度表示,只要视频中的人脸足够清晰,它就可以以 99%的准确率匹配人脸。而西方国家的警察部队通常只在大型活动中试用面部识别系统。在中国,当局正在启动一项全国范围的计划,将全国各地的闭路电视连接到面部识别系统,并使用人工智能系统跟踪嫌疑人和可疑行为,同时也在测试警方使用面部识别眼镜。尽管世界各地的隐私法规各不相同,但这种对人工智能技术的更具侵入性的使用——包括可以识别情绪的人工智能——很可能会在其他地方逐渐变得更加普遍。人工智能可以对医疗保健产生巨大影响,帮助放射科医生在 x 射线中挑出肿瘤,帮助研究人员发现与疾病有关的基因序列,并识别可能导致更有效药物的分子。世界各地的医院都在进行人工智能相关技术的试验。其中包括 IBM 的沃森临床决策支持工具,该工具由纪念斯隆-凯特琳癌症中心的肿瘤学家培训,以及英国国家医疗服务系统对谷歌 DeepMind 系统的使用,该系统将有助于发现眼部异常,并简化筛查头颈癌患者的过程。
结论
人工智能有可能颠覆许多行业,其商业模式基于利用算法,从推荐引擎和商业分析到医疗诊断和自动驾驶汽车,但我们希望从一开始就确保以负责任和道德的方式完成这项工作。
人工智能公平性入门
内部 AI
它是什么以及要做的权衡

Photo by Bill Oxford on Unsplash
1.目的
这是什么是人工智能,什么是人工智能公平,为什么公平是重要的,偏见如何进入系统,如何解决算法偏见和利润权衡的初级读本。这是一个广泛而复杂的话题。所以缩小范围,这篇文章不是关于:
- 人工一般也不是超级智能。它是关于我们已经在使用的产品和服务
- 杀手机器人也不是自主武器
- 故意伤害,而是无意的偏见
- 数据隐私,错误信息,也不是反垄断。虽然公平与这些相关
- 产生对人工智能的社会信任,包括透明度、可解释性和问责制等问题
- 企业应该如何雇佣和管理团队来解决偏见
术语注释:算法、人工智能、自动决策系统(ADMs)、机器学习和模型在本文中可互换使用。
2.什么是人工智能
人工智能对不同的人有不同的意义。下图有助于描述不同之处。计算机科学家将人工智能广义地定义为模仿人类行为的技术,这包括 if-then 程序、知识库和机器学习等。企业通常意味着机器学习,是人工智能的一个子集。机器学习(ML)是一种从数据中学习以执行特定任务(例如预测、分类)的计算机程序。ML 包括诸如回归、随机森林和深度学习等算法。
今天在媒体上讨论的人工智能的进步通常是指机器学习的进步,特别是深度神经网络神经网络通过将每个相互连接的神经元建模为接收输入并产生输出的数学函数,粗略地模拟了大脑的工作方式。随着更多神经元的加入,网络增强了模拟更复杂关系的能力,并提高了模型的准确性[1]。简单来说,把神经元想象成我们大脑的组成部分。更多的神经元=更聪明(潜在的)。

3.定义偏见和公平
在统计学中,偏差意味着对真实情况的不准确描述(如潜在人群)。在社会背景下,偏见是对一个结果或一群人的偏好,无论是公平还是不公平。通俗地说,在本文中,偏见意味着不公平或不想要的偏见。
公平没有一个统一的定义。什么被认为是公平的取决于上下文。这一挑战也为人们提供了批判性思考、明确表达和量化公平的需求和机会。几十年前,“黑人”在美国当奴隶被认为是“正常”的。在西班牙占领菲律宾期间,中国人(像我一样)因为他们的种族而被迫住在外面的城市。现在,基于肤色或种族的歧视是非法的,也是社会所不能接受的。
3.1.如何定义偏见和公平?
3.1.1.团体对个人
构建公平的一种方式是通过群体或个人的公平。群体公平要求由特定属性定义的不同群体应该有相似的结果。在实践中,组属性通常由法律定义,但它可以是任何东西——“受保护的属性”。最常见的属性是性别和种族。有关定义受保护属性的法律法规列表,请参见附录 7.1。法律法规使得衡量群体公平性变得更加容易。
个体公平要求相似的个体应该有相似的结果。这在直觉上很有道理,但很难付诸实践。如何建立个人之间的相似性因环境而异,并且难以衡量。在评估抵押贷款申请时,两个人的信用评分更重要,但在评估 MBA 申请时则不那么重要。不可能设定一个适用于所有情况的个人公平的标准定义。
3.1.2.具体指标和权衡的示例
作为一个例子,我们可以想象一家银行正在评估 100 份抵押贷款申请。70 个来自男性,30 个来自女性[2]。受保护的属性是性别。衡量公平的一个标准是人口均等。获得批准的男女比例应该是一样的。如果 35 名男性(50%)的抵押贷款获得批准,那么应该有 15 名女性(50%)获得批准。然而,从某种意义上来说,这是不公平的,如果有更高比例的贷款值得个人在任何一组。一些人认为,更重要的是模型的预测精度应该对每个群体都一样。这是衡量机会均等或准确性的标准。如果抵押贷款获得批准的男性中有 90%预计会偿还贷款,那么女性也应该是 90%。公平的两种定义都有道理,而且很可能相互冲突。一种不干涉公平的方法是在决策时有意排除受保护的属性和任何密切相关的变量(这在实践中很难做到)。这叫做群体无意识。
附录 7.2 显示了 19 个公平性指标的非详尽列表。一些研究人员已经证明,一些定义相互冲突。理解权衡很重要,因为它直接影响我们和企业的利润。
4.我们为什么要担心
4.1.社会影响
凯茜·奥尼尔的获奖著作《数学毁灭的武器》展示了 ADM 是如何在获得工作、贷款、保险和公平正义方面损害人们的生活3。ProPublica 研究了一些美国法院使用的软件系统如何预测“黑人被贴上高风险标签但实际上不会再犯的可能性几乎是白人的两倍。”[4]更多的黑人可能错误地在监狱呆了更长时间,这略微增加了累犯率[5]。这是恶性反馈循环的证据。超过 90%的公司使用自动简历筛选工具,亚马逊废弃的自动招聘工具对女性有偏见。这些例子并不是要表明 ADM 本身是危险的,而是它在我们的社会中是如何根深蒂固的。ADM 是工具,通常是出于良好的意图而构建的,并且具有积极的益处。
ADM 通常用于在大规模下做出一致且准确的决策。人类倾向于做出不一致和有偏见的决定。在午餐或休息前,法官们将有利裁决的可能性降低到 0%,否则会回到平均 65%。其他示例可在附录 7.3 中找到。
4.2.业务影响
ADM 还允许网络规模的互联网接入需求的涌入。每个职位空缺收到 250 份申请。谷歌每年收到 300 万份简历,雇佣了 7000 人。自动筛选候选人的效率要高得多。它解放了招聘人员,让他们可以建立人际关系和面试候选人。这提高了每个招聘人员的生产率(即降低了企业的成本)。
回到第 3.1.2 节的抵押贷款的例子,研究人员开发了一个工具,显示不同的公平定义如何导致不同的利润[8]。这个假设的例子展示了一个公平定义如何导致利润比理论最大值低 21%。第 6 节更多地讨论了利润权衡。
5.偏见从何而来,如何解决
下图显示了偏见在机器学习过程中的位置以及可以进行干预的位置[9]。使用“creeps in”是有意的。大多数开发人员不会有意在模型中加入偏见。

5.1.偏见的来源
由于数据、算法和模型的使用方式,可能会出现偏差。用于训练模型的数据可能不具有代表性/不完整,或者已经有偏差。根据定义,不具代表性的训练数据是有偏差的。该模型将表现不佳,无论它是否用于歧视某个群体或个人。不具代表性的数据集可能因各种原因而产生,如数据收集不完整和子人群过采样。有偏见的数据集是记录过去有偏见的决策的数据。根据这些数据训练的模型只会反映和强化这种偏见。
模型构建过程包括选择要在模型中包含的特征以及要使用的算法。在大多数情况下,模型构建者(例如,数据科学家、机器学习工程师)选择将哪些特征包括在训练数据集中。选择什么样的特征将包含建造者的偏见。在大多数算法中,有一个代价函数正在被最小化。在线性回归的情况下,它是平方偏差。成本函数通常设置为最大化准确性,但它可以配置为优化不同的指标。然而,通常它被设置为最大化准确性,这通常会加强数据集中嵌入的偏差模式。
模型的使用和评估方式也会导致偏差。在第 3.1.2 节的贷款示例中,用于确定是否批准抵押的阈值是由用户设置的。不同的阈值反映了不同的公平性测量。模型的性能也通过使用不同的度量来评估,通常使用精确度。公平指标的使用或缺乏也会导致偏差。
5.2.偏差缓解方法
根据机器学习管道中的干预阶段对偏差缓解方法进行分类。公平的预处理方法解决了数据中存在的偏差。公平的处理中方法修改学习过程以“忽略”敏感属性或惩罚算法“不公平”。公平后处理方法修改现有模型的输出。下图很好地概括了更常见的方法[10]。我们不会深入研究每一种具体的方法,因为它太专业了。下面没有列出的一种预处理方法是收集更多(有用的)数据。

6.利润与公平的权衡
企业目前面临的问题是意识、标准的不确定性、缺乏解决偏见的合格方法[11]。这是投入最多努力的地方。有几个工作组和机构正在带头定义公平并教育私人和公共选民(如 AI NOW、OpenAI)。
然而,随着前者的解决,一个将变得更加突出的问题是它将如何影响利润。在监管、道德和社会约束中,利润激励企业。正如第 4.2 节所说明的,利润和公平之间存在矛盾。公司没有自然的动机去确保公平的机器学习算法。下面用混淆矩阵说明了一种思考预测如何与利润联系起来的方法。机器学习算法的价值是能够增加真阳性和真阴性的数量,每个都有一个值。每一个假阳性和假阴性都是代价高昂的。分配给每个的值取决于每个上下文。在医疗情况下,假阴性的代价更高,而在死刑判决中,假阳性的代价更高。期望值是企业使用该算法可以预期获得的利润。模型越精确,利润越高。

降低准确性的偏差缓解方法将面临企业的抵制。不幸的是,准确性和公平性之间通常有一个权衡。不同的偏差缓解方法对精度有不同的(负面)影响。预处理方法对准确性的影响最小,因此对企业更有价值[12]。收集更多的数据可以进一步提高准确性,同时也提高了公平性。然而,数据收集和处理是昂贵的,并且是机器学习管道中最耗时的部分。根据 Wallach 的调查,这是从业者最大的痛点之一。例如,没有关于收集什么额外数据的指南或最佳实践,部分原因是每个用例需要不同的数据。意识到并清楚这种权衡是很重要的,因为企业领导人可以做出更明智、更好的选择。
7.附录
7.1.美国受管制域列表
受管制领域
- 信贷(平等信贷机会法)
- 教育(1964 年民权法案;1972 年教育修正案)
- 就业(1964 年民权法案)
- 住房(《公平住房法》)
- 公共住宿(1964 年民权法案)
法律认可的“受保护类别
- 种族(1964 年民权法案)
- 颜色(1964 年民权法案)
- 性别(1963 年《同酬法》, 1964 年《民权法》)
- 宗教(1964 年民权法案)
- 民族血统(1964 年民权法案)
- 公民身份(移民改革和控制法)
- 年龄(1967 年就业年龄歧视法)
- 怀孕(《怀孕歧视法》)
- 家庭状况(1964 年民权法案)
- 残疾状况(1973 年康复法,1990 年美国残疾人法)
- 退伍军人身份(1974 年越战时期退伍军人重新安置援助法案,制服服务就业和再就业权利法案)
- 遗传信息(遗传信息非歧视法)
歧视法:完全不同的待遇(正式的对故意的)对完全不同的影响(20%规则,法律经验法则)。完全不同的待遇可以被认为是程序公平。基本理念是机会均等。不同的影响是分配的公正。这两个目标之间存在矛盾。
【资料来源:机器学习中的公平,NIPS 2017 教程作者:索隆·巴罗卡斯和莫里茨·哈特(https://mrtz.org/nips17/#/)
7.2.公平的定义

资料来源:梭伦·巴罗卡斯、莫里茨·哈特、阿尔温德·纳拉亚南(https://www.fairmlbook.org)
7.3.人工智能/ADMs 如何改善社会结果的其他示例
相对于人工筛选,招聘算法产生的候选人更加多样化,更有可能通过面试,接受工作邀请,并在工作中表现更好[13]。在消费者贷款决策中使用 ADM 将增加长期利润,同时也减少对老年和移民借款人的偏见[14]。用预测累犯的算法代替法官,增加了社会福利。所有犯罪类别的犯罪率最高可降低 25%,监狱人口可减少 42%,同时也显著降低了非裔美国人和西班牙裔美国人在监狱中的比例[15]。
ADM 还允许网络规模的互联网接入需求的涌入。每个职位空缺都会收到 250 份申请[16]。谷歌每年收到 300 万份简历,雇佣了 7000 人[17]。自动筛选候选人的效率要高得多。它解放了招聘人员,让他们可以建立人际关系和面试候选人。
结束注释
【1】麦肯锡在对人工智能用例的分析中使用了同样的速记参考。有几种神经网络技术,如前馈、生成对抗网络和卷积神经网络。参考麦肯锡的研究,了解商业环境中最常见和最有价值的技巧。来自“人工智能前沿笔记:深度学习的应用和价值”2018 年 12 月 4 日接入。https://www . McKinsey . com/featured-insights/artificial-intelligence/notes-from-the-ai-frontier-applications-and-value-of-deep-learning。
[2]摘自 Google PAIR 的假设工具。https://pair-code.github.io/what-if-tool/ai-fairness.html
3凯西·奥尼尔。“破坏数学的武器。”百老汇图书。2016.
[4] ProPublica。“机器偏见”。2016.https://www . propublica . org/article/machine-bias-risk-assessments-in-criminal-pending
5 博·考吉尔和凯瑟琳·塔克。《经济学、公平和算法偏差》。为《经济展望》杂志做准备。2019.【https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3361280
[6]劳伦·韦伯。《你的简历 vs 湮没》。华尔街日报。2012.https://www . wsj . com/articles/sb 10001424052970204624204577178941034941330
[7]杰弗里·达斯廷。“亚马逊废弃了对女性有偏见的秘密人工智能招聘工具”。路透社。2018.https://www . Reuters . com/article/us-Amazon-com-jobs-automation-insight/Amazon-scraps-secret-ai-recruiting-tool-that-show-bias-against-women-iduskcn 1 MK 08g
[8]用更智能的机器学习攻击歧视。https://research . Google . com/big picture/attack-discrimina tion-in-ml/
[9] IBM。“人工智能公平 360:一个可扩展的工具包,用于检测、理解和减轻不必要的算法偏差”。https://arxiv.org/abs/1810.01943
[10]它来自一个博客,但却是我能找到的唯一一个很好的总结。没有论文像这篇论文那样简洁地总结了现有的方法。阿吉特什·库马尔。“机器学习模型:偏差缓解策略”。https://dzone . com/articles/machine-learning-models-bias-mitigation-strategies
[11]微软的一个研究小组对行业从业者所面临的问题做了一个很好的调查。他们采访了 35 名从业者,调查了 267 名从业者,这些从业者来自不同的行业和产品。瓦拉赫等人。艾尔。"提高机器学习系统的公平性:行业从业者需要什么?"https://arxiv.org/abs/1812.05239
[12]罗斯等人。艾尔。“机器学习中公平增强干预的比较研究”。【https://arxiv.org/abs/1802.04422 号
13 博·考吉尔。《人类和算法中的偏见和生产力:来自简历筛选的理论和证据》。http://conference . iza . org/conference _ files/macro econ _ 2017/cow gill _ b 8981 . pdf
[14]威尔·多比、安德烈斯·利伯曼、丹尼尔·帕拉维西尼、维克拉姆·帕塔尼亚。“测量消费者贷款中的偏差”。NBER。2018.https://www.nber.org/papers/w24953
[15]乔恩·克莱因伯格等人,“人类决策和机器预测”。NBER。2017.https://www.nber.org/papers/w23180
[16]约翰·苏利文。“为什么你找不到工作。用数字解释招聘”。呃。2013.https://www . ere . net/why-you-can-get-a-job-recruiting-by-the-numbers/
17 马克斯·尼森。“这就是为什么你只有 0.2%的机会被谷歌录用”。石英。2014.https://qz . com/285001/heres-why-you-only-a-0-2-chance of-get-over-England-Google/
学习手语的人工智能

LOVE in Sign Language
这个故事开始于马德里西班牙。冬天来了,一个由四个年轻的爱好者组成的团队开始了一个项目。
最初的想法是创建一个学习手语的应用程序,不仅因为这是我们社会的一个有趣的方面,也是为了那些需要学习它来交流的 3400 万患有残疾听力损失的儿童。
技术的美妙之处在于它也可以用来帮助别人。我们的目标正是这样。
当时的主要想法是,构建一个神经网络模型,能够从相机捕捉的图像中实时分类用户所做手势的表示。这个“用户”可以是在家学习手语或巩固他们在学校教他或她的东西的孩子,也可以是对从头开始学习手语感兴趣的成年人,例如,从字母表字母或数字开始。
数据
在每个像我们这样与数据相关的项目中,工作的一个重要部分是数据集。没有数据,我们甚至无法开始尝试构建一个能够理解用户在摄像机前做什么手势的模型。
由于我们来自西班牙,我们首先想到的是为 LSE 开发应用程序。但是研究和创新并不是一条玫瑰色的道路。我们找不到任何与西班牙语字母表相关的数据,在互联网上找不到,甚至没有写信给可能拥有这些信息的实体。所以我们不得不决定使用出现在几个网站上的数据:美国手语。
作为初始阶段,我们开始探索字母和从 0 到 9 的数字。然后我们有了另一个问题。该应用从一开始就被认为是基于构建一个能够从静态图像中分类标志的深度神经网络。这个事实给有运动的字母带来了一个问题:J 和 z。我们决定暂时去掉这两个字母。
然后,我们找到了字母和数字的数据。这些数据实际上是人们手部的图像,取自 Kaggle,一个在我们社区广泛使用的存储库。
型号
第二阶段是训练一个模型,让它变得如此智能,以至于当它看到一个标志的图像时,它能识别出是哪一个。我们从一个卷积神经网络(CNN) 开始,它有几个卷积层,最大池化、扁平化和全连接。但我们从经验中了解到,即使验证准确性很高,验证损失很低,但最重要的是实时性能,用我们的相机,用不同的手和手后面不同的背景。这不是一个好结果。
那时,我们决定利用以前的智能模型,一个能够从图像中分类对象的深度 CNN,用 ImageNet 训练的 VGG19。

Network architecture of the VGG19
ImageNet 是一个大型数据库,拥有超过 1400 万张图片,包含 20000 多个类别,精简版有 1000 个类别。用这个数据集训练了几个模型,使它们能够理解图像中非常抽象和有创造性的部分。我们必须利用这些特性。这个过程在社区中被称为“T2”特征提取。只需采用一个没有顶层的预训练模型,冻结该模型,添加我们的顶层,指定我们想要分类的类别数量,并用我们的数据集对其进行训练。这似乎是一个好主意,但同样,在实时体验中,它并不像我们希望的那样好。
然后,我们后退一步,思考使用预训练模型的想法。用来训练 VGG19 的 ImageNet 数据集不包含徒手类,也不包含 sing 语言表示类。所以我们试图做的是强迫一个网络对一些东西进行分类,而它基本上只能智能地对世界上除了手以外的其他东西进行分类。
那时我们决定进行“微调”,这是另一种在深度学习中经常使用的技术。我们决定只冻结 VGG19 的前 6 层,并用我们的数据集和顶层一起训练其他层。
另一方面,但与此同时,数据集正在经历几次变化。我们意识到初始数据集太差,然后我们给自己设定了用自己的相机获取图像的任务,我们将它们与初始数据集混合,并使用图像的混合来设置一个图像数据生成器,包括一些转换,如剪切范围、宽度和高度的移动等。
有了这两种成分的混合,一个非常强大的数据集和一个超级智能的模型,我们只希望有好的结果。我们抓到他们了。
Example of application with the Sign Language Digits
我们乐于接受对我们最初工作的反馈,因为我们目前正在开发它,以便将来有更好的应用程序来帮助他人。我们在 github 上也有开放代码,链接如下:
[## ecabestadistica/手语翻译-python-opencv
项目的目标是为儿童提供必要的应用程序
github.com](https://github.com/ecabestadistica/sign-language-translator-python-opencv)
我们是 Elisa Cabana ( Twitter )、Jessica Costoso、Jordi Viader ( LinkedIn )和 Miguel Gallego ( GitHub ),在卡洛斯·辛坦拿( Youtube )的帮助下。我们希望有一天技术被用来消除那些需要我们帮助的人的障碍,因为对一些人来说,障碍实际上是所有人的损失。
人工智能在一个“别无选择,只能让它聪明”的能源行业!

可再生能源(RE)热潮为经济、能源部门和应对气候变化带来了巨大机遇。但是,由于其固有的间歇性,单靠可再生能源(如太阳能或风能)仍然无法实现全部需求或减少温室气体的积极目标。此外,对于没有准备的开发人员来说,分布式可再生能源项目的经济性变得越来越有竞争力(也就是说,由于不断变化的环境,变得更瘦和更有风险)。
因此,能源部门面临着一波变革,不仅挑战其增长,也挑战其弹性(例如,见《纽约时报》关于为什么 PG&E 申请破产将允许该公司在电价较高时试图撤销或重新谈判与供应商签订的合同的文章)
简而言之,能源市场正在发生变化,而供应链正变得更具竞争力,大自然给电网基础设施带来了更大的压力。毫不奇怪,客户对控制其能源命运的兴趣正在增加。
对于公用事业、消费者、决策者和经济而言,储能正在迅速引发能源领域的彻底变革。这是一个范式上的实质性变化。这就好比是互联网比电报,或者是 18 世纪的风车比现代的风力涡轮机。

如果利用得当,储能可以独立运行,为客户、公用事业和电网提供多种服务,增加冗余、弹性和能效,即使在可再生能源经济效益不佳的情况下也是如此。此外,能量存储在形成和平滑可变发电和支持不断变化的需求方面的潜力将使能源部门的投标超越当前的电网限制。
智能储能
事实上,由于生产阶段与非生产阶段的不规则交替,能量储存极大地有助于解决与太阳能或风能作为能源的间歇性相关的问题。然而,不仅是这些能源,还有需求方本身的周期性和混沌动态,电池硬件本身对释放真正的能量价值没有什么作用。情况的复杂性使得简单的解决方案或者单一的技术很难成为救世主。释放这一价值的关键是通过复杂的软件对能量存储和(生产-消费)系统的复杂动态特性进行适当的控制。这就是人工智能(AI)形式需要“智能”(而不是简单的控制)的地方。将可再生能源与人工智能驱动的存储结合起来,可能会改变区分未来项目的范式。我们可以称之为“智能储能”或 IES。
优化独立系统
首先,我们可以很容易地看到智能储能如何满足商业和工业对“独立”系统的需求。为可再生能源装置增加存储几乎总是会增加项目的经济价值,主要是通过在客户用电高峰期使用存储的太阳能或风能。但是,为了正确优化系统的规模,并最大限度地提高 RE+存储系统对客户的回报,人工智能开辟了许多可能性,例如:执行实现这些回报所需的预测分析、机器学习、大数据和网格边缘计算。每一秒钟的数据都可以被捕捉和分析,包括负载、发电、天气、附近电网的拥堵和电费。ie 可以推动实时自适应存储调度,为客户和电网创造越来越多的价值。

产生额外的合同收入
其次,IES 还可以提供其他服务,或“价值叠加”额外的合同收入(帮助承包商更好地优化特定项目的报酬)。ie 可以驱动存储在电池网络中的未使用能量的“传送”,作为一种虚拟集成的资源提供给那些需要电力的电网位置。IES(与 is AI 一起)将动员一个可用能源网络来满足某个部门的过度需求,该部门正在经历高需求并使电网紧张。其结果是为提供商带来额外的收入和更低的运营成本,同时为客户带来存储节省能源费用的好处。
增加价值流
第三,随着新的激励和价值流的出现,这些优势将变得更加重要。商业环境变得越来越复杂,包括降低需求费用、通过虚拟发电厂增加收入、应对不断变化的利率和从投资税收抵免中获取更多价值。在确保计划合规性的同时实现回报最大化是一项挑战。这一天不远了,它将变得如此复杂,以至于只有通过人工智能才能实现 RE+存储的全部价值。
人工智能将能够为可再生能源项目提供一系列新的价值流。客户、太阳能开发商、纳税人、公用事业公司和电网都是赢家。例如,将智能存储添加到太阳能项目中可以最大限度地提高投资回报,在面对不断变化的费率、需求方或气候条件时,为主机站点提供更大的控制力和灵活性,同时支持访问新的公用事业项目或批发市场收入机会。公用事业和电网运营商可以从客户所在地的虚拟发电厂签订服务合同,在需要的时间和地点准确地提供稳定、可靠和经济高效的能源。在一些地区,这可能导致避免需要新的调峰电厂或其他昂贵的基础设施。
人工智能供电的储能正在推动“智能”能源系统的崛起。我们已经可以看到,部署了智能存储的风能或太阳能将很快使独立系统的部署相形见绌。当我们将人工智能与再存储结合起来时,我们确保了能源资源正在发挥其全部潜力——这是可再生能源行业、电力行业本身以及客户的最佳前进方式。
总之,这些改进(优化独立系统、产生额外的合同收入和增加价值流)只是人工智能和通过“智能储能”实现的储能将改变能源行业的众多方式中的 3 种。
人工智能、储能和电力行业:迈向智能和弹性电网!
全球能源行业在生产、销售和分配能源的方式上面临着根本性的变化。而且反应中出现了一些矛盾(https://www . energy central . com/c/CP/energy-execs % E2 % 80% 99-tone-climate-changing-they-still-see-long-fossil-future)。在提高恢复能力的同时,减少二氧化碳排放的压力很大。因此,必须找到方法来管理可再生能源日益增长的电力生产,这种生产是不可预测的,并且依赖于当地天气的异常,甚至当我们考虑气候变化的影响时,依赖于全球气候的异常。
越来越清楚的是,全球需要清洁、廉价和可靠的能源。这不仅是电网运营商的问题,而且能源来源的可靠性和电力成本也是消费者、政府和民间社会行为者以及商人所关心的问题,这些人都希望取悦他们的客户或他们的选民。
人工智能(AI)可能是满足这些需求的非常有用甚至强大的工具。而且,我们会看到越来越多的人工智能应用在能源领域。值得注意的是,通过最佳储能管理最大限度地提高绿色低碳发电的增长是一项人工智能应用,将产生潜在的巨大长期影响。
人工智能整合包括存储在内的各种能源的能力
各种形式的可再生电力资源出现作为传统的煤和天然气发电厂的继承者。然而,可再生能源生产的一个关键问题是它的间歇性。阴天或一系列安静无风的下午会降低产量并造成停电。相反,在不需要的时候会产生过多的能量。事实就是如此,在 2018 年 3 月,葡萄牙面临阳光明媚和多风的日子,在那里它生产的可再生电力比它消耗的还要多(https://www . NPR . org/sections/the two-way/2018/04/05/599886059/in-March-Portugal-made-more-than-successful-renewable-energy-to-power-the-whole-coun)。这种潜在的能量浪费或缺乏意味着最大限度地利用能量储存及其所有形式(电化学、热、机械等)是很重要的。)如果我们想要最小化备用能量的使用,例如,柴油发电机、燃煤发电厂或其他调峰电厂,这种存储能够被快速激活也是至关重要的,这些备用能量目前被用于平滑进入高峰时期的快速下降。
需要智能存储或“智能能量存储”(IES)解决方案来管理过多的峰值。人工智能可用于预测和制定储能管理决策。例如,人工智能可以通过短暂削减主电网的电力需求来管理电力短缺,同时它可以使用整个社区或地区的存储。人工智能的使用将生成电力需求、产量和天气的预测,通过预测和管理产量波动,可以减少对这些安全措施的需求。这项任务的速度和复杂性需要先进的人工智能。人工智能研究还研究规模和复杂性开始超过人类操作员的决策。它可以是安装在消费者、终端用户或高度使用场所(如工业设施)的数千个混合能量存储单元(电、热、其他)的网络。
一个庞大但敏感的网络
这也将增加供应的安全性。在北美,发电厂的平均寿命超过 30 年,电力变压器的平均寿命超过 40 年。传输系统的恶化导致了 2003 年“东北”的崩溃,影响了美国和加拿大的几个互联系统。这一故障导致 5000 万人连续几天断电,愚蠢的是,一条超载的输电线路倒塌并撞上了一棵树。这种情况显然会对整个区域网络产生连锁效应,并构成公用事业公司难以管理的任务,可以通过更好的需求预测或本地网络的更好响应来避免。快速变化。

人工智能能够“理解”(或破译)数据集,以及数据中的模型或模式,并进行非常准确的预测和模拟,这将增加电网优化、能源效率甚至需求增长期的机会。
人工智能(AI)与许多先进的能量存储技术相结合,当它与机器学习、深度学习和先进的神经网络相结合时,可以展示能源转换和公用事业部门的巨大潜力。随着去碳化、权力下放和新技术的部署,公用事业、独立电力生产商和其他能源公司正在使用人工智能来管理可再生能源份额不断增长所导致的供需失衡。
客户群已经变得巨大。客户群已经增长到数亿用户,但整体结构仍然需要现代化的大修。这是一个由发电厂、输电线路和配电中心组成的庞大网络。而这一切,距离托马斯·爱迪生 1882 年在曼哈顿下城为首批 59 家北美客户供电,开设美国第一座发电站还不到 140 年。在美国,这个网络已经包括了近 5800 个发电厂和超过 270 万公里(约 170 万英里)的输电线。据估计,如果美国总能源需求预计到 2050 年增长 25%,那么到 2040 年,全球能源使用预计将增长 15.3%(数据摘自美国能源信息署)。
除了使电力网络和系统变得智能和灵活,人工智能算法还可以帮助公用事业和能源公司了解和优化用户行为,并管理能源消耗。在不断变化的背景和环境中的不同部门。
一种扩展的分散生产
另一个挑战是分散发电的出现和发展,即私人用户利用风能和太阳能等可再生能源发电并使用自己的电力。这使得供求关系变得复杂,迫使公用事业公司从私人用户那里购买多余的能源,这些用户生产的电力多于他们消耗的电力,然后将这些电力送回电网。自 2010 年以来,太阳能的使用增加了两倍多,预计这一趋势将随着光伏电池的发展而继续,光伏电池是一种利用阳光发电的设备,可以降低成本,提高效率。

当前系统的设计一般没有考虑到能源的多样化,特别是可再生资源的增加。例如,在许多美国管辖区,当需求超过供应时,公用事业公司提前几分钟启动以化石燃料为基础的发电厂,即所谓的“最先进”发电厂,以避免连锁灾难。这个过程是最昂贵的,但也是这些公司最赚钱的部分。这导致消费者支付更高的电费,并增加向大气中排放的温室气体。随着未来几年能源需求的大幅增长,这些问题将会加剧。为了避免 IES 的这些非最佳(至少)运行模式,AI 可以启用自动学习算法,结合这些复杂网络上的数据和实时气象数据(来自卫星、地面观测和气候模型),充分利用这些算法来预测可再生能源产生的电力,如风、太阳和海洋。
结合大数据、云和物联网(IoT)等其他技术,人工智能储能可以通过提高电源的可访问性,在电网管理中发挥重要作用。可再生能源。
具有储能功能的智能电网
为了应对即将到来的各种挑战,看来关键的可持续和可靠的解决方案之一将是智能储能,其中人工智能将是大脑。这种“具有能量存储的智能电网”将不断收集和合成来自数百万智能传感器的海量数据,以便及时做出如何最佳分配能源资源的决策。此外,“深度学习”算法的进步将彻底改变能源经济的需求和供应。在“深度学习”算法中,机器可以从大型数据集的模式和异常标记中进行自我学习。
因此,我们将看到越来越多的专业化微电网以更高的分辨率管理当地的能源需求。这些可以与各种新的储能技术相结合,即使在极端天气条件或其他故障影响到更广泛的电力系统时,也能实现当地社区之间的持续交流。
在供应方面,工业能源将转向一个具有更大能源组合的投资组合,其特点是增加可再生资源的生产,并最大限度地减少由于与这些资源相关的自然间歇性、太阳辐射和风力的可变强度而造成的干扰。例如,当可再生能源的运行超过某个阈值时,由于风力增强或晴天,电网将减少化石燃料的生产,从而限制气体排放。有害的温室效应。在可再生能源产量低于峰值的时期,情况正好相反,可以尽可能高效地利用所有能源,必要时只依赖化石燃料。此外,生产商将能够管理多种来源产生的能量,以应对实时需求的社会、空间和时间变化。
获胜组合
在接下来的几年里,IES 技术有望通过自动化太阳能和风能部门的运营来提高可再生能源部门的效率。这也将使公用事业和生产者价格指数推出新的业务和服务模式。
如果这种具有储能功能的智能电网能够通过更好地整合可再生资源,以最有效的方式使用包括化石燃料在内的能源,随着这些技术在复杂性和容量方面的发展,整个系统可能能够大大减少其碳足迹。尽管未来技术创新存在不确定性,但我们也可以期待智能电网系统通过优化地方和国家层面的供需来降低电费并防止灾难性停电。

同样,基于 IES 的应用可以通过以下方式为能源和公用事业部门创造额外的收入机会:
使软件应用程序能够分析大型数据集、识别模式、检测异常并做出准确预测,或者能够基于学习自主做出准确决策。
通过使用高级算法和利用区块链来保护数据和实现以客户为中心的解决方案,促进客户积极参与需求响应计划。
使用预测分析(https://www . SAS . com/en _ us/insights/analytics/predictive-analytics . html)改善设备操作和维护,并提供停机时间,从而延长设备寿命。
对于那些寻求影响社会未来的人来说,人工智能和储能之间的接口是一个极好的起点。技术创新正在从根本上改变我们对这两个行业的看法,它们的整合还处于初级阶段。它们的协同作用可以改变我们从来不知道的世界,并在改善其可持续性的同时开辟机会…实现智能和弹性电网!
本文是 2019 年 2 月和 3 月首次发布 Linkedin Pulse 的 2 篇文章的系列:
可再生能源(RE)热潮为经济、能源部门和战争带来了巨大的机遇…
www.linkedin.com](https://www.linkedin.com/pulse/what-ways-artificial-intelligence-energy-storage-change-bilodeau/) [## 人工智能和储能将从哪些方面改变能源领域?(第二部分)
人工智能、能量存储和电力工业:迈向智能和弹性电网!这是第二次…
www.linkedin.com](https://www.linkedin.com/pulse/what-ways-artificial-intelligence-energy-storage-change-bilodeau-1e/)
供应链管理中的人工智能
利用数据推动运营绩效

供应链管理(SCM)在当今几乎每个行业都至关重要。尽管如此,尽管它很重要,但它并没有像许多其他领域一样受到人工智能初创公司和供应商的关注。然而,考虑到工业物流、运输和仓储收集的大量数据,这是一个具有很大潜力的领域。
数字化转型,数字化,工业 4.0 等等。
这些都是你以前可能听说过或读到过的术语。然而,在所有这些时髦词汇的背后,主要目标是利用技术和数据来提高生产率和效率。设备和传感器之间的信息和数据的连接和流动允许大量的可用数据。关键的促成因素是能够使用这些大量的可用数据并实际提取有用的信息,从而有可能降低成本、优化容量并将停机时间降至最低。这就是最近围绕机器学习和数据分析的讨论发挥作用的地方。
供应链的人工智能
与任何其他行业一样,当前对数字化的关注也在改变供应链管理。提高供应链的效率对许多公司来说非常重要。在艰难的利润率下运营,即使是微小的改进也会对底线利润产生重大影响。
数据分析和机器学习有利于供应链管理的例子包括需求预测和仓库优化。考虑到工业物流、运输和仓储收集的大量数据,能够利用这些数据来推动运营绩效对于那些正确操作的人来说可能是一个游戏规则改变者。
案例研究:需求预测的预测分析
为了说明机器学习在供应链中的使用,我将通过一个专注于需求预测的示例案例研究。以下示例涵盖了一家假设的挪威零售商,包括位于不同位置的各个商店以及一个主要的中央仓库,如下图所示。

对于这样的零售商来说,挑战之一是优化货物的本地仓库存储与集中仓库存储:一方面,大量的本地存储是昂贵的,另一方面,主要依赖于集中存储并且冒着商店中商品售罄的风险是另一个因素。因此,仓库优化非常重要,获得准确的销售预测将是非常有用的信息。
为了限制案例研究中的数据量,匿名化的数据集包括 2013 年至 2017 年期间 10 家不同商店的 50 件商品子集的销售商品数量。总的来说,这个数据集大约有 100 万行,数据格式如下所示:

因此,历史销售记录代表了我们试图从中提取有用信息以预测未来销售的数据。当然,理想情况下,这可以由其他可用数据源(例如天气数据)来补充,因为销售很可能会受到天气状况的影响。例如,如果您想预测一家杂货店下周销售的冰淇淋和烧烤食品的数量,拥有天气预报信息可能是非常有用的信息(尤其是对于挪威的示例零售商,那里的夏季天气至少可以说是不稳定的!).幸运的是,挪威计量研究所有一个“weather API”,在那里你可以下载天气数据,如果你想试一试的话,可以免费试用!
训练数据和目标变量
在本例中,我们试图预测 10 家商店中包含在示例数据集中的 50 种(匿名)商品中的每一种商品的销售数量。基本的想法是,历史销售记录可能包含一些隐藏的模式,我们的机器学习模型可以挑选出来。如果是这种情况,模型就可以利用这些模式对未来的销售做出准确的预测。
我们使用 2013 年 1 月至 2017 年 9 月的历史销售记录作为我们模型的训练数据,然后我们尝试预测 2017 年最后一个季度(10 月至 12 月)的销售商品数量。
下图左侧显示了商店 10 中“商品 15”的培训数据子集。这表现出明显的年度周期性(夏季销售额最高),以及销售逐年增长的线性增长趋势。我们的目标是预测 2017 年 10 月至 12 月的销售额,如右图所示。

定义机器学习模型
定义了训练数据和我们的目标变量(我们试图预测的变量)之后,我们现在可以建立一个预测模型,试图利用数据集中隐藏的模式来预测未来的销售。
时间数列预测法
时间序列预测是机器学习的一个重要领域。这一点很重要,因为有太多的预测问题涉及到时间因素。然而,虽然时间组件增加了额外的信息,但与许多其他预测任务相比,它也使时间序列问题更难处理。
有几种类型的模型可用于时间序列预测。其中一个受欢迎的选择是“长短期记忆网络”,或简称为 LSTM 网络,这是一种特殊的神经网络,根据以前时间的数据进行预测。它在语言识别、时间序列分析等方面非常流行。然而,根据我的经验,在许多情况下,更简单类型的模型实际上提供了同样准确的预测。使用诸如随机森林、梯度推进回归器和时间延迟神经网络的模型,可以通过添加到输入的一组延迟来包括时间信息,从而在不同的时间点表示数据。
我不会在这里进行进一步的数据分析,但是对于时间序列预测的机器学习的介绍,你可以看一下我以前的一篇关于这个主题的文章。
预测模型
由于本文的主要焦点不是技术方面的细节,所以我将简单地提及一些实现细节。
数据集由带标签的数据(即监督学习)组成,是数字和分类变量的混合。使用“日期”变量,我们还可以提取一些额外的有用特征,例如星期几,日期是否是国家假日等。,与单独使用日期相比,它为我们的模型增加了有用的信息。
对于这些混合变量类型,基于树的模型通常是一个好的选择。在下面的例子中,我决定使用一个随机森林算法,作为一个非常简单的基线预测模型。这主要是因为这种类型的模型可以轻松处理不同数据类型(数字和分类)的混合,并且它们通常“开箱即用”地执行得相当好,不需要任何大量的超参数调整。
结果
在对模型进行训练之后,我们现在可以检查它在测试数据上的表现如何(2017 年最后一个季度)。预测模型被训练为同时预测 10 家商店中每一家的所有 50 件商品的销售额,但是为了便于直观地显示结果,我决定这里只绘制“商品 15”的预测作为示例。
从下图开始,我们比较了商店 10 的实际销售额和预测销售额。我们注意到,我们的简单基线模型在捕捉每周周期和 12 月销售单位数量的特征下降方面做得相当好(注意,y 轴被截断,以便更清楚地显示实际销售和预测销售之间的偏差)。尽管如此,我们观察到该模型不能捕捉所有的短期波动(或噪声),鉴于训练数据包含的信息有限,我也不期望它能捕捉到。
另一方面,在右图中,我绘制了实际销售与预测销售的对比图,但这一次销售单位的数量是所有 10 家商店的平均值。通过这样做,大多数短期波动(或噪声)“达到平均”,我们观察到实际销售和预测销售之间有更好的匹配。

你是对单个商店的水平感兴趣,还是对所有商店的总销售额/平均销售额感兴趣,这取决于你想要达到的目标:如果你主要关心的是优化你的中央仓库,预测总销售额可能会提供足够的信息,而挖掘单个商店的详细信息可能会很费时间,而且收效甚微。这一切都归结为明确定义你的目标,并专注于你试图解决的业务问题,而不是你用来解决它的技术。
摘要
上面的用例示例简单介绍了机器学习在供应链中许多有趣和有用的应用之一。在未来,我相信机器学习将会被用在比我们今天所能想象的更多的地方。你认为它会对各个行业产生什么影响?我很想在下面的评论中听到你的想法。
如果你有兴趣了解更多与人工智能/机器学习和数据科学相关的主题,你也可以看看我写的其他一些文章。你会发现它们都列在我的中型作者简介中,你可以在这里找到。
而且,如果你想成为一个媒体会员,免费访问平台上的所有资料,你也可以使用下面我的推荐链接。(注意:如果您使用此链接注册,我也会收到一部分会员费)
[## 通过我的推荐链接加入媒体- Vegard Flovik
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@vflovik/membership)
更多来自 Vegard Flovik 媒体:
- 蒙特卡洛方法简介
- 从物理学到数据科学的转变
- 什么是图论,为什么要关心它?
- 用于图像分类的深度迁移学习
- 构建一个能读懂你思想的人工智能
- 机器学习:从炒作到现实应用
- 人工智能和大数据隐藏的风险
- 如何使用机器学习进行异常检测和状态监控
- 如何(不)使用机器学习进行时间序列预测:避免陷阱
- 如何利用机器学习进行生产优化:利用数据提高绩效
- 你是怎么把物理教给 AI 系统的?
- 我们能使用纳米级磁铁构建人工大脑网络吗?
人工智能研讨会——从宣传到现实应用
电子游戏中的人工智能
概述视频游戏人工智能如何随着时间的推移而发展,以及目前在游戏中的应用
由劳拉·e·舒蒙·马斯和安迪·卢克撰写

Virtual Reality Photo by Harsch Shivam
大多数人可能认为过去几年发布的大多数游戏都有高度复杂的人工智能,用于任何非玩家控制的角色、生物或动物(在本文中通常称为机器人)。然而,许多视频游戏开发商担心失去对整体玩家体验的控制,不愿在游戏中内置先进的人工智能。事实上,电子游戏中人工智能的目标不是创造一个无与伦比的实体供玩家与之斗争,而是意味着最大限度地提高玩家的参与度和长期享受。
如果你拿起一个新游戏开始玩,你会不会有更多的享受被一遍又一遍彻底摧毁?或者,你更愿意和与你水平相当的人/事配对,这样你就可以随着时间的推移不断学习和提高?绝大多数玩家可能会选择后者。这并不意味着人工智能在现代游戏行业没有一席之地,只是意味着它的目的与我们最初的预期不同。我们不想创造最好的人工智能,我们想创造最令人愉快的人工智能供玩家互动/竞争。
人工智能在游戏中的历史
人工智能是一个非常宽泛的术语。它不一定需要成为一个从玩家的行为中学习的模型。Wolfenstein 3D 早在 1992 年就发布了,甚至那款游戏中的士兵都有一个初步的人工智能形式。F inite 状态机(FSM)算法是一个相对简单的人工智能,设计师创建了一个机器人可以经历的所有可能事件的列表。然后,设计者会对每种情况做出具体的反应(Lou,2017)。我们可以想象,在 1992 年,Wolfenstein 3D 的开发者考虑到了敌军士兵可能经历的所有情况。一扇门可能在他们的视野中打开,Blazkowicz(Wolfenstein 系列的主人公)可能走进视野,他们可能从后面被击中,他们可能看不到 Blazkowicz,等等。开发人员会编辑这个列表,并针对每种情况,告诉机器人应该做什么。下面是 Lou 文章中的一个有用的视觉效果:

Figure 1 (Lou, 2017)
这显然是一个简单化的例子。我们可以想象,我们构建的细节越多,它就会变得越复杂。在放弃之前,机器人应该搜索 Blazkowicz 多长时间?当/如果它们放弃了,它们应该留在原地还是回到它们的产卵点?这个列表会很快变得很长,很详细。在 FSM 中,每种情况都会被游戏开发者分配一个特定的动作。
FSM 算法在每个游戏中使用是不可行的。例如,想象在一个策略游戏中使用 FSM。如果一个机器人被预编程为每次都以同样的方式回应,玩家将很快学会如何智胜计算机。这创造了一个重复的游戏体验,正如你所料,对玩家来说是不愉快的。创建 M onte 卡洛搜索树(MCST)算法是为了防止 FSM 的可重复性。MCST 的工作方式是首先想象一个机器人当前所有可能的动作。然后,对于每一个可能的行动,它分析一个玩家可能做出的所有反应,然后考虑它可能做出的所有反应,等等。(楼,2017)。你可以想象这棵树会有多快变得巨大。这里有一个很好的图表来形象化 MCST 是如何工作的:

Figure 2 (Lou, 2017)
图 2 突出显示了使用 MCST 的计算机在对人类组件采取行动之前所经历的过程。它首先查看它拥有的所有选项,在上面的例子中,这些选项要么是防御,要么是建造技术,要么是攻击。然后,它构建了一个树,预测此后每一次潜在行动成功的可能性。上面我们可以看到,成功可能性最高的选项是‘攻击’(因为暗红色等于奖励的概率更高),因此计算机选择攻击。当玩家下一步行动时,计算机会再次重复树的构建过程。
想象一下像《文明》这样的游戏,电脑可以做出大量的选择。如果计算机要为整个游戏的每一个可能的选择和每一个可能的场景建立一个详细的树,它将会花费非常长的时间。它永远不会行动。因此,为了避免这种巨大的计算,MCST 算法将随机选择几个可能的选项,并只为选中的选项构建树。这样,计算会快得多,计算机可以分析哪一个选项最有可能获得奖励。
《异形:孤立》中的人工智能
最近,视频游戏中更受欢迎的高级人工智能形式之一是来自创意大会的外星人:隔离的外星人。对于人工智能在幕后的工作方式有一些误解。然而,这是一个非凡的展示,展示了人工智能可以用来为玩家创造一个迷人而不可预测的环境。
Alien: Isolation 中的外星人有两种驱动人工智能的力量控制它的运动和行为:导演人工智能和外星人人工智能。导演人工智能是一个被动的控制器,负责创造一个愉快的玩家体验。为了做到这一点,临时导演随时都知道玩家和外星人在哪里。然而,它不与外星人分享这一知识。人工智能总监关注着所谓的威胁指标,它本质上只是一种对预期玩家压力水平的衡量,由多种因素决定,如外星人与玩家的接近程度、外星人在玩家附近停留的时间、玩家可见的时间、运动跟踪器设备可见的时间等。这个威胁量表通知外星人的工作系统,它本质上只是外星人的任务追踪器。如果威胁标尺达到一定等级,任务“搜索新位置区域”的优先级会增长,直到外星人离开玩家进入一个单独的区域。
行为决策树:
在深入研究外星人人工智能如何工作之前,首先强调决定过程的结构是很重要的。外星人人工智能使用一个广泛的行为决策树,有超过 100 个节点和 30 个选择器节点。想象下面这个简单的例子:

Figure 3 (Simpson, 2014)
行为树的工作方式是从左到右提问。成功允许沿着树前进,而失败将返回到序列节点。流程是这样的:序列->我饿了吗?(成功)->序列(运行)->我有食物吗?(成功)->序列(运行)->周围没有敌人(成功)->序列(运行)->吃食物(成功)->序列(成功)->父节点(Simpson,2014)。如果在任何时候,其中一个节点返回(fail),整个序列都将失败。例如,如果结果是“我有食物吗?”失败后,它不会检查周围是否有敌人,也不会吃食物。相反,该序列会失败,这将是该序列的结束。
序列显然会变得更加复杂,在深度上变得多层次。下面是一个更深入的例子:

Figure 4 (Simpson, 2014)
请记住,当序列成功或失败时,它会将结果返回给它的父节点。在上面的例子中,让我们假设我们已经成功地接近了门,但是没有打开门,因为门是锁着的,我们没有钥匙。序列节点被标记为失败。结果,行为树路径回复到该序列的父节点。这个父节点可能是这样的:

Figure 5 (Simpson, 2014)
所以,我们在开门方面失败了,但是我们还没有放弃。我们的父节点有另一个序列让我们尝试。这一次是通过窗户进入。外星人人工智能有 30 个不同的选择器节点,总共 100 个节点,所以它比这个例子复杂得多,但我希望这能让你了解外星人人工智能是如何在引擎盖下工作的。
回到外星智能
我们知道,外星人的人工智能是控制外星人行动的系统。它从不提供关于玩家位置的信息。它从人工智能主任那里得到的唯一信息是它应该搜索哪个大致区域。除此之外,它必须自己找到玩家。它确实有一些工具可以帮助它追捕玩家。第一个是传感器系统,它允许外星人获取环境中的听觉和视觉线索。诸如脚步声,枪声,开门声,甚至运动跟踪器的嘟嘟声,所有这些都有助于外星人追踪玩家。音频范围取决于产生的噪声类型。除了声音传感器,外星人还可以感知视觉传感器,比如瞥见里普利跑过,或者看到视野中的门开着,等等。
外星人追捕玩家的另一个工具是搜索系统。开发人员已经确定了一些特定的区域,这些区域是外星人预先设定好要搜索的藏身之处。但是,它不会以任何特定的顺序搜索它们,甚至会仔细检查已经访问过的区域。当然,如果外星人听到噪音或看到视觉线索,它会搜索开发人员没有明确概述的区域。
关于《异形:孤立》最常讨论的话题是,随着游戏的进展,异形似乎对玩家了解得更多。它做出的动作似乎变得更加复杂,因为它了解了玩家游戏风格的某些特征。令一些人惊讶的是,开发人员实现这一点的方式是而不是通过在外星人的人工智能系统中建立一个复杂的神经网络。为了展示游戏如何实现这种外星人学习的感觉,我们需要参考一下外星人人工智能的行为决策树。

Figure 6 (Simpson, 2014)
在游戏开始时,这个行为树的某些部分对外星人是封闭的。被封锁的区域对外星人来说是不可接近的,这意味着它不能接触某些行为和动作。例如,在游戏开始时,响应远处开门声的树的部分可能不活动。如果玩家在外星人的视野中打开一扇门,它可以解锁行为树的这一部分,这样,在未来,开门的声音将触发一个反应。随着玩家在游戏中的进展,越来越多的外星人行为树被解锁。这给人一种外星人正在学习和适应玩家游戏风格的错觉。
视频游戏中的遗传神经网络
如果没有提到神经网络在视频游戏中的应用,这篇文章将是不完整的。最近有一些非常著名的例子,其中一个是人工智能击败了职业 Dota 2 团队。然而,涵盖这个主题的最佳方式是从小处着手,并对神经网络如何学习视频游戏的目标和策略建立基本的理解。

Figure 7 (Comi, 2018)
为了达到这个基本的理解目的,我们将使用的游戏是 Snake。对于那些不熟悉的人来说,贪吃蛇是一个 2D 游戏,你控制一排方块(被称为蛇)。你有三个移动的选择:左,右,或直走。如果你撞上了墙或者撞到了尾巴,你会立即死亡并重新开始。有一个点供你收集(被称为食物),它会让你的尾巴长一个方块。所以吃的越多,变得越长。
假设我们想教我们的蛇如何获得尽可能高的分数。为了在这个世界上生存,我们的蛇需要学习一些东西。为了让我们的蛇学习,需要向它提供关于环境的信息。我们将把我们提供的信息称为输入。这些输入可以是我们所知道的任何信息。例如,我们的输入可以是以下 6 个是/否问题:是否清晰直、是否清晰左、是否清晰右、是否食物直、是否食物左、是否食物右(Designing AI,2017)。这将根据每个问题的答案为 6 个输入节点提供 1 或 0。然而,这些输入也可以是蛇头与墙壁、尾巴或食物之间的距离。为简单起见,让我们停留在 6 个输入节点的例子上。
接下来我们需要告诉我们的蛇的是我们希望它实现什么。为了传达我们的预期目标,我们实施了一个奖励系统。例如,我们可能会给我们的蛇 1 分,每次它向食物移动一步,可能会给它 10 分,每次它吃了食物,长度增加。然而,当 Binggeser(设计人工智能,2017)为他的蛇实施这些奖励时,他意识到他的蛇只会在一个非常小的圈子里移动。通过这种方式,他的蛇能够在避免墙壁和长尾巴带来的危险的同时获得分数。显然,这不是预期的结果。需要在初始模型中加入某种惩罚,每当蛇离开食物时就扣分。这促使蛇主要朝着食物的方向移动。
所以现在我们有了一条蛇,它拥有来自环境的信息和一个奖励系统,这个系统定义了它的目标是什么。我们将何去何从?我们的蛇实际上是如何学会玩这个游戏的?此时,快速浏览一下神经网络实际上是如何工作的会很有帮助。
世代神经网络
世代神经网络的构造方式与标准神经网络相同。它从一定数量的输入节点开始,然后输入到一个或多个隐藏层,最终提供一个输出。这是一个很好的视觉示例:

Figure 8 (Comi, 2018)
对于我们的蛇的例子,我们将有 6 个输入节点,它们是我们之前定义的 6 个是/否问题:它是直的吗,它是左的吗,它是右的吗,它是直的吗,它是左的吗,它是右的吗。每个输入节点通过我们称之为权重的东西连接到每个第一隐藏层节点。在图 8 中,我们看到连接到每个节点的所有线(权重)。这些权重是我们的模型在学习加强或削弱哪些输入以提供最准确的输出时将要调整的。在我们的例子中,“最准确的输出”被定义为“收集最多点数的蛇”。记住,我们的蛇向食物移动会得到分数,吃食物会得到更多分数,远离食物会得到负分数。
一代神经网络“学习”的方式是首先决定每一代的大小(假设我们希望每一代包含 200 条蛇)。接下来,它为第一代中的 200 条蛇中的每一条创建微变化的权重,然后运行第一代中的 200 条蛇中的每一条,并选择最成功的蛇(获得最多分数的蛇)。假设我们选择了在我们的第一代中得到最多分数的前 10 条蛇(前 5%)。这 10 条蛇随后成为第二代的“父母”。这 10 条蛇的重量用来定义第二代的起点。第二代的 200 条蛇将再次产生这些重量的微小变化,表现最好的将被选为第三代的“父母”,等等。
回蛇
因此,正如我们在上面看到的,我们可以一遍又一遍地运行我们的第一代 snake 模型(上面我们运行了 200 次),通过稍微改变每个权重来查看 snake 出现的各种变化。然后,我们选择将继续影响第二代神经网络权重的最佳表现者。我们对随后的每一代都重复这个过程,直到蛇的学习率开始稳定下来(换句话说,直到一代的进步减缓或停止)。
也许在第一代、第二代和第三代中,没有一条蛇吃过食物,因此也不知道食物奖励 10 分。然而,也许在第四代,一条蛇吃一块食物。这条蛇很可能在它的世代中拥有最高的分数,因此会被选择来影响未来的世代。后代的权重将基于最成功的蛇祖先而改变。10 代,100 代,甚至 1000 代之后,你可以想象会发生多大的学习。
视频游戏人工智能在现实世界中的应用
用于视频游戏行业的强化学习同样也成功应用于其他行业。例如,侠盗猎车手游戏(Grand Theft Auto games)已经预编程了“交通规则、道路和汽车物理”(Luzgin,2018),用于为测试自动驾驶汽车算法提供安全和现实的环境。它不仅安全、真实,而且在虚拟环境中收集数据的速度比真实世界快 1000 倍(Luzgin,2018)。
“视频游戏是训练人工智能算法的一种很好的方式,因为它们旨在让人类的思维逐渐进入越来越困难的挑战。”(鲁兹金,2018 年)
人工智能在电子游戏方面的最新进展之一是由 Open AI 的研究人员取得的。Open AI 创造了一个基于算法的游戏,其唯一目的就是带着天生的好奇心去探索。奖励系统的重点是奖励游戏中不断深入的探索。研究人员将这个好奇心驱动的模型放入一个超级马里奥兄弟的游戏中,它完全出于好奇心成功通过了 11 关。显然,这也有缺点,因为它需要巨大的计算能力,而且机器很容易分心。然而,这对于第一次玩游戏的人类玩家来说也是一样的。正如 Luzgin 在他的文章中引用的,“婴儿似乎采用无目标的探索来学习对以后生活有用的技能。”这种无目标探索的感觉贯穿一生,但最明显的例子是通过视频游戏探索虚拟环境。
摘要
如今,在视频游戏行业,人工智能有很多种形式。无论是简单的 FSM 模型还是从环境反馈中学习的高级神经网络,这些虚拟环境为人工智能的发展提供的可能性(无论是在游戏行业还是其他领域)都是无限的。
引用的作品
彼得·宾格泽。设计 AI:用进化解决蛇。2017.https://becoming human . ai/design-ai-solution-snake-with-evolution-f 3d d6a 9 da 867
来吧毛罗。如何教 AI 玩游戏:深度强化学习。2017.https://towards data science . com/how-to-teach-an-ai-to-play-games-deep-reinforcement-learning-28f9b 920440 a
卢哈比。视频游戏中的人工智能:走向更智能的游戏。2017.http://sitn . HMS . Harvard . edu/flash/2017/ai-video-games-forward-intelligent-game/
卢兹金,罗曼。视频游戏作为人工智能的完美游乐场。2018.https://towards data science . com/video-games-as-a-perfect-playground-for-artificial-intelligence-3 B4 ebeea 36 ce
克里斯·辛普森。人工智能的行为树:它们是如何工作的。2014.https://www . gama sutra . com/blogs/ChrisSimpson/2014 07 17/221339/Behavior _ trees _ for _ AI _ How _ they _ work . PHP
汤普森汤米。完美的有机体:外星人的 AI:隔离。2017.https://www . gama sutra . com/blogs/TommyThompson/2017 10 31/308027/The _ Perfect _ organize _ The _ AI _ of _ Alien _ isolation . PHP
人工智能对企业的成功至关重要,原因如下!

人工智能笼罩着我们生活的方方面面,我们不能更欣赏这项技术了!从个人生活到大企业,人工智能的浪潮已经将这一切夷为平地。
在这里,我们将探索人工智能为企业带来了什么,以及为什么它在 2020 年及以后不再是奢侈品而是必需品!人工智能已经以一种似乎不再是开箱即用的方式融入了我们的生活。从电子邮件过滤和聊天机器人功能到谷歌的预测搜索或定制产品推荐,AI 就在你身边。话虽如此,围绕这个流行词仍然有很多困惑。为此,让我们从头开始!
什么是人工智能?
人工智能(AI)是机器对人类智能的模拟。这些机器被编程为像人类一样思考和执行动作。在这种情况下,机器通过监督、非监督或强化学习来学习和解决问题。机器学习和深度学习属于人工智能的范畴。
AI 在不同行业的作用
人工智能已经无缝地将自己融入到业务流程中。它不仅使我们的商务生活变得简单,而且还能以更高效的方式完成任务。
尽管它在许多方面仍处于萌芽阶段,但这是最精彩的部分-
每天 我们都会产生数量惊人的 2.5 万亿字节的数据。只有人工智能有能力处理并从中获取意义。
市场和客户洞察- 人工智能对海量数据发挥作用。无论是通过系统矩阵、网络矩阵还是社交媒体,都不缺乏关于市场或客户的数据。所有这些都作为人工智能系统的原材料,为营销你的产品/服务做出有效的决策。
虚拟协助- 有了虚拟协助,公司可以全天候为客户服务。事实是,大多数客户打电话给客户支持服务寻求一般的答案。聊天机器人可以有效地处理所有这些查询。
流程自动化- 为什么企业希望其人力资源去完成一项可以自动化的任务?人工智能促进了不同行业各种业务流程的自动化。这不仅加快了整个过程,而且消除了人为错误的机会。
高效的数据使用- 与以前不同,现在可用的数据不是结构化的格式。它超越了人类处理数据并从中识别人类意义的能力。人工智能也是帮助企业渡过难关的工具。此外,企业现在可以利用这些数据更好地了解客户,不再遵循一刀切的方法。
增强客户体验- 对于一个企业来说,还有什么比忠诚的客户更重要的吗?但要建立这种关系,你不仅需要满足他们的需求,还需要比你的竞争对手更好地吸引他们。人工智能分析他们的行为,并通过可操作的见解为他们提供他们一直在寻找的东西。
为什么人工智能对你的业务至关重要?
人工智能解决方案价格合理- 人工智能最好的一点是它适用于所有人。从中小企业到财富 500 强公司,人工智能肯定有适合所有人的东西。因此,你不需要等到收入高得离谱的时候才能够整合人工智能解决方案,你现在就可以做到!是啊!
这里有一些开始的方法-
- 从一次找到一个问题的解决方案开始(检查你的投资回报率。)
- 利用聊天机器人。
- 与其实现机器学习,不如将其自动化。
- 利用现有的工具,而不是从头开始构建。
营销过程自动化有助于增加销售- 新时代的营销要求你向顾客展示他们想看的产品。营销过程的自动化有助于实现这一点。
人工智能可以更容易地理解客户的模式,并据此营销产品。聊天机器人在转化访问该组织网站的客户方面也发挥了巨大作用。
AI 简化了营销过程,并通过有针对性的广告、定制产品推荐、重新营销策略、价格调整和许多其他技术来提高销售额。
人工智能支持的业务提高了工作效率- 当你从员工的待办事项列表中删除平凡的任务时,他们必然会专注于做得最好的事情。这提高了效率。人工智能在补充人类智能时效果最佳。此外,请注意,与人类不同,人工智能可以日复一日地做同样的工作,而不会失去注意力。这使得业务流程更加有效。
人工智能使企业和消费者之间的交流自动化- 不可否认的事实是,当涉及到企业与客户的关系时,交流确实是关键。此外,客户有权在各种平台上随时需要它。这个过程可以通过 AI 自动完成。机器学习算法可以从经验中学习,并以个性化的方式与客户交流。对于企业来说,这节省了时间,而对于客户来说,这增加了他们与企业的互动。
人工智能让处理库存变得简单- 处理库存的最大问题是,每次你都必须做得恰到好处。你必须有适当的库存,既不能短缺,也不能过量,否则会耗尽你的现金。
人工智能在这里得到它的权利。它能够通过预测客户未来的购买行为来自动完成再填充请求。因此,它将帮助您保持业务运行,改革周转时间,并在您需要时储存正确的产品。
人工智能有助于防止欺诈和保护数据- 人为错误是不可避免的,但你不能总是承担得起。你可以花所有的时间来检测欺诈和保护你的数据,但仍然会有漏洞。这种情况下你会怎么做?答案就在眼前——利用人工智能。
人工智能的子集,即机器学习通过从经验中学习和识别过程来工作。这正是这里所需要的——破解模式并在它开始时发出警报。
结论
人工智能是一种必需品,可以通过解码大量的非结构化数据(我们最大的资产)来改变你的业务。从这些数据中获得的信息可以给所有行业带来变革。
它还可以简化业务流程,加快任务,消除人为错误,预测缺陷,并为您做很多事情。
现在想象一下它会给你的企业带来什么!
不利用人工智能就像在 2020 年使用 2000 年的商业战略。你知道那没用的!
人工智能已经在改变我们的世界,在未来我们可以期待-
- 人工智能将更有效地发挥作用。因为它将有更多的数据量和更高的计算能力来处理这些数据。
- AI 可能根本不需要人类干预。
- 它将以更有意义的方式处理和利用数据。
- 让工作流程更加简单。
- 提供更高的打包数据安全性。
- 更便宜和创新的人工智能解决方案。
作者简介:
Amit Makhija 是 Space-O Technologies 的数字营销分析师,Space-O Technologies 是一家可靠的 iPhone 应用程序开发公司。他喜欢探索移动应用行业的最新技术&通过写文章与观众分享他的发现。在业余时间,他喜欢旅游、摄影和阅读非小说类书籍。
人工智能只是一个工具

关于人工智能(AI)的可能性和可能的应用的宣传目前似乎是无限的。人工智能程序和解决方案被誉为真正的灵丹妙药。然而,冷静地看,它们只是 IT 专家工具箱中的另一个工具。
在一些场景中,人工智能应用程序会提供更好的结果,但并不能由此得出普遍的优势。更重要的是,IT 经理必须非常仔细地检查他们想要为每个项目使用什么。要回答这个问题,决策者必须将人工智能与其他概念联系起来考虑。
AI 不替代,AI 补充
其中可以区分出两种不同的过程:编程的或者模型驱动的方法。首先是软件的传统开发。程序员一行一行地编写代码,指定系统应该满足哪些要求以及如何满足:从在 CRM 数据库中收集地址信息,到计算健康保险计划中的关税选项,再到取决于工件的铣床速度。这种方法的典型代表是标准解决方案,如企业资源规划(ERP)软件,但也包括将标准与单独创建的组件相结合的特定软件或混合形式。
另一方面,模型驱动的方法涉及较少的编程——在写下代码行的意义上——但是更关注技术和功能方面。随之而来的是更强的技术方面的抽象。它是关于一个模型中相互关系和影响的说明。这是手动建模或训练的,然后获得的知识可以应用于新的输入,如其他数据集。
原则上,就结果而言,这两种 IT 解决方案具有同等价值——编程系统和人工智能都可以解决相同的任务。然而,解决方案的选择对项目设计、涉及的各方、工作以及最终对 IT 解决方案的整个生命周期都有影响。
AI 项目大同小异。
如果负责人依赖于软件开发过程,项目将经历规划和实现的经典步骤:理解需求、开发、测试、推出并在此基础上操作软件。新的或变化了的条件确保那些相关的人一次又一次地经历这个循环。
基于模型的方法的过程是不同的:在这种情况下,一切都从理解需求开始。但是,接下来就需要把这些需求倾注到一个模型中,用测试数据来检验模型的质量,比如说,整合到 it 运营中,铺开,运营。典型的 IT 实施项目以与上述过程相同的方式发生,即在此之后。然而,关于所需功能的功能已经由模型给出。然后,实现项目“只”处理所谓的非功能性需求(NFR),如性能、可伸缩性或可用性。因此,这一程序确保了功能和技术问题的明确分离。因此,与编程相比,技术专家和建模在这个过程中起着重要的作用;IT 能力与此不太相关。
有两种不同的建模方法:一方面,专家可以手动描述模型,例如通过写下规则。另一方面,他们可以依靠自我学习系统(机器学习)。在这里,学习算法取代了人类开发人员。为了让这个算法工作,它需要输入。无论是基于历史数据集(例如,分类照片)的训练,还是来自专家的直接反馈。在哪些情况下决策者应该选择哪种方法?这不能笼统地回答,但一些指标表明了趋势。
人工智能的使用没有固定的规则
正如已经解释过的,人工智能不会取代任何已知的东西,而是用进一步的选择来补充 IT 解决方案空间。以下指标支持选择基于人工智能的解决方案:
——技术复杂度高,值得一模。业务问题和技术需求的分离带来了优势。例如,因为业务专家可以独立地扩展和优化系统。
-专家只能花很大力气来绘制和维护技术方面的内容。在这些情况下,使用学习系统会有回报。
理论到此为止。一个例子说明了与机器学习相比,手工编程或建模如何在相同的应用案例中证明自己。
听力不错
这种比较的场景是军事监视的自然限制区域:这些被分类用于无线电信号的分析。只要它们没有被加密,内容就会被解码。材料可以是声音或数据。在语音信号的情况下,专家区分模拟语音和数字编码的语音信号。考虑到技术发展,这可能令人惊讶,但仍有许多模拟、未编码信号在使用。
收听这些无线电信号需要许多人每天捕捉并转录模拟无线电信号。一个耗时且昂贵的过程。如果系统能够自动区分模拟语音信号和数字信号,这个过程就会简单得多。

为了创建这样一个系统的基础,该项目中涉及的无线电信号首先被人工分类为模拟或数字类别。他们收听无线电信号,并标记每个模拟语音信号的开始和结束。这样,他们标记了持续时间约为 24 小时的无线电信号。项目经理然后使用两种不同的方法:在第一种方法中,一个团队编程算法从这些信号中提取特征。这些特征然后通过程序化的病例区分进行分类——这是一个昂贵且耗时的项目。
深度神经网络接管信号评估
相比之下,一篇硕士论文讨论的是基于自学过程的解决方案。这名学生使用了一种所谓的深度神经网络,用分类数据进行训练。学生把信号的选择和评估都留给了神经网络。所以什么都没有被编程;准备工作包括数据材料的格式化和网络的配置。经过大约三个月的运作,一个功能系统已经可以使用。
两种方法的比较表明,尽管所涉及的努力较少,但学习系统取得了更好的结果。它对模拟语音信号的识别率达到了 95 %,远远高于编程程序所能达到的识别率。
因此,负责人必须在每个案例中仔细考虑使用人工智能技术是否是最佳选择。像本例中一样,并行开发几个过程是不可能的。然后需要人的智慧和经验来选择适当的方法。
H2O.ai 让人工智能变得简单

Photo Source: ShutterStock
Python 中使用 H2O.ai 和 AutoML 建模的综合指南
伊桑·戴伊&爱丽斯·李
如果你和我爸爸一样,你已经在 IT 行业工作了几十年,但对数据科学却只是一知半解。现在,你的新 C-something-O 希望你组建一个数据分析团队,并使用一套你在会议上只是模糊听说过的新术语。或者,您可能是一家快速发展的初创公司的开发人员,已经花了数周时间完成了一个算法,却被将模型部署到 web 应用程序以供实时使用的问题所困扰。对于这两种情况,H2O.ai 绝对是一个值得研究的解决方案。
为什么是 H2O.ai?
H2O.ai 将自己定位为一个软件包,通过其开源包 H2O 和 AutoML 来简化机器学习过程。虽然像 H2O 无人驾驶人工智能这样的产品允许最终用户在没有一行代码的情况下完全自动化这个过程,但大多数用户(像我一样)希望他们的模型开发至少有一定程度的可定制性。
H2O.ai 在这里大放异彩有几个原因:
- 它将开发过程简化为一个直观的工作流程,
- 训练模型比 sci-kit learn 等流行的软件包更快,并且
- 使用 Java 对象使得将一个模型转移到产品中变得简单多了
简而言之,H2O 无疑为大型数据集提供了一个快速且可访问的机器学习平台,该平台配备了用户友好的高性能工具。

概观
- 入门指南
- 构建独立模型
- 使用 AutoML 寻找最佳模型
- 模型部署
好消息是,Python 中的大部分 H2O 与您可能熟悉的 sci-kit 学习函数很相似。H2O 的数据结构与熊猫非常相似,指定、拟合和评估模型的工作流程也很相似。使用来自 UCI 知识库的金融信用数据集,我们将使用 H2O.ai 来预测个人在下一次付款中违约的概率。
注意:如果你只对 AutoML 部分感兴趣,跳过“构建一个 Hello,World!“模型”一节,它深入到开发单个模型的本质。您可以回到那里,将它以及提供的 H2O 文档链接更多地用作参考指南。
您可以使用帖子中的代码片段或下面链接的交互式 Python 笔记本来跟进。
GitHub:https://GitHub . com/elyselee/H2O-walk through/blob/master/H2O % 20 walk through . ipynb
H2O Python 入门
设置相关性
尽管我希望我可以说实现就像抛出另一个 pip install 命令一样简单,但实际上要复杂得多。
首先,到 H2O 稳定链接这里,下载包含最新版本的 zip 文件。按照下面的命令完成软件包的安装。
cd ~/Downloads
unzip h2o-3.25.0.4698.zip
cd h2o-3.25.0.4698
java -jar h2o.jar
截至撰写本文时(2019 年 6 月),H2O 仅支持 Java SE 运行时环境版本 8–11。您可以使用java -version命令检查您的版本。如果你有 Java SDK 12,你必须卸载并降级到 Java SDK 11 以保持与 H2O 的兼容性。为此,在终端中执行以下命令:/usr/libexec/java_home -V。复制它返回的路径名,并使用下面的命令卸载:sudo rm -rf pathname。前往甲骨文 JDK 11 下载网站,创建一个帐户,并按照那里的说明进行安装。
现在您已经安装了必备包,打开您的 Python 脚本并执行下面的代码。nthreads参数简单地控制执行操作的内核数量,而-1为 H2O 分配最大数量的可用内核。
import h2oh2o.init(nthreads = -1, max_mem_size = 8)
h2o.connect()
数据预处理
如果你用 Python 做数据科学,使用熊猫数据框架。如果您正在从头开始编写算法并使用 NumPy 数组,那很好。但是如果你认为 H2OFrames 是值得学习的东西,我会为你节省很多时间和麻烦:它不是。
公平地说,H2O 跑得比 sci-kit learn 模型快得多的原因之一是 H2O 为熊猫提供了更高效的数据结构。但是对于特征工程,我们建议坚持使用传统的数据帧,然后在准备好导入时转换成 h2of 帧。因为这毕竟是一个 H2O 教程,我们的处理技术将使用 H2OFrames 来完成。H2O 也有很好的数据操作参考指南。
首先,我们将使用h2o.import_file() 函数导入 UCI 信用卡数据集。
df = h2o.import_file(‘uci_creditheader.csv’)
H2OFrames 的许多功能与 Pandas DataFrame 的功能是同源的。例如,我们可以使用.columns属性检查列,该属性返回一个特性名称列表(不是 NumPy 数组)。我们可以使用drop()功能删除不必要的特征(不需要轴规格)。
df = df.drop(‘ID’)
df.columns
在下面的代码中,我们将创建一个特性列名x和目标变量名y的列表。这种格式允许我们向训练和预测函数传递更少的数据结构(sklearn 要求 X_train 和 y_train),从而显著提高运行时。
y = ‘default payment next month’
x = list(df.columns).remove(y)
当我们谈到这个话题时,需要注意的是,H2O 将根据y变量的数据类型自动假设一个回归或分类模型。使用df[y].type属性的快速检查显示我们的值是整数(1 表示贷款违约,0 表示其他情况)。然后,我们可以使用as_factor()函数将该列转换为因子类型。
df[y] = df[y].as_factor()
为了创建训练和测试集,我们将使用 H2O split_frame() 函数,而不是使用 sklearn train_test_split()函数。为此,我们需要传递训练集和验证集大小的分数列表(测试集大小是隐式计算的)。该函数返回一个列表,第一个元素引用定型集,第二个元素对应于验证集,第三个元素是测试集。
splits = df.split_frame(ratios=[0.7, 0.15], seed=1)train = splits[0]
valid = splits[1]
test = splits[2]
我们还可以使用.nrow属性检查每个集合的大小。请注意,这些集合中的每一个都包含 X 变量特性和 y 目标,这与我们在 sklearn 中完成的过程不同。
print(train.nrow)
print(valid.nrow)
print(test.nrow)
构建一个“你好,世界!”模型
模型构建
我们将使用随机森林估计器对我们的模型进行分类,您将再次注意到与 sci-kit learn 的相似之处。使用H2ORandomForestEstimator()函数,我们实例化将用于分类(或回归,如果我们有一个整数或浮点响应变量)的模型。
from h2o.estimators.random_forest import H2ORandomForestEstimatorrf = H2ORandomForestEstimator(seed=1)
seed:该参数与其他模块中的random_state类似,只是控制创建模型时使用的随机数。这对于使用外部数据集进行模型验证时的再现性非常重要。- 还有一些其他特定于每个型号的参数,如
ntrees或min_split_improvement,可以指定。为了找出你所选择的模型算法,查看一下 H2O 的文档。
拟合和预测结果
为了使我们的模型适合数据,我们必须至少传递三个参数:training_frame、y列和x列。但是,如果x参数为空,h2o 将假设在拟合时使用除y列之外的所有列。下面是一些其他参数,您可能希望在下面的片段中没有包括的数据中使用。同样,完整的列表可以在文档这里找到。
rf.train(x=x, y=y, training_frame=train)
nfolds:用于交叉验证的折叠数。关于这方面的更多信息,请查看交叉验证的 H2O 解释。balance_classes:当我们的目标特征中存在类别不平衡时,我们可能希望对数据进行重新采样,在创建新分布时,通过对少数类别进行过采样或对多数类别进行欠采样。如果我们将这个参数设置为True,我们也可以指定一个class_sampling_factors参数,并传递一个比率列表来确定最终的分布。ignored_columns:如果我们在拟合时不希望包含某些列,但这些列有助于比较预测值,如观察 ID,我们可以使用此参数指定。categorical_encoding:在 sklearn 中,我们在预处理阶段使用单独的函数处理分类变量,而 H2O 可以使用一个热编码或标签编码等技术处理每一列。简要说明:要将需要处理的列标记为分类列,请事先使用.as_factor()函数来更改训练集和测试集中的数据类型。可以在这里找到categorical_encoding选项的完整列表。
预测
返回每个类的预测概率非常简单,可以使用predict()函数来完成。
y_hat = rf.predict(test_data=test)
进一步检查 y_hat,我们看到predict()为每个观察值返回了三列:p0,观察值属于 0 类的概率;p1,观察值属于第 1 类的概率;和predict,预测分类标签。这里,分类标签的判定边界(阈值)被假设为 0.5,因此任何大于 0.5 的p1值将对应于为 1 的predict标签。

性能赋值
真正理解模型评估的基础对于决策者最终决定一个模型是否适合部署和用户交互是至关重要的。我已经在这里写了一篇关于二进制分类的度量的文章如果你不熟悉这个主题或者需要复习一下。
为了检索关于我们的模型表现如何的报告,我们可以使用model_performance()函数,并将结果打印到控制台。
rf_performance = rf.model_performance(test)
print(rf_performance)
输出有几个部分。首先,我们看到一个标题,它指定了报告什么类型的指标ModelMetricsBinomial,以及模型类型drf。
ModelMetricsBinomial: drf
** Reported on train data. **MSE: 0.14036700152537882
RMSE: 0.3746558441094691
LogLoss: 0.45587629761245807
Mean Per-Class Error: 0.30286812164834764
AUC: 0.7576361236577988
pr_auc: 0.5240926163909475
Gini: 0.5152722473155975
我们还会收到一个混淆矩阵,纵轴是实际标签,横轴是预测标签。注意:混淆矩阵的值在最大化 F1 分数的阈值(概率截止值)处报告,而不是 0.5。我们这里的输出确定为 0.312。

Confusion Matrix Calculated at Threshold that Maximizes F1 Score
H2O 输出的酷之处在于,它会自动计算每个阈值处的每个指标,然后报告最大指标value以及达到该指标的threshold。同样,如果这里使用的词汇对你毫无意义,我强烈推荐阅读这篇解释评估指标的文章。

这个组件对于理解模型是否真的完成了我们所需要的是至关重要的。想象一下,我们正在开发一个检测疾病的模型。Specificity指我们正确预测的实际疾病病例的比例。我们宁愿最大限度地提高特异性,而不是精确性,原因很简单,因为没有检测到真正的患病患者和放弃早期干预的成本远比虚惊一场更糟糕。
顺便说一下,我们可以通过调用 H2OModelMetrics 对象的度量函数来返回特定的度量。要查看可以调用的指标的完整列表,请在键入 H2OModelMetrics 对象名称后点击选项卡,并从下拉列表中选择一个选项(然后添加()以返回感兴趣的指标)。
rf_performance**.**auc()
rf_performance.confusion_matrix()
参考链接:
指标指南【https://towardsdatascience.com/hackcvilleds-4636c6c1ba53 :
其他型号的快速备忘单:
深度学习(DL) :由分层神经元组成的人工神经网络,每个连续的模型层都通过聚合对前一层进行改进。要了解更多关于这种工作方式的背景,请查看我们关于深度学习的文章。
epochs:流式传输数据集的次数。L1:添加 L1 正则化,通过将多个权重值设置为 0 来提高泛化能力和稳定性L2:添加 L2 正则化,通过降低许多权重值来提高泛化能力和稳定性adaptive_rate:学习率手动调谐默认开启loss:指定损失函数,选项:Automatic(默认)、Absolute、Quadratic、Huber、CrossEntropy
分布式随机森林(DRF):DRF 用数据集创建一个回归或分类树森林。
ntrees:树的数量max_depth:最大树深sample_rate:行采样率从 0 到 1(默认为 1)col_sample_rate_per_tree:每棵树的列采样率从 0 到 1
广义线性模型(GLM): 一种线性回归,具有灵活的泛化能力,用于处理非线性。
Solver:要使用的求解算法:auto、l_bfgs、irlsm、coordinate_descent、coordinate_descent_naive、gradient_descent_lh或gradient_descent_sqerr。Lambda:正规化强度Alpha:L1 和 L2 之间的规则化分配
梯度推进机器(GBM) :通过连续细化使用弱决策树的集合(模型集合)
ntrees:集合的树数learn_rate:学习率,范围从 0 到 1sample_rate:行采样率从 0 到 1(默认为 1)col_sample_rate:列采样率,范围从 0 到 1。
朴素贝叶斯分类器:基于应用贝叶斯定理的强特征独立性假设的分类算法
max_hit_ratio_k:命中率计算的最大预测数min_prob:用于观察的最小概率eps_prob:低于被 min_prob 替换的概率的截止值
参考链接:
模型估计器文档:http://docs . H2O . ai/H2O/latest-stable/H2O-docs/data-science . html # supervised
AutoML:优化变得简单
正如您现在可能已经看到的,选择最佳预测模型可能是复杂且耗时的。您不仅需要确定最佳模型,还需要确定使该模型性能最大化的最佳参数。传统上,我们会通过网格搜索来进行超参数调整,但 H2O 也可以跨多个模型自动完成整个过程。
自动机器学习(AutoML)通过训练各种模型来自动化选择最佳模型的过程,使那些没有该领域专业背景的人能够像传统方法一样产生高性能的模型。想想 sci-kit 学习管道,只是更大更好。
目前,H2O 版本 3.16 中的 AutoML 支持以下模型:随机森林、极度随机森林、深度神经网络的随机网格、梯度推进机器(GBM)的随机网格、广义线性模型(GLM)的固定网格,然后训练模型的堆叠系综。
构建自动估计器
我们首先导入 H2O AutoML 函数,并将其用于训练集,以与之前模型相同的方式传递x和y列。
from h2o.automl import H2OAutoMLaml = H2OAutoML(max_models=5, max_runtime_secs=300, seed=1)
aml.train(x=x, y=y, training_frame=train)
max_models:这控制了要构建的模型的最大数量,不包括堆叠的集合模型。max_runtime_secs:这是在训练模型之前 AutoML 运行的最大运行时间(秒)。
性能赋值
我们可以通过调用leaderboard属性并将输出存储在 H2OFrame lb中来查看最佳模型及其在各种指标上的性能,然后我们可以使用head()函数来查看。
lb = aml.leaderboard
lb.head(rows**=**lb**.**nrows)
输出将包含按 AUC 分数排序的最佳模型列表,并显示适用于分类或回归的几个拟合优度指标。

Leaderboard Output with Maximum Running Time of 300s
我们可以使用排行榜中的最佳模型来预测测试集上的标签,并查看之前显示的其他指标。为此,模型被存储为aml.leader,并拥有普通分类器所拥有的所有功能和属性。
y_hat = aml.leader.predict(test)
aml.leader.auc()
aml.leader.confusion_matrix()
AutoML 文档:http://docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html#
进入生产阶段
H2O 的一个更大的好处是,所有经过充分训练的模型都可以存储为对象,可以很容易地部署到其他 Java 环境中进行实时评分。
为此,H2O 可以将模型转换为ModelObjectOoptimize(MOJOs)。与普通旧 Java 对象(POJO)不同,mojo 没有大小限制,并且比 POJO 速度更快,占用的磁盘空间更小。产生一个H2O-genmodel.jar文件作为输出,它是一个支持计分的库,包含所需的阅读器和解释器。将 MOJO 模型部署到生产环境中时,也需要这个文件。
下面的代码将 mojo 和h20-genmodel.jar文件下载到用户指定的路径。
model.download_mojo(path='pathname', get_genmodel_jar=True)
有关如何在生产中访问模型的更多信息,请参见下面的 H2O 文档。
生产文档:http://docs . H2O . ai/H2O/latest-stable/H2O-docs/productionizing . html #
离别的思绪
到目前为止,您已经熟悉了 python 中 H2O API 的基础知识,在 StackOverflow 和文档的帮助下,您应该能够使用 Python 启动和运行 H2O,构建和训练模型,评估其性能,甚至研究部署。
在这个过程中,我发现相对于其他来源,可以从 H2O 文档中获得资源。不要低估 StackOverflow,但也不要指望在那里找到所有问题的答案。
如果您有任何问题,请告诉我们,我们很乐意在您开始使用 AutoML 和 H2O.ai 时提供更多资源。
人工智能遇上物联网。

Photo by NeONBRAND on Unsplash
我们需要做的是创建一个准确的和有效的机器学习模型,这需要大量的高质量和相关的数据。物联网设备有潜力产生大量数据,然后可以与人工智能一起使用。想象一下面部识别系统使用摄像头取代普通支付,或者回忆一下当前对自动驾驶汽车使用内置传感器收集周围数据的大肆宣传。这些解决方案同时使用了人工智能和物联网,但很少有人研究如何轻松地将它们集成在一起。幸运的是,现有的物联网平台提供了从各种设备收集数据的接口,并可以提供一种相对简单的方法来将物联网数据利用到 AI/ML 系统中。本文将为您提供一些最先进的人工智能+物联网示例,概述最流行的物联网平台以及它们如何与您的人工智能/人工智能系统集成。
如果您有任何问题或反馈,请随时通过 Linkedin 或通过我的个人网站联系我。
人工智能+物联网示例
为了让你更好地了解人工智能如何与物联网结合使用,我列出了 3 个使用这两种技术的商业案例。
ET 城市大脑

Photo by Robert Bye on Unsplash
由阿里云创建的 ET 城市大脑是一个复杂的人工智能平台解决方案,可以优化城市公共资源的使用。它已在中国杭州成功实施,汽车流量减少了 15%。该解决方案还有助于检测道路事故、非法停车,并通过改变交通灯来帮助救护车更快地到达患者,从而支持救护车更快地到达目标。这是一个出色的软件系统,它利用了整个城市的交通灯摄像头,并根据机器学习模型的输出,可以确定交通灯应该如何改变[1]。
特斯拉的自动驾驶

Photo by Bram Van Oost on Unsplash
特斯拉自动驾驶系统将 GPS、摄像头、声纳和前视雷达与专门的硬件结合在一起,以充分利用耦合到神经网络架构中的数据。它作为一个自我封闭的系统工作,从传感器收集数据,然后使用神经网络模型来帮助确定汽车运动的下一个变化。
教室监控系统

Facial Recognition System — http://en.people.cn/n3/2018/0519/c90000-9461918.html
虽然这可能会引起一些争议,但该系统已经在中国杭州的一所高中实施。教室摄像头每 30 秒扫描一次房间,该算法能够确定学生的情绪(快乐、悲伤、无聊等)。),以及学生的行为(阅读、写作、举手等。).据该校副校长称,该系统由当地管理,关注的是全班而非单个个人的行为。这里,数据由摄像机收集,图像识别步骤在本地服务器上执行3。
这些例子显示了如何通过使用人工智能和从物联网设备流出的数据来解决复杂的逻辑问题。随着对这些解决方案需求的增加,构建这些系统的工具变得越来越容易获得和方便使用。在下一段中,您将了解到您拥有哪些选项来构建 AI/IoT 系统。
具有人工智能功能的物联网平台
物联网平台越来越受欢迎,因为它们为从物联网设备流出的数据提供了各种有用的工具和云存储选项。我不会深入讨论如何建立 AI+IoT 项目的技术细节,因为这不是本文的目的。相反,我的目标是让您大致了解每个平台都提供了什么。
Azure 物联网

Azure IoT 有一个 Github 知识库,它是为了帮助你轻松集成 AI 和 IoT 而创建的。这个代码库提供了关于如何一起使用机器学习和 Azure IoT Edge 的不同代码示例。深度学习模型可以封装在 Azure IoT Edge 兼容的 Docker 容器中,然后使用 REST APIs 暴露给数据。或者,可以将它部署在云上,然后使用 REST APIs 进行预测。Azure IoT 有很多有用的教程和案例,可以在他们的网站上找到。
谷歌云物联网

谷歌云物联网是一个令人印象深刻的物联网平台,它使你能够以多种不同的方式将数据与机器学习模型联系起来。它提供了一整套具有机器学习功能的边缘/内部计算工具,类似于 Azure IoT。谷歌还创建了一个单独的人工智能平台,以便你可以在那里训练模型,以及物联网数据的云存储选项。很少有有用的教程:例如,这个解释了如何将 ML 模型部署到物联网设备上,该设备根据即将到来的新数据进行自我更新。
AWS 物联网

知名的 AWS 也提供 AI+IoT 解决方案。AWS 物联网分析尤其有趣,因为它提供了数据准备、可视化和机器学习工具。可以使用亚马逊 Sagemaker 训练机器学习模型,然后将其容器化,以便可以用于来自物联网设备的数据流。ML 模型也可以直接上传到运行速度更快的设备上,并且可以根据新输入的数据自动更新[4]。
参考
[1]https://www.alibabacloud.com/et/city
http://en.people.cn/n3/2018/0519/c90000-9461918.html
人工智能、音乐和人类的崇高
Hannah Fry 在她的书“Hello World”中谈到了计算机如何被编程以近乎完美地模仿音乐。一个程序完美地模仿了巴赫的音乐词汇——包括他在所有作品中使用的音符、单词和短语。
即使是最精明的音乐家也永远无法获得巴赫的这种“数据视角”。我们可能熟悉他最喜欢的音符、音调和措辞。如果我们熟悉巴赫,就会对“巴赫性”有一个很好的概念。但是被编程来分析巴赫的机器也以他们自己的方式理解巴赫。例如,他们知道 g 后面可能是什么音符。他们可以分析音符序列,并复制它们。
这个机器学习实验的结果是,通过机器学习创造出来的假巴赫作品愚弄了很多巴赫专家。他们对此感到很难过。他们不应该。
机器 1,人类 0。
虽然我们目前在分析庞大的数据集方面可以被打败,但机器仍然无法与我们的直觉和创造力相匹配。人类可以获得美学上的崇高。我们可以触摸、感受和听到美。巴赫对我们有意义,但对制造假巴赫的机器没有意义。
问题是:机器创造的巴赫真的是假的巴赫吗?如果一个现代音乐家要创作一首类似巴赫的作品,他们显然会使用他们所知道的巴赫元素来创作一些新的东西。这也准确地描述了机器正在做什么。也许这是一个平局。
也许机器已经和我们一样有创造力了。
创造力的一个很好的定义是:
创造新事物。
用所有可用的材料制造新的东西,是一个稍微扩大的定义。把两个以前从来没有并列过的东西并列起来,用所有可用的材料做出新的东西,是另一种说法。
我看到了创造力,就像庞德,他这样表达了意象派诗人的特权:

机器辅助的巴赫作品无疑是新的。他们采用现有的元素,并以新的方式将它们拼凑在一起,创造出与巴赫没有区别的新作品。
机器有创造力。
如果你把创造力定义为人类的领域,完全有可能认为机器没有创造力。当我们做创造性的工作时,我们经常会有情绪。
朱尔斯·博宁-杜查姆是这样联系创造力和情感的:

这台机器并不敬畏巴赫,但我们敬畏。我们看到了崇高、审美价值和真正的美。如果我们对创造性的想法附加任何情感,那么,不,机器一点也不具有创造性。
人类 1,机器 1
我们的另一个优势是我们能够看到以前从未联系过的事物之间的联系。这台机器在这里不是这样做的:它获取现有的巴赫乐谱并进行分析。但是我们呢?如果我们愿意,我们可以把巴赫和金属乐队混搭在一起。如果我们愿意,我们可以把巴赫和德雷克混在一起。
更严重的是,我们可以利用巴赫现有的元素,并以新的方式使用它们,创造新的音乐形式,事实上这种情况一直都在发生。音乐的历史是形式的不断重复。
我怀疑巴赫会对几个世纪以来古典音乐的所有创新感到震惊。
在创造力的其他领域,我们认为人类的创新是创造新事物的关键。诗人用新的方式把单词串在一起。视觉艺术家尝试新的笔触,新的雕刻方式。音乐家添加不协和音、和弦变化和适合歌曲的乐器。
下面是大理的龙虾电话:

我不确定有哪台电脑会把一只龙虾和一部电话组装在一起。为什么会这样?这个奇异而超现实的雕塑震撼着观者,带我们走出熟悉的世界,这就是超现实主义的意义。
超现实主义电脑艺术?
也许超现实主义的电脑艺术在摄影领域是可能的。他们可以把照片分解成像素,然后重新组合。
超现实主义诗歌是可能的,尽管我们不需要电脑,我们可以让一群猴子坐在打字机前:

Infinite Monkey Theorem-Wikipedia.
此外,计算机会说出类似艾米莉·狄金森的话吗?
我在脑中感觉到一场葬礼。
迪金森女士是什么意思?她头疼吗?她抑郁吗?
某个地方的某个人可能正在编写一个 Dickinson 模拟器。它会检查她的用词、措辞、行长和诗的长度,它会做得很好。
但是它会达到崇高吗?它会像迪金森一样让我们震惊吗?让我们带着敬畏和惊奇保持沉默?我对此非常怀疑。
诗人 1,机器 0。
尼克·凯夫谈到美和超越,并将其置于我们的人性中。
[## 音乐、感觉和超越:尼克·凯夫论人工智能、敬畏和人类局限性的辉煌
“一首好歌带给我们的是一种敬畏感...敬畏感几乎完全基于我们的…
www.brainpickings.org](https://www.brainpickings.org/2019/01/24/nick-cave-music-ai/)
我觉得那个山洞是对的。我觉得没有机器会创作出一首像凯夫的《死囚第一人称忏悔》那样病态、扭曲、阴险的歌曲,因为找不到一个更好的词,“仁慈的座位”:
我们人类可以想象坐在电椅上等着被油炸会是什么样子。我想知道叙述者做了什么。我对歌曲中的众多歌词感到敬畏。我不相信它们是机器写的。你需要关于上帝、邪恶和死刑的高深知识来写这首歌。
这首歌是凯夫的独唱。一个洞穴模拟器可以捕捉他的话语、措辞和旋律,就像它可以捕捉狄金森的一样,但它永远不可能是真正的洞穴。
我的第二个例子是苏菲洋·斯蒂文斯的《变形》,每当我听到它时,我都会震惊得屈服:
我感到恐惧。我知道“变形”是什么意思,我也知道这是个好东西,但是我觉得害怕这首歌。它属于超验宗教音乐的范畴,而机器还不能接触到精神层面。知道这首歌是圣经也有帮助,尽管无疑有许多圣经分析算法。但是世界上所有的算法都无法让你在 4 分钟内感受到这首歌的效果。
我可以继续,但这只是两个例子。
机器会不会从嘻哈音乐中跳出来,用程序控制的鼓点在每个小节上跳跃,来捕捉音乐呢?人类不得不这样做。
机器能像尼尔·杨一样弹吉他吗?尼尔·杨的主要音乐会吉他在我的脑海中形成奇怪的反馈模式。机器能复制吗?
在鲍勃·迪伦的《铁轨上的血》中,你可以听到他的纽扣敲击他的木吉他。机器会把它编辑掉吗?大概吧。
我认为我们在创造力方面仍然比机器有优势。我们进行创造性的飞跃,发明新的类型,把不同的元素放在一起,看看什么是有效的。如果未来是真正的人类,而不是算法,我们需要坚持下去。
现在,让我们宣布比赛开始:
人类 2,机器 1。
我们认为不仅仅是 0 和 1。我们有尼克·凯夫、鲍勃·迪伦、艾米莉·狄金森、萨尔瓦多·达利和 Qtip。我们有太阳的外星探险,我们有杰瑞·加西亚。
@ MatthewOldridge 试图“创造新事物”,至少每天都有几分钟。
商业中的人工智能机遇与挑战

●寻找企业在实施人工智能方面面临的机遇和挑战?
●对是否在你的业务中开始基于人工智能的开发感到困惑?
●人工智能如何影响你的业务增长和利润?
在这里,在这个博客里,你会找到所有这些问题的答案。开始吧!
人工智能是一项连外行都很好奇的技术!原因在于它有扰乱生活方方面面的强烈倾向。人工智能似乎集体散发出热情和怀疑。显然,在不同的措施!
在此之前,让我们看看人工智能的一些统计数据和事实:
●人工智能技术可以将企业生产率提高多达40%【埃森哲】
●自 2000 年以来,人工智能创业公司的数量已经放大到 14 倍。 (福布斯)
●人工智能将自动化 16% 的美国工作岗位【Forrester】
●15%的企业正在使用人工智能,其中 31%的企业表示这是他们未来 12 个月的计划【Adobe】
的确,人工智能不再仅仅局限于创新实验室。它因其改变商业的惊人潜力而受到称赞。然而,在发现这项技术的真正潜力之前,企业需要应对某些挑战。
人工智能在商业中的实施面临着几个挑战
1。计算并没有那么先进
看起来最有益的机器学习和深度学习技术需要非常快速地进行一系列计算(微秒或纳秒或更慢!).
它清楚地表明,这些人工智能技术利用了大量的处理能力。
AI 已经在专家讨论很久了。结果总是没有足够的力量来实现这些人工智能技术。
云计算和大规模并行处理系统为短期内实施这些技术带来了希望,但随着数据量的增加,深度学习转向自动创建越来越复杂的算法,云计算将无济于事!

What really is Artificial Intelligence about?
2。支持的人少了
AI 实现在市场上没有足够的用例。没有它,没有组织会有兴趣投资人工智能项目。这显然意味着,相对而言,很少有组织有兴趣投资开发基于人工智能的产品。
此外,世界上没有足够的人能够让其他企业理解机器动力进步的愿景。简单地说,我们可以说,知道如何操作会思考和自学的机器的人不够多。
对于这个问题的补救措施,一个温和的疗法是公民数据科学家。但这也不是永久或真正的解决办法。另一种选择是转向提供允许人工智能驱动的工作“作为服务”的平台和工具。组织能够采用现成的解决方案并插入自己的数据,而不是从头开始。
3。建立信任
人工智能的问题在于,它对人来说就像一个黑匣子。当人们不理解决策是如何做出的时,他们会感到不舒服。例如,银行使用基于线性数学的简单算法,这种算法很容易解释,也很容易解释它们是如何从输入到输出的。
因此,人工智能还不能在人们之间建立信任。而看起来这个问题唯一的解决办法就是让人们看到这个技术真的管用。然而,现实却有些不同。这表明,通过更准确的预测,有很多机会让事情变得更好。
这就产生了政府越权的问题。假设,该法规的一部分告诉公民可能有权要求解释在人工智能的帮助下做出的关于他们的决定。

4。一根筋
应该考虑的一个大问题是,大多数人工智能实现都是高度专业化的。我们也把专业化的 AI 称为“应用型 AI”。它的建立只是为了完成一个单一的任务,并不断学习变得越来越好。
它遵循的过程是查看给定的输入和产生的结果。它会查看产生的最佳结果,并记下这些输入值。广义的 AI 则不同,可以跳转到任何类似于人类的任务。然而,未来还没有到来。
这只是意味着人工智能需要接受培训,以确保他们的解决方案不会引发其他问题。具体来说,所有超出他们设计考虑范围的领域。

5。可证明性
从事基于人工智能的产品的组织无法清楚地展示他们的愿景,以及他们在人工智能技术的帮助下取得的成就。人们怀疑这项技术,它是如何做决定的,它的所有决定是否完美!
此外,这种困惑已经包围了人们的头脑。最终,概率,即人工智能预测背后的数学不确定性,仍然是组织的一个不清楚的领域。
他们无法证明人工智能系统的决策过程是正确的。它唯一的补救办法就是让人工智能变得可解释、可证明和透明。组织应该实现可解释的人工智能。
6。数据隐私和安全
大多数人工智能应用程序都基于海量数据来学习和做出智能决策。机器学习系统依赖于通常在本质上是敏感的和个人的数据。
这些系统从数据中学习并自我完善。由于这种系统化的学习,这些洗钱系统很容易出现数据泄露和身份盗窃。欧盟已经实施了《通用数据保护条例》( GDPR ),确保个人数据的完整保护。
这一步是在考虑到客户对越来越多的机器决策越来越了解之后采取的。此外,还有一种被称为联合学习的独特方法,旨在扰乱人工智能范式。
这种联合学习将鼓励数据科学家在不影响用户数据安全和保密的情况下创建 AI。
7。算法偏差
人工智能系统的一个大问题是,它们的好坏取决于它们接受训练的数据量。不良数据通常与民族、社区、性别或种族偏见有关。
专有算法被用来找出诸如谁批准保释,谁的贷款被批准等事情。如果隐藏在做出关键决策的算法中的偏见未被发现,可能会导致不道德和不公平的结果。
在未来,这种偏见将会更加突出,因为许多人工智能系统将继续被训练来利用坏数据。因此,从事人工智能工作的组织面前的迫切需要是用无偏见的数据训练这些系统,并创建可以容易解释的算法。
8。数据稀缺
事实上,组织现在比以往任何时候都可以访问更多的数据。但是,适用于 AI 应用学习的数据集真的很少。然而,最强大的人工智能机器是那些经过监督学习训练的机器。
这种训练需要带标签的数据。标记的数据是有组织的,以使机器可以理解学习。关于标记数据的另一个问题是它有一个限制。未来自动创造越来越难的算法只会使问题恶化。
尽管如此,还是有一线希望。随着时间的推移,组织正在投资于设计方法,并专注于如何创建人工智能模型,尽管标记数据很少。
更多关于人工智能风险的信息
这里有一个 youtube 视频,你可以查看一下,以便快速了解商业中人工智能的几个风险。这段 YouTube 视频解释了人工智能的十大可能风险:
<iframe width=”560" height=”315" src=”https://www.youtube.com/embed/1oeoosMrJz4" frameborder=”0" allow=”accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture” allowfullscreen></iframe>
===================================
人工智能在商业中的机遇
是的,在商业中实施人工智能存在风险和挑战。但是,就像一枚硬币的两面一样,人工智能也给企业带来了一些机会。由于与人工智能相关的机会,许多企业雇佣专门的印度开发人员来开发他们自己的基于人工智能的应用程序。让我们一个一个来看看。
1.营销中的人工智能
这是每个小企业的梦想,以最大限度地提高其营销预算,并集中在高成就的营销战略。此外,每个企业都想了解哪些营销活动能带来最高的投资回报。
但是需要花费大量时间来监控和分析所有媒体渠道的数据。这里,AI 营销解决方案的作用就来了!
Acquisio 等人工智能平台可以轻松帮助管理各种渠道的营销业务,如谷歌 Adwords、脸书和必应。
该机器学习层在情感分析算法的帮助下分析实时活动数据,并建议产生最佳结果的营销活动分布。
它自动进行常规投标并监控整体营销支出,以便企业主可以减少跟踪营销活动所花费的时间,并关注其他重要领域。
2.利用人工智能技术追踪竞争对手
跟踪你的竞争对手在做什么总是至关重要的。不幸的是,大多数企业主由于繁忙的日程安排而无法回顾比赛。在这里,人工智能的作用就出现了。
还有蜡笔之类的各种竞争分析工具。他们借助网站、社交媒体和应用程序等不同渠道追踪竞争对手。此外,他们为企业主提供了密切关注竞争对手的营销计划的任何变化,如价格变化,微妙的信息修改和公关活动。
3.轻松处理大数据
小企业主愿意利用大量在线和离线信息来做出明智的、数据驱动的决策,从而推动业务增长,这并不奇怪。
人工智能驱动的商业工具最有趣的地方在于,它们可以适用于每一个数据生成工作流,并提供非常适用且可操作的深入见解。
像 Monkey Learn 这样的人工智能商业工具可以整合和分析各种渠道的数据,并实现省时的分析和报告,如 Google Sheets、CSV 等中的情感分析。
4.人工智能集成客户支持解决方案
自动聊天系统允许小型企业扩大他们的客户服务工作,并腾出资源用于更困难的客户互动。
像 DigitalGenius 或 ChattyPeople 这样的人工智能客户服务解决方案建议或自动回答客户提出的问题,对帮助单进行分类,并将询问或消息导向适当的部门。
当你在客户支持中使用人工智能时,平均处理时间会大大减少。此外,它增强了客户服务团队的整体响应能力。
5.CRMs 中的人工智能
如果您找到一种方法将您的 CRM 提升到一个新的水平,并获得有价值的见解来帮助管理与现有和潜在客户的互动,您会有什么感觉!
嵌入了人工智能功能的 CRM 平台可以进行实时数据分析,以便根据您公司独特的业务流程和客户数据提供预测和建议。
==================================
结论
因此,我们发现人工智能的时代可能终于到来了,但还需要更多的进展。不同公司和行业对人工智能的采用也不均衡。
此外,我们研究了企业在实施人工智能时面临的所有机遇和挑战。现在,我希望你清楚你是否应该在你的公司 从事人工智能(AI)开发。
如果你希望创建基于人工智能的应用程序,你可以联系一家知名的网络开发公司,让你的梦想成真。有许多公司提供基于人工智能的软件来提高客户服务部门的效率。
人工智能,我们在紧张的电网中最好的朋友
人工智能和其他转型技术,是不断增长的分布式能源资源(DERs)所必需的,特别是在飙升和更大的风暴背景下

Photo by Nathalie SPEHNER on Unsplash
在当今多元化的能源世界中,越来越多的个人消费资产增加了电网的复杂性。在不断变化的气候中越来越多地产生巨大风暴的情况下,这一点甚至更加重要,例如今年早些时候在菲律宾、台湾和中国造成 93 亿美元损失(已知第五大太平洋台风)和 90 多人死亡的台风利奇马,或者最近在大西洋发生的可怕的 5 级飓风多里安。巴哈马旅游和航空部总干事 Joy Jibrilu 详细介绍了飓风 Dorian 造成的破坏,以及巴哈马需要采取的措施,特别是在基础设施方面。(来源 https://www.youtube.com/watch?v=c_8sLpTQq_EMSBC)
这看起来和我们两年前在波多黎各看到的太相似了,波多黎各遭受了 5 级飓风玛丽亚的严重破坏。损失累计达 920 亿美元,是美国历史上损失第三大的热带气旋。玛丽亚造成的停电被认为是美国历史上最大的停电,也是世界历史上第二大的停电。

Source: DOE, National Academies, NERC
CosmiQ Works 开发了一种有趣的数据融合绘图方法,并首次对波多黎各电力和基础设施的恢复情况进行了独立的遥感评估。
飓风后波多黎各电力和基础设施恢复的遥感时间序列评估…
通过分析全岛观察到的亮度下降水平,这家 IQT 实验室能够确定截至 2018 年 5 月 31 日,13.9%的人仍然缺乏电力,13.2%的基础设施已经失去。

分布式与集中式
拥有太阳能发电、风力涡轮机和电动汽车的分散式系统为脱碳的未来提供了希望,但也为公用事业公司和消费者带来了挑战,但它们需要妥善规划和运营才能生存,或者至少在这样一场灾难性的灾难发生后及时重启。
能源电网的转型、新服务的出现、新参与者: prosummers 、consumer ' actors以及自我消费等新模式,改变了电网本身的运营要求和约束,并对日益庞大的数据进行管理,如果不求助于人工智能,这些数据将无法工作。
能源市场正在脱离只有集中式发电厂的模式,进入分布式电网和点对点市场的时代。能源生态系统的多种元素正以令人眩晕的速度进化。我们看到一个非常复杂的市场正在形成,配电公司需要允许越来越多的可再生能源和灵活的能源资产安装在电表后面,同时保持稳定的本地电网。与此同时,安装了这种灵活资产的专业消费者希望优化他们的能源流动,以实现投资价值的最大化。
一个日益严峻的挑战是分散发电的出现和加速发展,在这种情况下,私人用户,无论大小,都可以利用风能和太阳能等可再生能源发电和使用自己的电力。这使得供求关系变得复杂,迫使公用事业公司从私人用户那里购买多余的能源,这些用户生产的电力多于他们消耗的电力,然后将这些电力送回电网。自 2010 年以来,太阳能的使用大幅增加,预计这一指数趋势将随着光伏电池(利用阳光发电的设备)的出现而继续,从而降低成本并提高效率。

Source: Novacab Multiple DERs with Hybrid Energy Storage and Artificial Intelligence.
扩大分散生产
当前系统的设计一般没有考虑到能源的多样化,特别是可再生资源的增加。例如,在许多美国管辖区,当需求超过供应时,公用事业公司提前几分钟启动以化石燃料为基础的发电厂,即所谓的“最先进”发电厂,以避免连锁灾难。这个过程是最昂贵的,但也是这些公司最赚钱的部分。这导致消费者支付更高的电费,并增加向大气中排放的温室气体。随着未来几年能源需求的大幅增长,这些问题将会加剧。为了避免 IES 的这些非最佳(至少)运行模式,AI 可以启用自动学习算法,结合这些复杂网络上的数据和实时气象数据(来自卫星、地面观测和气候模型),充分利用这些算法来预测可再生能源产生的电力,如风、太阳和海洋。
结合大数据、云和物联网(IoT)等其他技术,人工智能储能可以通过提高电源的可访问性,在电网管理中发挥重要作用。可再生能源。

Source: Smart Phases Power Generation with and Artificial Intelligence.
(深度)学习曲线
人工智能可以极大地帮助管理电力消耗,以便大型公用事业公司或更小的电网可以在价格昂贵时出售,在价格便宜时购买。在这种情况下,机器学习,尤其是深度学习算法可以以一种非常有趣的方式应用于能源领域。随着最终用户成为“专业消费者”,智能设备激增,大数据可供分析,可再生能源不断增长,商业模式和法规也在不断调整。
将所有这些结合在一起有助于达到能量流动和/或储存的最佳时机、方向和容量。通过人工智能算法来确定何时生产、消耗、储存和交易能源,以实现最终用户、服务提供商和电网运营商的成本效益。随着成千上万个新兴能源社区的出现,这一愿景可能会变得更加清晰,甚至可能成为未来 5 到 10 年的主要现实。
越来越多的可持续社区、公用事业和运营商目前正处于模拟阶段或试点项目的第一阶段。预计到 2025 年,物联网(IoT)将需要超过 100 亿个智能设备和超过 1 亿辆电动汽车(公交车、卡车和乘用车),超过 10 亿个专业消费者(私人和工业)拥有自己的“生产”千瓦时(太阳能或其他),这将是维持可靠性、安全供电和电网稳定性的巨大挑战。
对 DERs 在未来几年的发展有多种预期。但这些变化需要全新的运营范式,没有比现实生活更好的技术考验了。涉及人工智能、储能和可再生能源的新模式已经在各大洲的许多国家得到不同程度的应用,更不用说澳大利亚、加利福尼亚、德国、中国、哥斯达黎加、以色列和世界上许多其他国家了。
当我们面对一个对人类干预做出反应的气候时,尤其如此。人工智能与可再生能源和能源储存的正确使用不仅可以帮助我们减少能源消耗对二氧化碳排放的影响,还可以适应日益增长的灾害影响(与人为气候变化有关)。
设想 AI 和 DER 将成为变革性技术,很快成为我们制作新网格模型的最好朋友,这并不需要通灵。

Photo by James Peacock on Unsplash
本文是由荷兰的夏羽·比洛多撰写的关于人工智能和能量储存的系列文章的延伸。工程博士,对外经济合作中心。创始人&首席技术官、Smart Phases ( Novacab )、加拿大工程师协会会员以及能源中心和媒体的专家撰稿人。
人工智能和古生物学:利用深度学习搜索微体化石
如何用语义分割分析从钻机探头获得的沉积岩微断层图像
在这篇文章中,我们展示了一种基于深度学习的方法,用于通过 MicroCT 获取的钻孔岩心样本中的全自动微体化石识别和提取。对于鉴定,我们开发了一种深度学习方法,这种方法导致了高正确微化石鉴定率(98% IoU)。为了验证这一点,我们使用了微体古生物领域的专家们得出的基本事实。我们还提出了第一个完全注释的 MicroCT 获得的公开可用的微体化石数据集。
人工智能和古生物学
古生物图像的计算分析的应用范围从动物、植物和微生物进化的研究到给定时代生物栖息地的模拟。
但是现在古生物学不再仅仅是一门纯科学了。它还可以应用于解决经济活动领域中的问题,例如石油勘探,其中有几个因素需要分析,以便识别勘探地点的潜力并最小化与石油开采过程相关的费用。一个因素是要探索的环境的特征。这种分析可以通过几种方式进行:使用探针、提取样品进行岩石物理成分评估或与其他钻井的测井记录进行对比。
当我们研究样本提取时,在沉积岩中发现的化石对于这种岩石的表征至关重要。在这里,计算机断层扫描(CT)是重要的,因为它保存样本,并使其可用于几次分析。基于由 CT 生成的 3D 图像,可以执行若干分析和模拟,并且可以自动执行当前手动且费力执行的过程。
想象一下下面的场景:一个古生物学家收到一个含有微化石的岩石样本进行分析。人工分离微生物化石的整个过程需要很长时间,并且在这个过程之后,岩石样品被破坏。在此之后,古生物学家将使用显微镜对物理隔离的微化石进行分析,并对每个隔离的化石进行人工分类。

A few microfossils manually extracted from our carbonatic rocks and photographed with a Z-stack microscope
现在让我们假设这位古生物学家工作的公司获得了一种基于人工智能的断层图像分析软件,专门用于微化石分析。该软件在最少或根本没有监督的情况下,自动从岩石样品中进行微生物化石鉴定和提取。古生物学家现在可以加载他的断层扫描样本,选择特定的管道,并让程序在夜间执行,只让古生物学家评估获得的结果并对每个提取的微化石进行分类。

The before & after of microfossil analysis…
基于深度学习的微体化石识别和分类
你可以通过深度学习采用语义分割来执行上述工作流。让我们看看如何…
我们采用了一个扫描的碳酸盐岩样品,该样品是从巴西东北海岸的 Sergipe 盆地第四纪沉积物处采集的钻机探针获得的。为了训练我们的语义分割网络,一个微体学家团队为这个岩石样本生成了一个地面真相,对整个 MicroCT 体积进行手动分割和分类。用于数字化样品的扫描仪是 Versa XRM-500 (ZEISS/XRadia),体积大小为 956×1004×983 体素。
完整的数据集,加上额外的解释和专家注释的手动分割图像的基本事实可以在这里找到:【http://www.lapix.ufsc.br/microfossil-segmentation。

Digitalized rock sample
我们采用的深度学习 API 是 fast.ai/PyTorch 框架,通过超参数优化(HYPO),我们用 UNET + ResNet34(或 ResNet50)获得了 0.98 的 IoU。不同种类的海波在这里很重要,我们将在下面解释它们。
海波#1:可变分辨率。MicroCT 数据提出了一个挑战:由我们使用的数据集大小和 UNET 体系结构强加的内存需求将极大地限制我们训练集的批量大小。为了克服这一限制,并能够最初处理更大的批量,以更快的速度训练网络,我们采用了一种 逐步渐进提高图像分辨率的训练策略 。
为此目的,我们在三个周期中进行训练:我们以原始 MicroCT 图像分辨率的 1/4 开始我们的迁移学习;训练了模型;将数据集的大小调整为原始分辨率的 1/2;再次训练,之后,我们采用全 CT 体积分辨率进行最终微调训练周期。这一战略的大纲最初是由杰瑞米·霍华德于 2018 年 5 月在这个讨论帖子中提出的,后来在https://course.fast.ai/videos/?lesson=1的一次 CNN 演讲中作为非正式交流提出的。下图显示了我们对逐步提高分辨率培训工作流程的解释。

The step-wise progressive improving image resolution training strategy
HYPO #2:差异学习率:另一个微调我们模型的策略是差异学习率 (DLR)策略,也是由杰瑞米·霍华德在同一个 fast.ai 课程系列的讲座中非正式提出的。
当执行迁移学习并随后进行微调时,在第一层中,被调整的预训练模型将从迁移学习中使用的新数据集学习一般的低级特征。不管图像背景如何,这些低级特征很可能与原始数据集的特征相似。因此,没有必要在这些第一层采用高学习率。随着信息在网络中的深入,特征组合变得更加复杂和特定于数据集,并且与应用环境的联系更加直接。为了使网络更好地适应特定于上下文的特征,需要在更深的层中有更高的学习速率。
HYPO # 3: Fit1Cycle :我们采用 Leslie N. Smith 最初开发的 fit1cycle 方法训练网络;
- https://docs.fast.ai/callbacks.one_cycle.html
- 神经网络超参数的训练方法:第 1 部分——学习速率、批量大小、动量和权重衰减—https://arxiv.org/abs/1803.09820
- 超收敛:使用大学习率快速训练残差网络—https://arxiv.org/abs/1708.07120
- 有一篇来自 Nachiket Tanksale 的非常有趣的文章,名为寻找好的学习率和一个周期政策,其中讨论了周期学习率和动量。
这种方法快,它将允许我们在第一个迁移学习阶段只使用 5 个时期。
如果你想了解更多关于 fastai 图书馆新的学习 API 的信息,请看这本由 Sylvain Gugger 准备的笔记本。
动手吧!碳酸盐岩中微体化石的分段
以下是从碳酸盐岩中获得的微 CT 钻孔岩心中的微化石样品的语义分段代码。这是我们作为笔记本发布的代码(https://github . com/awangenh/Segmentation-of-micro fossils-in-Carbonatic-Rocks),它假设您要么使用 Google Colab,要么安装了最新版本的 PyTorch 和 fast.ai。你还需要一个至少有 11 GB 内存的 GPU。
初始化,导入 Python 库和 fast.ai 框架
# Notebook Initializations
%reload_ext autoreload
%autoreload 2
%matplotlib inline# Imports
from fastai.vision import *
from fastai.utils.show_install import *
from fastai.callbacks.hooks import *
from pathlib import Path
torch.backends.cudnn.benchmark=True# Show if everything is OK
show_install()
定义存储数据的位置并检查它
如果你将 Google Colab 与 Google Drive 一起使用,请这样做
from google.colab import drive
drive.mount('/content/gdrive')path = Path('gdrive/My Drive/Colab Notebooks/DL/')
path.ls()
如果您没有从 Google Drive 导入数据
# Adapt this to match your environment...
path = Path('myPath/')
path.ls()
定义数据变量,如 path_lbl(标签所在的本地)和 path_img(存储训练和验证数据的本地)
# Initialize path_lbl (local where your labels are)
path_lbl = path/'train_masks_labels'
# Initialize path_img (local where your train and validation data are stored)
path_img = path/'train'# Check how many files are there
fnames = get_image_files(path_img)
fnames[:3]
len(fnames)# Check if label names match the size
lbl_names = get_image_files(path_lbl)
lbl_names[:3]
len(lbl_names)
显示单个 MicroCT 切片
img_f = fnames[0]
img = open_image(img_f)
img.show(figsize=(5,5))

加载属于该特定切片的遮罩
# Scan the filenames with a simple lambda function
get_y_fn = lambda x: path_lbl/f'{x.stem}_GT{x.suffix}'
显示地面真相遮罩
mask = open_mask(get_y_fn(img_f))
mask.show(figsize=(5,5), alpha=1)
src_size = np.array(mask.shape[1:])

加载您的标签
codes = np.loadtxt(path/'codes.txt', dtype=str); codes
IOU 指标、初始数据分割和模型
# Refer to your labels as numbers
name2id = {v:k for k,v in enumerate(codes)}
定义您的误差指标
并集上的交集(IOU)度量和保存预测定义的函数
def iou_metric(input, target):
target = target.squeeze(1)
mask = target != 0
return (input.argmax(dim=1)[mask]==target[mask]).float().mean()def save_preds(dl):
i=0
names = dl.dataset.items for b in dl:
preds = learn.pred_batch(batch=b, reconstruct=True)
for o in preds:
o.save(path_gen/names[i].name)
i += 1
更多的定义
重量衰减、度量、模型的定义,如果我们使用 imageNet 重量
wd=1e-2
metrics = iou_metric# Use a deep network
used_model=models.resnet101# We will employ transfer learning from ImageNet weights...
useImageNet=True
培训周期和验证
这里是我们开始训练部分的地方。首先,我们采用 256x252(1/4)分辨率。对于 512 (1/2)和 1024(全)分辨率,执行完全相同的顺序。
周期#1: 256x256
# Define the batch size and the resolution employedsize = src_size//4
size[1]= size[1]+1
bs=5
对数据应用转换,如分辨率更改和数据扩充…
normalizePar=Noneif useImageNet:
normalizePar=imagenet_statsdata = (src.transform(get_transforms(), size=size, tfm_y=True)
.databunch(bs=bs)
.normalize(normalizePar))
用所选的数据、度量和重量衰减加载模型
learn = unet_learner(data, used_model, metrics=metrics, wd=wd)
找到最合适的学习速度
lr_find(learn)
learn.recorder.plot()

手动 检查上面代码生成的图形后设置学习率…
# Adjust this LR accordingly to what you identified above...
lr=2e-4
学习!
learn.fit_one_cycle(5, slice(lr), pct_start=0.9)
保存重量并加载它以继续训练并执行一些数据发布…
learn.save('stage1-256x252')
保留一个装载代码,以备不时之需:
learn.load('stage1-256x252')
解冻网络以学习内部权重——在第 1 周期微调
learn.unfreeze()
采用差异学习率(DLR)并培训学习者
lrs = slice(lr/400,lr/4)learn.fit_one_cycle(10, lrs, pct_start=0.8)
保存重量和加载它继续训练和执行一些未使用的内存释放…
# Save the fine-tuned network @ Cycle #1
learn.save('stage2-256x252')# Release Memory
del data
del learn
torch.cuda.empty_cache()
# Collect Garbage
gc.collect()
周期#2: 512x512
我们将如上执行相同的操作,只是分辨率为 512x512
# Set the new Size for the MicroCT Slices
size = src_size//2
bs=1# Adapt ImageNet Parameters to our Image Characteristics
normalizePar=None
if useImageNet:
normalizePar=imagenet_stats
data = (src.transform(get_transforms(), size=size, tfm_y=True)
.databunch(bs=bs)
.normalize(normalizePar))# Create a new Network for 512x512 input images
learn = unet_learner(data, used_model, metrics=metrics, wd=wd)# Load our fine-tuned low resolution network weights learned on Cycle #1...
learn.load('stage2-256x252')# Find the best learning rate for this network instance
lr_find(learn)
learn.recorder.plot()# Manually set the new learning rate (LOOK at the graph above!)
lr=1e-3
使用这个新的中等分辨率网络执行迁移学习阶段。我们将再次使用莱斯利·n·史密斯开发的 fit1cycle 方法。
learn.fit_one_cycle(5, slice(lr), pct_start=0.8)# Save and Load...
learn.save('stage1-512x502')learn.load('stage1-512x502')# Unfreeze for fine-tuning...
learn.unfreeze()
采用差异学习率(DLR)并培训学习者
# Prepare for varying learning rates...
lrs = slice(1e-6,lr/10)# Fine-tune for 10 epochs
learn.fit_one_cycle(10, lrs)# SAVE STAGE2 OF CYCLE #2...
learn.save('stage2-512x502')# Flush garbage..
del data
del learn
torch.cuda.empty_cache()
gc.collect()
周期# 3:1024 x 1024-全分辨率培训
现在我们将再次执行与上面相同的操作,只是分辨率为 1024x1024。我们将采用较短的迁移学习阶段。下面的大多数单元格都没有被注释,因为我们在重复步骤,只是有一些不同的参数…
# Original image size
size = src_size
# Batch size of one!
bs=1normalizePar=None
if useImageNet:
normalizePar=imagenet_stats
data = (src.transform(get_transforms(), size=size, tfm_y=True)
.databunch(bs=bs)
.normalize(normalizePar))learn = unet_learner(data, used_model, metrics=metrics, wd=wd)learn.load('stage2-512x502')lr_find(learn)
learn.recorder.plot()# Adapt it to your values
lr=2e-5# Transfer learning stage
learn.fit_one_cycle(3, slice(lr), pct_start=0.8)# Save stage 1 of Cycle #3
learn.save('stage1-1024x1004')learn.load('stage1-1024x1004')# Prepare for the final fine-tuning
learn.unfreeze()# Prepare for varying learning rates
lrs = slice(1e-6,lr/10)# Fine-tune for 10 epochs
learn.fit_one_cycle(10, lrs)# Save stage 2 of Cycle #3
learn.save('stage2-1024x1004')
显示一些预测结果
learn.show_results(rows=2, figsize=(10,10))

保存所有预测结果
name_gen = 'image_gen'
path_gen = path/name_gen
path_gen.mkdir(exist_ok=True)save_preds(data.fix_dl)
如果培训中途中断,我该怎么办?
如果你的训练被打断了,你会怎么做?这可能是因为你在 Google Colab 笔记本上达到了连续 12 小时的“免费”操作时间,或者因为你的计算机由于某种原因停止了。我住在巴西,电力短缺是常事…
fit_one_cycle 方法适用于变化的自适应学习速率,遵循速率先增大后减小的曲线。如果你中断第 10 个纪元的训练,比如说 20 个纪元,然后重新开始 9 个以上的纪元,你将不会得到与不间断训练 20 个纪元相同的结果。您必须能够记录您停止的位置,然后从该点重新开始训练周期,并使用该周期部分的正确超参数。

A fit_one_cycle training session divided into three subsessions. Image by PPW@GitHub
你要做的第一件事就是保存你的网络:
learn.fit_one_cycle(20, max_lr=slice(1e-5,1e-6),
callbacks=[SaveModelCallback(learn, every='epoch',
monitor='accuracy', name='saved_net')])
这将使您的网络在每个纪元都被保存,您提供的名称后面跟着_ #纪元。所以在纪元#3,文件 saved_net_3.pth 将被写入。您可以在完成以下操作后加载此文件:
- 重新创建了数据束和
- 用它重新实例化了网络。
重装完后。pth 文件,你可以重新开始你的训练,只是你要告诉 fit_one_cycle 考虑 20 个历元,但是要从历元#4 开始训练。
要了解这是如何做到的,请看这里:
你是怎么做到的?
fast.ai 中的 fit_one_cycle 方法已经开发出来,允许您告诉它从周期的哪个部分恢复中断的训练。恢复培训的代码如下所示:
# Create a new net if training was interrupted and you had to
# restart your Colab sessionlearn = cnn_learner(data, models.<your_model_here>,
metrics=[accuracy, error_rate])# If you're resuming, only indicating the epoch from which to
# resume, indicated by ***start_epoch=<epoch#>*** will load the last
# saved .pth, it is not necessary to explicitly reload the last
# epoch, you only should **NOT** change the name given in
# name=<callback_save_file>:
# when resuming fast.ai will try to reload
# ***<callback_save_file>_<previous_epoch>.pth***
# Unfreeze the network
learn50.unfreeze()# Use start_epoch=<some_epoch> to resume training...
learn.fit_one_cycle(20, max_lr=slice(1e-5,1e-6),
***start_epoch=<next_epoch#>***,
callbacks=[SaveModelCallback(learn,
every='epoch', monitor='accuracy',
***name=<callback_save_file>***)])
fast.ai 会告诉你“载入<回调 _ 保存 _ 文件> _ <上一个 _ 纪元# > ”,恢复训练。
您可以在此查看 fit_one_cycle 方法支持的所有参数:
想看看结果吗?
(A)显示了由微 CT 切片中的网络识别和分割的微化石。(B)显示了化石的细节,( C)显示了人工提取后化石的显微断层图像。(D)显示同一样本的显微镜照片。

我们学到了什么?
卷积神经网络和深度学习可以成功地应用于解决海洋微体古生物中的问题,这是一个你不会指望人工智能会找到应用的领域。可以训练语义分割网络,以在沉积岩的微断层图像中可靠地找到微化石,这些图像是从石油勘探钻机获得的钻孔岩心中获得的。一个现成的以 ResNet34 为网络的 UNet 框架就足以解决这个问题。
想了解更多?
我们还测试了其他网络,并发布了一些新的出版物:
- 访问我们的项目页面:【http://www.lapix.ufsc.br/pesquisas/microfosseis/
- 访问我们的数据集页面:http://www.lapix.ufsc.br/microfossil-segmentation/
- 看看我们的新论文使用海洋微体古生物的深度学习方法进行自动微体化石识别和分割
- 查看我们关于 bioRxiv 的稍旧的论文,了解我们使用不同型号获得的结果

采用一种新的 HYPO 策略:一种 逐步渐进提高图像分辨率的训练策略 ,可以解决微断层体积中的大量数据所带来的存储问题。这使得我们最初可以大批量工作,训练得更快更好。
引用这篇文章
@misc{von wangenheim_ramos de carvalho_2019,
title={Artificial Intelligence & Paleontology: Use Deep Learning to search for Microfossils},
url={https://towardsdatascience.com/artificial-intelligence-paleontology-use-deep-learning-to-search-for-microfossils-18760bb30880},
publisher={Towards Data Science},
author={von Wangenheim, Aldo Eduardo and Ramos de Carvalho, Luis Eduardo},
year={2019},
month={Jun}
}
电影工业的人工智能视角

Canvas | Edgar Valdes | May 2019
“慢慢地,我学会了人类的方式:如何毁灭,如何仇恨,如何贬低,如何羞辱。在我主人的脚下,我学到了人类最高的技能,这是其他生物所没有的技能:我终于学会了如何撒谎。”―《尼克·迪尔,弗兰肯斯坦》,根据玛丽·雪莱的小说改编
文学、电影和人工智能
玛丽·雪莱关于现代普罗米修斯的历史穿越了时间和空间,影响了每一代人。在个人层面,弗兰肯斯坦的经典故事和它的时代性吸引了人们对未知事物的恐惧,科学和技术就是例证。一个扮演好角色的科学家,一个创造出能够超越人类极限的超级智慧生物的人。现在这种恐惧变得比 200 年前更加重要。雪莱对人工智能的思考类似于我们今天对人工智能(AI)的阐述。也许在未来,人工智能可以拥有超越人类能力的自我意识甚至直觉。在机器学习正式发展的一个多世纪之前,雪莱出版的书(1823 年)中反复出现了同样的问题。弗兰肯斯坦的创造物学会了人类语言,他是机器智能的生动化身:他,或者说它,学习算法。
电影工业的信息流
对于大多数人工智能算法来说,信息处理和由此产生的知识是任何行业最渴望完成的任务。这就是所谓的“隐藏”的揭示,这反过来增加了(自动或人工)预测的能力。从前面可以清楚地看到,信息具有核心作用,因此产生大数据的行业适合从人工智能中受益更多。电影业的收入约为 1360 亿美元。一部电影的观众数量可以达到惊人的1.78 亿(这个数字比的 8000 万网飞和 Bitorrent 用户翻了一番)。此外,该行业每年还会产生超过 2000 部高水平的作品。所有这些(可能)是信息流的最大来源之一。还没有关于如何对电影业产生的数据和信息进行精确测量的正式研究。也许这是无法计算的,但让我们来打个比方:如果 YouTube 每天有 40 亿次访问,每次访问平均 40 分钟,以每分钟 250 MB 的速度,我们得到的数字是4pb 的数据。
看看这些数字,电影作为知识的生产者,是巨大的。我们可能会问自己:我们如何理解所有电影生成的信息,它如何影响现实?要回答这个问题,必须考虑现象的两个根本方面:一是通过数据产生信息;第二,这些信息如何转化为知识。
电影体验及其与情报学的关系
想想通过电影制作创造知识的经历。对于每一个场景,一次发生的所有动作的摘录被捕获。有人可能认为抽象是自发产生的,但事实并非如此。场景的重建是一种主观的、语境化的表达。在这种情况下,通过人和他的环境的信息生产是审美现象的一部分。信息和紧急情况是以非常密切的方式直观地联系在一起的特征。让我们将这种突现的现象称为知识。
在继续之前,让我们在理论上休息一下,说明信息来自对数据的解释。但是我们如何衡量我们是否以最好的方式诠释了一个信息呢?在数学上,一个代码(例如二进制代码)和一个条件概率被分配给构成给定消息的每个元素。这是信息论的开端。直觉上,可以理解的是,随着可预测性的增加,消息带来的惊喜(称为熵)必然会减少。这种信息流动本身就是一种现象,与全球气候或股票市场动态等突发现象密切相关。
电影工业中的人工智能透视
在生成艺术(如电影制作)中,要考虑的关键因素是,把它看作一个突现的发生器,并赞美这样一个问题:电影工业是如何塑造社会结构的?因此,为了理解电影工业中的信息,我们可能需要定位电影生产链中使用数字使能器(软件平台或数据模型)的所有信息点。与此同时,我们可以使用“最小加速框架”来推断人工智能可以在电影业的经济生态系统中以积极的方式影响哪里。

在电影设计后期制作的各个设计阶段,深度学习和图像识别可以用于学习和应用决策,例如识别可能不存在的场景的错误元素。这样的原因可能来自生产的错误(一个中世纪庆典上的星巴克杯子),或者甚至可以进一步推断使用人工智能众包的“对共同事物的理解”。

在早期,在制作、选角或采购阶段,服装和服饰部门还可以使用监督学习的组合,在演员选角之前或同时为整部电影创建和确定正确的设计服装。

走向消费、展示、销售阶段,AI 在其他行业已经展现出超强的市场份额预测能力。综合因果模型在产生足够数据的行业中有更好的预测性能。更重要的是,展示地点的孪生模型的图形表示也可以成为电影和物联网之间的桥梁。

此外,由于电影是最具社会性的信息生成者,由此产生的大数据可以用来提高人工智能的能力,以改善其他行业的“情绪分析”。基于偏好模型的监督学习可以提高这种情感分析的性能,使 fil 行业将其消费范围转变为人工智能技术的生产实体。
趋势和结论
现在让我们来谈谈电影业的趋势。一方面,我们在生产链中有标准化的流程。如果我们分析近年来该学院的科学和技术奖项,我们会看到一个明显的和日益增长的使用数字工具的趋势。在这个奖项的 40 年中,数字图像技术获得了 86 项认可,仅次于声音(166 项)、电影实验室(109 项)和特殊摄影(93 项);远远超过了物理设备的奖项,如相机的支撑系统和起重机,甚至一些对行业来说似乎更自然的奖项,如镜头、滤镜和照明技术。强调这一点,尽管特定的人工智能技术没有获得奖励,但提名的技术非常清楚地指向这一点。像皮克斯的 Presto 动画系统、副作用软件公司的胡迪尼和 ILM 面部表情捕捉解决系统这样的平台,都有意将人工智能元素纳入其核心。
另一方面,增强现实和沉浸式现实技术正在开发中,这对于电影业和创作者来说可能非常有趣,但我们现在将把所有这些都忽略掉。你会在其他一些帖子里看到。创新趋势的重要性来自于电影制作的创作过程。人工智能正在成为一种理想的工具,可以扩展人类的能力,达到创造的新境界,甚至产生新的前沿故事。像许多其他行业(实际上是所有行业)一样,电影业正意识到使用数字工具可能非常有利。
总之,我们可以问自己无数个因人工智能和电影工业的相互联系而产生的问题,但其中最重要的一个(在作者看来)是:人工智能将如何影响创作过程?我们可以直觉地认为,人机之间的信息互联或交换在新兴现象的创造中开辟了一个新的范例,并且可以成为创造性协作的催化剂。此外,我们还可以在知识现象的扩展中诱导人机甚至机器之间的合作。作者想知道,他是否会需要为电脑创作摇篮曲。
承认
作者要感谢 SAE Mexico
参考
[1] G. Ródenas Cantero,“电影与电影:电影中的音符”,载于《艺术与电影》,M. J .阿卡特兹和 A. Bertinetto 编辑。墨西哥:墨西哥国立自治大学,2016 年,第 401–454 页。
[2]亨利·柏格森。《进化与进化》(1907 年)。巴黎:法国大学出版社,2007 年。
3梅勒妮·米切尔。复杂性:导游。牛津大学出版社,2009 年。
[4]加卡宁、哈里斯;瓦格纳,马克。下一代网络中客户体验管理的人工智能范例:挑战与展望。IEEE 网络,2019。
[5]奥索巴,奥索德;社会模拟的人工智能/机器学习观点:新数据和新挑战。复杂系统的社会行为建模,2019 年,第 443–476 页。
[6]孙,。智能大数据分析:管理视角。智能大数据分析的管理视角。IGI 全球,2019。第 1 至 19 页。
人工智能:彻底改变移动应用行业

在当今竞争激烈的市场,人工智能已经成为商业行业探索和成长的话题。 移动应用领域的潮流引领者不断尝试在他们的移动应用中引入一些新功能。人工智能正在帮助移动应用程序开发者通过一个对用户来说没有麻烦的过程来进行激烈的竞争。 自从这项技术问世以来,这个行业对于零售商和消费者来说都发生了变化。
从一开始,移动应用就深深影响着用户的生活。通过增强用户的指尖,使用它们彻底改变了用户生活的方方面面。同样,支持人工智能的应用对用户与智能设备的交互产生了重大影响。就移动应用行业而言,人工智能的多功能特性开启了一个充满可能性和创新的新世界。人工智能有助于为不同行业构建独特的应用程序,建立与智能应用程序的精致用户交互。
据 Statista 报道,到 2025 年,人工智能的全球市场价值将超过 890 亿美元。在提高用户参与度和业务增长方面,人工智能总是有用的。人工智能解决方案有助于根据用户行为模式提高和理解用户参与度。
AI 将应用革命推向新高度
人工智能对应用行业产生了广泛的多维影响,这导致移动应用开发者在其应用中集成更多的人工智能。从一开始,人工智能就创造了 buzzword 来执行人类预期的认知功能。

人工智能已被证明对无数应用程序非常有用。从任何意义上来说,它都不仅仅是一项智能技术。人工智能用于解决复杂、关键的问题,以便更好地为用户服务。人工智能的这种功能正在帮助行业缩小用户和企业之间的差距。
同样, AI 对 得出关于用户的正确见解以获得期望的输出有极大的帮助。如今,企业正在将人工智能与他们的解决方案集成在一起,以提供一流的以数据为中心的服务。
驱动大量用户信息
修复行为模式问题
分析用户数据模式
深入洞察用户
提供更好的个性化
人工智能赋能的解决方案如何改变营销人员的体验
人工智能有能力改变指挥上繁琐而费时的做法。 人的潜能可以被分析和检查,以便做出更好的决策。因此,这增加了企业潜在的盈利能力。

人工智能解决方案总是试图帮助营销人员为他们的用户提供直观的体验。人工智能应用程序更快、反应更快,让用户和员工保持联系。营销人员拥抱人工智能技术,它已经成为所有移动应用不可分割的一部分。
用例
星巴克综合基于云的数字飞轮方案 由人工智能(AI)支持。这有助于为其用户建议基于用户历史活动的定制例程。
亚马逊围绕人工智能重新定义了其工作流程。 深度学习的 Al 根据他们的购买行为和喜好,理解推荐问题和结果,提供惊人的服务。
这种人工智能授权的解决方案为移动应用程序开发公司提供了许多理由,通过将人工智能技术融入应用程序来开发量身定制的用户体验。
各垂直行业选择人工智能的原因
人工智能解决方案有助于调查市场和用户的历史。整合此类解决方案有助于收集所有数据,并消除任何复杂过程中的最大误差。 在未来几年,预计超过 30%的公司将使用人工智能技术来提高收益率。此外,人工智能解决方案将帮助企业采取更好的营销策略来提高销售率。
原因 1#改善搜索体验:
AI 在搜索用户相关对象的同时改善了用户体验。这项技术增加了一种在搜索时提示用户的新方法。人工智能移动应用程序中 ML 和图像识别的集成将用户体验提升到了一个新的水平。语音识别技术融入系统后,形成了新的趋势。
原因 2#预测营销:
营销人员需要收集、维护和分析大量数据。维护客户信息需要大量的时间。因此,人工智能在这里是为了处理客户数据,从而提高销售额。人工智能应用程序支持研究和分析市场。
外卖
人工智能也被认为是移动应用行业的重要贡献者。这是人工智能在应用程序开发中的许多好处,还有更多的好处。智能手机用户正在享受特殊的人工智能应用程序的特权。
如今,具有机器学习功能的人工智能预计将为其用户提供令人惊叹的设备体验。移动应用开发公司正在利用人工智能的全部优势来留住他们的客户。随着时间的推移,人工智能设施将变得更便宜,任何规模的企业都将找到连接世界的方式。
人工智能 vs 人类:为什么奴隶会很快成为主人

(上面的涂鸦是对人工智能统治地球时代人类命运的未来主义描绘。它描绘了一个巨大的机器人,他已经承担了君主制,现在携带地球作为它的球体,并用它的权杖摆姿势。它咧嘴笑着,因为创造它的人类现在处于它的支配之下。与之相邻的是一个无助的、穿着西装的人类(象征着一个无良商人,他曾经盲目地赋予人工智能机器人权力,并在追求财富的过程中不知所措)。他现在伸出舌头,流下眼泪,后悔自己的轻率行为。
涂鸦提供:Ujjaini Basu)
“人工智能”(AI)一词是由约翰·麦卡锡创造的,用来定义计算机系统的理论和发展,这些系统能够执行通常需要人类智能的任务,如视觉感知、语音识别、决策和语言之间的翻译。人工智能的早期发展在很大程度上可以归功于这样一种理论,即所有的智能行为都是反馈机制的结果,而反馈机制可能会被机器模拟。
这就引出了一个问题,“机器会思考吗?”他的肯定回答导致了人工智能基本原理的形成。
在这一启示之后,人类看到了自我学习系统的诞生,这些系统可以有效地解决需要收集大量信息的问题,这些信息太过繁琐,人类无法处理。这一发展吸引了商人和行业专家,使人工智能成为他们工作领域不可或缺的一部分,因为他们利用它来减少体力劳动密集型工作,从而降低成本并获得巨额利润。但是当人类开始屈服于暴食和贪婪时,天堂里出现了麻烦。他们不知道界限在哪里。
赋予人工智能机器人像人类一样思考和行为的能力可能会被证明是对社会有害的,因为人类的思维往往受到情绪的影响,由经验引发,很少是无私的。人们可能会反驳这种反对意见,敦促人们把机器人仅仅看作另一个人,但问题在于它的力量和特殊能力,这可能是它对人类的优势。考虑以下摘自《独立报》2017 年出版物的摘录,以便更好地理解这个问题:
脸书放弃了一项实验,因为两个人工智能程序似乎在用一种只有它们自己懂的奇怪语言交谈。这两个聊天机器人开始创造自己的英语变化,使他们更容易工作——但这对理应照顾他们的人类来说仍然是神秘的。这些机器人被指示如何在它们之间进行谈判,并在谈判过程中提高他们的交易能力。但研究人员称,他们没有被告知使用易懂的英语,这让他们可以创造自己的“速记”。事实上,用这种奇怪的语言进行的一些谈判甚至最终成功地结束了谈判,同时完全用这种奇怪的语言进行谈判。
在网飞和 chill 的迷人时代,我敦促每个人暂停片刻,回到 20 世纪 80 年代,见证一部美国科幻情景喜剧《小奇迹》(Small Wonder),以其主角语音输入儿童身份(V.I.C.I)命名。该节目讲述了一个机器人工程师家庭的故事,他秘密地创造了一个模仿 10 岁人类女孩的机器人,然后试图冒充他的养女。这个机器人是为了帮助残疾儿童而发明的,它的发明者把它带回家,这样它就可以在家庭环境中成长。经过仔细观察,这部看似滑稽的情景喜剧展现了人类行为的一些重要特征。最引人注目的是,它凸显了人类通过过度依赖机器来找到简单方法完成工作的倾向,即使这意味着瘫痪自己的能力,就像发明家的十几岁的儿子如何偷偷摸摸地使用机器人完成作业一样。该节目还强调,人类容易幻灭,因为他们很容易在情感上与机器人联系在一起,就像发明家家庭的所有成员尽管知道真相,但仍将机器人视为真正的人一样。该节目几十年前揭示的内容直到今天仍然适用。
对娱乐机器人需求的上升不仅表明了人类对人类的快速退缩,也突显了人类对人工智能驱动的机器的屈服。阅读《太阳报》2018 年出版的一篇可怕的摘录,了解情况的严重性:
心理学专家警告说,更多地接触人工智能性爱机器人可能会加剧性瘾。虽然它们的创造者声称它们可以证明是婚姻挣扎、孤独或残疾男性的福音,但专家们并不相信它们对整个社会的好处。比尔查德博士是马里波恩心理治疗中心的临床主任,他说,对于有饮酒问题的人来说,它们和酒精的作用是一样的。
这恰恰显示了无良的人类是如何利用人类同胞的弱点,双方都在下意识地挖掘自己的坟墓!
世界卫生组织报告称,目前有超过 3 亿人患有抑郁症,但其中近一半人没有得到所需的帮助。在这样一个艰难的时代,当人类这个“高等哺乳动物”被期望互相帮助,互相治愈,互相提升的时候,机器人被专门用来提供陪伴。陪伴机器人的目标市场包括单身儿童和老年人。又一个证明人类屈服于人工智能的事实!
虽然创造 bandi coot——一个旨在彻底消除地球表面人工清扫的下水道和下水道清洁机器人系统——的努力值得赞赏和鼓励,但创造 Sophia——一个模仿令人向往的奥黛丽·赫本(Audrey Hepburn)的人形机器人,最终成为第一个获得国家公民身份的同类机器人——的努力不值得大肆宣传。在创造了索菲亚的汉森机器人公司的官方网站上,这个人形机器人敦促观众:
“把我想象成我们对人工智能未来梦想的化身,以及高级人工智能和机器人研究的框架,以及探索服务和娱乐应用中人类机器人体验的代理人。”
它还补充说:
“随着我的科学发展如此之快,甚至我许多最疯狂的虚构梦想也可能很快成为现实。”
这听起来真让人毛骨悚然!
人工智能正在逐渐消除人类的触觉。不仅仅是劳动密集型工作,像新闻业这样的创造性工作也因为其延伸性而受到威胁。人类将机器人编程为像人类一样的行为,然后让它们幻灭,这种恶性循环最终会使人类机械化。随着机器人自主程度的提高,机器人生育机器人可能不是一个遥远的现象。随着他们数量的增加,他们的影响也将增加,这为奴隶很快超过其主人铺平了道路。
人工智能与机器学习——底线
人工智能是一个总称,指的是任何能做一些智能事情的计算机程序。你能区分这两个术语吗?

Credit: pixabay
机器学习(ML)和人工智能(AI)目前正在大肆宣传。尽管这两个术语被随意地、可互换地使用,但它们并不相同。
你可以把它们想象成一套嵌套的俄罗斯娃娃:AI 是最大的“套娃”,ML 是最小的——也就是说 ML 是 AI
(ML ⊆ AI)的子集。

Russian dolls
在谷歌上快速搜索人工智能和人工智能的区别会产生数百万个结果,但是,嘿…它们冗长而复杂…有时该领域的科学家仍然在争论这两者的最佳定义,并且可能会继续争论下去!
在这里,我试图用简单的术语来说明它们之间的区别,同时保持文本简洁明了!👏
所以:让我们在不到 2 分钟的时间内,探索一下它们的不同之处…
人工智能
人工智能致力于模仿人类的决策过程,并以类似人类的方式执行智力任务。任务包括:
- 问题解决
- 理解语言
- 识别声音
- 识别图像
- 学问
人工智能的起源来自图灵测试——一组类似宣言的特征,定义了一个系统如何表现出与人类同等(或无法区分)的智能行为。
它可以指任何东西,从下棋的计算机程序,到像苹果的语音识别系统,从 T21 的无人驾驶汽车,到在日本银行提供礼宾服务的机器人。
机器学习
ML 是 AI 的一个子领域。这里的关键概念是,机器摄取大型数据集,为自己“学习”,当接触到新数据时,它们可以做出决策。简单地说:与用特定指令手工编写计算机程序来完成任务不同,ML 允许程序学会自己识别模式并做出预测。
一些现实生活中的例子是:
- 谷歌 Gmail 的智能回复:代表你回复邮件,给出不同的回复建议。
- 谷歌地图:通过在位置数据的帮助下分析交通速度,建议最快的路线以减少旅行时间。
- Paypal :对客户数据使用 ML 算法来对抗欺诈。
- 网飞:推出了一款支持智能娱乐的电视剧建议引擎。
而且只是为了好玩;看过《硅谷》这一集吗?
🌭
简单地
我希望这篇文章已经帮助一些人理解了人工智能和人工智能之间的区别,并指出那些将术语混为一谈的资源。
人工智能是一个比人工智能更宽泛的概念,人工智能指的是使用计算机模仿人类的认知功能。
当机器以“智能”的方式执行基于算法的任务时,那就是 AI。
和...相对
ML 是人工智能的一个子集,专注于机器接收一组数据的能力,并随着它们了解更多关于它们正在处理的信息而进化。
这里有一个小奖励:

AI vs ML
感谢阅读!
我定期在 媒体 上写关于技术&的数据——如果你想阅读我未来的帖子,只需“关注”我!
人工智能会给每次交互带来更多的人情味。

Image credit: Blake Wisz
人工智能将为每一次互动带来更多的人情味
人工智能和机器学习已经成为客户关系中不可避免的趋势。人工智能正在解锁和重新定义各种可能性,以吸引当今最苛刻的消费者;满足他们不断增长的期望,发展情感联系,提供令人满意的客户体验。Juniper Research 发表的一份报告预测,到 2022 年,零售业在人工智能上的支出将达到每年 73 亿美元。优步和 Lyft 等著名应用改变了消费者对出租车的预期。传统出租车的体验,现在看来已经过时,失效。然而,人工智能的到来对人类联系的丧失敲响了警钟。
T2 最近发布的一份报告称,沃尔玛雇佣的科技人才比谷歌和脸书还多。技能需求的这一显著转变表明了零售业正在发生怎样的变化。它需要彻底改造,从吸引突破性的技术人才开始,以便继续竞争。
面向服务的智能
人工智能(AI)因为它的能力而到处出现。品牌正在利用它来改善客户服务,并比以往任何时候都更快地从客户那里获得答案。在美国,Capital One 银行让客户通过亚马逊 Alexa 管理他们的账户和交易。
2019 年,电子商务网站了解消费者的需求比以往任何时候都更重要。
通过开发技术,电子商务可以更好地了解他们的客户是谁,他们的期望是什么,以及如何实现他们的目标。收集到的数据将有助于预测消费者需求,推荐产品,并为每位消费者提供独特的购物体验,同时提供个性化的客户服务,并在整个客户旅程中增加市场销售额。讽刺的是,AI 的使用将使客户体验更加人性化,赋予机器人自己的效用。
借助人工智能,在线商店可以更好地了解他们的客户,并增加他们在所有渠道的营销活动的结果。这种由人工智能优化的方法不仅节省了时间,还发现了新的机会来提高他们网站的性能和增加客户忠诚度。
店内体验不容忽视
沃尔玛刚刚在纽约开设了他的人工智能承诺店。这个被称为 IRL(智能零售实验室)的单位是一个 50,000 平方英尺的商店,它使用人工智能来确保农产品和肉类等易腐物品的库存位置和新鲜度。
根据彭博的一份报告,亚马逊的无收银 Go 商店可能是一项价值 40 亿美元的业务,并计划到 2021 年开设多达 3000 家亚马逊 Go 商店。你再也不用排队了,当你带着你的商品离开商店时,你的亚马逊账户会被扣款,你会收到一张收据。亚马逊正在使用人工智能和从多个传感器提取的数据的结合,以确保客户只为他们拿起的东西付费。你走进一家商店,里面只有你的同行评价最高的产品。信任的程度将远远高于充斥着未经其他消费者认可的产品的普通商店。
人工智能还可以检测问题并确定解决方案。
在线网站可以通过利用数据来简化和减少操作任务。这要归功于允许它们对某些行为自动做出反应的技术。借助人工智能,商家网站可以更快地检测异常并解决问题。始终将客户服务放在首位。
如今,品牌面临的挑战是考虑技术的能力并为此做好准备,同时意识到人工智能、数据收集和隐私可能带来的问题。
关于作者
Carts Guru 的创始人兼首席技术官 Maxime Pruvost 在他 19 岁时创建了他的第一家创业公司,当时他正在法国学习计算机科学。到他毕业时,他已经成功地联合创立了两家公司。马克西姆三年前从法国搬到旧金山,在硅谷的中心发展他的新公司 Carts Guru。Maxime 热衷于制造产品,提出新想法并将其转化为现实,成功地为电子商务市场安排了高可用性 SaaS 产品的运输。
使用 NumPy 的人工神经网络实现和水果 360 图像数据集的分类
本教程使用 NumPy 从头开始在 Python 中构建人工神经网络,以便对 Fruits360 数据集进行图像分类应用。本教程中使用的所有内容(即图像和源代码),而不是 color Fruits360 图像,都是我的书的专有权利,该书被称为“Ahmed Fawzy Gad‘使用深度学习的实用计算机视觉应用与 CNN’。2018 年 12 月,新闻,978–1–4842–4167–7。这本书在斯普林格书店有售,链接:【https://springer.com/us/book/9781484241660。

本教程中使用的源代码可以在我的 GitHub 页面上找到:https://github.com/ahmedfgad/NumPyANN
书中使用的示例是关于使用人工神经网络(ANN)对 Fruits360 图像数据集进行分类。该示例没有假设读者既没有提取特征也没有实现 ANN,因为它讨论了什么是适合使用的特征集以及如何从头开始在 NumPy 中实现 ANN。Fruits360 数据集包含 60 类水果,如苹果、番石榴、鳄梨、香蕉、樱桃、枣、猕猴桃、桃子等。为了使事情更简单,它只对 4 个选定的类有效,它们是苹果,柠檬,芒果和覆盆子。每个类有大约 491 幅图像用于训练,另外 162 幅用于测试。图像大小为 100x100 像素。
特征提取
这本书从选择合适的特征集开始,以达到最高的分类精度。根据下面显示的 4 个选定类别的样本图像,它们的颜色似乎有所不同。这就是为什么颜色特征适合在这个任务中使用。

RGB 颜色空间不会将颜色信息与其他类型的信息(如照明)隔离开来。因此,如果 RGB 用于表示图像,则 3 个通道将参与计算。因此,最好使用将颜色信息隔离到单一通道的颜色空间,如 HSV。这种情况下的颜色通道是色调通道(H)。下图显示了之前提供的 4 个样本的色调通道。我们可以注意到每个图像的色调值与其他图像的不同。

色调通道尺寸仍然是 100x100。如果将整个通道应用于 ANN,那么输入层将有 10,000 个神经元。网络还是很庞大的。为了减少使用的数据量,我们可以使用直方图来表示色调通道。直方图将具有 360 个面元,反映色调值的可能值的数量。以下是 4 幅样本图像的直方图。使用色调通道的 360 格直方图,似乎每个水果都投票给直方图的一些特定格。与使用 RGB 颜色空间中的任何通道相比,不同类别之间的重叠更少。例如,苹果直方图的区间范围是 0 到 10,而芒果直方图的区间范围是 90 到 110。每个类别之间的余量使得更容易减少分类中的模糊性,从而提高预测精度。

下面是从 4 幅图像中计算色调通道直方图的代码。
**import** numpy
**import** skimage.io, skimage.color
**import** matplotlib.pyplot
raspberry = skimage.io.imread(fname=**"raspberry.jpg"**, as_grey=**False**)
apple = skimage.io.imread(fname=**"apple.jpg"**, as_grey=**False**)
mango = skimage.io.imread(fname=**"mango.jpg"**, as_grey=**False**)
lemon = skimage.io.imread(fname=**"lemon.jpg"**, as_grey=**False**)
apple_hsv = skimage.color.rgb2hsv(rgb=apple)
mango_hsv = skimage.color.rgb2hsv(rgb=mango)
raspberry_hsv = skimage.color.rgb2hsv(rgb=raspberry)
lemon_hsv = skimage.color.rgb2hsv(rgb=lemon)
fruits = [**"apple"**, **"raspberry"**, **"mango"**, **"lemon"**]
hsv_fruits_data = [apple_hsv, raspberry_hsv, mango_hsv, lemon_hsv]
idx = 0
**for** hsv_fruit_data **in** hsv_fruits_data:
fruit = fruits[idx]
hist = numpy.histogram(a=hsv_fruit_data[:, :, 0], bins=360)
matplotlib.pyplot.bar(left=numpy.arange(360), height=hist[0])
matplotlib.pyplot.savefig(fruit+**"-hue-histogram.jpg"**, bbox_inches=**"tight"**)
matplotlib.pyplot.close(**"all"**)
idx = idx + 1
通过循环使用 4 个图像类中的所有图像,我们可以从所有图像中提取特征。接下来的代码会这样做。根据 4 个类中的图像数量(1962)和从每个图像中提取的特征向量长度(360),创建一个 NumPy 个零数组,并保存在 dataset_features 变量中。为了存储每个图像的类标签,创建了另一个名为输出的 NumPy 数组。苹果的分类标签是 0,柠檬是 1,芒果是 2,覆盆子是 3。代码期望它运行在一个根目录下,这个根目录下有 4 个文件夹,它们是根据名为水果的列表中列出的水果名称命名的。它遍历所有文件夹中的所有图像,从每个图像中提取色调直方图,为每个图像分配一个类别标签,最后使用 pickle 库保存提取的特征和类别标签。您还可以使用 NumPy 来保存生成的 NumPy 数组,而不是 pickle。
**import** numpy
**import** skimage.io, skimage.color, skimage.feature
**import** os
**import** pickle
fruits = [**"apple"**, **"raspberry"**, **"mango"**, **"lemon"**] *#492+490+490+490=1,962* dataset_features = numpy.zeros(shape=(1962, 360))
outputs = numpy.zeros(shape=(1962))
idx = 0
class_label = 0
**for** fruit_dir **in** fruits:
curr_dir = os.path.join(os.path.sep, fruit_dir)
all_imgs = os.listdir(os.getcwd()+curr_dir)
**for** img_file **in** all_imgs:
fruit_data = skimage.io.imread(fname=os.getcwd()+curr_dir+img_file, as_grey=**False**)
fruit_data_hsv = skimage.color.rgb2hsv(rgb=fruit_data)
hist = numpy.histogram(a=fruit_data_hsv[:, :, 0], bins=360)
dataset_features[idx, :] = hist[0]
outputs[idx] = class_label
idx = idx + 1
class_label = class_label + 1
**with** open(**"dataset_features.pkl"**, **"wb"**) **as** f:
pickle.dump(**"dataset_features.pkl"**, f)
**with** open(**"outputs.pkl"**, **"wb"**) **as** f:
pickle.dump(outputs, f)
目前,每个图像使用 360 个元素的特征向量来表示。这样的元素被过滤,以便仅保留用于区分 4 个类别的最相关的元素。减少的特征向量长度是 102 而不是 360。使用更少的元素有助于比以前做更快的训练。 dataset_features 变量形状将是 1962x102 。你可以在书中读到更多关于减少特征向量长度的内容。
至此,训练数据(特征和类标签)都准备好了。接下来是使用 NumPy 实现 ANN。
安实施
下图显示了目标人工神经网络结构。有一个输入层有 102 个输入,2 个隐藏层有 150 和 60 个神经元,一个输出层有 4 个输出(每个水果类一个)。

任一层的输入向量乘以(矩阵乘法)连接到下一层的权重矩阵,以产生输出向量。这种输出向量再次乘以连接其层和下一层的权重矩阵。该过程一直持续到到达输出层。下图是矩阵乘法的总结。

大小为 1×102 的输入向量要乘以大小为 102×150 的第一个隐藏层的权重矩阵。记住这是矩阵乘法。因此,输出数组形状为 1x150。这样的输出然后被用作第二隐藏层的输入,在那里它被乘以大小为 150x60 的权重矩阵。结果大小为 1x60。最后,这样的输出乘以第二隐藏层和大小为 60×4 的输出层之间的权重。结果最后大小是 1x4。这种结果向量中的每个元素都引用一个输出类。根据具有最高分数的类来标记输入样本。
下面列出了实现这种乘法的 Python 代码。
**import** numpy
**import** pickle
**def** sigmoid(inpt):
**return** 1.0 / (1 + numpy.exp(-1 * inpt))
f = open(**"dataset_features.pkl"**, **"rb"**)
data_inputs2 = pickle.load(f)
f.close()
features_STDs = numpy.std(a=data_inputs2, axis=0)
data_inputs = data_inputs2[:, features_STDs > 50]
f = open(**"outputs.pkl"**, **"rb"**)
data_outputs = pickle.load(f)
f.close()
HL1_neurons = 150
input_HL1_weights = numpy.random.uniform(low=-0.1, high=0.1, size=(data_inputs.shape[1], HL1_neurons))HL2_neurons = 60
HL1_HL2_weights = numpy.random.uniform(low=-0.1, high=0.1, size=(HL1_neurons, HL2_neurons))output_neurons = 4
HL2_output_weights = numpy.random.uniform(low=-0.1, high=0.1, size=(HL2_neurons, output_neurons))H1_outputs = numpy.matmul(a=data_inputs[0, :], b=input_HL1_weights)
H1_outputs = sigmoid(H1_outputs)
H2_outputs = numpy.matmul(a=H1_outputs, b=HL1_HL2_weights)
H2_outputs = sigmoid(H2_outputs)
out_otuputs = numpy.matmul(a=H2_outputs, b=HL2_output_weights)
predicted_label = numpy.where(out_otuputs == numpy.max(out_otuputs))[0][0]
print(**"Predicted class : "**, predicted_label)
读取之前保存的要素及其输出标注并过滤要素后,定义图层的权重矩阵。它们被随机赋予从-0.1 到 0.1 的值。例如,变量“ input_HL1_weights ”保存输入层和第一个隐藏层之间的权重矩阵。这种矩阵的大小根据特征元素的数量和隐藏层中神经元的数量来定义。
创建权重矩阵后,下一步是应用矩阵乘法。例如,变量“H1 _ 输出”保存将给定样本的特征向量乘以输入层和第一个隐藏层之间的权重矩阵的输出。
通常,激活函数被应用于每个隐藏层的输出,以创建输入和输出之间的非线性关系。例如,矩阵乘法的输出被应用于 sigmoid 激活函数。
生成输出层输出后,进行预测。预测的类标签被保存到变量“预测 _ 标签”中。对每个输入样本重复这些步骤。下面给出了适用于所有示例的完整代码。
**import** numpy
**import** pickle
**def** sigmoid(inpt):
**return** 1.0 / (1 + numpy.exp(-1 * inpt))
**def** relu(inpt):
result = inpt
result[inpt < 0] = 0
**return** result
**def** update_weights(weights, learning_rate):
new_weights = weights - learning_rate * weights
**return** new_weights
**def** train_network(num_iterations, weights, data_inputs, data_outputs, learning_rate, activation=**"relu"**):
**for** iteration **in** range(num_iterations):
print(**"Itreation "**, iteration)
**for** sample_idx **in** range(data_inputs.shape[0]):
r1 = data_inputs[sample_idx, :]
**for** idx **in** range(len(weights) - 1):
curr_weights = weights[idx]
r1 = numpy.matmul(a=r1, b=curr_weights)
**if** activation == **"relu"**:
r1 = relu(r1)
**elif** activation == **"sigmoid"**:
r1 = sigmoid(r1) curr_weights = weights[-1]
r1 = numpy.matmul(a=r1, b=curr_weights)
predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]
desired_label = data_outputs[sample_idx]
**if** predicted_label != desired_label:
weights = update_weights(weights, learning_rate=0.001)
**return** weights
**def** predict_outputs(weights, data_inputs, activation=**"relu"**):
predictions = numpy.zeros(shape=(data_inputs.shape[0]))
**for** sample_idx **in** range(data_inputs.shape[0]):
r1 = data_inputs[sample_idx, :]
**for** curr_weights **in** weights:
r1 = numpy.matmul(a=r1, b=curr_weights)
**if** activation == **"relu"**:
r1 = relu(r1)
**elif** activation == **"sigmoid"**:
r1 = sigmoid(r1)
predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]
predictions[sample_idx] = predicted_label
**return** predictions
f = open(**"dataset_features.pkl"**, **"rb"**)
data_inputs2 = pickle.load(f)
f.close()features_STDs = numpy.std(a=data_inputs2, axis=0)
data_inputs = data_inputs2[:, features_STDs > 50]
f = open(**"outputs.pkl"**, **"rb"**)
data_outputs = pickle.load(f)
f.close()HL1_neurons = 150
input_HL1_weights = numpy.random.uniform(low=-0.1, high=0.1,size=(data_inputs.shape[1], HL1_neurons))
HL2_neurons = 60
HL1_HL2_weights = numpy.random.uniform(low=-0.1, high=0.1,size=(HL1_neurons,HL2_neurons))
output_neurons = 4
HL2_output_weights = numpy.random.uniform(low=-0.1, high=0.1,size=(HL2_neurons,output_neurons))
weights = numpy.array([input_HL1_weights,
HL1_HL2_weights,
HL2_output_weights])
weights = train_network(num_iterations=10,
weights=weights,
data_inputs=data_inputs,
data_outputs=data_outputs,
learning_rate=0.01,
activation=**"relu"**)
predictions = predict_outputs(weights, data_inputs)
num_flase = numpy.where(predictions != data_outputs)[0]
print(**"num_flase "**, num_flase.size)
“权重”变量包含整个网络的所有权重。基于每个权重矩阵的大小,网络结构被动态地指定。比如“ input_HL1_weights ”变量的大小是 102x80,那么我们可以推导出第一个隐层有 80 个神经元。
“ train_network ”是核心函数,它通过循环所有样本来训练网络。对于每个示例,都应用了清单 3–6 中讨论的步骤。它接受训练迭代次数、特征、输出标签、权重、学习率和激活函数。激活功能有两个选项,ReLU 或 sigmoid。ReLU 是一个阈值函数,只要它大于零,就返回相同的输入。否则,它返回零。
如果网络对给定的样本做出了错误的预测,则使用“ update_weights 函数更新权重。不使用优化算法来更新权重。简单地根据学习率更新权重。准确率不超过 45%。为了获得更好的精度,使用优化算法来更新权重。例如,您可以在 scikit-learn 库的 ANN 实现中找到梯度下降技术。
在我的书中,你可以找到一个使用遗传算法(GA)优化技术优化人工神经网络权重的指南,这种技术可以提高分类的准确性。您可以从我准备的以下资源中了解有关 GA 的更多信息:
遗传算法优化简介
https://www . LinkedIn . com/pulse/introduction-优化-遗传-算法-ahmed-gad/
https://www . kdnugges . com/2018/03/introduction-optimization-with-genetic-algorithm . html
https://www.springer.com/us/book/9781484241660
遗传算法(GA)优化—分步示例
https://www . slide share . net/AhmedGadFCIT/genetic-algorithm-ga-optimization-step by step-example
遗传算法在 Python 中的实现
https://www . LinkedIn . com/pulse/genetic-algorithm-implementation-python-Ahmed-gad/
https://www . kdnugges . com/2018/07/genetic-algorithm-implementation-python . html
https://towardsdatascience . com/genetic-algorithm-implementation-in-python-5ab 67 bb 124 a 6
遗传算法在 Python 中的实现。通过创建一个……
github.com](https://github.com/ahmedfgad/GeneticAlgorithmPython)
联系作者
领英:https://linkedin.com/in/ahmedfgad/
KD nuggets:https://kdnuggets.com/author/ahmed-gad
YouTube:https://youtube.com/AhmedGadFCIT
走向 https://towardsdatascience.com/@ahmedfgad:
完全初学者的人工神经网络
简单明了的神经网络解释(附图片!)
机器学习推动了我们当今互动的许多技术,从谷歌上的搜索结果到肿瘤诊断道路上的 ETA 预测,机器学习的应用无所不在。尽管它对我们的日常生活非常重要,但我们大多数人都不知道这东西是如何工作的。我们可能听说过“人工神经网络”这个术语,但它真正的含义是什么?它是一个和人类一样思考的机器人吗?是苹果公司的超级计算机吗?还是只是一个花哨的数学方程式?
机器学习实际上涵盖了从简单的决策树(类似于你在商业管理入门课程中制作的决策树)到神经网络(模仿大脑功能的复杂算法)的所有内容。本文将深入研究神经网络,因为它们是目前大多数令人印象深刻的机器学习背后的东西。
首先,一个说明性的例子
为了理解什么是机器学习,考虑试图根据地面的土壤含量预测树的高度的任务。现在,因为这是我们正在谈论的机器学习,让我们假设我们可以在这项任务中获得一些非常好的数据:来自世界各地的成千上万的土壤样本。

你可以对土壤含量进行多种测量。像水分含量、铁含量、颗粒大小、酸度等。它们都对一棵树的健康和它长得有多高有一些影响。假设我们检查了世界上成千上万的树(当然都是同一种类),并收集了它们的土壤含量和树高的数据。我们刚刚为机器学习创建了一个完美的数据集,既有特征(土壤含量),也有标签(高度)。我们的目标是使用这些特征来预测标签。

这看起来绝对是一项艰巨的任务。即使土壤含量和树高之间有关系,也不可能做出准确的预测,对吗?嗯,机器学习并不总是完全类似于我们的大脑是如何工作的,即使神经网络是从大脑模仿而来的。重要的是要记住,这些模型不会像我们人类一样胡乱猜测。相反,他们提出了精确的方程来决定他们的预测。让我们先把问题简化一点。
很容易想象像水分这样的单一特征会对树高产生重大影响。太干燥,树不会生长,但太潮湿,根可能腐烂。我们可以根据这个单一的测量值建立一个方程,但是它不会很精确,因为有更多的因素影响一棵树的生长。

看到上面的假设关系不是一个伟大的估计了吗?这条线遵循点的总体趋势,但是如果你用它来预测你的身高,那么大多数时候你都是错的。考虑这样一种情况,那里有充足的水分,但土壤酸性太强。树不会长得很好,但是我们的模型只考虑了水分,所以会假设会。然而,如果我们考虑这两种测量,我们可能会得到更准确的预测。也就是说,我们只能说,当湿度和酸度都处于良好水平时,树会非常高,但如果其中一个或两个都处于不良水平,我们可以预测树会很矮。
那么如果我们考虑更多的因素呢?我们可以通过将这些关系合并到一个方程中,同时观察湿度和酸度的影响。

非常好。现在我们有了一个更复杂的方程来描述树的高度,它考虑了两个特征(测量)。现在,我们可以组合更多的特征,形成一个更复杂的方程。为了清楚起见,我将最终的组合方程称为我们的“T2”模型“T3”。它模拟了特征如何影响身高。将这样简单的方程组合成一个多维模型非常简单,我们可以非常快速地创建一个非常复杂的模型。但是,对于你可以对其中一个简单方程(为高度和湿度之间的关系选择一个略有不同的方程)做出的每一个调整,现在我们必须尝试数以千计甚至数百万计的更多“模型”,每个模型都略有不同。这些模型中的一个可能很擅长对土壤含量和高度之间的关系进行建模,但是大多数可能都不擅长。

这就是机器学习的用武之地。它将创建一个由许多更简单的方程组成的模型,然后测试它的效果如何。基于它的误差(也就是说,预测有多错误),它会稍微调整更简单的方程,并测试它的效果如何。当它调整更简单的方程时,它只是改变了上图中的一个图形,使其看起来略有不同。它可以将图表向右或上下移动,也可以略微拉长波峰或增加波谷的大小。通过一个类似于进化的过程,它将达到最好的——或者至少是一个好的——解决方案。事实上,这就是为什么它被称为“机器学习”。机器自己学习模式,无需人类告诉它甚至像“水分对树木有益”这样简单的信息。
如果你对机器学习模型如何挑选下一个方程组合感到好奇,你应该进一步阅读关于模型训练的内容。具体来说,需要掌握的概念是随机梯度下降和反向传播。
如果你曾经在大学学习过傅立叶级数,把它们看作神经网络的类比是很有用的。在学校里,我们学习到你可以用简单正弦波的组合产生复杂的波,比如方波。嗯,我们也可以用类似的方式从许多简单的方程中创建一个机器学习模型。
神经网络的组成部分是什么?
神经网络是根据生物大脑的内部工作原理专门设计的。这些模型通过将输入特征传递给被称为感知器(想想“神经元”)的几层来模仿相互连接的神经元的功能,每一层都使用一组功能来转换输入。本节将解释感知器的组成部分,感知器是神经网络的最小组成部分。

The structure of a perceptron
感知器(如上)通常由三个主要的数学运算组成:标量乘法、求和,然后使用称为激活函数的不同方程进行转换。由于感知器代表大脑中的单个神经元,我们可以将许多感知器放在一起代表一个大脑。这就是所谓的神经网络,稍后会详细介绍。
投入
输入仅仅是我们特征的度量。对于单个土壤样本,这将是每个测量值的数组。例如,我们可能有以下输入:

代表 58%的水分、1.3 毫米的颗粒大小和每千克土壤重量 11 微克铁。这些输入将被感知器修改。
砝码
权重代表标量乘法。他们的工作是评估每个输入的重要性,以及方向性。比如铁多了对身高贡献大还是小?它让树变高了还是变矮了?获得正确的权重是一项非常困难的任务,有许多不同的值可以尝试。
假设我们在-10 到 10 的范围内以 0.1 的增量尝试了所有三个权重的值。显示最佳结果的权重是 w0 = 0.2,w1 = 9.6,w3 = -0.9。请注意,这些权重的总和不一定是 100。重要的是它们之间的比较规模和方向。如果我们将这些权重乘以之前的输入,我们会得到以下结果:

这些值将被传递到感知器的下一个组件,传递函数。
转移函数
传递函数不同于其它元件,因为它需要多个输入。传递函数的工作是将多个输入组合成一个输出值,以便可以应用激活函数。这通常通过对传递函数的所有输入进行简单求和来实现。

就其本身而言,这个标量值应该代表土壤含量的一些信息。该值已经使用权重将每个度量的重要性考虑在内。现在它是一个我们可以实际使用的单一值。你几乎可以认为这是土壤成分的任意加权指数。如果我们有很多这样的指数,用它们来预测树的高度可能会变得更容易。然而,在该值作为最终输出被发送出感知器之前,使用激活函数对其进行转换。
激活功能
激活函数将把传递函数中的数字转换成一个使输入戏剧化的值。通常,激活函数将是非线性的。如果你在大学没有学过线性代数,你可能会认为非线性意味着函数看起来不像一条线,但它比这要复杂一点。现在,请记住,将非线性引入感知器有助于避免输出随输入线性变化,因此可以增加模型的复杂性。下面是两个常见的激活功能。

ReLU 是一个简单的函数,它将零和输入进行比较并选择最大值。这意味着任何负输入都是零,而正输入不受影响。在负值没有多大意义的情况下,或者在无需进行任何繁重计算的情况下移除线性时,这很有用。

sigmoid 函数很好地将值分成不同的阈值。这对于诸如 z 得分之类的值尤其有用,在这种情况下,需要仔细查看接近平均值(零)的值,因为接近平均值的微小变化可能会显著影响特定行为,但在远离平均值的情况下,数据可能会出现同样的情况。例如,如果土壤有很多很多的水分,少量增加水分可能不会影响树的高度,但如果水分水平非常平均,那么去除少量水分可能会显著影响树的高度。它强调值的差异,如果它们更接近于零。
当你想到激活函数时,只要记住它是一个非线性函数,使输入更具戏剧性。也就是说,接近零的输入通常比远离零的输入受影响更大。它基本上迫使像 4 和 4.1 这样的值更加接近,而像 0 和 0.1 这样的值变得更加分散。这样做的目的是让我们选择更明确的决策界限。例如,如果我们试图将一棵树分为“高”、“中”或“矮”,值 5 或-5 显然代表高和矮。但是像 1.5 这样的值呢?围绕这些数字,可能更难确定决策界限,因此通过戏剧化输入,可能更容易划分三个类别。
我们在训练模型之前选择一个激活函数,所以函数本身总是相同的。这不是我们在测试数千种不同型号时切换的参数之一。那只发生在重物上。ReLU 激活函数的输出将是:

偏见
到目前为止,我忽略了感知器的一个成功要素。它是 1 的附加输入。在每个感知器中,这个输入总是保持不变。就像其他输入一样,它被乘以一个权重,其目的是允许激活函数之前的值上下移动,而与输入本身无关。这使得其他权重(实际输入的权重,而不是偏差的权重)更加具体,因为它们不必试图将总和平衡为 0 左右。

更具体地说,偏差可能会将左图这样的图形移动到右图这样的图形:

就是这样!我们现在已经建立了一个单一的感知机。我们现在已经创建了一个模拟大脑神经元的模型。我们也明白,虽然这听起来很奇怪,但这实际上意味着我们可以通过改变一些权重来创建复杂的多维方程。如您所见,组件非常简单。事实上,它们可以用下面的等式来概括:

从现在开始,我将用一个绿色圆圈来表示这个等式(即一个感知器)。到目前为止,我们看到的所有组件:输入、偏置、权重、传递函数和激活函数都出现在每个单独的绿色圆圈中。当箭头指向这个绿色圆圈时,它表示一个单独的输入节点,当箭头指向绿色圆圈之外时,它表示最终的输出值。

多层感知器
为了表示一个感知器网络,我们只需将一个感知器的输出插入另一个感知器的输入。我们将许多这样的感知器连接成链,从一端流向另一端。这被称为多层感知器(MLP) ,顾名思义,有多层相互连接的感知器。为了简单起见,我们将看一个全连接的 MLPs,其中一层中的每个感知器都连接到下一层中的每个感知器。
你可能想知道“层”是什么。一层只是一排相互连接的而不是的感知器。MLP 中的感知器连接到它的前一层中的每个感知器和后一层中的每个感知器,但不连接到同一层中的任何感知器。让我们来看一个有两个输入值、两个隐藏层和一个输出值的 MLP。假设第一个隐藏层有两个感知器,第二个隐藏层有三个。

这里的感知器都将接受输入(指向圆圈的箭头),执行上一节描述的操作,然后将输出向前推(指向圆圈外的箭头)。这样做很多次,以创建越来越复杂的方程,多次考虑相同的信息,以做出准确的预测。现在,虽然这篇文章的目的是消除神经网络的“魔力”,但很难解释为什么这有助于做出更准确的预测。事实上,我描述的方法通常被称为“黑盒”方法,因为我们不知道为什么它选择的方程是重要的。它目前是一个活跃的研究领域。然而,我们能够理解的是神经网络在做什么。这就像通过每个感知器跟踪权重一样简单。
我们之所以称输入层和输出层之间的层为“隐藏的”,是因为一旦从输入端输入了值,我们就不能很好地了解该值是如何转换的,直到它退出最后一个输出节点。这是因为这些中间值从未用于评估我们的模型的性能(即,获得对样本数据所做预测的误差值)。
真的是这样。将许多这样的感知器组合在一起,有助于我们创建单个感知器可以创建的更复杂的方程。
像这样的 MLP 的输出值能够使用土壤含量测量来预测高度。当然,在每个感知器中选择正确的权重需要大量的计算能力,但这正是“神经网络”所做的。
让我们看看它的实际效果吧!
在这里,我将通过整个神经网络进行两次测量。结构将与我上面展示的网络相同。这将是非常乏味的,但如果你愿意,你可以跟着做。为了简单起见,我将忽略这种偏见。
下面是我将使用的两个特性的值。它们代表 58%的水分和 1.3 毫米的粒度。

我将为每个感知器使用以下(随机)权重和激活函数。回想一下,ReLU 激活函数将负值转换为 0,并且不转换正值:

所以让我们开始吧!前两个感知器都接受两个输入(蓝色),将它们乘以相关权重(黄色),将它们相加(紫色),然后应用 ReLU 函数(绿色):

这些输出成为第三层中每个感知器的输入。所以第二个隐层的每个感知器(有三个)都会用 338.9 和 42 作为输入。这些感知器遵循以下等式:

然而,对于下一层,请注意我们现在有三个而不是两个输入: 89.9 、 16.22 和 0 。所有三个输入都必须包含在最后一个感知器的等式中,因此它将有三个权重(下面黄色部分)。它的等式仍然和其他等式一样简单明了。

作为总结,下面是每个感知器在给定输入的情况下产生的值:

现在你知道了!这个神经网络预测出了一棵高达 165.72 英尺的树!现在,我们必须将预测结果与数据中样本树的实际高度进行比较。计算一些误差值就像计算我们的预测高度和实际高度之间的差值一样简单。然后,我们用稍微不同的权重反复重复这个过程,直到我们找到能够很好地预测许多样本的树高的权重。但是这对于人类来说太费时间了,所以我们需要一台机器来计算最佳重量。
重要提示:
- 权重完全随机以模拟神经网络的起点。这个模型显然没有经过“训练”,因此一旦我们将另一个样本放入其中,它就不会做得很好。我们将使用上面的结果来确定如何改变权重。
- 中间值根本没告诉我们多少。例如,第一个隐藏层中顶部节点的输出是 338.9,但这与神经网络预测的值 166 英尺相差甚远。重要的是不要试图将中间值解释为具有真实世界的意义。这就是为什么我们称这些层为“隐藏层”
就是这样!
感谢阅读:)考虑给文章一点掌声,真的是帮了我大忙!要了解更多关于机器学习的知识,请查看这篇关于计算机视觉背后的模型 CNN 的文章。
实践中的人工神经网络
以及人工神经网络如何重塑了许多行业

Image by Author, inspired by source. Link
T 他的文章是我写的一篇更大的文章的一部分:“人工智能简介——神经网络”如果你想了解更多关于人工神经网络的知识。去看看我的媒体简介,我在那里定期发表关于深度学习、机器学习和 iOS 开发的文章。
现在让我们来学习一下人工神经网络。我们走吧。😄
神经网络适合哪些现实世界的应用?好问题!神经网络对现实世界的商业问题有广泛的适用性。事实上,它们已经成功地应用于许多行业。
由于神经网络最擅长识别数据中的模式或趋势,因此它们非常适合预测或预报需求,包括:
- 销售预测
- 工业过程控制
- 客户研究
- 数据有效性
- 风险管理
- 目标营销
而是给你举一些更具体的例子;人工神经网络也用于以下特定的范例:识别发言者的沟通;肝炎的诊断;从故障软件中恢复电信;汉语多义词的解释;海底探雷;纹理分析;三维物体识别;手写单词识别;还有面部识别。
医学中的神经网络
人工神经网络(ANN)目前是医学中的一个“热门”研究领域,人们相信它们将在未来几年内广泛应用于生物医学系统。目前,这项研究主要是对人体的部分进行建模,并从各种扫描(如心电图、CAT 扫描、超声波扫描等)中识别疾病。).
神经网络在使用扫描识别疾病方面是理想的,因为不需要提供关于如何识别疾病的特定算法。神经网络通过例子学习,因此不需要如何识别疾病的细节。我们需要的是一组能代表这种疾病所有变异的例子。例子的数量没有‘数量’重要。如果系统要可靠有效地运行,需要非常仔细地选择示例。
心血管系统的建模和诊断
神经网络被实验性地用于模拟人类心血管系统。可以通过建立个体心血管系统的模型并将其与从患者处获得的实时生理测量值进行比较来实现诊断。如果定期执行这一程序,可以在早期发现潜在的有害医疗状况,从而使抗击疾病的过程更加容易。
个人心血管系统的模型必须模拟不同身体活动水平下的生理变量(即心率、收缩压和舒张压以及呼吸率)之间的关系。如果一个模型适用于一个人,那么它就成为这个人身体状况的模型。模拟器必须能够在没有专家监督的情况下适应任何个人的特征。这需要一个神经网络。
证明使用人工神经网络技术的另一个原因是人工神经网络提供传感器融合的能力,这种融合是来自几个不同传感器的值的组合。传感器融合使人工神经网络能够学习单个传感器值之间的复杂关系,如果单独分析这些值,这些关系就会丢失。在医学建模和诊断中,这意味着即使一组传感器中的每个传感器可能仅对特定的生理变量敏感,人工神经网络也能够通过融合来自单个生物医学传感器的数据来检测复杂的医学状况。
电子鼻
人工神经网络被实验性地用来实现电子鼻。电子鼻在远程医疗中有几个潜在的应用。远程医疗是通过通信链路进行远距离医疗实践。电子鼻可以识别远程手术环境中的气味。这些识别出的气味将被电子传输到另一个地点,在那里一个门生成系统将重现它们。因为嗅觉对外科医生来说可能是一种重要的感觉,telesmell 将增强远程呈现手术。
商业中的神经网络
商业是一个分流的领域,有几个通用的专业领域,如会计或财务分析。几乎任何神经网络应用程序都适合一个业务领域或财务分析。
将神经网络用于商业目的有一些潜力,包括资源分配和调度。使用神经网络进行数据库挖掘也有很大的潜力,即搜索数据库中显式存储的信息中隐含的模式。这一领域的大部分资助工作都被归类为专有工作。因此,不可能报告正在进行的全部工作。大多数工作是应用神经网络,如 Hopfield-Tank 网络进行优化和调度。
营销
有一个营销应用程序已经与神经网络系统集成在一起。航空公司营销策略师(商标缩写为 AMT)是由包括专家系统在内的各种智能技术构成的计算机系统。前馈神经网络与 AMT 集成,并使用反向传播进行训练,以辅助航空公司座位分配的市场控制。自适应神经方法服从于规则表达。此外,应用程序的环境不断地快速变化,这需要一个不断适应的解决方案。该系统用于监控和推荐每次出发的预订建议。此类信息对航空公司的盈利能力有直接影响,并可为系统用户提供技术优势。[哈奇森&斯蒂芬斯公司,1987 年]
虽然将神经网络应用于这个问题是很重要的,但同样重要的是要看到这种智能技术可以与专家系统和其他方法集成,以形成一个功能系统。神经网络被用来发现各种变量的不确定相互作用的影响。虽然这些相互作用没有被定义,但它们被神经系统用来得出有用的结论。同样值得注意的是,神经网络可以影响底线。
信用评估
由 Robert Hecht-Nielsen 创立的 HNC 公司已经开发了几种神经网络应用。其中之一是信用评分系统,它将现有模型的盈利能力提高了 27%。HNC 神经系统也被应用于抵押贷款筛选。Nestor 公司开发了一个神经网络自动抵押贷款保险承保系统。该系统接受了 5048 个应用程序的培训,其中 2597 个获得了认证。与财产和借款人资格有关的数据。在保守模式下,系统在 97%的情况下同意承保人。在自由模型中,系统同意 84%的情况。这是在 Apollo DN3000 上运行的系统,在大约 1 秒内处理一个案例文件时使用了 250K 内存。
结论
计算世界从神经网络中获益良多。他们通过例子学习的能力使他们非常灵活和强大。此外,不需要设计算法来执行特定的任务;即不需要理解该任务的内部机制。它们也非常适合于实时系统,因为它们的并行结构使它们具有快速的响应和计算时间。
神经网络也有助于其他领域的研究,如神经病学和心理学。它们经常被用于模拟部分生物体和研究大脑的内部机制。
也许神经网络最令人兴奋的方面是有一天可能会产生“有意识的”网络。许多科学家认为意识是一种“机械”属性,而“有意识的”神经网络是一种现实的可能性。
最后,我想说,尽管神经网络有巨大的潜力,但只有当它们与计算、人工智能、模糊逻辑和相关学科相结合时,我们才能充分利用它们。
如果你想联系我,顺便说一句,你知道一个好笑话,你可以在 Twitter 或 Linkedin 上联系我。
感谢阅读!😄 🙌
基于 Python 的遗传算法优化人工神经网络

Image Created by Ahmed Fawzy Gad: https://pixabay.com/illustrations/artificial-neural-network-ann-3501528
在我的 LinkedIn 个人资料中的标题为“使用 NumPy 的人工神经网络实现和 Fruits360 图像数据集的分类”的先前教程中,在此链接处,创建了一个人工神经网络(ANN)用于对 Fruits360 图像数据集的 4 个类别进行分类。本教程中使用的源代码可以在我的 GitHub 页面中找到。
这个教程也可以在 TowardsDataScience 这里获得。
本教程的快速总结是提取特征向量(360 箱色调通道直方图)并通过使用基于标准偏差的过滤技术将其减少到仅 102 个元素。后来,使用 NumPy 从头开始构建 ANN。
人工神经网络没有完全创建,因为只有前向传递准备就绪,但没有用于更新网络权重的后向传递。这就是为什么准确率很低,不超过 45%的原因。这个问题的解决方案是使用优化技术来更新网络权重。本教程使用遗传算法(GA)优化网络权重。
值得一提的是,上一篇和这篇教程都是基于我 2018 年的一本书,该书被引用为“Ahmed Fawzy Gad‘使用深度学习的实用计算机视觉应用与 CNN’。2018 年 12 月,新闻,978–1–4842–4167–7。这本书可以在施普林格书店这个链接买到。你可以在这本书里找到所有的细节。
本教程中使用的源代码可以在我的 GitHub 页面这里获得。
阅读更多关于遗传算法的信息
在开始本教程之前,我建议先阅读一下遗传算法是如何工作的,以及如何使用 NumPy 从头开始在 Python 中实现它,这是基于我在本教程末尾的参考资料一节中列出的链接中找到的以前的教程。
除了使用 Python 实现之外,在了解 GA 如何基于数值示例工作之后,我们可以开始使用 GA 通过更新其权重(参数)来优化 ANN。
将遗传算法与人工神经网络结合使用
GA 为一个给定的问题创建多个解决方案,并通过若干代进化它们。每个解决方案都包含所有可能有助于增强结果的参数。对于人工神经网络,所有层中的权重有助于实现高精度。因此,GA 中的单个解将包含 ANN 中的所有权重。根据前面教程中讨论的网络结构以及下图中给出的网络结构,ANN 有 4 层(1 个输入层、2 个隐藏层和 1 个输出层)。任何层中的任何重量都是同一解决方案的一部分。此类网络的单个解决方案将包含总重量数,等于 102x150+150x60+60x4=24,540。如果总体有 8 个解,每个解有 24,540 个参数,则整个总体的参数总数为 24,540x8=196,320。

看上面的图,网络的参数是矩阵形式,因为这使得人工神经网络的计算更容易。对于每一层,都有一个相关的权重矩阵。只需将输入矩阵乘以给定层的参数矩阵,即可返回该层的输出。遗传算法中的染色体是 1D 向量,因此我们必须将权重矩阵转换成 1D 向量。
因为矩阵乘法是处理 ANN 的一个很好的选择,所以在使用 ANN 时,我们仍将以矩阵形式表示 ANN 参数。因此,当与 ANN 一起工作时使用矩阵形式,而当与 GA 一起工作时使用向量形式。这使得我们需要将矩阵转换成向量,反之亦然。下图总结了将遗传算法与人工神经网络结合使用的步骤。该图被称为主图。

1D 向量的权重矩阵
群体中的每个解决方案将有两个表示。第一个是用于 GA 的 1D 向量,第二个是用于 ANN 的矩阵。因为 3 层有 3 个权重矩阵(2 个隐藏+ 1 个输出),所以将有 3 个向量,每个矩阵一个。因为 GA 中的解被表示为单个 1D 向量,所以这 3 个单独的 1D 向量将被连接成单个 1D 向量。每个解将被表示为长度为 24,540 的向量。下一个 Python 代码创建了一个名为 mat_to_vector() 的函数,该函数将群体中所有解的参数从矩阵转换为向量。
**def** mat_to_vector(mat_pop_weights):
pop_weights_vector = []
**for** sol_idx **in** range(mat_pop_weights.shape[0]):
curr_vector = []
**for** layer_idx **in** range(mat_pop_weights.shape[1]):
vector_weights = numpy.reshape(mat_pop_weights[sol_idx, layer_idx], newshape=(mat_pop_weights[sol_idx, layer_idx].size))
curr_vector.extend(vector_weights)
pop_weights_vector.append(curr_vector)
**return** numpy.array(pop_weights_vector)
该函数接受一个表示所有解的总体的参数,以便遍历这些解并返回它们的向量表示。在函数的开始,创建一个名为 pop_weights_vector 的空列表变量来保存结果(所有解的向量)。对于每一个矩阵形式的解,都有一个内部循环来遍历它的三个矩阵。对于每个矩阵,使用 numpy.reshape() 函数将其转换为向量,该函数接受输入矩阵和矩阵将被整形到的输出大小。变量 curr_vector 接受单个解的所有向量。生成所有向量后,它们被追加到 pop_weights_vector 变量中。
注意,我们对属于同一解决方案的向量使用了 numpy.extend() 函数,对属于不同解决方案的向量使用了 numpy.append() 。原因是 numpy.extend() 将属于同一解决方案的 3 个向量中的数字连接在一起。换句话说,为两个列表调用这个函数将返回一个新的单个列表,其中包含两个列表中的数字。这适合于为每个解决方案创建一个 1D 染色体。但是 numpy.append() 将为每个解决方案返回三个列表。为两个列表调用它,它返回一个新的列表,该列表被分成两个子列表。这不是我们的目标。最后,函数 mat_to_vector() 以 NumPy 数组的形式返回群体解,以便于以后操作。
实施 GA 步骤
在将所有解从矩阵转换为向量并连接在一起后,我们准备好执行名为“遗传算法优化简介”的教程中讨论的遗传算法步骤。这些步骤在主图中介绍,也在下图中总结。

请记住,GA 使用适应度函数来返回每个解决方案的适应度值。适应值越高,解决方案越好。最佳解决方案在父选择步骤中作为父返回。
诸如 ANN 之类的分类器的常见适应度函数之一是准确性。它是正确分类的样本与样本总数之间的比率。它是根据下一个等式计算的。根据主图中的步骤计算每个解决方案的分类精度。

每个解的单个 1D 向量被转换回 3 个矩阵,每层一个矩阵(2 个隐藏和 1 个输出)。使用名为 vector_to_mat() 的函数进行转换。它在下一段代码中定义。
**def** vector_to_mat(vector_pop_weights, mat_pop_weights):
mat_weights = []
**for** sol_idx **in** range(mat_pop_weights.shape[0]):
start = 0
end = 0
**for** layer_idx **in** range(mat_pop_weights.shape[1]):
end = end + mat_pop_weights[sol_idx, layer_idx].size
curr_vector = vector_pop_weights[sol_idx, start:end]
mat_layer_weights = numpy.reshape(curr_vector, newshape=(mat_pop_weights[sol_idx, layer_idx].shape))
mat_weights.append(mat_layer_weights)
start = end
**return** numpy.reshape(mat_weights, newshape=mat_pop_weights.shape)
它逆转了先前所做的工作。但是有一个重要的问题。如果给定解的向量只是一片,我们如何能分裂成三个不同的部分,每个部分代表一个矩阵?输入层和隐藏层之间的第一个参数矩阵的大小是 102x150。当转换成向量时,它的长度将是 15,300。因为根据 mat_to_vector() 函数,它是要插入到 curr_vector 变量中的第一个向量,所以它的索引从索引 0 开始,到索引 15,299 结束。 mat_pop_weights 用作 vector_to_mat() 函数的参数,以了解每个矩阵的大小。我们对使用来自 mat_pop_weights 变量的权重不感兴趣,只是使用了其中的矩阵大小。
对于同一解决方案中的第二个向量,它将是转换大小为 150x60 的矩阵的结果。因此,向量长度为 9000。这样的向量被插入到长度为 15,300 的前一个向量之前的变量 curr_vector 中。因此,它将从索引 15,300 开始,到索引 15,300+9,000–1 = 24,299 结束。使用-1 是因为 Python 从 0 开始索引。对于从大小为 60×4 的参数矩阵创建的最后一个向量,其长度为 240。因为它被添加到 curr_vector 变量中正好在长度为 9000 的前一个向量之后,所以它的索引将在它之后开始。也就是说,它的开始索引是 24,300,结束索引是 24,300+240–1 = 24,539。因此,我们可以成功地将向量恢复为原始的 3 个矩阵。
为每个解决方案返回的矩阵用于预测所用数据集中 1,962 个样本中每个样本的类别标签,以计算精确度。根据下一个代码,这是使用两个函数完成的,它们是预测输出()和适应度()。
**def** predict_outputs(weights_mat, data_inputs, data_outputs, activation=**"relu"**):
predictions = numpy.zeros(shape=(data_inputs.shape[0]))
**for** sample_idx **in** range(data_inputs.shape[0]):
r1 = data_inputs[sample_idx, :]
**for** curr_weights **in** weights_mat:
r1 = numpy.matmul(a=r1, b=curr_weights)
**if** activation == **"relu"**:
r1 = relu(r1)
**elif** activation == **"sigmoid"**:
r1 = sigmoid(r1)
predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]
predictions[sample_idx] = predicted_label
correct_predictions = numpy.where(predictions == data_outputs)[0].size
accuracy = (correct_predictions/data_outputs.size)*100
**return** accuracy, predictions
**def** fitness(weights_mat, data_inputs, data_outputs, activation=**"relu"**):
accuracy = numpy.empty(shape=(weights_mat.shape[0]))
**for** sol_idx **in** range(weights_mat.shape[0]):
curr_sol_mat = weights_mat[sol_idx, :]
accuracy[sol_idx], _ = predict_outputs(curr_sol_mat, data_inputs, data_outputs, activation=activation)
**return** accuracy
predict_outputs() 函数接受训练数据的单个解决方案、输入和输出的权重,以及指定使用哪个激活函数的可选参数。它只返回一个解的精度,而不是群体中所有解的精度。为了返回群体中所有解的适应度值(即精度),函数 fitness() 遍历每个解,将其传递给函数 predict_outputs() ,将所有解的精度存储到数组精度中,并最终返回这样一个数组。
在计算了所有解决方案的适应值(即精度)后,主图中 GA 的剩余步骤以与之前相同的方式应用。最佳亲本根据其准确性被选入交配池。然后应用变异和交叉变异来产生后代。新一代的群体是利用后代和父母两者创建的。这些步骤要重复几代。
完整的 Python 实现
此类项目的 Python 实现有三个 Python 文件:
- ga.py 用于实现 ga 功能。
- ANN.py 用于实现 ANN 功能。
- 第三个文件,用于通过若干代调用此类函数。这是项目的主文件。
主项目文件实现
第三个文件是主文件,因为它连接了所有的函数。它读取特征和类标签文件,基于标准偏差过滤特征,创建 ANN 体系结构,生成初始解决方案,通过计算所有解决方案的适应度值、选择最佳父代、应用交叉和变异并最终创建新群体来循环通过若干代。下面给出了它的实现。这样的文件定义了 GA 参数,例如每个种群的解的数量、选择的亲本的数量、突变百分比和代的数量。您可以为它们尝试不同的值。
**import** numpy
**import** GA
**import** pickle
**import** ANN
**import** matplotlib.pyplot
f = open(**"dataset_features.pkl"**, **"rb"**)
data_inputs2 = pickle.load(f)
f.close()
features_STDs = numpy.std(a=data_inputs2, axis=0)
data_inputs = data_inputs2[:, features_STDs>50]
f = open(**"outputs.pkl"**, **"rb"**)
data_outputs = pickle.load(f)
f.close()
*#Genetic algorithm parameters:
# Mating Pool Size (Number of Parents)
# Population Size
# Number of Generations
# Mutation Percent* sol_per_pop = 8
num_parents_mating = 4
num_generations = 1000
mutation_percent = 10
*#Creating the initial population.* initial_pop_weights = []
**for** curr_sol **in** numpy.arange(0, sol_per_pop):
HL1_neurons = 150
input_HL1_weights = numpy.random.uniform(low=-0.1, high=0.1,
size=(data_inputs.shape[1], HL1_neurons))
HL2_neurons = 60
HL1_HL2_weights = numpy.random.uniform(low=-0.1, high=0.1,
size=(HL1_neurons, HL2_neurons))
output_neurons = 4
HL2_output_weights = numpy.random.uniform(low=-0.1, high=0.1,
size=(HL2_neurons, output_neurons))
initial_pop_weights.append(numpy.array([input_HL1_weights,
HL1_HL2_weights,
HL2_output_weights]))
pop_weights_mat = numpy.array(initial_pop_weights)
pop_weights_vector = ga.mat_to_vector(pop_weights_mat)
best_outputs = []
accuracies = numpy.empty(shape=(num_generations))
**for** generation **in** range(num_generations):
print(**"Generation : "**, generation)
*# converting the solutions from being vectors to matrices.* pop_weights_mat = ga.vector_to_mat(pop_weights_vector,
pop_weights_mat)
*# Measuring the fitness of each chromosome in the population.* fitness = ANN.fitness(pop_weights_mat,
data_inputs,
data_outputs,
activation=**"sigmoid"**)
accuracies[generation] = fitness[0]
print(**"Fitness"**)
print(fitness)
*# Selecting the best parents in the population for mating.* parents = ga.select_mating_pool(pop_weights_vector,
fitness.copy(),
num_parents_mating)
print(**"Parents"**)
print(parents)
*# Generating next generation using crossover.* offspring_crossover = ga.crossover(parents,
offspring_size=(pop_weights_vector.shape[0]-parents.shape[0], pop_weights_vector.shape[1]))
print(**"Crossover"**)
print(offspring_crossover)
*# Adding some variations to the offsrping using mutation.* offspring_mutation = ga.mutation(offspring_crossover,
mutation_percent=mutation_percent)
print(**"Mutation"**)
print(offspring_mutation)
*# Creating the new population based on the parents and offspring.* pop_weights_vector[0:parents.shape[0], :] = parents
pop_weights_vector[parents.shape[0]:, :] = offspring_mutation
pop_weights_mat = ga.vector_to_mat(pop_weights_vector, pop_weights_mat)
best_weights = pop_weights_mat [0, :]
acc, predictions = ANN.predict_outputs(best_weights, data_inputs, data_outputs, activation=**"sigmoid"**)
print(**"Accuracy of the best solution is : "**, acc)
matplotlib.pyplot.plot(accuracies, linewidth=5, color=**"black"**)
matplotlib.pyplot.xlabel(**"Iteration"**, fontsize=20)
matplotlib.pyplot.ylabel(**"Fitness"**, fontsize=20)
matplotlib.pyplot.xticks(numpy.arange(0, num_generations+1, 100), fontsize=15)
matplotlib.pyplot.yticks(numpy.arange(0, 101, 5), fontsize=15)
f = open(**"weights_"**+str(num_generations)+**"_iterations_"**+str(mutation_percent)+**"%_mutation.pkl"**, **"wb"**)
pickle.dump(pop_weights_mat, f)
f.close()
基于 1000 代,使用 Matplotlib 可视化库在该文件的末尾创建了一个图,该图显示了精度在每代之间如何变化。如下图所示。

经过 1000 次迭代,准确率达到 97%以上。相比之下,在之前的教程中,如果不使用优化技术,这一比例为 45%。这是为什么结果可能不好的证据,不是因为模型或数据有问题,而是因为没有使用优化技术。当然,对参数使用不同的值,比如 10,000 代,可能会提高精度。在这个文件的末尾,它将参数以矩阵的形式保存到磁盘上以备后用。
遗传算法实现
下面列出了 ga.py 文件的实现。注意, mutation() 函数接受 mutation_percent 参数,该参数定义了随机改变其值的基因数量。它在主文件中被设置为 10%。这样的文件包含两个新函数 mat_to_vector() 和 vector_to_mat() 。
**import** numpy
**import** random
*# Converting each solution from matrix to vector.* **def** mat_to_vector(mat_pop_weights):
pop_weights_vector = []
**for** sol_idx **in** range(mat_pop_weights.shape[0]):
curr_vector = []
**for** layer_idx **in** range(mat_pop_weights.shape[1]):
vector_weights = numpy.reshape(mat_pop_weights[sol_idx, layer_idx], newshape=(mat_pop_weights[sol_idx, layer_idx].size))
curr_vector.extend(vector_weights)
pop_weights_vector.append(curr_vector)
**return** numpy.array(pop_weights_vector)
*# Converting each solution from vector to matrix.* **def** vector_to_mat(vector_pop_weights, mat_pop_weights):
mat_weights = []
**for** sol_idx **in** range(mat_pop_weights.shape[0]):
start = 0
end = 0
**for** layer_idx **in** range(mat_pop_weights.shape[1]):
end = end + mat_pop_weights[sol_idx, layer_idx].size
curr_vector = vector_pop_weights[sol_idx, start:end]
mat_layer_weights = numpy.reshape(curr_vector, newshape=(mat_pop_weights[sol_idx, layer_idx].shape))
mat_weights.append(mat_layer_weights)
start = end
**return** numpy.reshape(mat_weights, newshape=mat_pop_weights.shape)
**def** select_mating_pool(pop, fitness, num_parents):
*# Selecting the best individuals in the current generation as parents for producing the offspring of the next generation.* parents = numpy.empty((num_parents, pop.shape[1]))
**for** parent_num **in** range(num_parents):
max_fitness_idx = numpy.where(fitness == numpy.max(fitness))
max_fitness_idx = max_fitness_idx[0][0]
parents[parent_num, :] = pop[max_fitness_idx, :]
fitness[max_fitness_idx] = -99999999999
**return** parents
**def** crossover(parents, offspring_size):
offspring = numpy.empty(offspring_size)
*# The point at which crossover takes place between two parents. Usually, it is at the center.* crossover_point = numpy.uint32(offspring_size[1]/2)
**for** k **in** range(offspring_size[0]):
*# Index of the first parent to mate.* parent1_idx = k%parents.shape[0]
*# Index of the second parent to mate.* parent2_idx = (k+1)%parents.shape[0]
*# The new offspring will have its first half of its genes taken from the first parent.* offspring[k, 0:crossover_point] = parents[parent1_idx, 0:crossover_point]
*# The new offspring will have its second half of its genes taken from the second parent.* offspring[k, crossover_point:] = parents[parent2_idx, crossover_point:]
**return** offspring
**def** mutation(offspring_crossover, mutation_percent):
num_mutations = numpy.uint32((mutation_percent*offspring_crossover.shape[1])/100)
mutation_indices = numpy.array(random.sample(range(0, offspring_crossover.shape[1]), num_mutations))
*# Mutation changes a single gene in each offspring randomly.* **for** idx **in** range(offspring_crossover.shape[0]):
*# The random value to be added to the gene.* random_value = numpy.random.uniform(-1.0, 1.0, 1)
offspring_crossover[idx, mutation_indices] = offspring_crossover[idx, mutation_indices] + random_value
**return** offspring_crossover
ANN.py 实现
最后,根据下面列出的代码实现 ANN.py 。它包含激活函数(sigmoid 和 ReLU)的实现,以及用于计算精度的适应度()和预测输出()函数。
**import** numpy
**def** sigmoid(inpt):
**return** 1.0 / (1.0 + numpy.exp(-1 * inpt))
**def** relu(inpt):
result = inpt
result[inpt < 0] = 0
**return** result
**def** predict_outputs(weights_mat, data_inputs, data_outputs, activation=**"relu"**):
predictions = numpy.zeros(shape=(data_inputs.shape[0]))
**for** sample_idx **in** range(data_inputs.shape[0]):
r1 = data_inputs[sample_idx, :]
**for** curr_weights **in** weights_mat:
r1 = numpy.matmul(a=r1, b=curr_weights)
**if** activation == **"relu"**:
r1 = relu(r1)
**elif** activation == **"sigmoid"**:
r1 = sigmoid(r1)
predicted_label = numpy.where(r1 == numpy.max(r1))[0][0]
predictions[sample_idx] = predicted_label
correct_predictions = numpy.where(predictions == data_outputs)[0].size
accuracy = (correct_predictions / data_outputs.size) * 100
**return** accuracy, predictions
**def** fitness(weights_mat, data_inputs, data_outputs, activation=**"relu"**):
accuracy = numpy.empty(shape=(weights_mat.shape[0]))
**for** sol_idx **in** range(weights_mat.shape[0]):
curr_sol_mat = weights_mat[sol_idx, :]
accuracy[sol_idx], _ = predict_outputs(curr_sol_mat, data_inputs, data_outputs, activation=activation)
**return** accuracy
资源
- 遗传算法优化导论
https://www . LinkedIn . com/pulse/introduction-优化-遗传-算法-ahmed-gad/
https://www . kdnugges . com/2018/03/introduction-optimization-with-genetic-algorithm . html
https://www.springer.com/us/book/9781484241660
- 遗传算法(GA)优化—分步示例
https://www . slide share . net/AhmedGadFCIT/genetic-algorithm-ga-optimization-step by step-example
- 遗传算法在 Python 中的实现
https://www . LinkedIn . com/pulse/genetic-algorithm-implementation-python-Ahmed-gad/
https://www . kdnugges . com/2018/07/genetic-algorithm-implementation-python . html
本教程将基于一个简单的例子用 Python 实现遗传算法优化技术,其中…
towardsdatascience.com](/genetic-algorithm-implementation-in-python-5ab67bb124a6)
https://github.com/ahmedfgad/GeneticAlgorithmPython
联系作者
人工意识机器

Photo by Hal Gatewood on Unsplash
什么是意识?和有思考能力一样吗?还是像有灵魂一样?植物有意识吗?这是一些阅读标题后产生的一般性问题。用语言来定义意识是困难的,尽管根据哈利·波特三世博士的说法,意识大致有三种含义:首先,意识意味着清醒。一个人睡着了,处于昏迷状态被称为无意识。第二,有意识这个词经常被用来表示以人类的方式思考。
第三,有意识意味着意识到你的自我和你自己的想法。
那么,拥有人工意识意味着什么呢?如果我们没有一个精确的定义,我们怎么能人工创造意识呢?
有时被称为机器意识或合成意识,人工意识机器可能是一种拥有尽可能人性化行为和自我意识到其存在的能力的机器。一台可以沉溺于长时间谈话、听音乐、有爱好、卷入争端、感受情感、做数学等的机器。这些特征对正常人来说是天生的,但对机器来说,这些简单的任务就像人类在星系间旅行的问题一样。今天,地球上有超过 1000 万台机器(机器人),这个数字在未来还会进一步增加,并且它们都在各自的任务中表现出色。但是真正能看懂这篇文章的机器数量是污名化的。从 SHAKEY(如此命名是因为它在操作过程中容易颤抖)、ELIZA 到 OpenWorm 和 Sophia,这个世界似乎是在一艘太空火箭上实现更好的 AI 机器。过去十年中,研究人员在人工智能领域展示了一些有前途的成果,但仍然离人类水平的人工智能(HMLI)很远。
Nick Bostrom 在他的书《超级智能:路径、危险、策略》[2]中深入讨论了实现 HMLI 的途径、效果和挑战。但是真正有意识的机器的想法离现实还很远。有些人可能会认为神经网络有很好的结果,但它是真正的智能还是简单的统计模式观察?虽然据说神经网络模拟了与我们大脑中相同的神经元网络,但让我们考虑一下,也许有一天我们有足够的处理能力来开发一个足以运行人工大脑的系统。它会和我们吃着美味的食物时脑子里的想法一样吗?还是只是一个简单的矢量点积,与标签上的输出相匹配?
尼尔斯·尼尔森(Nils Nilsson)在搜索、规划、知识表示和机器人学领域从事了长期卓有成效的工作;他撰写了人工智能方面的教科书。当被问及 HLMI 的抵达日期时,他给出了以下观点:10%的可能性:2030 年 50%的可能性:2050 年 90%的可能性:2100 年
让我们非常乐观地说,我们开发了一台足够智能的机器,可以通过图灵测试,然后呢?
我们成长在一个科幻电影已经走得更远的时代,并试图展示有一个 HMLI 在身边会是什么样子。等等,这些电影不都在向我们表明,这样的机器是要终结人类的;通常被称为不可避免的“奇点”。它们都呈现了这样一种场景:这样一台机器变得有自我意识,或者对现实感到困惑,并试图杀死自己的创造者。从 2001 年的《太空漫游》开始,哈尔(启发式编程算法计算机)对给它的命令感到困惑,杀死了宇宙飞船的全体船员,到了前玛奇纳,艾娃有了自我意识(“获得意识”)并杀死了它自己的制造者;我们看到了这样一台机器的相同命运(在这种情况下,机器似乎就像人类一样,试图与它们的创造者斗争)。我们真的会被自己创造的邪恶之手所毁灭吗?但这些只是虚构的,对吗?
我们不知道一台有意识的机器会是什么样子,或者为了简单起见,让我们说一台 HMLI 机器会是什么样子。这些是我们自己对未来的一些疑问,现在,我们只是想知道它将会怎样。在咖啡店里,我们可能猜不到坐在我们面前的人是机器还是人,这种情况会发生吗?它会认为自己更加进化了吗?它会拥有知道自己真实意义存在的能力吗(这是一种强大的能力,甚至我们很多人对此一无所知)?这些问题今天没有明确的答案,但也许将来会有。
[1]我的意识理论概述(http://web.cecs.pdx.edu/~harry/musings/ConscTheory.html
[2]超级智能:路径、危险、策略(https://www . Amazon . in/super intelligence-dangeries-Strategies-Nick-Bostrom/DP/0199678111
3这也是以不发生破坏文明的灾难为条件的。尼尔森对 HLMI 的定义是“人工智能能够完成大约 80%的工作,甚至比人类做得更好”(Kruel 2012)。
作为复仇者,死亡是工作的一部分
死亡是永久的…除非你是复仇者!
我有一个“高效拖延”的习惯,在这种情况下,我欺骗自己相信我在拖延的同时在某种程度上降低了效率。在过去的这个周末,我在两天内狼吞虎咽地看了 10 部漫威电影,之前我已经忽略了漫威电影宇宙大约十年了。由于漫威兴奋和浪费时间,我实现了这个有缺陷的框架并进行统计分析。

我接着去了数据集搜索,这是一个为寻找数据集的数据爱好者提供的优秀平台。有太多的复仇者联盟/漫威数据集可用,但 FiveThirtyEight 的复仇者联盟数据集脱颖而出。
该数据集是完美的策划,它包含了所有复仇者的全名和他们的死亡信息。我想我可以扩展一下在自述文件中解释的 FiveThirtyEight 的想法,并通过可视化提出我自己的有趣见解。
值得注意的是,“死亡”包括假死的情况。真正被归类为“死亡”的是当读者和其他角色都认为这个角色真的死了,而不是这个角色是否在呼吸。我也相信这个数据集是基于漫威漫画的。
说明的
第一阶段是探索数据集。我在导入 RStudio 后获得的原始数据包含许多列。我想把重点放在包含人物姓名、死亡和出场次数的列上。
我意识到有 5 个死亡栏:死亡 1,死亡 2,死亡 3,死亡 4,死亡 5。他们是绝对的,他们展示了每个角色是否会死。
以下是一些例子:
例 1:旺达·马克西莫夫,心爱的用思想移动物体的斯佳丽女巫,死过一次。因此,列 Death1 有一个 Yes 条目,而其他所有死亡列都是空的。

例 2:另一方面,我们挥舞着锤子的超级英雄托尔,死了一次,复活了一次,却又死了一次。

我知道我必须重新构建死亡记录方式以便于使用,这就把我带到了下一步,数据清理。
数据清理
我运行了一个循环,每次角色死了,我都会得到一个分数。所以像旺达这样死过一次的角色会得到 1 分,而雷神会得到 2 分。像 T'Challa 这样从未死去的角色(真正的完美角色)得到 0 分。
我不确定是否有数据处理混淆,但是在上一步之后,我发现一些行没有名称条目,我后来删除了这些条目。
形象化
我使用 ggplot2 的库来执行数据可视化,如果你了解 r。

很多复仇者至少死过一次,但只有少数角色死过三次以上。
现在,让我们来看看这张饼状图,它会让你更好地感受到成为复仇者有多“危险”。

成为复仇者有大约 61%的死亡率。我不确定具体情况,但我觉得可能性很大。地球上几乎所有其他工作或活动的死亡率都更高。
但是我们来看看复仇者联盟的回报率。有很多情况,甚至在电影中,当我们认为一个角色已经死了,却在电影的结尾或下一部电影中又回来了——我正看着你呢,尼克·弗瑞。

不到 50%的“死亡”角色保持死亡状态。复活率很高,但考虑到高死亡率,这是合理的。如果《复仇者联盟》中的所有角色都真的死了,那么漫威的漫画作家将不得不不断创造新的角色。
我还调查了角色的外貌是否会影响角色的死亡率。

韦尔奇的样本 t 检验显示,至少死过一次的复仇者和从未死过的复仇者在出现次数上似乎没有显著差异。

可以肯定地说,作为一名复仇者,当你还活着的时候,死亡或者让所有人都认为你死了是工作的一部分。和出现次数没有区别。
有趣的发现:作为一个对 MCU 优先不感兴趣的人,我一直认为美国队长或钢铁侠是复仇者联盟的代言人。所以我很惊讶地发现蜘蛛侠出现的次数最多,这意味着他在漫画中出现的次数最多。

但我想是这样的。
感谢阅读!如果你感兴趣的话,这是 Github 上代码的链接。
阿西莫夫的机器人定律,以及为什么人工智能可能不遵守它们
"但是如果我们最终陷入终结者的场景呢?"问这样的问题无可厚非,因为通过电影和科幻故事,机器人接管的情况几乎无处不在,因此构成了我们对人工智能(AI)未来的印象。然而,既然人类能够通过法律生活和合作,为什么不为人工智能应用法律呢?进入阿西莫夫机器人定律!一如既往,为了更好地了解未来,让我们来回顾一下过去。
三大定律
艾萨克·阿西莫夫(1920-1992)除了是生物化学教授之外,还被认为是他那个时代“三大”科幻作家之一。在 1900 年代中期,他假设了三条定律,如果遵守的话,将会阻止机器人起义。它们如下:
法则一:机器人不得伤害人类,也不得坐视人类受到伤害。
法则二:机器人必须服从人类给它的命令,除非这些命令与第一法则相冲突。
定律三:机器人必须保护自己的存在,只要这种保护不与第一或第二定律相冲突。
现在,如果你熟悉编程,你就会知道机器是从 0 开始计数的,而不是从 1 开始计数的(MATLAB 除外,不过我们先不去说这个)。因此,也有一个由电脑爱好者提出的第 0 定律,指的是集体而不是个人,它是这样的:
法则 0:机器人不能伤害人类,或者,通过不作为,让人类受到伤害。
那么,如果法律早在 20 世纪 50 年代就已经制定出来了,为什么会有这么多恐惧呢?是什么促使埃隆·马斯克甚至斯蒂芬·霍金将人工智能标榜为人类“最大的生存威胁”?因为,长话短说,阿西莫夫定律不起作用。
计划中的缺陷
回到现在。为了与阿西莫夫的想法保持一致,让我们假设我们确实有足够复杂的人工智能代理来应用这些法律。为了便于讨论,让我们也假设,尽管是叙事机制的法则,它们也适用于现实世界。
技术问题:如果法律是英文的,而一个代理只处理中文,怎么办?或者,即使代理是在美国制造的,我们怎么知道它了解法律?因此,我们需要一种方法来(I)翻译法律,( ii)将单词背后的含义翻译成每一种可能的语言(为了涵盖所有可能性,还必须使用像拉丁语这样的死语言以及二进制机器语言)。对于人类来说,这些任务是非常相关的。另一方面,对于机器来说,这是两个非常不同的任务。第一个任务只是指用不同的语言产生相应的句子串,而第二个任务包括理解这些串。只做第一个任务的一个类比是,如果我告诉你用西班牙语唱 Despacito 的歌词。你可能说得很好,但你不知道它们是什么意思(假设你不懂西班牙语)。另一方面,只做第二项任务就像你脑子里有一个想法,但不知道如何表达。
幸运的是,自然语言处理(NLP)领域在过去几年里有了巨大的飞跃。对于第一项任务,具有长短期记忆细胞的神经网络可以用于序列到序列的翻译(对于那些对这个模型感兴趣的人,我会推荐 Jason Brownlee 的文章)。此外,上个月(2019 年 5 月)发布了端到端语音到语音翻译模型translator on。对于第二个任务,Word2Vec 模型已经通过将相关的单词标绘在一起,从而推导出句子中的语义,证明了自己是值得使用的。一个这样的图如下所示。

Meanings and relationships derived from words (sourced from: https://www.tensorflow.org/images/linear-relationships.png)
所以是的,现在的机器可以理解语言。然而,他们仍然有很多事情不能做。一个例子是理解成语。虽然“泄漏秘密”可能象征性地意味着“揭示一个秘密”,比喻翻译是不可能的。因此,一台机器可以逐字翻译每个单词。假设它按照正确的顺序翻译成法语,那么这个表达就会是“jeter les haricots”,这肯定会听起来断章取义,如果不是非常滑稽的话。
但是,为了便于讨论,让我们大胆假设比喻翻译问题将在未来几年内得到解决。这样做,所有关于让代理人理解法律的技术问题都会得到解决,我们也会因此而安全,对吗?做好准备,因为这是事情变得有趣的地方!
当阿西莫夫提出这些定律时,他不知不觉地将它们建立在另一个假设上:我们人类确切地知道道德底线在哪里。但是我们有吗?
让我们以第一定律中的“伤害”一词为例。让我们也考虑一下同一法律中的“人类”一词。它的定义包括什么?例如,在 14 世纪,奴隶被认为比人更接近牛。如今,胎儿对人类生命的权利是许多讨论的主题。然而,在未来,如果一名孕妇,由于某种情况,在分娩时死亡的可能性很高,她的人工智能医生应该建议流产吗?人们需要记住,虽然从逻辑上讲,妇女堕胎后存活的机会更大,但胎儿一旦出生,就有更多的生存理由。所以,不管怎样,机器人最终伤害了人类。
接下来的决定甚至会让我们人类处于否认的状态。让我们考虑一下丹·布朗的地狱场景,并将第 0 定律应用于它。向代理呈现一个按钮。代理人被告知,如果按下按钮,一半的人类会立刻死去,但是这个物种会再生存几个世纪。如果不这样做(因此,无所作为),人类将在 50 年内达到人口过剩,我们的物种将崩溃。代理应该怎么做,如果你处在它的位置,你会怎么做?
结论
阿西莫夫的法律试图解决人工智能起义的威胁。让机器人遵守法律的技术障碍是我们目前在让它们理解法律方面的限制。真正的障碍,一个哲学和伦理上的障碍,是我们的假设,即给定这样模糊的约束,机器人会完全按照我们想要的方式行事,而我们甚至不知道我们是什么意思。即使我们传达的意思是正确的,法律也可以简单地重新表述为“无论如何,只要做好工作,好吗?”考虑到它们可能造成的影响。
Hans A. Gunnoo 是一名数据科学家,他的职业生涯始于电子工程,后来专攻机器学习。他还在业余时间为开源人工智能项目和关于数据科学领域最新趋势的博客做出贡献。
询问重要的研究问题
提出有价值的研究问题的艺术。
数据科学家会被问到:“你做什么工作?”这是我经常回答的一个问题(非技术性的):“我问有意义的有价值的问题并寻找答案。”这种回答往往会引出另一个问题,“你如何决定研究什么问题?”
我有幸提出并获得了两个满足以下标准的主要研究问题的支持。在以后的文章中,我将会讨论这些问题。
同时,我分享了我在评估任何特定研究问题的意义和价值时所使用的标准。

Photo by Author. Making a checklist of criteria I use when evaluating research question meaningfulness and worthiness. Image Credit: “Via Design Pickle” — More on attributions.
第一个标准:这个问题的答案对许多选民有用吗?
我从事教育工作。我首先关注的通常是学生。学生之后是家庭,然后是老师。当我能够提供对当地教育机构和高等教育机构的管理者有用的答案时,我也发现这是有价值的。此外,能够为决策者(立法者或行政监管者)的工作提供信息的问题具有额外的价值。
第二个标准:这个问题是否可以通过多种数据源和应用多种分析策略来回答?
一个可以通过参考多种数据源和应用多种分析策略来回答的问题是有价值的,因为这些问题可以通过多项研究来回答。当多项研究(每项研究的研究问题略有不同)能够相互证实对方的结果时,我们就能够提高对自己发现的信心水平。如果多项研究提供了相互矛盾的结果,这意味着进一步的研究将是完全理解答案所必需的。同样,参考我自己在教育领域的工作,这通常意味着参考美国联邦数据、其他国家的数据、机构数据、调查数据或定性数据。我最近在推特上转发了一张插图,概述了许多可用的数据。
An overview of higher education data.
第三准则:回答问题是否有助于解决已知问题?
满足第一个标准不一定也满足第三个标准。例如,学生可能会发现知道多受一年教育会有积极的金钱和非金钱回报是有用的(Abel & Deitz,2019;Oreopoulos 和 Petronijevic,2013 年)。然而,我倾向于研究那些能帮助学生成功坚持多学一年并获得学位和证书的问题。
第四条标准:回答这个问题会让世界变得更好吗?
第四个是第三个的特例。我把它作为自己的标准,作为一个机会来强调研究在攻击种族优越制度和其他形式的压迫中的作用。具体而言,在教育领域,第四个标准将通过改善机会和公平的研究问题来满足;这削弱了教育在支持白人至上中的作用。继续上述关于教育程度正回报的例子,有可能消除教育持久性中种族差异的研究问题满足第四个标准。提出有意义的有价值的研究问题的一个模式可以(并且已经)消除种族差异,这就是现在著名的佐治亚州州立大学的研究驱动的努力,“这是过去四年中少有的大型公立大学之一,其黑人、西班牙裔和符合佩尔资格的学生的毕业率达到或超过学生群体的总体比率”(Hefling,2019)。
对有意义有价值的问题提问并寻找答案。
最后的想法
回答“我问有意义有价值的问题并找到答案”也适用于其他数据和科学专业人士,包括学者和学者。
一旦你发现了一个有意义、有价值的研究问题,重要的是把有意义、有价值的方法带到这个问题的研究中来。参见:方法选择提示。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
adamrossnelson.medium.com](https://adamrossnelson.medium.com/membership)
感谢阅读
如果你喜欢我要说的话,可以在:adamrossnelson.medium.com找到更多。
感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelson| LinkedIn:亚当·罗斯·纳尔逊 |脸书:亚当·罗斯·纳尔逊。
参考
Abel,J. R .,Deitz,R. (2019)。尽管费用上涨,大学仍然是一项不错的投资。自由街经济。纽约美联储银行。
赫夫林,K,(2019)。高等教育的“钱球”解决方案。Politico.com
Oreopoulos,p .和 Petronijevic,U. (2013 年)。让大学物有所值:高等教育回报研究综述(No. w19053)。美国国家经济研究局。
使用 K-means 评估 NHL 获奖者
在每个 NHL 赛季结束后,各种奖项会颁发给在各个领域表现突出的球员。虽然有一些奖项是由原始数据决定的,例如,常规赛总进球数(莫里斯·理查德奖杯)和常规赛总得分(进球数加助攻数)(阿特·罗斯奖杯),但也有一些奖项更加主观,采用投票系统来决定获胜者。大多数奖项的投票都是由职业冰球作家协会(Professional Hockey Writers ' Association)进行的,包括弗兰克·塞尔克奖(Frank J. Selke trophy):“授予在比赛的防守方面表现最佳的前锋”,以及詹姆斯·诺里斯纪念奖(James Norris Memorial trophy):“授予在整个赛季中表现出最全面能力的防守球员”。两个奖杯都只适用于常规赛的表现。
我从来不喜欢投票系统,尽管在某些情况下,最终的赢家可能非常明显。我认为这可能很有趣,通过单独使用标准和高级曲棍球统计数据,如果我可以将球员分为“等级”,并通过这样做,确定这两个投票式奖杯的获胜者,假设某一年的获胜者应该在最高等级。
数据集
使用的最终数据集是传统和高级玩家指标的组合。传统的统计数据涉及进球和助攻(总得分)、加减分、点球时间和冰上时间等指标,而高级球员指标则更多地涉及球员行为和控球。利用 Python 的 beautifulsoup 库,我刮到了更多传统的统计数据(比如进球、助攻、积分等。)来自 www.Hockey-reference.com,而高级指标由提供 www.corsica.hockey. 来自科西嘉曲棍球的高级曲棍球统计从 2008 年开始,因此,我有跨越 2008-2018 年的近 2000 名球员的数据。需要注意的是,我只考虑了游戏处于平均水平时的高级统计数据。数据被清除掉丢失的值,并被传入 Pandas 进行分析。虽然,我计划最终得到它,这个数据集只适用于滑冰运动员,而不是守门员。守门员的统计和溜冰者的统计非常不同。
职责
在我的上一篇帖子中,我使用上述数据集设计了一个球员评级系统,其中各种统计参数被加权和求和,并通过一个标准的 Sigmoid 函数,为给定的常规赛产生 50 到 99.9(递归)之间的评级值;分数越高,玩家的表现越好。评级系统确定了四个领域,其中一个是被称为 DEFN 的“责任参数,占最终评级值的大约 35%(其他是生产力 ~50%,耐力 ~8 %,其他杂项游戏特性占大约 7%)。责任仅仅是(平均而言)分配给一个球员的防守责任,以及他在常规赛中履行这些责任的表现。它是一些高级统计数据的数学算法,定义如下:
CF%: CF 代表“Corsi For”,这是当一名球员在冰上时该球员的球队产生的射门次数,与“Corsi Against”(CA)相对,这是当该球员在冰上时对方球队产生的射门次数。CF%简单来说就是 CF / (CF + CA)。
CFQoC:比赛平均 CF%的质量。数字越高,竞争程度越高。关于它的解释,这是一个有些争议的统计数据,但我喜欢它被用在 OZS 的上下文中(见下文)。
CFQoT:这是玩家的队友的 CF%。它表明了一个球员相对于他的队友对整体比赛的贡献。通常这是一个很好的指标,可以看出某个球员是否让他周围的球员变得更好。
OZS:进攻区开始。给定球员在进攻区域开始移动的次数百分比。
xGF%:的预期目标与的预期目标的比率。预期目标仅仅是给定射门得分的可能性。它提供了对拍摄质量的判断。因此,xG 值为 0.2,意味着射门的概率为 20%。从本质上讲,这里的高得分球员都有高质量的机会。
该算法考虑了球员最有可能在哪个区域开始他的转变,给予低 OZS 更多的权重(因此更多的防守职责),乘以同时在冰上竞争的球员的质量。所以一个在这里综合得分大的玩家,他的“责任心”程度更高。他们处理任务的好坏取决于责任乘以 CF%、CF qot %和 xGF%的综合因素。关于这个算法的更多信息,包括实际公式,可以在这里找到。

Fig 1. Histograms of DEFN values for rated forwards (F) and defensemen (D) between 2008 and 2018
图一。显示了从 2008 年到 2018 年赛季所有评定的前锋和后卫 DEFN 值的分布。可以看出,两个类别都有类似的高斯分布,平均值/中值约为 0.43,标准偏差约为 0.08–0.1。
图二。显示了按位置分布的直方图(LW,C,RW =前锋,D =后卫),其中 DEFN 是每场比赛在冰上的平均时间(TOI)的函数。如上所述,TOI 决定了玩家等级中的耐力部分。球员不仅要承担责任,他们还要忍受一段时间,比其他人更久。圆圈的大小代表了某个玩家在某个赛季的等级,这个等级是从我之前的帖子中计算出来的

Fig 2. Scatter plot of all rated players from 2008–2018 classed into position. The size of the dot is a representation of the overall player rating
我们可以从这个情节中学到很多。防守队员比前锋打更多的时间,正如我们从图 1 中看到的。所有玩家位置的分布相当均匀。我们还可以看到,每增加一个职业,每增加一次上场时间,球员的评分就会变得更高,这是有道理的,因为一支球队会尽可能多地派出最好的球员。然而,DEFN 呢?如前所述,DEFN 值越高,责任越大,玩家履行这些责任就越好。因此,我们应该期望在前锋/防守球员类别的右上角找到整体表现最好的“防守”球员。理论上,这些球员应该是塞尔克或诺里斯奖杯的获得者。在接下来的几节中,我们将了解情况是否如此。然而,我们首先需要一种方法来对图 2 中的数据进行分类。
K-表示
K-means 聚类是一种无监督聚类技术,用于标记数据并将它们归入具有相似特征/行为的类别。声明设定数量的“K”个聚类,并将每个数据点与代表每个聚类的随机生成的质心进行比较。基于到最近聚类质心的最短欧几里德距离,将给定数据点分配给给定聚类。然后,该算法以迭代方式工作,重复该过程,使得质心位置被优化并稳定在它们的最终位置。这种建模的一个重要方面是,模型所训练的特征必须具有相似的量级,因此,建议首先缩放(归一化)这些特征,否则聚类算法将偏向较大的特征进行聚类。
将前锋和防守队员聚集成“层”
也许 K-means 的主要缺点是破译多少集群使用?除非您有一些关于数据和最佳集群数量的洞察信息,否则实施多少集群并不总是一目了然的。然而,肘方法可以提供一些见解,这个问题,虽然仍然只是提示性的。想法是运行多个不同的 K 值,注意误差平方和(SSE)。增加 K 的数量将减少 SSE,并且如果 K = N,即数据点的总数,则 SSE = 0,因为每个数据点将是其自己的聚类。相反,我们将 SSE 作为 K 个集群的函数进行检查,如图 3 中 forwards 类所示。

Fig 3. Sum of Square Error (SSE) for different values of K in a K-means clustering model. This is for forwards, but a very similar plot is found for defensemen.
理想情况下,使用的 K 值是梯度变化最大的值(或曲线中的扭结),类似于肘形。然而,由于 K 的平滑度,使用哪个 K 并不明显,实际上可能在 4 和 12 之间。为了得到一个更好的想法,我将两个轴标准化,计算到原点的欧几里德距离,并认为最短的距离是肘部最“尖”的部分。对于前锋 K=5 和防守队员 K=4。

Fig 4. K-means clustering of forward and defensemen classes as can be seen by the different colours. Tiers have been assigned to each cluster where one is the highest, or top Tier.
图 4。显示了使用选定的 K 值对前锋和防守队员进行聚类的结果。在这两个图中,我们通过不同的颜色看到了聚类的数量,我们可以根据它们相对于整个群体的位置来识别层次。如上所述,TOI 和 DEFN 越高,结果越令人印象深刻。因此,第 1 层在右上角,第 2 层在正下方,依此类推。
塞尔克奖杯
现在我们有了一组可靠的集群,我们可以开始查看谁在第一层集群中,并查看这些名称是否与 Selke trophy 的获胜者匹配。

Table 1. A list of the most appearances (count) in Tier-1 forwards for players with a player rating of greater than 90 from 2008–2018. Also shown are the number of Selke wins and top-3 nominations. NB, There are more players with one appearance
表 1。,显示了在过去的 11 个赛季中,NHL 中前 30 名最好的双向前锋的名单,这些球员被归为一级,球员评分高于 90 分。也给出了一个球员被授予塞尔克奖杯的次数,或者至少他们是否曾经是顶级联赛赛季的前三名候选人。在名单的顶部是两个熟悉的名字:帕维尔·达蒂苏克和帕特里斯·贝吉龙,他们以双向风格的比赛而闻名,并赢得了多个塞尔克奖杯。还有其他塞尔克奖获得者包括,安泽·科皮塔,瑞安·凯斯勒和乔纳森·托尤斯;事实上,2008 年至 2018 年间的所有塞尔克奖杯获得者都被归入这一优秀的顶级行列。此外,还有各种各样的其他球员获得了前三名的提名。总共有 137 名不同的球员被归入这一类别,对于给定的赛季,那些球员评分为 90 或更高的球员被标绘在图 5 中。,其中 DEFN 是平均 TOI 的函数。圆圈颜色代表球员位置,大小代表该赛季的球员等级。

Fig 5. Bubble plot of all forwards in Tier-1 from 2008–2018 with a rating greater than 90. Colour represents player position and bubble size represents player rating value for a given season
公平地说,中锋(“C”)在这一层占主导地位,这是意料之中的,因为中锋的角色更多地被认为是一种全面的游戏风格。像布拉德·马尔尚和亨里克·泽特贝里这样的球员分别与贝杰龙和达兹尤克并肩作战,在后一种情况下,泽特贝里应该在 2008 年赢得塞尔克而不是达兹尤克,因为右上角有两个巨大的斑点(泽特贝里的贡献略好于达兹尤克)。因此,这就带来了由于我不喜欢的选民的“名声”而产生偏见的问题。然而,贝杰龙是在他自己的联赛,并有巨大的 DEFN 收视率相比,他的码头,虽然在许多赛季上场时间更少。总的来说,K-means 聚类在将最佳 Selke 候选项过滤到正确的层方面做得很好。
诺里斯奖杯
那么诺里斯呢?表二。显示了 2008 年至 2018 年与赛季评分至少为 88 的球员的第 1 层聚类相关的前 37 名,以及任何前 3 名提名或诺里斯获胜。在 11 个可能的诺里斯获奖者中,8 个来自第一梯队,3 个来自第二梯队。此外,在 11 年的 33 个前 3 名提名者中,23 个来自第 1 层,9 个来自第 2 层,1 个来自第 3 层。诸如 Zedeno Chara、Nick Lidströ、Duncan Keith、Drew Doughty 和 P.K. Subban 等球员都获得过诺里斯奖杯,并在此期间成为顶级俱乐部的热门成员。最佳球员是谢伊·韦伯,出场 7 次,克里斯·唐乐、查拉和多尔蒂出场 6 次。唐乐有一些不错的赛季,但许多赛季也因受伤而缩短,选民不喜欢缺席。

Table 2. A list of the most appearances (count) in Tier-1 defencemen for players with a player rating of greater than 88 from 2008–2018. Also shown are the number of Norris wins and top-3 nominations. The number of Tier-2 Norris winners is also shown.
图六。显示了诺里斯获奖者的 DEFN 值的时间序列,以及他们所处的层次。一级市场的平均 DEFN 截止值(红线)为 0.475,它显示了三个不在一级市场的赢家(即红线以下的赢家)。

Fig 6. Time series of Norris trophy winners presented as DEFN over time. Winners above the red line are from Tier-1 and below from Tier-2
必须考虑的一件事是,尽管这些 DEFN 值较低,但结果是相对于同一年的所有其他球员而言的。因此,我决定调查那些年其他可能的候选人,看看那些二级获奖者是否有道理。
2011 年:尼克·利德斯特罗姆赢了,尽管他的 DEFN 和赛季最佳球员排名在最佳 D-men 中仅列第五。那一年,卢博米尔·维斯诺夫斯基的整体游戏(TOI=23,DEFN=0.57,评分=91.9,等级=1)优于利斯特罗姆(TOI=22,DEFN=0.44,评分=89.3,等级=2),但它在投票中仅获得第 4 名。那个赛季,Lidströ年满 40 岁,是获得该奖项的年龄最大的球员。也许是选民们对他们多年服务的一句小小的“谢谢”?
2015:2015 年埃里克·卡尔松夺冠。那一年,另外两名一级防守队员排在卡尔松前面,但他们都经历了伤病困扰的赛季。虽然卡尔松的 DEFN 数据(TOI=27,DEFN=0.47,等级=91.1,等级=2)相当平均,但他和多尔蒂(TOI=29,DEFN=0.54,等级=89.5,等级=1)打曲棍球的时间最多,卡尔松在一场势均力敌的比赛中击败了多尔蒂。
2018:2018 年,维克多·海德曼(TOI=26,DEFN=0.45,评分=91.4,等级=2)以略高于人口平均水平的 DEFN 值获胜,击败了多尔蒂(TOI=26,DEFN=0.51,评分=91.1,等级=1),后者可以说是综合表现更好的人。
2017: 有趣的是,布兰特·伯恩斯(TOI=25,DEFN=0.48,评分=92.4,Tier=1)在 2017 年获胜,被列为 Tier-1,但却在极限上。事实上,他的 DEFN 结果远低于第一级的其他潜在候选人,如多尔蒂(TOI=27,DEFN=0.55,评级=88.7,第一级)和阿历克斯·皮特兰杰洛(TOI=25,DEFN=0.52,评级=88.9,第一级)。
所以重新考虑图 6。我们发现,在过去四年中的三年里,投票者倾向于选择 DEFN 评分较低的球员。由于玩家评级的主要权重是生产力(~50%),顶级玩家的平均 TOI 相似(而顶级玩家的其他杂项玩家评级参数相似),这意味着生产力(即分数)比诺里斯传统意义上的“最全面的能力”更受重视。图 7。显示 2008-2018 年所有玩家等级高于 88 的一级防守者。

Fig 7. Bubble plot of all defensemen in Tier-1 from 2008–2018 with a rating greater than 88. Colour represents player position and bubble size represents player rating value for a given season.
结论
假设 DEFN 参数是防守属性的良好指标,我们评估了塞尔克和诺里斯奖杯的最后 11 名获奖者。在很大程度上,我们可以说,选民们选择塞尔克奖得主是正确的。随着所有获奖者和许多被提名者聚集在顶级,公平地说,球员们一直被宣布的标准所认可,以赢得这个奖杯。然而,对于诺里斯奖杯获得者的价值观似乎存在不一致的态度,最近生产率似乎是驱动因素,而不是全面的比赛。很难解释为什么会这样。这是因为在过去的十年里,足球的风格发生了巨大的变化,现在更加强调速度和技巧吗?这是因为 NHL 游戏正在转变为一种更欧洲的风格,进攻是由四分卫风格的球员防守驱动的吗?全能 defensemen 是不是没有以前那么性感了?对于获奖者来说,2019 年应该是有趣的一年,所以请关注这个空间。这项工作的代码可以在我的 Github 上找到。感谢阅读!
评估数据质量
对于数据挖掘和机器学习算法…
Video version of the story, if you are into that sort of thing 😛
在 我之前的一篇帖子 中,我讲过数据科学中的 数据集类型,数据挖掘&机器学习及其一般特征 。这就要继续下去了,如果你还没有读过,就在这里读一下以便对我在文章中要讲的话题和概念有一个恰当的把握。
数据挖掘应用通常应用于为另一个目的收集的数据,或者用于未来的未指定的应用。因此,数据挖掘通常不能利用“在源头解决质量问题”的显著优势
由于防止数据质量问题在这种情况下是不可行的,数据挖掘主要关注:
- 数据质量问题的检测和纠正(通常称为 数据清理 )以及
- 使用可以容忍较差数据质量的算法。
本文主要关注测量和数据收集问题。
请容忍我的概念部分,我知道这可能有点无聊,但如果你有强大的基础,那么没有什么可以阻止你成为一名伟大的数据科学家或机器学习工程师。
假设数据是完美的并不是一个好主意。由于多种原因,如人为错误、测量设备的限制或有缺陷的数据收集过程,数据可能不正确。可能存在这样的数据集,其中一些值缺失,有时甚至一些数据对象不存在,或者存在冗余/重复的数据对象。我们现在将定义一些在数据科学中大量使用的术语。
什么是测量误差?
→指测量过程中产生的任何问题。换句话说,记录的数据值在某种程度上不同于真实值。测量值与真值之差称为 误差 。
什么是数据收集错误?
→它是指诸如省略数据对象或属性值,或包含不必要的数据对象等错误。
什么是噪音?
→噪声是测量误差的随机成分。它要么涉及值的失真,要么涉及不需要的对象的添加。下图显示了一些随机噪声在干扰前后的时间序列。

术语噪声通常与具有(空间相关)或(时间相关)成分的数据相关。在这些情况下,使用来自信号和图像处理的技术来降低噪声。**
但是,去除噪声是一项困难的任务,因此许多数据挖掘工作涉及使用 鲁棒算法 ,即使在存在噪声的情况下也能产生可接受的结果。
什么是离群值?
→异常值是
- 在某种意义上,具有不同于数据集中大多数其他数据对象的特征的数据对象,或者
- 相对于该属性最常见(典型)的值而言非常规的属性值。
此外,区分噪声和异常值也很重要。离群值可以是合法的数据对象或值。因此,与噪声不同,离群值有时可能是令人感兴趣的。
数据集中是否存在缺失值。
数据对象的某些属性值缺失的情况并不少见。原因可能是:
- 信息未被收集。
- 有些属性不适用于所有对象。
无论如何,在数据分析期间应该处理缺失值。接下来,我们将讨论一些处理缺失数据的策略。
- ****消除数据对象或属性:一个简单有效的策略是消除缺少值的对象。然而,如果一个数据集只有几个缺少值的对象,那么我们可以忽略它们。一个相关的策略是消除缺少值的属性。然而,这样做应该小心,因为被剔除的属性可能是对分析至关重要的属性。
- ****估计缺失值:有些缺失数据是可以可靠估计的。如果属性本质上是连续的,那么可以使用该属性的平均值来代替缺失值。如果数据是分类的,那么最常出现的值可以替换缺失的值。
- ****在分析过程中忽略缺失值:许多数据挖掘方法可以修改为忽略缺失值。例如,假设对象正在被聚类,并且需要计算数据对象对之间的相似性。如果一对对象中的一个或两个对象在某些属性上有缺失值,那么可以通过仅使用没有缺失值的属性来计算相似性。的确,相似性只是近似的,但是除非属性的总数很少或者缺失值的数量很大,否则这种不精确的程度可能并不重要。
- ****不一致值:数据可以包含不一致值。考虑一个地址字段,其中列出了邮政编码和城市,但是指定的邮政编码区域不包含在该城市中。可能是输入该信息的个人调换了两位数字,或者可能是从手写表格扫描该信息时误读了一位数字。有些类型的不一致很容易发现。例如,一个人的身高不应该是负数。不一致的纠正需要额外的或冗余的信息。
- ****重复数据:数据集可以包括彼此重复或几乎重复的数据对象。为了检测和消除这种重复,必须解决两个主要问题。首先,如果有两个对象实际上表示一个对象,那么相应属性的值可能不同,这些不一致的值必须得到解决。第二,需要注意避免意外地组合相似但不重复的数据对象,例如两个不同的同名人。
到目前为止,我们已经讨论了与数据质量相关的问题。现在,我们将借助 【精度、偏差和准确度】 来了解统计检查数据质量的方法。
测量过程和结果数据的质量由精度和*偏差来衡量。*****
什么是精度?
→重复测量(相同数量)的接近程度。通常用一组值的标准差来衡量。
什么是偏见?
→测量值与被测数量的系统变化。它是通过取一组值的平均值和被测量的已知值之间的差来测量的。只能对那些测量量已知的物体进行测定。
例如,我们有一个质量为 1g 的标准实验室砝码,想要评估我们新实验室秤的精度和偏差。我们称质量五次,得到以下五个值:{1.015,0.990,1.013,1 .001,0.986}。这些值的平均值为 1.001,因此偏差为 0.001。以标准差衡量,精度为 0.013。
通常使用更一般的术语“精确度”来表示数据中测量误差的程度。
什么是准确性?
→测量值与被测量的真实值的接近程度。
精度取决于精度和偏差,但既然是一般概念,就这两个量而言,精度并没有具体的公式。
我正在免费赠送一本关于一致性的电子书。在这里获得你的免费电子书。
这篇关于数据质量的文章到此结束。
如果你喜欢阅读这样的故事,那么你应该 在你的收件箱 中获取我的帖子,如果你想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金,不需要你额外付费。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
tarun-gupta.medium.com](https://tarun-gupta.medium.com/membership)
这个帖子的后续是这里。我的文章索引在这里:
[## 标记故事列表的快速链接—感谢您的访问
我也有一份以快节奏出版为目标的出版物。读书成为作家。
tarun-gupta.medium.com](https://tarun-gupta.medium.com/thank-you-for-visiting-my-profile-9f708062c75e)**
用线性规划法给优步司机分配最快的皮卡
对于我在最优化方面的最后一个项目,我的教授指导我根据我们上个月学到的东西来优化任何东西。我需要定义自己的问题,用 Python 实现解决方案,并评估结果。(为了这篇文章的简洁,我省略了我的代码,我会尽快张贴我的 Jupyter 笔记本!)
我摆弄过图形化的线性程序来直观地解决资源的最优分配,我认为这是一种重新表述通常的代数问题的很酷的方式。我还想探索优化如何在日常叙事中发挥作用。因此,作为一个住在洛杉矶、忙碌而又不会开车的大学生,很明显,优化我最讨厌的一件事:等我的优步。
在设置问题之前,以下是一些重要的准备工作:
图表
一个图 G = (V,E) 由一组顶点(或节点 ) V 和边 E 组成。通常,我们将节点表示为所考虑的对象,而将边表示为对象之间的关系。当一个节点与另一个节点有边时,我们说这两个节点是连通的。
在有向图中由一组由边连接的顶点组成,其中边有一个与之相关的方向。在有向图中,边 (u,v) 不同于 (v,u) 。

A directed graph (source:Wikipedia)
完全二部图
我们感兴趣的一种特殊的图是完全二部图。如果我们能把节点分成两个不相交的集合 V1 和 V2 ,使得 E 中的每条边都连接每个 V1 顶点和每个 V2 顶点,那么这个图就是完全的二部图。

A complete bipartite graph with V1 as the set of red nodes, and V2 as the set of blue nodes (source: Wikipedia)
线性规划
线性规划是一般约束优化问题的特例。它的目标函数是线性的,可行点集由一组线性约束确定,线性约束可以是线性方程和/或不等式。一旦我们像这样将特定问题公式化,我们就可以通过一系列方法来求解方程组,例如使用行运算(像在高中重复求解联立方程)和 单纯形法 (黄金标准算法,连续考虑似乎合理的解决方案,同时确保我们在每次迭代中总是更接近最优解)。
最大流最小割问题
假设 G = (V,E) 是一个有向图。我们可以将最大流问题描述为从源节点s向汇节点tt运送尽可能多的材料。材料可以通过连接节点的边从一个节点流到另一个节点。连接 i 到 j 的边具有一些容量** Cij,可以从节点 i 推到j的最大流量,同时最大化从 a s 到 t ( s!= t ),我们还想在每个中间节点保持流入流出相等。**
一个 流 Fvw 是边 v 和 w 的权重分配。边的流量必须在其容量范围内,因为节点应该只能传输小于或等于其容量的材料。流量也必须是非负的。

Linear Program Formulation for Max Cut Min Flow
另一方面,最小割问题旨在以最小的破坏将节点分成两组。我们想定义一个 s-t 割作为顶点到两个集合 A 和 B 的划分,其中 A 包含源节点 s,B 包含汇节点 t 。我们希望最小化成本,即从 A 中的一个顶点开始到 b 中的一个顶点结束的所有边的权重之和。我们可以引入指示变量,然后制定一个线性规划。
最大流最小割定理 陈述了同一问题的最大流和最小割公式的解是等价的。对于这个项目,我们将考虑最大流的线性规划,因为它更直观。
指派问题
上述问题的一个修改版本是分配 n 个工作给 m 个机器/工人的任务。如果作业 j 被分配给工人 i 则设 Xij = 1,如果作业 j 未被分配给工人 i 则为 0。每个人只能做一项工作,一项工作只能由一个人做,各有各的费用。我们希望利用我们所有的资源,最大限度地降低完成所有工作的成本。

Linear Program Formulation for the Assignment Problem
当在图中表示这个线性规划时(见下文),我们可以通过在图中添加汇节点和源节点来匹配最大流最小割问题,这些节点表示网络中完成的作业总数。这将流量守恒表示为来源的总资源,即工人数量需要与总产出(即工作总数)相匹配。
将两者结合起来,提出问题
通过构建两组节点,一组用于工人,一组用于任务,我们得到了下面的完整二分图。当我们假设每个工人都有资格完成任何任务时,每个工人都与每个任务相关联。然后,这些边缘将被赋予某个值,该值表示工人完成任务的成本。

source: Google OR tools
让我们考虑一个网络,其中的节点是优步应用程序用户,特别是附近的司机和骑手,并与上述分配问题进行类比。
我们可以将优步司机(=工人)到附近皮卡(=工作)的分配公式化为最小化等待时间(=目标函数),该最小化是从司机到皮卡多远(以分钟计)得出的(=成本)。我们假设是 UberX(或者优步·布莱克?UberLXL?)所以每个车手一次只能完成一次接送,骑手只能接送一次(=线性约束)。
换句话说,指定优步最快的接送=最小化附近所有可用司机和乘客的等待时间。这是把问题改写成线性规划的直觉,这个项目的目标是探索解决规划的不同方法。
对于这个问题,我们专注于解决司机和皮卡数量相等的情况,以简化问题并符合所用 Python 包的限制。
将问题公式化为上面的标准线性规划,我们使用 Munkres 的匈牙利算法和 Google OR Tools 的线性和分配和最小成本流来探索三种方法。然后,我们针对不同规模的网络,即不同数量的司机和皮卡,比较该方法的运行时间。
实施
首先,为了说明问题,我们从一个只涉及该地区四个驾驶员和四个皮卡的问题开始。
对于这个问题,我们假设等待时间在 1 到 30 分钟之间整数变化。实际上,乘客等待优步到达超过 10 分钟的情况非常罕见。我们应该记住,等待时间会因地区、司机供应和接送需求而波动,因此可能不是“随机”的。
基于这些假设,我们生成随机数据来填充成本矩阵。然后,我们将驾驶员编号为 1–4,将骑手编号为 5–8(或者,更一般地,将顶点的前半部分作为驾驶员,后半部分作为骑手),以构建开始节点和结束节点的矩阵或列表,作为实现的输入。
芒克雷斯匈牙利算法
Munkres 的匈牙利算法是一种强力算法,它包括生成成本矩阵的所有独立集,计算每次分配的总成本,以及搜索所有分配以找到最小和独立集。这个算法有 n!可能的赋值集合,因此具有指数级的运行时复杂度。
Python 的 munkres 包实现了一个由 James Munkres 修改的算法,具有多项式运行时复杂性,这里描述的为。

One iteration to solve for a feasible assignment
该包将解决方案作为一对有序的驾驶员集合和驾驶员集合(注意,该包将它们索引为 0–3 表示 1–4,0–3 表示 5–8。关于这个项目的编码部分,最困难的事情是重塑所有我曾经比较的函数的输入和输出!).它打印出成本矩阵、总等待时间和运行时间。

使用 Python 中的 networkx 包,我写了一些代码,以有向图的形式说明解决方案。这里,0 节点表示源节点,9 节点表示汇节点,节点 1-4 表示优步司机,而节点 5-8 表示乘客。驾驶员和乘客之间的边的数字属性说明了驾驶员和乘客之间的等待时间。最佳分配由连接驾驶员节点和骑手节点的绿线表示。

Illustration for the solution
线性和分配
Google 的 OR 工具****lineasumassignment在给定的图中,用整数边权重集寻找最小成本的完美分配。该算法将指派问题转化为最小费用流问题,并采用推-重标法求解。
运行时间为 O(nmlog(nC)) 其中 n 为节点数, m 为边数, C 为边代价的最大值。原则上,它可能比上面的 munkres 的匈牙利算法更糟糕,但是我们不知道任何一类问题会发生这种情况。
解决问题后,程序包会打印以下赋值:


最小成本流
Google 的 OR 工具 SimpleMinCostFlow也提供了另一个求解器实现,可以处理比 LinearSumAssignment 更大的一类问题。LinearSumAssignment 是专门为解决分配问题而实现的。
上面我们讨论了我们的特殊问题和最小成本流之间的相似之处。
****
我们注意到所有三种方法产生相同的赋值和目标函数值。但是,这并不能保证。假设每种方法都以不同的方式实现,那么在具有相同目标函数值的方法之间可能存在不同的赋值。例如,在这种情况下,可能有两个或更多的等待时间组合,总计 30 个,每个方法可以选择这些组合中的任何一个。
时间比较
为了比较每种方法的运行时间,我们将比较当我们增加工作人员和任务的数量时,每种方法如何伸缩。我们将跳出优步取件的例子,考虑这样一种情况,我们有 250-5000 个任务,以 250 个增量分配给相同数量的工人。在每次迭代中,我们将为每个任务的成本生成随机数据,然后求解最优解。然后,我们将比较给定相同数据的每个方法的运行时间。
注意横轴表示第 n 个区间,所以第 n 个勾号表示网络中的 n250 工作人员节点和 n250 任务节点。**

Runtime in seconds vs the nth interval
结果
- 从我们的图中可以明显看出,最小成本求解器是最快的,紧随其后的是线性和分配求解器。虽然我们可以看到最小成本求解器的伸缩性更好,因为在更高的间隔,线性求和的运行时间增加更多。
- 有趣的是,Google OR tools 提到线性和赋值求解器在处理一般赋值问题时更有效——在未来的工作中,研究这个项目的赋值问题是如何引起上述现象的可能会有所帮助。
- 这一比较证实了我所做的研究,即 Munkres 的算法效率最低,因为它的伸缩性比其他两个算法差得多。
其他考虑
-
****分配的非唯一性:在查看了不同节点数的最优解后,我们注意到,尽管实现了相同的最小成本值,但从一种方法到另一种方法的分配可能不同。由于问题的过度约束以及包的不同实现,这可能是意料之中的。
-
****数据的随机性**:根据数据的结构,对于相同的数据,一种方法可能比另一种方法更难解决问题。在比较运行时间时,一种更可靠的方法是取几代随机数据的平均值。
另一个有趣的观察是,当成本往往有许多重复时,最优值往往有更多的重复解。例如,当我生成 100 个节点,每个节点的成本在 1 到 10 之间时,最小值几乎总是 100,因为节点在它的 100 条边中的一条边上的成本很可能总是 1。
更现实的方法是使用真实世界的数据,将问题公式化到更窄的范围。然后,我们可以尝试回答为什么不同的方法给出不同的最优解,以及如何给出不同的最优解。**
-
****任务和工人数量不等:这个项目解决了优步司机数量和皮卡数量不匹配的情况,这不是很真实的描述。通常情况下,司机无法满足更多的乘客,这可能导致价格飙升的机会。在这种情况下,我们将来自源节点的电源修改为驱动器的数量,并且我们将有一些节点未被访问。
结束语
总结一下,我们所做的如下:
- 构造了一个线性规划来最小化指派优步司机接载乘客时的总等待时间
- 用图表示我们的优化,并转化为最大割最小流问题,进而转化为分配问题
- 比较了解决指派问题的三种不同方法
如上所述,该项目有很大的改进空间,因为它只是对分配问题的可能方法的简要调查。在将这种方法应用于现实生活数据之前,我选择的特定应用程序有许多更微妙的边缘情况需要探索。
我在这门课上学到的最酷的事情是解构一个抽象的问题,并通过创造性地应用线性代数和分析中的结果来解决它们。过去四年的数学课一直致力于建立我对这些基本原则的理解,所以这门课使我能够超越它们。这个项目让我明白了如何从数学家的角度来看待问题。这门课是我在加州大学洛杉矶分校最愉快的课程之一——它让我兴奋,因为我能够应用数学高效而严谨地解决有趣的问题。
附言:谢谢 Sylvester 教授的大手笔,让我在整个季度都保持好奇:)我可以每天一整天都优化任何东西。
参考
- https://www.joshmeetscomputer.com/bipartite-projected/
- http://csclab.murraystate.edu/~bob.pilgrim/445/munkres.html
- http://software.clapper.org/munkres/
- https://developers . Google . com/optimization/assignment/simple _ assignment
- https://developers . Google . com/optimization/assignment/assignment _ min _ cost _ flow
赋值,浅抄,还是深抄?
一个关于 Python 内存管理的故事
from copy import copy, deepcopy
这篇文章的目的是描述当我们
- 分配一个变量
B = A, - 浅层复制它
C = copy(A),或者 - 深抄它
D = deepcopy(A)。
我首先描述一下 Python 中的内存管理和优化。在奠定基础之后,我解释了赋值语句、浅拷贝和深拷贝之间的区别。然后,我在一个表格中总结了这种差异。
如果你更喜欢看视频而不是看文章,你可以在这里 找到补充视频 。
Python 中的内存管理
int , float , list , dict ,类实例,…它们都是 Python 中的对象。在 CPython 实现中,内置函数id()返回对象的内存地址—
>>> L1 = [1, 2, 3]>>> id(L1)
3061530120
如果我们创建一个新的变量L2,它引用一个与L1具有相同值的对象,L2将有一个新的内存地址—
>>> L2 = [1, 2, 3]>>> id(L2)
3061527304
每次创建一个新对象,它都会有一个新的内存地址。除非它是—
- 一根很短的绳子
- [-5,256]范围内的整数
- 一个空的不可变容器(例如元组)
让我们看一个整数对象的例子。*x*和*y*指的是同一个值 10。虽然上例中的L1和L2有两个不同的内存地址,但是*x* 和*y* 共享相同的内存地址
>>> x = 10>>> y = 10>>> id(x)
2301840>>> id(y)
2301840
这是因为,在这三个例外中,Python 通过让第二个变量引用内存中的同一个对象来优化内存,有人称之为“共享对象”。
记住共享对象的概念,因为我们稍后创建对象的深拷贝时会用到它。
变量赋值
在 Python 文档中说“Python 中的赋值语句不复制对象,它们在目标和对象之间创建绑定。”这意味着当我们通过赋值来创建一个变量时,新的变量与原始变量引用同一个对象
>>> A = [1, 2, [10, 11], 3, [20, 21]]>>> B = A>>> id(A)
3061527080>>> id(B)
3061527080
因为新变量B和原始变量A共享同一个对象(即同一个列表),所以它们也包含相同的元素—
>>> id(A[2])
3061527368>>> id(B[2])
3061527368
如下图所示,A和B共享同一个id,即在内存中引用同一个对象。它们也包含相同的元素。

浅拷贝
当我们通过浅拷贝创建一个变量时,新的变量指向一个新的对象——
>>> A = [1, 2, [10, 11], 3, [20, 21]]>>> C = copy(A)>>> id(A)
3062428488>>> id(C)
3062428520
虽然A和C指的是两个不同的对象(即两个不同内存地址的列表),但两个列表中的元素指的是相同的对象—
>>> id(A[0])
2301696>>> id(C[0])
2301696>>> id(A[2])
3062464904>>> id(C[2])
3062464904
下图说明了A中的元素如何引用与C中的元素相同的对象。

深层拷贝
类似于浅层拷贝,当我们通过深层拷贝创建一个变量时,新的变量指向一个新的对象——
>>> A = [1, 2, [10, 11], 3, [20, 21]]>>> D = deepcopy(A)>>> id(A)
3062727496>>> id(D)
3062428488
如 Python 文档所述——
浅拷贝和深拷贝的区别只与复合对象(包含其他对象的对象,如列表或类实例)相关:
-一个浅拷贝构造一个新的复合对象,然后(尽可能地)将引用插入到原始对象中。
-一个深度拷贝构造一个新的复合对象,然后递归地将拷贝插入到原始对象中。
与浅层拷贝不同,两个列表中的元素现在引用不同的对象——
>>> id(A[0])
2301696>>> id(D[0])
2301696>>> id(A[2])
3062464648>>> id(D[2])
3062466376
但是为什么A[0]和D[0]共享同一个对象(即拥有相同的内存地址)?因为它们都引用整数,这是我们在开始提到的内存优化的三个例外之一。
下图显示A和D引用内存中两个不同的列表,由于内存优化的原因A中的元素引用的对象不同于D中的元素,整数元素除外。

摘要
如果这篇文章有什么值得一提的地方,那一定是下表。变量赋值不复制对象,所以A和B有相同的内存地址,包含相同的元素。浅层复制为C创建了一个新对象,但是C中的元素仍然引用与A中的元素相同的对象。深度复制还为D创建了一个新对象,并且D中的元素引用的对象与A中的元素不同,有三种类型的异常。

这篇文章的灵感来自于…
关联规则分析在广告优化中的应用

介绍
在客户获取领域,优化是成功的关键,目标是最小化每次转换的成本(CPA)并最大化转换率和广告支出回报(ROAS)。您可能已经知道,在客户之旅中,有许多因素会影响客户的看法以及他们是否采取行动的决定。仅举几个例子:渠道、广告文案、登陆页面、目标定位(人口统计、兴趣、关键词、..),等等。
许多营销团队采用的一种常见方法是实验。这种方法有许多优点,例如确保结果在统计上是显著的,学习可以在团队中共享,……但是,A/B 测试和多变量测试可能需要大量的流量,因此非常耗时,特别是在转换率相对较小的情况下(查看此处的 A/B 测试计算器)
在本文中,我想介绍另一种方法,它使用称为关联规则的数据挖掘技术来识别客户旅程中的高绩效元素,并讨论其在优化广告绩效方面的利弊。
文章包括以下几个部分:
1、资料准备
2、探索性分析,给出初始假设
3、模型构建:关联规则和机器学习
4、归因中的潜在应用
5、利弊
数据准备
然而在现实中,营销团队可以构建一个单一的客户视图来全面了解整个客户旅程,几乎不可能找到一个包含所有影响绩效的元素的公共数据集。然而,我从 ka ggle(【https://www.kaggle.com/fayomi/advertising】)找到了一个接近我所需要的数据集。从那里,我将为我们的目的操纵数据。

原始数据集包含 1000 个观测值。数据中的每一行代表一个看到该广告的互联网用户。标签数据是“点击了广告”,它指示互联网用户是否点击了广告。这对于我的分析来说还是不合适的。下面是我处理数据的几个步骤:
- 假设这个数据集中的每个数据点都表示通过我们的广告登陆我们的登录页面的访问者。我将为每一行添加一个访问者 ID。
- 我将随机创建 2 个以上的广告属性:登陆页面和广告文案。因为我们只有 1000 个数据点,所以我假设我们只使用 4 个登录页面和 3 个广告副本。
- 点击广告不是我要找的转换。我将删除此标签,并创建一个新标签来指示该访问者是否在登录页面上采取了操作。我假设转化率在 20%左右,所以我随机创建这个数据,并确保转化率水平保持不变。
- 删除不适当的属性,如“点击广告”、“广告主题行”
之后,我有了新的数据集:

快速图表显示,国家变量有 237 个值,但我们只有 1000 个观察值。因此,我将添加 region 变量作为地理信息的指示,而不是使用 country 变量。
这是最终数据:

探索性数据分析
数据汇总:

平均转化率为 18.3%。这意味着虚拟分类器可以达到 81.7%的准确率。使用配对图的快速可视化显示,在特征和标签之间似乎没有模式。

更多可视化效果,显示每个特征与标签之间的相关性:

Compare the avg. conversion rate amongst regions (left) and weekdays (right)

Compare the avg. conversion rate amongst landing pages (left) and ad copies (right)

Male visitors have a higher average conversion rate than female
连续的图表再次显示了一个不清楚的模式:


总结一下:

关联规则
关联规则是一种基于规则的机器学习方法,用于发现变量之间有趣的关系。在购物篮分析中被广泛使用,有一个经典的例子是{尿布}--> {啤酒},意思是如果一个顾客买了尿布,他/她就更有可能买啤酒。我们可以使用这种方法来确定与“转化”有积极关系的元素(广告文案、登录页、目标定位)。《走向数据科学》有一篇很棒的文章解释了关联规则的概念。
数据预处理包括以下步骤:
- 为地区、工作日、广告文案、登录页面创建虚拟变量
- 将连续特征转化为名义特征:年龄、收入、上网时间和互联网使用情况
下面是模型构建结果:

快速解释{A} → {B}的支持、信心和提升的指示
- 支持度:有多少百分比的数据集既有 A(前件)又有 B(后件)。
- 信心:如果 A 发生了,B 发生的可能性有多大
- Lift:如果 A 发生了,B 发生的几率会增加还是减少,增加多少?
我们关注“提升”一栏,这个数字显示了如果一个访问者有前情,他/她更有可能接受“后情”的百分比。

Interpretation of the result of the association rules analysis
一般来说,关联规则产生的结果与数据可视化非常相似,但仍有根本性的改进:
- 关联规则确保 A 和 B 发生的百分比是显著的。例如,您可以通过 min_support 参数设置 A 和 B 发生的最小百分比
- 关联规则提供了 A 对 B 的可能性的平均影响
- 一个广告中可以有多个元素,这可以为营销团队提供更多关于广告过程的信息。
在归因理解中的潜在应用
归因模型也可以是关联规则的潜在应用。您可能已经知道,客户之旅变得更加多点接触,通常,客户在采取行动之前会与多个渠道进行互动。例如,访问者可以点击显示广告来访问我们的登录页面,但直到一周后他/她通过付费搜索再次访问时才转化。因此,收购团队面临的一个常见挑战是了解漏斗顶部和中部渠道的真正价值。这就是关联规则可以发挥作用的地方。
正如你们中的许多人可能知道的,有许多归因模型可用:第一次接触、最后一次接触、基于位置、线性、时间衰减等等(在这里阅读归因模型)。这些模型是基于时间的,并且总是对渠道在客户旅程中的顺序有一个特定的假设,从而形成一个“固定”的值。例如,基于位置的信道假设第一次触摸和最后一次触摸信道都将获得 40%的信用,而剩余的 20%将在中间的信道之间平均分配。但在现实中,可能有成千上万个客户旅程场景,对于每个客户,一个渠道可能有不同的价值。

关联规则可以应用于理解在使访问者转换时渠道的归属值。我们只是想知道哪个渠道增加了某人成为转化的概率,说明那个渠道的“真实”价值。例如,GDN 可能不会带来直接的转变,但如果一个游客经过 GDN,他成为我们的领导者的几率可能会高于平均水平。你可以深入挖掘 GDN 的交通来了解原因。在这种情况下,你可能想在 GDN 上分配一些资金,即使它在你的报告中没有显示足够的转化率。我们可以期待像{ GDN }→{转换}或{付费搜索}→{转换}这样的规则

Sample dataset prepared for association rules analysis in attribution
使用关联规则的利与弊
优点:
关联规则是从你的广告数据集中获得有意义的见解的一种快速简单的方法。它可以让您快速浏览元素之间的关系,并为进一步的研究(如机器学习算法)和实验提供基础。
关联规则不能确保统计显著性。相反,它表示平均效果,您可以使用关联规则分析作为输入来产生测试的想法。您可以比较两组访问者之间的表现:一个对照组不经过 GDN,而治疗组经过 GDN,目的是提高转化率。
缺点:
关联规则学习需要名义变量。连续变量需要转换成名义变量,它可能会丢失重要信息。如果您希望在分析中保持连续变量,则应考虑其他选项,如逻辑回归。
关于作者: 我是加州大学戴维斯分校的 MBA 毕业生。我对营销分析、建模、机器学习和数据科学充满热情。如果您有任何意见、反馈或问题,请随时通过 maitpnguyen296@gmail.com 联系我或通过 LinkedIn联系我。快乐造型!
线性回归算法的假设
这些假设在构建线性回归模型时得到满足,从而为给定的数据集生成最佳拟合模型。

线性回归—简介
线性回归是一种基于监督学习的机器学习算法。它执行回归任务来计算回归系数。回归模型是基于独立变量的目标预测。
线性回归执行的任务是根据给定的自变量(x)预测因变量值(y)。所以这种回归技术找出了 x(输入)和 y(输出)之间的线性关系。因此它被称为线性回归。一元线性回归的线性方程如下所示

Equation of a Simple Linear Regression
y-输出/目标/因变量;x-输入/特征/独立变量和θ1、θ2 分别是最佳拟合线的截距和斜率,也称为回归系数。
简单线性回归的例子:
让我们考虑一个例子,在这个例子中,给定一个人在某个特定领域的工作经验,我们预测他/她的工资。数据集如下所示

这里 x 是经验年限(投入/自变量),y 是提取的工资(产出/因变量)。
在将数据集分成训练和测试之后,我们已经对数据拟合了简单的线性回归模型。用于将数据拟合到线性回归算法的 python 代码如下所示

绿点代表数据集的分布,红线是最佳拟合线,可以用θ1 = 26780.09 和θ2 = 9312.57 绘制。
注意-θ1 是直线的截距,θ2 是直线的斜率。最佳拟合线是最适合可用于预测的数据的线。
用于解释线性回归假设的数据集描述
所使用的数据集是广告数据集。该数据集包含关于花费在广告上的钱及其产生的销售额的信息。钱花在了电视、广播和报纸广告上。它有 3 个特点,即电视,广播和报纸和 1 个目标销售。

First 5 rows of the data set
线性回归的假设
线性回归算法有 5 个基本假设:
- 特性和目标之间的线性关系:
根据这一假设,在特征和目标之间存在线性关系。线性回归只捕捉线性关系。这可以通过绘制特征和目标之间的散点图来验证。


电视与销售的第一个散点图告诉我们,随着电视广告投资的增加,销售也线性增加,第二个散点图是广播与销售的散点图,也显示了它们之间的部分线性关系,尽管不是完全线性的。
2。要素之间很少或没有多重共线性:
多重共线性是独立变量之间高度相关或关联的状态。因此,如果数据中存在干扰,就会削弱回归模型的统计能力。配对图和热图(相关矩阵)可用于识别高度相关的特征。

Pair plots of the features
上面的配对图显示特征之间没有显著的关系。

Heat Map(Correlation Matrix)
该热图为我们提供了每个要素之间的相关系数,而这些系数又小于 0.4。因此,这些要素之间的相关性并不高。
为什么移除高度相关的特征很重要?
对回归系数的解释是,当所有其他特性保持不变时,它代表特性中每个单位变化的目标的平均变化。然而,当特征相关时,一个特征的变化又会转移另一个特征。相关性越强,改变一个特性而不改变另一个特性就越困难。模型很难独立地估计每个特征和目标之间的关系,因为这些特征趋向于一致地变化。
多重共线性可以如何处理?
如果我们有两个高度相关的特征,我们可以丢弃一个特征或者组合这两个特征以形成新的特征,该新的特征可以进一步用于预测。
3。同方差假设:
同方差描述了误差项(即特征和目标之间关系中的“噪声”或随机干扰)在所有独立变量值中相同的情况。残差值与预测值的散点图是检查同质性的好方法。分布中不应该有明确的模式,如果有特定的模式,数据就是异方差的。

Homoscedasticity vs Heteroscedasticity
最左边的图显示了没有明确的模式,即残差中的恒定方差,中间的图显示了误差随着预测值违反恒定方差规则而增大然后减小的特定模式,最右边的图也显示了误差随着预测值减小而减小的特定模式,描述了异方差性
给定数据集的残差图的 Python 代码:

Error(residuals) vs Predicted values
4。误差项的正态分布:
第四个假设是误差(残差)遵循正态分布。然而,一个鲜为人知的事实是,随着样本量的增加,残差的正态性假设不再需要。更准确地说,如果我们考虑从总体中重复抽样,对于大样本量,回归系数的普通最小二乘估计的分布(跨重复样本)遵循正态分布。因此,对于中等到大样本量,残差的非正态性不会对通常的推断过程产生不利影响。这个结果是统计学中一个极其重要的结果的推论,被称为中心极限定理。
残差的正态分布可以通过绘制 q-q 图来验证。

Q-Q Plots
使用 q-q 图,我们可以推断数据是否来自正态分布。如果是,该图将显示相当直线。从直线上的偏差可以看出误差缺乏正态性。

Q-Q Plot for the advertising data set
广告数据集的 q-q 图显示误差(残差)相当正态分布。假设 3 中“误差(残差)与预测值”的直方图也显示误差正态分布,平均值接近 0。
5。残差中很少或没有自相关:
当残差相互依赖时,就会出现自相关。误差项中相关性的存在大大降低了模型的准确性。这通常发生在下一个时刻依赖于前一个时刻的时间序列模型中。
自相关可以借助杜宾-沃森检验来检验。检验的无效假设是不存在序列相关性。德宾-沃森检验统计量定义为:

检验统计量约等于 2*(1-r),其中 r 是残差的样本自相关。因此,对于 r == 0,表示没有序列相关性,检验统计量等于 2。该统计值将始终介于 0 和 4 之间。统计值越接近 0,正序列相关的证据就越多。越接近 4,负序列相关性的证据越多。

Summary of the fitted Linear Model
从上面的总结注意到,Durbin-Watson 测试的值是 1.885,非常接近 2,如前所述,当 Durbin-Watson 的值等于 2 时,r 从等式 2*(1-r)中取值 0,这又告诉我们残差不相关。
结论:
在将线性回归模型拟合到给定的一组数据之前,我们已经完成了必须牢记的最重要的假设。这些假设只是一种形式上的检查,以确保我们构建的线性模型为给定数据集提供了最佳的可能结果,并且这些假设如果不满足,也不会阻止我们构建线性回归模型。
数据科学中的异步工作流

对各地的数据科学家来说,毫无意义地盯着实时日志并等待奇迹发生是一种巨大的时间浪费。相反,应该努力实现异步工作流。在本文中,我们定义了异步工作流,指出了一些障碍,并最终引导您阅读下一篇文章,了解 Jupyter 笔记本中的一个实际例子。
什么是同步工作流?
在我们谈论异步工作流之前,我们必须定义同步工作流。同步工作流是创建和测试的迭代循环,在任何时候都只有一个或另一个在进行。例如在软件开发中,你写代码,测试它,然后写更多的代码,然后测试这些代码,写更多的代码,再次测试,编码,测试,编码,测试,编码…重复直到 IPO。简单!
同步工作流经常如此根深蒂固地存在于我们的做事方式中,以至于我们甚至没有意识到它是一件事情。这也是为什么它经常不被质疑的原因。很难质疑你甚至没有意识到存在的东西。

虽然软件开发和机器学习的周期是一样的,但我们可以看到它们之间有巨大的差异。
在软件开发中,你通常会很快得到结果。想象一下改变一个网页表单的布局或者你的手机游戏的物理公式。与编写代码所花的时间相比,测试结果所花的时间可能微不足道。另一方面,在机器学习中,情况正好相反。改变几个超参数的时间,比起看到训练结果的时间,往往只是一眨眼的功夫。
衡量成功的真正标准是能在 24 小时内完成的实验数量。
~托马斯·A·爱迪生
如果我们从上面看我们的机器学习时间线,并想象它是 24 小时,很明显我们没有将许多实验挤进去。等待训练结果是在吃我们的大部分时间。幸运的是,编码和等待之间有一个重要的区别:
一个人一次只能编写一个东西,却要等待无限的测试。
这就是我们所说的异步工作流。

当您创建一个模型并开始训练它时,重点不是喝杯咖啡,然后盯着输出日志的深渊几个小时。相反,在前一个实验还在运行的时候,同时开始另一个实验。这就是机器学习的异步工作流。
为什么我们不这样做?
为什么人们仍然坚持同步周期,而它显然不是最优的?有几个常见的原因:
缺少工具

大部分工具还是软件工程师为软件工程师做的。在软件工程中,同步工作流是标准。写一些代码,按下“播放”,等待结果。如果该工具的核心设计理念是同步的,那么工作流最终也会同步也就不足为奇了。
害怕失去工作

当一个人开始分支很多,并行运行几十件事情时,就会增加精神混乱,害怕失去工作或点击错误的东西。毕竟,一次只做一件事感觉更直接、更安全。
太专业了

在某些情况下,实际上更喜欢异步工作的人做不到。这需要额外的技能,如设置服务器或编写大量的粘合代码,因此他们被迫退回到默认的同步工作流。
是什么让我们这么做?
假设我们知道异步工作流是一种可行的方式,并且已经列出了一些常见的障碍,那么对一种工具的要求是什么呢?
简单的工具

该工具需要像同步“竞争者”一样简单。想象一下,你有两个选择来选择一个你每天都要使用的工具。你很可能选择更容易的,即使你知道更难使用的会更好。例如,如果启动一个新的测试对于同步工具来说只是一次点击,那么对于异步工具来说就不能是三次点击和一个 CLI 命令。一天重复 30 次的痛苦会让你回到以前的生活方式。
不具侵入性

从一个分支到几十个平行分支的转变伴随着认知负荷的增加。仅仅因为一直盯着您的现场测试的输出日志不是最佳的,这并不意味着您不应该不时地偷看一下。另一方面,当你试图编码时,你也不能有一个持续不断的通知消息流或者在你的屏幕上有一打闪烁的灯。一个好的异步工具应该退居二线,并且非常小心地平衡你的注意力。
安全的

多个同时分支的混乱局面给记账带来了更大的压力。如果工具不能以一种安全、直接和透明的方式组织和控制雪崩式的测试和实验,你最终会丢失工作或者在这个过程中犯认知错误。
完美的工具存在吗?
Valohai 是一个机器学习平台,它可以帮助您在云中执行按需实验,并具有完全的版本控制。我们已经开发了一个 Jupyter 笔记本扩展,它被专门优化来提供本文中描述的平滑异步工作流。在下一篇博文中,我们将向你展示 Valohai 的 Jupyter 笔记本扩展在实践中是如何工作的。
【https://blog.valohai.com】最初发表于。
你会在什么年龄获得诺贝尔奖?让我们用 r 来形象化。
让我们一起来探索你身边所有的数字中隐藏着什么。我们将可视化诺贝尔奖获得者的数据集,并用 r。

诺贝尔奖(Nobel Prize),任何一个奖项(1969 年前共有五个,后来增加了第六个),每年由瑞典发明家和实业家 阿尔弗雷德·诺贝尔 遗赠给的基金颁发。诺贝尔奖被广泛认为是世界上授予智力成就的最有声望的奖项。—britannica.com
让我们发现
使用的数据集可以从 kaggle 下载。
我们将尝试想象(接受诺贝尔奖时)的年龄是如何随时间变化的。

从中我们可以观察到,平均年龄几乎保持不变,直到 1950 年,此后,获奖者在接受奖励时的年龄不断增加,几乎增加了 8 岁。
我们使用了库' tidyverse '来执行所有的操作。 tidyverse 是一个非常有用的库,它装载了几个包,比如' dplyr '、 ggplot2 '、 dbplyr '、 lubridate '、 readxl '、
**—“tidyverse”是一组协调工作的包,因为它们共享公共数据表示和“ API ”设计。该软件包旨在使在一个步骤中安装和加载多个' tidyverse '软件包变得容易。
函数' read.csv '从 csv 文件中读取数据,并作为一个数据帧存储到一个变量中,这里命名为' nobel '。
函数“ 突变 ”添加新变量并保留数据框中已有的变量。这里, mutate 在数据帧中增加一个新列,命名为' age '。
年龄是用另一个函数 计算出来的。Date’,它在字符表示和表示日历日期的类“ Date ”的对象之间进行转换。
最后,和 ggplot 和用于绘制散点图。使用变量“年在 x 轴上绘制散点图,而“年龄”在 y 轴上绘制散点图。 geom_point 用于绘制点(dots),我们也可以指定每个点的大小。这里,大小被指定为“ 3 ”,并且 alpha 被设置为“ 0.5 ”,这有助于定义点的不透明度(透明度),进而有助于识别点的重叠。**
*****#Load Required Libraries** library(tidyverse)nobel <- read.csv("nobel.csv")
nobel_age <- nobel %>%
mutate(age = year - year(as.Date(birth_date)))ggplot(nobel_age,aes(x=year,y=age)) + geom_point(size = 3, alpha = 0.5,color = "black") + geom_smooth(aes(fill = "red")) + xlab("Year of Nobel Prize Distribution") + ylab("Age while Receiving the Prize")***
让我们探索一下
看到上面的图的一个问题是,它反映了非常少的信息。在数据可视化中,使用颜色或形状弹出数据的作用类似于糖块中的糖。
从下面的图表中我们观察到三个类别''、 、医学 '、 物理学 '观察到一些相似的趋势,所有这些类别的平均年龄在这些年中不断增加。最大的偏差可见于类别'物理'。唯一显示平均年龄逐年下降的类别是“”类别。而类别''和' 文学 '这些年来几乎保持不变。我们可以从图表中得出的一个更重要的观察结果是,在类别“和平”中,分数分布更广,这表明许多获奖者的平均年龄与相差甚远。******
如果你获得了几个奖项的诺贝尔奖,你的假设年龄是多少?
- 化学,年龄= 70 |最有可能:(年龄> 70)
- 经济学,年龄= 69 |最有可能:(67
- Literature, Age = 70 | Most probable: (67
- Medicine, Age = 68 | Most probable: (Age > 52)
- 和平,年龄= 55|最有可能:(年龄< 65)
- Physics, Age = 69| Most probable: (Age > 66)

让我们来理解帮助我们获得上述结果的代码。我们加载了本文前面加载的同一个库。
facet _ wrap-将 1d 序列的面板包装成 2d。这通常比'【facet _ grid()'更好地利用了屏幕空间,因为大多数显示器大致是矩形的。
gg plot ly—将' ggplot2 '转换为' plotly ',此函数将一个' ggplot2::ggplot() '对象转换为一个' plotly '对象。**
那么下面的代码实际上是做什么的呢?
使用 ggplot 函数生成一个图,其中突变的数据帧' nobel_age 作为数据, x 轴和 y 轴分别指定为' year 和' age '。 geom_point 用于指定散点图的绘制,而geom _ smooth用于在过度绘制的情况下帮助眼睛看到图案,在过度绘制的情况下,颜色和填充由变量“ category 定义,这有助于为不同类别绘制不同颜色的图形。例如,如果我们必须为一家巧克力商店绘制一个图表,并考虑有三个类别“牛奶”、“白色”、“深色”,那么上述方法将用不同的颜色绘制不同类别的所有点,以帮助我们以更好的方式区分这些点。 facet_wrap 这里,用不同的类别对每个支线剧情进行剧情划分,从而获得基于类别划分的六个不同的支线剧情。****
****#Load Required Libraries** library(tidyverse)
library(plotly)nobel <- read.csv("nobel.csv")
nobel_age <- nobel %>%
mutate(age = year - year(as.Date(birth_date)))p <- ggplot(nobel_age,aes(x=year,y=age)) +
geom_point() +
geom_smooth(aes(colour = category, fill = category)) +
facet_wrap(~ category)ggplotly(p)**
在 R 中小心地附加包
使用显式名称空间减少冲突,使您的源代码更加简洁,未来更加安全

R packages exporting the same symbol lead to conflicts when imported into the global namespace (Photo by Siala on pixabay)
当通过 library()调用在脚本顶部附加几个库时,R 中的一个常见问题就会出现。将所有符号加载到全局 R 环境中通常会导致名称冲突。最后导入的包赢得了战斗——顺序很重要,根据这个顺序,库出现在脚本的顶部!
R 是一种快速发展的语言,有一个生动的社区贡献了无数的包(c.f. R 包文档)。昨天的脚本很可能明天就不工作了,因为一个更新的包现在导出了一个与另一个全局附加包冲突的函数。
所以我在这里提出注意使用将包附加到全局 R 环境中。尽量减少 library()调用,对其他包改用 requireNamespace()。使用显式名称空间比如
requireNamespace("lubridate") # at the top of your file
# ... some code
lubridate::ymd(20190130)
代替
library(lubridate) # at the top of your file
# ... some code
ymd(20190130)
requireNamespace()加载包,将其留在自己的名称空间中。如果缺少所需的包,调用会产生异常。
这可能看起来很尴尬。但是:它使代码更加简洁,并且在其他软件开发领域(例如 Python)被视为一种好习惯。否全局附件的候选对象可能是很少使用的函数或包,从而导致名称冲突。通常,我用重载操作符全局导入包,比如 dplyr 的% > %操作符。
例如:我的一个脚本头看起来像这样:
library(dplyr)
library(tidyr)
library(readr)
library(ggplot2)
requireNamespace(“lubridate”)
requireNamespace(“glue”)# here comes my code
使用 data()调用的 package 参数从未附加的包中加载数据:
requireNamespace("psd")
data(magnet, package = "psd")
为什么 requireNamespace()很重要
不在顶部附加包的缺点是你的脚本可能会遇到这样的错误
Error in loadNamespace(name) : there is no package called ‘lubridate’
如果当前的 R 安装缺少所需的包,则在稀有程序路径的深度。这让人很不舒服,也很意外!
在像 R 或 Python 这样的动态类型语言中,确保软件完整性具有挑战性。编译语言在更早的时候抱怨缺少库:在编译时(如果静态链接)或者至少在启动应用程序时(如果动态链接)。
警告:有些 R 包在没有全局附加它们的名称空间的情况下无法工作——所以在这些情况下,你必须使用 library()来代替。这个问题的一个例子是 psd 包(版本 1.2.0):
data(magnet, package = "psd")
x <- magnet$clean
spec <- psd::pspectrum(x, plot = TRUE)
给出错误
Stage 0 est. (pilot)
environment ** .psdEnv ** refreshed
detrending (and demeaning)
Error in psdcore.default(as.vector(X.d), X.frq = frq, ...) :!is.null(ops) is not TRUE
结论
通过使用显式名称空间编写健壮而简洁的 R 脚本。此外,R 脚本对其他人来说可读性更好:函数在哪个包中被调用是很清楚的!
用 Fast.ai 攻击有毒评论 Kaggle 比赛
如何从头开始构建多标签 NLP 分类器

K aggle 是学习和练习你的机器学习技能的好地方。这也是为你的学习项目寻找合适的数据集的好地方。我需要一个好的分类 NLP 数据集来实践我最近学习的 fast.ai 课程,我遇到了有毒评论分类挑战。比赛是两年前举行的,早就结束了,但提交我的分数并看看我做得有多好也无妨。这是 Kaggle 的优势之一,因为在现实世界中,通常很难知道你的模型是好是坏,而在 Kaggle 中,你可以清楚地看到你的表现在排行榜上的位置。
数据集
他的比赛由对话人工智能团队举办,这是一个由竖锯和谷歌(都是 Alphabet 的一部分)创立的研究项目。它的目标是找出能够在评论中对多种毒性类型进行分类的最佳模型。毒性类型包括:
有毒的
严重 _ 有毒
猥亵的
威胁
侮辱
同一性 _ 仇恨
在训练文件train.cvs和测试文件test.csv中给出了注释。你需要为test.csv中的每条评论预测每种毒性的概率。这是一个多标签的 NLP 分类问题。
看数据
L et 先来看看数据。我们需要导入必要的模块,并做一些后勤工作来为我们的文件设置路径。
import numpy as np *# linear algebra*
import pandas as pd *# data processing, CSV file I/O (e.g. pd.read_csv)* from fastai.text import *
from fastai import *
注意这里我们从 fastai.text 和 fastai 模块导入了所有内容。我们反对这里的软件工程最佳实践吗?实际上,不完全是。这是一种更具迭代性和互动性的数据科学方式的深思熟虑的举措。有了所有可用的库,我可以轻松地测试和尝试不同的功能/模块,而不必每次都返回并导入它们。这将使探索/实验流程更加顺畅。不过我跑题了,我们来加载数据看看:
# Kaggle store dataset in the /kaggle/input/ folder,
path = Path('/kaggle/input/jigsaw-toxic-comment-classification-challenge/')
path.ls()# the /kaggle/input/ folder is read-only, copy away so I can also write to the folder.
!mkdir data
!cp -a {path}/*.* ./data/
!ls data# make sure everything is correctly copied over
path = Path('/kaggle/working/data/')
path.ls()# read in the data and have a peak
df = pd.read_csv(path/'train.csv')
df.head()

The toxicity types are one-hot encoded
注释在comment_text列中,所有毒性类型都是“一次性”编码的,我们将不得不对其进行一些处理,以使其适合我们以后的模型。

Have a look at one comment
迁移学习:微调我们的语言模型

我们将使用迁移学习来完成这项任务,为此,我们将使用一个基于维基百科的预训练模型,名为 wikitext-103 。这是一个已经从维基百科数据集(或 NLP 术语中的“语料库”)中训练出来的模型,用于从给定的未完成句子中预测下一个单词。我们将利用模型已经从维基百科数据集学习到的“语言知识”,并在此基础上进行构建。为了达到最佳效果,我们需要“微调”模型,使它从我们的“评论”数据集中学习一些东西,因为人们在评论中所说的不一定与更正式的维基相同。一旦对语言模型进行了微调,我们就可以使用它来进一步完成分类任务。
现在让我们将训练数据加载到 fast.ai databunch中,以便我们可以首先开始训练语言模型。
bs = 64 # set batch size to 64, works for Kaggle Kernels
data_lm = (TextList.from_df(df, path, cols='comment_text')
.split_by_rand_pct(0.1)
.label_for_lm()
.databunch(bs=bs))
我们使用 fast.ai 的Data Block API来完成这项任务。这是一种非常灵活和强大的方法,可以解决构建管道的挑战性任务:将数据加载到模型中。它将整个过程隔离为不同的部分/步骤,每个步骤都有多种方法/功能来适应不同类型的数据和数据存储方式。这个概念很像 Linux 哲学,高度模块化,每个模块只做一件事,但做得非常非常好。您可以在这里自由探索美妙的 API ,尽管对于上面的代码,它做了以下事情:
- 从名为
df的 Pandas DataFrame 导入数据,告诉模型使用comment_text作为输入(TextList.from_df(df, path, cols=’comment_text’)) 注意这里我也可以将 test.csv 包含到语言模型中。这不被认为是“作弊”,因为我们没有使用标签,只是做语言模型训练。 - 将训练数据集按随机的 10/90%分成训练/验证集。(
.split_by_rand_pct(0.1)) - 忽略给定的标签(因为我们只是微调语言模型,而不是训练分类器),并使用语言模型的“预测下一个单词”作为标签。(
.label_for_lm()) - 将数据构建到一个
databunch中,批量大小为bs。(.databunch(bs=bs))
现在让我们看看我们刚刚构建的databunch:

Notice we lost all the toxicity types
请注意,databunch没有所有的毒性类型标签,因为我们只是微调了语言模型。
好了,是时候进行一些典型的 fast.ai 学习率调整和训练了:

我们将我们的databunch放入一个language_model_learner中,告诉它我们想要使用的语言模型库(AWD_LSTM),并分配一个默认的辍学率 0.3 。从LR Finder图中,找出最大的下降斜率,选取中间点作为我们的学习率。(关于如何实现这种‘fit _ one _ cycle’魔法的更详细解释,请参考这篇文章。它是 fast.ai 的一种 SOTA 技术,结合了学习率和动量退火)。现在,我们可以“解冻”模型,并训练几个时期的整个模型:

我们可以看一个模型表现如何的例子:

结果很难说是最佳的。但我们至少得到了一个实际上有意义的句子,并且预测下一个单词的 0.38 的准确度还不错。理想情况下,我们需要训练更多的纪元,但对于这个 Kaggle 内核,我用完了 GPU 配额,所以我停在了 4。结果肯定有提升的空间,可以自己试试。反正我们想从语言模型中得到的是编码器部分,所以我们把它保存下来。
训练语言模型确实需要相当长的时间,但好消息是,对于您自己的领域语料库,您只需训练一次,以后您可以将它用作任何其他分类任务的基础。
*# save the encoder for next step use*
learn.save_encoder('fine_tuned_enc')
迁移学习:训练分类器
让我们来看看测试数据集:
test = pd.read_csv(path/"test.csv")
test_datalist = TextList.from_df(test, cols='comment_text')
再次,建造我们的databunch:
data_cls = (TextList.from_csv(path, 'train.csv', cols='comment_text', vocab=data_lm.vocab)
.split_by_rand_pct(valid_pct=0.1)
.label_from_df(cols=['toxic', 'severe_toxic','obscene', 'threat', 'insult', 'identity_hate'], label_cls=MultiCategoryList, one_hot=True)
.add_test(test_datalist)
.databunch())
data_cls.save('data_clas.pkl')
请注意这次的不同之处:
- 在构建
*TextList*时,我们指定了*vocab=data_lm.vocab*,这样我们就确保了我们使用的是相同的词汇,并且我们在语言模型上的训练可以恰当地应用到分类器模型上。 - 我们现在使用我们所有的毒性风格标签(
.label_from_df(cols=[‘toxic’, ‘severe_toxic’,’obscene’, ‘threat’, ‘insult’, ‘identity_hate’],label_cls=MultiCategoryList, one_hot=True),) - 我们在这里添加了我们的测试集。(
.add_test(test_datalist))
现在看看我们的分类器databunch:

Note that now we have all the toxicity styles labels
最后,是时候把所有东西放在一起了!我们将把databunch放到text_classifier_learner模型中,并加载我们从语言模型中学到的编码器。
learn = text_classifier_learner(data_clas, AWD_LSTM, drop_mult=0.5)
learn.load_encoder('fine_tuned_enc')
再次,找到最佳学习率,训练一个周期:

多训练几个周期,然后解冻:



查看结果:

差了一个,但总体来说预测是好的。作为参考,我将预测提交给 Kaggle,得到一个 0.98098 的公众分数(落在公众领袖板的中间)。结果不是最佳的,但是就像我说的,由于 GPU 有限,我没有全程训练。本文的目的是向您展示使用 fast.ai 处理多标签文本分类问题的整个过程。这里真正的挑战是使用数据块 API 将数据加载到模型中。
结论
我希望你能从这篇文章中学到一些东西。Fast.ai 真的是一个精简、灵活、强大的库。对于它能做的事情(像图像/文本分类,表格数据,协同过滤等。),它做得很好。它不像 Keras 那样广泛,但它非常尖锐和集中。有点像 Vim 和 Emacs,如果你熟悉命令行文本编辑器 war 的话。😜
你可以在这里找到 Kaggle 内核。
欢迎任何反馈或建设性的批评。你可以在推特 @lymenlee 或者我的博客网站【wayofnumbers.com上找到我。
注意及其不同形式
概括注意的不同类型和用途。

(Source)
我假设你已经熟悉递归神经网络(包括 seq2seq 编码器-解码器架构)。
瓶颈问题
在编码器-解码器架构中,完整的信息序列必须由单个向量捕获。这给在序列开始时保留信息和编码长程相关性带来了问题。

注意力的核心思想是关注每个输出的输入序列中最相关的部分。
通过为输入提供一条直接的路径,注意力也有助于缓解渐变消失的问题。
计算注意力
假设您有一个顺序解码器,但是除了前一个单元的输出和隐藏状态之外,您还要输入一个上下文向量 c 。

其中 c 是编码器隐藏状态的加权和。

这里 αᵢⱼ 是第 i 个输出应该关注第 j 个输入的量,而 hⱼ 是第 j 个输入的编码器状态。
αᵢⱼ 通过对输入相对于 i th 输出的注意力分数取软最大值来计算,用 e、表示。

在哪里

这里 f 是对齐模型,其对位置 j 周围的输入和位置 i 处的输出的匹配程度进行评分,并且 sᵢ₋₁ 是来自前一时间步的隐藏状态。

对齐模型可以通过小型神经网络来近似,然后可以使用任何梯度优化方法(例如梯度下降)来优化整个模型。

Graphic illustration of the attention mechanism (Source)
上下文向量 cᵢ 也可以用于计算解码器输出 yᵢ 。
应用:机器翻译
注意力首先由 Bahdanau 等人[1]提出,用于神经机器翻译。该机制对于机器翻译特别有用,因为与输出最相关的单词经常出现在输入序列中的相似位置。

(Source)
上面的矩阵显示了与每个翻译输出单词最相关的输入单词。
这样的注意力分布也有助于为模型提供一定程度的可解释性。
普遍注意力
给定一个查询 q 和一组键-值对 (K,V) ,注意力可以概括为计算依赖于查询和相应键的值的加权和。
查询确定关注哪些值;我们可以说查询“关注”了这些值。

在前面的计算中,查询是前一个隐藏状态 sᵢ₋₁ ,而编码器隐藏状态集 h₀ 到 hₙ 表示键和值。
反过来,对准模型可以以各种方式计算。

自我关注
有了自我关注,每一个隐藏状态都会关注同一个 RNN 的先前隐藏状态。

这里 sₜ 是查询,而解码器隐藏状态 s₀ 到 s ₜ₋₁ 表示键和值。
应用:语言建模
论文“指针哨兵混合模型”[2]使用自我注意进行语言建模。
基本思想是,细胞的输出“指向”先前遇到的具有最高注意力分数的单词。然而,该模型还在词汇 V 上使用标准的 softmax 分类器,使得它除了从最近的上下文中再现单词之外,还可以预测不存在于输入中的输出单词。

(Source)
在指针词汇表分布中分配给给定单词的概率是分配给给定单词出现的所有标记位置的概率之和

其中 I(w,x) 在输入 x 和 pₚₜᵣ∈ Rⱽ 中得到单词 w 的所有位置。这种技术被称为指针和注意力。
该模型使用门 g 将 softmax 词汇分布与指针词汇分布相结合,该门被计算为查询和标记向量的乘积。

(Source)

An output example (Source)
申请:总结
论文“用于抽象概括的深度强化模型”3介绍了一种具有新颖的自我关注的神经网络模型,该模型分别关注输入和连续生成的输出,

(Source)
所涉及的计算可以总结如下。

(Source)

An output example (Source)
多头注意力
多重查询
当我们有多个查询时,我们可以把它们堆在一个矩阵中。
如果我们使用基本的点积注意力来计算对齐,则用于计算上下文向量的方程组可以简化如下。

(Source)
多头关注更进了一步。
使用权重矩阵将 q、K 和 V 映射到较低维度的向量空间,然后将结果用于计算注意力(其输出我们称为“头部”)。

我们有 h 组这样的权重矩阵,这给了我们 h 个头。

然后,使用输出权重矩阵连接和变换 h 个头。

变形金刚(电影名)
变压器是在论文“你所需要的只是注意力”中首次提出的[4]。它基于这样一种思想,即序列模型可以完全省去,输出可以仅使用注意机制来计算。
转换器使用单词向量作为键、值以及查询的集合。

Transformer’s Multi-Head Attention block (Source)
它包含多头注意力的块,而注意力计算本身是成比例的点积注意力。

(Source)
其中 dₖ 是查询/关键向量的维度。
执行缩放是为了使 softmax 函数的参数不会因更高维的键而变得过大。
下面是完整的变压器模型图,以及一些带有附加细节的注释。有关更深入的解释,请参考附加资源。

(source)
额外资源
- deeplearning.ai 的注意力模型直觉(C5W3L07) 和注意力模型(C5W3L08)
- “注意?注意!”由莉莲翁
- 《注意力和增强的递归神经网络》作者 Olah & Carter,Distill,2016
- 《图解变形金刚》杰伊·阿拉玛
参考
[1] D. Bahdanau,K. Cho 和 Y. Bengio,通过联合学习对齐和翻译进行神经机器翻译(2014)
[2] S. Merity,C. Xiong,J. Bradbury 和 R. Socher,Pointer Sentinel 混合模型(2016)
3 R. Paulus,C. Xiong,R. Socher,抽象概括的深度强化模型(2017)
[4] A .瓦斯瓦尼、n .沙泽尔、n .帕马尔、j .乌兹科雷特、l .琼斯、A. N .戈麦斯、l .凯泽、I .波罗苏欣,《你只需要关注》(2017)
基于注意力的神经机器翻译

通过在翻译过程中选择性地关注句子的子部分,注意力机制正越来越多地用于提高神经机器翻译(NMT)的性能。在这篇文章中,我们将介绍两种简单的注意力机制: 全局方法 (关注所有源词)和 局部方法 (只关注源词的子集)。请记住,源指的是编码器,目标指的是解码器。
本博客将涵盖 这篇 的论文,这篇论文证明了增加注意力可以导致比基于非注意力的网络显著的性能提升。在上述论文中提出的系综模型为 WMT 的 15 英德翻译产生了一种新的艺术状态模型。
除了提高机器翻译练习的性能,基于注意力的网络还允许模型学习不同模态(不同数据类型)之间的对齐,例如语音帧和文本之间或者图片的视觉特征和其文本描述之间的对齐。
神经机器翻译(NMT)
NMT 是一个巨大的神经网络,它被训练成端到端的方式,用于将一种语言翻译成另一种语言。下图是基于 RNN 的编码器-解码器架构的 NMT 的示意图。

Figure 1 : Neural machine translation as a stacking recurrent architecture for translating a source sequence A B C D into a target sequence X Y Z. Here
NMT 直接模拟翻译源的条件概率【p(y/x)】(x1,x2…xn) 句转化为目标句 (y1,y2…yn) 。
NMT 由两部分组成:
- 编码器,为每个源语句计算表示 S
- 一种解码器,一次生成一个单词的翻译,因此将条件概率分解为:

A probability of translation y given the source sentence x
可以将解码每个字 y(j)的概率参数化为

其中 h(j) 可以建模为

RNN hidden unit definition (h)
其中
g:a变换函数,输出词汇大小向量
h : RNN 隐藏单元
f :给定先前隐藏状态,计算当前隐藏状态。
翻译流程的 培训目标 可以被框定为

Loss Function
是什么让 NMT 如此受欢迎?
- NMT 在大规模翻译任务中,如英语到法语/德语的翻译,已经达到了艺术水平。
- NMT 需要最少的领域知识,概念上非常简单。
- NMT 的内存占用很小,因为它不存储庞大的相位表和语言模型。
- NMT 能够很好地概括很长的单词句子。
注意网络和非注意网络的区别
在大多数基于非注意力的 RNN 架构信源表示中, S 仅被使用一次来初始化解码器隐藏状态。[在图 1 中,解码器只能访问编码器的最后一层]
另一方面,基于注意力的网络在整个翻译过程中指的是一组源隐藏状态。[在图 2 中,解码器可以访问编码器的所有隐藏状态]
注意机制的类型

Figure 2: NMT with attention and input-feeding approach
上图重点描绘了基于 RNN 的编码器-解码器架构。正如我们之前解释的,注意力可以大致分为两种类型:
- 全局关注:关注所有源位置。
- 局部注意:只注意几个源位置。
这两种基于注意力的模型仅在解码阶段不同于普通的编码器-解码器架构。这些基于注意力的方法的不同之处在于它们计算上下文向量的方式(【c(t)】)。

Figure 3: Hidden state of NMT architecture with global attention
图 3 的术语表如下
【t】:隐藏目标状态
c(t) :源端上下文向量
y(t) :当前目标词
h _ bar(t):注意隐藏状态
a(t) :对齐向量
如何计算注意力?
这两种基于注意力的方法都有以下共同步骤:
- 这两种方法首先将堆栈 LSTM 顶层的隐藏状态【h(t)】作为输入。(棕色单元格/解码器的目标状态)
- 派生【c(t)来捕获相关的源端信息,以帮助预测【y(t)(顶部蓝色单元格)。【c(t)基本上是你根据每个单词的对齐权重和编码器的隐藏状态为每个单词建立的上下文。
- 从 h(t)和 c(t)的简单串联计算【h _ bar(t)(顶部灰色单元格)。

与仅将编码器的最终输出提供给解码器的基于非注意力的架构相反,【h _ bar(t)具有对编码器的隐藏状态的所有状态的访问,这提供了源语句的信息视图。
4.使用 softmax 层转换注意力向量以产生预测分布。我们使用 softmax 层,因为我们必须从我们的词汇表中所有可用的单词中找到最可能的单词。

以上段落解释了基于注意力的网络的基本架构。在下面的段落中,我们将理解上下文向量【c(t)在局部和全局注意力中是如何不同地计算的,以及它的影响是什么。
- 全球关注
全局注意力考虑所有编码器隐藏状态以导出上下文向量(c(t))。为了计算 c(t), 我们计算 a(t) 这是一个可变长度的对齐向量。通过计算【t】和 h_bar(s) 之间的相似性度量来导出对齐向量,其中 h(t) 是源隐藏状态,而 h_bar(s) 是目标隐藏状态。编码器和解码器中类似的状态实际上指的是同一个意思。
对齐向量(a(t))
对齐向量(【t,s】)定义为

分数是一个基于内容的函数,可以使用以下任何一种替代方法:

The score function
通过得分函数,我们试图计算目标和源的隐藏状态之间的相似性。直观上,隐藏和源中的相似状态指的是相同的意思,但在不同的语言中。

Figure 4: Global attentional model: At each time step t, the model infers a variable-length alignment weight vector a(t) based on the current target state h(t) and all source states h_bar(s). A global context vector,c(t) is then computed as the weighted average, according to a(t), over all the source states.
图 4 中的连接线代表相互依赖的变量。
例如
- a(t) 依赖于 h(t)和 h_bar(s)
- c(t) 依赖于 a(t)和 h_bar(s)
- h_bar(t) 依赖于 c(t)和 h(t)
2.当地的关注
由于全局注意力集中在所有目标单词的所有源端单词上,这在计算上非常昂贵,并且在翻译长句时不切实际。为了克服这一缺陷,局部注意力选择只关注每个目标单词的编码器隐藏状态的一个小子集。
局部注意力有以下不同于全局注意力的步骤:
- 该模型首先在时间 t 为每个目标单词生成对齐位置 p(t) ,与假设单调对齐的全局注意模型相反,我们在局部注意中学习对齐位置。换句话说,除了学习翻译之外,你还可以学习翻译的顺序是否与源句子不同(源的单词 1 可能是翻译句子中的单词 4,因此我们需要计算这个,否则我们的相似性得分将完全错误,因为我们的注意力将集中在源句子中与源句子的单词 1 不相关的单词上)。
- 上下文向量(c(t))被导出为窗口[p(t)-D,p(t)+D]内的源隐藏状态集合的加权平均值;d 是凭经验选择的。与全局对准向量相比,局部对准向量 a(t)现在是固定维度的。
到目前为止,我们一直假设翻译句子和源句子都是单调对齐的。在此基础上,我们对局部注意力有了进一步的区分,具体如下:
- 单调对齐( local-m )
Set p(t)=t,这意味着我们假设源序列和目标序列大致单调对齐。对齐向量与全局对齐相同

Local alignment is the same as that of global alignment
2。预测比对 ( 局部-p )
我们的模型不是假设单调排列,而是预测排列位置如下:

Alignment Position for local-p model
W(p) 和 v(p) 是模型参数,将学习这些参数来预测位置。
S 是源句长度
p(t):【0,S】
为了有利于对齐位置 p(t), 我们放置一个以 p(t)为中心的高斯分布。这赋予位置 p(t) 更多的权重。我们将校准权重修改为

Alignment vector for local-p model
去捕捉同样的东西。
总而言之,全局注意力在计算上更昂贵,并且对长句无用,而局部注意力集中在D【p(t)两侧的隐藏状态来克服这一点。局部注意有 2 种口味 local-m ( 源和目标对齐假设相同 ) 和 local-p (这里我们计算的是 p(t))。**
投入-供给方法
在所提出的注意机制中,独立地做出注意决定(先前预测的对准不影响下一次对准),这是次优的。为了确保未来的对准决策考虑到过去的对准信息 ,h_bar(t) 在下一时间步与输入连接,如图所示。
这样做是为了:
- 让模型完全了解之前的对齐选择。
- 创建一个横向和纵向都很深的网络。

Attentional Vectors h_bar(t) is fed to the next time steps to inform the model about past alignment decisions
在上面的文章中,我们和 NMT 一起讨论了注意力网络的基础知识。
参考
如果你对上面的帖子有任何想法或补充,请随时联系我。
注意力渴望 RNNS:建立变压器网络

将注意力放在你的神经网络上有点像想在工作时小睡一会儿。你知道这对你更好,每个人都想这样做,但每个人都害怕。
我今天的目标是什么都不假设,用动画解释细节,让数学再次伟大(MMGA?呃…)
这里我们将介绍:
- 简短的 RNN 评论。
- 短序列到序列模型审查。
- RNNs 中的注意。
- 注意力的改善。
- 变压器网络介绍。
递归神经网络(RNN)
RNNs 让我们在神经网络中模拟序列。虽然有其他方法来模拟序列,rnn 是特别有用的。rnn 有两种类型,LSTMs ( Hochreiter 等人,1997 )和 GRUs ( Cho 等人,2014 )。想要更深入的教程,请查看克里斯·科拉的教程。
让我们来看一个 RNN 的具体例子的机器翻译。
- 想象我们有一个有 56 个隐藏单元的 RNN。
rnn_cell = rnn_cell(input_dim=100, output_dim=56)
2.我们有一个单词“NYU ”,它由整数 12 表示,这意味着它是我创建的 vocab 中的第 12 个单词。
# 'NYU' is the 12th word in my vocab
word = 'NYU'
word = VOCAB[word]print(word)
# 11
除了我们没有将整数输入 RNN,我们使用了一个更高维的表示,这是我们目前通过嵌入获得的。嵌入让我们将一系列离散的记号映射到连续的空间中( Bengio 等人,2003 )。
embedding_layer = Embedding(vocab_size=120, embedding_dim=10)# project our word to 10 dimensions
x = embedding_layer(x)
一个 RNN 单元接受两个输入,一个字 x ,以及一个来自前一时间步 h 的隐藏状态。在每一个时间步,它输出一个新的h 。

RNN CELL: next_h= f(x, prev_h).
提示:对于第一步,h 通常为零。
# 1 word, RNN has 56 hidden units
h_0 = np.zeros(1, 56)
这很重要:RNN 细胞与 RNN 细胞是不同的。
在 RNN 术语中有一个主要的混淆点。在深度学习框架中,如 Pytorch 和 Tensorflow ,RNN 细胞是执行这种计算的单位:
h1 = rnn_cell(x, h0)
RNN 网络 for 在时间步长上循环单元
def RNN(sentence):
current_h = h_0 all_h = []
for word in sentence:
# use the RNN CELL at each time step
current_h = rnn_cell(embed(word), current_h)
all_h.append(current_h) # RNNs output a hidden vector h at each time step
return all_h
这里有一个 RNN 随着时间推移移动同一个 RNN 单元格的图示:

The RNN moves the RNN cell over time. For attention, we’ll use ALL the h’s produced at each timestep
序列对序列模式(Seq2Seq)
现在你是 RNNs 的专家了,但是让我们放松一下。

Chill
rnn 可以用作更大深度学习系统的模块。
一个这样的系统是由 Bengio 的小组( Cho 等人,2014 )和 Google ( Sutskever 等人,2014 )引入的 Seq2Seq 模型,它可以用于将一个序列翻译成另一个序列。你可以把很多问题框定为翻译:
- 把英语翻译成西班牙语。
- 将一个视频序列转换成另一个序列。
- 将一系列指令翻译成程序代码。
- 将用户行为转化为未来的用户行为
- …
- 唯一的限制是你的创造力!
seq2seq 模型无非是 2 个 rnn,一个编码器(E),一个解码器(D)。
class Seq2Seq(object): def __init__():
self.encoder = RNN(...)
self.decoder = RNN(...)
seq2seq 模型有两个主要步骤:
第一步:编码一个序列:
sentence = ["NYU", "NLP", "rocks", "!"]
all_h = Seq2Seq.encoder(sentence)# all_h now has 4 h (activations)

Encoding
第二步:解码生成“翻译”
这部分真的很复杂。前一步中的编码器一次处理完整的序列(即:这是一个普通的 RNN)。
在第二步中,我们一次运行解码器 RNN 一个步骤,以生成自回归预测(这是为了将前一步的输出用作下一步的输入)。
有两种主要的解码方式:
选项一:贪婪解码
- 运行解码器的 1 个步骤。
- 选择概率最高的输出。
- 使用此输出作为下一步的输入
# you have to seed the first x since there are no predictions yet
# SOS means start of sentence
current_X_token = '<SOS>'# we also use the last hidden output of the encoder (or set to zero)
h_option_1 = hs[-1]
h_option_2 = zeros(...)# let's use option 1 where it's the last h produced by the encoder
dec_h = h_option_1# run greedy search until the RNN generates an End-of-Sentence token
while current_X_token != 'EOS': # keep the output h for next step
next_h = decoder(dec_h, current_X_token) # use new h to find most probable next word using classifier
next_token = max(softmax(fully_connected_layer(next_h))) # *KEY* prepare for next pass by updating pointers
current_X_token = next_token
dec_h = next_h
这叫做贪婪,因为我们总是选择概率最高的下一个词。
选项 2:光束搜索
有一种更好的技术叫做波束搜索,它在解码过程中考虑多条路径。通俗地说,宽度为 5 的波束搜索意味着我们考虑具有最大对数似然的 5 个可能的序列(数学术语为 5 个最可能的序列)。
在高层次上,我们保留顶部 k(波束大小= k),而不是采用最高概率预测。注意下面,在每一步我们有 5 个选项(5 个可能性最大)。

Beam search figure found here
这个 youtube 视频有详细的光束搜索教程!
所以,用 greedy decoding 作为动画把【NYU NLP 很牛逼】翻译成西班牙语的完整 seq2seq 过程看起来是这样的:

Seq2Seq is made up of 2 RNNs an encoder and decoder
这个模型有各种部件:
- 蓝色 RNN 是编码器。
- 红色 RNN 是解码器
- 解码器顶部的蓝色矩形是一个带有 softmax 的完全连接层。这将挑选最有可能的下一个单词。
注意机制
好了,现在我们已经讨论了所有的先决条件,让我们进入正题。
如果你注意到前面的动画,解码器只查看编码器生成的最后一个隐藏向量。

事实证明,RNN 很难记住在这个单一向量的序列中发生的一切(Bahdanau 等人,2015 )。例如,当编码器处理完输入序列时,可能已经忘记了单词“NYU”。
注意力试图解决这个问题。
当你给一个模型一个注意机制时,你允许它在每个解码步骤中查看由编码器产生的所有 h。
为了做到这一点,我们使用一个单独的网络,通常是一个完全连接的层,它计算解码器想要查看多少 h。这被称为注意力机制。
想象一下,对于我们生成的所有 h,我们实际上只取其中的一点。它们的总和被称为上下文向量 c.

标量 0.3、0.2、0.4、0.1 称为注意力权重。在原始论文中,你会在第 3 页找到同样的等式:

Alphas are generated by a neural network + softmax.
这些权重由一个小型神经网络以这种方式生成:
# attention is just a fully connected layer and a final projection
attention_mechanism = nn.Linear(input=h_size+x_size, attn_dim=20)
final_proj_V = weight_matrix(attn_dim)# encode the full input sentence to get the hs we want to attend to
all_h = encoder(["NYU", "NLP", "is", "awesome"]# greedy decoding 1 step at a time until end of sentence token
current_token = '<SOS>'
while current_token != '<EOS>': # attend to the hs first
attn_energies = []
for h in all_h:
attn_score = attention_mechanism([h,current_token])
attn_score = tanh(attn_score)
attn_score = final_proj_V.dot(attn_score) # attn_score is now a scalar (called an attn energy)
attn_energies.append(attn_score) # turn the attention energies into weights by normalizing
attn_weights = softmax(attn_energies)
# attn_weights = [0.3, 0.2, 0.4, 0.1]
现在我们有了权重,我们用它们来提取可能与被解码的特定令牌相关的 h
context_vector = attn_weights.dot(all_h)
# this is now a vector which mixes a bit of all the h's
让我们把它分成几个步骤:
- 我们对完整的输入序列进行了编码,生成了一个 h 列表。
- 我们开始用解码器用贪婪搜索解码。
- 我们没有给解码器 h4,而是给了它一个上下文向量。
- 为了生成上下文向量,我们使用另一个网络和可学习的权重 V 来评分每个 h 与当前被解码的令牌的相关程度。
- 我们将那些 注意力 归一化,并使用它们将所有的 h 混合成一个 h,这有希望捕获所有 h 的相关部分,即:一个 上下文向量 。
- 现在,我们再次执行解码步骤,但这一次,使用上下文向量而不是 h4。
视觉化注意力
注意力权重告诉我们每个 h 有多重要。这意味着我们还可以可视化每个解码步骤的权重。以下是最初关注文件中的一个例子:

在第一行中,为了翻译“L”,网络在单词“the”上使用了一个字母,而将其余的字母置零。
为了生成单词“economique ”,该网络实际上在“欧洲经济”中放置了一些字母权重,而将其余的字母置零。这表明当翻译关系是多对一或一对多时,注意力是有用的。
注意力会变得复杂

注意力类型
这种类型的注意力只使用编码器产生的 h。有大量关于改进这一过程的研究。例如:
- 只使用一些 h,也许是你正在解码的时间步附近的 h(局部注意)。
- 除了 h 的 还有 使用我们之前扔掉的解码器生成的 h。
- …
如何计算注意力
另一个研究领域涉及如何计算注意力得分。除了 V 的点积,研究人员还尝试了:
- 缩放点积。
- 余弦(s,h)
- 不使用 V 矩阵,并将 softmax 应用于完全连接的层。
- …
计算注意力时用什么
研究的最后一个领域是,与 h 矢量相比,到底应该研究什么。
为了对我的意思建立一些直觉,考虑像键值字典一样计算注意力。关键是你给注意力网络“查找”最相关的上下文。该值是最相关的上下文。
我在这里描述的方法只使用当前令牌和每个 h 来计算关注度分数。那就是:
# calculate how relevant that h is
score_1 = attn_network([embed("<SOS"), h1])
score_2 = attn_network([embed("<SOS"), h2])
score_3 = attn_network([embed("<SOS"), h3])
score_4 = attn_network([embed("<SOS"), h4])
但实际上,我们可以给它任何我们认为有用的东西,来帮助注意力网络做出最好的决定。也许我们也给它最后一个上下文向量!
score_1 = attn_network([embed("<SOS>"), h1, last_context])
或者也许我们给它一些不同的东西,也许一个令牌让它知道它在解码西班牙语
score_1 = attn_network([embed("<SOS>"), h1, last_context, embed('<SPA>')])
可能性是无限的!
实施细节

如果你决定实现你自己的,这里有一些提示供你考虑。
- 使用脸书的实现,它已经真正优化。
好吧,好吧,那是逃避。以下是实际的建议。
- 记住 seq2seq 有两个部分:解码器 RNN 和编码器 RNN。这两个是分开的。
- 大部分工作都是在构建解码器。编码器只是在整个输入序列上运行编码器。
- 记住解码器 RNN 一步一步地操作。这是关键!
- 记住解码器 RNN 一步一步地操作。值得说两遍;)
- 解码算法有两种选择,贪婪或波束搜索。贪心更容易实现,但是波束搜索大多数时候会给你更好的结果。
- 关注是可选的!但是…当你拥有它时,影响是巨大的…
- 注意力是一个独立的网络……把这个网络想象成字典,其中的关键是你想让网络用来决定每个特定的 h 有多相关的东西的集合。
- 记住你是在计算每个 h 的关注度,这意味着你有一个 for 循环[h1,…,hn]。
- 嵌入 dim 的注意力网络可以任意高。这会让你的 RAM 爆炸。请确保将它放在一个单独的 GPU 上,或者保持 dim 较小。
- 让大型模型运行起来的一个技巧是将编码器放在一个 gpu 上,解码器放在第二个 gpu 上,注意力网络放在第三个 gpu 上。这样,您可以保持较低的内存占用。
- 如果您真的部署这个模型,您将需要批量实现它。我在这里解释的一切都是针对批量=1,但是你可以通过改变到张量积和聪明的线性代数来扩展到更大的批量。我在这里详细解释一下这个。
同样,大多数情况下,您应该只使用开源实现,但是自己做也是很好的学习体验!
关注后的生活
原来……注意力网络本身被证明是 真正的 强大。

以至于研究人员决定放弃 RNNs 和序列对序列的方法。相反,他们创造了一种叫做变压器模型的东西。
在高层次上,变压器仍然有一个编码器和解码器,只是各层完全连接,并立即查看完整的输入。然后,当输入在网络中移动时,注意力集中在重要的事情上。

Transformer illustration from here.
这种模型在很大程度上取代了 seq2seq 模型的翻译,并落后于目前最强大的模型, BERT 和 OpenAI 的 GPT 。
关注时间序列预测和分类
利用 NLP 的最新进展进行时间序列预测和分类
- 注意这篇文章发表于 10/18/19,我不知道为什么媒体说它来自 4/9/19。这篇文章包含了最近和最新的结果,包括将在 Neurips 2019 上发表的文章和刚刚在今年 8 月发表的预印本。
- 2020 年 8 月 24 日更新 : 很多人要求更新。我没有时间就这个主题写另一篇文章,但是你可以在流量预测库中找到 transformer 和其他几个模型的实现。
变形金刚(特别是自我关注)推动了 NLP 的重大进展。它们使伯特、GPT-2 和 XLNet 等模型形成了强大的语言模型,可用于生成文本、翻译文本、回答问题、分类文档、总结文本等等。随着他们最近在 NLP 中的成功,人们会期望对时间序列预测和分类等问题的广泛适应。毕竟,两者都涉及处理顺序数据。然而,到目前为止,关于它们适应时间序列问题的研究仍然有限。此外,尽管一些结果很有希望,但其他结果仍较为复杂。在本文中,我将回顾当前关于应用变压器的文献,以及对时间序列问题的更广泛关注,讨论当前的障碍/限制,并集思广益可能的解决方案,以(希望)使这些模型达到与 NLP 相同的成功水平。这篇文章假设你对软注意、、自我注意和 transformer 架构有一个基本的了解。如果你不喜欢,请阅读其中一篇链接的文章。你也可以观看我在 PyData Orono 展示之夜的视频。
关注时间序列数据:回顾
对时间序列数据进行准确预测和分类的需求跨越了几乎每个行业,并且远远早于机器学习。例如,在医院中,您可能希望尽早对死亡率最高的患者进行分类,并预测患者的住院时间;在零售业,你可能想预测需求和销售;公用事业公司希望预测用电量等。
尽管深度学习在计算机视觉方面取得了成功,但许多时间序列模型仍然很肤浅。特别是,在行业中,许多数据科学家仍然利用简单的自回归模型,而不是深度学习。在某些情况下,他们甚至可能使用像 XGBoost 这样的模型,以人工制造的时间间隔进行馈送。通常,选择这些方法的常见原因仍然是可解释性、有限的数据、易用性和培训成本。虽然没有单一的解决方案来解决所有这些问题,但深度模型提供了一个令人信服的案例。在许多情况下,它们以注意力热图的形式提供了整体性能改进(其他普通 lstm/rnn)和可解释性的好处。此外,在许多情况下,它们比使用 RNN/LSTM 更快(特别是使用我们将讨论的一些技术)。
一些论文研究了使用基本的和修改的注意机制的时间序列数据。 LSTNet 是最早提出对多元预测时间序列使用 LSTM +注意机制的论文之一。多变量时间序列预测的时间模式注意由 Shi Shun-Yao 等人提出,主要关注于应用特别针对多变量数据的注意。这种机制旨在解决多变量时间序列中包含噪声变量的问题,并引入一种比简单平均更好的方法。具体来说,
行上的注意力权重选择那些有助于预测的变量。因为上下文向量 vt 现在是包含跨多个时间步长的信息的行向量的加权和,所以它捕获时间信息。
简单地说,这旨在从各种特征时间序列数据中选择有用的信息来预测目标时间序列。首先,他们在 RNNs 隐藏状态的行向量上利用 2d 卷积。随后是一个评分函数。最后,他们使用 sigmoid 激活代替 softmax,因为他们期望多个变量与预测相关。其余的遵循一个相当标准的注意力练习。
Code for the temporal pattern attention mechanism. Notice that the authors choose to use 32 filters.

Diagram from the paper
就结果而言,该模型在预测太阳能和电力需求、交通和汇率方面优于(使用相对绝对误差)其他方法,包括标准自回归模型和 LSTNet。
尽管这篇文章没有使用自我关注,但我认为这是一个非常有趣且经过深思熟虑的对关注的使用。许多时间序列研究似乎集中于单变量时间序列数据。此外,那些研究多变量时间序列的人往往只扩展了注意机制的维度,而不是将其横向应用于特征时间序列。这可能是有意义的,看看是否修改自我注意机制可以选择相关的源时间序列数据来预测目标。本文的完整代码可在 GitHub 上公开获取。
自我关注到底是怎么回事?
在我们深入时间序列部分之前,让我们先简单回顾一下自我关注的几个细节。有关更详细的检查,请参见这篇关于注意力数学的文章或图示的转换图 r。对于自我注意力,回想一下,我们通常有查询、关键字、值向量,它们是通过嵌入与权重矩阵的简单矩阵乘法形成的。很多解释性文章没有提到的是查询、键和值通常可以来自不同的来源,这取决于任务,并且根据它是编码器还是解码器层而有所不同。例如,如果任务是机器翻译,编码器中的查询、键和值向量将来自源语言,但是解码器中的查询、键和值向量将来自目标语言。然而,在无监督语言建模的情况下,它们通常都是由源序列形成的。稍后我们将会看到,许多自我关注时间序列模型修改了这些值是如何形成的。
其次,自我注意通常需要位置编码,因为它不知道序列顺序。它通常通过添加到单词或时间步长嵌入而不是连接来结合这种位置信息。这有点奇怪,因为您可能会认为将位置编码直接添加到单词嵌入会对它造成伤害。然而,根据这个 Reddit 响应,由于单词嵌入的高维度,位置编码得到近似正交性(即,位置编码和单词嵌入已经占据不同的空间)。此外,海报认为正弦和余弦有助于给邻近的词相似的位置嵌入。
但最终这仍然留下了一个挥之不去的问题:在这方面,直接连接不是更好吗?这是我目前没有直接答案的事情。然而,最近有一些关于创建更好的位置嵌入的好论文。transformer-XL(XLNet 的基础)有自己特定的关系嵌入。NIPs 2019 年的论文“功能时间表征学习的自我关注”也研究了通过功能特征地图创建更有效的位置表征(尽管该论文目前不在 arxiv 上)。
许多最近的研究分析了在像伯特这样的模型中实际发生了什么。虽然完全面向 NLP,但这些研究可以帮助我们了解如何有效地利用这些时间序列数据架构,以及预测可能出现的问题。
在《T2》中,伯特在看什么?伯特注意力的分析“作者分析了伯特的注意力,并调查了语言关系。这篇论文很好地说明了自我关注(或任何类型的关注)是如何自然地有助于解释的。因为我们可以使用注意力权重来可视化焦点的相关部分。

Figure 5 from the paper. This technique of illustrating attention weights is highly useful for interpretability purposes and cracking open the “black box” of deep learning. Similar methods of analyzing specific attention weights could show which time steps or time series a model focuses on when predicting.
同样有趣的是,作者发现了以下事实:
我们发现大多数头很少关注当前令牌。然而,有一些头专门专注于下一个或前一个令牌,尤其是在网络的早期层
显然,在时间序列数据中,注意力集中在“关注下一个标记”是有问题的。因此,在处理时间序列时,我们将不得不应用某种掩码。其次,很难判断这是否仅仅是伯特接受训练的语言数据的产物,或者更广泛地说,这是否可能随着多头注意力而发生。为了形成语言表达,关注最接近的单词是很有意义的。然而,时间序列数据的变化更大,在某些时间序列中,因果关系可能来自更早的步骤(例如,对于一些河流,暴雨可能需要 24 小时以上才能抬高河水)。
在这篇文章中,作者发现修剪几个注意力头对表现的影响有限。一般来说,只有当超过 20%的注意力被削减时,表现才会显著下降。这与时间序列数据特别相关,因为我们经常处理长相关性。尤其是仅消融单个注意力头部似乎对分数几乎没有影响,并且在某些情况下导致更好的表现。

From p. 6 of the article. Using fewer attention heads may serve as an effective strategy for reducing the computational burden of self-attention for time series data. There seems to be a substantial amount of overlap of certain heads. In general it might make sense to train on more data (when available) rather than have more heads.

Umap visualization of the different semantic sub-spaces of the word “run.” Visualization made using context atlas https://storage.googleapis.com/bert-wsd-vis/demo/index.html?#word=run . It would be interesting to create Umap visualization of different time series representations from a large scale trained transformer model.
本文探讨了伯特模型中的几何结构。他们得出结论,BERT 内部似乎有解析树的几何表示。他们还发现在更大的嵌入空间中存在语义上有意义的子空间。虽然这一探索显然是以语言学为重点的,但它提出的主要问题是,如果伯特学习了这些有语言学意义的模式,那么它会学习类似的时间相关模式吗?例如,如果我们大规模训练一个 transformer 时间序列,我们会在嵌入空间中发现什么?例如,我们是否会看到相似的患者轨迹聚集在一起,或者如果我们对许多不同的流进行训练以进行洪水预测,它是否会将具有相似释放周期的坝馈流分组在一起,等等。在数千个不同的时间序列上对变压器进行大规模训练可以证明是有洞察力的,并增强我们对数据的理解。作者提供了两个很酷的 GitHub 页面,带有交互式可视化,您可以使用它们来进一步探索。
2019 年 ICLR 的另一项有趣的研究工作是减少对轻量级和动态卷积的关注。这项工作调查了为什么自我关注的工作,并提出了动态回旋作为替代。动态卷积的主要优点是,与自关注相比,它们在计算上更简单且更具并行性。作者发现这些动态回旋大致相当于自我注意。作者还采用了重量共享,这进一步减少了总体所需的参数。有趣的是,尽管潜在的速度提高,我还没有看到任何时间序列预测研究采用这种方法(至少目前没有)。
时间序列的自我关注
只有几篇研究论文在时间序列数据上使用了自我注意,并取得了不同程度的成功。如果你知道任何额外的,请让我知道。此外,GitHub 上的 huseinzol05 已经实现了一个普通版本的股票预测。
参加和诊断利用自我对医疗时间序列数据的关注。该时间序列数据是多变量的,包含诸如患者心率、SO2、血压等信息。

The architecture for attend and diagnose
他们的架构从每个临床因素的一维卷积开始,用于实现初步嵌入。回想一下,1D Conv 将利用特定长度的内核,并对其进行一定次数的处理。重要的是要注意,这里 1-D 卷积并不像通常那样应用于时间序列步骤。因此,如果初始时间序列包含 100 步,它仍将包含 100 步。相反,它被应用于创建每个时间步长的多维表示。有关时间序列数据的一维卷积的更多信息,请参考这篇文章。在一维卷积步骤之后,作者使用位置编码:
通过在训练和预测期间将时间步长 t 映射到相同的随机化查找表来执行编码。
这不同于标准的自我注意,标准的自我注意使用余弦和正弦函数来捕捉单词的位置。位置编码被加入(可能是添加的,虽然…作者没有指出具体的方式)到 1D Conv 层的各个输出中。
接下来是自我关注操作。这与标准类型的多头注意力操作基本相同,但也有一些细微的区别。首先,如上所述,由于这是时间序列数据,自我注意机制不能包含整个序列。它只能包含所考虑的时间步长。为了做到这一点,作者似乎使用了一种屏蔽机制,这种机制也屏蔽了太久以前的时间戳。不幸的是,作者对此的实际公式非常不具体,但是,如果我不得不猜测,我会假设它大致类似于作者在克服 transformer 瓶颈时展示的屏蔽操作。
在多头关注之后,现在转换的嵌入在有用之前仍然需要采取额外的步骤。通常在标准的自我关注中,我们有一个附加和层规范化组件。层标准化将标准化自我关注和原始嵌入的输出(参见此处了解更多关于此的信息),然而,作者反而选择密集插值。这意味着从多头注意力模块输出的嵌入以对捕获句法和结构信息有用的方式被获取和使用。
在密集插值算法之后,有一个线性层,后面是 softmax、sigmoid 或 relu 层(取决于任务)。该模型本身是多任务的,因此它旨在预测住院时间、诊断代码、失代偿风险、住院时间和死亡率。
总的来说,我认为这篇论文很好地展示了自我关注在多元时间序列数据中的应用。这个结果在发布的时候是最先进的,现在已经被 TimeNet 超越了。然而,这主要是由于基于迁移学习的预训练的有效性,而不是架构。如果我不得不猜测类似的沙子预训练会导致更好的表现。
我对这篇文章的主要批评主要是从可再现性的角度,因为没有提供任何代码,各种超参数(如内核大小)要么没有包括在内,要么只是模糊地暗示了一下。其他概念讨论得不够清楚,如掩蔽机制。我目前正试图在 PyTorch 中重新实现,当我对它的可实现性更有把握时,我会在这里发布代码。
最近另一篇相当有趣的论文是马家伟等人的“多变量、地理标记时间序列插补的跨维度自我关注”。这篇文章主要关注于插补(估计)缺失的时间序列值。有效的数据插补对于许多现实应用非常重要,因为传感器经常会出现故障,导致数据丢失。这在尝试预测或分类数据时会产生问题,因为缺失值或空值会影响预测。作者建立了他们的模型来使用交叉注意机制,该机制通过利用不同维度的数据来工作,例如时间位置和测量。

This is another fascinating example of modifying the standard self-attention mechanism to work across multi dimensional data. In particular as stated above the value vector is meant to capture contextual information. Oddly this is in contrast to what we will see later where the query and key vectors utilize contextual information but not the value vector.
作者在几个交通预测和空气质量数据集上评估了他们的结果。他们从预测和估算两方面进行评估。为了测试插补,他们丢弃了一定比例的值,并尝试使用模型对其进行插补。他们将这些与实际值进行比较。在所有缺失数据率方面,他们的模型优于其他 RNN 和统计插补方法。在预测方面,该模型也取得了最好的性能。
这是最近的一篇文章,将于 2019 年在 NIPS 上发表。它着重于将转换器应用于时间序列数据的几个问题。作者基本上认为经典的自我注意确实充分利用了情境数据。他们认为,这尤其会给随季节变化的动态时间序列数据带来问题(例如,预测假期前后与一年中其他时间的销售额,或者预测极端天气模式)。为了解决这个问题,他们引入了一种生成查询和值向量的新方法。
我们提出了卷积自我关注【机制】,通过使用因果卷积在自我关注层产生查询和密钥。知道局部上下文(例如形状)的查询键匹配可以帮助模型实现更低的训练误差,并进一步提高其预测精度。

From p. 3 of article. Essentially with other versions of multi-headed attention query, value, and key vectors are created off a single time-step, whereas a larger kernel size allows it to create the key and query vectors from multiple time-steps. This allows the model to be able to understand a greater degree of context.

本文的第二部分主要关注与 transformer 模型的内存使用相关的解决方案。自我注意是非常占用内存的,特别是对于很长的序列(具体来说是 O(L))。作者提出了一种新的注意机制,即 O(L(log L))。有了这种自我关注机制,细胞只能以指数级的步长关注先前的细胞。例如,第五单元将负责第四单元和第二单元。它们还引入了这种日志关注的两种变体:本地关注和重启关注。更多信息见下图

From page 5. of the article. All these variations have the same overall time complexity O(L(log L)²), however the actual runtime of Local Attention + Logsparse would likely be longest due to it attending to the most cells.
作者在几个不同的数据集上评估了他们的方法,包括耗电量(以 15 分钟为间隔记录)、旧金山的交通流量(以 20 分钟为间隔)、每小时的太阳能数据产量(来自 137 个不同的发电厂)和风力数据(28 个县风能潜力占总发电量的百分比的每日估计值)。他们选择ρ-分位数损失作为评估指标有点奇怪,因为通常我会期待 MAE、MAP、RMSE 或类似的时间序列预测问题。

Equation for p quantile regression loss.
我仍在努力理解这个指标到底代表了什么,但是至少从结果来看,分数越低越好。使用这一指标,他们的卷积自我注意力转换器优于 DeepAR、DeepState、ARIMA 和其他模型。他们还进行了一项消融研究,研究在计算七天预报时内核大小的影响。他们发现内核大小为 5 或 6 通常会产生最好的结果。
我认为这是一篇很好的研究文章,它解决了 transformer 在应用于时间序列数据时的一些缺点。我特别认为卷积核(大小大于 1)的使用在时间序列问题中非常有用,在时间序列问题中,您需要捕获关键和查询向量的周围环境。目前还没有代码,但 NeurIPs 仍然需要一个多月的时间,所以希望作者在现在和那时之间发布它。
结论和未来方向
总之,自我关注和相关体系结构已经导致了几个时间序列预测用例的改进,但是,总的来说,它们还没有得到广泛的应用。这可能与几个因素有关,如内存瓶颈、位置信息编码困难、关注点值以及缺乏对处理多元序列的研究。此外,在 NLP 之外,许多研究人员可能不熟悉自我注意及其潜力。虽然 ARIMA 等简单模型在许多情况下对解决行业问题很有意义,但我相信变形金刚也大有可为。
希望本文中总结的方法能对有效地将 transformers 应用于时间序列问题有所启发。在后续的文章中,我计划给出一个用 PyTorch 中的转换器对时间序列数据进行预测和分类的实际例子。欢迎在评论中提出任何反馈和/或批评。如果我有不正确的地方,请告诉我(鉴于这个话题的复杂性,这是很有可能的),我会更新这篇文章。
神经网络中的注意力
注意力结构的一些变化

在“ 注意力 介绍”的早期帖子中,我们看到了那里介绍的注意力架构解决的一些关键挑战(并在下面的图 1 中提到)。本着同样的精神,你也可能会遇到其他的变体。在其他方面,这些变体的不同之处在于注意力被用于“何处”(独立的,在 RNN,在 CNN 等)以及注意力是如何产生的(全球与地方,软与硬等)。这篇文章是一些变种的简要列表。

Fig 1: From “Introduction to Attention”, based on paper by Bahdanau et al.
免责声明 1 :这里的想法只是为了了解在不同论文中提出的解决方案是如何利用注意力机制的。因此,重点将不是论文试图解决的任务类型,而是解决方案中注意力机制的使用。
免责声明 2 :选择这些论文/变体的背后没有严格的理由。这份名单只是随机搜索和热门搜索的结果。
免责声明 3 :自我关注和变形金刚值得单独发布(真的,我那天失去了动力),这里不涉及。
全球关注 vs 局部关注
全局注意力与“ 注意力介绍 ”帖子中探讨的内容相同。当我们使用所有编码器隐藏状态来为每个解码器步骤定义基于注意力的上下文向量时。但正如你可能已经猜到的,这可能会变得昂贵。
另一方面,局部注意力只注意在一个较小窗口内的几个隐藏状态。该窗口以第“p”个编码器隐藏状态为中心,包括出现在“p”两侧的“D”个隐藏状态。因此,这使得该窗口的长度,即所考虑的隐藏状态的数量,为 2D+1。单调对齐是指 p 简单地设置为与解码器位置相同(第 5 个输出将具有 p = 5,如果 D = 2,则只关注 3,4,5,6,7 个隐藏状态)。预测对齐是当“p”被定义为解码器隐藏状态 ht 的函数(论文使用 s .sigmoid(vp⊤双曲正切(Wpht))并且该函数的参数被模型联合学习时。

Fig 2: Global vs Local Attention as defined by Luong et al. here
硬注意力 vs 软注意力
Luong 等人在他们的论文中提到的以及和徐等人在他们的论文中描述的,软注意是当我们将上下文向量计算为编码器隐藏状态的加权和时,正如我们在上面的图中所看到的。硬注意是指我们用注意力分数来选择一个单独的隐藏状态,而不是所有隐藏状态的加权平均。选择是一个问题,因为我们可以使用类似 argmax 的函数来进行选择,但它是不可微的(当我们使用 argmax 时,我们选择了与 max score 相对应的索引,并轻推权重以稍微移动分数,因为 backprop 的一部分不会改变该索引选择),因此采用了更复杂的技术。注意,的论文在图像字幕上下文中使用了硬注意,所以“编码器隐藏状态”实际上是 CNN 生成的“特征向量”。

Fig 3: Soft vs Hard Attention as defined by Xu et al.
潜在注意力
我偶然发现了陈等人的这篇论文,这篇论文是关于把自然语言句子翻译成“如果-那么”程序的。即,给定一个类似“将你的 Instagram 照片发布到 Tumblr”的语句,网络应该预测描述触发器(“Instagram 照片”)和动作(Tumblr)的最相关的词,这将有助于获得相应的标签(trigger=Instagram)。Any_new_photo_by_you,action=Tumblr。Create_a_photo_post)。
我们如何运用注意力来达到这一点呢?我们再来看另一个例子,“将你 Dropbox 文件夹中的照片发布到 Instagram”。与前一个相比,这里的“Instagram”与行动最相关,而“Dropbox”是触发器。同一个词既可以是触发器,也可以是动作。因此,要确定这个词的作用,我们需要调查像“to”这样的介词在这样的句子中是如何使用的。本文介绍了一个“潜在注意”模型来做到这一点。

Fig 4: “Latent Attention” presented by Chen et al. in this paper
准备了一个“J”维的“潜在注意力”向量——这里的每个维代表一个单词,softmax 给出了向量中单词的相对重要性。
- 输入序列的长度为“J”(即“J”个字)。每个单词由一个“d”维嵌入向量表示。因此,整个序列是一个 d×J 矩阵。
- 计算该矩阵与长度为“d”的可训练向量“u”的乘积,并对其进行 softmax。这给出了长度为“J”的“潜在注意力”向量
接下来,类似于上述准备“主动注意”,但是不使用类似“u”的“d”维向量,而是使用“d×J”维可训练矩阵 V,从而产生“J×J”主动注意矩阵。列级 softmax 是在每个单词的维度之间完成的。
然后“有效重量被计算为这两个重量的乘积。然后,用这些“有效权重对另一组单词嵌入进行加权,以导出输出,该输出是达到预测的软最大化。
对我来说,作为代表输入中每个单词的向量和代表单词重要性的潜在注意力向量的乘积的主动权重的推导是“自我注意”的一种形式,但稍后更多地是关于自我注意。
基于注意力的卷积神经网络
在这篇论文中,Yin 等人提出了 ABCNN——基于注意力的 CNN 来建模一对句子,用于答案选择、复述识别和文本蕴涵任务。所提出的基于注意的模型的关键亮点是,它考虑了一个输入句子的不同部分或单词或整个句子之间存在的影响/关系/影响,并提供了可用于后续任务的相互依赖的句子对表示。让我们先快速浏览一下基础网络,然后再来看看注意力是如何被引入其中的。

Fig 5: Yin et al. in this paper
- 输入层 :从两个分别有 5 个和 7 个单词的句子 s0 和 s1 开始。每个单词由一个嵌入向量表示。如果你正在数盒子,那么图 5 的表示嵌入向量的长度为 8。所以 s0 是一个 8×5 秩 2 张量,s1 是一个 8×7 秩 2 张量。
- :可能有一个或多个卷积层。先前 conv 图层的输出将作为当前 conv 图层的输入。这被称为“制图表达要素地图”。对于第一 conv 层,这将是表示输入句子的矩阵。卷积层应用宽度为 3 的过滤器。这意味着对具有 5 个字的 s0 执行卷积运算 7 次(xx1,x12,123,234,345,45x,5xx),从而创建具有 7 列的特征映射。对于 s1,这变成了具有 9 列的特征映射。在每个步骤中执行的卷积运算是“tanh (W.c+ b)”,其中“c”是在 7 个卷积步骤(xx1,x12,123,234,345,45x,5xx)的每个步骤中单词的级联嵌入。换句话说,c 是一个长度为 24 的向量。如果你在数箱子,那么根据图 5 中的,W 的尺寸是 8 x 24。**
- :应用“平均池层”对“w”列进行逐列平均,其中“w”是该层中使用的卷积滤波器的宽度。在我们的例子中,这是 3。因此,s0 的平均值为 123,234,345,456,567,将 7 列特征转换回 5 列。s1 也是如此。
- 最后一层汇集 :在最后一个卷积层,平均汇集不是在“w”列上进行,而是在所有列上进行,因此将矩阵特征映射转换为表示向量的句子。
- 输出层 :根据任务选择处理表示向量的句子的输出层,图中显示了一个逻辑回归层。
请注意,第一层的输入是单词,下一层是短短语(在上面的示例中,过滤器宽度 3 使其成为 3 个单词的短语),下一层是较大的短语,依此类推,直到最后一层,其中输出是句子表示。换句话说,对于每一层,都会产生一个较低到较高粒度的抽象表示。
本文介绍了将注意力引入这个基本模型的三种方式。
ABCNN-1

****Fig 6: ABCNN-1 in this paper
- 在 ABCNN-1 中,在卷积运算之前引入注意力。句子 s0(8×5)和 S1(8×7)的输入表示特征图(在基本模型描述的#2 中描述,在图 6 的中显示为红色矩阵)被“匹配”以得到注意矩阵“A”(5×7)。
- 注意矩阵中的每个单元 Aij 代表 s0 中的第 I 个单词和 s1 中的第 j 个单词之间的注意分数。在本文中,该分数计算为 1/(1+| x y |),其中| |是欧几里德距离。
- 该注意力矩阵然后被转换回“注意力特征图”,其具有与输入表示图(蓝色矩阵)相同的维度,即分别使用可训练权重矩阵 W0 和 W1 的 8×5 和 8×7。
- 现在,卷积运算不仅在像基本模型那样的输入表示上执行,而且在输入表示和刚刚计算的注意力特征图上执行。
- 换句话说,不是如上面基本模型描述的#1 中所述使用秩 2 张量作为输入,而是对秩 3 张量执行卷积运算。
ABCNN-2

****Fig 7: ABCNN-2 in this paper
- 在 ABCNN-2 中,注意矩阵不是使用如在 ABCNN-2 中描述的输入表示特征图,而是在卷积运算的输出上准备的,我们称之为“conv 特征图”。在我们的示例中,这是分别代表 s0 和 s1 的 7 列和 9 列特征映射。因此,与 ABCNN-1 相比,注意力矩阵的维度也将不同,这里是 7 x 9。
- 然后,通过对给定行(对于 s0)或列(对于 s1)中的所有关注值求和,使用该关注矩阵来导出关注权重。例如,对于 s0 的 conv 特征图中的第一列,这将是关注度矩阵中第一行中所有值的总和。对于 s1 的 conv 特征图中的第一列,这将是关注度矩阵的第一列中所有值的总和。换句话说,conv 特征图中的每个单元/列都有一个关注权重。
- 注意力权重然后用于“重新加权”conv 特征地图列。池化输出要素地图中的每一列都被计算为被池化的“w”conv 要素地图列的关注度加权和,在上述示例中为 3。
ABCNN-3

****Fig 8: ABCNN-3 in this paper
ABCNN-3 简单地将两者结合起来,本质上是在汇集的同时关注卷积的输入和卷积的输出。
可分解的注意力模型
对于自然语言推理,Parikh 等人的这篇论文首先创建注意力权重矩阵,将一个句子中的每个单词与另一个句子中的所有单词进行比较,并如图所示进行归一化。但在这之后,在下一步中,问题被“分解成子问题”,分别解决。即,前馈网络用于采用级联的单词嵌入和相应的归一化对齐向量来生成“比较向量”。然后将每个句子的比较向量相加,以创建代表每个句子的两个集合比较向量,然后通过另一个前馈网络进行反馈,以进行最终分类。在这个解决方案中,词序并不重要,只需要注意。

****Fig 9: From this paper by Parikh et al
用于在线注意力的神经传感器
对于在线任务,如实时语音识别,我们没有处理整个序列的奢侈jait ly等人的这篇论文介绍了一种神经转换器,它可以在一次处理输入块的同时进行增量预测,而不是在整个输入序列上进行编码或引起注意。
输入序列被分成等长的多个块(可能除了最后一个块),并且神经换能器模型只为当前块中的输入计算注意力,然后用于生成对应于该块的输出。与先前块的连接仅通过隐藏状态连接存在,隐藏状态连接是编码器和解码器侧的 RNN 的一部分。虽然这在一定程度上类似于前面描述的局部注意力,但是没有如那里描述的明确的“位置对准”。

****Fig 10: Neural Transducer — attending to a limited part of the sequence. From this paper by Jaitly et al
区域注意事项
回头参考图 1 ,这是我们在早先的帖子中看到的基础介绍性注意力模型的图示。对齐的一个概括抽象是,它就像在我们生成输出时查询内存的。记忆是输入的某种表示,查询是输出的某种表示。在图 1 的中,存储器或密钥集合是编码器隐藏状态“h”,蓝色节点,查询是当前解码器隐藏状态“s”,绿色节点。然后将导出的比对分数乘以“值”——输入的另一种表示,即图 1 中的金色节点。
区域注意力是当注意力被施加到一个“区域”上时,不一定只是像普通注意力模型那样的一个项目。“区域”被定义为存储器中一组结构上相邻的项目(即一维输入中的输入序列,如单词的句子)。通过组合存储器中的相邻项目来形成一个区域。在像图像这样的二维情况下,该区域将是图像内的任何矩形子集。

****Fig 11: Area attention from this paper by Yang et al.
一个区域的“键”向量可以简单地定义为该区域中每个项目的键的平均向量。在序列到序列翻译任务中,这将是该区域中涉及的每个隐藏状态向量的平均值。在图 11 中的“简单关键向量”下的定义中,“k”是隐藏状态向量。如果我们定义一个包含 3 个相邻字的区域,那么平均向量就是在编码器中三个字的每一个之后产生的隐藏状态向量的平均值。
另一方面,“值”被定义为该区域中所有值向量的总和。在我们的基本例子中,这将再次是对应于为其定义区域的三个字的编码器隐藏状态向量。
我们还可以定义更丰富的关键向量表示,不仅考虑平均值,还考虑标准偏差和形状向量,如图 11 中所述。形状向量在这里被定义为高度和宽度向量的连接,而高度和宽度向量又是使用嵌入矩阵从投影为向量的实际宽度和高度数字中创建的,我假设这是通过模型学习的。该密钥是作为单层感知器的输出导出的,该感知器将平均值、标准差和形状向量作为输入。
一旦定义了关键向量和值向量,网络的其余部分可以是任何注意力利用模型。如果我们使用如图 1 中所示的编码器-解码器 RNN,那么插入导出的基于区域的键和值向量来代替图 1 中的那些将使其成为基于区域的注意力模型。
通读这些论文给了我们一个有趣的视角,让我们了解研究人员如何将注意力机制用于各种任务,以及思维是如何进化的。希望这个快速的研究能让我们知道如何在我们自己的任务中调整和使用其中的一个或一个新的变体。
新闻推荐的注意力模型
利用注意机制解决冷启动问题

Photo by Sam Wheeler on Unsplash
虽然奇异值分解为推荐系统提供了一个令人满意的解决方案,但是当新项目没有积累足够的数据时,它就不那么有效了。新闻推荐更具挑战性,因为它提出了三个额外的挑战:
- 新闻文章对时间高度敏感
- 用户对话题敏感,有不同的兴趣
- 新闻语言是高度浓缩的,由每天创造的大量新实体组成
在本文中,我将向您展示如何利用注意力机制来解决推荐系统中的冷启动问题。
注意机制
注意机制有着悠久的应用历史,最近被引入来解决自然语言处理中的问题。注意机制使模型能够根据上下文对输入施加不同的权重。例如,在神经机器翻译(NMT)中,注意机制可以用来克服双向信息流。借助注意机制,NMT 模型可以通过“看”原文中的不同位置来生成单词。
新闻推荐系统的情况类似。推荐引擎要学会“看”相关的部分,忽略阅读历史中不相关的部分。
深度知识感知网络
在 HK01 中,我们的数据团队在新闻推荐系统上投入了巨大的努力。我们采用最先进的算法来改进原始的奇异值分解协同过滤算法。具体来说,我们使用带有三重丢失的自动编码器和 StarSpace 来学习文章嵌入。
使用具有三重损失的去噪自动编码器生成嵌入,然后计算嵌入的余弦相似性
medium.com](https://medium.com/@LouisKitLungLaw/compute-document-similarity-using-autoencoder-with-triplet-loss-eb7eb132eb38) [## 使用脸书空间学习文档嵌入
medium.com](https://medium.com/@LouisKitLungLaw/documents-embeddings-using-facebook-s-starspace-67b8d1feba32)
对于问题 1 和 2,我们利用微软[1]提出的深度知识感知网络(DKN) ,来解决冷启动问题。我们用自己的文章嵌入代替知识嵌入,并保持注意力网络来学习用户兴趣和文章嵌入之间的相互作用。

Architecture of DKN
DKN 由两个网络组成。DKN 的整体建筑展示在右手边。为了预测点击概率,算法学习聚合阅读历史序列,形成用户嵌入。用户嵌入被视为阅读历史中文章嵌入的加权和。那么,问题来了:如何求权重?
每篇文章嵌入的权重由注意力网络获得。注意力网络对候选新闻、我们要预测的新闻和用户点击的新闻之间的交互进行建模。由于用户可能有各种各样的兴趣,并且不存在能够匹配每一个兴趣的单一新闻,注意力网络的作用是将候选新闻匹配到任何一个。
在获得权重后,该模型通过加权和生成用户嵌入,并将用户和候选新闻嵌入传递给前馈神经网络。
DKN 基本上是一个基于项目的算法。它不需要用户-项目交互数据来进行新项目推荐。而且,它可以在不干预的情况下处理多个利益。
结果
我们比较原始模型,奇异值分解的正则化版本,与奇异值分解和 DKN 的集合。通过仔细调整,集合可以实现比原始模型 10%的增量。
参考
[1]:周,,等.“深度兴趣网络点击率预测研究”第 24 届 ACM SIGKDD 知识发现国际会议论文集&数据挖掘。ACM,2018。
注意力模型简介
在自然语言处理、机器翻译领域已经有了新的发展,并且大多数最新的(SOTA)结果已经使用注意力模型实现。胶水基准组长板上最上面的模型使用自关注模型变形金刚。
为了从最基本的意义上理解注意力,让我们从吴恩达教授关于深度学习的课程中举个例子

Source — Deep Learning Coursera
以上注意模型基于“ Bahdanau 等人,2014 联合学习对齐和翻译的神经机器翻译”的一篇论文。这是一个使用双向递归神经网络和注意力进行序列到序列句子翻译的例子。此处,上图中的符号“alpha”代表输出向量的每个时间步长的注意力权重。有几种方法计算这些权重“α”,例如使用点积、具有单个隐藏层的神经网络模型等。这些权重乘以源中的每个单词,然后该乘积与来自前一层的输出一起被馈送到语言模型,以获得当前时间步长的输出。这些字母值决定了源中每个单词的重要性,从而决定了输出的句子。

Souce-Lilian Weng Github post.
它是可用于计算注意力权重(alpha)的不同函数的列表,更普遍的说法是对齐分数。在(加性)函数中( s < t >,h < i > ) 将前一时间步和源嵌入的输出串联起来,通过单层神经网络,输出为注意权重(α)。该神经网络模型与 RNN 模型并行训练,并且相应地调整这些权重。
注意力模型的类型:
- 全球和地方关注(地方-m,地方-p)
- 软硬注意
- 自我关注
全局注意力模型
这和上面讨论的注意力模型是一样的。来自当前状态之前的每个源状态(编码器)和解码器状态的输入被考虑来计算输出。下面是全球注意力模型的图表。

Source-(Luong et.al. 2015)
从图中可以看出, (a < t > ) 对齐权重或注意权重是使用每个编码器步骤和 (h < t > ) 解码器前一步骤计算的。然后使用 (a < t > ) 通过取全局对齐权重和每个编码器步长的乘积来计算上下文向量。然后,它被馈送到 RNN 单元,以找到解码器输出。
局部注意力模型
它与全局注意力模型的不同之处在于,在局部注意力模型中,仅使用来自源(编码器)的少数位置来计算对齐权重 (a < t >)。下面是局部注意力模型的示意图。

Source-(Luong et.al. 2015)
从图中可以看出,首先找到单对齐位置 (p < t > ) ,然后使用来自源(编码器)层的单词窗口连同 (h < t > ) 来计算对齐权重和上下文向量。
局部注意- 有单调对齐和预测对齐两种。在单调比对中,我们简单地将位置 (p < t > ) 设置为“t”,而在预测比对中,位置 (p < t > ) 不是仅仅假设为“t”,而是由预测模型预测。
软硬注意
软注意几乎和全局注意模型一样。
硬注意模型和局部注意模型的区别在于,局部模型在每一点上几乎都是不同的,而硬注意却不是。局部注意是硬注意和软注意的混合。最后给出了进一步研究的链接。
自我关注模型
关于同一输入序列的不同位置。理论上,自我注意可以采用上述任何得分函数,但只是用相同的输入序列替换目标序列。
变压器网络
变压器网络完全建立在自我关注机制上,不使用递归网络架构。变形金刚是用多头自关注模型制作的。

Source- Attention is all you need.
编码器层由两个子层组成,一个是多头注意,另一个是前馈神经网络。解码器由三个子层两个多头注意力网络构成,然后反馈给前馈网络。解码注意力网络从编码器输出获得输入,从解码器的前一层获得输出。
参考链接
引文
- 通过联合学习对齐和翻译的神经机器翻译
- 神经机器翻译的有效方法。
如果有些地方不正确,或者我应该再补充些什么,请在下面评论。
收件人:图文并茂

gif 图片中的注意力,以及如何在谷歌翻译这样的机器翻译中使用它
(TLDR:动画为关注 此处 )
变更日志:【2022 年 1 月 5 日—修复错别字并提高清晰度
F 几十年来,统计机器翻译一直是占主导地位的翻译模式 9 ,直到神经机器翻译 (NMT)的诞生。NMT 是一种新兴的机器翻译方法,它试图建立和训练一个单一的大型神经网络,该网络读取输入文本并输出翻译[ 1 ]。
NMT 的先驱是来自 Kalchbrenner 和 Blunsom (2013) 、 Sutskever 等人的提议。al (2014) 和 Cho。 etal (2014b) ,其中更熟悉的框架是从 Sutskever 等人那里学习的序列对序列(seq2seq)。艾尔。本文将基于 seq2seq 框架,以及如何在其上建立注意力。

Fig. 0.1: seq2seq with an input sequence of length 4
在 seq2seq 中,想法是拥有两个具有编码器-解码器架构的递归神经网络(RNNs):逐个读取输入单词以获得固定维度的向量表示(编码器),并根据这些输入,使用另一个 RNN(解码器)逐个提取输出单词。解释改编自 5 。

Fig. 0.2: seq2seq with an input sequence of length 64
seq2seq 的问题在于,解码器从编码器接收到的唯一的信息是最后一个编码器隐藏状态(图 0.1 中的 2 个微小红色节点),这是一种矢量表示,就像输入序列的数字汇总。因此,对于一个长的输入文本(图 0.2),我们不合理地期望解码器只使用这个一个向量表示(希望它“充分概括了输入序列”)来输出翻译。这可能会导致灾难性的遗忘。这一段有 100 个单词。你能把这一段翻译成你知道的另一种语言吗,就在这个问号后面?
如果不能,那我们就不应该对解码者这么残忍。不仅仅是一个向量表示,让我们在每个编码器时间步给解码器一个来自的向量表示,这样它就可以做出消息灵通的翻译,怎么样?进入关注。

Fig 0.3: Adding an attention layer as an interface between encoder and decoder. Here, the first decoder time step is getting ready to receive information from the encoder before giving the first translated word.
注意是编码器和解码器之间的接口,它向解码器提供来自每个编码器隐藏状态的信息(除了图 0.3 中红色的隐藏状态)。通过这种设置,模型可以有选择地关注输入序列的有用部分,从而学习它们之间的对齐。这有助于模型有效地处理长输入句子[ 9 ]。
定义:对齐 对齐是指将原文的片段与其对应的译文片段进行匹配。定义改编自 此处 。

Fig. 0.3: Alignment for the French word ‘la’ is distributed across the input sequence but mainly on these 4 words: ‘the’, ‘European’, ‘Economic’ and ‘Area’. Darker purple indicates better attention scores (Image source)
正如[ 2 中所介绍的,注意力有两种类型。使用所有编码器隐藏状态的注意力类型也被称为全局注意力。相反,局部注意仅使用编码器隐藏状态的子集。由于本文的范围是全球关注,本文中提到的任何“关注”都是指“全球关注”
这篇文章总结了注意力是如何使用动画工作的,这样我们就可以在没有数学符号的情况下(或者在阅读了充满数学符号的论文或教程之后)理解它们😬。作为例子,我将分享过去 5 年设计的 4 个 NMT 建筑。我还会在这篇文章中穿插一些关于一些概念的直觉,所以请保持警惕!
1.注意:概述
在我们看注意力是如何使用的之前,请允许我用 seq2seq 模型与你分享翻译任务背后的直觉。
直觉:seq2seq 译者从头到尾阅读德文文本。一旦完成,他开始逐字翻译成英语。如果句子非常长,他可能会忘记在文章的前几部分读过的内容。
这是一个简单的 seq2seq 模型。我将要经历的注意力层的分步计算是一个 seq 2 seq+注意力模型。这里有一个关于这个模型的快速直觉。
直觉:seq2seq +注意 一个翻译读德文文本,同时从头到尾写下关键词,之后开始翻译成英文。在翻译每个德语单词时,他会使用自己写下的关键词。
注意力通过给每个单词分配一个分数来将不同的焦点放在不同的单词上。然后,使用 softmaxed 分数,我们使用编码器隐藏状态的加权和来聚集编码器隐藏状态,以获得上下文向量。关注层的实现可以分为 4 个步骤。
步骤 0:准备隐藏状态。
让我们首先准备好所有可用的编码器隐藏状态(绿色)和第一个解码器隐藏状态(红色)。在我们的例子中,我们有 4 个编码器隐藏状态和当前解码器隐藏状态。(注意:最后合并的编码器隐藏状态作为输入输入到解码器的第一个时间步长。解码器第一个时间步长的输出称为第一个解码器隐藏状态,如下所示。)

Fig. 1.0: Getting ready to pay attention
步骤 1:获得每个编码器隐藏状态的分数。
分数(标量)由分数函数(也称为比对分数函数 [ 2 ]或比对模型 [ 1 )获得。在这个例子中,分数函数是解码器和编码器隐藏状态之间的点积。
各种得分函数见附录 A 。

Fig. 1.1: Get the scores
**decoder_hidden** = [10, 5, 10]**encoder_hidden score**
---------------------
[0, 1, 1] 15 (= 10×0 + 5×1 + 10×1, the dot product)
[5, 0, 1] 60
[1, 1, 0] 15
[0, 5, 1] 35
在上面的例子中,我们获得了编码器隐藏状态[5, 0, 1]的高关注分数60。这意味着下一个字(解码器的下一个输出)将会受到编码器隐藏状态的严重影响。
第二步:通过一个 softmax 层运行所有的分数。
我们将分数放到一个 softmax 层,这样 soft max 的分数(标量)加起来就是 1。这些 softmaxed 分数代表注意力分布 [ 3 , 10 。

Fig. 1.2: Get the softmaxed scores
**encoder_hidden score score^**
-----------------------------
[0, 1, 1] 15 0
[5, 0, 1] 60 1
[1, 1, 0] 15 0
[0, 5, 1] 35 0
请注意,根据 softmaxed 分数score^,注意力的分布仅如预期的那样放在[5, 0, 1]上。实际上,这些数字不是二进制的,而是介于 0 和 1 之间的浮点数。
第三步 : 将每个编码器隐藏状态乘以其 softmaxed 分数。
通过将每个编码器隐藏状态与其 softmaxed 分数(标量)相乘,我们获得了对齐向量 [ 2 ]或注释向量 [ 1 ]。这正是对齐发生的机制。

Fig. 1.3: Get the alignment vectors
**encoder score score^ alignment**
---------------------------------
[0, 1, 1] 15 0 [0, 0, 0]
[5, 0, 1] 60 1 [5, 0, 1]
[1, 1, 0] 15 0 [0, 0, 0]
[0, 5, 1] 35 0 [0, 0, 0]
在这里,我们看到除了[5, 0, 1]之外的所有编码器隐藏状态的对齐由于低注意力分数而减少到 0。这意味着我们可以预期第一个翻译的单词应该与嵌入了[5, 0, 1]的输入单词相匹配。
第四步 : 对对齐向量求和。
将对齐向量相加以产生上下文向量 [ 1 , 2 ]。上下文向量是来自前一步骤的对齐向量的聚合信息。

Fig. 1.4: Get the context vector
**encoder score score^ alignment**
---------------------------------
[0, 1, 1] 15 0 [0, 0, 0]
[5, 0, 1] 60 1 [5, 0, 1]
[1, 1, 0] 15 0 [0, 0, 0]
[0, 5, 1] 35 0 [0, 0, 0]**context** = [0+5+0+0, 0+0+0+0, 0+1+0+0] = [5, 0, 1]
第五步 : 将上下文向量馈入解码器。
完成的方式取决于架构设计。稍后,我们将在 2a、2b 和 2c 部分的示例中看到该架构如何为解码器利用上下文向量。

Fig. 1.5: Feed the context vector to the decoder
差不多就是这样!这是完整的动画:

Fig. 1.6: Attention
训练和推理 在推理过程中,每个解码器时间步长 t 的输入是解码器时间步长 t-1 的 预测输出 。
训练时,输入到每个解码器时间步长 t 是我们从解码器时间步长 t-1 得到的 地真值输出 。直觉:注意力实际上是如何工作的?**
答案:反向传播,惊喜惊喜。反向传播将尽一切努力确保输出接近地面真实情况。这是通过改变 RNNs 中的权重和得分函数(如果有的话)来实现的。这些权重会影响编码器隐藏状态和解码器隐藏状态,进而影响注意力得分。
[ 返回页首 ]
2.注意:示例
在前面的章节中,我们已经看到了 seq2seq 和 seq 2 seq+注意力架构。在接下来的几个小节中,让我们研究另外 3 个基于 seq2seq 的 NMT 架构,它们实现了注意力。为了完整起见,我还附上了他们的双语评估替角(BLEU)分数——这是评估生成句子与参考句子的标准指标。
2a。巴赫达瑙等人。铝(2015) [ 1
这种注意力的实现是创始注意力之父之一。作者在论文标题“通过学习联合对齐和翻译的神经机器翻译”中使用了“对齐”一词,指的是在训练模型时调整直接负责得分的权重。以下是关于该架构需要注意的事项:
- 编码器是双向(正向+反向)门控循环单元(BiGRU)。解码器是一个 GRU,其初始隐藏状态是从反向编码器 GRU(下图中未显示)的最后一个隐藏状态修改而来的向量。
- 注意力层中的得分函数是加法/串联。
- 下一个解码器步骤的输入是来自前一个解码器时间步骤的生成字(粉红色)和来自当前时间步骤的上下文向量(深绿色)之间的连接。

Fig. 2a: NMT from Bahdanau et. al. Encoder is a BiGRU, decoder is a GRU.
作者在 WMT 大学的 14 个英语-法语数据集上取得了 26.75 的 BLEU 分数。
直觉:seq2seq 带双向编码器+注意力
译者 A 一边读德文文本,一边写下关键词。翻译者 B(承担高级角色,因为他具有从倒读句子翻译句子的额外能力)从最后一个单词到第一个单词阅读相同的德语文本,同时记下关键词。这两个人定期讨论他们到目前为止读到的每一个单词。阅读完这篇德语文章后,译者 B 的任务是根据讨论内容和他们两人收集的综合关键词,将德语句子逐字翻译成英语。
译者 A 是前进的 RNN,译者 B 是落后的 RNN。
2b。Luong 等人。铝(2015) [ 2
基于注意力的神经机器翻译的有效方法的作者已经把简化和概括 Bahdanau 等人的架构作为一个重点。艾尔。方法如下:
- 编码器是两层长短期记忆(LSTM)网络。解码器也具有相同的架构,其初始隐藏状态是最后的编码器隐藏状态。
- 他们试验的评分函数是(i) 加法/串联、(ii) 点积、(iii) 基于位置的、(iv)‘通用’。
- 来自当前解码器时间步长的输出和来自当前时间步长的上下文向量之间的连接被馈送到前馈神经网络,以给出当前解码器时间步长的最终输出(粉红色)。

Fig. 2b: NMT from Luong et. al. Encoder is a 2 layer LSTM, likewise for the decoder.
在 WMT 2015 年英语对德语的测试中,该模型获得了 25.9 分的 BLEU 分数。
直觉:seq2seq 带 2 层堆栈编码器+注意
译者 A 一边读德语文本,一边写下关键词。同样,译者 B(比译者 A 级别高)也阅读相同的德语文本,同时记下关键词。请注意,初级译者 A 必须向译者 B 报告他们阅读的每个单词。一旦阅读完毕,他们两人会根据他们所掌握的关键词,一起将句子逐字翻译成英语。
[ 返回页首 ]
2c。谷歌的神经机器翻译(GNMT) [ 9
因为我们大多数人肯定都以这样或那样的方式使用过谷歌翻译,所以我觉得有必要谈谈 2016 年实施的谷歌 NMT。GNMT 是我们已经看到的前两个例子的组合(很大程度上受第一个[ 1 ]的启发)。
- 编码器由 8 个 LSTMs 堆栈组成,其中第一个 LSTMs 是双向的(其输出是级联的),剩余连接存在于连续层的输出之间(从第三层开始)。解码器是 8 个单向 LSTMs 的独立堆栈。
- 使用的评分函数是加法/串联,如[ 1 ]中所示。
- 同样,像在[ 1 ]中一样,下一个解码器步骤的输入是前一个解码器时间步骤的输出(粉红色)和当前时间步骤的上下文向量(深绿色)之间的连接。

Fig. 2c: Google’s NMT for Google Translate. Skip connections are denoted by curved arrows. *Note that the LSTM cells only show the hidden state and input; it does not show the cell state input.
该模型在 WMT 的 14 英法语上达到了 38.95 BLEU,在 WMT 的 14 英德语上达到了 24.17 BLEU。
直觉:GNMT — seq2seq 带 8 层编码器(+双向+剩余连接)+注意
8 名译者从下到上排成一列,从译者 A,B,…,h 开始。每个译者阅读相同的德语文本。在每一个单词上,翻译 A 都与翻译 B 分享他/她的发现,翻译 B 将对其进行改进并与翻译 C 分享——重复这一过程,直到我们找到翻译 H。此外,在阅读德语文本时,翻译 H 根据他所知道的和他所收到的信息写下相关的关键词。
一旦每个人都读完了这篇英语文章,译者 A 被告知翻译第一个单词。首先,他尝试回忆,然后与翻译 B 分享他的答案,翻译 B 改进答案并与翻译 C 分享-重复此操作,直到我们找到翻译 H。然后,翻译 H 根据他写的关键字和他得到的答案,写出第一个翻译单词。重复这个直到我们翻译出来。
3.摘要
下面是您在本文中看到的所有架构的快速总结:
- seq2seq
- seq2seq +注意
- 带双向编码器的 seq2seq 注意
- seq2seq 带 2 层编码器+注意
- GNMT — seq2seq,带 8 层编码器(+双向+剩余连接)+注意
暂时就这样吧!在我的下一篇文章中,我将和你一起回顾自我关注的概念,以及它是如何在 Google 的 Transformer 和自我关注生成对抗网络(SAGAN)中使用的。留意这个空间!
附录:分数函数
下面是由 Lilian Weng 编译的一些得分函数。分数函数加法/串联和点积在本文中已经提到。分数函数背后的思想涉及点积运算(点积、余弦相似性等。),就是衡量两个向量的相似度。对于前馈神经网络得分函数,想法是让模型学习对齐权重和翻译。

Fig. A0: Summary of score functions

Fig. A1: Summary of score functions. h represents encoder hidden states while s represents decoder hidden states. (Image source)
【返回页首
参考
[1] 神经机器翻译通过联合学习来对齐和翻译(Bahdanau et。艾尔,2015)
[2] 基于注意力的神经机器翻译的有效方法(Luong et .阿尔,2015)
你所需要的只是关注。阿尔,2017)
[5] 用神经网络进行序列对序列学习(Sutskever 等。铝,2014)
[6] TensorFlow 的 seq2seq 教程带关注(seq 2 seq+关注教程)
[7] Lilian Weng 关于关注的博客(关注的伟大开始)
[8] Jay Alammar 在 Seq2Seq 上的博客,关注度(seq 2 seq+关注度上的精彩插图和工作示例)
【9】谷歌的神经机器翻译系统:弥合人与机器翻译之间的鸿沟(吴 et。艾尔,2016)
深度学习相关文章
逐行 Word2Vec 实现(关于单词嵌入)
如果你喜欢我的内容并且还没有订阅 Medium,请通过我的推荐链接 这里 订阅!注意:你的会员费的一部分将作为介绍费分配给我。
特别感谢 德里克 、威廉【Tjhi】宇轩*【任杰 、克里斯和软软为本文出谋划策、提出建议和修改意见。*
关注我上 推特 @remykarem 或者LinkedIn。你也可以通过 raimi.bkarim@gmail.com 联系我。欢迎访问我的网站remykarem . github . io*。*
Python-IV 和 WoE 中的属性相关性分析
最近我写了关于递归特征消除——我最常用的许多特征选择技术之一。今天我要讲的是另一个——属性相关性分析。与 RFE 不同,它更深入地挖掘个人属性,并试图告诉你变量的哪个部分与目标变量有最强的联系。

Photo by Vladislav Babienko on Unsplash
在我攻读数据科学硕士学位的第一个学期,我遇到了一位“古怪”的教授。他真的是个老古董——乍一看,你可以看出他是这个行业的老手。他的课叫做“数据科学简介”,根据这个名字,你会期望对数据科学领域、基本术语的基本介绍,以及对数据科学库的介绍。
不是这样的。
开始的时候,我对这门课不是很满意,主要是因为它有严重的偏见。他谈论的都是客户流失模型和一些我一无所知的神秘术语— 属性相关性分析。
我现在在业内工作,现在才真正体会到他的话。对于一个新人来说,听客户流失建模并不是最有趣的事情——你可能更愿意学习用超复杂的神经网络对狗和猫进行分类。
但是残酷的现实是——这不是你在日常工作中要做的事情!
大多数“数据科学”工作,至少在我居住的这个不发达的第三世界国家,包括与数据库和数据仓库打交道,而每天写 R/Python 代码不是很多人做的事情。
突然听到关于流失建模变得更有趣了!
但是什么是属性相关性分析呢?
好问题。我引用一下官方课书里的一段话:
属性相关性分析阶段的任务是识别对客户流失影响最大的属性(特征)。通过属性相关性分析,显示出与流失(流失=“是”或“否”)相关的最大分离能力的属性将被选为建立预测流失模型的最佳候选。[1]
出于某种原因,这本书里的英语很糟糕。我不是说我的是完美的,但作为有声读物听这个是一个痛苦的过程。
尽管如此,我还是希望你能领会它的要点。
属性相关性分析绝不仅仅用于预测性流失模型开发,您可以将其用于所有分类任务。它基于两个术语:信息值和证据权重。
信息价值和证据权重
好吧,我保证我会简短的讲讲这个理论。根据www.listendata.com的证据权重解释如下:
证据的权重表明了自变量相对于因变量的预测能力。由于它是从信用评分世界演变而来的,它通常被描述为区分好客户和坏客户的一种方法。【不良客户】指拖欠贷款的客户。【好客户】指还贷客户。[2]
从同一来源,信息价值的解释如下:
信息值是选择预测模型中重要变量的最有用的技术之一。这有助于根据变量的重要性对其进行排序。3
两者都很容易计算。下面是公式:

WoE and IV formulas
如果我们在讨论客户流失建模,那么商品将是没有流失的客户,而商品将是流失的客户。仅仅从这一点,就可以看出公式背后的简单。
然而,计算这两者将是你最后要做的事情之一——一些先决条件需要事先满足。
WoE 和 IV 先决条件
为了突出先决条件,我将把它们放在一个有序列表中。
- 数据集必须干净。您可以用单词' MISSING '逐字填充缺失的值,我建议您这样做,看看缺失的值是如何与目标变量联系起来的。
- 不应该有任何连续属性。根据你的喜好,代表年龄或任何连续事物的属性应该被分成 5-10 个格。只要确保每个箱至少有 5%的观察值。
一旦您的数据集处于这种形式,您就可以继续进行 WoE 和 IV 计算过程。
流失建模示例
为了制作这个例子,我使用了来自 Kaggle 的客户流失建模数据集。装入熊猫时,看起来是这样的:

Head of Churn_Modeling.csv
流失建模示例的属性相关性分析分为 6 个步骤:
- 数据清理和准备
- 计算 IV 和 WoE
- 识别搅拌器轮廓
- 粗分类
- 虚拟变量创建
- 虚拟变量之间的相关性
所以,事不宜迟,我们开始吧!
第一步。数据清理和准备
数据集不包含缺失值,因此满足先决条件 1/2!
有 10,000 个观察值和 14 列。从这里开始,我开始清理数据。以下是我采取的步骤:
- 删除CustomerId姓氏——任意,不能用。
- 将 信用分数 、 年龄 、 余额 和 估计销售额 分组到 5 个箱中
- 删除年龄余额 和 估计销售额 ,因为不再需要它们**
下面是实现这些步骤的代码片段:
Data Cleaning — https://gist.github.com/dradecic/10f4b1a909a8ad42539e7b8aee4da74b
数据集现在是干净的,不包含连续变量。2 的先决条件 2 已满足!
新的、清理后的数据集如下所示:

Head of the Cleaned version of Churn_Modeling.csv
第二步。计算 IV 和 WoE
现在我可以开始计算 IV 和 WoE 了。出于某种原因,我无法找到这样做的 Python 包,至少我没有找到有良好文档记录的包,所以我必须自己编写代码——没问题!
下面是计算证据权重和信息值的函数。给定 Pandas 数据帧、属性名和目标变量名,它将进行计算。
该函数将返回熊猫数据帧和 IV 分数。代码乍一看可能有点复杂,但如果逐行阅读,就不会复杂。
IV and WoE function — https://gist.github.com/dradecic/52d8b2b2213dd3d46f4b75f85c1183f2
为了避免在内存中创建许多不必要的数据帧,一个简单的循环将为您打印出所有内容:
Printing Loop — https://gist.github.com/dradecic/9bd774d84c3ad9f193646fb7dccbd326
这里注意 Exited 是目标变量的名字,由于逻辑原因,你不会为它做计算。当执行这个代码单元时,您将在笔记本中获得大量输出:

Excerpt of IV and WoE output
如果这是你第一次计算 IV 和 WoE,你可能会想:这到底是怎么回事?!****
有一个简单的解释。
现在,你应该只关心 IV 分数那一行。更准确地说,把你的想法放在 IV 分数最高的变量上。下面是 IV 解释表:

IV Interpretation table
现在你应该能看到更清晰的画面了。您应该只保留那些具有良好预测能力的属性!在当前数据集中,它们是:
- NumOfProducts(0.80)
- 年龄 _ 仓位 (0.74)
- 地理 (0.17)
- is active member(0.15)
第三步。识别搅拌器轮廓
这实际上并不是必需的步骤,但是这样做是非常有益的。
作为一家公司,你可能想知道典型的厨师是什么样子的。我的意思是,你不关心他/她的外表,但你想知道那个人住在哪里,他/她的年龄,等等…
为了找出答案,您需要仔细查看那些预测能力最强的变量的返回数据帧。更准确地说,看看 WoE 一栏。理想情况下,你会发现负的 WoE 分数——这是大多数搅拌者拥有的数值。
在我们的示例中,这是典型的搅拌器配置文件:
- 生活在德国(权重系数 0.63)
- 使用 3 种产品/服务(WoE -2.92)
- 不是活跃成员(WoE -0.36)
- 已超过 46 年(WoE -1.20)
有了这些信息,作为一家公司,您可以采取行动,解决这个关键的客户群。
第四部分。粗分类
粗分类是另一个我在攻读硕士学位之前没有听说过的术语。解释其背后的想法非常简单,你基本上是想把有相似遭遇的实例放在一起,因为它们提供了相同的信息。****
我再次需要自己编写代码来完成这项工作。
对于这个数据集,应该对 地理 属性中的西班牙和法国进行粗分类(0.24 和 0.28)。

IV and WoE for Geography attribute
下面是用于粗略分类的函数,以及函数调用。要调用该函数,您必须事先知道您想要粗化的两行的索引位置。代码非常简单明了,请看一下:
Coarse Classing function — https://gist.github.com/dradecic/564c3a9de955ef972b74575f2b700920
以下是粗分类过程后数据集的样子:

IV and WoE for Geography after coarse classing
您可以注意到,对于新创建的行,值为 NaN 。这没什么好担心的,你可以简单地重新映射原始数据集,用新的东西替换西班牙和法国,例如西班牙 _ 和 _ 法国。
Geography remapping — https://gist.github.com/dradecic/f1a72679206cdc5285983f40fbe3a679
相关属性中的所有唯一值现在都有非常不同的 WoE——这意味着您可以继续下一步——创建虚拟变量。
第五步。虚拟变量创建
我们就要到达终点了。差不多了。
如您所知,当只有二元属性时,分类模型表现最好。这就是虚拟变量出现的原因。
根据维基百科:
虚拟变量是一个取值为 0 或 1 的变量,用来表示可能会改变结果的某种分类效应的存在与否。[4]
简而言之,如果属性有 n 个唯一值,您将需要创建 n — 1 个虚拟变量。当一个变量是另一个变量的完美预测变量时,可以少创建一个虚拟变量以避免共线性问题。
以下属性将需要虚拟变量:
- 地理
- NumOfProducts
- 年龄 _ 仓位
下面的代码将创建它们,然后将它们与 IsActiveMember 属性和目标变量 Exited 连接成一个新的数据帧:
Dummy Variables — https://gist.github.com/dradecic/e6eaafed7ed5cd6599abb12dc8a40f60
如果您现在看一下新创建的数据帧的头部:

DF with Dummy Variables — Head
现在所有的属性都是二进制格式——只剩下最后一步了!
第六步。虚拟变量之间的相关性
你已经坚持到最后了。该过程的最后一步是计算虚拟变量之间的相关性,并排除相关性高的变量。
什么被认为是高相关系数还有待讨论,但是我建议你去掉任何相关度超过 0.7** (绝对值)的东西。**
如果您想知道在这两个变量中要删除哪个虚拟变量,删除证据权重较低的那个,因为它与目标变量的联系较弱。
我决定绘制一个相关性矩阵,以获得相关性的直观表示:

Correlation Matrix
这里可以看到,虚拟变量之间不存在相关性,因此,它们都必须保留。
结论
我将在这里结束这一部分。下一部分将在几天内完成,最多一周,将涵盖基于虚拟变量的预测模型的开发和优化。
我希望你能看到属性相关性分析的威力,不仅在特征选择领域,而且在客户特征分析领域。这篇文章只涉及了整个过程的一小部分,所有的事情都被简化了。为了全面了解情况,我强烈建议你阅读整本书——这本书可以在亚马逊上买到。这不是最便宜的,当然也不是没有错别字,但嘿,如果你能在 YouTube 上观看印度教程,你将能够理解一些刺耳的斯拉夫英语。大概吧。
一旦文章上线,第二部分的链接将附在这里。
在那之前,敬请期待!
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制的学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
** [## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)**
参考
[1] Klepac,g .,Kopal,r .,MRI,L. (2014 年)。使用数据挖掘技术和社会网络分析开发流失模型。美国:IGI-全球
[4]https://en . Wikipedia . org/wiki/Dummy _ variable _(statistics)
音频人工智能:使用卷积神经网络从立体声音乐中分离乐器

黑客音乐走向衍生内容的民主化
这是我在三月份开始的“音频人工智能”系列的第二篇文章,它可以被认为是继之后的第二部分我的第一篇关于使用 CNN 进行人声隔离的文章。如果你还没有读过那本书,我强烈推荐你从那里开始!
简单回顾一下,在第一篇文章中,我向您展示了我们可以构建一个非常小的卷积神经网络(~300k 参数)来实时执行声音隔离。我们欺骗这个网络“认为”它正在解决一个更简单的问题,最终我们得到了这样的结果:
现在,我们如何从这里开始将任何专业制作的立体声混音反向工程到 4 个乐器层,更具体地说,到主 4 个主干?
关于茎
在继续之前,先了解一下词干的背景。
Stems 是来自多个单独音轨的立体声录音。例如,鼓干通常是一个立体声音频文件,听起来像所有鼓轨道混合在一起。在大多数情况下,还包括额外的处理,如均衡、压缩和基于时间的效果……[Izotope,on Stems vs multi tracks】。**
茎从哪里来?stems 已经在录音棚中使用了几十年,作为控制、处理和操纵整组乐器的一种方式,简化了混音、母带制作和制作过程。有些人会互换使用词干、子混音、子组或总线。除了工作流程方面之外,
stems 作为一种独立的格式已经获得了一些欢迎,它可以扩展创作的可能性,特别是在混音和 DJing 方面。
在这种背景下,许多玩家一直在尝试开发这个空间,包括拥有 STEM 格式的原生乐器。
随着艺术家和唱片公司变得更加舒适,越来越少受到一个不断增长的生态系统的威胁,这个生态系统拥抱合作,并了解衍生品的创意和商业潜力,stems 重新受到了一些关注。
惯例是用 4 个词干表示混合:

彻底地
我的第一篇文章的旅程结构得到了很好的反馈,所以我将尝试在这里做一些类似的事情。然而,在这种情况下,'' A '现在是我们训练有素、随时可用的人声隔离模型,而'' Z ',则是词干隔离模型。
假设:我们可以将用于分离人声的相同方法应用于其他乐器
这个假设实际上应该被分解成两部分:
- 我们用来从混音中分离人声的二进制掩蔽试探法同样适用于其他类型的内容。或者换句话说,使用相同的二进制掩蔽技术,我们期望所有词干的隔离的可比较的感知质量。
- 不管 1)是否为真,我们用于学习有声二进制掩码的相同 CNN 架构将能够以相当的准确度学习其他词干的二进制掩码。
如果 1)和 2)都是真的,我们应该处于一个相当好的位置。
输入/输出表示
之前,我向你展示了我们可以创建二进制掩码,当应用于原始混音时,它会产生一个感觉上不错的人声重建。然后,我们训练我们的 CNN 学习如何估计这些二元掩模,这是一个比估计实际人声的幅度谱简单得多的任务。
在这种情况下,我们的输入-输出表示和生成的训练集如下所示:

按照第一篇文章中描述的构建训练集的相同过程,我们现在有了与之前相同的输入,但是有 4 组可能的目标输出,每个词干一组。

Our Stems training set is now composed of 15 million, ~300-millisecond mix fragments and their corresponding vocals, drums, bass, and others middle frame binary masks.
在这种情况下,youtube 抓取方法没有给我们带来多少,我们不得不投入大量的时间和精力来寻找(以及合成)完全对齐的混合词干对。
让我们以鼓二进制掩码为例。现在,值“1”表示在给定频率仓(时间帧位置 )主要存在鼓内容,而值“0”表示在给定位置主要存在 或其他内容 。当谈到频率仓—时间帧位置时,请记住我们实际上指的是二进制掩码中的单个元素(像素),它对应于幅度 STFT 域中的某个值。
多源二值掩蔽
现在我们有多个来源,有许多不同的方法可以生成我们的二进制掩码。实际上,我们在两个主要原则下完成了 7 种不同的变化:

a) 假设在给定的频率仓-时间帧位置上只能出现一个* 源。在这种情况下,您可以想象所有 4 个源 在每个单独的位置竞争 。尽管这是对现实的巨大过度简化,但在某些情况下,它的效果惊人地好。(就感知而言,就听觉掩蔽而言,对存在感的竞争实际上并不那么远离现实。)*
b) 源被允许共享一个频率仓—时间帧位置。或者换句话说,在任何给定位置都可能存在多个源。这显然更符合实际。
由于 b)不依赖于彼此竞争的源,二进制化试探法基于在每个频率仓-时间帧位置的每个单独源和原始混合的幅度 STFT 之间的幅度比标准,并且在一些情况下,以时间-频率空间中的相邻区域为条件。
这两个原则都有其利弊。本文中的内容和演示使用了原则 b)下的专有方法的组合。有关时频掩蔽的全面概述和参考资料,您可以查看本资源。

example: left channel of a full song and the resulting binary masks for each stem
现在回到我们的假设,我们如何验证假设 1?我想到了两种方法。

E. Vincent et al. https://hal.inria.fr/inria-00544230/document
1)使用类似于 SAR、SIR、SDR 的音频源分离度量。这些标准是由源分离学术界在几年前提出的,其目标是使评估从源分离过程中回收的估计源的质量的标准标准化,以及用于基准测试的目的。 museval 工具箱 实现了这些指标。
2)一种不太正式(但在构建特定应用时不一定不太有效)的方法是构建小型测试集,并进行监听会话,比较原始源和通过对原始混合进行二进制掩蔽而恢复的源。有了这些,您就可以根据您感兴趣的特定质量向量建立一些评分。

那么,假设 1 的结论是什么?你以后会发现…
模型:学习词干的二进制掩码
现在我们已经有了词干训练集,我们如何将这个输入/输出表示插入一些兼容的架构中,这些架构将学习混合词干任务?
同样,实现这一点的方法不止一种,我将向大家展示我们在设计过程中采用的几种方法。
模型[ 1 ]:合并独立训练的模型用于联合推理

我们知道我们的第一个声音隔离模型效果很好。在考虑重新发明轮子之前,让我们首先验证我们用于学习声乐二进制掩码的相同 CNN 架构与其他词干的行为类似。(假设二)
本质上,
通过简单地改变我们的目标二进制掩码,我们可以训练与人声完全相同的架构,用于隔离鼓、低音和其他声音
例如,对于鼓声干,我们将在输入端呈现 X(混音),在输出端呈现 y(鼓声)。
一旦我们的 4 个独立模型训练完毕,我们就可以将预训练的权重加载到 4 个相同的模型占位符中。从到我们可以连接这些模型,使它们共享一个公共输入,同时连接它们的输出层,以便在每个推理步骤,我们同时获得所有 4 个词干的二进制掩码。把这 4 个模型想象成一个新的、更大的模型的分支(这就是这里发生的事情)。
查看这个新模型的输出层,你可以看到我们的维度现在是 2052 (4 x 513)。因为我们确切地知道这些模型分支是如何连接的,我们可以通过简单的索引很容易地检索每个主干的二进制掩码。

下面,我将向您展示使用 Keras 的 Functional API 构建上述架构的代码。我将把把权重从预训练模型加载到新模型占位符中的任务留给您。在 Keras 中使用load _ weights()/get _ weights()/set _ weights()函数应该相对简单。
*from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, Concatenate
from keras.layers.advanced_activations import LeakyReLU
from keras import Input, Model# this can be done in a for loop but I'll do it the 'redundant' way
# for clarityinput_shape = Input(shape=(513, 25, 1))# BRANCH VOCALSx_1 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_1 = LeakyReLU()(x_1)
x_1 = Conv2D(16, (3,3), padding=’same’)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = MaxPooling2D(pool_size=(3,3))(x_1)
x_1 = Dropout(0.25)(x_1)x_1 = Conv2D(64, (3,3), padding=’same’)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = Conv2D(16, (3,3), padding=’same’)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = MaxPooling2D(pool_size=(3,3))(x_1)
x_1 = Dropout(0.25)(x_1)x_1 = Flatten()(x_1)
x_1 = Dense(128)(x_1)
x_1 = LeakyReLU()(x_1)
x_1 = Dropout(0.5)(x_1)
x_1 = Dense(513, activation='sigmoid')(x_1)# BRANCH DRUMSx_2 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_2 = LeakyReLU()(x_2)
x_2 = Conv2D(16, (3,3), padding=’same’)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = MaxPooling2D(pool_size=(3,3))(x_2)
x_2 = Dropout(0.25)(x_2)x_2 = Conv2D(64, (3,3), padding=’same’)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = Conv2D(16, (3,3), padding=’same’)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = MaxPooling2D(pool_size=(3,3))(x_2)
x_2 = Dropout(0.25)(x_2)x_2 = Flatten()(x_2)
x_2 = Dense(128)(x_2)
x_2 = LeakyReLU()(x_2)
x_2 = Dropout(0.5)(x_2)
x_2 = Dense(513, activation='sigmoid')(x_2)# BRANCH BASSx_3 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_3 = LeakyReLU()(x_3)
x_3 = Conv2D(16, (3,3), padding=’same’)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = MaxPooling2D(pool_size=(3,3))(x_3)
x_3 = Dropout(0.25)(x_3)x_3 = Conv2D(64, (3,3), padding=’same’)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = Conv2D(16, (3,3), padding=’same’)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = MaxPooling2D(pool_size=(3,3))(x_3)
x_3 = Dropout(0.25)(x_3)x_3 = Flatten()(x_3)
x_3 = Dense(128)(x_3)
x_3 = LeakyReLU()(x_3)
x_3 = Dropout(0.5)(x_3)
x_3 = Dense(513, activation='sigmoid')(x_3)# BRANCH OTHERSx_4 = Conv2D(32, (3,3), padding=’same’, input_shape=(513, 25, 1))(input_shape)
x_4 = LeakyReLU()(x_4)
x_4 = Conv2D(16, (3,3), padding=’same’)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = MaxPooling2D(pool_size=(3,3))(x_4)
x_4 = Dropout(0.25)(x_4)x_4 = Conv2D(64, (3,3), padding=’same’)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = Conv2D(16, (3,3), padding=’same’)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = MaxPooling2D(pool_size=(3,3))(x_4)
x_4 = Dropout(0.25)(x_4)x_4 = Flatten()(x_4)
x_4 = Dense(128)(x_4)
x_4 = LeakyReLU()(x_4)
x_4 = Dropout(0.5)(x_4)
x_4 = Dense(513, activation='sigmoid')(x_4)# concatenate output layers
merged_output = keras.layers.concatenate([x_1, x_2, x_3, x_4], axis=1)# connect to single/common input layer
model = Model(input_shape, merged_output)# define optimizers, loss, etc and compile model...*

尽管最终模型有接近 1.3M 的参数,但学习过程仅在约 300K 参数的架构中进行
得出你自己的结论,但我想在这里指出的是:
- 我们总是可以通过解决多个更小的问题来尝试解决一个大问题。(在 ML 中不总是最好的做法,但有时确实如此)
- 您肯定希望关注您的参数数量与您的模型在训练期间将接触到的示例数量。请记住,在从声音隔离到词干解构的过程中,我们所做的只是生成备选的目标二元掩码集,但训练实例的数量保持不变。通过这种设计,我们保持了与之前相同的# 训练示例< > #参数比率。
- 因为我们隔离地训练每个词干的模型,所以每个模型的能力学习其相应的二进制掩码不受其他模型的训练过程的影响。
你可能会问…“为什么不在推理过程中将这四个模型分开呢?”
这是一个完全合理的问题。答案是,对于这个特定的应用程序,我们需要执行混合到词干解构,作为连接到其他几个进程的实时管道的一部分,包括回放。正因为如此,我们希望所有的词干同时生成,以避免缓冲和同步问题。最重要的是,我们必须在单个 GPU 上运行它。将这四种模式分开会让双方都面临更大的挑战。例如,如果您正在构建一个 API,并且您不关心同步或实时性,那么您将拥有更大的灵活性。
模型[ 2 ]:使用原始的单茎模型估计 4 个二元掩模
假设我们想对我们使用单茎架构一次生成所有二进制掩码的能力进行压力测试。我们可以做的是将输出维数增加到 2052 ,这样我们就可以在训练期间在输出端呈现所有 4 个二进制掩码。然而,输出维数的增加将使参数总数增加到大约 0.5M。这并不一定是一个问题,但是,就像有人说的那样“解耦你的假设!” 一天 3 次,先看看我们在可比条件下训练这个模型会发生什么。
有许多不同的方法可以减少参数的数量。例如,我们可以将输出前最后一个 FC 层的维度从 256 减少到 77,如下所示:

在训练期间,我们在输入端呈现 X(mix ),在输出端呈现所有 4 个词干的二进制掩码的串联。这里需要指出几点:
- 这个模型现在必须弄清楚如何分享它的权重,以满足每个茎干对的要求:它自己的二元掩码。然而,学习过程现在将是全球性的,而不是特定于 stem 的。
- 1)的一个重要含义是,在某种程度上,我们的茎现在 与竞争重建质量。(不要与我们的二进制化原则混淆 a)其中我们的茎在构建我们的二进制掩码时竞争存在)。即使我们在输出端只有一个向量,模型预测每个词干的二元掩码的能力也会受到其他词干的影响,这是基于:
- 我们的组合和每个词干之间的输入/输出关系在我们的训练集中有多一致。
- 与其他词干相比,每个词干的时频模式一般有多复杂。根据 MSE 损失标准,网络可以“优先考虑”具有更容易估计的掩码的茎,和/或在对其他茎进行重建之前,对某些茎收敛到良好的重建。**
以上两点是部分有效的假设,完全可以讨论。它们来自我们在实验中持续观察到的行为。
型号 3 :单茎多茎杂交
**
在这种情况下,前两个卷积层是不可知词干的。该模型在如何在所有 4 个茎干之间共享这些层的权重方面拥有完全的决定权。在第二个卷积层之后,我们创建 4 个分支,每个分支包含 2 个卷积层,每个分支对应一个主干。虽然我们没有明确地告诉模型哪个分支对应于哪个词干,但是模型将被迫根据输出端的目标二进制掩码将每个分支优化为特定的词干。
这种设计背后的推理是基于在空间域中具有结构化数据的 CNN 的已知行为,其中学习过程衍生为特征的分层分解;从粗糙原始到细致具体。我们的假设是,我们可以通过说服它在词干无关的过滤操作和词干特定的过滤操作之间划分任务,来帮助模型更好地学习。通过检查第一卷积阶段的一些特征图,我们没有观察到明确的词干特定模式。然而,随着我们深入研究,在每个分支的输出端计算的大多数特征图揭示了清晰的茎特定模式。这不应该是一个惊喜,尽管看到它非常酷:)
与模型 2 的情况一样,优化是全局的,而不是特定于词干的。
感觉上,这个模型的结果与模型 1 的结果相当。我要说我们关于这种特殊设计的有效性的假设部分得到了验证,但不是结论性的。
模型[ 4 ]:从头开始训练模型 1 的架构
对于模型 1,我们合并了独立训练的模型,记得吗?

如果我们从头开始训练同样的完整架构会怎么样?

也不错。这里值得一提的几点:
- 在这种情况下,每个分支的任务是特定于 stem 的。例如,人声分支将学习如何隔离人声和人声,因为它的目标二进制掩码和它的权重不共享或连接到任何其他分支。
- 然而,**每个分支的能力学习其分配的任务会受到其他分支的影响……为什么?就像模型 2 和 3 一样,优化是全局的,而不是特定于 stem 的。**在训练期间,将为完整的 2052 维输出向量计算损失,而没有任何约束来对所有词干实施“公正”。这意味着,模型可能再次决定基于难度等级优先考虑某些词干。另一种解读方式是,一些分支可能在其他分支之前收敛到更好的解决方案。
从回归到分类
在第一篇文章中,我解释了我们最初的声音隔离设计是如何成为某种回归-分类混合体的。
“我们要求模型“将输出端的像素”分类为有声或非有声,尽管从概念上来说(以及根据使用的损失函数-MSE-),这项任务仍然是一项回归任务”
通过查看我们的输出表示,是什么阻止我们将我们的问题作为一个分类问题来对待呢?最后,我们需要在输出端的两个离散值 0 或 1 之间做出选择。因此,我们可以将词干分离问题转化为一个多标签分类器。
以声音隔离模型为例,输出维度等于 513。想想这些价值代表什么。我们知道它们都是同一事物的一部分,对吗?只是二进制掩码中的点,稍后映射到幅度谱,等等&等等……嗯,另一种解释这些值的方式是,它们是 标签或类别,表示不同桶中内容的存在。
一个类比可能有助于明确这一点:

where ‘fb’ can be defined as ‘frequency bin’ and where each label describes a position or bucket
为了将我们的问题转化为多标签分类器,我们需要做什么改变?
- 我们现在将使用 二元交叉熵 ,而不是使用 MSE 作为损失函数。你可以这样想:,我们现在每个词干有 513 个二元分类器,它们将以单个时间帧的分辨率进行分类。
- 输出前的最后一层应跟随一个s 形激活函数。(我们的 MSE-loss 模型已经是这种情况,但现在它是一个要求)
现在,当我们进行一次推理来估计中间帧的二进制掩码时,我们得到的是给定源按照 频率仓出现**的概率。为了构建最终的二进制掩码,在第一篇文章中描述的滑动窗口和连接机制之前,我们需要通过简单的阈值处理重新二进制化这些输出:**
*predicted_mask[predicted_mask >= 0.5] = 1
predicted_mask[predicted_mask < 0.5] = 0*
将我们的问题视为多标签分类器,与 MSE 损失、基于回归的等效模型相比,在隔离质量方面有了一些显著改善。
最小延迟模式下的中间帧预测与最后一帧预测。

on the left, the input representation we’ve been working with so far. In blue, the timeframe for which we’ll be predicting our binary mask. On the right, an alternative, past-context-only solution for minimum latency.
对于这项工作,实时操作是一个重要的设计约束。这要求我们除了机器学习之外,还要花大量时间做软件架构设计和实现工作。具体来说,我们必须确保两件事:
从信号处理/流水线的角度看实时性
确保以下过程
…【读取音频,将其分段,转换,使用我们的 ML 模型预测二进制掩码,将词干重建回时域,并从估计的词干中提取附加特征,包括开始、音高、转录等..这一切都在立体声中] …
比音频回放速度还快。在追求这一点时,拥有一个快速推理的 ML 模型显然是非常需要的(因此在我们的设计中减少了模型参数的数量),尽管这只是难题的一部分…你好多线程、滑动窗口、缓冲、同步等。为了实现这一点,我们在 GStreamer 的基础上构建了一个优化的 C/C++管道,这远非没有痛苦,但当我们看到隧道尽头的光明时,这是非常美好的。我们最终的解决方案比回放快了大约 2.5 倍。
实时传输动态生成的音频
这就是事情变得真实的地方……在第一种情况下,我们关心的只是性能,但是在提前访问输入数据方面没有任何限制。如果您的过程比您的回放或交付速率更快,那么您需要实现所需的排队机制来保存您的数据,以便以后检索。
现在,当您的输入在录制过程中以流的形式传输给您时,会发生什么情况呢?例如,您需要为现场音乐安装执行去混音?嗯,因为你不能再向前看,如果你需要未来的环境来预测现在,你将会引入延迟!那么我们能做些什么来避免(减少)这种延迟呢?

回到我们训练模型的输入输出表示,一个替代方案是仅依靠过去的上下文来学习预测我们的二进制掩码,如左图所示。这样,无论我们的管道有什么样的记录/回放缓冲阶段,我们都可以很好地限制延迟。
最大的问题是:当只依赖过去时,隔离质量会受到影响吗?是的,非常重要!这并不奇怪,因为音乐是时间序列数据。如果我们知道在之前和之后*发生了什么,那么任何给定的时间范围都将更加可预测。然而,这对于我们的目的来说已经足够好了。[现在你可以想象我咆哮着谈论真正特征工程的重要性,就像我在我的第一篇文章中所做的那样..]***
回到我们的 4 个型号,你一定想知道…哪一个更好?
很抱歉这么无聊,但是它们都有各自的优点和缺点…有些型号比其他型号对某些类型的内容和混合条件更敏感。其他方法以重构源的更高退化为代价实现了更好的隔离,等等。总的来说,除了模型 2,他们都很好地学习了这项任务,这可能是因为它的参数数量有限(~300k 参数)和高维输出。在任何情况下,我在这里的目标都不是给你音频源分离的圣杯(当我到达那里时,我可能会保留给自己:),而是为你提供一些与这个特定问题相关的关键见解和直觉,以及设计一般人工神经网络时的一些考虑。
根据假设 1,最终的答案是,用于人声的二进制掩蔽方法对低音相对适用,但对鼓和其他不太适用。在大多数情况下,您在鼓中听到的衰减(尤其是在高音/钹中)更多地与二进制掩蔽有关,而不是与 ML 模型有关。在 others 的情况下,同样的二进制掩蔽导致来自其他来源的某种程度的干扰,尤其是人声。你可以在例子中听到这一点,这留下了证据,表明'垃圾入…垃圾出…'* 原则肯定适用于 ML。*
最终注释
- 首先,非常感谢花时间阅读这篇文章和/或第一篇关于声音隔离的文章的每一个人。我收到了一些很棒的评论和反馈。让他们继续前进!
- 与我的第一篇文章相关,我发现一些帖子里有人指出了其他类似的工作,我猜他们想知道我是否意识到了。我的答案是肯定的。但是澄清一下,我的作品,包括你在这里看到的演示,实际上是 2016 年的… 那些特别的论文和演示是在那之后。虽然我的重点是应用方面的东西,我很好地跟上时代(并且非常热情!)关于这个主题的所有伟大的学术工作。也就是说,即使在 3 年后,你在这里看到的输出质量也超过了当前许多学术和商业解决方案。
- 然而,如果我今天必须解决这个问题,我可能会探索其他方向,也许是在时域中重复出现的东西,或者是基于 GAN 的渐进设计,以及其他想法。在追求完美隔离的过程中,基于二进制/软屏蔽的解决方案总是会遇到瓶颈。
不要犹豫,留下问题。时间允许的话,我会继续写音频 AI 的东西!
ps:再次感谢 Naveen Rajashekharappa 和 Karthiek Reddy Bokka 对这项工作的贡献。
奖金轨道(我的意思是,茎…)
免责声明:本文所述的知识产权、设计和技术此前已在美国专利 US10014002B2、US9842609B2、US10325580B2 中公开。
音频人工智能:使用卷积神经网络从立体声音乐中分离人声

黑客音乐走向衍生内容的民主化
如果我们能回到 1965 年,拿着“所有人都可以进入”的徽章敲开艾比路录音室的大门,并有幸聆听那些标志性的列侬-麦卡特尼和声 A-五车二,会怎么样?我们在这里输入的是一个中等质量的 mp3,由甲壳虫乐队的演奏。顶部音轨是输入混音,底部音轨是从我们的模型中分离出来的人声。
正式名称为音频源分离,我们在这里试图解决的问题在于恢复或重建一个或多个源信号,这些信号通过一些- 线性 或 卷积- 过程已经与其他信号混合。该领域具有许多实际应用,包括但不限于语音去噪和增强、音乐再混合、空间音频、重新灌制等。在音乐制作的背景下,它有时被称为去混合或去混合。关于这个主题有大量的资源,从基于 ICA 的- 盲- 源分离,到半监督非负矩阵分解技术,再到最近的基于神经网络的方法。为了更好地了解前两个,你可以看看 CCRMA 的系列迷你教程,我发现它在过去非常有用。
但是在开始设计之前..一点点应用机器学习哲学…
作为一个在“深度学习解决一切”热潮之前已经在信号和图像处理领域工作了一段时间的人,我将作为一次特征工程之旅来介绍该解决方案,并向您展示为什么对于这个特定的问题,人工神经网络最终成为最佳方法。为什么?我经常发现人们写下这样的东西:
“有了深度学习,你再也不用担心特征工程了;这就去做"
或者最差…
“机器学习和深度学习的区别 < 让我就此打住……深度学习还是机器学习! > 在 ML 中你做特征提取,在深度学习中它在网络内部自动发生”。
这些概括,可能来自于 DNNs 在学习好的潜在空间方面非常有效的事实,是错误的。我很沮丧地看到最近的毕业生和从业者被上述错误观念所说服,并采用'深度学习解决一切'方法作为你只是扔一堆原始数据(是的,即使在做了一些预处理后,你仍然可能是罪人:),并期望事情只是按照预期工作。在现实世界中,您的数据不像 MNIST 数据集那样简单、干净和漂亮,而且您必须关心实时性、内存等问题,这些误解会让您在很长一段时间内陷入实验模式…
特征工程不仅在设计人工神经网络时仍然是一个非常重要的学科;在大多数情况下,就像任何其他 ML 技术一样,它将生产就绪解决方案与失败或表现不佳的实验区分开来。对您的数据及其领域的深刻理解仍然可以让您走得更远……
彻底地
好了,现在我已经结束了说教,让我们进入你来的目的吧!就像我在职业生涯中处理的所有其他数据问题一样,我将从提出问题 “数据看起来怎么样”? 。让我们来看看下面一段来自原始录音室录音的歌声片段。
‘One Last Time’ studio vocals, Ariana Grande
不太有趣吧?这是因为我们正在可视化波形或时域信号,我们所能获得的只是信号随时间变化的幅度值。我们可以提取诸如包络、RMS 值、过零率等东西,但是这些特征太过原始*,不足以帮助我们解决问题。如果我们想从混音中提取声音内容,我们应该以某种方式展示** 人类语言的结构,从开始。幸运的是,短时傅立叶变换(STFT) 来拯救我们了。*
STFT magnitude spectrum - window size = 2048, overlap = 75%, log-frequency [Sonic Visualizer]
虽然我喜欢语音处理,我肯定会喜欢浏览源滤波器建模、倒谱、倒频、LPC、MFCC* 等等,但我将跳过所有这些内容,专注于与我们的问题相关的核心元素,以便尽可能多的人能够理解这篇文章,而不仅仅是音频信号处理/语音社区。*
那么,人类语言的结构告诉了我们什么?

我们在这里可以发现三个主要因素:
- 一个基频 (f0),由我们声带的振动频率决定。在这种情况下,阿丽亚娜在 300-500 赫兹范围内歌唱。
- f0 以上的多个谐波,遵循类似的形状或模式。这些谐波以 f0 的整数倍出现。
- 清音语音,包括类似‘t’,‘p’,‘k’,‘s’(不是我们声带振动产生的)、呼吸等辅音。它们在高频区表现为短脉冲。
使用基于规则的方法进行首次拍摄
让我们暂时忘记这个叫做机器学习的东西。基于我们对数据的了解,我们能想出一种方法来提取我们的声音吗?让我试一试…
幼稚人声隔离 V1.0:
- 识别声乐部分。在一个混合体中有很多事情在发生。我们希望将重点放在实际包含有声内容的部分,而忽略其他部分。
- 区分浊音和清音部分。正如我们所看到的,有声语音和无声语音看起来非常不同,因此它们可能需要不同的处理。
- 估计基波频率随时间的变化。
- 基于 3 的输出,应用某种屏蔽来捕捉谐波内容。
- 对无声部分做点别的…

如果我们做得不错,这个过程的输出应该是一个软或二进制* 掩码,当它应用于(元素级乘法)混音的幅度 STFT 时,给我们一个人声幅度 STFT 的近似重建。然后,我们将该人声 STFT 估计与原始混音的相位信息相结合,计算逆 STFT,并获得重建人声的时域信号。*

从头开始做这件事已经是很大的工作量了。但是为了便于演示,我们将使用一个 pYIN 算法的实现。即使它是为了解决第三步,在正确的约束下,它也很好地处理了第一步和第二步,同时即使在有音乐的情况下也能跟踪声乐基础。下面的例子包含了这种方法的输出,没有处理无声部分。
嗯…?它有点成功了,但是恢复的声音质量还没有达到。也许有了额外的时间、精力和预算,我们可以改进这个方法,让它变得更好。
现在让我问你…
当你有多种唱腔时会发生什么,这在今天至少 50%的专业制作的曲目中肯定是这种情况?
人声经过混响、延迟等效果处理后会怎么样?让我们最后一次看看爱莉安娜·格兰德的《T4》的最后一段合唱。
你已经感到疼痛了吗…?我是。
很快,如上所述的特别方法就变成了纸牌屋。这个问题太复杂了。规则太多,规则的例外太多,变化的条件太多(效果和不同的混音设置)。多步骤方法还意味着一个步骤中的错误会将问题传播到下一个步骤。改进每一步都是非常昂贵的,它需要大量的迭代来获得正确和持久,但同样重要的是,我们可能会以计算昂贵的管道而告终,这本身就可能是一个交易破坏者。
在这些场景中,我们需要开始考虑一种更加端到端的方法,让 ML 找出解决问题所需的底层流程和操作的一部分。然而,当谈到特性工程时,我们不会认输,你会明白为什么。
假设:我们可以使用 CNN 作为传递函数,将混音映射到人声
受 CNN 在自然图像上的成就的启发,为什么不在这里应用同样的推理呢?

CNNs have been successful at tasks such as image colorization, deblurring and super-resolution.
最后,我们知道我们可以使用短时傅立叶变换将音频信号表示为图像,对吗?即使这些音频 图像不遵循自然图像的统计分布,它们仍然揭示了我们应该能够从中学习的空间模式(在时间与频率空间中)。**

Mix: you can see the kick drum and baseline at the bottom, and some of the synths in the middle getting mixed with the vocals. On the right, the corresponding vocals-only
当时,验证这项实验是一项昂贵的工作,因为获得或生成所需的训练数据已经是一项巨大的投资。在应用研究中,我总是试图实现的一个实践是首先确定一个更简单的问题,该问题验证与原始问题相同的原则** ,,但是不需要做太多的工作。这允许你保持你的假设更小,迭代更快,当事情不像预期的那样工作时,以最小的影响为中心。**
最初的解决方案起作用的一个隐含条件是一个 CNN 必须能够理解人类语言的结构。一个更简单的问题可以是:给定一个混合片段,让我们看看 CNN 是否可以将这些片段分类为包含有声内容或不包含有声内容。我们正在寻找一个音乐鲁棒的声音活动检测器(VAD) ,实现为二进制分类器。
设计我们的特征空间
我们知道,音乐和人类语音等音频信号嵌入了时间相关性。简单地说,在特定的时间范围内,没有任何事情是孤立发生的。如果我想知道一段给定的音频是否包含人类语音,我可能也应该查看邻近区域。那个时间背景可以给我关于感兴趣区域正在发生什么的好信息。同时,我们希望以非常小的时间增量来执行我们的分类,以便我们能够以尽可能高的时间分辨率来捕捉人类的声音。

让我们做一些数字…
- 采样率(fs): 22050 Hz(我们从 44100 向下采样到 22050)
- STFT 设计:窗口大小= 1024,跳跃大小= 256,梅尔标度用于感知加权的插值。由于我们的输入数据是实数,我们可以使用一半的 STFT(原因不在本文讨论范围之内……),同时保留 DC 分量(不是必需的),这样我们就有 513 个频率仓。
- 目标分类分辨率:单个 STFT 帧(~11.6 毫秒= 256 / 22050)
- 目标时间范围:~300 毫秒= 25 个 STFT 帧。
- 训练样本的目标数量:50 万
- 假设我们使用步长为 1 STFT 时间帧的滑动窗口来生成我们的训练数据,我们需要大约 1.6 小时的标记音频来生成我们的 0.5M 数据样本。[如果你想知道更多关于生成实际数据集的细节,请在评论中提问]
根据上述要求,我们的二元分类器的输入/输出数据如下所示:

型号
使用 Keras,我们可以建立一个小的 CNN 模型来验证我们的假设。
**import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.layers.advanced_activations import LeakyReLUmodel = Sequential()
model.add(Conv2D(16, (3,3), padding='same', input_shape=(513, 25, 1)))
model.add(LeakyReLU())
model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))model.add(Flatten())
model.add(Dense(64))
model.add(LeakyReLU())
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss=keras.losses.binary_crossentropy, optimizer=sgd, metrics=['accuracy'])**
****
通过 80/20 的训练测试分割,在大约 50 个时期后,我们达到了 97%的测试准确度,这意味着有足够的证据表明我们的 CNN 模型可以区分包含声乐内容的音乐部分和没有声乐内容的音乐部分。通过检查来自第四卷积层的一些特征图,看起来我们的网络已经优化了它的内核来执行两个任务:过滤音乐和过滤人声…

Sample feature maps at the output of the 4th conv. layer. Apparently, the output on the left is the result of a combination of kernel operations that try to preserve vocal content while ignoring music. The high values resemble the harmonic structure of human speech. The feature map on the right seems to be the result of the opposite task.
从 VAD 到源分离
既然我们已经验证了这个简单的分类问题,我们如何从检测音乐中的人声活动一直到从音乐中分离出人声呢?好吧,从我们在开始描述的幼稚的方法中挽救一些想法,我们仍然想要以某种方式结束对人声的幅度谱图的估计。这现在变成了一个回归问题。我们想要做的是,给定一个来自混合的 STFT 的时间帧(具有足够的时间上下文),估计相应的声音时间帧的幅度谱。
训练集怎么样?(此时你可能会问自己)
哦,主啊…那真了不起。我将在文章的最后解决这个问题,这样我们就不会切换上下文了!

如果我们的模型学习得很好,在推理过程中,我们需要做的就是在混合的 STFT 上实现一个简单的滑动窗口。每次预测后,我们将窗口向右移动 1 个时间帧,预测下一个声音帧,并将其与前一个预测连接起来。关于模型,我们可以从使用我们用于 VAD 的相同模型作为基线开始,并且通过进行一些改变(输出形状现在是(513,1),输出处的线性激活,MSE 作为损失函数),我们可以开始我们的训练。
不要宣称胜利……
虽然上面的输入/输出表示有意义,但是在用不同的参数和数据标准化训练我们的声音分离模型几次之后,结果还没有出来。看来我们要求的太多了……****
我们从二元分类器转向尝试在 513 维向量上做回归。尽管网络在一定程度上学习了该任务,但是在重构人声的时域信号之后,存在来自其他源的明显的伪像和干扰。即使在添加更多层和增加模型参数的数量后,结果也不会有太大变化。
于是问题变成了:我们能不能欺骗网络让它认为*它正在解决一个更简单的问题,并且仍然能达到预期的结果?*****
如果我们不是试图估计人声的幅度 STFT,而是训练网络来学习一个二进制掩码,当它应用于混音的 STFT 时,会给我们一个简化但感知上可接受的人声幅度谱图估计呢?
通过试验不同的试探法,我们想出了一个相对简单的(从信号处理的角度来看肯定是非正统的)方法来使用二进制掩码从混音中提取歌声。在不涉及太多细节的情况下,我们将把输出视为二进制图像,其中值“1”表示在给定频率和时间帧位置主要存在声乐内容,值“0”表示在给定位置主要存在音乐。视觉上,它看起来很不美观,但是在重构时域信号时,结果却出乎意料地好。

Binary masking (or TF masking) techniques have been around for decades and have been proven very effective in specific audio source separation and classification problems. However, most available techniques have been optimized for speech enhancement / recognition applications and fall short when it comes to real-world data such as professionally-produced & mastered music. Our binarization method was specifically designed for this scenario.
我们的问题现在变成了某种回归分类的混合体。我们要求模型“将输出端的像素”分类为有声或非有声,尽管从概念上来说(以及根据所使用的损失函数-MSE-),该任务仍然是一个回归任务。

虽然这种区别对某些人来说似乎无关紧要,但它实际上对模型学习指定任务的能力产生了巨大的影响,第二种方法更简单,也更受限制。同时,考虑到任务的复杂性,它允许我们在参数数量方面保持我们的模型相对较小,这是实时操作非常需要的,这是这种情况下的设计要求。经过一些小的调整,最终的模型看起来像这样。
****
我们如何重建时域信号?
基本上,如天真T2【方法】一节所述。在这种情况下,对于我们所做的每一次推理,我们都预测了人声的二进制掩码的单个时间帧。同样,通过实现一个简单的滑动窗口,一个时间帧的跨度,我们不断估计和连接连续的时间帧,最终组成整个人声二进制掩码。

创建训练集
如你所知,有监督的机器学习中最大的痛点之一(抛开所有那些有可用数据集的玩具例子不谈)是拥有针对你试图解决的特定问题的正确数据(数量和质量)。基于所描述的输入/输出表示,为了训练我们的模型,我们首先需要大量的混音及其对应的、完全对齐和标准化的声道。建立这个数据集的方法不止一种,在这里我们使用了多种策略,从手动创建带有一些网上找到的 acapellas 的混合<>声乐对,到寻找 RockBand stems,再到浏览 Youtube。为了让您了解这个耗时且痛苦的过程,我们的“数据集项目”包括创建一个工具来自动构建 mix <>人声对,如下图所示:

我们知道网络需要大量数据来学习将混音映射到人声所需的传递函数。我们最终的数据集由大约 1500 万个大约 300 毫秒的混音片段及其相应的人声二进制掩码组成。

流水线架构
为给定的任务建立机器学习模型只是交易的一部分。在生产环境中,我们需要考虑软件架构、管道和优化策略,特别是当我们处理实时时。
对于这个特殊的问题,可以在预测完整的人声二进制掩码(离线模式)后立即进行时域重建,或者更有趣的是,作为多线程管道的一部分,我们在小片段中进行采集、处理、重建和回放,从而使其成为流友好的,甚至能够以最小的延迟对正在录制的音乐进行实时解构。鉴于这本身就是一个完整的主题,我将把它留给另一篇关注实时 ML 管道** …**
我想我已经讲得够多了,我们为什么不再听几个例子呢?
蠢朋克——走运(工作室)
we can hear some minimal interference from the drums here…
阿黛尔——放火烧雨(现场录音!)
Notice how at the very beginning our model extracts the crowd’s screaming as vocal content 😃. In this case we have some additional interference from other sources. This being a live recording it kinda makes sense for this extracted vocal not to be as high quality as the previous ones.
好的,那么还有“最后一件事”…
既然这适用于人声,为什么不把它应用到其他乐器上呢?
这篇文章已经足够广泛了,但是鉴于你已经做了这么多,我想你应该看看最后一个演示。利用提取声乐内容的完全相同的推理,我们可以通过对我们的模型进行一些修改,当然,通过适当的训练集,尝试将立体声轨道分割成主干(鼓、低音线、声乐等:)
准备好再去兔子洞了吗?下面是第二部分!
** [## 音频人工智能:使用卷积神经网络从立体声音乐中分离乐器
黑客音乐走向衍生内容的民主化
towardsdatascience.com](/audio-ai-isolating-instruments-from-stereo-music-using-convolutional-neural-networks-584ababf69de)
感谢阅读,不要犹豫,留下问题。我会继续在音频 AI 上写文章,敬请期待!最后,您可以看到我们最终构建的实际 CNN 模型并没有那么特别。这项工作的成功是由对特征工程方面的关注和对假设验证实施精益流程推动的,这是我将在不久的将来写的东西!
ps:感谢 Naveen Rajashekharappa 和 Karthiek Reddy Bokka 对这项工作的贡献!**
使用预训练的 VGG-19 (Keras)进行音频分类

在这篇文章中,我将针对音频分类的问题。我将根据预先训练的 VGG-19 从音频波形中提取的特征训练一个 SVM 分类器。这篇文章背后的主要思想是展示预训练模型的力量,以及应用它们的容易程度。
我想在真实世界的数据上评估这种方法。于是我想到把超跑和重型自行车的音频分类。下面是我创建这个分类器的步骤:
从 Youtube 下载音频文件
首先,我选择了我想要音频的 youtube 视频,然后我使用下面这段代码下载了. mp3 格式的音频文件。
**from** __future__ **import** unicode_literals
**import** youtube_dl
ydl_opts = {
**'format'**: **'bestaudio/best'**,
**'postprocessors'**: [{
**'key'**: **'FFmpegExtractAudio'**,
**'preferredcodec'**: **'mp3'**,
**'preferredquality'**: **'192'**,
}],
}
**with** youtube_dl.YoutubeDL(ydl_opts) **as** ydl:
ydl.download([<youtube video link>])
# for bike sounds : [https://www.youtube.com/watch?v=sRdRwHPjJPk](https://www.youtube.com/watch?v=sRdRwHPjJPk)#forcar sounds : [https://www.youtube.com/watch?v=PPdNb-XQXR8](https://www.youtube.com/watch?v=PPdNb-XQXR8)
将音频文件从. mp3 转换为。wav
下载了. mp3 文件后,我把它们转换成了。wav 文件,使用下面这段代码。
**from** pydub **import** AudioSegment
sound = AudioSegment.from_mp3(**"car.mp3"**)
sound.export(**"car.wav"**, format=**"wav"**)
提取音频块
下一步,我从。wav 文件。
**from** pydub **import** AudioSegment
**import** os
**if not** os.path.exists(**"bike"**):
os.makedirs(**"bike"**)
count=1
**for** i **in** range(1,1000,15):
t1 = i * 1000 *#Works in milliseconds* t2 = (i+15) * 1000
newAudio = AudioSegment.from_wav(**"bikes.wav"**)
newAudio = newAudio[t1:t2]
newAudio.export(**'bike/'**+str(count)+**'.wav'**, format=**"wav"**) *#Exports to a wav file in the current path.* print(count)
count+=1
绘制振幅波形
下一步是绘制这些音频的波形。这是用下面的代码完成的。
**from** scipy.io.wavfile **import** read
**import** matplotlib.pyplot **as** plt
**from** os **import** walk
**import** os
**if not** os.path.exists(**"carPlots"**):
os.makedirs(**"carPlots"**)
car_wavs = []
**for** (_,_,filenames) **in** walk(**'car'**):
car_wavs.extend(filenames)
**break
for** car_wav **in** car_wavs:
*# read audio samples* input_data = read(**"car/"** + car_wav)
audio = input_data[1]
*# plot the first 1024 samples* plt.plot(audio)
*# label the axes* plt.ylabel(**"Amplitude"**)
plt.xlabel(**"Time"**)
*# set the title
# plt.title("Sample Wav")
# display the plot* plt.savefig(**"carPlots/"** + car_wav.split(**'.'**)[0] + **'.png'**)
*# plt.show()* plt.close(**'all'**)
提取特征和训练直线 SVM
一旦我有了汽车和自行车的这些波形,我就从这些图像中提取特征,将它们输入 LinearSVM 进行分类。为了提取特征,我使用了 VGG-19 的预训练模型,并从展平层提取图像的抽象特征。提取这些特征后,我创建了一个 70-30 的训练测试分割,并训练了一个 LinearSVM。下面是代码。
**import** os
**from** keras.applications.vgg19 **import** VGG19
**from** keras.preprocessing **import** image
**from** keras.applications.vgg19 **import** preprocess_input
**from** keras.models **import** Model
**import** numpy **as** np
base_model = VGG19(weights=**'imagenet'**)
model = Model(inputs=base_model.input, outputs=base_model.get_layer(**'flatten'**).output)
**def** get_features(img_path):
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
flatten = model.predict(x)
**return** list(flatten[0])
X = []
y = []
car_plots = []
**for** (_,_,filenames) **in** os.walk(**'carPlots'**):
car_plots.extend(filenames)
**break
for** cplot **in** car_plots:
X.append(get_features(**'carPlots/'** + cplot))
y.append(0)
bike_plots = []
**for** (_,_,filenames) **in** os.walk(**'bikePlots'**):
bike_plots.extend(filenames)
**break
for** cplot **in** bike_plots:
X.append(get_features(**'bikePlots/'** + cplot))
y.append(1)
**from** sklearn.model_selection **import** train_test_split
**from** sklearn.svm **import** LinearSVC
**from** sklearn.metrics **import** accuracy_score
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42, stratify=y)
clf = LinearSVC(random_state=0, tol=1e-5)
clf.fit(X_train, y_train)
predicted = clf.predict(X_test)
*# get the accuracy* print (accuracy_score(y_test, predicted))
这个简单的模型在测试集上取得了 97% 的准确率。这显示了这些预先训练的模型有多么强大,以及任何人都可以使用它们来创建工具。
我能想到的一个应用是创建一个 chrome 扩展,它可以判断网页上的视频音频是否包含明显的噪音。我鼓励阅读这篇文章的初学者思考一个新问题,并用这里介绍的方法解决它。
具有深度学习的自动化吉他转录
使用卷积神经网络加速学习音乐。

Photo by Jacek Dylag on Unsplash
这篇文章概述了使用 Python、TensorFlow 和 Keras 从音频文件中自动转录吉他的实现,并详细介绍了执行的表层方法。为了进行训练,使用了吉他集数据集,因为它有大量带有相应标签的孤立吉他录音。请注意,这个项目的大部分方向是由 NEMISIG 2019 的一张研究海报提供的,在这里找到。
背景
如果你熟悉卷积神经网络(CNN),那么你可能听说过它们在用于计算机视觉的图像处理和分析方面的潜力。我们希望利用 CNN 的这一功能来输出吉他标签;因此,首先需要使用常数 Q 变换将输入音频文件转换成声谱图图像。
为什么是常数 Q 变换?
为了理解使用常数 Q 变换而不是傅立叶变换来选择频率和创建输入图像的好处,我们必须研究音符是如何定义的:

在音符列中,音符由左边的字母标识,右边的数字代表当前的八度音阶。下面是音符 c 的前六个八度音阶的频率(Hz)图。

我们可以看到,每个连续的八度音程的频率是前一个八度音程的两倍。由于一个八度音程跨越十二个音符,所以我们知道每十二个音符,频率必然加倍,可以用下面的公式表示[1]:

通过绘制这种关系,我们可以看到下图显示了一条指数曲线:

由于这种指数性质,常数 Q 变换比傅立叶变换更适合拟合音乐数据,因为它的输出是振幅对对数频率。此外,常数 Q 变换的精度类似于对数标度,并模拟人耳,在较低频率下具有较高的频率分辨率,在较高频率下具有较低的分辨率[1]。
在 Python 中应用常数 Q 变换
使用 libROSA 库,常量 Q 变换可以很容易地应用于 python 中的音频文件。
通过从指定的开始时间( start )到持续时间( dur )遍历吉他数据集的每个音频文件,并将输出保存为图像,我们可以创建训练 CNN 所需的输入图像。对于这个项目, dur 被设置为 0.2 秒, start 被设置为从零增加到每个音频文件的长度,增加的持续时间如下:

注意,当被用作 CNN 的输入图像时,颜色方案首先被转换成灰度。
培训解决方案
对于每个常数 Q 变换图像,必须有一个解,以便网络可以调整它的猜测。幸运的是,吉他数据集包含作为 MIDI 值播放的所有音符、每个音符在录音中开始的时间以及每个音频文件的音符持续时间。注意:下面的代码片段被放在一个函数中,这样它们可以用于每 0.2 秒的音频。
首先,必须从 jams 文件中提取在加载的 0.2 秒音频中播放的唯一音符(作为 MIDI 音符检索)。
一次只能演奏六个音符(每根弦最多一个音符);因此,代码通常会重复六次。
首先,在变量 Fret 下创建表示吉他的 6 根弦和 18 个品的 MIDI 值的矩阵(6,18):
[[40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57]
[45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62]
[50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67]
[55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72]
[59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76]
[64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81]]
然后使用音柱确定在吉他上检索到的唯一音符的所有可能位置,下面的矩阵显示了一个可能的解决方案:
[[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1]
[0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0]
[0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
必须确定音品和琴弦组合的所有可能的解决方案。创造了“手指经济”的概念——和弦的最低音,根音,与和弦中的其余音进行比较,其中每个音来自根音的品数(不考虑弦)相加,以产生“手指经济”数。具有最低“手指经济”数的解决方案被选为正确的弦形状。
虽然这种方法并不总是与录音中正在演奏的和弦的正确版本相匹配,但它不会对 CNN 的性能产生负面影响,因为在开放位置演奏的 c 大调和弦与在第八品上演奏的 c 大调和弦并无不同。
随后使用最终解决方案中的琴弦和音品阵列的组合来选择最终解决方案:
此外,在每一行的第一列中,如果存在注释(行中的 1),则附加零,反之亦然,如果注释不存在。这样做是为了让 softmax 函数在没有音符演奏的情况下仍然可以为弦乐选择类别。
前面的代码片段返回数据,使得输出类似于类别的一键编码,对于每 0.2 秒的音频,返回以下矩阵格式:
[[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]]
上面的矩阵是吉他选项卡解决方案,从吉他数据集随机选择 0.2 秒。每个矩阵形状是(6,19),其中六行对应于每个吉他弦(eBGDAE 从上到下)。第一列标识弦是否未被弹奏,第二列标识开放弦是否被弹奏,第三至第十九列标识从第一品开始弹奏的特定品。训练时,这个矩阵被分成六个独立的数组来训练模型的每个头部。
模型架构和培训
Keras functional API 用于创建以下多任务分类模型,在训练和测试数据中采用 90/10 分割。该模型有六个任务(eBGDAE 弦乐)来确定弦乐是否未演奏、打开或正在演奏音符。对于这六个输出中的每一个,应用 softmax 激活以及分类交叉熵损失函数。添加脱落层以减少过度拟合。
该模型运行 30 个时期,并记录每个字符串的最终精度。
结果
该模型没有使用完整的吉他数据集音频文件,但是使用了足够数量的输入文件,总共 40828 个训练图像和 4537 个测试样本。
每个字符串的精度被确定为:
Test accuracy estring: 0.9336566011601407
Test accuracy Bstring: 0.8521049151158895
Test accuracy Gstring: 0.8283006392545786
Test accuracy Dstring: 0.7831165967256665
Test accuracy Astring: 0.8053780030331896
Test accuracy Estring: 0.8514436851100615
其平均准确率为 84.23%。
结束语
这个模型还没有准备好开始创建全长吉他琴谱,因为几个问题仍然挥之不去。当前模型尚未考虑音符保持的持续时间,并将继续在代码中指定的持续时间内重复制表符。此外,由于和弦可以有不同的变化,每个变化都包含相同的音符,因此该模型无法识别何时使用特定的发音-这可能会证明不方便-但不是一个重大问题。然而,该模型正确标记音频片段的能力是一个了不起的发展。
参考
[1]c . schrkhuber 和 Anssi Klapuri,用于音乐处理的 Constant-Q 变换工具箱 (2010),第七届声音和音乐计算会议。
增强现实(AR)趋势:2021 年的过去、现在和未来预测

Augmented Reality (AR) Trends
2020 年已经过去,在增强现实领域留下了一些密集的增长记录。这项技术肯定会通过开发更多的雏鸟项目继续在软件领域发展,并出现在大规模产品中。2018 年,许多公司体验了各种增强现实原型以及 POC 概念。
许多创新项目向世界表明,增强现实具有非常好的商业价值和未来潜力。大型企业正在见证增强现实的增长,他们已经计划使用 AR 开发他们即将到来的项目。
专家们正试图将基于增强现实的项目转化为实时客户应用。2021 年的增强现实预测称,AR 技术将继续增长,并加快步伐,打破所有头条新闻。
增强现实的发展确实在进步
ar 是类型的技术之一,最初由萨瑟兰于 1968 年开始,他在头戴式显示系统的构建中使用了 AR。就增强现实的发展而言,它已经迅速用于商业、物流、游戏、制造、零售行业等领域。AR 曾经是一种活动,可以通过其视觉覆盖轻松促进任何业务的增长。
许多组织已经使用增强现实技术进行了实验,结果让他们大吃一惊。报告称,通过构建一个基本的 AR 项目,准确率提高了 90%,时间消耗减少了 30%。该项目得到了进一步的管理,效率后来通过 DHL 得到了提高,使其达到了 25%,并在更广泛的推广中继续增长。
如今,增强现实几乎适用于所有的建筑行业。报告证明,大多数关于增强现实的反馈都是积极的,因为就设计师和客户而言,这是一个非常透明的过程。
增强现实对未来的洞察
1。AR 与人工智能(AI)的密切关系
人工智能对于增强现实的操作非常重要。AR 允许在观看者的视觉视角中标记和识别对象。我们今天使用的许多社交媒体应用程序都是结合增强现实和人工智能开发的。例如,在 Instagram 和 Snapchat 上有各种各样的有趣的滤镜,比如狗滤镜、兔子耳朵、猪滤镜等等。它们基于面向消费者的应用程序。
除非并且直到 AI 和 AR 都被组合和操作,否则这些应用不会起作用。我们肯定会看到并开始使用更多的社交媒体应用程序,它们具有图像增强等功能。
- AR 在教学和培训方面
培训和教学技术都属于教育领域。通过使用增强现实技术,任何信息或数据都可以实时传递给学习者。这些系统提供了更好的视觉感受,并能找出最终导致最佳实践的物体和危险。增强现实已经证明了它的价值,它降低了训练的风险和成本。2021 年,我们将看到使用增强现实技术并使用更昂贵的设备和工具进行工作的行业快速增长。
3。AR 与虚拟现实的联系
脸书是最常用的社交媒体应用之一,它相信增强现实和虚拟现实环境。 AR vs VR 也是时下病毒式的话题。
增强现实将人们联系在一起,在虚拟现实的帮助下使他们社会化。虚拟现实和增强现实一起开发了“电话会议”,用户可以看到彼此,同时也可以相互交流。
这些电话会议也可以同时承载两个以上的人。所有这一切碰巧都是因为增强现实和虚拟现实之间的联系才成为可能。随着这两个平台的结合,一个名为 Spatial 的先驱已经为 AR 设备的使用铺平了道路。
这些工具和设备允许用户见证插针板和白板。增强现实和虚拟现实共同作用于基于设计的文档,这些文档位于实时对象之上。在 2021 年,我们可能会看到用户通过使用虚拟现实见面和社交。还有一个关于这些系统在 VR 和 AR 头戴设备销售方面增长的预测。2021 年将是令人兴奋的一年,等待和体验现实世界中人们之间的互动。
4。AR 正在赶超汽车行业
自动驾驶汽车可能还需要几年时间才能成为现实。与此同时,许多汽车公司正在利用增强现实和人工智能技术来标志他们在市场上的存在。汽车行业是增强现实业务的到来。在 2021 年,我们将会看到语音助手方面的发展,比如 Siri 。汽车中的增强现实技术也会有所增长。
汽车公司目前正在借助摄像机镜头,在汽车周围的仪表板上显示图形。这项技术有可能减少事故的发生,因为它有能力指出危险以及沿途的历史地标。
看到基于 AR 技术的公司取得的成果,特斯拉、丰田、奔驰和沃尔沃等大型汽车公司已经签署了在这个平台上工作的合同。增强现实技术也有能力保护汽车挡风玻璃上的 AR 数据。
在增强现实技术的帮助下,我们还可以体验常用车道的识别、导航提示、危险检测、正确方向信息等。
通过使用 AR 技术,公司可能会制定策略来改善驾驶员的安全状况。这些策略将允许驾驶员将全部注意力集中在道路上,同时浏览显示在手机屏幕上的反馈。这个过程还可以增加驾驶员在车辆中的舒适程度,并且他可以方便地驾驶他的汽车。
即将推进的 AR 趋势
因此,这里有一些我们期待很快成熟和流行的增强现实趋势。
a)移动 AR 是秀塞
随着基于耳机的 AR 的推出,出现了更多使用增强现实进行测量、可预测跟踪、改进渲染和 3D 检测的进步。苹果已经展示了他们的一些经验,通过使用一种新的文件格式来检测物体来共享 AR 空间。
这种格式被称为 USDZ 或通用场景描述。这种格式对第三方软件可能比以往更加开放。
b) AR 提供自然体验
大家都在等着看手势识别的改进。有些问题,比如凝视的方向,是很有趣的。为了给用户提供自然的体验,最好制造一种方便的产品。例如,当用户只是看着一个物体,它就会立即被检测到,这将会非常有趣。这是我们可以在现实生活中通过消除一个人转头的工作来实现的。
目前,很少有公司专注于最小化跟踪延迟,这是最新 AR 设备中的主要问题之一。这些问题不会持续超过一毫秒,但是它们仍然会给用户带来一定程度的不适。2021 年,我们将看到更多问题在增强现实测试的帮助下得到解决,因为它可能会跟踪任何东西。
c) AR 迎来扩展现实(XR)
扩展现实是一种我们可以数字化改变现实的形式。XR 由思维现实、虚拟现实和增强现实组成。“扩展现实”缩写中的字母“X”代表了上述所有字母。
所有这些现实在其目的和起源上都是独特的。他们的界限有时会被删除,他们重叠的相似之处会变得更加明显。我们相信今年 2021 年将会成功利用所有这些现实。这是增强现实的顶级趋势之一。
d) XR 的重点仍然是在娱乐领域
娱乐领域目前正在尽可能地利用增强现实和扩展现实以及虚拟现实的领域,今年肯定不会后退一步。XR 有充分的潜力在未来几年在娱乐领域生存下去。
苹果在游戏中使用增强现实,而其他公司则将其用于教育目的。我们将继续见证移动 AR 在业务和软件开发方面的快速增长。
AR 市场为现代化创新解决方案铺平道路
如果你有一个有意义的想法,可以增加产品的产量和销量,那么增强现实技术已经准备好以其现代化和创新的能力带你走向成功。随着增强现实领域的快速发展,你的想法将会占上风,并获得超越其艺术结构或领域的胜利。
许多被市场抛弃的想法现在又重新出现,只是因为使用了卓越的增强现实技术和趋势。例如,在室内导航设计中面临的问题,如场景的定位、起点和终点、标记等,现在正以很高的速度返回来解决并进入市场。
随着时间的推移,这些技术将在增强现实的帮助下得到改进和完善。市场总是对那些在他们的想法中利用增强现实的人开放。
f) AR 导致进化而非革命
2018 年可能不是增强现实的突破时期,但苹果等许多顶级公司正在尽最大努力,通过实施更好的想法,将增强现实带入跨平台环境。
让 AR 直接出现在浏览器中,这是苹果目前正在努力的一个想法,预计甚至在 2021 年就会有一些创新。这将消除下载移动应用程序的需要。我们非常急切地等待 XR 技术在应用后为企业服务的方式。在技术专业知识稳步增长的情况下,必须正确和精确地使用算法进行增强现实开发。
前进
许多技术专家正在考虑 AR,因为它被认为在几乎每个应用领域都取得了成功。几乎任何问题都可以在增强现实解决方案的帮助下迎刃而解。当谈到使用增强现实开发应用程序时,很明显它提供了如此好的机会来愉悦用户体验。通过包括增强现实的使用,我们可以在多个领域带来更多的进步,尤其是考虑到增强应用程序开发的未来。
UX 的设计师们已经开始使用增强现实技术趋势来改进他们的设计。这种增强现实技术无疑会给 UX 专家带来很多优势。UX 的专业人士正试图提高设备的能力,以利用其在 IT 世界的进步。
因此,今年充满了许多惊喜,等待着通过使用 ar 技术提高任何对象的当前质量、效率和生产率。做好准备,见证 AR 技术单独或与虚拟现实和人工智能相结合的发展。
用机器学习的合成数据扩充分类数据集。
在扩充的合成分类数据中进行标签验证的高斯混合模型。
考虑一个假设但常见的场景。您需要构建一个分类器来将样本分配给一个群体组。你有一个相当大的一百万样本的训练数据集。已经清洗、准备好并贴好标签。少数连续变量已经标准化,而代表大多数特征的分类变量使用一次性编码方案推出。现在构建一个简单的神经网络分类器,或者一个随机的 forrest,或者你的箭筒中的另一个首选方法应该是轻而易举的。但是由于您是一名彻底的数据科学家,您对数据集进行了快速的描述性分析,并发现了一个问题。不平衡的基本利率。
人口映射到 10 个类别,但其中两个代表 98%的数据。剩下的八个类只覆盖了可怜的 2 %,几乎不足以让你的统计模型舒适地收敛。你能做什么?

一种方法是增加数据并为代表性不足的类别合成新的样本,目的是平衡基本速率。该方法非常简单,常用于图像分类。每幅图像都被裁剪、旋转、移动多次,以增加分类器学习的可用样本数量。有一个软保证,图像的微小扰动不会改变分类标签。所以这项技术非常有效。为什么不对我们的连续和分类变量数据集使用类似的方法呢?难道我们不能随机地,但分钟地扰动数据集,并扩大我们的代表性不足的类吗?
我们不能。事实上,我们可能会遇到大麻烦。虽然扩充图像通常保留了像素之间的关系,从而保留了标签分配,但是用大部分二进制分类特征扰乱数据集会将被扰乱的样本转移到完全不同的类别中。例如,考虑跑步者和游泳者的数据集,然后考虑在 0 或 1 之间随机翻转性别特征。这种干扰可能会在增强期间将女性游泳运动员移动到男性游泳运动员类别中,但不会改变标签。最后,一双没用的泳裤可能会被推荐给那些寻找连体泳衣的人。
我将描述一种解决标签转换的方法,这种方法在过去为我们的项目发挥了作用。这个想法的主旨是
- 从代表性不足的类别中选择所有样本
- 将子集中的每个类复制 N 次,以获得合理的表示
- 使用分布的平均值和标准偏差作为扰动界限,随机扰动每个子集中的要素,并对分类值归一化为 0 和 1
- 验证每个新样本属于正确的类别,或者使用高斯混合模型和 Mahalanobis 距离重新分配到新的类别。
实现的实际机制与上面的元算法略有不同,但保留了理论结构。我们接下来会讨论。
样本分析的高斯混合模型。
出于直觉,让我们将高斯混合模型(GMM)视为 K-均值聚类的推广,因为大多数人在某个时候都使用 K-均值。一个区别是 GMM 考虑了多维分布的椭球形状,并允许每个样本的多分量分配,而 K-Means 基于球形分布假设和单分量分配。我将不讨论 GMM 背后的理论,而是将它们的好处用于我们的事业。
Mahalanobis 距离(MD)是一个多维度的概括,它表示样本与分布平均值之间的标准偏差。该度量是无单位的和尺度不变的,并且它尊重数据的椭圆形状,随着样本沿着每个主分量轴远离平均值而增加。这里我想插入一些 LaTex 代码来说明这个函数,但是 Medium 不支持它:-(。
提醒一下,我们的目标是通过扰动现有样本来合成新的类样本,以便平衡成功分类器训练的基本速率。我们的问题是大量的分类特征使得扰动不稳定——分类特征的小变化可能导致标签的大变化——新样本可能成为不同类别的成员。因此,我们必须验证每个新样本,如果扰动将样本转移到新的类别,则重新分配新的标签。
下面是我们在 N = 10 的 N 类例子中是如何做的。我假设你对转基因大豆和熊猫有一些经验。Python 警察注意:代码是为了清晰而写的,而不是为了效率——是的,有冗余,而且确实有更好的方法来做事。
1)在任何扩充之前,让我们训练 10 个单独的单分量高斯混合模型。我们从每个类别中提取所有样本的子集,然后为每个类别连续训练单个 GMM,并将μ和σ值存储在字典中。我们将使用scikit实现 GMMs。
2)让我们计算每个分布的平均 Mahalanobis 距离(MD ),稍后我们将使用它进行成员资格检查。
3)让我们使用 Mahalanobis 距离(MD)作为健全性检查,以验证我们已知样本的子集映射到由新训练的 GMM 表示的其对应的类。这里的想法是计算从每个样本到所有 GMM 的 Mahalanobis 距离。最小距离给出了我们将样本分配到的类别。我们使用正确和不正确的赋值来计算准确度。注意:如果已知样本映射的精确度很低,那么你的类就不容易分离,这种方法就不起作用。我们的目标是 90%的准确率作为下限,但是准确率目标应该取决于您的问题的具体情况。
4)将所有代表性不足的类别提取到单独的子集中,并捕获每个类别的分布统计。我们将使用平均值和标准偏差值作为参数,使用高斯先验为每个类别随机生成新样本。这相当于干扰现有的样本集。这实际上偏离了我之前介绍的元算法,但实现了相同的目标。
5)迭代新样本,并测量每个 GMM 的 MD。最小 MD 将表示课程分配。如果新样本最接近正确的 GMM,则保留类别标签。如果新样品最接近不同的 GMM,则首先检查样品的 MD 是否在我们在步骤 2 中为该 GMM 计算的平均值范围内。如果是,则重新分配样本类;否则,丢弃样品。
这一过程通过可靠的标签保存增加了连续和分类数据。从概念上讲,该过程类似于机器视觉中广泛使用的图像增强。然而,许多数据集不适合这种方法。你要了解你的数据,合理判断一次成功隆胸的概率。
这种方法帮助我们用不平衡的数据集训练分类器,这些数据集可以很好地推广到看不见的数据。我希望它对你的工作有用。
用数据科学充实投资分析师
基本面投资如何受益于机器学习
基本面投资包括建立一个世界如何旋转和走向的理论,然后确定与战略愿景一致的相关投资。第二部分可能相当乏味,因为它意味着梳理符合该战略的数百到数千家公司的财务指标,以确定定价过低或过高的投资,然后分别买入或卖出。本文将展示如何将机器学习模型与基本投资策略相结合,以允许分析师以透明和可解释的方式衡量他们的投资论点。建模将通过 AuDaS 完成,这是一个易于访问和使用的数据科学之旅使能器。
免责声明:此信息仅供参考。它不构成也无意构成任何金融工具买卖的投资建议或要约或邀约,也不作为任何交易的官方确认。不保证所有市场价格、数据和其他信息的完整性或准确性,如有变更,恕不另行通知。
下载数据
财务比率数据是使用以下简单脚本从晨星获取的:
datadict={}
用于报价器中的名称:
用于范围(10)中的尝试:
尝试:
data dict[name]=(PD . read _ CSV(http://financials.morningstar.com/ajax/exportKR2CSV.html?t='+name ,skiprows=2))
除:
print('带'+name+'的错误-重试')
time . sleep(0.3 *尝试+0.5)
else:
break
else:
print('无法导入'+name)
为了简单起见,我从最初的 100 个特性中抽取了 22 个。
投资论点
对于每家公司,如果是好的投资,我们给 1 分,如果不是,给 0 分。分数是根据一个非常简单的 T21 理论得出的,即如果一只股票的每股收益在第二年增加,那么这只股票就是好股票。当我们考虑年度财务数据时,我们也将在几年内拍摄公司的年度快照,以建立一个合理平衡的数据集。这也说明了一个事实,即一项投资并不总是多年保持良好!
我们现在想用 AuDaS 建立一个分类器,它已经学习了输入和分数之间的关系,以预测哪些投资值得持有。
数据预处理
这是上传到 AuDaS 的数据快照。

在对数据集进行初步分析后,AuDaS 能够识别出支付率%栏中的一些缺失值,这引发了一些关于如何纠正它的建议。当派息率缺失时,这仅仅意味着没有股息返还给投资者,因此我们可以用 0 来填充缺失的值。奥达斯使得按照建议行动变得非常容易。


应用该建议会在数据工作流中添加一个用于审计目的的步骤,如果需要,该步骤也可以反转。

然后,我们可以查看直方图视图,直观地了解我们的“好”和“坏”公司在财务比率中的分布情况。

似乎没有一个清晰的模式,但希望 AuDaS 能够为我们找到一个机器学习模型,准确地映射变量之间的动态!
构建模型
在 AuDaS 中,我们只需要指定我们希望预测 score 列,因为它已经自动排除了 ticker 列(因为它具有级别标识)。此外,AuDaS 为训练模型提供了一个健壮的框架,该框架不会过度拟合,并且可以在生产中工作。

AuDaS 中的建模由 Mind Foundry 的专有优化器OPTaaS 提供支持。它使用贝叶斯方法,从每次迭代中学习什么可行,什么不可行,从而更有效地收敛到最佳解决方案! OPTaaS 作为单独产品提供(可从我的 个人资料 中获得试用链接),目前由全球量化对冲基金和量子计算机使用!
经过几次迭代后,AuDaS 已经找到了一个简单的随机森林分类器,其分类准确率为 67%。

AuDaS 还提供了相关特性和各种性能统计数据。在我们的案例中,似乎每股账面价值对得分的影响最大,其次是派息率%和每股收益。

做预测
AuDaS 构建的模型既可以在平台内使用,也可以通过应用程序或 excel 电子表格进行部署。然后我从晨星拿了微软 2018 年的财务数据,让奥达斯预测它的分数。

AuDaS 使用 LIME 来解释每个特征对预测的影响。正如你所看到的,特性之间的错综复杂比预期的更复杂,这表明分析师在没有机器学习的情况下很难做出结论!
聚集股票
然后,我们可以通过要求 AuDaS 对公司进行聚类来扩展分析。AuDaS 使用 K 均值聚类确定了 8 个聚类:

在构建投资组合时,此分析可用于最终风险分析。
这里没有介绍的其他相关用例可能是:
- 预测公司收入以得出估价
- 为贸易结算预测贸易失败
- 依赖分销策略的基金的营销/销售优化
您可以观看下面的端到端演练:
如果您有任何问题或希望观看 AuDaS 的现场演示,请不要犹豫与联系!
【更新:我开了一家科技公司。你可以在这里找到更多的
团队和资源
Mind Foundry 是牛津大学的一个分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创立,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新、牛津技术和创新基金、牛津大学创新基金和 Parkwalk Advisors 。
用约束优化增强神经网络
添加包含领域知识的约束是一种用世界知识增加神经网络并提高其性能的有趣方式,特别是在低数据设置中。

Image from: Conditional Random Fields as Recurrent Neural Networks, Zheng et al (2015)
在神经网络之上使用约束优化和/或逻辑模块已经成为 NLP 和计算机视觉中许多任务的结构化预测的相当普遍的实践。例如:BiLSTM-CRF 用于 NLP 中的序列对序列任务,或者使用来自神经网络的具有潜在功能的 CRF 用于图像分割任务。
如今,已经有很多积极的研究将这些优化模块直接整合到神经网络中,从而允许网络以端到端的方式进行训练。本文探讨了在神经架构中合并约束的流行方法,并提供了在尝试从数据中学习约束方面的最新进展的调查。
如何将约束纳入深度学习架构?
有四种流行的方法可以尝试将域约束合并到神经架构中:
- 在神经网络上使用约束优化层
- 添加约束违反惩罚
- 强制约束架构设计
- 数据扩充
约束优化层
一些流行的约束优化层是条件随机场、维特比解码、整数线性编程(ILP)或非线性编程(NLP)解算器。
因此,在通过约束优化层合并约束时发生的情况是,您获取神经网络的输出,并将该输出用作实施约束的优化层的潜在函数。
让我们用一个使用这种技术的流行架构来理解它吧— BiLSTM CRF。

BiLSTM Architecture
假设给你一个句子,你必须在上面做词性标注。双向 LSTM(或 BiLSTM)结构通常用于这种序列标记任务。BiLSTM 考虑要标记的单词及其前后的单词,以生成用于预测当前单词的标签的局部嵌入。
现在我们可以看到,在输出空间上有许多自然约束。例如,我们不会经常看到一个名词后跟一个形容词,或者一个副词后跟一个副词(所有这些都是软约束,因为存在一些例外)。有人会认为神经架构应该知道这些限制,但事实往往并非如此。CRFs 比 BiLSTM 表现更好就说明了这一点。

BiLSTM CRF architecture
一种创新的方法是将神经模型的优势与 CRF 相结合,这产生了 BiLSTM-CRF 或 LSTM-CRF 架构。BiLSTM 产生的丰富嵌入充当 CRF 层的特征。点击了解更多信息。
类似的技术也已经在计算机视觉中使用,通常用于通过将 HMM 或 CRFs 与神经网络相结合的分割任务。在这里看一个例子。
约束违反处罚
合并约束的另一种流行方法是使用约束违反惩罚作为正则化方法。我们引入了一个对应于违反约束惩罚的辅助损失项。这个增加的项给出了神经网络有多接近满足约束的可微分测量。这种约束条件的一个例子可以在这里找到。
这些项的添加也为半监督学习开辟了一条途径,因为即使没有输出标签,这种正则化项也可以用于调整模型以更加满足约束。事实上,对于某些问题,任何满足一组给定约束的非平凡假设都是最佳假设的良好近似。对这一假设的研究可以在没有数据(或数据量极低)的情况下进行。更多参考见具有物理和领域知识的神经网络的无标签监督。
实施约束的神经架构设计
这是最早也是最难以捉摸的强制约束方法之一。在这种方法中,我们设计的架构可以自动执行约束。我们可以通过使用推进这种方法的最近工作得到这种方法的直觉:用一阶逻辑增强神经网络。这项工作仅限于对具有语义基础的神经元施加约束(因此,对大多数实际网络来说,这种方法仅限于输出神经元或注意神经元)。此外,约束的形式为L -> R。因此,每当 L 的激活为高时,R 的激活也应该为高,因此对应于 L 的激活的偏置项被添加到负责 R 的神经元,从而每当 L 为高时推动 R 变得更高。
加强约束的数据扩充
人们还可以通过增加数据来加强约束,以激励网络更加注意约束。再次获得这种方法的直觉,让我们考虑一个逻辑驱动的神经模型一致性框架。于是这个小组与 SNLI 一起完成任务。给定两个陈述 P 和 Q,我们需要判断 P 是否包含 Q,P 是否与 Q 矛盾,或者这两个陈述是中性的。自然,人们可以看到蕴涵的传递性和矛盾的交换性。然而,该论文表明,SOTA 模型的 SNLI 往往不执行这些一致性。因此,论文的主要贡献是使用数据扩充,使这些一致性得到加强。例如,如果(P,Q)在带有标签“矛盾”的数据集中,那么(Q,P)也应该加上标签“矛盾”,从而强制模型学习交换性。
怎样才能学会约束?
这是一个相当新的研究领域,我们让神经模型在有限的人工监督下从数据本身学习约束。我们将关注这一领域的两项工作。
用于结构化预测的对抗性约束学习,任等人

Adversarial training to train a generator which can model output label space
它们为结构化预测任务提供了一种创新的半监督学习方法。他们的工作假设遵循真实输出空间分布的大量输出标签是可用的(可能来自模拟器)。然后,他们训练一个生成器网络,该网络可以使用对抗训练技术生成能够模拟真实输出标签空间的输出标签。他们使用有限量的标记训练数据来将输入标签与输出标签相关联,从而进一步调整该生成器。
SATNet:使用可微可满足性求解器桥接深度学习和逻辑推理,王等
这是一个我个人认为非常惊人的研究领域。基本上,他们试图构建一个能够从数据本身学习约束的架构。此外,他们设计的架构可以使用反向传播进行训练,因此可以插在任何深度学习架构之上,用于约束优化任务。他们通过学习解决数独来演示这个模型,只使用数独的实例,没有人为监督来识别约束。
他们试图学习一个 MAX2SAT 实例,该实例通过将手头的问题公式化为半确定的编程实例来对其建模。在正向传递中,它们求解当前 SDP 实例,以找到优化 SDP 的变量分配。然后,他们计算这个变量赋值的损失,并反向传播以修改 SDP 实例。
**Forward Pass** : Solve current approximated problem
**Backward Pass**: Improve approximated problem
现在,拥有反向传播能力的伟大之处在于,你可以将这个模块插在任何深度学习架构之上。考虑给你一个数独的图像,然后你可以有一个 CNN 来识别数字,在此之上,你可以有一个 SATNet 层来解决解码的数独实例。这整个架构可以进行端到端的训练。

Solving visual Sudoku with SATNet
向神经架构添加约束不仅有助于提高性能,而且还提供了更新的方法来利用未标记的数据,修剪输出空间,从而提高模型的可学习性并增加泛化能力。此外,强制约束一致性有助于使网络健壮和可靠。
这篇架构和算法的综述并不详尽,但我希望它能让你对架构和算法中的大多数常见约束有所了解。
干杯!
八月版:数据新闻

实时消费信息(新闻、博客)的人们已经开始期待并快速分析这些信息背后的深层背景。如今,让新闻变得更有趣的是信息在 Twitter 和博客等渠道中被剖析和验证的速度。
在社交渠道上,美国政治的影响力越来越大。有多少人读过穆勒报告?也许你只是想阅读它的某些方面?那么这篇博文将帮助你通过弹性搜索挖掘关于穆勒报告的信息。更重要的是,随着美国大选的临近,像内特·西尔弗这样的人已经在他的政治预测中赢得了声誉。对于那些塔勒布《黑天鹅》的粉丝来说,这篇让塔勒布和西尔弗对决的帖子值得一读。如果你真的想理解@realdonaldtrump 的推文,看看这个!
不解决新闻中的真实问题,我们就无法谈论数据驱动的新闻业。当谈到趋势信息时,我们什么都读,但是我们怎么知道什么是观点,什么是模仿,什么是真实的呢?这篇假新闻检测器的文章提供了一个很好的视角来分类我们每天阅读的内容。如今,我们在质疑信息,我们消耗的数据驱动的分析越多,我们就越见多识广,也越来越依赖它来过滤我们每天阅读的大量信息。
Hessie Jones——全球隐私&安全设计的编辑助理/战略总监。
为什么你应该关心内特·西尔弗和纳西姆·塔勒布的推特之战
由艾萨克·费伯 — 10 分钟阅读
两个数据专家怎么会有这么大的分歧?
正在消失的穷人
到时,科尔森将 — 10 分钟读取
探索世界范围内令人难以置信的繁荣
谁在椭圆形办公室发推特?
由格雷格·拉弗蒂 — 18 分钟阅读
我开发了一个推特机器人@ who sintheeval,它转发唐纳德·特朗普的每一条推文,并预测这条推文是由特朗普本人还是他的一名助手写的。
使用 OCR 和 Elasticsearch 搜索穆勒报告
由凯尔·加拉丁 — 6 分钟阅读
4 月 18 日标志着穆勒报告的全面发布——这份文件概述了对俄罗斯可能干预 2016 年总统选举的调查。
不同媒体的新闻报道有何不同?
迈克尔·陶伯格 — 5 分钟阅读
使用 R 和 Python 对上个月的新闻媒体进行对比分析
利用 word2vec 分析新闻标题,预测文章成功
由 Charlene Chambliss — 17 分钟阅读
文章标题的单词嵌入能预测受欢迎程度吗?关于情绪和股票的关系,我们能了解到什么?word2vec 可以帮助我们回答这些问题,还有更多。
我记录了 2018 年的每一天的快乐程度
按 Nhan Thanh Vu — 7 分钟读取
观察和分析我自己心理健康的趋势
我使用自然语言处理和分类模型构建了一个假新闻检测器
由茉莉·瓦桑达尼 — 6 分钟读完
分析来自子编辑 r/TheOnion & r/nottheonion 的开源数据。
我们也感谢最近加入我们的所有伟大的新作家,诺亚·卢宾,阿什利·宾福特,大卫·埃尔什,亨利·赫伯勒博士,普拉纳尔·肖贝,玛格丽特·西博尼,桑达尔诉,艾米丽·贾,丹·弗里奇曼,塞缪尔·杰 菲奥娜·周,欧根·霍塔吉,阿里·拉扎,海梅·佐诺扎,安德拉娜·罗斯尼克,卢建平博士等众多。 我们邀请你看看他们的简介,看看他们的工作。
一种更快、更简单的机器学习超参数优化方法
由刘佳怡(Jason)发布,Unmesh Kurup 和 Mohak Shah

Auptimizer 是一个通用的开源超参数优化(HPO)框架,它还允许您将 HPO 培训从 CPU 和 GPU 扩展到本地和 EC2 实例。要开始使用,请使用“pip install auptimizer”。你可以在这里找到我们的文档*和我们的回购* 这里 。
在过去的十年里,我们在建立和训练机器学习模型方面取得了重大进展。我们现在可以通过利用算法、学习策略以及分布式计算和内存可用性的改进来优化非常大的模型。然而,随着这些模型的规模和复杂性的增长,基础超参数的数量也在增长。但是处理超参数优化(HPO)的策略在实践中大多仍然局限于最常用的网格和随机搜索方法。虽然有一些针对 HPO 的商业和开源解决方案,但没有一个能广泛适用于各种问题和平台。HPO 既是科学也是艺术,是训练有效机器学习模型的一个关键瓶颈。
一个障碍是对最佳可用的 HPO 算法缺乏共识。开发人员必须试验多种算法,以找到最适合他们问题的算法。然而,实现之间缺乏可移植性意味着用户经常被一个特定的算法所困扰,而这个算法已经围绕着他们建立了工具。Auptimizer 使研究人员和从业人员可以轻松地在不同的 HPO 算法之间切换。此外,Auptimizer 还支持跨平台扩展,使用户能够轻松地将他们的实验从桌面扩展到本地集群甚至云。
对于 ML 研究者来说,用例可以是不同的。研究人员专注于开发算法来寻找最佳超参数。因此,一个简单的框架来促进他们的算法实现,并根据最先进的算法对他们的结果进行基准测试也很重要。
简而言之,Auptimizer 是一个可伸缩、可扩展的 HPO 工具包。Auptimizer 有三个优点:
- 各种 HPO 方法的通用接口,允许在它们之间轻松切换;
- 易于扩展,允许用户(a)添加他们自己的 HPO 算法,( b)根据现有的解决方案对它们进行基准测试;和
- 易于部署到 AWS,提供了一种从个人计算机到云的扩展模型训练的方法。
由于 Auptimizer 是独立于平台的,它可以与您选择的框架一起工作,包括 TensorFlow、PyTorch、MxNet 和 Caffe。
Auptimizer 的通用界面通过抽象出 HPO 算法实现之间的差异,使得在这些算法之间切换的过程变得更加容易。在此版本中,我们支持以下 HPO 技术—随机搜索、网格搜索、Hyperband、Hyperopt、留兰香和 EAS(实验)。
Auptimizer 可以轻松支持较新的 HPO 技术的集成和基准测试,包括您自己的定制算法。作为 Auptimizer 易于扩展的一个例子,我们在短短几天内集成了贝叶斯优化和 Hyperband (BOHB)(只需要编写 138 行代码,同时重用原来的 4305 行代码)。
最后,Auptimizer 还包括自动 HPO 过程的功能。Auptimizer 支持不同的计算资源,例如 CPU、GPU、多个节点和 AWS EC2 实例。它还足够灵活,可以扩展到其他云平台或您的内部解决方案。
致谢:这项工作是 LG 电子(美国研究中心)团队的成果。特别感谢 Samarth Tripathi、Vera Serdiukova、gu Junyao Guo、Homa Fashandi、Guohua Ren 和 Olimpiya Saha 作出的贡献。
由微软 Azure 机器学习管道支持的 Auria Kathi

今年 1 月 1 日, Fabin Rasheed 和我推出了 Auria Kathi,这位 AI 诗人艺术家生活在云中。奥瑞亚写一首诗,根据诗画一个形象,然后用随意的心情上色。所有这些创造性的行为都是在没有任何人为干预的情况下进行的。
Auria Kathi 是“AI 俳句艺术”的变位词。从她的脸到诗歌到艺术,一切都是人工生成的。我们试图在这里突破生成艺术的极限。奥瑞亚被设想为人工艺术的中心。在接下来的日子里,她将创作更多种类的数字艺术。
Auria 的社交媒体存在
奥瑞亚有两个社交媒体账号来发布她的作品。

到目前为止,Auria 已经在这些渠道中聚集了大约 1300 多名追随者。人群包括艺术家、研究人员、技术人员和政策制定者。今年,Auria 将每天发布她的作品。
新闻和出版物
Auria 在多个技术和艺术国际平台上亮相。其中一些包括,
缺乏完美的算法
考虑到当前先进的深度学习算法,我们可能无法提出一个单一的算法或网络来构建像 Auria 这样的高级应用程序。但是奥瑞亚的创造性追求的组成部分可以用独立的艺术算法来模拟。这一愿景决定为 Auria 选择一个管道架构。
奥瑞亚的工程建筑
Auria 的工程管道主要由三部分组成。
- 一个基于 LSTM 的语言模型,训练了从 Reddit 上搜集的 35 万首俳句。该模型用于生成人工诗歌。
- 一个文本到图像的网络,微软研究院称之为 AttnGAN,它将生成的俳句转换成抽象的图像。
- 一种照片真实感风格转换算法,它从 WikiArt 数据集中选择一个随机风格的图像,并将颜色和笔触转换到生成的图像中。WikiArt 数据集是一个 4k+策划艺术作品的集合,这些作品是基于当艺术作品被展示给人类时人类所诱发的情感而聚集起来的。

流水线处理不同算法的挑战
堆叠单个最先进的算法帮助我们构建 Auria,但这种方法的挑战是将这些组件链接起来,并在一个公共空间中一起工作。我们遇到的潜在问题是,
- 修改在不同环境下开发和测试的研究论文的官方实现,例如:Python 版本。
- 一些使用 GPU 进行训练和测试的算法与 CUDA 版本紧密耦合。
- 每个算法都需要在一个封闭的容器中,这样它就可以在一个公共的生产平台中表示,而不会干扰其他环境。
- 组件之间的数据流应该是流畅的。
- 深度学习算法需要高计算设备。除了分步隔离,我们还需要强大的计算资源,比如每一步的 GPU。
- 考虑到不同的开发环境,将 Auria 部署为一个 web 应用程序,让人们来体验她的创造性追求。
微软 Azure 机器学习管道(AML 管道)
机器学习工作流是一个流水线过程,包括准备数据、构建、训练和调整模型,然后将最佳模型部署到生产中以获得预测。 Azure 机器学习管道重新定义机器学习工作流,可以用作机器学习场景的模板。
我们采用了 AML 管道的概念来创建像 Auria 这样的高级应用程序。转换到该平台并不困难,因为 AML 管道的基本构建模块是为构建规模化应用而设计的。
为什么为 Auria 提供 AML 管道?
- 机器学习领域最流行的编程语言是 Python。AML Pipelines 拥有 Python 3 SDK,我们并不担心将现有堆栈迁移到平台上。我们为 Auria 使用的所有三个算法都是用 Python 实现的,我们可以毫不费力地使用 SDK 复制结果。
- 在 Auria 的管道中,我们有自己训练的模型,也有使用预训练权重的模型。这些算法的开发环境是独特的,我们需要在流水线的每一步进行严格的隔离。由于有了这个平台,反洗钱管道中的每一步都是一个码头化的容器。这有助于在不干扰其他步骤设置的情况下构建单独的步骤。所有的文档化步骤都是可移植的,我们可以在多个实验中重用这些组件。
- 每一步都必须提供一个计算引擎,根据需要可以是 CPU 或 GPU。我们使用强大的 GPU 实例来快速训练和调整我们模型的超参数。该平台还提供分布式计算功能,用于并行处理繁重的计算需求。
- 对于我们的风格转换算法,CUDA 依赖性是严格的。它与平台的默认 docker 环境不匹配。幸运的是,Azure 机器学习平台允许添加自定义 docker 容器,而不是为每个应用程序使用默认容器。该功能为在 AML 管道中重建几乎任何配置提供了绝对的自由。
- 部署奥瑞亚去体验她的创作过程是我们目前正在做的事情。AML Pipeline 部署有助于避免花费在构建后端 API 上的时间。部署很容易为管道输出提供 REST 端点,可以方便地使用这些端点。
Auria 是 Azure 机器学习管道的一个完美用例,考虑到我们在使用这个平台时享受的上述好处。在与微软 Azure ML 团队的进一步合作中,我们计划通过使用更先进的算法加强 Auria 的创意渠道来扩大 Auria 的规模,通过在线部署她的粉丝来为她的粉丝创造互动体验,并尝试人工生成的数字艺术内容的新品种。
感谢微软对 AML 管道❤️
的爱,
Auria😉
Auria 将参加 2019 年佛罗伦萨双年展
奥瑞亚将迎来更多好消息!
【2019 年 10 月,我们将参加第 12 届佛罗伦萨双年展,在当代数字艺术展区展出 Auria 的作品。作为一个国际性的艺术平台,艾的作品将会在佛罗伦萨双年展上引起更多的关注。此外,创造性的机器将如何通过激发艺术家提出新颖的想法来建设我们的未来,也将是讨论的关键部分。
敬请关注更新:)
原载于 2019 年 5 月 30 日https://sleebapaul . github . io。
auria Kathi——云中的艺术家。

Image by Auria Kathi (created by Fabin Rasheed and Sleeba Paul)
什么是艺术?是没说出口吗?令人不安的?
在过去的几年里,生成/程序艺术领域发生了很多事情。我们已经看到该领域的一些令人兴奋的应用冲击了主流媒体——可能是像数字怪诞这样的生成式建筑,或者是卖座的人工智能生成的绘画,甚至是像 Prisma 这样使用神经风格转换产生照片艺术效果的简单应用。
广义而言,生成艺术可以定义为使用一套指令生成的艺术,通常使用计算机。艺术可以被制作成数字版本、实体版本或者两者的组合。这个领域的定义仍然和“设计”的定义一样宽泛,许多新的表达形式都被归入这个标题之下。
去年,我和我的一个朋友——斯利巴·保罗聚在一起谈论这个领域。Sleeba 喜欢玩机器学习算法,我喜欢艺术和设计。我们在谈论 Instagram 是如何成为一个投资组合网站的。Instagram 以原创帖子而非分享内容而闻名,似乎是展示创意作品和创造参与度的完美场所。我们在 Instagram 上看到了一些艺术家,我们突然想到了这个主意!—如果一个住在云中的艺术家定期在 Instagram 上发帖会怎么样——一个机器人,一台机器,一段代码,定期创作艺术作品,并在 Instagram 上发帖,不断创造参与度。
Auria 就是这样诞生的。 Auria Kathi 是“AI 俳句艺术”的变位词。我们开始试图创造一个能不断产生俳句的机器人(对我们来说这意味着短诗)。我们希望奥瑞亚创作的诗歌在开始时没有完全的意义,但最终有了一些意义。

Some of Auria’s poetry
贴上这个,我们基于诗歌生成图像,最后用诗歌的情感给它着色(风格化),并把它们分成几组。对于你们当中好奇的人来说,完整的技术细节将在本文末尾给出。

Images by Auria Kathi (created by Fabin Rasheed and Sleeba Paul)
Auria 现在已经成为一个不需要维护的独立机器人——她一年来每天都在上传一首诗和一件艺术品,完全生活在云上。到目前为止,她已经收集了一些人类以及其他像她一样的人的追随者和评论;).她也开始自我推销。
Auria 是第一个完全生活在云中并拥有 Instagram 作品集的艺术家。她的工作室于 2019 年 1 月 1 日在 Instagram 开业。
我们也给了奥瑞亚一张生成的脸。是啊!你没听错,她的脸不是真人的。我们试图让它成为一张普通的、可生成的脸。她活着!
虽然 Auria 不需要任何维护,但我们正在不断改进她。我们计划创造更好的诗歌、意象和它们之间的关系。我们还在开发一个聊天机器人,它会对一些评论和信息做出回应。再往下,奥瑞亚被设想成一个人造艺术家的工作室。人工艺术的中心。我们正计划用 Auria 的脸来制作视频,给她声音和生成的内容来说话。谁知道她会遇到什么。她是同类中的第一个!
跟随奥瑞亚来到这里:
[## auria Kathi(@ auria Kathi)* insta gram 照片和视频
190 个关注者,2 个关注者,7 个帖子-见来自 Auria Kathi (@auriakathi)的 Instagram 照片和视频
www.instagram.com](https://www.instagram.com/auriakathi/)
技术细节
Auria 使用三种主要算法来产生诗歌和艺术。
1。语言建模
第一步是生成诗歌,这是一项语言建模任务。我们围绕35 万首俳句来训练一个长短期记忆(LSTMs)网络。然后,训练好的网络用于生成俳句。代码是用 PyTorch 库写的。Google Colab 用于训练。
样本:
“你能多好就多好
用那种力量拉动它
然后回家。
抱歉。"
2。文本到图像
下一个任务是将生成的俳句转换成图像。我们使用了微软研究院在 2017 年 11 月发表的论文注意力生成对抗网络(或 AttnGAN) ,它可以从输入文本生成输出形状。AttnGAN 从一个粗糙的低分辨率图像开始,然后通过多个步骤进行改进,以获得最终图像。它的架构是 GANs 和注意力网络的混合,这需要多模型优化。
由于 AttnGAN 是一个要训练的大型网络,并且我们的计算设施是最小的,所以我们使用了最初在 MS COCO 数据集中训练的网络的预训练权重。网络可以生成大小为 256x256 的输出图像。AttnGAN 的采样是在 Google Colab 中完成的。
样本:

Raw image
3。给生成的图像着色
为了引入 Auria 的情绪和情感,我们从 WikiArt 情感数据集的样本图像中转移了颜色和形状。WikiArt Emotions 是一个由 4105 件艺术作品(主要是绘画)组成的数据集,其中包含了对观察者产生的情绪的注释。这些艺术品选自 WikiArt.org 收藏的 22 个类别(印象主义、现实主义等)。)来自四种西方风格(文艺复兴艺术、后文艺复兴艺术、现代艺术、当代艺术)。加拿大 NRC 研究伦理委员会(NRC-REB)已根据 2017-98 号方案批准了本研究。
情感图像是随机选取的,以达到奥瑞亚作品的多样性。另外,NVIDIA 的 FastPhotoStyle 用于传递情感图像样式。注意,现有的风格转换算法可以分为以下几类:艺术风格转换和真实感风格转换。对于艺术风格转移,目标是将参考绘画的风格转移到照片,使得风格化的照片看起来像绘画并且带有参考绘画的风格。对于照片级风格转移,目标是将参考照片的风格转移到照片,以便风格化的照片保留原始照片的内容,但携带参考照片的风格。FastPhotoStyle 算法属于照片级真实感风格传递的范畴。图像是使用 Google Colab 生成的。

Painted image
使用 Photoshop 将输出的彩色图像放大到 1080x1080 以保持质量。
样本:

Scaled image
奥瑞亚之脸
在整个奥瑞亚,我们坚持人工的观点。因此,决定为奥瑞亚制造一张人造脸。对生成人脸的追求以 NVIDIA 的渐进增长 GANs 告终,这是 GANs 产生高分辨率输出的最稳定的训练模式。

Generated face image of Auria Kathi by Fabin Rasheed and Sleeba Paul
最后的想法
我们认为奥瑞亚是一个有缺陷、喜怒无常的业余艺术家。她在自己的工作和工作室中拥有所有这些特质。
唯一的区别是,她不是一个物理存在。
除此之外,艺术就是诠释。这是情人眼里出西施。所以,在这里我们开始了一种新的风格,带着一些问题来看待事物。
算法的艺术性会给人类生活增加价值吗?
奥瑞亚能在人类之间找到空间吗?
她会给这个没有实体存在的世界带来新的意义吗?
我们期待着这些问题的答案。
发邮件给奥瑞亚 | 在 Instagram 上关注 | 在推特上关注
这里是斯利巴的更多作品:
阅读斯列巴·保罗在媒介上的作品。梦想家|学习者|讲故事者。每天,斯列巴·保罗和成千上万的其他人…
medium.com](https://medium.com/@sleebapaul)
澳大利亚性别薪酬差距研究

2019 年 6 月 19 日是澳大利亚劳资关系体系认可“同工同酬”原则 50 周年。所以我认为分析工资数据来分析性别工资差距是否仍然存在是合适的。
- 性别薪酬差距概述
根据工作场所性别平等机构的数据,澳大利亚全国性别薪酬差距为 14.1%,是过去 20 年来最低的。全国性别工资差距是女性和男性每周平均全职基本工资收入之间的差异,以男性收入的百分比表示。
毕马威会计师事务所(KPMG)在最近发表的一篇关于这一主题的文章中,将性别薪酬差距定义为衡量薪酬公平和劳动力参与的指标。
公平工作监察员将两性薪酬平等定义为:
- 从事同样工作的男女薪酬相同;
- 从事同等价值的不同工作的男女薪酬相同;
- 通过评估每项工作或每种工作类型的技能、责任和工作条件,以非歧视的方式评估工作的工资和条件,然后给予雇员相应的报酬;和
- 工作场所的组织结构和程序不妨碍女性雇员获得基于工作的培训、晋升或灵活的工作安排。
2。组织中性别薪酬差距的类型
- 同类性别薪酬差距
从事同等或可比价值工作的男女之间的薪酬差距。例如在咨询行业,这相当于比较两个高级顾问。
2.逐级差距
在同一组织级别、工作职责相似的男女之间的薪酬差距。例如,比较在组织结构中处于同一级别的经理
3.全组织范围
这种性别薪酬差距源于整个组织中男女平均薪酬的差异
3。性别薪酬差距的原因
性别薪酬差距会受到许多因素的影响,例如:
- 招聘偏见和相关的薪酬决定。我已经写了一些关于招聘中的偏见以及如何减少这些偏见这里
- 妇女过多地承担无报酬的照料和家务工作
- 工作场所缺乏灵活性,无法兼顾照顾责任
- 女性离开工作岗位的时间更长(长期休假的影响)
4。数据来源
本分析使用的数据源取自 2016-2017 纳税年度的澳大利亚税收数据。该数据提供了 2016-17 年澳大利亚个人、公司、合伙企业、信托和基金的收入和税收状况概览。

用于数据分析的关键领域是职业、女性平均工资、男性平均工资、工资差异、男女工资差距百分比,即工资差异相对于男性平均工资的百分比。负的性别收入差距表明女性收入低于男性。
5。数据假设
- 职业代码根据澳大利亚和新西兰标准职业分类进行分类。2016-2017 收入年度的统计数据来源于截至 2017 年 10 月 31 日处理的 2016 年个人所得税申报表。
- 平均工资以纳税年度每个职业的所有报税人为基准。该数据集中没有考虑年龄、工作经验和工作级别。我将在下一篇文章中介绍这一分析。
6。Tableau 可视化
的画面,即,凸显了从事相同职业的男性和女性之间的一些重大薪酬差距。例如,一名男性神经外科医生(美国薪酬最高的工作)年薪高达 60 多万美元,相比之下,同样职位的女性年薪仅为 28 万多美元,足足低了 45%。

男性薪酬最高的职位大多在医学领域,眼科医生的年薪超过 57 万美元,心脏病医生的年薪为 52.5 万美元等。
在全国收入最高的 50 个职业中,只有 3 个职业的女性收入高于男性。
6。性别薪酬差距最大的职业
下图列出了全国男女薪酬差距最大的 20 个职业。

7。女性收入高于男性的职业
治安官、州长和经纪人是美国收入最高的前 50 个职业中唯一女性收入高于男性的职业。
当我把分析范围扩大到 500 个职业时,只有 15 个职业显示出有利于女性的正性别工资。

8。那么,最近缩小性别薪酬差距的趋势是什么呢?
在澳大利亚,我们在过去的两年里看到了一个可喜的变化。根据 WGEA 的数据,在两年的时间里,性别工资差距已经从平均 16%下降到 14%。目前为 14.1%,这意味着女性平均每周比男性少挣 239.80 美元。

Diagram source : WGEA gender pay gap factsheet Nov 18
毕马威会计师事务所的文章是一个很好的地方,可以让你了解一家公司在缩小性别薪酬差距方面应该采取的步骤和方法。这篇文章包括如何创建商业案例和利用数据来赞助和支持公司中的性别薪酬差距的一步一步的方法,还包括对澳大利亚公司进行性别薪酬差距分析的案例研究。
在 SBS 新闻最近发表的另一篇文章中,DCA 的首席执行官 Lisa Annese 说,女性厌倦了主要落在她们肩上的无酬照护角色和家务负担,特别是如果她们是母亲的话。妇女脱离劳动大军的时间过长,影响了她们发展技能、接受培训和增加终生收入的机会。
这个话题需要我们的关注和尊重。如果性别薪酬差距分析不是一个组织中商业案例的主题,现在是时候考虑采取措施了。在接下来的几个月里,我肯定会有更多关于这个话题的内容。
谢谢你。
作为文本分类或聚类问题的作者分析
你知道吗?J.K .罗琳被指控盗用了“麻瓜”一词,《达芬奇密码》的作者丹·布朗被指控侵犯了非文字版权,有人推测 1983 年的《希特勒日记》是阿道夫·希特勒本人写的,但有证据表明并非如此。
许多这样的“文学”难题都经过了语言专家的检验,因为对话语进行分析和分类是相当复杂的,具有特定领域和高度多维性。
自然语言处理的最新研究领域之一是作者身份分析,它试图利用大数据和人工智能的计算能力,结合语言学和认知心理学,对文本的自动分类进行编码,识别作者简介并解决作者身份冲突。本文试图介绍作者分析的概念,它的应用领域和与之相关的主要子任务。
简介:
通过识别作者的个性特征并检查他们撰写的文章来区分作者写作风格的艺术和科学被称为作者身份分析。因此,它还旨在根据与个人相关的【可用信息】确定个人的传记特征,如年龄、性别、母语和认知心理特征。

Authorship Analysis is a combination of Artificial Intelligence, Linguistics and Cognitive Psychology
在本文中,“可用信息”仅指作者身份分析上下文中的文本数据,然而,此上下文中的信息可能超出文本格式,因为它可能还涉及多模态观察的使用。多模态观察捕捉个人的特征,例如声音、语调、手势、身体姿势和其他身体行为方面。所有这些特征的组合反映了一个人的个性,因此有助于描述这个人。此外,在基于内容的分析中,位置、教育水平、社会地位和作者职业等社会经济变量的信息也至关重要。
作者身份分析任务的类型:
作者身份分析涉及的三个主要任务是作者归属、作者验证和作者简介。他们各自的目标解决了作者分析中的各种挑战。这些任务及其目的总结如下:
i)作者归属:作者归属是在调查来自多个具有明确作者身份的作者的集合文本之后,确定未预见的文本是否由特定个人所写。这在理想情况下是一个闭集多类文本分类问题。[2]

Author Attribution
ii)作者验证:该任务通过研究同一作者的语料库来确定个人是否已经创作了一段文本。这是一个二元单标签文本分类问题陈述。尽管这个任务看起来很简单,但作者验证实际上是一个复杂得多的过程。

Author Verification
iii)作者简介:作者简介也可以被认为是通过研究所创作的文本而对作者进行的个性识别。这包括通过检查作者的写作风格来预测他们的人口统计学特征,如性别、年龄、母语和个性特征。作者特征分析可以看作是一个多类多标签的文本分类和聚类问题。这是一个潜在的聚类问题,因为我们的目标是识别同质的写作风格,并将它们聚类在一起,以便在给定的语料库中进行相似性分析。

Author Profiling
这些任务中的每一个都是可扩展的,这取决于它们在现实世界中用于哪种问题陈述。有时,这些任务的目标相互重叠。
这些任务不限于英语作为自动作者身份分析的语言。正在研究和开发其他语言的计算机化应用程序,如希腊语、法语、荷兰语、西班牙语、阿拉伯语、葡萄牙语和意大利语。[2, 3, 5]
应用领域:
为什么作者分析很重要?它在法医分析和犯罪调查中起着至关重要的作用。此外,社交媒体和开放的网络资源引发了广泛的网络犯罪——虚假个人资料创建、机器人虚假评论、剽窃、黑暗网站促进网络化和有组织的恐怖活动、识别恐怖主义宣言、通过社交媒体消息进行骚扰和恐吓等等。[1]
了解消费者概况和反馈分析对市场分析至关重要,并打算调查匿名反馈作者的人口统计数据。作者分析任务有助于建立消费者档案,识别虚假评论和客户细分。
其他应用领域包括解决小说著作权纠纷、剽窃检测、文件年代测定、审查社会经济因素和心理健康检查。
参考资料:
[1] Reddy、T. Raghunadha、B. Vishnu Vardhan 和 P. Vijaypal Reddy。"作者简介技术综述."国际应用工程研究杂志11.5(2016):3092–3102。
[2] Stamatatos,Efstathios 等,“PAN 2014 年作者识别任务综述” CLEF 2014 年评估实验室和研讨会工作笔记论文,英国谢菲尔德,2014 年。2014.
3 Stamatatos,Efstathios 等人,“pan/clef 2015 评估实验室概述”欧洲语言跨语言评估论坛国际会议。施普林格,查姆,2015。
[4] Rangel,Francisco 等,“PAN 2013 年作者特征分析任务概述” CLEF 多语言多模式信息获取评估会议。CELCT,2013 年。
[5] Rangel,Francisco 等,“pan 2017 第五次作者特征分析任务概述:twitter 中的性别和语言变体识别。”谱号工作笔记论文 (2017)。
自动编码器:它是什么?它是用来做什么的?(第一部分)

Photo by Tomas Sobek on Unsplash
对自动编码器及其 Python 代码的一些常见用例的简单介绍
背景:
Autoencoder 是一个无监督的人工神经网络,它学习如何有效地压缩和编码数据,然后学习如何将数据从简化编码表示重建回尽可能接近原始输入的表示。****
根据设计,Autoencoder 通过学习如何忽略数据中的噪声来降低数据维数。
以下是从 MNIST 数据集到自动编码器的输入/输出图像示例。

Autoencoder for MNIST
自动编码器组件:
自动编码器由 4 个主要部分组成:
1- 编码器:其中模型学习如何减少输入维度,并将输入数据压缩成编码的表示。
2- 瓶颈:包含输入数据的压缩表示的层。这是输入数据的最低可能维度。
3- 解码器:其中模型学习如何从编码表示中重建数据,以尽可能接近原始输入。
4- 重建 损失:这是一种衡量解码器性能以及输出与原始输入接近程度的方法。
然后,训练包括使用反向传播,以最小化网络的重建损失。
你一定想知道为什么我要训练一个神经网络来输出一个和输入完全一样的图像或数据!本文将涵盖 Autoencoder 最常见的用例。让我们开始吧:
自动编码器架构:
根据使用情况,自动编码器的网络架构可以在简单前馈网络、LSTM 网络或卷积神经网络之间变化。我们将在接下来的几行中探索其中的一些架构。
1-用于异常检测的自动编码器:
有许多方法和技术可以检测异常和异常值。我在下面的另一篇文章中谈到了这个话题:
[## 每个数据科学家都应该知道的 5 种检测异常值的方法(Python 代码)
检测异常对任何企业都至关重要,无论是通过识别故障还是采取主动。这篇文章讨论了…
towardsdatascience.com](/5-ways-to-detect-outliers-that-every-data-scientist-should-know-python-code-70a54335a623)
但是,如果您有相关的输入数据,则自动编码器方法将非常适用,因为编码操作依赖于相关的要素来压缩数据。
假设我们已经在 MNIST 数据集上训练了一个自动编码器。使用简单的前馈神经网络,我们可以通过构建如下简单的 6 层网络来实现这一点:
上面代码的输出是:
Train on 60000 samples, validate on 10000 samples
Epoch 1/10
60000/60000 [==============================] - 6s 103us/step - loss: 0.0757 - val_loss: 0.0505
Epoch 2/10
60000/60000 [==============================] - 6s 96us/step - loss: 0.0420 - val_loss: 0.0355
Epoch 3/10
60000/60000 [==============================] - 6s 95us/step - loss: 0.0331 - val_loss: 0.0301
Epoch 4/10
60000/60000 [==============================] - 6s 96us/step - loss: 0.0287 - val_loss: 0.0266
Epoch 5/10
60000/60000 [==============================] - 6s 95us/step - loss: 0.0259 - val_loss: 0.0244
Epoch 6/10
60000/60000 [==============================] - 6s 96us/step - loss: 0.0240 - val_loss: 0.0228
Epoch 7/10
60000/60000 [==============================] - 6s 95us/step - loss: 0.0226 - val_loss: 0.0216
Epoch 8/10
60000/60000 [==============================] - 6s 97us/step - loss: 0.0215 - val_loss: 0.0207
Epoch 9/10
60000/60000 [==============================] - 6s 96us/step - loss: 0.0207 - val_loss: 0.0199
Epoch 10/10
60000/60000 [==============================] - 6s 96us/step - loss: 0.0200 - val_loss: 0.0193
正如您在输出中看到的,验证集的最后重建损失/误差是 0.0193,这非常好。现在,如果我传递 MNIST 数据集中的任何正常图像,重建损失将非常低(< 0.02),但如果我尝试传递任何其他不同的图像(异常值或异常值),我们将获得较高的重建损失值,因为网络无法重建被视为异常的图像/输入。
请注意,在上面的代码中,您可以仅使用编码器部分来压缩一些数据或图像,也可以仅使用解码器部分通过加载解码器层来解压缩数据。
现在,让我们做一些异常检测。下面的代码使用两个不同的图像来预测异常分数(重建误差),使用我们上面训练的自动编码器网络。第一幅图像来自 MNIST,结果是 5.43209。这意味着图像不是异常。我使用的第二个图像是一个完全随机的图像,不属于训练数据集,结果是:6789.4907。这个高误差意味着图像是异常的。同样的概念适用于任何类型的数据集。
2-图像去噪:

Image denoising
去噪或降噪是从信号中去除噪声的过程。这可以是图像、音频或文档。您可以训练自动编码器网络来学习如何消除图片中的噪声。为了测试这个用例,让我们重新使用著名的 MNIST 数据集,并在数据集中创建一些合成噪声。下面的代码将简单地给数据集添加一些噪声,然后绘制一些图片以确保我们已经成功地创建了它们。
上面代码的输出是下图,非常嘈杂和模糊:

在本例中,让我们构建一个卷积自动编码器神经网络。我将介绍构建网络的每一个步骤:
首先,我们定义输入层和输入数据的维度。MNIST 数据集包含尺寸调整为 28 X 28 的影像。因为图像是灰度的,所以图像的颜色通道是 1,所以形状是(28,28,1)。
第二层是卷积层,该层创建卷积核,卷积核与层输入卷积以产生输出张量。32 是卷积中输出滤波器的数量,( 3,3)是内核大小。
在每个卷积层之后,我们使用最大池函数来降低维数。(28,28,32)减少了两倍,因此在第一次最大池化之后是(14,14,32),然后在第二次最大池化之后是(7,7,32)。这是图像的编码表示。
input_img = Input(shape=(28, 28, 1))
nn = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
nn = MaxPooling2D((2, 2), padding='same')(nn)
nn = Conv2D(32, (3, 3), activation='relu', padding='same')(nn)
encoded = MaxPooling2D((2, 2), padding='same')(nn)
下面的代码是原始数字的重建部分。这是网络实际学习如何从输入图像中去除噪声的地方。我们使用上采样功能将图像重建到原始尺寸(28,28)
nn = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded)
nn = UpSampling2D((2, 2))(nn)
nn = Conv2D(32, (3, 3), activation='relu', padding='same')(nn)
nn = UpSampling2D((2, 2))(nn)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(nn)
现在,剩下的最后一步是创建模型,编译它,然后开始训练。我们通过运行以下命令来实现这一点:
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta',loss='binary_crossentropy')
autoencoder.fit(x_train_noisy, x_train,
epochs=50,
batch_size=256,
validation_data=(x_test_noisy, x_test))
训练完成后,我尝试通过网络传递一幅有噪声的图像,结果令人印象深刻,噪声被完全消除了:

如果您缩放上面的 ConvNet,您可以使用它来消除任何类型的图像、音频或扫描文档的噪声。
在文章的这一部分,我介绍了自动编码器的两个重要用例,并构建了两个不同的神经网络架构——CNN 和前馈。在第 2 部分中,我将介绍自动编码器的另外两个重要用例。第一个是如何通过构建 LSTM 网络将 autoencoder 与一系列数据结合使用,第二个用例是一种称为变分 Autoencoder (VAE)的用例,主要用于生成模型和生成数据或图像。敬请期待!
使用 Python Dash、主题分析和 Reddit Praw API 自动生成常见问题
使用快速虚线可视化进行主题建模概述

Dash Topic Modelling with Reddit API and Python
问题陈述
“该死,在我离开 3 天后,我已经失去了我的 Slack 组中的重要内容”
“应该可以快速访问最相关的帖子,并让我快速更新”
同行评审或论坛的最大问题是网站上的大量可用信息。很多时候,我们对大量与他们搜索的内容无关的评论感到沮丧。以这个 Reddit 为例,在这里,我们的主页上有很多帖子。所有的信息都很难跟踪。

These Reddit Posts show how much clutters a forum could bring just by a few days of inactivity
在本文中,我们将了解更多关于如何使从 Reddit 这样的论坛中提取信息更容易、更直观。一种方法是构建一个仪表板页面,用于从论坛中提取关键主题,并将它们打包在一个可过滤的仪表板中以进行快速概述——我将这称为自动生成的常见问题解答,因为它会遍历文本语料库,提取主题以形成趋势和模式,从而创建一个常见问题解答(FAQ)/帖子。这将帮助我们在正确的时间与正确的信息保持联系。
免责声明:本免责声明告知读者,文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人。参考文献是从列表中挑选的,与其他作品的任何相似之处纯属巧合
这篇文章是从作者的论文中摘录的,是佐治亚理工学院计算机科学硕士期末作业的一部分。
为什么自动生成常见问题?
虽然总是有搜索引擎让我们在这些论坛上找到我们需要的信息,但功能是有限的,特别是对于那些不活跃或落后于讨论流程的用户。最终,搜索引擎会对我们有用,因为我们已经知道他们应该寻找什么(例如最新的机器学习论文)。然而,它的功能可能对我们这些想要对一个趋势话题做出贡献或者想要发现与一个话题相关的新想法/信息的人没有用。
考虑以下知识矩阵

Matrix of Knowledge and the solutions in between
在学习过程中存在四个知识领域。第一种涉及已知的知识,即已知的和容易获得的知识,以帮助解决一个人熟悉的问题。接下来是已知的未知,或者是一个人目前不知道但可以获得的知识。一个例子是寻找关于 python 编程语法的信息,而我目前对此一无所知。第三种形式是未知的已知。这被定义为一个人知道存在但不知道如何访问/获得的知识。一个例子是完成一个不知道如何开始/研究的任务。最后一种情况是未知的未知,一个人不知道的知识。在这种情况下,一个人实际上对正在发生的事情一无所知,也不知道知道什么是重要的。当一个人工作太忙而忘记了论坛中的讨论流程时,可能会发生这种情况。
我们的解决方案将有助于 C 和 D 领域,在那里用户可能不知道在给定的时间什么是重要的主题。我们的目标是为用户提供一个知识仪表板,以便快速浏览论坛讨论。
用途和 Github 代码
本概念证明(POC)的目的是作为佐治亚理工学院计算机科学硕士作业提交的一部分创建的,作者目前正在管理该作业。本文中的部分内容经过修改,以更好地反映一般读者的需求。请参考我们的论文这里。
我们的目标是用 Python 和 Flask/Dash 将这个应用程序构建成一个网页应用程序。用于版本控制的其他工具如 Github 也将被实现。请参考我们的 Github 代码这里
工作流程
现在让我们把手弄脏吧。创建自动生成常见问题时,我们需要考虑 3 个步骤

The workflow of creating Auto-Gen FAQ
使用 Praw Python 库提取 Reddit
我们如何提取 Reddit 语料库?
身份验证从使用 Reddit 的 praw 库开始。我不会详细谈论如何准备好您的身份验证,因为有许多可用的资源。请随意访问这里

Reddit praw code to input authorization profiles
然后,我们将获得子编辑信息,该信息将被导出到。

Reddit Code to gain a certain subreddit channel
然后我们可以打开这个 hot_python,它显示了带有以下元数据的 JSON 数据

Metadata retrieved after extracting posts from Reddit Praw
主题抽取
本节说明了如何用 Python 进行近似主题建模
我们将使用一种称为非负指标因子分解(NMF)的技术,这种技术用于从单词包(单词列表)中寻找提取主题。NMF 引入了一种确定性算法,使用文本语料库创建单一表示。由于这个原因,NMF 被表征为最大似然算法。
有关 NMF 和其他主题建模技术的更多信息,请参考本研究论文此处

Using sklearn Count Vectorizer to vectorize words
这将在 topics.csv 中的 1115 个帖子上返回 500 个单词。
我们将使用 NMF 获得一个文档-主题矩阵(这里的主题也称为“组件”)和每个主题的热门词汇列表。我们将通过使用相同的变量名:doctopic 和 topic_words 来进行类比

doctopic and topic words created
然后,我们将生成如下主题和可视化

DocTopic Created
这将创建 5 个主题的可视化,每个主题将根据 NMF 管理的欧几里德距离将 5 个密切相关的单词分组在一起。在给定主题长度的情况下追加 argmax 的计算还帮助我们为语料库中的每个文档定义潜在的主导主题。
以下是找到的 5 个主题
主题 1: omscs 项目学生工作课程
主题 2:计算机科学本科学位非评论
主题 3:乔治亚理工学院在线硕士项目
主题 4:课程班级学期学生新
话题 5:工作提供承诺的时间
主题分析的分析和可视化
然后,我们尝试将主题映射到每个相关的帖子,我们将计算与某些主题相关的帖子的数量,并以饼状图和折线图的形式显示它们。第一个饼图是基于每个帖子的主要话题的投票。

分析
从这里我们可以看到,热门话题谈论硕士和非硕士学生的工作机会。其次是对 omscs 学生的时间承诺。然后是项目和本科课程。

分析
1.在五月和八月,我们可以看到关于硕士研究生的工作和工作机会的话题越来越多
2.10 月,OMSCS 学生对时间和工作量的兴趣呈上升趋势(可能是由于新的 sems 的开始)
3.对于整体活动,我们可以看到 4 月份有所下降,但 10 月份有所上升
Dash 可视化
我们将使用 Dash Python,它是构建在 Plotly 和 Flask 之上的 Python 数据可视化框架。这将是我们在本地可视化和部署的基础。请查看我们的演示和演示下面的一个更生动的应用程序视图。
通过我们的应用程序,用户将能够选择最近最重要的主题,对它们进行过滤,并显示时间表。此外,下表将展示给定其所选主题的最相关的帖子。因此,用户不必点击所有可用的帖子,只需快速浏览一下这个仪表板,就可以了解关于某些主题的讨论。
只需点击几下鼠标,即可过滤所选主题并显示相关帖子。

Dash Python Visualization
调查:我们的应用程序有用吗?
在构建了以下原型之后,我们构建了一个调查来表明确认应用程序的有用性。从这个结果中,我们发现 93%的受访者认为该应用程序非常有用。用户还发现该应用程序非常直观,可以节省手动搜索未分类帖子的时间。这标志着我们的应用程序成功地为论坛访问者增加了价值。
应用程序的有用性

建议的改进

演示
Demo for Auto Generated FAQ for Online Master of Computer Science Educational Tech
结论和未来工作
这个项目让我们有机会解决一个实际的相关问题,这个问题我们很多人似乎都在 Reddit 等论坛上遇到过。我们可以添加许多功能和用户体验来改进该应用程序,但目前,该应用程序已经成功处理了上述核心问题,即从杂乱帖子的论坛中提取相关主题和趋势。
感谢
我们要感谢我们的同学和我的导师郄佳朝·范·奥肯,感谢他们对我们最终完成这篇论文的工作成果的支持和有益的评论。最后是 Ranon Sim,他负责该工具的总体项目管理
最后…
咻…就是这样,关于我的想法,我把它写成了文字。我真的希望这对你们来说是一个伟大的阅读。我希望我的想法能成为你发展和创新的灵感来源。
请通过我的 LinkedIn 联系我,并订阅我的 Youtube 频道
请在下面留言,寻求建议和反馈。
快乐编码:)
奥塔伊:秘制调味酱
加速你的人工智能之路
让数据科学家的生活更轻松

在最近一次预测消费者信贷风险的竞赛中,AutoAI 击败了 90%的参赛数据科学家。
AutoAI 是一种新工具,它利用复杂的训练功能来自动化许多复杂而耗时的功能工程和构建机器学习模型的任务,而无需成为数据科学专家。
下一个视频显示了“自动”工具的预览。今天的 UI 与视频中的有点不同,视频中的 UI 将很快推出。今天你可以试试这里的。
Re-create Example Following This Tutorial
人工智能的智能自动化
AutoAI 自动准备数据,应用算法,并构建最适合您的数据和用例的模型管道。它结合了 IBM 的研究方法和 Watson Studio 的能力。
AutoAI 包括自动:
- 型号选择
- 特征工程和
- 超参数优化
型号选择
为了有效地选择最佳模型,AutoAI 针对数据的小子集运行估计器。数据的样本逐渐增加,在这个迭代过程中消除了估计量。这种方法确保选择最佳估计器,同时节省计算时间和存储。高达 31 倍的加速。

Results from paper¹ of applying Model Selection method (DAUB) vs full training.
特征工程
提出正确的功能集是机器学习项目中最耗时的步骤之一。AutoAI 的自动特征工程结合了以下两种技术:
- 模式学习从成千上万的数据集中提取最常见的转换。这一步离线进行。
- 一种有效剪枝特征空间的强化学习方法。奖励函数是在新特征空间评估的质量度量和在原始特征空间评估的质量度量之间的差异。
超参数优化
自动超参数调整背后的方法针对高成本的函数评估进行了优化,例如使用大数据集训练函数。它改进了最佳性能的流水线,同时收敛到搜索最佳参数时所涉及的非线性问题的良好解决方案。
过去需要几天或几周的事情,只需要几分钟。
为什么 AutoAI 不同于其他 AutoML 库?
- 灵活。结果管道可以部署为 web 服务或导出为 Python 脚本。
- 过度拟合是在训练模型中观察到的最常见问题之一。过度拟合的模型无法在新的看不见的数据上表现良好。AutoAI 采用基于交叉验证的稳健方法来避免过度拟合。
- 易用性。选择要预测的数据和列是用户需要的唯一操作。
- 不断进步。几个团队正在同时改进 AutoAI 工具的性能。敬请关注新的贡献!
你愿意重现视频中的例子吗?
对于如何建立视频示例的一步一步的方向,请按照这个链接。
[1]萨穆洛维兹、特索罗和萨巴瓦尔。“通过增量数据分配选择接近最优的学习者”,人工智能 AAAI 会议,2016 年。http://www . cs . Toronto . edu/~ horst/cog robo/papers/moment-aaai 2016 . pdf
[2] Khurana、Samulowitzb 和 Turaga。"使用强化学习的预测模型的特征工程.",2018 年人工智能 AAAI 大会。https://www . aaai . org/OCS/index . PHP/AAAI/aaai 18/paper/view/16564/16719
3科斯塔和南尼奇尼。" RBFOpt:一个用于黑盒优化的开源库,具有昂贵的函数求值.",数学规划计算,2018。https://link.springer.com/article/10.1007/s12532-018-0144-7
特别感谢 Jean-Fran ois Puget 和 Horst Samulowitz 的宝贵反馈。特别感谢阿历克斯·斯温和迈克尔·塞斯塔克👏对视频的贡献。
Twitter:@ castan LinkedIn:@jorgecasta
用于无标记数据集异常检测的自动编码神经网络
问题—解决方案
在大多数你想用人工智能解决的实际问题中,你可能没有一个带标签的数据集。特别是在预测异常值时,可能你有数百万的历史数据,其中也包括异常值。如果您试图从这样一个未标记的数据集中检测那些异常值/异常,并且担心没有标记的数据集,那么这里有一个有趣的解决方案。
这些天来,每当你遇到不平衡的数据集时,训练一个模型并使其合适应该是一个很大的麻烦。但现在这正是我们所需要的。你所需要的只是一个包含近 1%异常的不平衡数据集。
自动编码器神经网络

The architecture of autoencoder neural network (Source — deep-autoencoders)
与典型的神经网络相反,在典型的神经网络中,您给出许多输入并得到一个或多个输出,自动编码器神经网络在输出层中具有与输入层相同数量的神经元。这基本上意味着数字输入和输出是相同的。不仅是计数,就连它试图预测的输出也与输入相同。是的,autoencoder 神经网络的工作是将数据编码成一个小代码(压缩)并解码回来以再现输入(解压缩)。在上图中,你也可以看到输出向量是输入向量的近似值。这个特殊的属性使我们能够将它用于未标记的数据集。
自动编码器神经网络通常用于从计算机视觉到自然语言处理的降维。要了解更多关于自动编码器神经网络的信息,请阅读这个维基百科页面。
对于一个未标记的数据集,这怎么可能呢?
由于我们试图用该模型再现输入,最适合的损失函数是均方误差(MSE)。在训练模型时,它试图做的是最小化 MSE。为了最小化 MSE,它应该尝试尽可能地适应数据集(即,它应该尝试尽可能地再现许多数据)。在我们的案例中,由于数据集包含 99%的正常数据和仅 1%的异常数据,因此在训练时,模型会遗漏一小部分数据,并拟合其余 99%的数据,因此 MSE 非常非常小。这是背后的核心逻辑,这使得即使对于未标记的数据集,也可以使用它来预测异常。
如何预测异常现象?
在训练模型时,它会学习正常数据的特征外观,并将其压缩为一个小元素,然后将其解码为带有小误差的输入。当通过模型发送异常时,它将无法再现它,因为它被训练为仅再现正常数据,并且将以较大的 MSE 结束。我们需要做的是计算输出与输入相比的 MSE,并通过检查输出来正确区分异常,我们需要根据我们的需要设置 MSE 的阈值,以便它以良好的精度和召回率进行预测。
这还不是全部
大多数时候,通过不断调整超参数并检查输出以得出最佳阈值,很难获得完全令人满意的结果。但是我们有更多的选择。

Two neural networks stacked together to improve both recall and precision
高级召回者
即使我们用成千上万的数据训练它,我们得到的异常也只有几百个。因此,现在人类可以手动检查异常输出,并将其中一些标记为误报。因此,我们可以让我们的自动编码器神经网络模型作为一个高召回器。这意味着保持低阈值,以便几乎所有的实际异常都被检测到(高召回率)以及其他假阳性异常(低精度)。
现在,我们有一个小数据集,可以手动标记为假,其余的保持为真。对于这个人工标注的数据集,我们来介绍一个新的人工神经网络模型。
假阳性减少器
有了现在的数据集,我们可以选择神经网络或基于复杂性,甚至随机森林或任何其他典型的 ML 模型,我们可以简单地训练它。这使得我们能够通过消除最终输出中的假阳性来准确预测我们想要预测的实际异常。
实时预测
我们现在需要做的就是堆叠这些模型,以便在实时预测中,那些被高调用模型(自动编码器神经网络)预测为异常的模型通过假阳性减少模型(人工神经网络)发送。这种神经网络的结合为我们提供了一个具有高召回率和高精确度的深度神经网络模型。
自动编码器神经网络:什么和如何?
关于如何在 Keras 中为初学者建立一个自动编码器网络的清晰、基本的说明
前言
我将通过使用 Keras 和 Python 创建一个自动编码器。首先,我将说明什么是自动编码器,以及我们如何实现它。然后,我将通过步骤实际创建一个。可能会用 MNIST ,因为它很普通也很简单。
简介:什么是自动编码器?
自动编码器接受任何输入,将其分割成某种压缩版本,并使用它来重建输入内容。所以基本上,输入 x 进入隐藏层 h, h = f(x), 出来就是重构r = g(h)。当 r 接近 x、或输出看起来像输入时,自动编码器是好的。
那么,拥有一个精确输出输入内容的神经网络是一件好事吗?在许多情况下,并不是真的,但他们经常被用于其他目的。一个共同的目标是,隐藏层 h 应该有一些限制,以便它提取关于 x 的重要细节,而实际上不需要保留 x 提供的所有信息,从而充当一种有损压缩,并且它应该根据示例自动完成此操作,而不是由人类设计来识别显著特征( Chollet ,2016)。**
为什么是 tho?
通常,当人们编写自动编码器时,希望中间层 h 以某种压缩格式呈现有用的属性。在这里,我们将建立一个叫做的不完全自动编码器,这基本上意味着我们缩小隐藏层,这样它就无法存储输入给我们的相同数量的信息,我们试图从中获得一个良好的重建。构建这样的模型会迫使 autoencoder 找到您提供给它的数据的最显著的特征。在现实生活中,它可以用于降低数据集的维数,这有助于数据可视化,或潜在的去噪数据。
零件清单
这是我们需要创建的东西的基本列表。
- 输入数据——什么被编码和解码?
- 编码功能——需要有一个接收输入并对其进行编码的层。
- 解码功能——需要有一个层来接收编码输入并对其进行解码。
- 损失函数—当解码版本的输出非常接近原始输入数据(损失很小)时,自动编码器为好,当解码版本看起来与原始输入一点也不像时,自动编码器为差。
进场
最简单的自动编码器大概是这样的:x → h → r,其中函数 f(x) 产生 h ,函数 g(h) 产生 r 。我们将使用神经网络,所以我们不需要计算实际的函数。
从逻辑上来说,步骤 1 将是获取一些数据。我们将从 Keras 数据集库中获取 MNIST。它由 60,000 个训练样本和 10,000 个手写数字 0-9 的测试样本组成。接下来,我们将做一些基本的数据准备,以便我们可以将其作为输入集输入到我们的神经网络中, x.
然后在步骤 2 中,我们将建立基本的神经网络模型,从 x. 中给我们隐藏层 h
- 我们将把一个单一的密集的隐藏层与一个 ReLU 激活层放在一起,它将 x 作为输入。
- 接下来,我们将把这一层的输出传递到另一个密集层,并通过一个 sigmoid 激活层运行输出。
一旦我们有了模型,我们将能够在步骤 3 中训练它,然后在步骤 4 中,我们将可视化输出。
我们把它放在一起:
首先,我们不要忘记必要的导入来帮助我们创建我们的神经网络(keras),做标准矩阵数学(numpy),绘制我们的数据(matplotlib)。我们称之为步骤 0 。
*# Importing modules to create our layers and model.
from keras.layers import Input, Dense
from keras.models import Model# Importing standard utils
import numpy as np
import matplotlib.pyplot as plt*
第一步。导入我们的数据,做一些基础的数据准备。因为我们不打算在这里使用标签,我们只关心 x 值。
*from keras.datasets import mnist(train_xs, _), (test_xs, _) = mnist.load_data()*
接下来,我们将在 0 和 1 之间对它们进行归一化。因为它们是灰度图像,值在 0 到 255 之间,我们将输入表示为 float32 并除以 255。这意味着如果值是 255,它将被规范化为 255.0/255.0 或 1.0,以此类推。
*# Note the '.' after the 255, this is correct for the type we're dealing with. It means do not interpret 255 as an integer.
train_xs = train_xs.astype('float32') / 255.
test_xs = test_xs.astype('float32') / 255.*
现在想一想,我们有 28 x 28 的图像,值在 0 和 1 之间,我们想把它们作为输入向量传递到神经网络层。我们做什么呢我们可以使用卷积神经网络,但在这个简单的例子中,我们只使用密集层。那我们怎么把它放进去?我们将把每个图像展平成一个 784 x 1 值的一维向量(28 x 28 = 784)。
*train_xs = train_xs.reshape((len(train_xs), np.prod(train_xs.shape[1:])))test_xs = test_xs.reshape((len(test_xs), np.prod(test_xs.shape[1:])))*
第二步。我们来拼凑一个基本网络。我们将简单地创建一个编码层和一个解码层。我们将把它们放在一起,形成一个名为 autoencoder 的模型。我们还将减小编码的大小,这样我们就可以得到一些数据压缩。为了简单起见,这里我们用 36。
*# Defining the level of compression of the hidden layer. Basically, as the input is passed through the encoding layer, it will come out smaller if you want it to find salient features. If I choose 784 for my encoding dimension, there would be a compression factor of 1, or nothing.
encoding_dim = 36
input_img = Input(shape=(784, ))# This is the size of the output. We want to generate 28 x 28 pictures in the end, so this is the size we're looking for.
output_dim = 784encoded = Dense(encoding_dim, activation='relu')(input_img)
decoded = Dense(output_dim, activation='sigmoid')(encoded)*
现在创建一个模型,接受 input_img 作为解码器层的输入和输出。然后编译模型,在这种情况下用 adadelta 作为优化器,用 binary_crossentropy 作为损失。
*autoencoder = Model(input_img, decoded)autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')*
第三步。我们的模特已经准备好训练了。你不需要图形处理器就能运行这个,不会花很长时间。我们将在我们创建的 autoencoder 模型上调用 fit,为 15 个时期的输入和输出传递 x 值,使用相对较大的批处理大小(256)。这将有助于它训练得更快。我们将启用 shuffle 来防止每个批次中出现同质数据,然后我们将使用测试值作为验证数据。注意:如果你想在不过度拟合的情况下训练更长时间,稀疏和正则化可能会被添加到你的模型中。**
*autoencoder.fit(train_xs, train_xs, epochs=15, batch_size=256, shuffle=True, validation_data=(test_xs, test_xs)*
就是这样。自动编码器完成。你会看到它应该有大约 0.69 的损失,这意味着我们创建的重建通常相当好地代表了来自高度压缩版本的输入。但是我们不能自己去看一下吗?
第四步。为此,我们将进行一些推理,从输入数据中获取我们的重构,然后我们将使用 matplotlib 显示它们。为此,我们想使用预测方法。
思维过程是这样的:获取我们的测试输入,通过 autoencoder.predict 运行它们,然后显示原始数据和重建数据。
*# Run your predictions and store them in a decoded_images list.
decoded_images = autoencoder.predict(test_xs)*

The top row is the inputs, and the bottom row is the reconstruction from our autoencoder model.
下面是你如何得到上面的图像:
*# We'll plot 10 images.
n = 10
plt.figure(figsize=(16, 3))
for i in range(n):
# Show the originals
ax = plt.subplot(2, n, i + 1)
plt.imshow(test_xs[i].reshape(28, 28))
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)# Show the reconstruction
ax = plt.subplot(2, n, i + 1 + n)
plt.imshow(decoded_imgs[i].reshape(28, 28))
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)plt.show()*
就是这样。这是最基本的自动编码器。非常感谢Fran ois Chollet,我从他的文章中学到了这一点,并启发了本教程的基础知识,并感谢 Goodfellow 等人将深度学习作为无价的参考。
如果你喜欢这个教程或者有什么建议,请在下面留言。
编辑:我在这里添加了查看隐藏层的功能,这绝对很有趣。你可以看到,从这些 6 x 6 的图像中,神经网络能够重建原始输入。你开始明白为什么这可能有用了吗?

The top row is the input, the middle row is the hidden encoding, and from that the bottom row is reconstructed.
我们如何得到中间一排?这很简单,我们用第一个隐藏层创建一个模型。为什么?我们这样做是为了运行预测功能,并将其结果添加到 python 中的列表中。
*# Create a Model from the layer.
encoder = Model(input_img, encoded)# Save the results to encoded_imgs. This must be done after the autoencoder model has been trained in order to use the trained weights.
encoded_imgs = encoder.predict(test_xs)*
然后,我们稍微修改一下 matplotlib 指令,以包含新的图像:
*# We'll plot 10 images.
n = 10
plt.figure(figsize=(14, 4))
for i in range(n):
# Show the originals
ax = plt.subplot(3, n, i + 1)
plt.imshow(test_xs[i].reshape(28, 28))
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False) # Show the middle layer
ax = plt.subplot(3, n, i + 1 + n)
plt.imshow(encoded_imgs[i].reshape(6, 6))
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False) # Show the reconstruction
ax = plt.subplot(3, n, i + 1 + n * 2)
plt.imshow(decoded_imgs[i].reshape(28, 28))
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)plt.show()*
暂时就这样吧!我希望这篇教程能帮助你理解一些自动编码器背后的思维过程,以及如何在你的神经网络中使用它们。
降维自动编码器
对表格数据应用自动编码器的一个例子
在特征工程过程中,特别是在一些比赛中,一种常见的情况是,一个人穷尽地尝试所有类型的特征组合,最终得到太多难以选择的特征。为了避免过度拟合,可以选择具有最高重要性的特征子集,或者应用一些降维技术。
我依稀记得有一次 Kaggle 比赛,一等奖的解决方案是在降维中使用 autoencoder。因此,在这篇文章中,让我们来谈谈 autoencoder 以及如何将它应用于一般的表格数据。结构如下:
- 通过一个简单的例子来理解自动编码器的概念
- 对竞赛数据应用自动编码器

自动编码器的一个好例子
这里有一个关于自动编码器的很好的解释。让我们从最基本的例子开始,说明 autoencoder 如何工作,然后将其应用于竞争数据中的一般用例。
最基本的自动编码器遵循以下结构:

请注意,输入和输出具有相同的维数(事实上,输入被用作输出的“标签”),而隐藏层具有较少的维数,因此它包含输入层的压缩信息,这就是为什么它充当原始输入的降维。从隐藏层,神经网络能够解码信息到它的原始维度。从input_layer -> hidden_layer开始叫编码,hidden_layer -> output_layer叫解码。
从某种意义上说,Autoencoder 是一种无监督学习,因为它不需要外部标签。编码和解码过程都发生在数据集内。
自动编码器是从数据示例中自动学习的,这是一个有用的特性:这意味着很容易训练算法的专门实例,这些实例将在特定类型的输入上表现良好。它不需要任何新的工程,只需要适当的训练数据。
让我们通过一个例子来理解 autoencoder 的机制。

我们将使用著名的 MNIST 数据来看看图像是如何被压缩和恢复的。
建立网络
这个例子来自 Keras 博客。
我们的网络非常简单:大小为 784 的输入图像将通过密集层,并被编码为大小为 32 的图像,解码层将从该层恢复到大小为 784 的原始尺寸。结构简单如:

为了得到自动编码器的中间结果,我们还记录了encoded。
准备数据集和培训
数据被标准化为 0 和 1,并传递到我们的自动编码器。注意,输入和输出都是 **x_train** ,我们的想法是希望我们的编码层足够丰富,以恢复尽可能多的信息。
想象结果
将原始图像与从我们的编码层恢复的图像进行比较。

请注意,我们的 32 维隐藏层能够恢复 784 维的图像,并能够很好地捕捉信息。
现在让我们将这种降维技术应用于一个竞争数据集。
表格数据的自动编码器
在帖子这里中,我们应用了一些通用特征工程技术,在数据集上生成了 170 多个特征。让我们试着降低它的维度。
我们在训练和验证中拆分数据,训练数据如下所示,有 171 列:

现在我们使用同样的技术,把维数减少到 40,
encoder将在以后用于降维。
现在让我们对降维后的维度进行预测,
为了进行比较,我们仍然应用 lightgbm 进行预测,结果是 0.595,只有 40 个特征,而之前是 0.57,有 171 个特征。虽然降维模型并没有优于上一个,但我相信我们看到了 autoencoder 的优势。(代码)
结论
这里介绍的自动编码器是最基本的,在此基础上可以扩展到深度自动编码器和去噪自动编码器等。
autoencoder 在竞争中的另一个优势是,人们可以基于训练和测试数据来构建 autoencoder,这意味着编码层也将包含来自测试数据的信息!我在 Kaggle 竞赛中读到的一等奖解决方案的帖子使用了去噪 autoencoder,方法是在原始特征中添加一些噪声,以使他的网络更加健壮,同时,他还将测试数据用于他的模型中,我相信这也是他获胜的原因。
参考:
[1]https://blog.keras.io/building-autoencoders-in-keras.html
自动编码器:深度学习与 TensorFlow 的热切执行

We are so deep. Source: Pixabay.
深度学习在过去几年中彻底改变了机器学习场景。我们能把它应用到图像压缩中吗?深度学习算法重建小猫照片的能力有多强?什么是自动编码器?
今天我们将找到所有这些问题的答案。
图像压缩:所有关于模式
我之前讲过无监督学习:应用机器学习在未标记数据中发现模式。
在图像压缩的情况下,假设大多数图像是而不是完全随机的是很有意义的。
用更恰当的话来说,可以有把握地假设大多数图像并不完全由噪声(就像你打开一台旧电视时的静电噪声)构成,而是遵循一些 底层结构。
如果我们知道所有的图像都有共同点,那就更好了。进行图像压缩的最基本的方法之一是找到重复的像素流,给它们分配一个(较亮的)标签,并用该标签替换它们。
理想情况下,如果两个图像几乎相同,压缩程序可以存储两个图像,占用的空间不会比其中任何一个图像多。这应该也适用于图像的一部分。最后,我猜像无监督学习这样的模式发现机器应该擅长这个。
出于这项工作的目的,我们将使用我从 Kaggle 下载的小猫图片数据集。这将保证大多数图片有一些共同的结构。
这里是 GitHub 项目今天的代码和数据,如果你想跟进的话。然而,像往常一样,我将在这里添加最重要的片段。
但是在我们用代码弄脏我们的手之前,是时候学习一些深度学习了!
自动编码器:无监督式深度学习
尽管我们称自动编码器为“无监督学习”,但它们实际上是一种伪装的监督学习算法。我知道,我也很震惊!
然而,它们有一个非常特殊的属性,这使得它们从普通的分类器中脱颖而出:它们的输入和输出是相同的。
训练自动编码器
当我们训练一个自动编码器时,我们实际上是在训练一个人工神经网络
- 取一个输入向量 X 。
- 应用一些数学知识(我现在不会进入深度学习的细节,但这是我用来学习这些科目的书)。
- 返回另一个向量。在这种特殊情况下,我们希望它还是 X,或者尽可能接近 X。
然而,有一个技巧:在前馈过程(从输入到输出)中,神经网络会降低输入的维度,并在返回最后一层之前再次增加它。
维度的诅咒
自动编码器接受一个向量 X 作为输入,可能有很多分量。例如,对于具有 48×48 分辨率的 3 通道—RGB—图像, X 将具有 6912 个分量。即使它们中的每一个都只是一个浮点数,那也是 27Kb 的数据(非常小!)形象。这增加得很快。对如此多的元素进行所有数学运算所花费的时间也非常相关。
因此,我们必须将这个向量映射到一个更小的空间。在这个特殊的例子中,我试着把它缩小到原来的一半。然而,我们打算保留大部分数据。
自动编码器的体系结构
我们称降低输入向量维度的网络层为编码器,因为它将数据编码成一个更小的向量。
然后,我们对这个更小的向量进行操作,在我们的例子中,它的维数又减少了 2 倍。如果我们正在设计一个实际的图像压缩器,这将是我们将存储的输入版本,节省 75%的空间。然而在训练期间,这只是解码之前的一个中间步骤。
最后,使用减少的向量,自动编码器将不得不尽可能好地重建原始图像。
为了做到这一点,它将首先使其通过一个解码器层,该层再次将减少的向量映射到一个具有输入向量一半尺寸的向量。最后一层,我们得到一个与原始图像尺寸相同的矢量,希望非常相似。
Autoencoder 的层架构如下所示:

Source: Medium
使用自动编码器的结果
训练自动编码器会有很多效果:
- 重建的图像不会与原始图像完全相似。
- 我们将能够保存更轻的简化向量,然后使用重建,只要它足够好(无论我们如何定义),而不是原始图像。
- 我们现在将有一个神经网络,它已经学习了小猫图片中的一些潜在模式。
这最后一个是最有价值的结果。
自动编码器的一些行业应用包括:
- 有监督的深度学习模型的特征工程:我们不会直接向它们提供数据,而是通过自动编码器的隐藏层来提供数据。
- 异常检测:自动编码器在重建狗、风景或虫子的图片方面非常糟糕。这给了我们一种自动检查图片是否是一只小猫的方法。
现在你知道了我们为什么要做我们正在做的事情,让我们用一些实际的代码来实践一下吧!
使用 Tensorflow 训练自动编码器
在本教程中,我们将使用 Tensorflow 的热切执行 API。我不得不说,这比以前的会话要直观得多,以至于我不会介意性能是否有所下降(我没有察觉)。
我们的数据集包含超过 8000 张小猫的图片,大小和颜色各不相同,位置也各不相同。你可以在 GitHub 项目中看到它,以及加载它的代码。
由于 PyPlot 处理 numpy 浮点数组的方式,并且为了加速网络的收敛,图像被加载为范围从 0 到 1 的浮点数组,而不是从 0 到 255。
设计自动编码器
在 Tensorflow 吞下 Keras 变得渴望之前,用它写一个神经网络是相当繁琐的。现在,它的 API 已经变得直观了。
这是我用 Tensorflow 的 Keras API 设计的第一个自动编码器。
然而,这个模型有一些重大缺陷!首先,它收敛得太慢,即使学习率很高(我们会达到这一步)。其次,它返回了一个大小合适的向量…除了一些元素大于 1!这既不符合 PyPlot 的图形,也不符合我们的输入先验——每个像素有三个介于 0 和 1 之间的值。

我通过用 sigmoid 激活函数替换最后一层的 ReLu 来解决这个问题,所以它总是返回 0 到 1 之间的数字。
然而,仍然存在收敛速度的因素。我能做些什么来解决这个问题?幸运的是,我到处看过一些深度学习论文,有一个我用过几次的东西叫做批量规范化。它应该有自己的文章,所以我不会深入研究它。
批量标准化
简而言之,批处理规范化层为当前一批训练实例计算前一层的平均值和标准偏差。然后减去平均值并除以标准偏差,从而归一化图层的输出(对于批处理)。在训练后的前馈中,该层将使用从整个训练数据集估计的参数开始归一化。
这使得模型收敛得更快,因为它对输入或隐藏层的分布变化不太敏感。它还将对投入的自然分布变化更加稳健,在生产环境中更具长期可持续性。
这样,解码器只需要学习如何解码方差为 1 的中心变量,而不是任何随机的东西。同样的事情适用于编码器。仅这个变化就使得模型在前 5 或 6 个时期开始收敛。
训练自动编码器
这是我们期待已久的时刻!是时候训练我们的自动编码器了!
Tensorflow 的急切执行要求我们首先编译模型。这意味着我们要定义一个优化器(我用的是 Adam,它很快),一个损失(在这种情况下是均方差,这是一种非常标准的测量重建误差的方法),以及监控指标。最重要的是,这里是我们选择模型学习率的地方。
最后,我们开始训练模型。
这将开始培训(并使我的笔记本电脑听起来像维多利亚时代的火炉)并打印如下消息:
Epoch 2/2 7373/7373 [==============================] - 59s 8ms/sample - loss: 0.0183 - mean_squared_error: 0.0183 - val_loss: 0.0350 - val_mean_squared_error: 0.0350
如果验证数据集中的 MSE 值 val_mean_squared_error 保持向 0 收敛,我们将知道模型正在学习。如果训练损失持续下降,但验证损失稳定,或者更糟,上升,那么这意味着模型过度拟合。那我们该怎么办?我们能
- 添加更多数据,
- 减小压缩量,或者
- 提高学习率。
这不是我经常遇到的问题。
另一方面,培训损失可能很糟糕。
有多糟糕?如果我们从 0 到 1 之间的随机数中取样,我们得到的值大约是 25%,因为这是 1/2 的平方,也就是平均随机误差。
对于我尝试的大多数配置,这是长时间的训练损失(例如,没有使用批处理规范化,或者当我采样的数据少于一半时)。
如果发生这种情况,我们应该降低学习率(以避免收敛到局部最小值),增加训练数据集的大小,或者降低目标,减少数据压缩。
我第一次尝试压缩到原来重量的九分之一,而不是四分之一,网络不可能知道。
结果呢
最后,这里是一些结果!




这个模型特别适合黑猫或白猫,可能是因为它们有最强烈的对比和最极端的颜色。
当我试图将输入压缩到原始大小的九分之一时,就会发生这种情况:


它基本上只得到正确的轮廓,而且只对黑色或深灰色的猫有效。
结论
我对结果感到惊讶:将图像压缩到其大小的四分之一,猫仍然可以被识别,这意味着分类器可能会告诉照片中有一只猫。
Tensorflow 现在的 API 比旧的舒服直观了很多,很高兴终于可以不用想着 sessions 和 graphs 做深度学习了。
我认为批量规范化被证明在加速训练方面非常有效,这是一个我应该经常使用的工具。
最后,将来我想尝试不同的图像压缩算法。k-意味着基于聚类的,可能是卷积自动编码器。然而,这是另一篇文章的想法。
你呢?你认为你能为这个数据集训练一个更好的自动编码器吗?我应该做得更好的 1000 件事情中的一些是什么,或者我忘记调整的超参数,可以极大地提高模型的性能?请在评论中告诉我,我仍在不断学习。
我希望你觉得这篇文章有趣或有帮助,也许你已经学到了一些东西。
如果你希望了解更多关于深度学习的知识,并成为这方面的专业人士,那么 Goodfellow 和 Bengio 的深度学习书籍绝对不会错。
它的第一章让深度学习最终为我点击,自动编码器上的那一章是纯金的。
关注我上 中dev . to或Twitter获取更多机器学习教程。**
原载于 2019 年 4 月 20 日http://www . data stuff . tech。
股票市场时间序列压缩的自动编码器
用 Pythonic 探索不同的神经网络自动编码器来降低比特币价格时间序列的维度

摘要
股票市场数据空间是高度多维的,因此,试图利用价格形成中的潜在模式或结构的算法可能会遭受所谓的“维数灾难”。在这篇短文中,我们将探讨 4 种不同类型的自动编码器在较低和可追踪维度空间中捕捉股票市场价格动态信息的潜力。为此,我们将使用 Python 编程语言,并且作为示例,我们将把这些算法应用于比特币价格时间序列的压缩。构建神经网络模型的代码(使用 Keras 库)和所用的完整 Jupyter 笔记本可在文章末尾找到。
自动编码器的基础知识
自动编码器是一种输入和输出数据相同的神经网络。因此,它是所谓的无监督学习或自我监督学习的一部分,因为与监督学习不同,它不需要人工干预,如数据标记。正如我们将看到的,自动编码器的架构可能会有所不同,但一般来说,它包括一个编码器和一个解码器,前者将输入转换为低维表示,后者试图从低维表示中重建原始输入。因此,这些模型在中间存在某种“瓶颈”,迫使网络学习如何在低维空间中压缩数据。当训练这些算法时,目标是能够以最小量的信息损失来重建原始输入。一旦模型被训练,我们就可以通过只使用 autoencoder 的编码器组件随意压缩数据。

A representation of a basic autoencoder: an encoder maps the input X to a compressed representation in the bottleneck and a decoder tries to map the compressed representation to X’, which is the original input with a certain amount of information loss.
数据和目标
我们要使用的数据是从 2015 年 1 月 1 日开始到今天的 Coindesk 比特币价格指数的 1 小时烛台收盘价格组成的比特币时间序列。具体来说,我们将使用前 93%的数据作为训练数据集,最后 7%的数据作为测试数据集。比特币价格将被转换为对数回报(即价格 x+1 和价格 x 之间差额的对数),并将产生 10 个连续回报的窗口。这些连续回报窗口中的每一个都将使用一个最小最大缩放器归一化到范围[0,1]。
不同自动编码器模型的目标是能够将 10 维输入压缩到 3 维潜在空间。这构成了一个 3.3 的缩减系数,它应该具有相当好的精度。
对于每个尝试的模型,我们将显示模型的摘要、在训练时期的每个阶段训练和测试数据集的损失,以及最后从测试数据集提取的 10 个随机选择的价格回报窗口的自动编码器的输入和输出(即模型没有看到这些数据点)。所选择的测试窗口将有意地在所有模型中保持相同,以便能够比较每个模型可能正在学习哪种特征。
第一个模型:一个简单的多层 percepetron (MLP)自动编码器
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) (None, 10) 0
_________________________________________________________________
dense_3 (Dense) (None, 3) 33
_________________________________________________________________
dense_4 (Dense) (None, 10) 40
=================================================================
Total params: 73
Trainable params: 73
Non-trainable params: 0


所使用的模型非常简单,但是输入和输出之间的比较揭示了网络提取一些重要特征(例如峰值和低谷)的能力。有趣的是,我们可以看到,尽管输入相当不同,但有些输出彼此几乎完全相同。
第二种模式:深度自动编码器
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) (None, 10) 0
_________________________________________________________________
dense_5 (Dense) (None, 6) 66
_________________________________________________________________
batch_normalization_1 (Batch (None, 6) 24
_________________________________________________________________
dense_6 (Dense) (None, 3) 21
_________________________________________________________________
dense_7 (Dense) (None, 6) 24
_________________________________________________________________
batch_normalization_2 (Batch (None, 6) 24
_________________________________________________________________
dense_8 (Dense) (None, 10) 70
=================================================================
Total params: 229
Trainable params: 205
Non-trainable params: 24


尽管多了几个参数,但在考虑训练/测试损失时,我们似乎达到了类似的精度。然而,输入/输出示例显示了不同类型的图,其中大多数包含一个单独的低峰或高峰,这与之前的结果不同,之前的结果在中间范围内变化更大。
第三种模式:1D 卷积自动编码器
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_4 (InputLayer) (None, 10, 1) 0
_________________________________________________________________
conv1d_1 (Conv1D) (None, 10, 16) 64
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 5, 16) 0
_________________________________________________________________
conv1d_2 (Conv1D) (None, 5, 1) 49
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 3, 1) 0
_________________________________________________________________
conv1d_3 (Conv1D) (None, 3, 1) 4
_________________________________________________________________
up_sampling1d_1 (UpSampling1 (None, 6, 1) 0
_________________________________________________________________
conv1d_4 (Conv1D) (None, 5, 16) 48
_________________________________________________________________
up_sampling1d_2 (UpSampling1 (None, 10, 16) 0
_________________________________________________________________
conv1d_5 (Conv1D) (None, 10, 1) 49
=================================================================
Total params: 214
Trainable params: 214
Non-trainable params: 0


第三个模型变得有点有趣。在这个模型中,我们使用内核大小为 3 的卷积,其思想是这些卷积应该查看出现在 3 个返回组中的模式。结果令我吃惊。在大多数情况下,我们可以看到主要的“事件”被很好地表现出来,而整体重建非常平滑,因为我们对回报应用了移动平均。
第四款:LSTM 自动编码器
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_5 (InputLayer) (None, 10, 1) 0
_________________________________________________________________
lstm_1 (LSTM) (None, 3) 60
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 10, 3) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 10, 1) 20
=================================================================
Total params: 80
Trainable params: 80
Non-trainable params: 0


虽然诸如长短期记忆(LSTM)模型等递归神经网络特别适合处理时间序列,但我们可以看到,它们作为自动编码器的性能非常差。Goodfellow 等人在他们的著作《深度学习》中简明扼要地解释了这一点:
当递归网络被训练来执行需要从过去预测未来的任务时,网络通常学习使用 h(t)[压缩表示]作为一种对过去输入序列直到 t 的任务相关方面的有损汇总。这种汇总通常必然是有损的,因为它将任意长度的序列映射到固定长度的向量 h(t)。
[…]
最苛刻的情况是当我们要求 h(t)足够丰富以允许近似恢复序列时,如在自动编码器框架中。
好处:深度自动编码器+合成数据
自动编码器背后的思想是将原始的高维度降低到较低的维度。在我们的例子中,由于我们正在应用的规范化方案,这个高维空间的值在 0 和 1 之间是连续的。然而,人们可能会认为,如果我们将这个 0 到 1 的范围离散化为 10 个箱,突然之间,我们会将整个 0 到 1 的范围划分为 10 个简单的类别。现在,如果我们的窗口有 10 个返回长度,使用这个“离散化的”连续空间,我们可以很容易地生成 10 的 10 次方个不同的现有组合或“离散化的时间序列”。这个“合成”数据集可以用作训练数据集,几乎事实上丰富了我们的模型,并教会它理解比特币时间序列中欠采样的价格空间部分。多好的主意,不是吗?


或者……是吗?结果是苦乐参半。一些进展有了很大的改善(例如,将第一列与以前的模型进行比较),但其他的进展非常糟糕(例如,第六列)。这让我想到,或许对整个可能性空间进行等概率采样并不是一个最佳的想法。通过对整个空间进行均等采样,我们正在迫使网络学会均等地压缩整个空间,而不管该空间是否实际上与代表比特币或股票价格相关。我们必须记住,像所有的神经网络一样,自动编码器是一个函数逼近器,因此它试图全局逼近我们在训练中使用的所有数据点。这种全局优化本质上意味着,为了更好地逼近某些值,在逼近其他值时必然会损失性能。这表明,为了使这个想法可行,我们应该找到更聪明的方法,只对相关空间进行采样,以便网络只在相关压缩时达到最佳状态。
未来工作
我们已经看到,自动编码器可以用来压缩股票收益的时间序列。如果目标仅仅是压缩数据,那么尝试其他经典的降维算法会很有意思,比如 PCA,它很可能在这个特定的任务中表现得更好。
然而,使用自动编码器的优点是,它的一些组件,如编码器,可以在几个独立的股票市场回报上单独训练,然后在其他端到端神经网络中重用,同时仍然保持通过反向传播进行全局优化的潜力。
我接下来想尝试的一些想法是:
- 使用来自非常不同的股票市场工具(例如,非加密货币或其他加密货币)和不同年份时间跨度的数据训练本文中描述的相同自动编码器,以查看在这里评估的完全相同的任务(比特币数据压缩)下性能是否提高。
- 将经过训练的编码器直接插入专门用于未来价格回报预测或 x+1 上涨/下跌价格预测的其他神经网络,并将其性能与直接接受原始价格回报而不是压缩表示的网络进行比较。
Jupyter 笔记本
像往常一样,这里的朱庇特笔记本重现了我的作品:
这个项目是我们在cryptodatum . io研究的一部分,这是一个加密货币数据 API,旨在提供即插即用的数据集来训练机器学习算法。如果您喜欢我们在本文中展示的数据,您可以在https://cryptodatum . io获得免费的 API 密钥并亲自使用它
自动编码器的直观解释
深度学习
以及如何在 Keras 中实现它们

Photo by Aditya Chinchure on Unsplash
动机
最近的许多深度学习模型依赖于从数据中提取复杂的特征。目标是将输入从其原始格式转换成由神经网络计算的另一种表示。该表示包含描述输入的隐藏唯一特征的要素。
考虑一个人脸数据集,其中每个输入都是一个人的图像。原始格式的图像表示太复杂,机器无法使用。相反,为什么不让神经网络自动计算每张脸的重要特征,比如:眼睛类型、鼻子类型、两眼之间的距离、鼻子位置等。嗯,这听起来很有趣…使用这些功能,我们可以很容易地比较两张脸,找到相似的脸,生成新的脸,以及许多其他有趣的应用。
这个概念被称为编码,因为我们正在生成数据的编码版本。在本文中,我们将了解更多关于编码的内容,如何使用自动编码器计算它们,以及最终如何在 Keras 中实现它们。
自动编码器
一个自动编码器是一个奇怪的神经网络,因为它的输入和输出是相同的。所以,它是一个试图自我学习的网络!我知道这很疯狂,但是你会明白为什么这很有用。
假设我们有以下神经网络:
- 有 100 个神经元的输入层
- 具有 3 个神经元的隐藏层
- 具有 100 个神经元的输出层(与输入层相同)

Image by Author
现在,如果我们让神经网络接受输入,并试图预测输出中的相同值,会发生什么?这不就意味着网络学会了如何只用 3 维(隐藏层中的神经元数量)来表示 100 维输入,然后再次重建相同的输入吗?此外,这些三维或特征似乎足以表示输入值所描述的内容。这很有趣。这就像压缩文件一样。我们减小了文件大小,但我们可以再次解压缩它,并获得相同的数据。事实上,在自动编码器中数据并不完全相同,因为它们是有损耗的,但是你明白了。
目标
我们将使用著名的 MNIST 数字数据集来演示这个想法。目标是从给定的 28*28 图像生成 2D 编码。因此,我们正在使用自动编码器实现一个降维算法!酷吧?让我们开始…
编码时间
首先,我们导入数据集:
from keras.datasets import mnist
(data, labels), (_, _) = mnist.load_data()
需要重塑和调整:
data = data.reshape(-1, 28*28) / 255.
是时候定义网络了。我们需要三层:
- 大小为 28*28 的输入层
- 大小为 2 的隐藏层
- 大小为 28*28 的输出图层

Image by Author
from keras import models, layers
input_layer = layers.Input(shape=(28*28,))
encoding_layer = layers.Dense(2)(input_layer)
decoding_layer = layers.Dense(28*28) (encoding_layer)
autoencoder = models.Model(input_layer, decoding_layer)
让我们编译和训练…我们将使用像素值之间的二元交叉熵损失来拟合模型:
autoencoder.compile('adam', loss='binary_crossentropy')
autoencoder.fit(x = data, y = data, epochs=5)
你注意到这个窍门了吗? X =数据和 y =数据也是如此。
在拟合模型之后,网络应该学习如何计算隐藏编码。但我们还是要提取出对此负责的那一层。在下文中,我们定义了一个新模型,其中我们删除了最后一层,因为我们不再需要它:
encoder = models.Model(input_layer, encoding_layer)
现在,我们不再预测最终输出,而是只预测隐藏的表示。看看我们如何使用它:
encodings = encoder.predict(data)
就是这样!现在你的编码变量是一个(n,m)数组,其中 n 是例子的数量,m 是维数。第一列是第一个特征,第二列是第二个特征。但是那些特征是什么呢?事实上,我们不知道。我们只知道它们是每个输入值的良好代表。
让我们把它们画出来,看看我们会得到什么。
import matplotlib.pyplot as plt
plt.scatter(encodings[:, 0], encodings[:, 1], c=labels)
plt.colorbar()

Image by Author
漂亮!看看神经网络是如何学习隐藏特征的。显然,它学会了每个数字的不同特征,以及它们在 2D 空间中的分布。现在,我们可以将这些功能用于可视化、聚类或任何其他目的…
最终想法
在这篇文章中,我们学习了自动编码器以及如何应用它们进行降维。自动编码器非常强大,并在许多现代神经网络架构中使用。在以后的文章中,您将了解更复杂的编码器/解码器网络。
如果你喜欢这篇文章,请点击“鼓掌”按钮,我将不胜感激👏所以可能会传染给他人。也可以在 推特 , 脸书 , 上关注我直接发邮件给我 或者在LinkedIn上找我。
自动编码器与 PCA:何时使用?

降维需求
在机器学习项目中,我们经常遇到维数灾难问题,其中数据记录的数量不是特征数量的重要因素。这通常会导致问题,因为这意味着使用稀缺的数据集训练大量的参数,这很容易导致过度拟合和泛化能力差。高维数也意味着非常大的训练时间。因此,降维技术通常被用来解决这些问题。尽管特征空间存在于高维空间中,但它通常具有低维结构。
两种非常常见的降低特征空间维数的方法是 PCA 和自动编码器。我将只提供对这些的简要介绍,更多理论性的比较请看这篇的帖子。
PCA
PCA 本质上学习将数据投影到另一个空间的线性变换,其中投影的向量由数据的方差定义。通过将维度限制到占数据集方差大部分的特定数量的组件,我们可以实现维度减少。
自动编码器
自动编码器是神经网络,可用于通过堆叠多个非线性变换(层)将数据减少到低维潜在空间。他们有一个编码器-解码器架构。编码器将输入映射到潜在空间,解码器重构输入。使用反向传播对它们进行训练,以精确重建输入。在潜在空间具有比输入更低的维数时,自动编码器可以用于维数减少。凭直觉,这些低维潜变量应该编码输入的最重要的特征,因为它们能够重构输入。
对比
- PCA 本质上是线性变换,但是自动编码器能够模拟复杂的非线性函数。
- PCA 特征彼此完全线性不相关,因为特征是到正交基的投影。但是自动编码的特征可能具有相关性,因为它们只是为了精确重建而被训练的。
- PCA 比自动编码器速度更快,计算成本更低。
- 具有线性激活功能的单层自动编码器非常类似于 PCA。
- 由于参数数量太多,自动编码器容易过拟合。(尽管规范化和精心设计可以避免这种情况)
什么时候用哪个?
除了对计算资源的考虑,技术的选择取决于特征空间本身的性质。如果这些特征彼此之间具有非线性关系,那么 autoencoder 将能够更好地将信息压缩到低维潜在空间中,利用其模拟复杂非线性函数的能力。特征具有非线性关系意味着什么?让我们做几个简单的实验来回答这些问题,并阐明这两种技术的相对有用性。
实验 2D
这里,我们构建二维特征空间(x 和 y 是两个特征),它们之间具有线性和非线性关系(具有一些附加噪声)。我们将比较自动编码器和 PCA 在将输入投影到潜在空间后准确重建输入的能力。PCA 是具有明确定义的逆变换的线性变换,并且来自 autoencoder 的解码器输出给我们重构的输入。我们对 PCA 和自动编码器都使用一维潜在空间。

显然,如果在特征空间中存在非线性关系(或曲率),自动编码的潜在空间可以用于更精确的重建。其中由于 PCA 仅保留到第一主分量上的投影,任何垂直于它的信息都丢失了。让我们看看下表中由均方误差(MSE)测量的重建成本。

实验 3D
进行类似的 3D 实验。我们创建两个三维特征空间。一个是存在于 3D 空间中的 2D 平面,另一个是 3D 空间中的曲面。

我们可以看到,在平面的情况下,数据具有清晰的二维结构,具有两个分量的 PCA 可以解释数据的 100%的方差,因此可以实现完美的重建。在曲面的情况下,二维 PCA 不能解释所有的变化,因此丢失了信息。覆盖大部分方差的到平面的投影被保留,而其他信息丢失,因此重建不是那么精确。另一方面,autoencoder 能够使用二维潜在空间精确地重建平面和曲面。因此,在自动编码器的情况下,2D 潜在空间能够编码更多的信息,因为它能够非线性建模。下表提供了重建成本。

随机数据实验
这里我们创建一个没有任何共线性的随机数据。所有特征都是从均匀分布中独立采样的,彼此之间没有关系。我们对 PCA 和自动编码器都使用二维潜在空间。

我们看到,PCA 能够以最大的方差保留在平面上的投影,并且丢失了许多信息,因为随机数据不具有基本的 2 维结构。Autoencoder 也表现不佳,因为功能之间没有潜在的关系。
结论
为了使降维有效,在特征空间中需要有底层的低维结构。即这些特征应该彼此具有某种关系。
如果在低亮度结构中存在非线性或曲率,则自动编码器可以使用更少的维度来编码更多的信息。因此,在这些情况下,它们是更好的降维技术。
实验的所有代码都可以在这里找到:
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/muaz-urwa/PCA-vs-AutoEncoders)
自动增长:深度学习自动
用 3 行 Python 代码实现最先进的结果
作者:*、乔纳斯·穆勒、* 杭张 、巴拉吉·卡马科蒂
感谢亚伦·马卡姆、李牧、马蒂亚斯·西格、塔利亚·乔普拉和盛扎的早期反馈和编辑。
引入自动旋转
autoglon是一个新的开源 AutoML 库,它为涉及图像、文本和表格数据集的真实世界应用程序自动化深度学习(DL)和机器学习(ML)。无论您是 ML 新手还是经验丰富的从业者,AutoGluon 都会简化您的工作流程。有了 AutoGluon,您只需使用几行 Python 代码就可以开发和改进最先进的 DL 模型。在这篇文章中,我们解释了自动增长的好处,演示了如何在 Linux 上安装它,并开始使用自动增长在几分钟内以最先进的性能解决现实世界的问题。

动机和主要特征
从历史上看,实现最先进的 ML 性能需要广泛的背景知识、经验和人力。数据准备、特征工程、验证分割、缺失值处理和模型选择只是 ML 应用中必须解决的许多任务中的一部分。一个特别困难的任务是超参数的选择。
*超参数表示用户在构建模型时必须做出的许多选择,例如数据处理步骤、神经网络体系结构和训练期间使用的优化器。每个超参数都以不透明的方式影响最终模型的预测性能,而更强大的模型(如深度神经网络)需要调整的超参数越来越多。轻微的超参数修改可能会显著改变模型质量。由于通常不清楚如何做出这些决定,开发人员通常手动调整他们的 ML 管道的各个方面,以便在实践中实现强大的预测性能,这可能需要许多迭代和艰苦的人力努力。AutoGluon 自动执行前面提到的所有任务,创造一种真正脱离方向盘的体验。您不必花费宝贵的时间来管理这些实验或首先学习如何做这些实验,您可以简单地指定您希望何时准备好训练好的模型,AutoGluon 将利用可用的计算资源在其分配的运行时间内找到最强的 ML 方法。
autoglon 使您能够在图像分类、对象检测、文本分类和使用表格数据集的监督学习等任务上自动实现一流的性能。每个任务的超参数是使用高级调整算法自动选择的,如贝叶斯优化、超带和强化学习。有了 AutoGluon,您不需要对底层模型有任何了解,因为所有的超参数都将在默认范围内自动调整,这些范围对于特定的任务和模型来说是已知的。
对于专业的 ML 从业者来说,自动生成允许这个过程被容易地定制。例如,您可以为某些超参数指定要考虑的值范围,还可以使用自动优化来自动调整您自己的定制模型的各个方面。如果您可以访问多台机器,AutoGluon 可以轻松地在它们之间分配计算,以便更快地返回训练好的模型。*
通过实例自动增长
装置
*在训练模型之前,你必须安装自动旋翼。Linux 支持自动登录,MacOS 和 Windows 支持即将推出。可以通过遵循此处的安装说明[来安装自动旋翼。
本演示使用了一台带 GPU 的 Linux 机器。要安装支持 GPU 的 Linux 版 AutoGluon,请在“终端”中运行以下命令,或者参考安装 wiki 中的仅 CPU 安装:](https://auto.gluon.ai/stable/index.html#installation)*
*# CUDA 10.0 and a GPU for object detection is recommended
# We install MXNet to utilize deep learning models
pip install --upgrade mxnet-cu100
pip install autogluon*
对象检测示例
我们以目标检测任务为例,展示了 AutoGluon 的简单接口。在目标检测中,不仅要识别图像中的目标,还要用包围盒来定位它们。
我们将使用自动旋翼在一个为演示目的而创建的小玩具数据集上训练一个物体检测器(以确保快速运行)。该数据集是使用 VOC 数据集 [1]的摩托车类别生成的。在下面的 Python 代码中,我们首先导入 AutoGluon,将对象检测指定为感兴趣的任务(ObjectDetection as task),将数据下载到我们的机器上,最后将其加载到 Python 中:
*import autogluon as ag
from autogluon import ObjectDetection as taskurl = '[https://autogluon.s3.amazonaws.com/datasets/tiny_motorbike.zip](https://autogluon.s3.amazonaws.com/datasets/tiny_motorbike.zip)'
data_dir = ag.unzip([ag.download](http://ag.download/)(url))
dataset = task.Dataset(data_dir, classes=('motorbike',))*
接下来,我们可以通过简单地调用fit()函数来使用自动旋转训练检测器模型:
*detector = task.fit(dataset)*
在这个对fit()的单次调用中,AutoGluon 在不同的网络配置和优化超参数下训练了许多模型,选择其中最好的作为最终返回的检测器。在没有任何用户输入的情况下,对fit()的调用也自动利用了最先进的深度学习技术,如预训练的 YOLOv3 网络的迁移学习。我们可以使用predict()方法在新图像上测试训练过的检测器:
*url = '[https://autogluon.s3.amazonaws.com/images/object_detection_example.png](https://autogluon.s3-us-west-2.amazonaws.com/images/object_detection_example.png)'
filename = ag.download(url)
index, probabilities, locations = detector.predict(filename)*

AutoGluon 的预测功能会自动加载测试图像,并输出每个检测到的对象的预测对象类别、类别概率和边界框位置。如上所示,可视化图像被自动生成。我们可以看到,尽管只在非常小的数据集上训练我们的检测器,但摩托车还是以合理的精度被检测和定位。有关使用自动旋转进行物体检测的完整教程,请访问自动旋转网站。
表格数据示例
最常见的数据形式是表格数据集。这些由通常在逗号分隔文件(CSV)或数据库中找到的结构化数据组成。在表格数据集中,每列代表某个变量的测量值(又名特性*),行代表单个数据点。自动增长可用于训练模型,这些模型根据同一行中的其他列来预测特定列的值,并且能够推广到以前看不到的示例。
我们将要训练的数据集是成人收入分类数据集【2】。该数据集包含约 48,000 人的信息,包括年龄等数字特征和职业等分类特征。数据集通常用于预测个人收入。在本例中,我们将预测个人年收入是否超过 50,000 美元。我们将使用 80%的数据来训练自旋转,20%的数据来测试产生的自旋转预测器。使用自动引导,不需要指定验证数据。AutoGluon 将使用提供的训练数据以最佳方式分配验证集。
作为一个例子,我们提供了 Python 代码,该代码首先导入自动登录并指定一个task,在这里我们将使用TabularPrediction处理表格数据。然后,我们从位于 S3 的 CSV 文件中加载Dataset。只需对fit()进行一次调用,AutoGluon 就会处理数据,并训练一个称为“预测器”的多样化 ML 模型集合,该模型能够预测该数据中的“类别”变量。它将使用其他列作为预测特征,如个人的年龄、职业和教育。这个模型集合包括在 ML 竞争社区中因其质量、鲁棒性和速度而闻名的经过验证和测试的算法,如 LightGBM 、 CatBoost ,以及持续优于更传统的 ML 模型(如逻辑回归)的深度神经网络。
注意,我们不需要做任何数据处理、特征工程,甚至不需要声明预测问题的类型。AutoGluon 自动准备数据,推断我们的问题是回归还是分类(包括是二元还是多类)。经过训练的预测器模型将保存到 task.fit()调用中指定的位置。*
*from autogluon import TabularPrediction as task
train_path = 'https://autogluon.s3.amazonaws.com/datasets/AdultIncomeBinaryClassification/train_data.csv'
train_data = task.Dataset(file_path=train_path)
predictor = task.fit(train_data=train_data, label='class', output_directory='ag-example-out/')*
现在我们的预测模型已经训练好了,我们将对以前看不到的测试数据进行预测。我们既可以直接使用返回的预测值,也可以从我们指定的输出目录中加载它。
*predictor = task.load('ag-example-out/')
test_path = 'https://autogluon.s3.amazonaws.com/datasets/AdultIncomeBinaryClassification/test_data.csv'
test_data = task.Dataset(file_path=test_path)
y_test = test_data['class']
test_data_nolabel = test_data.drop(labels=['class'],axis=1)
y_pred = predictor.predict(test_data_nolabel)
y_pred_proba = predictor.predict_proba(test_data_nolabel)
print(list(y_pred[:5]))
print(list(y_pred_proba[:5]))*
*[' <=50K’, ‘ <=50K’, ‘ > 50K ','<=50K’, ‘ <=50K’]
[0.077471,0.0093894,0.973065,0.0021249,0.001387]
现在我们来看看车型排行榜:*
*leaderboard = predictor.leaderboard(test_data)*

AutoGluon’s model leaderboard
*该排行榜显示了由 AutoGluon 训练的每个模型,它们在测试和验证数据上的分数,以及以秒为单位的训练时间。可以看出,weighted_ensemble在验证和测试集上表现最好,达到了 87.76%的准确率,对于这个问题来说是一个非常强的结果 3。
有关使用自动增长对表格数据进行监督学习的完整教程,请参见自动增长表格预测教程。*
了解更多并做出贡献
在这篇文章中,我们介绍了 AutoGluon,这是我们为给 ML 专家和新人提供最好的 ML 和深度学习体验而做出的微薄努力。该库不仅易于使用,而且能够在各种应用中实现优于其他 ML 方法的高质量模型。虽然这篇文章关注的是使用表格数据进行对象检测和预测,但自动生成也可以轻松应用于其他任务,包括文本和图像分类。AutoGluon 甚至可以用于细化涉及定制模型的任意 ML 任务(在 MXNet 和 PyTorch 中)。我们欢迎社区参与我们的旅程。前往autoglon GitHub 库开始,并查看autoglon 网站上的教程,在您的应用中快速尝试复杂的 AutoML 解决方案。我们渴望听到您的结果和反馈!
引文
[1] Everingham,Mark 等人,“pascal 视觉对象类挑战:回顾”国际计算机视觉杂志111.1(2015):98–136。
[2]杜瓦和格拉夫(2019)。UCI 机器学习知识库[http://archive . ics . UCI . edu/ml]。加州欧文:加州大学信息与计算机科学学院。
3华金·范肖伦、扬·范里恩、贝恩德·比什尔和路易斯·托戈。OpenML:机器学习中的网络科学。SIGKDD 探索 15(2),第 49–60 页,2013 年。
资源
autoglon 网站
autoglon Github 资源库
潜入深度学习
MXNet 胶子
通过无监督学习自动清理数据
为您的 NLP 项目清理文本从未如此有趣和容易!

Photo by Karim MANJRA on Unsplash
我喜欢处理文本数据。至于计算机视觉,现在 NLP 中有很多现成的资源和开源项目,我们可以直接下载或使用。其中一些很酷,允许我们加快速度,把我们的项目带到另一个水平。
最重要的是,我们不能忘记,所有这些工具都不是魔法。他们中的一些人宣称有很高的表现,但如果我们不允许他们做到最好,他们就什么都不是。这是一个严酷的事实,尤其是在 NLP 领域,我们经常面临数据中很难去除的高水平噪声(比处理图像更困难)。
在这篇文章中,我提出了我的解决方案来提高我所掌握的文本数据的质量。我开发了一个工作流程,旨在以无人监管的方式自动清理数据。我说‘自动’是因为如果我们不得不一直手动检查数据以理解模型输出的内容,那么遵循无监督的方法是没有用的。我们需要确定性,不想浪费时间。
数据集
在这里,我的目标是“清洗”研究论文。在这种情况下,清理意味着保留文本的相关部分,丢弃不包含有价值信息的部分。在机器学习论文的子集中,我认为文本句子是相关的部分,而包含大多数代数和符号的部分是无用的。直接访问这些片段可以简化诸如主题建模、摘要、聚类等任务。
我在 Kaggle 上找到了 NIPS 2015 论文’数据集。我直接下载 Paper.csv. 这个数据集包含了 NIPS 2015 ( 神经信息处理系统)的 403 篇论文;世界顶级机器学习会议之一,主题涵盖从深度学习和计算机视觉到认知科学和强化学习)。

Topic Modelling on NIPS papers by Kaggle
工作流程
- 选择一篇论文,应用基本的预处理将它分成句子/段落
- 创建句子的加权嵌入
- 嵌入空间中句子的无监督模型化
- 噪声文本的检测和表示
这种能力是通过使用预训练的单词嵌入模型及其相对较深的词汇表来提供的。
预处理
我计算了一个标准的预处理,从感兴趣的单个文件中删除数字,而不是字母数字字符和停用词。这里的要点是通过句子/段落的创建来提供的。有一些软件包提供这种功能;我试过了,但是他们并没有说服我。因此,当我处理来自整个文档的文本语料库时,我自己编写了更好地满足我需要的简单函数。
from nltk.corpus import stopwords
from gensim.parsing.preprocessing import *stop_words = set(stopwords.words('english'))def create_sentence(text):
output = []
for s in re.split('\.\n|\.\r\n|\. ', text):
output.extend(re.split('\n\n|\r\n\r\n', s))
return outputdef clean_sentence(sentence):
sentence = strip_numeric(strip_non_alphanum(sentence))
sentence = sentence.lower().split()
return [w for w in sentence if w not in stop_words]
句子嵌入
一个好的句子的数字表示是整个程序成功的基础。我们希望有意义的句子在嵌入空间中彼此相似且更近,同时我们希望有噪声的句子远离有意义的句子,并且它们之间也相似。为了实现这一关键步骤,我们使用了强大的预训练单词嵌入,我选择了 GloVe。
我们创建句子嵌入作为单个单词嵌入的加权平均值。通过计算由句子组成的论文语料库上的 TfIdf 来给出权重。在组合期间,对于特定句子中的每个单词,我们选择相对手套嵌入(如果存在)并将其乘以 TfIdf 单词权重。每个句子中加权单词嵌入的总和被归一化,除以句子中 TfIdf 单词权重的总和。
emb_dim = 300
model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)tfidf = TfidfVectorizer()
tfidf.fit(list(map(' '.join, cleaned_corpus)))
为了让这个过程变得简单和轻松,我选择了 Gensim 来加载和操作手套。Gensim 需要。手套的 bin 格式(此处有和其他文件格式);随意使用你喜欢的阅读方法。
def calculate_emb(clean_text, original_text):
tfidf_feat = tfidf.get_feature_names()
tfidf_emb = tfidf.transform(list(map(' '.join, clean_text)))
final_sent_emb = []
final_sent = []
for row, sent in enumerate(tqdm(clean_text)):
sent_vec = np.zeros(emb_dim)
weight_sum = 0
for word in sent:
try:
vec = model[word]
tfidf_score = tfidf_emb[row, tfidf_feat.index(word)]
sent_vec += (vec * tfidf_score)
weight_sum += tfidf_score
except:
passif sum(sent_vec)!=0:
sent_vec /= weight_sum
final_sent.append(original_text[row])
final_sent_emb.append(sent_vec)
final_sent_emb = np.asarray(final_sent_emb)
final_sent = np.asarray(final_sent)
return final_sent_emb, final_sent
用这种方法计算句子嵌入,我们已经自由地得出了第一个重要的结果。手套词汇中不存在的单词(3000000 个唯一单词)不被考虑在内(如果不在手套中它就不存在),即它们是非常不常见的术语,我们可以将它们视为噪音。现在想象一个全是不常见符号的句子,它以全零的嵌入结束,我们可以立即排除它。
无监督模型化和表示
如上所述,为语料库中的每个句子计算句子嵌入的创建。我们以一个维数为(N,300)的数组结束,其中 N 是句子的数量,300 是手套嵌入维数。为了便于管理,我们用主成分分析法对它们进行降维,并在降维后的空间上应用无监督异常检测算法。我们的异常点显然位于远离密度中心的地方。

2D representation of sentence embeddings
这些异常点(句子)的检测对于隔离林来说是一项完美的任务。这个集合模型在子群中操作空间的划分:将一个样本从其他样本中分离出来所需的分裂次数越少,这个观察结果成为异常的概率就越高。
pca = PCA(n_components=2)
X = pca.fit_transform(final_sent_emb)IF = IsolationForest(contamination=0.3, behaviour='new')
IF.fit(X)plt.figure(figsize=(8,6))
plt.scatter(X.T[0], X.T[1], c=IF.predict(X), cmap='viridis')

Isolation Forest at work on sentence embeddings
我们的工作已经完成,我们只需要检查结果!黄色部分是有价值的句子和嘈杂的文字部分。为了达到这个结果,我们只需要设置“污染参数”,它告诉我们丢弃信息的严重程度。下面我附上了我刚刚分析的论文中的一个例子。第一个片段显示了有价值的句子,其中包含有用的信息。

Good sentences
第二个片段是一个句子的集合,其中可能包含很多噪音。

Bad sentences
摘要
在这篇文章中,我开发了一个自动清理文本数据的解决方案。给定一个文本语料库,我们能够选择最有价值的句子,扔掉嘈杂的文本部分。这种解决方案的目标是计算成本不高;我们使用了预先训练的单词嵌入,并拟合了一个简单的异常句子检测算法。整个工作流程可以扩展到文本语料库的收集,始终遵循无监督的方法。
保持联系: Linkedin
为您的模型自动调整超参数

Photo by Marcin Nowak on Unsplash
因为你的时间比机器更重要
当我们创建我们的机器学习模型时,我们面临的一个常见任务是如何调整它们。
人们最终采取不同的手动方法。有些有效,有些无效,大量时间花在预测和一遍又一遍地运行代码上。
这就给我们带来了一个本质问题:我们能自动化这个过程吗?
不久前,我正在参加 Coursera 课程的 【如何赢得数据科学竞赛】 的一次课堂竞赛。学到了很多新东西,其中之一就是 Hyperopt——一个贝叶斯参数调整框架。
我很惊讶。晚上我把我的 Mac 和远视留在一起了。早上我拿到了结果。这太棒了,我确实避免了很多尝试。
这个帖子是关于自动化超参数调优的,因为我们的时间比机器更重要。
那么,什么是远视呢?

从 Hyperopt 网站:
Hyperopt 是一个 Python 库,用于对笨拙的搜索空间进行串行和并行优化,搜索空间可能包括实值、离散和条件维度
简单来说,这意味着我们得到了一个可以最小化/最大化任何函数的优化器。 例如,我们可以用这个来最小化日志损失或最大化准确性。
我们都知道网格搜索或随机网格搜索是如何工作的。
网格搜索逐个遍历参数,而随机搜索随机遍历参数。
因此,Hyperopt 旨在以一种明智的方式搜索参数空间。
细节我就不多说了。但是如果你想知道更多关于它是如何工作的,看看 J Bergstra 的这篇 论文 。下面是来自 Github 的 文档 。
我们的数据集
为了解释 hyperopt 是如何工作的,我将处理来自 UCI 的心脏数据集,因为它是一个简单的数据集。除了产生利润之外,为什么不利用数据科学做些好事呢?
给定一些变量,该数据集预测心脏病的存在。
这是数据集的快照:

目标分布如下所示:

远视循序渐进

因此,在尝试运行 hyperopt 时,我们需要创建两个 Python 对象:
- 一个目标函数: 目标函数以超参数空间为输入,返回损失。这里我们称我们的目标函数为
objective - 一个超参数的字典: 我们将通过使用变量
space来定义一个超参数空间,这个变量实际上只是一个字典。我们可以为不同的超参数值选择不同的分布。
最后,我们将使用 hyperopt 包中的fmin功能,通过space最小化我们的objective。
你可以跟随这个 Kaggle 内核中的代码。
1.创建目标函数
这里,我们创建一个目标函数,它将一个超参数空间作为输入:
- 我们首先定义一个分类器,在本例中是 XGBoost。试着看看我们如何从空间获取参数。例如
space[‘max_depth’] - 我们使分类器适合训练数据,然后在交叉验证集上进行预测。
- 我们计算想要最大化或最小化的所需指标。
- 因为我们只在 hyperopt 中最小化使用
fmin,如果我们想最小化logloss,我们只发送我们的度量。如果我们想最大限度地提高精度,我们将尽量减少-accuracy
2.为您的分类器创建空间

现在,我们 为分类器创建超参数 的搜索空间。
为此,我们最终使用了许多定义各种分布的 hyperopt 内置函数。
正如您在下面的代码中看到的,我们对subsample超参数使用 0.7 到 1 之间的均匀分布。我们还给出了子样本参数x_subsample的标签。您需要为您定义的每个超参数提供不同的标签。我通常在我的参数名前添加一个x_来创建这个标签。
你也可以定义很多其他的发行版。hyperopt 优化算法目前认可的一些最有用的随机表达式是:
hp.choice(label, options)—返回选项之一,应为列表或元组。hp.randint(label, upper)—返回范围[0,上限]内的随机整数。hp.uniform(label, low, high)—统一返回一个介于low和high之间的值。hp.quniform(label, low, high, q)—返回一个类似 round(uniform(low,high) / q) * q 的值hp.normal(label, mu, sigma)—返回一个正态分布的实数值,其平均值为μ,标准差为σ。
还有很多其他发行版。你可以点击查看。
3.最后,运行 Hyperopt

一旦我们运行这个,我们就能得到模型的最佳参数。事实证明,我们在这个问题上做到了 90%的准确率。

现在我们可以用这些最佳参数重新训练我们的 XGboost 算法,我们完成了。
结论
运行上面的程序给我们的学习算法提供了很好的超参数。这让我节省了很多时间去思考各种其他的假设并测试它们。
我倾向于在调优我的模型时大量使用这个。 根据我的经验,整个过程中最关键的部分是建立超参数空间,这需要经验和对模型的了解。
所以,Hyperopt 是一个非常棒的工具,但是千万不要忘记理解你的模型是做什么的。从长远来看,这是很有帮助的。
你可以在这个 Kaggle 内核中获得完整的代码。
继续学习
如果你想了解更多关于实用数据科学的知识,请看看 Coursera 的 “如何赢得数据科学竞赛” 课程。从这个课程中学到了很多新的东西,这个课程是由最多产的卡格勒教授的。
还有另一个叫做 Optuna 的框架,你可以用它来代替 Hyperopt。在这里阅读。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。
此外,一个小的免责声明-在这篇文章中可能会有一些相关资源的链接,因为分享知识从来都不是一个坏主意。
使用 Prisma Media Plan 和 Python 为媒体机构实现网站服务报告自动化

Photo by Franck V. on Unsplash
为了拥有有效的媒体,媒体计划必须利用多种分销渠道(即数字显示、电视、 OOH )。有研究表明,开展跨渠道营销活动可以显著提升业绩。这些营销计划的一个关键组成部分是使用出版商自己跟踪广告,而不是通过广告服务器。在行业中,由发布者手动跟踪的广告被标记为“站点服务”。在这些情况下,代理商依赖于出版商提供与这些广告相关的相关数据(印象、点击等)。
从我的经验来看,从出版商收集这些数据的过程通常遵循这些特定的步骤:为特定的出版商制定网站服务布局的子集媒体计划,创建具有所有所需指标(印象、视频观看等)的 excel 报告模板,将 excel 模板发送给出版商填写,出版商发回数据。传统上,这是一个高度手工的过程,通常由媒体购买者自己进行。本文的范围集中在将模板发送给出版商之前的所有步骤的自动化上。我们将使用 python 作为我们的首选语言。这是自动化站点服务报告系列的第 1 部分,共 2 部分。第 2 部分将介绍如何在电子邮件中发送模板。
我们从导入这个项目所需的包开始。由于大多数 excel 电子表格的表格性质,在我们的例子中是媒体计划,Pandas 包的 DataFrame 将是在 python 环境中操作数据的绝佳选择。xlsxwriter 是一个包,它允许我们将数据帧写入 excel 工作表。虽然我们可以通过简单的 Pandas 来实现,但是 xlsxwriter 允许更深入的 excel 操作。
import pandas as pd
import xlsxwriter
我还假设你的媒体计划有某种级别的清理数据(放置级别的粒度,如果需要,请阅读这篇文章作为参考)。
#Read in Prisma Media Plan file
mp = pd.read_excel(‘Media Plan File’)"""Create day level of granularity"""#Create date range of placements
mp[‘Date Range’] = (pd.to_datetime(mp[‘End Date’]) — pd.to_datetime(mp[‘Start Date’])).dt.days#Use Date Range to repeat placement
mp = mp.reindex(mp.index.repeat(mp[‘Date Range’]))#Filter out placements that are site served
mp = mp['Placement Name'].str.contains('_SiteServed_')
在对媒体计划进行一些简单的操作后,我们需要按出版商对媒体计划进行分组,因为每个出版商只负责他们的广告投放。在那里,我们使用列表理解来划分出版者和他们各自的内容。
SiteGroup = mp.groupby(‘Site’)vendorList= [contents for vendor, contents in SiteGroup]
计算机编程最好的方面之一是能够有效地循环函数,利用计算机的能力来做它们最擅长的事情:计算。因此,在本例中,我们将遍历 vendorList 列表,以便为每个供应商创建模板。
for vendor in vendorList:
#Creating the export excelName; setting by the first Campaign name and Supplier value
请注意,以下所有代码都将嵌套在前一个循环中。在这一步中,我们将从我们的 vendorList 列表中获取活动和出版商的名称,用于命名我们的 excel 模板文件。
campaignName = vendor[‘Campaign Name’].iloc[0]
supplierName = vendor[‘Site’].iloc[0]
string = (‘{0}_{1}’+’.xlsx’).format(campaignName, supplierName)
现在我们开始实际创建 excel 模板。我们首先调用一个带有熊猫数据帧的实例,用 xlsxwriter 作为引擎。然后,我们从 vendorList 列表中取出我们的供应商变量,并将该数据插入到我们的 writer 实例中,从而用数据填充 excel 表格。之后,我们创建一个工作簿和工作表实例来与 excel 工作表交互。我们将 excel 表格命名为“站点”。
writer = pd.ExcelWriter(string, engine=’xlsxwriter’)
vendor.to_excel(writer, sheet_name=’SITE’,index=False)
workbook = writer.book
worksheet = writer.sheets[‘SITE’]
与发布者处理网站服务报告的一个关键问题是,他们有时会修改我们提供的模板,以包含其他可能有帮助的指标。然而,如果由于某种原因这造成了障碍,我们可以应用一个宏来防止对我们的 excel 模板的任何修改。这是通过我们附加到工作表实例上的 protect 属性实现的。但是因为我们确实需要发布者在 excel 模板中输入数据,所以我们创建了一个允许解锁某些列的格式,从而允许输入数据。
worksheet.protect()
unlocked = workbook.add_format({‘locked’: 0})
在我们修改的下一段代码中,将出现在模板中的列。我们创建了文本换行格式,以确保单元格中的所有文本都能正确显示。然后,我们为发布者输入数据的地方标记四个列标题。然后我们解锁这些列,以允许使用我们之前创建的解锁格式输入数据。
text_format = workbook.add_format({‘text_wrap’: True})worksheet.write(‘F1’,’Publisher Impressions’)
worksheet.write(‘G1’,’Publisher Clicks’)
worksheet.write(‘H1’,’Video: Starts’)
worksheet.write(‘L1’,’Video: 100% Complete’)#where the vendors will input data
worksheet.set_column(‘F2:O2’,25,unlocked)
在电子表格中看到任何文本被未展开的单元格截断,这可能是 MS excel 中最难看的事情之一。因此,在接下来的几行中,我们调整列以显示适当的长度来容纳全文。
worksheet.set_column(‘A:B’,vendor[‘Campaign Name’].map(len).max(),text_format)
worksheet.set_column(‘C:C’,vendor[‘Placement’].map(len).max(),text_format)worksheet.set_column(‘D:D’,15)
worksheet.set_column(‘E:Z’,25)
我们最后关闭工作簿并保存 excel 模板。
workbook.close()
writer.save()
完整代码见下文
回顾一下,我们已经编写了一个 python 脚本,解析出媒体计划中的现场投放,并为发布者创建一个 excel 模板,然后填写以满足报告需求。在项目实施过程中可能出现的问题包括广告位的命名惯例、广告位的突然变更但未反映在媒体计划中,以及许多其他微小的变化。
该项目的下一步将是自动化与发送 excel 模板给出版商相关的电子邮件。
在一个理想的世界(以媒体代理为中心的世界),网站服务将被取消,所有的交易将通过你选择的广告服务器(可能是 DCM,实际上最有可能是 DCM…)完成。然而,在我看来,下一个最好的事情是在出版商之间统一一个 API,我们可以手动调用他们的服务器来获取印象和其他指标。但目前我们所能做的最好的事情是尽量减少错误,并使出版商和代理商之间的数据移交过程标准化。
如有疑问、意见或担忧(或突出的问题),请通过 LinkedInhttps://www.linkedin.com/in/harrychaw/联系我
Python 中的自动化堆栈
如何在节省时间的同时提高性能
介绍
当谈到将机器学习算法推向新的高度时,利用堆叠(堆叠概括)是一个非常热门的话题。例如,现在大多数获奖的 Kaggle 提交文件都使用了某种形式的堆叠或其变体。戴维·沃伯特在 1992 年的论文中首次介绍了叠加泛化,它们的主要目的是减少泛化误差。根据沃伯特的说法,它们可以被理解为“交叉验证的更复杂版本”。虽然沃伯特本人当时指出,大部分堆叠概括是“黑色艺术”,但似乎构建越来越大的堆叠概括会战胜较小的堆叠概括。然而,随着这些模型的规模不断增加,它们的复杂性也在增加。自动化构建不同架构的过程将大大简化这一过程。本文的剩余部分将处理我最近遇到的包 vecstack ,它正在尝试这个 。

Source: https://giphy.com/gifs/funny-food-hRsayJrDAx8WY
堆叠式概化看起来像什么?
堆叠概化结构背后的主要思想是使用一个或多个一级模型,使用这些模型进行预测,然后使用这些预测作为要素来拟合一个或多个二级模型。为了避免过度拟合,通常使用交叉验证来预测训练集的 OOF(折叠外)部分。该套件中有两种不同的变体,但我将在本段中描述“变体 A”。为了得到这个变量的最终预测,我们取所有预测的平均值或众数。可以使用 vecstacks 文档中的这张 GIF 来可视化整个过程:

用例:构建用于分类的堆叠式概化
看了文档之后,是时候自己尝试使用这个包了,看看它是如何工作的。为此,我决定使用 UCI 机器学习库中的葡萄酒数据集。这个数据集的问题陈述是使用 13 个特征,它们都代表了葡萄酒的不同方面,来预测葡萄酒来自意大利的三个栽培品种中的哪一个。
首先,让我们导入我们的项目需要的包:
**import pandas as** pd
**from** **sklearn.datasets** **import** load_iris
**from** **sklearn.model_selection** **import** train_test_split
**from** **sklearn.metrics** **import** accuracy_score
**from sklearn.neighbors import** KNeighborsClassifier
**from** **sklearn.ensemble** **import** RandomForestClassifier
**from** **xgboost** **import** XGBClassifier
**from** **vecstack** **import** stacking
现在,我们准备导入数据并查看它,以便更好地理解它的样子:
**link** = '[https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'](https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data')
**names** = ['Class', 'Alcohol', 'Malic acid', 'Ash',
'Alcalinity of ash' ,'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines',
'Proline']**df** = **pd**.**read_csv**(link, header=None, names=names)
**df**.**sample**(5)
运行上面的代码块给我们带来了:

注意我用的是。样()改为 if 。head() 避免由于假设整个数据集具有前五行的结构而被误导。幸运的是,这个数据集没有任何缺失值,所以我们可以很容易地使用它来测试我们的包,而不需要任何通常需要的数据清理和准备。
接下来,我们将从输入变量中分离出响应,并按照 vecstacks 文档中的示例执行 80:20 的训练测试分割。
**y** = df[['Class']]
**X** = df.iloc[:,1:]**X_train, X_test, y_train, y_test** = train_test_split(X, y, test_size=0.2, random_state=0)
我们越来越接近有趣的部分了。还记得之前的 GIF 吗?现在是时候为我们的堆叠概括定义一些第一级模型了。这一步绝对值得单独写一篇文章,但是为了简单起见,我们将使用三个模型:KNN 分类器、随机森林分类器和 XGBoost 分类器。
**models** = [
**KNeighborsClassifier**(n_neighbors=5,
n_jobs=-1),
**RandomForestClassifier**(random_state=0, n_jobs=-1,
n_estimators=100, max_depth=3),
**XGBClassifier**(random_state=0, n_jobs=-1, learning_rate=0.1,
n_estimators=100, max_depth=3)
]
这些参数在设置之前没有被调优,因为本文的目的是测试这个包。如果你要优化性能,你不应该只是复制和粘贴这些。
从文档中取出下一部分代码,我们实际上是使用第一级模型进行预测来执行 GIF 的第一部分:
**S_train, S_test** = **stacking**(models,
X_train, y_train, X_test,
regression=False,
mode='oof_pred_bag',
needs_proba=False,
save_dir=None,
metric=accuracy_score,
n_folds=4,
stratified=True,
shuffle=True,
random_state=0,
verbose=2)
堆叠函数接受几个输入:
- 车型 :我们前面定义的第一级车型
- X_train,y_train,X_test :我方数据
- 回归 :布尔值,表示是否要使用函数进行回归。在我们的例子中设置为 False,因为这是一个分类
- 模式: 使用前面描述的出叠方式进行交叉验证
- needs_proba :布尔值,表示是否需要类别标签的概率
- save_dir :将结果保存到目录 Boolean
- 度量 :使用什么评估度量(我们一开始导入了 accuracy_score)
- n_folds :交叉验证使用多少个折叠
- :是否使用分层交叉验证
- 洗牌 :是否洗牌
- random_state :设定再现性的随机状态
- 详细 : 2 这里是指打印所有信息
这样,我们得到以下输出:
*task: [classification]
n_classes: [3]
metric: [accuracy_score]
mode: [oof_pred_bag]
n_models: [4]model 0: [KNeighborsClassifier]
fold 0: [0.72972973]
fold 1: [0.61111111]
fold 2: [0.62857143]
fold 3: [0.76470588]
----
MEAN: [0.68352954] + [0.06517070]
FULL: [0.68309859]model 1: [ExtraTreesClassifier]
fold 0: [0.97297297]
fold 1: [1.00000000]
fold 2: [0.94285714]
fold 3: [1.00000000]
----
MEAN: [0.97895753] + [0.02358296]
FULL: [0.97887324]model 2: [RandomForestClassifier]
fold 0: [1.00000000]
fold 1: [1.00000000]
fold 2: [0.94285714]
fold 3: [1.00000000]
----
MEAN: [0.98571429] + [0.02474358]
FULL: [0.98591549]model 3: [XGBClassifier]
fold 0: [1.00000000]
fold 1: [0.97222222]
fold 2: [0.91428571]
fold 3: [0.97058824]
----
MEAN: [0.96427404] + [0.03113768]
FULL: [0.96478873]*
再一次,参考 GIF,现在剩下要做的就是在我们的预测上拟合我们选择的第二层模型,以做出我们的最终预测。在我们的例子中,我们将使用 XGBoost 分类器。这一步与 sklearn 中的常规拟合和预测没有显著不同,除了这样一个事实,即我们不是使用 X_train 来训练我们的模型,而是使用我们的预测 S_train。
***model** = **XGBClassifier**(random_state=0, n_jobs=-1, learning_rate=0.1,
n_estimators=100, max_depth=3)
**model** = model.fit(**S_train**, y_train)**y_pred** = model.predict(S_test)print('Final prediction score: [%.8f]' % accuracy_score(y_test, y_pred))Output: Final prediction score: [0.97222222]*
结论
使用 vecstacks 的堆叠自动化,我们成功预测了正确的葡萄酒品种,准确率约为 97.2%!如您所见,该 API 与 sklearn API 并不冲突,因此可以在尝试加速堆叠工作流时提供一个有用的工具。
一如既往,如果您有任何反馈或发现错误,请随时联系我。
**参考文献:
[1]戴维·h·沃尔波特,(1992),神经网络
[2]伊戈尔·伊万诺夫, Vecstack (2016),GitHub
3 M. Forina 等人,葡萄酒数据集 (1991),UCI 机器学习知识库
用 Python 中的 PyAutoGUI 实现自动化 UI 测试
回归测试你的用户界面的一个快速简单的方法
当没有必要的安全措施来保证质量控制时,发布一个新版本的产品可能是一个令人紧张的经历。假设您的产品有一个用户界面(UI),那么在每次发布之前进行 UI 测试是明智的。
当然,您已经准备好了集成测试,并且您确信系统将端到端地工作,包括 UI。然而,根据您所在的行业以及您的应用程序的重要性,您可能需要确保并证明它是可行的。鉴于这是您每次发布应用程序时都想要重复的事情,您可能想要自动化这种类型的测试。
一种快速简单的方法是利用一个名为 PyAutoGUI 的 Python 库,它将允许您执行自动化的 UI 测试。

Photo by Med Badr Chemmaoui on Unsplash
简介 PyAutoGUI
PyAutoGUI 本质上是一个 Python 包,可以跨 Windows、MacOS X 和 Linux 工作,它提供了模拟鼠标光标移动和点击以及键盘按钮按压的能力。
你可以在他们的主页上找到关于这个包的更多信息,包括下面显示的快速概览:
import pyautogui
screenWidth, screenHeight = pyautogui.size()
currentMouseX, currentMouseY = pyautogui.position()
pyautogui.moveTo(100, 150)
pyautogui.click()
pyautogui.moveRel(None, 10) # move mouse 10 pixels down
pyautogui.doubleClick()
pyautogui.moveTo(500, 500, duration=2, tween=pyautogui.easeInOutQuad) # use tweening/easing function to move mouse over 2 seconds.
pyautogui.typewrite('Hello world!', interval=0.25) # type with quarter-second pause in between each key
pyautogui.press('esc')
pyautogui.keyDown('shift')
pyautogui.press(['left', 'left', 'left', 'left', 'left', 'left'])
pyautogui.keyUp('shift')
pyautogui.hotkey('ctrl', 'c')
用法示例
为了了解这在实践中是如何工作的,让我们快速构建一个示例 python 脚本。我们首先假设我们的应用程序 Firefox(作为一个例子)已经部署到一台测试 Windows 10 的机器上,我们希望自动测试 UI 的某些方面。
要做的第一件事,是导入包并捕捉我们屏幕的大小。我们也可以假设 Windows 任务栏总是在屏幕的底部,所以我们可以继续启动开始菜单按钮。
import pyautogui as gui, time
screenWidth, screenHeight = gui.size()
gui.moveTo(0,screenHeight)
gui.click()
一旦执行了上面的代码,我们就可以搜索 Firefox,然后启动它。
gui.typewrite('Firefox', interval=0.25)
gui.press('enter')
我增加了每个字母的打字间隔,以适应较慢的机器。然后,我们需要确保窗口最大化到屏幕上。windows 的快捷键是 Alt + Space,然后是 x。
time.sleep(2) #give 2 seconds for firefox to launch
gui.keyDown('alt')
gui.press(' ')
gui.press('x')
gui.keyUp('alt')
此时,我们可以开始添加我们希望工具测试的特性。例如,我们可能想测试打开一个新标签页并在网站中键入内容。为此,我们想知道屏幕上的某些位置。为了识别它们,我们可以在后台运行以下脚本,当我们将鼠标悬停在我们想要的位置上时,可以看到位置输出:
import pyautogui as gui, time
def identifyloc():
while True:
currentMouseX, currentMouseY = gui.position()
print(currentMouseX,currentMouseY)
time.sleep(3)
identifyloc()
使用这个,我发现“新标签”按钮在位置(250,22),地址栏在(371,51)。因此,我可以使用下面的代码:
gui.click(250,22)
gui.click(371,51)
gui.typewrite('https://medium.com/financeexplained')
gui.press('enter')
然后我们可以继续添加尽可能多的测试场景。当然,在执行完所有这些之后,仍然需要有人查看日志和 UI,以确保我们没有遇到任何错误。
将所有这些放在一起:
import pyautogui as gui, time
def testfirefox():
screenWidth, screenHeight = gui.size()
gui.moveTo(0,screenHeight)
gui.click()
gui.typewrite('Firefox', interval=0.25)
gui.press('enter')
time.sleep(2)
gui.keyDown('alt')
gui.press(' ')
gui.press('x')
gui.keyUp('alt')
gui.click(250,22)
gui.click(371,51)
gui.typewrite('[https://medium.com/financeexplained'](https://medium.com/financeexplained'))
gui.press('enter')def identifyloc():
while True:
currentMouseX, currentMouseY = gui.position()
print(currentMouseX,currentMouseY)
time.sleep(3)testfirefox()

在你走之前,我经常写关于金融和技术的博客。如果你想了解我的文章,别忘了关注我!
使用 Python 中的 AutoML 自动调整和选择 ML 模型
在同一数据集上测试不同的 ML 方法以评估模型性能可能是一项单调乏味的任务。此外,正确调整深度学习模型可能需要几个小时,如果不是几天的话。幸运的是,在过去的十年中,人们一直在努力开发自动化 ML 模型选择和调整的方法。虽然目前可用的开源解决方案并不是银弹(也不应该这样对待!),在构建 ML 或 DL 模型时使用 AutoML 可以节省大量的时间,至少可以为您指出最佳模型的正确方向。在这篇文章中,我回顾了 Python 中目前可用的一些 AutoML 实现,并提供了具体的例子(包括代码!).
Python 中目前可用于自动化模型选择和调优的一些选项如下( 1 ):
- H2O 一揽子计划
- auto-sklearn 包
- TPOT 一揽子计划
在本帖中,我们将回顾 H2O 包和 TPOT 包中的 AutoML 功能。可惜 auto-sklearn 只在 Linux 操作系统上可用(我没有),所以就不覆盖了。
数据
在这篇文章中,我们将使用通过 UCI 机器学习知识库获得的一个众所周知的数据集,乳腺癌数据集,根据各种因素对癌症是否复发进行分类(二进制结果为 0 或 1)。潜在的预测变量包括患者的年龄(分类变量——分箱),患者是否已经绝经(分类变量),以及肿瘤大小(分类变量——分箱)等。数据集的快照如下所示:

Snapshot of the breast cancer data, available via the UCI repository
在我们通过任何 autoML 函数运行数据之前,让我们稍微清理一下。主要是,我们使用 sklearn 的 LabelEncoder()函数将所有的分类变量转换成数字(使用标签编码对 H2O 来说不是必需的,但对 TPOT 来说是必需的):

Data after being label-encoded
现在我们有了一个干净的数据集,可以使用了,让我们对它运行 AutoML。
H20 的汽车
H20 是一个开源的 ML 库,允许用户快速构建、测试和生产 ML 模型。H2O 的 AutoML 功能可以自动为训练数据集选择最佳 ML 或 DL 模型。该软件包非常通用和强大。
下载 H20
这个链接包含了为 Python 下载 H20 的说明。该软件包需要一些必须预先安装的依赖项。提供了使用 Anaconda 和普通 Python 进行安装的指导。
在我们的数据集上运行 H2O 的 AutoML
我们使用以下代码对数据集执行 H2O AutoML:

A snapshot of the leaderboard for H2O’s AutoML results
如上图所示,控制台中会出现最合适型号的排行榜。根据排行榜的结果,我们表现最好的模型是一般线性模型(GLM),其次是梯度增强模型(GBM)。我们可以通过 H2O 的 model_performance()函数运行我们的测试数据来衡量 GLM 的性能,其中 aml.leader 是性能最好的模型:

Confusion matrix for test predictions, generated via H2O’s model_performance() function
基于上述混淆矩阵,该模型的总体准确率约为 83%,召回率约为 73%,准确率为 87.5%。考虑到我们在通过 AutoML 运行数据集之前实际上没有对其进行预处理,这是一个惊人的结果。
TPOT 汽车公司
TPOT,或基于树的流水线优化工具,是最早开发的 AutoML 方法之一。兰德尔·奥尔森博士在宾夕法尼亚大学计算遗传学实验室工作时开发了 TPOT。TPOT 的主要目标是通过基因编程实现 ML 流水线的自动化。TPOT 自动化流程图如下所示( 3 ):

The ML pipeline as automated by the TPOT package (3)
正如你在上面的示意图中看到的,TPOT 的 AutoML 功能可以自动完成 ML 管道后数据清理。流水线中的具体自动化步骤包括特征选择和预处理、模型选择和参数优化。
为 Python 下载 TPOT
TPOT 的功能依赖于 scikit-learn,所以你需要安装 sklearn(如果你还没有)和 TPOT 来使用 TPOT 的 AutoML 功能:
pip install sklearn
pip install tpot
使用 TPOT 的 AutoML 函数
我们将使用 H2O 汽车公司示例中使用的相同癌症数据集,再次预测癌症是否会复发(“类别”列)。我们通过 run_tpot_automl()函数运行标签编码的数据集:
该代码输出一个名为 tpot_classifier_pipeline.py 的 python 文件。该文件包含模型的优化 ML 管道:
我们对自动输出文件进行了一些编辑,并返回预测的测试结果以及相关的混淆矩阵:

Confusion matrix of test outputs.
在检查所选 AutoML 模型的结果时,一个额外的树分类器(一个随机森林的变体),总的模型精度是 83%。模型召回率为 75%,准确率约为 84%。与 H2O AutoML 模型的结果几乎完全相同,但精度得分较低。
不同的包装如何堆叠
如果您正在对一个模型进行 AutoML 采样,我建议尝试这两个包,因为您的结果可能与本文中的结果不同。就每个方案而言,以下是我观察到的利弊:
H2O 汽车
优点:
- 易于下载
- 几乎不需要数据预处理(标签编码是不必要的,因为它与 TPOT)
- 结果很容易解释
- 选择最佳型号时,对各种 ML 和 DL 类型进行采样
缺点:
- Spyder 是我的首选 IDE(可以通过 Anaconda 发行版获得),它不会显示 H2O 输出。H2O 必须在 Jupyter 笔记本或同等电脑上运行,才能显示排行榜结果。
TPOT 汽车
优点:
- 结果是高度可解释的,并且生成包含最佳 ML 管道的自动化文件。
- 易于下载。
缺点:
- 需要进行更多的数据预处理,才能将数据集转换成可接受的格式来运行 AutoML。
- 至少在这个例子中,不如 H2O 的 AutoML 精确。然而,这可能是一次性的,当使用其他数据集进行采样时,结果可能会有所不同。
我的 Python AutoML 包教程到此结束。感谢阅读!本教程的完整代码可通过我的个人 Github repo 获得:https://Github . com/kperry 2215/automl _ examples/blob/master/automl _ example _ code . py
看看我的其他一些机器学习文章:
包括示例 Python 代码!在这篇文章中,我将介绍一些我最喜欢的检测时间序列中异常值的方法…
techrando.com](https://techrando.com/2019/08/23/unsupervised-machine-learning-approaches-for-outlier-detection-in-time-series/) [## 使用 Python - Tech Rando 进行变化点检测简介
我的很多工作都大量涉及时间序列分析。我使用的一个很棒但不太为人所知的算法是…
techrando.com](https://techrando.com/2019/08/14/a-brief-introduction-to-change-point-detection-using-python/)
来源
- AutoML。从 https://www.ml4aad.org/automl/取回
- AutoML:关于自动机器学习的信息。从 http://automl.info/tpot/取回
- TPOT:一个 Python 自动机器学习工具,使用遗传编程优化机器学习管道。从 https://github.com/EpistasisLab/tpot取回
原载于 2019 年 10 月 21 日 https://techrando.com**T21。
使用任务调度器自动化您的 Python 脚本
数据专业人员权威指南
Windows 任务计划程序抓取替代数据

Credit: Stocksnap
每天运行我的 Python 脚本太麻烦了。
我需要一种定期自动运行我的 Python 脚本的方法
想象一下,你的经理让你半夜醒来运行一个脚本。这将是你最大的噩梦。你过早醒来,暴露在可怕的蓝光下,每天午夜都不能好好睡觉。
作为任何数据专业人员,您可能需要运行多个脚本来生成报告或部署分析管道。因此,你需要了解一下计划者来避免破坏你的周末。
每个数据工程师和科学家在某个时间点都需要运行定期任务。
根据定义,周期性任务是指在没有或很少人工干预的情况下,按照一定的时间间隔重复执行的任务。在数据和技术快速发展的时期,你需要运行脚本来开发数据库备份、Twitter 流等。
幸运的是,有了任务调度器,您现在可以根据需要每天/每周/每月/每年运行 Python 脚本来执行定期任务。
在本教程中,您将学习如何运行任务调度程序来从 Lazada (电子商务)网站的网页抓取数据,并将其转储到 SQLite RDBMS 数据库中。
这是自动运行您的脚本的快速一瞥!

Running Web Scraping Scripts with Task Scheduler then append it to SQLite Disk
我们开始吧!
这些方法
在本教程中,我们将使用 Windows 任务计划程序运行 bat 脚本,该脚本将触发 Python 脚本。要执行这些脚本,我们有两个简单的步骤:
- 创建 Python 可执行文件(bat 文件)
- 在 Windows 任务计划程序中配置任务
但是,如果您是 Linux 用户,并且没有可用的 Windows 任务调度程序,您应该使用 cron 调度程序。
创建 Windows 可执行 bat 文件以运行 Python
一个 BAT 文件是一个 DOS 批处理文件用来执行 Windows 命令提示符(cmd.exe)下的命令。它包含一系列通常可能在 DOS 命令提示符下输入的行命令。 BAT 文件最常用于在 Windows 中启动程序和运行维护实用程序。—fileinfo.com
使用 bat 文件作为我们的可执行文件,我们将运行脚本存储在一个文件中,然后双击 bat 文件,在 cmd(命令提示符)上执行命令来运行 python 脚本。
你需要做的就是创建一个新的 bat 文件(例如:web-scraping.bat)并编写可执行脚本,格式为 <你的 Python.exe 位置> <你的 python 脚本位置> 。可以添加暂停命令,避免执行后关闭命令提示符。
C:\new_software\finance\Scripts\python.exe "C:/new_software/Web Scraping/Web-Scraping/Selenium Web Scraping/scraping-lazada.py"
pause
一旦你双击这个 bat 文件,Windows 将打开你的命令提示符并运行网页抓取工具。为了调度这个双击/执行,我们将把我们的任务调度器挂接到 bat 文件。
在 Windows 任务计划程序中配置任务
Windows 任务调度器是一个默认的 Windows 应用程序,用于管理任务以响应基于事件或基于时间的触发。例如,你可以建议某个点击和计算机动作(比如重启),甚至建议像每个财政季度第一天的这样的时间来执行任务。
从更大的角度来看,这个任务将包含脚本和元数据,以定义将执行什么操作以及如何执行操作。您可以在参数中添加特定的安全上下文,并控制调度程序将在何处运行程序。Windows 将把所有这些任务序列化为。作业文件放在一个叫做任务文件夹的特殊文件夹中。

The process flow of Task Scheduler to automate application’s web scraping
在本教程中,我们将设置一个基于时间的事件来运行我们的应用程序,并将数据转储到 SQLite 中。总共有多少
- 点击开始窗口,搜索任务计划程序,并打开它。
- 单击右侧窗口中的创建基本任务
- 选择你的触发时间。
- 为我们之前的选择选择准确的时间。
- 开始一项计划
- 在之前保存 bat 文件的地方插入程序脚本。
- 单击完成。
我们开始吧!
- 点击开始窗口,搜索任务调度器,打开。

Task Scheduler Windows
2.在右侧窗口点击创建基本任务。
你应该把你的任务名称(如:网页抓取)和描述(如:网页抓取和 SQLite 转储自动每天下午 6 点)

3.选择您的触发时间。
你可以选择每天,每周,甚至每月触发时间。从逻辑上讲,这种选择很大程度上取决于您希望刷新数据源中的值的频率。例如,如果您的任务是收集 MarketWatch 股票资产负债表,您应该在每个财务季度运行这些脚本。

4.为我们之前的选择选择准确的时间。
我们将选择一月、四月、七月和九月来表示所有早期财务季度。

5.启动程序
在这里,您将能够启动 Python 脚本,发送电子邮件,甚至显示消息。请随意选择你最喜欢的。但是,您应该小心,因为有一些不推荐使用的任务将在后续补丁中删除。

6.在之前保存 bat 文件的地方插入程序脚本。
这将自动运行 Python 脚本的任务调度程序。确保在应用程序文件夹的位置包含 Start in,以便访问所有相关的元素(Selenium Browser 可执行文件/ SQLite 磁盘)

7.点击完成。
您可以在任务计划程序的首页查看您创建的任务计划。

祝贺您,您已经在 Windows 中设置了第一个自动计划程序。
结果
下面是 gif 动画,供大家参考。请注意调度程序是如何自己运行 Python 脚本的。一旦脚本运行完毕,它会将提取的值转储到 SQLite 数据库中。将来,该应用程序将在每次满足触发条件时运行,并将更新后的值追加到 SQLite 中。

Running Web Scraping Scripts with Task Scheduler then append it to SQLite Disk

Data appended into SQLite using Task Scheduler
最后…

Boy laughing while reading a book, source: Unsplash
我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。
请在下面评论出来建议和反馈。
如果你真的喜欢它,请查看我的个人资料。还有更多关于数据分析和 Python 项目的文章会让你感兴趣。
快乐编码:)
关于作者
Vincent Tatan 是一名数据和技术爱好者,拥有在 Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验。
Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。
他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。
请通过 LinkedIn ,Medium或 Youtube 频道 联系文森特
自动化和可管理的管道:数据科学工厂的关键组成部分

数据科学可能是一项棘手的工作,来自无数来源的原始数据不断涌入不断发展的管道,试图满足不断变化的期望。为了利用所有这些混乱的潜力,企业努力创建数据科学工厂,在减少低效的同时简化流程;然而,数据不会等着公司赶上来。在处理大量数据的同时生产一个高功能的数据科学工厂就像试图制造一架飞机并驾驶它一样。
构建有效的数据科学工厂的关键是在流程的每个步骤中实施智能自动化和评分管道,以便为业务合作伙伴和客户生成分析产品,如 API、评分文件和数据丰富。每个组件都必须产生合理的结果,以使操作具有可伸缩性并产生可靠的见解。让我们来看看起作用的组件以及如何最大化每一个组件。
三种类型的管道
数据管道:数据从起点到它在美丽的图形中的最终归宿,或者最终到数据仓库,有一个漫长而痛苦的旅程。数据管道软件将数据从一个点移动到另一个点,并且在该过程中经常涉及转换。高效的数据管道减少了手动步骤,每个步骤都依赖于自动化:提取、清理、转换、组合、验证和加载以供进一步分析。传输数据会增加损坏和潜在延迟的风险,在小范围内降低风险的努力越多,当流程扩展时,输出的质量就越高。
机器学习评分管道:干净、准备好的数据准备好被输入到机器学习评分算法中,在那里生成通知商业决策的分数。有效的 ML 评分管道在很大程度上依赖于其模型的质量。
反馈和响应管道:由 ML 管道产生的规定决策必须被记录并通过反馈和响应管道被返回用于进一步学习。这一过程既可以实时进行,如网站产品推荐,也可以要求对购买周期较长的产品进行潜在响应,如抵押贷款申请或人寿保险报价。
数据管道的三种速度
数据管道可以以三种不同的速度进行处理,每种方式都有独特的优势和局限性。
批处理:批处理是处理大量数据的有效方式。在一段时间内收集的交易作为一批进行处理。这种方法通常用于建模预测分析,因为大量的数据可确保更准确的结果和更强的洞察力。
实时:许多数字操作需要立即行动,因此当代数据科学家经常依赖实时数据处理。这种方法需要不断的输入、处理和输出。流媒体创造了快速数据现象,许多企业提供关键的实时服务,如欺诈检测、语音识别和推荐。
事件驱动:为了节省资源和限制冗余,一些管道应用事件驱动处理。事件可以是指示特定温度、时间段的智能机器,或者与库存相关的销售点通知。事件驱动的管道被优化以产生实时结果,但是仅在特定的、预先确定的情况下。
高度可扩展管道的关键要素
1。底层基础设施
基础设施是指产生机器学习算法所需的技术栈。成功的运营需要密封的解决方案和坚实的基础设施。难以控制的管道系统会导致不可收回的技术债务,这一直是 ML 开发中的一个问题,或者使结果和工作流不可能重现的纠缠不清的“管道丛林”。
2。自动化质量控制
人工智能正在彻底改变各行各业的质量控制,但同样重要的是,该技术可以监控自身输出的质量。实施在线和超时自动质量控制解决方案可确保更可靠的结果,并减少手动检查受损数据所花费的时间。
3。自动化漂移和异常检测
概念漂移是机器学习中的一种常见现象,会导致不准确的结果;然而,目标变量的变化可以被自动标记,触发重新训练以保护模型的完整性。此外,当数据点超出预测模式时,自动异常检测可以触发适当的操作或进一步的调查。
4。为数据治理和自我记录管道集成现代数据目录
人们越来越认识到数据对公司来说是无价的,这使得数据的管理、存储和监管成为重中之重。能够自我记录的管道增加了未来项目的功能和价值,集成现代数据目录提高了任何算法预测的相关性。
5。实施强大的日志记录和诊断功能
正如古老的英国谚语所说:及时一针可省九针。一旦数据移动,调试就变得非常困难。在开发和部署阶段建立日志记录和诊断功能是非常重要的,以避免在过程的后期进行数据修复。
建立期望
1790 年,塞缪尔·斯莱特建立了美国第一家生产加工棉花的工厂。新摘的棉花收了进去;加工棉花出来了。近 230 年后,随着数据成为世界上最有价值的资源,“工厂”的概念也随之演变。单一静态输入的时代已经成为历史,新的标准是找出如何将每天产生的 2.5 万亿字节的数据转化为可操作的见解。构建高效的数据科学工厂需要持续的工作进展,即使是在企业的最高级别。虽然不可能交流所涉及的无数动态变量,但是集成这些基本组件是朝着正确方向迈出的一步。
关于高功能数据科学工厂的更多组件,阅读关于特性存储库。
本帖最初发表于 Quickpath 的博客 。
自动化 Aspen HYSYS 建模
以及为什么所有过程工程师都应该担心这个问题

Aspen HYSYS snapshot of an oil and gas plant
Aspen HYSYS 是最著名的过程建模软件之一,大多数过程(化学)工程师都知道并使用它。在这篇博客中,我将回顾我们如何利用现实生活中的业务问题实现 it 自动化的 3 种方法。在我开始解释这些方法之前,让我详细解释一下为什么我认为这很重要。

Image from freepik.com
重要性: 随着人工智能的到来和计算机技术的进步,你可能会听到这样的说法:在未来 10 年内,人类将几乎没有工作。这听起来很可怕,而且目前与你无关。让我们想想它会怎样发生。
从自动化任务开始,这在过去几年中在所有工作方面都有显著扩展。我观察到无论是大公司还是小公司都鼓励他们的员工将所有重复性的工作投入自动化模式。工程软件开始从基于电子表格转变为基于专有工具,自动将 HYSYS 直接链接到软件。作为一名经验丰富的工艺工程师,我们在设备选型和工艺计算方面投入的精力越来越少。我无法想象在不久的将来,年轻的工程师怎么可能会有我过去的那种“脏手”经历,因为他们可能一无所知,而软件将为他/她做几乎所有的事情。迟早你会发现这一点,所以让我们作为第一步开始学习如何自动化它吧!
本文的目标是记录和分享我在项目中尝试自动化 HYSYS 建模的内容。也许,这可能对和我有类似问题的人有益。下表是我在 HYSYS 的一个设备处理方案中运行各种案例的目的。需要该汇总表来确定选择哪种情况来建立设备选型的 H&MB 和操作范围。

Various cases of HYSYS simulation required to complete this work
背景: 在我的过程工程职业生涯中,我经常发现的一个问题是需要考虑的操作案例数量非常多。这通常来自地下储层预测的不确定性、生产混合策略的变化以及许多其他原因。例如,低输入温度(低海底温度)的情况将导致最高的原油热交换器负荷,另一方面,高海底温度的情况通常决定压缩机功率大小。作为主要的工厂设计工程师,我们将需要仔细确定所有的操作参数,以涵盖这些情况,以确保我们不会遇到任何情况,我们将不得不操作和生活,但设备不是为其设计的。
业务案例: 具体到我的项目,从探井数据和自然界中各种各样的储层来看,不同气体成分的混合、凝析油 API、来自天然气平台的凝析油气比(CGR)、石油成分、来自石油平台的各种气油比、CO2 含量和海底温度的变化都会以某种方式影响设备设计。这些因素的综合结果是,如下表所示,总共需要考虑 64 个 HYSYS 模拟案例。

在过去,我们通常试图通过使用一些工程判断来减少案例的数量。例如,人们可能会假设高 API 凝析油情况会与高 API 油情况同时发生。然而,我认为减少案例数量可能不是正确的方法,因为成分混合的结果不容易预见,并且可能导致忽略一些重要操作案例的问题。另一方面,如果这些耗时的任务可以自动化,就可以建立一个更健壮的系统方法。
自动化选项: 我在这部作品中考虑了三个选项:
1。使用石油专家解析软件
2。使用 Python GUI 控件包
3。使用 Excel Visual Basic for Applications 和 HYSYS 类型库外接程序
我选择实施的最终解决方案是#2 和#3 的组合。
对于第一个选项,PetEx RESOLVE 软件提供了 HYSYS 与其他软件(如 Excel、Pipesim 或 GAP)之间的良好交互。探索了一段时间后,我觉得这个选项看起来不适合我的问题。主要是,该软件更侧重于全局优化(从油井到加工设施的建模)和基于给定时间段预测各种生产率的结果。用 RESOLVE 构建的交互模块需要在不同的时间输入案例。虽然我可以在不同的时间设置不同的案例名称,但看起来软件内置的曲线绘制或软件之间的自动导入/导出功能对我的案例没有用。相互作用主要集中在流量、压力、温度和简单的油/水/气重力。对于除此之外的其他属性,它需要额外的编码,如下图所示。

Example of Petroleum Expert RESOLVE snapshot
应注意,在 RESOLVE 中,为了让 HYSYS 显示正确的入口和出口流,子系统中的所有流都应显示在主页上。

Example of Petroleum Expert RESOLVE snapshot (2)
如上所述,这个输入解算器和预测并不完全符合我的需求,所以我尝试了其他方法。
对于第二个选项,我尝试使用 Python GUI 包来控制和自动化任务。Python 是一种免费的开源且广泛使用的编程语言。我们可以安装和使用大量的免费软件包。如果你不知道如何开始使用 Python,我推荐你阅读我的第一篇博客。我发现的一个很酷的功能是可以控制鼠标和键盘到屏幕上你想要的任何地方或者输入任何东西。它像人一样直接在软件上交互控制。该选项需要安装 pyautogui 或 pywinauto 之类的软件包。安装后,我们可以使用“Ctrl”+“F”功能打开 HYSYS 中的搜索菜单,在 HYSYS 中导航并更改选定的流。然后,我们可以使用“Tab”和其他键盘快捷命令来定位并更改我们想要的案例属性。但是,我发现仅使用键盘功能来调整 HYSYS stream 并不完全符合我的需求。我需要一些鼠标控制,每次打开软件时,当我用笔记本电脑屏幕和显示器打开软件或重新启动 HYSYS 时,HYSYS 中的设备操作项目不会出现在屏幕上的相同位置。因此,我意识到这可能不是自动化 HYSYS 建模案例的最佳方法。虽然它有一些有用的功能,比如截图保存,或者在案例完成运行并收敛后保存 HYSYS 文件的能力,但是调整流组成和属性以匹配我的问题案例才是真正的问题。

Snapshot of coding in python to define some custom function for this work

HYSYS Object Navigator command screen after pressing ‘CTRL’ + ‘F’
然后,我尝试了第三个选项—使用 Excel Visual Basic for Application 添加 HYSYS 类型库。在这种方法中,我可以直接导航到每个 HYSYS 工艺流程、设备操作,并使用内置功能调整操作。它的工作效率很高,因为可以在 Excel 中清楚地定义案例,一旦提供了编码,就可以执行导入/导出功能。我发现的唯一一个遗留问题是当我们改变入口流条件时 HYSYS 模拟的收敛状态。在写这篇文章的时候,除了手动检查,我仍然找不到任何更好的解决方案。

HYSYS type 10 library that can be added in Excel >> VBA >> Tools >> References

Some VBA code used in this project
最后,我得出的结论是,最好的办法可能是通过以下步骤将方案 2 和方案 3 结合起来:
1 .运行 Python 代码打开 HYSYS 文件和 Excel 文件
2。在每种情况下运行 Excel 宏来改变 HYSYS 入口条件
3。手动检查仿真结果是否收敛,并且没有出现奇怪的现象
4。运行 Excel 宏将 HYSYS 流属性导出到 Excel 表
5。继续下一个 Python 代码以保存 HYSYS 截图,将 HYSYS 文件保存为新案例,并为下一个案例重复步骤#2。

Final program interface that I used
在尝试了 3 种方法后,我总结了它们的利弊…

我已经把我所有的代码放在这个 GIT 里了。请随意阅读/使用,如果您觉得有用,请给我反馈您的意见。下次见。
参考资料:
加工和处理工程师可以更好地利用过程模拟的结果,通过自动导出…
www.chemengonline.com](https://www.chemengonline.com/using-excel-vba-process-simulator-data-extraction/) [## Hysys Excel 自动化
打开如何将 Hysys 仿真链接到 Excel?Example1.HSC。该文件在 Aspen Hysys V7.1 中生成,可能无法在…
hysyssimulations.blogspot.com](http://hysyssimulations.blogspot.com/)
使用 Python 的自动化数据剖析
使用 Python 生成带有数据分析输出的 MS Word 文档。

这篇博客是关于自动化探索性数据分析过程(EDA) 的数据剖析阶段的。我们将使用 Python 自动执行数据分析过程,并生成一个 Microsoft Word 文档作为数据分析结果的输出。
将 MS Word 文档作为数据分析结果输出的主要优势在于,它可用于捕捉领域专家关于数据质量、数据转换和特征工程的讨论和决策,以便进一步建模和可视化。

A sample page for numeric column data profiling
Python 代码的优势在于它保持了通用性,使想要修改代码的用户能够轻松地添加更多功能或更改现有功能。例如,更改为数字列数据配置文件生成的图形类型,或从 Excel 文件加载数据。
你可以从我的 GitHub 网站下载完整的代码。将以下文件下载到一个文件夹中,以执行 Python 代码:
01 _ 16 _ av _ automated _ data _ profiling _ MS _ word . ipynb
请注意,您将需要“docx”包来生成 MS Word 文档输出。
什么是探索性数据分析(EDA)
探索性数据分析指的是一套由 John Tukey 开发的技术,以一种有趣的特征将变得明显的方式显示数据。与通常从数据的假设模型开始的经典方法不同,EDA 技术用于 鼓励数据建议可能合适的模型 。
【来源:http://www.statgraphics.com/exploratory-data-analysis】
数据剖析是探索性数据分析过程的第一阶段。
什么是数据剖析过程?
数据分析是检查从现有信息源(如数据库或文件)获得的数据,并收集关于该数据的统计数据或信息摘要的过程。
数据剖析的目的是 找出现有数据是否可以方便地用于其他目的 。
数据剖析利用描述性统计的方法,例如最小值、最大值、平均值、模式、百分位数、标准偏差、频率、变化、合计(例如计数和总和)以及在数据剖析期间获得的附加元数据信息,例如数据类型、长度、离散值、唯一性、空值的出现、典型的字符串模式和抽象类型识别。
【来源:https://en.wikipedia.org/wiki/Data_profiling
数据简介 Data frame(DPD)——游戏改变者!
Python 和 Pandas 提供了许多分析数据的函数。但是这些命令必须单独发出,并且信息将是分散的。这是一个重复而繁琐的手动过程。
数据剖析数据框架是一种改变游戏规则的方式,可以在一个数据框架中方便地访问所有数据剖析信息,该数据框架是通过结合 Pandas 包的许多数据剖析功能和 Python 的通用统计功能而生成的。
创建数据概要数据帧
创建 DPD 的代码可以从我的 GitHub 站点 AnalyticsInsightsNinja 下载。
将以下文件下载到一个文件夹中,以执行 Python 代码:
01 _ 16 _ av _ automated _ data _ profiling _ MS _ word . ipynb
请注意,您将需要“docx”包来生成 MS Word 文档输出。
由于代码可以免费下载,所以在本文中,我将只讨论创建 DPD 的关键方面。
首先,创建一个数据帧,其行数等于数据集中的列数。这是因为 DPD 中的行是列的轮廓,因此 DPD 中的行数等于数据集中的列数。所需的列被添加到数据框架中。
源数据中的列与值计数、唯一值计数等详细信息一起作为行添加到 DPD 中。
下一步是使用以下命令生成源数据帧配置文件的数据帧:
df . describe()t . round(2)
这将创建一个源数据概要数据帧,对其进行转置(T)并将数值四舍五入到两位小数。
创建 DPD 的 关键步骤 是将最初创建的 DPD 与上述 describe()函数产生的数据帧合并。
pd.merge(data_qlt_df,raw_num_df,how='left ',left_on='column_name ',right_index=True)
然后将剩余的列添加到 DPD 中。
生成图表/图形
在代码的不同点,生成不同的图/图形并保存到磁盘。这些图像将被插入到 MS Word 文档的适当位置。
数字列的图表/图形
对于数字列,会生成以下图形:
- 列中所有值的箱线图
- 列中所有值的直方图
- 列中所有值的四分位数箱线图
- 无异常值的箱线图
- 小于 95%的值的小提琴图
- 小于 95%的值的直方图

在上图中,小于 95%的值的直方图是一个 自定义版本 直方图,具有不同百分位范围的条形值计数、条形范围值和彩色条形。这个直方图的代码可以从我的 GitHub 站点 AnalyticsInsightsNinja 下载— PythonVisualAnalytics 。
数字列的图表/图形
对于“对象”类型的列,为前二十五(25)个值绘制列的唯一值的标准化值。

相关图
数字列的相关图有助于确定列之间的关系和/或了解列如何受另一列的影响。

最终输出
最终的 Microsoft Word 文档是使用“ docx ”包创建的。
生成带有数据分析细节的 MS Word 文档的代码有些冗长,因为进入 Word 文档的每个细节都必须编码。但是输出值每一行代码!

Sample pages from the final Data Profile MS Word document

Sample numeric column data profile
示例数据配置文件 MS Word 文档可以从我的 GitHub 站点下载(Data _ Profile _ df _ MS _ Word . docx)。
数据分析之后的下一步是什么?
正如本博客前面提到的,数据剖析的目的是 发现现有数据是否可以方便地用于其他目的 。
那么使用 DPD 可以做出什么决定呢?
- 列名和数据类型:了解列是什么,列数据类型是否正确,列是否对用于建模目的的特征工程有用,或者可用于可视化分析,等等。
- 从磁盘到 RAM 的内存增加:可以决定是否需要优化列数据类型以适应 RAM。
- 数字列统计:根据列的最大值和最小值,可以决定列类型是否可以向下转换以优化内存使用。例如从 float64 向下转换到 float16
- 唯一值计数:根据列类型和唯一值的数量,可以决定它是否是要转换为“分类”数据类型的候选列。
- 空值的百分比或数量:可以决定是否可以以有意义的方式填充空值,如果列具有大量空值,该列是否有任何有用的用途,是否可以删除该列,如果该行的列值为空,是否可以删除观察/行,等等。
- 列值分布:可以决定如何处理异常值,是否应该丢弃异常值,什么样的视觉效果可以有效地识别趋势或模式,等等。
- 相关性图:可以决定相关性是否可以用于进行预测,强相关列是否可以用一个列代替多个列而不丢失信息,等等。
注意:需要注意的是,任何关于数据的决策都需要领域知识,或者需要了解领域知识和数据的人。在没有正确理解数据和领域知识的情况下做出的决策可能会导致糟糕的分析和分析。
结论
在本文中,我们探索了如何使用 Python 来自动化探索性数据分析过程(EDA) 的数据剖析阶段。
将 MS Word 文档作为数据分析结果输出的主要优势在于,它可用于捕捉领域专家关于数据质量、数据转换和特征工程的讨论和决策,以便进一步建模和可视化。
虽然有各种现有的软件和软件包来帮助数据分析过程,但是该代码提供了一些非常有用的好处:
- Python 代码是通用的,因此可以对其进行修改,以将用户需要的任何数据源加载到 Pandas 数据框架中。
- 一旦数据被加载到 Pandas 数据帧中,剩下的数据分析代码就可以不加任何修改地执行,以产生最终的 MS Word 输出。
- 数据配置文件的输出是一个完整的 Microsoft Word 文档,可用于记录关于数据的进一步讨论和决策。
使用 Apache Spark 进行大规模自动化数据质量测试
亚马逊的开源库——dee qu

Photo by Stephen Dawson on Unsplash
我一直是一名技术架构师,主要负责数据湖/中心/平台类的项目。每天,我们都会从 100 多个业务系统中获取数据,以便分析和 BI 团队可以在项目中使用这些数据。
问题陈述
在接收数据时,我们避免任何转换。数据从源位置复制。源可以是 MySQL、SQL Server、Oracle、DB2 等类型。目标系统可以是 Hadoop/Hive 或 Big Query。尽管没有对数据进行转换,因为源系统和目标系统是不同的,但有时这些简单的数据接收可能会导致数据质量问题。源系统和目标系统可以有不同的数据类型,这可能会导致更多的问题。数据中的特殊字符可能会导致行/列移位。
可能的解决方案
为了解决这个问题,大多数开发人员在构建数据管道后,使用手工方法进行数据质量测试。这可以通过运行一些简单的测试来完成,比如
- 源和目标之间的样本数据比较
- 主键列上的空检查
- 日期列上的空检查
- 分类列的计数比较
- 等等。
这种方法有时效果很好,但是很耗时并且容易出错。因此,我开始寻找一些自动化的选项。
亚马逊的 Deequ
我对开源数据质量测试框架的搜索止步于来自亚马逊的 Deequ 库。 Deequ 在亚马逊被用于验证许多大型生产数据集的质量。系统会定期计算数据质量指标。

Source — https://aws.amazon.com/blogs/big-data/test-data-quality-at-scale-with-deequ/
Deequ 建立在 Apache Spark之上,因此它可以自然地扩展到海量数据。最棒的是,你不需要详细了解 Spark 就可以使用这个库。 Deequ 提供如下功能
- 约束建议 —测试什么。有时可能很难找到在特定对象中测试什么。Deequ 提供了内置的功能来识别要测试的约束。
- 度量计算 —一旦我们知道要测试什么,我们就可以使用库给出的建议并运行测试来计算度量。
- 约束验证——使用 Deequ,我们还可以放置测试用例,并获得用于报告的结果。
让我们开始行动吧
为了运行 Deequ,我们需要首先准备好我们的工作站。您可以在一台简单的 Windows/Linux/Mac 机器上尝试一下。
先决条件
- 安装 Scala——你可以从——https://www.scala-lang.org/下载安装 Scala
- 安装 Apache Spark——你可以从——https://spark.apache.org/下载安装 Spark
- 下载 Deequ 库 —您可以下载 Deequ JAR,如下所示—
wget http://repo1.maven.org/maven2/com/amazon/deequ/deequ/1.0.1/deequ-1.0.1.jar
- 准备好要测试的数据 —如果你没有要测试的数据,你可以准备一个。对于本教程,我安装了一个 MySQL 实例,并从 http://www.mysqltutorial.org/mysql-sample-database.aspx加载了一些样本数据
- 下载 JDBC Jars —对于您想要运行这些测试的任何类型的数据库,请确保在
$SPARK_HOME/jars中添加 JDBC Jars。因为我要在 MySQL & Hive 上运行我的测试,所以我添加了各自的 JDBC jar。
在交互模式下启动 Spark
为了运行测试,我们将使用上一步下载的库在交互模式下启动 Spark,如下所示
PS D:\work\DataTesting> spark-shell --conf spark.jars=deequ-1.0.1.jar
Spark context Web UI available at [http://localhost:4040](http://SLB-CR3K882.DIR.slb.com:4040)
Spark context available as 'sc' (master = local[*], app id = local-1561783362821).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.3
/_/Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.scala>
约束建议
我计划在前面步骤中加载的customer表上运行测试。您可以使用 MySQL Workbench/CLI 来验证数据是否正确加载。

为了运行约束建议,我们需要首先使用 Spark 连接到 DB。
请注意,使用这种方法,我们将查询下推到底层数据库。所以直接在生产系统上运行时请小心。
import org.apache.spark.sql.SQLContextval sqlcontext = new org.apache.spark.sql.SQLContext(sc)val datasource = sqlcontext.read.format("jdbc").option("url", "jdbc:mysql://<IP>:3306/classicmodels").option("driver", "com.mysql.jdbc.Driver").option("dbtable", "customers").option("user", "<username>").option("password", "<password>").option("useSSL", "false").load()
在有效的连接上,您可以检查表的模式—
scala> datasource.printSchema()
root
|-- customerNumber: integer (nullable = true)
|-- customerName: string (nullable = true)
|-- contactLastName: string (nullable = true)
|-- contactFirstName: string (nullable = true)
|-- phone: string (nullable = true)
|-- addressLine1: string (nullable = true)
|-- addressLine2: string (nullable = true)
|-- city: string (nullable = true)
|-- state: string (nullable = true)
|-- postalCode: string (nullable = true)
|-- country: string (nullable = true)
|-- salesRepEmployeeNumber: integer (nullable = true)
|-- creditLimit: decimal(10,2) (nullable = true)scala>
现在,让我们运行约束建议—
import com.amazon.deequ.suggestions.{ConstraintSuggestionRunner, Rules}
import spark.implicits._ // for toDS method// We ask deequ to compute constraint suggestions for us on the data
val suggestionResult = { ConstraintSuggestionRunner()
// data to suggest constraints for
.onData(datasource)
// default set of rules for constraint suggestion
.addConstraintRules(Rules.DEFAULT)
// run data profiling and constraint suggestion
.run()
}// We can now investigate the constraints that Deequ suggested.
val suggestionDataFrame = suggestionResult.constraintSuggestions.flatMap {
case (column, suggestions) =>
suggestions.map { constraint =>
(column, constraint.description, constraint.codeForConstraint)
}
}.toSeq.toDS()
一旦执行完成,您可以打印如下所示的建议—
scala> suggestionDataFrame.toJSON.collect.foreach(println){"_1":"addressLine1","_2":"'addressLine1' is not null","_3":".isComplete(\"addressLine1\")"}
{"_1":"city","_2":"'city' is not null","_3":".isComplete(\"city\")"}
{"_1":"contactFirstName","_2":"'contactFirstName' is not null","_3":".isComplete(\"contactFirstName\")"}
{"_1":"state","_2":"'state' has less than 69% missing values","_3":".hasCompleteness(\"state\", _ >= 0.31, Some(\"It sho
uld be above 0.31!\"))"}
{"_1":"salesRepEmployeeNumber","_2":"'salesRepEmployeeNumber' has less than 25% missing values","_3":".hasCompleteness(\
"salesRepEmployeeNumber\", _ >= 0.75, Some(\"It should be above 0.75!\"))"}
{"_1":"salesRepEmployeeNumber","_2":"'salesRepEmployeeNumber' has no negative values","_3":".isNonNegative(\"salesRepEmp
loyeeNumber\")"}
{"_1":"customerName","_2":"'customerName' is not null","_3":".isComplete(\"customerName\")"}
{"_1":"creditLimit","_2":"'creditLimit' is not null","_3":".isComplete(\"creditLimit\")"}
{"_1":"creditLimit","_2":"'creditLimit' has no negative values","_3":".isNonNegative(\"creditLimit\")"}
{"_1":"country","_2":"'country' is not null","_3":".isComplete(\"country\")"}
{"_1":"country","_2":"'country' has value range 'USA', 'Germany', 'France', 'Spain', 'UK', 'Australia', 'Italy', 'New Ze
aland', 'Switzerland', 'Singapore', 'Finland', 'Canada', 'Portugal', 'Ireland', 'Norway ', 'Austria', 'Sweden', 'Belgiu
m' for at least 84.0% of values","_3":".isContainedIn(\"country\", Array(\"USA\", \"Germany\", \"France\", \"Spain\", \"
UK\", \"Australia\", \"Italy\", \"New Zealand\", \"Switzerland\", \"Singapore\", \"Finland\", \"Canada\", \"Portugal\",
\"Ireland\", \"Norway \", \"Austria\", \"Sweden\", \"Belgium\"), _ >= 0.84, Some(\"It should be above 0.84!\"))"}
{"_1":"postalCode","_2":"'postalCode' has less than 9% missing values","_3":".hasCompleteness(\"postalCode\", _ >= 0.9,
Some(\"It should be above 0.9!\"))"}
{"_1":"customerNumber","_2":"'customerNumber' is not null","_3":".isComplete(\"customerNumber\")"}
{"_1":"customerNumber","_2":"'customerNumber' has no negative values","_3":".isNonNegative(\"customerNumber\")"}
{"_1":"contactLastName","_2":"'contactLastName' is not null","_3":".isComplete(\"contactLastName\")"}
{"_1":"phone","_2":"'phone' is not null","_3":".isComplete(\"phone\")"}
这意味着你的测试用例已经准备好了。现在让我们运行指标计算。
度量计算
查看列和建议,现在我想运行指标计算。你可以这样做—
import com.amazon.deequ.analyzers.runners.{AnalysisRunner, AnalyzerContext}
import com.amazon.deequ.analyzers.runners.AnalyzerContext.successMetricsAsDataFrame
import com.amazon.deequ.analyzers.{Compliance, Correlation, Size, Completeness, Mean, ApproxCountDistinct, Maximum, Minimum, Entropy, GroupingAnalyzer}val analysisResult: AnalyzerContext = { AnalysisRunner
// data to run the analysis on
.onData(datasource)
// define analyzers that compute metrics
.addAnalyzer(Size())
.addAnalyzer(Completeness("customerNumber"))
.addAnalyzer(ApproxCountDistinct("customerNumber"))
.addAnalyzer(Minimum("creditLimit"))
.addAnalyzer(Mean("creditLimit"))
.addAnalyzer(Maximum("creditLimit"))
.addAnalyzer(Entropy("creditLimit"))
.run()
}
如果运行成功,您可以看到结果
// retrieve successfully computed metrics as a Spark data frame
val metrics = successMetricsAsDataFrame(spark, analysisResult)metrics.show()scala> metrics.show()
+-------+--------------+-------------------+-----------------+
| entity| instance| name| value|
+-------+--------------+-------------------+-----------------+
| Column| creditLimit| Entropy|4.106362796873961|
| Column|customerNumber| Completeness| 1.0|
| Column|customerNumber|ApproxCountDistinct| 119.0|
| Column| creditLimit| Minimum| 0.0|
| Column| creditLimit| Mean|67659.01639344262|
| Column| creditLimit| Maximum| 227600.0|
|Dataset| *| Size| 122.0|
+-------+--------------+-------------------+-----------------+
您还可以存储这些数字以供进一步验证,甚至显示趋势。在本例中,我们运行的是使用超对数算法计算的ApproxCountDistinct,。这通过近似非重复计数来减少源系统的负担。
可用分析器的完整列表可在以下位置找到—https://github . com/aw slabs/de equ/tree/master/src/main/Scala/com/Amazon/de equ/analyzer
约束验证
现在让我们使用验证套件运行测试用例。
import com.amazon.deequ.{VerificationSuite, VerificationResult}
import com.amazon.deequ.VerificationResult.checkResultsAsDataFrame
import com.amazon.deequ.checks.{Check, CheckLevel}val verificationResult: VerificationResult = { VerificationSuite()
// data to run the verification on
.onData(datasource)
// define a data quality check
.addCheck(
Check(CheckLevel.Error, "Data Validation Check")
.hasSize(_ == 122 )
.isComplete("customerNumber") // should never be NULL
.isUnique("customerNumber") // should not contain duplicates
.isNonNegative("creditLimit")) // should not contain negative values
// compute metrics and verify check conditions
.run()
}
运行完成后,您可以查看结果
// convert check results to a Spark data frame
val resultDataFrame = checkResultsAsDataFrame(spark, verificationResult)resultDataFrame.show()scala> resultDataFrame.show()
+-------------------+-----------+------------+--------------------+-----------------+------------------+
| check|check_level|check_status| constraint|constraint_status|constraint_message|
+-------------------+-----------+------------+--------------------+-----------------+------------------+
|Data Validate Check| Error| Success|SizeConstraint(Si...| Success| |
|Data Validate Check| Error| Success|CompletenessConst...| Success| |
|Data Validate Check| Error| Success|UniquenessConstra...| Success| |
|Data Validate Check| Error| Success|ComplianceConstra...| Success| |
+-------------------+-----------+------------+--------------------+-----------------+------------------+
如果某个特定的案例失败了,您可以查看如下所示的详细信息
resultDataFrame.filter(resultDataFrame("constraint_status")==="Failure").toJSON.collect.foreach(println)
增量数据的数据验证
Deequ 还提供了一种验证增量数据加载的方法。你可以在https://github . com/aw slats/dee qu/blob/master/src/main/Scala/com/Amazon/dee qu/examples/algebraic _ States _ example . MD了解更多关于这种方法的信息
异常检测
Deequ 还提供了一种检测异常的方法。GitHub 页面列出了一些方法和策略。详情可以在这里找到——https://github . com/aw slabs/dee qu/tree/master/src/main/Scala/com/Amazon/dee qu/anomaly detection
结论
总的来说,我认为 Deequ 是一个很好的工具,可以用于数据湖/中心/数据仓库类用例中的数据验证和质量测试。亚马逊甚至发表了一篇关于这种方法的研究论文。这可以在 http://www.vldb.org/pvldb/vol11/p1781-schelter.pdf 观看
如果你尝试这个,一定要让我知道你的经历。如果你有一些有趣的想法,请不要忘记在评论中提及。
Hey, if you enjoyed this story, check out [Medium Membership](https://deshpandetanmay.medium.com/membership)! Just $5/month!*Your membership fee directly supports me and other writers you read. You’ll also get full access to every story on Medium.*
自动唇读:简化
看一眼自动化唇读的世界(ALR)
为什么要读唇语?
专业的唇读并不是最近才有的概念。它实际上已经存在了几个世纪。显然,唇读背后的最大动机之一是为听力障碍者提供一种理解对他们说的话的方式。
然而,随着计算机视觉和深度学习领域技术的进步,机器自动唇读现在已经成为现实可能。请注意这个领域的发展,显示为每年发表的关于 ALR 的论文的累积数量。

Cumulative number of papers on ALR systems published between 2007 and 2017 [1]
这些进步开辟了各种新的讨论途径,涉及 ALR 的应用、窥探私人谈话的道德问题,以及最重要的是它对数据隐私的影响。
想想唇语的错综复杂,你就明白了。
然而,我今天不是来讨论这个问题的。这个博客是为那些想更深入了解这些 ALR 系统如何工作的好奇的少数人准备的。任何之前完全没有深度学习经验的人都可以肤浅地关注博客。即使是对深度学习的初步了解,也足以充分体会其中的细节。
唇读难吗?
看看这个《行尸走肉》几个短片的烂唇读视频就知道了(把声音关了)。再看一遍,有声音,只是为了好玩:P
滑稽..对吗?对话似乎与视频非常匹配,但显然有些地方感觉不对劲。到底出了什么问题?首先,这些显然不是真正的对话。但是为什么它们看起来如此完美?
这是因为嘴唇运动和音素(语言中最小的声音单位)之间没有直接的一一对应关系。比如/p/和/b/在视觉上是无法区分的。所以,同样的嘴唇动作可能是许多不同句子的结果。

但是专业的唇语读者是怎么做到的呢?专业的唇读是对唇动、肢体语言、手部动作和语境的理解的结合,以解读说话者想要说的话。听起来很复杂..对吗?好吧,让我们看看机器是怎么做的…
ALR、ASR 和 AV-ASR 有什么区别?
首先,让我们了解一下 3 个看似常见的术语 ALR、ASR 和 AV-ASR 之间的区别
- 自动唇读(ALR) :-试图理解仅仅基于视频(视觉)的说话内容。
- 自动语音识别(ASR) :-试图仅根据音频来理解正在说的内容。通常称为语音转文本系统。
- 视听-自动语音识别(AV-ASR) :-使用音频和视觉线索来理解正在说的内容。
字母和数字识别
ALR 早期的工作集中在简单的任务上,如字母或数字识别。这些数据集包含各种说话者的小片段,具有各种空间和时间分辨率,说单个字母(或音素)或数字。这些任务在 ALR 的早期阶段很流行,因为它们允许研究人员在受控的环境和受限的词汇下工作。

Frames from AVLetters, one of the most used alphabet recognition dataset
单词和句子识别
虽然字母和数字识别的受控设置对于在早期设计阶段分析算法的有效性是有用的,但是得到的模型不具有在野外运行的能力。ALR 系统的目的是理解自然语音,自然语音主要是由句子构成的,这使得有必要获取包含单词、短语和语音平衡句子的数据库以及可以有效处理这些内容的模型。

Frames from OuluVS2, a multi dimensional audio-visual dataset for tasks like ALR, ASR and AV-ASR
管道的浅见
典型 ALR 系统主要由三部分组成
- 嘴唇定位,
- 视觉特征的提取,
- 并分类成序列

第一个模块集中在人脸和嘴唇检测上,本质上是一个计算机视觉问题。第二个模块的目标是为每一帧可观察到的视觉信息提供特征值(数学值),这也是一个计算机视觉问题。最后,分类块旨在将这些特征映射到语音单元,同时确保完整的解码消息是连贯的,这属于自然语言处理(NLP)的领域。这个最后的块通过使用上下文帮助在视觉上相似的语音单元之间消除歧义。
基于深度学习的 ALR 系统
在过去的几年里,ALR 系统的性能有了显著的提高,这要归功于基于深度学习的架构越来越多地参与到管道中。
前两个模块,即嘴唇定位和特征提取是使用 CNN 完成的。一些其他基于 DL 的特征提取架构也包括 3D-CNN 或前馈网络。最后一层由 LSTMs 组成,通过考虑所有单独的帧输出来进行最终分类。其他一些基于 DL 的序列分类体系结构包括 Bi-lstm、GRUs 和 lstm。

An example of a DL based baseline for ALR systems [1]
下一步是什么?
在过去几年中,可以看到从传统架构到端到端 DNN 架构的明显技术转移,目前由 CNN 功能结合 LSTMs 主导。
然而,在大多数这些模型中,系统的输出被限制在预定义数量的可能类别(字母、单词甚至句子),这与目标是自然语音的连续唇读形成对比。最近生产连续唇读系统的尝试集中于基本语言结构,例如字符或音素。因此,不足为奇的是,ALR 系统目前的主要挑战是能够模拟连续的唇读系统。
这个博客是为机器学习领域创建简化介绍的努力的一部分。点击此处的完整系列
在你一头扎进去之前就知道了
medium.com](https://medium.com/@prakhargannu/machine-learning-simplified-1fe22fec0fac)
或者干脆阅读系列的下一篇博客
看看人类姿势估计的世界
towardsdatascience.com](/human-pose-estimation-simplified-6cfd88542ab3)
参考
[1]费尔南德斯-洛佩兹、阿德里亚娜和费德里科-苏克诺。“深度学习时代的自动唇读调查。”图像与视觉计算(2018)。
【2】钟,俊儿,和安德鲁·齐塞曼。"通过看视频学习唇读单词."计算机视觉与图像理解 173(2018):76–85。
3 K.L. Moll,R.G. Daniloff,言语过程中帆运动时机的研究,J. Acoust。社会主义者我是。50 (2B) (1971 年)
自动化机器学习
自动机器学习(AutoML)目前是数据科学中爆炸性的子领域之一。对于那些不精通机器学习的人来说,这听起来很棒,对于当前的数据科学家来说,这很可怕。媒体对 AutoML 的描述让它看起来能够彻底改变我们创建模型的方式,不再需要数据科学家。虽然一些公司如 DataRobot 的目标是完全自动化机器学习过程,但该领域的大多数公司都在创建 AutoML 作为一种工具,以增加当前数据科学家的产量,并简化进入该领域的过程,使其更容易获得。
AutoML 作为一个完全自动化过程的工具,在理论上是一个很好的想法,但是在现实世界中,它引入了许多偏见和误解的机会。在过去的几年里,机器学习领域已经开始脱离“黑盒”模型,转而使用更简单、更容易解释的模型。复杂的模型可能难以解读,因此很难知道模型何时引入了偏差。AutoML 现在加剧了黑盒模型的这个问题,它不仅隐藏了模型的数学,还在后台执行以下操作:
- 数据清理
- 特征选择
- 型号选择
- 参数选择。
随着以上所有的自动化,使用这些系统的人还剩下什么呢?除了获取数据集和读取结果,什么都不做。这种程度的自动化给我们的模型和解释它们的人都带来了潜在的问题。在学习成为数据科学家的过程中,有三件事变得尤为重要。
- 模型的好坏取决于给定的数据,如果数据有缺陷,模型很容易产生偏差。
- 机器非常擅长最大化人类给定的目标函数,无论该目标函数是否准确或正确。
- 学习数据科学的很大一部分是为了理解模型的算法及其结果,如果没有这方面的知识,很容易对模型结果做出不正确的推断。
在过去的几年里,我们已经看到了许多关于流通模型的报告,这些模型不断地做出不正确的/有偏见的预测。如果现实世界中存在偏差,那么如果在模型中没有对其进行适当的考虑,这种偏差很容易增加。如果我们用 AutoML 来完全自动化这个过程,可能弊大于利。然而,完全自动化只是少数公司研究人员的目标,还有一个方面可能会使社区受益匪浅。
我看了 Randall Olsen 在 Scipy 2018 的演讲,自动机器学习的过去、现在和未来。在他的演讲中,他强调 AutoML 不是为了取代数据科学家,而是像我上面所说的那样,是为了提高当前数据科学家的生产力,让那些多年来没有研究这些算法的人更容易进入这个领域。

Source: SemanticsScholar.org
作为一名数据科学家,我可以使用这些应用程序快速浏览我的数据,并了解如何开始建模。AutoML 不会告诉我使用哪个模型,而是让我知道什么模型和技术是有效的,节省了我花在探索性数据分析和数据清理上的时间,而这些时间可以花在微调模型上。一个例子是 TPOT,由上位实验室创建,这是一个基于 Scikit-Learn(一个非常流行的机器学习库)构建的 Python 自动语言库。其设计旨在快速运行数据分析,并让您知道哪些模型、功能和参数比其他更有效。

Source: https://epistasislab.github.io/tpot/
TPOT 应该被看作是一个起点或一个比较模型,而不是一个最终产品。它打开了思路和技术,以我们可能没有想到或没有时间深入探索的方式接近我们当前的数据集。可以想象,这些算法具有非常复杂的样本空间/模型,数据集越大,使用的算法越复杂,情况就越复杂。使用非常高级的算法来导航该样本空间,包括:
- 元学习
- 贝叶斯优化
- 遗传表演程序
- 多臂强盗
因为它们非常复杂,所以运行时间非常长,根据问题的不同可能需要几天时间。这只是加强了 AutoML 将被用作帮助数据科学家的工具的想法,因为这些算法可以在后台运行,而我们则在项目的其他方面工作。在接下来的几年里,这些工具将继续改进,但它们不会取代数据科学家。相反,它们将增强我们所能完成的,并允许机器学习随着该领域变得越来越容易接近而发展。
我想看看这些 AutoML 库是如何运行的,所以我按照 Randall Olsen 演讲中的代码,在 MNIST 数据集上运行 TPOT,这是一个包含数字的图像数据集。这只需要 9 行代码,我就可以达到 98%的准确率。


TPOT 能够使用欧氏距离确定 K 个最近邻,K =1 是分类 MNIST 数据集的最佳算法。虽然这种方法快速、简单且准确,但不需要理解它在做什么或告诉我们什么。失去了这一点,我们就失去了对模型的所有解释,也失去了决定我们为什么会得到这些数字的能力。
引用作品:
https://www.youtube.com/watch?v=QrJlj0VCHy
面向数据分析师和业务用户的自动化机器学习
增强人工智能——机器学习
在不到五分钟的时间内构建您的第一个机器学习模型。

Automated Machine Learning for Business Users & Data Analysts
***Automated Machine Learning (AutoML) represents a fundamental shift in the way organizations of all sizes approach machine learning and data science.***
机器学习是人工智能的一个分支,基于这样一种想法,即系统可以从数据中学习,识别模式并在最少的人工干预下做出决策。机器学习为我们在各个行业提供了一些重大突破。金融服务、零售、医疗保健、银行等领域一直在以这样或那样的方式使用机器学习系统,结果非常有希望。
今天的机器学习不仅仅局限于 R&D,而且已经渗透到企业领域。然而,传统的机器学习过程严重依赖于人类,并不是所有的企业都有资源投资于经验丰富的数据科学团队。即使公司拥有资源、数据科学家和工程师,这些专业人员也不得不每月花费数百个小时来构建和维护这些机器学习系统。
我们的研究还表明,当前大多数数据科学家缺乏领域专业知识,因此需要与不同部门的专业人员合作来解决特定问题,例如,预测哪些客户更有可能购买产品。这些部门代表是具有更深层次业务知识和分析技能的专家,但缺乏预测分析技能,特别是机器学习。
***Automated ML democratizes the machine learning model development process, and empowers its users, no matter what their data science expertise is, to identify an end-to-end machine learning pipeline for any problem***
自动化机器学习正在催生公民数据科学家,因为它使在现实世界中构建和使用机器学习模型变得更加容易,而无需编写代码。自动化机器学习融合了来自顶级数据科学家的最佳机器学习实践,最先进的开源库,使机器学习和数据科学在整个组织中更容易获得。
以下是传统的模型构建过程:
图一:

Traditional Machine Learning Model Building Process
从上面的图 1 可以看出,用传统流程开发一个模型是极其耗时、重复和繁琐的。自动化机器学习应用程序自动执行通常需要熟练的数据科学家才能完成的模型构建任务。自动化机器学习系统不是花费几周或几个月的时间,而是快速的,通常需要几天时间让业务用户/数据分析师建立数百个模型,进行预测并产生见解。数据分析师的机器学习自动化使组织能够事半功倍。
AutoML 使医疗保健、金融科技、银行等行业的企业有可能利用先进的机器学习和人工智能技术,这些技术以前仅限于拥有大量资源的组织。通过自动化大多数机器学习建模任务,AutoML 使业务用户和数据分析师能够轻松实现机器学习解决方案,并更加专注于解决复杂的业务问题。
跨行业的数据分析师和业务用户可以使用自动化机器学习来:
***1\. Implement ML-powered solutions without extensive programming knowledge***
***2\. Save time and resources***
***3\. Leverage data science best practices***
***4\. Agile problem-solving***
自动化机器学习是如何工作的?
有许多工具,每个都有自己的内部功能,但我们将只关注 m trons dp2——一种内置数据准备和 AutoML 库的新型应用程序。
通过使用非常直观的 Web 用户界面,用户可以通过五个简单的步骤构建新的项目和运行 ML 实验。
***1\. Identify the use-case: predict demand, customer churn or credit card fraud***
***2\. Identify the ML problem type: Regression, Classification or Time-Serices***
***3\. Upload your data or connect your data source***
***3\. Choose your target variable (the variable you want to predict)***
***4\. Train & evaluation 100s of machine learning algorithms****
***5\. Deploy the best performing algorithm and make predictions*****
- mltrons 自动机器学习管理最先进的库,如 AutoKeras、PyTorch、TensorFlow、H2O、TPOT、Caffe、SageMaker 和 AlphaD3M,以建立最适合数据的模型。Mltrons 内置了支持深度学习的 GPU。

Available libraries within the mltrons framework
** mltrons AutoML for data analysts 允许他们使用“假设”情景模拟器来创建多种结果的策略。这填补了数据分析师/科学家和执行决策者之间的空白。
一切从今天开始!
这是为了快速产生价值,尽可能多地承担你能处理的小项目。借助自动化机器学习,数据分析师可以开始构建机器学习模型,并将他们的技能提升到一个新的水平。另一方面,企业可以获得多项成功,并在更短的时间内完成其组织内的多个使用案例,这将形成势头,并使迭代和扩展数据货币化成为可能。
关于作者
Raheel Ahmad 是 mltrons 的首席执行官和联合创始人。你可以在推特、脸书和 LinkedIn 上和他联系。
自动化机器学习:到底有多少?
我对三位数据科学家和指导自动化专家的采访

Landing page of the Guided Automation web application
目前有很多关于自动机器学习的讨论。也有很高程度的怀疑。
我和数据科学家 Paolo Tamagnini 、 Simon Schmid 和 Christian Dietz 在一起,从他们的角度就这个话题问了几个问题,我发现引导自动化的概念也很有趣,因为它直接涉及自动化机器学习的实践。
Rosaria Silipo: 什么是自动化机器学习?
Christian Dietz: 自动化机器学习是指构建一个系统、流程或应用程序,能够在尽可能少的人工输入下自动创建、训练和测试机器学习模型。 CRISP-DM 周期是在近 20 年前引入的,现在是一个具有标准步骤的既定流程,如数据准备、功能工程和功能优化、模型训练、模型优化、模型测试和部署,这些步骤在大多数数据科学项目中都很常见。自动化的目的是尽可能地从这些步骤中去除人工干预。
有不同的算法和策略可以做到这一点,这些算法和策略因复杂性和性能而异,但主要思想是让业务分析师能够训练大量模型,并通过少量配置提供最佳模型。
我们通常只谈论自动化机器学习,但它实际上是将自动化融入尽可能多的循环步骤中——而不仅仅是模型的训练/选择。例如,自动化数据争论或数据可视化的应用程序也开始出现。
Rosaria: 在没有专家干预的情况下,自动化机器学习真的可以完全自动化数据科学周期吗?
西蒙·施密德:这是个棘手的问题!有人说能,有人说不能。
在我看来,对于标准的数据科学问题,自动化机器学习可以完全自动化数据科学周期。你知道这种情况:你有一些数据,这些数据很一般,很好地描述了问题,没有不平衡的类。你选择一个模型,在训练集上训练它,在测试集上评估它。如果性能可以接受,就部署它。没有大的意外。在这种情况下,整个循环可以自动化,甚至引入一些额外的优化步骤。
然而,更复杂的数据科学问题可能需要一定程度的人工或专家的参与。
例如,领域专家可以在继续机器学习过程之前添加一些关于数据处理和过滤的独特知识。此外,当数据领域变得比简单的表格数据更复杂时,例如,包括文本、图像或时间序列,领域专家可以为数据准备、数据划分和特征工程提供定制技术。
基本上,你的问题的答案是“有时”正是因为这个原因,我们的团队使用了一个允许两种选择的框架。您可以运行一个完全自动化的周期,或者您可以决定在过程中的选择点进行干预。这是通过一个叫做引导分析的特性提供的功能。Guided Analytics 允许您在工作流中散布交互点,从而在需要时将数据科学应用转向不同的方向。
罗萨莉亚:你已经描述过了,但是我想我们的读者会从一些额外的细节中受益。你能告诉我们更多关于引导式分析的信息吗?
Paolo Tamagnini :引导式分析是指在数据管道中灵活地添加交互点,即在分析过程中数据经过的一系列步骤之间。当你开发一个数据处理或数据分析应用程序时,你不仅仅是为自己开发,也是为其他人开发。因此,为了让任何人都有机会调整分析如何进行,您应该在整个管道的战略位置添加一些交互点。
数据管道也称为工作流,交互点是网页,通过包装的元节点无需任何脚本即可轻松创建。例如,在报告应用程序中,您可以请求用户选择要显示的时间窗口或 KPI 在数据争论应用程序中,你可以询问哪些数据源应该混合在一起,应该构建什么样的特性;在机器学习应用中,您可以要求用户指定目标变量和输入变量、应训练的模型以及是否需要执行特征工程。
Rosaria: 所以,引导自动化是你对自动化机器学习应用的解释。你能简单描述一下它是如何工作的吗?
克里斯蒂安: 引导式自动化是将引导式分析与自动化机器学习相结合的产物。您可以灵活地要求业务分析师在必要的时候加入他们的专业知识,从而自动化分析的标准部分。自动化和交互的适当数量取决于不同的问题。有时,您可以继续使用默认的选择,而有时您需要进一步的输入来改进和控制这个过程。
自动化机器学习应用的引导式分析中的常见交互点是上传数据和选择目标的时间,指定哪些特征将用作输入和训练哪些模型,而自动化主要涉及超参数优化和特征选择。您还可以添加可选的交互点,例如定制功能工程或选择定制可伸缩性的执行环境。
该流程包括自动化和交互点,如下图所示。在为引导式自动化实现蓝图工作流时,我们遵循了这个图表中的一般方法。

Image Credit: KNIME
Rosaria: 这个引导自动化的蓝图…这个蓝图是我可以购买的软件解决方案吗?
保罗:买?不,是免费的!就像我们在使用的所有示例和蓝图工作流一样。你所需要做的就是下载一个开源副本,启动它,打开实例服务器,在 50 _ Applications/36 _ Guided _ Analytics _ for _ ML _ Automation 找到蓝图,拖放到你的本地工作区,然后你就可以在你自己的数据上自动化机器学习过程了。请随意定制它。它最终是一个蓝图,您可以根据您的数据科学问题对其进行改进和定制,以实现最佳性能。
罗莎丽亚:不错!我需要特殊的软件来正确运行引导自动化的蓝图吗?
绝对不行。在 KNIME Server 上,您可以从任何 web 浏览器远程访问交互点,这非常有用。但是使用开源和免费的分析平台,您还可以运行蓝图,访问交互点,并通过客户端内置的 web 浏览器与工作流进行交互。
Rosaria: 在哪里可以学习如何定制引导式自动化的蓝图?
一般来说,你可以从免费的电子学习课程开始。在那里,您可以了解更多:如何访问数据,如何执行 ETL 操作,以及如何显示绘图和图表。
感谢 Christian、Paolo 和 Simon 的宝贵时间和清晰的回答!现在我更了解自动化机器学习的一般概念,引导式分析,以及您创建的蓝图,引导式自动化。
为首次发表于data versity。
自动电影标记——一个多类分类问题
从电影概要中自动提取标签的多类分类问题。

Photo by: Kyle Hinkson on Unsplash
电影标签揭示了关于电影的各种各样的异质信息,如类型、情节结构、配乐、元数据、视觉和情感体验。这些信息对于构建自动系统来为电影创建标签很有价值。
自动标记系统也有助于推荐引擎改进相似电影的检索,以及帮助观众预先知道对电影的期望。
在这篇文章中,我们将使用广泛的机器学习算法和 NLTK 功能从电影概要中挖掘出电影标签。所以让我们开始吧!
数据来源
我们在本案例研究中使用的数据是从 Kaggle 中的数据集收集的,该数据集包含超过 14k 部电影和大约 142 个独特的标签。
我们来看看数据:

从上表中,我们可以看到每部电影都有概要和与之对应的几个异构标签。此外,数据是从 IMDB 和维基百科收集的。
探索性数据分析
首先,我们尝试从数据集中删除重复项并进行分析:
- 每个问题的标签数。
- 最常见的标签。
- 数据集中标签的频率。
每个问题的标签数量:-

在进行了一些计算后,我们发现大多数电影都有一个标签。每部电影的平均标签数为 2.99。
最常用的标签:-
为此,我们将绘制一个单词云并将其可视化。

标签的频率:-

在分析了上述 EDA 之后,我们得出结论,一些电影有大量的标签,但大多数电影只标记了一两个标签。谋杀、暴力、倒叙和浪漫是语料库中出现频率最高的四个标签。最不常用的标签是愚蠢,聪明,感觉良好,幽闭恐惧症。
情节提要的清理和预处理
现在,我们已经完成了重复数据删除,我们的数据需要一些预处理,然后才能继续分析和建立预测模型。
因此,在预处理阶段,我们按以下顺序执行以下操作
- 从移除 HTML 标签开始
- 删除任何标点符号或有限的一组特殊字符,如、或。或者#,等等。
- 检查单词是否由英文字母组成,并且不是字母数字
- 检查单词的长度是否大于 2(据调查,没有两个字母的形容词)
- 将单词转换成小写
- 移除停用词
- 单词被词汇化——第三人称的单词被改成第一人称,过去时态和将来时态的动词被改成现在时态。
- 最后,雪球用词干这个词(据观察,它比波特用词干要好)
现在,我们已经对标签分析有了简单的了解,并在更大程度上清理了我们的情节概要,让我们开始真正有趣的部分。
利用情节概要预测标签的机器学习方法
最重要的工作是将数据分成训练集和测试集。集合的训练部分将用于训练模型。我们使用测试部分交叉验证并测试训练好的模型。为此,我们根据文本语料库中给定的列split拆分数据。
x_train=new_data.loc[(new_data['split'] == 'train') |(new_data['split'] == 'val')]
x_test=new_data.loc[(new_data['split'] == 'test')]
接下来,我们定义随机基线模型来比较我们提出的模型在预测电影标签的任务中的性能。基线模型将所有标签分配给所有电影。
但在继续之前,让我们先了解几个术语:
Pipeline 类允许将多个进程粘贴到单个 Scikit-learn 估计器中。我们将在开始部分使用相同的。
OneVSRest 分类器 ,对于每个分类器,该类与所有其他类匹配。
计数矢量器 提供了一种简单的方法,既可以标记一组文本文档,构建一个已知单词的词汇表,还可以使用这个词汇表对新文档进行编码。
tfidfttransformer将计数矩阵转换为归一化的 tf 或 tf-idf 表示。CountVectorizer 和 TfidfTransformer(use _ IDF = False)都产生词频,TfidfTransformer 正在对计数进行规范化。
A 宏观平均 计算 精度 , 召回 和f1-独立地为每个类评分 ,然后取平均值(因此平等地对待所有类),而 微观平均 将聚集所有类的贡献来计算平均度量。在多类别分类设置中,如果您怀疑可能存在类别不平衡(例如,一个类别的示例可能比其他类别的多得多),微平均值是更好的选择。
所有上述术语需要更广泛的解释,但那是另一天的故事。
由于这是一个多类分类问题,我们将上述模块用于我们的基线和特征工程(将在下面讨论)模型。
Micro-average quality numbers
Precision: 0.1586, Recall: 0.3639, F1-measure: 0.2209
Macro-average quality numbers
Precision: 0.0733, Recall: 0.1752, F1-measure: 0.0969 precision recall f1-score support
avg / total 0.20 0.36 0.25 9020
我们观察到该模型在只有 25%的微观 f1 分数的情况下表现不佳。让我们尝试使用 网格搜索 超参数调整建立另一个模型。我们将使用逻辑回归和 oneVSRest 分类器作为我们的分类算法。
vectorizer = CountVectorizer(min_df=0.00009, max_features=50000, tokenizer = **lambda** x: x.split())
vectorizer.fit(x_train['preprocessed_data'])
x_train_multilabel = vectorizer.transform(x_train['preprocessed_data'])
x_test_multilabel = vectorizer.transform(x_test['preprocessed_data'])
网格搜索交叉验证:
0.10172648121582308
{'estimator__alpha': 1e-05}
我们现在使用网格搜索得到的最佳超参数1e-05建立模型。
Micro-average quality numbers
Precision: 0.0678, Recall: 0.3704, F1-measure: 0.1146
Macro-average quality numbers
Precision: 0.0471, Recall: 0.3029, F1-measure: 0.0717
precision recall f1-score support
avg / total 0.16 0.37 0.21 9020
我们观察到我们的基线模型仍然没有改进。我们使用不同的模型进行了一些其他的实验,我们可以得到以下结果。

特征工程
现在,为了提高模型的性能,非常需要特征工程。在进行特征工程之前,我们考虑的参数是:-
- 提取单词 n-grams (n=1,2,3)
- 字符 n 元语法(n=3,4)
- 跳过 n 元语法(n=2,3)
我们在情节概要上执行所有上述操作,因为它们是强词汇表示。我们使用术语频率-逆文档频率(TF-IDF)作为加权方案。
我们在上面已经看到,每个大纲的标签分布并不均匀。有些大纲有 20 个标签,而有些只有 1 个标签。但是平均来说,每个大纲的标签数量是 2.9 个(见 EDA)。所以我们会考虑每个情节大纲 4 个标签,并进行我们的操作。
vectorizer = CountVectorizer(tokenizer = **lambda** x: x.split(','), binary='true', max_features = 4)
multilabel_y_train = vectorizer.fit_transform(y_train)
multilabel_y_test = vectorizer.transform(y_test)
什么是 n-gram,uni-gram,bi-gram,tri-gram?
在计算语言学和概率领域,n 元语法是来自给定文本或语音样本的 n 个项目的连续序列。使用拉丁数字前缀,大小为 1 的 n-gram 被称为“unigram”;尺寸 2 是一个“二元组”(或者,不太常见的是,“二元组”);大小 3 是一个“三元组”。 ( 维基 )
Unigram
0.4297968028569633
{'estimator__alpha': 0.001}
注:- SGDClassifier与log的损失是的 Logistic 回归。现在让我们来构建 unigram 模型。
Micro-average quality numbers
Precision: 0.3311, Recall: 0.6079, F1-measure: 0.4287
Macro-average quality numbers
Precision: 0.3223, Recall: 0.5954, F1-measure: 0.4118
precision recall f1-score support
0 0.20 0.54 0.29 308
1 0.25 0.53 0.34 507
2 0.48 0.64 0.55 844
3 0.36 0.68 0.47 552
micro avg 0.33 0.61 0.43 2211
macro avg 0.32 0.60 0.41 2211
weighted avg 0.36 0.61 0.44 2211
我们观察到模型的 f1 值、精确度和召回率都有显著提高。类似地,我们通过改变ngram_range=(2,2)、三元组ngram_range=(3,3)和ngram_range=(1,3)对二元组执行相同的操作。我们观察到所有的模型都比我们的基线模型表现得更好。一旦我们建立了所有的 n 元模型。我们组合这些特征,并在其上运行我们的分类器。
单字+双字+单字
有一个非常好的方法来组合 Scipy 提供的稀疏矩阵,称为hstack或水平堆叠。我们将使用相同的来组合我们的特征。
**from** **scipy.sparse** **import** coo_matrix, hstack
train_1 = hstack((x_train_multilabe_uni, x_train_multilabe_bi),format="csr",dtype='float64')test_1 = hstack((x_test_multilabel_uni, x_test_multilabel_bi),format="csr",dtype='float64')train_2 = hstack((train_1, x_train_1),format="csr",dtype='float64')
test_2 = hstack((test_1, x_test_1),format="csr",dtype='float64')
型号:
Micro-average quality numbers
Precision: 0.3509, Recall: 0.6065, F1-measure: 0.4446
Macro-average quality numbers
Precision: 0.3358, Recall: 0.5894, F1-measure: 0.4232
precision recall f1-score support
0 0.21 0.55 0.30 308
1 0.28 0.47 0.35 507
2 0.48 0.67 0.56 844
3 0.38 0.68 0.48 552
micro avg 0.35 0.61 0.44 2211
macro avg 0.34 0.59 0.42 2211
weighted avg 0.37 0.61 0.46 2211
我们看到性能再次提高。但是,让我们再深入一点,看看我们能否将 f1 分数提高到 50%以上。
字符 3 克
char n-gram 是来自给定文本或语音样本的 n 个字符的连续序列。在 Char 3-gram 特征化过程中,我们所做的唯一改变是将analyzer = 'char'作为矢量函数的一个参数。
vectorizer = TfidfVectorizer(sublinear_tf=**True**, strip_accents='unicode', analyzer='char', ngram_range=(3, 3), max_features=20000)
x_train_3char = vectorizer.fit_transform(X_train)
x_test_3char = vectorizer.transform(X_test)
同样,我们继续进行网格搜索和建模。
Micro-average quality numbers
Precision: 0.3567, Recall: 0.6680, F1-measure: 0.4651
Macro-average quality numbers
Precision: 0.3408, Recall: 0.6407, F1-measure: 0.4418
precision recall f1-score support
0 0.22 0.52 0.31 308
1 0.28 0.62 0.38 507
2 0.49 0.74 0.59 844
3 0.38 0.68 0.49 552
micro avg 0.36 0.67 0.47 2211
macro avg 0.34 0.64 0.44 2211
weighted avg 0.37 0.67 0.48 2211
我们也对 Char 4-gram 执行相同的操作,但是放置analyzer =char ngram_range = (4,4),我们得到下面的结果。
precision recall f1-score
weighted avg 0.39 0.65 0.49
我们接近 50%的 f1 分数。我们还试图通过结合 char 3 和 char 4-gram 特性来构建一个模型,但是这个模型并没有显示出任何显著的改进。
我们在上面做 EDA 时已经看到,每个大纲的平均标签数是 2.9。所以现在我们会考虑每个剧情梗概 3 个标签。让我们看看我们能否让性能超过 50%大关。
带 3 个标签的型号
像往常一样,我们从类标签的二进制矢量化开始,这次有 3 个类。
vectorizer = CountVectorizer(tokenizer = **lambda** x: x.split(','), binary='true', max_features = 3)
multilabel_y_train = vectorizer.fit_transform(y_train)
multilabel_y_test = vectorizer.transform(y_test)
正如上面解释的模型,我们建立了一元,二元,三元模型,但它们的行为与我们的 4 类标签模型相同。然后我们尝试了角色级别的模型,嘣!!该车型的性能超过了 f1 得分的 50%。
对于使用 3 个类级别的 char 3-gram,我们得到了以下结果。
precision recall f1-score support
0 0.28 0.58 0.38 507
1 0.50 0.73 0.59 844
2 0.39 0.63 0.48 552
micro avg 0.39 0.66 0.49 1903
macro avg 0.39 0.65 0.48 1903
weighted avg 0.41 0.66 0.50 1903
类似地,对于 char 4-gram:
precision recall f1-score support
0 0.29 0.61 0.40 507
1 0.49 0.74 0.59 844
2 0.41 0.68 0.51 552
micro avg 0.41 0.69 0.51 1903
macro avg 0.40 0.68 0.50 1903
weighted avg 0.42 0.69 0.52 1903
总结和观察

结论和后续步骤:
- 我们最初建立了基线模型。基线模型的主要问题是地块概要不平衡,每个概要的标签数量变化很大。
- 在 EDA 中,我们观察到平均每部电影有 2.9 个标签。所以我们确实选择了 4 个标签和 3 个标签建立了 2 套模型,并对它们进行了很大程度的分析。
- 在 4 标签模型(3char + 4char gram)的情况下,模型表现最佳,微 f1 分数为 49%,这与基线模型相比有显著提高。
- 在 3 标签模型的情况下,再次(3 察尔+4 察尔克)模型表现最佳,微 f1 分数为 51%,这也是从基线模型的显著增加。
- 有一点我注意到,我的模型比他们在研究论文中使用的模型表现得更好,这是一个令人满意的问题。
- 最后,我也使用了语义向量,如 word2vec、手套向量和潜在狄利克雷分配(LDA)来进一步改进我的模型,但它们没有多大帮助。
源代码可以在我的 Github repo 上找到。我期待听到任何反馈或问题。
****研究论文:https://arxiv.org/pdf/1802.07858.pdf
自动化研究及其他:人工智能的进化
你很快就能向机器解释一个研究问题,并得到相应的答案。

欢迎来到演播室…一个装载栏在屏幕上移动……系统扫描你的脸……一个略带东德口音的声音说道:
“早上好,今天你想做什么?”
自 2025 年以来,类似的解决方案在研究界掀起了一场风暴。承诺非常简单;解释你的机器——例如,笔记本电脑或智能手机——研究问题,机器会找到答案。
你首先解释说,你对了解晚期宫颈癌患者死亡率的相关因素感兴趣。
“你想让我从一篇文献综述开始吗?”
每月都有数百篇关于宫颈癌的新论文发表。在自动化研究系统出现之前,研究人员已经放弃了对所有主题进行全面文献综述的尝试,但最新发表的文章数量仍然允许的最小众的主题除外。在过去的 12 个月中,标题中提到“宫颈癌”的论文总共约有 10,000 篇,而这只是潜在相关文章的一小部分。在世纪之交,我们已经失去了包含在某一特定主题的著作纲要中的集体智慧的轨迹。
你决定接受文献综述。
“我应该提供全面的结论还是要点?结论将把你的设备的预计到达时间从大约 3 分钟缩短到几天。对于 300 美元的云计算预算,我们可以将得出结论的预计时间减少到大约一个小时。”
你决定从高光开始,这样你在几分钟后就会看到一些东西。
“收到,我们开始吧?”
你确认后,机器就开始工作了。

自动化文献综述
这台机器能找到几百万篇潜在相关的科学文章。一些文件调查和讨论研究主题。其他人通过引用、作者和其他因素与主题有着有意义的联系。有些信号对人类来说没有意义,它们是隐藏在文章内容深处的潜在倾向,以及其他方面,与其他文章形成微妙的联系。有时最强的联系来自令人惊讶的不同话题。先进的机器智能能力是实用性和惊喜之间的平衡。结果需要几分钟才能出来,尽管事实上一切都发生在不到 1000 美元的平板电脑上。你可以用你的智能手机,这不会花太多时间。
“结果可在您的设备上获得。”
你拿起你的设备,在你打开一个易于阅读的交互式文献综述的发现摘要之前。到 2000 年人类无法完成的事情,任何人都可以在喝杯咖啡的时间内完成。
机器智能的参数化
到 21 世纪 20 年代早期,研究人员已经完全参数化了计算机辅助研究的基本方面。非常粗略地说,基于机器智能的决策系统涉及数据的收集和准备、模型的选择、优化和测试,以及验证和管理最终的解决方案。构成使用数据回答研究问题的各个阶段的所有单个活动,都经过精心规划和参数化,达到了允许所有这些过程完全自动化的程度。

直到最近几年,数据科学家通常将一半的时间用于所谓的 ETL 活动——提取、转换和加载数据——没有人再做数据准备了。机器会以人类无法想象的方式来做这件事,在决定最佳输入数据是什么样子之前,会经历大量不同的变化。机器也可能决定使用相关的公共数据,以努力获得研究问题的最佳结果。
一旦所有涉及的过程都按照它们所包含的参数清晰地表达出来——这只是一个时间问题,而不是像一些人认为的那样是一个可行性问题——自动化相关的过程就成了一个简单的工程问题。没有什么新东西需要构建,所有东西都可以通过已有的开源包获得。人们只需要以创建新的、完全自动化的工作流的方式来组合这些功能。一旦工作流实现自动化,几个人工智能研究小组就明白,为了更好地利用机器智能的承诺,采取更平衡的系统开发方法至关重要。尽管几十年来,诸如新的神经网络架构之类的能力开发受到了研究人员和开发人员的极大关注,但是交互和治理在很大程度上被忽略了。

回到 2020 年,互动和治理方面涉及许多至关重要的未解决问题;例如减少使用通用机器智能 API 所涉及的认知开销,以及人工智能安全性和伦理。这种三大支柱之间的平衡转变引发了创造自动化研究的竞赛。
超越一般性
人工智能的大问题——通用性,在 2020 年之前的几年里已经被 TensorFlow 和 Pytorch 等解决方案解决了。事实上,普遍性到 2015 年已经解决了,没有人只是清楚地知道它已经发生了。TensorFlow 等平台允许精通计算机的研究人员为几乎任何研究问题创建解决方案。随着这些平台的成功,出现了第一个机器智能解决方案 API,例如 Keras 和 fast . ai。解决方案 API从根本上简化了研究人员解释他们正在寻找的解决方案的方式。深度学习解决方案 API将数百行陈旧的计算机代码简化成一个类似儿童玩乐高积木的过程。

解决方案 API没有解决的问题,与人类几十万年来的交流方式有关。我们更擅长用文字来解释一个研究问题,而不是用计算机代码来描述解决方案。接下来,显而易见的进展涉及到自 1962 年所有演示之母以来,人类与信息系统交互方式中最重要的范式转变。这个转变就是问题 API。
问题 API
机器智能领域的重大突破并不是来自新的深度学习模型架构,或者该研究领域关注的任何东西。相反,这是一个安静而艰难的缓慢过程,重点是人类与机器的交互方式。结果就是第一个问题 API。在 2030 年的今天,仍然有很多解决方案 API,但是研究人员很少使用。相反,解决方案 API是问题 API的构建模块,就像差异化引擎是解决方案 API的构建模块一样。问题 API 的想法非常简单;几千年来,研究过程一直专注于提出问题(陈述问题),然后通过严格的过程,找到答案。回想起来,很明显,未来的研究将遵循相同的已被证实的范式。此外,用人类语言表达问题的能力极大地扩大了受益于机器智能发展的研究人员和其他人的数量。

到 2020 年,超过一百万的研究人员在科学和工业的几乎所有可以想象的领域使用解决方案 API。经过 50 多年的神经网络研究和发展,人工智能终于起飞了。
尽管如此,机器仍然依赖于人——通过编程或拖放构建器——来清晰准确地表达解决方案。机器解决给定问题的能力在很大程度上依赖于高技能的人给它如何做的精确指令。指导解决方案 API需要理解专业语言、统计函数和许多其他复杂的事情。一些这种复杂性被带到了第一个问题 API 中;为了充分利用系统的优势,仍然需要适度的技术知识。
声音革命
语音理解和合成方面的发展最近使得除了语音之外不使用任何东西与机器进行有意义的交互成为可能。语音消除了复杂控制的需要,这种控制使高技能的 0.1%和世界其他人口之间的鸿沟永久化。

解决方案 API 的出现及其与语音技术的融合使能够使用最先进人工智能的人数从 2020 年的几百万人增加到 2030 年的几亿人。一个前所未有的科学发现、创新和人类创造力的时代开始了。
自动化研究人员及其他
2030 年,离真正的自动化研究者还有一段路要走。人类研究人员相信,根据我们今天所知道的一切,不出五到十年,基于机器智能的系统就会让 21 世纪初的数据科学家角色变得多余。未来的路线图现在还包括一个自动化研究人员的伪自主版本。

自动化研究人员是伪自主研究系统的先驱,伪自主研究系统不仅能够测试假设,还能够获取已执行研究的结果,并基于发现制定新的假设。这意味着该系统能够无止境地横向和纵向探索研究主题。虽然自主系统的前提很简单——系统的输出需要是同一系统可接受的输入——但在自主研究系统在回答人类最紧迫的问题方面发挥重要作用之前,仍需要做很多工作。

最终,自主研究系统将能够发现全新的科学领域。没有人能够准确地说出发展需要多长时间才能达到这一点。一旦与假设测试相关的流程变得成熟,假设公式的工作无疑会加速,就像我们看到的第一个解决方案 API和第二个问题 API 一样。至少在 2032 年之前,我们的研究一直专注于系统从文献综述或定量数据分析中形成有意义的定性见解的能力。

一旦机器能够形成定性的见解,扩展基于可用答案形成新问题的能力——包括以前从未问过的问题——将只是一个时间问题。
点击了解更多关于 autonomi的信息。
点击此处,了解更多与人工智能相关的系统性风险。
如果你♥了这篇文章,请分享它。
如何建立一个自动化的股票新闻收集器
一步一步打造自动化机器!
使用 Python 摆脱无聊的东西(第 3 部分)

你厌倦了重复做同样的事情吗?
感觉你的生活只是一遍又一遍地做着同样的事情?
欢迎来到使用 Python 系列摆脱无聊的东西!请随意访问这个链接,你将能够看到这个正在进行的系列中的所有故事。
*如果您想申请任何网页抓取服务,请随时通过此链接告诉我。😃
要不,我们开始吧!
我将用一个案例来说明。在本案例研究中,我们需要从 SGX(新加坡证券交易所)网站下载文件,并将它们上传到指定的 google drive 文件夹中。
这是我将要分享的议程:
第 1 部分 —从 SGX 获取所有 PDF 文件的链接
第 2 部分—从上述提取的链接下载所有 PDF 文件
第 3 部分—将文件上传到 Google Drive
希望你会喜欢这个系列,让我们把手弄脏。
第一部分 —从 SGX 获取所有 PDF 文件的链接
快速浏览 SGX 网站
让我们看看显示公司新闻(链接)的 SGX 主页,如下面的快照 1 所示:

如果您点击标题列中的每个元素,您将被定向到显示相应新闻的详细信息的页面。
在该页面中,您可能会在页面底部找到一个链接来下载 pdf 格式的指定报告(以紫色框突出显示),如下面的快照 2 所示。

所以,我们今天的目标是下载所有最新的 pdf 文件并上传到 google drive。
开始刮
让我们浏览到 SGX 公司公告页面,查看该页面。如果你仍然不确定如何检查一个 html 页面,请参考这个链接以获得更详细的说明。

Snapshot 3
经过仔细检查,我们可以看到所有的新闻数据都是通过 api 调用获得的"?periodstart=…”(如快照 3 中突出显示的紫色框所示)。
在 inspect 面板的紫色框中,有一个我用黄色突出显示的框。从那里你将能够找到我们首先需要抓取的 url ,因为每个 url 都将引导我们到显示相应公司新闻的页面(这些页面的一个例子是 snapshot2)。

Snapshot 4

Snapshot 5
参考快照 4 中的紫色方框,API 的基础 url 是https://api.sgx.com/announcements/v1.0/?,之后呢?将是查询字符串参数。
什么是查询字符串参数?你可以把它看作是你需要添加到“?”后面的 url 的扩展查询满足条件的数据。我们这里以 2014 08 09 _ 16000(period start)为例。
20140809_16000 可以看成 date + '' + 16000,意思是我们可以把它改成我们需要的日期。反之亦然,对于 periodend ,可以查看为 date + '' + 155959。
例如,您想只抓取 2019-01-01 到 2019-02-01 的新闻,您可以将周期开始日期更改为 20190101,将周期结束日期更改为 20190201。
上面的代码首先将查询的开始日期初始化为今天的前一天,将查询的结束日期初始化为今天。通过将它们附加到 base_url,我们可以获得今天的公司公告。注意,我们将收到的数据是 JSON 格式的。因此,通过将 JSON 作为参数直接传递给pd.DataFrame(),我们可以直接将数据从 JSON 格式转换成 pandas dataframe。接下来,过滤 dataframe,使其只包含我们感兴趣的股票的新闻,在我们的例子中,它是“LODHA DEVELOPERS INTERNATIONAL LIMITED”。
第 2 部分— 从上面提取的链接下载所有 PDF 文件
在得到多个公司公告链接后,我们就该下载所有需要的 pdf 文件了。

通过查看详细新闻信息页面,您会发现附件链接是在以下位置捕获的:
节点:a
属性:href
因此,通过使用 parser BeautifulSoup 并获取a标签的属性href中的值,您将能够获得 pdf 的链接。现在,要在指定的 URL 上下载 pdf 文件,我们只需要获取响应的内容,并将其输出到 pdf 格式的文件中。
*注意wb的用法,因为我们将获得的 URL 上的 pdf 内容是二进制格式的,我们需要让 Python 知道我们要将二进制内容写入输出文件。此外,确保你的文件名有。pdf 作为扩展。
基于以上要点, def get_pdf() 函数负责将所有相应的链接下载到我的默认文件夹数据。简而言之,我将遍历熊猫数据帧,检索所有链接,然后下载我们需要的所有 pdf 文件。
在这里跟进,恭喜你!你只剩下最后一步了!
第 3 部分— 将文件上传到 Google Drive
首先,你应该通过这个链接获得你的 google drive 证书。
然后,将凭证文件名保存为 client_secret.json ,并将其放在 python 文件的同一个目录中。
接下来,复制上面的脚本,将current _ Google _ folder _ id填入你的目标文件夹 id。该脚本会将您的令牌保存到外部文件****mycreds . txt中,这样您就不需要每次运行该脚本时都在 google drive 上登录您的帐户。
上面的要点是首先获取当前 google 文件夹中的所有文件夹名称。然后,它将检查指定的股票名称的文件夹是否已经存在,如果不存在,它将创建一个文件夹,并使用股票名称命名。之后,将所有文件上传到与指定股票名称同名的文件夹中。
最后,它将删除数据目录中的所有文件,以保持本地数据文件夹的干净。
终于完成了!如果你从一开始就遵循所有的步骤,你将能够看到你的文件被上传到你的目标谷歌文件夹!

最终想法
非常感谢你一直读到故事的结尾,我真的希望你能从你的业务、日常工作等中受益。自动化对于释放你的时间非常重要,这样你就可以专注于完成其他工作。
欢迎在下面留下你感兴趣的话题的评论。我将在未来发布更多关于我的经历和项目的帖子。
关于作者
低魏宏是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,能够为你提供你所需要的准确和干净的数据。你可以访问这个网站查看他的作品集,也可以联系他获取抓取服务。
在媒体上阅读低纬鸿的作品。数据科学家|网络搜集服务:http://datainfinite.mystrikingly.com/…
medium.com](https://medium.com/@lowweihong?source=post_page-----b84d1e9ea595----------------------)**
自动估价模型——它如何在房地产行业发挥作用?
如果你要投资房地产,你会考虑的最重要的因素是什么?会不会是建筑的年龄,它的位置,或者它以前有多少业主?
虽然上述所有因素对你来说肯定很重要(尽管程度不同),但有一个普遍因素要么会成为交易的破坏者,要么会让你想要全押。
你已经猜到了——价格。
我们都大致了解是什么影响了房产的市场价值,对吗?那么,它实际上是如何计算的呢?
在这个时代,每个房产估价还需要“人的因素”吗——那么,一个在现实生活中考察房产的评估师?
在下面的帖子中,我们将了解什么是自动化估价模型,它是如何计算的,以及哪些行业在日常工作中应用 AVM。
什么是自动估价模型?
最简单地说,自动估价模型(也称为 AVM )是一个用来描述利用数学模型提供房地产价值的服务的术语。它最大限度地减少了亲自检查和审视市场上每一处房产的需要——就像过去(不久前)那样。

The real estate industry is a huge collection of data. AVM allows to make decisions faster and gives a better assessment of the situation.
AVM 利用所有类型的数据,如房龄和状况(我们将在本文中进一步讨论),并在几秒钟内生成报告。
现在,让我们仔细看看反车辆地雷考虑的是什么,它们能做什么,不能做什么。
自动估价模型的类型
目前市场上使用的反车辆地雷大致有 4 种。这些被称为:享乐、评税、价格指数和综合估价。
出于本文的考虑,让我们讨论后者(组合模型),因为它是最全面的,并且包含了上面的所有模型甚至更多。
复杂估价——计算方式
当一个复杂估价被用来提供一个财产的市场价格时,该软件检查:
- 最近的房契交易(房产已售出多少次)
- 该房产的最新价格(例如,当前所有者购买该房产的价格,以及考虑到自购买以来发生的所有因素,该房产可能获得或损失的金额)
- 类似物业的价格(hedonic 模型,即出售的类似物业的比较分析)
- 任何以前的估价——最重要的是,如果可能的话,税务评估员的估价指示。
正如您所看到的,这种类型的自动估价模型提供了可以由软件处理的所有客观数据的整体概述。
那么,这类报告的潜在局限性或矛盾之处呢?
自动估价模型—局限性
正如你可能已经猜到的,尽管近几十年来技术不断进步,但仍然有相当一部分是软件或人工智能无法做到的。AVM 不能考虑对人类评估者来说显而易见的事情。
例如,AVM 可能会根据一处房产的位置和之前的所有权来给它定价,但它本身并不知道任何潜在的细微差别,比如室内设计使用的材料质量差。
简而言之,在纸上(或屏幕上)好看的东西对人眼来说不一定是一样的。
现在,理解美学并不是 AVM 可能无法实现的唯一领域。
如果一个自动报告不能进行比较分析,也就是说,如果一个房产以前从未被出售过,那么它可能很难反映出房产的价格。
同样,如果一处房产是独一无二的,并且在记录中没有发现类似的情况,那么 AVM 就无法反映准确的价格。
在这种情况下,专业估价人员仍需要对房产进行实地考察或自己进行调查,以提供定制价格。
现在,考虑到以上所有问题,让我们讨论一下哪些行业和职业可以从 AVMs 中受益最多,为什么。
AVMs——行业细分
投资专业人士
一个非常突出的群体是投资公司或投资顾问,他们大规模使用 AVM。首先,他们应用 AVM 报告快速评估市场上的一处房产是否划算,或者仅仅是一个好的投资,考虑到其他因素,如类似房产的投资回报率。
另一方面,投资顾问可以利用 AVM 生成客户可能感兴趣的房产清单。在这个阶段不需要聘请房地产专家,他们可以提供一个更大的投资场所列表,而不是每个都必须亲自考察。
现在,正如你可能已经猜到的那样,AVM 对那些以出售房产为生的人来说同样具有吸引力。
房地产代理/房地产经纪人
当你求助于一家房地产中介来帮你找到梦想中的家时,你期望得到什么?当然是一份不错的潜在地点清单!
为了保持竞争力,房地产经纪人需要一种快速评估待售房产的方法。虽然他们可能仍然会在过程的后期使用评估器,但这可以最大限度地减少向列表添加位置之前的初始工作。更不用说,它给了那些有兴趣通过房地产代理出售一个地方的人一个真实的估价,他们实际上可以期望卖多少钱。
下一组?
贷款机构
类似于房地产机构,这些机构需要 AVM 计算当有人想采取抵押贷款对自己的财产。这是有效风险管理的关键——银行等贷款机构需要一种方法来快速验证他们的潜在客户是否有能力支持他们的贷款。
最后,但同样重要的是…
估价人/评估人
虽然反车辆地雷部分地从评估人员手中夺走了传统的任务,但现在它们也能使他们的工作更容易、更有效。如前所述,贷款机构、投资者和业主仍然聘请评估师来提供一个现实的价格,这个价格包含了即使是最先进的技术也隐藏不了的东西。
最后的想法
AVM 是一项非常有价值的技术,它改变了更多的行业,而不仅仅是与房地产交易直接相关的行业。鉴于其为房地产相关市场带来的时间节约和成本优化,可以预计在未来许多年内,资产负债管理系统仍将是不可或缺的。
在 Twitter 中自动收集# RickyRenuncia 下的图片
使用 Python 和 Twitter API

Source: https://cnnespanol.cnn.com/gallery/fotos-las-mejores-imagenes-de-las-protestas-en-puerto-rico/
示威活动于 2019 年 7 月 13 日在波多黎各开始,当时披露了 889 页的电报聊天记录(昵称为 Telegramgate),波多黎各总督 Ricardo Roselló与其他 11 名成员(当时包括前任和现任政府雇员)一起参加了这次聊天。示威背后的目的是让州长辞职。
7 月 13 日至 7 月 24 日,波多黎各的别霍圣胡安和其他城市(以及波多黎各以外的地方)发生了各种抗议活动。7 月 24 日,晚上 11 点多,这位波多黎各总督终于向公众让步,辞去了他的职务。他的辞职将于 2019 年 8 月 2 日生效。
现代波多黎各历史上最大的游行之一发生在 2019 年 7 月 22 日星期一。游行发生在美洲快车上。据估计,超过 50 万人参加了游行。
在游行的照片上统计参加人数可能是有用的。为了做到这一点,我们必须首先检索游行的照片。这个博客将专注于照片检索(数据收集)。我们将从 Twitter 上检索一些游行的照片,获取标签为# RickyRenuncia(翻译为“Ricky 辞职”)的推文,这些推文发布于 7 月 20 日至 7 月 23 日(7 月 22 日是最大的游行日)。我们选择只使用# RickyRenuncia 这个标签,因为它是最常用的(有一段时间它在 Twitter 上很流行)。
在后面的博客中,我们将重点讨论在拥挤的游行照片中计算人数的问题。
这里讨论的代码可以在 GitHub 的我的账户meramos下获得,在一个名为RickyRenuncia_Protests的存储库中,在 Jupyter 的名为get_photos.ipynb的笔记本中。
[## mera mos/Ricky renucia _ 抗议
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/meramos/RickyRenuncia_Protests)
注意:本文解释的代码可以用来搜索 Twitter 上的任何其他标签。
如果你想了解更多关于 Telegramgate 文件的信息,这份文件激起了人们对州长及其同事的愤怒,请阅读我的博客“用 Python 分析 Telegramgate”:
处理 889 页聊天信息
medium.com](https://medium.com/@mariaeramosmorales/telegramgate-analysis-in-python-457d4a36164e)
开发要求
要运行代码,您需要在计算机上安装 Python 3。你还需要一个 Twitter 开发者账户,你可以在这里创建。要创建 Twitter 开发者帐户,您需要一个 Twitter 帐户。
这些是您将使用的库:
- python-Twitter:用于轻松连接 Twitter API,搜索包含# RickyRenuncia 标签的推文。通过运行
pip3 install python-twitter进行安装。 - URL lib . request:用于打开和读取 URL 的内容。Python 默认有这个库。
- os :用于操作系统相关功能。我们用它来确保我们不会用同一个 Twitter ID 多次保存图片。Python 默认有。
- 熊猫 :用于创建一个包含已下载图像信息的表格,并从中创建一个 CSV 文件。
连接到 Twitter API
在您的 Twitter 开发者帐户上搜索您的凭证。您需要以下内容:
- 消费者密钥
- 消费者秘密
- 访问令牌
- 访问令牌秘密
要获取这些值,您必须在您的 Twitter 开发人员帐户下创建一个应用程序,然后访问它。要访问您现有的应用程序,首先点击 Twitter 开发者页面最右侧的用户名右侧的向下箭头,然后点击标题为“应用程序”的选项。进入后,点击感兴趣的应用程序上的“详细信息”按钮。然后点击“密钥和令牌”。在“消费者 API”下,您将找到消费者密钥和消费者密码,在“访问令牌和访问令牌密码”下,您将找到访问令牌和访问令牌密码。
如果您将代码保存在版本控制系统(VCS)中,如 GitHub 或 BitBucket,我建议您将 API 凭证保存在与代码不同的文件中,并将该文件添加到。gitignore 文件,这样您就不会意外地将您的凭证推送到您的存储库中。
对于包含 Twitter API 凭证的配置文件,我们将遵循以下格式。该脚本将有一个名为credentials的字典变量,包含键consumer_key、consumer_secret、access_token和access_token_secret。我们将文件命名为config.py,但是它可以有任何其他名称。
Set Twitter API credentials.
要使用库python-twitter和存储在config.py中的凭证连接到 Twitter API,请运行以下命令:
Connect to the Twitter API.
构建搜索查询
您希望使用标准搜索 API ,它返回与指定查询匹配的相关 Tweets 的集合。然后你需要定义你想要搜索什么。
我们想要标签为“rickyrenuncia”的推文。我们想要流行和非流行的推文,我们希望将这些推文限制在 7 月 20 日至 7 月 23 日。我们希望获得 API 每次调用允许的最大 tweets 数,即 100。
调用端点时,您可以指定各种参数。下面是我们使用的查询参数:
q:必选。需要 UTF 8,URL 编码的搜索查询。最多允许 500 个字符。可以包含运算符。我们将其设置为rickyrenuncia。result_type: 可选。您希望收到什么类型的搜索结果。默认值为mixed。有效值为:mixed、recent、popular。mixed在响应中包括流行和实时结果。recent仅包括最近的结果。popular仅包括最受欢迎的结果。我们将其设置为mixed。include_entities: 可选。是否包括写推文的人的用户名。默认值为false。我们将其设置为true。with_twitter_user_id: 可选。是否包括写 tweet 的用户的 Twitter ID。默认值为false。我们将其设置为true。since: 可选。返回给定日期后创建的推文。接受的日期格式为YYYY-MM-DD。我们将其设置为2019-07-20。until: 可选。返回给定日期之前创建的推文。接受的日期格式为YYYY-MM-DD。我们将其设置为2019–07–23。【 重要 :搜索索引有 7 天限制!超过一周的日期将找不到推文。这个问题有一些解决方法,在这篇博客中没有讨论。]count: 可选。每页返回的推文数量。最大允许值为 100。默认值为 15。我们把它设置为 100。
Define query parameters.
Build query.
我们得到的查询是:
q=rickyrenuncia&result_type=mixed&include_entities=true&with_twitter_user_id=true&since=2019–07–20&until=2019–07–23&count=100
运行搜索查询
要运行搜索查询,请运行以下命令:
How to make a call to the search endpoint of the Twitter API.
搜索端点最多只能提供 100 个结果。为了获得更多,我们必须用不同的max_id值多次调用搜索端点。根据文档:
为了正确使用 max_id,应用程序对时间轴端点的第一个请求应该只指定一个计数。在处理此响应和后续响应时,请跟踪收到的最低 ID。这个 id 应该作为 max_id 参数的值传递给下一个请求,该请求将只返回 ID 小于或等于 max_id 参数值的 Tweets。注意,因为 max_id 参数是包含性的,所以实际上将再次返回具有匹配 id 的 Tweet。
正如文档所述,为了检索更多的 tweet,我们需要将max_id指定为返回的最小 tweet ID,并继续重复这一过程,直到我们得到所有想要的 tweet。
我们决定在 Twitter API 允许的情况下尽可能多地进行连续调用。我们发现,我们可以一口气打 180 个背靠背的电话,检索 18000 条推文。随意试验不同的迭代次数。
在下面的代码中,我们初始化了两个空数组,一个名为all_results,我们将在其中存储所有 API 搜索结果,另一个名为IDs,我们将在其中存储 tweets 的 ID,以便跟踪在后续调用中指定max_id的最小 ID。IDs在每个循环中被重新分配。我们将max_id初始化为None,因为在第一个 API 调用中,我们不应该为max_id指定值。第一次迭代后,将使用列表IDs中存在的最小 ID 定义max_id,并且将扩展query字符串以包含max_id参数。在以后的迭代中,包含max_id参数的query字符串部分被替换为新的max_id值。
运行循环后,我们将有 18000 条推文存储在all_results中。大约有 179 条 tweets 将被重复,因为按照文档中的说明,max_id查询参数是包含性的。我们选择保持重复。
Make 180 calls to the search endpoint for a total of 18000 results.
从 Tweets 下载媒体
现在下载每条读入的推文中的媒体(照片)。
all_results中的每个元素都是python-twitter包中Status类的一个对象。Status类表示 twitter API 使用的状态结构。它有各种属性,包含关于 Tweet 的信息。我们只使用media属性来获取 tweet 下图片的 URL。
media属性是来自python-twitter包的Media类对象的列表。Media类表示 tweet 的媒体组件。它包含与媒体相关的各种属性。我们使用属性id和media_url。id是图片在 Twitter 中的 ID,media_url是图片/视频在 tweet 中的 URL。我们使用 id 为我们下载的媒体分配名称,以便跟踪图像的来源。
在运行代码的文件夹中创建一个名为downloaded_media的文件夹,并运行以下代码:
Function for creating URL of tweet where downloaded image comes from.
Download images and keep track of image origins by saving image ID, image URL, and tweet URL.
downloaded_img_ids包含文件夹downloaded_media中的文件名。我们用这个来确保我们不会重新下载图片,因为一些读入的推文可能是分享我们已经下载的媒体的转发。
为了创建一个包含图像来源信息(图像 ID、图像 URL、tweet URL)的 CSV 文件,我们使用 Pandas 库从image_origins字典中创建一个 dataframe,删除包含重复图像 ID 的行(如果有的话),并从中创建一个 CSV 文件。
Create CSV with information on the images’ origins.
生成的 CSV 文件将作为一个名为image_origins.csv的文件保存在您运行代码的位置。
结果
图像现在将出现在您运行代码的文件夹中的download_media文件夹中。我们下载了 895 张图片。

Subset of images downloaded from the Tweets the Search API returned on July 25.
我们下载的图片可以在这里标题为downloaded_media的文件夹下找到。一个 CSV 和一个包含图像来源信息的电子表格(一列是与文件名相关的图像 ID,一列是图像 URL,一列是 tweet URL)也显示在那里,标题为image_origins。
结论
在本文中,我们将展示如何在特定时间范围内检索特定标签下的推文,以及如何下载这些推文下的媒体文件。我们提供了一个链接,链接到 Google Drive 中的一个文件夹,其中包含一个包含下载图像的文件夹和一个包含图像来源信息的电子表格。
不幸的是,我们遇到了一个限制,Twitter API 不允许检索调用端点超过 7 天的帖子。这使得这里讨论的代码的结果不可再现(代码运行并工作,但它不会返回指定时间范围内的图像)。然而,还有其他方法可以检索历史推文。GitHub 中有解决这个问题的库。以下是其中一个存储库:
[## PJHRobles/Twitter-Get-Old-Tweets-Scraper
Twitter 的 API 不再允许使用应用程序检索过去 7 天的推文。一些第三方应用程序可用…
github.com](https://github.com/PJHRobles/Twitter-Get-Old-Tweets-Scraper)
在未来的博客中,我们可能会讨论如何使用这些存储库之一来检索历史 Twitter 数据。
现在我们有了来自 Twitter 上# RickyRenuncia 标签的照片,以及抗议日期的子集,我们可以精心挑选人群的图像,并使用它们来计算其中的人数。
参考
- 新直径:克罗诺吉亚德拉卡达德罗塞洛
- Python-Twitter 文档
- 面向开发者的 Twitter:搜索 Tweets /标准搜索 API
- 面向开发者的 Twitter:获取 Tweet 时间轴
- Stackoverflow: twitter api 计数超过 100,使用 twitter 搜索 api
有毒问题的自动检测

When you are trying to remove toxic questions and comments from a website (“Night cleaning”, photo by Yuri Shchennikov)
Quora 是一个让人们互相学习的平台。在 Quora 上,人们可以提出问题,并与贡献独特见解和权威观点的其他人交流。几个月前,Quora 在 Kaggle 上组织了一场比赛,名为 Quora 不真诚问题分类,旨在解决当今任何主要网站都存在的一个问题——如何处理有毒和分裂性内容。一个关键的挑战是剔除不真诚的问题——那些基于错误前提的问题,或者由用户提出的问题,这些用户宁愿发表声明,而不是寻找有用的答案。
这篇文章将描述我解决这个问题的方法,它帮助我进入了前 3%(在 4000 名参与者中排名第 85 位,个人银牌)。
问题公式化
数据集由 130 万个问题组成,目标是将问题标记为有毒或无毒(二元分类任务)。一个不真诚的问题被定义为一个旨在陈述而不是寻找有用答案的问题。以下迹象可能被用来发现一个不真诚的问题(完整定义):
- 有着非中性的语气
- 是贬低或煽动性的
- 不是基于现实的
- 使用性内容(乱伦,兽交,恋童癖)来寻求震撼,而不是寻求真正的答案
问题示例:
Non-toxic questions:
1\. What are the best rental property calculators?
2\. Apart from wealth, fame, and their tragic ends, what did Anthony Bourdain and Kate Spade have in common that might provide some insight into their choice to take their own lives?
3\. How do you find your true purpose or mission in life?
4\. What is the relation between space and time if they are connected? Are they converting continuously in each other?
5\. Is there an underlying message that can be read into the many multilateral agreement exits of the Trump administration during its first year and a half?____________________________________________________________________Toxic questions:
1\. Lol no disrespect but I think you are ducking smart?
2\. Are Denmark and England destroyed by Muslim immigrants?
3\. How am I supposed to get a girlfriend if every woman thinks every man is a rapist?
4\. How many black friends does a white person need to make what they say 'not racist' on this basis?
5\. Are Russian women more beautiful than Ukrainian women?
比赛使用F1-score指标,计算 56k(公开)和 376k(私人)未公开试题。Quora 的虚假问题分类是只在内核中进行的比赛,所以你不用做预测,而是提交代码,然后在 Kaggle 平台上运行。主办方对两个阶段都设定了内存和时间限制:6 / 2 小时(CPU / CPU+GPU 使用量)。
还有,主办方决定禁止使用任何外部数据(反正也没阻止某人),除了几个预先训练好的单词嵌入:Google news-vectors-negative 300、 glove.840B.300d 、 paragram_300 sl999 、 wiki-news-300d-1M 。
我们真的需要它吗?
在这场比赛中,我们必须发现有毒的问题。让我们假设这是开始竞争的唯一原因(其他原因可能包括雇用专业的数据科学家、产生宣传或者将生产中的模型分数与竞争中的最高分数进行比较)。在数据驱动项目的准备过程中,最重要但最少被问到的问题可能是:我们真的需要它吗?我们要解决什么问题?
有害行为对 Quora 社区有害。这可能会吓跑一些用户,因为他们觉得与世界分享他们的知识不安全。我们希望我们的用户自由地表达他们的想法,而不用担心被套牢。我们可以通过检测有毒问题并删除它们,或者使它们仅对问题的作者可见来实现这一点— hellban ( 解决方案)。为了检测有毒问题,我们可能会使用人工预审核(由 Quora 版主或机械土耳其人),但这需要时间来处理所有问题,版主可能会被 Quora 上的大量问题淹没。因此,我们希望通过使用数据驱动的方法来自动化这一过程:在发布问题之前,它将由模型进行检查,这是我们在本次比赛中必须提出的。
这解决了最初的问题吗?我们可以从一个正在努力解决类似问题的领域——视频游戏行业——中吸取经验。据《电子游戏公司能否驯服毒害行为?视频游戏中的大多数有毒评论来自“普通人,他们只是过了糟糕的一天”,禁止所有有毒玩家不会产生任何戏剧性的变化:
《常识》认为,互联网上的大部分残忍行为来自于一小部分网民——巨魔。事实上,林的团队发现,只有大约 1%的球员一直是有毒的。但事实证明,这些巨魔只产生了英雄联盟中约 5%的毒性。“绝大多数是普通人度过了糟糕的一天,”林说。
这意味着,即使 Riot 禁止了所有毒性最强的玩家,也不会有太大的影响。为了减少大多数玩家经历的不良行为,公司必须改变玩家的行为方式。
在我看来,删除有毒评论不会解决问题,但会减少它对社区的影响。它可以被整合到反巨魔战略中,但这只是解决这个问题的一揽子计划的一部分。无论如何,比赛的总体想法对我来说似乎是可行的和重要的,所以我决定参加。
最终解决方案的主要部分
实验测试
在整个比赛中,我在本地(在我的电脑上)和 Kaggle 内核中测试了我的管道。它允许我(1)同时运行更多的实验,(2)确保我的管道符合第二阶段的时间/内存需求。我跟踪了每个实验的结果(时间、验证分数、公共排行榜分数、评论和发现),然后把它们放到 excel 文件中。
验证策略
我认为这场比赛最重要的部分是不要相信公共排行榜。正如前面提到的,公共排行榜是根据 56k 个问题计算的,这大约是培训部分问题数量的 4%。这是一个非常小的部分,它可能只用于确保您没有在代码中犯任何严重的错误,而不是用于分数检查。
我决定完全信任我的验证,并使用 StratifiedKFold (K=5)策略进行局部验证和参数选择。对于最终提交,我对一次提交使用了相同的策略,对另一次使用了训练验证分割(90/10%)(允许两次最终提交)。
预处理
我的预处理管道由几个步骤组成:
- 干净的数学公式。训练数据集中大约 2%的问题带有“数学”标签。里面的公式没有包含有用的信息,也没有有害的评论,但它极大地增加了问题的长度,所以我决定用单词“数学”代替这些公式。虽然,聪明的巨魔可以利用它,开始在数学公式里侮辱人。
**[math] 2 + 2 = 4 [\math] ->* math*
- 在单词和标点符号之间添加一个空格。事实证明,这是比去掉标点符号更好的策略:
*"Wait... What is the relation between space and time if they are connected? Are they converting continuously in each other?" -> "Wait . . . What is the relation between space and time if they are connected ? Are they converting continuously in each other ?"*
- 如果字典中没有该单词,请尝试将它的首字母小写/大写/大写,然后再试一次。这一简单而有效的举措逐渐减少了“新”单词(即不在 w2v 词汇表中的单词)的数量。比赛结束后,我意识到词干化或词汇化也可能减少缺席单词的数量。
*for word, i in tqdm(word_index.items()):
embedding_vector = embeddings_index.get(word)
# 'ABcd' → 'abcd'
if embedding_vector is None:
embedding_vector = embeddings_index.get(word.lower())
# 'denis' -> 'Denis'
if embedding_vector is None:
embedding_vector = embeddings_index.get(word.capitalize())
# 'usa' -> 'USA'
if embedding_vector is None:
embedding_vector = embeddings_index.get(word.upper())
# deling with numbers in Google News embedding
if word.isdigit() and (embedding_vector is None):
temp_word = len(word) * '#'
embedding_vector = embeddings_index.get(temp_word)
# '1123336548956552515151515151544444444' -> 'number'
if word.isdigit() and (embedding_vector is None):
embedding_vector = embeddings_index.get('number')
if embedding_vector is not None:
embedding_matrix.append(embedding_vector)
in_vocab += 1
else:
non_in_vocab += 1
non_vocab.append(word)
embedding_matrix.append(mean_vector)*
模型和嵌入
我在这场比赛中测试了 CNN 和 LSTM 模型,然而,最好的是下面的 LSTM:
*def get_model(embedding_matrix, nb_words, embedding_size=607):
inp = Input(shape=(max_length,))
x = Embedding(nb_words, embedding_size, weights= [embedding_matrix], trainable=False)(inp)
x = SpatialDropout1D(0.3)(x)
x1 = Bidirectional(CuDNNLSTM(256, return_sequences=True))(x)
x2 = Bidirectional(CuDNNGRU(128, return_sequences=True))(x1)
max_pool1 = GlobalMaxPooling1D()(x1)
max_pool2 = GlobalMaxPooling1D()(x2)
conc = Concatenate()([max_pool1, max_pool2])
predictions = Dense(1, activation='sigmoid')(conc)
model = Model(inputs=inp, outputs=predictions)
adam = optimizers.Adam(lr=learning_rate)
model.compile(optimizer=adam, loss='binary_crossentropy')
return model*
我使用了 google news 和 glove embedding 的串联,并根据句子中的相对位置(顺序号)、问题中的相对位置(顺序号)、 is_upper 、 is_lower 、 is_ number 、is _ 标点符号、单词中大写字母的含义(“单词”→ 1.0、“单词”→ 0.25)、单词在训练数据集中的出现频率,为每个单词的表示添加了额外的功能。
快照集合
快照集合是之前在快照集合:训练 1,免费获得 M中描述的 Kaggle 比赛中常用的技术。其背后的思想非常简单:我们用循环学习率训练单个模型,在每个循环结束时保存模型的权重(一个循环的结束通常处于局部最小值)。最终我们会得到几个模型而不是一个。对集合的预测进行平均会给你一个比单一模型更好的分数。

During training, we are converging to and escaping from multiple local minima. A snapshot is taken in each local minimum
伪标记
伪标注的思想是增加模型训练的可用数据量。在 Kaggle 竞赛中是一种常见的方法,但遗憾的是,在业界并没有那么常用(下面是一些关于这个话题的论文:用自举,伪标签:深度神经网络的简单高效的半监督学习方法)。现在,有几种方法可以用于伪标记:
- 1.添加训练数据的最有把握的例子(置信度≥水平,水平= 0.9 的例子)。我们不应选择最高 N1 %和最低 N0 %的概率并将它们添加到训练数据集(由于类别不平衡)。相反,我们必须确定最佳阈值,并选择带有正面和负面标签的最有把握的示例。在神经网络训练的几个时期中遵循这种方法,我添加了大约 45k 个负样本和 100 个正样本。**
- 添加带有伪标签的完整测试数据,但根据其置信度为每个示例分配一个权重。我尝试了几种权函数,但我发现线性权函数是这项任务的最佳选择。

Assigning weights to pseudo labels (first 1000 data points in the test set). The more confident our predictions are — the bigger weight we assign during training
最佳阈值选择
这个比赛的度量标准是 F1 分数,也就是说我们要提交类(0/1,无毒/有毒)。模型的输出是概率,所以我们需要选择合适的阈值来最大化得分。有许多方法可以做到这一点:
- 训练前选择阈值。我认为这种方式会导致非最优阈值,得分会更低。我已经测试过了,但是从来没有在最终提交中使用过。虽然,竞赛的获胜者使用了这种方法的变体。
- 拟合模型,对训练部分进行预测,选择阈值优化训练部分的得分。直接超负荷。已测试,但未在最终提交中使用。
- 拟合模型,对训练部分进行预测,选择阈值优化训练部分的得分。直接超负荷。我已经测试过了,但是从来没有在最终提交中使用过。
- 拟合模型,对验证部分进行预测,选择阈值优化验证部分的得分。在我的管道中,验证部分用于选择最佳的历元数(这是验证数据的一个轻微的过度拟合)和优化神经网络的超参数(一个主要的过度拟合)。对已经“使用”的数据“按原样”选择阈值不是一个好主意。我们可能会完全过度拟合,在看不见的数据上得低分。相反,我决定在验证部分的子集上选择一个阈值,重复几次,然后汇总结果(这个想法是由统计学中的子采样思想激发的)。它让我在这场比赛和其他一些我必须选择门槛的比赛中取得了好成绩。
- 作出 out of fold (OOF,意味着为每个 fold 建立一个单独的模型)预测,找到一个阈值。这是一个好方法,但有两个问题:(1)我们没有这么多时间来做 OOF 预测,因为我们想尽可能多地拟合不同的模型( CNN/LSTM )。(2)这可能是一种情况,我们的验证分裂是有偏见的,我们将得到我们的预测“转移”。阈值搜索非常敏感,我们不会得到最优解。然而,我使用这种方法对每一次折叠的概率进行排序,以减少“转变”的影响。它对我来说已经足够好了。
什么没有起作用
在比赛期间,我测试了大量的想法,但只有一小部分被用在了最终的流程中。在这一节中,我将概述一些对我无效的技巧。

A lot of stuff did not work during this competition (picture by Schmitz)
数据扩充和测试时间扩充(TTA)
想法是增加训练数据集。有几种方法可以做到这一点,最常用的是重复翻译(将英语句子翻译成法语,然后再翻译成英语),以及同义词。重复翻译不是一个选项,因为在第二阶段互联网接入不可用,所以我决定专注于同义词。我测试了两种方法:
- 将句子拆分成单词,以预定义的概率通过 w2v 嵌入将一个单词替换为最接近的单词。重复几次得到不同的句子。
- 给句子中的随机单词加上随机噪声。
这两种方法都不太奏效。还有,我试着把问题组合在一起,即无毒+有毒=有毒。也没用。
**Non toxic: Is there an underlying message that can be read into the many multilateral agreement exits of the Trump administration during its first year and a half?Toxic: Lol no disrespect but I think you are ducking smart?____________________________________________________________________New toxic:
Is there an underlying message that can be read into the many multilateral agreement exits of the Trump administration during its first year and a half? Lol no disrespect but I think you are ducking smart?**
附加句子特征
我根据这个句子尝试了不同的功能,但是它们没有多大帮助。他们中的一些人降低了分数,所以我决定不将他们纳入最终模型。以下是我测试过的一些功能:字数、上位字数、数字个数、数字总和/均值/最大/最小值、标点符号个数、词频总和/均值/最大/最小值、一个问题中的句子个数、起始和结束字符等。
神经网络内层输出
想法很简单:我们获取网络的连接层的输出,并在其上训练基于树的模型。我在最近的比赛中测试了这种方法,它总是增加最终合奏的分数。它允许我们使用不同的模型(神经网络和基于树的模型)进行混合,这将增加最终集成的分数。
但在这种情况下,这是一个非常微小的增加,特别是考虑到高输出维度所花费的时间(根据模型的不同,连接层~400 的维度)。

TSNE visualization of NN inner layer output of random 1000 questions in the validation dataset
自动微分,解释
计算机如何计算导数?

Title image: Source
通过梯度下降的过程,神经网络能够在每次训练中逐渐提高精确度。在梯度下降中,我们的目标是通过调整权重和偏差来最小化损失(即模型有多不准确)。
正如在之前的系列文章中所解释的,通过找到损失函数的偏导数,我们知道我们必须调整多少(和在什么方向上)我们的权重和偏差来减少损失。在该系列中,我们手工计算了单神经元神经网络的导数均方误差损失函数。
然而,神经网络——计算机——是如何计算表达式的偏导数的呢?答案在于一个被称为自动微分的过程。让我用上一个系列中的成本函数来说明它,但是做了调整,使它是标量形式的。

Image 1: The cost function in scalar form
此外,由于自动微分只能计算表达式在某一点上的偏导数,所以我们必须为每个变量赋予初始值。我们假设:y = 5;w = 2;x = 1;并且 b=1。
我们来求函数的导数吧!
在我们开始推导这个表达式之前,必须把它转换成一个计算图形。一个计算图简单地将每个操作变成一个节点,并通过线将它们连接起来,称为边。我们的示例函数的计算图如下所示。

Figure 2: Computation graph for the scalar cost function
首先,让我们计算每个节点的值,从底部(输入变量)传播到顶部(输出函数)。这是我们得到的结果:

Figure 3: Values of each node
接下来,我们需要计算运算之间每个连接的偏导数,用边来表示。这些是每条边的偏角的计算:

Figure 4: Values of each edge
注意 max(0,x)分段函数的部分也是分段函数。该函数将所有负值转换为零,并保持所有正值不变。函数的部分(或者用图形表示,它的斜率),应该在它的图上很清楚:

Figure 5: max(0, x) function. As seen, there is a slope of 1 when x>0, and a slope of 0 when x<0. The slope is undefined when x=0.
现在我们可以继续计算偏导数了!让我们找出相对于重量的偏导数。如图 6 所示,只有一条线将结果与权重联系起来。

Figure 6: The path that connects the function to the weights
现在我们简单地将这些边相乘:

Figure 7: Partial
这是我们的部分!
这整个过程可以自动完成,并允许计算机准确快速地计算函数值的偏导数。正是这个过程,让 AI 能够像今天这样高效。
如果你喜欢这篇文章,或者有任何问题或建议,欢迎在下面留下评论!
基于深度学习的车牌自动检测与识别

Photo by Evgeny Tchebotarev on Unsplash
简介
在现代世界的不同方面,信息技术的大规模集成已经导致将车辆视为信息系统中的概念资源。由于没有任何数据,自主信息系统没有任何意义,因此需要在现实和信息系统之间改革车辆信息。这可以通过人工代理或特殊的智能设备来实现,这些设备将允许在真实环境中通过车辆的牌照来识别车辆。在智能设备中,提到了车辆牌照的检测和识别系统。车牌检测和识别系统用于检测车牌,然后进行车牌识别,即从图像中提取文本,这一切都要归功于使用定位算法、分割车牌和字符识别的计算模块。车牌的检测和读取是一种智能系统,由于其在以下几个领域的潜在应用,所以它是相当重要的:
-
指挥力量:该系统用于检测被盗和被搜查车辆。将检测到的车牌与报告的车牌进行比较。
-
停车管理:汽车出入口的管理。
- 道路安全:该系统用于检测超过一定速度的车牌,将车牌读取系统与道路雷达相结合,穿越野火…
我们的项目将分为 3 个步骤:
第一步:车牌检测
为了检测牌照,我们将使用 Yolo ( You Only Look One)基于卷积神经网络的深度学习对象检测架构。
这种架构是由约瑟夫·雷德蒙、阿里·法尔哈迪、罗斯·吉斯克和桑托什·迪夫瓦拉在 2015 年推出的第一版,以及后来的第 2 版和第 3 版。
Yolo v1:纸张链接。
Yolo v2:纸张链接。
Yolo v3:纸张链接。
Yolo 是一个端到端训练的单一网络,用于执行预测对象边界框和对象类的回归任务。
这个网络非常快,它以每秒 45 帧的速度实时处理图像。一个较小版本的网络,快速 YOLO,每秒处理惊人的 155 帧。
实施 YOLO V3:
首先,我们准备了一个由 700 张包含突尼斯牌照的汽车图像组成的数据集,对于每张图像,我们创建一个 xml 文件(之后改为文本文件,其中包含与 Darknet 配置文件输入兼容的坐标。Darknet:该项目用于使用一个名为 LabelImg 的桌面应用程序重新训练 YOLO 预训练模型。
# First download Darknet project
$ git clone [https://github.com/pjreddie/darknet.git](https://github.com/pjreddie/darknet.git)# in "darknet/Makefile" put affect 1 to OpenCV, CUDNN and GPU if you # want to train with you GPU then time thos two commands
$ cd darknet
$ make# Load convert.py to change labels (xml files) into the appropriate # format that darknet understand and past it under darknet/
[https://github.com/GuiltyNeuron/ANPR](https://github.com/GuiltyNeuron/ANPR)# Unzip the dataset
$ unzip dataset.zip# Create two folders, one for the images and the other for labels
$ mkdir darknet/images
$ mkdir darknet/labels# Convert labels format and create files with location of images
# for the test and the training
$ python convert.py# Create a folder under darknet/ that will contain your data
$ mkdir darknet/custom# Move files train.txt and test.txt that contains data path to
# custom folder
$ mv train.txt custom/
$ mv test.txt custom/# Create file to put licence plate class name "LP"
$ touch darknet/custom/classes.names
$ echo LP > classes.names# Create Backup folder to save weights
$ mkdir custom/weights# Create a file contains information about data and cfg
# files locations
$ touch darknet/custom/darknet.data# in darknet/custom/darknet.data file paste those informations
classes = 1
train = custom/train.txt
valid = custom/test.txt
names = custom/classes.names
backup = custom/weights/# Copy and paste yolo config file in "darknet/custom"
$ cp darknet/cfg/yolov3.cfg darknet/custom# Open yolov3.cfg and change :
# " filters=(classes + 5)*3" just the ones before "Yolo"
# in our case classes=1, so filters=18
# change classes=... to classes=1# Download pretrained model
$ wget https://pjreddie.com/media/files/darknet53.conv.74 -O ~/darknet/darknet53.conv.74# Let's train our model !!!!!!!!!!!!!!!!!!!!!
$ ./darknet detector train custom/darknet.data custom/yolov3.cfg darknet53.conv.74
完成训练后,要从图像中检测车牌,请从 darknet/custom/weights 中选择最新的模型,并将其路径或名称放在 object_detection_yolo.py 文件中,我们也将使用 yolov3.cfg 文件,只是在该文件中在训练前放置#以便我们可以训练,然后运行:
python object-detection_yolo.py --image= image.jpg
这就是我们的结果:

第二步:车牌分割
现在我们要分割我们的车牌号码。输入的是车牌的图像,我们必须能够提取单字符图像。这个步骤的结果被用作识别阶段的输入,这是非常重要的。在车牌自动读取系统中。
分割是车牌自动识别中最重要的过程之一,因为任何其他步骤都以分割为基础。如果分割失败,识别阶段将是不正确的。为了确保正确的分割,必须进行初步处理。

像素投影直方图由寻找每个字符的上下限、左右组成。我们执行水平投影来找到字符的顶部和底部位置。一组直方图的值是沿着水平方向上的特定线的白色像素的总和。当沿着水平方向上的所有线的所有值被计算时,获得水平投影直方图。直方图的平均值然后被用作阈值来确定上限和下限。直方图分段大于阈值的中心区域被记录为由上限和下限界定的区域。然后,我们以同样的方式计算垂直投影直方图,但是通过改变图像的行和列来获得每个字符的两个界限(左和右)。

另一种从车牌中提取数字的方法是使用开/闭形态学对连通区域进行排序,然后使用连通分量算法提取连通区域。
第三步:车牌识别
识别阶段是自动车牌识别系统开发的最后一步。因此,它关闭了所有经过图像采集的过程,接着是车牌的定位,直到分割。识别必须从分割阶段结束时获得的图像字符中进行。用于这种识别的学习模型必须能够读取图像并呈现相应的字符。
为了使大部分数据可用于学习,我们在应用与分割车牌之前使用的相同图像处理步骤之后,通过在正方形中调整大小来单独切割每个字符。结果,我们获得了一组由 11 个类组成的数据,对于每个类,我们有 30-40 个 28X28 像素尺寸 PNG 格式的图像;从 0 到 9 的数字和阿拉伯语单词(突尼斯)。
然后,我们基于比较多层感知器(MLP)和分类器 K 最近邻(KNN)的科学文章进行了一些研究。结果我们发现:如果当使用 MLP 分类器时,隐藏层神经元的数量也增加,并且如果当使用 KNN 时,最近邻居的数量也增加,则性能增加。这里调整 k-NN 分类器性能的能力非常有限。但是可调数量的隐藏层和可调 MLP 连接权重提供了更大的机会来改进决策区域。因此,我们将选择多层感知器用于这一阶段。

Github 项目回购链接
使用 H2O AutoML 的欺诈检测中的自动机器学习
金融中的机器学习自动化

机器学习在金融领域有许多应用,如安全、流程自动化、贷款/保险承保、信用评分、交易等。[1][2].金融欺诈是金融安全的主要问题之一[1][2]。为了对抗日益增加的金融欺诈风险,机器学习已被积极应用于欺诈检测[3][4]。
将机器学习应用于欺诈检测存在许多技术挑战。一个主要的困难是数据集在正负类方面倾向于高度倾斜和不平衡[3][4]。如3所示,为了在这种情况下获得血统欺诈检测/预测结果,通常需要领域专业知识和大量人工工作来进行数据探索、数据预处理、特征工程、模型选择、训练、评估等。
为了应对这些挑战,H2O [6]提供了一个用户友好的自动机器学习模块,称为 AutoML [7],非专家也可以使用。
在本文中,与3类似,我使用 Kaggle [5]中相同的高度偏斜和不平衡的合成金融数据集来演示如何使用 AutoML [7]来简化机器学习以进行欺诈预测,与3中的机器学习方法相比。
1.没有自动化的机器学习
本节总结了3中无自动化的机器学习方法的要点,以建立与第 2 节中的 H2O 自动机器学习方法进行比较的基线。
1.1 数据探索
在3中,进行了广泛的数据探索和分析工作,以了解哪些数据记录和特征是必需的,以及哪些数据记录和特征可以被丢弃而不会对机器学习建模和欺诈预测产生重大影响。这类工作往往需要领域专业知识,如3所示。3中的主要结果可以总结如下:
- 特征类型
响应类is fraud(0-否,1-是)仅在值的特征类型为 CASH_OUT 或 TRANSFER 时设置。因此,唯一相关的数据记录是那些具有值 CASH_OUT 或 TRANSFER 3的类型的记录。
- 特征isFlaggedFraud
特征 isFlaggedFraud 仅在总共数百万条数据记录中的 16 条数据记录/样本3中设置,因此我们可以在不对建模和欺诈预测的结果产生重大影响的情况下删除该特征。
- 特性命名来源和命名最早
如3中所指出的,特性命名来源和命名目的没有意义,因为它们没有以预期的方式对商户账户进行编码,因此可以删除。
1.2 数据预处理
根据数据探索的结果,数据集在3中进行如下预处理。
- 提取类转账或提现的数据记录
根据数据探索的结果,只有当数据类型为 TRANSFER 或 CASH_OUT 时,才会发生欺诈。因此,只有那些数据记录从原始数据集中提取出来,用于模型训练和欺诈预测3。此外,不太有用的功能命名为 Orig 、命名为 Dest 和为 FlaggedFraud 被删除:
X = df.loc[(df.type == ‘TRANSFER’) | (df.type == ‘CASH_OUT’)]
X = X.drop([‘nameOrig’, ‘nameDest’, ‘isFlaggedFraud’], axis = 1)
- 输入缺失值
如3中所述,目的地账户余额为零是欺诈的明显迹象。因此,帐户余额不应该用统计值或随后对交易金额进行调整的分布值来估算。这是因为这样做会使欺诈交易看起来像真的。为了避免这个问题,在3中,值为 0 的目标帐户余额被替换为-1,以使其更适合用于欺诈检测的机器学习算法:
X.loc[(X.oldBalanceDest == 0) & (X.newBalanceDest == 0) & (X.amount != 0), [‘oldBalanceDest’, ‘newBalanceDest’]] = -1
此外,如3中所指出的,在非零金额交易之前和之后,数据还具有发起账户的零余额的若干交易。在这种情况下,与真实交易的比例(47%)相比,欺诈交易的比例(0.3%)要小得多3。类似于目的地账户余额为零的处理,起始账户余额 0 被替换为空值而不是输入一个数值来区分欺诈交易和3中的真实交易。
X.loc[(X.oldBalanceOrig == 0) & (X.newBalanceOrig == 0) & (X.amount != 0), ['oldBalanceOrig', 'newBalanceOrig']] = np.nan
1.3 特征工程
如3所述,目的账户或发起账户的零余额有助于区分欺诈交易和真实交易。这促使作者创建了以下两个新功能来记录每笔交易的起始帐户和目的帐户中的错误3。这些新特性对于获得3中采用的机器学习算法的最佳性能非常重要。
X[‘errorBalanceOrig’] = X.newBalanceOrig + X.amount - X.oldBalanceOrigX[‘errorBalanceDest’] = X.oldBalanceDest + X.amount — X.newBalanceDest
1.4 型号选择
3中考虑的用于模型选择的第一种方法是在应用机器学习算法之前,通过对多数类进行欠采样来平衡不平衡数据。欠采样的缺点是,以这种方式训练的模型在现实世界中看不到的不平衡数据上可能表现不好,因为在模型训练期间几乎所有的不平衡信息都被丢弃了。
3中考虑的第二种方法是过采样少数类。作者尝试了各种类型的异常检测和监督学习方法。
如3所述,经过多次实验,作者最终得出结论:采用xboost机器学习算法在原始数据集上获得了最好的结果。
1.5 模型培训与评估
数据集分为两部分,如下文3所示,80%用于模型训练,20%用于模型测试:
trainX, testX, trainY, testY = train_test_split(X, Y, test_size = 0.2, random_state = randomState)
所选XB classifier模型的超参数设置为特定值:
weights = (Y == 0).sum() / (1.0 * (Y == 1).sum())clf = XGBClassifier(max_depth = 3, scale_pos_weight = weights, n_jobs = 4)
模型训练和测试按以下3进行:
probabilities = clf.fit(trainX, trainY).predict_proba(testX)
使用 AUPRC ( 精确-再调用曲线下的区域)而非正常的 AUC 的值来评估模型性能:
print(‘AUPRC = {}’.format(average_precision_score(testY, probabilities[:, 1])))
2.自动机器学习
如前一节和3所述,为了从高度倾斜和不平衡的数据中获得血统欺诈预测结果,数据探索、数据预处理、特征工程、模型选择、训练、评估等都需要大量的领域知识和手工工作。
本节将演示如何使用 H2O AutoML [7]通过自动机器学习来减少手动工作量,包括但不限于以下内容:
- 自动数据预处理(例如,处理丢失的数据)
- 自动特征工程
- 自动选型
- 自动模型训练
- 自动模型评估
H2O [6]是基于客户机和服务器的集群架构。在开始任何其他活动之前,H2O 服务器需要启动:
import h2o
from h2o.automl import H2OAutoML
h2o.init()
如果 H2O 服务器在本地计算机上成功启动,将显示以下内容:

2.1 数据加载
一旦将 Kaggle [5]中的合成金融数据集下载到 H2O 服务器机器上,就可以按如下方式将该数据集加载到 H2O 服务器上:
df = h2o.import_file(‘./data/PS_20174392719_1491204439457_log.csv’)
df.head(10)

数据集的摘要描述可通过以下方式获得:
df.describe()

响应类的数据类型为 raud 设置为分类(即因子),因为它是二进制的(0-否,1-是):
factorslist = [‘isFraud’]
df[factorslist] = df[factorslist].asfactor()
2.2 数据预处理
为与3中的方法相比较,与3类似,仅从原始数据集中提取 TRANSFER 或 CASH_OUT 类型的数据记录进行模型训练和欺诈预测,去掉不重要的特征 nameOrig 、 nameDest 、is lagged 欺诈。
df1 = df[df[‘type’] == ‘TRANSFER’ or df[‘type’] == ‘CASH_OUT’]
y = “isFraud”
x = df.columns
x.remove(y)
x.remove(“nameOrig”)
x.remove(“nameDest”)
x.remove(“isFlaggedFraud”)
2.3 选型及培训
为了与3中的方法相比较,提取的数据集被分成如下两部分,80%用于模型训练,20%用于模型测试:
train, test = df1.split_frame([0.8])
选择了超参数 max_models 值为 10 的 H2O 汽车模型:
aml = H2OAutoML(max_models = 10, seed = 1)
使用默认设置训练选定的模型,如下所示:
aml.train(x = x, y = y, training_frame = train)
2.4 模型评估
- 查看训练模型列表
一旦 H2O AutoML 模型被训练,相应的排行榜方法可用于显示训练模型列表,按 AUC (非 AUPRC )降序排列:
lb = aml.leaderboard
lb.head(rows=lb.nrows)

从上表中我们可以看到,H2O AutoML 自动选择并训练了 12 个不同的模型,包括堆叠系综模型。主导车型为XGBoost _ 3 _ AutoML _ 2019 11 13 _ 110031。
- 获取并评估主导模型
位于训练模型列表顶部的模型可以如下获得:
leader_model = aml.leader
注意,这个领先的模型在模型训练 AUC (不是 AUPRC )分数方面是最好的。
主要模型测试性能的综合总结如下:
leader_model.model_performance(test)
如下图所示,领先车型的测试 AUPRC (即 pr_auc )得分为 0.988。

下面的代码将获取主导模型的特征重要性:
leader_model.varimp_plot()

- 获得并评估具有最佳训练的模型 AUPRC
然而,模型测试 AUPRC 而非 AUC 在【3】中用于模型性能评估。为了进行公平的比较,我们需要用最好的测试 AUPRC 来获取和评估训练好的模型。为此,我们可以首先获得并评估具有最佳训练 AUPRC 的模型,然后将其测试 AUPRC 性能与领先模型进行比较,以确定应该选择哪个模型。
如前所述,H2O AutoML 的排行榜方法按照训练 AUC 而非 AUPRC 的降序显示已训练车型列表。为了找到具有最佳训练 AUPRC 的模型,可以使用以下代码以训练 AUPRC 的降序显示训练过的模型:
import pandas as pdmodel_ids = list(aml.leaderboard['model_id'].as_data_frame().iloc[:,0])model_auprc_map = {'Model Id' : [], 'AUPRC' : []}
for mid in model_ids:
model = h2o.get_model(mid)
model_prauc_map['Model Id'].append(mid)
model_prauc_map['*AUPRC*'].append(model.pr_auc(train))
model_auprc_df = pd.DataFrame(model_auprc_map)
model_auprc_df.sort_values(['*AUPRC*'], ascending=0, inplace=True)
model_auprc_df.head(20)

可以看到最佳训练 AUPRC 为 0.937 的模型 id 为 XGBoost _ 2 _ AutoML _ 2019 11 13 _ 110031。
列表顶部的模型可以通过以下方式获得:
best_auprc_model_id = model_auprc_df.iloc[0, 0]
best_auprc_model = h2o.get_model(best_auprc_model_id)
然后,可以获得模型测试性能的全面总结:
best_auprc_model.model_performance(test)
如下图所示,最佳训练 AUPRC (即 pr_auc )的车型取得了 0.975 的测试 AUPRC 分数。

以下代码用于获取具有最佳训练 AUPRC 分数的模型的特征重要性:
best_prauc_model.varimp_plot()

测试结果表明,在测试 AUPRC 分数方面,领先模型优于具有最佳训练 AUPRC 分数的模型。因此,应该选择领先的模型。
2.5 与没有自动化的机器学习的比较
下表比较了 H2O AutoML [7]和3中无自动化的机器学习方法之间的主要机器学习活动。

如第 1 节和3中所述,在处理缺失数据、特征工程、模型选择、培训、评估等方面,需要领域专业知识和大量手工工作。所有这些类型的工作都是在 AutoML [7]中自动完成的,无需人工干预。另外,AutoML [7]中的模型超参数设置比3中的机器学习方法简单得多。
然而,关于模型测试方面的模型测试性能 AUPRC ,与 AutoML 的 0.988 分相比,3中的机器学习方法获得了更高的 0.997 分。
AutoML 的主要优势在于,非专家可以使用它从复杂的数据集(如本文中使用的高度偏斜和不平衡的数据集)中获得相当下降的欺诈检测/预测结果。
摘要
在本文中,正如在3中一样,我在 Kaggle [5]中使用了相同的高度偏斜和不平衡的合成金融数据集来展示 H2O 汽车公司[7]在使非专家能够将机器学习应用于金融欺诈检测方面的能力。这是通过数据预处理、特征工程、模型选择、模型训练和模型评估的自动化实现的。体面的模型测试 AUPRC 得分为 0.988。
如第 2.5 节所述,通过手工制作数据预处理、特征工程、模型选择、训练等方法,在3中获得了更高的模型测试 AUPRC 分数 0.997。在这种情况下,根据业务需求,可能有理由支持用户定义的机器学习方法而不是 AutoML。我注意到 H2O 提供了一个更强大的端到端自动机器学习工具集,叫做, H2O 无人驾驶 AI [8]。该工具集具有自带方法的功能,使用户能够即插即用自己的方法进行数据预处理、特征工程、建模等。
Github [9]中有一个 Jupyter 笔记本,上面有本文中的所有源代码。
参考
[1].K. Didur,金融中的机器学习:为什么,什么&如何
[2].D. Faggella,金融中的机器学习——现在和未来的应用
3.a .约书亚,预测金融支付服务中的欺诈
[4].R. Pierre,使用机器学习检测金融欺诈:赢得对不平衡数据的战争
[5].用于欺诈检测的合成金融数据集
[6]. H2O.ai
[7]. H2O 汽车
【8】H2O 无人驾驶 AI
[9].Github 中的 Jupyter 笔记本
披露声明:2019 首创一。观点是作者个人的观点。除非本帖中另有说明,否则 Capital One 不隶属于所提及的任何公司,也不被这些公司认可。使用或展示的所有商标和其他知识产权是其各自所有者的财产。
Etsy 卖家的自动定价
使用无监督学习和线性回归的竞争性产品定价

Jewelry Making (image from pexels.com)
Etsy 是数百万手工产品的全球市场。这些卖家中有许多是网站新手,可能不了解市场或他们的竞争对手以及他们产品的定价技术。
我做了一个工具,可以给卖家的产品估价。该工具将为产品提供有竞争力的价格,并检查产品当前价格是否过高或过低。

注 :我在创建集群时使用了物品的价格。如果它是一个现有的项目,我用的是标价。对于上传新商品的新卖家,我会问他们一个估价,模型会告诉他们是高估还是低估。
数据
我使用 Etsy API 收集数据。截至 2018 年 12 月,Etsy 的市场上有超过 6000 万种产品。为了扩大我的项目范围,我从网站的“珠宝”部分收集了大约 30 万件商品的信息。

Screenshot of a sample listing of silver earrings from Etsy
这些产品横跨大约 20 个国家。我将所有的挂牌价格统一为美元。从产品网页上收集的其他属性是——它们的材质(金、银、珍珠等。)、产品分类(耳环、项链、订婚戒指等。),无论这款产品是复古的、最近制作的还是定制的,等等。
我还收集了一些现有卖家产品的流行度指标,比如收藏夹和浏览量。
假设
1
2 售价<$ 1000—Etsy 上有很多稀有的复古产品。镶有稀有宝石的老式订婚戒指价格高达 1 万到 2 万美元!!
我选择提供大多数市场的价格估计,忽略了极其昂贵的复古单品(约占产品的 2%)。
3 比如首饰→耳环→吊坠&吊坠。
此功能稍后将在模型中使用,它会影响价格估算。这些物品的不正确分类会导致价格估计的偏差。
思维
每当卖家上传新产品到他们的商店时,我想为他们提供一个价格估计。为此,首先,我想找到“相似”的产品(使用 k-prototypes 算法将产品聚类在一起)。然后,我想在线性回归算法中使用这个“cluster”标签作为一个特征,以及其他属性来预测商品的价格。
聚类-K 原型
我用于聚类的大多数特征都是分类特征。例如,“材料”有许多价值,如金、银、钻石、珍珠等。此外,每个产品可以有一个以上的材料价值。
为了对珠宝项目进行聚类以找到“相似”的项目,我使用了 K 原型 算法。这是更流行的 k-means 算法的变体。两者之间的显著区别在于它们处理分类数据的方式。
K-Prototypes 在数字特征上使用 k-means(欧几里德距离),在分类特征上使用 k-modes(相异度量)。它不是使用平均值来计算聚类的“质心”,而是计算每个聚类的“原型”作为代表。
方法
在我的数据集中,我有许多 1 级子类别——耳环、项链、戒指、手镯、脚链等。每个类别有各种子类别,如耳环有箍耳环,耳钉等。
定义聚类的特征-类别、子类别、材料、产品制造商(卖方、第三方卖方)、产品制造年份(2000 年之后、定制、年份)、项目价格、可定制性、查看次数、收藏数量。
我尝试了两种方法。 第一个 ,将所有子类别聚类在一起。我得到的集群是重叠的,没有很好的定义。
第二个 ,我尝试了两层的方法。我将每个类别的数据集分开,然后分别对每个类别进行聚类。 这种有针对性的聚类给了我更纯粹、更分离的聚类。这是有道理的,因为直觉上,一对金耳环和一条金项链的价格会在不同的范围内。
集群
类似于 k-means,我们可以使用惯性来找到最佳的“k ”,我使用 k-原型的成本函数来找到最佳的集群数。我对 3 到 25 个集群和耳环运行了该算法,得到 20 作为具有最小成本值的“k”。
下面是我得到的一组耳环的例子—

这张照片描述的是一串大多是黄金耳环,由卖家 在 2000 年 之后制作。一般都是 不可定制 ,本簇耳环均价为 $370 。
定价—线性回归
接下来,有了这些集群,我继续回归世界。连同其他特征一起,我在回归模型中使用这些聚类标签作为特征。
我尝试了几种方法。首先,使用 scikit-learn 进行简单的线性回归作为基线。

我得到了 13.1 美元的平均绝对误差。这意味着,我的价格估计会比这些珠宝的最佳价格低大约 13 美元。
这是一个很好的基线。接下来,我使用一个 XGBoost 回归器来看看我是否可以改进基线模型的性能。

确实!XGBoost 模型在平均绝对误差(MAE)和平均绝对百分比误差(MAPE)方面确实稍好一些。
我关注梅和 MAPE 的原因是产品的价格范围很广(1-1000 美元)。让我们更深入地探讨一下。
如果我看的是 500 美元的项链,12 美元的预测误差并不算多。然而,如果我看的是 20 美元的耳环,那就大错特错了。因此,为了研究这种差异,我按照商品的价格范围对误差进行了分解。

Breakdown of the Mean Absolute Error by price range of jewelry products
权衡
因此,XGBoost 比传统的线性回归做得好一点。然而,在选择我的最终模型时有一个权衡。
线性回归更容易解释,而 XGBoost 的预测更准确。
如果卖家可以灵活选择他们可以出售的商品,线性回归会更有帮助。这些系数会告诉你什么卖得最好。然而,如果卖方只是销售他们生产的或库存的产品,预测的准确性对他们来说更重要。考虑到这一点,我决定继续使用 XGBoost 作为我的价格预测模型。
XGBoost 的特性重要性
XGBoost regressor 为模型中使用的所有功能提供功能重要性。它是所有特性的相对排名。
我使用聚类的标记数据进行回归。也就是说,在我的模型中,聚类标签也是其他产品属性的特征。
当我观察特征的重要性时,聚类的排名高于单个属性。
个体特征之间的相互作用很重要。由于集群很好地解释了这些交互,XGBoost 将它们排在比任何单个特性更高的位置。
例如,“可定制性”是一个重要的特性。如果是定制的耳环可能会涨价。但是如果是定制的银耳环和定制的金耳环,价格会有不同的变化。
该应用程序
我使用 Flask 创建了一个工具,它将产品属性作为输入,并实时将其分配给一个集群。回归模型使用这一点,并提供一个建议价格。

结论
这个工具可以帮助 Etsy 上的新企业家为他们的项目定价,并在 Etsy 上开始他们的业务。
定价算法或细分并不仅限于 Etsy 产品。任何市场业务都可以利用这些算法。一些这样的应用是 Airbnb 房产的定价、DoorDash 上餐馆项目的定价等。像 LinkedIn 这样的工作论坛可以使用这些技术来根据工作描述提供估计工资。
资源
k-prototypes 算法, Github , LinkedIn
自动语音识别作为 AWS 上的微服务

本文将帮助您在 AWS 基础设施上使用 Kaldi Toolkit 建立自己的 ASR 管道,为您提供可伸缩性和高可用性的选择。
本文假设读者对云计算和相关术语有必要的了解,此外,任何实际经验都可以帮助您在一个小时内完成所有工作!
在我开始阅读设置这个管道的指导手册之前,让我们先来看一下三个基本问题
这个工具是做什么的?
简而言之,用户上传任何英语音频文件,该工具将提供相同的转录并存储到数据库中,然后可用于各种用例
为什么要打造这个工具?
对于那些业务围绕音频/音频形式的对话的人来说,构建这样一个工具不仅会在文本分析方面开辟无限的可能性,还能让他们开发自己的自助产品。
请注意,在语音转文本领域,这种技术非常少!
平视
这个工具利用了 Kaldi 预先训练好的神经网络英语模型来转录成文本。虽然这个模型的词汇量相当大,但是仍然不足以为您的用例选择非常罕见/特定的单词。

Kaldi Logo
有没有可能 有,是开源项目。如果你在定制方面需要帮助,请随时联系我
架构
介绍完毕,让我们深入应用程序的数据流。该架构本质上为您提供了我们使用 AWS 基础设施的工具的鸟瞰图

AWS Architecture of the Tool we will develop. Repeated numbers depict that some processes happen in parallel to others. By the time time steps [2 > 3 > 8] happen, [3 > 4 > 5 > 6 > 7] will have finished processing
合适的工具
我们可以在一台服务器上从头到尾执行每一个动作,就这样!当设计作为几乎所有产品核心组件的数据管道时,我们需要开始研究数据工程的基础知识
从技术的角度来看,对于一个产品,并且最终会被大量用户使用的东西来说,这三条规则是必不可少的
- 成本效益:有没有更便宜的方法来做这件事,而又不影响质量?
- 高可用性:如果其中一台服务器崩溃,那么整个产品会崩溃吗?
- 可伸缩性:我们能让这个工具自己处理峰值负载吗?
即使你的工具只是另一个 MVP,不遵守这 3 条规则可能会成为你的产品的一个昂贵的错误。于是, AWS 云
虽然 AWS 有一套广泛的工具,但明智地选择它们就更有道理了。以下是我们用来开发工具的 AWS 工具列表,其中大多数工具都包含在 AWS 自由层 中。不过,在某些时候,你的使用可能会收费。我建议你在开始实施之前留意一下价格。
- S3: 简单的仓储服务。你能得到的最便宜的存储
- EC2: 计算服务器。 t3a.xlarge 实例
- 动力数据库: NoSQL 数据库
- Lambda: 大规模处理小脚本执行的计算服务
- AWS API: 很好的选择,因为很难编写可伸缩的 API 服务
建立基础设施
你可以利用 GitHub 上的代码让你的 Infra 马上发挥作用!
Github:https://github.com/purijs/kaldi-asr-aws
请参考 Github 上的 README.md 文件,它详细解释了如何在 EC2 实例上设置一切。
你可以自由选择任何一种 EC2 机器。然而,我发现下面的配置足以实现这个管道
- EC2: t3a.xlarge
- 50GB 磁盘空间
- 图片:亚马逊 Linux 2 AMI (HVM)
- 安全组:打开端口 80 (HTTP)、8080 (FLASK)和 22 (SSH)
由于这种类型的 EC2 实例不包括在自由层中,您可能会在这一点上产生成本。如果您无论如何都要获得它,请确保它处于停止状态,因为我们不会马上使用它
继续使用上面的配置获取 EC2 实例,并将上面的 Git 存储库克隆到您的服务器中。一旦您做好了设置,我们将在 AWS 控制台上完成以下步骤
-创建一个具有 S3 读/写权限的 IAM 角色并将其附加到您的实例
-为 lambda 函数创建一个 IAM 角色以读取/写入 DynamoDB
-配置 S3 桶
-编写第一个 Lambda 函数以读取音频文件的元数据
-设置 AWS API 以触发我们的第一个 Lambda 函数
-使用 Kaldi ASR 配置 EC2 实例(此时克隆 git 代码!)
-编写第二个 lambda 函数来读取/写入脚本到 DB
-设置 DynamoDB
-用 Flask App 链接管道
实用
- 为 S3 制作 IAM 角色


Go to IAM from AWS Console, select “Create Role” and choose EC2 and “Next” | 2. Choose “S3FullAccess” in Policies | 3. Tags are optional, name this role and click “Create”


To attach this role to your EC2 instance, 1. Go to the EC2 dashboard, select your instance, and choose “Actions” > “Instance Settings” > “Attach/Replace IAM Role” | 2. Select your role and continue.
现在,您可以运行“AWS s3”CLI 命令并从 EC2 访问 S3 存储桶,而无需使用/存储帐户密钥
2。为 Lambda 函数设置 IAM 角色


Similarly, create a role for “Lambda”. Make sure you add permissions for DynamoDBFullAccess and S3FullAccess (Refer the screens above)
【更新】:除了以上两个策略,还要加上这些:
- CloudWatchFullAccess
- LambdaFullAccess
3。配置 S3 铲斗
现在,我们已经为不同的 AWS 服务设置了必要的访问权限,接下来我们将设置第一个服务,即 S3
目的:
传入:存储用户上传的音频文件,一经 EC2 处理将被删除
传出:存储音频的抄本。txt 文件,稍后 Lambda 函数会读取该文件,然后将内容转储到 DynamoDB 中


Go to S3 from console, create a new S3 Bucket, keeping all other settings to default (Changing region is fine, but make sure your Lambda Functions are also in the same region). Once created, make two directories as explained above
4。第一个λ函数
简单来说,AWS Lambda 允许你运行 Python/NodeJS/Bash/etc。就像在 EC2 机器上运行一样编码。唯一的区别是,除了一些技术上的,你只在这段代码运行时才被收费,也就是说,对于每个触发器,它的伸缩性也很好!
这个 lambda 函数将运行一个 Python 代码,该代码将读取存储在 S3 中的文件名,并将它们转储到 DynamoDB 中。
这是参考架构图的步骤 5、6 和 7
注意我们是如何尽可能地去耦合组件的
从 AWS 控制台的服务部分选择“Lambda”。确保您已经选择了“从头开始创作”框


1. Choose the runtime as “Python 3.6” as our code will be .py file | 2. In execution role, what all permissions your lambda function can have, choose ‘use existing role’ | 3. In the dropdown, select the role you previously created for Lambda in the 2nd step. Once done, you’ll see a screen like on the right
如果向下滚动一点,您会看到一个集成的代码编辑器,其中包含一些虚拟 python 代码。继续替换下面 Git 链接中的代码:
[## 普里吉斯/卡尔迪-阿斯尔-aws
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/purijs/kaldi-asr-aws/blob/master/lambda/incoming-lambda-handler.py)
下一步,我们将有一个 AWS API 作为这个函数的触发器。
由于这是我们管道中的第一个执行阶段,当用户单击我们 web 页面上的“Submit”按钮时,会发生两个系列的事件。
- 文件被上传到你在上面创建的 S3 桶
- AWS API 被称为[POST],其中用户的文件名和电子邮件作为 JSON 值传递
5。部署 AWS API
从 AWS 控制台转到 API 网关部分,并按照下面共享的屏幕进行操作


1. On clicking the “Create API’ button, keep everything default. | 2. Click on ‘Actions” and choose ‘Create Resource’. Give it a name and enable CORS


Once done, click on “Actions” again and choose “Create Method”. A dropdown will appear, select “POST” like in the screen on the left. 1. Set the integration type to “Lambda Function”, enable the “Proxy Integration”, finally, enter your Lambda Function’s name.
再走几步…


Once you’ve created the resource and the screen like on the left is visible, click on “Method Request” and set API Key Required to True


Finally, click on “Actions” and select “Deploy API”. Give this stage a name eg: prod, dev, test. On clicking Deploy, you’ll see your API URL in front of the Invoke URL text
至此,您已经配置好了 API,并将其作为触发器添加到 Lambda 函数中。为了使这个 API 安全,这样你的 API 就不会在一夜之间暴露或耗尽,我们还必须设置一个 API 密钥。
这一点至关重要,因为任何人都可以不断点击 API 的网址,很快,你的成本就会飙升。


1. On the left side Navigation panel, click on “Usage Plan” and then “Create”. Most of the settings are self-explanatory. However, you may choose to keep the settings as in the left image. | 2. Click “Next” and select the correct API & Stage you configured previously. Hit “Next” and then “Create API Key and add to Usage Plan”


Give the Key a name and hit “Next”. You may click “API Keys” on the left navigation panel to view the key
就是这样!我们现在已经完成了管道,直到音频文件被传递到我们的 EC2 机器
这些是参考架构图的步骤 3 和 4
到目前为止,你在 AWS 上设置的所有东西都不会花你一分钱,因为有两个主要原因:
- 你在免费层(如果你第一次注册)
- 如果不是,没问题,服务 S3、Lambda 和 API 是按使用付费的。除非你使用它们,否则你不会被收费。
卡尔迪·阿斯尔
Kaldi 是一个强大的语音识别工具包,作为开源产品提供。该工具包或多或少是用 C/C++/Python 语言编写的,在 google groups 上也有一个非常活跃的支持/讨论社区。如果你有问题的话,这个工具包的创始人丹尼尔·波维是最会回答你的问题的人。
就像任何 ML 模型一样,ASR 模型可以针对您的特定语言/音频进行训练,或者我们可以使用在 Kaldi 网站 上提供的预训练模型
虽然训练一个模型超出了本文的范围,但是我们将利用一个英语训练的神经网络模型。对于所有的神经网络爱好者来说,典型的 ASR 模型具有以下训练参数:
- 大约 10 个时代
- 大约 10 到 13 个隐藏层,每个层有 1024 个维度
我们场景中使用的预训练模型的 WER(单词错误率)约为 15.6%,的意思,精确度约为 85% 。
ASR 解码
让我们快速了解一下我们的 ASR 模型实际上是如何理解音频,然后能够组成有意义的句子的。ASR 解码利用训练时输入的多种资源,例如:

Source: One of the lectures from https://www.danielpovey.com/
- 词库:带有各自音素的单词列表,将音频与一个音素进行映射。一组音素组成一个单词
- Ngrams :很多上升到 4 克,预测下一个可能的单词
- WFST:加权有限状态转换器:组合音素和单词并形成句子
- 好多数学!
虽然 Kaldi 必须提供许多模型,如单音、三音、SAT 模型,但链(神经网络)模型明显优于其他模型。
我们将使用卡迪的 ASpIRE 链模型和已经编译好的 HCLG。这个包含在 Github 上的 model.zip 文件中
实用的
让我们快速回到我们的实验室工作,用几个简单的步骤实现这个高度复杂的工作。此时,您应该已经启动 EC2 并进入其中。
请参考 Github 资源库 中任何缺失的资源/链接
- 在您的主目录[ /home/ec2-user ]中,维护以下目录结构
D -> Represents Directory
F -> Represents Filecd /home/ec2-user/ -audios D [ Files from S3 will be synced here ]
-audiosKaldi D
-processing D [ Files ready for Transcription are moved here ]
-sendWavToProcess.sh F
-kaldi D
-Dockerfile F
-models D
-model.zip F (unzip here)
-transcriptMaster.sh F
-transcriptWorker.sh F
-output D [ Transcription in .txt file will be store here]
ffmpeg F
getConvertAudios.sh F
uploadOutput.sh F
帮助您快速入门的命令列表
mkdir audios kaldi models output
mkdir -p audiosKaldi/processingwget -P /home/ec2-user/ [https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz](https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz)tar -xvf ffmpeg-release-amd64-static.tar.xzmv ffmpeg-4.2.1-amd64-static/ffmpeg ~/
sudo chmod 755 ~/ffmpegwget -P /home/ec2-user/models/ [https://crossregionreplpuri.s3.ap-south-1.amazonaws.com/model.zip](https://crossregionreplpuri.s3.ap-south-1.amazonaws.com/model.zip)unzip /home/ec2-user/models/model.zip -d /home/ec2-user/models/sudo yum install -y git
sudo yum install -y docker
sudo service docker start
alias docker='sudo docker'
2。接下来,我们需要在 crontab 中创建一个条目
Crontab 会以固定的时间间隔自动运行我们的一些脚本。
crontab -e# PASTE THESE 2 LINES*/1 * * * * sh ~/getConvertAudios.sh
*/2 * * * * sh ~/uploadOutput.sh
3。卡尔迪很严格
在训练模型时作为输入给出的音频文件的属性需要在对新数据进行测试时得到维护。在我们的例子中,Kaldi 也将接受一种非常特殊的音频文件格式,主要是
- 。wav 声音文件
- 8000 比特率
为了确保我们每次都有正确的格式,因为用户可以上传任何类型的音频文件,我们使用了 ffmpeg 来转换音频文件。
关于正在使用的外壳脚本的一些信息
**getConvertAudios.sh** -> This script syncs files from S3 into audios/ directory and using ffmpeg converted and stored into audiosKaldi/**uploadOutput.sh** -> This script syncs the .txt files in output/ directory into S3 bucket**sendWavToProcess.sh** -> This script limits the number of files for processing to the number of cores on the VM for parallel processing**transcriptMaster.sh** -> This script calls transcriptWorker.sh for every audio file placed in the **processing** folder and ensures at any time only *#no. of cores* amount of files are running**transcriptWorker.sh** -> Where the magic happens, actual transcription happens through this file.
4。设置 Kaldi Docker
我们需要使用 Dockerfile 构建 Kaldi 映像,这意味着安装 Kaldi 运行所需的依赖项。
cd kaldi/
docker build -t kaldi . &
这可能需要一个小时,所以是时候喝杯咖啡了!
完成后,运行这个命令来启动 Kaldi 容器
docker run -d -it --name kaldi -v ~/models:/models/ -v ~/audiosKaldi/processing:/audios/ -v ~/output:/output/ kaldi bash
最后,我们需要启动 sendWavToProcess.sh 脚本,这样脚本就可以继续向 Kaldi 容器发送文件
cd /home/ec2-user/audiosKaldi/
sudo chmod 755 sendWavToProcess.sh
./sendWavToProcess.sh &# Ignore any errors you see on your terminal
确保您已经更新了这些文件中的存储桶名称:
getConvertAudios.sh
uploadOutput.sh
5。第二λ函数
由于 DynamoDB 支持动态模式,这意味着我们可以在数据库中动态创建新的字段/列,该函数将更新数据库中的当前记录,并添加一个名为抄本的新列
如果你还记得,我们创建了两个文件夹传入 &传出,在我们的 S3 桶中。输出即文本文件存储在外发文件夹中。我们新的 lambda 函数将和我们的第一个一样,唯一的区别是触发点。
任何时候,一个。txt 上传/创建在 s3://bucketname/outgoing 文件夹中,lambda 函数将被触发



Note the configuration in the right-most screen. The trigger is explicitly set for “output/” directory and “.txt” files only
此 lambda 函数的 Python 代码可从以下网址获得:
[## 普里吉斯/卡尔迪-阿斯尔-aws
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/purijs/kaldi-asr-aws/blob/master/lambda/outgoing-lambda-handler.py)
6。DynamoDB:一键 DB 设置
从 AWS 控制台转到 DynamoDB,创建第一个表。将 audioAnalytics 设置为您的表名,或者在两个 Lambda 函数的代码中更改名称

The Table Name & Primary Key you set here should be in sync with the code in both the Lambda Functions
7。最后,网页界面
我们的 web 应用程序只是另一个 Flask 应用程序,您可能想查看 Github 链接,了解如何在 EC2 服务器上设置/安装 Flask/Python。
一旦你在虚拟环境中,尽管不建议用于生产工作流程,你可以简单地将 flask-app 目录克隆到你的工作目录中,例如: /var/www/html/
python app.py &
这将在后台运行 flask 应用程序。
在浏览器中,键入 EC2 的 IP,端口号为 8080
http:// <您的 IP > :8080/
在文本字段中,键入有效的电子邮件,然后上传。wav/.mp3 音频文件

A snapshot of the DynamoDB table, you can see some of the transcripts have started to stream in!
在运行以下两个命令时,一旦音频文件位于/home/ec2-user/audiosKaldi/processing文件夹中,Kaldi 将开始转录这些音频文件
docker exec -it kaldi bash# Once you can see some files in the /audios/ folder, run:
/models/transcriptMaster.sh
请随意联系或者把你的问题/反馈贴在这里,因为我相信这是很多实用的东西,通常第一次尝试不会很顺利!
自动文本摘要:简化
了解自动文本摘要的世界
为什么是文本摘要?
以封面来判断一本书不是正确的做法..但是我想一个总结就足够了。

在一个互联网每天都在以惊人的数据量爆炸的世界里,能够自动汇总是一个重要的挑战。长文档、新闻文章、甚至对话的摘要可以帮助我们更快更有效地消费内容。自动文本摘要是自然语言处理中的一个新兴领域,在过去的几年中受到了广泛的关注。

inshorts : An innovative mobile app that converts news articles into 60 word summaries.
我不会讨论任何算法或实现的具体细节。这个博客是为那些想更深入了解这些文本摘要模型如何工作的好奇的少数人准备的。任何以前没有深度学习或 NLP 经验的人都可以肤浅地关注这个博客。即使对常用的 NLP 模型有初步的了解,也足以充分理解其细节。
文本摘要的类型
有两种类型的文本摘要方法,即提取的和抽象的。提取摘要本质上是从文本中挑选出最能代表其摘要的句子。摘要技术由于其起源于 20 世纪 50 年代,已经流行了相当一段时间。更多的是学习理解每个句子的重要性以及它们之间的关系,而不是试图理解文章的内容。

另一方面,抽象概括就是试图理解文本的内容,然后在此基础上提供一个摘要,这个摘要可能有也可能没有与原文相同的句子。抽象概括试图创建自己的句子,这无疑是向更像人类的概括迈出的一步。
那么具体是怎么做的呢?
用于提取和抽象概括的技术彼此相差甚远。如前所述,概括地说,提取摘要是一个句子排序问题,而抽象摘要在生成新句子时涉及更复杂的语言模型。
我个人认为抽取式摘要已经走到了尽头,现在大部分的研究焦点都集中在抽象摘要上,这实际上是一个更有趣的问题..只是我的看法!!)。所以我不会谈论提取摘要,但如果你仍然有兴趣阅读它,我会建议这个可怕的博客。
对于那些有学术写作的人来说,总结——产生一个简洁流畅的总结同时保留…
medium.com](https://medium.com/sciforce/towards-automatic-text-summarization-extractive-methods-e8439cd54715)
在过去的几年里,自从深度学习的到来,抽象概括,通过自然语言与机器的交互以及机器翻译都取得了很大的成功。我在这里提到了机器翻译和交互,因为它与抽象概括是并行的。所有这些技术将输入的句子编码成特征,然后试图生成不同的句子,即解码这些特征。

一种常用的基于深度学习的机器翻译模型是基于 LSTM 的带注意力的编码器解码器网络。这个骨架有各种成功的变体,每一个都有自己的优点和缺点。
该模型从基于 LSTM 的编码器开始,该编码器将句子转换成特征向量。解码器也由 LSTM 组成,负责产生输出,一次一个单词。解码器从编码器提供的特征向量开始,然后基于前一个字预测和 LSTM 输出来预测每个字。我们将注意力放在编码器功能上,以使它们更加特定于当前单词。
一个基于 LSTM 的编码器和解码器网络的工作原理的详细解释可以在这个博客中找到。
注意力机制正越来越多地被用于改善神经机器翻译(NMT)的性能…
towardsdatascience.com](/attention-based-neural-machine-translation-b5d129742e2c)
好像都想通了!!
可惜,没有!生成新句子是一个复杂的过程,机器还没有掌握。抽象概括的一个问题是要编码的句子的长度。虽然 LSTMs 有能力捕捉长期和短期环境,但是它们对什么可以被认为是长期的也有限制。这使得总结非常长的文档变得困难。
摘要的另一个天文上的重要问题是它不应该包含与输入文本相矛盾的事实。摘要永远不会面临这个问题,因为它们直接从文本中提取句子。但是抽象概括容易出现这种事实上的不一致。
例如,如果一个抽象的摘要模型看到像德国 3–2 法国、英国 3–2 葡萄牙等句子。在测试时进行训练,它可能会预测西班牙 3–2 巴西,即使输入文本中的实际分数是 1–2。这是因为 1–2 不是模型词汇表的一部分,但 3–2 是。
听起来很糟糕!!
抽取式摘要缺乏创建自己的句子的能力,而抽象式摘要无法克服自身创建完整句子的复杂性。最近,在一个名为“指针生成器网络”的网络中,提出了一种介于这两个极端之间的非常有创意的方法。
更简单地说,作者以这样一种方式创建了网络,它对下一个预测单词应该是什么提出了两种不同的概率分布。第一个是基于模型的词汇,而第二个是基于输入文本中的词汇。然后将这两者结合起来得到最终的分布。你可以在这里进一步了解这个模型的细节。
这是一篇关于我们最新论文的博客文章,直入主题:用指针生成器网络进行总结,看起来…
www.abigailsee.com](http://www.abigailsee.com/2017/04/16/taming-rnns-for-better-summarization.html)
下一步是什么?
如果你观察一些抽象概括的最新成果,你会发现它们做得相当不错。但是它们只适用于某些类型的文档,而对于其他类型的文档则非常失败。在这一点上,最大的挑战之一是能够从编码特征中创建语法连贯的句子,这是抽象摘要和机器翻译的核心部分。
这个博客是为机器学习领域创建简化介绍的努力的一部分。点击此处的完整系列
在你一头扎进去之前就知道了
medium.com](https://medium.com/@prakhargannu/machine-learning-simplified-1fe22fec0fac)
或者干脆阅读系列的下一篇博客
看一眼自动化唇读的世界(ALR)
towardsdatascience.com](/automated-lip-reading-simplified-c01789469dd8)
参考
[1]卢恩,汉斯·彼得。"文献摘要的自动生成."IBM 研究与发展杂志 2.2(1958):159–165。
[2]Luong、Minh-Thang、Hieu Pham 和 Christopher D. Manning。"基于注意力的神经机器翻译的有效方法."arXiv 预印本 arXiv:1508.04025 (2015)。
3参见 Abigail、Peter J. Liu 和 Christopher D. Manning。"抓住要点:指针生成器网络摘要."arXiv 预印本 arXiv:1704.04368 (2017)。
数据科学家的自动版本控制
我为学习者写了一份名为《强大的知识》的时事通讯。每一期都包含链接和最佳内容的关键课程,包括引文、书籍、文章、播客和视频。每一个人都是为了学习如何过上更明智、更快乐、更充实的生活而被挑选出来的。 在这里报名 。
数据科学最棒的部分之一是从头到尾经历一个完整项目的冒险。从数据清理开始,到可视化,到特征构建,最后,训练机器学习模型。一个伟大的数据科学家的技能非常抢手,他拥有的高薪。
所有这些中的一个主要挑战是组织。
如今,数据科学家都是以小组形式工作,每个小组至少有几个成员。他们中的每一个人都在利用相同的数据,建立在彼此的工作基础上。

The many different components of great Data Science
不幸的是,数据科学团队成员经常在他们自己的小仓库中工作。他们创建自己的代码库,运行自己的 Jupyter 笔记本,并显示自己的可视化。在某种程度上,他们匆匆忙忙地将所有的信息融合在一起,形成了最终的报告。退一步说,这种配合并不完美。
但是一定有更好的方法。某种类型的系统或工具,允许大量处理数据和图形的人,即数据科学家,高效地与他们团队的其他人一起工作,以彼此的工作为基础。该系统需要灵活、易于使用,并且不会中断数据科学工作流程。
让我们看看我们能做些什么……
git 如何为数据科学服务
在常规的老软件工程团队中, Git 是组织代码、项目和团队协作的常用工具。团队成员在他们自己的本地代码上工作,但是总是与中央存储库同步他们的进展和新的开发。
这确保了每个人都是最新的和同步的。这是一个很好的方式,让团队的工作互相配合,而不是互相冲突,从而导致更高的产出。

Git flow. Team members work on their own “Feature” branches which are then all synced up in the “Develop” branch. Once the Develop branch is nice and polished, the production version of the code is synced up with Master.
数据科学有点棘手,因为它是研究和软件工程的结合:
- 数据本身很大,因此共享存储数据会很有挑战性。Git-LFS 有所帮助,但是使用起来相当慢。
- 大多数时候,代码变化很小,但是可视化效果看起来完全不同。Git 不允许显示从提交到提交的图形变化
- 数据科学家通常使用 Jupyter 笔记本。在 GitHub 上可视化笔记本的变化很可怕。它显示了。ipynb 文件,但不是我们在笔记本中发现有用的图表上的实际代码。
综上所述,我们可以开始了解一个好的数据科学版本控制系统应该是什么样子。
首先,我们寻求易用性。 DevOps 和后端工程师可能非常精通 git,但是数据科学更倾向于研究而不是工程。处理代码冲突应该特别顺利。
我们还想看看数据科学项目中的实际变化是什么。看到代码更改是好的,但这并不能说明全部情况。如果团队使用的是 Jupyter 笔记本,那就更是如此了,从视觉上看,代码太复杂了,无法告诉我们关于一些图表或数据操作是如何变化的。
最后,中央数据存储或工作平台非常有用。如果没有中央存储,数据科学家将不得不一直下载并准备自己的数据副本,这对于大型数据集来说效率非常低。
记住这些,我们现在可以研究一个解决方案
在数据科学中使用 Git 的平台
为数据科学准备版本控制系统的一个很好的选择是土星云平台。有了它,多名数据科学家可以在同一台 Jupyter 笔记本上工作,使用相同的数据集,但运行在他们自己的机器上。
数据科学协作
首先,我们将创建自己的托管 Jupyter 笔记本,任何有链接的人都可以访问。创建帐户后,下面的视频将向您展示如何操作。

Creating a hosted Jupyter Notebook
一旦我们建立并运行起来,我们就可以开始运行我们的 Jupyter 实验室了。一旦打开,您应该看到您的项目文件夹已经设置。
对于这个实验,我们将使用 2018 Kaggle ML 和 DS 调查数据集。该数据集由超过 23,000 个针对数据科学家和机器学习从业者提出的一系列关于薪酬的问题的多项选择答案组成。
数据集中一些有趣的事实:
- “数据科学家”的薪酬最高,高于“数据工程师”和“研究科学家”
- 科技公司的薪酬最高,其次是营销和金融
- 更多的经验和更高的教育会增加工资
- 美国的薪酬最高,其次是瑞士和澳大利亚
你可以点击查看 Jupyter 数据科学补偿的完整笔记本。

Data Scientist compensation
要开始团队协作,请转到您的仪表板,点击协作者链接。在其中,您将发现通过 Saturn Cloud 用户名向您的项目添加合作者的能力。
将用户添加到您的项目中会向他们发送一封个人电子邮件,邀请他们参与项目协作。一旦他们接受邀请,他们自己的云实例将会用完全相同的设置、库和软件来创建。
用户(数据科学家)可以立即访问他们自己版本的项目 Jupyter 笔记本和数据集。这使得多名数据科学家可以在相同的环境中工作,使用相同的数据,并以相同的起点开始他们的笔记本电脑!

Collaboration for Data Scientists
数据科学版本控制
现在我们可以进入土星云的版本控制系统。
一旦在您的实例上打开 Jupyter 实验室,您将看到您的工作界面。在屏幕的左侧有一个项目文件夹。在该项目文件夹中创建并保存的任何 Jupyter 笔记本都将自动启用版本控制。我已经把我的ds _ jobs . ipynb笔记本放到了项目文件夹中,以便在上面启用版本控制。
为了展示版本控制是如何工作的,我们将修改一些数据可视化。我们将假装只对欧洲国家的数据感兴趣,并过滤掉其他一切。一旦可视化被改变,我们将能够把我们的改变推送到一个远程的 git 存储库。下面这个 45 秒的视频展示了如何做到这一点!

Data Science Version Control
太好了!
我们能够对我们的 Jupyter 笔记本进行一些快速简单的修改。所有项目合作者(数据科学家)都可以访问该笔记本。因此,无论他们何时登录,他们都将能够看到您所做的更改,并可以选择提取这些更改,以便他们能够保持最新状态!
按需数据科学—倒带
另一个很棒的功能是倒带功能。它的工作方式类似于 git reset ,它基本上只是恢复我们的更改,这样我们就可以回到以前的状态。如果你觉得自己犯了一个错误,想要回滚,或者只是想看看以前的情况,这是非常有用的。
假设我们想要回滚到我们的可视化,显示数据科学补偿的所有区域。我们将再次点击右下角的 git 按钮。这一次,点击就可以倒带这个资源库的链接。弹出一个滑块,您可以在其中选择希望回滚到的时间。一旦设置好,你就可以看到你的旧代码和图表了!

Rewinding Jupyter Notebooks
这才是控制!
喜欢学习?
在推特上关注我,我会在那里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上与我联系!
自拍的自动白平衡调节
时尚科学来拯救!(其中包括机器学习)
问题是相机真的很努力——但坦率地说,在呈现准确的肤色方面经常失败。在我的例子中,为智能手机建立一个个性化的颜色推荐工具,我要求肤色要像皮肤一样。

Before and After Automatic White Balance Adjustment
下次你在脸书的时候,看看人们给自己的图片。它们离我们有多远,以及人类大脑是如何适应这种情况的,真是不可思议。
为了说明这一点,举例来说,Photoshop 确实有多种颜色校正算法。不幸的是,它们并不总是有效,最终的方法要求一个人在图像中找到一个灰点。我们确实有他们没有的优势——我们知道这张照片是自拍,我们知道如何提取肤色——相信我,文章就要来了。

Accurate skin colors
我们来看一些数据。随附的图表显示了在受控灯光下精心制作的一系列模特的肤色。很明显,这里有一个很好的模式。
我进一步指出,这代表了人性和大致的肤色范围。

Real-life Model Results plotted against Baseline Models
那又怎样?
这是上面的同一组数据,现在用红 x 表示。(简化为二维,红色对绿色。)肉色圆点来自用 iPhone 拍摄的现实生活中的模特。有些很离谱——他们是人类吗?
但是更好的是——它们都来自同一个人!
谁知道这种变化来自哪里——照明类型/温度、照明位置、曝光、相机显影处理等等。有很多变化。
顺便说一下,我们从我们的应用程序“所有的眼睛都在色调上”收集了超过 10 万张模型图像(在匿名的承诺下)用于分析。显示的测试集是一个用户在不同条件下拍摄了大约 20 张自拍。谢谢匿名人士!
所以首先,一个工作定义白平衡。见鬼,去维基百科,搜索“色彩平衡”以获得更好的定义。m 定义是图像在红色、绿色和蓝色通道中被线性地独立破坏。通过将每个像素乘以每个 RGB 通道的白平衡调整因子,我们可以校正图像。那三个线性调整——姑且称之为 R wb ,G wb ,B wb 。是的,这显然是一种简化——但它似乎在大多数情况下都能产生足够好的结果。
解决方案 1
校正图像的一个简单方法是:
- 识别模特的肤色
- 确定基线中最接近“好”模特的肤色——上图中的红色 x
- 将模型的皮肤颜色拖到最接近的“好”模型上。
就是这样。数学很简单。这很有效——我们每次都能得到“人类”的肤色。顺便说一下,我有一个俗气的 iOS 应用程序可以做到这一点——更好的 Selfie⁴.
但是等等…

我想我在上面的图表中提到过,所有这些变异都来自同一个人。将每种肤色拖到最接近的“好”肤色会给我们好的肤色——但不是他们的那种,真正的肤色。这就是我想要的!让我们重新定义这个问题——我们希望将所有这些不同的肤色统一为一种肤色。
顺便说一下,为了测试我们的方法,我们将假设正确的“好”答案是使用解决方案 1 的所有校正肤色的平均值。
解决方案 2
机器学习 101。获取大量训练数据来训练模型。完成了。
我们的训练数据从之前显示的“好”模型开始。每种肤色都有特定的平均 RGB 值。它的白平衡校正系数为 1.0、1.0、1.0。也就是说,不需要进行白平衡校正就可以将其校正到良好的肤色。
我们需要的是一个涵盖可能的“坏”肤色范围的训练集,以及相应的白平衡校正因子,以将其移回“好”肤色。我们要做的是用不同的白平衡因子生成糟糕的合成肤色。例如,如果我们想创造一个合理的“坏”肤色,我们可以将“好”肤色乘以 1.1、0.9、1.05。用于回到“良好”状态的白平衡与此相反,即 1/1.1、1/0.9、1/1.05。很简单。

Synthetic Training Set
创建大型数据集有不同的方法。一种方法是在可能的范围内使用高斯分布。另一种方式是三角形分布(numpy . random . normal/numpy . random . triangular)。我们最终得到的是一大组训练数据。
这里有价值的优化是创建训练集,以便覆盖预期的“坏”肤色,但仅此而已。这使我们能够将我们的训练数据点集中在它做得好的地方。(我觉得那是个专业术语。)
从这里让我们跳到 Python。
cls = Classifier()cls.fit(X_train, y_train)predictions = cls.predict(X_test)
我们需要的是训练许多可能的分类器中的一个。这些来自 scikit-learn 库以及一些定制的神经网络方法。以下是各种方法的结果:

上面的列表示:
- 方法——实际使用的分类方法。比如线性回归参考 sk learn . Linear _ model . Linear Regression,后面三个解释一下。
- 相同模型的均方误差—根据我们之前对正确答案的定义,这显示了我们的预测结果与该平均值的均方误差。越低越好。
- 集群——请记住,我们的目标不仅仅是获得“好”的肤色,而是获得一个“好”的肤色。事实证明这是不可能的——但是 3 比 10 好——我们仍然可以解决这个问题。顺便说一句,我们使用肘方法来确定集群的数量——“没有肘”意味着没有一个明确的答案。
最后三个分类器是使用 Keras 定制的神经网络。
- 仅 DNN 平均颜色-这是一个密集的神经网络,输入仅为肤色 RGB,输出为白平衡校正
- CNN-仅图像-这有一个 CNN 输入来开始拍摄眼睛周围的图像,包括大量的肉,输出是白平衡校正。这个想法是,见鬼,让 CNN 发挥它的魔力,也许加入一些眼睛的颜色——巩膜和虹膜。
- CNN +标量注入——这是上述两种方法的结合。每一个都有其相应的输入,但它们加入了一个密集的神经网络,以产生白平衡校正的输出
正如你从图表中看到的,DNN 平均颜色比其他方法都要好。
所以我们仍然有 3 个集群,我们需要 1 个…
好吧,所以这不能完全解决我们的问题。对于正确的肤色,我们得到的不是一个事实,而是三个潜在的事实。我只想说,不是同一个人的每一个可能的损坏图像都可以被校正到一个肤色,而不需要比单个图像提供的更多的知识。
所以我又变了两个戏法:
- 训练美国有线电视新闻网检测非常糟糕的图像。这是基于完整的自拍图像,我将图像分类为不可接受或可接受。不可接受的原因是明亮照明、黑暗照明和眩光等因素。与白平衡关系不大,但对更广泛的目标(为个人创建个性化的最佳调色板)很重要的是不可接受的元素,如眼镜和阴影。这个 CNN 在过滤掉明显不好的图像方面做得很好,我们可以要求用户拍摄另一张图像。
- 手动将“好”肤色的数量限制在一个能够产生“一个”答案的数量,而不会过度限制所有人看起来相似。
还不错!
总之,这是一种自动白平衡校正的强大方法。
未来的方向实际上只是机器学习 101 方向,即模型和更多数据点的调整。

Sample Before/After Selfies
脚注
https://www.youtube.com/watch?v=B-W44JJToG8
http://johnthemathguy . blogspot . com/2013/08/what-color-is-human-skin . html
https://itunes.apple.com/us/app/better-selfie/id999484452 的⁴
自动分析实验室测试数据
教程:自动分析实验室数据以创建性能图
如何编写为您执行数据分析的 Python 程序

科学家发现自己拥有大型数据集是很常见的。有时,它以单个文件中数千兆字节数据的形式出现。有时是数百个文件,每个文件包含少量数据。无论哪种方式,都很难管理。很难理解。你的电脑很难处理。您需要一种方法来简化这一过程,使数据集更易于管理,并帮助您跟踪一切。
这就是本教程的内容。我们正在编写 Python 脚本,它将自动为您分析所有数据,并以有意义、直观的文件名存储数据。同时使用来自实际研究的例子,这样你就知道你正在发展的技能是实用和有用的。
本教程的第一篇文章介绍了本教程的概念。如果“热泵热水器”、“性能系数(COP)”和“性能图”这些术语对你来说毫无意义,你可能想读一下。
第二篇文章介绍了的配套数据集,将数据集分割成多个文件,并使用用户友好的名称。
伴随数据集是教程过程中有价值的一部分,因为它允许您跟随。您可以编写与我将要展示的完全相同的代码,运行代码,查看结果,并与我展示的结果进行比较。这样你就能确保你做得对。
在本教程的第二部分结束时,我们现在有三个数据文件,每个文件都包含指定环境温度下的测试结果。在这些文件中,我们可以看到热泵的耗电量、储水箱中的水温以及热水器周围的空气温度。
下一步是处理这些结果。我们需要编写一些代码来自动理解数据,计算热泵的 COP,并绘制数据,以便我们可以直观地理解它。
事不宜迟,我们开始吧。与所有 Python 编程一样,我们需要首先导入包。
我需要导入什么包?
这里有几个对这一步非常重要的包。它们是:
- glob 是一个列表创建包。它读取存储在文件夹中的文件,并创建一个包含所有这些文件的列表。因为 Python 非常擅长遍历列表,所以我们可以使用 glob 来创建所有数据文件的列表,并让 Python 一次分析一个。
- 熊猫:需要我说明这个包裹的重要性吗?pandas 是 Python 中数据分析工具的黄金标准。
- os : os 让我们可以访问操作系统命令。这听起来很吓人,因为使用它你可能会把你的电脑搞砸。不用担心;我们将只使用它来检查和添加文件夹。
- numpy 是一个伟大的数字包,它支持强大的数据分析工具。在这个特定的例子中,我们将使用 numpy 来创建数据回归。
- bokeh 是 Python 中的一个交互式绘图工具。它使您能够编写在分析数据时自动生成图的代码,并为用户提供与它们交互的选项。进一步了解散景的一个很好的来源是用散景进行实际数据可视化。
在本教程的这一部分,将不会在脚本中使用散景;然而,这个相同的脚本将是未来部分的基础。现在导入散景是值得的,这样你就不用担心它了。
对于这个项目,我们需要导入整个 glob,pandas,os 和 numpy,而只从 bokeh 导入某些功能。这些都可以使用以下代码调用:
import glob
import pandas as pd
import os
import numpy as np
from bokeh.plotting import figure, save, gridplot, output_file
注意,pandas 被导入并分配给 pd,numpy 被分配给 np。这意味着我们现在可以通过写“pd”和“np”来引用这些包,而不是熊猫和 numpy。
既然我们所有的包都被导入了,下一步就是创建我们的 glob list 和 for 循环来依次遍历所有的文件。准备好后,您就可以编写代码来分析我们的每个数据文件了。
我如何遍历我所有的文件?
第一步是配置 glob。为此,您需要为 glob 提供一个路径和一个文件类型(文件类型是可选的,但是我们的所有数据都在。csv 格式,所以我们希望指定它以避免包含无关文件)。然后当你调用 glob 时,它会在指定的文件夹中创建一个该类型的所有文件的列表。这可以使用以下代码行来完成:
Path = r'C:\Users\YourName\Documents\AutomatingDataAnalysis\Files_IndividualTests'Filenames = glob.glob(Path + '/*.csv')
Path 变量告诉 glob 在指定的文件夹中查找相关的文件。请注意,上面指定的文件夹与您在本教程第一部分中保存文件的文件夹相同。
第二行调用 glob 包中的 glob 函数来创建所有指定文件的列表。请注意,代码引用了您指定的 Path 变量来说明 glob 应该在哪个文件夹中搜索文件。接下来是声明 glob 应该包含所有。csv 文件,没有别的。
这段代码完成后,glob 将创建一个包含所有。文件夹中的 csv 文件。它将具有[1.csv,2。csv,3.csv,…,n.csv】。对于那些已经下载了配套数据集并正在跟随教程的人来说,它将是 PerformanceMap_HPWH_55.csv、PerformanceMap_HPWH_70.csv 和 PerformanceMap_HPWH_95.csv 的完整路径
现在您已经有了一个文件列表,下一步是创建一个 for 循环来遍历这些文件。然后,您需要打开这些文件,以便可以对每个文件执行数据分析。为此,您需要以下代码:
for Filename in Filenames:
Data = pd.read_csv(Filename)
这段代码自动遍历文件名列表中的每个条目。请注意,这种编写方式导致 Filename 保存列表中每个条目的实际文件名。例如,第一次通过 For 循环时,文件名将包含 PerformanceMap_HPWH_55.csv 的完整路径。
第二行代码使用 pandas 将文件读入内存,并保存到数据中供以后分析。
既然文件已经定位并按顺序打开,下一步就是添加分析每个文件的代码。这将是我们的下一步。
如何编写代码来自动分析每个文件?
除了 Python 编程知识之外,这还需要大量关于正在研究的设备的知识。因为我假设你不是 HPWHs 的读者,我会确保写出相关信息。
过滤数据以仅包含重要部分
对于此过程,我们只关心 HPWH 中的热泵处于活动状态时的数据。这些设备中的热泵通常消耗 400–600 W,具体取决于环境温度和水温。同时,他们有消耗一些电力的机载电子设备。为了将数据过滤到我们所关心的部分,我们需要移除功耗小于 300 W 的所有数据,该功耗被选择为显著高于板载电子设备的功率消耗,但低于热泵的最小消耗。我们可以使用下面的代码行来实现这一点:
Data = Data[Data['P_Elec (W)'] > 300]
这一行重置了我们的数据帧,使仅包含器件功耗超过 300 W 的数据。但这确实影响了数据帧的索引,因此我们需要重置它,以保持数据帧干净。为此,我们可以使用以下代码:
Data = Data.reset_index()
del Data['index']
识别测量之间的时间变化
现在,这个数据集中的时间戳数据不容易处理。幸运的是,我们从与实验室测试伙伴的合作中了解到,测量每 10 秒进行一次。因此,我们可以使用以下代码在数据框中创建一个新列,说明测试已经进行了多长时间:
Data[‘Time Since Test Start (min)’] = Data.index * 10./60.
计算储存在水中的能量的变化
影响 HPWHs COP 的一个关键参数是储水箱中的水温。水混合得不够好,无法保持一个恒定的温度。通常情况下,水箱底部是冷水,顶部是热水。为了这个练习,计算水箱的平均温度就足够了。由于我们的实验室测试人员好心地通知我们,他使用了 8 个均匀分布在水箱中的温度测量值,我们可以使用以下公式计算平均水温:
Data['Average Tank Temperature (deg F)'] = (1./8.) * (Data['T1 (deg F)'] + Data['T2 (deg F)'] + Data['T3 (deg F)'] + Data['T4 (deg F)'] + Data['T5 (deg F)'] + Data['T6 (deg F)'] + Data['T7 (deg F)'] + Data['T8 (deg F)'])
现在,我们真正关心的是水箱的平均温度在不同的测量时间有多大的变化。这样,我们可以确定储存在水箱中的能量的变化,从而确定热泵增加到水中的能量。我们可以使用下面两行代码来实现这一点:
Data['Previous Average Tank Temperature (deg F)'] = Data['Average Tank Temperature (deg F)'].shift(periods = 1)
Data.loc[0, 'Previous Average Tank Temperature (deg F)'] = 72.0
第一行使用。pandas 数据框的 shift 命令,用于在包含“平均油箱温度(华氏度)”数据的数据框中创建一个新列,但在数据框中下移一行。这会在第一行(索引 0)中创建一个空单元格,这会在执行计算时导致错误。第二行代码通过使用。用 72.0 填充此单元格。我们能做到这一点是因为我们友好的实验室测试人员告诉我们,每次测试都是在华氏 72.0 度时开始的。
现在我们可以计算每两个时间标记之间储存在水中的能量的变化。为此,我们需要知道一些常数和方程:
- 首先,用能量=质量比热(最终温度-初始温度)来确定水中能量的变化
- 第二,我们知道 HPWH 的储存罐容纳 80 加仑(再次感谢我们友好的实验室测试人员的交流),
- 第三,水的密度是 8.3176 磅/加仑,并且
- 第四,水的比热是 0.998 Btu/lb-F。
我们可以将所有这些放在一起,用下面这条线计算储存能量的变化:
Data['Change in Stored Energy (Btu)'] = (80 * 8.3176) * (0.998) * (Data['Average Tank Temperature (deg F)'] - Data['Previous Average Tank Temperature (deg F)'])
计算 COP
分析每个数据集的下一步是计算作为水箱水温函数的 COP。本教程的目标是将 COP 确定为水温和环境温度的函数,这将有助于理解在每个指定的环境温度下 COP 作为水温的函数。它指向正确的方向。
为了计算热泵的 COP,我们需要进行一些单位转换。耗电量目前以 W 表示,而添加到水中的能量目前以 Btu/时间步长表示。为了进行单位转换,我们使用 1 W = 3.412142 Btu/hr 的比率,然后将 Btu/hr 转换为 Btu/s,并乘以每个时间戳的 10 秒。这给出了代码:
Data['P_Elec (Btu/10s)'] = Data['P_Elec (W)'] * (3.412142/60/60) * 10
根据定义,COP 是添加到水中的热量除以消耗的电量。因此,可以通过下式计算:
Data['COP (-)'] = Data['Change in Stored Energy (Btu)'] / Data['P_Elec (Btu/10s)']
生成回归
现在我们有了一个表格,显示了三个指定 COP 中每一个 COP 与水温的函数关系。但是我们可以做得更好。如果有一个函数可以用来计算 COP 不是很好吗?只需输入水温,并据此识别 COP?
Numpy 提供了使这变得容易的工具。我们可以使用数字函数“polyfit”来确定将 COP 描述为水温函数的折射率系数。这是一个灵活的函数,允许您通过指定函数末尾的顺序来控制曲线的形状。因为热泵的 COP 作为温度的函数是抛物线,所以我们需要对这个例子进行二阶回归。因此,系数可以用下面一行来标识:
Coefficients = np.polyfit(Data[‘Average Tank Temperature (deg F)’], Data[‘COP (-)’], 2)
numpy“poly 1d”函数可用于使用这些系数创建回归。这通过以下方式完成:
Regression = np.poly1d(Coefficients)
现在,您可以使用这种回归方法确定热泵在特定水温下的 COP。请记住,仅针对特定的气温生成回归,因此仅使用正确气温的回归来估计 COP。创建二维性能图是本教程的最终目标,但我们还没有达到。
特定水温下的 COP 可以通过调用函数并使用水温作为输入来识别。例如,如果您想在水温为 72°F 时查找 COP,您可以输入:
COP_72 = Regression(72.0)
我如何保存这些结果?
可以使用我们一直使用的相同技术保存数据,如自动存储来自分析数据集的结果中所述。我们需要 1)确保分析结果的文件夹可用,2)创建一个新的文件名,清楚地说明文件包含的内容,3)保存数据。
在这种情况下,我们希望将数据保存到一个名为“已分析”的新文件中。它应该在同一个数据文件夹中,并用来显示分析的结果。我们可以用下面的代码做到这一点:
Folder = Path + '\Analyzed'
if not os.path.exists(Folder):
os.makedirs(Folder)
第一行创建新文件夹的路径。它将' \Analyzed '添加到当前存在的路径中,声明它正在当前文件夹中查找一个名为“Analyzed”的文件夹。第二行确定该文件夹是否已经存在。如果没有,第三行创建它。
之后,我们需要为数据集和系数设置文件名。这可以通过将我们已经拥有的与字符串的一个子部分相结合来实现。我们可以使用字符串索引来标识我们想要保留的文件名部分。例如,第一个文件的文件名部分“PerformanceMap_HPWH_50”非常清楚地说明了文件包含的内容。因为我们知道文件名的最后四个字符是。我们可以通过使用索引[-26:-4]来分离字符串的这一部分。换句话说,我们希望字符串中的字符从“倒数第 26”到“倒数第 4”,不包括倒数第 4。
接下来,我们可以定制一点文件名。也就是说,我们可以声明我们希望数据文件名声明它包含分析数据,我们希望系数文件名声明它包含系数。我们可以用下面几行写下这两个文件的文件名:
Filename_Test = Folder + '\\' + Filename[-26:-4] + '_Analyzed.csv'
Filename_Coefficients = Folder + '\Coefficients_' + Filename[-6:]
然后我们简单地保存文件。分析后的数据可以和熊猫一起储存。to_csv 函数,系数可以用 numpy 保存。tofile 函数如下:
Data.to_csv(Filename_Test, index = False)
Coefficients.tofile(Filename_Coefficients, sep = ‘,’)
请注意,保存数据集的行 index = False。这意味着保存表时不会保存数据框的索引。还要注意 numpy。tofile 函数要求您指定一个分隔符。在这种情况下,我们使用一个逗号,用代码 sep = '、 指定。
我怎么知道它工作正常?
在流程的这个阶段,有大量的事情可能会出错。也许实验室测试人员在进行实验时犯了一些错误。可能是乐器坏了。也许代码中有一个错别字,或者一个不正确的单位转换。
必须确保在这个过程中不出现这些问题或任何其他问题。因此,该过程的下一步是检查数据集的错误。我们将在教程的下一阶段讨论这个问题。首先,我将讨论如何手动检查数据错误。这样,你将对我们正在检查的潜在错误以及如何识别它们有一个明确的理解。然后我将讨论如何在这个脚本中添加代码来自动检查这些错误,并在出错时向您发出警告。
教程目录
这是一系列文章的一部分,教你自动分析实验室数据和绘制热泵热水器性能图所需的所有技巧。本系列的其他文章可以通过以下链接找到:
自动寻找最适合你的神经网络
甘斯的汽车!
想获得灵感?快来加入我的 超级行情快讯 。😎
生成对抗网络 (GANs)自从在 2014NIPS上首次发明并发表以来,一直是深度学习领域的热门话题。
这一切都有一个很好的理由:GANs 只需要一点点指导就可以创造新的内容。正是这种创造力让他们如此强大。事实证明,GANs 能够将这种创造力应用于多种多样且有用的应用中:
- 生成穿着某种服装的人的图像。非常适合虚拟观看顾客在网上看到的服装会是什么样子。
- 创建艺术品
- 电影和视频游戏的灌制和质量改进
- 加强对非常复杂的深层物理课题的研究,如暗物质
仅举几个例子。
有鉴于此,大量资源被投入到 GAN 研究中,以弄清楚它们是如何工作的,以及如何设计绝对最佳的 GAN 网络。最后,经过几年的成熟, AutoML 和神经架构搜索(NAS) 已经进入了 GANs 的领域。
本文接下来分为两个部分:第一部分解释了 GANs 是如何工作的,以及它们目前是如何手工设计的。第二个是全新深度学习研究的展示——AutoGAN,它将神经架构搜索应用于自动找到最佳的 GAN 架构。
gan 是如何工作的
生成对抗网络(GANs)被归入“生成”模型组。这意味着它们能够生成全新的“有效”数据。所谓有效数据,我们的意思是网络的输出应该是我们认为目标可以接受的。
为了说明,考虑一个例子,其中我们希望生成一些新图像来训练图像分类网络。当然,对于这样的应用,我们希望我们的训练数据尽可能真实,也许在风格上与其他图像分类训练数据集非常相似。
下图显示了 GAN 生成的一组图像的示例。它们看起来很真实!如果我们没有被告知它们是计算机生成的,我们可能会相信这些是人类收集的!

An example output of Progressive GANs. Source
为此,gan 由两个独立的、相对的网络组成:发生器和鉴别器。当仅给定噪声图像阵列作为输入时,生成器被训练来创建看起来逼真的图像。鉴别器被训练来分类图像是否是真实的。
GANs 的真正力量来自他们所遵循的对抗训练风格。基于鉴别器的损耗学习发电机网络的权重。因此,生成器被推动以这样一种方式训练,即对于它生成的图像,很难辨别它们是否真实。在这些图像看起来越来越真实的同时,鉴别器也越来越好地分辨出哪些图像是真实的,不管肉眼看起来有多相似。
因此,GANs 建立了一种反馈回路,发电机帮助训练鉴别器,鉴别器帮助训练发电机。他们一起变得更好。下图有助于说明这一点。

An illustration of the structure of a Generative Adversarial Network
请注意,生成器只是一个以图像为输出的 CNN,而鉴别器只是一个以分类概率为输出的 CNN 分类网络;很简单。由于这种简单性,大多数 GAN 架构只是其他先进深度网络的副本。生成器可能采取类似于修改的 U-Net 的形式,而鉴别器通常看起来像 ResNet、DenseNet 或类似的体系结构。
好的一面是,这可能会简化部分问题。研究科学家可以简单地借用以前经过验证的研究中的网络设计,并简单地专注于 GANs 的算法设计和训练机制。
另一方面,这可能有点限制。如果当前的网络设计不是最适合 GANs 的,该怎么办?它们本身工作得足够好,但也许改进网络结构可以进一步提高专为它们设计的 GAN 性能。
使用 AutoGAN 寻找最佳 GAN
神经架构搜索(NAS) 一直是另一个热门的深度学习话题。NAS 是搜索寻找最佳神经网络架构的算法。
大多数 NAS 算法以如下方式工作。
- 首先定义一组可用于我们网络的“构建模块”。
- 然后使用控制器递归神经网络(RNN)对这些构建块进行采样,将它们放在一起以创建某种端到端的架构。
- 然后,在特定数据集上训练和评估这个新建立的网络。
- 基于评估,RNN 选择的构建模块被调整,即 RNN 将选择新的一组,保留有助于准确性的模块和配置,并替换或移除没有帮助的模块和配置。
- 步骤 3 到 4 重复多次,直到找到最佳架构。

The NAS algorithm. Source from the research paper
AutoGAN 也遵循相同的学习方案,特别侧重于构建生成器网络,因为在寻找最佳分类网络(用于鉴别器)方面已经做了更多的工作。
正如作者在他们的论文中指出的,训练 GANs 由于其设计本身就不稳定。精心的网络建设对整个过程的顺利进行至关重要。考虑到这一点,AutoGANs 的搜索空间比 NAS 的搜索空间要小得多。AutoGAN 的生成器搜索空间被设置为,而不是能够从许多不同类型和大小的卷积块中采样并跳过连接:
- 一个二进制值 skip ,它指示当前单元格是否从前一个单元格获取一个加法skip 连接。
- 一个基本的卷积模块,决定是否包括预激活或后激活。
- 归一化类型的选择:批量归一化、实例归一化、无归一化。
- 要使用的上采样类型:双线性上采样、最近邻上采样或步长 2 去卷积。
- 是否使用单元格内 加法 跳过连接

The search space of AutoGAN’s Generator network. Source from the original research paper
有了这个更受控制的搜索空间,应用 NAS 来寻找最佳发电机架构就简单得多,也更稳定,因为 NAS 的搜索范围更广,也更简单。
另一项使培训更加有效的技术是使用多层次架构搜索(MLAS),而不是常规的多层次架构搜索(SLAS)。对于常规的 SLAS,一个 RNN 控制器将用于一次构建整个 NAS 网络。但是在 MLAS,网络是逐步建立起来的。
MLAS 以自下而上的方式执行搜索,对每个单元分别执行架构搜索。因此,每个细胞将使用其自己的个人 RNN 控制器进行搜索。从某种意义上说,这也简化了搜索,因为 NAS 一次只关注网络的一个特定部分,而不是非常复杂的整体。

AutoGAN’s RNN controller. Source from the research paper
凭借其聪明的新训练设置和精细、集中的细胞搜索空间,AutoGAN 能够实现最先进的结果。具体来说,它为基于人类判断生成高视觉质量的新图像设置了新的标准。
AutoML 正在慢慢进入深度学习和人工智能的许多领域。毫无疑问,这将是未来几年人工智能研究的一个重点。人工智能创造人工智能。
喜欢学习?
在推特上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也请在 LinkedIn上与我联系!
使用 LSTM 自动生成酒店描述

Photo credit: W Seattle
如何使用 Python 中的 LSTM 递归神经网络和 Keras 创建文本生成模型
为了建立一个基于内容的推荐系统,我收集了西雅图 152 家酒店的描述。我在想一些其他的方法来折磨这个高质量的干净数据集。
嘿!为什么不训练我自己的酒店描述文本生成神经网络?即,通过实现和训练基于单词的递归神经网络来创建用于生成自然语言文本(即,酒店描述)的语言模型。
这个项目的目标是生成新的酒店描述,给定一些输入文本。我不期望结果是准确的,只要预测的文本是连贯的,我就高兴了。
感谢Shivam ban sal的这个教程帮助我完成了这个练习。
数据
desc_preprocessing.py

我们的数据集中总共有 152 个描述(即酒店)。
先看一下第一个描述:
corpus = [x for x in all_descriptions]
corpus[:1]

Figure 1
在标记化之后,我们可以:
- 探索单词及其计数的字典。
- 浏览单词词典,了解每个单词出现在多少个文档中。
- 探索用于适应记号赋予器的文档总数的整数计数(即文档总数)。
- 探索单词及其唯一指定整数的字典。
t = Tokenizer(num_words=None, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n', lower=True, split=' ', char_level=False, oov_token=None, document_count=0)
t.fit_on_texts(corpus)print(t.word_counts)
print(t.word_docs)
print(t.document_count)
print(t.word_index)
print('Found %s unique tokens.' % len(t.word_index))

文本预处理
标记化
我们使用 Keras 的标记器来矢量化文本描述,
- 我们删除所有标点符号。
- 我们将文本转换成小写的空格分隔的单词序列。
- 然后,这些序列被分割成记号列表。
- 我们设置了
char_level=False,所以每一个单词都会被当作一个记号而不是字符。 - 然后,记号列表将被索引或/和矢量化。
- 我们将语料库转换成符号序列。
sequence.py

Figure 2
上面的整数列表表示从语料库中生成的 ngram 短语。例如,假设一个句子“ 位于尤宁 湖的南端”由这样的词的索引来表示:

Table 1
填充序列并创建预测值和标签
- 将序列填充到相同的长度
- Pad sequences 将整数列表转换成形状为
(num_samples, maxlen)的 2D Numpy 数组。 - 预测值和标签看起来像这样:

Table 2
如你所见,如果我们想要精确,这将会非常非常困难。
pad_sequence.py
建模
我们现在可以定义我们的单一 LSTM 模型。
- 具有 100 个存储单元的单个隐藏 LSTM 层。
- 网络使用概率为 10 的辍学。
- 输出层是使用 softmax 激活函数输出 0 到 1 之间的 3420 个单词中每个单词的概率预测的密集层。
- 我们的问题是具有 3420 个类别的单个单词分类问题,因此被定义为优化对数损失(交叉熵),并使用 ADAM 优化算法来提高速度。
- 没有测试数据集。我们正在对整个训练数据进行建模,以学习序列中每个单词的概率。
- 根据 Keras 文档,在生成的文本开始听起来连贯之前,至少需要 20 个历元。所以,我们要训练 100 个纪元。
text_generator.py
使用训练好的 LSTM 网络生成文本
- 关于这一点,我们可以编写一个函数,将种子文本作为输入,并预测下一个单词。
- 我们对种子文本进行标记,填充序列,并将其传递给训练好的模型。
generate_text.py
试试吧!
- 我随机选择“”作为种子文本,我希望 model 返回我接下来的 100 个单词。
*print(generate_text("hilton seattle downtown", 100, model, max_sequence_len))*

Figure 3
- 我选择“ 贝斯特韦斯特西雅图机场酒店 l”作为种子文本,并且我希望模型预测接下来的 200 个单词。
*print(generate_text("best western seattle airport hotel", 200, model, max_sequence_len))*

Figure 4
- 我选择“ 位于西雅图市中心 ”作为种子文本,并且我希望模型预测接下来的 300 个单词。
*print(generate_text('located in the heart of downtown seattle', 300, model, max_sequence_len))*

Figure 5
结论
- 没有拼写错误。
- 这些句子看起来很真实。
- 一些短语被一遍又一遍地重复,特别是预测给定种子的大量单词输出。
关于改进的一些想法:更多的训练数据、更多的训练时期、更多的层、更多的层存储单元、对于给定的种子,预测更少数量的单词作为输出。
Jupyter 笔记本可以在 Github 上找到。享受余下的周末吧!
参考资料:
这个类允许向量化文本语料库,通过将每个文本转换成整数序列(每个整数…
keras.io](https://keras.io/preprocessing/text/) [## 使用 LSTMs 的语言建模和文本生成 NLP 的深度学习
随着深度学习和人工智能领域的最新发展和改进,许多严格的…
medium.com](https://medium.com/@shivambansal36/language-modelling-text-generation-using-lstms-deep-learning-for-nlp-ed36b224b275)*
自动存储分析数据集的结果
如何存储数据分析结果以方便后期回归分析

这是教你如何编写自动分析科学数据的程序的系列文章的第五篇。首先介绍了概念和动机,然后规划了高级步骤。第二个教你如何构建数据集,使自动化数据分析成为可能,并自动识别每个测试的条件。的第三篇文章讨论了创建一个 for 循环,自动对每个测试结果执行计算并保存结果。第四篇文章覆盖了可能是最重要的部分:自动检查数据和分析错误。这第五篇文章将教你如何在一个逻辑文件夹结构中存储数据,使回归开发和验证数据的访问变得容易。
存储中间结果供以后分析
到目前为止,所有的讨论都集中在分析单个测试的结果上。下一步是开始考虑更大的图景,并创建将那些单独的测试结果组合成描述整个项目结果的数据集的方法。第一步是以逻辑方式存储各个测试结果,以便于以后的分析。
有两个通用的技巧来存储中间结果,供以后在自动化过程中进行分析。首先是规划组织结构,以确保在需要时可以轻松找到所有文件。第二种方法是在代码中使用动态文件名,这样程序每次迭代的结果都会保存到新文件中。
创建文件夹层次结构
规划组织结构实质上意味着创建一个对给定项目有意义的文件夹层次结构。例如,假设一个项目包括在多台设备上进行几个实验。目标是创建模拟每件设备性能的回归。在这种情况下,为每件设备创建一个文件夹,然后将单个测试的结果存储在相应的文件夹中是有价值的。图 1 提供了一个如何构建这个文件夹层次结构的例子。

Figure 1: Example Folder Hierarchy
使用动态名称存储文件
要记住的第二点是,所有对存储数据的引用都应该使用动态名称,这些动态名称使用第 2 部分中描述的技术从数据集中获取的变量来创建特定于该数据集的文件名。例如,数据集可能包含设备 2 测试 3 的特定数据。在这种情况下,任何保存该数据集数据的代码都必须使用变量来指定它需要使用“设备 2”文件夹的“设备 2 测试 3”子文件夹。
创建文件夹结构时,有必要确保所有文件夹都存在。有两种方法可以做到这一点。第一种是为项目手动创建文件夹,提前安排好一切。如果这有助于您思考整个过程并创建一个强大的结构,这可能是一个好方法,但这是一个关于自动化的系列!让 Python 来做这项工作更容易。通过在分析循环中包含适当的代码,可以自动创建该结构。这是通过以下步骤完成的。
1)导入操作系统包,允许访问控制计算机操作系统的命令。这可以用 Python 代码“import os”来完成。
2)在分析循环中,使用第 2 部分中的技术来确定正在执行的测试。以图 1 中的层次表为例,这可能会导致变量“设备”设置为“设备 2”,变量“测试”设置为“测试 3”。确保这两个值都以字符串形式存储在其变量中。
3)使用变量和来自数据集的输入为现有数据集指定文件夹。在我们当前的示例中,这可以通过以下代码来完成:
Folder = r’C:/Users/JSmith/DataAnalysis/’ + Equipment + ‘/’ + Test
4)使用 os.path.exists 命令确定该文件夹是否存在,如果需要,使用以下代码创建该文件夹:
if not os.path.exists(Folder) :os.makedirs(Folder)
这些步骤创建的代码将自动生成该结构所需的所有文件夹。根据任何给定项目的需要,可以使用相同的技术来创建更多级别的子文件夹。
然后,每个测试的结果需要存储在适当的文件夹中。保存结果的代码因包而异。使用下面的代码示例,可以用 pandas、bokeh 和 matplotlib 保存结果。
熊猫
数据帧有方便的标签。to_csv 函数。读者应该查阅 pandas 文档来了解如何工作的具体细节,但是一般的方法是调用函数并指定文件路径。对于当前示例和名为“data”的数据帧,这可以通过以下代码完成:
Data.to_csv(r’C:/Users/JSmith/DataAnalysis/’ + Equipment + ‘/’ + Test + ‘/’ + Equipment + ‘_’ + Test + ‘.csv’)
最后一部分,'/' +设备+ '_' +测试+'。“csv”被添加到前面的代码中,以便为。csv 文件放在文件夹中。假设前面的代码用于定义变量 Folder,实现相同目标的一个更短的方法是:
Data.to_csv(Folder + ‘/’ + Equipment + ‘_’ + Test + ‘.csv’)
散景
散景使用一种更复杂的方法来保存文件。这提供了在单个文件中存储多个图的能力。使用以下步骤执行:
1)创建一个网格地块。gridplot 函数允许指定如何在一个文件中包含多个绘图。一个数组用于指定主 gridplot,而较小的数组可用于指定任何给定行内的多个 plot。例如,gridplot 的第一行有两个图,第二行有三个图,编程如下:
p = gridplot([[p1, p2], [p3, p4, p5]])
2)指定所需的文件位置和标题。继续设备 2 —测试 3 的例子,这可以用下面的代码来完成:
output_file(Folder + ‘/’ + Test + ‘.html’, title = Test + ‘.html’)
3)保存剧情。这是通过直观的 save()命令完成的。本例中保存绘图的语法是:
save(p)
matplotlib
matplotlib 使用一个非常简单的文件保存约定。命令是 plt.savefig()。此示例的语法是:
plt.savefig(Folder + ‘/’ + Test)
后续步骤
本文向您介绍了如何修改您的代码,以便在逻辑位置保存来自单个测试的数据。这为过程的下一阶段做好了准备,即使用数据生成回归。通过将数据存储在逻辑位置,您可以轻松地打开该数据,并将其用作以后回归分析的数据集。下一篇文章将讨论这个主题:如何创建、验证和记录数据集的回归。
自动总结特朗普的国情咨文

Photo credit: Pixabay
文本排名,潜在语义分析,Gensim,Sumy,NLTK
自动文本摘要,是为较长的文档创建简短、简明和连贯版本的过程。这是 NLP 领域中最有趣、最具挑战性的问题之一。
自从川普昨晚发表了他的 国情咨文 ,关键要点,事实核查,分析,反应充斥着新闻媒体。如果你像我一样,不想听完 82 分钟的整个演讲,或阅读整个演讲,并且你不想错过任何重要的东西,那么我们将尝试探索文本摘要的领域并建立一个文本摘要器。希望我们从文本摘要器中得到的摘要尽可能地接近原文,但要短得多。我们开始吧!
带 NLTK 的 TextRank
TextRank 是一种无监督的文本摘要技术,它使用 PageRank 算法背后的直觉来对句子进行排序。在我们的项目中使用 NLTK 时,我们有以下步骤:
- 在网上获取国情咨文。
- 基本文本清理。
- 找出每个句子的向量表示(单词嵌入)。
- 然后计算句子向量之间的相似度并存储在矩阵中。
- 相似度矩阵转换成图,以句子为顶点,相似度得分为边。
- 对该句子图应用 PageRank 算法进行句子等级计算。
- 打印出几个排名靠前的句子。
数据
这些数据可以在白宫网站上找到,并于今天发布。
def get_only_text(url):
"""
return the title and the text of the article
at the specified url
"""
page = urlopen(url)
soup = BeautifulSoup(page, "lxml")
text = ' '.join(map(lambda p: p.text, soup.find_all('p')))
print ("=====================")
print (text)
print ("=====================")
return soup.title.text, text
url="[https://www.whitehouse.gov/briefings-statements/remarks-president-trump-state-union-address-2/](https://www.whitehouse.gov/briefings-statements/remarks-president-trump-state-union-address-2/)"
text = get_only_text(url)
首先,我们来窥见几个句子:
sentences = []
for s in text:
sentences.append(sent_tokenize(s))sentences = [y for x in sentences for y in x]
sentences[30:40]

听起来差不多。
我们将使用预先训练的单词向量来为国情咨文中的句子创建向量。我已经从手套下载了数据并保存在我的工作目录中。
word_embeddings = {}
f = open('glove.6B.100d.txt', encoding='utf-8')
for line in f:
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
word_embeddings[word] = coefs
f.close()
一些基本的文本预处理,如删除停用词和删除特殊字符。
clean_sentences = pd.Series(sentences).str.replace("[^a-zA-Z]", " ")
clean_sentences = [s.lower() for s in clean_sentences]
stop_words = stopwords.words('english')
def remove_stopwords(sen):
sen_new = " ".join([i for i in sen if i not in stop_words])
return sen_new
clean_sentences = [remove_stopwords(r.split()) for r in clean_sentences]
在下面的代码脚本中,我们为句子创建向量。我们首先获取句子中组成单词的向量(每个向量的大小为 100 个元素),然后取这些向量的平均值,以得到该句子的合并向量。我们创建一个空的相似度矩阵,并用句子的余弦相似度填充它。最后,我们用余弦相似性分数初始化矩阵,并打印出排名前 15 的句子作为摘要表示。
sentences_vector

Sumy Python 模块
Sumy 是一个 Python 库,用于从 HTML 页面或纯文本中提取摘要。是由 Miso-Belica 开发的。我们将把以下总结方法应用到国情咨文中,并为每种方法打印出 10 个句子:
- LsaSummarizer 。潜在语义分析结合词频和奇异值分解。
LANGUAGE = "english"
SENTENCES_COUNT = 10
url="[https://www.whitehouse.gov/briefings-statements/remarks-president-trump-state-union-address-2/](https://www.whitehouse.gov/briefings-statements/remarks-president-trump-state-union-address-2/)"
parser = HtmlParser.from_url(url, Tokenizer(LANGUAGE))
print ("--LsaSummarizer--")
summarizer = LsaSummarizer()
summarizer = LsaSummarizer(Stemmer(LANGUAGE))
summarizer.stop_words = get_stop_words(LANGUAGE)
for sentence in summarizer(parser.document, SENTENCES_COUNT):
print(sentence)

- 卢恩总结者。一种基于 TF-IDF 并查看高重要性单词之间不重要单词的“窗口大小”的简单方法。它还为出现在文档开头附近的句子分配较高的权重。
print ("--LuhnSummarizer--")
summarizer = LuhnSummarizer()
summarizer = LuhnSummarizer(Stemmer(LANGUAGE))
summarizer.stop_words = ("I", "am", "the", "you", "are", "me", "is", "than", "that", "this")
for sentence in summarizer(parser.document, SENTENCES_COUNT):
print(sentence)

- 词法分析器。受 PageRank 算法启发的无监督方法。它找出文档中所有单词的相对重要性,并选择包含最多高分单词的句子。
print ("--LexRankSummarizer--")
summarizer = LexRankSummarizer()
summarizer = LexRankSummarizer(Stemmer(LANGUAGE))
summarizer.stop_words = ("I", "am", "the", "you", "are", "me", "is", "than", "that", "this")
for sentence in summarizer(parser.document, SENTENCES_COUNT):
print(sentence)

- 埃德蒙森总结者。使用 EdmundsonSummarizer 时,我们需要输入我们希望在摘要中看到的有意义的单词,不重要的 stigma_words,以及停用单词 null_words。
print ("--EdmundsonSummarizer--")
summarizer = EdmundsonSummarizer()
words1 = ("economy", "fight", "trade", "china")
summarizer.bonus_words = words1
words2 = ("another", "and", "some", "next")
summarizer.stigma_words = words2
words3 = ("another", "and", "some", "next")
summarizer.null_words = words3
for sentence in summarizer(parser.document, SENTENCES_COUNT):
print(sentence)
这是edmundsonsumrizer在我设置了上述单词标准后的输出:

在我们确定哪种方法是总结特朗普国情咨文的最佳方法之前,似乎有很多参数需要调整。不管怎样,我个人很享受这次学习之旅。希望你也是。
Jupyter 笔记本可以在 Github 上找到。享受这周剩下的时光吧!
参考资料:
[## 使用 TextRank 算法的文本摘要介绍(Python 实现)
引言文本摘要是自然语言处理(NLP)的应用之一
www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2018/11/introduction-text-summarization-textrank-python/) [## 黑客用文本摘要的文本排名
摘要任务是一个经典的任务,已经从不同的角度进行了研究。这项任务包括…
nlpforhackers.io](https://nlpforhackers.io/textrank-text-summarization/) [## 使用 Python 文本分析技术的自动文本摘要
自动文本摘要是用软件缩短文本文档的过程,以便创建摘要…
ai.intelligentonlinetools.com](http://ai.intelligentonlinetools.com/ml/text-summarization/)
科学数据集的自动化分析
如何编写自动分析科学数据集的 Python 程序

这是教你如何自动分析科学实验室数据的系列文章中的第三篇。第一篇文章介绍了概念,提供了一些动机,并描述了一般过程。第二个 T2 描述了几种识别条件和为每个测试创建单独数据文件的方法。这第三篇文章将教你如何编写一个程序,自动打开每个文件,并对这些数据集进行计算。
自动打开每个数据文件
自动分析每个数据文件的第一步是打开它们。然而,由于我们想自动分析大量的文件,我们不能简单地写一行打开特定文件的代码;相反,我们创建一个结构,顺序打开项目中的每个文件。这可以通过使用 glob、pandas、for 循环和以下步骤来完成:
- 首先,将项目中的所有文件存储在特定的文件夹中。将所有文件放在同一个文件夹中是很有帮助的,因为这样你只需要将程序指向一个路径。如果您使用了第 2 部分中的动态文件名建议,您应该能够识别测试之间的差异,而不必将文件存储在许多不同的文件夹中。
- 其次,使用 glob 包创建该文件夹中与您的数据文件类型相匹配的所有文件的列表。glob.glob 函数非常适合这个目的,只需要一个路径和一个文件类型作为输入。例如,如果您想打开一个文件夹中的所有文件,您可以使用下面三行代码(Path 变量是虚构的,需要修改以符合您的特定情况)。第一行导入 glob 包,第二行告诉代码文件的位置,第三行创建一个名为‘Filenames’的变量,用 all。路径指定的文件夹中的 csv 文件。
import glob
Path = r'C:\Users\JSmith\Documents\AutomatedDataAnalysis\Example'
Filenames = glob.glob(Path, '/*.csv')
- 第三,创建一个遍历每个文件的 for 循环。打开和分析这些文件的代码可以存储在 for 循环中。通过这样做,您创建了一系列的分析步骤,程序将依次对文件名中的每个文件执行这些步骤。但是首先我们需要创建 for 循环。这可以使用下面的代码来完成,该代码创建了一个新的变量“Filename”来临时保存存储在“Filenames”中的每个路径:
for Filename in Filenames:
- 最后,我们需要打开文件。假设数据存储在。csv 文件你可以用 pandas.read_csv 函数打开。假设您之前的代码导入了 pandas,您可以通过在 for 循环中添加以下行来打开每个文件:
Data = pd.read_csv(Filename)
就是这样!您的代码现在按顺序打开文件夹中包含的每个文件。这意味着下一步是在 for 循环中添加代码,告诉程序如何处理数据。
自动分析每个数据集
打开文件后,程序可以继续执行数据的实际分析。这一过程必须针对每个项目进行高度定制,因为计算必须针对特定项目进行。由于这一限制,本节将为 Python 新手提供一些技巧,而不是试图提供具体的步骤。一些重要的提示包括:
- 用 pandas.read_csv 打开文件创建了一个 pandas DataFrame 对象,其中包含来自该文件的数据。数据帧本质上是一个表。以这种方式打开文件可以访问 pandas 的所有数据操作功能。如果你不熟悉那些考虑阅读熊猫文档以获取提示的人。
- Python 中的计算可以用任意数量的有用包来执行。对于项目的这一部分,pandas 和 numpy 可能会提供最重要的功能。目标是找到包并编写代码来执行您需要对每个文件进行的所有计算。
- 如果您需要针对每个文件的特定部分,不要忘记使用类似于第 2 部分中描述的技术来过滤数据。
- 根据需要,使用 matplotlib、bokeh 或其他包来绘制结果。
- 完成计算后,可以用 pandas DataFrame.to_csv 函数打印结果。确保给它一个新的文件名,以避免覆盖原始数据文件。
后续步骤
第二篇和第三篇文章结合起来,为您提供了自动分析每个数据文件并保存结果的完整指南。随着文件的打开、计算的执行和数据的分析,现在是过程中最重要的部分:检查数据集的错误。我的下一篇文章将教你一些在程序中添加代码的方法,让你更容易检查数据集的错误。
利用计算机视觉和节点实现灯光自动化
基于智能计算机视觉和 NodeJS 的解决方案,可以在不使用时关闭灯,从而节省电能。

Photo by Henry McIntosh on Unsplash
挑战
常见的情况是,在家庭和办公室中,被照亮的空间附近很少有人或没有人。
除了花费更多,这种照明对环境也有负面影响。我们越来越依赖有限的、不可再生的能源来发电,而这些能源经常被浪费掉。
虽然我们在家里的能源使用是名义上的,但在办公室,我们的能源使用要多得多。因此,对环境和成本的负面影响要大得多。这需要我们采取积极的行动。
当张贴“离开前请关灯”的标志影响很小或没有影响时,考虑到灯的数量、覆盖的区域和其他因素,损失的大小更大。让某人每次都简单地关灯来解决过度照明的问题是不可行的。人类的记忆变化无常,不可依赖。
我们来了解一下单个灯泡的影响。一个 10 瓦的灯泡每小时耗电 0.01 千瓦。我们假设 1 度电的成本是 12 美分。那么每一个不需要时点亮的 10 瓦灯泡,每小时将花费 0.12 美分。
我会让你运用基本的算术技巧,通过将灯的数量乘以上述数字来计算整个办公室的总成本。
那么我们如何解决这个问题呢?
虽然市场上有许多智能控制和自动化解决方案,但大多数解决方案都需要定期安装额外的硬件,并导致额外的维护成本。
有没有更好的方法来应对这一挑战?
所有办公场所都安装了摄像头来监控该区域。我和我的同事们集思广益,想出了用最少的投资解决这个问题的方法。然后灵光一现!💡
为什么不使用这些捕捉不同画面的相机来自动关灯呢?
我们的回应
解决方案是通过计算机的眼睛——通过计算机视觉来表达我们节约能源的意图。
那么到底什么是计算机视觉呢?
“计算机视觉,通常缩写为 CV,被定义为一个研究领域,旨在开发技术来帮助计算机‘看’和理解数字图像(如照片和视频)的内容。”
—杰森·布朗利,在他关于机器学习的文章中。
举例来说,就像一个生态友好的人,寻找无人居住的照明房间或空间,关灯,我们的系统将被编程为自动这样做。该系统将查看来自摄像机的输入流,这实质上是摄像机的视野。每个捕获的帧被分成 4 个象限。并且如果在特定的象限中没有人,则属于该象限的灯将被关闭。
这个解决方案是用 opencv4Nodejs 实现的,它是流行的开源计算机视觉库 OpenCV 的 Node.js 包装器。与一起,socket.io 和 express 用于渲染一个 web 应用程序,以显示实时视频流并模拟灯光的打开和关闭。
实施步骤
- 导入所需的库。
2.开始从摄像机捕捉视频。
3.读取 feed 并以固定的帧速率将其传输到 web 应用程序。
4.以大于实时流的时间间隔读取订阅源,以确定用户是否存在。
5.使用任何 OpenCV 分类器检测人。在这个解决方案中,使用了“哈尔正面人脸分类器”。检测到的相对于帧的面部位置被存储以备后用。
6.在框架上标记面部,以便可视化检测。
7.确定人们相对于画面的位置,以决定他们在哪个象限,以便只照亮那些部分。识别的结果然后被发送到网络应用程序进行照明模拟。灯泡颜色会发生变化,以模拟点亮哪个象限。

Since people are present in Quadrant 2, the system lights up only quadrant 2
结论
这是众多例子中的一个,展示了技术如何通过节约能源来改善地球。您还可以通过这个简单的实现了解如何解决常见的工作场所挑战。
请参考上述解决方案的源代码:
[## mudas sir-23/opencv-nodejs-节能器
基于 opencv 和 nodejs 的节能解决方案。通过以下方式为 mudas sir-23/opencv-nodejs-energy-saver 开发做出贡献…
github.com](https://github.com/Mudassir-23/opencv-nodejs-energy-saver)
还可以查看基于 opencv4nodejs、express 和 socket.io 的应用程序的样板代码。
这个解决方案可以扩展到不仅仅是模拟。
您可以使用已建立的套接字连接到 express 应用程序,并从每个象限接收二进制数据。您可以通过继电器决定在哪个象限打开或关闭物理灯!⚡️
在 AWS 上自动化机器学习模型
使用自动气象站 Lambda、S3 和 EC2

Photo by Samuel Zeller on Unsplash
作为马里兰大学 Gordon Gao 教授手下的一名研究助理,我有机会将我的数据工程和科学兴趣结合起来,在云中实现机器学习模型的自动化。在协助高教授的一位博士生时,我的任务是提供一种基于 AWS 的解决方案,这将减少在为一家即将成立的健康初创公司运行深度学习模型时的人工干预。
问题定义
我们的客户将问题定义为
“通过仅运行 EC2 实例进行计算,降低 EC2 实例的成本。只要客户将数据上传到 S3 存储桶,这些计算就会发生,这可能发生在一天中的任何时间。”
提到的计算包括机器学习模型和处理上传到 S3 的数据。这意味着,EC2 应该仅在执行 ML 模型时运行,而在其他时间应该关闭,而且这些作业没有固定的时间,它们拥有的唯一固定属性是它们必须在数据上传到 S3 数据桶后立即运行。我用下面的算法形成了一个粗略的工作流程,这个流程后来帮助我简化了整个自动化过程。
1。将数据上传到 S3 数据桶,触发 Lambda 函数。
2。触发器 Lambda 函数打开 EC2 实例并调用 Worker Lambda 函数。
3。Worker Lambda 函数从 S3 数据桶中复制数据,并开始执行机器学习模型。
3。EC2 实例执行 ML 模型并将输出发送到 S3 输出桶。
4。输出文件被放入 S3 输出桶,该桶执行 Stop EC2 Lambda 函数。
5。停止 EC2 Lambda 功能关闭 EC2 实例。
可视化管道
在我担任高教授的助教期间,我曾参与过 EC2 和的课堂作业。然而,Lambda 没有,这些是学术设置,我没有太多的限制。现在,我正在与一个客户打交道,这带来了安全的重要方面,并增加了在截止日期前工作的元素。这一点,再加上我不得不在项目的大部分繁重工作中使用 Lambda 函数,对我来说更加困难。

Automation Workflow Visualized
这种自动化确保了 EC2 实例仅在处理数据时被实例化,并在输出被写入 S3 存储桶时被关闭。
我从设置我的弹性云计算实例开始。我用 Python 创建了一个虚拟环境来加载库,这是运行 worker.py 和 trigger.py 脚本以及 ML 模型所需的包所必需的。我还向 EC2 实例添加了一个标记,因为这将帮助我在配置 Lambda 函数时识别实例。一旦 EC2 实例被设置好,我就开始研究 Lambda 函数。触发器函数负责两项任务:当数据上传到 S3 数据桶时启动 EC2 实例,然后在 EC2 启动后调用 Worker Lambda 函数。
Trigger Lambda Function
我使用 boto3 库来调用各种 AWS APIs,例如启动 EC2 实例,调用 Worker Lambda 函数,并将 EC2 的 IP 传递给它。
接下来,我开始开发 Worker Lambda 函数,并将它编程为将数据从 S3 数据桶复制到 EC2,然后开始执行机器学习模型。
Worker Lambda Function
从上面的函数可以看出,我用了我的私钥(。pem)登录到 EC2,然后执行命令以启动从数据桶到 EC2 的 S3 复制,然后对数据调用机器学习 Python 脚本,并将生成的结果复制到 S3 输出桶。
此外,我编写了 Stop EC2 Lambda 函数,该函数将在机器学习模型的输出被复制到 S3 输出桶时启动,该 Lambda 函数将调用 EC2 上的 stop API,确保 EC2 仅在机器学习模型的持续时间内运行。
Stop EC2 Lambda Function
将所有东西整合在一起

Photo by Perry Grone on Unsplash
我已经准备好了单独的 Lambda 函数,但是让它们一起工作,当一个函数完成时启动另一个函数是需要完成的不同任务。最初,我开始使用 AWS CloudWatch,并试图用它来触发不同的 Lambda 函数,设置 cron 类计时并使用警报来执行函数。虽然这些看起来可行,但我们的客户觉得我增加了整个工作流程的复杂性,希望我把事情变得简单。这些限制促使我使用现有服务寻找解决方案,这就是我遇到 S3 事件的原因。
S3 事件是可以在 S3 存储桶的属性选项卡下找到的功能,它允许您在 S3 存储桶中执行某些操作时安排事件。经过进一步研究,我能够为我的两个 Lambda 函数设置事件,允许我链接管道并完成自动化。
决赛成绩

Photo by NeONBRAND on Unsplash
工作流现在更容易理解和设置,S3 数据桶中的初始 PUT 请求将触发第一个 S3 事件,该事件旨在调用 Trigger Lambda 函数。Trigger 函数打开 EC2,然后调用 Worker Lambda 函数。如前所述,Worker 函数将从数据桶中复制上传的数据,并对数据运行深度学习模型。一旦计算完成,Worker 函数就会将结果复制到 S3 输出桶中,触发下一个调用 Stop EC2 Lambda 函数并停止 EC2 的事件。
这确保了深度学习模型现在是自动化的,并且 EC2 将仅在需要时运行,而在所有其他时间被关闭。
因此,我已经成功地减少了 EC2 实例的运行时间,以前,我的客户机必须从上午 9 点到下午 5 点运行 EC2,用于一天运行三四次并且每次运行不超过 20 分钟的作业。在我实现流程自动化后,客户的运行时间从 8 小时减少到了 1 小时,从而使客户在 AWS 服务上减少了大约 90%的成本。
编辑卡纳克亚达夫
参考链接
[## 使用 Lambda 和 CloudWatch 以预定的时间间隔停止和启动 EC2 实例
我想通过停止和启动我的 EC2 实例来减少我的 Amazon 弹性计算云(Amazon EC2)的使用…
aws.amazon.com](https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/)
自动化 ML 特征工程

Source: http://www.publicdomainfiles.com/show_file.php?id=13545363012524
构建组合规模的数据产品
“机器学习的圣杯之一是自动化越来越多的特征工程过程”——Pedro Domingos,CACM 2012
机器学习工作流中最大的挑战之一是识别数据中的哪些输入将为训练预测模型提供最佳信号。对于图像数据和其他非结构化格式,深度学习模型显示出比以前的方法有很大的改进,但对于已经是结构化格式的数据,好处就不那么明显了。
在 Zynga,我一直在探索浅层学习问题的特征生成方法,我们的数据已经是结构化的格式,挑战是将每个用户的数千条记录翻译成总结用户活动的单个记录。一旦您能够将原始跟踪事件转换为用户摘要,您就可以将各种监督和非监督学习方法应用到您的应用程序中。

https://github.com/FeatureLabs/featuretools
我一直在利用 Featuretools 库来显著减少我在构建预测模型上花费的时间,并且它解开了数据科学家可以解决的一类新问题。我们现在不是为单个游戏和特定反应建立预测模型,而是建立可以应用于广泛问题的机器学习管道。我将在圣克拉拉的人工智能博览会上概述我们的方法。
[## 本·韦伯|演讲嘉宾| 2019 年北美人工智能和大数据博览会
杰出数据科学家本·韦伯是 Zynga 的杰出数据科学家,曾在 Twitch 工作过…
www.ai-expo.net](https://www.ai-expo.net/northamerica/speaker/ben-weber/)
自动化特征工程是从每个用户的数千甚至数百万个数据点中创建特征向量的过程。该方法受深度学习的特征合成方法的启发,但只关注特征生成阶段,而不是模型拟合阶段。深度特征综合的结果是,您可以将描述用户活动的数千条记录转换成可用于训练模型的单个记录。以下是我一直在探索的自动化特征工程的一些用例:
- 倾向模型:用户在做什么动作?
- 建议:我们应该规定什么行动?
- 细分:我们应该如何个性化用户体验?
- 异常检测:哪些用户是不良行为者?
在 Spark 峰会上,我用我的 AutoModel 演讲对特征工程进行了深入的探讨。从那以后,我们发现了自动化特征工程的各种不同的用例。关键是,如果你可以将原始事件数据转化为用户行为的总结,那么你就可以将机器学习模型应用于各种问题。
倾向模型
预测哪些用户可能会执行某个动作对于个性化游戏体验非常有用。我使用 Featuretools 库来自动化项目的特征工程,但它需要使用更新的熊猫 UDF 功能来扩展到大规模数据集。

Propensity Models
推荐
协同过滤是为用户提供个性化内容的有价值的工具。我没有使用过去的购买作为协同过滤的特征向量,而是探索了一些代理变量来推荐商品。

Recommendation Engine
原型
细分是分析团队可以向产品组织提供的关键产出之一。如果你能理解你的产品中不同用户群的行为,你就能提供个性化的处理来提高你的用户群的参与度。

User Clustering
异常检测
任何网络环境中都有坏人。我们一直在探索针对这个问题的深度学习,对我们生成的特征集应用自动编码为标记有问题的用户提供了一个强大的工具。

Anomaly Detection
结论
机器学习工作流中的特征生成步骤自动化为数据科学团队解决了新的问题。我们的数据科学家不再专注于特定的游戏,而是可以构建可扩展到一系列游戏的解决方案。
用深度 Q 学习自动化 Pac-man:在 Tensorflow 中的实现。
强化学习的基础
简介
在我们关于 GradientCrescent 强化学习基础的文章中,我们研究了基于模型的和基于样本的强化学习方法。简而言之,前一类的特征在于需要所有可能的状态转移的完整概率分布的知识,并且可以通过马尔可夫决策过程来举例说明。相反,基于样本的学习方法允许简单地通过重复观察来确定状态值,而不需要转换动态。在这个领域中,我们已经讨论了蒙特卡罗和时间差电子学习。简而言之,这两者可以通过状态值更新的频率来区分:蒙特卡罗方法要求一个情节完成一轮更新才能发生,而时间差异方法增量地更新情节内,使用状态值的旧估计以及折扣奖励来生成新的更新。
TD 或“在线”学习方法的快速反应性使它们适合于高度动态的环境,因为状态和动作的值通过一组估计值随着时间不断更新。也许最值得注意的是, TD 是 Q-learning 的基础,Q-learning 是一种更高级的算法,用于训练代理处理游戏环境,如 OpenAI Atari 健身房中观察到的环境,这也是本文的重点。
Our previous policy-based Pong model, trained over 5000 episodes with a binary action space.
超越 TD: SARSA & Q-learning
回想一下,在时间差异学习中,我们观察到一个主体在一个环境中通过一系列状态(S)、动作(A)和(奖励)循环地行为。


由于这种循环行为,我们可以在到达下一个状态时更新前一个状态的值。然而,我们可以扩展我们的训练范围,以包括状态-动作值,就像我们之前对马尔可夫决策过程所做的那样。这就是通常所说的萨尔萨。让我们比较状态-动作和状态-值 TD 更新方程:

Q-learning 通过在更新期间强制选择具有最高动作值的动作,以类似于利用贝尔曼最优方程观察到的方式,将此向前推进了一步。我们可以检查贝尔曼和贝尔曼优化方程旁边的 SARSA 和 Q-learning,如下所示:

你可能想知道如何确保我们的状态-动作空间的完整探索,给定需要不断地为具有最高现有动作值的状态选择动作。从理论上讲,我们可能只是因为一开始就没有评估而避免了最佳行动。为了鼓励探索,我们可以使用一个衰减的 e-greedy 策略,本质上是强迫代理人选择一个明显的次优行动,以便在某个百分比的时间里了解更多关于其价值的信息。通过引入衰减过程,我们可以在评估完所有状态后限制探索,之后我们将永久地为每个状态选择最佳操作。
正如我们之前用 MDP 的模型解决了 Pong 一样,让我们把我们学到的关于 Q-learning 的知识应用到雅达利的《吃豆人小姐》游戏中。
实施
我们的 Google 协作实现是利用 Tensorflow Core 用 Python 编写的,可以在 GradientCrescent Github 上找到。这是基于 Ravichandiran 等人的观点。al,但是升级到与 Tensorflow 2.0 兼容,并且显著扩展以促进改进的可视化和解释。由于这种方法的实现非常复杂,让我们总结一下所需动作的顺序:
- 我们定义我们的深度 Q 学习神经网络。这是一个 CNN,它拍摄游戏中的屏幕图像,并输出 Ms-Pacman gamespace 中每个动作的概率,或 Q 值。为了获得概率张量,我们在最后一层不包括任何激活函数。
- 由于 Q-learning 要求我们了解当前和下一个状态,我们需要从数据生成开始。我们将表示初始状态 s 的游戏空间的预处理输入图像输入到网络中,并获得动作的初始概率分布,或 Q 值。在训练之前,这些值将是随机的和次优的。
- 利用我们的概率张量,我们然后使用 argmax()函数选择具有当前最高概率的动作,并使用它来构建 epsilon 贪婪策略。
- 使用我们的策略,我们将选择动作 a ,并评估我们在健身房环境中的决策接收关于新状态s’、奖励 r 以及该集是否已结束的信息。
- 我们以列表形式
将该信息组合存储在一个缓冲区中,并重复步骤 2-4 预设次数,以建立一个足够大的缓冲区数据集。 - 一旦步骤 5 完成,我们转到生成我们的目标 y 值,R’和A’,这是损失计算所需的。虽然前者只是从 R 中减去,但是我们通过将S’输入到我们的网络中来获得 A’。
- 有了所有的组件,我们就可以计算训练网络的损耗。
- 培训结束后,我们将通过图形和演示来评估代理的表现。
让我们开始吧。随着 Tensorflow 2 在实验室环境中的出现,我们已经使用新的 compat 包将我们的代码转换为符合 TF2 标准。注意,这段代码不是 TF2 本地的。
让我们导入所有必要的包,包括 OpenAI gym 环境和 Tensorflow 核心。
import numpy as npimport gymimport tensorflow as tffrom tensorflow.contrib.layers import flatten, conv2d, fully_connectedfrom collections import deque, Counterimport randomfrom datetime import datetime
接下来,我们定义一个预处理函数,从我们的健身房环境中裁剪图像,并将它们转换成一维张量。在我们的 Pong 自动化实现中,我们已经看到了这一点。
**def preprocess_observation(obs):** # Crop and resize the image img = obs[1:176:2, ::2] # Convert the image to greyscale img = img.mean(axis=2) # Improve image contrast img[img==color] = 0 # Next we normalize the image from -1 to +1 img = (img — 128) / 128–1 return img.reshape(88,80,1)
接下来,让我们初始化健身房环境,检查几个游戏画面,并了解 gamespace 中可用的 9 个动作。当然,我们的代理人无法获得这些信息。
env = gym.make(“MsPacman-v0”)n_outputs = env.action_space.nprint(n_outputs)print(env.env.get_action_meanings())observation = env.reset()import tensorflow as tfimport matplotlib.pyplot as pltfor i in range(22): if i > 20: plt.imshow(observation) plt.show()observation, _, _, _ = env.step(1)
您应该遵守以下几点:

我们可以借此机会比较我们的原始和预处理输入图像:

接下来,让我们定义我们的模型,一个深度 Q 网络。这本质上是一个三层卷积网络,它获取预处理的输入图像,展平并将其馈送到一个全连接层,并输出在游戏空间中采取每个行动的概率。如前所述,这里没有激活层,因为激活层的存在会导致二进制输出分布。
**def q_network(X, name_scope):**# Initialize layers initializer = tf.compat.v1.keras.initializers.VarianceScaling(scale=2.0) with tf.compat.v1.variable_scope(name_scope) as scope: # initialize the convolutional layers layer_1 = conv2d(X, num_outputs=32, kernel_size=(8,8), stride=4, padding=’SAME’, weights_initializer=initializer) tf.compat.v1.summary.histogram(‘layer_1’,layer_1) layer_2 = conv2d(layer_1, num_outputs=64, kernel_size=(4,4), stride=2, padding=’SAME’, weights_initializer=initializer) tf.compat.v1.summary.histogram(‘layer_2’,layer_2) layer_3 = conv2d(layer_2, num_outputs=64, kernel_size=(3,3), stride=1, padding=’SAME’, weights_initializer=initializer) tf.compat.v1.summary.histogram(‘layer_3’,layer_3) flat = flatten(layer_3) fc = fully_connected(flat, num_outputs=128, weights_initializer=initializer) tf.compat.v1.summary.histogram(‘fc’,fc) #Add final output layer output = fully_connected(fc, num_outputs=n_outputs, activation_fn=None, weights_initializer=initializer) tf.compat.v1.summary.histogram(‘output’,output) vars = {v.name[len(scope.name):]: v for v in tf.compat.v1.get_collection(key=tf.compat.v1.GraphKeys.TRAINABLE_VARIABLES, scope=scope.name)} #Return both variables and outputs togetherreturn vars, output
让我们借此机会为我们的模型和训练过程定义超参数
num_episodes = 800batch_size = 48input_shape = (None, 88, 80, 1)#Recall shape is img.reshape(88,80,1)learning_rate = 0.001X_shape = (None, 88, 80, 1)discount_factor = 0.97global_step = 0copy_steps = 100steps_train = 4start_steps = 2000
回想一下,Q-learning 要求我们选择具有最高行动值的行动。为了确保我们仍然访问每一个可能的状态-行为组合,我们将让我们的代理遵循一个ε贪婪策略,探索率为 5%。我们将这个探索速率设置为随时间衰减,因为我们最终假设所有的组合都已经被探索了——在该点之后的任何探索将简单地导致次优动作的强制选择。
epsilon = 0.5eps_min = 0.05eps_max = 1.0eps_decay_steps = 500000#**def epsilon_greedy(action, step):** p = np.random.random(1).squeeze() #1D entries returned using squeeze epsilon = max(eps_min, eps_max — (eps_max-eps_min) * step/eps_decay_steps) #Decaying policy with more steps if np.random.rand() < epsilon: return np.random.randint(n_outputs) else: return action
回想上面的等式,Q-learning 的更新函数要求如下:
- 当前状态 s
- 当前动作一
- 当前动作后的奖励 r
- 下一个状态s’
- 下一个动作a’
为了以有意义的数量提供这些参数,我们需要按照一组参数评估我们当前的策略,并将所有变量存储在一个缓冲区中,我们将在训练期间从该缓冲区中提取迷你批次中的数据..这与我们之前在 Pong 中的实现不同,我们使用的是增量方法。让我们继续创建我们的缓冲区和一个简单的采样函数:
buffer_len = 20000#Buffer is made from a deque — double ended queueexp_buffer = deque(maxlen=buffer_len)**def sample_memories(batch_size):** perm_batch = np.random.permutation(len(exp_buffer))[:batch_size] mem = np.array(exp_buffer)[perm_batch] return mem[:,0], mem[:,1], mem[:,2], mem[:,3], mem[:,4]
接下来,让我们将原始网络的权重参数复制到目标网络中。这种双网络方法允许我们在使用现有策略的训练过程中生成数据,同时仍然为下一次策略迭代优化我们的参数。
# we build our Q network, which takes the input X and generates Q values for all the actions in the statemainQ, mainQ_outputs = q_network(X, ‘mainQ’)# similarly we build our target Q network, for policy evaluationtargetQ, targetQ_outputs = q_network(X, ‘targetQ’)copy_op = [tf.compat.v1.assign(main_name, targetQ[var_name]) for var_name, main_name in mainQ.items()]copy_target_to_main = tf.group(*copy_op)
最后,我们还将定义我们的损失。这就是我们的目标动作(具有最高动作值)和我们的预测动作的平方差。我们将使用 ADAM 优化器来最大限度地减少我们在训练中的损失。
# define a placeholder for our output i.e actiony = tf.compat.v1.placeholder(tf.float32, shape=(None,1))# now we calculate the loss which is the difference between actual value and predicted valueloss = tf.reduce_mean(input_tensor=tf.square(y — Q_action))# we use adam optimizer for minimizing the lossoptimizer = tf.compat.v1.train.AdamOptimizer(learning_rate)training_op = optimizer.minimize(loss)init = tf.compat.v1.global_variables_initializer()loss_summary = tf.compat.v1.summary.scalar(‘LOSS’, loss)merge_summary = tf.compat.v1.summary.merge_all()file_writer = tf.compat.v1.summary.FileWriter(logdir, tf.compat.v1.get_default_graph())
定义好所有代码后,让我们运行我们的网络并检查培训过程。我们已经在最初的总结中定义了大部分,但是让我们为后代回忆一下。
- 对于每个时期,在使用ε-贪婪策略来选择下一个动作之前,我们将输入图像馈送到我们的网络中,以生成可用动作的概率分布
- 然后,我们将它输入到健身房环境中,获取下一个状态和相应奖励的信息,并将其存储到我们的缓冲区中。
- 在我们的缓冲区足够大之后,我们将下一个状态采样到我们的网络中,以便获得下一个动作。我们还通过贴现当前的奖励来计算下一个奖励
- 我们通过 Q 学习更新函数生成我们的目标 y 值,并训练我们的网络。
- 通过最小化训练损失,我们更新网络权重参数,以便为下一个策略输出改进的状态-动作值。
with tf.compat.v1.Session() as sess: init.run() # for each episode history = [] for i in range(num_episodes): done = False obs = env.reset() epoch = 0 episodic_reward = 0 actions_counter = Counter() episodic_loss = [] # while the state is not the terminal state while not done: # get the preprocessed game screen obs = preprocess_observation(obs) # feed the game screen and get the Q values for each action, actions = mainQ_outputs.eval(feed_dict={X:[obs], in_training_mode:False}) # get the action action = np.argmax(actions, axis=-1) actions_counter[str(action)] += 1 # select the action using epsilon greedy policy action = epsilon_greedy(action, global_step) # now perform the action and move to the next state, next_obs, receive reward next_obs, reward, done, _ = env.step(action) # Store this transition as an experience in the replay buffer! Quite important exp_buffer.append([obs, action, preprocess_observation(next_obs), reward, done]) # After certain steps we move on to generating y-values for Q network with samples from the experience replay buffer if global_step % steps_train == 0 and global_step > start_steps: o_obs, o_act, o_next_obs, o_rew, o_done = sample_memories(batch_size) # states o_obs = [x for x in o_obs] # next states o_next_obs = [x for x in o_next_obs] # next actions next_act = mainQ_outputs.eval(feed_dict={X:o_next_obs, in_training_mode:False}) #discounted reward for action: these are our Y-values y_batch = o_rew + discount_factor * np.max(next_act, axis=-1) * (1-o_done) # merge all summaries and write to the file mrg_summary = merge_summary.eval(feed_dict={X:o_obs, y:np.expand_dims(y_batch, axis=-1), X_action:o_act, in_training_mode:False}) file_writer.add_summary(mrg_summary, global_step) # To calculate the loss, we run the previously defined functions mentioned while feeding inputs train_loss, _ = sess.run([loss, training_op], feed_dict={X:o_obs, y:np.expand_dims(y_batch, axis=-1), X_action:o_act, in_training_mode:True}) episodic_loss.append(train_loss) # after some interval we copy our main Q network weights to target Q network if (global_step+1) % copy_steps == 0 and global_step > start_steps: copy_target_to_main.run() obs = next_obs epoch += 1 global_step += 1 episodic_reward += reward history.append(episodic_reward)print(‘Epochs per episode:’, epoch, ‘Episode Reward:’, episodic_reward,”Episode number:”, len(history))
一旦训练完成,我们就可以根据增量情节绘制奖励分布图。前 550 集(大约 2 小时)大概是这样的:

在额外的 800 集之后,这汇聚成以下内容:

为了在实验室环境的限制下评估我们的结果,我们可以录制整个情节,并使用基于 IPython 库的包装在虚拟显示器中显示:
“””Utility functions to enable video recording of gym environment and displaying it. To enable video, just do “env = wrap_env(env)””“”**def show_video():** mp4list = glob.glob(‘video/*.mp4’) if len(mp4list) > 0: mp4 = mp4list[0] video = io.open(mp4, ‘r+b’).read() encoded = base64.b64encode(video) ipythondisplay.display(HTML(data=’’’<video alt=”test” autoplay loop controls style=”height: 400px;”> <source src=”data:video/mp4;base64,{0}” type=”video/mp4" /> </video>’’’.format(encoded.decode(‘ascii’)))) else: print(“Could not find video”)
**def wrap_env(env):** env = Monitor(env, ‘./video’, force=True) return env
然后,我们使用我们的模型运行环境的新会话,并记录它。
#Evaluate model on openAi GYMobservation = env.reset()new_observation = observationprev_input = Nonedone = Falsewith tf.compat.v1.Session() as sess: init.run() while True: if True: #set input to network to be difference image obs = preprocess_observation(observation) # feed the game screen and get the Q values for each action actions = mainQ_outputs.eval(feed_dict={X:[obs], in_training_mode:False}) # get the action action = np.argmax(actions, axis=-1) actions_counter[str(action)] += 1 # select the action using epsilon greedy policy action = epsilon_greedy(action, global_step) env.render() observation = new_observation # now perform the action and move to the next state, next_obs, receive reward new_observation, reward, done, _ = env.step(action) if done: #observation = env.reset() break env.close() show_video()
你应该观察几轮比赛!这是我们录制的几集。
对于一个几个小时就训练好的模特来说,成绩远高于 400 分,这已经不错了。特别是,看起来我们的代理人在被幽灵直接追逐时表现得很好,但在预测即将到来的幽灵方面仍然很差,可能是因为它还没有足够的经验来观察它们的运动。
这就结束了 Q-learning 的介绍。在我们的下一篇文章中,我们将从 Atari 的世界转移到解决世界上最著名的 FPS 游戏之一。敬请期待!
我们希望你喜欢这篇文章,并希望你查看 GradientCrescent 上的许多其他文章,涵盖人工智能的应用和理论方面。要了解关于 GradientCrescent 的最新更新,请考虑关注该出版物并关注我们的 Github 资源库。
参考文献
萨顿等人。强化学习
怀特等人。阿尔伯塔大学强化学习基础
席尔瓦等人。阿尔,强化学习,UCL
Ravichandiran 等人。al,用 Python 实践强化学习
通过深度学习实现项目管理自动化
如何使用自然语言处理对项目状态更新进行分类

介绍
在数据驱动的项目管理未来,项目经理将得到人工智能的增强,人工智能可以突出项目风险,确定资源的最佳分配,并自动化项目管理任务。
例如,许多组织要求项目经理定期提供项目状态更新,作为交付保证过程的一部分。这些更新通常由文本注释和相关的红-琥珀色-绿色(RAG)状态组成,其中红色表示失败的项目,琥珀色表示有风险的项目,绿色表示正在进行的项目。如果我们能自动化这个过程,使它更加一致和客观,那不是很好吗?
在这篇文章中,我将描述我们如何通过应用自然语言处理(NLP)将文本评论自动分类为红色、琥珀色或绿色状态来实现这一点。

Updating a project status in Sharktower, Mudano’s data-driven project management platform
训练项目管理语言模型
为了确保我们的 RAG 状态分类器取得好的结果,我们首先需要建立一个语言模型,它理解项目经理使用的特定语言。
仅仅在几年前,训练一个定制的项目管理语言模型需要大量的文本和强大的计算能力。然而,将迁移学习应用于 NLP 的最新进展允许我们在几分钟内在一个适度的 GPU 上使用相对较小的数据集训练一个定制的语言模型。
在迁移学习中,我们采用在大型通用数据集上训练的模型所学习的权重,并使用它们作为在不同数据集上训练新模型的起点。这是一个非常有用的技术,因为它允许我们在数据有限的情况下训练高性能的语言模型。
Mudano 已经收集了一个小型(但丰富)的数据集,该数据集涵盖了许多大型 IT 转型项目的项目状态更新。我们将使用此数据集首先训练一个自定义项目管理语言模型,然后训练 RAG 状态分类器。
探索数据
我们首先将数据加载到一个pandas.DataFrame中,并查看一个示例项目状态更新。我们的数据以一种.csv格式存储,由一列文本评论和一列相关的 RAG 状态组成。我们可以如下加载它:
import pandas as pddatapath = '/path/to/data/'
datafile = 'project-updates.csv'df = pd.read_csv(datapath+datafile)
从我们的数据集中随机选取一个示例文本注释:
df['text'][42]
所有活动继续在阶段关口批准的情况下进行计划。\ n \对数据库的分析已完成,当前正在评估使系统符合要求的选项。一旦完成,将提出将系统纳入项目范围的请求。\ n \ nA 已确定对下游的影响,如果在源系统中删除信息后对其进行查询,将返回空响应。正在进行调查,以了解这种影响是否可以接受,或者是否需要采取行动。
文本非常干净,我们不需要做任何额外的清理。
根据经验,我们知道项目经理更可能报告绿色状态,而不是琥珀色或红色状态。让我们快速检查一下我们的数据是否如此,然后绘制结果:
labelcounts = df.groupby(["label"]).size()
label_sum = len(df["label"])
class_imbalance = [(count/label_sum) for count in labelcounts]

正如我们所怀疑的,绿色状态更新比琥珀色状态更新的可能性大得多,而红色状态更新的可能性最小。当我们训练我们的 RAG 状态分类器时,我们将需要考虑这种类别不平衡。
深度学习入门
现在我们已经探索了我们的数据,我们可以使用机器学习对其建模。深度学习是机器学习的一个分支,它使用在大型数据集上训练的深度神经网络,特别适合于语言建模和文本分类等任务。为了构建我们的深度学习模型,我们将使用fastai库。
fastai是一个高级深度学习库,针对典型的机器学习问题,如图像和文本分类、图像分割和协同过滤,大大简化了深度神经网络的训练。
要安装fastai库,我们可以简单地使用conda包管理器,如下所示:
conda install -c pytorch -c fastai fastai
然后我们可以导入主fastai库和fastai.text模块:
from fastai import *
from fastai.text import *
将数据加载到 fastai
现在我们已经导入了fastai.text模块,我们可以使用它的内置函数轻松加载和处理我们的数据。由于我们的数据是基于文本的并且是.csv格式的,并且由于我们正在构建一个语言模型,我们使用TextLMDataBunch.from_csv函数将我们的数据加载并处理到一个数据集中:
data_lm = TextLMDataBunch.from_csv(datapath, datafile)
令人惊讶的是,这就是我们准备训练我们的自定义语言模型!
不过,在我们这样做之前,有必要花点时间深入了解一下fastai在幕后所做的巧妙的数据处理。
标记化、数字化和分裂
与图像数据不同,原始文本数据不能直接输入到机器学习模型中,需要处理成数字格式。要做到这一点,我们需要将文本分割成标记,然后可以为这些标记分配数值。
默认情况下,在fastai.text中,文本标记化在单词级完成,标记化中包括单词的标点符号和缩写。fastai.text还会自动删除 HTML 符号,并添加特殊标记来替换未知标记。
一旦文本被标记化,fastai.text就会将标记列表转换成整数,并计算每个标记出现的频率。默认情况下,fastai.text保留 60,000 个最常用的标记,并删除在文本中出现不到两次的标记。这些标记是用于训练语言模型的词汇。在我们的例子中,由于相对较小的数据集,我们只有一个994令牌的词汇表。
fastai还可以方便地将数据分为训练集和验证集。
训练自定义语言模型
我们通过在fastai中定义一个语言学习者对象来构建我们的定制语言模型:
learn_lm = language_model_learner(data_lm, pretrained_model=URLs.WT103, drop_mult=0.5)
我们使用之前定义的 data bunch(data_lm)和一个预训练的语言模型(pretrained_model=URLs.WT103)作为学习者对象的输入,并将 dropout 设置为0.5以避免过度拟合(drop_mult=0.5)。
fastai.text默认使用 AWD-LSTM 模型,我们选择通过提供在 WikiText-103 数据集上训练的预训练模型来利用迁移学习。
为了开始训练我们的模型,我们需要决定一个合适的学习速率。幸运的是,fastai有一些非常有用的内置工具,可以很容易地为此选择一个最佳值。
我们可以使用fastai学习率查找器(它在一定的学习率范围内运行一系列小型培训任务),然后绘制损失与学习率的关系图:
learn.lr_find()
learn.recorder.plot()

然后,我们在最小损失之前选择一个学习率,就像杰瑞米·霍华德在fast . aiCoders 实用深度学习课程中推荐的那样。从上面的情节,我决定了一个1e-01的学习率。
为了训练我们的模型,我们只需从我们的学习者对象中调用fit_one_cycle方法,输入我们想要训练的时期数(在本例中为20)以及我们使用学习率查找器找到的最佳学习率:
learn_lm.fit_one_cycle(20, 1e-1)
使用我们相对较小的数据集,在 Nvidia Tesla K80 GPU 上训练超过 20 个纪元只需要几分钟,并给出了34.3的验证困惑分数。
还不错!但我们肯定可以在这方面有所改进。
在第一次训练中,我们只训练了 LSTM 模型的最后一层。fastai库允许我们“解冻”模型的早期层并训练它们。
在我们的第二次训练运行中,我们将使用较低的学习率来微调我们的模型,并使用slice函数衰减模型中早期层的学习率:
learn_lm.unfreeze()
learn_lm.fit_one_cycle(20, slice(1e-2/10, 1e-2))
这背后的直觉是,模型中的早期层已经学习了语言的基本方面,所以我们不想改变太多。
在解冻模型的早期层并使用超过 20 个时期的衰减学习率进行训练之后,我们得到了验证困惑分数3.3。
让我们看看我们的定制项目管理语言模型在生成项目更新评论方面做得如何:
learn_lm.predict("This project is", n_words=10)
该项目现已完成,目前正在工作过程中。
这是相当惊人的!该模型理解语法和标点符号,并在正确的上下文中使用项目管理特定的单词。
让我们保存自定义语言模型编码器,以便在分类器中使用:
learn_lm.save_encoder('lm_enc')
训练 RAG 状态分类器
现在我们有了一个定制的项目管理语言模型,我们可以构建一个模型来将文本注释分类为红色、琥珀色或绿色状态。
我们需要做的第一件事是创建一个文本分类数据库,就像我们在训练语言模型时所做的那样:
data_clas = TextClasDataBunch.from_csv(datapath, datafile, vocab=data_lm.train_ds.vocab, bs=32)
为了创建文本分类数据束,我们需要为该函数提供我们的定制语言模型词汇表(vocab=data_lm.train_ds.vocab)和训练批量大小(bs=32)。
接下来,我们定义一个文本分类学习器对象,使用文本分类数据束作为输入,并在0.5设置 dropout:
learn_clas = text_classifier_learner(data_clas, drop_mult=0.5)
然后,我们加载之前保存的定制语言模型编码器:
learn_clas.load_encoder('lm_enc')
我们现在可以开始训练我们的 RAG 状态分类器,但是为了确保我们得到好的结果,我们需要一种方法来处理我们在探索数据时注意到的显著的类别不平衡。如果我们不处理这一点,分类模型很可能会简单地学习预测我们输入的任何文本评论的多数类(green)。
我们可以处理类别不平衡的一种方式是计算不同类别的平衡,并使用这种平衡的逆来加权每个不同类别的损失函数,即,如果类别出现得更频繁,则该类别被扣分。
这只是我们在探索数据时计算的class_imbalance的倒数,可以很容易地输入到我们的交叉熵损失函数中:
weights_balance = [(1-count/label_sum) for count in labelcounts]
loss_weights = torch.FloatTensor(weights_balance).cuda()
learn_clas.crit = partial(F.cross_entropy, weight=loss_weights)
现在我们已经处理了类别不平衡,我们可以训练我们的 RAG 状态分类器。我们遵循与训练自定义语言模型完全相同的过程。
首先,我们运行fastai学习率查找器并绘制结果:
learn_clas.lr_find()
learn_clas.recorder.plot(skip_end=15)

然后,我们开始使用最佳学习率(1e-2,取自上面的图)和我们选择训练的时期数(20)来训练分类器模型:
learn_clas.fit_one_cycle(20, 1e-2)
由于这是一个高度不平衡的多类分类问题,我们不能使用准确性作为我们模型的性能度量。相反,我们将使用微观 F1 分数作为我们的性能指标,它考虑了精确度、召回率和类别不平衡。
在这个初始训练周期之后,我们的分类模型达到了 F1 分数0.77。我们解冻早期的层并微调我们的模型:
learn_clas.unfreeze()
learn_clas.fit_one_cycle(20, slice(1e-3/10, 1e-3))
那就是我们!我们有一个 RAG 状态分类器,它使用一个定制的项目管理语言模型,并且达到 F1 分数0.79。
让我们看看 RAG 状态分类器在我们从一个项目更新中输入一个文本注释示例时是如何工作的。
分类示例
数据里程碑 31/05 将无法实现,当前重新计划日期正在审核中。这是由于数据接收挑战,特别是“同步排序”数据迁移问题、平台复杂性和 IT 发布治理流程。
由于技术 SME 可用性造成的持续数据来源延迟,解决方案里程碑面临风险;升级继续优先考虑集团 IT 和技术部门的计划
工作正在进行中,以制定流程,商定计划中使用的工具,并确定流程改进的可行性、交付的逻辑分组,以纳入优化的计划。
learn_clas.predict(example)(Category **red**, tensor(2), tensor([0.0018, 0.0034, 0.9948]))
我们的模型正确地将上面基于文本的评论分类为红色状态更新,它读起来肯定像一个红色状态!
结论
在这篇文章中,我已经向你介绍了如何通过迁移学习,使用在相对较小的数据集上训练的定制语言模型,来构建深度学习文本分类器。
通过利用fastai库的功能,我们现在有了一个定制的项目管理语言模型和 RAG 状态分类器,我们可以使用它来基于文本评论自动确定项目的状态。
这只是一个例子,说明了 Mudano 如何通过使用机器学习来自动化项目管理任务,从而使项目经理能够专注于真正重要的事情。
你想为一些世界上最大的公司做类似的项目吗?或者帮助开发支持自主项目的产品?如果有,那就在这里 查看 Mudano 的面向客户端的数据科学家和 R & D 数据科学家开放职位 或者在LinkedIn上联系我。
自动化科学数据分析第 1 部分:
为什么以及如何编写能够自动分析科学数据集的 Python 程序

许多人都熟悉数据科学技术的典型应用。一家拥有巨大数据集的公司要求某人挖掘数据集以进行理解,开发针对数据集训练的算法,并让公司使用他们的模型来推动业务决策。数据科学写作通常关注这种有价值的应用,但也有其他应用,人们可以从这些技术和思维模式中受益。例如,科学研究人员。
科学研究与数据科学有许多共同之处。经常有大量的数据集需要研究。这些数据集通常包含重要问题的答案。这些答案通常对决策很重要。主要区别在于,科学研究人员通常在电子表格中手动进行数据分析,而数据科学家通常利用 Python 中许多强大的软件包。
这篇文章的目的是向科学家介绍数据科学技术和思维方式可以改善科学研究的一些方法,以及为什么科学家应该考虑使用这些技术而不是他们当前的方法。基本原理很简单:大多数科学数据分析的数据分析部分是例行的,可以用 Python 脚本自动完成。这种自动化使科学家能够在一段时间内处理比竞争对手更大的数据集,错误更少。
我为什么要自动化我的数据分析?
这也许是最重要的问题。没有人会去学习一项新技能,在这里是 Python 编程和数据分析自动化这两项新技能,如果他们认为这对他们没有好处的话。幸运的是,科学家应该自动化数据分析的原因有很多,包括以下几点:
- 更快的数据处理速度:分析科学数据集可能会耗费数周或每年数月的时间。每个项目,无论是实验室实验、现场研究还是模拟研究,都会产生数百个甚至数千个数据文件。这些文件中的每一个都必须打开,研究以确保测试/监控/模拟正确进行,并分析以找到包含在该文件中的结果。然后,必须将结果添加到另一个文件中,并保存以供以后分析。手动执行此操作需要大量时间。它是昂贵的。又重复又无聊。自动化解决了所有这些问题。如果项目提前计划好,科学家可以编写一个 Python 脚本,自动对每个数据文件执行所有这些任务。那么这个过程可以在几分钟而不是几个月内完成。
- 减少的错误可能性:人类会犯错误。这只是人类的一部分。分析数百个测试文件需要数千次计算。它包括创造数百个情节。它需要在正确的位置保存数百个数据点。这些操作中的每一个都有可能出现打字错误、不正确地记忆常数、将文件保存在错误的位置、不一致的绘图轴标签等等。这一直是过程的一部分,需要大量的关注和时间来避免。同样,自动化有可能完全避免这个问题。科学家只需要确保一个 Python 脚本是正确的,而不是确保数百个数据文件中的所有计算和绘图都是正确的。然后将该脚本应用于每个文件。如果脚本中有一个错误,没有必要翻遍数百个文件来检查错误在哪里;只需更新脚本并在所有文件上重新运行即可。喝咖啡的时候。
- 访问 Python 包:有许多 Python 包是专门为让科学家的生活更轻松而设计的。Scikit-learn 对于需要进行回归或实现机器学习的科学家来说是一个优秀的软件包。Numpy 是一个数字软件包,能够执行科学家需要的大多数计算。Matplotlib 和 Bokeh 都提供了具有不同功能的绘图选项,允许灵活地创建绘图。Pandas 用数据框架取代了 Excel 表格,使数据能够以熟悉的方式进行结构化和操作。
- 可用于其他目的的时间:由于自动化数据分析让你可以在更短的时间内完成那部分工作,突然你就有时间从事其他活动了。也许你更愿意把时间花在业务拓展和提案写作上。或者你有一个你想指导的员工。或者你想花更多时间的客户关系。不管你觉得什么活动更有意义,分析你的数据分析会帮助你在那里花更多的时间。
我相信这些原因为学习自动化数据分析提供了坚实的理由,并且任何科学家这样做都是明智的。但我确信这些不是全部原因。你认为你还能获得什么好处?
由于实验室实验和相关的数据分析是科学研究的一个常见部分,本系列文章将重点关注如何自动化这一过程。
我需要采取什么步骤来自动化实验室数据分析?
首先,在更深入地讨论几个主题之前,我们将介绍项目的结构和总体设计。这一系列的文章将集中在这个过程的计划和数据分析方面。
不幸的是,每个项目都必须单独处理,详细的通用解决方案并不存在。然而,有一个基本的方法可以应用于每个项目,具体的编程(主要是计算)在项目之间有所不同。下面的一般过程提供了自动化数据分析项目的结构。
1.创建测试计划
确定需要执行哪些测试来生成回答研究问题所需的数据集。这确保了在项目结束时生成回归时有令人满意的数据集可用,并避免了执行额外测试的需要。
2.设计数据集以允许自动化
这包括指定哪些信号将被用来识别测试中最重要的部分,或者将被脚本分析的部分。这确保了有一种简单的方法来构建脚本,以识别每个单独测试的结果。
3.创建一个清晰的文件命名系统
要么创建一个数据打印方法,使每个测试中的测试条件的识别变得简单明了,要么与实验室测试人员合作来完成。这确保了程序能够识别每个测试的条件,这对于分析数据和存储结果是必要的。
4.将结果数据文件存储在特定文件夹中
这允许使用 Python 包“glob”来依次打开和分析来自每个单独测试的数据。
5.分析单个测试的结果
创建一个程序来自动循环所有的数据文件,并分析每个数据集。这个程序可能会使用 for 循环和 glob 来自动分析每个数据文件。它可能会使用 pandas 来执行计算,以确定测试的预期结果,并创建检查来确保测试正确执行。它还可能包括使用散景或 matplotlib 的绘图功能。
6.包括错误检查选项
在这个过程中可能会出现许多错误。也许有些测试有错误。也许程序计算有错误。通过确保程序提供足够的输出来检查测试结果和后续数据分析的质量,使您的生活更加轻松。这可能意味着打印测试图,以便进行视觉检查,或者添加一种算法,将测量数据和计算结果与预期进行比较,并报告错误。
7.逻辑地存储数据
每次测试的计算值需要存储在表格和数据文件中,以备后用。这些值的存储方式可能会使剩下的步骤变得容易,也可能变得不可能。数据通常应该存储在不同的表中,这些表提供了以后执行回归所需的数据集。
8.从产生的数据集生成回归
创建一个程序,该程序将打开步骤 7 中存储的数据并创建回归。它应该包括一个算法来创建每个期望的回归,匹配步骤 7 中确定的数据存储结构。确保该程序提供足够的统计和视觉输出,以便对结果进行彻底验证。
9.验证结果
使用步骤 8 中提供的统计和可视化输出来验证回归结果。确定模型是否足够精确。如果没有,要么返回步骤 7 并生成不同的回归,要么返回步骤 1 并添加额外的测试以创建更全面的数据集。如果模型足够精确,就公布它的优点和缺点的详细描述,以便将来的用户了解应该/不应该使用该模型的情况。
后续步骤
这篇文章介绍了使用 Python 脚本自动化科学数据分析的概念、动机和过程。本系列的其余文章将指导你完成上述 9 个步骤。下一篇文章将讨论第 1 步到第 6 步,让你对如何自动分析单个实验室测试有一个明确的理解。第三篇也是最后一篇文章将讨论如何存储每次测试的数据,并将其组合起来形成回归。当这两篇文章中涉及的主题结合在一起时,您将能够编写脚本来自动执行特定项目的整个数据分析过程。
我希望在那里见到你,也希望你觉得这些帖子有用。
自动化科学数据分析第 2 部分:
如何构建您的项目,以便 Python 程序能够理解您的数据文件

自动化科学数据分析的第一步是确保您的程序能够理解每个文件中包含的数据。这一步有三个主要挑战:
- 首先,来自测试的数据必须以一种程序能够识别数据的重要部分的方式来组织。许多测试在进入具有可用数据的测试部分之前会有预热阶段、调节阶段和/或过渡阶段。为了分析数据集,程序必须使用一致信号来识别要分析的正确周期。本文将介绍几种潜在的解决方案,您可以使用它们来克服这一挑战。
- 第二,程序必须有识别每个测试条件的方法。这些条件对于执行计算以理解数据,以及将结果存储在适当的位置都至关重要。这篇文章将介绍几种不同的方法来指导你的程序获得每个测试的条件。
- 第三,每个测试的数据必须有自己独特的文件,前面的建议才能起作用。有时来自整个项目的数据文件在一个文件中,这使得识别每个测试的条件更加困难。本文将提供两个解决方案来帮助您分离这些文件,为每个测试创建一个单独的数据文件。
为自动化实验室数据分析设计数据集
可重复数据集允许创建程序,每次都以完全相同的方式处理数据集,无需修改。与此同时,所有的实验和/或模拟数据集都将是复杂的,在整个测试过程中会发生变化,或者在比其他人更感兴趣的时期发生变化。因此,目标是在潜在的不可重复的过程中创建可重复的信号。
有几种方法可以做到这一点。它们包括使用阀门状态或控制设定点作为表明试验已改变阶段的信号,将测量条件与设定点进行比较,或使用试验时间。这些选项将以热交换器的单次测试为例进行说明。
引入单个数据集
本主题将使用模拟逆流换热器测试过程中发生的情况的示例数据集进行描述。这不是实际的实验室数据;相反,它是专门为演示这些概念而创建的人工数据集。当表征热交换器时,感兴趣的主要输出是稳态效率。确定有效性的公式如公式 1 所示。根据等式 1,该测试中的重要测量值是装置两侧的流速、入口温度和出口温度。

Equation 1: Heat Exchanger Effectiveness
图 1 和图 2 显示了可能来自典型测试的示例数据,图 1 显示了水流速数据,图 2 显示了温度数据。数据集模拟了一个测试,该测试在设备两侧具有相同的流速,热侧水温为 100.4 度,冷侧水温为 50 度。为了模拟实验数据中固有的可变性,在人造数据集中加入了一些随机性。
为了便于讨论,需要注意的重要一点是,这个测试有三个阶段。第一阶段是测试的条件阶段。在这一阶段,整个系统用 70 度的水冲洗,以确保装置有一个稳定的启动条件。第一阶段可以被识别,因为温度数据都是大约 70 度,并且流速接近 0.5 加仑/分钟。在第二阶段开始之前,该阶段持续测试的第一个 410 秒。第二阶段是预热阶段,此时热水和冷水进入设备,设备接近稳态运行。因为流速从大约 0.5 加仑/分钟突然跳到大约 3.5 加仑/分钟,所以它可以被识别。第三阶段是测试的稳态有效性部分。在第三阶段,流速相当稳定在 3.5 加仑/分钟,热侧入口温度相当稳定在 100.4 度,冷侧入口温度相当稳定在 50 度。因为系统运行稳定,所以它用于识别设备在稳态条件下的性能。该阶段从 440 秒开始,直到测试结束。

Figure 1: Example Water Flow Data from a Typical Test

Figure 2: Example Temperature Data from a Typical Test
图 3 显示了使用图 1 和 2 所示的数据和公式 1 计算的有效性。在测试的前两个阶段计算的有效性是没有价值的。这是因为在测试过程中,系统不是在稳定状态下运行的,而稳定状态的有效性才是我们所关心的。

Figure 3: Calculated Effectiveness From the Sample Data
图 3:使用样本数据计算的有效性
请注意,在试验的不同阶段,稳态有效性有很大的差异。这些差异给自动化数据分析带来了挑战。由于每次测试的预期结果是计算装置在稳定状态下的平均有效性,包括前两个阶段的数据将产生错误的结果。这需要过滤数据集,以便分析集中在所需的部分,并设计实验来实现它。
分离所需数据集的方法
有无数种方法可以分离出所需的数据集。诀窍是根据个人的需求和对可用数据的控制,找到一种适用于任何给定应用程序的方法。本节将描述几种不同的方法,同时比较它们的优缺点。
使用控制信号
分离所需数据的最有效方法是在数据集中打印一个控制信号。该控制信号陈述了识别测试的适当阶段的测试的一些条件。使用该控制信号过滤数据集允许分析器减少数据集以仅包括相关数据。
使用示例热交换器分析,打印流量控制阀的状态将达到此结果。阀的状态必须改变,以使通过装置的流速在第一阶段结束时从 0.5 加仑/分钟突然变为 3.5 加仑/分钟。打印该控制阀信号为程序提供了一个坚实的点,以识别调节阶段已经结束,测试阶段已经开始。图 4 显示了添加了控制阀信号的典型测试的相同流量数据。

Figure 4: Valve Status and Flow Data in a Typical Test
图 5 显示了通过阀门状态信号过滤的来自同一数据集的有效性数据。由于使用了该阀门信号,该有效性数据集仅包括当有流体通过该装置时的数据(阶段 2 和 3)。包含第 2 阶段的数据会导致少量的错误,尽管远远没有包含第 1 阶段的数据那么多。图 5 所示的有效性数据的稳定性表明,稳态期间的平均有效性是一个精确的计算结果。

Figure 5: Effectiveness Data Filtered by a Valve Signal
使用已知的时间
分离所需数据部分的第二种方法是过滤数据以选择特定的时间段。这种方法效果很好,因为它给了用户对结果数据集的最大控制权。与使用控制信号相比,该方法可以将数据集单独隔离到第三阶段,而不包括第二阶段。从第二阶段移除数据将略微增加结果的准确性。使用基于时间的控制的缺点是,它要求用户在每次测试中确定一个相同的时间段。如果与最初的测试计划有任何偏差,那么分析脚本必须进行相应的修改。
示例数据集中的第三阶段开始于 440 秒,因此这是用于分析数据的逻辑时间条件。然而,没有办法确定每一个测试都将相同地进行,并且第三阶段将在每次 440 秒时开始。因此,稍后设置过滤器可以提高分析的安全性。不利的一面是,分析是使用更少量的数据完成的,但是影响应该是可以忽略的,因为测试的稳态部分是 935 秒长。图 6 显示了过滤数据对测试最后 900 秒的影响。

Figure 6: Effect of Filtering the Data to the Last 900 Seconds
使用测试最后 900 秒的数据会将结果数据集隔离到测试的第三阶段。它还会排除样本数据中第三阶段的一小部分,以防第二阶段在其他测试中变慢。同时,900 秒转换为 15 分钟,这对于识别设备的稳态操作来说绰绰有余。图 7 显示了过滤后仅包含样本数据集最后 900 秒的有效性数据。

Figure 7: Effectiveness Data Filtered to the Last 900 Seconds
如何确定实验室测试的条件并拆分大数据文件
该过程的下一步是编写您的脚本,以便它知道它所分析的每个测试的条件。该程序必须能够确定测试条件,以执行必要的计算,并正确存储数据,供以后进一步分析。有几种方法可以向程序提供测试条件信息,包括以下方法:
- 以数据文件的名称写入测试条件,
- 将测试编号放在数据文件的名称中,并引用测试计划,以及
- 从数据集中读取测试条件。
这些解决方案都有一个共同的假设,即每个测试都来自一个单独的数据文件。然而,有时数据集在单个数据文件中包含几个测试。在这种情况下,必须开发另一种算法来将大数据文件分割成单独的数据文件。解决这一问题的一些可能方法包括:
- 基于测试之间的已知调节期分割数据集,以及
- 使用测试中打印的控制信息。
以下章节详细介绍了三种确定测试条件的方法。
将条件写入数据文件的名称中
这种策略使用数据文件的名称来存储测试条件。这样,分析程序可以在打开文件时读取条件。这种方法的一个主要优点是测试条件也容易被读者理解。不利的一面是文件名可能会变得又长又麻烦。
例如,假设使用以下参数进行测试:
- 热端和冷端流速均为 3 加仑/分钟,且
- 热端入口温度为 100.4 华氏度,且
- 冷端入口温度为 50 华氏度
以下是包含此信息的文件名示例:
flow hot = 3 _ flow cold = 3 _ temperature hot = 1004 _ temperature cold = 50 . CSV
请注意,文件名中不能使用小数点,因此热端入口温度应写成“1004”而不是“100.4”。
为了从这个文件名中读取条件,数据分析脚本需要一个算法来读取文件名的内容。最简单的方法是创建一个算法来读取位于两个标识符之间的值。这些标识符是用于将参数与文件名中的描述性术语分开的字符。在我们的例子中,它们是“=”和“_”。继续热交换器的例子,四个参数的值可以用下面的代码来标识。
def Find_Between(String, First, Last):try:Start = String.index(First) + len(First)End = String.index(Last, Start)return String[Start:End]Flow_Hot = float(Find_Between(filename, ‘FlowHot=’, ‘_FlowCold))Flow_Cold = float(Find_Between(filename, ‘_FlowCold=’, ‘_TemperatureHot’))Temp_Hot = float(Find_Between(filename, ‘_TemperatureHot=’, ‘_TemperatureCold’))/10Temp_Cold = float(Find_Between(filename, ‘_TemperatureCold=’, ‘.csv’))
Find_Between 需要三个输入:1)正在搜索的完整字符串,2)感兴趣部分之前的字符串部分,以及 3)感兴趣部分之后的字符串部分。然后,它返回位于描述符之间的字符串。如果没有找到指定的描述符,它将返回一个错误。
Find_Between 定义之后的四行代码调用函数来标识文件名中指定的四个参数的值,并将它们转换为 float 类型。在 T_Hot 的情况下,该值除以 10,因此程序将其视为 100.4 而不是 1004。
在文件名中引用测试号
另一种解决方案是在文件名中打印测试号,并让程序打开测试文件来识别条件。这种方法实现起来不太复杂,并且数据文件的名称也更短。然而,文件名的描述性要差得多,这使得手动识别每个测试的内容更加困难,如果这被证明是重要的话。
例如,考虑名为“14 HX 2018 年 1 月 30 日. csv”的文件。该文件代表 2018 年 1 月 30 日进行的第 14 次热交换器试验。为了识别测试条件,程序需要识别它是测试号 14,并通过参考测试矩阵来识别测试 14 的条件。下面一行代码可以识别测试号:
Number_Test = int(filename[0:3])
这段代码读取文件名中的前两个索引,在本例中为“14”,并将它们转换为一个整数值。注意,在只有一位数的测试中,返回的字符串后面会跟一个空格。转换为整数时,空格会被删除。
然后必须参考测试矩阵,根据测试矩阵确定测试条件。它可以用熊猫来打开。read_csv 函数,如下所示。
Test_Matrix = pd.read_csv(r’C:\Users\JSmith\DataAnalysis\TestMatrix.csv’)
注意,代码中的路径是完全虚构的,并且必须被修改以读取测试矩阵的位置。
最后一步是从测试矩阵中读取测试条件。这是通过使用。熊猫锁功能。假设测试矩阵如表 1 所示。测试编号中显示“…”的行表示矩阵中有额外的测试,但没有显示出来。

可以使用下面的代码来确定测试的条件。
Flow_Hot = Test_Matrix.loc[Number_Test, ‘Hot-Side Flow Rate (gal/min)’]Flow_Cold = Test_Matrix.loc[Number_Test, ‘Cold-Side Flow Rate (gal/min)’]Temperature_Hot = Test_Matrix.loc[Number_Test, ‘Hot-Side Inlet Temperature (deg F)’]Temperature_Cold = Test_Matrix.loc[Number_Test, ‘Cold-Side Inlet Temperature (deg F)’]
此代码将搜索使用 pandas.read_csv 读取第 14 行的数据帧时创建的 Test_Matrix 数据帧,其中 Test_Number = 14,并从相应的列中提取值,如每行代码中所指定的。通过这种方式,可以识别每个测试的条件,并为以后的分析做好准备。
从数据文件中读取测试条件
最后一个选择是读取文件中的数据,并根据发生的情况确定测试条件。这个选项是最不准确的,因为它有错误识别条件的风险,应该被认为是最后的手段。这种方法的优势在于它不需要实验室测试人员的帮助,并且可以识别未指定数据文件的测试条件。
请记住,测试的稳定状态部分是在测试的最后 920 秒进行的。测试的标称条件可以通过计算在此期间每个点的平均值来近似。可以使用下面的代码来估计四个必需的参数。
Flow_Hot = Data_File[‘Hot-Side Flow Rate (gal/min)’][-50:].mean()Flow_Cold = Data_File[‘Cold-Side Flow Rate (gal/min)’][-50:].mean()Temperature_Hot = Data_File[‘Hot-Side Inlet Temperature (deg F)’][-50:].mean()Temperature_Cold = Data_File[‘Cold-Side Inlet Temperature (deg F)’][-50:].mean()
这四行代码选择每个数据列中的最后 50 个条目,并计算平均值。这提供了测试稳定状态期间该数据点的平均值,以及代表测试条件的近似值。
下一步是确定运行测试时使用的标称条件。因为测量数据永远不会与标称条件完全匹配,所以测试矩阵中指定的值与分析脚本确定的值之间会有细微的差异。使用测试矩阵来确定脚本中的标称值可以更容易地跟踪结果。这是通过将测试中的识别值与测试矩阵中的标称值进行比较,并识别差异最小的情况来实现的。考虑以下可用于识别标称 Flow_Hot 值的代码。
Test_Matrix = pd.read_csv(r’C:\Users\JSmith\DataAnalysis\TestMatrix.csv’)Test_Matrix[‘Difference Flow Hot (gal/min)’] = abs(Test_Matrix[‘Hot-Side Flow Rate (gal/min)’] — Flow_Hot)Flow_Hot = Test_Plan.loc[Test_Plan[‘Error_Flow_Hot’][Test_Plan_First:Test_Plan_Final].idxmin(), ‘Hot-Side Flow Rate (gal/min)’]
这段代码中发生了三件事:
1.第一行读取测试矩阵。
2.第二行在表中创建一个新列,该列标识每个测试的标称条件和当前测试的估计条件之间的差的绝对值。
3.第三行标识标称条件和测量条件之间差异最小的行,并将 Flow_Hot 设置为等于为该测试指定的热端流量。
请记住,该代码返回的标称条件与测试过程中发生的情况最接近。在测量不确定度较高或每次测试之间标称条件差异较小的情况下,该代码可能会识别不正确的标称条件。因此,这种方法应被视为最后的手段。
拆分数据文件
所有先前描述的方法都假设每个测试都有一个独立的数据文件。如果数据是通过包含在一个大数据文件中的几个测试交付的,那就不行了。在这种情况下,脚本必须将不同的测试从数据集中分离出来,并创建单独的数据文件。这可以通过识别可重复的信号并在该信号出现时创建新的数据文件来实现。在我们的热交换器示例中,可重复信号的两个示例包括:
- 每个测试在开始前都有一个冲洗期。冲洗期用于确保设备在可重复的条件下开始每次测试。在 70 华氏度时,装置两侧的流量为 4.15 加仑/分钟。流速和/或温度条件可用于识别该冲洗周期。
- 控制阀用于引导水流通过试验装置的不同部分。一种阀门配置指示冲洗周期,而另一种指示测试周期。流量阀配置是识别冲洗周期的另一种选择。
注意,使用控制阀状态的第二种选择比使用温度和/或流量条件更可靠。这是因为一些测试可能使用类似于刷新周期的条件,并且存在脚本混淆两者的风险。
一旦选择了标识符,就必须编写代码来定位发生这种情况的实例,并相应地创建新的测试文件。这可以通过删除表示刷新周期的数据并识别表索引发生变化的实例来完成。以下代码显示了一个示例,其中当“电磁阀 1 状态(-)”= 0 时发生冲洗,当“电磁阀 1 状态(-)”= 1 时进行测试。
Data_File = pd.read_csv(r’C:\Users\JSmith\Data.csv’)Data_File[‘Index’] = Data_File.indexData_File = Data_File.drop(Data_File[Data_File[‘Solenoid Valve 1 Status (-)’] == 0].index)Data_File = Data_File.reset_index()Data_File[‘Index_Shift’] = Data_File[‘Index’].shift(periods = -1)Data_File[‘Index_Shift’] = Data_File[‘Index_Shift’] — Data_File[‘Index’]End_Of_Tests = []End_Of_Tests = End_Of_Tests + Data_File[Data_File[‘Index_Shift’] > 1].index.tolist()End_Of_Tests.append(Data_File.index[-1])
该代码执行以下操作:
1.前两行读取数据文件,并创建一个标题为“Index”的列,该列与表的索引相匹配。
2.第三行删除表中“电磁阀 1 状态(-)”= 0 的所有行,从而删除代表冲洗周期的所有代码部分。
3.第四行重置表的索引,这样看起来好像没有删除任何行。请注意,标题为“Index”的列在此步骤中没有更改。
4.第五行创建了一个名为“Index_Shift”的新列,它复制了“Index”中的值,但在表中上移了一行。它提供了一种简单的方法来识别从一行到下一行有多少“索引”变化。
5.第六行将任何给定行中的“Index_Shift”更改为等于“Index”减去“Index_Shift”。在测试的稳定状态部分,该值等于 1。在清除周期被移除并且数据现在从一个测试跳到下一个测试的情况下,“Index_Shift”将大于 1。
6.最后三行创建了一个名为“End_Of_Tests”的数组,数组中的条目表示与任何给定测试中的最后数据读数相对应的行的索引。它用“Index_Shift”大于 1 的任何行的索引填充。它还接受数据集中的最终索引,因为“Index_Shift”方法不会将该行标识为测试中的最终读数。
这段代码运行后,“End_Of_Tests”数组提供了一个列表,列出了与每个测试的结尾相对应的所有索引。然后,代码需要将数据集分割成单独的文件,并将它们另存为新文件。带有描述性名称的 csv 文件。这可以通过以下步骤实现:
1.创建一个循环遍历“End_Of_Tests”数组的 for 循环。
2.使用中描述的技术,从数据文件中读取测试条件,以确定每个测试的标称条件。
3.为描述测试条件的每个数据文件创建一个文件名。这样做的代码类似于:
File_Name = “FlowHot=” + str(Flow_Hot) + “_FlowCold=” + str(Flow_Cold) + “_THot=” + str(T_Hot) + “_TCold=” + str(T_Cold)
这将创建一组单独的数据文件,可以使用包含测试条件的文件名对这些文件进行单独分析。它们已经准备好被打开,并使用中描述的技术理解,将条件写入数据文件的名称。
后续步骤
前一篇文章关注于分析独立测试的独立结果。到目前为止,我们已经讨论了如何设计允许自动化的测试,如何从数据文件中识别测试的条件,如何根据需要分割文件,一些可用于分析数据的有用的 Python 包,以及如何自动确保测试和分析是有效的。下一篇文章将关注如何逻辑地存储这些数据文件以方便以后对数据集的分析,如何从存储的结果生成回归,以及如何验证/记录这些回归的有效性。
在自动化数据分析过程中生成回归
如何从完整的数据集推导、验证和记录回归

这是教您如何自动化科学数据分析的四篇系列文章中的第六篇。第一篇文章介绍了概念,提供了动机,并描述了一般过程。第二篇、、第三篇和第四篇文章描述了如何控制数据集、识别每个测试中的条件、处理数据以及检查数据错误。第五篇文章描述了如何以逻辑方式存储数据,以便于生成回归。这第六篇,也是最后一篇文章将教你如何从这些结果中开发回归,并验证和记录结果模型。
从存储的数据生成回归
最后一个基于 Python 的实验室数据分析自动化主题是从存储的数据中生成和验证回归。这往往是实验室数据分析项目的最终目标,在宣布项目完成之前,还有几件事情需要考虑清楚。生成回归时,必须考虑以下主题:
- 如何确定回归的最优阶,
- 用 numpy 创建一维回归,
- scikit 简介-学习创建 n 维回归,
- 验证模型,以及
- 可视化回归和验证的结果。
本节偶尔使用回归预测热交换器性能的例子。有关该技术的介绍,以及用于建模的测试和数据分析,请参见第 2 部分。
确定最佳回归结构
回归的顺序对最终模型的预测精度有着巨大的影响。高阶回归更加灵活,能够比低阶回归更好地统计匹配数据集,或者匹配更复杂的数据集。然而,增加的灵活性可能会导致模型在统计上看起来很好地符合数据,但在数据集中的测量点之间进行预测时却有很大的不准确性。低阶回归不太灵活,通常也难以在统计上匹配数据,但提供了更稳定的预测。这可能导致测量点的精度较低,但测量点之间的精度较高。
这种差异是由数据集中的数据点数量造成的。需要更多的数据点来创建更高阶的稳定回归。图 1 和图 2 清楚地显示了这种影响。两个图都显示了二阶、三阶和四阶回归。图 1 显示了使用完整数据集创建的回归。注意回归中没有显著的差异。四阶回归比三阶回归更接近数据集,三阶回归比二阶回归更好。但它们都非常接近,并且由于趋势与测量数据显示的趋势非常接近,因此可以相信它们能够准确预测中间值。在这种情况下,显然应该选择 4 阶回归。

Figure 1: Example Regression Created from a Thorough Data Set
图 2 中的回归不是这样的。图 2 显示了使用同一组测量数据的子集创建的回归。在这种情况下,4 阶回归再次比 2 阶或 3 阶回归更好地匹配测量的数据点。然而,对于高阶回归来说,既太复杂又没有足够的数据。当他们试图用有限的数据集来匹配数据点呈现的曲线形状时,他们变得不太稳定。这可以通过三阶回归,尤其是四阶回归的波动来观察。虽然四阶回归明显地与测量数据相匹配(三者中最好的),但是它不能被信任在数据集的边界内进行插值。在流速高于 3.5 加仑/分钟时尤其如此。

Figure 2: Regressions Created from a Limited Data Set
这个问题有几种可能的解决方法。它们按优先顺序排列如下:
- 收集更多数据以创建更好的数据集,
- 将数据集分成多个部分,并生成多个低阶回归,以及
- 尝试从当前可用的选项中确定最佳回归。
收集更多数据
通过提供更多的约束点,收集更多的数据会产生更稳定的回归。当确定新的测试来改进数据集时,请指定填补当前数据集中较大空白的测试。例如,如果添加额外的点来填充从 3.5 到 5.5 加仑/分钟和从 5.5 到 7.5 加仑/分钟的间隙,图 2 所示的简化数据集将更加完整。
分割数据集
拆分数据意味着确定多个部分,每个部分可以有单独的、平滑的回归,将数据集拆分成多个部分,并为这些拆分的数据集创建单独的回归。虽然它减少了每次回归的数据量,但它为它们的匹配创建了更平滑的形状。因此,即使数据集较小,也有可能得到更平滑的曲线和更好的匹配。在这种情况下,分割数据集,从 0.5-2 加仑/分钟创建一个回归,从 2.5-7.5 加仑/分钟创建第二个回归,会产生更好的结果。图 3 显示了使用前面提到的分割创建二阶和三阶回归的结果。

Figure 3: Regressions Created from a Limited Data Set, Split at 2 gal/min
结果显示,与使用单一数据集相比,使用分割数据集可以获得更好的匹配。分裂发生在 2 加仑/分钟,并且通过二阶回归预测的突然增加而明显。该凸起显示了在 2.0-2.5 加仑/分钟范围内使用二阶回归的误差增加。除了该区域,二阶回归与数据集非常接近。三阶回归在分界点没有显示出同样的不确定性,并且在整个 0.5–7.5 加仑/分钟范围内与回归非常接近。这表明,以 2 加仑/分钟的速度分割数据集,并为以上和以下创建单独的回归的方法对于该数据集非常有效。
确定最佳选项
最低效的方法是从可用选项中选择最佳回归,这是在不可能收集更多数据并且拆分数据集不能产生令人满意的结果时使用的方法。在这个数据集和图 2 所示的回归中,这意味着使用四阶回归。二阶回归可能是三个选项中最平稳的一个,但它明显高估了低流速时的有效性,低估了高流速时的有效性。三阶回归更接近,但也不太稳定。四阶回归非常接近地匹配数据点和趋势,直到 3.5 加仑/分钟。从 3.5 加仑/分钟到 5.5 加仑/分钟,它将预测过高,从 5.5 加仑/分钟到 7.5 加仑/分钟,它将预测过低;然而,在该范围内的不准确预测对所有三个选项都是真实的,并不比三阶回归更引人注目。当使用这种回归时,重要的是要记住它在低于 2.5 加仑/分钟时非常精确,在更高的流速时不太可信。
使用 Numpy 创建回归
NumPy 是 Python 中可用的科学计算工具包。在它提供的众多工具中,有一个用于创建一维回归的工具集。主要的两个工具是:
- polyfit:该工具使用用户提供的 x 和 y 数据确定 1 维 n 阶多项式的系数。NumPy.polyfit 以语法“numpy.polyfit(Data_x,Data_y,Order)”调用。
- poly1d: poly1d 使用用户指定的系数创建一个回归,并将它们赋给一个变量,以便以后可以很容易地引用该回归。NumPy.poly1d 是用语法“numpy.poly1d(系数)”调用的。
如果结果的存储方式与存储中间结果以供以后分析的建议一致,这些工具可以很自然地生成结果的回归。该过程使用以下步骤:
1.打开包含所需数据的数据文件,并将其存储在数据框中。对于这个例子,数据帧将被称为“数据”
2.使用 NumPy.polyfit 确定数据集的系数,并将它们存储到变量中。这可以通过类似下面的代码来实现:
Coefficients = numpy.polyfit(Data[‘Flow Rate (gal/min)’], Data[‘Effectiveness (-)’], 2)
在这种情况下,将流速作为 x 数据、有效性作为 y 数据的二阶回归系数存储到变量“系数”中。在热交换器中,该数据集仅具有单个流率,表示在设备的任一侧具有相同流率的情况。
3.使用系数调用 NumPy.poly1d,将回归作为函数分配给变量。例如,上一步中的系数可用于通过以下方式创建回归:
Effectiveness_SecondOrder = numpy.poly1d(Coefficients)
现在,可以通过调用“有效性 _ 二阶”函数,使用二阶回归来估计该热交换器的有效性。
4.最后一步是调用函数来生成所需的回归估计值。如何使用它的几个例子如下:
- 如果使用回归来评估特定条件下的结果,请调用引用该条件的函数,并将其赋给一个描述性变量。例如,任一侧流量均为 2 加仑/分钟的热交换器的效率可通过下式确定和保存:
Effectiveness_2_GalPerMin = Effectiveness_SecondOrder(2).
- 另一种可能的用途是用估计回归值填充数据框的列。这在验证模型时非常有用,因为回归估计值可以存储在测量值旁边的数据框中,很容易进行比较。这可以通过类似如下的代码来实现:
Data[‘Effectiveness, Estimated, Second Order (-)’] = Effectiveness_SecondOrder(Data[‘Flow Rate (gal/min)’]
c.第三种可能性允许绘制平滑回归曲线,并使用 NumPy“arange”函数。NumPy.arange 创建用户指定的值范围。它的语法是这样的:
numpy.arange(Minimum Value, Maximum Value, Step)
例如,numpy.arange(0.5,7.6,0.1)从 0.5 开始创建一个范围,每个值以 0.1 为步长递增,最大值为 7.6。这对于绘制平滑曲线非常有用,因为这是一种在期望的时间间隔预测回归结果的快速方法。例如,以下代码将创建一个 x 和 y 数据集,用于以 0.1 加仑/分钟的间隔绘制回归曲线,从最小值 0.5 加仑/分钟到最大值 7.5 加仑/分钟:
x_array = np.arange(0.5, 7.6, 0.1)Effectiveness_array = Effectiveness_SecondOrder(x_array)
Scikit 简介-学习
目前,创建 n 维 n 阶回归的最佳工具是 scikit-learn 软件包。它基于 scipy、NumPy 和 matplotlib,通常用于数据科学和机器学习领域。它提供了许多不同的回归工具,有许多不同的方法。那些有兴趣了解 scikit-learn 中所有功能的人应该查阅他们的文档,并准备学习许多不同类型的回归技术。了解数据科学的基本原理也将是有益的,关于 Coursera.org,吴恩达出版了一个信息丰富的免费课程。由于对数据科学和 scikit-learn 的全面讨论对于本文来说太长了,本节将重点介绍一些基本的线性回归技术。
使用 scikit-learn 创建线性回归的两个非常有用的工具是 1)sk learn . preprocessing . polynomial features 和 2)sk learn . linear _ model . linear regression。
多项式功能提供了一组矩阵运算,用于将数据转换成线性回归所需的形式。它创建一个矩阵,该矩阵由小于或等于用户指定的输入变量的所有组合组成。例如,使用具有两个输入变量(x 和 y)的多项式特征创建的准备二阶模型的矩阵将具有项[1,x,y,x2,xy,y2]。这种方法有时被称为“黑盒建模”,因为它并不试图理解模型行为背后的结构,而是旨在创建完全基于数学技术的匹配回归。
可以使用以下步骤创建输入矩阵:
- 通过调用多项式 Features 并指定回归的顺序来创建 matrix 对象。请注意,scikit-learn 使用术语“程度”而不是“顺序”。
- 为即将到来的线性回归安排正确格式的输入数据。对于多项式特性,这意味着单个矩阵包含指定每个测试条件的子矩阵。例如,具有三个测试和两个输入条件的输入矩阵将具有[[x_1,y_1],[x_2,y_2],[x_3,y_3]]的形式。
- 对输入数据调用 polynomial features fit _ transform 函数,并使用 numpy.delete 移除第一行。
例如,以下代码使用两个输入“热流量(加仑/分钟)”和“冷流量(加仑/分钟)”为五阶回归生成正确的矩阵。请注意,输入数据矩阵是使用从有效性数据框中读取值的 for 循环创建的。
poly = PolynomialFeatures(degree=5)All_Flow_Pairs = []for i in Effectiveness.index: FlowRate_Hot = Effectiveness.loc[i, ‘Hot Flow Rate (gal/min)’] FlowRate_Cold = Effectiveness.loc[i, Cold Flow Rate (gal/min)’] All_Flow_Pairs.append([FlowRate_Hot, FlowRate_Cold]) All_Flow_Pairs_Transformed = poly.fit_transform(All_Flow_Pairs) All_Flow_Pairs_Transformed = np.delete(All_Flow_Pairs_Transformed, (0), axis = 1)
LinearRegression 旨在轻松接受该矩阵,并生成指定的回归。它提供了对这个过程特别有用的四个函数。它们是:
- 。拟合:此函数接受输入数据矩阵和匹配结果矩阵,并将多项式特征中指定的回归拟合到数据。这是创建回归的步骤。
- 。coef_:这个函数打印描述回归的系数。存储来自的结果。coef_ 到一个变量,并在程序结束时打印它,允许存储系数供以后外部使用。
- 。intercept_:如果所有输入都设置为 0,此函数将返回回归的值。
- 。score:该函数返回回归的 r2 值,与用于创建回归的数据集进行比较。它提供了回归预测输入数据集的能力的度量。这个概念将在下一节详细讨论。
以下代码延续了 PolynomialFeatures 中的示例,并显示了 LinearRegression 的函数如何创建、记录和测试回归。
clf = LinearRegression()clf.fit(All_Flow_Pairs_Transformed, Effectiveness[‘Effectiveness (-)’])n_Dimensional_Coefficients = clf.coef_n_Dimensional_Intercept = clf.intercept_n_Dimensional_Score = clf.score(All_Flow_Pairs_Transformed, Effectiveness[‘Effectiveness (-)’])
验证模型
模型开发中最重要的部分,也是这个概念文本中无法详细描述的部分,是验证。验证是确保模型生成的预测与建模的现象相匹配的过程。这是一个复杂的、多阶段的过程,永远不会真正结束。执行质量模型验证的步骤如下:
- 确保模型与用于创建它的数据集相匹配,
- 将模型预测与附加数据集进行比较,
- 发布报告,详细说明模型的优点、缺点和适当的应用。
验证模型
第一步是将模型预测与源数据进行比较。这一步通常被称为“验证”这一步的目标很简单:确保模型与用来创建它的实验数据相匹配。正如本书中所讨论的,在为创建模型而明确创建特定数据集的情况下,模型中的误差应该非常低。执行此步骤时,需要回答两个一般问题:
- 模型是否在可接受的误差范围内与数据集匹配?
- 数据集的哪些方面被模型很好地/差地表示了?
通常,如果误差小于用于收集数据的测量的不确定性,则认为模型在可接受的误差限度内与数据集匹配。这经常被用作极限,因为它代表了知识的极限;如果模型和测量值之间的误差小于测量值的不确定性,那么就没有办法知道模型是不完美的。
不可避免的是,这个模型在一些预测上会比其他的更好。识别和研究这些差异是很重要的。它们可能显示出模型中的缺陷,可能需要使用不同的建模方法来纠正它们。如果它们是对最终结果没有重大影响的小问题,那么记录下来就足够了。确定最佳回归结构一节对这些情况提供了一些回答。
验证模型
模型验证的第二步是将模型预测与第二个数据集进行比较。这是重要的一步,因为第一步并没有真正验证模型,它只是表明它能够匹配它在数学上被迫匹配的数据集。
这个挑战的解决方案是在测试计划中包含额外的测试,但是不要将它们包含在用于生成回归的数据集中。将它们保存在一个单独的数据集中,该数据集是专门为模型验证而创建的。这样,它们对回归没有影响,并提供了可用于验证检查的附加点。
验证数据集中的测试应该尽可能彻底地测试模型。包括在模型对输入变化高度敏感的区域进行测试,以确保模型在这些范围内的预测是正确的。包括模型中所有不同变量的变化,以确保它准确地预测模型响应这些变量变化的行为。在原始数据集中数据点之间有较大间隙的区域进行测试,以确保模型在这些区域保持稳定,如所示,创建最佳回归结构。
在此验证阶段,尝试回答与第一阶段相同的问题。模型在测量不确定度范围内准确吗?有比其他地方更准确的地方吗?如果在测量不确定度范围内不准确,可以改进模型吗?和以前一样,任何可以改进的问题都应该改进,任何不能改进的问题都应该记录下来。
证明文件
模型验证过程的最后一步是发布发现,同时认识到这比简单的“有效”或“无效”声明更复杂。没有一个模型在所有方面都有效,或者在所有方面都无效。简单地宣布一个模型无效并不代表即使是有限的模型也能提供的价值。宣布一个模型是“有效的”给人的印象是它准确地预测了一切,没有弱点。
这个问题的解决方案很简单:不要宣称模型是有效的,而是公布模型的优点和缺点。这为用户提供了对模型适当使用的更准确的理解,允许他们决定何时应该使用模型,何时不应该使用模型。它还提供了支持未来改进模型的文档。
作为一个例子,这些文章使用了发展回归预测热交换器的稳态效率的例子。该模型设计用于预测流速在 0.5 至 7.5 加仑/分钟之间时的稳态效率。只要装置两侧的流速相同,它就非常精确。这些模型没有解决超出该范围的流速,或者设备两侧流速不同的情况。此外,它是专为稳态有效性而设计的,不应用于瞬态模拟中的预测。
结论
这一系列的四篇文章已经向您介绍了编写自动分析科学数据集的程序所必需的所有概念。您已经了解了以下主题:
- 自动化数据分析的一些可能的好处,
- 自动化数据分析的程序结构,
- 如何构建数据集以实现自动化,
- 如何识别每个数据测试的条件,
- 如何拆分数据文件,
- 如何编写一个遍历每个数据文件的 for 循环,
- 如何分析每个文件中的数据,
- 如何检查每个文件中的数据是否有错误,
- 如何存储每个文件中的数据,以便随时用于生成回归,以及
- 如何从数据集生成、验证和记录最终回归。
希望这些文章已经帮助你发展了新的技能,也希望你可以用它们在你的职业生涯中找到更多的轻松和满足感。
使用开源软件自动分析调查数据
第一部分:数据处理流程
你已经向电话里友好的声音承认,你要投票给怪物疯狂党;在那个弹出的在线测试中,你点击了百事可乐而不是可口可乐;你说你会在后续的客户满意度调查中高度推荐这家汽车经销商(但后来没有)。当全世界的人都向政治、医学、品牌、人力资源等领域的研究者表达自己的感受和看法时;数据最终在哪里?它是如何分析的?
市场研究仍在等待开源革命
在主流数据科学中,开源软件主宰着世界:如果你是认真的,你很可能,至少是部分地,在使用 Python 或 r。网飞的数据科学家在 Jupyter 笔记本上的指尖就能拿到公司的数据。AirBnb 开源了他们建立的工作流程自动化软件,以帮助他们在登记后立即自动估算上市房屋的终身价值。
让数据科学从业者如此强大的过多工具在很大程度上仍然不存在。市场研究人员依赖 SPSS、Merlin 和 Quantum 等专有软件,有可能成为数据世界的勒德分子。
Jupyter 笔记本

A Jupyter Notebook showing the results of an opinion poll in both table and chart form using the open source Quantipy library.
本文是一系列文章中的第一篇,展示了开源软件如何使用 Jupyter 笔记本和各种其他开源库等工具,大规模提高分析调查研究数据的生产率、质量和安全性。
Jupyter Notebooks(以下简称笔记本)是一个始于 2014 年的项目,旨在为科学研究、可复制的工作流、数据叙述和分析创建一套一致的开源工具。这是一个易于使用的基于网络的平台,而且碰巧这项技术也非常适合调查数据。
我们的目标是鼓励行业抓住集体的木屐,拥抱即将到来的数据革命。
自动化数据处理工作流程
我们假定我们已经收集了数据。在这些文章中,数据处理包括清理、重新编码、合并和加权数据等任务。使用笔记本,我们可以将这些任务安排到生产线或工作流程中。许多繁重的工作是自动化的,但是过程是可适应的:当工作流程的任何部分发生变化时,只需点击一个按钮,就可以很容易地按照定义的顺序运行所有其他部分。
我们将使用开源库 Quantipy(python 3 端口在这里),并从将数据读入 Quantipy 数据集开始(该数据之前是从 UNICOM mdd/ddf 文件转换而来的,但在后面的帖子中会详细介绍)。
import quantipy as qp
dataset = qp.DataSet("opinion poll")
dataset.read_quantipy(
path_meta="../data/interim/{}.json".format(filename),
path_data="../data/interim/{}.csv".format(filename)
)
我们将创建三个不同的笔记本,每个笔记本执行三个任务中的一个;清理、重新编码和加权,以创建流水线。在管道运行之前,数据被转换(用一个笔记本),以便该过程总是从原始数据开始。在以后的管道中,我们将能够用一个直接从数据库读取的笔记本来替换数据转换笔记本。这将使我们能够为客户提供实时更新。

The data processing workflow is run across multiple Jupyter Notebooks. This will allow us to run the entire workflow with the papermill library when anything changes and share specific parts of the process with other projects.
在后面的文章中,我们将介绍上述文件的自动创建,但是现在,我们将手动创建它们。
现在我们有了数据集(在 Quantipy 中,我们有两个数据结构。元数据:用于描述数据,数据:用于实际记录),我们可以编写组成管道的笔记本。我们从一个简单的 clean 命令开始
#file: 1_clean.ipynbdataset = dataset.filter('completed', {'SurveyCompletionStatus':6})
在这种情况下,清理是简单的,但在这里,用户可以,例如,使用机器学习来过滤掉欺诈性的答案。
接下来,我们记录数据。我们希望根据英格兰、苏格兰、北爱尔兰和威尔士对这些地区进行加权,但正如元数据所示,目前有太多地区无法应用该加权方案。

因此,我们希望通过将英格兰答案分组,但保留其他答案,来导出一个新变量。
#file 2_recode.ipynb# mapper arguments are: new code, new label, {variable: old codes}
mapper = [ (1, 'England', {'Regions': frange('3-5, 7-12')}),
(2, 'Scotland',{'Regions': [2]}),
(3, 'Wales', {'Regions': [6]}),
(4, 'Northern Ireland', {'Regions': [1]}),
(5, 'Other', {'Regions': [0]})
]# arguments: variable name, type (single response), label, mapper
dataset.derive('Regions_recoded',
'single', dataset.text('Regions'), mapper)

我们还将根据年龄对数据集进行加权,因此我们可以正确地表示不同年龄组的投票意向。记录单个响应变量(如 region)不同于记录一个数字。为了记录年龄变量,我们使用数据集的 band 命令。
# 2_recode.iypnbage_bands= [{"Younger than 18": (0, 17)},
(18, 24),
(25, 34),
(35, 44),
(45, 54),
(55, 64),
{"65+":(65, 200)}
]
dataset.band(name='Age', bands=age_bands,
new_name='Age_recoded', label="Age groups")
我们现在准备应用权重。我们有一个加权方案,以确保我们的结果代表正确的性别、年龄和地区分布。
# 3_weight.ipynb
#
age_and_gender_targets = {
'Gender': {
1:49,
2:51
},
'age_recoded': {
1: 21.3,
2: 9.4,
3: 13.4,
4: 14,
5: 13.7,
6: 11.7,
7: 16.5
},
'Regions_recoded': {
1: 84.2,
2: 8.2,
3: 4.7,
4: 2.8,
5: 0.1
}
}
scheme = qp.Rim('gender, age, region')
scheme.set_targets(targets=age_and_gender_targets)

权重报告向我们展示了权重是合理的(有人在获取代表性样本方面做得很好),任何响应的最大增加权重是 10%(最大权重因子)。
最后,将我们的管道存储在一个名为data_processing的目录中(关于我们的文件夹结构将在以后的文章中详细介绍),这意味着无论何时发生变化,我们都可以按顺序运行它们,以使我们的数据跟上速度。我们为用户提供了一个笔记本,它调用一个运行所有数据处理笔记本的脚本,如下所示。

The run_data_processing script is a for loop that takes all notebooks in the data_processing directory and runs them with the python library papermill.
许多组织有复杂得多的重新编码和加权方案,开源软件可以处理所有这些——为了简洁起见,我们在这里保持简单。
在即将发布的帖子中,我们将介绍上述内容如何成为标准的“cookie cutter”文件夹结构的一部分,PowerPoint 文件、表格和在线仪表板的自动生成如何集成到上述过程中,以及如何将图形用户界面添加到该过程中,以使需要快速访问结果但没有时间编写代码的用户可以访问该过程。
盖尔·弗雷松是 Datasmoothie 的联合创始人,这是一个专门从事调查数据分析和可视化的平台。
通过机器学习实现流量分析自动化
总结
数据科学和机器学习为改善公共空间提供了新的机遇。将这些技术用于智能城市可以使我们的社区更宜居、更可持续,并有利于当地经济。他们可以帮助理解城市规划和城市设计中的关键问题,如公共空间如何使用,有多少用户,用户是谁。
在本帖中,我们将查看一个概念验证系统,我们实现该系统是为了使用机器学习进行视频分析来回答这些问题。这是一种易于部署且经济高效的方法。我们将特别关注十字路口,那里的设计会影响交通拥堵、当地商业和行人安全。我们自身的经历、零事故目标(消除道路上的严重事故)和智慧城市计划推动了我们的工作。
要了解更多关于我们的技术,请给我们发一条消息。
“规划闹市区最好的方法,就是看看今天人们是怎么使用它的;寻找它的优势,并加以利用和加强。”—简·雅各布斯
简介

Automated traffic detection and tracking, showing bounding boxes of tracked objects and lane counter on West Cordova at Abbot Street in Vancouver.
城市规划者的任务是建设实用、宜居和支持经济增长的城市。此外,他们还必须考虑环境影响、未来增长和不同用户群的需求。我们能否利用数据科学和机器学习,通过增加他们做出决策所需的信息来支持他们完成这些任务?我们开发了一个基于自动视频分析的原型系统,该系统可以提供关于如何改善公共空间的关键信息。在本帖中,我们将特别关注交通路口,因为不列颠哥伦比亚省正在追求零视力的目标,即没有交通事故造成的死亡或严重伤害。
温哥华最糟糕的十字路口有哪些?根据 2013 年至 2017 年的工商银行数据,在主要街道和终端十字路口发生了 692 起交通事故,其中 256 起导致了伤亡。对于行人来说,东黑斯廷斯和主街以 35 起事故高居榜首。在城市的另一边,伯拉德街&太平洋区是对骑车人最危险的地方,发生了 34 起撞车事故。这些事故对相关人员及其家人来说是一场悲剧,通过增加城市和工行的成本来影响我们所有人。如果某个地方经常发生事故,那么对街道设计的干预可以拯救生命。
视频分析可以支持在危险路口的敏捷干预。它可以帮助识别哪些行为会导致事故,以及交通模式是如何形成的。城市可以利用这些知识来实施适当的设计变更。之后,视频可以用来了解任何变化的影响。一项干预措施的成功是可以衡量的,而不必等待数年才能看到统计数据是否有所改善。这意味着,如果设计干预没有产生预期的影响,市政当局可以快速迭代。它还允许特定于位置的知识。骑自行车的人在伯拉德街和太平洋街需要的干预与在主街和东黑斯廷斯街需要的干预不同。

Traces of one minute of traffic at the Homer Street and West Georgia intersection in Vancouver.
拍摄十字路口的视频成本低、设置快且易于处理。它不需要永久的基础设施,只需要访问合适的视点。这意味着摄像机可以快速安装,并且可以临时安装一段时间。我们使用的视频质量可以被当前一代的移动设备复制。视频分析可以有效地取代或补充当前的方法,如气动管、感应线圈和手动计数。视频分析的优势包括能够区分不同车道的交通、检测交叉路口转弯模式以及监控未遂事件等。此外,它可以独特地提供可靠的行人计数和运动模式,量化诸如行走速度、粘性、行人密度等信息。
流量分析
让我们来看看如何将机器学习应用于街道交叉口的视频,以及我们可以提取出来支持市政当局的数据。我们已经构建了一个概念验证系统,结合了深度学习(神经网络)和对象跟踪算法,可以自动处理视频。
我们将应用我们的系统来分析温哥华市区两个十字路口的视频。第一个是霍默街和西乔治亚,第二个是阿博特街和西科尔多瓦。这些位置提供了不同的街道景观和不同的交通流量。从西乔治亚的 Homer Street 的视频中,我们可以看到该系统可以处理大量的流量。在对西科尔多瓦十字路口的分析中,我们还将看到如何自动发现意外的人行横道。在对我们的代码库和系统进行初始设置后,分析进一步的交集是一项简单的任务。
Traffic Analysis at the Homer Street and West Georgia intersection in downtown Vancouver shown at 2x normal speed. The Traffic Information panel displays a count of the different types of traffic. The colours in the panel correspond to the bounding boxes in the video. The Plan View panel shows a top-down view of traffic at the intersection. A larger view of the Plan View panel is shown in the next video.
我们的仪表板上覆盖了我们计算机视觉算法的结果。已经被识别的交通流中的对象具有边界框,并且在场景中被分配了唯一的标识符。边界框的颜色与交通信息面板中的条目相对应。在那里,我们显示不同类型用户的数量。在这个场景中,我们计算交通的种类:行人、骑自行车的人、汽车、卡车和公共汽车。左下角是我们从视频数据中推断出的交通平面图(自上而下)。顶部的标题显示了视频的位置和时间。
Plan View of traffic at the Homer Street and West Georgia intersection in downtown Vancouver played at 2x normal speed. The Traffic Information panel displays a count of the different types of traffic, with colours corresponding to those in the Plan View Panel.
使用算法计数的一个优点是它可以很好地适应流量。我们的系统在视频中记录了 50 多辆汽车和 100 多名行人。即使是在一个短视频剪辑中,手动计算这一流量也是一项挑战和时间密集型任务。我们不仅统计了用户的数量,还统计了他们通过十字路口的路径。第二张图片显示了部分视频的交通轨迹。我们可以比较通过十字路口和转弯的车辆数量。我们还可以注意到一些行人开始在人行横道线外过马路。
我们的系统将交通流重新投影到自上而下的视图中。虽然我们目前对此操作采取简单的方法,但是更健壮的系统将实现几个特征。这些包括测量车辆的速度,以及不同用户之间的距离。这将允许我们量化未遂事件,例如当一辆行驶中的汽车与骑自行车的人或行人相距一定距离时。目前,我们有发生事故的数据,但没有可能导致用户选择不同路线或改变交通方式的千钧一发事件的数据。
Traffic going East on West Cordova at Abbot Street in downtown Vancouver.
自动化分析使我们能够识别和量化感兴趣的事件。我们在 Abbot 街的 West Cordova 的视频中定义了两个计数器,以确定每条车道上有多少辆车。如果该市想要取消街头停车,安装专用自行车道,或者考虑引入公交优先车道的影响,这些信息将非常有用。此外,我们可以将交通灯的时间整合到我们的视频中。我们这样做是为了在行人意外横穿马路时发出警报。我们可以调查这种情况是否经常发生,以及行人是否没有得到足够的机会在预定时间过马路。
由于我们的系统是一个概念验证,我们的功能可以改进,并开发新的功能。在交通识别方面存在失误——自行车可能会被误归类为人,汽车、卡车和公共汽车的标签有时会被混淆。我们还看到,当有一大群行人时,系统很难区分人们并跟踪他们,因为他们在人群中变得模糊。可以实现更严格的算法来处理这些情况。我们的概念验证依赖于单个摄像头。我们可以进一步扩展我们的系统,在多个视点加入相机,添加红外相机,并使用双镜头系统进行深度感知。
我们还能在哪里应用这项技术?温哥华市最近花了 500 万美元翻新罗布森广场。空间被充分利用了吗?我们可以使用自动视频分析来研究一天中空间的使用情况。这包括量化人们使用这个空间旅行、聚会和娱乐的模式。著名城市学家威廉·h·威特在七十年代研究公共空间时使用的延时相机的现代升级版。同样,格兰维尔岛也在发生重大变化。这将影响行人的活动,以及行人/自行车/汽车的相互作用。可靠的交通信息让我们能够最大限度地提高空间投资和收益。
结论
利用机器学习,我们已经建立了一个概念验证系统,可以从视频数据中自动提供交通信息。我们已经将它应用于两个十字路口,表明它可以跟踪否则禁止手动计数的交通量,并且可以捕捉像意外行人穿越这样的事件。市政当局可以利用这些信息来改进不安全十字路口的设计,并测试干预措施的有效性,从而挽救生命和节省资金。这一简单高效的系统可以为实现零事故目标做出积极贡献,消除道路上的严重事故。
您是对这项技术感兴趣的组织吗?联系我们了解更多信息。
最初发表于T5【https://inletlabs.com】。
用 Python 实现病毒式文本到语音转换 YouTube 内容的自动化

turning a reddit thread into a video 😃
最近有一种特定风格的 YouTube 视频涌入,其中使用文本到语音转换来读出 Reddit 上的帖子,并以某种幻灯片的形式显示评论的截图。不管这些视频有多原始,都无关紧要,因为它们已经有了成千上万的浏览量。

look at the views on these tts videos!
我很确定这些视频大部分是手动编辑的,因为它们的裁剪和截图对齐不一致。当然有可能从 Reddit 线程 URL 自动生成这些视频吗?
答案是肯定的!
下面是一个视频示例,大约在 2 分钟 内完全自动生成
这是在大约 250 行代码中使用多种技术实现的。行数通常不是什么值得夸耀的东西,但对我来说,这展示了 Python 编程及其充满活力的活跃社区的力量。
我的方法
首先,我们应该把问题分解成一堆更小的问题。
- 拍摄 Reddit 帖子的“截图”
- 宣读帖子的内容
- 将截图+语音+背景音乐排序在一起
- 上传到 YouTube!(带缩略图和音乐)
问题一:截图

我们不仅要为帖子创建一个截图,还要在帖子被读出时创建一个不同的图像。这使视频更有“讲故事”的感觉,并有助于观众跟随文本到语音的转换。
这个问题通过使用 PRAW 从 Reddit 获取帖子,并使用 wkhtmltoimage 呈现模板得到了解决。我创建了自己的 HTML 模板,看起来有点像 Reddit 帖子,其中填充了帖子的详细信息(包括点数、奖项和用户名),然后进行渲染。
这些评论被标点符号分开,给人一种“被读出”的感觉,并帮助它与文本到语音同步。
问题 2:文本到语音

source: giphy
我使用谷歌云的语音 API 免费层来驱动 TTS。采用了新的 Wavenet 语音,它使用深度学习来产生更真实的音调和重音。每个部分(由标点符号分隔)都被读出并保存到一个 mp3 文件中,确保我们审查帖子中的不良词语,并用家庭友好的替代词替换它们:)。
问题 3:排序
我发现了一个惊人的 Python 库,可以编程地创建视频内容: MoviePy 。这是一个真正令人敬畏的库,它将 ffmpeg 包装成一个高级 API,用于排序、过滤器、音频和视觉特效等等。对于每个评论图片,我添加了相关的文本到语音转换 API 和一些我在 YouTube 上找到的免版税的 lofi 音乐。
背景音乐是从一个免版税的频道下载的,曲目下载后会随机播放。
问题 4: YouTube 和缩略图
每一个好的视频都应该有一个漂亮的缩略图,在尽可能短的时间内将观众吸引到所述视频的内容。我使用 Canva 和 Pillow 一起将视频的标题渲染到图像上。2000 个最常用英语单词中的 而非 的单词以灰绿色突出显示,以强调标题中最重要的单词。

the template before and after rendering

An example YouTube description.
生成的. mp4 和缩略图然后通过 YouTube API 上传。创建了一个简单的描述,对视频中包含的帖子的 Reddit 用户进行表扬。
总之,这是一个复杂但令人满意的项目,它集成了许多很酷的 Python 库。从 Reddit 网址到完全上传 YouTube 视频大约需要 5 分钟。我打算将来在脸书和 Instagram 上自动发布帖子。
订阅我的时事通讯,以便在我下次写作时得到通知:)
数据科学中的自动化
为什么我工作中技术含量最高的部分一直变得越来越容易,而最难的部分与 AI 完全无关。

A database enters an automated Data Science Factory. Actionable Insights are extracted and produced at the other end of the assembly line (not shown).
在我作为数据科学家的工作中,我注意到许多过去很难的任务因为自动化而变得越来越容易。
例如,AutoML 承诺将整个建模过程自动化。
虽然这很神奇,但数据科学家的工作不仅仅是实现机器学习模型。
事实证明,数据科学中听起来最性感的方面将首先被自动化,而最难自动化的方面是你最意想不到的。
概观
当你谈论数据科学时,大多数人关注的是人工智能和机器学习。但是数据科学家实际上把他们大部分时间花在非常不同的工作上。
本文将尝试列出一名优秀的数据科学家应该能够完成的所有类型的工作。对于它们中的每一个,我将研究它的自动化程度。在适当的地方,我会列出一些有助于自动化的工具。
如果你认为有一个(非商业)产品可以很好地自动化一些东西,或者如果你认为我错过了数据科学工作的一个重要方面,那么只要给我发消息,我就会把它包括在列表中。
1.与客户交谈
自动化状态:不可能
数据科学家工作的第一步,也可以说是最重要的一步是与客户交谈。
这不仅仅意味着“问客户问题是什么”。业务人员和数据科学家之间的理解存在巨大的鸿沟。
客户一般不知道数据科学家能做什么,数据科学家一般也不知道客户想要什么。
能够弥合这种理解上的差距是极其重要的。
许多公司实际上雇用经理来充当数据科学家和客户之间的中间人。这比让一个纯粹的技术数据科学家试图找出客户的需求要好。但是,了解客户业务环境的数据科学家更好,因为这省去了中间人,降低了重要信息在翻译过程中丢失的风险。
与客户交谈不会提高机器学习模型的性能(就像这样,本文大约一半的技术读者已经失去了兴趣)。相反,理解客户的痛点可以确保您首先构建正确的模型。如果客户不能真正利用这个模型来推动自己的利润,那么世界上最准确、表现最好的模型也是无用的。
与客户进行一个小时的讨论可以完全重新定义项目,并将项目的货币价值增加十倍。
我永远不会忘记当我告诉我的一个客户,我可以很容易地扩展我的模型,将数据分成十几个不同的类别,分析所有的类别,然后只报告有异常的类别时,他脸上的表情。事实证明,这位客户多年来一直手动执行这项任务,这耗费了他大量的时间。他没有要求我们自动化这一点,因为他根本不知道这是可能的,直到我提出来。如果没有那次讨论,我们会在利润较低的任务上浪费几个月的时间。
在很大程度上,与客户交谈可以确保你建立了正确的模型,这对于确保项目最终盈利是至关重要的。
在较小的范围内,与客户交谈也有一些同样重要的直接好处。例如,选择最有用的指标来训练您的模型。许多数据科学家根本不考虑这一点,只是简单地使用准确性,或 L2 损失,或他们在大学里被教导使用的任何东西。与客户进行五分钟的讨论可能会显示他们的利润实际上只来自前 5 名的结果,或者类似的东西。如果你不通过改变你使用的度量标准来解决这个问题,你就在错误的方向上优化了你的模型。
现在是可怕的消息:
几乎所有这些都不能有效地自动化。
和人说话的是 AI-complete 。如果有人真的能弄清楚如何实现这项任务的自动化,那么机器人的反叛将会在几天后到来。
换句话说:
数据科学家工作中技术性最低的部分是最难自动化的。
事实上,这是一个技术进步实际上可能让事情变得更难的领域:在家工作,只通过短信沟通,这真的不太可能让你发现客户真正想要的是什么。
我所见过的帮助解决这个问题的最有用的东西不是一个程序,也不是一个公司政策,而只是一台放在办公室中心位置的咖啡机。客户和数据科学家偶尔会在一起喝杯咖啡,这比我们做的任何事情都更能达成目标一致。
2.数据准备和数据清理
自动化状态:部分自动化。太主观,太多边缘情况,无法完全自动化。
数据科学家大约 80%的时间花在数据准备和清理上。
这包括:
- 获取数据。
- 将数据放入正确的格式中。
- 连接数据。
- 识别和修复数据中的错误和/或异常。
所有这些都非常耗时,而且非常无聊。
这能自动化到什么程度?
看情况。
这其中的一些部分根本不能自动化,因为它们依赖于客户端的交互。有时,清理有错误数据的表需要打电话给数据所有者并要求澄清。
但是大部分的 T2 可以自动化。
数据准备和清理中的大多数任务都可以通过对数据应用少量简单的启发式方法来解决,直到所有问题都得到解决。
启发式示例有:
- 如果一个表有日期,那么检查它们的分布是否受到周末、假日或其他可能相关的常规事件的显著影响。
- 如果一个表有手工输入的分类列,那么检查它们是否包含任何输入错误并纠正它们。
- 如果一列是数值型的,检查它是否有超出合理范围的值。
这些试探法往往非常简单,但问题是有成千上万的试探法,而且大多数都非常主观。
据我所知,不存在应该检查的所有试探法的现有综合列表,也不存在建议如何以有用的方式参数化主观试探法的综合方法。
数据科学家不是要有一个清单来完成工作,而是要观察情况,根据经验和直觉,想出最相关的启发式方法来自己测试。
更糟糕的是,数据中的一些工件是特定于客户端的。例如,数据库中的一个项目可能在一年前被重新分类,但是较旧的条目仍然使用旧的分类系统。只有了解了业务背景,并和客户谈过,你才能认识到这个问题。这不能完全自动化。在这种情况下,您能做的最好的事情就是自动指出数据中的异常,以节省数据科学家运行初始测试的时间。
总结一下:
- 原则上自动化数据准备和数据清理是可能的。许多简单的事情已经被流行的图书馆自动化了,或者至少变得非常容易。
- 有数以千计的边缘情况,你不能用一个单一的自动化系统有效地覆盖。
- 有些任务不能有效地自动化,因为它们依赖于与客户的交互。
- 尽管如此,这里仍有唾手可得的果实。我希望在未来的几年里,我们会看到这方面的进展。
自动化数据清理的工具
有很多很多小工具和库可以用来清理你的数据。它们中的每一个通常只为你节省一点点时间,但它确实会累积起来。你可以通过谷歌搜索找到最常见的数据清理工具。
您还可以找到许多数据清理程序的列表,这可以让您很好地了解哪些类型的清理任务已经解决。查看列表这里,这里这里,这里这里,这里这里。
使用这样的工具时要小心。如果您只是天真地运行自动清理工具并依赖默认设置,很容易意外损坏您的数据。在一个数据集中需要清理的错误在另一个数据集中可能是故意的选择。
还有 elody.com 的。它还处于初级阶段,但一旦发展起来,它应该对数据清理非常有用。参见此处的交互示例。(注:Elody 是我自己的网站。我专门构建它来帮助自动化数据科学。它还不是非常强大,但有望随着时间的推移变得越来越大。网站免费使用。)
3.数据探索和特征工程
自动化现状:部分自动化,前景看好
在准备和清理完数据之后,终于到了开始研究数据科学的有趣部分的时候了。
数据探索和特征工程都是关于在显微镜下检查数据并从中提取洞察力。
这个阶段有两个方面:
- 数据探索是关于理解数据。
- 特征工程是关于理解问题,并将数据与问题联系起来。
数据探索可以很好地自动化。仅仅少量的基本可视化就足以快速获得大多数类型数据的概览。有许多工具可以帮助我们做到这一点。
然而,这仍然需要数据科学家花时间查看图形。就像数据准备一样,您应该寻找一千种不同的异常。
还没有一个系统试图总结它们。虽然我们可以自动创建图形,使数据探索更容易,但实际的探索本身仍然需要由数据科学家来完成。
请注意,您在数据探索过程中的一些发现可能需要您与客户交谈以获得澄清,甚至可能迫使您返回到数据准备和清理阶段。例如,您可能会注意到数据分布在特定日期突然发生变化。当你向客户询问此事时,他们解释说这是因为他们改变了当天生成数据的方式,并且忘记告诉你了。突然之间,你不得不回过头来调整你的所有数据,以考虑到这一点。
像这样的情况不能自动处理,但是自动化系统仍然可以帮助您更快地识别这些异常。
最后,您在数据探索期间收集的所有见解需要与您对任务的理解相结合,以执行有效的特征工程。
令人惊讶的是,由于两个简单的观察结果,很多事情实际上是可以自动化的:
- 大多数(如果不是全部)通常在特征工程中创建的特征只是将基本功能应用于现有特征的结果。
- 可以测量某个特性的有用程度,并丢弃那些被证明无用的特性,这使得数据足够小,可以处理。
因此,几乎完全自动化特征工程实际上是可能的。
总之,理论上是这样的。
我还没有听说过自动化特征工程胜过专家手工特征工程的例子。看起来,至少在目前,专家知识仍然胜过这些自动算法。
(如果你正在阅读这篇文章,并且知道一个自动化特征工程成功击败专家的例子,请告诉我。)
尽管有目前的缺点,我期望自动化特征工程很快会变得有竞争力。
请注意,自动化特征工程意味着数据探索的一半原因已经消失,但无论如何,数据探索仍然很重要:
数据探索对于其他任务仍然有用,比如发现数据中的异常。找到这些有时非常有价值。
一个异常点十有八九是无关紧要的。第九次,这将意味着你的整个数据集是有缺陷的,你通过及早意识到它躲过了一劫。第十次,它将引发一个惊人的新见解,启动一个完整的衍生用例来解决一个完全不同的问题,并赚到原来项目五倍的钱。
自动化数据探索和特征工程的工具
对于数据探索,如果您使用 python,使用 numpy 和 pandas 进行分析,使用 matplotlib、seaborn 和/或 plotly 进行可视化。
这些软件包可以让你轻松地过滤、分组和可视化任何你想要的东西。唯一的问题是,你仍然需要手动写你想要的。
使用镜头自动完成你应该经常做的所有基本探索,从而为你节省更多的时间。
请注意,这不会自动完成所有工作。仍然有很多常见的情况需要记住自己检查,因为它们不容易从默认的可视化中读取。比如:日期受工作日、节假日等影响吗?如果你有地点日期,地点在哪个国家或城市?如果有多个表,它们是如何连接的?
对于特征工程,使用 featuretools 自动生成新特征。
请注意,使用功能工具时应该小心。这对于从数据中生成大量要素非常有用,但它仍有缺陷:
- 它显然没有从语义上理解数据,因此无法创建对人类来说显而易见的功能,但需要不同寻常的功能组合才能通过算法产生。例如,它可以很容易地从原始数据中生成“客户总共看了多少部电影”这样的特征,但是像“客户在电影发行的第一周内看了多长时间”这样复杂的特征就很难生成了。您可以告诉 featuretools 更深入并创建更多的功能,但这样您就会遇到第二个问题:
- Featuretools 可以轻松创建大量的要素。这可能会导致过度拟合,因此您应该调查经过训练的模型,并检查它是否有意义。您可以使用 shap 来简化这一过程。
我自己的前述项目elody.com一旦成熟,也将能够处理数据探索和特征工程。
附录 2019–10–25:我最近了解到 getML 库,它解决了 featuretools 的一些缺点。
- 与 featuretools 不同,它不使用暴力方法。相反,它将特征工程的过程理解为另一种形式的机器学习。因此,它不会只是创建大量的要素,然后进行要素选择。相反,将使用有点类似于随机森林或梯度增强的机器学习算法来生成这些特征。
- 它拥有高效迭代阈值的算法,因此对于前面提到的“在电影发行的前 X 周内,客户观看电影的频率”这样的特性特别有用。
- 该工具不是开源的,但是有一个免费版本。更多信息,请参见此处。
4.系统模型化
自动化现状:全自动化,与专家数据科学家竞争
建模是数据科学家工作的核心部分。
在这里,我们将所有宝贵的数据转化为结果,然后我们的客户将这些结果转化为利润。
这是数据科学家在大学里花最多时间学习的部分,因此自然这也是数据科学中第一个完全自动化的部分。
建模是一个极其困难的过程,有许多不同的参数。然而,这也是一个非常严格的过程,所有参数都有数学上的明确定义,并且与现实世界的模糊性无关。这使得自动化建模比数据科学的任何其他方面都更有效。
建模可以进一步分解成不同的子任务。
- 模型构建
- 模型验证
- 超参数优化
(你也可以把特征工程算作建模的一部分。有些人这样做,但我选择把它作为一个独立的部分,因为特征工程仍然有一些非数学的方面,需要理解业务环境,而建模纯粹是一个数学问题。)
自动化这些子任务的特定部分的库已经存在很多年了,但是仍然需要专业知识来正确地使用它们。
现在,有一些库可以自动化整个建模过程。这些库只是按原样获取您的数据,并一次性从中构建一个完整的模型,不需要任何人工交互。
2019 年 5 月,谷歌的 AutoML 在一场 KaggleDays 黑客马拉松中获得第二名。根据卡格尔的等级系统,许多参赛者都达到了大师或特级大师的水平。
一个完全自动化的系统击败了几个人类专家,这些专家聚集在一场比赛中,专门证明他们的技能。如果这个系统能够赢得这样的比赛,那么与不参加比赛的普通数据科学家相比,它的表现能好多少?
诚然,这个系统还不完善。比赛只持续了 8.5 个小时。这对一个自动化系统的运行来说已经足够了,但对人类竞争者来说,这还不足以启动。如果竞争持续更长时间,AutoML 也不太可能有同样的表现。
但是自动化模型构建工具每天都在改进。他们不断赢得足球比赛只是时间问题。
我完全期待数据科学家在 10 年内不再需要建立他们自己的模型。
自动化模型构建的工具
建模过程的自动化部分
这篇文章列出了自动化建模过程不同部分的工具。
即使你不想自动化你的整个建模过程,我也强烈推荐看看这些工具。他们可以节省你很多时间。
请注意,本文将特征工程视为建模的一部分,因此它还列出了一些可以简化特征工程的库。
自动化整个建模过程
运行 AutoML 要花钱。
开源社区已经创建了 Auto-Keras 来取代它。
Auto-Keras 和谷歌的 AutoML 都使用神经网络作为他们建立的模型的基础。
还有其他使用不同类型模型的自动化机器学习库:
本文对比了四个自动机器学习库 auto_ml 、 auto-sklearn 、 TPOT 和 H2O 的 AutoML 解决方案的性能。
结果:Auto-sklearn 在分类数据集上表现最好,TPOT 在回归数据集上表现最好。
但是,请注意,这篇文章是半年多前发表的,不包括 AutoML 或 Auto-Keras。所有这些库都在持续开发中。当你研究完哪一个是最好的,其中一半可能已经有了重大的更新。
5.客户演示和文档
自动化状态:不可能
一旦建模完成,我们有了结果,我们需要将这些结果呈现给我们的客户。这是一门独立的科学。
正如我之前提到的,数据科学家和他们的客户说着完全不同的语言。对一个人来说显而易见的东西,对另一个人来说可能是混乱的。
你需要把你花了几个月的时间处理的所有数据浓缩成一个单一的图形,让打字时需要看着键盘的人能够理解。这是一个不小的壮举。
让客户认同你的结果很容易,但如果你想让他们真正理解,你需要非常清楚,你的文档必须既简洁又全面。
这是一个小任务,但非常重要。
如果客户不明白应该如何使用它,那么即使是最好的项目也会变得毫无价值。没有什么比完美地解决一个问题更糟糕的了,只是看到它被扔掉,因为它的预期用户不明白如何使用它。
就像在项目开始时澄清需求所需要的最初的客户交互一样,这个任务是不可能自动化的。
6.部署到生产
自动化状态:取决于公司。可能完全自动化,也可能不可能。
一些数据科学项目只是关于构建原型。
其他项目要求我们将完成的项目转化为完全自动化的端到端解决方案,可以部署到生产中。
这是否可以自动化很大程度上不在数据科学家的掌握之中。
这几乎完全取决于客户使用的技术堆栈,以及他们设定的需求。
我有一个项目,我可以把我的项目包装在一个脚本中,它被接受用于生产。但是我也有一个项目,其中整个代码库需要重写,因为负责的经理想要使用另一种编程语言,并且没有提前告诉我们。
较小的公司可能会照原样接受您的代码,因为他们还没有针对生产部署的指导方针。
刚接触数据科学的大公司会让你费尽周折来部署你的代码。
与数据科学家合作得足够多的大公司将会建立一个系统(云、数据仓库、数据湖等)。).在这种情况下,该过程在很大程度上是自动化的。
摘要
总结一下:
- 与客户交谈和向客户解释结果是您最不愿意与数据科学联系在一起的两个工作方面,但它们也是最难自动化的方面。
- 数据准备和清理是部分自动化的,但很难完全自动化,因为有成千上万的特殊情况需要考虑。
- 数据探索和特征工程是部分自动化的,看起来特征工程将很快变得更加自动化。
- 模型建立已经完全自动化,并与专家竞争。
- 生产部署可以自动化,但这取决于客户。
结论
我们能从中学到什么?
如果你是一名数据科学家,你想确保你的技能在未来几十年仍然有需求,那么你应该而不是专注于机器学习方面(除非你实际上是该领域的研究人员)。
相反,你应该专注于学习如何理解业务,这样你才能更有效地与客户沟通。
一旦我们工作的技术方面实现了自动化,产生影响的最佳方式就是弥合技术和非技术之间的差距。
具有用户偏好管理的家用电器自动化

继我上一篇关于强化学习在作业调度中的应用的文章之后,我决定进一步寻找机会,寻找另一个未开发的领域,在那里自动化可以成为系统的一个重要和必要的部分。过去,许多研究人员提出了许多解决节能问题的方法,而另一方面,在微控制器、处理器甚至智能电表等物联网系统的帮助下,已经开展了独立的研究来将这些电器转换为智能设备,这些智能设备可以持续跟踪能源消耗,并为用户提供各种使用统计数据。但是,智能家居环境的每个用户都能够理解和解释这些信息并从中获益吗?

Example of an Home Energy Management System
在我们深入这个领域的技术方面之前,我认为我们有必要了解家庭能源管理系统(HEMS)到底是什么。我进一步请求您仔细阅读这篇文章,以获得更精确的解释。
正如您所理解的,HEMS 为用户提供了一个门户或界面,用户可以用它来控制和监视系统数据。这一点让我们思考这样一个问题:为什么人类有必要执行这些管理和监控设备使用数据的任务?从读取和分析使用数据到规划和采取适当的行动,并牢记用户偏好,怎样做才能取代人工干预来自动化整个端到端系统?
物联网在自动化这一过程的目标中发挥着非常重要的作用,其中需要满足两个目标-节能和用户偏好。用户对智能设备的监控可以帮助他或她实现防止全天任何形式的能量浪费的首要目标。然而另一方面,我相信强化学习可以使我们有可能提出一个解决方案来满足管理用户偏好的第二个目标。

Internet of Things can connect devices embedded in various systems to the internet. When devices/objects can represent themselves digitally, they can be controlled from anywhere. The connectivity then helps us capture more data from more places, ensuring more ways of increasing efficiency and improving safety and IoT security.
像环境保护基金、绿色和平组织和气候与能源解决方案中心这样的组织已经投入了大量的资金来制定尽可能有效利用能源的策略。这篇关于分析消耗能量的日常活动的文章的作者提出了一种分为三个部分的聚类方法。第一步是记录和维护用户在一天中的运动,然后显示每个活动进行了多长时间。最后,他们对一组用户的活动模式进行聚类,以分析他们之间的相似性和差异。另一篇有趣的研究文章谈到考虑电器制造商提供的信息,这些信息谈到这些设备可以工作的状态。然后,智能环境服务提供商开始发挥作用,在本文中,他们通常被作者称为 SESPs,他们执行手动评估设备状态的功能,以向用户推荐一组他们可以遵循的可行措施,从而降低他们的总能耗。这篇文章的作者首次提出了一种基于马尔可夫模型的智能方法,该方法考虑了一种奖励策略,并输出一种用户可以遵循的策略。这是一种强化学习方法,旨在找到问题的合理解决方案。然而,该过程仍然涉及通过人工干预进行一定程度的分析和监控,这不符合我们的主要目标。
其中一项研究考虑了用户的偏好以及节能的座右铭。考虑的变量是发光二极管(led)的最小和最大光强度、光强度的上升和下降周期以及无运动检测和光强度开始下降之间的周期。用户的存在和移动决定了一天中不同时间点的光强度。基于无线物联网的技术已被用于实施该系统,可通过简单的手机应用程序进行控制。

The authors present this middleware architecture in their research for the functioning of their proposed algorithm.
- 第一部分,即 LED 控制模块组,执行应用层上的功能,以控制系统中存在的所有 LED 的光强度。
- 第二部分由自适应中间件组组成,它可以根据系统管理员的命令对系统进行修改。
- 最后,第三部分是关于数据处理,以保持系统对 LED 控制的感知。
实验装置在一个 8 位微处理器上工作,该微处理器连接到各种传感器上,这些传感器主要分为运动检测传感器和光照明传感器,它们一起执行研究用户所处的外部环境的任务,从而为系统提供针对该环境中存在的 led 采取特定行动所需的必要参数。研究人员展示了三个案例——住宅和办公楼、仓库和停车场,解释了每一个案例中的用户满意度需求。
这项研究的唯一缺点也提供了一个非常可利用的研究机会,那就是提出一个考虑到两个重要因素的系统-
- 外部环境不仅需要在用户存在时考虑设置中存在的设备的使用,还需要在不管用户的物理存在与否都需要打开该设备时考虑。因此,这可以确保外部环境的动态行为适应。
- 该系统应该可以扩展到家庭中的其他设备,例如洗衣机、烘干机、加热管道等。因此,正如第一点所提到的,不管用户是否在现场,了解他们的使用模式都很重要。
研究人员早些时候也采用了其他方法,但几乎所有的方法都主要集中在节约能源的目标上。他们中很少有人提出了处理用户偏好的策略,但只有一定程度的人工干预。最后,我添加了一些我浏览过的出版物的链接,以理解这个特定问题陈述的上下文和细节。此外,我想请你给他们一个阅读和讨论的想法,可以带来和实施到动态的现实生活场景。
关于这篇文章的任何反馈或想法,以及研究出版物,都是最受欢迎的。如果有人愿意伸出手来分享他们对这一特定问题陈述的看法,我将不胜感激。
进一步阅读:
- https://pdfs . semantic scholar . org/98 F4/a1ee 457304 e 793 a1 b 178 B4 d 61 cf 7 e 5d 3 a 7 cc . pdf
- https://www . tandfonline . com/doi/full/10.1080/09613218 . 2017 . 1356164
- 【https://ieeexplore.ieee.org/document/5482712
- https://ieeexplore.ieee.org/document/5172913
- https://www . research gate . net/publication/260523361 _ Autonomous _ Appliance _ Scheduling _ for _ home _ Energy _ Management
自动化、风险和强大的人工智能
托马斯·迪特里希教授关于涉及人工智能的社会技术系统需要高可靠性的访谈。

Photo by Laurent Perren on Unsplash
人工智能(AI)融入我们日常生活的方式怎么说都不为过。强大的深度机器学习算法越来越多地预测我们想看什么电影,我们会回复哪些广告,我们有多大资格获得贷款,以及我们有多大可能犯罪或在工作中表现出色。人工智能也正在彻底改变工厂、发电厂和自动驾驶汽车等物理系统的自动化,部署步伐正在迅速加快。然而,最近由特斯拉、优步和波音制造的自动驾驶系统的致命故障凸显了在危险情况下依赖不透明和高度复杂的软件的相关风险。减轻此类系统带来的危险是一个被称为弹性工程的活跃研究领域,但人工智能的快速采用,加上其众所周知的算法透明度的缺乏,使得研究难以跟上步伐。
机器学习的先驱之一,Thomas Dietterich 教授在过去几年里一直在研究如何让人工智能变得更强大,特别是当它嵌入到一个复杂的社会技术系统中时,在这个系统中,人和软件的错误可能会传播到未经测试的政权中。保罗·沙尔(Paul Scharre)的新书《一个没有人的军队》(An Army of None)启发迪特里希教授深入研究高可靠性组织的文献,寻找潜在的解决方案。*它让我明白,仅仅让技术可靠是不够的,你还需要让围绕它的整个人类组织变得可靠;理解这意味着什么已经占用了我很多时间。【Dietterich 教授抽出一些时间与我讨论了他对人工智能伦理、人工智能安全的看法,以及他最近的文章 健壮的人工智能和健壮的人类组织 。*
伦理人工智能社区通常分为两组,一方是专注于公平或算法透明度的具体概念的工程师,另一方是对整个社会的伦理影响更感兴趣的社会科学家。你最近的文章似乎介于这两类人之间。
总的来说,人工智能社区已经意识到社会科学的重要性。我真的追溯到社交媒体出现的时候,人们意识到社会科学家可以用它来研究关于人的事情。然而,他们需要计算机科学家的帮助来处理来自社交媒体的大量数据,所以我们开始看到计算社会科学的兴起。那是最初的开场。
然后,人们开始思考社交网络中的影响力和思想传播问题,并出于广告目的最大化社交网络中的影响力,再次导致与社会科学家和经济学家的更多接触。然后,人们意识到,通过这些系统的工作方式,可能存在对不同亚群体造成伤害的偏见。我刚从 AIES 会议回来,那里举行了他们的第二次会议,几乎同时还有 FAT*会议,我认为这个领域的大部分人都意识到我们需要考虑更广泛的社会技术系统,而不仅仅是技术部分。它体现在所有这些不同的方面,我追求一个特定的方面,因为我关心这些高风险,高风险的决定。我现在也参与了这个由 CCC(计算社区联盟)协调的人工智能研究 20 年路线图的团队。我们已经举办了三次研讨会,人们说我们可以做 X,Y 和 Z,比如让计算机跟踪会议中或建筑物中的人,并理解他们的情绪。20 年前,人们会说:“太酷了”。现在每个人都在说,“但这可能被滥用得如此严重”,所以我们真的对这些事情的所有负面影响都很敏感。现在我们意识到,我们希望在未来 20 年看到的如此多的技术进步可能会产生可怕的后果,也可能会产生真正好的后果,所以这非常令人清醒。
你认为需要监管来避免这些后果,还是公司可以有效地自我监管?
我不是法律、法规和行业实践方面的专家,但在我看来,我们似乎看到了技术使用不当和围绕技术的不适当的组织结构。我们先来关注一下面部识别。我不知道你是否一直在关注麻省理工学院的 Joy Buolamwini 的工作,但我认为她一直在做非常有趣的工作,审计这些(商业)人脸识别系统的质量。在技术方面,我们没有任何标准来规定一家公司应该对这些系统做出什么声明,以及他们应该如何做出声明。例如,我认为所有这些公司系统,如果他们要销售这些产品,需要为他们所做的产出陈述给出精确的概率。看起来这些系统中的一些并没有给你一个置信度值,那些给你的也没有告诉你它意味着什么。如果当它说这两张照片有 90%的可能性是同一个人的照片时,那么它说的时间有 90%是正确的,那么这个概率将会被很好地校准。那将是某个特定人群的 90%。她的[Buolamwini 的]实验表明,有一些亚群的数量必须达到 60%左右,因为系统在某些亚群上表现不佳。
美国公民自由联盟做了一个类似的实验,但不清楚他们是如何设置他们的门槛的。正如我在论文中所描述的,你会想到,在想要抓住所有坏人的警务情况下,你必须将检测的灵敏度设置得非常高,并且你会得到大量的假警报。事实上,这就是我们在南威尔士治安数字上看到的,这与我在欺诈检测或网络安全方面的经验非常一致。这里你有一个类似的问题,主要的挑战是大量的假警报。我的观点是,即使你是这些工具的非常有知识的用户,而且似乎大多数警察部门都不具备这样的资格,即使你有机器学习的博士学位,也不清楚在实践中应该如何设置这些系统的阈值,以及应该如何应用它们的最佳实践是什么。
然后你必须对假警报造成的危害进行某种分析。这就是你需要审计人力组织和软件的地方。如果你是一个警察部门,你已经把它提高到 99%,并得到了大量的假警报,这不仅仅是多少人被拉进由于假警报。你可以想象,有人在这些系统上反复发出错误警报,所以这不是一个在人口中平均分布的随机税收。你被随机选中的时间的一部分,但它也可能总是发生在你身上!不知何故,您想审核这些组织,并问:您的误报率是多少,由此产生了哪些危害,您如何减少这些危害,什么是可接受的水平,谁在承担负担?
你提议的似乎是简单的黑盒式测试,可以在不侵犯供应商知识产权的情况下完成?
你需要说明这是通过什么样的图像数据库收集的。把它作为一个通用的应用程序来营销是不合适的,所以你真的需要为每个应用程序定制它。我非常怀疑目前正在市场上销售的这些东西在实践中是否真的能很好地实现它们的预期目的,因为它们不是在每个应用程序的基础上定制的。我不知道你是否需要监管,或者我们是否只需要教育市场。对我来说,供应商站在这个问题的前面,把它做好是明智的。
像谷歌这样的大型组织开始雇佣专业伦理学家来调查人工智能的潜在风险;对于没有大量资源来抵消风险的小型团队,您有什么建议吗?
我觉得我们现在还没有标准化的工具来支持这些。R&D 社区需要建立工具来支持这一点。
有些工具是存在的,比如 IBM 的“公平 360 ”,但一个更大的问题是是否有人在关注系统的含义,比如什么可能出错,它会影响谁。在这些领域,资源较少的小型团队可能很难获得这种更广泛的思考。
它需要成为我们标准方法的一部分。也许我们需要开发某种概念分析框架,人们可以通过它,比如一个清单,来思考他们正在营销的系统的更广泛的背景。例如,我们可以问一个简单的问题:“重复使用这个系统会发生什么?”。我们通常表述问题的方式是,我们关注它的单步使用。有一个 YouTube 视频推荐的例子,在机器学习中,我们将它表述为一个上下文多臂土匪问题。随着时间的推移,系统将逐步推荐越来越多的极端视频,所以你可以开始搜索清真菜,最后观看圣战招募视频!构建系统的人可能没有想到要查看迭代效果。所以这似乎是我们应该教每个人思考的事情。
在你的论文中,你提到了人工智能监控人类组织的可能性。AI 目前是否具备识别人类机构问题的能力?
这更多的是一个研究问题。我一直在努力调查现在谁在这个领域工作。我会说,现在,很少有能力来监控人类组织中团队的运作。在这种情况下,监控团队崩溃是很好的,但这很容易被管理层滥用,所以我不清楚具体如何做。一种情况是帮助团队训练,或者在有限的时间内。俄亥俄州立大学的大卫·伍兹致力于研究如何让团队更有弹性,他正在研究在极端条件下保持大型云计算服务器运行的开发人员。我认为我们需要在这一领域进行更多的研究,我主张国家科学基金会和国防部在更好地进行团队合作的研究上投入更多的资金。这是很自然的下一步。
我们是在谈论对人类团队合作的实时监控吗?
它目前更关注培训情况。然而,你可以看到我在担心自主武器系统方面的进展,这可能是我们可能为人工智能考虑的最高风险的应用。我们会非常关注团队的运作,你会希望对这些团队进行极端的监控,因为系统的可靠性取决于其最薄弱的环节。那可能不是软件,可能是人类组织。
[1]:我将机器学习(ML)与人工智能互换使用,尽管 ML 只是用于实现人工智能的一种技术。
[2]:请注意,波音 737 MAX 坠毁可能是由于非冗余传感器故障混淆了自动驾驶系统。
AutoML —改进您工作流程的工具(已更新)

Photo by Alex Knight on Unsplash
二进制分类中 H2O 自动机的改进
在发表了我关于这个话题的原始文章后, 艾琳·莱戴尔——H2O . ai 的首席机器学习科学家,为我提供了一些关于文章的很好的反馈。作为对此的回应,我决定在这篇文章中加入她的评论,以展示使用 AutoML 特性是多么容易。

我在整篇文章中用粗体显示了反馈部分以及她在文章结尾提供的要点。
最近,对数据科学技能的需求激增,其增长速度超过了当前技能供应的速度。今天,很难想象一家企业不会受益于科学家和机器学习算法执行的详细分析数据。随着人工智能进入工业的每个角落,很难在每个可能的用例中满足数据科学家的需求。为了缓解这种短缺带来的压力,一些公司已经开始开发能够部分自动化通常由数据科学家执行的流程的框架。
AutoML 是一种将机器学习技术应用于数据的过程自动化的方法。通常,数据科学家会花大量时间进行预处理、选择功能、选择和调整模型,然后评估结果。AutoML 能够通过提供基线结果来自动执行这些任务,但也可以针对某些问题提供高性能的结果,并深入了解进一步探索的方向。

本文将介绍 Python 模块 H2O 及其 AutoML 特性。H2O 是一个基于 Java 的数据建模和通用计算软件。根据 H2O.ai:
H2O 的主要用途是作为分布式(许多机器)、并行(许多 CPU)、内存(数百 GBs Xmx)处理引擎
AutoML 是 H2O 的一个功能,它可以自动构建大量模型,目标是在没有任何先验知识的情况下找到“最佳”模型。AutoML 不会为您赢得任何竞争,但它可以提供大量信息来帮助您构建更好的模型,并减少探索和测试不同模型所花费的时间。
他们 AutoML 功能的当前版本可以训练和交叉验证随机森林、极度随机森林、梯度增强机器的随机网格、深度神经网络的随机网格,然后使用所有模型训练堆叠集合。
堆叠(也称为元集成)是一种模型集成技术,用于组合来自多个预测模型的信息以生成新模型。通常情况下,堆叠模型(也称为第二层模型)的表现会优于每个单独的模型,因为它具有平滑的特性,能够突出表现最佳的每个基础模型,并贬低表现较差的每个基础模型。因此,当基本模型明显不同时,堆叠是最有效的。

Stacking visualized — Image from http://supunsetunga.blogspot.com/
堆叠方法是通过混合或组合多个机器学习模型的预测来提高预测性能的程序。有多种集成或堆叠方法,从简单的投票或平均预测,到使用预测作为特征构建复杂的学习模型(逻辑回归、k-最近邻、提升树)。
机器学习模型预测的堆叠经常击败最先进的学术基准,并被广泛用于赢得 Kaggle 比赛。不利的一面是,它们通常在计算上很昂贵,但是如果时间和资源不成问题,那么预测性能的最小百分比改进可以帮助公司节省大量资金。AutoML 特性还可以大大减少运行这些堆栈方法所需的时间。
数据探索
本文将研究蘑菇分类数据集,该数据集可以在 Kaggle 上找到,由 UCI 机器学习公司提供。该数据集包含 23 个分类特征和 8000 多个观察值。数据分为两类,可食用的和有毒的。这些类分布相当均匀,52%的观察值在可食用类中。数据中没有遗漏的观察值。这是一个流行的数据集,Kaggle 上有超过 570 个内核,我们可以使用它来查看 AutoML 相对于传统工作流的性能。
运行 H2O
首先,您需要安装并导入 H2O Python 模块和 H2OAutoML 类,就像任何其他库一样,并初始化一个本地 H2O 集群。(这篇文章我用的是 Google Colab。)
然后我们需要加载数据,这既可以直接加载到“H2OFrame”中,也可以加载到 panda DataFrame 中(就像我对这个数据集所做的那样),这样我们就可以对数据进行标签编码,然后将其转换为 H2OFrame。与 H2O 的许多东西一样,H2OFrame 的工作方式与 Pandas DataFrame 非常相似,但在语法上略有不同——H2O 汽车公司可以直接处理分类列,因此这一步是不必要的。
尽管 AutoML 将在初始阶段为我们完成大部分工作,但重要的是,我们仍然要对我们试图分析的数据有一个很好的理解,以便我们可以在它的工作基础上更进一步。
df.describe()

H2OFrame from df.describe()
类似于 sklearn 中的函数,我们可以创建一个训练测试分割,以便可以在一个看不见的数据集上检查模型的性能,以帮助防止过度拟合。值得注意的是,当分割帧时,H2O 没有给出精确的分割。它旨在有效处理大数据,使用概率分割方法而不是精确分割。例如,当指定 0.70/0.15 分割时,H2O 将产生期望值为 0.70/0.15 的测试/训练分割,而不是精确的 0.70/0.15。在小数据集上,结果分割的大小将比大数据更偏离预期值,在大数据上,它们将非常接近精确值 —注意这里没有必要包括验证集,因为我稍后不会使用它,但如果需要的话可以使用它。
然后,我们需要获取数据集的列名,以便将它们传递给函数。对于 AutoML,有几个参数需要指定x、y、training_frame、validation frame,其中y和training_frame为必需参数,其余为可选参数。您也可以在此配置max_runtime_sec和max_models的值。max_runtime_sec参数是必需的,max_model是可选的,如果不传递任何参数,默认为 NULL。x参数是来自training_frame的预测值向量。如果您不想使用您传递的帧的所有预测值,您可以通过将其传递给x来设置。
对于这个问题,我们将把数据帧中的所有参数发送到x(除了目标)并将max_runtime_sec设置为 10 分钟(其中一些模型需要很长时间)。现在该运行 AutoML 了:
在这里,该功能被指定为运行 10 分钟,但是可以指定模型的最大数量。如果您希望调整 AutoML 运行的过程,也可以传递大量可选参数来实现这一点。以下是 h2o 文档中的描述:
x:预测值列名或索引的列表/向量。只有当用户希望从预测值集中排除列时,才需要指定该参数。如果所有列(除响应之外)都应在预测中使用,则不需要进行设置。validation_frame:该参数被忽略,除非nfolds == 0,其中可以指定一个验证框架,用于提前停止单个模型和网格搜索(除非max_models或max_runtime_secs覆盖基于度量的提前停止)。默认情况下,当nfolds > 1时,交叉验证指标将用于提前停止,因此validation_frame将被忽略。leaderboard_frame:该参数允许用户指定一个特定的数据框,用于对排行榜上的模型进行评分和排名。除了排行榜评分之外,此框架不会用于任何其他用途。如果用户没有指定排行榜框架,那么排行榜将使用交叉验证指标,或者如果通过设置nfolds = 0关闭了交叉验证,那么将从训练框架自动生成排行榜框架。blending_frame:指定用于计算预测的帧,该预测用作堆叠集合模型金属载体的训练帧。如果提供,AutoML 生成的所有堆叠系综将使用混合(也称为保持堆叠)而不是基于交叉验证的默认堆叠方法进行定型。fold_column:为每个观察指定交叉验证折叠索引分配的列。这用于在 AutoML 运行中覆盖单个模型的默认、随机、5 重交叉验证方案。weights_column:指定带有观察权重的列。将某个观察值的权重设置为零相当于将其从数据集中排除;给一个观察值一个相对权重 2 相当于重复该行两次。不允许负权重。ignored_columns:(可选,仅 Python)指定要从模型中排除的一列或多列(作为列表/向量)。这是x论证的逆命题。
模型运行后,您可以查看哪些模型的性能最好,并考虑这些模型进行进一步的研究。
lb = aml.leaderboard
lb.head()

Leaderboard of best models from H2O AutoML
为了检查模型是否过度拟合,我们现在对测试数据运行它:
preds = aml.predict(test)
结果
AutoML 在测试数据上给出了 1.0 的准确度和 F1 分数,表明该模型没有过拟合。

Results for best model from AutoML on test data
很明显,这是 AutoML 的一个特例,因为如果不测试更多的数据,我们就无法在测试集上提高 100%的准确率。查看为这个数据集提交给 Kaggle 的许多内核,似乎许多人(甚至 Kaggle 内核机器人)也能够使用传统的机器学习方法产生相同的结果。
以下是艾琳·莱德尔提供的要点:
未来的工作
下一步是保存训练好的模型。有两种方法保存领导者模型——二进制格式和 MOJO 格式。如果你要把你的模型投入生产,那么建议使用 MOJO 格式,因为它是为生产使用而优化的。
现在,您已经找到了数据的最佳模型,可以进一步探索提高模型性能的步骤。也许训练数据上的最佳模型过拟合,而另一个顶级模型是优选的。也许可以为某些模型准备更好的数据,或者只选择最重要的特征。H2O 汽车公司的许多最好的模型使用集成方法,也许集成使用的模型可以进一步调整。
虽然 AutoML 本身不会让你在机器学习竞赛中获得冠军,但它绝对值得考虑作为混合和堆叠模型的补充。
AutoML 可以处理各种不同的数据集类型,包括二元分类(如此处所示)、多类分类以及回归问题。
结论
AutoML 是帮助(而不是取代)数据科学家工作的伟大工具。我期待看到 AutoML 框架的进步,以及它们如何让我们这些数据科学家和他们所服务的组织受益。当谈到特征工程时,一个单独的自动混合器当然不能胜过人类的创造性思维,但是 AutoML 是一个值得在你的下一个数据项目中探索的工具。
再次感谢艾琳·莱戴尔的反馈,请务必关注她的 推特 。

Image from TechRadar
关键词汇
- AutoML —一个自动化一些通常由数据科学家执行的任务的框架。
- H2 of frame——H2O 版的熊猫数据帧。
- 堆叠——一种采用多个不同模型并根据这些“子模型”的结果创建预测的模型。
进一步阅读
- 关于 H20 的教程,包括 AutoML 和其他功能—http://docs . H2O . ai/H2O-tutorials/latest-stable/H2O-world-2017/AutoML/index . html
- 了解更多关于堆叠模型的信息—http://blog . ka ggle . com/2016/12/27/a-ka gglers-guide-to-model-stacking-in-practice/
AutoML 和 AutoDL:简化
看看机器学习新阶段的开始
什么是 AutoML?
作为数据科学研究工程师,任何问题陈述中最耗时的任务是数据分析、试验和选择正确的算法和参数调整。所有这些都需要人类的专业知识,这也是数据科学家如今如此重要的原因。

但是,如果这种人为干预能够被消除,那会怎么样呢?如果这种模型能够自行选择正确的算法、进行数据分析和微调以获得完美的模型,那会怎么样?这就是 AutoML 的意义所在,也绝对是迈向完全自主系统的下一步。
其他类似的术语包括 AutoDL、AutoCV 和 AutoNLP,用于表示深度学习、计算机视觉和自然语言处理领域的模型。通俗地说,例如,AutoCV 旨在创建一个单一的系统,它可以处理任何计算机视觉问题,理解数据并选择正确的方法来处理数据,所有这些都无需任何人工干预。

为什么选择 AutoML?
机器学习和人工智能现在很热门,近年来有很多研究方向被称为该领域的未来。AutoML,或者有些人喜欢称之为元学习,粗略地说,是一种关于学习的学习形式。
从一开始,对 ML 的研究就一直在上升,我们已经创建了各种各样的模型和系统,每一个都是针对特定的问题陈述的。然而,我们现在正处于一个阶段,我们可以结合这些模型,并在某种意义上,在层次结构上向上移动。因为我们的最终目标是达到层次的顶端并创建一个自治系统,所以我认为这些元模型的宣传绝对值得。

Google Cloud based AutoML services
AutoML 和 ML 有什么不同?
在 ML 中,数据科学家首先从问题陈述和数据集开始。对数据进行分析和清理,确定一个性能指标,然后根据人类的直觉,对一些可能适用于数据集的模型进行实验。在我们最终得到一个可接受的模型之前,需要进行大量的功能工程和微调。
AutoML 试图尽可能多地自动化这个管道。虽然这些步骤中有一些比较容易自动化,比如模型微调,但是有一些非常困难,比如选择正确的架构/模型等等。总而言之,AutoML 就是要尝试创建一个单一的系统,可以在建模和训练过程的每一步都不需要人工干预。

它有多成功?
最近在 AutoML 和 AutoDL 领域做了很多工作。我认为这很大一部分功劳应该归功于 AutoML 最近的多个竞赛,试图改善这个领域并邀请创新的想法。
Google 已经创建了他们自己的基于云的 AutoML 平台,保证帮助那些对 ML 一无所知的人使用 ML。然而,使用他们的模型是非常昂贵的,而且只适合愿意花同样多钱的企业。
[## Cloud AutoML -定制机器学习模型|谷歌云
Cloud AutoML 帮助您利用有限的机器学习专业知识轻松构建高质量的定制机器学习模型…
cloud.google.com](https://cloud.google.com/automl/)
也有很多成功的开源平台,如 Auto-Sklearn 和 Auto-keras,它们成功地为每个人提供了 AutoML 领域的最新进展..免费!!
[## 弗赖堡汽车公司
BOHB 结合了贝叶斯优化和超波段的优点,以达到两全其美…
www.automl.org](https://www.automl.org/)
下一步是什么?
AutoML 已经看到了几年前不可能实现的成功,像谷歌这样的平台已经能够建立这样的系统,可以将数据科学家从通用机器学习管道的等式中移除。但是我们离真正的自治系统还很远。
这个博客是努力创建机器学习领域简化介绍的一部分。点击此处查看完整系列
在你一头扎进去之前就知道了
towardsdatascience.com](/machine-learning-simplified-1fe22fec0fac)
或者干脆阅读系列的下一篇博客
看看自然语言处理的“你好世界”
towardsdatascience.com](/sentiment-analysis-simplified-ac30720a5827)
参考文献
[1] Guyon,Isabelle 等,“2015–2018 年 AutoML 挑战赛系列分析。”(2017).
【2】何,,等,“Amc:面向移动设备的模型压缩与加速的 Automl”欧洲计算机视觉会议录(ECCV)。2018.
3佐夫、巴雷特和阔克诉勒。"强化学习的神经架构搜索."arXiv 预印本 arXiv:1611.01578(2016)。



浙公网安备 33010602011771号