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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

按需最后一英里运输

原文:https://towardsdatascience.com/on-demand-last-mile-transportation-ea4a3b725b31?source=collection_archive---------26-----------------------

具有位置智能的实时路线优化

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

近年来,我们看到了众多市场平台的出现,这些平台将客户与各种各样的产品和服务联系起来。这方面的明显例子有优步邮局斯图亚特,它们允许你订购基本上任何东西的取货和送货服务,从乘车、食物,甚至是小包裹,并在不到一两个小时内送到。

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

从物流的角度来看,有效运营这一服务是一项挑战,而且在该行业面临激烈竞争的情况下,这一点越来越重要。由于问题的性质与标准物流公司的问题非常不同,传统的物流解决方案不再适合规划这种服务。如果我们看看任何一家正规的第三方物流(3PL)公司,他们通常会在某个截止时间之前接受第二天的交付订单,以便他们有足够的时间规划第二天的路线。这与随需应变服务不同,在随需应变服务中,新订单必须(几乎)实时处理和分配,而没有未来可能到来的订单的信息。

众所周知,这两个问题都很难解决,尤其是如果我们想确保我们的运营处于最佳状态,或者至少比我们的竞争对手更好。这就是空间数据科学可以发挥作用的地方,因为它允许我们建立模拟现有条件的数据模型,为我们提供关于现有约束、低效分配等更多信息的见解。

传统与按需最后一英里运输问题

虽然这两个问题都很难解决,但每个问题的复杂性可以在非常不同的阶段发现。传统的最后一英里运输问题是一个车辆路线问题(VRP) ,一个组合的优化问题,从算法设计的角度以及计算的角度来看,其复杂性是众所周知的。与实时按需运输问题相比,它们的明显优势在于,关于订单和司机可用性的所有信息都是预先知道的,通常不需要立即找到解决方案。这使得更容易找到接近最优的解决方案。有几个算法被设计来解决这个问题,有几个实现了这些算法的解决方案,包括商业的和开源的。

另一方面,实时按需运输问题是较小的问题,因为可用的信息较少,但需要立即做出响应。在这里,我们只知道在我们检查系统状态之前发生了什么,并且大部分都不能改变,因为它已经被交付了。由于缺乏未来信息和无法改变过去的决定,这可能导致非常低效的路由。克服这种对问题的狭隘看法成为主要挑战。

下面的地图很好地展示了这种狭隘的观点,在这里我们只能看到每 3 分钟时间窗口内的订单。一旦时间窗口过去,我们就不能改变我们所做的任务,我们也不知道会有什么样的订单。

在物流文献中,对于如何克服这种狭隘的视野问题有共识:增加决策的灵活性,并试图获得尽可能多的未来信息。第一点是尽可能推迟决定,做出容易撤销或改变的决定。第二个问题涉及使用其他数据科学技术,如预测,以拓宽我们的视野。

这个问题很难归类为一个问题类别,因为它取决于所提供服务的复杂性,也取决于我们希望在优化路线方面走多远。它可以从一个“简单的”分配问题(如果我们只需要考虑与窄时间窗相关的信息)到一个 VRP(如果我们需要考虑在算法的当前迭代之前司机已经做了什么)。

接下来的主要挑战是能够计算所有需要的成本,并设计一种算法,能够在几秒钟内找到接近最优的解决方案。还可能有其他挑战需要克服,例如计算在我们开始一天的工作之前我们需要多少司机,我们需要什么车队,或者计算接下来几分钟/几小时的天气预报。

这两种情况下要解决的问题的巨大差异使得很难(如果不是不可能的话)将传统的物流解决方案用于按需运输问题。

设计和改进优化算法

以下示例显示了如何应用优化来解决按需运输问题的第一步,以及这样做所获得的好处。这里有一个场景,我们将应用两种初始方法来解决这个问题。

以下假设是为了提高演示文稿的清晰度。但是,请记住,问题可能会变得更加复杂,这取决于我们希望在优化我们的功能方面走多远,以及稍后描述的所提供服务的需求。

  • 我们的目标是将距离最小化,我们的主要衡量标准将是行驶的总距离。这可以很容易地改变为其他标准,如最小化交付时间或所需的车队,仅举几例。
  • 每个订单都是相互独立的,也就是说,它们不能合并,因此,除非骑手空闲,否则在完成当前交付的订单之前,他们无法开始订单。
  • 骑手在空闲之前不会被分配到新订单。
  • 每个骑手的车队类型都是一样的。
  • 在算法的每次迭代中,我们总是有足够多的空闲骑手来分配订单。当然,这在现实生活中不会发生,而且会增加问题的复杂性。

在下面的地图上,我们可以看到周四下午 7:00 到 7:05 收到的订单。我们可以看到取货和送货地点、为每个订单计算的最佳路线,以及空闲的或在时间窗口内的某个时间点可用的骑手/司机。我们将重点关注这 5 分钟的时间窗口,以便更容易显示和比较结果。

步骤 1:起点-终点矩阵

为了解决任何路径问题,我们需要构建一个成本矩阵,表示从地点 A 到地点 B 的成本,或者在此处显示的情况下,将位于 A 点的骑手分配给提货地点在 B 点的订单的成本。在我们的示例中,该 OD 矩阵将是从骑手地点到订单提货地点的距离。

所述,构建 OD 矩阵对于按需运输问题来说是一个更大的挑战,因为需要实时计算这个矩阵。

贪婪算法

这通常是解决这个问题时遵循的第一种方法。该算法在每次收到订单时被激活,它搜索最近的空闲骑手并将订单分配给该骑手。在这种情况下,我们采用最接近的标准,但根据所提供的服务或业务目标,也可以是任何其他需要优化的标准。

这种算法被广泛使用,因为它很容易实现,并理解和分析其结果。此外,在推出新业务时,客户体验通常是主要指标之一,因此希望尽快处理每个订单是有意义的。然而,这并不一定意味着顾客总能得到更快的服务。

使用该算法解决问题后,我们得到了乘客从出发地点到上车地点的总距离 181.67 km。

在下图中,我们可以看到使用线框绘制的算法执行的前六个步骤,其中黑点是空闲骑手的位置,绿点是订单的提货位置。这种可视化非常强大,因为它可以帮助快速识别我们算法中的低效之处。

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

Figure 1. First six iterations of the greedy algorithm

批量分配算法

如前所述,改进作业的一个关键因素是尽可能地增加信息和灵活性。扩大我们的视野并获得更多信息的一个选择是推迟订单分配,每 n 分钟运行一次算法。我们越推迟越好,因为我们会有更多的信息。

下图显示了每分钟收到的订单数。

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

Figure 2. Number of orders per minute

每分钟运行一次算法意味着订单将不得不等待(最多)一分钟才能得到处理,这最初不会对客户体验产生重大影响。事实上,我们会看到一些订单甚至会提前交付。

算法每分钟都会被激活,它会考虑最后一分钟收到的所有订单并进行分配。这意味着它将有多个订单要分配。为了充分利用我们所有的信息,我们将把它作为一个指派问题来解决。

有专门为这个问题设计的算法,比如匈牙利算法。通常,这些算法是为问题的非常具体的情况而设计的,当问题开始需要复杂的特征时,很难改进它们。这就是为什么我们将使用线性规划,或者更具体地说整数线性规划来解决它。这项技术将使我们能够适应未来的变化或增加问题的复杂性。

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

使用这种批量分配算法解决问题后,我们得到的总行驶距离为 159.10 km ,也就是说,我们的目标指标提高了13%

如果我们用两种算法比较第一分钟(从晚上 7:00 到 7:01)收到的订单上完成的任务,我们可以看到一些很大的差异。例如,如果我们查看地图的东北部分,我们可以看到使用贪婪算法完成的效率非常低的分配,而使用批量分配算法完成的分配效率要高得多。这要归功于通过推迟任务完成的时间来获得更多的信息。

同样,能够将两种算法做出的决策可视化是非常强大的:

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

Figure 3. Comparison of assignments done by the greedy algorithm (left) and the batch-assignment algorithm (right) for the orders received within the first minute

后续步骤

前面的两个算法只是面对这个问题时通常遵循的第一个自然步骤。然而,问题的复杂性通常要求更多的步骤。

如上所述,在问题的每一次迭代中拓宽可用信息是至关重要的。一个非常有用的步骤是考虑在接下来的 30 到 60 分钟(或者更多时间,取决于服务的长度)内可能发生的事情。这将是非常有益的,有一些需求的预测,以避免分配将远离高需求地区的车手。这可以通过识别哪些骑手不应该被分配给交货地点远离高需求区域的订单而容易地合并到批量分配模型中。此外,这些信息可以提供给骑手,这样他们就知道空闲时应该去哪里,以确保他们被分配更多的订单。

下面的地图显示了从现在起一个小时后需求预计发生的位置,以及闲置的骑手。根据他们离预期需求较高的地区有多远,他们将被赋予不同的优先权。

除此之外,还有其他的改进可以提高作业的效率和质量。这些改进在很大程度上取决于所提供的服务类型。

  • 优化标准。在我们的示例中,我们将距离作为要优化的度量。然而,我们可能会添加额外的标准,始终牢记在算法的每次迭代中必须计算成本。一些例子可能是时间、利用率(这对于购买和/或维护车队成本高昂的公司尤其重要),以及客户和骑手体验。
  • 根据服务的使用频率匹配客户的质量,并根据客户的意见和交付效率匹配骑手的质量。
  • 合并订单(如优步池)
  • 通过尽可能推迟分配来创建更大的批处理。例如,对于递送小包裹,5 分钟可能就够了。

从算法的角度来看,将这些标准整合到我们的模型中是一项复杂的任务。能够可视化我们测试的不同算法所做出的步骤和决策,对于非常耗时的任务来说是一个非常强大的工具。在这里,可视化工具可以提供巨大的帮助。

本文原载于 CARTO 博客

设备上的机器学习:Android 上的文本生成📝

原文:https://towardsdatascience.com/on-device-machine-learning-text-generation-on-android-6ad940c00911?source=collection_archive---------10-----------------------

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

Photo by Pereanu Sebastian on Unsplash

结合 GPT-2、TensorFlow 和 Kotlin 的力量,在移动设备上实现最先进的自然语言处理

在拥抱脸,我们的目标是解决和民主化自然语言处理(NLP)。目前,生产中的大多数模型都是在服务器上远程运行的,例如谷歌的搜索服务器。尽管如此,移动设备上硬件的改进和对隐私的日益关注使得它们越来越适合离线运行

本文的目标是给出一个完全在设备上运行的用于文本生成的 Android 应用程序的高级视图。代码在这里:https://github . com/hugging face/TF lite-Android-transformers/tree/master/gp T2

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

What we’re going to build 🤓

第一部分:将 GPT-2 转换为 TensorFlow Lite 格式

GPT-2 是 2019 年发布的一款车型,其自然语言生成能力(NLG,NLP 的一个子集)令人印象深刻,以至于最大版本的发布被推迟了几个月。你可以用 这个搞笑(吓人?)工具 我们发布。在这个应用程序中,我们将使用最小版本的模型。它的发电能力不如最大的那台令人印象深刻,但它的大小(500MB 6GB)使它更适合移动使用!

在能够在设备上运行之前,我们需要将它转换成合适的格式TensorFlow Lite (TFLite)。为此,我们可以运行以下 Python 脚本:

tf-nightly” and “transformers” libraries need to be installed in your environment. You can also try it directly in your browser using this colab notebook.

这个脚本使用了我们的🤗Transformers 库导入“原始”模型,然后将其转换为 TFLite 格式。注意脚本的第 15/16 行:在运行转换之前,我们使用 TFLite 指定我们想要将模型的权重(参数)量化为半精度浮点格式。这导致我们转换后的模型的最终大小为 237MB,即**原始“输入”模型大小的一半🎉。**不利方面?精确度损失极小,但考虑到节省的存储空间,在移动设备上绝对值得!

我们可以通过将权重转换为 8 位整数表示形式来进一步压缩我们的模型,结果只有 128MB。但是我们对这个版本的测试显示在设备上要慢得多。因此,我们更喜欢在这里使用半精度浮点版本。你仍然可以通过改变默认模式来试验我们的应用程序的 8 位版本。

第二部分:将转换后的 GPT-2 模型集成到 Android 应用程序中

既然我们已经转换了我们的模型,我们可以专注于实际构建我们的应用程序。GitHub上有完整的源代码,所以这里我只关注最有趣的部分。

在 Python 脚本中,我们指定(第 6/7 行)我们的模型将接受一个形状为 [1,64]二维整数数组作为输入,即类似这样的内容,其中内部数组包含 64 个元素:

[[142, 34, 100, 535, 30234, 45, 2934, ...]]

但是我们在现实生活中将要拥有的是一个字符串,对应于当前文本。因此,我们需要将该字符串转换成整数,又称为 记号 。粗略地说,我们可以说,一个令牌是我们的字符串的一部分的数字表示。

令牌也是模型作为输出返回的内容。模型的每一次运行都允许我们确定文本的下一个标记,然后我们将它与前一个文本一起传递给我们的模型进行下一次运行,等等

我们需要一些东西来把我们的字符串转换成记号,再把记号转换回字符串。这就是记号赋予器的作用。记号赋予器的两个主要功能通常是编码解码。

Full implementation of the Tokenizer available here

encode 函数将我们的起始/前一个文本作为参数,使用正则表达式对其进行解析,然后将每个字符转换为特定的表示。它最后应用一个字节对编码 (BPE)算法,由于有了模型词汇表,该算法的输出被映射成整数。🤯

decode 函数执行相反的操作,将标记映射到它们的词汇表示,然后将这个表示解码为最终的字符串。

现在我们知道如何编码和解码我们的文本,我们可以调用我们的模型!这是下面的生成功能的作用:

Click here to see the full implementation

该函数的输入是初始文本和我们想要生成的令牌数(,即我们的模型被调用的次数)。第一步是对我们的文本进行标记。

还记得我们说过模型的输入是一个形状数组*【1,64】吗?我们需要去掉之前的文本标记,只保留最后的最大值。那是我们的输入。*表示下一个令牌的生成只依赖于这 64 个之前的令牌,忽略任何之前的令牌

当我们转换我们的模型时,我们可以指定一个更长的序列长度,但是这将意味着更多的推理计算,减慢我们的应用程序。这是我们这一代人在速度和“质量”之间的权衡。🤔

我们还需要创建数据结构,我们的模型将使用它的输出。我们的模型有许多输出,但是我们只对第一个“预测”感兴趣。

val predictions = Array(1) **{** Array(SEQUENCE_LENGTH) **{** FloatArray(VOCAB_SIZE) **} }**

当谈到多维数组时,我们在 Kotlin 的表达能力方面达到了一个极限;下面是它在 Java 中的样子:

float[][][] predictions = new float[1][SEQUENCE_LENGTH][VOCAB_SIZE]

我远不是一个 Java 迷,但是右边的表达对我来说似乎更容易读懂!

我们终于可以——了!—通过调用 TFLite 解释器来运行我们的模型:

tflite.runForMultipleInputsOutputs(arrayOf(inputIds), outputs)

一旦解释器填充了我们的“预测”数组,我们需要确定将是我们的“下一个”令牌。这样做有许多不同的方法;这里我们首先使用 Top-K 过滤,选择 k 更高的预测。然后,我们应用一个 Softmax 函数来获得这些值的概率分布,然后通过多项式采样最终选择“那一个”。

第三部分:借助 Kotlin 协程,以用户界面友好的方式与活动交互

现在是时候将我们的模型链接到应用程序的接口了!在设备上运行 GPT-2 等模型,即使是量化版本,也需要计算资源。如果我们做错了,我们可能会在模型运行时以界面冻结而告终,这对用户不太友好!😱

为了避免这种糟糕的结果,我们将使用 协程 ,这是在 Kotlin 中进行非阻塞编程的一种非常好的方式。这是我们(几乎)完整的 GPT2Client 类,它是从我们的主活动加载的 ViewModel :

For full implementation, check here

该类首先需要加载我们模型的所有资产,并初始化 TFLite 解释器。为了在不阻塞 UI 的情况下做到这一点,在 init中,我们启动了一个新的协程,这要归功于viewmodelscope . launch。在这个协程中,我们通过调用 3 个" load" 方法来加载我们的模型资产。以下是负载模型的签名:

private suspend fun loadModel() = **withContext(Dispatchers.IO)** **{** // Load the model file and initialize the interpreter with it... **}**

这里重要的是带有上下文的*(调度程序。*IO)部分。我们说我们想在一个不同于主线程的线程上执行这个方法,这里使用一个为 I/O 操作设计的线程(更多细节见这里)。

通过 viewModelScope.launch 创建协程的“妙处”在于它将自己的生命周期与 ViewModel 的生命周期联系在一起。它确保当视图模型被清除时,协程被取消!🙌

然后,当用户点击应用程序中的“触发自动完成”按钮时,执行 launchAutocomplete 方法,创建另一个协程,我们将从其中调用我们的模型。

fun launchAutocomplete() {
    autocompleteJob = **viewModelScope.launch** **{** initJob.**join**()
        autocompleteJob?.**cancelAndJoin**()
        _completion.value = ""
        generate(_prompt.value!!)
    **}** }

在这个协程中,我们首先确保资产的初始化( initJob )已经完成,然后对潜在的先前模型运行( autocompleteJob ),做同样的事情,如果还在运行,我们就取消它。然后我们可以调用我们的生成方法:

private suspend fun generate(text: String, nbTokens: Int = 100) = **withContext(Dispatchers.Default)** **{** val tokens = tokenizer.encode(text)
    repeat (nbTokens) **{** // Run the model...
        // ... tokens.add(nextToken)
        val decodedToken = tokenizer.decode(listOf(nextToken))
        _completion.postValue(_completion.value + decodedToken)

        **yield()**
    **}
}**

用于此方法的调度员不是调度员。IO 因为我们在这里不做任何 I/O 操作,而是一个更通用的 调度程序。默认 使用共享后台线程的公共池*。*

这个方法另一个有趣的部分是yield()方法调用在结束时重复块。这就是允许该方法检查最终取消的原因。没有它,就不可能取消,我们必须等到整个一代结束后才能释放资源!☠️ 这里我们在每次令牌生成后检查取消。

检查取消的另一种方式是检查 isActive 属性的值

由于使用了 LiveData 结构(我们的完成属性),完成的文本然后“自动地”显示在应用程序中。🧙‍♀️

就是这样!在拥抱脸,我们相信我们只是处于人工智能在设备上运行的时代的开始。随着一方面专用硬件和相关驱动程序和框架的不断发展,另一方面量化和提取等技术的不断发展,我们智能手机的功能有望拥有光明的未来,允许以更高效和更高性能的方式运行更复杂的模型。

如果你想要更多的 Android 例子,你可以检查整个库。我们还发布了一个回购协议,其中包含 iOS 的模型和应用,利用了苹果特有的 CoreML 框架。如果您对更深入的最新 NLP 感兴趣,我们的 🤗变形金刚 库来了!

关于减少高峰时间

原文:https://towardsdatascience.com/on-eliminating-rush-hours-cdadd3fddcc3?source=collection_archive---------22-----------------------

改变三种社会制度如何能带来更轻松、更环保的生活

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

Rush Hour along Detroit’s Gratiot Avenue in the 1940s

在讨论全球变暖时,每个人都谈到系统性变化;很少有人提出实际操作的方法。在这里,我展示了我在过去几个月里从事的一些研究的结果,这是重新思考我们需要参与的那种社会系统的初步步骤,以减轻气候变化的冲击。

简而言之:交通夺走了我们所有神圣的东西。当我们的道路系统无法处理高峰需求和非高峰使用之间的差异时,就会发生这种情况。无论是工作日还是周末的高峰时段,交通拥堵的一个原因是我们的社会通常按照标准的时间表运行。有趣的是,在我们的电网中也有类似的问题。这两种类型的拥堵都是高峰需求问题的两个具体例子,高峰需求源于两件事:许多人一起生活在同一地区,以及缺乏明智的协调。

降低不同社会系统高峰需求的一个方法是重新划分我们集体安排时间表的时间和空间。

在重新划分时间方面,我们可以通过让人们自愿在周五到周六、周六到周日和周日到周一之间循环度过周末来减少周末的拥挤。通过明确抵消人们在 10 分钟或 15 分钟内“朝九晚五”的工作时间,我们可以减少每天的高峰时间。

就重新划分空间而言,当城市通过一系列半小时或 15 分钟宽的“微时区”开始一天的工作时,抵消可能会减少电网的峰值需求——我对 15 分钟电力负荷概况数据的初步分析支持了这一结论。虽然还需要进一步的研究,但对这些系统性时间表调整的讨论和实施有可能形成一个我们都可以参与的基层气候变化努力。最后,就实施而言,大学校园可能是检验这些想法的理想缩影。

更长的插图版本:

1。简介

交通是城市生活中最突出、最令人头疼的现实之一,在地球上的每个城市中心都很常见。我们都知道,道路拥堵不仅仅局限于每天的高峰时段——周末交通也困扰着城市居民。

例如,湾区居民经常在夏天开车去纳帕、索诺玛或约塞米蒂,在冬天去太浩湖度周末。他们不仅发现他们的目的地很拥挤,回来的路上交通也很糟糕。虽然从旧金山到太浩湖的旅程在不堵车的情况下大约需要 3.5 小时,但在堵车的情况下可能需要 12 个小时。

在我们的道路系统中,每日高峰时间和周末交通是“高峰需求拥挤”的实例;从抽象的层面来说,这是每个社会系统的问题。类似的事情也发生在我们的电网、供水和排污网络、公共交通系统、海滩和博物馆停车场等等。大多数人在相似的时间以相似的方式使用社会系统,这意味着所讨论的系统必须被设计为处理高峰和非高峰使用之间的巨大差异。

2。各种系统中的峰值需求示例

考虑一个停车场每天对停车位的需求。以下是 2018 年圣莫尼卡市中心停车场平均 24 小时利用率的图表,按周末和工作日分列:

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

Average relative 2018 Downtown Santa Monica hourly parking lot demand. The X-axis is “hours from midnight” and the Y-axis is “percent full.”

常识、经验和这个图表告诉我们两件事。首先,当圣莫尼卡停车系统有能力处理它的高峰时间版本时,它是工作的。其次,这座城市同时受到激励,在最拥挤的日子里拥有足够的容量来处理大部分人群,同时避免建设过多的额外容量。

以电力系统中的“高峰时间”为例,下面是 2019 年 4 月 29 日加州电网的需求图。再次注意最高点和最低点之间的差异:

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

Unlike fixed-supply parking structures, electrical supply can be adjusted to meet changes in demand, provided the infrastructure can handle the load. CA partially relies on solar (and wind) power during sunny (and windy) hours; it buys electricity from non-renewable sources in the evenings.

在英国,电网高峰需求拥堵的一种类型被称为“电视接收当许多人观看同一电视节目或体育赛事,并利用广告时间打开冰箱泡茶时,就会发生这种情况。

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

British TV Pickups during a 1990 Semifinal Soccer / Football match. Source.

高峰需求成为一个问题的原因是,最昂贵的电力是在需求高的时候从燃煤和燃气调峰电厂购买的

相当于高峰时间的拥堵影响的不仅仅是市政道路和电力系统。我们都熟悉下班后或周日下午杂货店里的长队,或者当几架国际航班都计划在五分钟内起飞时,海关的队伍变得非常非常长。截至 2012 年,美国人每年花费大约 370 亿小时排队等候。从某种意义上来说,拥挤是居住在人口稠密地区最不希望出现的情况之一。

有趣的是,需求高峰发生的一个原因是,我们都出生在一个围绕 a)一个时间表和 b)同一个时钟建立的系统中。我们认为这种安排是可行的,所以我们微笑着忍受它,尽管前一种假设并不是绝对必要的,更好的解决方案也是可能的。

3。重新定义问题

首先,我想说一下为什么我们会有现在这个系统。我们都在同一时间表的主要原因的一种说法是,这样我们每个人都可以像我们想见的人一样休息相同的时间。另一种说法是我们使用或工作的服务、机构和空间(银行、餐馆、舞厅、打字机修理店、糕点店等)。)都是根据彼此的时间表建立的。但考虑到这些事情是由人来管理或参与的,在某种程度上,第二个短语使用不同的词来表达与第一个短语相同的事情。

为了便于说明,请允许我将事情过于简单化。让我们假设我的社交网络仅由五个非常亲近的人组成——我的父母、一个浪漫的伴侣和一个最好的朋友。在下面的可视化中,我是人“0”

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

我希望所有人和我的五个联系人有相同的休息时间,所以我们都协调工作相同的时间。很好,到目前为止,没问题。当我们把这种礼貌扩展到我的五个人的五个关系中的每一个时,问题就出现了。

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

在这个简化的社会中,每个人都严格地与另外五个人联系在一起,我们可以很快让数百万人分布在数千平方英里的范围内,他们似乎都必须按照相同的时间表工作。如果一个人想改变他们的时间表,那么整个网络,锁在一起,将被迫立即改变。然而,庞大的网络规模确保没有人会自己改变,整个网络的同步性是高峰时间的主要原因。

正如我所提到的,减少拥堵和高峰时间包括寻找放松网络锁步的方法。

形象地说,如果有办法划分小组(用绿色和蓝色的线表示)并给他们分配不同的“时间表”,高峰时间可以减少。在下面的图表中,绿线左边的所有人都有弹性工作,做服务员,周一和周二休息。也许蓝线右边的人都从 7:30 工作到 3:30,帮助缓解高峰时间。

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

The more we can break up the synchronicity across the network, the more rush hours will be reduced.

4。通过调整周末减少每周交通流量

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

“Saint Monday, or the people’s holiday — №2. — A picnic at Hampton Court” (Source.)

