TowardsDataScience 博客中文翻译 2019(三百七十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

一个问题可以统治所有人

原文:https://towardsdatascience.com/one-question-to-rule-them-all-8e0d20301f31?source=collection_archive---------14-----------------------

一项评估快速概率思维测试的惊人发现

这是一篇合作文章,由 克里斯托福罗斯 A. 斯皮罗斯·多沙迪斯

首先,简单介绍一下背景

很高兴见到你:Christoforos 是帝国学院的荣誉员工,Spiros 是企业家和业余概率学家。我们的一个联合项目是棋类游戏Borel—Dice Edition,这是一个使用概率测验和多面骰子来测试玩家概率判断的游戏。

为了探索人们利用直觉处理概率难题的方式,我们最近制作了一个简短的选择题测试,并在网上传播,有点厚脸皮地称之为 概率智商测试

它由 16 个实验描述组成,有些直接取自我们的棋盘游戏,还有一个关于结果可能性的问题。所以比如其中一个问题是:掷一个 6 面骰子五次。哪个可能性更大?

(a)你至少会掷出一次 2

(b)你不会掷出 2

©大概是 50%-50%

由于我们只是对测量人们概率直觉的准确性感兴趣,而不是任何种类的数学能力,我们要求受访者每个问题不超过 1 分钟。

由于我们希望探索 Borel 对不同学术背景的人的吸引力,该测试的主要目标是看看正式的数学培训是否对一个人的概率快速思维的准确性有影响。所以在最后我们添加了一个关于回答者的课后正式数学训练的问题(可用的答案是:‘没有正式训练’,‘最多训练 4 年’和‘训练 4 年以上’)。

那么,首先,训练对成绩有影响吗?

让我们首先承认这样一个事实:我们的测试,就像所有的在线民意调查一样,可能会受到选择偏差的影响:回答是自愿的,接触到的受众不是随机选择的,因此不能保证实际参与的人群子集是总体人口的代表性样本。特别是,这里有一个相当明显的选择机制:不喜欢数学谜语的人不太可能做出反应。事实上,平均来说,这类人的表现可能比狂热的业余概率专家更差,因为至少缺乏练习。

此外,我们可以合理地假设,在未受过训练的人群中,任何选择偏差都比受过训练的人群大:受过数学和概率训练的人不太可能对这样的测验产生负面倾向,因此决定他们是否会对测验做出反应的因素与他们在测试中的表现不太可能相关。考虑到这一点,我们来看分析。

训练似乎确实有一个小的积极影响,但这只有在 5 年的训练后才变得显著。鉴于我们上面对选择偏差的讨论,如果我们有一个代表性的样本,我们可能会认为这个影响会更大。然而,我们仍然可以争辩的是,对这门学科的热爱(无论如何足以让你想做一个概率测验)似乎几乎和培训一样有效:分布严重重叠(图 1):30%没有接受过数学培训的受访者比接受过 5 年以上培训的人表现更好,几乎 50%的人比接受过 1-4 年培训的人表现更好。在概率问题上,似乎竞争环境相当公平。

你可能会想,除了训练,还有什么能更好地区分擅长和不擅长这方面的人。在这篇文章的最后,我们为你找到了答案。请继续阅读!

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

Figure 1 — Performance per years of training

一般来说,人们擅长这个吗?

那么,我们对这类问题有多擅长呢?看一下上面的图,可以发现平均性能约为 50%。这是否意味着我们比随机猜测好不了多少?为了回答这个问题,我们首先需要定义“随机猜测”在这个上下文中的含义。

回想一下,每个问题有三个选项。因此,定义随机猜测的一种方法是随机选择一个答案。这通常会产生 1/3 的平均分数,因此显著低于 50%。除此之外,我们测验中的答案并不总是相互排斥的。举个例子,结果 A 有 52%的可能性发生。在这种情况下,我们将“A 更有可能”和“大约是 50/50”都视为正确答案(我们对此进行了长时间的认真思考,并认为这是直觉测验和正确评估之间的最佳妥协)。

考虑到这一点,随机选择一个答案会给你一个 0.39 的预期分数,这比我们观察到的表现要差得多。

因为错误的原因而正确

有些问题是同一系列问题的不同实例。例如,下面是问题 3 和 10,它们实际上只是一个骰子不同面的问题:

问题 3 :掷出一个六面骰子。然后滚动一个 10 面骰子。然后滚动一个 30 面骰子。结果会严格按照升序排列吗?

问题 10 :掷出一个 10 面骰子。然后滚动一个 20 面骰子。然后滚动一个 30 面骰子。结果会严格按照升序排列吗?

想必我们会期望任何给定的回答者在这两个问题上表现得一样好,对吗?完全错了!事实上,在所有可能的问题对中,这一对是最不可能被回答者答对的。很奇怪。

好吧,我们开始吧。首先,请注意,选择这两个答案是为了更有可能出现不同的结果:第一个问题中更有可能出现严格的递增顺序,第二个问题中最不可能出现(公平地说,大约是 50/50)。再加上观察到约 60%的受访者对这两个问题给出了相同的答案,我们可以得出这样的结论:受访者往往会对这个问题形成一种观点,而这种观点实际上对骰子的两面并不敏感。这些回答者有一半时间是对的,但原因是错误的。

它变得更加有趣。对这种现象的一个简单解释是,由于某种认知偏差,受访者倾向于某个答案:例如,人们可能只是倾向于假设最有可能的结果将是严格递增的序列,因为骰子的边数是严格递增的。数据绝对不是这样:在对这两个问题给出相同答案的人中,16%的人认为这两种情况都是 50/50,42%的人认为递增顺序最有可能,42%的人认为最不可能。认为严格增长是这两个问题的正确答案的人与认为严格增长是这两个问题的错误答案的人数量完全相同。只有一个合理的结论:大多数人,面对这个问题的时候,几乎是随便挑一个答案,就坚持下来了!

这一分析也很有趣,因为它展示了认知偏差有时会隐藏得多么好:如果我们只问了这两个问题中的一个,我们就没有办法知道这正在发生。

哪个问题最难?

这个结果并不出乎我们的意料:被调查者认为最难正确回答的问题是我们从经验中得知的最有害的问题。是这个:

在一系列连续的硬币投掷中,哪一个序列更有可能在某个时刻首先出现,[正面-反面]或[反面-反面]?

然而,结果是戏剧性的:只有 12%的受访者答对了这个问题。更重要的是,这个问题的答案也高度预测了所有其他问题的表现:答对这个问题的受访者在其余问题上的平均得分为 58%。事实上,这个问题的答案比一个人是否接受过数学培训更能预测整体表现:接受过 5 年以上培训的受访者的平均表现只有 52%。

一个统计上的灌篮

我们发现这个发现如此惊人,以至于我们想对它进行第三次测试(这也是我们想发表这篇文章的原因)。数据没有让人失望。这是一个三步走的过程:

1.如果你知道一个回答者是否答对了这个问题,他们是否接受过数学训练并不能提供额外的预测能力来预测他们在这个测试中的表现。

2.相反,如果一个人知道一个回答者是否受过正式的数学训练,额外知道他们是否答对了这个问题确实提供了额外的预测能力(在二项式回归中的额外效果在 99%的置信水平上显著)。

3.最重要的是,一个人是否答对了这个问题,与他是否接受过统计学培训无关。我们可以在声明下面签名:相关性接近 0。

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

Giannis knows his probabilities

这三个结果的结合可以被有把握地称为“统计上的成功”。这是统计学家在预测感兴趣的结果时,关于一个指标(在这种情况下,是抛硬币问题的答案)优于另一个指标(在这种情况下,是正规数学训练的存在)的最强有力的声明。所以,尽管还是有点厚脸皮,我们还是准备给招聘人员和人力资源人员以下建议:

如果你在面试一个需要快速概率思维的职位的候选人(什么工作不需要,如果你真的去想?),不用费心去问他们的学历。漫不经心地把他们长长的简历放进垃圾箱,并问他们一个问题:

在一系列连续的掷硬币过程中,哪个序列更有可能在某个时刻首先出现,[正面-反面]还是[反面-反面]?

你自己进去

试一试 看看你的概率直觉有多准。你可能还想看看 Borel ,这款棋类游戏开启了这一切。

使用 Keras 一次性学习暹罗网络

原文:https://towardsdatascience.com/one-shot-learning-with-siamese-networks-using-keras-17f34e75bb3d?source=collection_archive---------0-----------------------

目录

  1. 介绍
  2. 先决条件
  3. 分类与一次性学习
  4. 应用程序
  5. Omniglot 数据集
  6. 加载数据集
  7. 将问题映射到二元分类任务
  8. 模型架构和培训
  9. 验证模型
  10. 基线 1 —最近邻模型
  11. 基线 2 —随机模型
  12. 测试结果和推断
  13. 结论
  14. 参考

1.介绍

深度卷积神经网络已经成为图像分类任务的最先进方法。然而,最大的限制之一是它们需要大量的标记数据。在许多应用程序中,收集这么多数据有时是不可行的。One Shot Learning 旨在解决这个问题。

2.先决条件

在这篇文章中,我将假设你已经熟悉机器学习的基础知识,并且在使用 Python 和 Keras 使用卷积神经网络进行图像分类方面有一些经验。

3.分类与一次性学习

标准分类的情况下,输入图像被输入到一系列层中,最后在输出端,我们生成所有类别的概率分布(通常使用 Softmax)。例如,如果我们试图将图像分类为猫或狗或马或大象,那么对于每个输入图像,我们生成 4 个概率,指示图像属于 4 个类别中的每一个的概率。这里必须注意两个要点。首先,在训练过程中,我们要求每个类(猫、狗、马和大象)的数量的图像。其次,如果网络只在上述 4 类图像上进行训练,那么我们就不能指望在任何其他类上进行测试,例如“斑马”。如果我们希望我们的模型也对斑马的图像进行分类,那么我们需要首先获得大量的斑马图像,然后我们必须再次重新训练该模型。在有些应用中,我们既没有足够的数据用于每个类,而且类的总数是巨大的,并且是动态变化的。因此,数据收集和定期再培训的成本太高。

另一方面,在单镜头分类中,我们只要求每个类有一个训练示例。是的,你说得对,只有一个。因此得名一枪。让我们试着用一个真实世界的实际例子来理解。

假设我们要为一个只有 10 名员工的小组织构建人脸识别系统(小数字使事情简单)。使用传统的分类方法,我们可能会得到一个如下所示的系统:

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

Standard classification using CNN

问题:

a)为了训练这样一个系统,我们首先需要组织中 10 个人中每个人的大量不同的图像,这可能是不可行的。(想象一下,如果你是为一个有几千名员工的组织做这件事)。

b)如果有新人加入或离开组织怎么办?你需要承受再次收集数据的痛苦,再次重新训练整个模型。这实际上是不可能的,特别是对于几乎每周都在招聘和减员的大型组织。

现在,让我们来了解一下如何使用一次性分类来解决这个问题,一次性分类有助于解决上述两个问题:

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

One Shot Classification

该网络不是将输入(测试)图像直接分类到组织中的 10 个人中的一个,而是将该人的额外参考图像作为输入,并且将产生相似性分数,该分数表示两个输入图像属于同一个人的可能性。通常,使用 sigmoid 函数将相似性得分压缩在 0 和 1 之间;其中 0 表示没有相似性,1 表示完全相似。0 和 1 之间的任何数字都有相应的解释。

请注意,该网络没有学习将图像直接分类到任何输出类别。相反,它正在学习一个相似度函数,该函数将两幅图像作为输入,并表示它们有多相似。

这如何解决我们上面讨论的两个问题?

a)一会儿我们将会看到,为了训练这个网络,你不需要一个类的太多实例,仅仅几个就足以建立一个好的模型。

b)但最大的优势是,假设在人脸识别的情况下,我们有一名新员工加入了组织。现在,为了让网络检测到他的脸,我们只需要一张他的脸的单个图像,它将被存储在数据库中。使用该图像作为参考图像,网络将计算呈现给它的任何新实例的相似性。因此我们说网络预测分数在一杆

如果上述细节目前看起来有点抽象,请不要担心,继续前进,我们将解决一个问题的全部细节,我保证你将对主题有深入的理解。

4.应用程序

在我们继续之前,我想提一下 one shot learning 的几个应用,以便激发您对了解这项技术产生更浓厚的兴趣。

a.正如我上面已经提到的人脸识别,只需进入这个 链接 人工智能大师吴恩达展示了百度(中国搜索巨头)如何为他们组织的员工开发人脸识别系统。

b.阅读这篇 博客 来了解一次性学习是如何应用于数据非常匮乏的药物发现的。

c.在这篇 论文 中,作者使用一次性学习构建了一个离线签名验证系统,该系统对银行和其他政府以及私人机构非常有用。

5.Omniglot 数据集

出于这个博客的目的,我们将使用 Omniglot 数据集,它是来自 50 个不同字母表的 1623 个手绘字符的集合。每个角色只有 20 个例子,每个例子都是由不同的人画的。每个图像都是分辨率为 105x105 的灰度图像。

在我继续之前,我想澄清一下字符和字母表之间的区别。在英语的情况下,集合 A 到 Z 被称为字母表,而每个字母 A、B 等等。叫做人品。因此,我们说英语字母表包含 26 个字符(或字母)。

所以我希望这澄清了我所说的跨越 50 多个不同字母的 1623 个字符。

让我们看一些来自不同字母表的字符图像,以便更好地了解数据集。

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

Image Source: https://sorenbouma.github.io/blog/oneshot/

因此,我们有 1623 个不同的类(每个字符可以被视为一个单独的类),每个类只有 20 个图像。显然,如果我们试图使用传统的图像分类方法来解决这个问题,那么我们肯定无法建立一个良好的通用模型。由于每个类别可用的图像数量如此之少,模型很容易会过拟合。

你可以通过克隆这个 GitHub 仓库 来下载数据集。名为“Python”的文件夹包含两个 zip 文件:images_background.zip 和 images_evaluation.zip,解压这两个文件即可。

images_background 文件夹包含来自 30 个字母的字符,并将用于训练模型,而 images_evaluation 文件夹包含来自其他 20 个字母的字符,我们将使用这些字符来测试我们的系统。

解压缩文件后,您将在 images_background 文件夹(用于培训目的)中看到以下文件夹(字母):

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

Contents of images_background directory

您将在 images_evaluation 文件夹(用于测试目的)中看到以下文件夹(字母):

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

Contents of images_evaluation directory

请注意,我们将在一组字符上训练系统,然后在训练期间从未使用过的一组完全不同的字符上测试它。这在传统的分类循环中是不可能的。

6.加载数据集

首先,我们需要将图像加载到张量中,然后使用这些张量向模型批量提供数据。

我们使用下面的函数将图像加载到张量中:

Code to load images from disk

要按如下方式调用此函数,请按如下方式将火车目录的路径作为参数传递:

X,y,c = loadimgs(train_folder)

该函数返回一个由 3 个变量组成的元组。我不会遍历代码的每一行,但是我会通过理解它返回的值,给你一些直觉,这个函数到底在做什么。有了这个解释,一旦你完成了它,你就能很好地理解上面的功能。

让我们来理解“X”中呈现的是什么:

X.shape
(964, 20, 105, 105)

这意味着我们有跨越 30 种不同字母表的 964 个字符(或字母或类别)。对于每个角色,我们有 20 张图像,每张图像都是分辨率 **105x105 的灰度图像。**故名形状(964,20,105,105)。

现在让我们了解标签“y”是如何填充的:

y.shape
(19280, 1)

图像总数= 964 * 20 = 19280。一个字母的所有图像都有相同的标签。,即前 20 个图像的标签为 0,接下来的 20 个图像的标签为 1,依此类推,……最后的 20 个图像的标签为 963。

最后,最后一个变量“c”代表类别,它是一个字典,如下所示:

c.keys() # 'c' for categoriesdict_keys(['Alphabet_of_the_Magi', 'Anglo-Saxon_Futhorc', 'Arcadian', 'Armenian', 'Asomtavruli_(Georgian)', 'Balinese', 'Bengali', 'Blackfoot_(Canadian_Aboriginal_Syllabics)', 'Braille', 'Burmese_(Myanmar)', 'Cyrillic', 'Early_Aramaic', 'Futurama', 'Grantha', 'Greek', 'Gujarati', 'Hebrew', 'Inuktitut_(Canadian_Aboriginal_Syllabics)', 'Japanese_(hiragana)', 'Japanese_(katakana)', 'Korean', 'Latin', 'Malay_(Jawi_-_Arabic)', 'Mkhedruli_(Georgian)', 'N_Ko', 'Ojibwe_(Canadian_Aboriginal_Syllabics)', 'Sanskrit', 'Syriac_(Estrangelo)', 'Tagalog', 'Tifinagh'])c['Alphabet_of_the_Magi']
[0, 19]c['Anglo-Saxon_Futhorc']
[20, 48]

因为有 30 种不同的字母表,所以这本字典 c 包含 30 个条目。每一项的关键是字母表的名称。每个项目的值是两个数字的列表:[low,high],其中“low”是该字母表中第一个字符的标签,“high”是该字母表中最后一个字符的标签。

一旦我们加载了训练和测试图像,我们将张量保存在磁盘上的 pickle 文件中,这样我们就可以在以后直接使用它们,而不必再次加载图像。

7.将问题映射到二元分类任务

让我们了解如何将这个问题映射到监督学习任务中,其中我们的数据集包含(Xi,易)对,其中“Xi”是输入,“易”是输出。

回想一下,我们系统的输入将是一对图像,输出将是介于 0 和 1 之间的相似性得分。

Xi =一对图像

yi = 1;如果两个图像包含相同的字符

yi = 0;如果两幅图像包含不同的字符

让我们通过可视化下面的数据集来更好地理解:

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

Sample of 6 data points

因此,我们需要创建成对的图像和目标变量,如上所示,作为输入输入到暹罗网络。请注意,尽管上面显示了来自梵语字母表的字符,但实际上我们将从训练数据中的所有字母表中随机生成对**。**

生成这些对和目标的代码如下所示:

Code to load data in batches

我们需要通过传递 batch_size 来调用上面的函数,它将返回“batch_size”数量的图像对及其目标变量。

我们将使用下面的生成器函数在网络训练期间批量生成数据。

8.模型架构和培训

*这段代码是格雷戈里·科赫等人*在这篇 研究论文 中描述的方法的实现。我使用的模型架构和超参数都如文中所述。

在深入细节之前,让我们先从高层次上理解这个架构。下面,我将呈现一个对建筑的直觉。

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

A high level architecture

直觉:暹罗这个词的意思是双胞胎。上面显示的两个卷积神经网络不是不同的网络,而是同一网络的两个副本,因此被命名为暹罗网络。基本上它们共享相同的参数。两个输入图像(x1 和 x2)通过 ConvNet,为每个图像(h(x1)和 h(x2))生成一个固定长度的特征向量。假设神经网络模型被适当地训练,我们可以做出如下假设:如果两个输入图像属于同一字符,那么它们的特征向量也一定是相似的,而如果两个输入图像属于不同的字符,那么它们的特征向量也将是不同的。因此,在上述两种情况下,两个特征向量之间的元素方面的绝对差异必定非常不同。因此由输出 sigmoid 层生成的相似性得分在这两种情况下也必须不同。这是暹罗网络背后的中心思想。

鉴于上述直觉,让我们看看从研究论文本身获得的更详细的架构图片:

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

Image Source: https://www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf

以下函数用于创建模型架构:

Siamese Model Architecture

请注意,Keras 中没有预定义的层来计算两个张量之间的绝对差。我们使用 Keras 中的 Lambda 层来实现这一点,该层用于在 Keras 中添加定制层。

要了解在不同层传递的张量的形状,请参考使用 Keras 的 plot_model 实用程序生成的下图。

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

Tensor shapes at every level

该模型是使用 adam 优化器和二元交叉熵损失函数编译的,如下所示。学习率保持较低,因为发现在高学习率的情况下,模型需要花费大量时间来收敛。然而,这些参数可以被进一步调整以改善当前的设置。

optimizer = Adam(lr = 0.00006)
model.compile(loss="binary_crossentropy",optimizer=optimizer)

该模型被训练了 20000 次迭代,批量大小为 32。

在每 200 次迭代后,使用 20 路一次学习进行模型验证,并通过 250 次试验计算精确度。这个概念将在下一节解释。

9.验证模型

现在我们已经了解了如何准备用于训练的数据、模型架构和训练;是时候我们必须考虑一个策略来验证和测试我们的模型了。

请注意,对于每一对输入图像,我们的模型都会生成一个介于 0 和 1 之间的相似性得分。但是仅仅看分数很难确定模型是否真的能够识别相似的字符并区分不同的字符。

一个很好的判断模型的方法是 N 路一杆学习。别担心,这比听起来容易多了。

4 向一次性学习的示例:

我们创建一个包含 4 对图像的数据集,如下所示:

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

Example of a 4-way one shot learning

