机器学习算法:它们如何工作以及每种类型的用例——第一部分,共三部分
有三种主要类型的机器学习算法:
- 监督学习
- 无监督学习
- 强化学习
在这个系列的第一部分中,我将介绍什么是监督学习算法,它们是如何工作的,以及它们可以应用的几个例子。
什么是监督学习
在监督学习算法中,算法将使用训练数据和来自人类的反馈来学习给定输入集和给定输出之间的关系。
监督学习如何工作
步骤 1:人工标记输入数据并定义输出变量。
步骤 2:然后在数据集上训练算法,以找到输入变量和输出之间的联系。
步骤 3:当算法达到被认为足够的准确率时,训练被认为完成。之后,将该算法应用于新的数据集。
目前,大约有 10 种不同类型的监督学习算法有明确的用例:
请注意:下面定义的用例并不是每种算法的唯一用例。这些示例有助于指导您理解它们的应用领域。
-
线性回归 一种标准方法,用于对独立输入变量和非独立输出变量之间的过去关系进行建模,以帮助预测输出变量的未来值。
用例:
(一)优化产品级价位。
(二)估计产品价格弹性。
(iii)分析产品销售驱动因素,如定价、数量、分销等。 -
逻辑回归 与线性回归非常相似,只是输出变量是二元的(真与假),而不是连续的(无限个值)。
用例: (i)根据银行客户是否会拖欠贷款对其进行分类。(ii)基于一些标准预测皮肤损伤是良性还是恶性。 -
线性/二次判别分析 升级逻辑回归处理非线性问题。也就是说,输入变量的变化不会导致输出变量成比例的变化。
用例:
(一)预测用户流失。(ii)预测销售线索成交的可能性。 -
**决策树
用例: (i)了解消费者在你的网站上的行为,从而导致产品被购买。
(一)为筛选新的工作候选人提供决策框架。** -
AdaBoost
一种分类或回归技术,使用多种模型做出决策,但根据其预测结果的准确性进行权衡。
用例:
(i)检测银行交易中的欺诈活动。
深度学习是一种更有效的方式来实现这一点,我将在另一篇文章中介绍这一点 -
简单的神经网络 模型,其中人工神经元稍后进行输入,一个或多个进行计算的隐藏层,以及一个输出层。
用例: (一)预测某个产品的某个用户是否会愿意注册该产品的高级版本。
(ii)预测一个人签订人寿保险单的概率。 -
随机森林 分类或回归模型,通过生成多个决策树并对它们进行多数表决来预测输出,该输出是用于分类的连续变量和/或离散变量,从而提高简单决策树的准确性。
用例: (i)预测餐馆的客流量或人数,以预测人员配备决策。(ii)预测配电网中的用电量。 -
支持向量机 一种通常用于分类的技术,但可以转换为执行回归。它尽可能明智地划分了阶级。
用例: (一)预测某人点击一个在线广告的可能性有多大。
(ii)预测一家医院在特定时间段内需要服务多少患者 -
**朴素贝叶斯
用例: (一)根据分类器将邮件分类为垃圾邮件。
(ii)基于产品评论分析情感。** -
梯度推进树 顺序生成决策树的分类或回归技术,其中每棵树都专注于纠正先前的树模型。最终输出是所有树的结果的组合。
用例: (一)预测产品需求和库存。
(二)根据里程、车龄等预测汽车价格。
在本系列的第二部分中,我将以与本文相同的格式介绍无监督学习算法。
ML 系统的安全概述
这是对机器学习系统安全性的浅显概述。在几个卷轴中,我们将浏览对立的例子,模型盗窃,数据集中毒和数据集保护。
🗡 ️Adversarial 的例子
对立的例子(AE)主题很吸引人,也是一个活跃的研究领域。它提出了与我们当前基于梯度的分类器架构的限制和安全性相关的基本问题。AE 是精心制作的数据,旨在被目标模型错误分类。它们“被设计成使模型出错”( OpenAI ,用对抗性的例子攻击机器学习)。右边的图像是一个对立的例子。
See the complete notebook
最左和最右的狗之间的差异可能是不可感知的。这可能是由于我们的眼睛限制(或您的显示器的位深度)。然而,它们对各种模型都至关重要。最后一个图像实际上是由 Keras 中使用默认训练权重初始化的ResNet50
将视为的plane
,并且一个 AE 可能会在另一个架构上工作。唯一的区别是小像素值,在第二张图片中放大了。
我们可以注意到ResNet50
非常自信地认为左图中的狗是一只golden_retriever
(80%),而精心制作的图像是一只可信度更高的`plane`( 99%)。因此,一个模型可能会被欺骗,以我们期望的置信度得分犯错误,我们通常只需要训练它足够长的时间。用任意的置信度分数进行错误分类会有什么影响?
推荐系统也被研究用于对抗性推荐,通过不可辨别的虚假用户影响推荐系统。
安全
在大多数已知的模型中,任何图像都可以被制作成具有任意置信度得分的另一类。所以我们的狗可以被任意准确地错误分类成我们想要的任何东西。事实证明,在现实世界中也是如此,例如,如果我们把它们打印出来。一个著名的例子是欺骗汽车的传感器看到限速而不是停车标志。在某种程度上,模型的输出可以被操纵以做出期望的决策,或者由依赖于它的应用程序生成未处理的行为。
Prediction vs ‘puppeted’ prediction arxiv.org/pdf/1602.02697.pdf (page 3)
到 2017 年底,一些研究表明,在某些情况下,修改一个像素就足够了。如果你想了解更多,你可以阅读论文欺骗深度神经网络的一个像素攻击,欣赏一分钟论文频道的高水平演示或检查这个 Keras 实现。
对抗性的例子是简单的攻击,不需要太多的计算。对于相对较小的图像,一个好的 GPU 可以在不到一分钟的时间内制作一个 AE。这是一个真正的安全问题,这可能是为什么我们可以在一些相关主题论文的末尾看到这些行:
根据合作协议编号 w 911 nf-13–2–0045(ARL 网络安全 CRA 公司),该研究也得到了陆军研究实验室的部分支持,并得到了陆军研究办公室的拨款 w 911 nf-13–1–0421。
不同的威胁级别和技术
我们知道,对立的例子会影响分类器的决策界限。例如,我们可以在图像上添加随机像素,然后改变分类,或者明智地选择那些添加的像素,然后选择分类。根据威胁目标,我们表示:
- 置信度降低通过降低给定图像的模型置信度来增加类别之间的模糊性。
- 错误分类将输出类别更改为不同于原始类别的另一个类别。
- 有针对性的错误分类会强制特定输入的输出成为特定的目标类。
根据对手的知识,有三种方式来设计对抗性的例子。每个人都有自己假定的目标先验知识。了解:
- 模型整体包括其权重(基于梯度),
- 只有每个班级的分数(基于分数的),
- 只有预测(转移型)。
由 Papernot 绘制的简图。在对抗环境中深度学习的局限性(第 3 页)中:
Simplified copy of a diagram by Papernot. et al in The Limitations of Deep Learning in Adversarial Settings (page 3)
基于梯度的攻击的一个例子在于计算图像的损失梯度函数。接着向相反的梯度方向迈一小步。为了保持有效的 RGB 值,图像可能会在 0 到 255 之间被剪切,噪声值在 0 和一个小值 M 之间。这个值 M 决定了原始图像和对手图像之间的最大差异,因此 M 应该小于人类的颜色敏感度(通过监视器)。m 小于 5 应该可以。前一种技术被称为迭代最小可能类方法。存在其他类型的梯度技术,如快速梯度符号方法。你可以阅读这篇论文(第 2 部分,第 3 页)。我们可以注意到,它们都需要完全了解模型及其权重。
基于分数的攻击仅依靠预测模型的分数来估计梯度,然后应用先前的技术。基于传输的攻击完全依赖于输出标签。与基于分数和基于梯度相比,这是一个更真实的场景。您可以在模型盗窃一节中找到基于传输的攻击的示例。
防御
这里我们不会深入探讨,我鼓励你搜索吸引你的关键词,它本身就值得一篇博文。我们可以看到两大类防御:
- 反应性:目标是一个对抗的例子,在被我们的推理模型调用之前。
- 主动:目标是让模型更能抵御这种攻击。Nicolas paper not 等人的黑盒攻击。
被动防御的例子:
- 磁铁由自动编码器组成的“两个网络”模型,能够在送入分类器之前进行重组。这里需要几个自动编码器,所以资源很昂贵。
主动防御的示例:
- 随机深度符号卷积神经网络
- 标签平滑(2016)
- 混搭(2017)
- 对抗性训练,用对抗性例子的子集重新训练神经网络
- Logit 配对:这是一个非常新的配对(2018 年),“实现了 ImageNet 上白盒和黑盒攻击的最先进防御”
📡模型盗窃
尝试重建某人的 else 模型或检索用于训练该模型的数据。数据集和/或模型可能因其敏感或商业价值而保密。
模型保密性和公共访问之间的紧张关系激发了我们对模型提取攻击的研究。( 来源 )
我们将简要总结 Nicolas Papernot 等人的黑盒攻击,如果你想深入了解这个主题,你可能会喜欢阅读它。这里描述的主要思想是创建一个用对手制作的替代数据集训练的局部替代神经网络。然后,使用基于梯度的技术,可以产生对立的例子。
不需要带标签的数据集,因为它的制作成本很高。使用远程 DNN 的输出来标注替代数据集。然后,通过一种称为基于雅可比矩阵的数据集扩充的技术对本地数据集进行局部扩充。以下是描述雅可比数据扩充的伪代码(完整代码可从 github 获得)。
def jacobian_augmentation(dataset):
"""
- get_label: API call on the remote oracle
- alpha: step size
- jacobian: returns jacobian matrix of the substitute model
"""
jacobian_dataset = []
for sample in dataset:
label = get_label(sample)
jacobian_sample = sample + alpha*sign(jacobian(substitute_model,label))
jacobian_dataset.append(jacobian_sample)
return jacobian_dataset
基本上,每个例子都是通过在渐变方向上增加一个小的变化来增强的。
他们强调:
[…]该技术不是为了最大化替代 DNN 的准确性而设计的,而是为了确保它用很少的标签查询来逼近 oracle 的决策边界。
架构的选择不是很重要,因为我们可以预先假设一些细节。CNN 很有可能被用于图像分类任务。也可以同时训练几个架构。
在 Github 上有一个类似攻击的实现。
💊数据集中毒
数据集中毒攻击的目的是在测试时操纵模型的行为。
毒害 3%的训练集设法降低了 11%的测试准确度。(2017)).
标签翻转攻击目标是最大化损失函数,如果训练样本的标签的子集被翻转,这基本上通过梯度上升来完成:
Ali Shafahi et al. 2018 (Figure 1-b)
攻击者首先从测试集中选择目标实例;成功的中毒攻击会导致此目标示例在测试期间被错误分类。接下来,攻击者从基类中抽样一个基实例,并对其进行难以察觉的更改以创建一个中毒实例;这种毒害被注入到训练数据中,目的是欺骗模型在测试时用基本标签标记目标实例。最后,在中毒数据集(干净数据集+中毒实例)上训练模型。如果在测试期间,模型将目标实例错误地认为在基类中,则中毒攻击被认为是成功的。 毒蛙!针对神经网络 的干净标签中毒攻击
🔑数据集保护
完全同态加密
Fast Homomorphic Evaluation of Deep Discretized Neural Networks eprint.iacr.org/2017/1114.pdf (page 25)
全同态加密是一种通过加解密功能保留对数据操作的加密方案。如果在相加过程中保留该方案,则对总和加密或对加密成员求和将得到相同的结果。这意味着,您可以在本地加密数据并将其发送到服务器,让它仅使用受支持的操作符来执行某项工作,并返回加密结果。你不需要信任服务器,因为它不会理解自己在操纵什么。
让ENC
和DEC
分别实现加密和解密功能:
ENC(X1 + X2) = ENC(X1) + ENC(X2) (homomorphism)
Since X1 + X2 = DEC(ENC(X1+ X2))
We have X1 + X2 = DEC(ENC(X1) + ENC(X2))
如果在这个领域你需要追随一个人,那就是克雷格·金特里。他在 2009 年创立了第一个 FHE 计划。
克雷格近期的很多工作,包括《FHE》和《加密多线性地图》,都属于“基于点阵的加密”领域。与 RSA 和椭圆曲线密码等常用的密码体制不同,基于点阵的密码体制不可能(就我们所知)被量子计算机破解。IBM)
这里最重要的部分是,如果有一天这种加密方案存在,我们可以(几乎)不关心我们在远程机器上发送的数据的隐私。如果这台机器是恶意的,它只能给你错误的结果,但不能利用你的数据…除非…如果我们正在谈论一个 FH 加密的机器学习模型试图预测一些东西,没有什么可以保证你的模型一开始是空的,你的对手仍然可以对年轻的模型进行推理(通过观察边界决策等)。你应该看看 CryptoDL 。
数据集盗窃
也可以通过简单地查看模型的输出来恢复训练时使用的数据,针对机器学习模型的成员推理攻击:
给定一个数据记录和对模型的黑盒访问,确定该记录是否在模型的训练数据集中。为了对目标模型执行成员关系推断,我们对抗性地使用机器学习并训练我们自己的推断模型,以识别目标模型对其训练的输入和未训练的输入的预测的差异。
在这里可以找到一个实现。
最初发表于data-soup.github.io/blog/
机器推理:区别特征
辨别事物特征的能力是学习和推理的一个基本方面。鸟有翅膀,汽车有轮子,等等…
“区分”意味着这些特征在描述和分类事物时是有用的。
by Piyushgiri Revagar
在“机器学习的基本模型中,我们用符号模式观察了机器推理,并开始探索区别特征的概念。这是一个起点。我们在这里进一步探索更复杂形式的区别特征。
print(r . distincting(’ ABC ‘)
print(r . distincting(’ ABC ',relation='is not '))
[['a'], ['a', 'b'], ['a', 'b', 'c'], ['b'], ['b', 'c'], ['c']]
[['x'], ['x', 'y'], ['y'], ['n']]
我们可以很容易地将它缩小到特征集中最大的掩码:
print(top _ mask(r . distinguished(’ ABC ‘))
print(top _ mask(r . distinguished(’ ABC ',relation='is not '))
['a', 'b', 'c']
['x', 'y']
属性‘ABC’的模式确实具有模式**‘a b c’,而那些不是‘ABC’的模式具有模式‘x y’**。给定提供的模式,这些是事物的区别特征。
一旦你确定了一个新模式的显著特征,确定它是否是一个事物就相对简单了:
s0 = Symbolic(’ u o I a b c ‘)
r . determine(s0,’ a b c ')
(True, 'has distinguishing features')
神经网络呢
这与分类中使用的典型人工神经网络相比如何?分类是决定一个输入是否是一个东西的工作,所以这是一个恰当的比较。
在“7 行代码中的深度学习”中,我们使用 Tensorflow 和 tflearn 对几个模式进行了分类,让我们重温一下这个并运行一些实验。
这里是代码,我们将输入以下模式:
features.append([[0, 1, 9, 3, 6], [0,1]])
features.append([[0, 1, 7, 4, 2], [0,1]])
features.append([[0, 1, 5, 0, 9], [0,1]])
features.append([[1, 0, 4, 6, 7], [1,0]])
features.append([[1, 0, 3, 7, 8], [1,0]])
可以看到,符号模式 [0,1] 对应于类[0,1],模式 [1,0] 对应于类[1,0]。让我们尝试对新数据进行分类:
[[0.967603862285614, 0.0323960967361927]] **# wrong!**
[[0.6647899746894836, 0.33520999550819397]]
[[0.12406770884990692, 0.8759322762489319]]
[[0.9999886751174927, 1.133059231506195e-05]] **# unclear**
[[0.9999721050262451, 2.794429565255996e-05]] **# unclear**
[[0.9997043013572693, 0.00029572920175269246]] **# wrong!**
当符号与训练数据 T26 对齐时,我们的 Tensorflow 2 层神经网络 T25 表现相当好(使用小数据),但在第一次测试数据中[非常]不正确。它非常确信模式[0,1,0,6,2]没有被归类为[0,1],但它被归类为[0,1]。在缺少任何一类区别特征的输入上,它产生了不合理的高概率,并且在最后一个模式上,它错过了偏移区别特征。给定足够的训练数据,卷积网络应该可以克服符号偏移问题——这是另一项实验的成果。
让我们看看我们的符号库是如何对相同的数据进行推理的。笔记本这里是这里是。我们将把相同的模式添加到我们的 Reason 类中,并向它询问区别特征。
0.95668 secs{'is': **[('0', ['_0']), ('1', ['_1'])]**,
'is not': **[('1', ['_0']), ('0', ['_1'])]**}
它推理出[0,1]和[1,0]是存在和不存在事物‘foo’的区别特征*,并完成了确定先前未见过的模式的简短工作:*
(True, 'has distinguishing features')
我们的神经网络不仅弄错了这种模式,它也没有告诉我们为什么对它进行了错误的分类。这是一个关键点——机器决定,特别是在中,推理的过程应该是可解释的(内省的)。有人可能会说,所谓的“T8”快速思考“T9”决策通常是不可解释的,但“T10”不同于“T11”。
将 CNN(卷积)结构应用于这些模式需要更多的实验,然而这将需要更多的训练数据。这是另一个重点——从小数据学习和’一次性学习。
正如在概述中提到的,我们希望能够应用自适应学习。我们需要我们的系统在推理的时候学习,纠正和强化输入。我们需要我们的模型不断发展,而不必随着每个新的输入而重建。
这些推理的特性存在于幼儿和动物的学习过程中。他们在场是因为你今天学到了一些新东西。
与众不同的特征或挑战
通常情况下,一个事物具有一组具有或关系的区别特征,而不是和关系。
东西(a)是一辆汽车——它有一个汽油发动机
东西(b)是一辆汽车——它有一个方向盘和一个汽油发动机
东西©是一辆汽车——它有方向盘、挡风玻璃和电动引擎
我们可以推理出“汽车”有方向盘、挡风玻璃和汽油发动机或电动发动机。这个区别特征在‘车’的判定上有或关系。
事实证明,这是一个很难解决的问题。先用我们的神经网络做实验,笔记本这里是这里是。
我们首先定义我们的训练数据,我们将[0,1]和[1,0]模式组合到同一个[0,1]类中,以区分每一个的方式为另一个类提供训练数据。
请注意,类[1,0]的训练示例缺乏显著特征。接下来,我们尝试对新模式进行分类:
[[0.14985743165016174, 0.8501425385475159]]
[[0.0002913394710049033, 0.9997085928916931]]
[[0.6994397640228271, 0.30056023597717285]] **# wrong**
[[1.0, 1.7667502999322605e-14]]
[[0.15181590616703033, 0.8481840491294861]] **# wrong**
[[0.019126782193779945, 0.980873167514801]] **# wrong!**
毫不奇怪,我们的 Tensorflow ANN 不知道[0,1]或[1,0]特征。在最后一次输入中,它对不正确的分类有很高的可信度(可能是因为 0 的存在,但是也不能解释为什么会这样推理。
https://upload.wikimedia.org/wikipedia/commons/e/e8/Juliadim2.png
集合论继续…
在我们的符号库中,我们再次使用集合论,这次是为了确定区别特征的或组合。
我们通过计算模式列表(对于一个属性)的不连续子集的集合,并计算每个子集的区别特征来达到子集的最佳组合。“最佳”是指我们在子集中寻找与其他特征相比最大/最全面的区别特征集合。
生成非连续列表子集的递归函数如下:
例如:
[0, 1] [2, 3, 4]
[0, 2] [1, 3, 4]
[0, 3] [1, 2, 4]
[0, 4] [1, 2, 3]
[1, 2] [0, 3, 4]
[1, 3] [0, 2, 4]
[1, 4] [0, 2, 3]
[2, 1] [0, 3, 4]
...
系列中不连续子集的数量产生了一个雄心勃勃的系列:
2, 3, 10, 15, 41, 63, 162, 255, 637, 1023, 2509, 4095, 9907, 16383, 39202, 65535, 155381, 262143, 616665, 1048575, 2449867, 4194303, 9740685, 16777215, 38754731, 67108863, 154276027, 268435455, 614429671, 1073741823, 2448023842, 4294967295
升级速度相当快。更多关于这个系列的信息可以在这里找到。
回到我们的符号库示例,我们再次提供模式,与之前的运行相同。
1.2334489999999931 secs{'is': [['0'], ['1']], 'is not': None}
它推理出符号[0]和[1]是有区别的特征,这是正确的,然而它需要进一步推理以理解[0,1]或[1,0]是有区别的。为此,我们将使用另一个函数:
r . distinguisingor(’ foo ')
16.00546700000001 secs**([('1', ['_0']), ('0', ['_1'])],
[('0', ['_0']), ('1', ['_1'])])**
它正确地推理出属性‘foo’中这些模式的区别特征是**【1,0】或【0,1】**,在这种情况下,它们的位置(偏移)也被记录,然而这对于特征的识别是次要的。
不像我们的神经网络,每个输入的位置是关键的,使用这种方法区别特征的相对位置并不重要,例如(在模式前添加随机填充):
{'is': **[['1'], ['0']]**, 'is not': None}
和我们的 OR 函数(带调试):
dis1,dis 2 = r . distinguisingor(’ foo ',debug=True)
top_mask(dis1),top_mask(dis2)
31.367725 secs
**0** [('6', ['_0']), ('1', ['_1']), ('0', ['_2']), ('4', ['_3']), ('6', ['_4']), ('7', ['_5'])]
**1** [('8', ['_0']), ('9', ['_1']), ('1', ['_2']), ('1', ['_3']), ('0', ['_4'])]
**2** [('7', ['_0']), ('8', ['_1']), ('0', ['_2']), ('1', ['_3']), ('9', ['_4']), ('3', ['_5']), ('6', ['_6'])]
**3** [('4', ['_0']), ('0', ['_1']), ('1', ['_2']), ('7', ['_3']), ('4', ['_4']), ('2', ['_5'])]
**4** [('2', ['_0']), ('9', ['_1']), ('0', ['_2']), ('1', ['_3']), ('5', ['_4'])]
[0, 1] -> [['1'], ['1'], **['1', '0']**, ['0']]
[2, 3, 4] -> [['0'], **['0', '1']**, ['1']](**['1', '0']**, **['0', '1']**)
简介:在与事物“foo”相关联的 5 个模式中,在所有不连续的子集(最小长度为 2)中,模式组[0,1]和[2,3,4] 产生最大的区别特征集合。
换句话说:事物‘foo’的这些子群彼此有最多的共同点,它们的共性由它们的区别性特征来表示。这些是事物的或特征。
https://upload.wikimedia.org/wikipedia/commons/b/b3/Mandel_zoom_07_satellite.jpg
思考绩效
你可能已经注意到在一些例子中显示的运行时间,这是有意包含的。
31.367725 secs
对一个有 5 个图案的东西的区别特征进行推理,每个图案有 5-7 个符号,需要大约 30 秒,这对于计算来说是永恒的。集合论计算的本质是,模式数量或大小的增加将对性能产生非线性影响。
让我们快速看一下 10 种模式的不连续子集的数量(最小子集长度为 2):
10770
10,770 个可能的子集中的每一个都需要计算一组区别特征,这本身就涉及额外的集合论工作。
首先让机器运转起来,然后进行优化。
我们在进行实验时遵循这一法则,优化和提高性能的潜力总是存在的,我们首先想了解如何根据模式和表面基本概念进行推理。
这里有几种优化方法:
- ipython 笔记本相对较慢,但对实验很有帮助,它不是一个性能环境
- 消除冗余的非连续子集有简单的方法,例如[0,2] [1,3,4]与[1,3,4] [0,2]是冗余的
- 有一些方法可以避免对子集的整个分支进行计算,例如,如果子集[0,2] 没有产生有意义的区别特征,那么它的所有超集([0,2,1],[0,2,5],[0,2,8]等等。)可以忽略
- 进程有利于并行化,没有理由为什么单独的线程/进程可以通过不同的集合组工作
直到下一次…
莎士比亚英语的机器翻译
写作风格转换的尝试
背景
如果你一直在关注深度学习的最新发展,你可能会遇到 艺术 风格转移 *。*这是一种使用图像 A 的内容,以图像 b 的风格创建新图像的技术。例如,下面是从康定斯基的一幅画到尼尔·德格拉斯·泰森的一张照片的风格转换结果。
Source: https://research.googleblog.com/2016/02/exploring-intersection-of-art-and.html
深度学习在转移言语风格方面也取得了成功。给定一个一分钟的某人说话的音频剪辑, Lyrebird 能够捕捉到那个人的说话风格,并通过模仿他的声音让他说任何话。
动机
我很好奇风格转移是否也适用于书面文字。这个想法是将英语句子打扮成不同作者的风格,无论是华丽的诗歌还是生硬的散文,同时保留其意义。互联网搜索没有找到任何方法,但我发现我可以让神经机器翻译(NMT)适应我的目的。
我不是在两种不同的语言之间翻译,而是训练一个神经网络从现代英语翻译成莎士比亚的英语。训练数据是莎士比亚的戏剧和在 sparknotes.com 和 enotes.com 可以得到的相应的现代英语翻译。
结果
我把这个翻译应用到泰勒·斯威夫特的新歌《看你让我做了什么》标题翻译过来就是“你让我做了什么?”这是古老的莎士比亚风格,忠实地保留了原来的意思。这是这首流行歌曲完整的第一节和翻译。
Song lyrics | Shakespeare translation I do not like your little games. | i do not like your little dry .
Do not like your tilted stage. | do not like thy mind .
The role you made me play. | the offence you made me .
Of the fool, no, I do not like you.| no , no , i am not like you . I don't like your perfect crime. | i do so much as thou art .
How you laugh when you lie. | how thou dost lie .
You said the gun was mine. | you say the seas was mine .
Isn't cool, no, I don't like you. | no cool , no , i protest you .
Oh, look what you made me do | o , look you , look you , what > you make me do ?
Look what you made me do | what thou hast made me do ?
方法
谷歌研究博客 5 个月前发表了一篇文章介绍了一个教程,展示了如何在 Tensorflow 中构建一个高质量的翻译模型。用他们的话说,
本教程旨在使这个过程尽可能简单,从 NMT 的一些背景知识开始,通过代码细节来构建一个普通的系统。然后深入到注意力机制[3,4],这是让 NMT 系统处理长句的一个关键因素。最后,本教程详细介绍了如何复制谷歌 NMT (GNMT)系统[5]中的关键特性,以便在多个 GPU 上进行训练。
谷歌兑现了自己的承诺,提供了一个易于理解的教程。假设您有硬件,只需执行几个 python 脚本就可以得到翻译模型。使用它们的默认值,我训练的翻译模型是一个 2 层 LSTM seq2seq 模型,具有 128 维隐藏单元、丢失和注意机制。以下是我从解释 NMT 如何工作这一节中得到的关键信息。
- 他们的方法是将整个句子作为一个翻译单位。这与基于短语的翻译不同,基于短语的翻译将句子拆分成短语并独立翻译。因为它考虑整个句子,所以它可以在具有长期依赖性的部分上表现得更好,比如性别一致。
- 他们使用编码器-解码器架构。在编码步骤中,网络构建了一个“思维向量”,它将源语言中的单词编码成句子的意思。在解码步骤*、*中,“思维向量”被一次一个单词地投射到目标语言。递归神经网络(RNN)用于编码器和解码器,这是顺序数据的自然选择。
Encoder and decoder RNNs. marks the boundary between encoding and decoding. Source: https://github.com/tensorflow/nmt
3.如果你认为上面的图表有太多的箭头,你并不孤单。对于长句来说更糟,单一固定大小的隐藏状态成为信息瓶颈,性能受到影响。一种解决方法是使用注意机制在目标单词和源单词之间建立直接的快捷连接。注意力通过编码的源向量上的加权分布来捕捉,该加权分布指示与目标单词的相关性。
Attention mechanism. Source: https://github.com/tensorflow/nmt
结论
莎士比亚的译者远非完美,但如果数据可用,这是一个潜在的写作风格转换的途径。它需要用两种不同的写作风格来表达相同内容的两个语料库,这是对可用风格数量的一个主要限制。真正的写作风格转变的过程从来都不是一帆风顺的。
神奇的虫子和在哪里可以找到它们
作者加博尔·巴科斯
Magical bugs and where to find them
每个人都想尽可能快。开发功能,然后立即发货,同时获得反馈,收集发现并改进一切。我们 Skyscanner 的移动开发团队也喜欢这样操作,但正如林哥·斯塔尔曾经唱过的,“你知道这来之不易。”
我们的代码库正在快速增长(现在没有外部依赖的 iOS 代码为 496,682 行,没有 XML 的 Android 代码为 526,076 行)。而且,我相信你知道,更大的代码库不支持快速迭代。因此,我们的发布周期变得更慢,并且在从开发分支中分离出来之后,需要花费更多的时间来创建稳定的发布候选版本
寻找解决方案
有两种可能的方法来构建静态代码分析系统。
- 被动方式:当你在收集信息,然后试图根据你的发现采取行动。然而,这是一种特别的方法,因为它只是简单地分析项目,所以并不总是完全完整的。作为一种提供系统概述的方式,这是很有用的,但是如果有太多的问题或者项目太大,数据可能是压倒性的,并且最终是无用的。
- 主动方式:当你故意寻找问题时,如果有任何违反,你就破坏了这种构建。但是它必须集成到构建过程中,否则开发人员可能会忽略它。例如,如果在创建拉请求的集成期间出现问题,那就太晚了。给出一个清晰而直接的信号是至关重要的。
在理想情况下,这两种方法可以而且应该共存。换句话说,扫描整体健康状况,如果有违规,就中断构建。我们尝试这样做,首先扫描,然后分析项目,但最终有太多的问题,我们无法制定行动要点。甚至不知道从哪里开始,所以我们放弃了这种方法,采用了一种主动的静态代码分析系统。你可以在下面找到主动方法的确切流程。
Flow of the active approach we took
首先,我们只关注 iOS 和 Objective C。我们从 OCLint 等可用选项中选择 Clang 作为我们的框架,因为这是编译器,它已经指出了开箱即用的问题。Clang 带有一个广泛的诊断框架,并有一个广泛的警告标志列表。为了利用这一点,需要为项目修改编译器标志。有一个预定义的警告集已经打开,但我们可以启用新的警告或警告组,最终我们可以将这些警告升级为错误。
修复我们自己的域是范围,所以我们排除了第三方库,只关注我们的内部组件,导致 43 个模块需要配置相同的规则集。我们创建了一个简单的脚本来修改 xcconfig 文件中的“Other C Flags”部分,用于那些模块的目标配置,以及我们希望提升为错误的相关警告数组。如果需要手动更改,可以在 Xcode 的 Targets/Build Settings/Other C Flags 路径中找到它。有了这种方法,开发人员可以专注于错误标记,而不必知道脚本是如何工作的。每个错误应该看起来像下面的模式-Werror= 。所以这些字符串需要添加到配置中。从技术上讲,我们迭代相关的构建目标,并以编程方式将构建的警告标志添加到构建配置中。使用这种方法,Xcode 项目文件在目标和模块之间是一致的。
执行
正如我已经提到的,我们在应用程序中有超过 9000 个警告,当我们启用“每个警告都是错误”标志(-Wall)时,结果是压倒性的。显然,我们无法处理这么多的错误。所以我们创建了一个编译器已经指出的警告列表——这是我们要整理的第一组规则。比如 Clang deprecated-declarations 警告,它指出 Objective-C 方法声明中的 C 样式参数是不推荐使用的。或者 Android ObsoleteLayoutParam,如果给定的 layout_param 不是为给定的布局定义的,则表明该问题,这意味着它不起作用。
五个团队自愿修复所有这些问题,所以我们每周组织一次警告消除会议,每个团队一个人参加四个小时。这段时间过程变化很大。我们挑选了 2-3 个错误,并逐一启用和修复它们。显然,在有些情况下,修复不是一个选项,所以在这些情况下,我们抑制了错误,但这是我们采取的最后一个选项。最大的问题是修复之前修复的问题,以阻止多米诺骨牌效应。
这里我想强调一下反馈回路的重要性。我们尝试了各种错误可视化的方法,比如只签入一种构建类型,或者只在 CI 时间签入,或者在特定的构建时间签入特定的规则集。最终,在构建时启用的所有东西都赢了,因为开发人员及时收到了反馈,而且一点也不麻烦(尽管我们认为可能会有麻烦)。此外,在开发期间检查代码是不够的。在 CI 期间也必须对其进行检查。我们很幸运在编译器中内置了诊断系统——两者都是免费的——但是 CI 时间错误可视化需要一个工具。为此,我们使用了 Danger 插件,这是一个非常棒的工具,可以在创建合并请求时自动执行各种操作。从技术上讲,我们创建了一个关于编译器错误的日志,然后 Danger 对它进行解析,并发回一条关于构建健康的消息,因此我们能够将合并请求中存在的问题作为一条注释来查看。
一旦我们在 iOS 上实现了坚如磐石的框架,我们就转向了我们的 Android 应用。幸运的是,Android 自带了一个简单的静态代码分析工具,叫做 Android Lint。它是开发工具链的一部分,可以作为命令行工具使用,也集成在 Android Studio 中。基本上有一个 lint.xml,您可以在其中修改问题的严重性,您需要做的只是从 gradle 构建脚本启动 lint 检查器。
该工具会生成一份非常详细的报告,说明问题是什么、在哪里找到问题以及问题的严重性。由于描述和元数据非常清晰地阐明了问题,问题的分析变得更快更容易。此外,由于存在问题优先级,所以更容易知道先解决什么,然后再解决什么。可以计算一个警告熵,并配置构建脚本在这个熵变得更高时停止。有了这个功能,最终有可能自然地消除每一个警告。然而,由于我们侧重于主动警告删除,因为我们不需要这个功能。
Hradware ID Usage
未来计划
经过六周的努力,我们启用了 54 个错误警告标志,涵盖了我们所有的 9000 个 Objective-C 编译器警告。因为这是多个团队的努力,对公司文化也有影响。开发人员开始为新发现的问题添加标记,并自己修复这些问题。最初,修复缺陷和重构代码并不是一项受欢迎的任务。例如,有一种情况是,需要对一个模块进行完全重组。所以我们意识到保持团队精神对系统本身同样重要。我们不仅试图促进进展,还试图充分参与每一次迭代。
对于 Android,我们遵循之前的流程。因此,我们创建了一个问题列表,然后将它们一个接一个地提升到错误级别,然后修复它们。项目中的默认警告要少得多,因此我们在 5 周内修复了 1658 个警告,这导致了 52 个问题类型的使用。Android Studio 使用自己的 lint 规则集,可以单独配置。让这些 linters 相互同步是很重要的,以便在开发时而不仅仅是构建时看到新的规则集。
从我们之前的十二个版本中,有五个按时结束了;它们在预定的一周内推出。有了静态代码分析支持的一些过程变更,六个中有五个是准时的,所以我们的发布时间改进了很多,因为稳定期的问题减少了很多。
我们不会就此止步。我们计划在系统中添加新的标志,我们打算删除剩余的非客观警告,并达到零状态。一旦我们到达那里,我们将试验“零警告策略”,即没有拉请求可以与错误旁边的警告合并。也有其他工具可以试验,比如从脸书推断。更不用说符号执行是一个有待发现的广阔的新领域。o 我们将继续我们的旅程,找到那些讨厌的缺陷,使我们的应用程序更容易和更安全。
我们对未来寄予厚望。
喜欢你听到的吗?与我们合作
我们在 Skyscanner 以不同的方式做事,我们正在全球办事处寻找更多的工程团队成员。看看我们的 Skyscanner 职位寻找更多空缺。
关于作者
我叫 Gabor Bakos,是一名移动开发人员,在布达佩斯的应用支持团队工作。我们试图让我们的开发人员的生活更容易,代码质量是我多年来一直关注的一个领域。工作之外,我是一个真正喜欢游戏的 Crossfit 爱好者,也是我 3 岁的 sheltie Merlin 的理想训狗师。
Gabor Bakos
喜鹊数据科学
This behaviour may be a stereotype for magpies, but it’s often observed in humans.
避免被下一个闪亮的东西分心
有一天,当我在办公室的小厨房里煮咖啡时,无意中听到一位同事抱怨一位离职的经理。我的同事说,他只是那些喜鹊经理中的一员。他的语气清楚地表明,做一名“喜鹊经理”即使没有做哈维·韦恩斯坦那么糟糕,也肯定是不可取的。
“喜鹊总管是什么?”我问。
你知道喜鹊是什么吗?“一种用闪亮的东西填满鸟巢的鸟——喜鹊经理是人类的版本。”
这似乎很适合他的描述——一件刚来时受到广泛称赞的办公设备,但现在却闲置着,因为人们又回到了以前使用的状态。可能我们大多数人都有类似的经历,经理们根据看起来最闪亮的东西而不是最有用的东西来做出购买决定。虽然喜鹊不一定是这种行为的罪魁祸首,但很多人肯定是。
在数据科学中,当人们开始采用最新的包或工具时,同样的事情也会发生,只是因为它是最新的或带有最光滑的 UI,而不是因为它解决了一个需要解决的问题。
不幸的是,虽然可能有数据科学以外的经理在几乎没有进步的死水中工作,并且很少关注新的发展,避免受到最新和最闪亮的诱惑,但这对数据科学家来说绝对不是真的。相反,这是生活中的事实,数据科学家需要保持对事物的掌控,保持对新技术的了解。
与此同时,随着如此多的新工具和技术不断被发现和公开,很容易迷失方向。花上几个小时学习新工具独特的语法,就可以很容易地利用醒着的每一分钟来寻找最新最棒的方法,将算法速度提高几毫秒。决定哪些新技术和工具真正值得注意要困难得多。
一个直观的决定方式是寿命。虽然我们谈论的是相对较新的工具和技术,但这并不意味着我们需要在一切可用时立即行动——有机会让其他人先检查一下,看看哪些比其他人更有价值。
虽然人们认为数据科学是一个新的职业,但实际上它所包含的活动通常已经存在了至少十年——甚至深度学习算法在 2000 年代中期才开始在工业应用中获得成功。因此,许多解决特定问题的最成功的方法总是显而易见的。
另一件要做的重要的事情是考虑你投资学习一个新的软件包能得到什么回报。如果仅仅是用稍微华丽一点的界面就能做你已经能做的事情,也许好处并不值得花费。另一方面,如果你深入研究像 R 中的 ggplot2 这样的东西,你不仅仅会得到一种处理老问题的不同方法,你还会学到一种如何可视化数据的不同哲学。
没有时间去学习每一个新的软件包,或者每一项新的技术。一个聪明的数据科学家需要学会识别他们的时间用在哪里是最好的。闪亮不是一个足够好的理由来证明放弃你的时间。
在 leanpub 查看罗伯特德格拉夫正在编写的电子书,t。
专业钱:测试薪资信息对大学专业选择的影响
作者:伊莱·比尔德纳、埃里克·奥利夫、帕拉克·昆杜和瑞安·霍兰德
注:本文描述了斯坦福大学商学院 【实践中的影响衡量】 课程中的一项实验。您可以在这里 找到我们完整的项目数据、项目代码和 R Markdown 输出 。
都是关于专业的
这些天有很多关于飙升的大学工资溢价的谈论。根据布鲁金斯学会(Brookings Institution)汉密尔顿项目(Hamilton Project)的数据,高中毕业生职业生涯的平均收入为 58 万美元,而学士学位持有者的平均收入是这个数字的两倍多,为 120 万美元。麻省理工学院(MIT)经济学家大卫·奥特(David Autor)的另一项研究发现,美国男性的平均学士学位成本(扣除学费和放弃的工资)为负 59 万美元(T21 为负 30 美元)《纽约时报》记者大卫·莱恩哈特在报道奥托尔的研究时表达得很好:“是的,大学是值得的,而且还差得远呢。”
但是当谈到大学工资溢价时,平均工资掩盖了大量的差异。选择上大学是一个重大的经济决定;事实证明,选择大学专业是一个更大的问题。主修石油工程,你的平均工资是 11 万美元。主修幼儿教育,你的平均收入只有 28,000 美元。
如果选择专业“比决定是否上大学更重要”,正如乔治敦教育和劳动力中心的报告所言,为什么没有更多的学生选择像机械工程(60,000 美元)、计算机科学(83,000 美元)或应用数学(同样是 83,000 美元)这样非常赚钱的项目呢?
作为商学院的学生(因此也是高等教育的“超级用户”——不管是好是坏),我们对这个问题的答案很好奇。所以我们决定设计一个实验。
实验:提供薪资信息会影响学生的专业偏好吗?
有一种假设——在 T2 的几项 T4 研究中得到支持——认为大学在教育学生选择专业方面做得很差。所以有一个问题:如果学生们更多地了解与不同学习课程相关的平均工资,这会影响他们的专业偏好吗?
为了验证这一点,我们在斯坦福大学校园里设计并实施了一项随机实验。因为我们无法接触到一群统一的一年级学生(他们还没有选择专业),所以我们起草了一份调查,询问斯坦福大学的本科生向新入学的同学推荐四个专业——计算机科学、经济学、人类生物学和历史——的可能性有多大。(这四个专业是斯坦福大学最受欢迎的专业之一。)
为了检验我们的假设,我们准备了两个版本的调查。在第一个版本(我们的“控制”)中,我们向学生提供了一个简单的表格,报告(编造的)主要难度和满意度水平,以及(实际)授予的学位数量和所需的总单元数。(我们编造了难度和满意度的数字,这样就不会有一个专业主导所有标准——从而鼓励受访者考虑权衡。)在调查的第二个版本(我们的“处理”)中,我们提供了所有相同的信息——只是增加了一个额外的列,传达了每个专业第一年的平均(近似真实)工资数字。
Survey table: “Control” group
Survey table: “Treatment” group
在两个版本的调查中,我们都问到:“想象一下,一个即将入学的斯坦福学生向你咨询选择哪个专业。你会怎么给这四个专业排名?”作为补充说明,值得一提的是,我们没有要求学生对专业进行“评级”(比如,从 0 到 10),而是要求他们强制排名。我们这样做是为了鼓励受访者仔细考虑权衡,并避免评分者之间的可靠性问题(例如,约翰的“3”与丽莎的“3”相同吗?)
数据收集:这一切都与权力有关(和不知情的斯坦福学生搭讪)
在收集数据之前,我们首先问了一个更基本的问题:我们需要多少调查反馈?用更专业的术语来说,这个问题问的是功率,或者我们的实验能够让我们检测到治疗效果的概率——如果这种效果存在的话。虽然有太多的在线工具和统计软件包来帮助计算所需的功率,但我们转向了一种更手动的技术——一种我们在课堂上学到的技术。
在这种技术中,我们从生成样本(虚拟的)数据开始——在我们的例子中,只是一个主要排名的列表(实验“结果”)。然后,我们将样本数据的行随机分配为“治疗”或“对照”,然后通过从治疗行的平均等级中减去对照行的平均等级(结果)来计算“平均治疗效果”(或 ate)。
通过重复这一过程数千次,我们最终得到了这些(随机)比率的分布。请注意,该分布以零为中心,因为我们样本数据中的“治疗”完全是随机的,所以没有(真实的)平均治疗效果:
最后一步,我们预测我们期望看到的(真实的)治疗效果——或者更确切地说,我们希望检测到的效果。(在我们的例子中,我们预测了 0.2 个排名点的影响。)通过计算这个(预测的)实际 ATE 位于随机分布内的概率,我们得到 p 值。如果这个 p 值低于 0.05(表明在 95%置信水平下的统计显著性),我们的实验应该(或多或少)足够有力。
Random distribution with n = 400 and p-value ≈ 0.036.
使用这一程序,我们确定我们需要大约 400 名学生的样本量来获得具有统计学意义的结果(同样,假设效果大小为 0.2 个排名点)。不幸的是,考虑到项目的时间限制(以及我们需要从商学院毕业),与 400 名斯坦福大学本科生搭讪似乎不是特别可行。幸运的是,测量影响大卫·布鲁克曼教授同情我们,要求我们简单地收集 60 个数据点(每个治疗组 30 个)。至少,这似乎是一个合理的起点(尽管我们需要看到更接近 0.5 个排名点的效果才能在这个样本量上达到显著性)。
大约一个星期后,在学生会和体育馆外(礼貌地)追捕本科生后,我们得到了 60 份调查回复(30 份控制回复和 30 份治疗回复,都是在 Random.org的随机数生成器的帮助下随机分配的)。
Good clean fun.
随机检查:寻找无意义
在考虑我们的待遇(显示工资信息)可能对我们的结果(主要偏好)产生的任何影响之前,我们首先进行了一项随机检查。
简而言之,随机化检查是一种工具,用于验证我们的随机化过程——将受试者分配到治疗组或对照组——是否有效。为了方便起见,我们已经收集了(作为调查的一部分)关于我们实验对象的额外信息——特别是关于他们的性别、斯坦福学年、所选专业和家庭收入的信息。然后,我们对这些协变量(可能预测研究结果的变量)在我们的治疗分配上进行回归,看是否有任何这样的协变量对治疗组有预测作用。如果我们的协变量可以预测治疗组成员,这将告诉我们我们的随机化失败了。虽然我们确实看到了一个协变量(性别)的轻微显著性,但回归的总体 p 值(p = 0.1691)并不显著:
数据分析:回归时间到了
随着我们的随机化验证,我们准备好挖掘数据。为了开始我们的分析,我们首先对每个专业的学生排名进行了回归分析。例如,我们对历史的回归是这样的:
由于在这里没有发现显著性(也没有发现任何其他单独的主要回归),我们尝试了另外两种方法。首先,我们观察了薪水最高的专业(计算机科学)和薪水最低的专业(历史)的相对排名,以及这种差距是否从控制变成了治疗。在第二次回归中,我们观察了我们的待遇对受试者排名第一的专业的工资的影响。
Regression output: Effect of treatment on high-to-low salary ranking differential
Regression output: Effect of treatment on salary of top-ranked major
与直觉相反的是,这一最终回归显示,相对于对照组,治疗组排名第一的专业的平均工资下降了(大约 700 美元)。但是,这两种回归都没有提供任何接近显著的结果。例如,在最后一次回归中,我们 95%的置信区间——或者说,95%可能与真实效应重叠的值的范围——从超过 10,000 美元到正 8,860 美元,标准误差接近 5,000 美元。(我们的协变量虽然也不为零,但也不显著。)
因此,对于薪资信息是否会影响主要偏好这一指导性问题,一个令人失望(但并非完全不可预测)的答案是:我们不知道。
讨论:我们是如何得到如此无聊的结果的?
如果你已经做到了这一步(谢谢你,大卫),你可能会奇怪我们怎么会得到这么无聊的结果。为了回答这个问题,我们将首先引导您进入第 2 部分(“数据收集:一切都与权力有关”)。
我们知道进入实验时,我们可能需要更大的样本量来(显著地)检测效果。我们的主要水平回归导致了 0.001-0.1 个排名点的(非常不显著)效应大小。如果这些效应是真实的,我们将需要成百上千的额外数据来自信地这么说。
另一个可能的陷阱是我们的实验设计:为了传达工资信息(给我们的治疗组),我们将一列工资数据楔入一个已经很忙的表中——一个我们的测试对象可能很容易忽视或忽略的表。如果治疗对象没有注意到关于主要工资的信息,他们不太可能受到它的影响。
为了测试这一点,我们在调查中加入了一个叫做操纵检查的项目。作为最后一个调查问题,我们要求学生估计我们研究的四个专业的工资。(治疗受试者可以在他们的数据表中访问这些信息;对照组没有。)
对于历史和经济,我们的操纵测试似乎通过了;治疗组的受试者给出的答案与我们给出的数字接近,而对照组的受试者给出的数字则非常不同。但是对于人类生物学和计算机科学来说,我们的操纵测试失败了:治疗组并没有比控制组在工资估算上更准确。这表明(至少对这两个专业来说)受试者可能没有注意到我们提供的工资信息——或者他们可能不相信我们的数字,而是利用他们自己对真实工资水平的先入为主的概念。
*Manipulation check results (**Denotes statistical significance at the 95% confidence level)
但是还有第三种解释。我们的实验是基于这样一个假设,即学生在选择专业时关心薪水。但也许这是不对的。也许学生更关心其他事情(他们是否喜欢这门学科,父母或朋友是否学习过该专业,该专业是否需要大量工作),而不是工资。
一些现有的学术工作指出了这一解释。例如,Wiswall 和 Zafar 的一篇论文发现,“不同的品味”——而不是“预期收入”——是“选择专业的主导因素。”我会有多喜欢这门课程?课程有多难?我的朋友是专业的吗?这些问题的答案可能比对预期收入的估计更与大学生相关。
我们的实验还有很多地方可能出错。例如,考虑到我们要求受试者向朋友推荐一个专业,而不是自己考虑一个专业,我们的治疗效果可能特别微弱。但是,也许这个——找到一个可靠答案的困难——是我们这个小项目最大和最重要的收获。尽管在实验设计上花了不少精力,走街串巷收集调查反馈,并编写代码分析结果,但我们没有得出有意义的结果。正如我们所知,这通常是实验过程的一部分。改变行为,检测效果——这些事情很难。如果你要设计一个实验,你需要适应不回答的模糊性。
感谢大卫·布鲁克曼,GSB 大学教授和测量实践中的影响的策划者。还要感谢 60 名斯坦福大学的本科生,他们每个人都花了 3 分钟来推动科学的发展(但主要是帮助我们毕业)。
建立法国国家能源消费预测系统
读者们好,在这篇文章中,我将解释我创建法国(大都市)能源消耗预测系统的方法。这种问题或多或少与我在 EDF Energy 的部分工作有关,但这项工作是我在业余时间完成的,以完成我的机器工程师纳米学位。
在这篇文章中,将会描述这个项目所使用的数据,解释用于进行每日消耗量预测的方法以及半小时版本。
数据集的探索
在这种情况下,创建模型的数据来自:
- 法国能源网络经理 RTE 他们已经创建了一个开放数据平台来访问网络上的不同数据集
- GEOFLA 数据集给你这个城市和这个地区居民数量的信息
- 地下天气。我不得不从网站上删除这个数据源(我将重点放在机场的气象站上),并选择在 RTE 测量的时间段内有足够数据的气象站。我将数据分析的重点放在室外温度和风速上。
对于天气状况,我选择创建一个国家气象数据集,其中基本上每个地区都有相关的气象站,这些气象站根据该地区的人口数量进行加权(该信息来自 GEOFLA 数据集)。为了进行数据分析,我选择将 RTE 消耗的平均功率转换为能量(MWh)。
下图显示了法国过去几年的平均能耗。
该图说明了法国能源消耗的季节性。
之后,为了进行每日规模的预测,我必须汇总数据。在下图中,显示了热图中以不同比例聚合的每日数据。
一年中某一天的小时效应研究
对一年中某个月和一周中某一天的消费的研究。
这两个数字很好地说明了每天的消耗量与一年中的某一时刻和一周中的某一天有关。但是这种认识不足以创建预测模型,用于预测能耗的一种非常流行的方法是研究日平均室外温度函数中的日能耗。这种技术被称为电源温度梯度的 PTG,你可以找到很多基于这种方法的出版物。
下图显示了用于预测的模型。
该模型是分段回归,冬季部分由线性回归表示(包括供暖需求和电器),夏季部分由恒定部分表示(仅电器)。这个模型将成为下一部分的参考模型。
日预报
为了创建模型,数据集将在训练集和测试集之间拆分,为这些集选择的样本将是随机的。这代表着:
- 训练集的 2337 个样本
- 测试集的 585 个样本
这是一个回归问题,因此将测试 scikit learn 的以下模型:
这是个人对不同模型的选择,还有很多其他模型可以尝试,但作为开始,我认为这已经足够了。我必须调整不同的模型并找到最佳的参数,我在训练集上使用了 k-fold 方法(我创建了 10 个 fold)来测试不同的参数。我邀请您查看我的报告,了解不同型号的参数选择。
为了测试模型中输入的影响,我测试了不同的输入:
- 仅室外温度
- 室外温度和风速
- 室外温度和一年中的月份以及一周中的日期
为了便于输入的使用,我必须对集合进行归一化。为了评估模型的准确性,我使用了用于回归问题的 r 评分标准。但是这个指标不足以评估算法的质量,我将使用的第二个指标是创建模型的时间。下表显示了 r 分数随所用模型变化的情况。
该表允许给出以下结论:
- PTG 是一个相当好的模型,对于一个仅基于室外温度的模型,分数是好的,但是基于树的模型和神经网络也提供了好的结果
- 风速的增加提高了分数,但是增益非常小
- 这一增加为每一个测试模型的分数提供了一个有趣的增益
但是正如我之前所说的,r 分数是不够的,在下表中,在将时间特征添加到初始输入的情况下,有时间来创建模型。
该表说明 PTG 具有良好的性能,而神经网络在速度方面非常差。多项式回归也应该避免。但是这两个指标不足以评价模型的效率。应该研究训练集大小的影响。下图说明了训练集的影响。
该图向我们表明,训练集的大小对多项式回归器有明显的影响,因此其他模型似乎影响较小(神经网络相当快地显示出良好的效率)。
半小时预报
对于这一部分,我们将使用以前发现的所有结果(本质上是时间特征的使用)。我将测试与每日预测相同的模型,并使用相同的指标。
我的基准模型将是 ARIMA 模型,这种模型在预测时间序列方面非常流行(但不需要随机化集合)。这些套件包括:
- 训练集的 112176 个样本
- 测试集的 28080 个样本
在我的问题中,模型的结果是坏的。下表总结了基准模型和其他测试模型的结果。
这张最终表格向我们展示了基准模型是很容易被击败的。神经网络的构建非常缓慢,但两个模型似乎非常适合用于我们的问题:
- 决策树回归器
- K 近邻
结论
这项工作用于完成我的纳米学位,这是我的方法,不是唯一的方法,我认为有很多东西可以尝试,比如深度学习方法或强化学习方法。
我邀请你使用这个项目的数据集来尝试创建你自己的(更好?!)模型,如果您有任何意见,请写在下面。
原载于 2017 年 10 月 20 日【the-odd-dataguy.com。
使用机器学习快速创建一个大规模、可搜索的在线服装店
https://pixabay.com/en/people-woman-girl-clothing-eye-2563491/
你没有时间学习如何制作机器学习模型,你是一个忙碌的企业家!您需要快速获得最低限度可行的产品,并为您的客户解决一些用例。由于人工智能和机器学习的民主化,你可能会比以前更快地达到 MVP。
让我们假设你在你的网站上卖很多衣服,但是你不一定有时间给每一张新图片贴标签。
人们可能会在 Instagram 上提交他们穿着你的衣服的照片,或者你可能想简单地让编目过程变得容易得多。
这是机器学习的完美用例。这里有一个我会如何解决它的例子。
Training set
- 获取尽可能多的你想分类的服装样本图片。例如,我下载了数百张牛仔裤、裤子、衬衫、t 恤、运动衫、裙子、连衣裙和围巾的照片。
- 我用的是 startup 的对象识别模型 Tagbox ,因为下载和运行只需要 3 分钟左右。另外,我可以教它它还不知道的东西,让它变得更聪明。
- 然后,我使用一个小脚本来迭代我所有的照片,并告诉 Tagbox 它们是什么。
- 现在有趣的部分来了。然后我去拿了一套新的完全随机的服装图片。重要的是,这个新的测试集没有任何相同的照片,因为那些用来教 Tagbox。我下载了这一套,运行一个脚本,通过 Tagbox 运行每个新图像,瞧:
A sample of my results
Tagbox 已经正确地将正确的关键字与正确的产品/图片关联起来。我现在可以处理无限数量的服装图片,并提取可搜索的标签来增强我的产品。
底线是我只花了大约一个小时构建基础设施来测试这种能力。这证明了像机器盒子这样的开箱即用机器学习公司带来的人工智能民主化。
通过了解数据可视化的历史和最新趋势,对现实世界产生影响
作者安迪·克拉科夫
可视化数据的想法——也就是说,将数字转换成插图,让所有人都可以获得发现——必须从某个地方开始,对吗?事实上,我们可以指出数据可视化开始的具体时间。
这是第一个出版的条形图,由威廉·普莱费尔于 1786 年为一本苏格兰贸易地图集创作。
First published bar graph, created by William Playfair in 1786 for an atlas on Scottish trade
Playfair 也因提出了线形/趋势图和饼状图的想法而受到好评。对于职业来说还不算太寒酸!
下面的地图也在数据可视化中发挥了重要作用。1854 年,在伦敦索霍区,爆发了一场严重的霍乱,如果不是约翰·斯诺确定是污水——而不是像一些人推测的那样,是糟糕的空气——导致了霍乱,我们也许不会知道。他创建的地图上,每座房子代表一个被霍乱侵袭的个体,这确实改变了我们“看待”疾病的方式(他提到的布罗德大街上的水泵是霍乱爆发的源头)。
Map of pump on Broad St. in London which was the source of the cholera outbreak of 1854
到 20 世纪 50 年代,数据可视化在美国报纸中足够普遍,至少有一家报纸——纽约时报——对数据感到足够舒适,即作为一种常见的方言,将我们今天称为仪表板的图表汇编在一起。
New York Times compilation of graphs which today would be referred to as a dashboard
(你可以在斯图尔特·汤普森的博客文章中看到更多关于 20 世纪 50 年代《纽约时报》图片的内容。
这些是数据可视化在塑造社会变革中发挥重要作用的早期例子。然而,我认为,自这些里程碑事件以来,数据可视化并没有发生很大的变化。是的,现在我们定期生产漂亮的数据交互,会让威廉·普莱费尔头晕目眩。但在更基本的层面上,数据可视化是否被社会部门用作教育和说服的工具?我们制作的地图和图表是否真正提高了人们对问题的认识,为政策决策提供了信息,并赋予了社区权力?
在这一点上,我认为记录有点不稳定。本质上,多年来我们已经认识到与数据交流不是一件容易的事情;你不能只是创建一个简单的图表,并把它放在自动驾驶仪上来执行你的命令。然而,这些天出现了一些重要的趋势,我们可以指出并集体学习。以下是我最近观察到的数据可视化的一些重要进展:
将数据转化为游戏和智力练习
谁说数据总要这么严肃?我注意到一种趋势,即组织将数字转化为游戏(或者智力练习,如果你想更精确地描述它的话)。以《纽约时报》的互动为例,他们邀请你,读者,猜测死亡原因的趋势,首先是艾滋病毒、枪支和车祸,然后是药物过量,然后看看你与猜测线图的移动有多接近。
Screenshot of interactive NYT data visualization which is an example of turning data into intellectual exercises
仔细想想,这个概念真的很基本:毕竟,它只是你正在画的一个趋势图。但关键是你在画它,而不仅仅是观察它,这样做,可能更有可能记住信息。一个简单执行的数据游戏是这个 538 关于枪支的民意测验;另一个是由 Velir 与我们的客户之一——联邦基金——合作创建的,它询问并让用户回答问题如果你们州的医疗保健得到改善对个人意味着什么。所有这些都表明,这种趋势有点超出了我们的舒适区,数据总是如此严重,并将数字转化为一些游戏的机会。
让大量的数字看起来有关联
事实证明,我们人类并不擅长真正理解一个大数字的大小,比如一百万,甚至一万。你可能认为我们会从媒体上如此频繁地阅读这些数字来理解这样一个范围。问题是,我们在日常生活中通常不会“看到”这样的数字。因此,大数字对我们来说就像是抽象概念,我们在智力上理解它们,但并没有真正“感觉”到它们。有鉴于此,数据可视化越来越有助于读者更好地理解大量数据。以《华盛顿邮报》的这个例子为例,你可以点击数字,向下滚动人物页面,看看 1077 名在大规模枪击中丧生的人的真实情况。
Screenshot of interactive data visualization of individuals killed by mass shootings
在一个更有趣的话题上,布丁研究了在纽约市音乐界成名的可能性(不太可能),大约 3000 支乐队在三年时间里在纽约市举办了多场演出。《华尔街日报》通过让读者滚动屏幕上的 2.92 亿个点,向读者展示了赢得彩票的微小几率。当我们构建数据可视化时,重要的是要记住,简单地说一个大数字可能不会产生你想要的影响。“展示”这个庞大的数字可能也是必要的。
动画数据
毫无疑问,我们都遇到过数据以某种方式“移动”的情况——从开始的一年开始构建的趋势图,一次出现一个的条形图。我曾经认为动画数据的概念是一个噱头,但后来我看到了它可能产生的影响。例如,当我在露西尔·帕卡德儿童健康基金会工作时,我曾经展示过一份关于加州各县青少年出生率下降的报告。谷歌让我很容易地制作出一个条形图来显示随着时间的变化(本质上,你正在看一个变大或变小的条形图),我可以在我的演示中告诉人们这个简单的动画“技巧”是如何帮助人们更好地理解和保留数据的。
类似地,当我在加州医疗保健基金会时,我的沟通同事们开始整理总结国家医疗保健支出历史趋势的年度可视化图,许多在医疗保健政策领域工作的人对此很熟悉,甚至有所预期。随着时间的推移,这种可视化趋势变得清晰,也许比这些数据以简单的线形图呈现更清晰。例如,请注意橙色阴影区域,它代表自付费用。你可以看到,从 1961 年到 2016 年,这种下降有多明显。
Screenshot of visualization summarizing historical trends in national health care spending in 1960
Screenshot of visualization summarizing historical trends in national health care spending in 2016
说到医疗保健,这是另一个数据动画的例子,其中动画不是故事的核心,但当你浏览这篇关于为什么美国在医疗保健支出方面领先世界的文章时,你会看到精心设计的平滑的可视化动画如何以更有效的方式讲述这个故事,让读者参与进来。
人性化的数字
另一个需要关注的趋势是人性化数据。从历史上看,我们倾向于将数据和故事分开,就好像你只能拥有其中一个,而不能两个都拥有。但这不是我们处理信息的方式。在某些情况下,我们被事实所说服,而在其他情况下,个人因素——例如,一张令人心酸的照片、一段有助于渲染数据的引言、一个受影响家庭的视频——有助于证明这一点。有鉴于此,重要的是我们用故事元素在更广阔的画布上描绘数据,这有助于使数字人性化。这里没有神奇的公式。一些数据故事以事实作为主要的叙事镜头,效果很好,而另一些故事则占据上风,到处插入数据以帮助增加清晰度。
例如,我所在的组织 Velir 与一家名为 Purpose 的通讯公司合作,展示了有多少美国员工是倒班工人,这意味着他们不知道自己每周的日程安排。我们主要通过数字讲述这个故事,但 Purpose 有引用甚至视频,我们可以将它们插入到包中,以帮助演示轮班工人面临的问题。
Data viz created by Velir for communication firm Purpose showing how many US employees are shift workers
读者输入
我在上面提到了将数据转化为游戏的趋势,这是为了创造一种更具参与性的体验。也有更简单的方法来邀请读者转换数据内容。在这篇 Vox 文章中,例如,读者选择他/她出生的年份是为了改变故事中的数据。
Vox article data viz which allows reader to select year of birth to change data in story
《华盛顿邮报》在这篇关于性别薪酬差距的报道中采取了类似的方法。向下滚动选择一个职业,查看相关数据。通过提供一种精心策划但又量身定制的体验,这些故事让读者更有可能根据信息采取行动,因为他们已经被邀请根据自己的兴趣对信息进行个性化设置。
你可能会对自己说,这些例子中有许多是由主要新闻媒体创造的,这些媒体拥有讲故事的专业知识,并且越来越多地拥有一批他们可以求助的互动艺术家和数据可视化专家。毫无疑问,像《华盛顿邮报》和《纽约时报》等新闻媒体在可视化方面处于领先地位,用数据做其他社会部门组织难以完成的事情。但是我们不应该试图模仿——当我们做不到时,就放弃对数据显示的创造性。相反,我们应该更好地向领导者学习,将这些趋势转化到我们自己的工作中,即使是以最基本的方式。我们总是渴望帮助组织解决他们能做什么的难题,因此欢迎您联系我们。
最后,有一个我们都可以实现的重要趋势:保持实用。例如,在构建之前与用户交谈,以了解他们希望如何处理信息。在 Velir 的数据工作中,我们听到越来越多的客户希望创建可打印的数据视图,例如一个包含上下文信息和图表的单页 PDF 数据表。这里的想法是,虽然漂亮的交互看起来很棒,并且起着重要的作用,但我们的客户也需要一些有形的东西,在会议期间分发给人们,并带回他们的办公室。即使在这个数字时代,仍然很少有什么能比得上与一张纸互动。这可能是更有趣的发展之一——也就是说,我们越是推进数字信封,我们就越可能认识到可靠的方法仍然有重要的地位。
关于作者
Andy Krackov, VP, Data Strategy
Andy Krackov 是 Velir 的数据战略副总裁。他的专长是数据内容战略家,可以将数据翻译给多个受众,以便为决策提供信息,提高公众对问题的认识,赋予社区权力,并实现其他有意义的社会变革。他曾在与数据相关的国家和州委员会任职,在关于有效使用数据的主要会议上发表演讲,并为该主题的多个出版物撰写文章。他最初是《美国新闻与世界报道》的记者,拥有华盛顿大学的历史学学士学位和斯坦福大学的传播学硕士学位。
关于 VELIR
我们是一家完全整合的数字机构,总部位于马萨诸塞州萨默维尔市的波士顿郊外。我们拥有一支由 130 多名数字专业人员组成的团队,以我们为一些世界上最大和最有影响力的非营利组织、会员协会和财富 500 强企业所做的数字工作而闻名。我们在营销技术和数据可视化方面的能力是业内公认的最佳水平,这源于 17 年来对数字战略、创意设计、网络工程和应用程序开发的专注。我们已经完成了复杂的实施和大规模的品牌建设,包括拜耳,罗伯特·伍德约翰逊基金会,大都会艺术博物馆,美国退休人员协会,耶鲁大学和信息。我们被大波士顿商会和萨默维尔商会授予“年度小型企业”荣誉称号,并在波士顿和华盛顿州 DC 设有办事处。更多信息,请访问www.velir.com。
“让业余无线电再次变得酷起来”,人工智能先生说。
一个为业余无线电通信建立语音识别系统的项目。
系统设置:
我对着 Baofeng 手持无线电收发器说话,DIY 天线拾取无线电波,SDR 将无线电信号解调为标准音频信号,Google 语音到文本执行语音识别,Smith-Waterman 算法执行序列比对以在数据库中找到最可能的呼号,AJAX 用于本地 httpserver 以输出文本。系统图如下所示。
System diagram for the voice recognition system for amateur radio communication
这是演示。它成功地从数据库中找到最可能的呼号,并捕捉到“监控”消息。
Demo
硬件(天线、SDR 加密狗、调频无线电收发器):
我将 0.5 米(~波长/4)的铜线连接到连接器上,形成我的天线。我从亚马逊购买所有的连接器,从当地的五金店购买铜线。
天线的零件有
- 直径为 0.15 毫米的 0.5 米铜线
- 超高频母插孔焊料 SO-239
- 射频同轴电缆适配器 F 母头至超高频公头 PL-259 连接器
- 母到公连接器射频同轴适配器
- DHT 电子射频同轴电缆组件 N 公头至 MCX 公头直角 6 "
我用的是手持 FM 无线电收发器(宝丰 UV-5R v2+)进行业余无线电传输。NooElec SDR dongle 用于接收来自天线的信号,并将其发送到我的笔记本电脑。它们都可以在亚马逊上买到。
完整的硬件设置如下所示。
Hardware setup : antenna, SDR dongle, FM radio transceiver
软件定义无线电/数字信号处理:
根据维基百科,
软件定义无线电 ( SDR )是一种无线电 通信系统,其中传统上以硬件实现的组件(例如混频器、滤波器、放大器、调制器 / 解调器、检测器等)。)而是通过个人电脑或嵌入式系统上的软件来实现。
我用 SDRSharp 做所有的信号处理和转换。下面是一个正常工作的 SDRSharp 的屏幕截图
Digital signal processing
语音识别:
我使用谷歌语音转文本 API 进行语音识别。
以下是片段。
Speech recognition
但正如演示中所示,谷歌语音到文本似乎有点挣扎,并产生一些错误。这可能是由于背景中的噪声。我认为,如果一个人可以用从真实的业余无线电谈话中获取的训练集来训练一个深度网络,这可以得到改善。
史密斯-沃特曼算法;
语音识别系统很可能会出错。我通过保存一个呼号数据库来缓解这个问题。数据库可以用来自各种来源的数据来构建。比如飞机无线电通信,dump1090 就是一个很不错的程序,可以通过解码 1090MHz 上发送的消息来捕捉飞机的信息。可选地,可以简单地使用日志,该日志存储经常使用本地中继器的人的呼号。
一旦我们有了呼号数据库,我们就可以使用史密斯-沃特曼比对算法来找到最佳匹配。
以下是片段。
Swith-Waterman algorithm
异步 JavaScript 和 XML(AJAX):
为了实时更新,我使用 AJAX。AJAX 支持从包含呼号/演讲/时间戳的文件中自动获取信息。
我通过在终端中键入以下命令,在本地使用一个简单的 httpserver。
python -m SimpleHTTPServer
网页的代码片段如下所示。
AJAX
网页截图如下图。
Webpage output
最后的话
许多人说业余无线电爱好正在消亡。我觉得这很可悲,因为人们可以用它做很多有趣的事情,尤其是当它与更新的技术(如人工智能)结合在一起时。所以,我决定参与这个项目,并与大家分享。我希望你会觉得有趣。
让信息变得美丽
我们生活在一个信息过载的世界。每分钟生成、收集和存储的数据量都在呈指数级增长。
虽然我们拥有比以往任何时候都多的信息,但用数据讲述引人入胜的故事并没有变得更容易。
毕竟,数字很无聊。当你开始展示数字和图表的时候,你就失去了你的听众。
数据叙事的挑战催生了信息可视化。统计图表的起源可以追溯到 19 世纪,最初是由威廉·普莱费尔发明的,用来说明复杂的问题,比如英国和其他国家之间的进出口差异。遵循 Playfair 的做法,人们很快意识到信息图表在交流大思想方面的力量。
原因?我们天生就是视觉的。科学已经证明视觉是我们所有感知系统中最强大的认知系统。我们大脑中 90%的输入是视觉的。人们能记住他们看到的 60%,但只能记住他们读到的 40%。
如今不同的是从功能性图表和图形到更漂亮的交互式信息图的转变。无聊的设计越来越不能吸引我们的观众;人们渴望更多艺术般的视觉效果。对于绝大多数非设计师来说,挑战在于努力在美观和功能之间取得平衡。
在我们探索如何理解所有信息的过程中,我们询问了 25 位专家关于如何讲述视觉上引人注目的数据驱动的故事的最佳建议。我们希望这些专家的建议能帮助你以一种引人入胜的方式交流数据驱动的信息。
Created using Visme. An easy-to-use Infographic Maker.
将信息图嵌入到您的网站: <div class = " visme _ d " data-URL = " rx 13 GWP 8–25-expert-tips-on-how-to-make-information-beautiful-7 " data-w = " 800 " data-h = " 13120 " data-domain = " my "【t33
下载信息图 为图片
加雷斯·库克
普利策奖得主记者,《纽约时报》特约撰稿人,畅销书系列最佳美国信息图的编辑,告诉我们讲故事的重要性:“永远不要忽视最重要的问题:你想讲的故事是什么?”
阿尔贝托·开罗
《功能艺术》(The Functional Art)的作者,迈阿密大学传播学院视觉新闻学的 Knight Chair 说:“让信息可视化的关键是首先拥有好的信息:不是推动你的议程或帮助你销售产品的信息,而是有可能改善人们生活的信息。”
阿尔贝托·开罗说,当一个人收集了正确的信息后,剩下的事情就自然而然了。“简单的部分是,信息需要以人类可以理解的方式呈现,选择地图、图表、图形和图表。”
史蒂文·海勒
史蒂文是许多关于设计和视觉文化书籍的作者,包括《信息图设计师速写本。33 年来,他一直是《纽约时报》的艺术总监。他是作为作者部门的 MFA 设计师的联合主席,SVA 总统新项目的特别顾问。他告诉我们:“图片不是文字,但文字应该来源于图片。无论是在文本中还是在思想中,这两者必须齐头并进。"
布莱恩·华莱士
布莱恩是一名信息图学者,也是屡获殊荣的信息图设计机构 Nowsourcing 的创始人。他还是 CMS Wire &搜索引擎杂志的专栏作家,并担任谷歌中小型企业顾问。他的建议是:“视觉叙事艺术是简洁的文字、引人注目的数据和古怪但美丽的设计的正确结合。”
比安卡·伍兹
比安卡是 L&D 设计工作室 Clever Raptor 的联合创始人,也是 BMO Financial 的设计和沟通顾问。她说,可视化信息的重要一点是“保持事情简单:当你试图用视觉简洁地表现数据时,编辑掉任何不会强烈增加整体清晰度的细节。”
蒂亚戈·贝洛索
关于信息图表和数据可视化的领先博客的创始人。他将数据可视化视为一种艺术表达形式:“数据可视化提供了一种主流的跨普遍性,只有音乐等艺术表达才能实现——没有所有艺术形式固有的解释主观性。”
比尔·山德
Bill 是一位著名的视觉传达和数据故事的演讲者和作者。他是总部位于波士顿的数据可视化和信息设计咨询公司 Beehive Media 的创始人。
根据他在知名公司工作的经验,比尔说可视化信息最重要的是知道你真正想说什么。“如果你知道你想强调 X,或者在 A 和 B 之间画一个对比,或者强调主题 Z,你的视觉效果应该 100%集中在主要的沟通目标上。”
朱利叶斯·威德曼
朱利叶斯是《设计与流行文化》的首席执行主编,同时也是 TASCHEN 的设计负责人和数字出版物总监。他主编的书《信息图形》。他的建议是:“人类无时无刻不在用隐喻思考,所以如果你能找到一个或多个隐喻来让复杂的事情变得容易解释,从而让人们理解,你就在正确的道路上。”
王女士
Dona 在金融图形方面有 20 多年的经验。她的职业生涯始于《纽约时报》的商业图形编辑,后来成为华尔街日报的图形部门主管。她是“ 华尔街日报信息图形指南 ”的作者,这是一本关于通过图表和图形进行交流的注意事项的书。她说,视觉化翻译信息的关键是“理解、编辑和简化信息——并以读者为中心进行设计。”
克里斯塔·内赫
Krista 是 Boot Camp Digital 的首席执行官和数字营销专家。她写了本书《傻瓜的视觉社会营销》。谈到在讲故事时使用信息图,尤其是为了营销目的,Neher 说:“视觉效果应该阐明和简化你的故事。正确的视觉效果应该比文字更好更快地讲述你的故事。不是每张图片都抵得上 1000 字。让你的人生有价值。”
科尔·努斯鲍默·克纳弗里奇
科尔是“用数据讲故事:商业人士数据可视化指南”的作者,也是热门博客storytillingwithdata的所有者。她关于在商业环境中使用数据讲述故事的建议是:“永远不要简单地展示数据;相反,让数据成为一个总体故事中的关键点,并利用它来推动你的受众采取行动。”
瑞士出纳员
Swizec 是一个数字流浪者,全栈 web 工程师,也是用 d3.js 实现数据可视化的作者。他说,将数据转化为视觉效果的关键是“在你的数据中找到惊喜,并将其作为标题。”
本杰明·维德凯尔
Benjamin 是瑞士设计工作室 Interactive Things 的主管,专门从事用户体验设计和数据可视化,同时也是瑞士数据可视化和信息图表资源网站https://datavisualization.ch/的编辑。他的建议是:“我们不是为数据而设计,而是为人类而设计。因此,在设计可视化时,我们必须考虑读者和他们的背景。”
西尔维奥·达席尔瓦
Silvio 是一位经验丰富的数字媒体数据设计编辑和创意总监,曾与美联社、汤森路透、NBC 环球等主要新闻网络合作。西尔维奥说:“数据可视化设计描绘了内容和背景——一个只能用数据创造的故事。”
伊娃·阿布舍-尚茨
国家地理儿童媒体视觉识别副总裁 evas。她在创作《数字:110.01 充满统计数据和数字的酷信息图表》中发挥了关键作用,这本书通过引人入胜的视觉效果将世俗知识带给孩子们。
当被问及如何为有视觉倾向的观众完成这样的壮举时,伊娃说:“当视觉信息分层时,它可以为读者创造一个切入点;你的切入点越多,吸引观众的机会就越多。”
兰迪·克鲁姆
Randy 是 InfoNewt 的总裁,info newt 是一家信息图表设计公司,他也是热门博客 Cool Infographics 的所有者,这是信息图表设计灵感的主要来源。他撰写了《酷信息图:数据可视化和设计的有效沟通》一书,这是一本关于如何创建信息图的综合指南。
兰迪强调了颜色的重要性:“使用颜色来突出数据的洞察力,并将读者的注意力吸引到设计的关键信息上。"
斯科特·阿丁顿
斯科特白天是营销总监,晚上是历史迷。作为《T4:第一次世界大战 100:信息图表中的第一次世界大战》一书的作者,他寻找新的、创新的方式,用令人惊叹的视觉效果来讲述历史。
他建议使用视觉效果作为容易忘记和容易记住的内容之间的关键区别:“一条信息的引人注目的视觉效果可能是被忘记的内容和被记住并分享的内容之间的区别。”
米丽娅姆·奎克
Miriam 是一名专门研究信息可视化的研究员。她的作品出现在 BBC.com,英国文化委员会,大卫·麦克坎德斯(informationisbeautiful.net),连线英国。
她从研究的角度谈到了如何选择和表示数据:“理解信息想要采取的形状——这就是你的可视化应该是什么样子。”
他建议使用视觉效果作为容易忘记和容易记住的内容之间的关键区别:“一条信息的引人注目的视觉效果可能是被忘记的内容和被记住并分享的内容之间的区别。”
大卫·麦坎德斯
David 因其数据新闻工作和畅销书“信息是美丽的”而在数据可视化领域广为人知。他的新书“知识是美丽的”以他之前的工作为基础,更深入地探讨了世界如何与可视化数据打交道。
大卫在 Reddit AMA 网站上说,一旦你理解了数据,故事就应该从数据中浮现出来:“当你可视化时,你真的不设计数据。你设计你对数据的理解。”
他在下图中总结了良好可视化的要素:
詹姆斯·鲍尔
詹姆斯是 BuzzFeed 英国和 T2 的特约记者,之前是《卫报》的数据记者。他还撰写了“世界信息图表史”,这本书以美丽的视觉效果带你穿越 138 亿年的历史。
詹姆斯在接受 ichart.net 采访时说:“可视化非常有趣,因为它是关于找出让信息变得令人兴奋的最佳方式。”
佩曼·泰伊
Payman 是拖拽式视觉内容工具 Visme 和网页设计公司 HindSite Interactive 的创始人。根据多年的设计经验,Payman 建议在可视化信息方面,“尝试少即是多的方法。将复杂的数据缩短为一口大小的可吃的内容,并将它们转换为步骤,如阶段。”
弗朗切斯科·弗兰奇
弗朗西斯科是一位获奖的平面设计师、记者和教授。他是两本书的作者:智能生活方式杂志——智能编辑设计、想法和新闻和设计新闻——改变编辑设计和信息图形的世界。
他对我们视觉化翻译信息的建议是:“形式和内容必须协同工作,传递一个令人愉快、有用和信息丰富的想法”。
内森·尤
Nathan 是一个非常受欢迎的数据可视化博客 flowingdata 的作者。他是一名统计学家和信息设计师,经常用个人数据做实验。他还写了本书把这个和的数据点可视化。
他对通过数据尤其是个人数据讲故事的见解是:“我们可以让它人性化,突然之间,人们会听到并理解这些数据是关于他们的。”
艾米·巴利耶特
艾米是黑仔信息图的联合创始人和所有者,这是一家位于西雅图的精品设计机构,为微软、波音、Adobe、尼康、星巴克和联合国等客户设计了 3000 多幅信息图、动画和互动图形。
Amy 分享了她对视觉传播世界发展方向的预见:“我们正朝着一个互动的世界前进,在那里我们将看到更多的视差滚动信息图和动画运动图”。
尼古拉斯·费尔特龙
尼古拉斯是一名信息图 设计师和个人年度报告的作者,该项目自 2013 年以来每年都对他自己的个人数据进行可视化和反思。他是Daytum.com的联合创始人、报告 ap p 的联合创始人,曾是脸书的产品设计团队成员。
关于信息设计,费尔特龙说:“形式、颜色和排版必须一起工作,以达到平衡,并传达你想说的话。”
将信息转化为漂亮的设计可能是一项艰巨的任务。
在 Visme ,我们致力于让您轻松进行视觉交流。现在,每个人都可以使用拖放 DIY 工具在几分钟内创建交互式演示和信息图。
不需要设计培训。
你可以在我们的 视觉学习中心 查看更多实用的技巧和灵感,或者注册我们的时事通讯,让专家提示发送到你的收件箱。
我们即将推出激动人心的节目,帮助您将枯燥的数据转化为美丽的视觉效果。敬请期待!
了解卡尔曼滤波器
这份材料来自我在 Udacity 自动驾驶汽车项目中获得的知识。特别感谢巴斯蒂安·特龙和奔驰工程师的讲座。
Source: https://www.codeproject.com/Articles/865935/Object-Tracking-Kalman-Filter-with-Ease
什么是卡尔曼滤波器?
我的(简短且更普通的用户友好的)回答:
-预测位置和速度,有一些不确定性。
-然后测量实验位置和速度,有些不确定性。
-最后,通过将我们的预测与测量信息相结合,增加我们预测的确定性。
好奇部分 1:为什么我们必须预测然后测量和更新?
确实如此。乍一看,这个过程似乎有点丰富。做出所有的预测,然后回头来衡量我们刚刚预测的东西,这有什么意义呢?直接投入测量,生活就不能更简单吗?
那样生活会简单得多。然而,在我揭示为什么的秘密之前,我必须问你一些事情。
想象你在路上开车,少管闲事,尽量保持 30 英里的时速。然后,在你右边车道上的人发出信号让你超车。因为你是个好人(有着美丽的灵魂),所以你可以接受。这里不谈任何技术问题,在这种情况下,你会怎么做,让那个人安全地走到你前面?
如果那是我,我可以用 2 秒钟做一个完整的观察 汽车在哪里&相对于我的速度 它的速度是多少。我的直觉可以预测它下一步要做什么。那样的话,我要么减速让道,要么加速让道。取决于我的车和另一辆车的位置,我会根据我的最佳判断让另一辆车在不造成任何事故的情况下超车。
假设那辆车成功地变道到了我的前面,我仍然不断地观察那辆车并调整我的速度,这样我的车就能一直保持在安全区域。如果车开慢了,我预测下一秒车还是会慢,我会在后面保持慢速。但是,如果它突然开得很快,我可以加快一点速度(只要在限速之下),更新我的信念。我在那里所做的是一个连续的预测和更新的过程。
所以,如果你以我为例,我想我已经给了你卡尔曼滤波器背后的逻辑。但是卡尔曼滤波器没有被发现适用于人类(或者是?>:),它已被用于机器上的各种工程应用,因为机器不具备像人或动物那样根据环境变化进行逻辑思维的能力。
好奇第二部分:为什么我们要把预测和测量结合起来?难道测量本身还不够精确到可以更新吗?
又来了。认为单独使用传感器信息进行更新是正确的做法是有道理的。然而,测量也会有不确定性(等等…什么???).例如,激光雷达用于检测位置,并且它位于汽车外部,可能存在环境影响(雨、雾、灰尘等),这使得测量不太确定。
不要盲目相信一方是一个好习惯,在某个地方总是有不确定的空间。通过组合信息,我们有更多的信息来降低不确定性/协方差,并给出更可靠的最终输出。
结论
传感器就像我们的眼睛,鼻子,耳朵。它们感知事物,并将信息传回大脑进行处理。对于自动驾驶汽车,我们有摄像头,激光雷达和雷达。相机获取图像,使深度学习能够识别物体,甚至预测信息。激光雷达和雷达感测速度和位置,以便机器可以根据卡尔曼滤波器应用做出相应的移动决定。
希望你喜欢这篇短文。如果你喜欢你所读的,请点击 ❤ 分享。我感谢任何反馈。下次见!
使处理大型数据帧变得更容易,至少对您的内存来说是这样
将数据帧的大小减少多达 90%!
如今,在大数据世界中,我们经常使用大型数据集。虽然有某些工具可以促进对大量数据的处理(如 Spark),但我们仍然在本地做大量工作,例如,我们希望建立一个原型模型(MVP,最小可行产品)。因此,我认为花点时间优化我们处理数据的方式可能是值得的——通过这样做——将其大小减少 90%。是的,可以那么多…
引擎盖下发生了什么?
不会有太多的理论,但还是有必要说几句。在幕后,pandas 将 DataFrame 的相同变量类型(如整数、浮点、对象)的列存储在块中。在表示数值(整数和浮点数)的块的情况下,这些列被组合并以 NumPy 的ndarray
的形式存储,这使得访问它们非常快。
因此,让我们看看在 pandas 上可用的数据类型以及它们实际上代表了什么。下表概述了可用的类型及其用途。
Source: http://pbpython.com/pandas_dtypes.html
还值得一提的是表中可见的子类型。举个例子,我们有int8
、int16
、int32
和int64
。该数字表示该子类型使用多少位来表示特定值,这些位分别使用 1、2、4 和 8 字节的内存。下表可能更能说明我们实际上可以在这些数字数据类型中存储哪些值。
Source: https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html
知道uint
(无符号整数)和int
(有符号整数)之间的区别可能会很方便。两者的存储容量相等,但是无符号整数只允许存储正值。因此,在某些情况下,我们绝对可以利用这一点!
实际例子
在本文中,我将生成一个示例数据框架,用几种不同的数据类型来说明如何优化存储。Pandas
通常在检测数据类型时做得很好,但是,有时,例如,当使用read_csv()
或read_sql()
时,数据类型没有以最佳方式分配。我创建数据帧如下:
我人为地将user_id
和order_id
等变量的类型设置为 string,因为这是实践中经常发生的情况。您还会遇到类型为id123456789
的 id,其中删除字符串部分id
不会产生任何影响,但会导致所需内存的显著减少。
作为第一步,我检查样本数据帧中存储的变量类型。一切都在意料之中。
>>> df.dtypesuser_id object
order_id object
order_date object
number_of_products int64
total_amount float64
day_of_week object
dtype: object
要查看每列占用多少内存,我们可以使用如下的memory_usage
:
>>> df.memory_usage(deep=True) / 1024 ** 2Index 0.000076
user_id 61.988831
order_id 61.035156
order_date 38.146973
number_of_products 7.629395
total_amount 7.629395
day_of_week 61.171283
dtype: float64
通过设置deep=True
,我们获得了确切的内存大小(Mb ),保留默认选项False
将提供一个近似值。乍一看很清楚,大部分内存用于存储字符串,这也是我们可以从优化中获得最大收益的地方。为了方便起见,我定义了一个助手函数来评估整个数据帧的大小(以 Mb 为单位)。
def memory_usage(df):
return(round(df.memory_usage(deep=True).sum() / 1024 ** 2, 2))
让我们看看数据帧总共占用了多少空间:
>>> print('Memory used:', memory_usage(df), 'Mb')Memory used: 237.6 Mb
优化数值变量
首先,检查变量并找出我们正在处理的东西是有好处的。
>>> df.describe()
Summary statistics of numeric variables
结果并不令人惊讶,因为这正是初始化随机数据帧时定义变量的方式。检查完带有子类型的表后,我们可以手动将number_of_products
的类型更改为uint8
,因为这是适用于该变量的最小数据子类型(只有最大值为< 20 的正值)。当我们在这里处理一个浮动时,我也向下转换了total_amount
。由于变量仍然具有很高的精度,在这种情况下我不需要(之前四舍五入到 2 位小数),保持这种方式没有意义,所以我进一步将类型改为float16.
>>> df.number_of_products = df.number_of_products.astype('uint8')
>>> df.total_amount = df.total_amount.apply(pd.to_numeric, downcast='float')
>>> print('Memory used:', memory_usage(df_copy), 'Mb')Memory used: 230.93 Mb>>> type(df.total_amount[0])numpy.float64>>> df.total_amount = df.total_amount.astype('float16')
>>> print('Memory used:', memory_usage(df), 'Mb')Memory used: 225.21 Mb
通过所有这些操作,我们设法将数据帧的大小减少了 10Mb 多一点,这并不是我所承诺的。但还是继续吧!
优化对象变量
Overview of ‘object’ type variables
通过检查类型为object
的变量,我们可以看到一些东西。首先,正如所料,id 是唯一的。第二,日期没有太多不同的值。然而,我们希望保持它们的datetime
格式,因为这有助于更容易的 EDA。所以我们不会转换它们(这当然是可能的)。最后是day_of_week
,它在逻辑上只能接受几个不同的值。我们在这里可以做的是将它转换成不同的变量类型——category.
对于任何熟悉 R 的人来说,这将相当于一个factor.
。这个想法非常简单,字符串变量被编码为整数,通过使用一个特殊的映射字典可以解码回它们的原始形式。当我们处理有限数量的不同字符串值时(例如重复的星期几、月份等),这是很有用的。).一个有用的经验法则是考虑对唯一值与观察总数的比率低于 50%的变量使用分类数据类型。否则,我们可能会比一开始使用更多的内存。
>>> df.day_of_week = df.day_of_week.astype('category')
>>> df.user_id = df.user_id.astype('uint32')
>>> df.order_id = df.order_id.astype('uint32')>>> print('Memory used:', memory_usage(df_copy), 'Mb')Memory used: 49.59 Mb>>> df_copy.memory_usage(deep=True) / 1024 ** 2Index 0.000076
user_id 3.814697
order_id 3.814697
order_date 38.146973
number_of_products 0.953674
total_amount 1.907349
day_of_week 0.954408
dtype: float64
我们将数据帧的大小从 237.6 Mb 减少到 49.59 Mb,减少了大约 80%。但是当我们只考虑被修改的变量时,那么结果实际上是 94%!我会说这是一项出色的工作:)
另一个技巧是在通过pandas.read_csv().
将数据加载到 Python 时考虑数据的类型。假设我创建的样本数据帧在一个 CSV 文件中,我们可以创建一个包含数据类型信息的字典,并将其传递给函数。
column_dtypes = {'day_of_week': 'category',
'user_id': 'uint32',
'order_id': 'uint32',
'total_amount': 'float16',
'number_of_products': 'uint8'}df = pd.read_csv('sample_dataframe.csv', dtype = column_dtypes)
一如既往,我们欢迎任何建设性的反馈。你可以在推特上或者评论里联系我。我希望你喜欢这篇文章,并会发现这些技巧在你的项目中很方便!
利用最近邻分类器制作手写数字识别程序
最近邻分类器是机器学习中最基本的算法之一。本教程描述了一个非常基本的方法,使一个数字识别程序。这里我们不会使用任何 python 机器学习库。所以让我们开始吧
导入所需的库
from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np
sklearn 的数字数据将用于本教程。
加载数据集
digits = datasets.load_digits()
将数据可视化
digits.data
包含线性阵列中的图像(本例中为 64 x 1 ),而digits.images
将它们存储在 8 x 8 阵列中。让我们展示一个数字
fig = plt.figure()
plt.imshow(digits.images[23],cmap = plt.cm.gray_r)
txt = "This is %d"%digits.target[23]
fig.text(0.1,0.1,txt)
plt.show()
这将给我们展示索引 23 处的图像
现在让我们看看这个图像作为一个数组是什么样子的。
digits.images[23]
这将给出如下输出
array([[ 0., 1., 8., 12., 15., 14., 4., 0.],
[ 0., 3., 11., 8., 8., 12., 12., 0.],
[ 0., 0., 0., 0., 2., 13., 7., 0.],
[ 0., 0., 0., 2., 15., 12., 1., 0.],
[ 0., 0., 0., 0., 13., 5., 0., 0.],
[ 0., 0., 0., 0., 9., 13., 0., 0.],
[ 0., 0., 7., 8., 14., 15., 0., 0.],
[ 0., 0., 14., 15., 11., 2., 0., 0.]])
像素越暗,数字越大。如果您将光标移动到阵列上更大的数字上,您可以看到它正在生成一个 3。
训练和测试数据集
我们将选择前 100 幅图像作为我们的训练数据集。
x = 100 #length of training data setX_train = digits.data[0:x]
Y_train = digits.target[0:x]
测试数据集
pred = 813
X_test = digits.data[pred]
print "X_test's real value is %d"%digits.target[pred]
对于我们的程序,我们将找到测试图像与每个训练图像的距离,距离最小的图像就是预测值。我说的距离是 64 维中的欧几里德距离。要计算欧几里得距离,我们只需找到每个索引的数字之间的差异,对它们求平方,将它们相加,然后求平方根。所以,让我们定义dist
函数。
def dist(x,y):
return np.sqrt(np.sum((x-y)**2))
只要 x 和 y 有相同的维数,这个函数对任何维数的数组都有效。(我爱 python 的原因之一:P)。
现在让我们使用dist
函数来预测测试数据。
l = len(X_train)
distance = np.zeros(l)
for i in range(l):
distance[i] = dist(X_train[i],X_test)
min_index = np.argmin(distance)
print "Preditcted value is ",
print(Y_train[min_index])
这将打印预测值,在本例中为 9。
我们模型的准确性
现在,让我们看看我们的模型预测得有多好。
l = len(X_train)
no_err = 0
distance = np.zeros(l)
for j in range(1697,1797):
X_test = digits.data[j]
for i in range(l):
distance[i] = dist(X_train[i],X_test)
min_index = np.argmin(distance)
if Y_train[min_index] != digits.target[j]:
no_err+=1
print "Total errors for train length = %d is %d"%(x,no_err)
我们的测试数据集有 100 个例子。在 for 循环中,它预测 j 索引处的图像数,并将其与实际值进行比较,然后打印错误总数。当x = 100
14/100 值预测错误,且x = 1696
2/100 值预测错误时。所以我们的模型预测图像有 98%的准确率。
预测自定义输入(如果您想向某人展示:P)
这是本教程的第 2 部分,我们将对自定义输入进行预测。您可以使用任何图像编辑器,这里我们将使用 G.I.M.P.
遵循以下步骤
- 打开 GIMP
- Ctrl + N
- 在下一个窗口中,将高度和宽度都设为 8。由于工作表非常小,您可能需要放大
- 现在滚动。如果指针的大小正在改变,则进入下一步,否则按照这个来改变指针的大小。
- 将指针的大小减小到最小。
- 转到工具→绘画工具→画笔或按 P.
- 告诉那个人在文件里画一个数字。
- 进入文件→导出并保存你的图像为 test.png。
This is test.png
访问图像 test.png 的 Python 代码
from scipy import misc
image = misc.imread("/path_to_test.png/test.png",flatten = 1)
现在,如果你打印digits.images[0]
,你会看到白色像素相当于0
,值越大,像素越暗,但是如果你打印标准形式的image
,255
代表白色,0
代表全黑。因此,我们必须转换它,使白色对应于0
,然后我们将重塑图像从 8 x 8 到 64 x 1
image1 = 255 - image
image2 = np.reshape(image1,64)
如果您查看任何 digits.images 示例,您将会看到最黑的像素对应于~15,但是您自定义输入中任何像素的最大值可以是 255,因此为了避免由于这种影响而导致的任何错误,我们将对数据进行标准化(即在 0 和 1 之间重新调整)。为此,我们将找到数组的最大数目,并将每个元素除以该最大数目。
# Training data
for i in xrange(len(X_train)):
maximum = np.amax(X_train[i])
X_train[i]/=maximum#Testing data
maximum = np.amax(X_test)
X_test/=maximum
现在我们可以走了。我们来预测一下:)
l = len(X_train)
distance = np.zeros(l) #This will store the distance of test from every training value
for i in range(l):
distance[i] = dist(X_train[i],X_test)
min_index = np.argmin(distance)
# print X_test
print "Preditcted value is "
print(Y_train[min_index])
这会打印出来
Predicted value is 2
你可以制作更多的图像并预测它们。
所有的代码都可以在这里找到https://github.com/Salil-Jain/DigitRecognizer
谢谢你。
使用 Node.js 制作回复器并关注 Twitter 的 Bot
如何“明智地”花时间做这个了不起的东西。
在我们开始之前,我想“警告”你,这个活动看起来很乏味,但实际上只是面具后面的儿童游戏。
先决条件:
- 节点和 npm 的当前版本。
- 下载并顺利运行 jQuery 3.0 。
- 一个最新版本的自制软件已经安装并运行。
- 一个演示版的推特账号。
- 文本编辑器;我建议崇高文字或者原子。
我建议创建另一个假的模拟账户,因为我们现在要做的是…这么说吧,推特先生不喜欢这样。
我们将要重复发布推文,每 10 秒发布一次,违反了几乎所有的规则。基本上,破坏了整个系统。所以如果这个账号被封了,你也不会丢失你宝贵的个人资料。
建议阅读 Twitter Bot 文档 。
序幕
在我们开始之前,让我们检查一下我们的节点和 npm 是否处于当前版本并且能够正常工作。到你的终端,连续输入这两行。
**$ node** -v
v7.10.0**$ npm** -v
4.2.0
创建文件
打开您喜欢的文本编辑器,创建一个包含两个文件的文件夹——config . js和 bot.js 。你可以给它们起任何你想要的名字,但是我更喜欢这两个名字,以便在本教程中更容易理解。
打开您的终端,将目录切换到您计划制作 bot 并存储所有相关文件的文件夹。
Two files bot.js and config.js in a file called NodeJSDemo.
Make sure to install your dependencies and packages in the target folder.
使用所需的包启动节点私有服务器
在命令提示符下输入下面一行来初始化一个名为 package.json 的新 JSON 文件。
**npm** init
系统会提示您填写几个字段。继续填写你的机器人的相关信息。
你可以按回车键跳过一些不必要的。
通过这样做,我们文件夹中的这个文件包含了我们的节点应用程序的简短介绍。关于作者、描述和文档、使用的依赖项、许可证和关键字的信息包含在该文件中。
导入我们的依赖项
打开您的浏览器,打开 npm 网站 ,搜索 Twit 包文档,您会在页面上看到以下内容。
Go click on the first search result you see on the npm search list.
点击文章,进入 Twit 依赖的文档页面。在您的终端或命令行中键入安装命令,并等待它完全完成安装。
Type in the installation command in your command line or terminal
我建议在这个命令的末尾添加一个 - save 标志,这样以后用的时候就不需要重新安装了。它将被本地存储在磁盘上。
**npm** install twit **--save**
在安装 Twit 包时,您会看到在这个目录中有一个名为 node_modules 的文件夹。如果你打开它,它会显示其他更小的文件夹,包含 Twit 运行的依赖项和包,以及里面的 README.md 文件。
最后,我们完成了机器人初始化!现在,在推特网站上创建我们的机器人。
出发去推特吧!
打开你的浏览器,进入 Twitter 网站 。创建一个假的模拟帐户,并设置它。
进入 Twitter 开发者页面 和向下滚动到页脚,点击工具下的管理你的应用。
创建一个新的应用程序,并输入必要的信息,如应用程序的名称,描述,网站(如果有的话),以及任何其他我忘记提到的字段。
Fill in these fields. You can ignore the last two if you want. However, if you actually have an OAuth key and a website to host the bot, I urge you to type in your respective credentials
现在我们已经创建了我们的应用程序,我们现在需要获得我们的消费令牌和应用程序机密。转到密钥和访问令牌选项卡,复制这些消费者密钥和消费者秘密并将其粘贴到某个地方。我们将很快使用这些值。
如果你向下滚动,你会看到这个按钮叫做创建我的访问令牌。单击此按钮生成自定义访问令牌和访问令牌密码。复制并粘贴这些值。
If you have followed the steps up until this point, you’ll have this show up on your screen. Each bit has its own separate access token and consumer key. Using these values, we’ll be able to communicate with the Twitter databases to extract relevant information about events.
假设您计划发布和开源您的 bot,那么您显然需要隐藏和保护您的消费者密钥和访问令牌,以避免误用和滥用。
为了完成这项工作,我们将从另一个文件初始化我们的机器人: config.js 。这样,我们就不需要在实际的可部署代码体中添加客户端值。
密码。最后…
打开您的 config.js 文件,将您之前复制到 Bot 对象中的访问令牌和消费者密钥的值粘贴为其各自的属性。
Bot object initialisation.
我们刚才写的是我们的机器人初始化脚本。它使用 bot 的模块中的值和参数创建并调用我们的 Bot。
它请求 Twitter 的 API 服务允许它从其数据库中检索相关数据,如 follow、tweet、remote 和其他活动。
调试和运行
要检查我们代码中的错误,请转到您的 bot.js 文件,并键入一个 console.log 命令。我们将运行这个 JS 文件来检查到目前为止提交的任何错误。我们还将添加几行代码来将 Twit 包和我们的 config.js 文件导入到我们的项目中。
This prints out our specifics to terminal.
我们现在将通过使用节点运行时服务器来编译程序。要使用 node 进行编译,我们只需输入:
**node** <program-name>.js
转到命令行或终端,将目录切换到包含我们文件的文件夹。输入上面的命令来运行你的机器人。如果一切运行良好,您将在命令行中看到以下内容:
The contents of the config.js file that was imported earlier is printed out to terminal.
该发微博了!
现在,我们将编写处理实际内容的代码部分。首先我们必须创建一个 Post 对象,并用我们的消息或 tweet 填充它。我们编写了函数 tweetStatus() ,它接受一条消息作为输入参数,并发布这条消息。
We have initialised a new Twit package build model. This helps post/tweet anything and everything you like. The function tweetStatus() has been written to facilitate the posting of a tweet.
通过这个,你可以通过改变 post JSON 中的状态的值来发布任何你喜欢的东西。无论是一个随机的笑话还是一个随机的数字,你都可以张贴任何你喜欢的东西!
编译并运行程序,看看它是否真的会发出“Hello world!”。
如果你查看一下 Twitter 开发者文档,你会发现在我们的 tweet 对象中有大量的参数要写。这让我们可以控制我们想要获得的帖子和想要丢弃的帖子。
运行程序
在我们编写 Twitter 聊天机器人的旅程中,我们已经到达了一个重要的里程碑。我们非常接近我们的目标。现在,我们要编译刚刚写好的程序。编译它将产生消息“Hello world!”发布到网上让全世界看到!按照上面显示的编译步骤,
**node** bot.js
The terminal window should like this after compiling it. If your code crashes with an error, you must have gone wrong somewhere. Don’t worry! Retrace your footsteps and rectify the mistake.
We have successfully tweeted the message Hello World without any error messages or crashes! If you are able to reach this point without banging your head on a wall or crying, Good Job!
这个函数相当简单。它所做的只是指定一个 tweeting 任务。假设有人提到你,跟踪你或者戳你。然后,你会想通过表达感激来回复。要做到这一点,我们可以编写我们的提及函数。
设置事件处理程序
JavaScript 是一种一切都异步发生的语言。类似地,我们将编写几行代码来指定当事件被触发时我们希望机器人做什么。
有一个叫做流的特殊事件,它允许我们在发起拉请求时即时捕捉 Twitter 上发生的事情。看起来是这样的:
The stream statement allows us to capture a snapshot of data that’s moving around in Twitter’s databases instantaneously. This helps us detect mentions or follow requests.
这个特殊的流函数检测是否有人关注了你的机器人或者在任何地方提到了它。现在让我们编写 followed() 和 tweetEvent() 函数。
我们的探测和反应功能
让我们写下回复任何关注或提及所需的函数,好吗?
它看起来像这样:
The tweetEvent() function detects whether our username was mentioned anywhere on Twitter and replies back. I’ve put in the screen names of my two start-up accounts. You need to add your bot’s username/screen name instead.
在 if 语句中添加您的屏幕名称。通过这种方式,任何包含屏幕名称的推文都将被我们的机器人注册,并相应地发送回复,感谢他们提到我们。它利用了我们之前编写的 tweetStatus() 函数。简单吧?
现在,我们的**接着是()**函数:
A fairly simple function, the followed() function registers any follow requests or users that follow our bot account.
我们完了。恭喜你!现在,最期待的时刻到了:运行程序。
运行和测试
对于这一部分,我建议你在另一台设备上再开一个 Twitter 账户。这样,你就可以通过实际跟踪你的机器人并多次提及它来检查机器人是否有响应,而不必每次做某事时都切换帐户。
我在手机上使用 Twitter 来执行测试过程。这使它变得更容易,因为我不需要在我的笔记本电脑上不断跳转帐户。运行程序:
**node** bot.js
It gives detailed information about any follow events or mention events asynchronously. You can open the tweets.json file to look at the various components of a single tweet. It looks aesthetically unpleasing now but you can make it look way better if you add in line breaks and spaces.
使用另一个设备跟踪 bot 帐户。测试 bot 是否有任何可以修复的边缘情况。带它去兜一圈。如果你遇到任何你似乎无法克服的错误,请在下面留下评论,我会尽快回复你。
“每 10 秒发布一次”部分
(这是一个可选的片段,如果你的机器人需要每隔一小段时间(比如一个小时左右)发布一些东西,可以使用这个片段。)
我们谈到每 10 秒左右发布一条推文。为什么不是每个设定的区间!?通过使用 setInterval() 命令,我们可以轻松地执行这个任务。
通过设置一个函数作为输入参数以及以毫秒为单位的时间间隔(1000 毫秒= 1 秒),这个任务可以轻松完成!它看起来像这样:
**setInterval**(*tweetStatus*, *10000*)
简单地
如果有必要就打破它!机器人的目的没有界限!现在全靠你的想象力了。机器人被世界各地的公司和初创企业广泛用于与客户沟通。
当谈到整个客户关系部门的自动化时,机器人真的很有帮助。
利用它令人敬畏的力量来创造一些真正有用和直观的东西!超越并建立下一个超级机器人!在那之前,我们下一集再见!
里沙卜·阿南德的原创文章
让机器人学会移动,第一部分——进化算法
自然如何激发工程。
这是一系列文章的第一部分。来个简短的介绍, 看我的介绍帖 。你可以在 这个 GitHub 库 上找到这个项目的代码。
技术和工程从大自然的伟大设计中获取灵感并不罕见。在这篇文章中,我将谈论遗传或进化 算法,它们在机器人学以及更广泛的计算机科学中的作用。进化算法的灵感来自于进化和自然 选择的自然过程。进化论是一个广为人知的理论,它解释了动物如何适应周围的环境,发展特殊的身体特征,使它们更适合那个环境。当父母混合他们的基因产生后代时,就会发生这种情况。基因也经历随机变化:这意味着新一代的生物可以发展出新的特殊特征,使它们更适应环境。适者生存解释了那些动物倾向于活得更长,繁衍后代,产生具有相同进化基因的新一代。
我们如何利用这个迷人的想法?进化算法基于相同的概念。
假设你有一个问题,你想找到一个解决方案。每一个可能的解决方案都是由一系列参数组成的。我们接着定义一个适应度 函数, h ( w )。该函数定义了我们的解决方案有多好,即我们的参数组合。给定初始随机解,我们如何找到更好的解?正如进化所建议的,我们选择和组合最好的解决方案,找到一个与两者共享参数的新方案。在这之后,我们在那些参数中做一个小的随机突变。我们重复这些步骤几次,找到新一代的解决方案,并测量这些解决方案使用适应度函数的效果。在一些迭代选择之后,遗传组合和随机变异将产生具有非常高性能的解。很神奇,对吧?
An iteration of a genetic algorithm.
这些算法可以用来为机器人设计一个控制器,即使我们没有关于机器人的物理信息,也可以使机器人高精度地移动。
先简单介绍一下任务:轨迹 跟踪是机器人操作手的常见任务。我们希望手臂的每个关节都及时遵循预定义的轨迹。问题是,我们不知道在这些关节上使用哪个扭矩来使它们精确地遵循这个轨迹,因为由于动力学耦合,移动一个关节可能会干扰另一个关节的运动。那么,我们如何找到一个函数来定义机器人的当前 状态,每个关节的期望运动,以及在该状态下实现该运动所需的扭矩之间的映射呢?数学上定义为 f ( 状态,加速度 期望 ) - > τ,,通常由逆动力学模型得到。举个例子,想象一下:你有一个由三个关节组成的机器人手臂。每个关节都有一个特定的角度,假设每个关节都是 0 度。在时间步 *t+1,*你的期望轨迹希望角度为-1,0,1。因此,你希望第一个有一个负的角加速度,第二个零加速度,第三个正加速度。要实现这一点,你需要提供哪些扭矩作为输入?有人会说,一个负一,零,一个正一。但这并不容易:由于动力学耦合,如果其他关节移动,第二个关节也会移动,所以即使加速度为零,你也需要一个扭矩来平衡动力学效应!
用一系列参数逼近任何非线性函数的一种方法是使用神经网络网络。神经网络可以用一系列权重来逼近任何类型的函数,进行矩阵乘法并使用非线性。但是,我们如何找到正确的权重/参数来实现我们想要的功能呢?通常,使用梯度 下降算法训练神经网络,如反向传播。在我们的例子中,问题在于网络的误差是不可微的:这意味着,当它在输入中接收当前状态和期望的加速度时,它输出特定的扭矩。但是我们不知道应该给系统多大的扭矩。我们没有在经典监督学习中用于计算梯度下降的真实值。这意味着我们不知道如何调整我们的参数,我们不知道通常使用****偏导数使误差更小找到的正确方向。
An example of a neural network.
****选择最优解,结合和进化参数,测试新解,保存最优解
这就是进化算法变得非常有用的地方。如上所述,我们可以通过计算机器人的轨迹与期望的轨迹相距多远(基本上,我们在每个时间步长对位置误差的范数进行积分)来了解解决方案有多好(即,我们输出期望扭矩的网络的参数),然后我们可以组合并随机变异最佳性能参数组合的参数,即基因**。在每一次迭代中,我们创造新的解决方案,进化出最好的解决方案。然后,我们在机器人身上运行这个遗传控制器,让它跟随我们的轨迹,计算总误差。如果误差比以前低,我们有一个新的最佳解决方案,我们存储并试图进一步发展!每次迭代的步骤都是一样的:选择最佳解,合并和进化参数,测试新解,存储最佳解。这样,通过遗传进化,我们找到了神经网络的最佳权重集,从而以生物启发的方式进化出了神经控制器。**
有趣的是,一个只有两个隐藏层和大约 80 个神经元的小型神经网络如何能够在大约 50 次迭代中,通过进化算法演变成强大的控制器,而不需要计算一次导数。机器人因此一步一步地进化,发现移动和跟随轨迹的新方法。
在这里,我展示了一个期望的轨迹(蓝色),以及机器人如何使用经典的 PD 控制器,或者使用遗传进化神经网络控制器**(红色)来跟随它。注意后者不同的有趣行为。机器人在错误的位置和错误的速度下启动,向相反的方向前进,所以控制器必须转弯。**
Genetic controller (up) and classic PD controller (down) trying to follow a trajectory, starting with an error both in position and velocity. Notice how the total error (the real value under the pictures) is an half with the evolved controller.
在这篇文章中,我简要描述了我和我的一个同事如何开发一个机器人的神经控制器,使用生物启发的算法,允许它以精确的方式移动,甚至不知道它自己的动态模型。你可以在这个 GitHub 仓库中找到这个项目的所有代码。
在接下来的文章中,我将展示使用新方法实现相同结果的其他技术。请随意评论或询问任何问题!
让机器人学会如何移动,第 2 部分——在真实的野生世界中强化学习
解决物理世界的瓶颈。
这是一系列文章的第二部分。你可以在这里找到 简介第一部分 ,关于 进化 算法 。你可以在 这个GitHub资源库 中找到所描述的算法和实验的代码。
近年来,强化学习得到了重新认可。各种突破和显著的成果获得了整个科学界,甚至流行文化的关注:从 AlphaGo 到 DQN 应用于雅达利,到最近的open ai****DOTA 2bot。
新的算法和架构已经以极高的速度发布,击败了最先进的结果并解决了新的任务。这些算法甚至在模拟的物理世界中表现得非常好,像人形和动物一样的模型学习行走、跳跃、躲避障碍,正如 DeepMind 最近展示的。
A robot dealing with the physical world.
但这些结果中的大多数都有一个共同点:它们需要巨大的计算能力**、时间,并且它们是在虚拟或模拟世界中执行的。为了获得好的结果,需要几十万集,由于最近高性能计算机的出现,这通常不是问题。但是强化学习遇到时间 代价和现实 世界的问题会怎么样?如果运行这些算法,例如运行一百集,它们会起作用吗?在某种程度上,这就是我们试图在机器人领域分析的。**
[……]我们工作的主要重点是在很短的时间内获得良好的结果。
正如我以前的帖子所解释的,我和我的一个同事试图解决的任务是找到方法使机器人尽可能精确地跟随给定的轨迹**,而不知道它的物理参数。我们决定实现智能 控制算法,将它们与经典的反馈控制器进行比较,首先是一个普通的 PD。所有算法与 PD 反馈控制器并行运行,试图提高其性能,从而创造出更智能的控制器。**
由于机器人不知道它的动力学参数,它不知道哪个是正确的扭矩给它的关节以实现期望的运动。因此,运动中的误差是而不是** 可微,例如,在神经网络等函数逼近器的参数中,正如我在部分 1 中所讨论的。这种问题是强化学习的常见设置,其中代理必须尝试 动作和通过感知它们对环境的未知影响来学习,因此我们尝试在其他帖子中讨论的其他技术中实现一些 RL 算法。**
为了使这篇文章更短更易读,我不会介绍零强化学习理论,但是在 Medium 上也有很多资源可以学习。
我们实现了两个主要算法。一个是 Q - 学习,一个离散动作算法,我们用来在机器人移动时实时调整 PD 控制器的增益。第二个是演员** - 评论家,另一个非常流行的算法,用于寻找一个策略,这次是连续动作,控制关节上的扭矩。**
实现的所有细节都在GitHub 库中。
用于动态 PD 调谐的 q 学习。
移动机器人机械手意味着找到输入到关节的正确扭矩,该扭矩在一定范围内具有连续值。另一方面,Q-Learning 是一种算法,它学习一种状态下离散动作的 Q 值, *Q(s,a),*以执行预期给出最高回报(更准确地说,遵循策略的最高总回报)的动作。它的普通版本不能处理大的动作空间,更不用说连续的动作空间了。但是我们对机器人移动时动态调整 PD 控制器增益的想法很感兴趣。PD 控制器根据期望和实际位置和速度之间的误差给出输入扭矩。虽然这种简单的线性控制器可以在固定 P 和 D 增益的情况下给出显著的结果,这些增益通常通过一些试错法进行调整,但其想法是让算法根据机器人的运动实时调整它们**,理想情况下使控制器更加通用。经典 PD 是一种广泛使用的控制器,因为它简单且性能良好,但它无论如何都是一种线性反馈控制器,不利用任何关于轨迹或其他数据的信息,而是仅使用最后一个时间步中的误差值。**
主要架构如下:动作只是简单地增加或减少 P 和 D 增益而与固定量无关。直觉是使用机器人的当前状态作为一种状态,以及最后步骤中错误的演变。为了逼近 Q 函数,我们使用了神经网络:如前所述,输入是状态值,而网络的输出是各种动作的 Q 值。总奖励仅在 10 步的短时间范围内计算,因此算法的主要目标是在该范围内获得最高奖励,选择增益的更新。我们实现的奖励不是位置和速度的负误差(更高的误差- >更低的奖励),而是先前步骤范围中的先前误差和当前误差之间的差。这样做是为了部分地去相关不同步骤范围内的性能:如果算法在特定步骤范围内的学习过程中表现不佳,那么在接下来的步骤中误差也将明显较大,因为机器人连续移动,即使在接下来的步骤中算法选择了一个好的动作,也可能在没有有效理由的情况下受到惩罚。因此,如果我们只考虑短暂的后续情况之间的相对改善(T21 ),我们实际上可以利用好的行动。****
正如我在介绍中所写的,我们的工作重点是在很短的时间内获得好的结果,大约 100 集/完整的轨迹。否则,该算法可能变得对物理世界不可行,并且它被其他控制算法超越,如模型** 预测 控制或迭代学习。**
我们进行了大量调整架构和超参数的实验,但最终结果往往是算法不断增加增益。这是有道理的,因为在控制理论中众所周知,更高的增益往往会带来更好的性能,但高增益意味着高功耗,有时会超过电机限制。我们试图让算法学习更多不可预测的实时调整增益的方法,以更低的能量成本获得更好的性能,但这种特定的环境,具有给定的轨迹,并没有真正给出那些结果,同时证实了控制理论中一些已知的经验概念,在没有任何先验知识的情况下通过算法学习。****
确定性政策学习的行动者-批评家
我们实现的第二种类型的算法是行动者-批评家,用来学习确定性的行动策略(然后我们也用随机策略进行了实验)。这个想法很简单:受其他论文的启发,我们决定为每个关节独立开发一个演员-评论家架构,以学习一个确定性的策略,使机器人能够更精确地跟随轨迹,补偿 PD 控制器的弱点。最近的一篇硕士论文展示了使用类似架构的 6R 机器人的有趣结果,其整体性能优于控制理论中的经典学习算法。
为每个关节实现不同的行动者-批评家策略使得算法更具可扩展性,但是在这种分散架构中学习关节的复杂动态耦合也可能更具挑战性。
整体架构如下:为了从机器人状态中提取特征,我们开发了高斯径向基函数的 2D 阵列。高斯数是根据经验选择的,均值和方差也是如此。对于每个关节,这些阵列的输入是位置和速度误差。然后将 RBF 的各种输出作为输入发送到完全连接的层(即加权和),以产生用于关节的扭矩。这些权重然后由算法调整。
作为一个试探性的 信号,添加到 actor 信号中以尝试不同的动作,我们使用了不同频率的正弦和,而不是经典的高斯白噪声,因为由于高次谐波,物理机器人实际上无法产生白噪声扭矩(白色的指的是在频谱中具有所有种类的频率,而物理系统总是低通系统)。**
我们的实验展示了这种算法是如何非常 不稳定,正如 RL 文献中所知的那样。误差向低值的明显收敛会在最后的步骤中爆发。最近的许多论文,如著名的 DDPG 算法,提出了使学习更稳定的技巧,如两个和网络用于演员和评论家以不同的时间更新来计算*目标,和****情节 记忆,是最近 RL 文献中非常著名的技术,允许通过将经验存储在数据结构中然后在随机结构中使用它们来解相关***
Look, the error is approaching zero…
…expect for exploding at the next step.
而作为测试,我们的算法能够解决著名的健身房 环境、如山地车、机器人上的学习阶段相当不稳定,并且该算法不能在短时间内提高机器人的性能,除了 1 或 2 个关节的机器人。我们尝试了许多不同架构和超参数的实验,但我们无法复制我们分析的论文的结果。我们怀疑,其中一个主要原因是,在那种情况下使用的机器人是由速度控制的,并且有一个内置的低级加速控制器,因此可以自行处理许多与惯性相关的问题,而我们是在没有任何其他低级控制器的情况下直接控制机器人加速的。
Interesting comparison of PD torques (red) and Actor torques (green) that improved performances. Note how the algorithm learns to be in phase with the PD, but also to give negative peaks in the first oscillations to avoid over-shooting.
所有的实验都证实了物理世界对于在模拟中表现良好的算法来说是多么具有挑战性。
我们当时没有进一步探讨这个问题,因为另一种方法,我将在下一篇文章中介绍,在很短的学习时间内产生了显著的效果,但我有兴趣在未来探索这项任务的不同技术。
所有的实验都证实了物理世界对于在模拟中表现良好的算法来说是多么具有挑战性。在机器人上执行实际轨迹所引入的时间延迟是一个瓶颈,当使用模拟的物理世界时,这个瓶颈经常被遗忘。在这些领域有活跃的研究,这通常会导致对学习的研究,即机器人学习新任务和能力的方法,只需几个例子,如最近的 OpenAI 博客和论文。
在下一篇文章中,我将展示一种不同的技术,基于基于反馈的动态模型学习和基函数神经网络,它给出了显著的结果。
让机器人学会如何移动—简介
(或者:人工智能遇到机器人的地方)
ICub, a famous humanoid robot developed at Italian Institute of Technology (IIT), Genova, Italy.
当想到人工智能时,许多人脑海中浮现的流行图像通常是某种类人机器人,可能穿着闪亮优雅的白色身体,正在下棋或做其他事情。在许多著名的案例中,科幻故事将人工智能描述为体现在机器人中,或者更广泛地说,体现在合成体中。这允许人工智能与物理世界互动,移动,执行动作,等等。这也意味着机器人知道如何像人类一样灵巧地移动。
在这一系列的帖子中,我将简要地谈谈我在过去一个月中一直在从事的一个项目:如何使用机器学习/人工智能技术来教会一个机器人操纵器移动,尽可能接近地遵循一个期望的轨迹。
在学术文献中,机器人和人工智能通常被视为两个不同的主题,这是有道理的。机器人,在最经典的意义上,处理建模和控制机器人机械手,或移动机器人。在工业环境中,他们经常需要做特定的重复性工作,而且需要非常高的精度。设计实现这些任务的控制架构并不简单,但这些机器人很少被视为智能的,只能完成预编程的任务。另一方面,人工智能是计算机科学的一个分支,研究如何设计模拟智能行为的算法。智能有多种定义,但在本主题中,它通常指基于传感器输入和经验采取行动的能力,以及处理不确定性和意外事件的能力。难怪最近这两个科学领域在有时被称为智能机器人的领域找到了交集。
精心设计的机器学习算法可以通过试错的方式学习移动。
正如我在引言中简要提到的,机器人机械手通常由精确设计的控制算法移动,这些算法基于对机械手的结构和物理参数的准确了解。这些包括关节之间的角度、链接的长度、质量、摩擦力等等。这些参数给得越精确,控制结构的设计就越精确。但是如果不知道这些参数会发生什么呢?这就是机器学习(ML)的由来。ML 允许计算机直接从数据中学习,并且直观地理解为什么它在这种情况下是有用的。就像人类婴儿一样,机器人可以通过移动来学习如何移动。一个精心设计的机器学习算法可以学习以试错的方式移动,进行多次尝试并分析其动作的效果。在我们的例子中,动作是施加在关节上的扭矩,效果是这些关节如何运动。
机器人的动力学模型,即描述输入如何影响每个关节运动的数学模型,可能非常复杂,尤其是在处理具有多个自由度(DOF)的机器人时。链接通常是动态耦合的:一个链接的移动、速度和加速度以复杂的方式影响另一个*。有惯性效应、离心、科里奥利和重力效应、非线性摩擦*等等。所有这些都很难用数学建模。那么,问题来了:机器人能学会移动吗?在接下来的一系列文章中,我将展示我和一位同事一起开发的不同方法、技术和算法。你可以在 GitHub 库中找到为这个项目开发的所有代码。
通过设计让人工智能变得可理解
英国诗人威廉·布莱克(William Blake)曾公开谴责伦敦的阿尔比翁面粉厂(Albion Flour Mills),称其为“黑暗的撒旦磨坊”,因为它们的自动化流程威胁到了工业革命前占主导地位的面包制造流程。新技术的破坏在那些生活受到新技术影响的人们心中产生焦虑;似乎在概念上很难,反直觉和疏远。
如今,艾通过科幻小说中的启示录式描绘,在流行文化中创造了一种怀疑的氛围。很多时候,这些问题都围绕着人工智能没有被正确理解,即使是研究人员。我们还没有开发出足够的概念模型来理解它的工作方式,部分原因是因为它还没有,也可能永远不会被完全理解。
复杂性理论是一个框架,为理解物理、生物、生态和社会宇宙提供了全新的方法。它基于这样一种观点,即一切都是由复杂适应系统组成的——从星系间系统和地球天气模式,到人类的中枢神经系统;从宇宙到纳米。人工智能可以被认为是这样一种系统,因为它表现出以下特性:
涌现 —艾不循大叙事;相反,系统中的节点以看似随机的方式相互作用。从这些交互中,模式出现,通知其他节点的行为;因此也是系统本身的问题。由生殖人工智能创造的难以想象的设计展示了这些涌现的过程。
共同进化 ——机器学习能力意味着人工智能系统能够根据节点之间的变化进行适应,并且之前的行动可以为未来的模式设计出更好的预测;因此有了术语预测分析。然而,很快,人工智能的进化将不仅能够描述和预测,而且能够指导或为未来的运作指明最佳路径。
连接 ——人工智能从不断扩大的传感器阵列中收集数据,监测物理世界的各个方面,如空气质量、交通流量、海浪高度;除了我们自己的电子足迹,如门票销售、在线搜索、博客帖子和信用卡交易,这些系统还可以收集模式并掌握人类大脑无法获得的洞察力。
自组织 ——人工智能通常在分布式分散网络中运行,没有自上而下的控制或等级制度,通过涌现和反馈不断自组织。美国计算机科学家、作家、未来学家和连续创业者杰里·卡普兰(Jerry Kaplan)认为,股票市场的高频交易意味着统计和机器学习技术是目前淘金的最佳工具。
混沌边缘 ——埃隆·马斯克(Elon Musk)是开放人工智能(Open AI)和最近 neural ink——一项将人类大脑与人工智能融合的风险投资——的创造者。然而,尽管马斯克参与了人工智能革命,但他警告称,人工智能是“我们最大的生存威胁”。这些观点似乎自相矛盾,在乐观和危险之间摇摆不定。然而,这正是人工智能的本质:在秩序和无政府状态之间保持平衡,处于混乱的边缘。
嵌套系统 ——就像互联网或任何有机体一样,人工智能由网络的网络组成;系统的系统——其中一个级别的代理是下一个级别的代理的构建块。
即使像机器学习算法这样的复杂系统看起来像不可知的黑盒,这也不应该阻止我们与它们一起工作。加州大学设计实验室主任唐·诺曼说:“复杂既是必要的,也是可以控制的。”。
在一个充满人工智能复杂性的世界里,人类对于解释和人性化这些混合信号是必不可少的;没有人比设计师更适合这份工作。“设计师是复杂事物的大师,”开放大学的高级设计讲师 Katerina Alexiou 说;管理大量可变的外部因素,如约束、期望、满足要求、法规、假设可能性和不确定性,以创建展现“广泛的特定领域专家知识”的人工制品和系统。从这个角度来看,面对复杂性是设计过程的一个关键方法。
一旦脱离了对这种社会技术现象的愚蠢、保守的观念,设计师的角色就是加速走向计算机创造力所提供的新奇而有价值的世界。任务不是简单地掌握复杂的概念,而是以一种可理解和吸引人的方式有效地传达它们,赋予它们文化意义。诺曼说,创造意义的关键是解码或理解复杂性,并将其重新编码为概念模型,从而将复杂的现实转化为“可行、可理解的心理概念”。概念模型不应该从复杂系统的特性或能力中抽离,而是应该简化复杂性,以增加理解、可用性和功能性。他总结道,“简单不是复杂的对立面——复杂是世界的事实,而简单存在于头脑中”。
让亚马逊雇佣 AI 不带偏见
亚马逊招聘算法中性别偏见的新闻传遍了互联网,这为机器学习模型的可解释性主题开辟了一条新线索。让我给你讲一下这个故事的背景。亚马逊拥有至少 575700 名员工。如果员工的平均任期为 3 年,他们需要每年招聘(191900 +人数增加)。如果每 5 个面试的候选人中有 1 个被选中,每 3 份简历中有 1 个被选中,那么即使人数保持不变,他们每年也需要检查 19190035 = 2878500 份简历。这些数字——3 和 5——会因不同的情况而有所不同,因为送货员比工程师更容易雇用,但我们不要让这个计算变得不必要的复杂。重点是衡量这个数字可以有多大,以及在这个数字上花费了多少精力和资源。
如果你曾经参加过面试,你会同意简历筛选有多无聊——尤其是如果这是你的工作。这是一项基于重复模式的工作——这是人工智能非常擅长的。因此,对于像亚马逊这样的创新型大公司来说,理解自己的招聘实践并用算法复制它是完全有意义的。由于简历和工作描述是文本数据,我们需要利用 NLP(自然语言处理)。
如果我必须自己制作算法,我会使用这条管道,这可能也是亚马逊所做的。
- 预处理简历文本
- 用 TF-IDF 或 BM25 对文本进行矢量化
- 为物流和工程中重复性很高的入门级配置文件训练一个监督分类器。如果数据足够,我们也可以对非入门级配置文件进行测试。分类器可以是诸如朴素贝叶斯、随机森林或深度学习序列模型之类的任何东西,并且用于分类的类别被选择和不被选择
- 预测新简历被选中的概率
- 过滤超过截止概率如 0.8 的恢复
- 根据概率选择面试的前 x 个概况,其中 x 取决于我们想要聘用的候选人数量和过去的转换率
另一种方法是通过 Lucene/Elasticsearch 对简历和职位描述进行相似性匹配,并选择具有截止相似性得分的前 k 名结果。最高的结果确保了与 JD 的匹配,而不是他们与角色的适合程度,因此这种方法不是很合适。
问题是
现在让我们深入了解一下新闻:他们的新招聘引擎不喜欢女性。美国顶级科技公司尚未消除招聘中的性别差距,这种差距在软件开发人员等技术人员中最为明显,男性人数远远超过女性。亚马逊的实验性招聘引擎遵循同样的模式,学会惩罚包含“女性”一词的简历,直到公司发现这个问题。
目前人们对新闻的看法是:
- 人们的第一反应是人工智能有缺陷。
- AI 只会和数据一样有偏差。因此,艾透露,亚马逊的招聘人员可能偏向男性。
- 亚马逊是一家勇于披露其模式缺陷的公司。大多数公司不会这么做。
问题的解决方案
现在我想讨论的是如何使算法无偏的部分。问题是出现在女性简历中的词的重要性较低,因为这些词在精选的简历中出现得较少。亚马逊的系统会惩罚包含“女性”一词的简历,比如“女子象棋俱乐部队长”并且降级了两所女子大学的毕业生* 。还可能存在与种族词汇相关的问题。
由于性别和种族词汇不是一个人技能的指标,我们可以将这些词汇映射到一个常见的令牌,如 AAA。所以现在男子棋社队长和女子棋社队长都映射到了 *AAA 的棋社队长。*所以如果 AAA 的象棋俱乐部队长入选候选人,男性和女性的简历都会对这些词给予同等的重视。此外,这不仅仅是一个词的男性或女性。在完成矢量化的同时,我们还创建了双词和三词特征,在本例中,它们将是“*AAA ’ s chess”*和“AAA ’ s chess club”,这在之前包含单词 men 和 women 时会有所不同。
因此,我们所需要的是在矢量化之前的偏差消除文本预处理步骤,在该步骤中,我们将性别/种族单词映射到一个公共标记。可以通过 HR 的观察或从列表中收集此类单词的列表(并非此列表中的所有单词都有用)。在我看来,这个练习和实验并没有证明人工智能有缺陷,而是揭示了一个常识,即人工智能和数据一样好,如果数据没有准备好,它需要处理。
事后思考
令人难过的是,他们解决了偏见,但放弃了该项目,正如文章提到的那样——“亚马逊编辑了程序,使它们对这些特定术语保持中立。但这并不能保证机器不会设计出其他可能被证明具有歧视性的候选人分类方法。”像所有的研究一样,人工智能本质上也是迭代的。亚马逊花了相当多的时间来制作算法,现在这个缺陷被发现并纠正了,它导致了一个更好的算法。只有通过这些循环的改进,我们才有希望实现一个近乎完美的无偏算法。我不知道亚马逊为什么关闭它。
文章还提到,包含“已执行”和“已捕获”等词的简历得分异常高。驯服算法需要对矢量化和分类算法有深入的理解。当 TF-IDF/BM25 在简历中看到一个非常不寻常的词时,它会造成巨大的破坏。罕见词具有高 IDF 值,因此 TF-IDF 值可能变大。分类算法也可以给这些导致奇怪结果的不寻常的单词很高的权重。必须通过文本探索、模型特征重要性和用于解释训练的 ML 模型的算法来找出这样的词。一旦发现,可以手动或通过某种逻辑或通过保持较高的最小文档频率值,将它们从矢量化过程中移除。这有助于减少特征(单词)的数量,并有助于解决过度拟合问题。但这也可能会从模型中删除好的特征,从而降低数据科学家所关注的模型的准确性。
亚马逊擅长的推荐算法也存在类似问题。理想情况下,数据集应该是巨大的+变化的,并且算法应该被健壮地测试。当训练数据较少时,问题就出现了,因此过度拟合和偏差开始起作用。消除这种情况的唯一方法是拥有一个庞大的数据集,该数据集受到其自身雇佣(选定/未选定的候选人)数据的约束。我们需要估计我们可能需要多少数据,以及可能需要多少年来收集。如果所需的年数很长或不确定,关闭项目是有意义的。人们可能会认为人工智能失败了,但这可能是一个数据问题,这就是为什么亚马逊可能会暂时关闭它。还记得为什么几年前深度学习突然开始工作了吗?访问大量的标记数据,更好的计算和算法的改进。
我的看法是,亚马逊可能不仅发现了自己模式的缺陷,还发现了从事人力资源技术的其他公司模式的缺陷。这将导致未来几天更好的人力资源解决方案。
最后,更不用说,随着人工智能越来越多地应用于现实世界的问题,机器学习模型的可解释性变得至关重要。
通过评论或者通过 LinkedIn 让我知道你的想法。
- 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
原载于 2018 年 10 月 12 日【ml-dl.com】。
让所有人都可以使用人工智能
我们很荣幸生活在一个让人工智能成为现实绝对必要的数据、计算和深度学习算法都变得丰富的时代。人工智能深度学习的发展导致了几乎所有技术领域令人难以置信的进步,并为未来带来了令人难以置信的前景。更好的医疗保健、无人驾驶汽车、智能飞行汽车、更容易获得的金融资源以及更明智的国家资源分配,只是未来十年可能实现的几个目标。
A Self-Driving Car by Waymo(A Subsidiary of Google). Source: Wikipedia
但就像早期的计算机技术一样,最先进的人工智能的使用被数百万开发者拒之门外。目前,当开发人员需要构建对象检测和识别系统时,即使是最流行的深度学习框架都需要很高的专业知识水平。深度学习算法基础的具体知识仍然是构建复杂人工智能系统的先决条件。因此,深度学习专业知识需要长时间的密集学习,对于大多数迷失在概念海市蜃楼中的新来者来说,这往往令人沮丧。“困惑”是许多新进入者用来描述他们情况的词,他们试图超越简单地训练 MNIST 和 CIFAR10 数据集以获得更好的准确性。
Source: makeuseof.com
同样,开发计算机软件最初需要对计算机和操作系统的整个体系结构有深刻的理解。这让早期的程序员感到沮丧,包括贝尔实验室的传奇开发人员。意识到抽象是工具的低级,许多专家创造了高级编程语言,包括 Fortran、C、C++等。这些语言比汇编语言更容易使用,但仍然需要很高的专业知识才能使用,因此,创新缓慢,计算机编程对大多数人来说遥不可及。几年后,像 Python、Java、.NET、PHP、Javascript 等等,使得这个星球上的每个人和组织都可以使用计算机编程。没有这些高级抽象,我们今天所知的数字世界将不复存在。
Guido Van Rossum created Python, A language that made programming more accessible
Olafenwa Moses 我喜欢把深度学习的当前状态想象成 C++早期的编程方式。
如果每个人都能编码,那么每个人都可以用合适的工具构建 AI。因此,我们都决定致力于创造工具,让任何人,从普通程序员到各个领域的行业专家,都能将人工智能集成到他们构建的每个解决方案中。
只有这样的工具存在,才能保证 AI 惠及所有人。我们设想一个智能的未来,每个应用、设备和系统都注入了人工智能。 获得人工智能是一项基本的基本人权 。
有鉴于此,我们开始构建 ImageAI,这是一个非常简单易用的 python 计算机视觉库,它允许完全没有 ML 或 DL 经验的开发人员只需几行代码就可以构建最先进的 AI 系统。
ImageAI——一个 python 库,旨在使开发人员能够使用独立的计算机构建应用程序和系统…
github.com](https://github.com/OlafenwaMoses/ImageAI)
在我们发布第一个版本以来的三个月里,ImageAI 已经被全球成千上万的开发者使用,其中许多人是第一次体验人工智能。使用 ImageAI,任何开发人员都可以在仅仅 10 行 python 代码中执行对象检测、提取和识别**!,任何开发人员都可以用自己的定制数据集训练图像识别模型,只需 5 行 python 代码!。视频中的物体检测只用了 7 行代码!**所有这些都有最先进的 RetinaNet、YoloV3、Resnet、Densenet、InceptionV3 和 Squeezenet 架构支持。
为了感受一下这是如何工作的,我将实际回顾一下其中的一些特性。
第一,10 行代码中的物体检测!
下载 yolo.h5 模型文件并将其放在与您的相同的路径中。py 文件。现在,您可以在上面代码中的任何图像“image.jpg”上运行检测。
上面的简单代码会给你这个:
视频中的物体检测用 7 行代码
这会给你这个
ImageAI 还支持许多强大的功能,包括带有间隔回调的高级视频分析。它完全支持从 IP 摄像头和网络摄像头的对象检测。
所有这些惊人的功能都是完全免费和开源的。
可以通过https://imageai . readthe docs . io或者https://imageai-cn . readthe docs . io了解更多(中文版)
我们选择接受的使命是推进人工智能,使其民主化,并让地球上所有规模的个人和企业实体都可以使用人工智能。
我们正在努力构建更多的人工智能工具,并在不久的将来将它们带到更多的平台上。
您可以通过以下网站了解更多有关我们使命的信息
致力于改善和普及人工智能
科学](https://commons.specpal.science)
我们可以一起建设一个更美好的世界,人工智能将不断改变我们的生活,并且人人都可以使用。
你可以通过 @johnolafenwa 和 @OlafenwaMoses 联系我们
电子邮件:guymodscientist@gmail.com 和 johnolafenwa@gmail.com
深度学习摇头动画
多姿态估计目前是计算机视觉中最先进的深度学习方法,用于检测图像中的人类及其关节。在这篇文章中,我简要介绍了如何在德雷克的热线音乐视频上使用勒布朗·詹姆斯的脸制作一个有趣的小摇头 GIF,就像我上面制作的一样。基本上有 4 个主要步骤:
- 下载你感兴趣的视频叠加。我选择了德雷克的热线金光闪闪的视频。
2.下载您想要覆盖在视频上的孤立人脸图像。我选择了勒布朗·詹姆斯的脸。如果你的脸部图像不方便地有背景,那么使用一些图像编辑工具来裁剪背景,直到你的图像看起来像这样:
You favourite celebrity’s face without the background
3.在视频的每一帧,检测人类和他们的关节。我用的项目是https://github . com/ZheC/real time _ Multi-Person _ Pose _ Estimation,是多姿态估计的 keras Python 实现。特别是,我们感兴趣的是使用代码来定位图像中人体对象的头部。
Example of using the code from https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation to perform human multi-pose estimation on an image.
4.一旦我们有了视频帧的面部屏幕坐标,我们就在这些坐标处将孤立的面部剪切图像覆盖在视频帧的顶部。
(Left) Original video frame. (Right) Face overlay video frame.
5.对视频中的每一帧重复步骤 3 和 4。之后我用 ffmpeg 把所有的帧组合在一起,做了一个无声视频。你将不得不做更多的工作来添加和同步原始视频剪辑的音频。但是在很大程度上,你现在已经完成了一个摇头娃娃动画的可行演示!
Final demo of a bobblehead animation using multi-pose estimation
让深度学习用户友好,成为可能?
背景|来自《哈佛商业评论》(2018 年 3 月):尽管学者们做出了许多机器学习的发现,……但公司正在努力部署机器学习来解决实际的商业问题。简而言之,大多数公司的差距不是机器学习不起作用,而是他们努力实际使用它的**。**
在这里,我将介绍正在努力使深度学习(机器学习的一部分)更加用户友好,以便公司更容易使用。希望这些努力将有助于减少公司在深度学习时面临的“斗争”。
那么,有没有可能让深度学习(MLP、CNN、、、甘、……)变得更加用户友好呢?更加人性化,比如从 MS-DOS 升级到 Windows 2.0(还记得 MS-DOS 吗?CP/M 克隆)。或者像从集成开发环境(IDE)到图形编程环境(GPE)。
嗯,一切皆有可能…如果你付出足够的努力。
深度学习已经变得更加容易使用
人们已经做出了很多努力,让深度学习变得更加容易:
- DL 框架(Theano、Caffe、Tensorflow、MXNet)
- 元框架或 API (Keras,ONNX?)
- 可用于迁移学习的开放模型(ResNet、LeNet、VGG16、SqueezeNet、…)
- Jupyter 笔记本
- ….
得益于深度学习中无处不在的开源文化,所有这些都是现成的、免费的。现在,开放文化已经转移到 DL 模型,非常高性能的 NN 已经通过深度学习模型动物园提供给所有人。这些让迁移学习变得“轻而易举”。
他们还做出了其他努力,使深度学习的潜力变得非常容易,而无需任何开发工作,也不需要 DS/DL 部门或专门的工程师:
-物体识别网络服务(YOLO……)
-谷歌汽车服务
但是这些提供黑盒服务…实际上是另一个黑盒中的一个黑盒。一些公司可能不在乎,并发现该服务非常有用/经济,但一些公司会在乎,并希望掌握深度学习过程。
用户友好性?酷!!!但是为了什么?
尽管如此,目前,构建深度学习模型涉及到相当多的使用当前深度学习框架(Theano,Tensorflow,PyTorch,CNTK,Caffe2,…)或元 API ( Keras)和编程语言(Python,Java,R,…)之一的编程。这通常由经过专门培训的相当高级的用户来完成。
因此,深度学习的用户友好性可以采取以下形式:
- 没有编程→更好,尤其是对于不怎么编程或者不知道特定深度学习框架的人
- 直观的图形编辑器,用于设计/修改深度学习架构→更易于使用,更适合不太高级的用户
采取用户友好方式的其他动机是它可能产生:
- 更高的工作效率—用户更有效率和创造力
- 模型更容易理解,更容易修改/维护。
这意味着用户友好性也可能来自:
- 拥有高效的开发/实验环境
- 执行模型推理的集成环境,
- DL 模型性能监控
- 易于部署训练好的模型
- 自动管理由 DL 模型构建过程产生的文件。
目标用户
用户友好性带来了构建定制 DL 模型的有限灵活性。如果光标在两个相反的目标之间,即可定制性 & 易用性,被正确定位,它就可以工作。但是光标的位置取决于用户的类型。
谁可能需要用户友好性:
- 学生/自学者/教师
- 中小企业公司
- 希望掌握技术但需要一种工具来提高工作效率的工程师/研究人员
→需要更快地建立新的 DL 模型,并更快地修改它们
→需要进行大量实验:不同的架构、优化超参数、调整数据集……
谁不太可能需要它:
- 深度学习的研究人员
- 深度学习工程师,特别是在高级用途和生产环境中
用户友好的深度学习工具
到目前为止,已经有一些尝试让深度学习更加用户友好。在这里,我将介绍三种已经走了很长一段路的方法:
- 来自深度认知的深度学习工作室
- 索尼的神经网络控制台
- IBM 的神经网络建模器(以前的名称:IBM 深度学习 IDE 和 DARVIZ)
所有这些工具都有一个图形编辑器来编辑深度学习模型。它们都允许从 DL 层构建深度学习架构,如 2D 卷积、2D 最大池等
另外两个用户友好的候选项将不会被回顾,因为到目前为止,它们没有提供一个图形编辑器来编辑 DL 模型:
- NVIDIA 数字
- 张量板(部分张量流环境)
首先,一点历史
回到过去(90 年代),当神经网络还处于初级阶段时,有一些带有 GUI 的神经网络模拟器,如:
- 阎乐存参与的 Neuristique(【http://leon.bottou.org/projects/neuristique】)的 SN 神经网络模拟器
- 斯图加特大学
并行与分布式高性能系统研究所(IPVR)的 SNNS(http://www.ra.cs.uni-tuebingen.de/SNNS/) - 和其他人。
他们已经试图让神经网络建模更加用户友好。实际上,我使用 SNNS 作为我进入 NN 领域的第一步。这是一个很好的开源工具:
SNNS Neural Network simulator
在浅层时代之后,神经网络在深度学习端跳了进来,进入了深度时代。
深度认知深度学习工作室(DLS)
Deep Leaning Studio 是一个非常有趣的平台,它有两种操作模式:云和桌面。
这里有 DLS:http://deepcognition.ai/
深度学习工作室图形编辑器
DLS 有基本的用户友好的成分→深度学习模型编辑器,看起来像:
DL 模型编辑器的基本成分是构成 DL 模型的层(见左图)。要构建 CNN 的卷积部分,可以使用 Convolution2D、MaxPooling2D、BatchNormalization layer 等层。KERAS API 中定义的所有层都是可用的,另外还有一些层。通过将这些层拖放到编辑器工作空间上并定义这些层之间的连接图来构建模型。通过选择层,然后在编辑器屏幕右侧的侧面板中设置值,可以设置每个层的参数。
在这个视频中可以看到一个和 DLS 一起搭建 DL 模型的例子:【https://player.vimeo.com/video/198088116"
每次添加层或改变层的参数时,后台进程检查网络是否“连贯”。通过这种方式,如果你偏离了构建一个“不可能的”模型的轨道,你会在早期得到警告。
因此,深度学习工作室已经具备了让深度学习更加用户友好的条件。
基本特征
- 使设计/修改 DL 架构变得更容易
- 提供了 Keras API 的所有 DL 层,加上一些技术层(例如合并)
- 拖放和复制/粘贴有助于构建大型网络
- 允许每层的简单配置
- 自动检查构建的 DL 网络的一致性
- 预训练的 KERAS 层。提供 SqueezeNet!最后完全连接可以重新培训,使实施转移学习变得容易(添加参考)
高级特性
但是它有更多的特性,不仅仅是提供一个简单的编辑器,还提供了与环境其他部分的紧密集成。其中之一是:
- 当对数据预处理、体系结构学习超配对进行几次尝试时,恢复模型(实际上是恢复、数据预处理和超配对)非常有用。
- 集成预先训练的 Keras 模型
- AutoML(见下文)
DLS 环境
图形编辑器不是单独出现的。在 DLS 环境中还有 4 个零件(可通过选项卡访问):
- 数据-加载数据集并对其进行预处理
- 超参数-编辑训练超参数
- 培训—开始/停止和监控培训
- 结果—分析和比较几个实验的结果
- 推断/部署——测试模型并部署它
图形化的 DL 模型编辑器位于 model 选项卡中
所有这些功能都与构建 DL 模型有关
除此之外,环境的其他部分也提供了额外的+,将工具带入另一个维度:
- 笔记本—使用/编程 Jupiter 笔记本
- 环境—从命令行管理和使用 ML 环境
- 部署—管理使用 DLS 构建的已部署 DL 模型
加上一些更注重实用性的部分
- 项目—浏览和访问项目
- 文件浏览器—管理环境(云或本地)中的文件
- 数据集-预处理和加载数据集,以便作为模型输入
- 论坛—从支持人员和其他 DLS 用户那里获得帮助
- 视频—访问培训视频
- 支持——从深层认知中获得支持
所以 DLS 解决方案提供的不仅仅是一个 DL 模型编辑器。这里不是展示整个 DLS 环境的地方。因此,我将仅指出几个经过深思熟虑且非常有用的功能:
- 让几个项目同时训练,并且仍然能够在其他项目上工作
- AutoML
- 提供了 Jupiter 笔记本和“命令行”编程
- 定义自定义损失函数(目标函数)的可能性
- 云和桌面是“相同的”(可能只是一些技术上的差异),除此之外,桌面版本是免费的。
AutoML
它自动为特定数据集生成易于训练的 DL 架构。这与谷歌 AutoML(https://TechCrunch . com/2018/01/17/Google-AutoML-lets-you-train-custom-machine-learning-models-without-having-to-code/)的方法不同。我能够在叶子形状识别数据集上测试它,它工作得非常好。
生产时间—单击 REST—API 部署
一旦模型构建完成,DLS 允许将模型部署为 REST API。除了部署 REST API 之外,还生成并部署了一个简单的基于表单的 web 应用程序,用于快速测试和共享。可以从 deployment 菜单管理已部署的模型。
**
Jupiter 笔记本电脑和预配置环境
木星笔记本
DSL 提供了在 Jupyter 笔记本电脑中编程或在所提供的环境(桌面或云)中运行现有笔记本电脑的可能性。
Jupiter Notebook environment provided by DSL (Notebook Panel)
预配置环境
深度认知为深度学习程序员引入了预配置环境。这个特性将 AI 开发者从设置开发环境的头痛中解放出来。这一点尤其重要,因为许多深度学习框架和库需要不同版本的包。这些包版本冲突经常导致调试时间的浪费。
Environment panel in DSL
目前最新版本的 Tensorflow、Keras、Caffe 2、Chainer、PyTorch、MxNet 和 Caffe 已经推出。这些使得开发者能够非常快速地使用各种不同的 github AI 项目。这些环境是隔离的,支持 CPU 和 GPU 计算。
最终,这些将开发人员从 devops 工作中解放出来,帮助他们专注于真正的人工智能模型构建和优化工作。
Deep Learning Studio 中预先配置的环境不仅可以访问终端,还可以访问基于 VS 代码的开源组件的成熟的基于 web 的 IDE。
One programming Environment provided by DSL (Environment panel)
这两个特性(Jupiter 笔记本和预配置环境)是真正的资产。它们使得使用深度认知云和 GPU 来完成任何深度学习、机器学习或数据科学任务成为可能→不会将人们局限在仅编辑的解决方案中。
出来的是什么
- 以 Keras H5 格式保存的训练模型
- DLS 模型。yaml 格式,包含模型的 DLS 特定描述
DLS 背后的技术是什么
- 阿帕奇 MXNet
- Keras like API
现在还缺少什么
- 可能加载其他预训练的 Keras 模型→无法使用动物园模型中的模型
- 将模型的代码导出到 Python/Keras
- 当存在分类问题时,使用混淆矩阵查看性能
- 一份详细的文档(这不是一个大问题,因为环境使用起来非常直观)
索尼的神经网络控制台
索尼的神经网络控制台(NNC)似乎最初是一个内部工具,已经与相关的内部 DL 框架神经网络库(https://nnabla.org/)一起被制成产品,在这里https://github.com/sony/nnabla开源发布。因此,NNC 应该从这种内部经验中受益。
这里有 NNC:https://dl.sony.com/
神经网络控制台图形编辑器
DL model GRAPHICAL EDITOR in Neural Network Console
NNC 的模特编辑和 DLS 的编辑工作方式差不多。可以添加到 DL 模型的层特定于索尼的 DL 框架神经网络库(NNL)。
以下是 DLS 的一些特点和差异:
- 提供了逻辑处理层— LogicalAnd、LogicalOr、…
- 提供了循环层(但没有提供示例)—可用于构建残差网络和递归神经网络
- 不同的数据预处理可以通过模型中的图层或数据集选项卡来完成。
- 超参数可以在配置选项卡中设置
- 评估选项卡有一个有用的混淆矩阵,用于分类问题
神经网络控制台环境
与 DLS 类似,NNC 提供了一个超越 DL 模型编辑器的环境。
图形编辑器不是单独出现的。还有 4 个面板(在 NNC 环境中:
- 仪表板—监控资源使用情况
- 数据集-预处理和加载数据集,以便作为模型输入
- 作业历史记录—监控已结束的培训作业
NNC 的弊端
- 底层框架目前是相当“机密”的,几乎没有在索尼之外使用的迹象
- 层列表是受限制的并且是“非标准的”(正如 Keras 层 API 可能是)
- 预先训练的 DL 不能作为层使用,所以 transfert 可能不容易设置
- 无法加载经过训练的 KERAS 模型
- 没有提供用于轻松部署 DL 模型的机制
关于 NNC 的视频请看:【https://www.youtube.com/watch?v=-lXjnaUSEtM】T2
IBM 的神经网络建模器
神经网络建模器已经有了几个名字:DARVIZ 和 IBM 深度学习 IDE(【https://darviz.mybluemix.net/#/】T4)。精彩的 IBM 营销或者我们应该称之为混乱。它现在是沃森工作室套房的一部分。
NNM 的目的与前两种工具不同。它意味着在最后产生代码(Theano,Tensorflow/Keras,Caffe 1)。现在,该代码将被 Watson Studio suite AFAIU 中的其他工具使用。
在这里有 NNM:https://darviz.mybluemix.net/#/dashboard或者在沃森工作室https://data platform . IBM . com/docs/content/analyze-data/ml _ dla as . html?观众=博士&背景=精炼厂
神经网络建模器图形编辑器
给 NNC 提供了一个不错 DL 模型图形编辑器:
DL model GRAPHICAL EDITOR in Neural Network Modeler
以下是 DLS 的一些特点和差异:
- 自动最佳架构搜索
- 不同的数据预处理可以通过模型中的图层或数据集选项卡来完成。
- 超参数可以通过 Watson Studio 套件中的工具进行优化
NNM 资产
- 集成到数据科学/机器学习套件中,因此可能会受益于套件的其他功能,如部署机制
NNM 的缺点
- 仅生成 DL 模型的代码,所有其他功能都在 Watson Studio 套件中的某个地方(您必须拥有并了解该套件)
- 仅在云上可用(可能很快仅在 Watson Studio 套件中可用?)
有关 NNM 的更多信息,请参见这篇 Medium 文章:https://Medium . com/IBM-Watson/accelerate-your-deep-learning-experiments-with-IBM-neural-network-modeler-DD 0 c 92 FBA 814
关于 DARVIZ(NNM 的旧称)的视频请看:【https://www.youtube.com/watch?v=mmRw_MuMPC4】T2 值得为*【孩子】**(是的!)呈现出来。出色的沟通和商业技巧!*
结论
深度学习的用户友好性即将实现。但是在不久的将来可能会走得更远。
索尼的 NNC 是一个很好的快速建立 DL 模型的解决方案,并提供了一个相当完整的环境。
IBM 的 NNM 是一个更受限制的解决方案,其主要目标是生成代码供其他地方使用。其他地方是 Watson Studio 套件,因此它的效率将取决于 WS 套件的效率以及它在 WS 套件中的集成。
深度认知的 DLS 是一个经过深思熟虑的解决方案,它提供了一个非常完整的环境,并且不局限于深度学习模型的图形编辑。它面向“事实上的”标准,这使得它比索尼基于“机密”框架的 NNC 更有趣。
功能对照表
我已经在 socialcompare.com 网站上创建了一个功能对照表。目的是提供一个易读的表格来总结哪种产品具有哪些特性。其他人也可以做出贡献。
* [## 深度学习编辑器| Tableaux comparatifs-social compare
比较深度学习工作室控制神经网络控制台控制深度学习 IDE 控制 NVIDIA 数字控制注释
socialcompare.com](http://socialcompare.com/fr/comparison/deep-learning-editor-4amg7j1f)
以下是截至 2018 年 4 月底的屏幕截图:
*