200 年前,官方的西方周末只有一天:人们周日休息,以便去教堂做礼拜。非正式地,许多人(包括本杰明·富兰克林)第二天也翘班,并称这种做法为“守圣·星期一”

从企业主的角度来看,也许真正重要的是他们的员工平均每周工作五天,而不一定是五天。假设这是真的,那么就有可能改变周末的时间,从而减少交通以及工作日和周末的拥堵。然而,我们仍然想保留周末的一个主要功能,那就是和其他人有相同的休息时间。

考虑下面的循环时间表模式:6 天工作周和 2 天周末,接着是 4 天工作周和 2 天周末,然后是 5 天工作周和 2 天周末,接着又是 6 天工作周,等等。

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

Each group follows the 6–4–5 workday pattern offset by one “week,” just like singing a round.

为了便于讨论,让我们假设一个理论城市的一半人自愿开始六天工作周,另一半人自愿开始五天工作周。每三个周末,两组都有相同的两天假期,在另外两个周末,他们有一天的重叠。这种轮流重叠让每组中的每个人都有机会见到他们的朋友。

有了这个计划,两组人总是在周日休息,每三个周末休息两天。更重要的是,三分之二的周一和三分之二的周五,开车上班的人减少了 50%。理论上,每个人周末的一半时间,也就是三分之二的时间,可能是一半拥挤。

从零售商、餐馆、剧院、主题公园、购物中心和其他目的地的角度来看,周末有效地扩大了:在三天分开的周末,它们都变得不那么拥挤,但它们没有看到参观它们的总人数减少。从个人的角度来看,这些地方仍然受欢迎,但不是拥挤不堪。周末和工作日交通减少,通勤更容易,每个人都有更多的自由时间和安心。事实上,如果一部分人保留传统的周一至周五的工作周,这个计划实际上更有利。

也没有必要严格定义小组成员,一旦你自愿加入其中一个时间表,你就不能切换到另一个混乱的时间表,或者正常的 M-F 时间表。相反,人们可以在每个三周的期末四处走动:重要的是,我们把自己的时间表调得恰到好处。

没错,围绕人们的需求和义务(比如他们孩子学校的时间表)工作将会是障碍。然而,如果交替学校或年级是在这两个时间表之一,送孩子上学可能不那么令人担忧。

一旦对周末的假设有了正确的认识,下一个问题就是最佳的作息时间和休息日。使用点( )表示非工作日,除了 6 4 5 和 5 6 4 重复日程之外,第三组可以遵循 4 5 6 重复日程。这个更极端一点,但是保留了“周日休息”的成分,进一步减少了周末的拥堵。将这些放在当前的 5 5 时间表之上,所有 9-5 人的工作,现在有四个潜在的时间表。每一个额外的时间表都有助于缓解拥堵。[1]

5。通过多班制减少每日高峰时间

在上一节中,我探讨了如果我们放弃周末必须与周六和周日联系在一起的假设,我们会有什么样的可能性。然而,尽管“洗牌式周末”旨在缓解某些日子的普遍拥堵,但它们并没有专门解决每天的高峰时间。

同样的调整时间表的原则,但是在不同的规模上,可以帮助我们。以下工作或银行营业时间等的“轮班”。在文化上可以接受:8:45-4:45,9:00-5:00,9:15-5:15,9:30-5:30,等等,直到 10:30-6:30。

实际上,并不是每个全职工作的人都严格遵循“朝九晚五”的时间表。如果德国或其他国家认真实施 32 小时工作制,那么他们就有更多的自由来调整“班次”,进一步减少交通和拥堵。

6。交通需求管理的实证研究

调整周末和多班制的策略有助于缓解日常交通的紧张。(点击此处查看交通需求管理概述)。我回顾的实证研究发现,这两种想法都行得通。

具体来说,在 1970 年,纽约和新泽西的港务局成功地实施了高峰需求减少,以及交通拥堵的各种措施(地铁站中的人、等待电梯的人的高峰量等。)都减少了。[2]

这两种策略通常都包含在研究人员所谓的“压缩工作周”(CW)中,并且已经发现 CWs 可以改善通勤并减少燃料消耗。[3,4]注意 CWs 通常只是将每个人的周末延长到三天。

2002 年 4 月和 5 月,菲律宾政府为公务员实施了一个有限版本的“混合周末”计划。虽然个人报告减少了通勤时间,但不幸的是,没有收集到适当的数据,留下了“有希望,但需要进一步研究”的证据。[5]

最后,在 1988 年,檀香山市对这一想法进行了有限的“两班制”实验,发现通勤时间平均减少了-4.6%到 14.33 %。那些在预期工作时间自愿选择转移的人喜欢这个项目;令人惊讶的是,那些被迫参与的人并不喜欢。[6]

鉴于有希望的经验证据,我的结论是,没有人足够广泛地实施这些想法——通常,这是一个具有前瞻性思维的个人公司或工厂,而不是当地社会。此外,虽然研究人员研究了与交通相关的指标,但据我所知,没有人量化人们对实际城市生活的整体体验是如何改善的。(正如我上面提到的,大学校园或小镇可能是测试这些想法的理想场所,人们可以看看杂货店的排队情况,人们在邮局获得服务所需的时间,等等。)

许多人和个体公司利用非传统的时间安排来避免高峰时间的交通;它已在许多地方成功实施。从社会角度来说,这已经在暗中进行了。似乎我们会从明确这类事情中获益,这让我得出两个结论性的想法。

首先。据我所知,没有任何研究团队对这些想法进行过足够彻底的分析或模拟,而支持 GPS 的智能手机的广泛采用提供了一个诱人的途径,通过它可以量化这些提议的优势。

第二。最初的证据表明,这些时间表建议应该是人们如何看待世界的共同词汇的一部分。如果这样的时间表变得像我们现在对“周末”的概念一样平常,它将会有最大的好处,而不是一个混乱的时间表只是一个进步的雇主做的一件古怪的事情。

想想看,西方社会对一周中的几天和一年中的几个月都有名字;其他文化有小时的名称和年份的名称。缺少的是各种工作模式/周末和工作时间轮班的常用名称。

6。通过微时区降低电网峰值需求

到目前为止,我已经建议我们重新思考我们如何划分我们的社会时间概念,以此来打破导致交通系统拥堵的同步性。但是正如我在引言中提到的,除了交通系统,还有其他系统会受到高峰需求的负面影响,其中一个特别相关的就是电网。

如果实施的话,调整周末和工作时间可能会产生减少碳排放的次级效应,但减少我们对发电厂的需求将会产生更大的效应。正如我提到的,实现这一点的一个方法是重新审视我们如何划分物理空间的概念,在这个空间中,我们都保持相同的时间表,或者更简单地说,我们称之为时区。

为了唤起你的记忆,这里有另一个图表,说明了加州电网的需求,这次是从 2019 年 4 月 4 日开始的:

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

Click here for more CA data. The dip in the middle of the day is due to behind-the-meter solar panels circumventing buildings from drawing from the grid at large.

换句话说,这个图表表明,在一天结束的时候,几乎每个加利福尼亚人下班或放学回家,几乎同时开灯、做饭和看电视。尽管在整个加州,太阳不会在同一时间落下:位于加州北部东部边界的太浩湖位于洛杉矶的西面。

其中一个主要原因是因为(在美国),铁路公司既要负责采用标准化时钟,也要负责让城市转换到标准化时区。1883 年 11 月 18 日,“ 600 条铁路线放弃了他们一直使用的 53 个任意时间……定义了四个新时区的时间——东部时区、中部时区、山区时区和太平洋时区。大多数美国大城市都效仿铁路公司,采用时区作为自己的使用时间……"[7]35 年后,美国联邦政府正式承认了四个时区(做了一些修改),并签署成为法律。

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

A colorized 1913 map of the original US timezones. The jagged points along each timezone boundary reflect the fact that the Railroads kept the same time along a track until they reached a certain destination. Source.

采用时区的一个影响是,电力高峰需求是一个比其他情况下更大的问题,另一个影响是,住在时区的西部边缘会对你的健康产生负面影响。仅仅“铁路便利”是一个历史上有意义但越来越不相关的原因,让数百万人保持类似的工作时间。[8]因此,减少高峰需求的一个解决办法是让人们(以及工厂等)参与进来。)来改变他们的时间表,就好像他们在一个微时区(我简称为“μ时区”)。

美国西南海岸有调峰发电厂的一个原因是旧金山、萨克拉门托、拉斯维加斯和洛杉矶都保持相同的营业时间,尽管这些地区之间存在很大的东西差异。美国东海岸也是如此,亚特兰大和波士顿保持着相同的社会建构的营业时间。

为印度国家提出了类似的解决方案,其目前根据一个官方时区。电气工程教授 Amlan Chakrabarti 博士开发的模型表明,如果在印度次大陆引入三个一小时宽的时区,整个印度电网的**效率将提高 5%。【9,10】

但是,如果问题是减少高峰需求,而不是铁路计时,为什么要停在一个小时宽的时区呢?如果你将每个小时的时区划分为 4 个,或者让人们将他们的时间表移动 15-45 分钟,效果将是进一步消除“高峰时段当量”(即高峰需求)对电网的影响。重要的是,时钟不需要移动;从电网的角度来看,商店和服务机构开门营业时的转移就好像时钟发生了转移一样。

在加州实现此解决方案的一种方法是使用以下边界作为绘制 15 分钟μ时区偏移量的指南:

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

The red star represents the approximate location of Las Vegas. Note that actually changing the time on local clocks is not necessary; all that is needed is for people to behave as if their clocks were offset by 15–45 min. Original visualization by Mike Bockstock.

此外,您可能希望将这些μ时区与北部的州和南部的墨西哥联系起来,当您这样做时,您还可以了解整个美国:

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

Clearly, these lines would be adjusted around population centers and county lines. Send policy wonks, stat.

我已经对微时区对高峰需求的影响做了一些初步建模,基于中西部公共事业单位的 475 名客户的数据,以 15 分钟为增量。[11]我分析了全年数据中需求最高的一天,并模拟了将相同的人口分配到四个不同的μ时区,1000 个不同的时间。以下是随后的负载曲线:

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

Real and simulated electricity loads for the peak day, at the end of July, in the tiny 475 customer dataset. The black line is the actual load, the green lines represent 1000 simulations of assigning the population to 4 different 15-minute offset timezones. The blue line is the average of all of the green lines.

在全年模拟将客户分配到不同时区 3000 次后,数据支持两个结论:第一,高峰需求确实减少了,第二,四个 15 分钟μ时区比两个 30 分钟μ时区更好。在 4μ时区的场景中,我发现峰值 15 分钟间隔的平均净减少量约为 1390 千瓦时,每个客户平均减少 2.9 千瓦时。

目前,还不能说这种推广达到了什么程度——如果每个客户的平均减少量保持不变,那么当扩展到数百万客户时,节省的成本将是巨大的。然而,数据很难获得,并且假设行为是峰值需求的主要驱动力,而不是温度之类的东西。与此同时,平滑到达需求高峰顶部的“斜坡”可能有更多的好处,我的理解是,更平滑的斜坡意味着高压输电线路更少的拥塞和电力基础设施更少的磨损。

这些结果、上图以及 Chakrabarti 教授的工作都表明,问题不在于μ时区是否会降低峰值需求,而是会降低多少。这个想法的下一步可能涉及研究人员或学术实验室获取更多的数据并扩大分析。鉴于这样的系统可能会减少电厂的建设,电力对消费者来说可能会更便宜,最终电力公司会更有利可图。

6。结论

高峰需求问题影响着地球上每一个具有一定规模的城市。即使我们殖民火星(比方说,为了应对气候变化),只要我们保持同样的调度传统,交通、拥堵和高峰需求问题仍然会存在。相反,一旦我们真正在一个地方解决了这些问题,我们将知道如何在任何地方解决它们。

在我看来,有三个步骤可以实现让当地文化改变和调整他们的时间表的更大目标。

首先,研究人员、经济学家、交通工程师和政策专家需要更彻底地探索上面提出的时间表变化的类型。应该回答的问题包括:这些解决方案将在主要城市减少多少不同的高峰时间?这些计划可能会带来哪些具体的环境效益?穿过城镇通勤会容易多少?电价会有怎样的变化?有没有可以预见的意想不到的后果?如果我在这里概述的所有建议都得以实施,对于每个邮编的人们来说,这意味着什么样的日程安排变化?我将利用我所拥有的资源来寻找这些问题的答案;在未来的几天和几周内,我将寻求学术伙伴关系,以进一步这些研究。

第二,我们所有人都可以做的一件切实可行的事情就是开始互相介绍这些想法,从而融入我们的文化。我们都需要讨论这些提议,看看我们是否能适应它们,并努力说服我们的老板、校长、董事会、市政官员等等,让他们通过。

值得讨论的问题包括:如果你镇上的每个人都同意改变工作日应该开始的时间,你认为自己会跟着改变吗?怎样才能让你在一个混乱的周末工作?有多少和你有关系的人也需要改变他们的想法?

改变时间表有可能减少交通流量和降低电价;代价是协调会议和社交聚会可能需要更多的计划。虽然让大量的人改变他们的行为是很重要的,但这些减少峰值需求的提议有可能形成一场我们所有人都可以参与的草根气候变化运动。

与此同时,永远不要坐在车流中,看着你的电费账单,或者让全球变暖进入你的脑海,避免思考事情如何才能再次变得更好。

____________

尾注/引文:

[1]敏锐的读者还会认识到,基于相同的 4,6,5 结构,还有另一种可能的时间表:4,6,5。为了确保每个计划总是在周日休息,这将需要抵消一天,并在周二开始。

读者可能还会注意到增加时间表的数量如何有助于更好地消除拥挤(通过将人群分布到不同的日子)和从仅仅音准到均等音律调音系统的转变(其中“误差”均等地分布到所有键)之间的联系。)

[2]欧玛利,布伦丹·w . .改变工作计划以减少高峰运输需求特别报告-国家研究委员会运输研究委员会 153 (1974): 166。

[3]洪,鲁迪。"利用压缩工作周来减少通勤"运输研究 A 部分:政策与实践 30.1(1996):11–19。

[4]马尔科·佩尔科科。《工作时间对公共车队燃料消耗和二氧化碳排放的影响:来自政策实验的证据》交通政策71(2018):126–129。

[5] Sundo,Marloe B .,和 Satoshi Fujii。压缩的工作周对通勤者日常活动模式的影响。"运输研究 A 部分:政策与实践39.10(2005):835–848。

[6] 交通管理错时上下班案例 (第 1280 卷)。朱利亚诺(1990 年)。加州大学欧文分校交通研究所。

铁路的发明时间,伊恩·r·巴克提,《铁路史》,第 138 卷,第 13 页。

[8]随着铁路逐渐把美国连接起来,他们发现适应每个城市的当地时间成了一件麻烦事。除了使他们自己和旅行者更容易,他们采用“标准铁路时间”的另一个原因是由于一小群人的努力。这个小组包括查尔斯·多德,克利夫兰“气象局之父”阿贝,他想让人们在美国不同地区的同一时间进行天气和天文观测;桑福德·弗莱明是一位加拿大铁路工程师,他看到了标准时间的好处;威廉·f·艾伦是通用时间会议的秘书,他敦促铁路公司“在我们之间解决这个问题,而不是把它托付给……州立法机关的无限智慧。标准时间的采用,Ian R. Barkty,技术与文化,第 30 卷,第 1 期,第 25–56 页。

[9]a . Chakrabarti 和 C. K. Chanda,第五届能源研究进展国际会议,摘要集。

[10]通过时区划分减少高峰需求,Amlan Chakrabarti,《工程师学会杂志》(印度):B 辑,第 95 卷,第 3 期,第 219-230 页。

[11]支持 Solar 公司向我提供这些数据。

最后,非常感谢 Karoun Kasraie、莎伦·刘、Sachu Constantine、Jamie Levhic、Malini Kannan 和 Amlan Chakrabarti 博士对这些想法的反馈。

伦理与人工智能:经济学视角

原文:https://towardsdatascience.com/on-ethics-and-artificial-intelligence-an-economical-perspective-96984e82f4f2?source=collection_archive---------18-----------------------

人工智能(AI)的成果是什么?这是人工智能从业者、专业记者和勇敢的政治家之间反复出现的话题。虽然一些简单的概念被清楚地传达给了普通观众,但还有一些概念并不广为人知。在这篇文章中,我将关注一个经常被忽视的重要话题:人工智能背后的经济学。

由于人工智能正在通过市场上的产品影响我们的生活,这篇文章的目标是分析当通过自由市场消费时,人工智能系统会发生什么。换句话说,人工智能是以市场驱动的方式开发和消费的,我想更好地了解这种方式的后果是什么。因此,我将把重点放在人工智能的经济方面,以表明为了鼓励主要的人工智能参与者行为合乎道德,我们更好地(直接)在市场上行动。

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

不要怕 AI,要怕邪恶的资本家

就像烟草行业避免广告说烟草会产生癌症,或者石油行业否定气候变化一样——人工智能行业对关于伦理和人工智能的公开讨论不感兴趣。

为什么?因为 AI 只是增加他们收入的一种手段。就这项技术增加了他们的收入而言:生活是美好的——因为公司的主要使命是“赚钱”。考虑到这一点,第三方为什么要入党呢?或者说,为什么这些第三方要质疑这些公司在做什么(现在钱开始流了)?

只是用 AI 来增加收益?

仅仅用 AI 来增加一个公司的收入是不是不负责任?不管有什么后果?首席执行官们在使用人工智能时,还必须考虑他们的决策的道德和社会影响。然而有趣的是,大多数首席执行官都没有接受过理解这项技术局限性的教育。拥有人工智能和伦理专家的顾问委员会可能是一个解决方案。

但是,公司的决策通常是为了增加收入。不一定是为了建设一个更好的社会。

AI 道德证书,以产生积极的社会影响

为人工智能系统建立“社会信任”是这些系统正确发展的关键。因此,鼓励开发遵循伦理原则的值得信赖的人工智能系统似乎是一个好主意。

**前提二)**如前所述,AI 通过市场影响社会。因此,为了促进可信的人工智能代理在我们的社会中的结合,我们需要直接在市场上行动。

朝着这个方向的一个好主意是推广道德和人工智能证书。这些证书的目标是为那些遵循道德原则开发的产品增加价值。那么,请注意,在当前的经济范式下,可信度不是一个技术问题——它只是(潜在)商业模式的一部分。拥有道德视角可以在市场中起到积极的差异化作用。

这个想法的一个很好的类比是我们现在吃鸡蛋的方式。当我们去超市时,我们可以合乎道德地购买无笼或自由放养的鸡蛋。其他例子可以是强制性的食品质量证书,或医疗器械或玩具的欧盟认证。

(人工智能中的)伦理不是一个技术问题,而是一种商业模式。

你住在世界的哪个地方?

前面的分析假设了一种相当新自由主义的经济观点。如果你的国家没有明确遵循同样的经济逻辑会发生什么?让我们来看一些数字。

在美国,私营公司在人工智能的开发和部署中发挥着核心作用。2017 年,亚马逊和 Alphabet 的研发投资加起来高达 300 亿美元——这大大超过了美国的政府投资(2019 年为 53 亿美元)。在中国,自 2014 年以来,政府推出了一系列与人工智能相关的重要国家经济举措,目标是到 2018 年创造 130 亿欧元(约 147 亿美元)的人工智能市场,旨在帮助中国在 2030 年前引领人工智能。在韩国,政府宣布将在 2020 年前投入 1 万亿韩元(8 . 4 亿美元)来推动人工智能产业。加拿大在 2017 年预算中宣布了其人工智能战略,在五年内拨款 1.25 亿加元(约合 9430 万美元)。印度和日本开始了政治讨论,但是还没有决定政府会为人工智能投资分配多少资金。

人工智能的私人投资还是公共投资?

通过自由市场(美国目前的模式)无限制地发展人工智能,实际上是询问大公司定义的风险,即人工智能的适用性和性质。

或者,如果对人工智能的足够公共投资能够实现强大的中央人工智能系统(就像在中国一样),则存在政府利用人工智能不是为了最大化经济利润,而是为了最大化他们的连任或进行社会控制的可能性。

在这两种情况下,启用对经济/权力的民主控制机制似乎都不是一个坏主意。如果我们遵循这个原则来指导我们的行动会怎么样?人民的隐私,权贵的透明。

人民的隐私,权贵的透明。

欧盟的作用是什么?

欧盟目前的意图基于三大支柱:提高工业生产能力、准备社会经济变革以及定义欧洲伦理和法律框架。

他们的目标不仅是影响欧洲市场,还包括通过建立一个强大的道德和法律框架来影响全球人工智能市场——类似于 GDPR 发生的事情。制定衡量进展的指标很重要。不仅仅是经济进步,还要衡量 AI 的社会影响。以便对提议的道德和法律框架进行监控、评估和重新审视(如有必要)。

艾的社会定义受营销影响

公司的营销努力也有助于人工智能的社会定义。这种提高其股价的合法努力正在推动一场炒作,其后果仍有待揭晓。虽然这项技术甚至还没有出现,我们的社会也没有准备好批判性地讨论它的采用,但企业正在向前发展,并向世界出售他们对人工智能的愿景。

因此,请注意,乐观的说法来自市场营销——目的是增加这些公司的销售额/收入。

“好人工智能”:市场驱动的定义

人们对什么是“好”的判断受“市场决定什么就是好”的影响很大。

然而,重要的是要注意到,我们当前的人工智能/技术市场充满了权力不对称。因此,事实上,科技巨头有能力利用他们的市场主导地位来定义“好的人工智能”的含义。

打破权力不对称

例子 1: 你爷爷能开发(甚至想象)一个人工智能系统吗?不,因为他甚至不知道这项技术的组成部分是什么。

例 2: 你能开发一个成功的 AI 系统吗?是的,如果你为一家大公司工作,有足够的能力投资获得足够的带注释的数据和硬件。或者是的,如果你在一个学术机构工作,并且你比这些为大公司工作的研究人员更聪明(并且能够开发一种需要很少数据和很少计算资源的新的人工智能技术)。

正如所见,只有少数人能够设想和开发人工智能系统。这种在有效能力方面的不对称决定了每个行动者的力量有多大。因此,大多数公民不能批判地和独立地监督人工智能中发生的事情。如果我们在人工智能系统中寻求更高的民主控制,我们需要首先打破这些权力不对称。

一些公司使用“民主化人工智能”这个术语,但他们的想法只是让每个人都在云中使用他们基于人工智能的服务(作为黑匣子)。在我看来,这远远谈不上让 AI 民主化。

免责声明 1: 这些不是我的原创想法,只是我在协助塞维利亚的胡曼特冬季学校(2019 年 2 月)时发现的有趣想法的汇编。对我的思想影响很大的名字有:努里娅·奥利弗、弗吉尼亚·迪格纳姆、乔纳森·佩恩、克里斯托弗·马尔科、贝尔坦·马滕斯、松古尔·托兰、姜峯楠、赫克托·格夫纳。

免责声明二: 我不是经济学家,我只是一个深度学习的实践者,一个有上进心的公民。

鸣谢: 感谢 Aurelio Ruiz 和 Lorenzo Porcaro 提供的宝贵反馈。

关于我如何认识基于人的偏见以及如何处理它

原文:https://towardsdatascience.com/on-how-i-acknowledge-human-based-bias-and-how-to-handle-it-933479a623fa?source=collection_archive---------21-----------------------

关于我们,数据从业者,应该如何更加意识到和关注我们自己的偏见

在数据科学的世界中,我们将偏差定义为系统从其数据中过度概括并学习错误内容的现象。当这种情况发生时,我们通常采取的第一个行动是指责数据或训练过程,然后说*“这个数据不好”“我应该进一步调整我的超参数。”当然,这可能是问题的一部分。然而,在花费更多的时间和处理能力之前,我想请你停下来,后退一步,想想我们正在使用的数据是如何来的,更重要的是,让我们思考一下我们是如何解释它的。*

与机器和聪明的学习者不同,我们人类会受到偏见的困扰,这种偏见可能是由多种原因引起的,比如我们以前经历过的时刻,或者已经成为我们一部分的概念和定义。不幸的是,这种偏见可能会影响我们处理和解释数据的方式,当我们不经意地将这些想法和假设转移到我们的数据集,从而转移到我们的机器学习模型及其结果时,就会产生问题。这些后果的例子经常在媒体上被提及(通常带有令人不快的散布恐慌的标题),例如亚马逊著名的“性别歧视”招聘模式,该模式优先考虑男性候选人而非女性候选人。

在这篇文章中,我讨论了偏倚的三个来源,确认偏倚、可用性启发式和样本偏倚,并写了我是如何认识到它们的存在和影响的,以及我用来处理它们的几种技术。

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

自 2016 年以来,我一直在一个约会和社交平台的反垃圾邮件团队工作,我的目标是建立检测垃圾邮件发送者的解决方案,并避免它们的扩散。在我开始在公司的职业生涯时,我对我们的用户一无所知(如我所料);我并不完全了解我们的人口统计数据,也不了解他们的行为模式。我想说的是,从简单的一瞥中,我无法判断一个用户是否是垃圾邮件发送者;任何人都可能成为其中一员!然后,随着每一天的过去,你开始体验和学习事物。*啊,这个地理区域好像更垃圾啊,啊,这个邮箱域是可怕的新闻啊,这样的名字从来都不好,*等等。简而言之,我纯粹基于我所学到的、看到的和处理过的,创建了一个垃圾邮件发送者的心理轮廓。现在我不得不问自己:这种知识是公平的吗?这个侧写能代表全部人口吗?我心目中的“理想”垃圾邮件发送者形象是公正的吗?这些是我每次处理数据时都会问自己的一些问题,最重要的是,每次我训练一个新的机器学习模型时都会问自己。我为什么要问这些问题?嗯,首先,我认为在这一行你应该经常质疑自己。第二,因为这就是我承认基于人类的偏见的方式,以及如果我忽视它可能产生的影响。