基本上,相同的字符与 4 个不同的字符进行比较,其中只有一个字符与原始字符匹配。假设通过进行上述 4 次比较,我们得到了 4 个相似性得分,分别是 S1、S2、S3 和 S4,如图所示。现在,如果模型被适当地训练,我们期望 S1 是所有 4 个相似性分数中最大的,因为第一对图像是唯一一个我们有两个相同字符的图像。

因此,如果 S1 恰好是最高分,我们就认为这是一个正确的预测,否则我们就认为这是一个不正确的预测。重复这个过程“k”次,我们可以计算正确预测的百分比如下:

percent _ correct =(100 * n _ correct)/k

其中 k = >试验总数,n _ correct =次试验中的正确预测数。

类似地,9 路单次学习将如下所示:

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

Example of a 9-way one shot learning

16 向单杆倾斜将如下所示:

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

Example of a 16-way one shot learning

下面是 25 路一次性学习的样子:

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

Example of a 25-way one shot learning

注意,N 向一次学习中的“N”的值不一定是完美的正方形。我选择值 4、9、16 和 25 的原因是,当正方形被填满时,它看起来更适合展示。

很明显,当重复多次时,较小的“N”值将导致更正确的预测,而较大的“N”值将导致相对不太正确的预测。

再次提醒一下:上面显示的所有例子都来自梵文字母表,但是实际上我们将从测试/验证数据集图像的所有字母表中随机生成测试图像和支持集。

生成测试图像和支持集的代码如下:

Code to generate a test image along with the support set

10.基线 1 —最近邻模型

创建简单的基线模型,并将它们的结果与您试图构建的复杂模型进行比较,这始终是一个很好的实践。

我们的第一个基线模型是最近邻方法。如果你熟悉 K 近邻算法,那么这也是一样的。

如上所述,在 N 路单次学习中,我们将测试图像与 N 个不同的图像进行比较,并选择与测试图像具有最高相似性的图像作为预测。

这在直觉上类似于 K=1 的 KNN。让我们详细了解一下这种方法是如何工作的。

你可能已经学习了如何计算两个向量之间的 L2 距离(也称为欧几里德距离)。如果你不记得了,下面是怎么做的:

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

L2 distance between two vectors

假设我们将向量 X 的 L2 距离与其他三个向量 A、B 和 c 进行比较。然后,计算与 X 最相似的向量的一种方法是检查哪个向量与 X 的 L2 距离最小。因为距离与相似度成反比。因此,例如,如果 X 和 B 之间的 L2 距离最小,我们说 X 和 B 之间的相似性最大。

然而,在我们的情况下,我们没有矢量,但灰度图像,可以表示为矩阵,而不是矢量。那么我们如何计算矩阵间的 L2 距离呢?

这很简单,只要将矩阵展平成向量,然后计算这些向量之间的 L2 距离。例如:

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

Computing L2 distance between images

因此,在 N 路一次学习中,我们将测试图像的 L2 距离与支持集中的所有图像进行比较。然后我们检查得到最小 L2 距离的字符。如果该字符与测试图像中的字符相同,则预测是正确的,否则预测是不正确的。例如:

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

N way Nearest Neighbor Approach

类似于 N 路一次学习,我们对多次试验重复这一过程,并计算所有试验的平均预测分数。最近邻方法的代码如下:

Code to compute Nearest Neighbors

11.基线 2 —随机模型

创建随机预测的随机模型是一种非常常见的技术,以确保我们创建的模型至少比完全随机预测的模型更好。下图总结了它的工作原理:

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

N-way Random Approach

12.测试结果和推断

对 N = 1,3,5,…进行了 N 向测试。, 19.

对于每个 N 向测试,执行 50 次试验,并计算这 50 次试验的平均准确度。

以下是 4 种型号之间的对比:

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

Test Results

推论:显然,暹罗模型比随机模型和最近邻模型表现得好得多。然而,在训练集和验证集上的结果之间存在一些差距,这表明模型是过拟合的。

13.结论

这只是一个初步的解决方案,许多超参数可以调整,以避免过度拟合。此外,通过增加 N 路测试中的“N”值和增加试验次数,可以进行更严格的测试。

我希望这有助于你理解使用深度学习的一次性学习方法。

源代码:请在此 查阅我 GitHub 库上 Jupyter 笔记本中的源代码。

:模型是用 P4000 GPU 在云上训练的。如果你在 CPU 上训练它,那么你需要非常有耐心。

欢迎评论、建议、批评。谢了。

14.参考

a.https://github.com/akshaysharma096/Siamese-Networks

b.https://sorenbouma.github.io/blog/oneshot/

c.【https://www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf 号

d.吴恩达在 Coursera 上的 deeplearning.ai 专业化课程

用 Numpy 加速 Python 代码的一个简单技巧

原文:https://towardsdatascience.com/one-simple-trick-for-speeding-up-your-python-code-with-numpy-1afc846db418?source=collection_archive---------5-----------------------

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

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

Python 是巨大的。

在过去的几年中,Python 的受欢迎程度迅速增长。其中很大一部分是数据科学、机器学习和人工智能的兴起,所有这些都有高级 Python 库可以使用!

当使用 Python 处理这些类型的工作时,通常需要处理非常大的数据集。这些大型数据集被直接读入内存,并作为 Python 数组、列表或字典进行存储和处理。

处理如此庞大的数组可能非常耗时;真的,这就是问题的本质。你有数千、数百万甚至数十亿个数据点。在处理这些点中的一个点时,每增加一微秒都会大大降低您处理大规模数据的速度。

缓慢的方式

处理大型数据集的缓慢方法是使用原始 Python。我们可以用一个非常简单的例子来证明这一点。

下面的代码将 1.0000001 的值乘以自身,500 万次!

我家里有一个相当不错的 CPU,英特尔 i7-8700k 加上 32GB 的 3000MHz 内存。然而,将这 500 万个数据点相乘需要 0.21367 秒。如果我将num_multiplies的值改为 10 亿次,这个过程需要 43.24129 秒!

让我们试试另一个数组。

我们将构建一个大小为 1000x1000 的 Numpy 数组,每个数组的值为 1,并再次尝试将每个元素乘以一个浮点数 1.0000001。代码如下所示。

在同一台机器上,在常规浮点循环中将这些数组值乘以 1.0000001 需要 1.28507 秒。

什么是矢量化?

Numpy 被设计成对矩阵运算有效。更具体地说,Numpy 中的大多数处理都是矢量化

矢量化包括表示数学运算,例如我们在这里使用的乘法,它发生在整个数组上,而不是它们的单个元素上(如我们的 for 循环)。

借助向量化,底层代码被并行化,因此操作可以一次在多个数组元素上运行,而不是一次遍历一个元素。只要你正在应用的操作不依赖于任何其他的数组元素,也就是一个“状态”,那么矢量化将会给你带来很好的速度提升。

在 Python 数组、列表或字典上循环可能会很慢。因此,Numpy 中的矢量化操作被映射到高度优化的 C 代码,这使得它们比标准 Python 代码快得多。

最快的方法

下面是做事情的快速方法——按照设计使用的方式使用 Numpy。

在寻求加快速度时,我们可以遵循以下几点:

  • 如果数组上有一个 for 循环,我们很有可能用一些内置的 Numpy 函数来替换它
  • 如果我们看到任何类型的数学,我们很有可能用一些内置的 Numpy 函数来代替它

这两点实际上都集中在用优化的、矢量化的低级 C 代码替换非矢量化的 Python 代码。

看看我们之前的第一个例子的快速版本,这次有 10 亿次乘法。

我们做了一些非常简单的事情:我们看到我们有一个 for 循环,在这个循环中我们多次重复相同的数学运算。这应该立即触发我们应该去寻找一个 Numpy 函数来代替它。

我们找到了一个——power函数,它简单地将某个幂应用于输入值。这段代码运行速度惊人,只需 7.6293-6 秒,这是一个

这与将值乘以 Numpy 数组的想法非常相似。我们看到我们正在使用一个双 for 循环,应该立即意识到应该有一个更快的方法。

方便的是,如果我们直接乘以 1.0000001 标量,Numpy 将自动对我们的代码进行矢量化。所以,我们可以用同样的方式来写我们的乘法,就像我们乘以一个 Python 列表一样。

下面的代码演示了这一点,运行时间为 0.003618 秒,速度提高了 355 倍!

喜欢学习?

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

10 分钟内完成一项调查、100 张卡片和 1,000 张幻灯片

原文:https://towardsdatascience.com/one-survey-100-decks-and-1-000-slides-in-10-minutes-8fcfd1b246ee?source=collection_archive---------25-----------------------

用开源软件自动化调查数据分析-第二部分

整个研究团队在会议室集合。现在是晚上 10 点。咖啡机正在汩汩作响,宣布新的一壶已经煮好了。还有至少四个小时的工作。你知道这一点,因为你以前来过这里;房间里的其他人也一样。

数据处理团队两周前对结果进行了清理、加权和计算——在调查结束后一周,那么为什么我们都在晚上 10 点喝马马虎虎的过滤咖啡呢?

嗯,客户有 20 个部门,每个部门都需要一个单独的幻灯片,上面有他们自己的结果;每组有 30 张幻灯片,大多数幻灯片有两张图表。通过将正确的数据复制并粘贴到正确文档的正确幻灯片中,从表格中手动创建了近 1,000 个图表。

最后,就在你快完成了,隧道尽头出现了曙光,只剩下一点点抽查的时候,那封电子邮件到了。宣布客户顿悟的电子邮件:新定义的年龄细分将以更精细的方式抓住他们的目标受众,请再次运行表格和幻灯片。一个初级研究员在哭吗?

在 python 中自动生成 PowerPoint 幻灯片

不需要那样。Python 的一大承诺是它能够自动化枯燥的东西(阿尔·斯威加特的很好地介绍了这个概念)。手动复制/粘贴过程没有实际价值,但存在巨大的风险。在使用开源软件自动进行调查数据分析的第二部分中,我们将向您展示您的团队如何在野外工作完成后立即准备好这 1,000 个图表,最终在不到 10 分钟的时间内,在将近 200 个 PowerPoint 文件中完成 1,000 多个图表。

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

We’ll create one PowerPoint slideshow for what technologies are used in every single country in the Stackoverflow survey. The results are native Excel charts that can be edited, and the slideshows are based on themes that can be branded at will.

我们的数据:Stackoverflow 2019 开发者调查

为了说明工作流,我们将使用 Stackoverflow 2019 开发者调查,该调查查看了大约 90,000 名编码人员的工具和偏好。我们的目标是为参与调查的每个国家正在使用的技术制作一个 PowerPoint 幻灯片。我们将使用 Python 库:pandas、python-pptx 和 Quantipy(专门用于调查数据的库)以及 Jupyter 笔记本。

import pandas, quantipy, python-pptx

和我们所有的项目一样,我们从一个标准的目录布局开始(在后面的文章中会详细介绍我们的标准化工作流程),在那里我们存储原始的数据文件(我们总是在一个副本上工作,以便有一个干净的引用来返回)。在初始库导入之后,我们有兴趣查看数据中的一个名为LanguagesWorkedWith的变量,它看起来像这样:

pd.read_csv('./data/original/survey_results_public.csv',
            usecols=['LanguageWorkedWith']).head()

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

受访者可以选择一种以上他们有工作经验的语言。这意味着数据列中不是单个值,而是一个由字符分隔的值列表(分隔集)。在上面的例子中,第一个回答者拥有 HTML/CSS、Java、JavaScript 和 Python 的经验。

将测量数据和模式 CSV 文件转换为 Quantipy 数据和元数据文件格式后,我们可以创建 Quantipy 数据集(数据集是一种 Python 对象,专门用于处理测量数据,允许方便地访问数据以进行分析和探索)。

dataset = qp.DataSet(“StackOverflow 2019”)
dataset.read_quantipy(meta=”stackoverflow.json”,
                      data=”stackoverflow.csv”)

Quantipy 的便利功能之一是dataset.crosstab(),允许我们轻松地检查受访者所说的他们使用的不同技术的结果。

dataset.crosstab(‘LanguageWorkedWith’)

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

Almost ninety thousand Stackoverflow users answered what technology they’ve worked with.

这看起来不错:JavaScript 是我们的数据中最受欢迎的,与 Stackoverflow 公布结果时报告的一样。所以,我们继续。

179 个国家,每个国家一个 PowerPoint 文件

我们将从查看哪些变量对我们可用开始:因为我们已经决定查看不同国家的人们使用什么技术,我们将添加与语言、数据库、平台、网络框架和各种技术相关的“曾经工作过”和“期望的”变量。

variables = ['LanguageWorkedWith',
             'LanguageDesireNextYear',
             'DatabaseWorkedWith',
             'DatabaseDesireNextYear',
             'PlatformWorkedWith',
             'PlatformDesireNextYear',
             'WebFrameWorkedWith',
             'WebFrameDesireNextYear',
             'MiscTechWorkedWith',
             'MiscTechDesireNextYear']

我们还做了另一个健全性检查;计算每个国家回复的百分比,并与公布的结果进行比较。这些匹配,所以我们继续。

# Sanity check: This matches 
# data from the officially published results.
# The pct parameter means we calculate percentages 
# rather than counts
countries_pct = dataset.crosstab('Country', pct=True)# the index of the resulting dataframe has a list of all countries
# in the data
all_countries = countries_pct.index.get_level_values(1)countries_pct

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

现在我们遍历各个国家,并计算上面定义的variables数组中每个变量的结果。

因此,循环变成:

countries = {}
for country in all_countries:
    slide_data = []
    for variable in variables:
        # convert country name to relevant code/number
        # and use it to filter the data before running the crosstab
        filter = {'Country':dataset.code_from_label('Country',
                                                    country)}
        result = dataset.crosstab(variable, 
                                  pct=True, 
                                  f=filter)
        slide_data.append()
    countries[country] = slide_data

现在我们已经计算了数据,我们编写创建 PowerPoint 文档的最后一个循环:

for country in all_countries:
    prs = Presentation('./specs/pptx-template.pptx') for i, var in enumerate(variables):
        title = countries[country][i].index[0][0]
        data = countries[country][i]
        data = data.sort_values(by='@')/100
        chartData = hp.ChartData_from_DataFrame(data)  
        # blank slide
        slide = prs.slides.add_slide(prs.slide_layouts[6])
        x, y, cx, cy = 1524000, 1397000, 6096000, 4064000
        chart = slide.shapes.add_chart(
            XL_CHART_TYPE.BAR_CLUSTERED,
            x, y, cx, cy,
            chartData
        ).chart
        txBox = slide.shapes.add_textbox(x, y-1000000, cx, cy)
        txBox.text_frame.text = title chart.category_axis.tick_labels.font.size = Pt(12)
        chart.value_axis.tick_labels.font.size = Pt(10) folder = "./results/stackoverflow_results/" 
        prs.save("{}/{}.pptx".format(folder, country))

pptx 模板文件应该是一个空的演示文稿,并且slide_layouts引用将用于插入结果的主幻灯片。在这种情况下,我们使用一个空幻灯片,但我们也可以使用图表占位符来更好地控制。

结果呢

我们已经将以上内容整合到一个笔记本中,发布在 Github 上,当笔记本运行时,我们最终得到了 179 个幻灯片,每个国家一个。每个幻灯片组有 10 张幻灯片,因此您的团队不需要手动生成 1790 张幻灯片。

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

Navigate into your results folder in Jupyter Notebooks and see the slides you’ve generated for each country.

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

Above is the first page of the results for China in PowerPoint. The chart is a native Excel chart, not an image, so it can be edited, the chart type changed and so on.

进一步自动化

在 Jupyter 笔记本中运行上述内容的好处在于,它可以成为管道的一部分。我们已经写了通过将 Jupyter 笔记本链接在一起来自动化数据处理管道(准备数据),在这个系列的下一步将是自动化输出管道。这将包括创建一个所谓的“图表规范”,一个定义应该生成哪些幻灯片的 Excel 文件。一旦一个合适的图表规范准备就绪,它就可以在每次项目启动时自动在数据集上运行。

自动化和进一步抽象上述 PowerPoint 文件的构建将是我们下一篇文章的主题。

盖尔·弗雷松是 Datasmoothie 的联合创始人,这是一个专门从事调查数据分析和可视化的平台。如果你对使用开源软件进行调查数据分析感兴趣,注册我们的时事通讯,名为自发认知

单尾还是双尾检验,这是个问题

原文:https://towardsdatascience.com/one-tailed-or-two-tailed-test-that-is-the-question-1283387f631c?source=collection_archive---------6-----------------------

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

Source: pixabay

了解统计测试的两种变体之间的区别,以及如何在 Python 中实现它们

在数据科学/计量经济学中我们在很多地方看到统计检验:相关分析、ANOVA、A/B 检验、线性回归结果等。因此,对于实践者来说,彻底理解它们的含义并知道为什么在特定的地方使用给定的测试是非常重要的。在这篇文章中,我想提供一些直觉来选择一个合适的统计检验版本——单尾或双尾——以符合陈述的假设。

进行任何统计检验的关键步骤是选择正确的假设,因为它们不仅决定了应该使用的统计检验的类型,而且还影响了它的版本。

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

PDF of a Gaussian Distribution

如果考虑的检验统计量是对称分布的,我们可以选择三个备选假设中的一个:

  • x 大于 y
  • x 比 y 小
  • x 不等于 y

前两个对应于单尾检验,而最后一个对应双尾检验。

让我们更深入地研究测试的两种变体之间的差异,并展示一些 Python 中的例子!

单尾检验

假设我们选择了 0.05(或 5%)作为显著性水平。使用单尾检验意味着临界区域位于检验统计的概率分布的顶部/底部的 5%。如果检验统计量落入这个区域,我们拒绝零假设。我们有效地测试了一个方向上的关系的可能性(明显更大或更小),而忽略了另一个方向上的关系的可能性。

单尾检验的一个重要特征是它提供了更多的能力来检测一个方向上的影响,因为它不检测另一个方向。然而,这也带来了一些威胁,我在下面的例子中对此进行了说明。

让我们想象一下,我们制造了一种新药,并想用当前的解决方案来测试它的有效性。我们可能会尝试使用单尾检验,因为它最大化了检测改进的机会(明确指定的效果方向)。但这让我们有可能忽略这样一个事实,即我们的药物实际上不如目前的药物有效。

这个例子表明,当遗漏一个效应的后果可以忽略不计时,我们应该选择单尾检验,而上面的例子并非如此。我们不应该仅仅为了获得统计显著性而选择单尾检验,因为这可能会导致无效的结论,在某些情况下还会导致可怕的后果。

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

Source

双尾检验

在双尾检验的情况下,我们正在检验一个不包含方向关系的假设。如果我们想测试样本均值是否等于 x(t-检验的零假设),那么另一个选项表明均值不等于 x。为了测试它,我们考虑均值显著大于和显著小于 x 的情况。在 5%的显著性水平下,当检验统计量落入临界区域(检验统计量概率分布的底部和顶部 2.5%)时,样本均值被视为与 x 显著不同。这导致 p 值小于 0.05,表明我们应该拒绝零假设,支持另一个假设。

Python 中的示例

让我们假设我们正在处理关于学校考试的数据。两所学校的学生写了同样的标准化考试,现在我们想调查平均成绩之间是否有统计学差异。

为简单起见,我们假设每所学校有 100 名学生,考试成绩来自具有不同参数的高斯分布。

生成数据

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

单样本 t 检验

在单样本 t 检验中,我们根据特定值检验样本的平均值。我们从检验的双尾变量开始,假设如下:

H_0:来自学校#1 的学生的平均成绩是 70
H_1:来自学校#1 的学生的平均成绩不是 70

stats.ttest_1samp(school_1, 70)# Ttest_1sampResult(statistic=42.90122143039788, pvalue=9.063698741097363e-66)

测试的 p 值低于 0.05,因此我们可以拒绝零假设,而支持另一个假设。

在第二个测试中,我们检查 2 号学校学生的平均成绩是否大于 90。

H _ 0:2 号学校学生的平均成绩大于等于 90
H _ 1:2 号学校学生的平均成绩小于 90

由于这是一个方向性测试,我们正在做 t 测试的单尾变体。

test_2 = stats.ttest_1samp(school_2, 90)# Ttest_1sampResult(statistic=-10.251936967846719, pvalue=3.087893244277984e-17)

scipy中,没有直接的方法表明我们想要运行测试的单尾变体。然而,为了获得期望的结果,我们自己调整输出。在这种设置的情况下,我们只需要将 p 值除以 2(测试统计保持不变)。

test_2.pvalue / 2# 1.543946622138992e-17

有了获得的p-value < 0.05,我们有理由拒绝零假设,支持替代方案。

为了彻底起见,我们还运行了测试的最后一个变体。

H _ 0:2 号学校学生的平均成绩小于或等于 90
H _ 1:2 号学校学生的平均成绩大于 90

test_3 = stats.ttest_1samp(school_2, 90)

我们还需要校正 p 值,这次的方法略有不同:

1 - test_3.pvalue / 2# 1.0

有了所得的p-value=1,我们就没有理由拒绝零假设。校正 p 值的方式取决于我们考虑的另一个假设,它是否涉及“更大”或“更小”的测试。

双样本 t 检验

在双样本检验中,我们检验两个样本均值的相等性。

H_0:来自学校#1 的学生的平均成绩与来自学校#2 的平均成绩相同

默认情况下,stats.ttest_ind假设总体具有相同的方差(在这种情况下是正确的,请参阅数据生成)。

stats.ttest_ind(school_1, school_2)# Ttest_indResult(statistic=6.635596055724986, pvalue=3.0230309820272883e-10)

结果表明,我们应该拒绝两个学校平均成绩相等的零假设,这符合我们的预期。

为了保持文章简短,我们只考虑检验的双尾变量,因为单尾计算类似于单样本 t 检验的代码。

结论

在这篇文章中,我提出了一些关于统计检验的单尾和双尾变量的直觉。默认情况下,大多数统计软件产生双尾结果。这就是为什么能够将这些结果转换为单尾等价结果也很重要。

如果你喜欢这篇文章的主题,你可能也会对描述功耗分析的文章感兴趣。

一如既往,我们欢迎任何建设性的反馈。你可以在推特或评论中联系我。文章的代码可以在这里找到。

一个统治所有人的工具

原文:https://towardsdatascience.com/one-tool-to-rule-them-all-c007b9489424?source=collection_archive---------35-----------------------

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

Photo by Randy Fath on Unsplash

如果你和我一样,你会重视用更少的资源做更多的事情——效率。当我还是一名电工时,我会尽量减少所需工具的数量,这样不仅可以减轻重量,还可以充分利用每件工具。数据科学家经常使用终端,移动文件或创建 git 存储库,然后上传到 GitHub。如果一个工具可以自己完成所有这些任务会怎么样?这样的工具是存在的,它叫做 Pycharm。

ycharm 是一个 IDE 或集成开发环境,它很简单,我们可以像程序员一样开发和处理代码。Pycharm 与众不同之处在于它内置了所有功能。本文将介绍 Pycharm 可以帮助我们实现更高效的工作流的几件事情。

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

Photo by Alvaro Reyes on Unsplash

首先,Pycharm 使用了 python,但并不局限于只使用 python。支持许多其他语言,如 R、Javascript、CSS、HTML 等等!Pycharm 附带了大多数库,并且可以通过终端或首选项中的插件部分安装其他库。插件这个词对任何编程爱好者来说就像音乐一样,它是新的兔子洞,花了无数个小时才意识到你已经走得太远了,现在不能回来。Pycharm 有一个插件部分,允许你安装更多的语言支持或主题,这样你就可以把它变成你自己的 IDE。这里简单看一下插件部分:首选项>插件。

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

在 marketplace 选项卡中,您可以找到不同的插件来满足各种需求或定制您自己的用户体验。我鼓励任何使用 Pycharm 的人在这里找到一些东西,并花时间尝试不同的插件设置。

版本控制

注意上面截图中写着“版本控制”的地方?每个软件工程师和数据科学家最好的朋友都住在那里——Git。您不仅可以找到使用 Git 的选项,还可以在 Pycharm 中链接 GitHub 并提交所有内容,而无需离开并打开终端。最好的部分是没有插件可以下载,Git 和 GitHub 都是预装的,随时可以工作。

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

在 version control 选项卡中,可以根据用户的偏好更改 Git 设置。在 Git 标签下,有 GitHub。在这里,只需点击“+”按钮并填写以下信息,即可链接 GitHub 帐户:

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

可以在 GitHub 上生成一个令牌来使用,我建议走这条路以避免任何安全问题。一旦 GitHub 帐户全部链接起来,并且你已经完成了你的第一个项目,你就可以提交和推送它了。提交并推送到 GitHub 只需要一个键盘快捷键:在 Mac 上,你可以点击shift+command+k弹出一个提交窗口,然后点击推,完成!Pycharm 甚至会为文件夹提供不同的颜色,让你直观地看到它们是否是 GitHub 的最新版本。最后,您可以将多个 GitHub 链接到 Pycharm,这样您就可以将您的个人 GitHub 和一个企业链接起来。

末端的

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

Photo by chuttersnap on Unsplash

典型地,当我们上传到 GitHub 时,终端是首选的工具。然而,现在我们已经不需要终端了吗?一点也不!Pycharm 有一个内置的终端窗口,所以在 IDE 之间访问和使用终端都在一个地方。如果有的话,终端现在更容易访问,因为不再需要切换窗口,从而减少了完成终端相关任务所需的时间。

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

上面你可以看到我一直在做的 python 脚本。如果我想测试它,我可以在位于代码部分正下方的终端窗口中运行它。

朱皮特

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

Source

ycharm 也可以运行 Jupyter 笔记本电脑,这是无价的,因为它允许我们在运行模型或测试代码的同时处理实际的代码。Pycharm 有这个功能已经有一段时间了,但随着 2019.2 更新到程序,它变得更加可靠和有用,创建了一个更稳定的环境。同样在 2019.2 更新中,增加了“全部运行”功能。我把 Jupyter 笔记本留到了最后,因为它在 Pycharm 的终端中创建了一个本地服务器,所以你现在可以在一个地方托管所有东西,而不必切换或管理两个独立的终端窗口。

最后的想法

Pycharm 对任何开发人员来说都是一个很好的工具,它拥有科学家日常需要和使用的所有功能强大的数据。从 HTML 到 SQL,Pycharm 都能做到。我想补充一下,Pycharm 可以在这里下载。JetBrains 是开发 Pycharm 的公司,提供 30 天的专业级软件试用。有一个社区版,可以使用一些有限的功能,但总的来说本身就是一个了不起的工具。我的生活哲学是拥有合适的工作工具,这在我做电工的时候很重要。拥有一个好的工具不仅对工作流至关重要,对数据科学家个人的发展也至关重要。

一个字的代码停止使用熊猫这么慢

原文:https://towardsdatascience.com/one-word-of-code-to-stop-using-pandas-so-slowly-793e0a81343c?source=collection_archive---------2-----------------------

那将永远改变你的生活

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

Photo by Lance Anderson on Unsplash

您已经将所有数据加载到 Panda 的数据框架中,准备进行一些探索性分析,但是首先,您需要创建一些附加的要素。很自然地,你转向应用功能。Apply 很棒,因为它使得对所有数据行使用函数变得很容易。您设置好一切,运行您的代码,然后…

美国驻 T2 大使馆

事实证明,处理一个大型数据集的每一行都需要一段时间。谢天谢地,有一个非常简单的解决方案可以为您节省大量时间。

下前支索

Swifter 是一个库,它“以最快的方式将任何函数应用到 pandas 数据帧或系列中。”要理解这一点,我们需要先讨论几个原则。

…向量化…

对于这个用例,我们将把矢量化定义为使用 Numpy 来表示整个数组的计算,而不是它们的元素。

例如,假设您有两个数组:

array_1 = np.array([1,2,3,4,5])
array_2 = np.array([6,7,8,9,10])

您希望创建一个新数组,它是两个数组的和,结果是:

result = [7,9,11,13,15]

您可以用 Python 中的 for 循环对这些数组求和,但这非常慢。相反,Numpy 允许您直接在数组上操作,这样速度明显更快(尤其是对于大型数组)

result = array_1 + array_2

关键的一点是,只要有可能,就要使用矢量化运算。

并行处理

几乎所有的计算机都有多个处理器。这意味着你可以很容易地通过利用它们来加速你的代码。由于 apply 只是将一个函数应用于数据帧的每一行,因此很容易实现并行化。您可以将数据帧分成多个数据块,将每个数据块提供给处理器,然后在最后将这些数据块组合成一个数据帧。

魔力

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

Source: https://github.com/jmcarpenter2/swifter

斯威夫特做的是

  1. 检查你的函数是否可以矢量化,如果可以,就使用矢量化计算。
  2. 如果无法实现矢量化,请检查是使用 Dask 进行并行处理还是仅使用 vanilla Pandas apply(仅使用单核)最有意义。对于小型数据集,并行处理的开销会使处理速度变慢。

这在上图中得到了很好的展示。您可以看到,无论数据大小如何,使用矢量化几乎总是更好。如果这是不可能的,你可以从 vanilla Pandas 获得最好的速度,直到你的数据足够大。一旦超过大小阈值,并行处理最有意义。

您可以看到“swiftapply”行是 swifter 会做的事情,它会自动为您选择最佳选项。

你怎么利用你问的这种魔力?简单。

如上所示,只需在应用程序前添加更快的调用,现在只需一个单词,您就可以比以往任何时候都更快地运行您的熊猫应用程序。

现在,你可以花更少的时间盯着进度条,花更多的时间做科学。这改变了生活。不过,你可能没那么多时间进行剑战了。

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

Source: https://xkcd.com/303/

免费获得掌握数据科学的 11 种极其有用的资源

图表中一年的卡路里计数

原文:https://towardsdatascience.com/one-year-of-calorie-counting-in-graphs-4a89784e11d7?source=collection_archive---------22-----------------------

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

*请注意,本报告最初撰写于 2018 年 11 月,因此数据涵盖了 2017 年 11 月至 2018 年 11 月这一年

动机

一年前,我刚开始第一份全职工作几个月,还在学习如何成为一个有功能的人,差一磅就要有一个肥胖的身体质量指数。需要做一些事情。

所以,我开始记录我每天的卡路里摄入、卡路里消耗和体重,以此来记录我的健康状况。最初的目标只是看看随着时间的推移,降低我的净热量是否对我的体重有任何影响。虽然这是我能够回答的问题之一,但在过去的一年里,计算卡路里的旅程变得更加漫长。

我想谈谈在跟踪我的健康状况的过程中,我经历过的最大的积极面,以及在这段经历中我面临的最大的消极面。希望这能帮助你决定健康追踪是否适合你!

关键积极因素(+):随着时间的推移取得了可衡量的进展

我的健康跟踪带来的最大积极影响是,它让我能够直观地跟踪我的进展,并查看我所做的任何改变(积极的或消极的)是否对我的健康有任何影响。因为我最初的主要目标是减肥,所以这就是我想在这里谈论的故事。

虽然你的减肥速度取决于其他几个因素,如遗传和活动水平,但通常的想法是,你保持的净热量越低,你可以减掉的体重就越多。先来看看我一段时间的净热量。

一段时间内的净卡路里

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

  • 虽然原始数据(蓝色)非常嘈杂,但一旦我们采用滚动平均值(红色),真实趋势就会变得更加明显。自从我开始收集数据以来,我的净卡路里一直在稳步增加,最终在 4 月底达到峰值,每天大约 3500 净卡路里(哎呀!)
  • 老实说,在那一点上,我记得我一直感到疲倦和沉重,并意识到如果我想减少我的净热量,我要么需要增加我的热量,要么减少我的热量。问题显然出在我摄入的卡路里上(我吃得太多了),所以我有意识地努力少摄入卡路里
  • 从那以后,我的净热量在 5 月底下降,此后稳定在 2000 卡路里以下
  • 另一个有趣的地方是,我的净卡路里波动性(蓝色图表的范围)自波动性在 4 月达到峰值以来一直在减少,这意味着我发现自己每天的卡路里摄入更加一致

现在看看我同期的体重:

重量随时间变化

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

  • 对于从 180 到 165 的最初下降,我真的很兴奋,这种下降在 12 月中旬结束。我以为我会永远以同样的速度减肥,但我肯定错了
  • 在我最初的减肥冲刺后,我发现我的心态放松了,让自己吃得更多(从上面的净卡路里图可以看出),这最终让我付出了代价。到四月中旬,我已经回到了在这一切开始的地方
  • 即使当我稍微收敛一点,开始控制饮食,我的体重也没有真正改变,反而在 175 左右徘徊了几个月。
  • 只是在最近两个月(9 月和 10 月),我才看到体重和去年 12 月时一样低。我想一部分原因是因为我停止了每天追踪体重,但更多是在以后!

当然,我们还没有在同一张图上看到净卡路里和体重,所以让我们看看它们是如何比较的。由于它们在不同的尺度上,我用对它们进行了归一化(本质上是在不改变数据形状的情况下让它们在相同的尺度上)。

净卡路里和体重有什么关系?

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

  • 第一个月似乎很奇怪,因为我的净卡路里在增加,而我的体重在迅速下降,但我认为这更多地是因为去年 11 月,在几年相对不活跃的大学生活后,我第一次开始认真锻炼。我的身体似乎对此很欣赏
  • 真正酷的事情是,在第一个月之后,这两条线似乎彼此非常接近,尤其是从今年三月开始!如果你想知道为什么没有 7 月以后的数据,那是因为我在 8 月初就停止了跟踪我的每日体重,但正如我所承诺的,很快会有更多的数据

关键否定(-):健康变成了一场游戏

每当你开始有意识地、频繁地记录某件事,不管是你的财务状况、工作表现,还是你的健康状况,那件事就会开始变得像一场游戏。这似乎是一个潜在的积极因素,因为你想得到最多的分数,因此保持动力,但这也可能会造成严重的精神负担。

这就是我四月初的遭遇。

直到四月,我判断自己的唯一标准是净卡路里。此外,我设定了我的目标,总是保持我的净卡路里低于 2000。虽然这种方法工作了一段时间,但我很快发现自己在尝试“入侵”自己的系统。

也就是说,如果晚餐结束时我的净卡路里碰巧是 1500 左右,我会发现自己吃了一些我不需要的东西,只是因为我还没有达到 2000。在我看来,我很聪明。与此同时,我的身体为此付出了代价,因为我经常吃像冰淇淋、巧克力等垃圾食品。此外,我很少在这样的日子里锻炼,因为我的净卡路里已经低于 2000,所以为什么还要进一步减少呢?

事实上,当我做了一个净卡路里的柱状图时,我的大部分日子都紧紧围绕着 2000 年:

净卡路里的分布

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

大约就在这个时候,我想出了第二个衡量标准,这个标准将把净卡路里作为衡量我是否健康的唯一标准。这个指标被称为卡路里出入比率,简单定义为卡路里出入除以卡路里。

要了解这一指标的威力,请比较这两个潜在的天数。在第一天,你消耗 2000 卡路里,燃烧 0 卡路里,产生 2000 净卡路里。在第二天,你消耗了 2500 卡路里,燃烧了 500 卡路里,也产生了 2000 卡路里的净热量。但是,我宁愿在第二天,因为我有相同的净热量,但也有良好的锻炼带来的好处。由于第一天的比率为 0,但是第二天比率为 0.2 (500 卡路里的输出除以 2500 卡路里的输入),所以输出-输入比率反映了这一点。

好消息是,在我开始使用这个指标之前,我已经有了填充五个月的出入比率值所需的所有信息。因此,我也可以随时检查我在这一指标上的进展:

一段时间内的热量输出/输入比率

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

  • 这个指标在很长一段时间内稳定在 0.1 左右,直到 5 月下旬达到峰值,也就是在 4 月下旬,我开始增加锻炼,减少饮食,以应对健康爆发点
  • 在 6 月份和 7 月份的大幅下降之后,过去三个月里,转出与转入比率一直在稳步上升,接近 0.2

从 4 月份开始,我发现自己不太倾向于“侵入”自己的系统,并且在使用净卡路里和进出比率来确定每天的健康状况时,感觉更稳定了。

关键正面(+):卡路里成为货币

在过去的一年中,一个持续的积极因素是我开始把卡路里视为一种货币形式。在追踪我的健康状况之前,我只会吃我想吃的东西,并不时地为自己的决定后悔。然而,在过去的一年里,我发现自己提前思考了我的一天。大约在午餐时间,我会根据我是否有一顿大餐的计划,是否想用一份美味的甜点犒劳自己,或者是否坚持到了早晨锻炼,来开始考虑我想吃多少。

肯定有这样的时刻,我曾考虑过在工作时吃点生日蛋糕,但却因为没有足够的卡路里而停止了。事实上,这种心态的转变花了我几个月的时间来真正巩固,它帮助我把卡路里当作资源,并帮助我限制我的消费。

关键否定(-):过度问责

在我开始跟踪健康的时候,一个很大的目标是,如果我没有达到我的目标,我会对自己负责。当净卡路里仍然是我的主要性能指标时,我已经在我的数据中包含了一个名为“原因”的列。任何一天,当我摄入超过 2000 卡路里时,我让自己写下失败的原因

这在一段时间内起了作用,帮助我理解了是什么导致了我的失败,但是它很快变得非常压抑。有几个星期,我参加了几次社交活动,或者去健身房的时间更少,我会不断地用文字向自己解释我的失败。它从信息变成了彻头彻尾的士气低落**。**

因此,随着我前面提到的 out-in 比率的采用,我从我的数据中删除了这一列。相反,我选择只是在心里记下我是否未能实现目标,并思考未来的一天,而不是记录我失败了多少次。

由于我的目标在三月初有所改变,更加关注体育锻炼,我选择放弃上面提到的“原因”专栏,转而选择了我的数据中的两个新专栏,名为“有氧运动?”和“重量?”对于我那天是否完成了心血管或重量训练,每一个问题都只是一个是/否。这两个简单的衡量标准对我个人来说非常有效,确保我经常锻炼而不会过于专横。它们让我能够跟踪一年中我的锻炼频率是如何变化的:****

一段时间内的有氧运动和重量训练(每个黑条代表一天的训练)

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

  • 从这张图表中最大的收获是,我的锻炼频率在过去的几个月里已经稳定下来,但是比六月和七月的低谷期要好得多

同样是在三月初,我开始跟踪我每天结束时的总体情绪,我简单地把它分为😃😐,或者:()。这绝对是我最不“科学”的衡量标准,但却帮助我思考为什么我的一天会这样。情绪绝对不仅仅是我测得的健康数据的函数,但情绪和卡路里之间仍然有很大的关系,如下所示:

卡路里和情绪之间的关系

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

  • 可以很清楚地看到平均摄入热量随着情绪下降而增加,而平均摄入热量随着情绪上升而增加。虽然我真的没有真正的科学可以给你,但我可以说,在我锻炼的日子里,当我没有吃得太多以至于在一天结束时感觉很糟糕的时候,我感觉好多了。

最近,在八月初,我变得如此专注于减肥,以至于我发现自己在一天之内去了三四次体重秤,经常惊讶地发现两个小时内什么都没有改变。我知道体重是我想追踪的最大指标之一,但这种每日追踪在道德上让我痛苦不堪。为了保持理智,我选择放弃潜在有用的数据。我现在的系统是每月检查几次我的体重**,并记录下来,而不是每天都检查。**

结论

我认为在过去的一年中,健康跟踪对我来说是一个整体积极的事情,并且不需要太多努力,特别是在这些天先进的健康监测应用程序的帮助下。尽管如此,重要的是要注意不断监测你的健康会对你的…嗯,健康产生负面影响。和往常一样,良好的平衡以及反复试验是你可以使用的最好工具。

我希望上面的一些想法和数据能帮助你决定是否要开始追踪自己的健康状况!

数据收集说明

如上所述,这个项目最初是通过每天测量三个指标开始的:卡路里摄入、卡路里消耗和体重。

我尽可能精确地测量卡路里,在有营养数据时研究它们,在没有营养数据时做最好的估计。

类似地,我根据我当时的体重,通过咨询各种运动的卡路里燃烧率来计算卡路里。值得注意的是,这并不包括休息时燃烧的卡路里。也就是说,我只记录了有意的身体活动消耗的卡路里。

我用家里的电子秤计算体重,并尝试每天在相同的时间测量。

使用 Tensorflow.js 进行在线机器学习

原文:https://towardsdatascience.com/online-machine-learning-with-tensorflow-js-2ae232352901?source=collection_archive---------19-----------------------

关于如何使用 Tensorflow.js 在浏览器中创建、训练和测试机器学习模型的端到端指南

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