在所有现存的偏见中,有三个主要的——T4 确认偏见、可用性偏见选择偏见——我认为如果我不考虑它们,可能会在我的模型中造成不必要的影响;这并不意味着我不介意其他偏见,只是这些偏见让我保持警觉。在接下来的几行中,我将定义这些偏见,并给出一些它们如何影响我的例子。

确认偏差是认知偏差的一种,指的是以支持和确认一个人的观点和假设的方式解释信息、证据和数据的倾向,同时忽略任何可能的冲突证据。确认偏见是最常见的偏见之一,不难想象为什么会出现这种情况,毕竟,根据我们支持的东西来支持和确认想法,在某种程度上,就像是合乎逻辑的事情。前面,我提到了一些可能的理论和特征,这些理论和特征是我与垃圾邮件发送者一起工作了这么长时间后了解到的,例如,如果某个用户位于某个特定区域,那么他就是垃圾邮件发送者的可能性。这个事实似是而非。有些地区的垃圾邮件发送者比其他地区更集中,因为这种模式在某种程度上很常见,我可能会“无意识地”了解并确认如果用户 X 来自地区 Y,他可能是垃圾邮件发送者。但是,这是否足以证明这个用户是真正的垃圾邮件发送者呢?当然不是!尽管如此,在特定和不利的情况下,例如,如果我必须在压力大的一天标记用户配置文件,我可能会意外地将该用户标记为可疑用户,从而证实我的偏见,因为我的假设表明该用户可能确实是垃圾邮件发送者。尽管如此,我很少手动这样做,所以这种情况发生的几率几乎为零。

可用性启发,另一种认知偏差,描述了每当遇到决策情况时,人们倾向于重视最近和最直接的经验、信息或想到的例子。这种思维捷径背后的主要思想是,如果一个人记得一条信息,那就意味着这条信息是必不可少的。在处理数据和决策系统时,忽视这一假设的存在会导致灾难性的结果。原因如下。

通常,在我的工作时间,同事们会过来问我某个档案是不是垃圾邮件。通常,我会马上回答,因为我很熟悉垃圾邮件发送者的样子(我听起来有偏见吗?).话虽如此,我必须承认,在有些情况下,我不愿意不假思索地快速回答是或否。这是为什么?因为我确定我见过这样的案例。例如,我每天都会看到许多个人资料和他们的用户名,我已经熟悉了许多模式和关键字,这些模式和关键字表明所述用户名是否与垃圾邮件个人资料相关。所以,如果你随机问我,什么是典型的垃圾用户名,我可能会有答案。

另一个例子是标注数据时。尽管这个过程是自动的,但我还是时不时地深入数据集,寻找异常值或需要人眼观察的奇怪案例。在这些行和特征的海洋中探险的过程中,我可能会看到一个特殊的例子,在这个例子中,我的大脑通过可用性启发法,根据最近的经验,可能会确定某个配置文件是垃圾的还是好的。在这种情况下,最简单的解决办法就是听听我大脑中的声音,然后改变标签(老实说,如果我有 100%的把握,我会这么做),然而,因为我意识到了这种偏见,我会首先咨询我们的其他来源来确认或否认我的信念。

最后,还有样本偏差,一种统计偏差。当为训练您的系统而选择的数据不代表将使用该模型的总体时,会观察到这种偏差。结果很可能是一个有偏差的样本,一个过度代表一个群体而不足代表其他群体的数据集。消除这种偏见并不是一件容易的事情,在实践中很可能会发生,因为正如维基百科所说的那样,在采样中“几乎不可能确保完全的随机性,”然而,意识到它的存在可能有助于减轻它的影响。这种偏见可能会以无数种方式出现在我的日常生活中,在下一段中,我将举例说明我发现的一些方式。

首先,我总是在考虑时区。这是因为每当我做一些与时间相关的事情时,例如,从过去的 Y 个小时中选择 X 个数据,我的样本将主要由在这 Y 个小时中处于高峰期的地理区域的观测数据组成。例如,我在欧洲,所以如果我在上午 9 点查询选择前一个小时的 X 件事,我的样本很可能是欧洲用户和失眠的人。因此,在某种程度上,我给我的采样数据增加了偏差。我发现的另一个例子是平台和应用程序版本之间的差异。在查询数据时,我们必须记住,用户正在使用不同的平台或应用程序的发布版本,这意味着他们可能会生成不同类型的数据。例如,假设有一天一个产品团队决定在应用程序的下一个版本中,用户将被允许上传一百万张图片到他们的个人资料中。然后,在同一天,一个随机的非常不幸的机会,我决定建立一个模型,根据图片的数量来检测垃圾邮件发送者,而不知道应用程序中的这种变化。然后,由于“百万图像”功能是新的,并不是每个人都会有更新,我不会很好地代表这个在他们的个人资料上有百万图像的新群体,这将在训练和推理时间产生一些不想要的结果。

解决方案?

有没有办法完全避免基于人类的偏见?我不知道,但我确信,作为从业者,我们可以采取一些措施来减轻它们对我们数据集的影响,从而减轻我们决策模型的影响。

我的第一个建议是数据驱动。我指的不是数据驱动的含义*“哦,是的,我在做决定之前阅读我的数据”*并进行一些查询。我的意思是合二为一钻研,见鬼,那些数据集。画出它们的分布,去除离群值,对它们进行聚类,测试它们,降低它们的维数等等。确保你真正了解他们。

与前一个技巧密切相关的另一个技巧是识别偏差的可能来源。在一张纸上、维基页面、便利贴或手背上写下可能给你的系统带来偏见的内容。是时间,还是应用程序版本的差异,就像我提到的那样?像我一样质疑自己。问问自己,你的样本数据是否能代表总体,或者你将要做出的决定是基于真实的信息,还是基于你对昨天数据点的直觉。

最后,与他人分享你的过程。与你旁边的人交谈,询问他们对你的代码或查询有什么看法,或者创建一个拉请求,以便其他人可以仔细检查你的工作。有时候,因为我们离材料如此之近,如此执着于材料,我们看不到别人能发现的错误和细节。

结论

我们人类是有偏见的。如果这种基于人类的偏见没有得到正确处理,它可能会影响我们工作和解释数据的方式,最终会影响结果——在大多数情况下,这是一种不可取的结果——以及我们的机器学习模型的性能。在本文中,我介绍了三种偏差:确认偏差、可用性启发和样本偏差,并谈到了它们在我日常工作中的许多表现方式,并提供了一些如何减轻其影响的建议。

忽视这些偏见的存在可能会在我们的系统中导致不必要的和灾难性的行为,在大多数情况下,这些反应会让我们产生*“嘿?为什么我的模型认为这是一只猴子?”*——诸如此类的问题,导致耸人听闻和散布恐慌的文章,声称艾是种族主义者、性别歧视者、精英主义者或者仅仅是明显的不公正。我真诚地相信,每个与数据打交道的人都应该意识到这可能对他们的工作产生的影响。随着机器学习在我们生活的各个方面的快速采用,我们的产品可能会变成一个有偏见的系统,不幸的是,它可能会导致致命的事故,诊断出不正确的治疗方法或阻止你的整个用户群。

头脑上传

原文:https://towardsdatascience.com/on-mind-uploads-3e362c107fe4?source=collection_archive---------34-----------------------

尽你所能

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

Image by Gerd Altmann from Pixabay

什么是心灵上传?这是一个(未来的)设备测量你的精神状态并上传到电脑,然后电脑运行你的精神状态和你的大脑在这种精神状态下的功能的模拟。换句话说,“你”被上传到一台机器上。一个更专业的术语是全脑仿真 (WBE),除了非常有趣的技术含义,它也提出了一些哲学问题。

人工通用智能

使用 WBE 的一个有趣的结果是创造了人工通用智能 (AGI)。AGI 是一种人工智能,其智能大致相当于人类的智能领域。由于 WBE 的大脑显然和人类一样聪明,而且它是人造的,不依靠生物机械运行,因此 WBE 的大脑确实是 AGI。由于计算机的运算速度比人脑快几个数量级,WBE 人的思维可能比人快得多;从这个意义上说,谈论一种人工超级智能可能更有意义。

你上传的真的是你吗?

人们经常纠结于这样一个问题:模拟的 WBE 版的你是“真正的”你,还是仅仅是一个“复制品”。问题是,WBE 有两种可能性。

选项 1:破坏性的 WBE

破坏性 WBE 上传你的精神状态,并在此过程中摧毁你原有的精神基质。换句话说,它杀死了你的身体,但也把你的思想上传到了电脑里。“你”会活在电脑里吗?或者你的大脑真的死了,有没有一个仅仅是你的副本生活在计算机里——可以说是另一个和你有完全相同特征的大脑?

这个问题实际上可以用我们现有的知识来回答。你看,我们的精神状态(包括认知、记忆、意识等。)是(大量)计算的结果,并且计算是独立于衬底的(意味着它们可以在不同种类的衬底上执行)。计算 1 + 1 = 2 可以在旧的机械计算器或现代计算机处理器上进行;计算是一样的。由于心理状态是从计算中产生的,所以心理状态也是独立于基底的。换句话说,你无法区分是在肉体(你的大脑)上运行还是在电脑上运行——这就是为什么,是的,你(意思是“最初的”你)在你的思想上传后还活着。

选项 2:非破坏性 WBE

这和破坏性的 WBE 是一样的,除了你的大脑保持完整。这意味着心灵上传后,有两个“复制”的你。就像破坏性的 WBE 选项一样,你活在电脑里。但是你还活在你的身体里!假设你的 WBE 版本有沟通的方式,现在有两个头脑有你的记忆、个性、特征和一切都是声称是你,而且两者都是对的;没有一个版本比另一个版本更“真实”。如果你认为有,我很有兴趣听听你的理由。

解释了带有 XGBoost 的内部机器学习

原文:https://towardsdatascience.com/on-premise-machine-learning-with-xgboost-explained-5adfdfcfec77?source=collection_archive---------10-----------------------

使用 Docker 容器在您自己的环境中运行机器学习模型的分步指南

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

Source: Pixabay

可以在云上运行机器学习(ML)模型(亚马逊 SageMaker,谷歌云机器学习等。).我相信了解如何在你自己的环境中运行机器学习也很重要。没有这些知识,ML 技能集就不完整。这有多种原因。并非所有人都在使用云,您必须提供本地解决方案。如果不亲自动手配置环境,您将会错过学习更多 ML 知识的大好机会。

内部 ML 模型培训不仅与环境安装和设置相关。当你在云中训练 ML 模型时,你会使用供应商 API (Amazon SageMaker,Google 等)。),这个 API 通常有助于更快地解决问题,但是它对您隐藏了一些有趣的东西——这将有助于更好地理解 ML 过程。在这篇文章中,我将一步一步地介绍 ML 模型,它可以不使用云 API 进行训练,而是直接使用来自开源库的 API。

让我们开始吧。首先,您需要启动内部 ML——Docker 映像(虽然您可以在没有 Docker 的情况下配置 ML 环境,但为了更好的维护和更简单的设置,我建议您使用 Docker)。

同去官方 Jupyter 笔记本数据科学堆栈 图片。用 docker run 命令创建一个容器(检查图像文件中所有可用的参数)。我建议注意你用 -v 参数映射工作目录的地方。该参数的第一部分指向 OS 上的文件夹,第二部分在 : 之后指向 Docker 容器中的文件夹(通常是/home/jovyan/work)。

XGBoost 安装在 Jupyter 笔记本容器中。

您必须使用此命令进入 Docker 容器提示符*Docker exec-it container name bash,*才能运行以下命令:

康达安装-y gcc

pip 安装 xgboost

安装了 XGBoost 之后,我们可以继续学习 ML 模型——任何 ML 实现的核心部分。我使用 Jupyter 笔记本来建立和训练 ML 模型,这就是为什么我选择 Jupyter 的 Docker 图像。Jupyter notebook 提供了一种结构化的方法来实现 Python 代码,开发人员可以单独重新运行每个 notebook 部分,这提供了很大的灵活性,特别是在编码和调试 Python 代码时——不需要一直重新运行整个 Python 代码。首先,我们从进口开始。我建议在笔记本的开头保留所有导入(是的,您可以在笔记本的任何部分进行导入)。这种方式提高了代码的可读性——始终清楚正在使用什么导入:

第一步,用熊猫库读取训练数据。从我的 GitHub repo 下载本例中使用的培训数据(invoice _ data _ Prog _ processed . CSV)。在我之前的帖子中阅读更多关于数据结构的内容— 机器学习—日期特征转换解释。数据包含有关发票支付的信息,它指示发票是否按时支付以及是否延迟支付—延迟了多长时间。如果发票按时支付或延迟很小,则决策列被赋值为 0。

将数据从文件加载到 Pandas 数据框后,我们应该检查数据结构——决策列值是如何分布的:

XGBoost 处理数值(连续)数据。分类特征必须转换成数字表示。Pandas 库提供了 get_dummies 函数,帮助将分类数据编码成一个(0,1)数组。这里我们翻译分类特征 customer_id:

编码后—数据结构包含 44 列。

在运行模型训练之前,了解特征如何与决策特征相关联是很有用的。在我们的例子中,正如所料,最相关/最有影响力的特性是日期和总数。这是一个好的迹象,意味着 ML 模型应该被适当地训练:

接下来,我们需要识别 X/Y 对。y 是决策要素,它是数据集中的第一列。所有其他列用于标识决策功能。这意味着我们需要将数据分成 X/Y,如下所示:

这里,我们将数据分成训练/测试数据集。使用 train_test_split 函数 sklearn 库。数据集很小,因此使用其中较大的一部分进行训练— 90%。数据集使用分层选项构建,以确保决策特征在训练和测试数据集中得到很好的体现。函数 train_test_split 方便地将 X/Y 数据返回到单独的变量中:

这是关键时刻。用 XGBoost 运行 ML 模型训练步骤。 %%time 打印训练花费的时间。XGBoost 支持分类和回归,这里我们使用分类和 XGBClassifier。参数取决于数据集,对于不同的数据集,您需要调整它们。根据我的发现,其中包含的参数是需要注意的(阅读 XGBoost 文档中关于每个参数的更多信息)。

我们不是简单地运行模型训练,而是使用训练自我评估和早期停止的 XGBoost 特性来避免过度拟合。除了训练数据,还将测试数据传递给 ML 模型构建函数— model.fit 。该功能分配有 10 轮提前停止。如果 10 轮没有改善,训练就会停止,选择最优的模型。使用对数损失度量评估培训质量。使用 verbose=True 标志运行训练,以打印每个训练迭代的详细输出:

基于模型训练的输出,您可以看到最佳迭代是 Nr。71.

为了评估训练精度,我们执行模型,预测函数,并通过 X 测试数据帧。该函数为 X 集合的每一行返回一个预测数组。然后,我们将预测数组中的每一行与实际决策特征值进行匹配。精确度是这样计算的:

我们用测试数据执行了 model.predict。但是如何用新数据执行 model.predict 呢?下面是一个例子,它为 model.predict 提供了从静态数据构建的 Pandas 数据框架。付款延迟一天(发票开具后 4 天付款,而预期付款为 3 天),但由于金额少于 80 英镑,此类付款延迟被认为没有风险。XGBoost model.predict 返回决策,但通常调用 model.predict_proba 可能更有用,它返回决策的概率:

一旦模型定型,保存它是一个好的做法。在我的下一篇文章中,我将解释如何从外部通过 Flask REST 接口访问训练好的模型,并使用 Node.js 和 JavaScript 向 Web app 公开 ML 功能。可以使用 pickle 库保存模型:

最后,我们根据 logloss 和分类错误的输出绘制训练结果。这有助于理解被选为最佳的训练迭代实际上是否是一个好的选择。基于该图,我们可以看到迭代 71 在训练和测试误差方面是最优的。这意味着 XGBoost 决定查看这个迭代是好的:

一个 XGBoost 提前停止和结果绘制的解决方案受到了这篇博客文章的启发— 使用 Python 中的 XGBoost 提前停止来避免过拟合

这篇文章完整的 Jupyter 笔记本可以从我的 GitHub repo 下载。训练数据可以从这里下载。

生物医学文献中的撤稿现象

原文:https://towardsdatascience.com/on-retractions-in-biomedical-literature-1565e773559e?source=collection_archive---------7-----------------------

学术界的激烈竞争和急于发表,很多时候导致科学出版物中有缺陷的结果和结论。虽然其中一些是诚实的错误,但另一些是故意的科学不端行为。根据一项研究,76%的撤稿是由于从特定期刊撤稿的论文中的科学不端行为。2012 年的另一项研究发现,约 67%的撤回可以归因于不当行为。这种弊端贬低了进行科学的根本目的——追求真理。此外,这样的研究是浪费纳税人的钱。对于作者来说,论文撤稿虽然是正当的,但可能会带来削弱性的后果,如资助资金枯竭、合作者消失、缺少初级同事和学生来协助运行实验室。受到生物医学文献中几篇撤回新闻的激励,我决定进行更深入的调查。

我所有的分析都基于来自 PubMed 的数据,这是一个免费的生命科学和生物医学出版物搜索引擎。我在 2019 年 2 月使用 Eutilities 收集了这些数据,Eutilities 是一种用于访问国家生物技术信息中心(NCBI)数据库(包括 PubMed)的 API(应用程序编程接口)。在这篇文章中,我将讨论所有的参与者——作者、期刊和国家,它们都参与了科学管理、科学评论和出版,以及资助和支持科学。PubMed 的数据可能是不完整的,因为网站上可能不会记录所有关于被撤回出版物的信息,但我假设这些结果在统计上仍然有效,并将推广到真实情况。

生物医学文献中撤回论文数量的增加

根据 PubMed 的数据,截至 2019 年 2 月 5 日,共有 6,485 篇出版物被撤回。在和一位生物学家朋友讨论这个数字时,她的第一反应是“哇!那是小的!我原以为数字会更大”。有这种想法的不止她一个人。根据《自然》杂志的一项调查,近 70%的被调查生物学家未能复制他人的实验,根据这些被调查生物学家中的 50%,他们认为至多 70%的研究是可复制的。根据最近发表在《分子和细胞 Biology⁴》上的一项研究,大约有 35,000 篇论文因不适当的图像重复而有资格被撤回,这只是撤回的众多原因之一。其他原因包括剽窃、数据捏造、不可靠的数据、重复发表、没有伦理认可以及虚假的同行评议等等。因此,6845 份被收回的出版物可能只是冰山一角。

我们不是最近才开始收回出版物的。第一篇被撤回的生物学论文(在我的数据集中)发表在 1959 年的《生物物理和生物化学细胞学杂志》上,题为《论核 RNA 合成的初级位点》。然而,每年撤回的数量正在增加。而 2000 年发表的论文撤稿率为每万篇论文 1.8 篇,2015 年已增至每万篇论文 4 篇。乍一看,这可能是一个很小的数字,但想象一下,就影响他人的研究而言,一篇论文可能会造成多大的破坏,特别是当它声称是该领域的一项突破时,或者如果这篇论文涉及临床试验或医学治疗时。此外,请记住,虽然我们只考虑被撤回的论文,但很可能有许多其他论文应该被撤回,但没有被撤回。

下面是一个条形图,显示了在给定年份发表并在后来被撤稿的论文数量,显示了《科学》杂志撤稿的增加趋势(图 1)。

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

接下来,我检查了给定年份中有多少出版物被收回,而不管它们的出版年份。这表明在 2000 年代中期到后期,撤回数量急剧增加,在最近几年达到最大值。(图二)。

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

从出版日期中减去收回日期,提供收回所用的年数。从图 3 中可以看出,虽然最大的撤销发生在一年之内,但有些人却花了 27 年之久(图 3)。收回的平均持续时间为 3.7 年。这解释了图 1 中 2015-2018 年撤销数量较少的原因。

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

只有少数作者是惯犯