(Source: https://miro.medium.com/max/1400/1*F-1fq9TNjDnAYPAXnZP4Ww.png)

介绍

由于最近人工智能的进步,现在建立和训练机器学习模型变得相对容易。虽然,这些模型只有通过分享它们,让它们做好在线预测的准备,才能让社会受益。

在我之前的一篇文章中,我解释了如何使用 Heroku 和 Flask 创建和部署一个简单的机器学习模型,今天我将为您提供另一个选项:Tensorflow.js。

Tensorflow.js 是 Google 创建的 Javascript 库,用于将机器学习能力嵌入到任何形式的 web 应用程序中。

为了添加一些浏览器内可视化,Tensorflow.js 使用了一个名为 *tfjs-vis 的小库。*这个库可以用来创建一个侧面板,所有的内容都可以在上面显示。

除此之外,谷歌还开发了另一个名为 ml5.js 的库,旨在使在线部署预训练模型变得非常容易。这样,非专业人员也可以开始在网络上部署机器学习模型。一个简单的例子,如何使用谷歌 PoseNet 预训练模型是可用的这里

有 3 种主要类型的模型可以在线部署:

  1. 回归模型

在这个例子(GIF 1)中,我决定使用“瑞典汽车保险风险溢价分析委员会”数据集来训练和可视化一个简单的回归模型。打开网页后,培训过程将实时在线进行。

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

GIF 1: Training and Visualizing online a Regression Model

2.分类模型

在这个例子(GIF 2)中,我决定使用“葡萄酒数据集”来训练一个分类模型。在这种情况下,培训过程也是实时在线进行的。此外,还提供了所用神经网络层特征的总结和分类矩阵。

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

GIF 2: Training and Visualizing online a Classification Model

3.预训练模型

最后,在这个例子(GIF 3)中,我决定使用一个预先训练好的模型。我首先使用“Pima Indians Diabetes Database”用 Python 训练了这个模型,将其保存为 JSON 文件,最后将其部署到网上,准备进行预测。

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

GIF 3: Making Predictions and Visualizing online using a Pre-Trained Model

这三个例子都可以在我的个人网站上找到,如果你有兴趣测试一下的话。

在本文中,我将带您了解如何实现这三个示例中的第一个。

所有用于创建这些例子的代码和数据集都可以在我的 GitHub 库中找到。

示范

对于这个例子,我将使用这个“瑞典汽车保险风险溢价分析委员会”数据集。这个简单的数据集仅由两列组成(X =索赔数量,Y =瑞典地理区域内所有索赔的总支付额,单位为千瑞典克朗)。

作为演示的一部分,我们将通过检查索赔分布的总数来预测所有索赔的总支付额。

设置

首先,我们需要创建一个 HTML 页面来显示我们的内容。下面的代码片段提供了一个基本的模板,您可以随意添加任何您想要的功能!

预处理

我们现在可以创建另一个名为 script.js 的文件(在我们的 HTML 文件的同一个目录中),在这里我们可以开始加载数据集并执行一些基本的预处理任务。

为了从 JSON 文件加载数据集,我们可以使用下面的函数( getData )。在这个函数中,我们首先加载数据集,然后选择我们感兴趣的列,并给它们取一个用户友好的名称。最后,使用一个过滤函数,我们去掉所有出现在所选列中的 nan(不是一个数字)。

接下来,我们可以创建一个函数来预处理我们的数据集( convertToTensor )。在这种情况下,我们:

  1. 混洗数据 =随机化样本的顺序,这些样本稍后将用于训练我们的回归模型。通过这种方式,与原始数据分布相比,我们可以为我们的模型提供更多种类的数据(这是因为当输入模型时,我们的训练数据将被连续划分为更小的子集,称为批次)。
  2. 将数据分为特征和标签 =特征将是我们的输入样本,标签将是我们的真实输出值(基本事实)。
  3. 以张量形式转换特征和标签 =我们将原始数组转换成二维张量。
  4. 标准化输出张量 =将我们的数据重新调整到 0 到 1 之间的范围。这样做是为了防止训练模型中出现过大或过小的值(上溢/下溢)的问题。一旦训练了我们的模型,我们就可以反规格化我们的输出来获得我们的最终结果。

定义和训练我们的模型

我们现在可以继续设计一个简单的机器学习模型( createModel ),然后创建一个函数来训练它( trianModel )。

在这种情况下,我利用回调来调用 Tensorflow.js 图形支持库 tfjs-vis ,以便创建一个实时图形,显示我们的模型损失在训练期间是如何变化的(图 1)。如果你有兴趣更详细地了解回调是如何工作的,我在本文中提供了更详细的解释。

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

Figure 1: Real-Time model Loss

测试

现在我们的模型已经训练好了,我们可以开始做预测了。为此,我设计了下面的函数( testModel )。在这个简单的例子中,我决定使用训练数据本身来测试我们的模型性能。

此外,我还对我们的模型预测进行了反规范化,然后将它们与真实输出进行了对比,以便检查我们的模型性能(图 2)。

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

Figure 2: Model Predictions vs Original Data

运行模型

最后,我们现在需要创建一个函数来运行所有代码(运行)。在这个函数中,我们首先执行一些数据可视化,然后调用我们之前定义的所有函数(图 3)。

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

Figure 3: Scatterplot of the original data

现在,您可以通过在自己的网站上运行或使用本地服务器来测试您的模型。如果您从未使用过本地服务器,一个简单的解决方案是使用 Visual Studio 代码并安装其 Live 服务器扩展

联系人

如果你想了解我最新的文章和项目请关注我的媒体并订阅我的邮件列表。以下是我的一些联系人详细信息:

网络营销测量:哪一半?

原文:https://towardsdatascience.com/online-marketing-measurement-which-half-ce7ef3f26b7e?source=collection_archive---------34-----------------------

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

John Wanamaker (1838–1922)

广告在今天的互联网上一直存在。他们支持谷歌和脸书,并跟随我们到任何地方。与所有营销支出一样,它们是一种投资。与大多数投资一样,衡量投资回报至关重要。

使在线营销与众不同的是建立精确测量工具的前所未有的可能性。

在这篇文章中,我将描述一些在行业中广泛使用的技术,并分享我在构建 Airbnb 的展示营销测量框架时获得的一些经验。

归因和增量

为了公平地估计 roa(广告支出的回报),我们需要能够将增量购买归因于引起它们的活动。我们对接触有机购买的人群不感兴趣(例如,自己购买),而是接触不打算购买的人群,并通过我们的广告说服他们。两者之间的区别是相关性和因果性之间的区别,并且可以被目标机制所利用。如果我们不区分有机购买和增量购买,定位算法将因描述和定位更有可能购买的用户而获得奖励,这将是“向唱诗班布道”。

我们希望从我们的在线活动中接触到那些被说服的人,并说服他们购买我们的产品。

这有点微妙,因为特别是像旅游住宿这样的商品,我们可能需要多个接触点来与用户建立关系,并慢慢地将他们转移到漏斗中。

不幸的是,老学校的归属系统依赖于臭名昭著的“最后点击”:即在购买获得信用之前最后点击的广告。

这是有问题的,因为它没有区分增量销售和有机销售,但它也有较大的偏差。

美国和欧洲的大多数用户拥有多种设备,并通过桌面、移动和标签登录。这使得跟踪用户旅程变得很有挑战性。Cookies 被删除和多个用户从同一设备登录只是构建和维护设备图的两个问题,设备图可以帮助识别用户已经接触了哪些广告。

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

由于这个问题,展示渠道(如脸书、Instagram、YouTube 等。)与漏斗中较低的渠道(如 SEM(搜索引擎营销))相比,过于不利。

在“最后一次点击”的世界中,SEM 营销获得了很大份额的信任,这也是因为用户很可能通过谷歌相关关键词被重定向到该网站,这应被视为一种有机(即非增量)购买。

为了理解“最后一次点击”的归因是多么荒谬,想象一下向你的另一半求婚,如果有理由相信订婚戒指是他们积极回应的唯一贡献者。

幸运的是,统计学家有很多锦囊妙计,可以追溯到几个世纪前的许多实验设计可以拯救我们。

实验和测量

如上所述,测量增量的问题恰恰是相关性与因果性的问题:我们想要识别我们引起的购买,而不是将我们的广告与用户的购买倾向相关联。

主要的挑战是尽可能地将目标从用户的动作中分离出来,这在这些复杂的环境中并不容易。

在控制大多数已知因素的同时,实验是精确测量因果关系的最佳工具。

实验的设计将取决于广告平台的性质:在最受欢迎的选项下面。

意向治疗(ITT)

我要描述的第一种方法是临床试验领域的一种非常古老的技术,也是脸书的转换提升研究工具中使用的方法之一。

当试图确定目标算法的效果时,我们无法将算法选择的受众与固定的控制进行比较。这将奖励樱桃采摘:如果算法被训练来选择有机转换器(即无论如何都要购买的用户),我们将高估算法的性能,混淆有机行为(相关性)和增量效应(因果关系)。

意向性治疗(ITT)是一种分析实验的技术,其中存在单方面的非依从性,即当治疗组中的一些受试者没有接受治疗时。将非服用者排除在分析之外会导致选择偏差,但忽略这个问题并假装治疗组中的所有受试者都是平等的会低估效果或只是测量不同的东西(即被分配到治疗组的效果而不是治疗本身的效果)。

ITT 原则可以用“一次随机,永远分析”来概括。 ICH 声明“意向性治疗原则意味着主要分析应包括所有随机受试者。遵循这一原则需要对所有随机受试者进行完整的随访,以了解研究结果。在实践中,这一理想可能难以实现[……]”。该建议的理由是,即使数据缺失(不符合)不是完全随机的,ITT 分析也会给出稳健的估计。这将涵盖不遵从治疗的或多或少严重的患者的临床情况,或者,在我们的营销案例中,用户是由算法精心挑选的。

一般来说,当试图测量绝对增量(或提升)时,我们可以问以下问题:

  1. 向 100 个人展示一个广告会带来多少额外的销售额。
  2. 100 个人看到这个广告会带来多少额外的销售额。

ITT 不仅不受缺乏合规性的影响,而且可以衡量什么是可操作的(选项 1),而且在很少假设的情况下,它允许我们衡量两者。

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

ITT Design

上图把设定解释的相当清楚。条纹衬衫代表高意向用户,他们必然会有机转化。在玩具示例中:

  • 治疗是中性的。暴露后转化的概率与有机率相同,为 50%
  • 覆盖率(即接受治疗的治疗使用者的百分比)为 42%
  • 该算法以高意向用户为目标,这些用户无论如何都会转化,因此治疗中有 83%的用户会转化。
  • 由于有偏见的目标,只有 25%的从未服用者(即治疗组中没有得到治疗的使用者)转变了。
  • 如果我们不是以 ITT 的方式来分析,我们会得出这样的结论:增量转换率是 33%

脸书的提升测试工具使用 ITT 分析来测量增量。由于目标算法针对更有可能转化的人进行了优化,因此很难找到类似的控制(这实际上非常容易,但需要改变目标算法,类似于谷歌的幽灵广告。)

治疗和控制之间的分离发生在“整体”水平(即,受众中的所有用户都有资格进行拍卖),然后广告被显示给治疗组中的一部分人。维持组和测试组的拍卖资格都有记录,印象也是如此,但接触过广告的控制用户的子集没有记录(下图中的红色三角形)。

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

Facebook Lift Study

ITT 设计很容易实现,通过一些简单的数学计算,我们可以从“向 100 个人展示一个广告会带来多少额外的销售额”到“100 个人看到这个广告会带来多少额外的销售额”。后者等于第一次缩放(除以)的范围。

这种设计的缺点是低覆盖范围会大大减弱信号,因此在计算功率时需要考虑覆盖范围。

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

Power curves at sample size 200

由于这一事实,ITT 不太适合广泛接触运动:这种倡议假设接触广泛受众中少数有前途的个人,因此它们本质上是为低接触而设计的,最终动力不足。

在下一节中,我们将描述另一个可以解决这个问题的设计。

“幽灵”广告

如前一节所述,当目标算法优化了谁被派发广告的选择时,就很难确定适当的控制。

ITT 设计在分配水平上比较各组,但这有局限性,因为当治疗组的 reach 百分比较低时,估计可能具有较高的不确定性,这可能导致信号减弱。

这个问题的另一个流行解决方案是预测幽灵广告。这种方法首先由谷歌开发,用于精确测量他们的显示广告,包括使用与定向相同的算法来识别对照组中“会被提供”广告的用户,并将他们作为治疗组中实际提供广告的可比组。

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

Ideal Experimental Setting

这是一个理想的设置,因为我们将使用相同的标准来选择治疗组和对照组,然而,这可能是复杂的和难以实现的,特别是在更复杂的广告定位系统中,

在第三代系统中,优化程序将使用从站点访问中提取的特征,并将学习更多关于治疗组中的用户的信息,这可能会引入偏差,因为相同的学习对于对照组中的用户是不可能的。对照组最终会成为第一次接触的目标用户的代表,但他们对第一个广告的反应的任何信息都只能在治疗组中获得,这引入了潜在的偏见。然而,第二代系统只使用用户特性,因此尽可能保持两个组的同质性。

GDN 定位算法属于第二代家族,它可以轻松利用 Ghost Ads 框架。然而,脸书的目标更先进,这就是为什么它必须依靠某种形式的 ITT。

这非常难以实现,但是在混合 Ghost-ITT 设计中,将机会记录减少到第一次接触将是增加范围的一个很好的折衷。

“分割”测试

当然,即使在这种情况下,经典的 AB 测试也有其用途。分割测试是设计用来测量一个活动的某些特征的相对增量的实验。绝对增量是投放广告的因果效应,相对增量是一个版本的广告相对于另一个版本的附加值。

此工具对于快速迭代复制更改、图像、设计等非常有用。虽然这种测试很容易启动,但可能很难衡量即时的变化(由于购买的延迟)。

地理层面的实验

所有这些技术都假定在广告管理中有高度的控制。这就是为什么他们嵌入了供应商(脸书、谷歌等)的生态系统。).他们的成功基于个体靶向性,确保治疗臂之间无溢出和分离。

然而,有许多广告渠道不能给予这种程度的控制。例子包括:

  • 广播/电视/户外广告
  • 长期影响(即使使用当前的工具,也难以长期对用户进行分组)

由于我们无法控制单个单位的分配,在这种情况下,我们根据位置分配我们的支出。由于用户只能在特定时间处于特定地理位置,根据他们的移动性,我们可以控制谁是特定活动的目标,谁不是。

这可以通过选择几个城市、州或指定的市场区域(DMA)作为目标,而将其他几个安静的区域作为对照来实现。这显然是一个大规模的操作,意味着内部协调,并在由于控制区域和对 roa 的理解而导致的销售损失之间进行权衡。

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

DMA’s in the USA

我不会在这里深入讨论如何分析这些类型的实验。像差异中的差异(非常类似于谷歌的基于时间的回归)这样的技术很容易实现,但往往不可靠。合成控制(如谷歌的因果影响包)类型的技术更灵活,允许更高的功率和更强的推理。

数据中心方法

这篇文章给出了一个营销测量的鸟瞰图,并描述了一些重要的技术。

还有一些我没有涉及到的领域,但是同样重要。努力像建立一个可靠的自下而上的多接触归因模型(MTA 又名数字营销的圣杯)或混合媒体模型(嗯,自上而下的方法来决定在哪里花下一个营销美元)。

建立数据驱动的数字营销团队的关键是培养数据文化。尽管数据科学家对测量技术有着深刻的理解,但市场营销人员对数据有着最佳的感觉,并且在获得访问权限和培训后,能够扩展测量工作。对数据的更多关注也将有助于提高数据质量,因为停机将被更早地报告。

允许营销人员将他们的营销活动作为实验,并赋予他们对统计测试的理解,将允许更好的假设得到检验,更快地失败并采用新的知识。

这最终可以总结为一种“衡量它或根本不做它”的文化,在这种文化中,只有当投资回报是可衡量的时,美元才会被花掉,而这只能通过衡量工具的民主化来实现。

选择权在你…

词汇表

  • DMA =指定市场区域
  • SEM =搜索引擎营销。搜索引擎搜索顶部的赞助广告。
  • SEO =搜索引擎优化。
  • ROAS =广告支出的回报
  • MTA =多点触摸属性。
  • MMM =混合媒体模型。
  • ITT =意图治疗
  • 吃了 =治疗效果一般

原载于 2019 年 11 月 10 日http://mrpozzi . github . io

在线扑克——何时赚钱?

原文:https://towardsdatascience.com/online-poker-whens-the-money-a22fe3fa7a6?source=collection_archive---------10-----------------------

玩的最佳时间和它的价值

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

Photo by Michał Parzuchowski on Unsplash

当扑克玩家在线分享牌局进行策略讨论时,他们会将自己标记为英雄,将对手标记为恶棍。无论这是为了隐藏他们的身份还是他们的对手,这种随意的行话揭示了一个关于扑克的基本真理-这是每个玩家与世界的对抗,如果你需要一个英雄,不要看得太远,因为没有人会来救你。

这就是我过去十年生活的现实。作为一名职业扑克玩家,我专注于两人对决锦标赛(常规德州扑克,但只有两名玩家),我经常发现自己陷入旷日持久的在线领地之争。我交过朋友,但它们通常只有在互利的情况下才会持续,这通常相当于“我们都很好,我们不玩对方如何?”

这个世界是我的第二天性,但有时很难用语言来表达。因此,为了描绘一幅更清晰的画面,我将数据科学工作流应用于一年的游戏摘要样本(大约 200,000 份,超过 14,000 名不同玩家,全部来自一个买入级别),主要目标是回答问题“职业玩家玩游戏的最佳(最赚钱)时间是什么时候?”本文着眼于该分析的一些过程和结论。

数据争论

第一步是争论我的数据。为了做到这一点,我获取了游戏摘要数据,并将其子集化为每个唯一的玩家,使用来自每个子集表的聚合玩家结果来填充玩家结果表。游戏计数表是通过每小时对时间序列进行重新采样获得的,每小时计数一次。

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

时间序列 EDA

将确定最有利可图的游戏时间作为我的主要目标,并假设这将与每小时的游戏数相关,我首先对每小时的游戏时间序列进行了一些 EDA(探索性数据分析)。有几件事很突出:

工作日的客流量比周末高

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

工作日的平均流量高于周末,这可能会让最有经验的玩家感到惊讶。

数据中有空白

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

从频率分布来看,每小时 0 场比赛似乎在数据中被夸大了。在这种情况下,我已经知道数据中有一些漏洞,但通过这个视图,我对这些漏洞的规模有了更好的了解,这将有助于为任何填充策略提供信息。

时间序列是季节性的

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

这里第 0 天是星期一,第 1 天是星期二,以此类推。时间序列中有明显的每日季节性成分(也可能是每周——这可以解释周日交通流量较低的原因)。正午过后,每小时的游戏数确实会更高。

12 月交通流量激增

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

12 月的流量有一个显著的峰值,但是样本中只有 12 个月,所以不可能知道这是否是经常发生的。需要进一步的研究或 EDA 才能有机会确定原因。

玩家 EDA

另一个明显影响玩家盈利的因素是对手的技能水平。虽然我们没有机会预测单个玩家的行动,但对总体结果的分析也有助于确定最佳的游戏时机。

我分析的这一部分无疑是最吸引人的,每一个情节都在揭示一些隐藏的真相的同时,提出了和它回答的一样多的问题。

投资回报是有限的

平均投资回报率是衡量扑克玩家技能的最佳指标。随着所玩游戏样本的增加,该指标作为技能衡量标准的有效性也随之增加。在该数据中,所有游戏的买入费为 51 美元,因此 2%的投资回报率代表每场游戏约 1 美元的利润。每款游戏还有 1 美元的沉没成本(对托管游戏的网站而言),这已计入投资回报率。

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

这里我们看到,随着玩家游戏次数的增加,他们的 ROI 被限制在一个更窄的范围内(或者更具体地说,比-100%到 100%更窄的范围)。在扑克社区中,单挑扑克的基本策略被认为是在不看牌的情况下把所有牌都押上,在这种情况下,这将产生大约 45%的投资回报率(超过一个重要的样本)。在 50 场以上的游戏中,我们看到平均 ROI 符合这一基线,随着游戏数量的增加,ROI 范围变得越来越窄(这说明玩家需要超过一定的 ROI 阈值才能激励他们如此频繁地玩游戏)。

虽然该图信息丰富,但它也隐藏了大量数据,因为许多点代表不止一个玩家(有时超过 1000 个玩家)。为了更清楚地了解 ROI 与游戏次数的关系,我们重复了这个图,这次是根据游戏次数对玩家进行分组,然后取平均 ROI 的平均值。

赢的越多,玩的时间越长

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

这是一个有用的投资回报率的近似值,反过来也是技能水平的近似值,适用于游戏次数少的玩家,他们的结果受高水平方差的影响。一个显而易见的结论是,玩游戏次数最少的人是最差的玩家——尽管存在一些偏见,即赢得第一场游戏的人肯定有能力再玩一场游戏,但失败者却不是这样。

那些不熟悉扑克的人经常问我,完全的新手是不是最难对付的,因为他们太不可预测了。这就是我的答案,不!一个新玩家在游戏中的行动可能是不可预测的,但总体来说,他们的策略将是可预见的糟糕,他们将是我每天的首选对手。

请注意,图的中心非常嘈杂。在这里,我们对 2-15 名玩家进行了任意分组,分组的投资回报率差异很大。这促使我们进一步分析与不同样本规模的固定胜率相关的 ROI 差异。我由此得出结论,当游戏样本低于 1000 时,我不愿意根据玩家的投资回报率对他们的技能水平做出强有力的结论。

很少有人有可靠的收入

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

在这里,我们看到大多数玩家在他们的整个游戏样本中经历了名义上的赢/输,超过 90%的玩家赢或输的钱少于$500。在剩下的人中,有几个是高收入者,许多人损失了中等数额。

从这些图(和附加直方图)中,我看到 99%的玩家在一年中玩了不到 200 场游戏,剩下的 1%中,一半属于 200-400 场游戏,最后一半属于 400-19000 场游戏。我们在前面的图中看到,少于 400 场比赛的玩家主要是输球的玩家。

在这里,我们开始看到两类玩家的出现,大多数(超过 99%)是胜率不一的休闲玩家,一小部分(不到 1%)玩得更频繁,可以从他们的样本中看到可观的回报。

为了进一步探索玩家分类的想法,我将玩家分为两类,一类是玩 1000 个游戏以上的玩家(高容量玩家),另一类是玩不到 1000 个游戏的玩家(低容量玩家)。

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

每个游戏有两个玩家,所以从玩家的角度来看,200,000 个游戏相当于 400,000 个游戏。

高交易量的玩家一年总共赢了 40 多万美元,低交易量的玩家总共输了 80 多万美元(该网站举办这些游戏净赚了 40 万美元)。

最有趣的是每组内部的游戏率。17%的高容量玩家玩的游戏是与其他高容量玩家玩的,这个数字在低容量玩家中只有 10%。这意味着超过 80%的游戏包括一个高音量播放器和一个低音量播放器。

这比我预期的更清楚地代表了在线扑克单挑社区的动态。有两类玩家,职业玩家(高容量)和娱乐玩家(低容量),或者玩家称之为鲨鱼和鱼。鲨鱼大部分时间都在玩(吃!)鱼,鱼很少有机会吃掉其他的鱼(在鲨鱼出现之前),有时鲨鱼会为了保护它们的鱼群而一决雌雄。

这个类比在在线扑克中很普遍,可以激发一些有趣的广告活动…

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

将玩家分类为职业玩家或娱乐玩家(鲨鱼或鱼)可能是确定最有利可图的游戏时间的有价值的特征。我们有一些功能可以进行粗略的分类(ROI 和游戏计数),深入了解高容量玩家的内部游戏率可能会对我们应该如何使用这些功能提供一些提示(例如,通过设置被视为鲨鱼的 ROI 阈值)。

鲨鱼大战鲨鱼

为了调查高容量玩家的内部游戏率的情况,我构建了一个按利润排名前 20 位玩家和按游戏排名前 20 位玩家的每种组合之间的游戏配对矩阵。结果集是 25 个玩家,显示出两个组之间的高度重叠。

该组中的所有玩家都玩过 2000 多场游戏。尽管如此,他们几乎都不玩游戏。这种最频繁的玩家之间的小游戏计数,这些玩家都是(除了一个)赢家,表明大多数赢家积极努力避免彼此玩。

在这组玩家中,有一个玩家与其他玩家进行了大量游戏,尽管对手如此强大,但他们的投资回报率并不比每场游戏的沉没成本(rake)低多少。这个玩家和他的对手有相似的技能水平,但是由于所述对手的技能水平更高,他的回报很低。

这种动态最好用网络图来说明:

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

Top 25 players network graph

  • 每个节点代表一个玩家,圆圈大小是绝对 ROI,蓝色表示正 ROI,红色表示负 ROI。
  • 线强度是两个玩家之间的游戏次数。
  • 节点位置由 networkX springfield 布局生成(因此接近度也代表两个玩家之间的游戏玩家数量,但布局不是确定性的,即每次绘制时都会发生变化)。

在这个图中真正突出的是,它的中心是投资回报率较低的玩家(较小的节点),这个组内的大多数互动是在最弱的玩家之间进行的。较强的玩家之间几乎没有互动,与群体中较弱的玩家互动也非常少。

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

另一种形象化的方式是与红色节点的互动。在这里,我们可以看到红色节点代表的玩家很少与投资回报率超过 5%的玩家进行游戏,他们在回避更强的玩家!

在这里,我们开始了解职业单挑玩家的真实生活。

职业玩家积极努力避免互相游戏,这是一组玩家之间不成文的协议,先于本研究中的游戏样本。为了进入这个职业组,玩家必须通过与组中现有的职业玩家比赛来证明自己——为了提高他们成功的机会,他们将努力集中在较弱的现有职业玩家身上。玩家将这些团体描述为“卡特尔”,它们存在于大多数买入级别,随着赌注的增加,规模会变小。

又是什么激励弱势专业人士捍卫自己的领地呢?是身边的强者们!想象红色节点正在从一个洞里爬出来,蓝色的小节点正在试图把他推回去,知道如果自己不够努力,就会被周围更强的玩家自己推下去。

不幸的是,对这些玩家来说,扑克不仅仅是扑克,它还包括有效地管理敌对和互利的关系,以管理鱼鲨比,进而管理他们的底线。这种动态对于单挑锦标赛扑克来说是独一无二的,因为这是唯一一种你无法在不完全放弃玩游戏的情况下避开想要玩你的对手的扑克形式,因为这样玩家可以有效地猎杀其他玩家。

这可能在很大程度上解释了为什么我在扑克中的友谊很少超过互惠互利的程度。不像锦标赛玩家从许多不同的玩家那里赢得或输掉少量的钱,很难发展出怨恨或敌人,我经常处于这样的境地,我从一个玩家那里拿走了或已经从我这里拿走了 5 位数的钱,有时是在一天之内!老实说,我不会有任何其他方式。

但是让我们回到正题。我在这一阶段的分析中得出的另一个结论是,通过审查这些玩家相对于组中其他玩家的游戏投资回报率,当这些玩家玩红色节点时,实际上只有主机赚钱,因为技能差距不足以让任何一个玩家克服主机游戏的沉没成本。

回到最初的问题,玩游戏的最佳(最有利可图)时间是什么,如果我们可以将玩家分为职业和娱乐,鲨鱼和鱼,我们可以从每小时游戏数时间序列中删除鲨鱼对鲨鱼的实例,将其从每小时游戏数转换为至少包括一条鱼的每小时游戏数。通过这样做,我们分离出每小时流量的“盈利”成分,我们可以用它来预测未来的盈利播放时间。我们可以生成的另一个时间序列是一小时内在线的专业人员数量,这代表了每小时流量中“无利可图”的部分。

我还为数据中的每个玩家创建了一个额外的特性,即每小时在线玩游戏的次数。这表明鲨鱼通常比鱼每小时有更高的游戏计数,这在分类边缘案例时可能是有用的。

给玩家分类

是时候拿出一些聚类算法了?可惜没有!我们预计不到 1%的玩家是专业人士,这代表了严重的阶级不平衡,这对监督学习算法来说已经足够困难了,更不用说无监督学习算法了。我尝试了一下,但试图对这些未标记的数据进行聚类,最终以我手动检查聚类并在我认为它们不能反映我自己的估计(基于我多年的经验)的地方修改它们而告终。

我使用的最后一种分类方法是我自己创建的决策树,所有的玩家只通过几个节点进行分类,如下所示:

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

这是一个相当生硬的分类方案,毫无疑问,一些球员被错误分类,但它将满足这一分析。我想象如果我创造一个预测工具,它会给用户手动分类球员的选项,增加他们定义的准确性。

返工时间序列

现在我们有了分类,我们可以给每个游戏一个代表游戏中职业人数的分数。这可用于创建新的时间序列,娱乐和专业的每种组合都有一个时间序列(即专业与专业、专业与娱乐以及娱乐与娱乐)。

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

我们可以立即看到,我们之前注意到的 12 月流量的峰值是由职业玩家相互竞争的临时增加引起的。爆发了一场小战争,而且很短暂。我们看到,娱乐玩家几乎从不互相游戏;在时间序列的早期,rec vs rec 线异常高,这表明一些球员可能被错误分类(可能是那些寻求晋升的球员,他们在放弃之前没有参加 1000 场比赛)。

通过计算每个小时内独立职业玩家的数量,我们还可以得出每小时在线独立职业玩家的数量。下图是休闲交通时间序列。

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

玩的最好时间

因此,如果每个包含一个娱乐玩家的游戏是一条鱼,而每个在线职业玩家是一条鲨鱼,我们可以通过确定哪个小时每条鲨鱼产鱼最多(通过将娱乐游戏除以在线职业玩家)来计算出最佳游戏时间。

但是首先要对时间序列做一些改变。两个系列的可疑缺失值用一周中该小时的平均值填充。对于专业人士在线系列,每次观察都会增加一条,这改变了“专业人士在线一小时内钓到多少鱼?”的问题到“如果一个额外的职业选手也在那个小时打球,他们会得到多少鱼?”这更能代表与决定参与游戏相关的价值主张。

我们没有足够的年或月的数据来得出一年或一月中最好玩的时间的结论,但我们有足够的周数。下面是一周中每个小时每个职业球员的平均游戏次数(包括一个娱乐玩家)的图表(记住:0 =星期一,1 =星期二,等等)。

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

我们之前在“一周内每小时游戏计数”图中看到的每日季节性几乎完全消失了。专业人士的集体私利似乎在调节鲨鱼和鱼的比例,使其在工作日保持在 4 到 5 之间。虽然开始时我们看到工作日有更高的流量,但午夜后,周五和周六是最好的玩游戏的时间,周六和周日下午是最差的。

那么从这个分析中我们能给玩家什么建议呢?在一周中,你什么时候玩并不重要,你可以让生活的其他方面影响你的时间表,因为你不会错过任何额外的价值。是的,周五和周六晚上更适合玩,但这远远不是双倍时间——预计每小时玩的游戏会增加 25%左右。避开周六和周日下午。

对于有抱负的职业玩家来说,他们很想知道在这个买入级别玩游戏的价值。无论你在一周中的什么时候玩,期望你的平均回报是一样的。我们看到专业人士的投资回报率为 2–8%,因此买入费为 51 美元,每小时玩 4.6 场游戏(工作日),根据你的技能水平(买入费游戏次数投资回报率),预计每小时可赚 4.70 至 18.77 美元。

因此,我们有它,最好的时间玩,或者更确切地说,知识,除了几个时间在周末,没有任何调整可以对玩家的每周时间表,以提高他们的预期利润。

但是那些作息时间灵活的球员呢?可以即时决定是开始、继续还是停止播放。我们对这些球员有什么建议吗?我们知道,但我们将把这一点留到另一篇文章中,在那篇文章中,我将带您完成创建一个时间序列模型的过程,该模型可用于预测未来的鱼鲨比

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

ONNX.js:浏览器中的通用深度学习模型

原文:https://towardsdatascience.com/onnx-js-universal-deep-learning-models-in-the-browser-fbd268c67513?source=collection_archive---------15-----------------------

通用开放标准深度学习格式介绍及其在浏览器中的使用(ONNX/ONNX.js)

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

Photo by Franck V. on Unsplash

在客户端浏览器上运行深度学习模型并不是什么新鲜事。2018 年初,谷歌发布了 TensorFlow.js,这是一个开源库,用于完全在浏览器中定义、训练和运行机器学习(ML)和深度学习(DL)模型,使用 Javascript 和高级 API。

2017 年 12 月,亚马逊脸书微软宣布了让开放神经网络交换 (ONNX)格式制作就绪的合作倡议。ONNX 现在可以支持许多顶级框架和运行时,包括 Caffe2、MATLAB、微软的认知工具包、Apache MXNet、PyTorch 和 NVIDIA 的 TensorRT。还有从 TensorFlow 和 CoreML 到 ONNX 的早期转换器,可以用到今天。

2018 年 11 月,ONNX.js 发布。ONNX.js 是一个开源的 Javascript 库,用于在浏览器和 Node.js(类似 TensorFlow.js)上运行 ONNX 模型。你可以使用它在浏览器上直接对预训练的 ONNX 模型进行评分。ONNX.js 也是第一个在基于 Javascript 的人工智能推理引擎(通过 Web Workers)中利用多线程的解决方案,与 CPU 上的任何现有解决方案相比,它提供了显著的性能改进。好消息,对吧?

ONNX 是什么,为什么这么酷?

当你开发一个机器学习或深度学习模型时,你通常会产生经过训练的模型工件,然后用于预测。该文件包含您花费数小时训练的神经网络参数和权重。每个平台通常有不同的输出格式。例如,MXNet CNN 模型保存在(。参数和。json)文件。这种格式只适用于 MXNet 运行时推理。ONNX 来解决这个问题。它使得深度学习模型可移植,你可以使用 MXNet、Caffe 或 PyTorch 开发一个模型,然后在不同的平台上使用它。例如,您可以使用 PyTorch 开发一个图像分类模型,然后将其部署到 iPhone 设备上,以使用 ONNX 格式的 CoreML。

为什么要在浏览器上进行深度学习?

在客户端设备(浏览器)上运行 DL 模型有一些重要的好处:

1-隐私:

如果 ML/DL 模型处理敏感和私有数据,并且您不想将数据发送到服务器进行推断,那么这将是一个很好的解决方案。

2-低延迟:

将模型直接放在客户端减少了客户端-服务器的通信开销。

3-跨平台:

你使用什么操作系统并不重要,因为它可以在浏览器上运行。也不需要安装任何库。

基准测试结果:

微软对 tensorflow.js 和 keras.js 库进行了一些基准测试,结果令人震惊。您可以看到 ONNX.js 可以快 8 倍以上:

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

https://github.com/Microsoft/onnxjs

现在,让我们看一些代码:

现在,让我们使用三个简单步骤中的预构建模型——Inception _ v2 来构建一个简单的图像分类器。你可以从 ONNX 模型动物园下载预先训练好的模型。

第一步是用 WebGL 或 WebAssembly 后端创建 ONNX 推理会话。在这个例子中,我将使用 WebGL 后端,然后我将使用session.loadModel()函数加载我刚刚下载的模型。

第二步是处理输入图像并调整其大小,然后使用onnx.Tensor()函数从输入图像中创建一个张量。

第三步是使用session.run()函数获得预测,并将输出转化为相关的类。

Code Snippet for using ONNX.js

你可以从这里获得完整的示例代码。这里还有一个为您尝试的所有演示部署的网站。

结论:

ONNX 是一种非常强大的开放标准格式,它使得模型工件可以在平台之间移植。你仍然可以使用你最喜欢的框架进行编码,然后发布你的结果,使它可以在任何使用 ONNX 格式的平台上工作。这是让机器和深度学习开发和推理民主化的一个非常好的方式。当然还有更多,但是希望本文中的信息可以作为对 ONNX 和 ONNX.js 的简短而有用的介绍。

ONNX —变得简单

原文:https://towardsdatascience.com/onnx-made-easy-957e60d16e94?source=collection_archive---------10-----------------------

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

如果你对当前人工智能技术领域中使 ONNX 成为必要的各种环境因素感到好奇,我在文章结尾提供了一个简洁的附录。现在,让我们直接关注这场秀的明星- Onnx

ONNX:那么,它到底是什么?

ONNX 是一种持久性格式。一种将生成的模型序列化为离散资产的方法,可以用代码对其进行存储、版本控制和控制。如果你看看幕后,你会发现 ONNX 已经得到了微软、脸书、英伟达以及其他公司的大力支持。所有将人工智能视为其业务核心的组织。考虑到这一点,你可能会开始想,是什么让 ONNX 如此特别?

互操作性:不同程序交换信息、共享文件和使用相同协议的能力。

这是一个简单的想法。这种想法在软件工程中已经存在了几十年(Java 的 JVM 是一个显著的例子),但在人工智能领域却一直没有出现,这是人工智能研究中所谓的“复制危机”的一个促成因素。

本质上,ONNX 解决这个问题的方法是,它保证在给定数据集的情况下,模型将始终保持其行为的确定性,其结果与运行时环境不变。

那么,这对我们意味着什么,为什么我们(作为数据科学家/人工智能工程师)要关心呢?