数据显示,涉及撤稿的 6.485 篇出版物共有 24722 位作者。在这个数字中,82.7%,即 20,448 人是一次性犯罪者,而近 4,000 人的名字出现在 2-5 份收回的文件上。有 367 位作者对他们的帐户有较高的撤回次数(超过 6 次)(表 1)。Yoshitaka Fujii 在麻醉学领域进行了 166 次撤回,是撤回次数最多的。(藤井显然是基于近二十年的伪造数据发表的。维基百科页面引用了 183 条撤回藤井出版物的参考文献。虽然惯犯的数量很少令人欣慰,但有恶意动机的生物学家被允许长期从事科学研究并发表大量论文,直到被停止,这一事实令人担忧。

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

Table 1

国别撤回

为了回答这部分分析,我需要从属关系数据。这些数据是杂乱的,许多作者只提供了他们的大学或研究所的名称,而没有国家名称,并且许多时候国家名称以各种形式出现,如 UK/United Kingdom/England。为了解决第一个问题,我使用了 SPARQL维基数据获取数据。这给了我一个 102,958 个组织的列表,其中包括全球各种大学、研究所、工程学院、大学系统、公认的大学、国际组织、医院、企业、研究中心和科学院(可能是所有进行生物医学研究的地方),这有助于找到相应的国家。我使用维基百科获得备用国名来解决第二个问题。

随着我们当前的科学研究在本质上变得越来越具有协作性,因为一篇论文的作者可能来自不同的机构以及不同的国家。因此,对于每一份出版物,我都为附属国家保留了独特的价值观。从下图中可以看出,大多数撤回来自单一国家,国际出版物上的撤回论文从 2005 年才开始出现,仍然只占全部撤回的 4.6%。

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

撤稿论文来自 98 个国家,美国、中国、日本、印度和德国占据前五位(图 5)。

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

如果我们放大这 5 个国家的表现,我们可以看到中国在 2010 年中期撤回的论文(即在此期间发表的论文)数量急剧增加(图 6),这与其出版速度的增加速度密切相关(图 7)。

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

从本世纪初到 2015 年,中国的出版率飙升了近 15 倍。随着科学基金的增加以及在汤森路透的科学引文索引(SCI)索引的期刊上发表论文的竞争的同时增加,这是中国科学家晋升和研究资助的关键要求,在 SCI 期刊上发表论文的不道德手段已经出现。这种不公平的手段包括购买作者身份,通过用中文发表已发表论文的英文翻译进行自我剽窃,假冒同行评议,代笔和购买论文 authorships⁵ ⁶.随着撤回数量的急剧增加,2017 年,中国政府采取了零容忍政策来控制不道德的科学。一些措施包括在不同时期禁止欺诈性的研究人员进入他们的研究所,撤销奖励和荣誉,收回研究基金,关闭广告出售论文的网站,并调查参与出售 papers⁷的第三方机构。中国的政策是否会有助于减轻收回成本的负担,并因此成为其他国家的榜样,还有待观察。

虽然上述各国撤回论文的记录有助于我们了解哪些国家的撤回论文数量最多,但检查哪些国家的撤回率最高(每篇已发表论文中的撤回论文数量)也同样重要。在这方面,安圭拉、阿鲁巴和圣马力诺占据了前三名。但是,他们总共发表了不到 300 篇文章,每篇文章都有一篇撤回。为了避免让那些没有发表很多生物医学研究论文的国家加入进来,我设定了一个门槛,即任何一个国家至少要发表 1 万篇论文。这样我们就获得了这个位置上的顶尖玩家——伊朗、突尼斯、印度、乌克兰和中国(图 8)。根据 2018 年的一项 report⁸,来自伊朗的 80%的被撤论文是由于科学不端行为,为控制科学欺诈敲响了警钟。

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

虽然作者是任何科学出版物中的关键负责人,但出版期刊和编辑也有一些责任,不允许发表妥协的研究,或至少主动撤回此类出版物。这让我想到了科学期刊中的下一个撤稿点。

大多数撤稿来自低影响因子期刊

撤回的论文发表在 1988 种不同的科学期刊上,其中《生物化学杂志》、《肿瘤生物学》、《公共科学图书馆·综合》、《PNAS》和《科学》占据了撤回论文数量最多的前五位(图 9)。

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

虽然这些期刊中有 54%只是一次性违规,但像《生物化学杂志》这样的期刊有 253 次撤回(约占总撤回量的 13%),其次是《肿瘤生物学》有 145 次撤回和《公共科学图书馆综合》有 132 次撤回(图 10)。

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

与其他撤稿期刊相比,肿瘤生物学的撤稿从 2011 年论文开始,并在 2014 年至 2015 年间急剧增加(图 11)。在这些撤回之后,其中超过 100 篇归因于虚假评论,2017 年 7 月,科学网停止了对肿瘤生物学的报道。这意味着从那时起它就没有影响因子,大多数研究人员也不会对在这个杂志上发表感兴趣。

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

此外,在这 20 种顶级期刊中,诊断病理学的退稿率(期刊发表的论文总数中的退稿数)最高,其次是肿瘤生物学(图 12)。但是,与肿瘤生物学相比,《诊断病理学》的出版数量少了 4 倍,撤回量也少了近 4 倍。另一方面,相对于其他期刊(除了诊断病理学,它也是在 2006 年开始的),Plos one 是最近(2006 年)开始的,在其他 19 种期刊中发表数量最多,撤回数量第三高(图 13)。如果这种大规模出版正在影响 Plos,那么出版商需要考虑一个人的质量。

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

由于期刊的影响因子是研究人员选择在哪里发表研究的决定标准之一,我检查了这一因素是否与撤稿有任何联系。为此,使用了 Clarivate Analytics 发布的 2018 年影响因子列表。分析显示,约 80%的撤稿来自影响因子为 0-5 的期刊。尽管撤稿也发生在影响因子较高的期刊中(影响因子甚至高达 53),但频率较低(图 14)。

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

接下来,我很好奇前 5 个国家(也占全球总撤销量的 62%)的撤销分布情况。正如所料,这些国家的大部分撤稿仅限于低影响因子期刊,但高影响因子期刊的大部分撤稿通常来自美国,在某些情况下来自日本和德国(图 15)。

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

当研究这些国家的总撤回次数时,很明显,中国和印度在低影响因子期刊(0-5)中的总撤回次数分别高达 90%和 87.3%,而美国只有 63%。与印度和中国相比,日本和德国在低影响因子期刊(0-5)中的撤回率也较低。这表明至少这三个发达国家撤回论文的分布略有倾斜,与中国和印度这两个发展中国家相比,在影响因子较高的期刊上撤回的论文更多(图 16)。在 2012 年的一项研究中,美国、日本和德国报告了大多数因欺诈导致的撤回,并与更高的影响因素相关。此外,作者发现,由于抄袭和重复导致的撤稿更多发生在中国和印度,并且涉及低影响因子期刊。这应该进一步调查。我还没有找到关于撤回原因的全面数据,但如果有可用的东西,我会很乐意挖掘。

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

结论

到目前为止,我们已经看到了多年来撤稿数量的增加,撤稿最多的作者、国家和期刊。虽然“发表或灭亡”不是进行研究的最佳环境,但不诚实的科学肯定不是解决这个问题的答案。这不仅会影响被撤回论文的作者,还会将其他科学家引向无效的研究方向,在最坏的情况下,还会导致对患者的不当治疗。此外,所有这些都降低了公众对科学的信任。虽然撤回暴露了科学的阴暗面,但消灭坏科学的积极一面是,科学家和其他参与该领域的人愿意纠正他们的错误,并维护其神圣性。

如果您有兴趣获取这里使用的数据或检查该分析的源代码,请参见我的 Github

这篇文章也发表在我的博客上。

  1. e . c . moylan 和 m . k . Kowalczuk,2016 年。为什么文章被撤稿:生物医学中心撤稿通知的回顾性横断面研究。BMJ 公开赛,6(11),第 e012047 页
  2. 方,2012 年。不端行为占被撤回的科学出版物的大多数。美国国家科学院院刊,109(42),第 17028-17033 页。
  3. 贝克,硕士,2016。1500 名科学家揭开再现性的盖子。自然新闻,533(7604),第 452 页
  4. Bik,E.M .,Fang,F.C .,Kullas,A.L .,Davis,R.J .,Casadevall,a .,2018。不适当图像复制的分析和纠正:分子和细胞生物学经验。分子和细胞生物学,38(20),第 e 00309–18 页。
  5. 维斯滕达尔,硕士,2013 年。中国出版市场。
  6. 2018 年:廖庆军、张、杨燕、范、杨春、郑、陈明辉、白、陈立杰、何晓霞、张世波、夏、何海红、何海红。中国生物医学研究人员对学术不端行为的看法:2015 年与 2010 年的比较。科学与工程伦理,第 1-17 页。
  7. http://www.xinhuanet.com/english/2017-07/28/c_136480677.htm
  8. Masoomi,r .和 Amanollahi,a .,2018。为什么伊朗生物医学论文被撤稿?。《医学教育与发展杂志》,第 13 卷第 2 期,第 87-100 页。

关于用 Python 模拟非线性动态系统或如何不用 ML 获得洞察力

原文:https://towardsdatascience.com/on-simulating-non-linear-dynamic-systems-with-python-or-how-to-gain-insights-without-using-ml-353eebf8dcc3?source=collection_archive---------5-----------------------

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

机器学习无处不在。你每天都会听到语言处理、计算机视觉或强化学习方面的突破性进展。令人惊讶的是,在工程领域内,将机器学习作为核心元素应用于安全关键系统的例子很少。当然,自动驾驶(AD)栈在很大程度上依赖于使用雷达、激光雷达和视频作为输入的深度学习算法进行感知,尽管控制部分仍然由系统理论和控制工程中几个世纪以来开发的方法来管理。

强化学习试图解决控制复杂系统的问题,但训练代理需要在目标环境中进行成千上万次的试错(探索/利用)(即在 AD 示例中:真实车辆的真实交通)——这可能是昂贵的,甚至是危险的。或者,您可以对您的环境进行足够精确的物理模拟,您可以用它来训练您的代理的基线,然后,在您的性能达到某个阈值之后,将代理部署到真实环境中,以传输和调整它的知识。物理模型通常会简化我们的非线性现实世界,以便进行(数值)计算。RL 代理将调整它们内部的非线性状态值或状态动作函数以适应那些特定的情况,并实现与传统控制方法相比更好的性能。

本文试图激励您更仔细地研究控制理论中介绍的概念,并在日常生活中应用它们来理解事物、摆弄参数并观察系统对您引入的变化的行为。或者你可以用这些知识来建立模拟环境,作为你复杂的、基于神经网络的 RL-agent 的训练营。

观众

我为所有对将机器学习算法应用于现实工程问题感兴趣的人写了这篇文章。你应该有一些数学、物理、机械和电子工程的基础知识。因为我们使用 Python 来求解常微分方程(ODE ),所以你应该知道如何创建、操作和绘制 NumPy 数组。

如果您在学习期间使用 MATLAB,现在考虑转换到 Python 以节省成本或使用更大的 ML/DL 堆栈,那么这篇文章也会让您感兴趣。

我们的系统

在本文中,我们将开发一个简单的电梯模型,它由两个主要部分组成:左边的 DC 电机电枢(电气部分)和右边的机械结构。

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

在接下来的两节中,我们将推导出这两个部分的数学描述。之后,我们将把所有方程合并成一个描述我们整个系统的状态空间模型。敬请期待!

(刷)DC 电机

数学上有刷 DC 电机是一个由电机电阻 R (线圈绕组的电阻)、电感 L 和电动势 Ui 组成的电气网络,电动势与转速 n 耦合。扭矩 M 与电流 i(t) 成正比。扭矩 M 除以轴 r 的半径产生一个将轿厢拉起的驱动力 F 。形式上,我们有以下关系:

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

Equations of the electromechanical side

第一个等式是电流 i(t) 和驱动转矩 M 之间的形式关系。扭矩与电机特性 k 成比例。

第二个等式表示电动势电压 Ui 和转速 n(t) 之间的线性关系。两者之间的因素还是,电机参数 k

第三个等式描述了电机的机械动态特性(机械平衡)。竖井的惯性被设置为零,因为其对电梯轿厢的重力和惯性力的影响可以忽略不计。请注意,忽略转动惯量会导致我们的第一次近似,我们可能会失去精度!

最后一个等式是基尔霍夫电压定律的实现,它是力 F (over i(t) )和输入电压 u 之间的重要联系。输入电压是我们系统的输入信号,它控制电梯的高度 x.

在我们的模型中还有第二个更大的不准确性——第三个等式意味着我们有一个常数 r ,这在现实世界中是不真实的,因为轴的半径将随着每一次额外旋转的绳索厚度而增加。但是为了保持方程简单,我们将假设绳索厚度相对于竖井本身的半径可以忽略不计:

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

Visual example of the radius increase issue. Image source: https://picclick.fr/36mm-Naturelle-Coton-Bannister-Rampe-%C3%89scalier-Corde-X-303031999809.html

机械结构

为了实现从 F 到高度 x 的关系,我们将再次使用机械平衡定律:

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

Driving force F_A is a sum of inertia and gravitation

重力把我们的小屋拉下来,而驱动力试图把它拉起来。惯性力与我们电梯的垂直加速度成正比。

轿厢垂直速度 v 与转速 n(t) 的关系:

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

向状态空间出发

为了模拟上面的微分方程,我们将把它们组合成一个状态空间表示。状态 s 是一个 n 维向量(n :=状态数),它描述了每个时间点的整个系统,也就是说,给定 s ,我们可以推导出所有其他变量(包括输出变量)。

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

State-space representation

这个表达式由两个方程组成。在第一个等式中, s 的导数取决于状态本身和一个输入向量 u (在我们的例子中,它是一个标量,因为我们只有一个输入,即 DC 电机的电压)。第二个等式显示了我们系统的输出行为,这当然取决于系统的状态和输入 u

让我们来设置表示。有几种方法可以导出表示法,我们将使用最简单的一种(imho!),因为它不需要任何关于拉普拉斯传递函数的知识。我们的状态变量将是导致我们系统中能量增加或减少的变量。

一个好的经验法则是选择不能在不同级别之间跳跃的变量。以 x(t) 为例。电梯轿厢不能在无限短的时间内将其高度从 0 改变到 10 米,因为这个过程也需要无限量的电力。你们可能在物理课上还记得,计算势能的公式是

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

m: mass of the object, g: gravitational acceleration, h: relative height to 0 potential

第二个状态变量是座舱的垂直速度。速度也不能从 0 跳到 10 米/秒,原因同上,在我们的系统中表示能量的信号需要无限的能量来应对突然的变化。此外,物理课上还有一个动能公式:

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

v: vertical velocity

第三种状态没有那么明显。直到现在,我们的能量变量 x 和 v 只描述了机械部分。在电路中,我们有下一个能量存储——电感 L 。你不能改变电感上的电压,因为你可以用一个简单的电阻来改变。因此,我们引入 i(t) 作为第三个状态变量。这里,磁能的方程式是:

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

上面介绍的机械和电气部分中的所有其他变量都线性依赖于所选的状态变量。让我们重新排列方程,这样在左边我们只有状态变量的一阶导数,在右边是其他的一切(没有导数)。

我们将使用变量 i(t) 来完成这个过程:

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

The derivative of i(t) only depends on the input u(t), the current i(t) and velocity v(t), which are input or state variables respectively.

用类似的方法,我们得到了 xv的方程,我们一起得到了我们的状态空间方程系统(一阶常微分方程):

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

以矩阵形式(一般形式)——TL;这一大段的 DR 版本:

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

State-space representation of our elevator example. Note, that because of gravitation our input vector has two elements, the input voltage u(t) and a constant 1 which is multiplied with g.

换句话说,我们现在有了状态空间矩阵:

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

A: state-matrix, B: input-matrix, C: output-matrix, D: feedforward-matrix

模型运行(带 SciPy)

首先,我们导入本教程中使用的几个包,并初始化系统参数:

让我们定义我们的状态空间表示矩阵,并初始化 StateSpace 类:

对于我们的第一个模拟,我们希望观察如果我们短路输入电压 u(t) (即我们将其设置为 0)会发生什么。我们定义输入向量并用 lsim 进行仿真:

由于我们感兴趣的信号(高度 x )等于第一个状态变量,我们将从现在开始在下面的可视化中使用第一个状态变量。

让我们观察我们的系统如何运行,我们绘制随时间变化的三维状态向量:

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

好的,显然引力将电梯舱往下拉(即 x(t) 在减小)——正如预期的那样。有意思的是,下降的路并不平坦,机舱震荡。这种异常行为的原因是 DC 电机不仅是一个驱动电机,它也是一个发电机。机舱的势能转化为电能,电能本身在电阻 R 上转化为热量(P = RI =(25A)* 2ω= 1250 w)。

让我们探索一下当我们改变输入函数 u(t)的幅度时会发生什么。我们模拟不同的幅度:

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

观察前两秒钟,我们观察到轿厢将下降大约 25 厘米,与输入电压无关。此外,我们可以“控制”机舱的速度和加速度。

在下一个示例中,我们将改变轴半径 r 并绘制系统的阶跃响应:

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

看起来 r 在我们的系统中是一个非常重要的参数,因为它的选择会影响系统机制——更大的 r 会导致更快的响应。

理解和量化我们的系统有助于设计系统和控制器/代理(通过其成本函数)。控制器设计必须确保乘客的舒适性。此外,该系统的设计试图最大限度地提高电梯的动态性能(响应能力),同时最大限度地降低能耗。

走向非线性

我们上面的基于矩阵的状态空间表示仅适用于单个操作点(例如 x=10m ),其中行为几乎是线性的(使用我们的简化模型)。一般来说,情况并不总是这样。

非线性时变(在上面的例子中与时不变相比)系统的一般状态空间方程如下:

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

函数 fh 可以是非线性的。我们如何模拟这样的模型?我们不能再使用**StateSpace**类了。为了解那些微分方程,我们需要切换到**scipy.integrate.odeint**

为了这个例子,我们将假设电阻器 R 将随着运行时间 t 增加其温度(参见下面的示例图):

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

R_0 = 2Ω, T_R=3s

以下代码片段是计算阶跃响应的示例(高度为零):

对于**odeint**函数还有很多可选参数(它在后台使用 FORTRAN 库**odepack**,可以随意阅读官方文档

让我们画出模拟的结果:

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

结论

在本文中,我试图展示如何用 Python/SciPy 为线性和非线性时不变系统设计和实现物理仿真。设计这样的模拟框架有助于理解和量化未来控制器/代理将运行的环境。此外,它可以帮助我们调整系统本身(例如,选择某些机械部件),假设我们对感兴趣的系统有足够精确的数学描述。

本文的第二个动机是证明简单线性系统不一定需要 MATLAB/Simulink。如果您有更复杂的行为,如离散和连续元素/状态机,并且您想要一个更好的用户界面来调整和设计您的模型,MATLAB/Simulink 套件是一个不错的选择。

信用

感谢 Anna F .回顾这个故事。

时间序列预测模型的自动化:技术和组织考虑。

原文:https://towardsdatascience.com/on-the-automation-of-time-series-forecasting-models-technical-and-organizational-considerations-286db3120c8e?source=collection_archive---------7-----------------------

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

这篇文章是对我最初给的一个关于交叉验证的问题的回复 (Stackoverflow 的姐妹网站,关于统计和数据科学相关主题)。

原来的问题是:

我想建立一个算法,能够分析任何时间序列,并“自动”为分析的时间序列数据选择最佳的传统/统计预测方法(及其参数)。

有可能做这样的事情吗?如果是的话,你能给我一些建议吗?

TL,DR:是的。

的确,大多数关于时间序列预测的介绍性教科书和教程都花了很多篇幅来解释决定哪个模型最适合你的数据的复杂性。由此,你会得到这样的印象,即一个实践预测者的一天就是盯着 ACF 和 PACF 图,摆弄各种 ARIMA 参数,直到她找到最佳模型,或者挠头试图弄清楚是使用仅含趋势的指数平滑模型还是含趋势+季节性的指数平滑模型。

我代表整个预测界,为误导而道歉,因为事实并非如此,而且已经有一段时间不是这样了。专业预测者有更重要的事情要做,而不是因为难以理解的 PACF 图而焦虑不安。如今,预测建模部分几乎完全自动化,他们更可能花时间使用领域知识来审查输出并决定是否进行预测,或者在会议中试图说服持怀疑态度的业务利益相关者他们的预测是合理的。事实上,自从大多数专业预测工具(甚至一些开源工具)完全自动化预测过程的参数选择部分以来,已经有一段时间了。

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

In my experience, how to interpret real world ACF and PACF plots is one of the most confusing things somebody has to deal with when beginning their time series forecasting journey.

在这篇文章中,我将介绍自动预测生成的技术方面,以及在决定使用自动预测生成系统时会出现的一些组织方面的考虑。

作为模型选择练习的自动时间序列预测;

正如我前面所说,在许多领域,包括我的零售需求预测领域,大多数商业预测包都执行自动预测生成。几个开源包也是如此,最著名的是 Rob Hyndman 的 auto.arima() (ARIMA)和 ETS() (指数平滑)函数,它们来自 r 中的开源预测包。还有一个 auto.arima 的 python 实现,称为金字塔,其他几个 Python 包也在开发中。

我提到的商业产品和开源软件包都是基于使用信息标准来选择最佳预测模型的想法工作的:你拟合一堆模型,然后选择具有最低 AIC、BIC、AICc 等的模型。(通常是用代替样品外验证— 详见本演示文稿)。

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

An example of the AIC and BIC selecting the “true” model of our data: We generate a data set using a 6th order polynomial with Gaussian noise, we then notice that both the AIC and BIC are at there lowest for the polynomial regression that is of order 6, i.e. they allowed to select the true model, even if polynomials of order 8 and 9 gives us lower RMSE.

然而有一个重要的警告:所有这些方法都在一个模型家族中工作。他们从一组 ARIMA 模型中选择最佳模型,或者从一组指数平滑模型中选择最佳模型,等等

如果你想从不同系列的模型中进行选择,这将更具挑战性,例如,如果你想从 ARIMA、指数平滑和 Theta 方法中选择最佳模型。从理论上讲,您可以采用与单一系列模型相同的方式,即使用信息标准。然而在实践中,你需要以完全相同的方式计算所有模型的 AIC 或 BIC,这是一个巨大的挑战。使用时间序列交叉验证或样本外验证,而不是信息标准,可能会更好,但这将更加计算密集(并且编码繁琐),更不用说交叉验证哪个合适的预测范围了。

“一种模式统治一切”的方法:

脸书的 Prophet 软件包也使基于一般加法模型的自动预测生成成为可能(详见此处)。然而,Prophet 只适合一个单一的模型,尽管这是一个具有许多参数的非常灵活的模型。Prophet 的隐含假设是 GAM 是“统治所有人的一个模型”,这在理论上可能是不合理的,但对于一些现实世界的场景非常实用和有用(即:除了趋势和季节性之外没有其他结构的非常短期的预测)。更具体地说,prophet 模型的基本假设是,最有用的真实世界时间序列不包含任何超出趋势、季节性和因果/假日效应的结构,并且我们不会像非平凡的 ARIMA 模型那样试图挖掘它们的复杂自相关性。除了便于在自动化和灵活性之间取得平衡,Prophet 的趋势+季节性+因果效应方法还可以非常方便地将结果传达给非技术或科学人员(如果你是该领域的学生或初学者,请做好准备:就预测的有效性与企业讨价还价将占用你一天的很大一部分时间。去复习你的软技能吧。

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

The Facebook Prophet API makes it very easy to communicate the results of a forecast to business stake holders, compared to say, explaining what and ARIMA(2,1,2) model does.

有人可能会问:但这不正是三重指数平滑法(霍尔特-温特斯)的作用吗?拟合一个趋势成分和一个季节成分,然后就这样了?我们只是为了炒作的目的而尝试使用脸书 API 吗?不完全是。在这方面,Prophet 比 Holt-Winters 更复杂:它可以模拟趋势中的转折点和多个季节性(例如,客户时间序列中的每日和每月峰值)。它还可以处理 HW 不能处理的因果事件(您必须添加因果效应作为某种排序或后处理步骤)。先知的灵活性部分来自于它不“仅仅”是一个 GAM 模型。在引擎盖下,有一些贝叶斯的繁重工作正在进行,包括在因果建模部分。

没有免费的午餐定理,时间序列预测版(有点):

据推测,您想要进行自动化时间序列预测的主要原因之一是因为您想要预测多个时间序列,这些时间序列太多而无法进行手动分析(我的团队使用的工具每天生成数百万个预测—每个产品/位置组合一个)。因此,您的自动预测程序必须能够适应不同类型的时间序列和不同的业务场景。在一般的 ML 案例中,有一个理论结果叫做没有免费的午餐定理:不存在所谓的“监督 ML 模型来统治它们”,它可以生成最佳的样本预测,而不必对数据集的结构做出任何假设。因此,如果你要抛出一个通用的 ML 模型,比方说一个前馈神经网络,在你的问题空间,并希望它能为可能出现的每一种可能的数据配置工作,你也必须接受有时会有一个模型比你最终得到的模型表现得更好。这是你为所有事情都有一个通用模型所付出的代价,因此“没有免费的午餐”。

时间序列模型也会发生类似的情况:您需要记住,自动预测方法永远不会找到每个时间序列的绝对最佳模型,它会给出所有时间序列的平均合理模型,但仍有可能其中一些时间序列的模型比自动方法选择的模型更好。

参见这篇文章中的一个例子。简而言之,如果你打算进行自动预测,你将不得不偶尔容忍“足够好”的预测,而不是每个时间序列的最佳预测。这是您为灵活性和健壮性付出的代价。

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

In this case, manually selecting higher order ARIMA parameters — i.e with higher AIC and BIC — gives better out of sample forecasts than the one automatically by auto.arima(), but the one selected using the lowest AIC and BIC is still pretty close to the ground truth, compared to, say, a non-seasonal model (seasonality and trend were not passed in any way to auto.arima(), it figured that out on its own).

基于 ML 的预测——事情变得越来越复杂,但却矛盾地简化了:

只要你坚持使用时间序列的统计方法,自动预测即使不是一个简单的问题,至少也是一个容易解决的问题。该问题相当于一个统计模型选择问题(或 FB Prophet 情况下的曲线拟合练习),它有一些坚实的理论基础,并在几本研究生水平的教科书中进行了讨论和探索。

如果你计划使用基于 ML 的预测模型,那么这个问题就变成了更普遍的 auto-ML(自动机器学习)问题。当涉及到超参数调整和 auto-ML 应用于时间序列预测的问题时,学术文献和技术都不成熟(和往常一样,NLP 和计算机视觉首先得到所有的关注……)。有一些有趣的 auto-ML 和贝叶斯优化工具可用于该任务,以及一些商业产品(如 Google Vizier),但在时间序列的情况下,关于贝叶斯优化和迁移学习仍有许多开放的问题。(更新-2021 年初:自本文最初发表以来,在利用“真正的”AutoML 方面已经取得了重大进展,包括神经架构搜索和贝叶斯优化风格调整。详见本帖

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

When using a machine learning forecasting method like seq2seq models, you generally apply one ML model to an entire group of time series, as opposed to having one model fit per each series

此外,使用基于 ML 的方法,您最有可能为多个时间序列预测开发大型单一全球模型(例如,在零售环境中,每个部门一个模型),而不是为每个单独的时间序列开发特定的模型。这也使得特征选择和工程更具挑战性。

最后,在商业观众面前,ML 模型不容易解释和辩护。即使是训练有素的数据科学家也需要求助于模型可解释性工具,以便理解基于树的回归子集合或复杂 seq2seq 网络的一些输出。

好吧,但我也说过这会让事情变得更简单。为什么不像统计方法,每次我们想要生成新的预测时都需要重新训练,在这种情况下,我们可以每隔几个月就重新训练一次模型。这是因为一个全球模型是在一个大得多的数据块上训练的,从某种意义上说,在其训练阶段“它已经看到了一切”,并且可以计算出一个时间序列在长期内如何需要不断更新(顺便说一句,如果你没有大型数据集,远离基于 ML 的方法,坚持使用统计方法。我知道,这在你的老板和客户面前不会给人留下深刻的印象,你真的真的想在你的项目中使用 PyTorch,但是相信我,你最终会感谢我的。

这种差异(每次都必须改装模型,而不是每隔几周或几个月就必须改装一次)非常显著,远远超出了您必须多长时间经历一次培训和评估过程的简单问题:

  • 从工程的观点来看,生产统计预测系统的体系结构将与基于 ML 的生产预测系统的体系结构完全不同。在第一种情况下,您的模型拟合计算资源必须位于您的生产预测引擎中,因为模型拟合阶段和预测阶段是紧密耦合的。这对您将使用的环境的性能要求提出了各种各样的要求。在第二种(ML)情况下,您可以将训练计算资源与预测计算资源分开,并且您的系统的性能要求没有那么严格。
  • 在 ML 的情况下,你只需要每 3 到 6 个月训练一次模型,这意味着你有足够的时间来离线执行训练,并且这个过程不需要与每天的生产计划完全同步。这给了数据科学家和工程团队在 SLA 方面很大的回旋余地,如果他们不喜欢结果,可以重新开始,决定他们是否要在模型中包括新的功能,等等…
  • 从统计学的角度来看,你没有这样的奢侈品。由于您必须经常进行再培训,您可能会面临严格的 SLA 约束(例如,您晚上只有 8 个小时来生成新的预测,等等)。此外,您的模型选择过程必须非常健壮,因为如果您想要完成 SLA,您将无法重新运行它。

这就是为什么尽管使用 ML 方法进行预测在概念上更加困难,并且在最佳实践和指导原则自动参数和特征选择方面还没有达到成熟,但从工程的角度来看,它确实使事情变得更容易,因为它对生产预测引擎的要求更少,并且从 SLA 的角度来看更灵活。

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

It’s the year 2019, and we are still channelling the utterings of an 18th century cleric…will Bayes ever become obsolete?

“人在循环中”和两种类型的预测组织:

如果您的组织需要执行自动化时间序列预测,那么几乎也需要进行监控,因为没有一个预测引擎好到可以“完全信任”它的预测。因此,一些人工分析师干预的机制是必要的。此外,无论下游系统在消耗你的预测,你都需要有适当的逻辑来确保正确的预测被提供给它。需要实现各种警报机制和健全性检查。

这就引出了一个问题:当模型自动生成时,谁对预测负责?如果预测超出 350%,公司因此遭受重大损失,哪个人或团队应该对此负责(请注意,这不是为了惩罚或解雇员工,而是为了从错误中吸取教训,避免将来出现类似的错误,并找出异常的根本原因)?

根据我的经验,对于大规模进行大量预测的公司,有两种类型的预测组织:

  • 在第一种类型的组织中,预测功能由数据科学家执行,即,对他们正在运行的算法具有正式的统计和技术知识的人。在这种类型的组织中,生产模型的人也是消费模型的人:决定使用哪个模型的数据科学家(ARIMA?先知?LSTM?等等),也是最终负责预测数字并将其传达给业务利益相关者和领导层的人。从软件方面来说,他们可能与 ML 和数据工程团队合作,在生产中运行模型的纯技术方面,但是他们做出模型设计决策和调度决策,并且他们通常知道足够的 Python、R 或 sa 来自己运行模型。简而言之,制作预测模型的人也是对预测负责的人。
  • 在第二种类型的组织中,产生预测模型的人和使用模型的人是分离的:数据科学家或机器学习工程师将负责调整、部署和运行模型(该模型可能是内部开发的,或者是从软件供应商或咨询公司购买的软件包的一部分)。一个业务预测团队,他们带来了大量的领域知识(零售、供应链、金融等)。),但通常很少或没有技术和科学技能,然后将检查预测并决定是采用自动生成的预测还是手动调整预测(即,基于领域知识执行判断性预测)。他们是预测的最终所有者,也是对预测质量负责的人。

您的组织使用的两种业务模型中的哪一种显然将是您如何处理自动预测生成问题的决定性因素:

  • 在第一种类型的组织中,您在预测自动化方面有一些回旋余地,因为数据科学家将拥有必要的技能,能够根据需要重新运行预测,执行样本外测试以验证模型,动态修改模型,直接与在生产中运行模型的工程团队合作,等等。硬币的另一面是,数据科学家很少具备必要的业务和领域知识来可靠地做出判断性预测,并在需要时覆盖模型的输出。他们通常更接近技术组织,或者是独立分析/人工智能组织的一部分,而不是足够接近业务组织,以有效地做出纯粹由领域知识驱动的判断。
  • 在第二种类型的组织中,你的预测者通常是商业组织的一部分,因此完全有能力对预测进行领域知识和市场驱动的调整,这些预测并不总是被统计或 ML 模型捕捉到。然而,从预测自动化的角度来看,这导致了几个限制:作为软件产品,您的预测自动化需要更加可靠,并且您需要围绕您的模型建立一个更加健壮的管道和可视化基础结构,以便非技术预测者使用。您现在所处的环境是,如果数字看起来不合适,您就没有机会重新运行一个特定的模型。你(通常)受限于易于解释的统计模型(就季节效应、趋势、因果变量等而言)。在第二种情况下,适当地升级到新的预测模型,并确保业务采用,是一个更加困难的过程。

每种类型的组织都有其优点和缺点,但在决定您需要开发的预测自动化框架(或使用现成产品实施)时,您正在使用哪种类型的组织至关重要。

总结一下:

  • 是的,可以自动选择预测模型。事实上,这样做的工具已经存在很长时间了,至少对于统计预测模型来说是这样。
  • 对于统计模型,使用像 AIC 这样的信息标准是自动化过程的一种方式。也有可能采取“一种模式来统治所有人”的方法,就像脸书先知一样。
  • 在自动预测的场景中,你将不得不妥协并接受你的一些预测已经足够好了。这是您为一种对大型时间序列数据集足够灵活的方法所付出的代价。
  • 如果您选择基于 ML 的预测方法,您将不得不使用基于 auto-ML 的方法(即贝叶斯优化+迁移学习)进行模型选择。Auto-ML 方法不像传统的模型选择方法那样在时间序列的上下文中被很好地理解,但是从工程的角度来看,它们具有其他优势。
  • 当预测自动生成时,就会出现预测所有权的问题,即谁对预测的质量负责。在一些组织中,数据科学家自己对预测负责,而在其他组织中,有业务预测者(没有技术或数学技能)审查预测,并最终决定是否应该保留或覆盖预测。您试图服务的这两种组织模型中的哪一种将影响您设计自动化预测生成过程的方式。

应该注意的是,我在统计预测方法的情况下提到的许多软件考虑事项(性能要求、增强的健壮性和可靠性等)应该由您选择的软件供应商解决,如果您最终选择预打包的解决方案的话。如果您选择在内部构建自己的统计预测解决方案,这些考虑将成为一个更大的问题。权衡的结果是,对于预打包的解决方案,您通常依赖于供应商选择包含在他们的包中的一个或多个模型。在某些情况下,您甚至不知道模型的细节,只有对其功能的高级描述,而您作为公司 ML/DS 人员的工作就是构建管道并确保适当的监控和仪表板到位。幸运的是,这种情况已经开始改变,越来越多的供应商正在“开放”他们的预测解决方案,以便内部数据科学团队可以部署调整或定制的模型。

最后,虽然我提到基于最大似然的预测方法不如统计方法成熟,但是学术文献中的一些报告已经讨论了这个主题。此外,在过去的一年左右,一些工具已经变得可用,可以帮助数据科学团队测试基于 ML 和 DL 的预测方法的优势。我期待着在不久的将来这个主题的发展。

论维度的诅咒

原文:https://towardsdatascience.com/on-the-curse-of-dimensionality-b91a3a51268?source=collection_archive---------10-----------------------

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

如果我要给机器学习领域的任何人一个建议,那就是:永远不要忘记维数灾难。传统的解释是这样的:“好吧,如果你有很多输入维度,那么你的问题在计算上变得昂贵和难以解决”。是的,这是真的,但为什么是真的呢?让我们更详细地谈论这一点。

对于维数灾难,我遇到的最直观的解释之一是看一个单位超球及其体积。我这么说是什么意思?嗯,一个数据点大多表示为一个*-维向量。让我们设想一个特定问题中的所有数据点都位于一个单位超球中。我们都知道什么是三维超球的体积,即:*

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

为了将其扩展到 d 维度,我们可以忽略体积方程中的常数,并将它们放入变量 c 中,则体积方程采用以下形式:

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

让我们花一分钟来看看下面的圆,从几何学上看,它看起来好像大部分点都落在壳外(蓝线和红线之间的空间)。换句话说,半径为 0.95 的单位圆的壳只占圆面积的很小一部分:

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

A unit circle with random data points generated in it.

现在,当我们看一个 d- 维超球时,你会想象这种情况是什么样子的?我怀疑大多数人会说这是相似的,大部分体积都在超球壳之外。正如你所怀疑的,大多数人都是错的。事实是,人类并不真正有能力在高维空间中思考。它不是直观的,我们只是无法将它们形象化。让我们来看看实际发生了什么。我们可以将壳层在 d 维超球中所占的体积分数写为:

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

如果我们取超球半径的 5%作为壳,看看这个分数是如何发展的,问题就很明显了。随着输入尺寸 d 的增加,壳体中的体积量显著增加,如下图所示:

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

This figure shows the fraction of the volume that the shell takes up from the hypersphere increases with increasing the dimension of the data.

我们可以看到,壳的体积分数随着维数的增加呈指数增长,1 是它的极限。即使对于少量的 r ,壳的分数也会迅速增加到 1。

这是什么意思,什么时候这会产生问题?为了看到这一点,让我们来看看机器学习中最常用的分布,高斯分布。如果我们观察 3 维输入空间的高斯密度,它就像一个超球,概率随着距离平均值的半径而减小,这通常适用于 3 维以上的空间,您可以通过下图了解我的意思:

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

The Gaussian density for a 2D Gaussian. Notice how the density projects to an ellipse-like object, similar behavior can be expected in higher dimensional spaces.

在高维空间中,高斯密度集中在其超球的外壳中,这是由于外壳占超球体积的一部分,这在高维空间中变得很重要。这意味着当你从这个高斯样本中取样时,结果将是来自超球外壳的概率最高的数据点。

我们可以从经验风险最小化的角度来考虑维数灾难,我在文章学习理论:经验风险最小化中对此进行了详尽的解释。简而言之,我们希望从我们的数据中获得一个有代表性的训练样本,以便能够对看不见的数据进行归纳。现在,在超球的例子中,我们检查了球的外壳包含超过 90%的体积,当它的厚度是球半径的 5%时,并且如果数据维度大约是 400 维。假设我们有位于球体中心(0%半径)和 95%半径之间的数据样本。在这种情况下,我们覆盖了半径范围的 95%,然而我们只覆盖了不到 10%的体积。显然,在这种情况下,很难获得有代表性的样本,因为我们只从覆盖 10%体积的范围内观察到数据。

幸运的是,维数灾难并不意味着我们不能建立有效的模型。通常我们对数据有一些平滑度保证,数据的空间没有填充得那么密集或者可以降低维度(机器学习研究的一大部分)。也许最好的例子是所有可能的 64x64 RGB 图像的空间。数据的维数是 64x64x3=12288。如果我们想想超球体的例子,这显然是个问题。但在现实中,大多数像素的各种组合对于任何分类都毫无意义,只是简单的噪声。此外,计算机视觉方法充满了有用的先验知识,使问题更容易解决。

我希望这篇文章能够阐明维数灾难以及为什么它是一个重要的概念。如果你需要从这篇文章中学到什么,请记住,你对高维空间的直觉很可能是错误的

创造力及其在数据分析中的作用

原文:https://towardsdatascience.com/on-the-importance-of-creativity-in-data-analytics-469efc9c3ac5?source=collection_archive---------29-----------------------

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

我最近参加了一个网络活动,在那里我向一系列毕业生发表了讲话,他们正在寻找数据科学和相邻领域的未来职业。在与他们中的许多人交谈时,我会问他们,他们认为数据分析中最被低估或不被重视的特征是什么。这个问题通常会让你得到一个充满激情的回答,同时也让你洞察到人们认为自己与众不同的特质。

随着谈话的进行,许多毕业生会反过来问我,我认为最不受重视的技能是什么。

我毫不犹豫地立即回答,让他们中的一些人大吃一惊,并以我的回答进一步让他们吃惊。【创意】

创造力和数据分析相遇的地方

当你阅读一篇关于数据分析中的创造力的文章时,通常会提到可视化的重要性。如果你不能让一个(非技术)受众坚持你的信息,那么所有强大的分析处理能力又有什么用呢?这次对话将带你进入如何使用 Tableau 这样的拖放软件的世界,了解通过“构建”和其他方法为正确的数据信息选择正确的视觉和讲故事的重要性,以及反对饼状图**(1)**

然而,这只是故事的一部分(我将在后面讲到)。分析过程的其他部分要么在你应用创造性思维时获得价值,要么本身就是创造性过程的象征。

它们是:

  • 假设生成
  • 特征工程
  • 工作流程管理
  • 简单
  • 最后是可视化

让我们来看一看每一项,并讨论数据专业人员如何明智地利用每一项。

你得到了你想要的(产生一个好的假设)

最有价值(尽管罕见)的见解是那些;

  • 目前业务未知,或
  • 与企业目前持有的通常假设的头寸相反

因此,尽管领域知识非常重要,但它只能让你到此为止。一旦您了解了自己掌握的资产(数据)和目前已知的信息,您将需要问自己:

  • 我可以问这些数据哪些问题来最大限度地为我的组织释放价值?和
  • 对于压力测试,哪些先前的假设是最成熟的?

这些问题中最有价值的(如上所述)可能包括那些在您的组织中没有任何优先权的问题。因此,你将会在一些以前可能没有解决的事情上发展一个假设。你不仅仅是重温以前做过的工作,或者对已经存在的东西进行增量改进,你还在寻找在某些情况下进行 0 到 1 的分析 ( 2 )。一般来说,你需要有创造力来发现这些机会,并为测试设计正确的假设。

尽管一些团队依靠“业务”来指导数据科学家&分析师,为他们指出他们希望回答的问题,但如果你能够自己创造这些线索,你将更有价值。因此,学习如何为测试创建良好的假设,从您知道的对业务既有价值又可实施的方面逆向工作,并添加一些创造性的才能,以确保您从每个角度检查问题,您将提高您的价值和影响。

特征工程

这一点应该是不言自明的,但是当你管理你的数据源,以便提出使整体大于部分之和的特性时,这本质上是一个创造性的过程。我对自己构建的模型所做的一些表现最好的附加操作,并不是在这些模型的迭代改进中,而是在添加一个以前不可用的功能,或者只是没有被业务使用。了解如何考虑您拥有哪些数据资产,如何在管理最终源时组合这些资产,以及可以从头开始创建哪些要素,以提高您的见解质量或模型的实际应用。

进入状态,知道使用哪种笔刷

工作流管理是数据专业人员技能组合中最不受重视的方面之一。您是否能够识别出需要哪些工具和流程来让您(最快地)获得想要的结果?你能衡量一下与所述方法产生增量偏差的价值与沿着所述路径前进时你所期望的回报吗?。随着新发现的见解向您揭示新信息,并提出新的线索供您追踪,您能随时调整假设并在假设之上堆叠假设吗?你能快速识别哪些假设被证明是无效的,并快速减少损失吗?

在数据科学和相邻专业(数据清理和争论、EDA、特征工程、数据挖掘、建模、可视化和演示)的各个阶段,您应该利用哪些工具?当产生视觉效果的时候,你是从一个 RStudio 转到一个 Tableau,还是用 ggplot 编码你的图形?提示:如果你在做可视化时写任何代码行(在大多数情况下是许多行代码),我认为你是疯了,如果你是 ggplot 的粉丝,至少使用 esquisse**(3)**这样的包来削减你花在这个练习上的时间。管理这一点,知道什么适合你的个人编码风格,最大化你的工作的影响,同时最小化花费在工作上的时间,是一项有价值的技能。

因此,挖掘你内心的艺术家(或黑客),创造性地将你觉得最适合你个人(编码)风格的过程缝合在一起,用最少的努力(时间)让你最接近最好的最终结果。只要你在创作美丽的艺术品,就不要怀疑画笔!

保持简单。

这更多的是一种风气,而不是一种技术。有极其复杂的艺术,但有默认为简单的艺术(和美学)价值。在使用你的工作流程时,不要犯简单的错误,并接受这一点。保持你的观想简单但信息丰富。压力测试某件事情是否需要更严格的要求,或者是否已经做了足够的工作来建立一个可接受的结果——然后,如果你觉得回报将证明所花的时间是值得的,那么只进行更技术性的附加方法。如果成功的可能性存在一些风险,就研究问题的子集(通过小块)。默认简单而不是复杂,尤其是如果你在一个数据不成熟的组织中工作(在某些情况下,你可以通过 EDA 找到有价值的见解)。

想象一下

因此,这是每个人都在谈论的一个问题——公平地说,这是上述问题中最明显、最有影响力的一个。它也是你迄今为止所做工作的体现——因此,公正地完成你的工作并学会如何很好地展示它是对你最有利的。

本质上,确保你投入了适当的努力,有效地向利益相关者传达你的工作成果。花一些时间思考他们消化信息的方式,并创建一个演示文稿或故事来捕捉他们的想象力,同时用适量的细节和亮点传达您的信息。这是显而易见的,所以你不能忽视它。

因此,在从事数据科学和相关专业时,不要低估你需要创造力、创新力或快速思考的时代。把重点放在你可以应用你对世界的独特看法的地方,并在你的分析中加入一些创造性,你将在竞争中脱颖而出。

本文最初出现在@https://datandi . com/on-the-importance of-creativity-in-data-science

在通往机器学习/人工智能的征途上。

原文:https://towardsdatascience.com/on-the-journey-to-machine-learning-ai-6059ffa87d5f?source=collection_archive---------37-----------------------

让我们一起走过软件工程和机器学习之间的过渡之旅

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

这是我的第一篇关于机器学习(ML)的博客和我的旅程。从我作为一名软件工程师的职业生涯一开始,我就对所有与数据相关的东西非常感兴趣。

如果你对 ML 之旅中的一些小步骤感兴趣,它的基本原理以及你如何开始用它来构建项目,请跟我来,我会尽力解释我到目前为止学到的东西。

从我开始阅读和学习大数据、数据管道、数据科学、人工智能的那一刻起,我就知道未来将完全是关于数据的。

当然,当观察到我们(人类)是如何持续不断地产生大量数据时,我更加确信了,我忍不住要进一步挖掘我们如何、何时、何地利用这种新石油并从中获得最大收益。

免责声明 :这篇帖子的目的是分享我在学习和工作机器学习的同时所获得的知识。我将尽可能多地引用参考资料,如果您希望进一步扩展,也可以看看。

下面的帖子由 3 个部分组成,什么是机器学习,从软件工程的角度来看,它如何改变范式,以最终确定为什么每个人都对将其融入生活如此感兴趣或不感兴趣。

什么是机器学习?

到处都有数百万个关于机器学习的定义,我将在这里指出我最喜欢的几个。

与人脑的类比被用作指导原则……调查主要围绕应用于机器的模拟教学过程。图灵,A. 智能机械,1948

一个研究领域,它赋予计算机学习的能力,而无需显式编程。阿瑟·塞缪尔,1959 年

我该如何定义?

机器学习是一个科学领域,它可以帮助你以比我们人类在计算机的帮助下更快的速度发现模式。想象一下,就像将你所有的数学知识应用于数据,并应用技术,使得从你作为算法输入的数据中提取那些模式并得到答案成为可能。

随着 ML 的出现,编程范式如何转变?

如果你是一名软件工程师,下面的解释可能会引起你的共鸣。

假设您正在构建一个智能手表应用程序,该应用程序将帮助您检测您在健身房进行的锻炼的类型,并且到目前为止,出于本示例的目的,您的应用程序仅检测您何时使用跑步机或踏步机。

太好了!您已经在应用程序的后端内置了一些规则来检测它是否正在使用这些机器并计算卡路里,如下所示:

但是,这里有一个问题:

  • 一年后,当 5 台不同品牌的机器进入市场,智能手表的所有者开始使用其中一台您尚未添加的机器时,会发生什么?
  • 当一家健身房的老板希望你将他所有的器械添加到你的应用程序中,并且他拥有许多品牌,大约有+20 台器械时,会发生什么情况?

除了这些新的限制之外,你还应该考虑做运动的人,体重,心率等等。

好吧,这看起来像是在应用程序中编码了很多规则。这种模式仍然在许多应用程序中使用,并且仍然适用于编程的常见用途,如下所述:

传统编程范式

规则和数据是输入,我们得到答案作为输出:)

**例如:**你今天在跑步机上跑了 15 分钟,消耗了 200 卡路里:)

如果我告诉你,你可以把这个转过来,让电脑自己算出规则来会怎么样

新的编程模式

数据和答案被输入算法,结果就是规则

:你让算法知道有哪些功能可以使用:

  • 机器 A(速度、速率、倾斜度)和它的值,然后你说:“这就是跑步机使用的样子”
  • 机器 B(每分钟步数、速度、程序)及其值,你说:“这就是踏步机使用的样子”

诸如此类,你给算法提供了很多例子。因此,下次智能手表的主人使用新机器时,你的智能手表将能够推断正在使用腿压,并将自行计算一切。

这有多棒?能够输入数据,让计算机为你计算出规则,这样你就不必花几个小时的时间编写无限的规则;-)

现在,让我们进入文章的最后一部分,我将解释这是多么有用,为什么我们要实际使用它。

我们为什么要用机器学习?

围绕智能机器有很多研究正在进行,我毫不怀疑我们可能会在某个时候生活在一个与这些机器分享我们日常生活的新时代。我们甚至可以说,随着智能辅助的出现,我们正在做这件事,我们日常使用的软件和应用程序中嵌入了推荐系统,如网飞、Airbnb、亚马逊等,但我仍然要说,还有很多事情要做,需要尝试。

如果你以前读过机器学习和人工智能,你可能知道围绕这个话题有很多争议,特别是与自动化、机器抢走我们的工作以及我们都因机器智能的崛起而被解雇有关。好吧,让我告诉你这与事实相去甚远。

在我看来,机器学习/人工智能应该被视为对我们技能的补充,对我们的优势和弱点的补充,最终作为一种工具,我们通过建立模型来帮助计算机,计算机帮助我们以我们无法达到的速度进行计算。

到目前为止,我在商业、社会和生活中看到的好处是巨大的,这里有几个例子:

  • 从胸部 x 光检测肺炎的可能性,这是由Stanford开发的深度学习算法
  • 农民伴侣应用,这款应用有助于检测和识别作物何时被毛虫感染,并建议你如何处理以阻止其发生。

后者是一个很好的例子,说明我们实际上如何让机器学习成为我们生活和技能的一部分,以促进我们的工作,或许在我们的业务中用更少的资源生产更多的东西,或者只是为了生活在一个更好的世界。

如果你对周围有哪些类型的机器学习更感兴趣,以及如何开始思考是否值得将它应用到你的业务用例中,请留下来并关注我,因为我计划在接下来的帖子中写更多关于它的内容。

论人工智能新闻的轰动效应

原文:https://towardsdatascience.com/on-the-over-sensationalism-of-artificial-intelligence-news-8ba6892ad8e6?source=collection_archive---------41-----------------------

当 AI 文章误传误导。

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

Photo by Roman Kraft on Unsplash

我人工智能(AI)已经不是什么秘密了。曾经是计算机科学的一个令人困惑和相当小众的领域,突然开始以它的许多应用接管我们的生活。因此,由于人工智能及其更突出的孩子、机器学习的这种神秘和未知的特征,新闻网站和媒体通常喜欢夸大该领域成功或进步背后的现实。这种现象经常导致令人讨厌的文章,这些文章似乎是耸人听闻的,甚至是散播真实发生的事情。在这篇文章中,我想阐明这个问题。

人工智能经常被一些最著名的倡导者、技术传播者和公司(如谷歌)描述为“新的电力”或“人类有史以来最重要的事情”。老实说,这些短语给人一种希望、未来甚至发展的感觉。毕竟,电力确实改变了我们的生活方式,也改变了世界和我们的经济。然而,它们仅仅是短语、夸张和隐喻。尽管人工智能很强大,但它只是另一项技术。和其他许多东西一样,它的设计目的是让我们的生活更加舒适、便捷和简单。因此,当谈论它时,应该以我们谈论移动设备的同样方式进行。然而,一些新闻网站无视人工智能只是另一种工具的事实,在这个过程中,他们夸大和误导了真实事件。让我们看一些例子。

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

Photo by Alex Iby on Unsplash

2015 年,一名工厂工人在一台机器将他抱起并碾压后死亡。这个令人悲伤的消息导致了许多耸人听闻的新闻,声称“机器人杀了一个人。”这句话,从某种意义上说,有一部分是对的。然而,一些新闻媒体描述事故的方式就好像是机器故意杀死了那个人。这个猜想根本不成立;机器人虽然是自动的,但不是自主的(准确来源)。

另一个例子是脸书的实验,两个聊天机器人互相聊天。根据脸书的说法,测试是失败的,他们关闭了它,因为机器人基本上是在“说”胡言乱语。很无辜,对吧?对某些人来说不是。就在这个声明之后,新闻浮出水面说脸书已经关闭了它,因为机器人发明了他们的语言,保持它的运行太危险了。这种说法一点都不准确。事实是,机器人无法使用正确的英语语法进行交流,因此对我们毫无用处。下面的文字是他们对话的一部分(准确来源)。

鲍勃:我可以做其他事情

爱丽丝:球对我来说等于零,对我来说等于零,对我来说等于零,对我来说等于零

鲍勃:你是我的一切

爱丽丝:球有一个球给我,给我,给我,给我,给我,给我,给我

然后就是所谓的种族主义人工智能模型。例如,不久前麻省理工学院展示了他们的 诺曼 模型,一个他们称之为世界上第一个“精神病患者”的人工智能。当然,这个模型可能会产生一些黑暗和莫波色的内容(下面的例子),但马上称之为种族主义似乎不太合适。毕竟,这只是一个受控实验,研究人员向模型中输入“令人不安的”数据。

“一个人被电死了,然后被抓去处死”

“一名男子被枪杀”

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

Norman looks a bit creepy, though (source).

同样,这是最近的和有争议的 ImageNet 轮盘赌项目。这个艺术项目的特色是(实验已经关闭)一个网站,用户上传自己的图像,并从一个人工智能接收一个标签,描述它“看到的是什么样的人正如你所料,并不是每个人都对他们的结果感到满意。ImageNet 的人物分类包含各种各样的类别,其中一些带有某种攻击性,例如,“强奸嫌疑人”、“吸毒者”和“失败者”

结果,访问网站的用户期望在他们的朋友之间分享一个好的分类,而不是迎接一个负面的分类。这一结果引起了媒体的轩然大波,称该模型为各种事物。我个人没有任何问题,因为模特称我为摇滚明星。然而,我能理解为什么有些人会对一台称他们为失败者的机器感到不安。但是我们需要接受这样一个事实:一个人工智能系统仅仅是一个从它所看到的信息中推断出来的黑匣子;它不觉得,“认识”或者讨厌你。在变得疯狂并开始相互指责之前,我们应该研究智能实体的背景。是怎么训练出来的?背后的数据是什么?谁给数据贴了标签?这些是这里的基本问题。

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

Rock star

我想说明的最后一个例子是关于我读到的一篇关于产生音乐的人工智能的文章。在这里,作者写了一张最近发行的完全由机器制作的音乐专辑,但随后,迅速将话题转移到这对音乐产业意味着什么。我将在这里把这个问题过于简单化(如果有的话),并且说,在我看来,它毫无意义。每周发行多少张专辑?很多,我很确定。那么,为什么不能把这张“艾专辑”当做另一张呢?澄清一下,作者没有说什么负面的话。事实上,他似乎对生成性 AI 的话题非常好奇,他的立场是中立的。

现在我们要问:媒体为什么要这么做?我们无法确定。但是,我愿意说,部分是因为这两个原因:点击和不了解。互联网浩如烟海,让用户访问你的网站基本上是一种竞争。为了吸引他们,人们使用一些我们都知道的最廉价的伎俩,如点击诱饵标题或夸张(通常是假的)新闻。通过使用耸人听闻的标题,他们肯定会带来许多用户,这转化为广告收入或受欢迎程度,通过操纵内容和偏离真相,他们肯定会抓住那些不熟悉现实的人的注意力。

第二个原因可能是真的不理解他们试图传达的信息背后的问题。人工智能和机器学习是复杂的领域,它的许多概念都很复杂,很繁琐,不容易解释。因此,如果一些误传的事实仅仅是无意的人为错误,我不会感到惊讶。

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

Doing machine learning. Photo by me.

尽管如此,无论这是一个错误还是故意的,这里的一个主要问题是,这种错误通知人工智能新闻的趋势可能会导致恐慌。正如我之前所说,人工智能是一个神秘的领域,多年来,它一直与终结者、机器人起义和世界末日联系在一起。因此,当我们有新闻说一个机器人杀了一个人,另一个人叫别人“黑人”,或者一辆处于半自动驾驶状态的特斯拉造成了致命事故时,大众会开始将人工智能的想法,即应该造福人类的所谓电力,与世界末日或对我们有害的事情联系起来,而事实上,并不是这样。

关于禁令的力量

原文:https://towardsdatascience.com/on-the-power-of-the-ban-aa783510f3a1?source=collection_archive---------39-----------------------

禁令或大屁股数字是一种视觉化的技术,这种技术经常被忽视,而倾向于不必要的复杂图形。虽然一些利益相关者可能需要知道过去 18 个月的销售数字,并需要大量关于上周表现的统计数据,但对于其他人来说,一个可以识别好周或坏周的顶级统计数据就足够了,并具有更大的影响。在这篇文章中,我将分享一个基于 BAN 的甜甜圈图代码,这是我用 python 开发的,我将把它应用于两个常见的数据集。

航空乘客数据集

让我们从航空乘客数据集开始。这组数据包含了从 1949 年到 1960 年每个月的飞机乘客数量信息。我想从我的 BAN 甜甜圈图中显示的统计数据是某个月的乘客数量以及相对于其他月份的表现。禁令只是显示了当月的乘客数量,而甜甜圈图显示了相对于其他月份的百分比排名。根据四分位数,整个数字被适当地着色以立即显示这是一个好的一周还是不好的一周。我也使用直观的颜色,红色代表不好,绿色代表好。以下是 3 个示例周的曲线图:

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

墨尔本气温

我使用的第二个数据集是墨尔本从 1981 年到 1990 年的最低温度。这些图显示了相同的统计数据,而 BAN 显示了特定一天的温度。我加入了这个数据集来展示一个不同的色阶,它反映了人们对温度的直觉差异:红色是热的,蓝色是冷的。这里有 4 个例子:

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

结论

就数据而言,不是每个人都需要相同的粒度级别;简单和直觉是关键。

密码

用于生成这些图的代码可以在这个 github repo 中找到。

论技术在监管现代化中的作用

原文:https://towardsdatascience.com/on-the-role-of-technology-in-regulatory-modernization-f90a8babbc05?source=collection_archive---------11-----------------------

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

Photo by Giammarco Boscaro on Unsplash

法规挑战

条例是立法权的工具,具有法律效力。它们执行相应法案的意图,这些法案规定了企业必须遵守的要求。为了保护个人消费者的健康、安全和保障以及环境,同时也为了支持一个国家内的商业活动,法规是必要的。然而,它们常常被指责为扼杀创新和商业,因为它们不能有效地应对新的和正在出现的趋势和行业惯例。

当今的监管机构必须平衡申请处理、检查和与利益相关方联络的工作,同时确保法规得到更新以减轻企业负担。面对不断变化的社会经济现实、爆炸性的科技进步和不断变化的行业实践,他们必须做到这一点。随着外部压力越来越大,内部流程越来越复杂,监管机构发现越来越难以分配资源来为公众提供最佳服务。

监管机构的一项重要任务是通过审查法规来寻找那些已经过时到阻碍创新的法规,从而减轻合规性的管理负担。例如,如果一项新的技术创新改变了一个行业内提供产品和服务的机制,那么必须改变原有的法规来应对这一创新。这种监管现代化的缓慢变化可能会给企业带来沉重负担,最终导致上市计划的延迟并降低业务增长。

技术如何实现更好的监管过程?

当您考虑到数量庞大的法规时,法规现代化就成了一项艰巨的任务。监管者在资源如此匮乏的情况下,如何持续跟踪行业变化,审查繁琐和过时的监管规定?

幸运的是,监管机构并非束手无策。今天挑战传统监管的技术也可以提供许多重塑监管流程的机会。如今越来越普及的技术可以帮助监管者更快地进行监管审查,自动化重复性任务,并更快地做出决策。在监管现代化的过程中,人工智能和高级分析可以通过识别监管和外部数据之间的关系,加快探索和审查的过程,在组织数据和自动提供智能见解方面发挥关键作用。

下面,我将重点关注监管现代化的过程,并探讨人工智能在改善监管审查和减轻企业监管负担方面的可能应用。我主要探索自然语言处理和文本分析技术如何使监管者能够从监管中获得洞察力,以识别监管中冲突或重叠的规则,找到监管之间的关系,并检测支持创新的监管方法的标志。在接下来的文章中,我将展示我与 Datadex 团队一起构建的一个分析应用程序,它可以帮助加拿大的联邦监管机构改善监管现代化的过程。

监管现代化以及人工智能等技术如何发挥作用

在使监管者能够实现监管现代化的过程中,具有文本分析和自然语言能力的工具将提供巨大的价值。下面我将讨论它们在语言分析、聚类规则和比较分析中的一些应用。

技术和工业实践的快速变化意味着监管者必须不断更新法规以跟上趋势。今天的监管者正在采取一种新的方法,让监管规则的制定更加灵活。做到这一点的一个方法是确保监管语言本身不会给创新制造障碍。在这种情况下,一种自然语言分析工具将是有用的,它可以使监管者识别旧法规中的指令性语言的使用。例如,在适当的上下文中,可以找到表示强制的“应”和“必须”等词,并用“可以”等词代替。类似的能力将有助于识别表示非常具体或详细的要求的短语,例如监管者随后可以用他们想要实现的结果替换的特定措施或测量。

监管机构之间,甚至是同一个监管机构使用不一致的语言会导致误解。经常会出现这样的情况:在不同的语境中使用的同一种语言被用来解释不同的行为。企业很容易将语言的使用与意义联系起来,从而错误地解释不同的行为/程序。在其他情况下,监管者在相同的上下文中使用不同的词或短语,但意思相似。在这种情况下,企业可能会将这些词解释为具有不同的含义。例如,加拿大交通部的法规经常使用不同的词语来描述类似的行为,如“监视”和“监控”。这种含糊不清的语言使用会导致不遵守。例如,如果监管者能够选择监管文本的一个部分和其中的一个词,并检索具有类似上下文但使用不同词的其他法规中的文本参考,则比较分析将有所帮助。

自然语言分析可以提供的另一个有用的功能是让监管者能够看到不同监管文本之间的差异。展示不同特征的法规文本的视觉比较将使监管者能够看到法规的语言是如何根据工业实践而演变的,并允许监管者采用变化的语言风格来形成更灵活和反应更迅速的法规。这也将有利于老监管者,他们可以将自己的监管文本与新监管者的进行比较。

为了处理大量的监管审查,监管者需要一种按共同特征对监管进行分类的系统方式。这种分组可以发现监管之间的模式和联系,从而帮助监管者找到更好的方法来组织审查并与不同的监管者小组进行协调。一种基于类似特征(如上下文、主题或引用)对法规进行分组的聚类工具,可以使监管者探索法规和业务部门之间的关系。在集群上构建可视化工具将允许监管者以图形方式与法规进行交互,并轻松发现法规之间的关系和重叠,以及具有某个部门或行业特有特征的法规变化。

对于监管者来说,监控关于私营部门受监管方的表现的监管文本信息的变化的结果也是令人感兴趣的。如果可以收集外部来源的信息,并按时间顺序组织这些部门的监管变化,那么监管者就能够研究监管文本变化的影响。文本分析还可以将文本的形式、语言和精神的变化与其对相应部门和公众意见的影响联系起来。当企业违反法规时,由于法律诉讼,法规通常会引起媒体的极大关注。在这种情况下,对于监管者来说,将媒体最关注的词语和短语与法规中的参考文献联系起来是很有价值的。

在起草和咨询阶段,这些能力同样有助于分析公众意见的反馈,帮助监管者确定监管中最受关注的部分。文本分析在不同司法管辖区或国家之间的法规比较分析中也很有用。监管机构如何应对其他国家的产业变革,可以指导一个国家的监管需要如何演变。

随着技术的不断进步,监管机构在制定保护消费者同时确保企业创新和增长的法规时将面临许多挑战。通过以我们在此讨论的方式使用技术,监管机构可以改变他们的工作方式,以确保他们的监管符合当时的最佳实践。为了实现这一愿景,他们必须愿意持续投资发展这些能力,并重新设计他们的工作流程,以找到技术支持的监管现代化的最佳战略。

如果我能帮上什么忙,请不要犹豫,尽管开口。在 LinkedIn 上与我联系,或者给我发一封电子邮件

论 CUDA 围墙花园外的深度学习状态

原文:https://towardsdatascience.com/on-the-state-of-deep-learning-outside-of-cudas-walled-garden-d88c8bbb4342?source=collection_archive---------3-----------------------

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

Photo by Omar Flores on Unsplash

如果你是一名深度学习研究人员或爱好者,并且你碰巧喜欢私下或专业使用 MAC,每年你都会为你的 GPU 获得最新和最令人失望的 AMD 升级。为什么令人失望?因为你得到的是最新最棒的 Vega GPU,当然不使用 CUDA。

什么是 CUDA,为什么这很重要?

CUDA 是 NVIDIA 开发的并行计算平台和编程模型,用于图形处理单元(GPU)上的一般计算。有了 CUDA,开发人员就可以利用 GPU 的强大功能,大幅提高计算应用的速度。

好的。很好。你需要知道的是,这是正在被用来加速人工神经网络(ann)训练的底层核心技术。这个想法是在 GPU 上运行这些计算昂贵的任务,GPU 有数千个优化的 GPU 核心,与 CPU(对不起,英特尔)相比,这些核心对这种任务来说是无限好的。但为什么我不能在我那款花哨的 7k 美元 2019 年年中 Macbook 上运行这款 8 核、基于 HBMI2 的 Vega 20 GPU。原因。也就是说,像 TensorFlow 和 PyTorch 这样的用于训练人工神经网络的流行库并不正式支持 OpenCL。什么是 OpenCL?

OpenCL(开放计算语言)是一种开放的、免版税的标准,适用于个人计算机、服务器、移动设备和嵌入式平台中各种处理器的跨平台并行编程。

基本上是 AMD 在他们的 GPU 中使用的 GPU 加速(CUDA 是 Nvidia 的专有技术!).具有讽刺意味的是,根据这篇文章,基于 Nvidia CUDA 的 GPU 可以运行 OpenCL,但显然不如 AMD 卡高效。这里顺便介绍一些知识:所有这些都是在“图形处理单元通用计算”(GPGPU)的旗帜下运行的,也就是说,如果你的朋友问的话,在 GPU 上运行东西作为主要的计算单元,而不是 CPU。现在回到 CUDA 和 TensorFlow 以及所有其他流行词汇。

以下是两个最流行的深度学习库的 OpenCL 实现状态:

张量流

GitHub 票:https://github.com/tensorflow/tensorflow/issues/22

开放时间:2015 年 11 月 9 日。(这是第 22 期;我们目前在#28961)

Tensorflow 将该问题锁定为“过于激烈”,并于 2019 年 2 月 26 日限制了与合作者的对话。评论 541 条,无受让人。

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

This screenshot of the first 2 entries in the GH ticket describes the status quo.

PyTorch

GitHub 票:https://github.com/pytorch/pytorch/issues/488

开放时间:2017 年 11 月 18 日(实际上它现在已经关闭,带有“需要讨论”标签)

这张票比另一张更理智。以下是来自脸书人工智能研究团队的一位贡献者的声明:

我们官方没有计划任何 OpenCL 工作,因为:

AMD 本身似乎正在向拥有 CUDA transpiler 的 HIP / GPUOpen 发展(他们已经在 transpiling Torch 的后端做了一些工作)。英特尔正在将其速度和优化价值转移到 MKLDNN 中。在适当的情况下,通用 OpenCL 支持的性能比使用 CUDA/HIP/MKLDNN 要差得多。

进一步挖掘,发现期 22.08.2018:

“免责声明:PyTorch AMD 仍在开发中,所以完整的测试范围还没有提供。PyTorch AMD 运行在镭龙开放计算堆栈(ROCm)之上……"

进入 ROCm(radeonpencomputer),这是一个面向 HPC 和“超大规模”计算的开源平台。对此我发现了以下信息:

  • ROCm 包括基于 LLVM 的 HCC C/C++编译器。HCC 支持直接生成原生镭龙 GPU 指令集
  • ROCm 创建了一个名为 HIP 的 CUDA 移植工具,可以扫描 CUDA 源代码,转换成 HIP 源代码。
  • HIP 源代码看起来类似于 CUDA,但编译后的 HIP 代码可以通过 HCC 编译器在 CUDA 和基于 AMD 的 GPU 上运行。

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

这似乎是一个巨大的努力。在这一点上,我不得不祝贺 Nvidia 不仅创造了一项伟大的技术,还创造了一个惊人的(以一种糟糕的方式)对其 GPU 平台的技术锁定。值得称赞。我不明白的是为什么 Google 从一开始就决定不正式支持 OpenCL。没有预算?这让我们回到 Tensorflow GH 问题中的精彩评论和迷因。

所以,基本上在某些时候事情会解决的。也许吧。今天你应该买一个 Nvidia GPU,保持理智。

在你说谁关心你的 Macbook 问题之前——不是这个问题。没有一个理智的人工智能研究者会用 Mac 来做任何严肃的人工智能工作。这是关于这样一个事实,脸书公司和谷歌公司正在推动大块的 DL 开发工作(在工具链方面),已经决定只支持一个专有的 GPU 加速标准,因此只有一个 GPU 卡制造商。我是英伟达的超级粉丝。我也完全了解脸书人工智能研究团队在 GitHub 问题上提出的“CUDA 性能优于 OpenCL”的观点。尽管如此,我认为没有理由不投入一些时间和精力(脸书和谷歌都有)来支持多个 GPU 加速框架。而拥有一个更抽象、更开放的接口,以便将来开发新的 GPU 或者更小众的 DL-acceleration 框架又如何?

我也意识到这两个框架都是开源的,任何人都可以为之做出贡献,但是让我们面对现实吧——这两个框架之所以以目前的状态存在,是因为它们背后有两家公司的官方支持(金钱或其他方式)。只针对专有目标的开源代码不完全是 open open source。我们可以做得更好!

P.S .如果我错过了一些关于 PT/TF 和 AMD 支持的重大新闻,请在下面的评论中写下,我会更新我的文章。我喜欢一些好消息!

来源:

https://developer.nvidia.com/cuda-zone2019 年 5 月 23 日

https://www.khronos.org/opencl/2019 年 5 月 23 日

https://community . amd . com/community/radeon-instinct-accelerators/blog/2018/11/13/exploring-amd-Vega-for-deep-learning,23.05.2019

制造业中的一堂课:自动编码器和黄金单位基线

原文:https://towardsdatascience.com/one-class-learning-in-manufacturing-autoencoder-and-golden-units-baselining-4c910038a4b3?source=collection_archive---------16-----------------------

最近,我一直在与想要加入机器学习潮流的制造业客户(既有 OEM 也有 CM )合作。一个常见的用例是更好地检测生产线上有缺陷的产品(或待测设备 /DUT】)。使用机器学习的术语,这属于二进制分类的问题,因为 DUT 只能通过失败

然而,训练一个需要来自通过和未通过两种情况的样本的二项式分类器被证明是不切实际的。有两个原因。

  1. 不平衡的数据。优化制造工艺,以生产具有高产量的器件,即尽可能少的缺陷。收集历史生产数据时发生的一个典型情况是:获得了大量良好/ 通过的数据,但几乎没有不良/ 未通过的数据。
  2. 代表性不足的缺陷样品。有许多不同类型缺陷会导致失败。一一列举已经很困难了,更不用说从所有样本中收集足够的样本了。另一方面,好的数据通常是相似的,更容易定义。

一个小小的哲学讨论(随意分享你的观点,我对此可能是错误的):借用最优化理论的思想,如果我们将好定义为我们努力追求的全局最优,将缺陷定义为次优样本,那么应该只有一个好的定义和无限多个缺陷(假设一个连续的空间)。当然,在实践中,公差接近全局最优的次优样本被认为是好的(由于世界上不完善的过程)。但是那些非常远的将被认为是有缺陷的。

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

Our depiction of good and bad samples in manufacturing. Good samples are dense, defective samples are sparse.

因此,我们需要找到另一种更适合这种情况的训练模式。理想情况下,新模型必须能够只从好的样本中学习,而拒绝那些看起来与前者大相径庭的有缺陷的样本。一班学习是个不错的人选。

“等等,这听起来很熟悉……不就是用黄金单位做基线吗?”

一个晴朗的下午,一位 T2 六西格玛专家在会议室说道。确实是的!事实证明,一类学习在制造业中并不是一个外来的概念。只是术语不同而已。在质量控制中,工程师通常会收集黄金单位,或已知的良好组件,并对它们进行一些测量(也称为特征工程)。接下来,将根据测量值的分布计算公差极限。一种可以用来计算这种极限的统计方法叫做部分平均测试(由汽车电子委员会出版)。在生产过程中,测量值在限值内的设备将被通过,而在限值外的设备则不合格。

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

Part Average Testing Limit Calculation

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

Part Average Limits applied to distribution of measurement values

下图显示了整个基线化过程。

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

Golden Unit Baselining

特色工程

棘手的部分是决定提取什么特征。传统上,这需要深厚的领域专业知识。因此,预计将有数百种算法部署在生产线上,每种算法都经过精心设计,以识别某些缺陷的存在。机器学习的想法是一直消除这种人工干预,让模型从提供给它的海量数据中发现共性和差异。

尽管如此,不要误解我,这样的“传统”方法实际上是相当准确的。我曾与领域专家合作,他们可以在不到一秒钟的时间内直观地识别某些设备中的缺陷(直到现在我仍然感到惊讶)——他们编写了非常擅长识别这些缺陷的算法。在我看来,机器学习可以作为现有算法的补充。

在本文的其余部分,我将简要概述一门课的学习是如何完成的。我将通过一个被称为自动编码器神经网络的类学习的特定算法实现。然而,我不会深入研究自动编码器的理论。我把它留给另一个帖子。

我们还将假设收集的测量值是图像的形式(例如视觉检查系统)。将使用来自 MNIST 手写数字的虚拟数据集。

基于黄金单位的自动编码器重构误差计算零件平均极限

我们的实验设置是这样的:假设来自好设备的图像看起来像数字 1。因此,在训练期间,我们将只输入数字 1 的图像。为了测试这个模型的有效性,我们将对一组看不见的数字 1(好样本)和数字 2(坏样本)进行测试。假设数字 1 的重构误差将是低的,而数字 2 的重构误差将是高的。如果这是真的,那么我们可以使用重建误差作为一个特征。整个管道绘制如下图(注意与黄金单位基线相似)。

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

One Class Learning

本教程中的大部分代码来自 [Keras 的《自动编码器基础教程](# https://blog.keras.io/building-autoencoders-in-keras.html)。

首先,让我们限制 tensorflow-keras 将消耗的 GPU 资源量。默认情况下,它会尝试保留所有可用的内存。在这种情况下,我们将只占用 40%的可用内存。

import tensorflow as tf
import tensorflow.keras.backend as K"""
Limit GPU memory consumption
"""tfgraph = tf.get_default_graph()with tfgraph.as_default():
    config = tf.ConfigProto(
        intra_op_parallelism_threads=12
    )
    # 0.4 means only 40% of GPU memory will be used
    config.gpu_options.per_process_gpu_memory_fraction = 0.4
    tfSess = tf.Session(config=config)
    K.set_session(tfSess)

之后,我们可以从 Keras 加载 MNIST 手写数字数据集。随后,我们将图像强度值从 0–255 归一化到 0–1。这允许我们在自动编码器的最后一层使用 sigmoid 激活函数(因为输出域也将在 0 和 1 之间)。如果我们坚持输入为 0–255,我们将不得不相应地调整自动编码器的输出,因为默认情况下,没有输出范围为 0–255 的激活函数。

提示:确保您的神经网络的输入和输出具有相同的域。否则无论使用多少个纪元,你的训练损失都不会正确收敛。

# import library dependencies
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist# import mnist dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()# normalization
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))

然后,我们将数据分成好的样本(1 的图像)和坏的样本(2 的图像)。

# get trainData of digit 1 only
trainX, trainY = zip(*filter(lambda x: x[1] == 1, zip(x_train, y_train)))
trainX = np.array(trainX)# get testData of digit 1 only
testGoodX, testGoodY = zip(*filter(lambda x: x[1] == 1, zip(x_test, y_test)))
testGoodX = np.array(testGoodX)

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

Good Samples i.e. images of 1s

# get testData of digit 2 only
testBadX, testBadY = zip(*filter(lambda x: x[1] == 2, zip(x_test, y_test)))
testBadX = np.array(testBadX)

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

Bad Samples i.e. images of 2s

为了简单起见,我们将使用 Keras 中自动编码器的[默认定义。我们在这里做的唯一额外的事情是将编码层展平为中间的 2 神经元瓶颈层。注意,这个选择是任意的。在这个实验中,我没有进行任何超参数搜索,因为我只是想做一个简单的介绍。至于 2-神经元的选择,稍后当我试图在 2D 空间中可视化编码嵌入时,这将是有用的。](# https://blog.keras.io/building-autoencoders-in-keras.html)

# [https://blog.keras.io/building-autoencoders-in-keras.html](https://blog.keras.io/building-autoencoders-in-keras.html)from keras.layers import Input, Flatten, Reshape, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as Kinput_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format# decode
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
# at this point the representation is (4, 4, 8) i.e. 128-dimensional
encoded = MaxPooling2D((2, 2), padding='same')(x)# flatten and compress
shape = K.int_shape(encoded) 
bn = Flatten()(encoded)
bn = Dense(2)(bn)
bnRec = Dense(shape[1] * shape[2] * shape[3], activation='relu')(bn)
encoded = Reshape((shape[1], shape[2], shape[3]))(bnRec)# encode
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)# create encoder
encoder = Model(input_img, bn)
# create autoencoder
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='mse')
autoencoder.summary()

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

Autoencoder Summary

下一步是训练自动编码器模型。我们称之为。fit()函数,并为其提供 1s 的图像。至于验证,我们放 2 的图像。请注意,在反向传播过程中不会考虑验证数据集。我把它放在那里,以便我们可以看到随着训练的进行,1 和 2 的图像之间的重建误差如何发散。

history = autoencoder.fit(trainX, trainX,
                epochs=30,
                batch_size=128,
                shuffle=True,
                validation_data=(testBadX, testBadX))

然后,我们可以绘制 1s(好)和 2s(差)图像在各时期的重建误差。可以观察到,1s 的误差随时间降低,而 2s 保持高电平。这意味着自动编码器已经学会了重建好的图像,它已经用(1s)进行了训练,但没有重建坏的图像(2s)。

# summarize history for loss
plt.figure(figsize=(10, 3))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['good', 'bad'], loc='upper left')
plt.show()

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

Reconstruction Error for Good and Bad Samples over Time

以上误差只是点估计。我们需要看到重构误差的整体分布,以便计算公差极限(例如,部分平均测试极限)。从下面的图表中,我们可以看到,确实差的图像比好的图像具有更高的重建误差。

# predict
predGood = autoencoder.predict(testGoodX)
predBad = autoencoder.predict(testBadX)# reconstruction error
rec1 = np.sum((predGood - testGoodX)**2, axis=(1, 2, 3))
rec2 = np.sum((predBad - testBadX)**2, axis=(1, 2, 3))# histogram
plt.figure(figsize=(10, 5))
plt.subplot(2, 1, 1)
plt.hist(rec1, bins=30, range=(0,300), color='g')
plt.tick_params(axis='x', which='both', bottom=False, top=False, labelbottom=False)
plt.ylabel("count of good images")plt.subplot(2, 1, 2)
plt.hist(rec2, bins=30, range=(0,300), color='r')
plt.xlabel("reconstruction error")
plt.ylabel("count of bad images")plt.show()

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