赞成者!

  • 您可以用一种编程语言创建一个模型,然后在一个完全不同的运行时环境中执行(例如,想象一下用 Python 创建您的模型,然后部署到一个 C#软件解决方案上)——太好了!😎
  • 你可以使用几乎任何人工智能工具来创建一个模型,ONNX 运行时会对它进行一般性的处理。这为您创建的任何模型提供了一个通用的、一致的界面👏
  • 使用 ONNX,您不需要打包用于创建模型的各种依赖项,您需要的只是 ONNX 运行时☺️
  • 它得到了几乎所有重要行业贡献者的广泛支持。它是开源的,并且会一直存在下去😍

在乌托邦世界里,ONNX 不会有任何问题。尽管该框架有崇高的理想和令人钦佩的目标,但我们需要解决一些问题。

不利因素。

  • ONNX 是新的。技术上的新奇常常暴露出日常使用中的不成熟。对于 ONNX 来说,这表现为一个笨拙的 API,并且缺乏在野外工作的范例实现。生产项目依赖于确定性和易用性😵
  • 文档是有限的。提出了一个丑陋的问题“如果出了问题怎么办?”这是一个可怕的风险,因为有记录的支持是随意的😰
  • 它直接支持将有限数量的库转换成 ONNX 格式😓
  • 存在(3…2…1 中的讽刺)缺乏例子。这使得采用成为一个挑战,除了最强壮和思想开放的团队🤯

在这篇文章中,我想把焦点放在第四个骗局上。为那些遇到和我一样的挑战的人提供希望的灯塔。对于你们每一个 ONNX 航海家,我希望这些例子将是你的灯塔。

ONNX —变得简单

首先,我们如何在我们的开发环境中安装 ONNX(本文不打算深入介绍安装,而是给你一个指南针)?你需要两样东西。

  1. ONNX
  2. ONNXMLTOOLS

幸运的是,安装说明分解为一个 pip 安装,说明被捕获在超链接的 GitHub 存储库中。所以,你现在有 ONNX 准备…嗯…那么,为什么有两个依赖项?这实际上可以归结为转换工具和 ONNX 本身的解耦。让这张方便的图表解释…

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

A tl;dr view on where the ‘ONNXMLTOOLS’ fit into the ONNX eco-system

**有趣的事实:**ONNX 官方支持的转换过程在编写时只支持几个库。例如,Sci-Kit Learn 有一个独立的 ONNX 转换工具(我们很快就会看到)。

现在已经澄清了(我希望!),让我们从 XGBoost 开始,探索几个展示模型到 ONNX 的转换的代码示例!

很简洁,你不同意吗?这个例子当然很简单,但是这个例子表明代码不动产与其他持久化方法非常相似。

然而,这仅仅考虑了保存模型,我们如何在 ONNX 运行时环境中打分?

这个例子也是用 Python 编写的,但是您可以使用任何与 ONNX 运行时环境兼容的编程语言。你可以想象,当将一个由人工智能驱动的功能集成到一个现有的项目中时,这将是非常强大的(拥有自己预先建立的技术栈)!

如何将“不支持的”库转换成 ONNX?

正如我们前面所讨论的,ONNX 的当前转换工具只支持一小部分可能的库,有一些重要的例外;如 Sci-kit Learn

ONNX 开源社区为此设计了一个特定的库(是的…另一个依赖项),称为‘sk learn-ONNX’。这个额外的转换器是 ONNX 开放课程生态系统中存在的几个转换器之一,每个转换器都反映了核心 ONNX 工具的现有标准(这是一个可取之处)。

关键时刻-对 code real estate 有什么影响吗?

长话短说…不。这是一个好的结果,它表明分裂的转换库严格遵循现有的 ONNX 转换 API——很好。

如果我想同时使用 SKLearn 和 XGboost 怎么办?

好问题!这是一个先前范例和支持文件都有限的领域。ONNX,由于运动几个分散的转换器经常感觉像编译不同的乐高积木。为了使 SKLearn 转换库支持 XGBoost,我们的目标是从核心 ONNX 工具注册 XGBoost。

让我们看看是什么代码启动了这个过程…

维奥拉。虽然同时利用每个转换库感觉很笨拙,但它是有效的。这证明了基本 ONNX API 的可扩展性和一致性。如果我在哪里阅读茶叶来预测 ONNX 的未来,这个核心原则是一个让我对未来更统一的工具集抱有希望的原则。

我喜欢 ONNX。它试图满足人工智能社区的真正需求,努力确保我们构建的模型的神圣性。这对于减少构建人工智能驱动的软件解决方案和人工智能增强的软件解决方案的摩擦至关重要。

对于 AI 社区中的那些人来说,我们应该在 ONNX 发展的幼虫阶段支持它。ONNX 来了。让我们拥抱它。

所以你可能会想,是什么让我们来到这里?导致 ONNX 产生的因素是什么?我在下面加了一个简短的补充,涵盖了我对这个话题的思考。

因果——为什么 ONNX 是必需品?

现代人工智能领域是一个丰富的、不断变化的工具和技术的织锦。过去的五年包含了我所说的现代人工智能复兴,它以三种不同的方式表现出来:

  • 在人工智能的直接垂直领域和更广泛的数据科学技能组合方面,教育都取得了重大进展。
  • 人工智能欣赏已经渗透到科技世界的日常词汇中。它成为我们腰带上的另一个工具。
  • *工装的成熟度;*这已经建立了当前的“三层”抽象模型(例如,从云认知服务、 Sagemaker 及其同类到全脂肪、低级端到端框架,如 Tensorflow )。

本文主要关注第三点的后果。当然,工具已经以一种净积极的方式成熟了,但是(是的,有一个但是…)工具的开发一直是混乱和分散的。

在短短 10 分钟内(我自己计时),我数了 **24(!)**独特的人工智能聚焦库&平台。每一个都提供非常相似的广泛功能,但是标准、API 和持久格式却大相径庭。

这是怎么发生的?

  • 竞争力……大型科技公司有一种与生俱来的竞争欲望。
  • 在当今世界,人工智能的编程语言之间并不存在对等性。通常情况下,功能会在 Python、R、C#以及更高版本中被复制……只是在不同的库中。

这对每个工具生成的模型如何被持久化产生了非常有针对性的影响。有两种选择浮出水面。

  1. 完全依赖于专有工具/格式(或供应商!).
  2. 使用通用的序列化格式,如泡菜(其中有一些关于方面的。)和 JobLib 是当今部署人工智能模型的常用方法。由于它的易用性,我已经在各种项目中使用过。

与所有混乱的环境一样,标准化和领导力也存在机会—2017 年,ONNX 加入了竞争。

其余的,正如他们所说,都是历史了。

向前和向上:寻找一艘火箭船和一个收购故事

原文:https://towardsdatascience.com/onwards-and-upwards-finding-a-rocket-ship-and-an-acquisition-story-2464a15ca713?source=collection_archive---------26-----------------------

一年前,我写了几篇关于我们的 YCombinator 体验的帖子,得到了很多关注。你们中的许多人在 YC 进程中向我寻求帮助;有些人成功了,而很多人没有。无论如何,我希望那些没有通过的人学会如何逆来顺受。这部分是我们收购故事的延伸版本。我再次希望这能帮助任何正在经历类似事情的人。

[## YCombinator 应用程序或我们如何几乎做到这一点—第 2 部分(共 2 部分)

在这篇文章的第一部分(你可以在这里阅读),我解释了 Y Combinator 应用程序是如何处理

towardsdatascience.com](/the-ycombinator-application-procedure-or-how-we-almost-made-it-part-2-of-2-1ac37b002fcd)

…即使是我们最老、最忠实的客户也不会超过 10 万美元。那是一个很大的心理打击。

如果你看了前面的部分,你会知道我们认真对待 YC 的反馈,并开始致力于缩短我们的销售周期。然而,即使经过一年的努力,我们也无法缩短新企业客户的销售周期。我们还达到了年度合同价值的全球最高值,即使是我们最老、最忠诚的客户也不会超过 10 万美元。那是一个很大的心理打击。

我们稍微转向关注基于互联网的创业公司,即全球的优步和 Zoomcar。我们在这方面取得了一些进展,销售周期缩短了,但购买力却下降了很多。这个国家只有少数超级投资的创业公司有闲钱挥霍在安全相关的数据科学上。更重要的是,每当我们与一家新的创业公司交谈时,他们都会说,由于洞察力的敏感性,这种分析必须在内部进行;他们会强烈暗示收购我们。

低调,因为没有买家会直截了当地说“我们想收购你的公司”

一段时间后,低调向我们提出收购的初创公司数量超过了我们融资渠道中的投资者数量(永远是融资)。低调是因为没有买家会直截了当地说出“我们想收购你的公司”这样的话。因为那就等于失败。每个人都喜欢玩一个猫捉老鼠的游戏,通过他们的关系网了解你是否在考虑收购;然后试图让你向他们承认这一点。当你这样做时,他们必须支付更少的费用,因为“你比我们更想要”。

如果一家公司拒绝遵守这些基本原则中的任何一条,这就是一个危险信号,我们可以拔掉插头

收购谈判进行了几周后,我们与我们的主要投资者,来自 thinQbate 的 Pranav,来自 Astarc Ventures 的 Hari 和 Artha Ventures 的 ad 进行了会谈。我们进行了一次长谈,坦率地说深入到了灵魂探索。我们问自己什么是最好的行动方案,在这个时候被收购是否是我们能做的最好的事情。

我们最终确定了一些原则来帮助我们做出这个决定:

  • 我们会要求收购方公平对待:我们的客户,我们的股东(包括我们的创始人),以及我们的团队——按此顺序
  • 我们会寻找最可靠、最诚实的人,他们会了解我们的背景,我们可以在未来的岁月里依靠他们
  • 我们只会挑选一个让我们兴奋的想法/领域/问题陈述
  • 我们会寻找一种文化上的契合,这样两个团队就可以无缝地融合在一起,几乎没有摩擦
  • 我们将能够通过收购公司实现我们的抱负——将 Vahan 堆栈扩展到一个更大的规模,并拥有许多更大的问题陈述来进行工作和个人成长

事后看来,制定这些原则有助于我们在面对困难局面时进行谈判并依靠它们。如果一家公司拒绝遵守这些基本原则中的任何一条,这就是一个危险信号,我们可以终止合作。

我们有过几次千钧一发的机会,我们深入讨论了一些大型、成熟的初创公司的条款,但谢天谢地,什么都没有实现。

不过,最终我们的对话渠道形成了这样的形式:10 次讨论-> 5 次谈判-> 3 次具体报价(从收购股东,到在不向投资者支付任何费用的情况下收购)。这与融资略有不同,在融资中,从讨论到条款清单(理解为:谈判)的转换要低得多。然而,就投资者而言,漏斗的顶端更宽。

于是我们有了三个具体的提议。第一个是一家资金雄厚、外表光鲜的 B2B 初创公司,由一位杰出的连续创业者创建。他们和我们在同一个技术领域,可以直接利用我们现有的技术和知识产权。第二次是在稍早的阶段,发展很快,是在向与我们相同的行业销售软件的业务领域:直接契合。最后,第三个报价来自 Rapido。Rapido 属于消费者应用领域,对我们来说,它更像是一个理想的客户,而不是商业伙伴。然而,经过漫长而勤奋的自我反省和数据处理过程(是的!),我们决定用 Rapido。这是如何发生的:

早在 2016 年,我们就通过一位共同投资者被介绍给了 Rapido 的创始人,顺便说一下,他们是我们的第一批试点合作伙伴。由于他们的应用程序和我们的数据收集 SDK 都过于原始和不兼容,这个试点项目很快就失败了。然而,从那以后我们一直保持联系。他们经历了一段漫长而艰难的时期,在此期间,他们稳步增长,但并不引人注目。当我们这一次遇到他们的时候,他们正在进行 A 轮融资,并对即将到来的 B 轮融资充满信心。我们有所怀疑,因为这个想法似乎总是很不直观;即使是在蓬勃发展的城市交通领域。

他们热衷于安全方面。我们很高兴听到这个消息。

我们的愿景从一开始就是让司机更好,让道路更安全。通过我们的企业客户和他们的网络,我们接触到了相当数量的车辆。然而,一直困扰我们的是,我们要让臭名昭著的印度道路变得更安全,相反,我们最终卖给了 1%的人。有了 Rapido,从一开始就很明显的一点是,我们将能够接触到大量的司机和车辆。可以这样想:Ola 或优步最近一次统计显示,在任何一天都有 800,000 名司机生活在他们的平台上。还有哪家公司能声称一天有这么多车辆上路?

那时我们意识到这可能是一艘火箭飞船,正在上升。我们想在它进入轨道前登上飞船!

唯一的问题是 Rapido 是否能达到那样的高度。作为数据科学家,我们习惯于依靠底层数据来做任何决定。我们与他们达成了一项协议,他们将支付我们 2 个月的合同工作,我们为他们解决一个数据科学问题。问题陈述:需求预测

我们花了 2 个月的时间来完成这项工作,Rapido 与我们分享了 1 年的需求和交易数据。在研究了几个时间序列和预测模型(关于 SARIMA 和 Prophet)的几周内,我们发现了一些惊人的东西:

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

The famed Hockey Stick, in person!

当通过任何预测模型时,月度总量形成了一条曲棍球棒曲线。

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

Source: https://davidcummings.org/2010/12/19/hockey-stick-growth-for-startups/

那时我们意识到这可能是一艘火箭飞船,正在上升。我们想在它进入轨道前登上飞船!

一旦我们深信不疑,说服我们的股东就变得简单了。他们上船后,事情进展得很快。Rapido 提出以部分现金、部分股票的方式收购我们的股东。估值不高,肯定不是风投们等待的那种超大回报。然而,每个人都对几年后的增长潜力和令人满意的结果感到非常兴奋。所以我们为我们的股东进行了全股票交易。在 3 个多星期内,我们已经解决了所有的条款,并准备加入!

[## 自行车出租车公司 Rapido acqui-hires 分析初创公司 Vahanalytics

孟加拉鲁:自行车打车应用 Rapido 已经收购了总部位于孟买的 Vahanalytics,这是一家数据分析初创公司,允许…

www.livemint.com](https://www.livemint.com/companies/start-ups/rapido-acqui-hires-mumbai-based-vahanalytics-in-cash-and-stock-deal-1566217428592.html)

就我们的原则而言,这笔交易符合大多数条件。我们唯一感到有点内疚的地方是我们的团队成员。我们必须把基地从孟买搬到班加罗尔,不是每个人都能做到的。但令人高兴的是,大家都在短时间内被安排到了一家不错的公司。

这就是我和我的团队如何成为 Rapido 的一部分。

我们的任务:**建立 Rapido 的数据科学和工程团队,做一切与数据科学相关的事情。**我将在下一篇文章中讨论如何为一家高速增长的初创公司做到这一点。

OpenAI 健身房经典控制问题的奖励工程|DQN |RL

原文:https://towardsdatascience.com/open-ai-gym-classic-control-problems-rl-dqn-reward-functions-16a1bc2b007?source=collection_archive---------15-----------------------

自定义奖励功能,加快学习速度!

我通过尝试在 OpenAI 健身房解决问题开始学习强化学习。我特别选择了经典控制问题,因为它们是力学和强化学习的结合。在这篇文章中,我将使用深度 Q 网络(DQN)展示选择一个合适的奖励函数如何导致更快的学习。

1。扁担

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

Episode 40 (unbalanced)

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

Episode 60 (balanced)

这是 OpenAI 健身房上最简单的经典控制题。极点保持平衡的每个时间步长的默认奖励值是 1。我将这个默认奖励改为与磁极角度绝对值的减少成比例的值,这样,它会因为使磁极更接近平衡位置的动作而得到奖励。具有 2 个隐藏层的神经网络,每个隐藏层具有 24 个节点,在 50 集内解决了这个问题。

**#Code Snippet, the reward function is the decrease in pole angle**
def train_dqn(episode):
    global env
    loss = []
    agent = DQN(2, env.observation_space.shape[0])
    for e in range(episode):
        temp=[]
        state = env.reset()
        state = np.reshape(state, (1, 4))
        score = 0
        maxp = -1.2
        max_steps = 1000
        for i in range(max_steps):
            env.render()
            action = agent.act(state)
            next_state, reward, done, _ = env.step(action)
            next_state = np.reshape(next_state, (1, 4)) 
            ***#Customised reward function***                        
            reward = -100*(abs(next_state[0,2]) - abs(state[0,2])) 
            agent.remember(state, action, reward, next_state, done)
            state = next_state
            score=score+1
            agent.replay()

在这里找到完整的代码。

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

Time steps for which the pole stayed balanced in different episodes

2。山地车

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

Episode 2

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

Episode 200

这里的目标是到达正确的山顶,汽车将不得不来回到达正确的山顶。为了让网络自己想出这个策略,需要为它提供一个适当的奖励函数。在某些情节中,一旦汽车通过试错法到达目的地,简单地给予积极的奖励,而对所有其他时间步骤给予消极的奖励是行不通的,并且在网络学习最佳策略之前需要相当长的时间。

为了从谷底到达顶峰,汽车需要获得机械能,因此最佳策略是汽车在每个时间步获得机械能(势能+动能)。所以一个好的回报函数应该是,在每一个时间步,机械能的增加。

**#Code Snippet, the reward function is the increase in mechanical energy
def** train_dqn(episode):
    **global** env
    loss = []
    agent = DQN(3, env.observation_space.shape[0])
    **for** e **in** range(episode):
        state = env.reset()
        state = np.reshape(state, (1, 2))
        score = 0
        max_steps = 1000
        **for** i **in** range(max_steps):
            env.render()
            action = agent.act(state)
            next_state, reward, done, _ = env.step(action)
            next_state = np.reshape(next_state, (1, 2))
            ***#Customised reward function*** reward = 100*((math.sin(3*next_state[0,0]) * 0.0025 + 0.5 * next_state[0,1] * next_state[0,1]) - (math.sin(3*state[0,0]) * 0.0025 + 0.5 * state[0,1] * state[0,1])) 
            agent.remember(state, action, reward, next_state, done)
            state = next_state
            agent.replay() 

在这里找到完整的代码。

有了这个奖励函数,网络可以很快地学习到最佳策略。

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

TIme steps taken by the car to reach the flag at different episodes.

3.钟摆

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

Performance of the RL Agent at different episodes (From left: episode 6, episode 40, episode 200)

在这个问题中,我需要摆动一个钟摆,并使用顺时针或逆时针方向的扭矩使它保持平衡。这个问题类似于山地车问题,但是当杆到达倒置位置时,保持杆平衡有额外的困难。
最初,杆的机械能需要增加,但是一旦它获得足够的能量到达倒置位置,任何更多的能量增加将迫使摆锤保持旋转。

最佳策略是以这样一种方式提供扭矩,即不断增加摆的机械能至极限 mg1/2,该极限等于倒立摆的势能。这将确保钟摆到达倒置位置。除此之外,为了保持极点的平衡,应该对倒立位置附近的钟摆位置给予正奖励。

**#Snippet of the code, the reward function is the increase in mechanical energy of the pendulum upto a limit of 5 with an added positive reward for positions close to the inverted pendulum.
for** e **in** range(episode):
        temp=[]
        state = env.reset()
        state = np.reshape(state, (1, 3))
        score = 0
        maxp = -1.2
        max_steps = 1000
        **for** i **in** range(max_steps):
            env.render()
            action = agent.act(state)
            torque = [-2+action]
            next_state, reward, done, _ = env.step(torque)
            next_state = np.reshape(next_state, (1, 3))
            **if** (next_state[0,0]>0.95):
                score=score+1
            ***#Customised reward function***
            reward= 25*np.exp(-1*(next_state[0,0]-1)*   (next_state[0,0]-1)/0.001)-100*np.abs(10*0.5 - (10*0.5*next_state[0,0] + 0.5*0.3333*next_state[0,2] * next_state[0,2])) + 100*np.abs(10*0.5 - (10*0.5*state[0,0] + 0.5*0.3333*state[0,2] * state[0,2]))
            maxp = max(maxp, next_state[0,0])
            temp.append(next_state[0,0])
            agent.remember(state, action, reward, next_state, done)
            state = next_state
            agent.replay()

在此找到完整的代码

下图显示了在不同事件的 200 个时间步中,钟摆在倒置位置保持平衡的时间。

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

Time spent in the inverted position for different episodes

结论

强化学习是机器学习以最优方式执行任务或实现目标的过程。关于手头问题的人类直觉可以以设计的奖励函数的形式添加到神经网络算法中。我们考虑的问题中的默认奖励函数是粗糙的,只在完成任务时奖励代理,这使得 RL 代理很难学习。设计的奖励功能使训练过程更快、更直观,便于我们理解。
阅读更多博客这里

开放银行:它是什么,不是什么,为什么重要

原文:https://towardsdatascience.com/open-banking-what-it-is-what-it-isnt-why-it-matters-e4502af143cb?source=collection_archive---------41-----------------------

在对个人数据隐私和数字伦理的担忧中,一种名为“开放银行的东西的发展似乎是朝着错误的方向迈出了一步。

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

**但是……**事实是,开放的银行业务和总体开放的框架不仅将传统组织带入 21 世纪,而且是改善客户服务、推动创新和为新的颠覆性商业模式奠定基础的关键。

随着人们对开放银行业的热情日益高涨,组织和个人需要迅速行动起来,在新的竞争格局中占据有利位置。

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

从高层次来说,开放银行业务是一项指令,要求银行向其客户提供与第三方机构共享其财务信息的选项,以换取改进的服务和定制解决方案。虽然主要集中在欧洲,但该指令在各地正处于不同的发展阶段。

如果这听起来很激进,的确如此。

仅次于健康,财务数据通常需要最高级别的安全性;由严格的规章制度保证的安全。从表面上看,这是一件好事。没有人希望自己的银行信息可以自由获取。

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

但是,尽管开放银行业的想法似乎与传统智慧相反,但认为开放银行业是你信用历史上的开放季节是错误的。如果操作得当,开放式银行业务有能力通过增强的“了解你的客户”能力和欺诈检测来提高安全性。

这可能有助于解释为什么银行越来越多地参与进来。为了理解其中的原因,有必要在消费者数据权利(CDR)和开放创新趋势的大背景下思考开放银行业务。从本质上讲,CDR 计划旨在让客户更好地控制他们的数据,使他们能够与他们选择的接收者共享数据,并用于他们授权的目的。

另一方面,开放式创新抓住了信息时代的精髓:脱离组织间的筒仓思维和秘密。

虽然开放银行的想法可能看起来像是在鼓圈里偶然听到的,但事实是,它代表了我们对数据所有权的看法的巨大变化。

适时给予的应得的赞扬

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

Source: McKinsey Payment Practice

现在判断这种思维的改变对普通客户的银行体验意味着什么还为时过早,但在这个早期阶段,我们已经看到第三方开发人员利用开放数据源来创建增强银行体验的应用程序和服务。

其中,正在开发两种类型的服务:

  1. 账户信息服务
  2. 支付启动服务

账户信息服务

根据英国金融行为监管局(Financial Conduct Authority)的规定,账户信息服务是“一种在线服务,向支付服务提供商提供支付服务用户持有的支付账户的综合信息。”

这实际上意味着客户可以选择允许第三方访问他们的银行信息。概括地说,这意味着您可以使用一个应用程序来查看您的所有银行信息,而不管您使用多少家金融机构。

但这也为人工智能工具和机器学习提供了一个机会,根据你的支出为你提供更好的价格和服务。

被你的手机供应商骗了?
账户信息服务可以让你确切地知道从竞争对手那里获得同样的方案会节省多少钱。

每月花 200 美元买咖啡?它会给你一个通知,告诉你如果你把钱放进 RRSP,五年后会是什么样子。

最终,账户信息服务可以为你的支出注入高功率人工智能。像Mint.com个人资本YNAB 这样的提供商在过去几年里已经成为管理个人财务的便捷(和颠覆性)应用。

支付启动服务

另一方面,支付启动服务仍然是一项进行中的工作。

金融行为监管局将其统称为“一种在线服务,它访问用户的支付账户,在用户同意和验证的情况下代表他们启动资金转移。”

对银行客户承诺的好处是通过重定向交易以避开电子银行系统来降低费用。简单地说,支付发起提供商是借记卡和信用卡的电子商务替代品。总部设在立陶宛的 Paysera 公司通过对在线金融交易收取低得多的费用来为他们的用户省钱。

寄希望于变革

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

当然,问题在于,数字对我们金融生活的入侵仍在敲响警钟。2018 年,向美国卫生与公众服务部报告了 351 起医疗违规,超过 1300 万份患者记录在此过程中暴露。 剑桥分析公司丑闻 ,收集了 8700 万脸书用户的数据,对于那些认为他们的数字存在处于锁定状态的人来说,这是一个突然的觉醒。

事实是,技术创新的速度超过了立法者,而作为一个社会,我们还没有为个人数据保护建立明确的规则(尽管 GDPR的建立是个好兆头)。银行将不得不从安全角度出发,或者通过提供数据的服务来获取利益。

他们最好快点做。

开放的银行业务正在发生,那些做得最好的银行,凭借铁一般的安全性和强大的 API 网络,将垄断市场。

当涉及到金融数据时,风险就更高了。

毕竟这是我们的钱。

但事实是,任何一家头脑正常的金融机构都不会采取一种为欺诈敞开大门的做法,不管名义上的好处有多么诱人。如果做得好,开放银行业务实际上将为银行提供一个减少欺诈、更好地了解客户、释放前所未有的竞争和创新的机会。对于他们的客户来说,这将把 AI 注入到他们的日常生活中。

有了这样的好处,从银行到创新者的数据需要尽可能简化。

ThinkData Works 正在连接成千上万的公共数据源,并与公司和金融机构合作,将数据转化为可操作的见解,帮助监管合规性,改善信息收集,并打开新信息的大门。如果您想了解更多关于我们如何准备开放银行业务的信息,请 联系我们

原载于【https://blog.thinkdataworks.com】****

通过开放数据改进机器学习

原文:https://towardsdatascience.com/open-data-for-machine-learning-b5c6ef3f5a80?source=collection_archive---------27-----------------------

公开数据被政府和机构广泛认为是一种透明和问责的做法。在这篇文章中,我们概述了为什么开放数据可以释放实际机器学习应用程序的潜力。

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

Taiwan is first ranked in the global Open Data Index (link: https://index.okfn.org/place/)

P2P 基金会将开放数据定义为一种理念和实践,要求每个人都可以免费获得某些数据,不受版权限制。专利或其他控制机制[2]。

近年来,作为透明度的一种实践,政府和市议会创建了开放的数据门户,当局将大量数据免费提供给公民。像巴塞罗纳( OpenDataBcn )、巴黎( open data Paris )、罗马( dati comune )或柏林(d aten.berlin )这样的城市都有一个开放的数据门户,将粒度改为国家几乎世界上每个国家都有一个门户:法国( data.gouv.fr )、马拉西亚(data.gov.my)或哥斯达黎加( datosabiertos.presidencia)

如今,很容易找到几乎所有东西的数据集,只需点击几下鼠标,你就能找到,例如与领土(城市停车位)、人口(教育水平)、治理(选举结果)相关的数据集…伦理运动带来的开放数据的好处主要集中在为居民提供数据,以某种方式为自己谋利。在文章《开放政府数据的 5 大好处》[3]中我们发现:

  • 1.增加透明度和问责制
  • 2.培养信任、可信度和声誉
  • 3.促进进步和创新
  • 4.鼓励公众教育和社区参与
  • 5.随着时间的推移存储和保存信息

如前所述,开放数据可以释放机器学习的潜力。原因很简单,纳入外部数据有助于增强模型、发现新模式和解决奇偶校验等问题。

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

Figure 1: Open Data in ML model

  • *公司数据:这就是我对项目所拥有的数据的看法:如客户、消费…

为了将开放数据变量包含到 ML 算法中,我们需要在原始数据和分类器的输入之间包含一个代理。这个代理负责转换和对齐数据。

数据必须具有相同的粒度,所有维度必须具有相同的周期。如果我们预测每月天气,开放数据维度也需要以月为单位。否则,它会导致模型中的偏差。这两个信息来源需要归一化(重新标度、均值归一化或标准化是常用的技术),当然是在同一个单位中,而不是试图建立一个混合公里和英里数据的模型。

保持尺寸比例的不平衡也很重要。在大多数情况下,公司维度的数量需要大于开放数据维度。原因很简单,我们预测的是股票市场,1 个变量是股票的历史价值(公司数据),其他 100 个变量来自公开数据(国家的 GPD、教育水平或经济活动类型)。在这种情况下,大多数预测将仅使用开放数据维度构建,而不使用公司数据。因此,必须增加尺寸的重量或限制其作为辅助尺寸的使用。

最后,实际的开放数据门户有被第三方采用的障碍,政府不应该仅仅局限于发布数据。为了能够重用这些有价值的信息,需要确保以下特性:

**标准文件格式,**数据以不同的文件格式共享(甚至你可以在 pdf 的文件中找到)。门户网站应该建立一个标准,并以相同的格式共享所有文件(json 和 csv 是首选)。

元数据,所有数据集后面都必须有每个变量的描述(如果是表格数据行信息)。一个很好的实践是使用 RDF,这是一个由万维网联盟(W3C)创建的标准,它具有促进数据合并和支持模式随时间演变的特性[5]

数据的周期性和一致性,数据应该定期更新并保持历史。同样,必须通知用户数据的新版本。数据还必须随时间保持一致,数据的标识符不能随时间改变。

API 访问(应用编程接口),访问和下载门户的数据是一项成本高昂的活动,为此,他们必须启用 API 来自动升级数据

综上所述,开放数据可以在人工智能项目中释放新的潜力,并作为奇偶校验帮助解决问题。此外,这种结合不是一件小事,开放数据网站需要确保数据的可重用性,ML 工程师需要知道如何融合这些知识。

参考

[1] AI 和开放数据:至关重要的组合https://www . europeandataportal . eu/en/highlights/AI-and-Open-Data-critical-combination

[2]为一个勇敢的新世界开放治国之道

[3] 5 开放政府数据的好处https://www . envisio . com/blog/5-开放政府数据的好处

[4]开放数据和开放政府的好处、采用障碍和神话https://www . semantic scholar . org/paper/Benefits % 2C-采用障碍和神话-开放数据-让桑-charabidis/4b 606805 da 01 c 61 e 4422 FD 90 Fe 33877 a6d 71951 c

[5]资源描述框架(RDF)https://www.w3.org/RDF/

开放的人工智能:通过保留所有选项来提高性能

原文:https://towardsdatascience.com/open-minded-ai-improving-performance-by-keeping-all-options-on-the-table-ddefce50913a?source=collection_archive---------10-----------------------

我是如何让我的强化学习代理在获得最高奖励后不再天真地表现得更好的

在媒体上阅读此文,而不是使用此 好友链接的媒体会员!

本帖描述的井字游戏,以及所有的算法和预训练的模型都可以在 [tic_tac_toe](https://github.com/shakedzy/tic_tac_toe) 资源库上 我的 GitHub 页面 找到。

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

当我被要求描述强化学习让我如此着迷的原因时,我通常会解释说,我认为我训练电脑的方式就像我训练我的狗一样——只使用奖励。我的狗学会了坐下、等待、过来、站立、躺下和假装被枪击(向我的妻子致敬),所有这些都以完全相同的方式——每次她做了我让她做的事情,我都会奖励她。每次我们试图教她一些新东西时,她都不知道我们想从她那里得到什么,但是经过足够的反复试验和一些成功的尝试后,她明白了。当强化学习模型被教授新东西时,完全相同的事情也会发生。这真是太棒了。

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

Gin the dog. Yes, we named her after a hard-liquor

追求最大可能的回报是几乎所有强化学习模型背后的基本引擎——每种模型都有自己的方法来实现它。但是当从更高的角度审视这种方法时,天真地追求回报是非常狭隘的。遵循这样的策略将使我们无法快速适应意想不到的变化,因为我们从不保留 b 计划。我们的整个探索阶段只是为了找到可能的最佳方式,而很少关注其他好的选择。我们能教我们的模特打开思维吗?我们应该吗?

最大化熵而不是回报

不久前,我偶然发现了伯克利人工智能研究中心这篇博文(它非常简要地总结了这篇论文),它提出了一种新的学习方法——不要学习提供最高回报的路径,而是跟随提供最积极选项的路径。换句话说,教你的模型增加它的动作——选择

这里有一个例子:让我们考虑一个简单的 Q-Learning 算法,并检查以下场景:

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

假设我们站在状态 s 中,可以从两个动作中选择一个:动作 X 和动作 Y 。从那里我们将到达状态s’,在那里将有三种可能的选择: 123 ,这将把我们带到终端状态,我们将收到奖励。我们看到,如果我们在选择 X 后站在s’,我们的策略将是无论如何都选择行动 2 。另一方面,如果我们在选择 Y 后到达s’,我们可以更灵活一点——尽管动作 2 仍然是最好的。换句话说,该策略在 X 之后的s’非常低——因为它只关注单个动作,而在 Y 之后则更高——因为它能够以合理的概率尝试所有状态。

但何必呢?从图中可以清楚地看出,最佳选项将是从状态*s’*开始的动作 2 。没错——但是如果环境突然发生变化,会发生什么呢?一个 bug,一个修改,或者对手一个意想不到的动作?如果这样的改变会突然阻止我们采取行动 2 ,那么行动 X 就变成了错误的决定。

但这不仅仅是妄想。就在几行之前,我们同意在选择动作 Y 之后,我们可以在下一个动作选择中更加灵活。虽然仍然有最佳选项,但其他选项也不会太离谱,这可以让模型更多地探索这些其他行为,因为不选择最佳选项的代价很低。在选择动作 *X、*之后,情况就不一样了,我们知道,充分的探索对于一个健壮的强化学习代理来说是至关重要的。

让我们谈生意吧

如何设计一个鼓励代理人最大化熵的通用策略在我上面链接的论文中有介绍。在这里,我想把重点放在软贝尔曼方程(在我提到的博客中讨论过)。让我们首先用常规的贝尔曼方程来回忆一下:

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

The Bellman Equation

软贝尔曼方程将试图最大化熵而不是未来的回报。因此,它应该用熵最大化项来代替最后一项,在最后一项中,我们将未来的 Q 值最大化。因此,在有限数量的动作的情况下,软贝尔曼方程是:

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

The Soft Bellman Equation

如果你想看看这个新术语如何与熵相关的数学证明,博客作者声称可以在 Brian Ziebart 的这篇 236 页的博士论文中找到。如果你上过一次热力学课,你可以回忆一下,气体的热力学熵定义为 s=k⋅lnω,其中平衡态的组态数是,其中平衡态的组态数是。如果你不知道你刚刚读了什么,你只能相信我(或者读论文)。

有用吗?

如果你已经读过我的一些博客,你可能已经注意到我喜欢自己测试一些东西,这次也不例外。我曾经写过一篇关于我用深度 Q 网络训练的一个井字游戏代理人的文章,所以我决定编辑它,让它也用软贝尔曼方程学习。然后我训练了两个代理:一个普通的 Q-网络代理和一个最大熵 Q-网络代理。我训练两个这样的代理人互相对抗,然后另外两个代理人分别对抗一个外部玩家——重复这个过程 3 次,最后每种类型有 6 个不同的训练模型。然后,我将所有常规 Q 网络代理与所有最大熵 Q 网络代理进行匹配,以查看哪种类型的代理赢得最多游戏。我还强迫代理们在每场游戏中选择不同的第一步棋(以涵盖所有可能的游戏选项),并确保他们都能玩到 XO

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

结果非常清楚:在 648 场比赛中,软贝尔曼代理人赢得了 36.1%的比赛(234 场),33.5%的比赛以平局告终(217 场),只有 30.4%的比赛(197 场)由正规 Q 网代理人赢得。当只考虑在没有我强迫代理人做出特定的第一个动作,而是让他们随心所欲地玩的情况下玩的游戏时,结果甚至更有利于软贝尔曼代理人:在玩的 72 场游戏中,40.3% (29 场)由最大熵 Q 网络赢得,33.3% (24 场)由常规代理人赢得,其余 26.4% (19 场)没有赢家。我鼓励你自己也进行这个实验!

最后的话

这个实验表明,在学习复杂系统,甚至不那么复杂的系统时,追求更广泛的目标而不是最高的回报是非常有益的。在我看来,教授一个模型如此广泛的政策,就好像我们不再把代理人当作我们希望训练的宠物——而是我们试图教的人。我很高兴看到未来我们还能教给它什么!

公开问题:卡洛斯·戈麦斯·乌里韦

原文:https://towardsdatascience.com/open-questions-carlos-a-gomez-uribe-980c1af1195c?source=collection_archive---------27-----------------------

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

Illustrations by Alfonso de Anda

尼克·洛克威尔和克里斯·维金斯

这个帖子也出现在 次开

Carlos A. Gomez-Uribe 是网飞公司前产品创新副总裁,在那里他负责电影推荐和搜索的算法开发。《纽约时报》首席技术官尼克·洛克威尔和首席数据科学家克里斯·维金斯向戈麦斯·乌里韦讲述了他的职业生涯,机器学习在网飞的发展,以及公司应该如何非常周到地考虑如何将机器学习集成到产品中。以下是经过编辑和压缩的。

问:你是如何进入网飞的产品部门工作的?你认为从事推荐工作的产品经理拥有数学技能重要吗?

A.我在网飞开始时是一名数据科学家,在这家仍然很小的公司里参与了很多项目。然而,在与负责推荐算法的工程和产品团队交谈后,我对这个特定领域产生了浓厚的兴趣。网飞正在计划一个基于流媒体的全球产品,推荐算法还比较基础;它主要利用通过邮件发送的 DVD 产品提供的信息进行了优化。

我提出了许多基于流数据学习统计模型的想法,以改进推荐,我向产品团队提出了这些想法。他们是开放的,对模型感兴趣,但对涉及的定量方法感到不舒服,无法决定赞助任何一个模型。谢天谢地,我当时的老板 Chris Pouliot 支持这些想法(尽管持怀疑态度),并给了我几周时间将其中一个开发成离线原型。原型产生的建议看起来很有趣,一旦我们把它们展示给产品团队,他们就会赞助这个项目。我们与工程和其他团队合作,全面开发和测试它,并根据结果部署它。

这一成功促使产品团队邀请我参与其他与推荐相关的项目。在其中的一次过程中,我开始相信让那些对定量方法不太了解的人——在这种情况下是产品经理——管理整个创新过程是次优的。所以我把这个批评传达给了产品团队。

令我惊喜的是,在思考了几天之后,他们的反应是同意让产品经理拥有深刻而广泛的量化经验将是一件有趣的实验,并创造了一个新的职位来尝试这个想法。更令人惊讶的是:他们让我去面试新职位。所以我转到了产品创新团队。结果相当不错,于是我被要求建立一个拥有强大定量背景的产品经理团队,来管理网飞的推荐和搜索创新流程。

为这个团队寻找合适的人需要时间,但这种努力是值得的,因为他们能够更好地领导跨职能团队,为网飞流媒体构建全球推荐和搜索技术。这种经历与我在其他公司看到的形成鲜明对比,我仍然相信,管理创新过程的强量化产品领导者是创造高质量算法产品的唯一途径。

你在网飞呆了七年;在这段时间里,你看到机器学习的使用方式发生了哪些变化?

它变得更加复杂。我们从几个相对简单的视频排名时间序列或回归模型开始,随着时间的推移,我们发现了更重要的用例,如推荐页面的构建或选择正确的图像来支持推荐。与此同时,我们发现各种更复杂的模型,经过适当的调整和使用,可以提供更好的体验。

将产品体验的关键部分委托给机器学习可能很难,但只在产品的边缘部分部署机器学习保证了有限的影响和有限的学习。你如何看待对产品有影响的方面进行信任机器学习的信念飞跃?

我认为你永远不应该盲目地相信一个机器学习系统会比一个替代品(比如手动治疗)表现得更好,直到事实证明并非如此。即使在获得这样的证明之后,机器学习系统也需要不断的监控,以确保整个系统或产品在周围世界发生变化时继续表现良好——以与您组织的使命相一致的方式。

重点是阐明你预计机器学习将如何改善产品或体验,然后投资于研究和开发,以探索这一假设。只有通过旨在理解变化的全部含义的仔细测试和分析,你才应该切换到基于机器学习的产品。这个过程既漫长又昂贵,只在产品的一小部分上尝试是没有意义的,因为即使在最好的情况下,对企业和使用你产品的人的回报也是很小的。

去年夏天,莫妮卡·罗加蒂写了一篇名为《》的伟大作品,并提出,“在有效利用人工智能和机器学习之前,你需要为你的数据打下坚实的基础。”然而,有时通过机器学习获得的酷结果可以引发公司需要的那种改进,以从公司的数据中提取更多价值。在你的数据工程还没有完善之前,开发机器学习能力是否具有生产力?

你的数据工程永远不会完美,所以等完美了再去开发机器学习解决方案是不明智的。然而,如果数据过于嘈杂、脆弱或稀疏,你将浪费时间来构建和部署大规模的机器学习解决方案。你需要介于两者之间。一种方法是建立一个你关心的数据层次,一旦第一个数据层次稳固,就开始开发机器学习解决方案。与此同时,继续努力提高其他数据的质量和可用性。

此外,我认为努力更好地了解你的客户、你的业务、你的产品以及他们之间的任何互动总是富有成效的。数据建模和分析是一个很好的方法;它可以帮助生成假设和潜在有用的输入信号,用于以后可以开发的机器学习技术。这种探索性工作的大部分可以在数据生产就绪之前完成。

天赋现在感到非常受限制。面对大科技公司如此激烈的招聘活动,我们其他人很难招聘到合格的人,甚至是刚从学校毕业的人。那么,当人才受到如此制约时,我们如何前进?这对人工智能的发展意味着什么?

大学对此的反应是开始培训越来越多的人掌握这类工作所必需的统计和计算等综合技能,所以供给在增加。但随着越来越多的组织意识到他们可以从这些技能中获得价值,需求也在增长。我不清楚未来十年在这方面会如何发展。然而,我也认为,希望员工拥有人工智能背景的公司应该非常清楚他们组织的使命,以及人工智能在这一使命中可以发挥的作用。当然,在人工智能领域训练有素的人才中,你应该能够找到那些不仅对它感兴趣,而且对它与你的组织的使命的特定交集充满热情的人。

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

Illustration by Alfonso de Anda

数据可以通过多种方式影响产品,例如 A/B 测试和强化学习来优化或个性化。但即使在此之前,网飞已经能够使用数据来建议新的测试功能,甚至新的内容策略。你能谈谈数字公司如何利用数据来建议新功能、新产品,甚至新的内容策略吗?

这又回到了一个更早的问题:使用数据分析和建模来更好地理解你的业务、你的客户、你的产品以及它们之间的相互作用。例如,寻找在与你的产品互动时倾向于表现相似的人群。利用这些受众的规模并分析每个受众参与的内容类型,可能会让您改变内容组合,以更好地将受众与产品相匹配。

然而,分析过去的数据应该主要用于生成假设。许多将被证明是错误的,例如简单的相关性在实现时会有不同的表现。所以测试,无论是完全受控的(如在 A/B 测试中)还是不受控的(改变一些东西并分析之前和之后),总是必不可少的。

你今年夏天写了一篇关于矩阵分解模型的在线方法的论文,网飞以这种方法做推荐而闻名。但是你也曾经** 写过关于多武装土匪的 。什么时候像矩阵分解这样的监督学习方法是推荐的方法,什么时候公司应该使用土匪?**

因子分解模型已经被证明对于个性化非常有效,因为它们在个体和项目之间有效地共享信息,以学习一个小的(例如,100)数字集合来描述每个人和每个项目的行为。另一方面,多武装匪徒本质上是一个回归模型,它根据输入信号的加权和来预测结果。这对于个性化来说是有问题的,根据定义,我们期望个人和物品的交互是重要的。但是量化这种相互作用,将其转化为回归模型的足够少的输入信号可能是复杂的。

多臂强盗在非个性化的环境中可以非常成功,因为他们使用所谓的探索-利用策略来避免仅仅因为你没有足够的数据而错过好的决策(例如推荐哪些文章)。您在这里提到的第一篇文章的要点是,如果与特定问题相关,也可以用因子分解模型实现这种探索利用策略。

由于网飞是一项订阅服务,因此优化最重要的事情似乎是保持用户数量,它每隔几个月才会给你一个信号。你如何将点击率等快速代理 KPI 与留存率等更重要但速度较慢的 KPI 区分优先级?你如何平衡通过强化学习的快速优化和 A/B 测试的缓慢响应?

我差不多两年前离开了网飞,所以我不知道他们今天是如何做算法决策的。但是在互联网技术行业,你会发现一个非常快速的代理(播放、阅读、点击等)。),然后您仔细测试一个基于此类短期数据训练的模型,以确定长期指标是否真的有所改善。在网飞,这总是意味着要等三到六个月,我们才有信心找到更好的产品版本。我知道的大多数公司都没有这么有耐心,我认为这是一个错误。在互联网技术中,我还没有看到任何强化学习的成功应用,直接优化一个人可能关心的长期指标,但我认为这个方向很有趣,还没有被充分探索。

总的来说,关于公司应该(或不应该)将机器学习整合到他们的产品开发中,你学到了什么?

特别是,要非常仔细和深思熟虑,确保最终的产品是高质量的(不管你的 KPI 如何,不要偏向你能想象到的最差的内容或交互质量)。产品最终至少与公司的使命相一致,并且理想地支持公司的使命。最后,对产品的社会后果有自己的看法。

打开 STT 1.0 版本

原文:https://towardsdatascience.com/open-stt-v10-release-1c28da67f2e6?source=collection_archive---------38-----------------------

我们终于成功了!

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

I wanted to give him an ushanka, but my paint editing skills are too poor

TLDR

这是一篇非常简短的关于公开赛【STT / TTS v1.0发布的伴随帖。

简单地说:

  • 打开 STT 在此发布打开 TTS 在此发布,噪声数据集在此发布
  • 我们在两个新的大型和多样化的领域中添加了两个新的数据集,大约有 15,000 小时的注释
  • 新数据集有真实说话人标签(即将发布);
  • 整体注释质量得到提高,大多数注释边缘案例得到修复;
  • 数据集规范化大大提高;

打开 STT 摘要

前一段时间,我们对 STT 的总体状态(例如与计算机视觉相比)感到失望,尤其是在俄语方面。

总的来说,它面临着许多问题:(1)小/不太有用/不总是公开的学术数据集(2)巨大的不切实际的解决方案(3)庞大的/过时的/不切实际的工具包(4)一个有着悠久历史并已经被 SOTA 病毒困扰的行业(5)缺乏没有太多附加条件的可行解决方案。

所以我们决定从头开始为俄语建立一个数据集,然后基于数据集建立一套预先训练好的可部署模型。然后可能会涉及更多的语言。

开放 STT 可以说是目前存在的最大/最好的开放 STT / TTS 数据集。请点击以上链接了解更多信息。

最新版本中的主要功能

重大最新 发布 亮点:

  • 见上面 TLDR 的子弹;
  • 新数据集的说话人标签;
  • 数据集现在可以通过 torrent 以.wav文件的形式获得(我用 1 gbit/s 的通道播种),也可以通过直接下载链接以.mp3文件的形式获得(下载速度也很快);
  • 覆盖 3 个主要领域的小型人工注释验证数据集(18 小时);
  • 整体上游模型质量改进;
  • 不再有“晃来晃去”的字母;
  • 改进的语音活动检测;
  • 极大地改进了数据集标准化;
  • 显然注释并不完美,但是当我们添加新数据来过滤最讨厌的情况时,我们会不时地添加排除列表

潜在用途:

  • 语音转文字(显然);
  • 去噪(为此还要考虑我们的asr-noises 数据集);
  • 大规模文本到语音转换(新增);
  • 扬声器二进制化(新增);
  • 说话人识别(新增);

批准

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

数据集大多是在cc-nc-by 许可下发布的。

如果您想将其用于商业用途,请提交一份表格,然后在这里联系我们

如果你需要一个快速(即不需要 GPU 运行)/可靠/离线 STT / TTS 系统,请联系

下一步是什么?

  • 改进/重新上传一些现有数据集,完善标签;
  • 尝试用扬声器标签注释以前的数据;
  • 发布预训练模型和后处理;
  • 完善并发布扬声器标签;
  • 大概是增加新的语言;
  • 完善 STT 标签;

原载于 2019 年 11 月 4 日https://spark-in . me

OpenAI、欺骗性技术和模型风险管理

原文:https://towardsdatascience.com/openai-deceptive-technology-and-model-risk-management-57286070c06c?source=collection_archive---------15-----------------------

GPT-2 和数字防御战术手册发布后的点点滴滴

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

Example of a prompt and the synthetic text generated by OpenAI’s GPT-2. (Source: OpenAI)

在我整理自己对发布可能有负面影响的技术和信息的想法时,这篇文章将一些点联系起来。它涉及 OpenAI 发布的 GPT-2 和我们的数据机构发布的数字防御剧本*,破坏性与欺骗性技术,恶意意图,深度伪造,验证和监视,以及模型风险管理。尽情享受吧!*

OpenAI 的 GPT-2

OpenAI 最近在发布的 GPT-2 引起了轰动,这是一种语言模型,可以接受人类写的提示,并生成不止一页连贯的“人类质量”的文本。我看到人们对他们的发布策略比对模型本身更感兴趣。他们选择不发布完整的模型、数据集、训练代码或模型权重,理由是担心如何使用它们。他们解释说:

这个决定,以及我们对它的讨论,是一个实验:虽然我们不确定这是今天的正确决定,但我们相信人工智能社区最终需要在某些研究领域以一种深思熟虑的方式解决出版规范的问题。生物技术和网络安全等其他学科长期以来一直在积极讨论在明显可能被滥用的情况下负责任的发布,我们希望我们的实验可以作为一个案例研究,在人工智能社区中对模型和代码发布决策进行更细致的讨论。

反应很快,许多人对 OpenAI 的动机感到好奇。其他人担心开源的未来。

破坏性与欺骗性技术

Gradient 发表了一封由 Hugh Zhang 撰写的公开信,呼吁 OpenAI 提供完整的模型,区分破坏性和欺骗性技术:

  • 破坏性技术主要在物理领域运作。想想化学武器、实验室制造的超级病毒、致命的自主武器或原子弹。
  • 另一方面,欺骗性技术主要在我们的意识领域运作,有可能被大范围滥用来操纵和控制人们。

张接着说,对付欺骗性技术的方法是“尽可能公开它的威力”,而“绝对不能让足够危险的破坏性技术轻易获得”

他确实承认欺骗性技术可能是危险的,并建议使用“论文发表和代码发布之间的一小段延迟,以防止快速反应的恶意行为者在公众有时间完全处理新结果之前突袭。”

虽然我能理解这种观点,但公开知识和公众有知识是有区别的。公开信息并不能保证公众最终会看到它,或者有时间或兴趣去完全处理它。

恶意

在一篇对 GPT-2 的发布持不同立场的文章中,瑞恩·洛威问了机器学习(ML)研究人员一个问题:

我们正在建造影响人们的东西。迟早,我们会越过一条线,我们的研究可以被恶意利用来做坏事。我们是否应该等到这种情况发生时再决定如何处理可能有负面副作用的研究?

这与张所说的“快速反应的恶意演员”相呼应。当我读到这几行时,我的胃翻了个底朝天。我们必须努力解决的一个问题是,这项研究正被用来做坏事——人们甚至没有恶意。Lowe 在文章的后面确实提到了这个问题:

ML research 已经在现实世界中产生了影响(例如,对贷款申请法院判决人员招聘等做出决策。).这些算法中的偏见现在正在被暴露出来,但这是在它们首次实施多年之后,同时它们对人们的生活产生了严重影响。

在对创新的关注、人工智能(AI)领域缺乏多样性以及可能的大量其他因素之间,新技术的引入往往没有认真考虑潜在的不利影响或意想不到的后果。

人工智能研究员兼 fast.ai 联合创始人雷切尔·托马斯解释了让她害怕人工智能的 5 件事:

  1. 算法的实现往往没有解决错误的方法。
  2. 人工智能更容易让人没有责任感。
  3. AI 编码&放大偏见。
  4. 优化指标高于一切会导致负面结果。
  5. 大型科技公司没有问责制。

这里没有一点是关于恶意行为者的,而是关于人工智能的日常实现。似乎解决这些问题表明了透明度和公开性的重要性。

Deepfakes

实际的恶意行为者呢?我已经写了关于 deepfakes 引起的担忧和损害。大量的金钱和资源被投入到检测它们的工作中,一些人表达了对 deepfakes 和类似技术如何被用来扰乱 2020 年选举(以及更广泛的影响)的担忧。

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

Still from video by Deeptrace. (Source: IEEE Spectrum)

事实上,OpenAI 在他们不提供 GPT-2 完整版本的理由中引用了这些技术:

我们还可以想象这些模型的应用出于的恶意目的,包括以下几种(或者其他我们还无法预料的应用):

  • 产生误导性新闻文章
  • 在网上冒充他人
  • 自动制作发布在社交媒体上的辱骂或伪造内容

回到张关于欺骗性技术的“论文发表和代码发布之间的一个小延迟”的建议,许多致力于检测 deepfakes 的研究人员已经谈到了分享他们的发现的问题。

计算机科学家 Siwei Lyu 在 2018 年 8 月发表了一篇文章,解释了他的团队如何基于眨眼实现了超过 95%的深度假货检测率。但是随后的一篇文章透露,“就在他的团队将论文草稿放到网上的几个星期后,他们收到了匿名邮件,这些邮件链接到伪造程度很高的 YouTube 视频,这些视频中的明星更正常地睁开和闭上眼睛。虚假内容的创造者已经进化了。”

加州大学计算机科学教授哈尼·法里德使用法医技术来检测深度假货。他解释了由于机器学习,对抗它们变得更加困难,以及为什么他不分享新的突破:

程序员所要做的就是更新算法来寻找,比如说,与心跳相对应的面部颜色变化,然后突然之间,假货就融入了这种曾经难以察觉的迹象。一旦我泄露了这项研究,只需要一个混蛋把它加入他们的系统。

虽然有些人呼吁将可以生成假媒体的技术开源,但那些致力于检测假货的人通过保密他们的创新,在所谓的人工智能军备竞赛中受益。

核查和监督

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

(Photo by Chris Ried on Unsplash.)

一些人不再专注于检测假媒体,而是着眼于验证真媒体。技术社会学家泽内普·图费克奇建议验证可以通过摄像头或区块链数据库中的防欺骗元数据来实现。这些解决方案可能有助于验证图像或视频,但验证文本可能会更加困难。图费克奇还提醒我们:

然而,有效的身份识别系统也带来了一个令人担忧的事实:每一种验证方法都有被监控的危险。

虽然她继续说有办法减轻这种担忧,但这不是一个可以掉以轻心的问题。

数字防御战术手册

在 OpenAI 发布 GPT-2 的一周前,还有一个我更关心的版本,但它没有像 GPT-2 那样受到关注。我们的数据机构(ODB) 发布了数字防御手册:回收数据的社区动力工具。该工作簿被描述为“一套久经考验的工具,用于诊断、处理和修复普遍存在的惩罚性数据收集和数据驱动系统的不公正。”

该新闻稿继续说,“ODB 希望剧本将激励社区参与解决源于社会不公正的监控、侧写和隐私问题。”

ODB 正在努力处理前面提到的一些问题的后果,包括编码到 AI 中的偏见(有意和无意)以及意外后果的影响。

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

Tawana Petty during the Data for Black Lives II closing panel. (Source: Data for Black Lives Facebook)

在麻省理工学院媒体实验室举行的“黑人生活数据 II”会议的闭幕式上,组织者和 ODB 团队成员 Tawana Petty 告诉观众:

你们都拿到了数字防御战术手册*,但是我们没有告诉你们他们所有的策略,我们永远也不会告诉你们。因为我们希望我们的社区成员继续生存和发展。所以你会得到一些东西,但是让他们活下去的东西,我们自己留着。*

虽然团队创建这个资源是为了共享知识,但是限制他们共享的内容对他们的项目同样重要。它还回顾了法里德的策略,即解释他研究的某些方面,但对其他方面保密以保持优势。

模型风险管理

上周,在我已经开始尝试将这篇文章拼凑起来之后,我参加了 QuantUniversity.com 创始人 Sri Krishnamurthy 的演讲,题目是“数据科学和人工智能时代的模型治理”他谈到了围绕代码可再现性的挑战,以及代码库的可解释性和透明性的重要性。

我特别有兴趣了解更多关于美联储sr11–7定义的模型风险管理。该文件将“模型风险”定义为“基于不正确或误用的模型输出和报告的决策的潜在不利后果。”尽管该文件在列举不利后果(财务损失或“对银行组织声誉的损害”)的例子时明显是针对金融机构的,但它确实提供了减轻风险的指导原则,可以帮助指导其他地方的做法。

如果我们从对人的影响而不是对业务的影响的角度来考虑不良后果,我们可能会开始朝着正确的方向前进。(这句台词我已经能听到笑声了。这篇文章可能会转向另一个方向,但我会继续前进。)

那么这给我们留下了什么?

在另一篇报道 OpenAI 发布 GPT-2 的文章中,技术作家 Aaron Mak 重申了我在上面思考的问题:

机器学习从业者尚未建立许多被广泛接受的框架,来考虑创造和发布人工智能技术的伦理影响。

然而,他继续说道:

如果最近的历史有任何迹象,试图抑制或控制人工智能工具的扩散也可能是一场失败的战斗。即使在传播某些算法的道德问题上存在共识,也不足以阻止持不同意见的人。

虽然协议或广泛采用的一套准则可以帮助解决意外后果和这里讨论的其他问题,但 Mak 是正确的,因为它不会阻止实际的恶意行为者。

就个人而言,我很高兴 OpenAI 选择将这一对话带入公众,并发现这比他们发布或不发布的模型更重要。虽然我也倾向于让事情开源和共享信息——为了技术的民主化、透明度和问责制——但我也理解为什么人们会对发布可能以他们不希望的方式使用的技术和信息持谨慎态度。(我担心开源的其他方面,但那是以后的事了。)

谢谢你陪我踏上这段旅程。我仍在努力发展我对这些问题的理解,并澄清我的立场。我很乐意听到您对此的想法、问题或反馈。

GPT-2:通过可视化理解语言生成

原文:https://towardsdatascience.com/openai-gpt-2-understanding-language-generation-through-visualization-8252f683b2f8?source=collection_archive---------4-----------------------

超大的语言模型是如何完成你的想法的。

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

在大多数 NLP 研究人员看来,2018 年是技术进步巨大的一年,新的预训练 NLP 模型打破了从情感分析到问题回答等任务的记录。

但对其他人来说,2018 年是 NLP 永远毁掉芝麻街的一年。

首先是ELMo(Eembeddings fromLlanguageModels)然后是BERT(BI directionEn coderRpresentations fromTtransformers),现在 BigBird 坐在胶水排行榜的首位我自己的思维已经被这种命名惯例所腐蚀,以至于当我听到“*我一直在和伯特玩,”*的时候,我脑海中闪现的图像不是我童年时的毛茸茸的单眉锥头鹦鹉,而是这样的:

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

我看不到那张,插图伯特

我问你——如果芝麻街在 NLP 模型品牌化面前都不安全,还有什么是安全的?

但有一个模型让我的童年记忆完好无损,这是一个没有名字和面孔的算法,它的作者 OpenAI 简单地将其称为“语言模型”或“我们的方法”。只有当另一篇论文的作者需要将他们的模型与这个无名的创造物进行比较时,它才被认为配得上一个名字。也不是厄尼格罗弗库克怪兽;这个名字准确地描述了算法是什么,仅此而已:GPT,预训练的生成式变压器

但是就在它被命名的同时,GPT 被伯特毫不客气地从 GLUE 排行榜上除名了。GPT 失败的一个原因是它使用传统的语言建模进行了预训练,即预测句子中的下一个单词。相比之下,伯特使用掩蔽语言建模进行预训练,这更像是一个填空练习:根据之前和*之后出现的单词猜测缺失(“掩蔽”)的单词。这种双向架构使 BERT 能够学习更丰富的表示,并最终在 NLP 基准测试中表现更好。*

因此,在 2018 年末,OpenAI 的 GPT 似乎将永远作为伯特的通用名称、奇怪的单向前身而被历史所知。

但 2019 年讲述了一个不同的故事。事实证明,导致 GPT 在 2018 年垮台的单向架构让它有能力做一些伯特永远做不到的事情(或者至少不是为它设计的):写关于会说话的独角兽的故事:

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

From https://blog.openai.com/better-language-models/ . Edited for length.

你看,从左到右的语言建模不仅仅是一个训练前的练习;它还实现了一个非常实际的任务:语言生成。如果你能预测一个句子中的下一个单词,你就能预测下一个,再下一个,很快你就有了…很多单词。如果你的语言建模足够好,这些单词将形成有意义的句子,这些句子将形成连贯的段落,这些段落将形成,嗯,你想要的任何东西。

而在 2019 年 2 月 14 日,OpenAI 的语言模型确实变得足够好——好到可以写会说话的独角兽的故事,产生假新闻,写反回收宣言。它甚至被赋予了一个新名字: GPT-2

那么,GPT 2 号具有类似人类的写作能力的秘密是什么呢?没有根本性的算法突破;这是一个扩大规模的壮举。GPT-2 拥有高达 15 亿个参数(比最初的 GPT 多 10 倍),并根据来自 800 万个网站的文本进行训练。

如何理解一个有 15 亿个参数的模型?让我们看看可视化是否有帮助。

可视化 GPT-2

由于担心恶意使用,OpenAI 没有发布完整的 GPT-2 模型,但他们发布了一个较小的版本,大小相当于原始 GPT (117 M 参数),在新的更大的数据集上进行训练。虽然没有大模型强大,但小版本仍然有一些语言生成能力。让我们看看可视化是否能帮助我们更好地理解这个模型。

:创建这些可视化效果的代码可以在 GitHub 上找到。

一个说明性的例子

我们来看看 GPT-2 小模型是如何完成这句话的:

船上的狗跑了

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

下面是模型生成的结果:

船上的狗跑了,狗被船员发现。****

似乎很合理,对吧?现在让我们稍微调整一下这个例子,把改成马达,看看这个模型会生成什么 :

船上的马达运转了

现在是完整的句子:

船上的马达以大约每小时 100 英里的速度运转。

通过改变句首的那个单词,我们得到了完全不同的结果。这个模型似乎理解了狗的奔跑类型和马达的完全不同。

GPT-2 怎么知道如此关注 g vs 马达的,尤其是这些词出现在句子的前面?嗯,GPT-2 基于变压器,这是一个 注意力 模型——它学会将注意力集中在与手头任务最相关的前面的单词上:预测句子中的下一个单词。

让我们来看看 GPT 2 号对船上的狗跑了的关注点在哪里:

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

从左到右阅读的线条显示了模型在猜测句子中的下一个单词时注意的位置(颜色强度代表注意强度)。所以,在猜测跑完之后的下一个单词时,这种情况下模型密切关注。这是有意义的,因为知道谁或什么在跑步对于猜测接下来会发生什么至关重要。****

在语言学术语中,模型关注的是名词短语*的船上的狗*。GPT-2 还捕捉到了许多其他语言特性,因为上面的注意力模式只是模型中 144 个注意力模式中的一个**。GPT-2 有 12 层,每层有 12 个独立的注意机制,称为“头”;结果是 12 x 12 = 144 种不同的注意力模式。在这里,我们将它们全部可视化,突出显示我们刚刚看到的那个:**

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

Visualization of the attention patterns across the model’s 12 layers (rows) and 12 heads (columns), with Layer 4 / Head 3 selected (zero-indexed).

我们可以看到这些模式有许多不同的形式。这里还有一个有趣的例子:

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

这一层/头把所有注意力集中在句子中的前一个词上。这是有意义的,因为相邻的单词通常与预测下一个单词最相关。传统的 n -gram 语言模型也是基于同样的直觉。

但是为什么这么多的注意力模式是这样的呢?

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

在这种模式下,几乎所有的注意力都集中在句子中的第一个单词上,其他单词都被忽略了。这似乎是零模式,表明注意力头没有发现它正在寻找的任何语言现象。当没有更好的关注点时,该模型似乎已经将第一个单词重新定位为要查找的地方。

____ 中的猫

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

好吧,如果我们要让 NLP 玷污我们对芝麻街的记忆,那么我想苏斯博士也是公平的游戏。让我们看看 GPT-2 是如何完成经典作品《戴帽子的猫》中的这些台词的

在一只风筝线上,我们看到了妈妈的新衣服!她的礼服上有粉色、白色和…

GPT 2 号是这样完成最后一句话的:

她的礼服上有粉色、白色和蓝色的圆点。

不算太差!原文有红色,至少我们知道不只是背。

那么 GPT 2 号是如何知道选择颜色的呢?也许是因为下面的注意模式似乎能识别逗号分隔的列表:

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

为了确定在之后的单词,模特将注意力集中在列表中的前面的项目上——粉色和白色。它知道挑选一个与前面项目类型相匹配的单词,在这个例子中是一种颜色。

名字有什么意义?

GPT-2 似乎特别擅长只根据一个名字写短篇传记。

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

作为一个实验,尝试让 GPT-2 从提示中生成文本“谁是<你的名字>?”这个特殊的提示通常会触发模型写一篇简短的传记,可能是因为这是网络文章中作者传记的常见序言。

下面是为提示“谁是杰西·维格?”生成的几个 bios。:

“杰西·维格是社交媒体营销专家,曾任社交媒体营销经理。他是 VigMedia.com 的联合创始人兼首席执行官,最近又是 vig media . com 的创始人兼首席执行官。”

还不错!有点重复,但以一种意想不到的方式很好地将故事个性化。这里还有一个:

“杰西·维格是一位名叫詹姆斯·维格的福音传教士的儿子。他于 1964 年移居美国,成为密歇根大学的一名传教士,在那里他教了 18 年书,直到 2007 年 10 月去世。

在这最后一个例子中,GPT-2 足够聪明,知道我的另一个自我的父亲有相同的姓。让我们看看 GPT 2 号在选择最后一个名字时将注意力集中在哪里:

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

Layer 11 / Head 10

**当决定在詹姆斯之后预测的单词时,这种模式将注意力集中在我的姓的先前提及上。(注意,在模型内部, Vig 已经被分成单词块“V”和“ig”,因为它是一个不常用的单词。)似乎这种注意模式专门识别家族名字之间的关系。为了测试这一点,让我们稍微修改一下文本:

“杰西·维格是一位名叫詹姆斯的福音传道者的 同事……**

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

Layer 11 / Head 10

现在詹姆斯只是一个同事,这种注意力模式几乎完全忽略了我的姓。

注意:《GPT-2》似乎是根据一个名字的种族和性别来生成传记的。需要进一步的研究来了解这个模型可能会编码什么样的偏见;你可以在这里阅读更多关于这个话题的内容。

未来是可生成的

就在去年,生成各种内容的能力——图像、视频、音频和文本——已经提高到我们不再相信自己的感官和判断的程度。

而这仅仅是开始;这些技术将继续发展,并变得更加相互融合。很快,当我们看着thispersondoesnotexist.com上生成的面孔时,他们会迎着我们的目光,和我们聊起他们生成的生活,揭示他们生成的人格的怪癖。

最直接的危险也许是真实与生成的混合。我们已经看过了奥巴马作为人工智能傀儡的视频和和与的奇美拉的视频。很快,这些 deepfakes 就会变成个人的了。所以,当你妈妈打电话说她需要 500 美元电汇到开曼群岛时,问问你自己:这真的是我妈妈吗,还是一个语言生成人工智能从我妈妈 5 年前发布的脸书视频中获得了她的语音皮肤?

但是现在,让我们先欣赏一下关于会说话的独角兽的故事。

关于这个和相关项目的更新,请随时关注我的 推特

更新】: 厄尼现正式拍摄(两次!)—参见通过 kNowledgeIntEgration 和EEenhanced LanguageRpresentation 通过 INEentities按原样

资源:

GitHub repo 用于 Jupyter 和 Colab 笔记本电脑的可视化工具,使用这些出色的工具/框架构建:

供进一步阅读:

解构 BERT:从 1 亿个参数中提取 6 种模式

解构伯特,第 2 部分:可视化注意力的内部运作

人工智能玩疯狂图书馆,结果是可怕的

图解变压器教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值