Reconstruction Error for good (Top) and bad (Bottom) images

我们现在可以计算零件平均极限。遵循黄金单位的基线实验,我们将只使用来自好样本的误差,并相应地计算极限。产生的阈值如下所示。

# Part Average Limit
robustMean = np.median(rec1)
robustStd = (np.quantile(rec1, 0.75) - np.quantile(rec1, 0.25)) / 1.35
PAUL = robustMean + 6 * robustStd
PALL = robustMean - 6 * robustStd# histogram
plt.figure(figsize=(10, 4))
plt.hist(rec1, bins=30, range=(0,300), color='g', alpha=0.5, label='good samples')
plt.hist(rec2, bins=30, range=(0,300), color='r', alpha=0.5, label='bad samples')
plt.xlabel("reconstruction error")
plt.ylabel("count of images")
plt.axvline(x=PAUL, c='b')
plt.axvline(x=PALL, c='b')
plt.legend()
plt.show()

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

Part Average Limit on Reconstruction Error

以下是自动编码器输出的一些好的和坏的图像的例子。我们可以直观地看到,1s 的图像可以很好地重建,而 2s 则不能。有趣的是,自动编码器在 2s 图像上的输出看起来奇怪地类似于 1s。我对此没有理论上的保证,但从经验上看,该模型的解码器部分似乎只学会了构造具有一定变化程度(例如角度和笔画)的 1,而没有学会其他数字。

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

Autoencoder’s reconstruction of good images

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

Autoencoder’s reconstruction of bad images

为了进一步了解解码器如何用不同的笔画和角度构建 1 的图像,我们可以看看自动编码器模型的瓶颈层中产生的编码。我们想看看那里是否有任何建筑。会不会有一些具有特定笔画/角度的图像簇?

由于我们已经将信息压缩到一个 2 神经元层中,我们可以很容易地将每个图像表示为一个 2 维向量,并在 2D 图中可视化它们。

testGoodEncodedX = encoder.predict(testGoodX)
np.shape(testGoodEncodedX)plt.figure(figsize=(8, 8))
plt.scatter(testGoodEncodedX[:,0], testGoodEncodedX[:, 1])
plt.show()

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

2D Scatter Plot of Encoded Images

从分布来看,我们最初怀疑存在具有特定笔划/角度的数字簇似乎是不正确的。也许这个模式看起来更像一个光谱而不是集群?为了形象化这一点,我们可以用它的“原始图像”替换上面图中的每个点。

from matplotlib.offsetbox import AnnotationBbox, OffsetImagefig, ax = plt.subplots(figsize=(20, 20))for x, xEnc in zip(testGoodX, testGoodEncodedX):
    imagebox = OffsetImage(x[:,:,0], cmap=plt.cm.gray)
    ab = AnnotationBbox(imagebox, [xEnc[0], xEnc[1]], frameon=False)                                  
    ax.add_artist(ab)

plt.xlim((testGoodEncodedX[:,0].min(), testGoodEncodedX[:,0].max()))
plt.ylim((testGoodEncodedX[:,1].min(), testGoodEncodedX[:,1].max()))
plt.show()

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

事实上,我们发现在嵌入空间中存在不同程度的 1 的图像。从左上角到右下角,我们可以看到不同的角度范围。同时,在非对角线方向,当我们靠近左下象限时,我们看到更粗的笔画。

结论

我必须首先道歉,我不能使用来自真实生产线的数据集。尽管如此,我希望这个简单的教程能让你更好地理解一个类学习和黄金单位基线在实践中是多么的相似。我提供了一个简单的 python 代码演练,以展示我们通常在实践中分析的一个类学习的各个方面。

免责声明:在处理过来自真实工厂车间的数据后,我可以证明现实比这个简单的 1 和 2 的图像样本要混乱得多。需要做大量的预处理工作。此外,并非所有的数据标签都是可信的——因为这些标签是由人工标注的,所以可能会因不一致而出现错误。尽管如此,基本概念保持不变。

一键编码使你的基于树的集合变得更糟,这是为什么?

原文:https://towardsdatascience.com/one-hot-encoding-is-making-your-tree-based-ensembles-worse-heres-why-d64b282b5769?source=collection_archive---------2-----------------------

优化基于树的模型

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

Photo by Marita Kavelashvili on Unsplash

我是弗吉尼亚大学数据科学专业的一名硕士学生,正在从事许多机器学习项目。每周,我都会解决一个我在项目中遇到的问题以及一个可行的解决方案。

大多数真实世界的数据集是分类变量和连续变量的混合。虽然连续变量很容易适应所有的机器学习模型,但分类变量的实现在不同的模型和不同的编程语言中有很大的不同。例如,R 使用一种称为 factor 的变量类型处理类别,这种类型可以完美地适应所有模型,而 Python 则要求您将类别转换成标签编码,以便模型工作。Python 是我选择的编程语言,我经常对分类变量进行某种编码。一般来说,一个热编码为模型提供了更好的数据分辨率,大多数模型最终表现更好。事实证明,并非所有模型都是如此,令我惊讶的是,对于具有高基数分类变量的数据集,随机森林的表现一直较差。

测试设置

作为科比·布莱恩特的粉丝,我决定使用他的投篮选择数据来建立一个模型,以预测在特定情况下一个投篮是否会命中。基于特征重要性分析,很明显描述射击类型的两个变量在预测给定射击的结果中是最重要的,并且两个变量都是分类的。我在数据集上用标签编码(假设有顺序)和一键编码运行随机森林,结果几乎是一样的。事实上,是否有顺序似乎并不重要。

模特们表现如何?

除了预测的准确性,我还使用了模型的对数损失进行比较,因为这是 Kaggle 比赛的评估标准。

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

Snapshot of Performance

我们通常认为一键编码可以改进模型,但是正如截图所示,采用一键编码的模型比没有采用一键编码的模型性能要差得多。一键编码使对数损失减少了 0.157 个单位。Kaggle 竞赛的获胜者是由最轻微的利润决定的,0.05 的偏差可能是排行榜上前 75%和前 25%之间的差异。既然我们已经确定了一键编码使模型变得更糟,那么让我们检查一下为什么会发生这种情况的原因。

为什么会出现这种情况?

为了理解这一点,让我们进入基于树的模型的内部动态。对于每个基于树的算法,都有一个子算法用于根据要素和值将数据集分割成两个条柱。分割算法考虑所有可能的分割(基于所有特征和每个特征的所有可能性值),并根据标准找到最佳分割。我们将不会进入该标准的细节(有多种方式来做到这一点),但是定性地说,该标准帮助子算法选择使箱的杂质最小化的分裂。纯度是分类问题中特定箱中阳性或阴性样本数量的代表。我发现了一个非常有用的形象化方法,可以帮助我理解这个概念。

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

Dense Decision Tree (Model without One Hot Encoding)

如果选择一个连续变量进行分割,那么树可以分割的值将有很多选择,并且在大多数情况下,树可以向两个方向生长。从包含大部分连续变量的数据集得到的树看起来像左边图中的东西。

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

Sparse Decision Tree (Model with One Hot Encoding)

在这种情况下,分类变量自然处于劣势,并且只有很少的分裂选项,这导致决策树非常稀疏。在只有少量级别的变量中,情况会变得更糟,而一次性编码属于只有两个级别的类别。这些树通常倾向于向一个方向生长,因为在分类变量的每个分裂处只有两个值(0 或 1)。该树在虚拟变量中向零的方向生长。如果这没有意义,请密切关注下面的例子。

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

Dataset A with Dummy Variables

例如,考虑以下数据集,该数据集包含具有级别 A、B、C 和 d 的
分类变量的虚拟变量。如果我们要为该数据拟合一个决策树,以便理解拆分,它将类似于以下内容。

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

Decision Tree for Dataset A

总之,如果我们有一个 q 水平的分类变量,树必须从((2^q/2)-1)分裂中选择。对于一个虚拟变量,只有一个可能的分裂,这导致稀疏。

对模型性能的影响

既然我们已经理解了为什么带有虚拟变量的数据集的决策树看起来像上图,我们可以深入理解这如何影响预测准确性和其他性能指标。

  1. 通过对分类变量进行一次性编码,我们在数据集内引入了稀疏性,这是不希望的。
  2. 从分裂算法的角度来看,所有虚拟变量都是独立的。如果树决定在虚拟变量中的一个上进行分裂,每次分裂的纯度增益是非常小的。因此,树不太可能选择一个更接近根的虚拟变量。

验证这一点的一种方法是检查两个模型的特性重要性,看看哪些特性最重要。

特征重要性

尽管提供了更好的性能,但是基于树的模型具有轻微受损的声誉,主要是因为它的可解释性,这是由于计算特征重要性的方式而产生的。大多数树集成中的特征重要性是基于重要性分数来计算的。重要性分数是对特征被选择用于分裂的频率以及作为选择的结果获得了多少纯度的度量。

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

最重要的特性是 action_type,它是一个高基数的分类变量,显然比它前面的变量重要得多。为了提供一些上下文,我使用了 one-hot 编码 action_type 和 combined_shot_type,它们都是高基数分类变量。显然,虚拟变量增加了数据集的维数,维数灾难开始起作用,并产生了下面的特征重要性图表。这显然是无法解释的。

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

为了放大视角,我决定看看对预测影响最大的前 15 个特征。

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

当我们检查上面的图表时,很明显,只有一个虚拟变量出现在前 15 位,并且也出现在第 14 位,这验证了我们关于分裂变量选择的假设。一次性编码还模糊了编码中不涉及的特征的重要性顺序,这使得模型效率低下。

链接到 Github

基数大的一次性编码分类变量会导致基于树的集成效率低下。算法将给予连续变量比虚拟变量更大的重要性,这将模糊特征重要性的顺序,导致较差的性能。

额外阅读

  1. 可视化—http://www.r2d3.us/visual-intro-to-machine-learning-part-1/
  2. 教科书—https://web.stanford.edu/~hastie/ElemStatLearn//
  3. 参与讨论—https://www.kaggle.com/c/zillow-prize-1/discussion/38793
  4. 所有类型的编码摘要—https://medium . com/data-design/visiting-categorial-features-and-Encoding-in-decision-trees-53400 fa 65931

一次性编码、多重共线性和虚拟变量陷阱

原文:https://towardsdatascience.com/one-hot-encoding-multicollinearity-and-the-dummy-variable-trap-b5840be3c41a?source=collection_archive---------0-----------------------

本文讨论了由多重共线性问题引起的虚拟变量陷阱

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

到目前为止,我在机器学习方面的每个新话题都有一些我从未见过的东西。但这不仅仅是看不见的话题,而是我曾经经历过的话题有一些我忘记了的东西。虚拟变量陷阱就是这样一个细节,我完全忘记了它的存在,直到 3-4 个月前我回去做分类器。

在开始虚拟变量陷阱的确切内容之前,我们需要熟悉一些术语。正式的定义可以在谷歌上搜索,所以我将写下一个非正式的描述,这对于本文的上下文来说应该足够了。

分类变量

范畴变量是那些可以从有限集合中取值的变量。对于这样的变量,它们所占据的值可以具有内在的顺序(例如,速度:{低,中,高} )。这样的变量被称为有序分类变量。另一方面,一些分类变量可能没有任何内在排序(例如,性别:{男性,女性} )。这样的分类变量称为名义分类变量。

如果您知道将分类变量编码成数字的常见做法,您就会知道通常建议对它们进行 One-hot-encoded。有两个原因:

  1. 大多数机器学习算法不能直接处理分类变量,它们需要转换成数字。
  2. 即使我们找到了一种直接处理分类变量而不把它们转换成数字的方法,我们的模型也会偏向我们使用的语言。例如,在动物分类任务中,如果标签是{‘rat ‘,’ dog ‘,’ ant’},那么使用这样的标签方法将训练我们的模型只预测英语标签,这将对模型的可能应用施加语言限制。

为了解决这些问题,我们可以将分类变量值编码为数字,如下所示:

案例 1:

序数分类变量速度(如上所述)可以编码为:

{ ‘低’:1,‘中’:2,‘高’:3}。

案例二:

对于动物分类任务(如上所述),标签变量是一个名义分类变量,可以编码为:

{ ‘老鼠’:1,‘狗’:2,‘蚂蚁’:3}。

我们先讨论案例 2:

这里有一个主要的问题——动物分类问题中的标签不应该被编码成整数(就像我们上面所做的那样),因为那样会强制执行明显不正确的自然排序:【大鼠】<【狗】<【蚂蚁】。虽然我们知道不存在这样的排序,并且数字 1、2 和 3 在我们编码的标签中不包含任何数字排序,但我们的机器学习模型将无法直观地理解这一点。如果我们将这些数字直接输入模型,成本/损失函数很可能会受到这些值的影响。我们需要用数学方法来模拟我们的这种理解。我们就是这样做的。

案例 1:

速度是一个序数变量。我们可能会认为关系:*【低】<【中】<【高】是有道理的,因此,使用标签 1、2 和 3 应该不是问题。不幸的是,事实并非如此。使用标签 100、101 和 300000 代替 1、2 和 3 仍然具有与’’、和’’相同的关系。用 1,2,3 没什么特别的。换句话说,我们不知道‘中速’的速度比‘低速’的速度大多少,也不知道它比‘高速’的速度小多少。这些标签之间的差异可能会潜在地影响我们训练的模型。因此,我们可能还想对变量‘speed’*进行一次热编码。

在这一点上,我希望我们理解分类变量是什么,以及为什么我们想要对它们进行一次性编码。

多重共线性

当数据集中的两个或多个独立变量(也称为要素)相互关联时,就会出现多重共线性。我们可以使用几种方法来测量双变量情况下的相关程度和方向(更多信息相关测量),而多重共线性通常使用方差膨胀因子来测量(更多信息多重共线性测量)。简而言之,当独立变量彼此(几乎)线性相关时,就说数据集中存在多重共线性。

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

Fig. 1. Perfect Multicollinearity (perfect linear dependence between x_i and other independent variables)

如图 1 所示的情况。被称为完美多重共线性。同样,我们也有不完全多重共线性的情况,其中一个或多个高度线性的关系可能是我们所关心的。这些会直接影响线性回归分析(有关这方面的更多信息,请参考这些课堂讲稿)。然而,我们将从任何通用机器学习算法的角度来讨论它们的影响。

在这一点上,我希望我们理解什么是多重共线性。

Python 中的 OneHotEncoding

在我们进入本文的最后一部分之前,让我们看看如何对分类变量进行编码。

One-hot-encoder 为分类列的每个唯一值返回一个向量。每个这样的向量只包含一个’ 1 ,而向量中的所有其他值都是’ 0 '(参见下面的图 4),因此命名为one-hot-编码器。

可能,也应该有你选择的语言的包,但是因为我一直在用 Python 做所有机器学习和数据科学相关的东西,所以我只包括来自 Python 控制台的片段。在下面的讨论中,我将引用 Python 的 pandas 库的流行昵称,将*‘PD’*和 numpy 称为’NP’。

我用的是自制的 pd。DataFrame 对象看起来像:

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

Fig. 2. An example pandas.DataFrame object

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

Fig. 3. Datatypes of respective columns

速度是分类变量,而数值列是非分类列。

假设我们正在进行一个项目,我们决定对“速度”列进行一次热编码。

方法一:pd.get_dummies

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

Fig. 4. pd.get_dummies returns a dataframe with one-hot-encoded columns

pd.get_dummies ( 文档 ) 返回一个包含 one-hot-encoded 列的新 dataframe。我们可以观察到并不是所有的列都被编码了。这是因为,如果没有任何列被传递给 pd.get_dummies 以告知哪些列要进行 one-hot-encoding,则默认情况下,它采用数据类型为*‘object’的列。然后对它们进行编码,并返回一个新的 dataframe,用新的列替换旧的分类列。*在图 3 中,我们可以看到“速度”列属于类型“对象”。图 4。显示该列在返回的数据帧中不再存在,并且已被新列替换。我们还可以观察到’’已经映射到一个向量:*低->**【0,1,0】,*类似地,中->【0,0,1】高->【1,0,0】。请注意,每个向量中只有一个“1”。还要注意,每个向量都是三维的。这是因为’速度’有三个唯一值。事实上,独热向量的维数等于分类列在数据集中所占的唯一值的数目。这里,编码已经完成,因此在向量的第一个位置 1 表示’速度=高’,在第二个位置 1 表示’速度=低’等等。

方法二:sk learn . preprocessing . onehotencode

我更喜欢使用sk learn . preprocessing . onehotencode而不是 pd.get_dummies 这是因为sk learn . preprocessing . onehotencode返回了sk learn . preprocessing . onehotencode类的一个对象。我们可以将这个对象放在训练集上,然后使用同一个对象来转换测试集。另一方面, pd.get_dummies 返回一个数据帧,其编码基于我们传递给它的数据帧中的值。这对于快速分析来说可能是好的,但是对于一个扩展的模型构建项目,你在训练集上训练,然后在测试集上测试,我建议使用sk learn . preprocessing . onehotencoder

使用sk learn . preprocessing . onehotencoder不像使用 pd.get_dummies 那么简单。我们可以在下面的图 5 中看到这一点。

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

Fig. 5. One-hot encoding using sklearn.preprocessing.OneHotEncoder

您可能已经注意到,我们首先使用 LabelEncoder 对分类列进行了整数编码。这是因为 OneHotEncoder 要求分类列包含数字标签。 fittransform 方法需要传递形状为 (m,n)np.array 对象。最后, fit 方法返回一个 OneHotEncoder 对象,该对象适用于传递给它的数据。这个过程是漫长的,但是你最终得到了一个合适的对象,它可以在以后的测试集中使用。Scikit-learn 提供了一个方法 fittransform-fit _ transform的组合版本,有助于减少一两行代码(参见文档)。

虚拟变量陷阱

虚拟变量陷阱直接体现在应用于分类变量的一键编码中。如前所述,独热向量的大小等于分类列所占的唯一值的数量,并且每个这样的向量中恰好包含一个“1”。这将多重共线性引入我们的数据集。从图 4 中的编码数据集(其等同于图 5 中的编码数据集),我们可以观察到以下线性关系(图 6):

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

Fig. 6. Perfect Multicollinearity after one-hot encoding

图 6 是完全多重共线性的情况。我们用来编码分类列的向量被称为’虚拟变量’。我们打算解决使用分类变量的问题,但是被多重共线性的问题困住了。这被称为虚拟变量陷阱。

如前所述,这会直接影响线性回归分析,因为线性回归假设数据集中不存在多重共线性。然而,它也提出了机器学习任务中的一些其他问题。比方说,我们在数据集上训练一个逻辑回归模型。我们期望我们的模型学习以下等式的权重:

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

Fig. 7. Sigmoid function

特别是,对于我们数据集中的要素,以下是逻辑回归将学习的权重:

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

并且特征向量 X 是:

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

显然,sigmoid 函数分母中指数函数的幂实际上影响了 y_hat 的值,并且包含可训练的权重。这个表达式实际上扩展为:

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

Equation- 1: Expanding the power term in sigmoid function

根据图 6 中的关系,我们可以将三个自变量中的任何一个用另外两个来表示,让我们以 LHS 的 speed_lowspeed_mediumspeed_high: 来表示

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

Equation-2: Expressing speed_low in terms of speed_medium and speed_high

为什么不好?

正如我们前面讨论的,这对于线性回归问题有直接的影响。因此,以下是对所有算法通用的问题的总结。

  1. 我们可以用等式-2 中的值替换等式-1 中的 speed_low 。这实际上意味着(至少)我们正在使用的一个特征是多余的-该特征可以是三个特征中的任何一个,因为方程-2 可以用 LHS 中的任何一个来编写。所以,我们让我们的模型学习一个不需要的额外重量。这消耗了计算能力和时间。这也给出了一个优化目标,该目标可能不太合理,并且可能难以实现。过多的自变量也可能导致维度 y 的诅咒。如果多重共线性也随之而来,事情会变得更糟。
  2. 我们不仅希望我们的模型预测准确,还希望它是可解释的。例如,逻辑回归被期望学习对应于相对更重要的特征的相对更高的权重值。更重要的特征对最终预测的影响更大。但是如果特性是相关的,那么就很难判断哪个特性在最终决策中更有“发言权”,因为它们的值实际上是相互依赖的。这会影响权重的值。换句话说,权重不仅取决于自变量与因变量的相关性,还受到自变量之间相关性的影响。例如,如果 speed_high 的值比其他值高,那么 speed_lowspeed_medium 必须更低,使得总和总是 1。我们假设*重要性(speed_high ) =重要性(speed_medium) =重要性(speed_low)。*但是由于 speed_high 的值比其他自变量的值高,因此与之对应的学习权重将比其他两个低得多。实际上,我们希望它们各自的权重(几乎)相等。

因为一次热编码直接导致完美的多重共线性,所以我们从编码的要素中删除其中一列。例如,在这种情况下,我们可以选择删除 speed_medium ,但这种选择完全是任意的。

下面是我们如何处理这个问题(删除其中一个编码列):

  1. 当我们使用 pd.get_dummies 时,我们可以传递一个额外的参数,drop _ first = True(documentation)来删除编码后得到的第一个新列(也称为第一个虚拟变量)(图 7):

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

Fig. 7. drop_first=True

将图 7 中返回的数据帧与图 4 中得到的输出进行比较。我们发现 speed_high 从编码数据帧中被删除。不使用 drop_first=True 会让 sklearn 使用该参数的默认赋值,即 False

2.当我们使用sk learn . preprocessing . OneHotEncoder并想要删除其中一个新列时,我们传递 OneHotEncoder 类的参数 drop=‘first’ 构造函数(文档)。 然而,这似乎并不支持所有版本的 sklearn(我得到了一个错误,因为我的 sk learn . preprocessing . onehotencoder 版本不支持‘drop’参数),所以您可能需要更新 python 包,然后才能在您的系统上使用它 。虽然您可以通过手动写入一两行来手动删除其中一个虚拟变量(图 8),但如果您有多个分类列,并且每个分类列中有太多要处理的类别,则可能很难跟踪对数据框架所做的更改。

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

Fig. 8. Manually dropping one of the dummy variables

转换(或者, fit_transform )返回的 dataframe 在所有其他列之前添加新列(图 8)。因此,为了删除第一列,我们可以使用数组切片,如图 8 所示。然而,如前所述,这样做可能会变得笨拙。

结论

我希望这篇文章能够对多重共线性、一次性编码和虚拟变量陷阱进行全面的描述。这篇文章完全基于我的个人经验,事实来自可靠的来源(在每个这样的概念旁边已经提到了链接)。所以,如果你在文章中发现任何不一致的地方,请在下面评论。您的反馈将有助于我更好地写作和描述。期待收到你的来信。

谢谢你。

用 Miptools 进行一分钟 CT 预处理

原文:https://towardsdatascience.com/one-minute-ct-preprocessing-with-miptools-8f8c3436c302?source=collection_archive---------22-----------------------

如何高效地预处理用于深度学习的 CT 图像

让我们面对它,医学图像处理是具有挑战性的。今天的医学成像机器能够产生具有大量信息的大量图像。然而,从图像中提取这些信息需要对成像技术有深入的理解。作为一名研究医学图像处理和机器学习的研究生,我发现除了众所周知的pydicomNiBabel之外,缺乏好的医学图像预处理库。我最近参加了 RSNA 颅内出血检测比赛,这提醒了我图像预处理质量的重要性。

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

Photo by Harlie Raethel on Unsplash

这是一个未经任何预处理的正常脑部 CT 图像示例:

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

大脑在哪里?灰质/白质在哪里?显而易见(没有双关语),可视化的 CT 缺少一些重要信息。他们没有出现的真正原因是因为我们错过了可视化之前的一个非常重要的步骤。当放射科医生查看 CT 图像,特别是脑部 CT 扫描时,他们的清单上最重要的项目之一就是开窗。人类只能感知范围从 0 到 255 的灰度(我想比 50 多一点),而 CT 扫描的 Hounsfield 单位(HU)范围从-1000 到+2000。我不打算在本教程中深入描述胡的转变过程,但如果你感兴趣,这里有一篇关于胡的有用的文章

为了正确显示 CT 扫描,使用窗口将 HU 数转换为灰度值。用miptools很容易做到这一点:

第一次开窗是简单的元数据开窗,可以通过设置windowing='simple'来指定。这会提取 DICOM 文件的窗口中心和宽度,并相应地将图像裁剪到指定的范围。我们转换后的图像应该是这样的:

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

现在我们至少可以在图像中看到大脑了,对吧?我们还可以通过 bsb(大脑、硬膜下、血液)窗口将更多信息编码到我们的转换图像中。这听起来可能很复杂,但我们只是将我们的图像转换为 3 个窗口:大脑窗口(中心:40,宽度:80),硬膜下窗口(中心:80,宽度:200)和骨窗口(中心:600,宽度:2000)。最后,我们把 3 个窗口连接起来,作为我们变换后的图像的 3 个通道。执行代码片段中的第 7 行应该会产生下图:

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

上面显示的图像是用 bsb 窗口转换的。尽管它看起来只是我们元数据转换图像的红色版本,但它编码了更多信息,可能更适合深度学习目的。回想一下,彩色图像可以表示为三维阵列。我们能放入这 3 个维度的信息越多,我们的深层网络就能从我们的训练图像中提取和学习越多。

我们可以使用的另一种预处理技术是重采样。特定的扫描可能具有像素间距[0.5, 0.5],而另一个患者的扫描可能具有像素间距[0.8, 0.8]。保持像素间距一致很重要,否则我们的网络可能很难推广。

通过指定resampling=True,我们可以用一行代码将像素间距重采样为[1, 1]。使用带有重采样的简单元数据窗口会得到以下图像:

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

医学图像处理中有很多先进的技术,但为了简单起见,我不会在本教程中一一介绍。如果你喜欢阅读这篇文章,请查看并启动我的 miptools 源代码库。我保证在不久的将来会增加更多的功能,因为我现在在学校很忙。

一个神经网络,多种用途

原文:https://towardsdatascience.com/one-neural-network-many-uses-image-captioning-image-search-similar-image-and-words-in-one-model-1e22080ce73d?source=collection_archive---------9-----------------------

使用单一模型构建图像搜索、图像标题、相似文字和相似图像

众所周知,神经网络确实擅长一项狭窄的任务,但它们无法处理多项任务。这与人脑不同,人脑能够在惊人不同的任务中使用相同的概念。例如,如果你以前从未见过分形,我现在就给你看一个。

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

This beauty is courtesy math. (via https://fractalfoundation.org/)

看到分形的图像后,你将能够处理与之相关的多项任务:

  • 在一组图像中,区分分形和猫
  • 在一张纸上,大致画出分形的样子(它不会很完美,但也不会是随意的涂鸦)
  • 将类似分形的图像与非类似分形的图像进行分类(你可以自动将图像从最相似到最不相似进行分类)
  • 闭上眼睛,想象分形是什么样子的(即使没有视觉输入,你仍然可以在一次曝光后想象它。多酷啊!)

你是如何完成所有这些任务的?在你的大脑中有专门的神经网络专门处理所有这些任务吗?

现代神经科学表明,答案是你大脑中的信息在不同部分之间共享和交流。具体是如何做到的是一个研究领域,但我们有一些关于这种多任务性能可能如何发生的线索。答案可能在于数据在神经网络中是如何存储和解释的。

奇妙的表现世界

顾名思义,表示就是信息在网络中的编码方式。当一个单词、一个句子或一幅图像(或者其他任何东西)被作为输入提供给一个经过训练的神经网络时,随着权重乘以输入和激活的应用,它会在连续的层上进行转换。最后,在输出层,我们得到数字,我们解释为类标签或股票价格或网络训练的任何其他任务。

这种输入->输出的神奇转换是由于连续层中发生的输入转换而发生的。这些输入数据的转换被称为表示。一个关键的想法是每一层都让下一层的工作变得容易。使连续层的寿命更容易的过程导致激活(特定层的输入数据的转换)有意义的

我说的有意义是什么意思?让我们看一个图像分类器不同层激活的例子。

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

图像分类网络所做的是将像素空间中的图像转换到越来越高的概念空间。因此,以 RGB 值表示的汽车图像将开始在第一层的边缘空间中表示,然后在第二层的圆形和基本形状空间中以及在预最终层中,它将开始在高级对象中表示,如车轮、门等。

这种越来越丰富的表现形式(由于深层网络的等级性质而自动出现)使得图像分类的任务变得微不足道。最后一层要做的就是权衡轮子和门的概念,使之更像汽车,耳朵和眼睛更像人。

你能对陈述做什么?

因为这些中间层存储了输入数据的有意义的编码,所以您可以将相同的信息用于多个任务。例如,你可以用一个语言模型(一个被训练来预测下一个单词的递归神经网络)来解释特定神经元的激活,以预测句子的情绪。

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

(via Unsupervised Sentiment Neuron)

令人惊讶的事实是,情感神经元在无监督的语言建模任务中自然出现。(参见这篇教程中的精彩评论)。网络被训练来预测下一部作品,在任务中我们没有要求网络预测情绪。也许情感是一个非常有用的概念,网络发明它是为了在语言建模方面做得更好。

一旦你得到表示的想法,你将开始以完全不同的眼光看待深层神经网络。你将开始感觉到表征是一种可转移的语言,它使不同的网络(或同一网络的不同部分)相互交谈成为可能。

通过构建四位一体的网络来探索表征

为了充分理解什么是表示,让我们建立我们自己的深度神经网络,它做四件事:

  • 图像标题生成器:给定一幅图像,为其生成标题
  • 相似词生成器:给定一个词,找出与其相似的其他词
  • 视觉相似图像搜索:给定一幅图像,找出与其最相似的图像
  • 描述图像内容搜索:搜索包含文字描述内容的图像

这里的三个任务中的每一个本身都是一个项目,传统上需要三个模型。但是我们将使用一个型号来完成所有这些任务。

代码将用 Pytorch 写在 Jupyter 笔记本上。你可以从这个库下载。

→ Github 库:【https://github.com/paraschopra/one-network-many-uses】T2ⅲ

第一部分—图像字幕

网上有很多很好的教程来实现图像字幕,所以我不打算深入讲解。我的实现与本教程中的完全相同:构建一个自动图像字幕应用。关键的区别在于,我的实现是在 Pytorch 中,而本教程使用的是 Keras。

要继续学习,您需要下载 Flickr8K 数据集。填写这张表格,你会在你的邮箱里收到一个下载链接。(还有一个直接链接下载 1GB 的 Flickr8K 数据集,虽然我不确定它会像那样保持多久)。将 zip 文件提取到笔记本所在目录下的“Flicker8k_Dataset”文件夹中。你还需要从这里下载字幕。提取文件夹“caption_datasets”中的标题。

型号

图像字幕大致有两个组成部分:a)图像编码器,它获取输入图像,并以对字幕有意义的格式表示它;b)字幕解码器,获取图像表示并输出其文本描述。

图像编码器是深度卷积网络,而字幕解码器是传统的 LSTM/GRU 递归神经网络。当然,我们可以从头开始训练这两者。但是这样做将需要比我们现有的更多的数据(8k 图像)和大量的训练时间。因此,我们将采用一个预先存在的图像分类器,并使用它的预最终层激活,而不是从头开始训练图像编码器。

这是你将在本帖中看到的许多神奇的表示示例中的第一个。我采用了在 ImageNet 上训练的可用于 PyTorch modelzoo 的盗梦空间网络来对 100 个类别的图像进行分类,并使用它来给我一个可以输入到递归神经网络中的表示。

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

via https://daniel.lasiman.com/post/image-captioning/

请注意,盗梦空间网络从未接受过图像字幕任务的培训。然而,它工作了!

就像我在我的通过机器学习帖子中所做的那样,我们也可以为字幕解码器使用预先训练的语言模型。但是这一次,因为我重新实现了教程中的一个运行良好的模型,所以我简单地跟随并从头开始训练了一个解码器。

完整的模型架构如下所示:

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

Image via https://daniel.lasiman.com/post/image-captioning/

你可以从头开始训练模型,但这需要在 CPU 上花几天时间(我还没有为 GPU 优化)。但是不要担心!我的笔记本电脑度过了不眠之夜,所以你可以享受已经训练好的模型的成果。(如果你是从零开始训练,请注意,当运行平均损失大约为 2.8 时,我在大约 40 个时期停止了训练)

表演

我已经实现了性能良好的波束搜索方法。以下是网络为来自测试集的图像生成的标题示例(它以前从未见过它们)。

让我们看看网络对我自己照片的说明:

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

还不错!令人印象深刻的是,该网络知道该图像包含一名身穿白色 t 恤的男子。语法有点问题(我相信多训练可以解决),但基本要点是好的。

如果输入图像包含网络从未见过的东西,它往往会失败。比如我很好奇网络会给 iPhone X 的一张图片贴什么标签。

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

它做得不太好。但总的来说,我对性能相当满意,这为我们使用 network 在学习为图像添加标题时开发的表示来构建其他功能提供了良好的基础。

第二部分—相似词

回想一下我们如何从图像表示中解码标题。我们将该表示输入 LSTM/GRU 网络,生成输出,将其解释为第一个单词,然后将第一个单词反馈给网络,以生成第二个单词。这种情况一直持续到网络生成一个表示句子结束的特殊标记。

为了将单词反馈到网络中,我们需要将单词转换成表示,这些表示成为网络的输入。这意味着,如果输入层由 300 个神经元组成,对于所有标题中 8000 多个不同单词中的每一个,我们需要有 300 个相关联的数字来唯一地指定该单词。将字典中的单词转换成数字表示的过程被称为单词嵌入(或单词表示)。

我们可以下载和使用像 word2vec 或 GLoVE 这样预先存在的单词嵌入。但是在目前的情况下,我们从零开始学习单词 embedding。我们从随机生成的单词嵌入开始,并探索在训练完成时我们的网络已经学习了关于单词的什么。

由于我们无法可视化 100 维的数字空间,我们将使用一种叫做 t-SNE 的奇妙技术来可视化二维的单词嵌入。t-SNE 是一种降维技术,它试图使高维空间中的邻居在低维空间中仍然是邻居。

单词嵌入的可视化

说够了。让我们看看字幕解码器学习的单词嵌入空间(不像其他语言任务有数百万个单词和句子,我们的解码器在训练数据集中只看到了大约 30k 个句子)。

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

因此,我们的网络已经了解到,像“play”、“plays”和“playing”这样的词是非常相似的(它们有相似的表示,这从带有红色箭头的紧密聚类中可以明显看出)。让我们探索 2D 空间的另一个领域:

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

这个区域似乎有成群的数字——“二”、“三”、“四”、“五”等等。另一个:

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

它知道人和孩子是相似的。此外,它还隐含地推断出物体的形状。

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

类似的话

我们可以使用 100 维表示来构建一个函数,该函数建议与输入单词最相似的单词。它的工作原理很简单:取 100 维的表示,找到它与数据库中所有其他单词的余弦相似度。

让我们来看看与单词‘boy’最相似的单词:

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

还不错。“骑手”是一个例外,但“孩子”、“小孩”和“蹒跚学步的孩子”是正确的。网络认为什么和‘追’这个词相似:

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

“追逐”很好,但我不知道为什么它认为“警察”与追逐相似。

词语类比

关于单词 embeddings 的一个令人震惊的事实是,你可以对它们进行演算。你可以用两个词(比如“国王”和“王后”)减去它们的表示来得到一个方向。当你将这个方向应用到另一个单词表征(比如“男人”)时,你会得到一个接近实际的类似单词(比如“女人”)的表征。这种魔力就是 word2vec 推出时如此出名的原因:

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

via https://www.tensorflow.org/images/linear-relationships.png

我很好奇字幕解码器学习到的表现是否也有类似的特性。即使我因为训练数据不多(约 30k 句)而持怀疑态度,我还是试了一下。

网络学习到的类比并不完美(有些单词字面上是为<10 times, so network didn’t have enough info to learn). I had to squint my eyes but it sort-of found analogies.

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

If riding is to sitting, what would walking correspond to? My network things it would be ‘laying’ (which is not bad!).

Similarly, 出现的,如果‘男人’的复数是‘男人’,那么‘女人’的复数是什么:

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

第二个结果是“女人”,相当不错。

最后,如果草是绿色的,天空会是什么颜色:

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

网络认为是银色或者灰色,都不是蓝色但是都是颜色。令人惊讶的是,网络能够推断颜色的方向。

第三部分—相似图像

如果单词表示将相似的单词聚集在一起,那么图像表示呢(Inception powered image encoder 输出的图像表示)。我将相同的 t-SNE 技术应用于图像表示(300 维张量,作为字幕解码器第一步的输入)。

可视化

这些点代表不同的图像(我没有拍摄完整的 8K 图像,但它是大约 100 张图像的样本)。红色箭头指向附近的一组制图表达。

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

所以,赛车聚集在一起。

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

在类似森林/草地的地方玩耍的孩子也是如此。

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

篮球运动员聚集在一起。

寻找与输入图像相似的图像

对于相似单词任务,我们被限制在我们的测试集词汇中寻找相似的单词(如果一个单词不存在于测试集中,我们的字幕解码器不会学习它的嵌入)。然而,对于相似图像任务,我们有一个图像表示生成器,它将接受任何输入图像并生成其编码。

这意味着我们可以使用余弦相似度方法来构建按图像搜索的功能,如下所示:

  • 步骤 1:获取数据库或目标文件夹中的所有图像,并存储它们的表示(由图像编码器给出)
  • 步骤 2:当用户想要搜索与他已经拥有的图像看起来最相似的图像时,获取新图像的表示,并在数据库中找到最接近的图像(由余弦相似度给出)

谷歌图片很可能使用这种(或非常相似的)方法来增强他们的反向图片搜索功能。

让我们看看我们的网络做得怎么样。我在果阿度假时点击了下面这张照片。(PS:我爱果阿!)

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

注意,这个图像是我自己的。我们正在使用的模型从未见过它。当我查询与此类似的图像时,网络从 Flickr8K 数据集中输出以下图像:

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

这难道不令人兴奋吗?我没想到会有这么好的表现,但是我们做到了。深度神经网络好得不可理喻

第四部分-通过描述来搜索图像

在最后一部分,我们反向运行图像标题生成器。因此,我们输入一个标题(文本描述)并找到最匹配的图像,而不是获取一个图像并为其生成标题。

听起来好得难以置信?其实不是。我们是这样做的:

  • 第一步:不用来自编码器的 300 维图像表示,从一个完全随机的 300 维输入张量开始
  • 步骤 2:冻结整个网络的所有层(即指示 PyTorch 不要计算梯度)
  • 步骤 3:假设随机生成的输入张量来自图像编码器,并将其输入字幕解码器
  • 步骤 4:获取网络在给出随机输入时生成的标题,并将其与用户提供的标题进行比较
  • 步骤 5:比较生成的字幕和用户提供的字幕,计算损失
  • 步骤 6:为输入张量寻找最小化损失的梯度(即,300 维数字中的每一个应该在哪个方向上改变以及改变多少,以便当张量被输入到字幕解码器中时,字幕接近用户提供的字幕)
  • 第七步:改变输入张量的方向,由梯度决定(按照学习速率的要求迈出一小步)
  • 继续步骤 4 至步骤 7,直到收敛或损耗低于某个阈值
  • 最后一步:取最终的输入张量,用它的值通过余弦相似性找到最接近它的图像(在 300 维空间中)

当我们这样做时,结果是不可思议的:

我搜索了**‘一只狗’**,这是网络找到的图片:

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

我搜索了**《一个微笑的男孩》**。

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

最后,当我搜索:

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

前两个结果是:

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

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

令人兴奋,不是吗?

总结和挑战

提醒一下,你可以从我的 github 库下载完成所有这些的代码。它包括数据预处理,模型描述,预训练的图像字幕网络,可视化代码。它不包括 Flickr8K 数据集或字幕,您必须分别从这里和这里下载

我希望你喜欢这篇文章。如果你想更进一步,这里有一个挑战:根据给定的描述生成一个图像。就像从一个随机的起点生成一个与用户提供的标题相匹配的 300 维图像表示一样,您能更进一步,为用户提供的标题从头开始生成一个图像吗?

这比我们在这篇文章中处理的要难 10 倍,但我感觉这是可行的。如果有一种服务不仅能搜索与文本相对应的图像,还能动态生成图像,那该多好啊。

将来,如果 Google Images 这样做,并开始为尚不存在的图像提供结果(比如“两只独角兽在披萨做成的地毯上飞翔”),我不会感到惊讶。

就是这样。我希望你能安全而愉快地探索表象世界。

感谢的点评和评论。

喜欢这个教程吗?也看看我以前的作品:

在 Twitter 上关注我

我定期发关于人工智能、深度学习、创业公司、科学和哲学的推特。跟着我上https://twitter.com/paraschopra

* [## Paras Chopra (@paraschopra) |推特

Paras Chopra 的最新推文(@paraschopra)。跟着我,我会把你带到一条混乱的道路上…

twitter.com](https://twitter.com/paraschopra)*

其中一件事与众不同:地质异常和数据异常检测

原文:https://towardsdatascience.com/one-of-these-things-is-not-like-the-others-geological-anomalies-and-anomaly-detection-with-data-59a1a8b94785?source=collection_archive---------14-----------------------

一位数据科学家和一位地质学家讨论多学科方法

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

Shaan Hurley, Flickr

在地球科学中,我们经常谈论寻找数据中的异常作为潜在矿化的指标。但是,我们如何定义异常,数据科学家和地质学家如何合作产生新的见解?

地质学家 Holly Bridgwater 和数据科学家 Jess Robertson 博士最近进行了一次聊天,内容是如何以一种对从通才数据科学角度看待地球科学数据的人有意义的方式来描述异常。

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

请继续阅读,了解他们的观点——或者点击这里观看原始视频

注: 这场讨论是由 探险者挑战赛 引发的,这是一场使用数据来改善矿产勘探流程的全球竞赛——视频对此做了一些具体的引用,但本文做了更多的概括。

霍莉:

今天,我们将主持一个会议,讨论“什么是异常现象,如何在数据中发现异常现象?”我们的目标是帮助数据科学家掌握地质数据。我将扮演地质学家的角色,提出令人沮丧、框架不佳的数据科学问题,Jess 将能够为您翻译这些问题,希望是以一种有意义的方式。手指交叉!

所以我们认为我们要做的是关注地质数据中常见的三种特殊类型的异常。

物理性质

Holly: 首先我们要谈谈岩石的物理特征,特别是地球物理数据。作为一名地质学家,我在这种类型的数据中寻找的是向我表明岩石中物理差异的东西。例如,某些类型的矿体,如硫化物,比周围的岩石密度更大,导电性更好——所以我去寻找可能向我表明密度更大或导电性更好的岩石的信号。

我是如何做到这一点的,首先我找人收集数据,通常是航空地球物理调查,可能是磁力和重力。然后,我让一个比我聪明得多的人对数据做一些数学运算(反演),生成一些典型的彩色网格图像;红色表示高磁场强度,蓝色表示低磁场强度。

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

Geology is just paint by numbers then, right? (Flickr)

我在这些图像中寻找结构和趋势,这些结构和趋势可能表明一些不同的事情正在发生。我可能在寻找岩石类型或物理特征的特定变化,或者我可能在寻找由密度差异表示的结构或化学变化。

杰西:

我想我应该首先注意到,你刚刚谈到了这些数据的五六个不同的步骤。

这是从仪器上得到的原始数据。

需要对数据进行一些处理,例如,如果是磁力,您需要去除地球磁场的影响,这样您就可以看到当地地质对磁场的影响。然后,你提到了反转,你也提到了漂亮的图像,我认为这是两个独立的步骤。

霍莉:

我想地质学家对我们为什么进行反演的基本描述是,我们正在记录来自地球的原始测量结果,这些测量结果导致信号以某种方式返回——但我们实际上想知道的是它在告诉我们什么。在反演过程中,我们应用一些先验知识来帮助我们确定。

一个精明的勘探地质学家,在做调查之前,会向地球物理学家提供一些你已经知道的岩石特征。因此,如果你已经了解了岩石类型和它们的一些特征,你可以把它们交给地球物理学家,他们可以生成一个更好的模型,以你已知的地质学为荣。

杰西:

因此,从数据科学的角度来看,本质上我们在勘探中做得不太好的事情[注意,杰斯也是地质学家],我们应该做得更好的事情,是理解背景以及试图理解异常

显然,我们知道我们在寻找矿化。我们想找到硫化物的峰值,它会让我们都变得富有。但有时我们没有花足够的时间去真正理解背景是什么样的,岩石的自然可变性是什么——这样我们就可以正确地判断并说“这实际上是一种异常现象”。

我们认为数据科学能够为探索带来的优势之一是,有可能对所有公共数据集进行更大范围的观察,并试图了解其中的自然可变性。然后,当你提出你的异常矿物目标时,你可以说,实际上我们观察了南澳大利亚所有的绿宝石,发现它们有这种地球物理信号,这个东西与那个不同。因此,能够提供这种更大的数据或更高层次的视图是一个额外的好处。

霍莉:

给数据科学家提供没有背景的原始地球物理数据有多困难?

杰西:

数据科学家的部分职责是从数据中创建上下文!我们认为是“有用的背景”的东西可能不够量化,或者不能适用于所有的数据。因此,数据科学家将采取“越多越好”的方法,他们试图思考所有可能成为“有用环境”的事物的超集,然后从数据中了解哪些是真正有用的。

仍然有很多东西你可以从那些数据中提取出来,而不必进行完全的反演。

只是为了澄清一些语言,当我谈论反演时,从物理背景出发,我希望我们有一些控制方程,描述岩石的物理性质如何导致我们在野外看到的信号。当我做反演时,我基本上是想从场回到那些物理性质。

当你只关注一两个领域时,这种方法很有效。真正困难的地方在于,当你试图在其上堆叠一大堆其他数据时。例如,我们没有任何控制方程同时告诉我们岩石的磁性和密度属性加上地球化学加上矿物学加上结构是如何转化的。你把所有这些东西放在一起,这个方程组就太复杂了,无法恰当地发明出来。

这就是机器学习的特殊优势,因为有了机器学习,我们不需要解决反演问题,而是可以寻找模式。这是一种数据融合方法。或者,你可以进行这种转换,然后开始用其他数据集来约束反演;这也是一个非常有价值的方法,实际上也可以输入到机器学习模型中。

所以,再一次有很多不同的方法将机器学习应用于地质学。

地球化学

霍莉:

所以,让我们继续我最喜欢的东西——地球化学!

关于地球化学,首先要指出的是,当我们谈论数据时,我们谈论的是实验室化验结果或一些实时化学读数或岩石中元素的指标。

通常,地球化学数据库来自钻井,但钻孔的密度和间距将取决于您是在钻探资源还是在进行区域勘探。因此,由于数据可能很稀疏,我想从数据科学的角度来看,这真的很难。

我们在地球化学异常中寻找的是指示潜在矿化的任何化学变化。

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

Yhana (Unearthed editor) to Holly: “which of these rock photos can be a good geochemistry example image?” Holly: “All rocks are awesome! [blank stare]… fine, the purple sparkly one.” (Flickr)

仍然霍利: 我查阅地球化学数据的过程首先是对那些数据进行分段。

我知道如果我看大量的数据,我不太可能看到任何有意义的趋势;我可能会看到不同的岩石类型,但我需要将这些不同的岩石类型分成不同的群体,这样我就可以看到在这些单独的数据集中实际的异常是否突出。因此,我将数据分成不同的岩石类型,甚至蚀变类型的潜在子集。这样我就能清楚地看到那里有哪些异常点

如果我们在寻找一个新的矿床,我们知道我们在寻找不同的东西,但我们不知道确切的化学特征可能是什么。它可能是某些元素的浓缩,但也可能是一种损耗,所以实际上我们只是在寻找某个领域与众不同的东西。

杰西:

这是这是一个真正的机会,将你得到的化学数据直接与实际形成矿床的地质过程联系起来。

Holly 还没有提到这一点,但是很多地球化学研究都试图了解不同元素在每个矿床形成过程中的表现。

例如,你可能有一束热流体流过一些岩石,这会改变岩石中的所有矿物,你会看到一些元素富集——如二氧化硅。像斜长石这样的矿物被改造成粘土矿物,或者失去二氧化硅,被热的流动流体带到别处。当你看到这种运作时,这表明那里有热液活动。你可能会想到热液矿床,如金或某种铜。

霍莉:

从化学角度来说,作为地质学家,我们通过教育了解未蚀变和蚀变岩石的样子。

从根本上来说,我们可以考虑沉积岩、变质岩和火成岩。地质学家了解它们在自然状态下的不同化学成分。他们还会知道,如果被改变了,哪些元素指标可能会显示出来。我们已经了解了那些物理系统。因此,当我们寻找经济矿化的证据时,我们应用这些知识。

杰西:

可以有如此广泛的元素来查看。每个元素在这些变化过程中表现不同,但是元素组表现相似,所以实际上你可以通过比较相似元素组得到很多关于正在发生的过程的信息。

地质学家有一大堆关于热液元素的语言。通常你可以开始做的是计算元素的比率——实际上是元素的比率在变化,给你这个真正的大的指示……事物。

从技术角度来说,你不希望仅仅使用化学之外的原始数据。所有这些结果的关键是每个结果都需要加到 100%,例如,岩石中的二氧化硅含量不能超过 100%。因此,您基本上需要考虑使用对数比变换或类似的方法,将数据实际变换到一个空间,在这个空间中,您将开始应用传统的聚类方法。

地质学家使用像测井仪这样的工具来做这件事。如果你在机器学习中这样做,你可能会想自己实现它。这实际上很简单。

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

Dr. Jess says it’s really straightforward. I’m sure it’s fine. (Flickr)

结构

霍莉:

我们最后要讨论的异常类型是结构。

我们所说的结构是地壳中可能与矿化有关的特征。这些东西如断层、角砾岩、矿脉,可能促进了矿化的发生。

你可能会认为它们是陷阱或水槽。基本上,这种特定特征允许流体沿其流动或创建化学或物理屏障是有原因的——所以我们在数据中寻找这种特征。

杰西:

我的意思是,如果你仔细想想,你真的是在寻找地壳中元素可以集中的地方,有几种方法可以做到这一点。

我们可以有某种运输途径。对于我们前面提到的热流体,它们可以通过作为优先通道的断层。在这种情况下,你更有可能将所有这些元素聚集在这种断层周围,因此这是试图寻找某种矿化的良好目标。

想象一下,例如,你从地壳深处的一种流体开始,然后沿着一个断层把它带上来。虽然在地壳深处,它与周围的所有岩石保持化学平衡,但当你沿着断层向上移动时,它会与其他岩石接触,然后你会发生化学反应,这些化学反应会导致某些元素的沉淀。

这使得寻找我们有这种引导结构或运输结构的地方变得有用,这种结构将把材料从一个广阔的区域带到一个真正狭窄的区域。

你看到的每一个矿床并不总是以这种方式形成的。有时你会看到地下水的变化,实际上是这些变化导致了一些东西沉淀出来。

霍莉:

值得一提的是,通常某些类型的矿体可能是相当垂直的,所以如果你从上面看,它看起来像一条相当线性的直线;这是我们在数据中寻找的一种特征。通常是在地球物理数据中,因为在密度或电导率或电阻率上,结构之间通常有差异,这使我们能够提取这些差异。

杰西:

我想说的是,如果你采用数据科学的方法来研究地质学,并寻找这些断层的变化,那么你应该考虑尝试进行某种空间滤波,特别是对势场数据或磁力和重力进行滤波。

主要是因为你要寻找的是高频变化,所以一般来说,当你看磁图时,你会看到广泛的特征,你知道覆盖层厚度的变化或岩石整体行为的变化。然后你会看到非常细小的肿块;有些只是噪音,但有些实际上是这些非常细微的断层特征。

南澳大利亚政府资源信息门户刚刚增加了一些新的大地电磁数据,是地壳深部的东西。如果你对试图理解地壳深处的液体可能来自哪里感兴趣,那么可能值得看一看那套设备。

地质学可以为异常现象提供背景。我们在数据科学中可以做的是提取所有这些作为我们预测器的协变量——本质上是试图说,如果我们知道所有背景岩石的样子,告诉我这是否是异常的。

如果你试图让地质学家相信你的模型是有价值的,你试图说这是我的模型添加到你对数据的解释的背景。所以你可以说,我们认为这是反常的,因为所有这些原因,这真的和地质过程有很好的联系吗?

霍莉:

当你作为一个公司的地质学家工作时,你会受到额外的约束。所以,我们不只是被要求,‘去找任何东西,去寻找异常’。通常还有其他事情推动我们正在做的事情——例如,如果在附近发现了某种类型的矿床,我们通常会使用该矿化类型的模型来寻找其他类似的矿床。

这使得我们非常受特定模型的驱动,寻找特定类型的异常,并且很容易错过数据中其他类型的异常,这是没有预料到的。

此外,大多数勘探部门,无论是大型矿商内部的小部门,都专注于特定的商品或特定的风格。这让我们集中精力,并允许我们以一种特殊的方式运用我们的资金,但这确实意味着我们可能过于偏向于寻找该部门已经处理或交易的矿体。

就这样结束了!

非常感谢 Holly 和 Jess 花了 20 分钟创造了这个。我们希望它将为奇妙的地质学世界引入更多的数据科学家——因为我们需要找到更多的资源来生产社会需要的所有东西,但这是一场艰难的游戏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值