为什么我们在 NLP 中使用单词嵌入?
自然语言处理(NLP)是机器学习(ML)的一个子领域,它处理自然语言,通常以文本的形式,文本本身由更小的单元组成,如单词和字符。处理文本数据是有问题的,因为我们的计算机、脚本和机器学习模型无法以任何人类的方式阅读和理解文本。
当我读到“猫”这个词时,许多不同的联想被唤起——它是一种可爱的毛茸茸的小动物,吃鱼,我的房东不允许,等等。但这些语言关联是经过数百万年进化磨砺的相当复杂的神经计算的结果,而我们的 ML 模型必须从零开始,没有预先建立的对词义的理解。
那么,文本输入应该如何发送给我们的模型呢?计算机可以很好地处理数字输入,所以让我们把问题换成:
我们怎样才能最好地用数字表示文本输入?
理想情况下,我们提出的任何数字表示方法都应该是语义上有意义的——数字值应该尽可能多地捕捉单词的语言意义。一个精心选择的、信息丰富的输入表示可以对整个模型的性能产生巨大的影响。
单词嵌入是解决这个问题的主要方法,并且如此普遍,以至于它们的使用实际上在任何 NLP 项目中都是假定的。无论您是开始一个文本分类、情感分析还是机器翻译的项目,您都有可能从下载预先计算的嵌入(如果您的问题相对标准)或者考虑使用哪种方法从您的数据集中计算您自己的单词嵌入开始。
但是我们为什么要在 NLP 中使用嵌入呢?
没有谈论任何计算嵌入的特定算法(假装你从未听说过 word2vec 或 FastText 或 ELMo),这篇文章回到基础来回答如下问题:
- 为什么我们需要任何复杂的方法来表示单词呢?
- 用数字表示单词的最简单方法是什么,为什么这还不够?
- 我们所说的嵌入“把词映射到高维语义空间”到底是什么意思?
- 如何将单词嵌入可视化并直观地理解?
让我们开始吧。
一个没有单词嵌入的世界
给定这 10,000 个单词的词汇表,用数字表示每个单词的最简单方法是什么?
Our vocabulary of 10,000 words.
你可以简单地给每个单词分配一个整数索引:
Our vocabulary of 10,000 words, with each word assigned an index.
给定这种单词到整数的映射,我们可以将单词表示为数字向量,如下所示:
- 每个单词将被表示为一个 n 维向量,其中 n 是词汇量
- 每个单词的向量表示将主要是“0”,除了在对应于单词在词汇表中的索引的位置将有单个“1”条目。
举几个例子:
- 我们的第一个词汇单词“aardvark”的向量表示将是[1,0,0,0,…,0],它是第一个位置的“1”,后面是 9,999 个零。
- 我们的第二个词汇单词“ant”的向量表示将是[0,1,0,0,…,0],即第一个位置是“0”,第二个位置是“1”,之后是 9998。
- 诸如此类。
这个过程叫做一热矢量编码。您可能也听说过这种方法在多类分类问题中被用来表示标签。
现在,假设我们的 NLP 项目正在构建一个翻译模型,我们想要将英语输入句子“the cat is black”翻译成另一种语言。我们首先需要用一次性编码来表示每个单词。我们将首先查找第一个单词“the”的索引,并发现它在我们的 10,000 长的词汇表中的索引是 8676。
然后,我们可以使用长度为 10,000 的向量来表示单词“the ”,其中除了位置 8676 处的条目是 1 之外,每个条目都是 0。
我们对输入句子中的每个单词进行索引查找,并创建一个向量来表示每个输入单词。整个过程看起来有点像这个 GIF:
GIF showing the one-hot encoding of the words in the input sentence “the cat is black”.
注意,这个过程为每个输入单词生成了非常稀疏的(大部分为零)特征向量(这里,术语“特征向量”、“嵌入”和“单词表示”可互换使用)。
这些一键向量是将单词表示为实数值向量的一种快速简单的方法。
**快速旁白:**如果您想生成整个句子的表示,而不仅仅是每个单词,该怎么办?最简单的方法是连接或平均句子的成分词嵌入(或两者的混合)。更高级的方法,如编码器-解码器 RNN 模型,将顺序读取每个单词的嵌入,以便通过多层转换逐步建立句子意思的密集表示(见这篇文章对 ELMo 句子嵌入的快速概述)。
稀疏独热编码的问题
我们已经完成了一次性编码,并成功地将每个单词表示为一个数字向量。许多 NLP 项目已经这样做了,但是最终结果可能很一般,特别是当训练数据集很小时。这是因为一键矢量不是一种很好的输入表示方法。
为什么单词一键编码次优?
- **相似性问题。**理想情况下,我们希望类似的单词,如“猫”和“老虎”,有一些相似的特征。但是有了这些一键向量,“猫”和“老虎”就像字面上的任何其他单词一样相似,这并不好。与此相关的一点是,我们可能想要对单词 embeddings 进行类似类比的向量运算(例如,“cat”-“small”+“large”等于什么?希望是像大猫一样的东西,例如“老虎”或“狮子”)。我们需要足够丰富的单词表示来允许这样的操作。
- **词汇量问题。**使用这种方法,当你的词汇量增加了 n 时,你的特征大小向量的长度也增加了*n。*独热向量的维数与字数相同。您不希望要素尺寸爆炸式增长是有原因的,也就是说,更多的要素意味着要估计更多的参数,您需要指数级的更多数据来充分估计这些参数,以构建合理的概化模型(请参阅:维数灾难)。作为一个粗略的经验法则,您需要比您拥有的特征多几个数量级的训练数据。
- **计算问题。**每个单词的嵌入/特征向量大多为零,许多机器学习模型在非常高维度和稀疏特征的情况下不会很好地工作。神经网络尤其难以处理这种类型的数据(尽管有变通办法,例如使用一种类似套索的特征选择)。有了这么大的特征空间,你也有陷入内存甚至存储问题的危险,特别是如果你正在处理的模型不能很好地处理稀疏矩阵的压缩版本(例如 SciPy 的稀疏矩阵 CSR 格式,教程这里)。
这些点是相关的,但是恶意地说:计算和词汇大小问题可以被认为是技术问题,也许相似点更像是一个“好东西”。
密集嵌入解决了一键向量存在的最重要的问题是什么?
嵌入解决的核心问题是泛化。
- **一般化问题。**如果 as 假设像“猫”和“老虎”这样的词确实是相似的,我们想要某种方式将该信息传递给模型。如果其中一个单词是罕见的(例如“liger”),这就变得特别重要,因为它可以在计算路径上附带一个类似的、更常见的单词通过模型。这是因为,在训练期间,模型学会了以某种方式对待输入“猫”,即通过由权重和偏差参数定义的多层转换来发送它。当网络最终看到“狮虎”时,如果它的嵌入与“猫”相似,那么它将走与“猫”相似的道路,而不是网络必须完全从零开始学习如何处理它。对你从未见过的事物做出预测是非常困难的——如果它与你见过的事物有关,那就容易多了。
**这意味着嵌入允许我们建立更一般化的模型——**我们让相似的词“共享”参数和计算路径,而不是让网络去争相学习许多不同的方法来处理断开的输入。
稀疏独热编码总是不好的吗?
在少数情况下,使用稀疏独热编码优于嵌入编码。套用 Yoav Goldberg 在他的NLP 神经网络初级读本中的话,如果:
- 您拥有相对较少的输入要素
- 你不期望输入是有意义的相关(与上面的“猫”和“狮虎”的例子相反)
- 您不希望输入共享模型参数
- 你有相当多的数据可以学习
那么也许使用它们并不是最糟糕的主意。
单独但相关的一点:当然, one-hot 编码在分类数据预处理的情况下总是相关的,因为许多 ML 模型不能直接处理分类数据(如文本标签)。您仍然可以使用它们将一个多类标签向量转换成多个二进制类向量,或者将一些分类特征向量转换成它们的二进制版本。
走向密集的、语义上有意义的表达
既然我们已经讨论了热点向量及其缺陷,那么让我们讨论使用密集的、语义上有意义的特征向量来表示单词意味着什么。
如果我们从我们的词汇表中选取 5 个示例单词(比如“aardvark”、“black”、“cat”、“duvet”和“zombie”),并检查它们由上面讨论的一键编码方法创建的嵌入向量,结果将如下所示:
Word vectors using one-hot encoding. Each word is represented by a vector that is mostly zeroes, except there is a single “1” in the position dictated by that word’s index in the vocabulary. Note: it’s not that “black”, “cat”, and “duvet” have the same feature vector, it just looks like it here.
但是,作为说某种语言的人,我们知道单词是这些丰富的实体,具有许多层次的内涵和意义。让我们为这 5 个单词手工制作一些语义特征。具体来说,让我们将每个单词表示为具有介于 0 和 1 之间的某种值的四个语义属性,“动物”、“蓬松”、“危险”和“怪异”:
Hand-crafted semantic features for 5 words in the vocabulary.
所以,来解释几个例子:
- 对于“土豚”这个词,我给了它一个很高的“动物”特征值(因为它实际上是一种动物),以及相对较低的“蓬松度”(土豚有短鬃毛)、“危险”(它们是小型夜间穴居猪)和“怪异”(它们很迷人)。
- 对于“猫”这个词,我给它的特征“动物”和“蓬松度”(不言自明),一个中值“危险”(如果你曾经养过宠物猫,也是不言自明的),一个中值“怪异”(尝试搜索“sphynx 猫”)。
基于语义特征值绘制单词
我们已经找到了要点:
每一个语义特征都可以被看作是更广、更高维度的语义空间中的单个维度。
- 在上面虚构的数据集中,有四个语义特征,我们可以一次绘制两个,作为 2D 散点图(见下文)。每个特征是不同的轴/尺寸。
- 每个单词在这个空间中的坐标由它在感兴趣的特征上的特定值给出。例如,单词“aardvark”在蓬松度与动物 2D 图的 2D 图上的坐标是(x=0.97,y=0.03)。
Plotting word feature values on either 2 or 3 axes.
- 类似地,我们可以考虑这三个特征(“动物”、“蓬松”和“危险”),并在这个 3D 语义空间中绘制单词的位置。例如,单词“duvet”的坐标是(x=0.01,y=0.84,z=0.12),表明“duvet”与蓬松的概念高度关联,可能有点危险,并且不是动物。
这是一个手工制作的玩具示例,但是实际的嵌入算法当然会为输入语料库中的所有单词自动生成嵌入向量。如果您愿意,您可以将 word2vec 这样的单词嵌入算法视为单词的无监督特征提取器。
像 word2vec 这样的单词嵌入算法是无监督的单词特征提取器。
这篇文章不会描述这些算法是如何工作的,但核心思想是,在类似上下文中使用的单词将被赋予类似的表示。也就是说,以类似方式使用的单词将在高维语义空间中紧密放置在一起——这些点将聚集在一起,它们彼此之间的距离将很低。
应该用多少个维度来表示单词?
单词嵌入算法通常会要求您设置希望嵌入的维数——这里的正确答案是什么?
直觉上,你可能想要更多的维度,更多类型的输入。因此,如果您要计算单词的嵌入,您可能需要更多的维度,在您的语料库中可能有数万种类型,而如果您要计算词类标签(如“名词”、“动词”、“形容词”)的嵌入,则没有那么多类型。例如,在 NLTK(一个流行的 Python NLP 库)中只有 35 种词性,您可能不需要太多的维度来很好地表示每种词性。
多少嵌入维数是最佳的问题实际上是一个经验问题,最佳数目在理论上还没有解决。这里的权衡是准确性和计算问题之间的权衡:
- 更多的维度意味着计算单词表达越来越精确的潜力
- 但更多的维度也意味着对计算资源的更高需求(处理速度、内存需求)——这在训练阶段更加明显,但也确实会影响推理速度。
在实践中,人们使用大约 50 到 500 维的单词嵌入向量(您经常遇到 300 维),有时更多地用于竞争非常激烈的系统,在这些系统中,您试图从模型中挤出尽可能多的性能。
可视化单词嵌入
与此相关的一点是,鉴于这些语义空间通常是非常高维的,你打算如何可视化其中发生的事情?人们(即使是杰夫·辛顿)也无法真正想象超过 3 维的空间。
“要处理 14 维空间中的超平面,想象一个 3 维空间,大声对自己说‘14’。大家都这么干。”杰夫·辛顿
您可以随机选择两个或三个要素,并在这两个或三个轴上绘制您的点。然而,由于特性/轴通常是不可解释的,你不知道选择哪一个是特别有见地或有趣的。此外,单词的位置可能会根据您选择的特定坐标轴而有很大的不同,所以如果您随机选择几个坐标轴,您将无法获得单词位置的准确印象。
在实践中,人们会经常使用 t-SNE 或 PCA 等降维方法将高维的嵌入点投影到一个更低维的空间中(有一定的信息损失)。重要的是,它允许你只为每个单词提取两个坐标(比如说,从 300 个),然后你可以很容易地用 2D 散点图来可视化。网上有很多关于这些话题的很好的教程,就像这个。
结论
总而言之,嵌入:
- 将单词表示为语义上有意义的密集实值向量**。**
- 这克服了简单的一键矢量编码的许多问题。
- **最重要的是,嵌入提高了几乎所有 NLP 问题的泛化能力和性能,**尤其是在你没有大量训练数据的情况下。
我希望你喜欢这篇“回归基础”的帖子,请在下面告诉我你的想法:)
—
Welocalize 是自然语言处理和翻译技术的行业领导者。要与我们团队中的某个人谈论你的 NLP 项目,请发电子邮件给 david.clark@welocalize.com 的戴夫。
你为什么使用交叉验证来评估你的模型?
分类器性能评估简介
如果几周前你问我这个问题,我的回答会是“因为我读的每本机器学习书都告诉我这么做”。我决定寻找一个更好的答案,因为̶i̶̶h̶a̶t̶e̶̶t̶a̶k̶i̶n̶g̶̶o̶r̶d̶e̶r̶s̶我觉得有必要真正知道这个决定背后的推理是什么(我不是数据科学的独角兽,统计学不是我的强项)。
寻找关于这个问题的信息很难,因为我不知道去哪里找,但幸运的是,我找到了一本书来回答这个问题:评估学习算法。
Evaluating Learning Algorithms: A Classification Perspective. Cambridge University Press, 2011
这本书集中在分类算法和他们周围的评估方法。
[……]至关重要的是,研究人员拥有适当的工具来评估学习方法和理解潜在的问题。这本书检查了评估过程的各个方面,重点是分类算法。——书籍描述
在这篇文章中,我们将以这本书为指导,讨论机器学习中性能评估的一些主要观点。
我并不孤单:事实上的文化
第一个(令人欣慰的)发现是,我并不孤单:在大多数实际情况下,简单地使用重复交叉验证是机器学习社区中常见的事情。作者在第一章中谈到了对事实上的文化的评价:
尽管在有限的数据情况下,交叉验证确实似乎是重采样方法中的一个强有力的候选方法,但将其应用于大多数实际情况有点太过分了。在聚焦于评估策略(或者甚至是交叉验证等误差估计方法)之前,大多数实际数据情况都需要研究更广泛和更深入的问题。—n . Japkowicz 和 m . Shah,2011 年
也许简单地使用交叉验证对于 Kaggle 竞争来说就足够了。但是在现实生活中,我们需要考虑评估的完整背景,这涉及许多标准,例如数据的类别分布和性能指标的选择。事实是评估模型是困难的,不幸的是“没有一个由评估方法组合而成的单一评估策略可以适用于所有场景。
当我们谈论评估机器学习模型时,我们在谈论什么?
要回答这个问题,我们需要后退一步,谈谈机器学习本身。如果我们有一个分类任务,我们训练一个机器学习模型来预测看不见的数据实例,我们就在利用一个概括归纳论证:
概括(更准确地说,归纳概括)从关于样本的前提出发,得出关于总体的结论。— 维基百科
所以我们取一个数据集,并基于它进行归纳。这个数据集就是训练集。评估背后主要有两个概念: 经验风险 和 泛化误差 。
经验风险
给定我们想要预测的标签 y ,风险 是 y 的真实标签和分类器分配的标签之间的不一致程度。损失函数是“当向量 x 的标签 y 不同于分类器分配的标签时损失的定量测量”。为了估计这一点,我们需要事先知道标签,因此 经验风险是分类器相对于训练数据的风险”。
泛化误差
另一方面, 一般化误差 测量风险对于未知数据(这是我们的最终目标)的偏差。用于训练分类器的数据会对泛化误差产生影响:
[……]应当理解,训练分类器的数据虽然代表真实分布,但可能不会引导算法以最小的可能风险学习分类器f′。—n . Japkowicz 和 m . Shah,2011 年
泛化误差 的来源可以用两件事来解释:没有足够的训练数据对完整的底层分布做出推断或者训练数据中有噪声。
模型的目标是最小化 经验风险 和 泛化误差 。换句话说,我们希望“在训练样本中最小化错误分类的概率,同时保证良好的泛化能力”。这里我们有偏差-方差权衡,因为优化一个误差测量通常意味着折衷另一个。
更糟糕的是,测量学习算法的偏差和方差分解行为是困难的。作者指出了两个主要的局限性:
- **缺乏实际数据生成分布的知识和
- 数据有限。
为了知道模型是否能够很好地推广,我们需要事先知道数据分布,如果我们知道,我们就不需要首先训练分类器。
因此,在缺乏数据分布知识的情况下,实际上不可能知道偏差和方差的真实值。因此,我们需要通过使用一些可以从现有数据中获得的经验估计来近似这些值,而不是让它们明确地依赖于真实的基础数据分布。—n . Japkowicz 和 m . Shah,2011 年
为了处理有限的数据可用性,数据重采样技术可以帮助我们:
在模型选择和评估学习算法对测试数据的性能时,有限的数据可用性起着非常重要的作用。然而,这个问题在某种程度上可以通过使用所谓的数据重采样技术来改善。—n . Japkowicz 和 m . Shah,2011 年
因此,当我们评估一个模型时,我们需要检查它是否“过拟合”或“欠拟合”一个训练集,并评估这如何影响泛化误差。但是我们如何做到这一点呢?首先,我们决定一个性能指标(本书有两章专门介绍这一点),然后我们找到一个测试模型的好方法,以获得尽可能无偏的估计*。***
误差估计
好的,但是如何选择评估模型的方法呢?这要看你有多少数据:****
理想情况下,我们可以访问整个群体,并在其上测试我们的分类器。即使无法获得全部人口,如果可以从该人口中获得大量有代表性的数据,误差估计将会非常简单。这将包括对他们接受训练的数据进行算法测试。—n . Japkowicz 和 m . Shah,2011 年
在现实生活中,我们有两个主要选择:
- 维持 方法:在大量看不见的数据点上测试算法
- 重采样 方法:使用和重用可用数据,以获得足够大数量的样本
作者在第五章中讨论了这些方法,并给出了误差估计方法的本体。
Evaluating Learning Algorithms: A Classification Perspective. Cambridge University Press, 2011
正如你所看到的,有很多的误差估计方法。我们不会在这里讨论它们,但是我想你已经明白了:交叉验证并不是所有事情的答案。
最后,在选择了适当的误差估计方法之后,下一步是评估模型之间的差异是否具有统计学意义或者仅仅是巧合(这本书也有一章专门讨论这一点)。
最后
机器学习中的性能评估很难*。我们需要决定度量标准、误差估计方法、评估学习算法的最佳数据集等等。了解评估过程很重要,因为有了这些知识,我们可以做出明智的决策 关于要采用的策略(而不是总是使用交叉验证)。***
这就是这本书的目标。这是一个伟大的阅读,现在我更有信心决定评估模型的策略。你可以点击查看这本书的更多细节。
感谢阅读!
为什么做好科学很难,如何做得更好
Photo by Steve Johnson on Unsplash
[## 想在数据科学方面变得更好吗?
当我在我发布独家帖子的媒体和个人网站上发布新内容时,请单击此处获得通知。](https://bobbywlindsey.ck.page/5dca5d4310)
做好科学很难,很多实验都失败了。虽然科学方法有助于减少不确定性并带来发现,但它的道路充满了坑坑洼洼。在本帖中,您将了解常见的 p 值曲解、p 黑客以及执行多重假设检验的问题。当然,不仅提出了问题,还提出了潜在的解决方案。在这篇文章结束时,你应该对假设检验的一些陷阱,如何避免它们,以及为什么做好科学如此困难有一个很好的理解。
p 值曲解
有许多方法可以曲解 p 值。根据定义,假设零假设为真,p 值是获得至少与实际观察到的一样极端的检验统计的概率。
什么是 p 值而不是:
- 衡量效果的大小或证据的强度
- 干预有效的机会
- 零假设为真或为假的陈述
- 另一种假设为真或为假的陈述
如果你想衡量证据的强度或效果的大小,那么你需要计算效果的大小。这可以通过皮尔逊 r 相关、标准均值差或其他方法来实现。建议在您的研究中报告效应大小,因为 p 值将告诉您实验结果与随机预期不同的可能性,而不是实验治疗的相对大小或实验效应的大小。
p 值也不能告诉你干预有效的几率,但是计算精度可以,而且基础利率会影响这个计算。如果干预的基本比率很低,即使假设检验显示出具有统计显著性的结果,这也为许多假阳性的机会打开了大门。例如,如果干预有效的机会是 65%,那么仍然只有 65%的机会干预实际上是有效的,而留下 35%的错误发现率。忽视基本利率的影响被称为基本利率谬误,这种情况比你想象的更常见。
最后,p 值也不能告诉你一个假设是真还是假。统计学是一个推理框架,没有办法确切知道某个假设是否正确。记住, 科学上没有所谓的证明 。
黑客问题
作为一名科学家,在建立假设检验时,你的一个自由度是决定在你检验的数据中包含哪些变量。在一定程度上,您的假设将影响您可能在数据中包含哪些变量,在用这些变量测试假设后,您可能会得到大于 5%的 p 值。
此时,您可能会尝试在数据中使用不同的变量并重新测试。但是如果你尝试了足够多的变量组合,并测试了每种情况,你很可能会得到 5%或更低的 p 值,正如这个应用程序在这篇 538 博客文章中展示的那样。它被称为 p-hacking ,它可以让你在竞争性替代假设下实现 5%或更低的 p 值。
这至少有几个问题:
- 由于你可以在竞争的替代假设下获得统计上显著的 p 值,作为你选择包括在测试中的数据的结果,p-hacking 不能帮助你更接近你正在研究的事物的真相。更糟糕的是,如果这样的结果被公布,并且这项研究变成了传统智慧,那么将很难被移除。
- 随着假设检验次数的增加,假阳性率(即错误地称无效发现为显著)也会增加。
- 你可能会成为确认偏差的受害者,忽略其他假设测试的结果,只考虑与你的信念一致的测试结果。
- 由于许多期刊要求出版的 p 值为 5%或更低,这就促使你用 p-hack 的方式达到这个 5%的阈值,这不仅造成了伦理上的困境,也降低了研究的质量。
应对 P-Hacking
为了帮助减少 p-hacking,您应该公开研究期间探索的假设数量、所有数据收集决策、所有进行的统计分析和所有计算的 p 值。如果您进行了多重假设检验,但没有强有力的依据预期结果具有统计学意义,正如在基因组学中可能发生的情况,在基因组学中可以测量和检验数百万个遗传标记的基因型,您应该验证是否存在某种控制家族错误率或错误发现率的方法(如下一节所述)。否则,这项研究可能没有意义。
报告假设检验的功效也是一个好主意。也就是说,报告 1 —当假设为假时,不拒绝零假设的概率。请记住,功效会受到样本大小、显著性水平、数据集中的可变性以及真实参数是否远离零假设假设的参数的影响。简而言之,样本量越大,功效越大。显著性水平越高,权力越大。数据集中的可变性越低,功效就越大。并且真实参数离零假设假设的参数越远,功效越大。
用 Bonferroni 修正检验多重假设
由于假阳性的概率随着假设检验次数的增加而增加,因此有必要尝试并控制这种情况。因此,您可能希望控制所有假设测试中出现一个或多个假阳性的概率。这有时被称为家庭错误率。
对此进行控制的一种方法是将显著性水平设置为 α/n ,其中 n 是假设检验的次数。这种校正被称为 Bonferroni 校正,确保整个系列的错误率小于或等于 α 。
然而,这种修正可能过于严格,尤其是当你在进行许多假设检验的时候。原因是因为你在控制家庭的错误率,你也可能会错过一些存在于更高显著性水平的真正的积极因素。显然,在提高假设检验的能力(即,当替代假设为真时,提高拒绝零假设的概率)和控制假阳性之间,需要找到一个平衡点。
用 Benjamini-Hochberg 程序检验多个假设
您可以尝试控制错误发现率,而不是尝试控制家族错误率,错误发现率是所有被识别为具有统计显著性结果但实际上没有统计显著性结果的假设检验的比例。换句话说,误发现率等于 FP/(FP + TP) 。
控制误发现率应该有助于您识别尽可能多的具有统计显著性结果的假设检验,但仍要尽量保持相对较低的误报比例。像控制假阳性率的 α 一样,我们同样使用另一个显著性水平 β ,它控制假发现率。
你可以用来控制错误发现率的程序叫做本杰明-霍克伯格程序。你首先选择一个 β ,其显著性水平为误发现率。然后计算执行的所有零假设检验的 p 值,并从最低到最高排序,其中 i 是列表中 p 值的索引。现在找到最大 p 值的索引 k ,使其小于或等于 i/mβ* ,其中 m 是执行的零假设检验的次数。所有 p 值指数为 i ≤ k 的零假设检验都被 Benjamini-Hochberg 程序视为具有统计显著性。
结论
正如你所看到的,做好科学不仅仅是进行零假设检验,并在你得到小于或等于 5%的 p 值时发表你的发现。有多种方法可以曲解 p 值,调整数据以获得您确信的假设的正确 p 值,以及使用不同的数据样本进行足够多的测试,直到获得所需的 p 值。
但是现在你已经意识到了这些坑洼,并且掌握了一些避免它们的方法,我希望它能帮助你提高研究的质量,让你更接近真相。
如果你喜欢我在这里写的东西,一定要看看我的 个人博客 ,那里有我在媒体上看不到的文章。
参考
- 避免 p 值坑洞的 5 个小技巧
- 权力的定义
- 美国统计协会关于 p 值的声明
- 对错误发现率和 p 值错误解释的调查
- 误报率对误发现率
- 控制错误发现率:一种实用且强大的多重测试方法
- 重要性测试中的权力介绍—可汗学院
- 敏感性和特异性——维基百科
- p 值和基础利率谬误——统计有误
- 如何从已发表的研究中计算效应大小:一种简化的方法
- 多重比较问题—维基百科
原载于 2019 年 2 月 25 日bobbywlindsey.com。
为什么我们明明应该信任机器,却不信任它?
为什么人类必须留在自动化循环中?我们如何才能创造一个更好的人机关系的未来?
人类不可思议。无限不可预测。这就是它们危险的原因。—丹尼尔·H·威尔逊
在之前的中,我谈到了人工智能如何改变人机关系。我贴了以下问题:
无人驾驶汽车应该由谁来做决定?人类应该总是能够否决机器人的决定吗?如果你只有一瞬间的反应时间怎么办?而如果你的亲人在车上,答案会改变吗?
这个场景呢?如果你明天要上法庭,你会选择缺乏同理心的算法还是倾向于偏见和错误的人类法官来决定你的判决?
即使知道人类法官可能会犯更多的错误,罪犯仍然更喜欢人类而不是算法。决策心理学教授曼德普·达米(Mandeep Dhami)说,“他们想要那种人情味。”。
看来我们并不信任机器。还有其他例子:虽然研究表明自动驾驶汽车更安全,但近一半的美国人不喜欢使用自动驾驶汽车。
我们正在积极寻找解决人工智能透明度和公平性问题的方法。但我们似乎不太关心这样一个事实,即人类大脑也像一个我们知之甚少的黑匣子一样运作。为什么会这样呢?
为什么我们明明应该信任机器,却不信任它们?
沃顿商学院教授 Kartik Hosanagar 认为,好于平均水平的效果是原因之一。换句话说,我们知道自动驾驶汽车总体上比人类司机更安全,但我们认为我们比其他人更好。
在一项研究中,参与者被要求在自己、他人和算法的预测中做出选择,研究人员发现,人类确实信任算法——尤其是信任其他人。我们似乎也比算法更能容忍自己的错误。当风险很高时,我们不太可能让机器替我们做决定。
机器确实会犯错。他们可能永远不会完美无缺。无论自动驾驶车辆行驶了多少英里,总会有边缘情况。但是我们在这里问了正确的问题吗?
为什么我们必须在人类和机器之间做出选择?机器会犯错,我们也一样。为什么我们不能共同努力,让集体决策更准确,更少偏差?我们能帮助发现算法中的弱点吗,反之亦然?人类和机器的混合团队能否产生更多样化的解决方案,让世界变得更美好?
更好的机器教学:以人为中心的人工智能
就像以用户为中心的设计可以帮助增加产品的可用性一样,如果我们想确保 AI 让我们的生活变得更好,而不是更糟,我们就应该真正把人放在第一位!
将人们融入到开发 ML 产品的过程中。这种方法被称为“以人为中心的人工智能”。不要开发科学家能想到的最酷的技术,而是专注于人类的可用性,并确保有效和令人满意的人机交互。
一个经验法则是评估人工智能是否可以用来自动化无聊或危险的任务,或者增加人类喜欢做的任务。
麻省理工学院的研究科学家 Lex Fridman 建议将人类深度融入 ML 模型训练和现实世界的操作中。通过引入人类监督,我们可以更好地确保人工智能是安全、公平和可解释的。
加州大学伯克利分校的计算机科学教授斯图尔特·拉塞尔认为,我们应该“给机器赋予目的。”他没有假设机器对目标有完全的了解,而是提出假设“模型对目标有不完全的了解。”
这就引出了我的下一个观点:我们需要更好地定义机器的目标函数,更重要的是,我们的社会!
为机器和我们的社会提供更好的目标函数
ML 模型由回报函数(也称为目标函数或损失函数)指导。)目标函数定义问题。它们是决定 ML 模型预测是否正确的数学公式。
换句话说,他们定义了成功或失败的激励机制。我们希望使用目标函数来优化或加强我们系统的行为,例如最大化保留或最小化错误。
然而,定义目标函数并不是一项简单直接的任务。正如我在另一篇文章中提到的,模型准确性本身通常不是一个好的度量。我们将需要考虑精确度和召回权衡。此外,我们需要确保奖励功能为用户带来积极的体验,不仅仅是主要客户,而是我们所有的用户。
以拼车公司为例,虽然乘客满意度很重要,但司机留存对双方平台的增长也至关重要。定义一个为所有用户创造良好体验的奖励函数可能很有挑战性,尤其是当有利益冲突时,但这绝对是重要的。
三个原则:期望、错误和信任!
towardsdatascience.com](/designing-the-user-experience-of-ml-products-8aef5afb510b)
奖励功能可能会给其他人带来意想不到的后果。我们如何考虑 ML 模型的潜在负面影响并设法减轻它?随着时间的推移,我们如何可能预见和跟踪我们的奖励函数的影响?
一个更基本的问题是:我们如何确保公司在设计他们的 ML 产品时,总是将他们的用户、利益相关者和整个社会的利益考虑在内?在当前资本市场的奖励功能下,公司会被激励去设计正确的 ML 系统吗?
如果留住用户可以增加公司的利润,他们会在乎用户花太多时间在线的负面影响吗?随着更多任务实现自动化,他们会分配足够的资源来帮助员工过渡到下一个角色吗?如果公司的唯一目标是最大化他们的股东价值,他们还会试图减轻他们的 ML 模式对员工和社会的任何潜在负面影响吗?
摘要
输给深蓝并没有让加里·卡斯帕罗夫绝望。相反,他开始接受“半人马象棋”的想法通过人机合作,下棋的水平比以前更高了。
伯克利教授肯·戈德堡也用顶级围棋选手与 Deepmind 的 Alphago 程序比赛的例子来倡导机器人与人类的联盟。
我们不应该将人机关系视为零和游戏,而是应该转变思维模式,思考如何与机器合作,一起把蛋糕做大!这是一个很好的机会,让我们深入思考我们擅长什么,我们真正想做什么,我们如何更好地利用机器!
如果你想看更多这样的文章,请点击这里!
机器人会继续为我们工作吗?还是反过来?未来会是什么样子?更重要的是,什么…
towardsdatascience.com](/not-what-you-think-the-future-of-human-machine-relationship-b890d7f2072b) [## 它在这里!人工智能机器人将如何革新制造业
虽然制造业一直被认为是自动化程度最高的行业,但全自动化…
towardsdatascience.com](/its-here-how-ai-robot-will-revolutionize-manufacturing-44ce784438d4) [## 如何管理机器学习产品—第 1 部分
为什么管理机器学习产品这么难?为什么你应该关心?
towardsdatascience.com](/how-to-manage-machine-learning-products-part-1-386e7011258a)
Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于开发软件定义的机器人技术。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。 她写的是关于 ML、机器人和产品管理的文章。跟随她来到这里T5。
为什么在建立回归模型时要排除高度相关的特征??
如果您已经处理数据很长时间了,那么您一定知道一般的做法是在运行线性回归时排除高度相关的特征。本文的目的是解释为什么我们在构建简单的线性回归模型时需要避免高度相关的特性。在继续这篇文章之前,我强烈推荐你参考我关于回归的文章。
什么是相关性?
相关性仅仅意味着两个或更多事物之间的相互关系。考虑数据集中的数据点(xᵢ,yᵢ),i = 1,2,…n。相关性的目的是观察大值“x”是否与大值“y”配对,小值“x”是否与小值“y”配对。如果没有,检查小值“x”是否与大值“y”成对出现,反之亦然。
在统计学中,上述现象是用一个叫做相关系数的拟合函数来衡量的。衡量相关性的公式是
Correlation coefficient formula
x̄和̄y 分别代表 x 和 y。当相关系数为< 0, we say that x and y are negatively correlated. If it is > 0 时,两者正相关。相关系数在-1 和 1 之间变化。
需要注意的最重要的一点是,相关性只度量两个变量之间的关联,而不度量因果关系。即,“y”的大值不是由“x”的大值引起的,反之亦然,而是恰好这样的数据对只存在于数据集中。
为什么排除高度相关的特征?
如果您还记得我上一篇关于回归的文章,回归就是从训练数据中学习权重向量,并使用它来进行预测。获得权重向量的公式为
我们有一个回归的概率观点,假设因变量“y”正态分布,方差为σ。在这种假设下,从数学上可以看出,上述权重向量 Wₗₛ的方差为
Variance of Wₗₛ
为了使模型足够稳定,上述方差应该很低。如果权重的方差很高,则意味着模型对数据非常敏感。如果方差很大,则权重与训练数据相差很大。这意味着模型可能无法很好地处理测试数据。所以,自然的问题是,
wₗₛ的方差什么时候会大?
现在你应该猜到了,当我们有高度相关的特征时,Wₗₛ的方差会很大。是的,猜对了!!但是让我们看看这在数学上是如何正确的。任何 n×d 矩阵都可以分解为
Singular Value Decomposition
上述分解称为“奇异值分解”。上式中的“S”矩阵是非负对角矩阵。利用这种分解,Wₗₛ的方差可以改写为
当数据集中的要素高度相关时,“S”矩阵中的值会很小。因此,“s”矩阵(上式中的 S^-2)的平方反比将很大,这使得 Wₗₛ的方差很大。
因此,如果两个要素高度相关,建议我们只在数据集中保留一个要素。我希望这篇文章是有帮助的。如果您有任何疑问,请在下面留下。
Python 在这里,为什么要害怕呢
最独特的 Python 项目理念
介绍
Python 是目前地球上最受欢迎的编程语言。不可否认的事实是,python 也是最流行的编程语言。我们在 GitHub 2019 年 10 月份的年度报告中看到了这一点。Python 终于超过了它的长期对手 Java,现在是 GitHub 上第二受欢迎的语言,仅次于领先的 JavaScript。这使得 Python 的受欢迎程度达到了一个全新的水平。
但是,等等,有没有想过 Python 如此受欢迎背后的原因?为什么 Python 获得了如此多的炒作?为什么 Python 是数据科学、机器学习和人工智能的语言选择?
还在疑惑?用一句话来概括它的所有原因,这几天它如此受欢迎是因为——
【Python 让你创造奇迹】
它提供的功能是无与伦比的。它让你做超出我们想象的事情,而且太容易了。是的,你没看错。Python 最大的优点是它的简单性。Python 以最小的努力提供了最大的收益。它是对程序员最友好的语言之一。
顶级 PYTHON 项目创意
图像字幕生成器
在 Instagram 和 Snapchat 的时代,一个标题可能比图片本身更重要。我们通常花更多的时间来选择一个合适的标题,而不是选择要发布的图片。喜欢和评论的数量很大程度上取决于你上传的图片的标题。当然,标题让你看起来很酷。因为如果你不能用你的图片杀死他们,那就用你的标题杀死他们。
想象一下,如果你有一个助手为你决定上传到社交媒体上的每张图片写一些很酷的说明。听起来很酷,不是吗?
这就是这个 Python 项目的全部内容。你给它你的照片,作为回报,它会给你一些很酷的标题。这个项目是你杀死字幕游戏所需要的一切。你对完美字幕的所有担忧现在都将烟消云散。如果你想成为顶尖的社交媒体玩家,那么这个项目就是为你准备的。因为-
“图片吸引眼球,但标题能抓住人心。”
驾驶员睡意检测
全球死亡的主要原因之一是道路事故。我们太习惯了,以至于往往完全忽略了背后的原因。交通事故的主要原因之一是司机的困倦。长途旅行的人通常睡眠不足,通常情况下,不要把这个问题看得太重。
但是现在是认真对待这个问题的时候了。我们需要尽快处理这件事。
这个睡意检测项目也是为了同样的目的。在这个项目中,你将能够建立一个睡意检测系统。这个系统对于防止因司机在开车时睡着而导致的事故至关重要。当这个系统检测到司机的眼睛闭了几秒钟时,它会立即提醒司机。
Python 聊天机器人项目
近来,人工智能最吸引人的应用之一是虚拟助手的概念。从苹果的 Siri 到谷歌的 assistant,我们很快就会与几乎所有东西的虚拟助手绑定。聊天机器人是一个智能系统,它能够像人类一样交流和执行某些动作。
聊天机器人最常见的应用是在客户互动中。几乎每个大组织都有自己的聊天机器人来与客户交流。这些聊天机器人训练有素,几乎能够回答顾客的每一个问题。从而在很大程度上减少了人力。其他重要的应用包括社交媒体营销和即时消息服务。
你自己的聊天机器人项目,带源代码
这个项目是所有关于训练一个聊天机器人的数据集的基础上,它提供了一个随机响应列表的响应。
交通标志识别
人类历史上人工智能和物联网最迷人的应用之一是无人驾驶汽车的概念。一旦这些汽车上路,这个世界将会是一个不同的地方。
这个关于交通标志识别的项目是这个梦想概念的支柱。在这个项目中,您将训练一个系统来识别各种不同的交通标志,然后根据识别的标志自动做出决策。该系统对所有自动驾驶汽车和自动驾驶汽车至关重要,因为它根据识别的标志决定其下一步行动。
这可能是你接触过的最有趣的项目。
尾注
在旧技术逐渐过时,IT 行业裁员司空见惯的时代,Python 已经发展成为每个人的希望之光。请记住,Python 在最近获得了最高的声望,现在开始熟悉 Python 可能是你职业生涯中最明智的决定之一。
做到这一点的最好方法是参与一些有趣的实时项目。
最顶层的 Python 项目
因为现在做不真实的事情更容易了
为什么特性相关性很重要…很多!
鹳会接生婴儿吗?尽管已经在相关性和因果性的上下文中从理论上证明了这一点,但本文探讨的是相关性以及它与因果性的区别。
Photo by israel palacio on Unsplash
机器学习模型的好坏取决于你拥有的数据。这就是为什么数据科学家可以花费数小时来预处理和清理数据。他们只选择对最终模型质量贡献最大的特征。这个过程叫做**“特征选择”。特征选择**是选择能使预测变量更准确的属性或消除那些不相关的、会降低模型精度和质量的属性的过程。
数据和特征相关性被认为是数据预处理的特征选择阶段中的一个重要步骤,尤其是如果特征的数据类型是连续的。那么什么是数据相关性?
**数据关联:**是理解数据集中多个变量和属性之间关系的一种方式。使用相关性,您可以获得一些见解,例如:
- 一个或多个属性依赖于另一个属性或另一个属性的原因。
- 一个或多个属性与其他属性相关联。
那么,相关性为什么有用呢?
- 相关性有助于从一个属性预测另一个属性(估算缺失值的好方法)。
- 相关性可以(有时)表明因果关系的存在。
- 相关性被用作许多建模技术的基本量
让我们仔细看看这意味着什么,以及相关性是如何有用的。有三种类型的相关性:
**正相关:**表示如果特征 A 增加,那么特征 B 也增加,或者如果特征 A 减少,那么特征 B 也减少。这两个特征一前一后地移动,并且它们具有线性关系。
Negative Correlation (Left) and Positive Correlation (Right)
**负相关:**表示如果特征 A 增加,那么特征 B 减少,反之亦然。
**不相关:**这两个属性之间没有关系。
这些相关类型中的每一种都可以存在于由从 0 到 1 的值表示的谱中,其中轻微或高度正相关特征可以是类似于 0.5 或 0.7 的值。如果存在强的和完美的正相关,那么结果由 0.9 或 1 的相关分值表示。
如果有很强的负相关性,则用值-1 表示。
如果数据集具有完全正或负的属性,那么模型的性能很有可能会受到一个称为“多重共线性”的问题的影响。多重共线性当多元回归模型中的一个预测变量可以通过其他预测变量以高精度进行线性预测时,就会发生多重共线性。这可能导致扭曲或误导的结果。幸运的是,决策树和提升树算法天生对多重共线性免疫。当他们决定分割时,树将只选择一个完全相关的特征。但是,其他算法(如逻辑回归或线性回归)也不能避免这个问题,您应该在定型模型之前解决这个问题。
我该如何处理这个问题?
处理这个问题有多种方法。最简单的方法是删除或消除一个完全相关的特征。另一种方法是使用降维算法,如主成分分析(PCA) 。
Spearman VS Pearson 相关矩阵:
Spearman 和 Pearson 是计算两个变量或属性之间相关性强度的两种统计方法。皮尔逊相关系数可用于具有线性关系的连续变量。这里有一个例子:
The output of the above code
要打印皮尔逊系数得分,我只需运行pearsonr(X,Y)
,结果是:(0.88763627518577326, 5.1347242986713319e-05)
,其中第一个值是皮尔逊相关系数,第二个值是 P 值。0.8 意味着变量高度正相关。
如果变量有非线性关系,你可以用斯皮尔曼相关系数**来衡量相关性。**它也可以和有序分类变量一起使用。可以通过跑步得到斯皮尔曼系数分数:scipy.stats.spearmanr(X,Y)
现在,这可能听起来很复杂,尤其是对于高维数据集。在这种情况下,更好的方法是用一个矩阵来可视化这种相关性。这里是你如何使用熊猫来做到这一点,我使用的是来自 Kaggle 的 Porto Seguro 的安全驾驶员预测数据集:
从上面的矩阵中可以看出,ps_reg_03 和 ps_reg_02 变量之间以及 ps_car_12 和 ps_car_13 之间有很高的相关性。
还有另一种流行的方法,称为肯德尔的τ系数,它也是基于可变等级,但与斯皮尔曼的系数不同,它没有考虑等级之间的差异。因为本文的重点是 Pearson 和 Spearman 相关性,所以 Kendall 方法超出了本文的范围。
误解(鹳会接生婴儿吗?):
相关性经常被解释为因果关系,这是一个很大的误解。变量之间的相关性并不表示因果关系。任何高度相关的变量都应该仔细检查和考虑。这里有一篇(幽默)德国论文用相关性证明了婴儿是由鹳传播的理论。这项研究表明,城市周围鹳鸟数量的增加与城市医院外分娩数量的增加之间存在显著的相关性
Source: http://web.stanford.edu/class/hrp259/2007/regression/storke.pdf
左边的图表显示了鹳数量的增加(粗黑线)和住院分娩数量的减少。另一方面,右边的图表显示,一些院外分娩(白色正方形标记)遵循鹳数量增加的模式。尽管这项研究并不意味着从科学上证明(幼鹳理论),但它表明,通过高度的相关性,一种关系可能看起来是因果关系。这可能是由于一些未观察到的变量。例如,人口增长可能是另一个原因变量。
总之:相关性在许多应用中非常有用,尤其是在进行回归分析时。但是,不应该把它和因果关系混在一起,以任何方式曲解。您还应该始终检查数据集中不同变量之间的相关性,并收集一些见解作为探索和分析的一部分。
你最喜欢的业务指标不能告诉你关于你的客户的什么
您是否仅使用“平均值”或“比率”等指标来制定数据驱动的业务决策?如果是这样,你可能是在做错误的商业分析。
我将使用两个数据分析案例向您展示为什么只关注这些指标可能是危险的,以及您应该做些什么。
案例 1:平均值不能代表你的客户
为什么?
在分析产品和业务绩效时,我们经常使用平均值,但是单独使用平均值会产生盲点。因为由于市场的不同细分或纯粹的随机性,总会有变化,而平均值并不会告诉你故事的变化。
示例:我们的客户平均购买多少产品?
一家公司试图了解客户购买的平均商品数量。对于纽约和洛杉矶,他们发现每位顾客平均购买的商品是一样的(45 件)。
现在,根据下面的情节,我们应该对纽约和洛杉矶的客户应用相同的营销策略吗?
没有。
在洛杉矶(绿线),85%的顾客购买了 40-50 件商品,这意味着平均数量(45)可以代表大多数顾客的行为。你可能只需要一个大的运动来瞄准大多数人。
然而,在纽约,平均值只能代表 50%的顾客行为。大多数顾客,比如说 85%,介于购买 10 件商品和 80 件商品之间,我们可以从橙色“哑铃”形线所示的大量数据中观察到这一点。
这意味着,纽约的顾客比洛杉矶的顾客有更多的变化,当顾客的行为更加多样化时,你可能需要针对纽约的多种营销策略。
我们做什么呢
通过计算方差找出平均值附近的范围。
通常,数据科学家会报告一个置信区间(CI)来估计平均值所在的概率。(此链接可以帮助您构建置信区间,您可以在 Excel 中创建它)
报告的一个例子是:纽约每个顾客购买的物品的平均值是 45,85%的置信区间是 10 到 80。
案例二。比率度量可能非常敏感和不可靠
为什么?
比率指标由至少两个指标组成;例如,点击率是点击数除以浏览量。随着每个指标的变化,比率指标的变化更加复杂,它不遵循任何常见的分布。
例子
我们先看下表。你在测量点击率,从这个表中,看起来点击率从一月到二月有所增加。听起来不错吧?
嗯,实际上点击量和浏览量都下降了,只是因为浏览量下降更多。所以这个涨幅很可能不是你想要的。
现在,让我们再看 4 个场景,看看当我们控制一个变量并改变另一个变量时,点击率是如何变化的。在每种情况下,我们能以相同的确定性信任该比率吗?
左表显示,如果分母(视图)稳定,比率度量随着分子(点击)的移动而成比例移动,数据的不确定性很容易估计,不确定性的尺度变化不大。
在右表中,当分母(视图)足够大时,如前几行所示,比率(CTR)非常稳定,只有 1–2%的不确定性。然而,如果你看下面的行,当分母很小时,该比率对变化非常敏感并且不稳定!在这种情况下,更好的方法是监控浏览量和点击量,并在决策时考虑各种情况。
我们做什么呢
- 为 分母 设置最小可接受值的阈值。因为当分母很小时,比率可以有很大的方差,所以我们只信任分母足够大时的比率。如果你不得不在分母很小的时候使用比率指标来做决定,确保你报告了一个包含波动的范围。
- 监控我们用于比率计算的实际值(分子、分母)。通过模拟分子和分母的不同情景,理解比率的范围。
您的业务分析战略要点:
数据分析不仅仅是计算,也是对不确定性的测量
虽然平均值或某些比率指标等汇总统计数据有助于我们’ 缩小 ‘并看到数据和我们业务的全貌,但我们还需要’ 放大 '数据的范围和形状,以确保我们理解与指标相关的不确定性。
- 一个数据点是不够的!在其周围创建范围,并使用方差来估计数据的不确定性或不同分段。
- 如果你的指标是比率,比如点击率,分析不同的场景,看看当分母和分子改变时,指标是如何变化的。如果您的分母很小,请小心,这意味着该比率对数据的变化更敏感,可能不可靠!
- 将它可视化,以确保我们不会遗漏数据中的任何模式或异常值。
想为你的创业公司获得更多关于数据分析的免费教程吗?点击下面的链接或图片获取我的时事通讯!
No spam, I’ll be mindful of your time and attention
为什么要找一个数据主管?
本文是一个保持、保留和释放数据团队价值的案例。企业需要数据科学家提供有价值的见解,但却达不到预期的结果。借助数字领导者的帮助,调整您的战略、人员和业务,创造可衡量、可操作的结果。
问题:专攻次要的事情
我在福布斯上找到一篇文章,解释了下面的一个数据科学职位描述:
职责:
将业务需求转化为机器学习产品。
为我们的核心业务设计和构建机器学习软件产品。
与业务负责人沟通战略和基本原理,定义并执行项目计划
领导 ML 自动化的所有方面,包括模型训练和开发、特征选择和模型调整。
开发生产 ML 和数据管道。开发生产代码并交付给生产环境[1]。
对于数据科学领域的人来说,他们知道这是一个非常尖锐的问题。以下是工作经验或职位的翻译,按其各自的顺序排列:
已转换的职责(平均。工资摘自 PayScale.com):
- 业务分析师(68,000 美元/年)
- 解决方案架构师(117,000 美元/年)
- 项目经理(87,000 美元/年)
- 数据科学家(9.5 万美元/年)
- 数据工程师(92,000 美元/年)
当然,如果能以五分之一的价格雇佣一个至少能扮演五种商业角色的人,那就太好了。从商业或金融的角度来看,这是一项伟大的投资。问题是,许多第一次涉足数据科学的企业往往抱有很高的期望。巨大的期望没有错,但大多数数据科学家在没有适当支持的情况下进入角色,以提供有利可图的见解。
证据:没有一致的愿景
根据我在咨询许多公司时的个人经验,IT 部门的任何人都可以证明,大多数公司都有脏数据(非结构化、缺少值、某些领域中的错误数据等。).这是一个普遍的大问题。它如此普遍,以至于有了一个名字——GIGO(垃圾进,垃圾出)。对于数据科学家来说,从数据中创建预测是一项非常具有挑战性的任务。大多数模型需要在各种条件下有足够的样本,以便捕捉潜在趋势,做出准确而有见地的预测。事实上,这些数据问题正在影响数据团队的结果,正如在大多数失败的预测中看到的[2]:
你知道有一个问题,当你雇佣某人做 X,他们给你 y,在这种情况下,做预测,但相反只告诉你正在发生什么。那么,到底是怎么回事呢?作为一名来自 Oracle states 的数据科学贡献者,公司抱有错误的期望:
“做数据科学和管理数据科学不是一回事[3]。”
基本上,数据科学家需要支持团队来确保高质量的数据流入他们的模型,以创造有价值的业务洞察力。然而,高层领导未能利用他们的数据科学家取得成功[4]。问题在于缺少一个领导席位。为了让数据产生推动收益的收入,需要有一个数据主管。
解决方案:数据领先
数据执行官、首席数据官(CDO)或首席信息官(CIO)需要被安排在企业中,以便执行以数据为动力的业务战略。我知道有些人会说首席数据官更适合这个职位,但首席信息官也不错。首席信息官也可以执行这项任务,因为众所周知,首席信息官向企业领导人提供数据驱动的见解。为什么不把提高数据质量的需求加入到列表中呢?毕竟,数据质量会反馈到相同的报告中,但是我离题了。数据领导者的主要原因是业务成果[5]:
如上所述,与行业竞争对手相比,数据主管可以释放公司内数据资源和团队的价值,使盈利能力提高 26%,收入提高 9%。
数据主管的行动步骤
从一个数据领导者那里,你可以期待至少三件主要的事情发生在你的业务中:数据愿景、组织对数据的认同和数据治理[5]。有了这三项改进,数据科学团队将能够按预期运行,做出有价值的预测。
用数据创造愿景
用数据增强的愿景解释了为什么进行数据转换以及最终结果是什么。例如,出租车的商业模式是收费用车运送乘客。同一个出租车视觉的数据增强视觉现在被称为优步。一家利用移动应用技术收费用汽车运送人员的企业。data executive 使企业能够利用直到最近才出现的数据驱动的应用程序和模型。
重整公司
以我的经验来看,组织变革从来都不容易,但那些进展较好的组织拥有公开透明的领导。同样从精益项目管理来看,倾听员工和他们的瓶颈是可能的改进,也是运营改进的来源。数据主管将成为数字化转型的焦点,并使公司的各个部门能够凝聚成一个数据驱动的愿景。
形成数据治理
正如许多类型的管理者所知道的那样,人们被给予了前进的命令,但有时会偏离正途。这就是数据治理的用武之地。在数据主管的领导下,数据治理引导所有数据来支持业务,并帮助确保高数据质量。通常情况下,首席数据官会领导治理委员会和联络人。
结论
如前所述,58%的数据科学家甚至不使用他们的模型*【2】进行预测。假设这些都是优秀的数据科学家,有一个潜在的问题——没有数据领导。数据主管需要为数据团队提供支持和愿景,以增加业务价值。这需要整个组织从企业收集的数据中释放价值,并需要一个合适的数据领导者将这些见解转化为利润。有了数据执行官,企业可以有一个适当的数据驱动愿景,将公司凝聚到数据愿景,并建立数据治理,以实现+9%的收入增长和+26%的盈利能力【5】*。
免责声明:本文陈述的所有内容均为我个人观点,不代表任何雇主。
[1] N. Talagala,《雇佣数据科学家:好的、坏的和丑陋的》(2019),https://www . Forbes . com/sites/cognitive world/2019/04/30/Hiring-A-Data-Scientist-The-Good-The-Bad-And-The-Ugly/# 6 e 36d 20 b 49 c 0
[2] N. Gift,为什么到 2029 年将没有数据科学职位头衔(2019 年),https://www . Forbes . com/sites/Forbes tech Council/2019/02/04/Why-they-Will-they-Be-No-Data-Science-Job-Titles-By-2029/# 1856 b 62 d3a 8 f
[3] E. Chenard,为什么数据科学领域的领导者要退出?(2018),https://www . data science . com/blog/why-data-science-leaders-fail
[4] T .莱德曼,你在让你的数据科学家们失败吗?(2018),https://HBR . org/2018/01/are-you-setting-your-data-scientists-up-to-fail
[5] Capegemini,领导者转型,甲骨文全球大会 2014。
为什么 Git 和 Git-LFS 不足以解决机器学习再现性危机
一些人声称,由于软件工具不足以确保可重复的过程,机器学习领域正处于危机之中。这场危机是关于复制机器学习模型等结果的困难。这场危机可以通过为机器学习从业者提供更好的软件工具来解决。
再现性问题如此重要,以至于年度 NeurIPS 会议计划将此作为 NeurIPS 2019 的主要讨论主题。“征文”公告有更多信息https://medium . com/@ NeurIPSConf/Call-for-Papers-689294418 f43
所谓的危机是因为很难复制同事或科学家同事的工作,威胁到他们在彼此工作的基础上发展、与客户分享或部署生产服务的能力。由于机器学习和其他形式的人工智能软件在学术和企业研究中被广泛使用,可复制性或再现性是一个关键问题。
我们可能认为这可以用典型的软件工程工具来解决,因为机器学习开发类似于常规的软件工程。在这两种情况下,我们生成某种编译的软件资产,在计算机硬件上执行,希望得到准确的结果。为什么我们不能利用软件工具的丰富传统和软件质量的最佳实践来为机器学习团队构建可重复的过程呢?
不幸的是,传统的软件工程工具并不能很好地满足机器学习研究人员的需求。
一个关键问题是训练数据。通常,这是大量的数据,如图像、视频或文本,这些数据被输入到机器学习工具中以训练 ML 模型。通常,训练数据不在任何种类的源代码控制机制下,仅仅是因为像 Git 这样的系统不能很好地处理大型数据文件,并且被设计来为文本文件生成增量的源代码控制管理系统不能很好地处理大型二进制文件的改变。任何有经验的软件工程师都会告诉你,一个没有源代码控制的团队将会处于一种难以管理的混乱状态。更改不会总是被记录下来,团队成员可能会忘记做了什么。
最终,这意味着根据训练数据训练的模型无法复制,因为训练数据集将以未知的方式发生变化。如果没有软件系统来记住任何一天数据集的状态,那么有什么机制来记住什么时候发生了什么呢?
Git-LFS 是你的解决方案,对吗?
第一个反应可能是简单地使用 Git-LFS (Git 大文件存储),因为顾名思义,它在 Git 的基础上处理大文件。其卖点是 Git-LFS " 在 Git 内部用文本指针替换大文件,如音频样本、视频、数据集和图形,同时将文件内容存储在远程服务器上,如 GitHub.com 或 GitHub Enterprise。人们可以想象一个忙碌的机器学习团队说“听起来很棒,让我们去做吧”。它可以处理数千兆字节的文件,加快从远程存储库签出的速度,并使用同样舒适的工作流程。那确实符合很多条件,不是吗?
没那么快,难道你的经理没有指示你在全力以赴之前要仔细评估吗?另一个要记住的人生教训是,过马路前要朝两边看。
您的评估应该出现的第一件事是 Git-LFS 需要一个 LFS 服务器,而这个服务器并不是每个 Git 托管服务都提供的。三巨头(Github、Gitlab 和 Atlassian)都支持 Git-LFS,但也许你身体里有一块 DIY 的骨头。与其使用第三方 Git 托管服务,您可能更喜欢托管自己的 Git 服务。例如,Gogs 是一个可以在自己的硬件上轻松运行的合格的 Git 服务,但是它没有对 Git-LFS 的内置支持。
根据你的数据需求,下一个可能是杀手锏: Git LFS 可以让你存储高达 2 GB 的文件。这是 Github 的限制,而不是 Git-LFS 的限制,然而所有的 Git-LFS 实现似乎都有各种各样的限制。Gitlab 和 Atlassian 都有自己的 Git-LFS 限制列表。考虑一下 Github 的 2GB 限制:Git-LFS 项目中的一个用例是存储视频文件,但是视频的大小远远超过 2GB 不是很常见吗?因此 Github 上的 GIt-LFS 可能不适合机器学习数据集。
不仅仅是 2GB 的文件大小限制,Github 对 Git-LFS 使用的免费层设置了如此严格的限制,以至于人们必须购买涵盖数据和带宽使用的数据计划。
与带宽相关的一个问题是,当使用托管的 Git-LFS 解决方案时,你的训练数据存储在远程服务器上,必须通过互联网下载。下载训练数据的时间是一个严重的用户体验问题。
另一个问题是将数据文件放在云存储系统(AWS,GCP 等)上的容易程度,这是运行基于云的人工智能软件时经常需要的。这是不支持的,因为来自三大 Git 服务的主要 Git-LFS 产品将你的 LFS 文件存储在他们的服务器上。有一个 DIY 的 Git-LFS 服务器可以在 https://github.com/meltingice/git-lfs-s3 的 AWS S3 上存储文件,但是设置一个定制的 Git-LFS 服务器当然需要额外的工作。另外,如果您需要文件位于 GCP 而不是 AWS 基础设施上,该怎么办呢?有没有 Git-LFS 服务器在你选择的云存储平台上存储数据?有没有利用简单 SSH 服务器的 Git-LFS 服务器?换句话说,GIt-LFS 限制了您对数据存储位置的选择。
使用 Git-LFS 是否解决了所谓的机器学习再现性危机?
有了 Git-LFS,你的团队可以更好地控制数据,因为它现在是受版本控制的。这意味着问题解决了吗?
之前我们说过“的关键问题是训练数据,但那是谎言。算是吧。是的,将数据置于版本控制之下是一个很大的改进。但是缺乏对数据文件的版本控制是全部问题吗?号码
是什么决定了训练一个模型或其他活动的结果?决定性因素包括以下内容,甚至更多:
- 训练数据-图像数据库或任何用于训练模型的数据源
- 用于训练模型的脚本
- 训练脚本使用的库
- 用于处理数据的脚本
- 用于处理数据的库或其他工具
- 操作系统和 CPU/GPU 硬件
- 生产系统代码
- 生产系统代码使用的库
显然,训练模型的结果取决于各种条件。因为有太多的变量,所以很难精确,但是普遍的问题是缺少现在所谓的配置管理。软件工程师已经认识到能够指定部署系统时使用的精确系统配置的重要性。
机器学习再现性的解决方案
人类是一个有创造力的群体,对于这场“危机”有许多可能的解决方案。
像 R Studio 或 Jupyter Notebook 这样的环境提供了一种交互式的 Markdown 文档,可以配置它来执行数据科学或机器学习工作流。这对于记录机器学习工作以及指定使用哪些脚本和库非常有用。但是这些系统没有提供管理数据集的解决方案。
同样,Makefiles 和类似的工作流脚本工具提供了重复执行一系列命令的方法。执行的命令是通过文件系统时间戳确定的。这些工具没有为数据管理提供解决方案。
在天平的另一端是像 Domino 数据实验室或 C3 物联网这样的公司,它们为数据科学和机器学习提供托管平台。两者都打包了一个基于大量数据科学工具的产品。在某些情况下,如 C3 物联网,用户使用专有语言编码,并将他们的数据存储在专有数据存储中。使用一站式购物服务可能很诱人,但它能提供所需的灵活性吗?
在本文的其余部分,我们将讨论 DVC。它旨在紧密匹配 Git 功能,利用我们大多数人对 Git 的熟悉程度,但其功能使其在机器学习环境中的工作流和数据管理方面都很好。
与 Git-LFS 或其他几个潜在的解决方案相比,DVC(https://dvc.org)承担并解决了更大一部分的机器学习可重复性问题。它通过管理代码(脚本和程序)以及大型数据文件来做到这一点,这是 DVC 和 Git 这样的源代码管理(SCM)系统的混合体。此外,DVC 还管理处理机器学习实验中使用的文件所需的工作流程。数据文件和要执行的命令在 DVC 文件中描述,我们将在下面的章节中了解这些文件。最后,使用 DVC 可以很容易地在许多存储系统上存储数据,从本地磁盘到 SSH 服务器,或者到云系统(S3、GCP 等)。DVC 管理的数据可以很容易地与使用该存储系统的其他人共享。
Image courtesy dvc.org
DVC 使用与 Git 相似的命令结构。正如我们在这里看到的,就像git push
和git pull
用于与合作者共享代码和配置一样,dvc push
和dvc pull
用于共享数据。所有这些都将在接下来的章节中详细介绍,或者如果你想直接了解 DVC,可以在 https://dvc.org/doc/tutorial看教程。
DVC 准确地记得哪些文件在什么时间点被使用过
DVC 的核心是一个数据存储(DVC 缓存),它为存储和版本控制大型文件而优化。团队选择哪些文件存储在 SCM 中(比如 Git ),哪些存储在 DVC 中。由 DVC 管理的文件是这样存储的,DVC 可以维护每个文件的多个版本,并使用文件系统链接来快速更改每个文件正在使用的版本。
从概念上讲,SCM(像 Git)和 DVC 都有保存每个文件多个版本的存储库。一个人可以签出“版本 N ”,相应的文件将出现在工作目录中,然后再签出“版本 N+1 ”,文件将会改变以匹配。
Image courtesy dvc.org
在 DVC 端,这在 DVC 缓存中处理。存储在缓存中的文件通过内容的校验和(MD5 哈希)进行索引。当由 DVC 管理的单个文件改变时,它们的校验和当然会改变,并且会创建相应的缓存条目。缓存保存每个文件的所有实例。
为了提高效率,DVC 使用多种链接方法(取决于文件系统支持)将文件插入工作区,而无需复制。这样,DVC 可以在需要时快速更新工作目录。
DVC 使用所谓的“DVC 文件”来描述数据文件和工作流程步骤。每个工作空间将有多个 DVC 文件,每个文件描述一个或多个带有相应校验和的数据文件,每个文件描述一个要在工作流中执行的命令。
cmd: python src/prepare.py data/data.xml
deps:
- md5: b4801c88a83f3bf5024c19a942993a48
path: src/prepare.py
- md5: a304afb96060aad90176268345e10355
path: data/data.xml
md5: c3a73109be6c186b9d72e714bcedaddb
outs:
- cache: true
md5: 6836f797f3924fb46fcfd6b9f6aa6416.dir
metric: false
path: data/prepared
wdir: .
这个示例 DVC 文件来自《DVC 入门》示例(【https://github.com/iterative/example-get-started】)并显示了工作流的初始步骤。我们将在下一节详细讨论工作流。现在,注意这个命令有两个依赖项,src/prepare.py
和data/data.xml
,以及一个名为data/prepared
的输出数据目录。所有内容都有一个 MD5 哈希,随着这些文件的更改,MD5 哈希也将更改,更改数据文件的新实例将存储在 DVC 缓存中。
DVC 文件被登记到 SCM 管理的(Git)存储库中。当提交到 SCM 库时,每个 DVC 文件都用每个文件的新校验和更新(如果合适的话)。因此,使用 DVC,人们可以准确地重新创建每个提交的数据集,团队可以准确地重新创建项目的每个开发步骤。
DVC 文件大致类似于 Git-LFS 中使用的“指针”文件。
DVC 团队建议每个实验使用不同的 SCM 标签或分支。因此,访问适合该实验的数据文件、代码和配置就像切换分支一样简单。SCM 将自动更新代码和配置文件,DVC 将自动更新数据文件。
这意味着不再需要绞尽脑汁去回忆哪些数据文件被用于什么实验。DVC 为你追踪这一切。
DVC 记得在什么时间点使用的命令的确切顺序
DVC 文件不仅记住在特定执行阶段使用的文件,而且记住在该阶段执行的命令。
再现机器学习结果不仅需要使用完全相同的数据文件,还需要相同的处理步骤和相同的代码/配置。考虑创建模型的一个典型步骤,即准备样本数据以便在后面的步骤中使用。您可能有一个 Python 脚本 prepare.py 来执行这种分割,并且您可能有一个名为data/data.xml
的 XML 文件中的输入数据。
$ dvc run -d data/data.xml -d code/prepare.py \
-o data/prepared \
python code/prepare.py
这就是我们如何使用 DVC 记录处理步骤。DVC 的“运行”命令根据命令行选项创建 DVC 文件。
-d
选项定义了依赖关系,在本例中,我们看到一个 XML 格式的输入文件和一个 Python 脚本。-o
选项记录输出文件,这里列出了一个输出数据目录。最后,执行的命令是一个 Python 脚本。因此,我们有输入数据、代码和配置,以及输出数据,所有这些都忠实地记录在生成的 DVC 文件中,该文件对应于上一节中显示的 DVC 文件。
如果prepare.py
从一个提交更改到下一个提交,SCM 将自动跟踪该更改。同样,对data.xml
的任何更改都会在 DVC 缓存中产生一个新实例,DVC 会自动跟踪这个新实例。如果结果数据目录发生变化,DVC 也会对其进行跟踪。
DVC 文件也可以简单地指一个文件,就像这样:
md5: 99775a801a1553aae41358eafc2759a9
outs:
- cache: true
md5: ce68b98d82545628782c66192c96f2d2
metric: false
path: data/Posts.xml.zip
persist: false
wdir: ..
这是由“dvc add *file*
”命令产生的,当你只有一个数据文件时使用,它不是另一个命令的结果。例如,在https://dvc.org/doc/tutorial/define-ml-pipeline中显示了这一点,这导致了紧接在前面的 DVC 文件:
$ wget -P data https://dvc.org/s3/so/100K/Posts.xml.zip
$ dvc add data/Posts.xml.zip
然后,文件Posts.xml.zip
是教程中显示的一系列步骤的数据源,这些步骤从这些数据中获取信息。
退后一步,认识到这些是一个更大的工作流程中的单个步骤,或者 DVC 所说的流水线。使用“dvc add
”和“dvc run
”可以将几个阶段串在一起,每个阶段都是使用“dvc run
”命令创建的,并且每个阶段都由一个 DVC 文件描述。完整的工作示例见https://github.com/iterative/example-get-started和https://dvc.org/doc/tutorial
这意味着每个工作目录将有几个 DVC 文件,每个文件对应于项目中使用的管道中的每个阶段。DVC 扫描 DVC 文件以建立再现流水线输出所需的命令的有向无环图(DAG)。每个阶段都像一个小型 Makefile,只有当依赖关系发生变化时,DVC 才会执行命令。它之所以不同,还因为 DVC 不像 Make 那样只考虑文件系统的时间戳,而是考虑文件内容是否已更改,这是由 DVC 文件中的校验和与文件的当前状态决定的。
最重要的是,这意味着不再需要绞尽脑汁去回忆每个实验使用的是哪个版本的脚本。DVC 为你追踪这一切。
Image courtesy dvc.org
DVC 使得团队成员之间共享数据和代码变得容易
一个机器学习研究人员可能正在与同事一起工作,需要共享数据、代码和配置。或者研究人员可能需要将数据部署到远程系统,例如在云计算系统(AWS、GCP 等)上运行软件,这通常意味着将数据上传到相应的云存储服务(S3、GCP 等)。
DVC 工作区的代码和配置存储在 SCM 中(像 Git 一样)。使用普通的 SCM 命令(如“git clone
”)可以很容易地与同事分享。但是如何与同事分享数据呢?
DVC 有远程存储的概念。DVC 工作区可以向远程存储推送数据,也可以从远程存储中提取数据。远程存储池可以存在于任何云存储平台(S3、GCP 等)以及 SSH 服务器上。
因此,为了与同事共享代码、配置和数据,您首先要定义一个远程存储池。SCM 跟踪保存远程存储定义的配置文件。接下来,您将配置管理库推送到一个共享服务器上,这个服务器带有 DVC 配置文件。当您的同事克隆存储库时,他们可以立即从远程缓存中提取数据。
这意味着你的同事不再需要绞尽脑汁想如何运行你的代码。他们可以轻松地复制用于产生结果的精确步骤和精确数据。
Image courtesy dvc.org
结论
可重复结果的关键是使用良好的实践,不仅保持数据的正确版本化,而且保持代码和配置文件的正确版本化,并自动化处理步骤。成功的项目有时需要与同事合作,这通过云存储系统变得更加容易。有些工作需要 AI 软件在云计算平台上运行,需要将数据文件存储在云存储平台上。
有了 DVC,机器学习研究团队可以确保他们的数据、配置和代码彼此同步。这是一个易于使用的系统,它可以有效地管理共享的数据仓库,以及存储配置和代码的 SCM 系统(如 Git)。
资源
早在 2014 年,杰森·布朗利写了一份清单,他声称默认情况下会鼓励可重复的机器学习结果:https://machinelingmastery . com/reproducible-machine-learning-results-by-default/
机器学习研究再现性的实用分类法 Kaggle 和华盛顿大学工作人员的研究论文http://www . RCT atman . com/files/2018-7-14-ml Reproducibility . pdf
麦吉尔大学的研究人员 Joelle Pineau 有另一个机器学习可重复性的清单https://www . cs . McGill . ca/~ jpineau/reproducibilitychecklist . pdf
她在 NeurIPS 2018 大会上做了一个演讲:【https://videoken.com/embed/jH0AgVcwIBc (大约 6 分钟开始)
12 因素应用程序是对 web 服务的可再现性或可靠性的一种测试https://12factor.net/
《自然》杂志对科学家进行的一项调查显示,超过 50%的科学家认为复制结果存在危机
为什么使用 Git 以及作为数据科学家如何使用 Git
也许你在别的地方听说过 Git。
也许有人告诉你,Git 只面向软件开发人员,作为一名数据科学家,simple 对此毫不关心。
如果你是一名软件工程师转数据科学家,这个话题对你来说是非常熟悉的。
如果你是来自不同背景的有抱负的数据科学家,希望进入这个领域,这个主题是你会感兴趣的——无论是现在还是在不久的将来。
如果你已经是一名数据科学家,那么你就会知道我在这里写的是什么以及为什么。
在文章的最后,我希望我在 Git 方面的经验分享能够让了解 Git 的重要性,以及作为一名数据科学初学者如何在您的数据科学工作中使用它。
我们开始吧!
那么 Git 是什么?
Git 是一个分布式版本控制系统,用于在软件开发期间跟踪源代码的变更
—维基百科
看维基百科给出的这个定义,我也曾经处在你的位置,才觉得 Git 是为软件开发者做的。作为一名数据科学家,我与此无关,只是安慰自己。
事实上, Git 是当今世界上使用最广泛的现代版本控制系统。这是以分布式和协作的方式为项目(开源或商业)做贡献的最受认可和流行的方法。
除了分布式版本控制系统, Git 的设计考虑了性能、安全性和灵活性。
现在您已经理解了 Git 是什么,您脑海中的下一个问题可能是,“如果只有我一个人在做我的数据科学项目,它与我的工作有什么关系?”
而不能领会 Git 的重要性也是可以理解的(就像我上次做的那样)。直到我开始在真实世界环境中工作,我才如此感激学习和实践 Git,即使是在我独自从事个人项目的时候——在后面的部分你会知道为什么。
现在,请继续阅读。
为什么是 Git?
让我们来谈谈为什么。
为什么是 Git?
一年前,我决定学习 Git。我在 GitHub 上第一次分享并发布了我的模拟代码,这是我在 CERN 为我的最后一年论文项目所做的。
同时很难理解 git 中常用的术语(Git 添加、提交、推送、拉取等。),我知道这在数据科学领域很重要,成为开源代码贡献者的一员让我的数据科学工作比以往更有成就感。
于是我继续学习,不断“犯”。
当我加入目前的公司时,我在 Git 方面的经验派上了用场,在那里,Git 是不同团队之间代码开发和协作的主要方式。
更重要的是,当您的组织遵循敏捷软件开发框架时,Git 特别有用,在这种框架中,Git 的分布式版本控制使整个开发工作流更加高效、快速,并且易于适应变化。
我已经多次谈到版本控制。那么版本控制到底是什么?
版本控制是一个记录文件或文件集随时间变化的系统,这样你可以在以后调用特定的版本。
比方说,你是一名数据科学家,与一个团队合作,你和另一名数据科学家从事相同的工作,建立一个机器学习模型。酷毙了。
如果您对函数进行了一些更改,并上传到远程存储库,并且这些更改与主分支合并,那么您的模型现在就变成了版本 1.1(只是一个例子)。另一位数据科学家也在 1.1 版中对相同的功能进行了一些更改,新的更改现在已合并到主分支中。现在模型变成了 1.2 版本。在任何时候,如果你的团队发现 1.2 版本在发布过程中有一些错误,他们可以随时调用之前的 1.1 版本。
这就是版本控制的美妙之处
—我
作为数据科学家如何使用 Git
我们已经讨论了 Git 是什么以及它的重要性。
现在的问题归结为:作为数据科学家如何使用 Git?
要成为数据科学家,你不需要成为 Git 专家,我也不需要。这里的关键是理解 Git 的工作流程和如何在日常工作中使用 Git。
请记住,您不可能记住所有的 Git 命令。像其他人一样,在需要的时候随时可以谷歌一下。足智多谋。
我将重点介绍在 Bitbucket 中使用 Git(免费使用)。当然,这里的工作流程也适用于 GitHub。确切的说,我在这里使用的工作流是 Git 特性分支工作流,这是开源和商业项目常用的工作流。
如果您想了解更多这里使用的术语,这是一个很好的起点。
Git 功能分支工作流
特性分支工作流假设了一个中央存储库,master
代表了正式的项目历史。
开发人员不是直接提交到他们的本地master
分支,而是在每次开始工作一个新特性时创建一个新的分支。
特性分支可以(也应该)被推送到中央存储库。这使得在不接触任何官方代码的情况下与其他开发者共享一个特性成为可能——在这个例子中是master
分支。
在您开始做任何事情之前,键入git remote -v
以确保您的工作空间指向您想要使用的远程存储库。
1.从主分支开始,创建一个新分支
git checkout master
git pull
git checkout -b branch-name
假设master
分支总是被维护和更新,您切换到本地master
分支,并将最新的提交和代码拉到您的本地master
分支。
让我们假设您想要创建一个本地分支,向代码中添加一个新特性,并在以后将更改上传到远程存储库。
一旦您获得了本地master
分支的最新代码,让我们创建并签出一个名为branch-name
的新分支,所有的更改都将在这个本地分支上进行。这意味着您当地的master
分公司不会受到任何影响。
2.更新、添加、提交和推送您的更改到远程存储库
git status
git add <your-files>
git commit -m 'your message'
git push -u origin branch-name
好吧。这里发生了很多事情。让我们一个一个的分解。
一旦您做了一些更新,将新特性添加到您的本地branch-name
中,并且您想要将更改上传到远程分支,以便稍后合并到远程master
分支。
git status
将因此输出所有的文件更改(跟踪或未跟踪)由你。在使用git commit -m 'your message'
通过消息提交更改之前,您将使用git add <your-files>
决定要暂存哪些文件。
在此阶段,您的更改仅出现在您的本地分支机构中。为了让您的更改出现在 Bitbucket 上的远程分支中,您需要使用git push -u origin branch-name
来提交您的提交。
这个命令将branch-name
推送到中央存储库(原点),-u
标志将它添加为远程跟踪分支。在设置了跟踪分支之后,可以在没有任何参数的情况下调用git push
来自动将新特性分支推送到 Bitbucket 上的中央存储库。
3.创建一个拉取请求,并对拉取请求进行更改
太好了!现在,您已经成功地添加了一个新特性,并将更改推送到您的远程分支。
您对自己的贡献感到非常自豪,并且希望在将远程分支与远程主分支合并之前获得团队成员的反馈。这使得其他团队成员有机会在变更成为主要代码库的一部分之前对其进行审查。
您可以在 Bitbucket 上创建一个 pull 请求。
现在,您的团队成员已经查看了您的代码,并决定在将代码合并到主代码库— master
分支之前,需要您做一些其他的更改。
git status
git add <your-files>
git commit -m 'your message'
git push
因此,您可以按照与之前相同的步骤进行更改、提交并最终将更新推送到中央存储库。一旦您使用了git push
,您的更新将自动显示在 pull 请求中。就是这样!
如果其他人对您接触过的相同代码的目标进行了更改,您将会遇到合并冲突,这在正常的工作流中是很常见的。你可以在这里看到关于如何解决合并冲突的。
一旦一切顺利完成,您的更新将最终与中央存储库合并到master
分支中。恭喜你!
最后的想法
感谢您的阅读。
当我第一次开始学习 Git 时,我感到非常沮丧,因为我仍然没有真正理解工作流——大图——尽管我理解了一般的术语。
这是我写这篇文章的主要原因之一,以便在更高的理解水平上对工作流进行真正的分解和解释。因为我相信对工作流程中发生的事情有一个清晰的理解会使学习过程更有效。
希望这篇分享在某些方面对你有益。
一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄
关于作者
阿德蒙德·李 目前是东南亚排名第一的商业银行 API 平台 Staq — 的联合创始人/首席技术官。
想要获得免费的每周数据科学和创业见解吗?
你可以在 LinkedIn 、 Medium 、 Twitter 、脸书上和他联系。
让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。
www.admondlee.com](https://www.admondlee.com/)
为什么从实施 Q-学习到深度 Q-学习会很困难
我不敢问的 3 个问题(和我的 Tensorflow 2.0 模板)
Photo by JESHOOTS.COM on Unsplash
对许多人来说,包括我自己,Q-learning 是强化学习世界的入门。它以一种直观的方式让我们完全习惯于状态、行动和奖励的核心思想,而不会被复杂的技术细节所困扰。
那么,是什么让深度 Q 学习变得如此困难呢?虽然 Q-learning 只花了我一天的时间就从阅读维基百科的文章变成了在一些开放健身馆环境下工作的东西,但是深度 Q-learning 却让我沮丧了一个多星期!
尽管名称如此,深度 Q 学习并不像用神经网络替换状态动作表那样简单。对我来说,熟悉深度 Q 网络(dqn)编码需要三个步骤来理解:
- 意识到 dqn 指的是一系列价值学习算法和为提高其稳定性而进行的工程改进的各种组合。
- 学习 Q 学习中基于贝尔曼方程的值迭代如何与神经网络所需的梯度下降更新相关。
- 弄清楚如何将神经网络更新与代理与环境的交互交织在一起。
这些步骤中的每一步都包含错误,我现在很想把这些错误贴上“愚蠢”或“基本”的标签。然而,我在学习资源中发现的一个困难是,它们将事物呈现为一个整洁、完整的故事,这与学习最终常常陷入的错综复杂的混乱形成了对比。
考虑到这一点,我将逐步解决我在自己的学习过程中遇到的主要问题和困惑,希望它能让其他人走得更容易。我还将构建一个与环境无关的代理模板,这是我在开始强化学习项目时经常使用的,使用 Tensorflow 2.0 进行神经网络。
q-学习回顾
在开始回答我的 3 个问题之前,让我们先回顾一下强化学习(RL)和 Q 学习算法。RL 的五个核心概念是环境、主体、状态、行动和奖励。
一个环境实际上是某种模拟,可以分解成离散的时间步骤。在每一步,代理通过观察其状态并采取动作来与环境交互。每个代理(环境可以有一个或多个,竞争或合作)的目标是最大化某种回报,这是其行为和环境状态(通常还有一些随机元素)的函数。奖励不一定在每一步都遵守,在这种情况下可以称之为稀疏。
由于代理人收到的奖励通常取决于它在许多步骤之前采取的行动,RL 的一个主要困难是确定哪些行动实际上导致了奖励。这就是所谓的信用分配问题。强化学习的一大类方法包括在给定状态的情况下,尝试学习每个动作的值。定义价值来捕捉一个超越直接回报的行为价值的更全面的度量,允许一个人尝试解决信用分配问题。
Q-learning 就是这样一种基于价值的方法。在最简单的实现中,值函数存储为一个表,每个单元格对应于从单个状态采取的单个动作的值。根据以下更新规则直接更新值:
为了将学习到的值转化为控制给定状态下代理行为的策略,在每一步选择给定状态的最大值。当值仍在被学习时,遵循稍微不同的策略以探索状态空间,一个简单的策略是ε-贪婪策略,其中以随时间退火的概率采取随机动作,否则采取最大值动作。
Q-learning 的一个主要限制是它只能在具有离散和有限的状态和动作空间的环境中工作。将 Q 学习扩展到更丰富的环境的一个解决方案是应用函数逼近器来学习值函数,将状态作为输入,而不是存储完整的状态-动作表(这通常是不可行的)。由于深度神经网络是强大的函数逼近器,因此尝试使它们适应这一角色似乎是合乎逻辑的。
等等,深度 Q-Learning 不是指单一算法?
所以把一个神经网络和上面的值更新方程放在一起,你就得到了深度 Q 学习,对吗?不完全是。
要成功地执行简单地用模型替换表格所激发的目的,必须采取一些额外的步骤。一个是,我将在下一节中介绍,虽然上述值迭代可以直接应用于显式存储值的情况,但如果值模型通常使用反向传播和梯度下降来更新神经网络权重,这实际上意味着设计一个适当的目标函数。
但在我们到达那里之前,我想解决一个事实,我希望我在第一次开始学习深度 Q-learning 时就已经知道:就其本身而言,使用神经网络学习价值观根本不能很好地工作。我的意思是:它是不稳定的,容易发散。
研究人员当然意识到了这一点,并从那时起开发了一系列增量插件和改进,成功地稳定了深度 Q 学习。由此得出了我第一个主要问题的答案。当人们提到“深度 Q 学习”时,他们谈论的是用神经网络函数逼近器进行 Q 学习的核心概念,但也是使其实际工作的技术集合。因此,这个术语指的是一系列相关的算法,我觉得这对一个初学者来说是相当混乱的!
为了了解这些技术的范围,我建议检查一下彩虹算法,这样命名是因为它采用了 DQN 扩展的全部范围:双 Q 学习、优先重放、决斗网络、多步学习、分布式 RL 和噪声网络。
作为基线,我建议用 deep mind 2015 年的论文《通过深度强化学习进行人类水平的控制》中的主要创新来实现 dqn,该论文在 Atari 游戏上训练 dqn。
- 体验回放:不是在每次“体验”(动作、状态、奖励、跟随状态)后立即进行网络更新,而是将这些体验存储在内存中,随机取样。
- 单独的目标网络:负责计算作为动作结果而达到的状态值的神经网络的权重被冻结,并且仅周期性地从“在线”网络复制。
为了开始使用代码模板,我将为我的代理和我的神经网络创建大部分为空的对象,以及一些我希望使用的参数和方法。如果您只对完成的模板感兴趣,请随意跳过这个片段。
由于本文的重点不是实际的神经网络,所以我先从一个简单的 2 层前馈网络(或多层感知器)开始。这通常足以在更简单的环境中调试 DQN。
我如何从更新矩阵单元到神经网络的权重?
正如我在上一节中暗示的,从 Q-学习到深度 Q-学习的一个障碍是将 Q-学习更新方程转化为可以与神经网络一起工作的东西。在 Q 学习实现中,直接应用更新,并且 Q 值是无模型的,因为它们是直接为每个状态-动作对学习的,而不是从模型计算的。
对于神经网络,我们最终想要更新模型的权重,以便以类似于 Q 学习更新的方式调整其输出。这通常通过反向传播和梯度下降来实现。幸运的是,大多数深度学习框架都会处理偏导数的反向传播,所以需要做的就是选择一个合适的成本函数。
事实证明,我们不需要看得太远。考虑 Q-learning 更新规则右侧的数量。这有时被称为 TD-target (时间差),代表我们希望 Q 值收敛到的值:执行一个动作的所有剩余时间步长的总预期回报,其中未来的回报以某个因子折现。
如果这个 TD 目标是我们希望 Q 值(即 DQN 环境下我们的神经网络输出)收敛的目标,那么使用我们当前输出到目标的距离作为我们的损失函数似乎是合适的。为此,平方误差显然是首选。现在,如果我们对输出层(Q 值)的损失函数求导,然后基于此编写梯度下降更新,我们会看到我们恢复了 Q 学习更新规则。
Squared error loss between predicted Q value and TD target
Gradient “with respect to Q value” (not completely rigorous)
Gradient descent “on Q value”
虽然这不是一个精确的论点,因为 Q 值输出本身不是在梯度下降过程中更新的参数,但它确实满足了直觉。然而,当第一次尝试实现它时,仍然有一些细节可能会成为令人沮丧的障碍。
- 我们如何计算下一个状态的值?
- 我们如何使梯度更新一次只取决于一个 Q 值,而不是整个输出层?
我们对下一个状态的价值的最佳估计是在那个状态下采取我们认为是最好的行动的价值。那就是:
这就是拥有一个独立的目标网络发挥作用的地方。我们将使用定期更新的目标网络,而不是使用将要更新其权重的在线网络。是的,这意味着我们使用当前网络的一个训练较少的版本来提供训练中使用的目标的一部分。这个一般概念被称为自举。
那么,如何使每次更新仅对应于调整一个 Q 值(当然,所有的权重都将被更新,从而改变网络解释状态和值动作的方式)?这是紧凑数学符号不能暗示代码中需要做什么的一个例子。在方程中写下标很容易,把它翻译成代码就有点难了,深度学习代码也是如此。
诀窍是使用可微运算选择出对目标函数有贡献的 Q 值,这样反向传播将起作用。事实证明这并不太难,但令人恼火的是,似乎没有人明确地谈论它。做到这一点的一种方法是对动作进行一次性编码,并以此为模板,将其与在线网络的输出相乘。查看下面的代码片段,了解这些想法是如何实现的。
网络培训如何适应环境中运行的剧集?
回想一下,为了与环境交互,我们的代理需要一个策略。当一些 RL 代理直接学习策略时,Q-学习代理采取中间步骤学习每个动作的值。这通常通过在每一步采取最有价值的行动来转化为政策,因为价值有预期的未来回报,这样做不一定会导致短视的行为。
在训练期间,可以使用单独的策略,以便更好地探索状态空间。重要的是要认识到,即使在这里,也有多种选择,但“香草”选择将是ε贪婪策略,它开始采取完全随机的行动,并随着时间的推移退火随机行动的速度。进行这种退火的一种简单方法是线性的,即每步进行少量的退火。此外,通过不将它一直退火到 0,一些探索甚至可以保留到训练的深处。
在这个阶段,你可能会遇到的一个术语是政策内和政策外学习之间的区别。基本上,如果代理使用相同的策略与环境交互,就像它在学习更新中估计状态-动作对的值一样,那么它就是基于策略的。由于我们的代理使用ε-贪婪策略来探索环境,但是假设在其目标函数中使用贪婪策略来计算状态的值,那么它就是违反策略的。可以与 Q 学习代理一起使用的 on-policy RL 算法的一个例子是 SARSA 。
因此,我们使用 epsilon-greedy 策略在发作期间控制代理,并使用 TD 目标和由单独的目标网络计算的值估计来更新其权重。还剩下什么?如何实现经验回放?
实际上,这意味着拥有一个类似于 T8 deque T9 的数据结构,当代理人一步一步走过每一集时,该结构存储“经验元组”。我发现的一件愚蠢的事情是,在许多文献中,经验元组被表示为( s_t,a_t,r_t,s_(t+1) ),而实际上,你并不知道下一个状态,只知道现在和过去的状态。所以在代码中,你最终将“最后状态”和“最后动作”存储在看起来更像( s_(t-1),a_(t-1),r_(t-1),s_t )的经验元组中。
除此之外,只需要认识到经验回放会带来一些额外的决定:
- 在开始训练之前,我们让 ER 记忆增长到多大?
- 最多应该储存多少经验?
- 一旦开始训练,我们应该每一步训练还是不那么频繁?
- 在每个培训步骤中,我们应该取样多少次经验?
实际上,这些决策都被编码为代理的额外参数,您可以用它来初始化代理。既然我们已经走了这么远,我觉得可以分享我的完整 DQN 模板代码了,我经常在开始新项目时使用它。请注意,根据环境的具体情况,需要一些额外的步骤来“插入”代理并获得一些功能。特别是,将动作索引映射到环境理解的动作几乎总是需要做的事情。尽管如此,我希望以下内容能提供一些价值,并加快您自己的实验。
结论
在这篇文章中,我回顾了 Q-learning,并讨论了三个让我难以从 Q-learning 过渡到深度 Q-learning 的问题。我希望这样做会让其他人更容易做出同样的飞跃。
我还分享了我在开始一个新的强化学习项目时使用的模板代码。因为环境有许多不同的风格,模板几乎肯定不能开箱即用。通常需要的主要扩展包括:
- 把一个整数动作翻译成环境可以理解的东西。
- 从状态中提取对模型有意义的特征,状态通常包含其他元数据。
- 实现附加逻辑来检测和处理剧集的开头和结尾。
接下来,一旦所有东西都插上电源,通常不需要很长时间,我就需要用更复杂或更适合问题的东西来替换初始网络。
记住这一点,我希望我所提供的将是一个有用的资源,我希望听到所有关于你自己的强化学习之旅。
为什么梯度下降是不够的:神经网络优化算法综合介绍
神经网络的目标是最小化 、 的损失,以产生更好更准确的结果 。 为了尽量减少损失,我们需要更新内部学习参数(特别是偏差 )。这些参数根据某个更新规则/功能进行更新。通常,我们认为 渐变下降 是一种更新规则。现在出现了两种类型的问题。
- 更新应该使用多少/哪些数据?
- 应该使用什么更新规则?
本帖在更好优化的背景下,以最简单的方式围绕这两个问题和答案展开。在这篇文章中,我将展示优化算法的直观形象,它们的不同类型和变体。
补充说明
本文假设读者对神经网络的概念、前向和后向传播、权重初始化、激活函数等有基本的了解。如果你不熟悉,我建议你关注我的其他关于这些话题的文章。
优化算法
优化算法试图通过遵循某种更新规则来最小化损失(成本)*。损失是一个数学函数,表示预测值和实际值之间的差异。损耗取决于实际值,该值是借助于 学习参数(权重 和 偏差) 和输入得出的。因此,学习参数对于更好的训练和产生准确的结果非常重要。为了找出这些参数的最佳值,我们需要不断地更新它们。为此,应该有一些更新规则。所以我们使用各种 优化算法 遵循一定的更新规则,每个优化算法都有不同的方法来计算、更新和找出模型参数的最优值。*
优化算法的类型
基于我们的第一个问题*“一次更新应该使用多少数据”优化算法可以分为*小批量梯度下降 和 随机梯度下降。
其实基本算法就是梯度下降。小批量梯度下降和随机梯度下降 是基于所取数据量的两种不同策略。这两个也被称为梯度下降的变种。
梯度下降
梯度下降 是最常用和流行的 迭代 机器学习算法。它也是其他优化算法的基础。梯度下降有以下更新规则用于重量参数
由于在用于更新参数的反向传播期间,计算损耗 w.r.t. a 参数的导数。该导数可以依赖于多个变量,因此使用 乘法链规则 进行计算。为此,需要一个 梯度 。 梯度 是表示增加方向的向量。
对于梯度计算,我们需要计算损耗对参数的导数,并在梯度的反方向更新参数*。*****
上面的理想凸曲线图像显示了与梯度方向相反的权重更新。因为我们可以注意到权重的值太大和太小,所以损失最大,我们的目标是最小化损失T21,所以权重被更新。如果坡度为负,则 向正侧下降 (下潜),如果坡度为正,则向负侧下降,直到找到坡度的最小值。
Python 中使用具有 sigmoid 激活函数的单个神经元进行 梯度下降 的算法
def sigmoid(w,b,x):
return 1.0 / (1.0 + np.exp(-w*x + b))def grad_w(w,b,x,y):
fx = sigmoid(w,b,x)
return (fx — y) * fx * (1-fx) * xdef grad_b(w,b,x,y):
fx = sigmoid(w,b,x)
return (fx — y) * fx * (1-fx)def do_gradient_descent():
w,b,eta = -2, -2, 1.0
max_epochs = 1000
for i in range(max_epochs):
dw,db = 0,0
for x,y in zip(X,Y):
dw += grad_w(w,b,x,y)
db += grad_b(w,b,x,y)
w = w — eta * dw
b = b — eta * db
上面的动画表现了算法在 1000 个纪元后如何收敛。该动画中使用的误差面与输入一致。这个误差表面在 2D 空间中是动画的。对于 2D,使用等高线图,其中等高线表示第三维,即 误差 。红色区域代表高误差值,红色区域的强度越大,误差越大。类似地,蓝色区域表示误差的低值,蓝色区域的强度越小,误差越小。
标准梯度下降 仅在每个历元后更新参数,即在计算所有观测值的导数后,它更新参数。这种现象可能会导致下面的 注意事项 。
- 对于非常大的数据集来说,这可能非常慢,因为每个时期只有一次更新,所以大量的 时期 需要有大量的更新。
- 对于大型数据集,数据的矢量化不适合 内存 。
- 对于非凸曲面,可能只找到 局部最小值。
现在让我们看看 不同的渐变下降 如何应对这些挑战。
随机梯度下降
随机梯度下降 为每次观测更新参数,这导致更多的更新次数*。因此,这是一种更快的方法,有助于更快地做出决策。*
Python 中使用具有 sigmoid 激活函数的单个神经元的随机 梯度下降算法
def do_stochastic_gradient_descent():
w,b,eta = -2, -2, 1.0
max_epochs = 1000
for i in range(max_epochs):
dw,db = 0,0
for x,y in zip(X,Y):
dw += grad_w(w,b,x,y)
db += grad_b(w,b,x,y)
w = w — eta * dw
b = b — eta * db
在这个动画中可以注意到不同方向的 更快的更新。这里,大量振荡发生,导致用 更高的方差 更新,即更新 。这些嘈杂的更新帮助寻找 新的 和 更好的局部最小值 。
新币的缺点
- 因为 贪婪接近 ,它只近似的渐变。**
- 由于 的频繁波动 ,它会将保持在期望的 精确最小值 附近。
现在让我们看看梯度下降的另一种 变体 如何应对这些挑战。
小批量梯度下降
GD 的另一个变体解决了*SGD 的问题,它位于 GD 和 SGD 之间。 小批量梯度下降 为有限数量的观察值更新参数。这些观察结果一起被称为具有固定大小的批次**。批量大小选择为 64 的倍数,例如 64、128、256 等。通过小批量 GD ,一个时期内会发生更多更新。***
Python 中使用具有 sigmoid 激活函数的单个神经元的小批量 梯度下降算法
**def do_mini_batch_gradient_descent():
w,b,eta = -2, -2, 1.0
max_epochs = 1000
mini_batch_size = 3
num_of_points_seen = 0
for i in range(max_epochs):
dw,db = 0,0
for x,y in zip(X,Y):
dw += grad_w(w,b,x,y)
db += grad_b(w,b,x,y)
num_of_points_seen += 1
if num_of_points_seen % mini_batch_size == 0:
w = w — eta * dw
b = b — eta * db**
我们可以看到,与 SGD 相比, 小批量 中的振荡更少。
基本符号
1 个时期 =整个数据的一次通过
1 步 =一次参数更新
N =数据点数
B =小批量
小批量 GD 的优势
- 与 SGD 相比,更新的噪音更小,从而导致更好的收敛。
- 与 GD 相比,单个历元中的更新次数较多,因此大型数据集所需的历元数量较少。
- 非常适合处理器内存,使计算速度更快。
更好的优化 w.r.t .梯度下降
误差面 包含较不严谨以及较不严谨的区域。在反向传播期间,斜率较大的区域的参数更新较多,而斜率较小的区域的参数更新较少。参数变化越大,损耗变化越大,同样,参数变化越小,损耗变化越小。
如果参数初始化位于缓坡区域,则需要大量的时期来浏览这些区域。这是因为坡度在缓坡区域非常小。于是它随着 小婴儿的脚步 在平缓的区域移动。
考虑在如下所示的平坦表面中初始化的情况,其中使用了并且当在 平坦表面 中时 误差 不减小。**
即使在大量的历元之后,例如 10000,算法也不会收敛。**
由于这个问题,收敛不容易实现,学习需要太多时间。
为了克服这个问题 使用了基于动量的梯度下降 。
基于动量的梯度下降
考虑这样一种情况,为了到达你想要的目的地,你不断地被要求沿着同一个方向前进,一旦你确信你正在沿着正确的方向前进,那么你就开始迈出 更大的步伐 并且你在同一个方向上不断获得的动力。
与此类似,如果 坡度 长期处于 平面 中,那么与其采取恒定的步数,不如采取更大的步数 并保持 动量 继续。这种方法被称为 基于动量的梯度下降 。
权重参数基于动量的梯度下降更新规则
伽马参数( γ) 是动量项,表示你想要多大的加速度。这里随着 电流梯度( η∇w(t),移动也根据历史(γv(t1))**进行,因此更新变大,这导致更快的移动和更快的。**
v(t) 是 指数衰减加权和 ,随着 t 的增加γV(t1)变得越来越小,即该等式包含小幅度的更远更新和大幅度的最近更新。
****基于动量的梯度下降在 Python 中用于 sigmoid 神经元
**def do_momentum_based_gradient_descent():
w,b,eta,max_epochs = -2, -2, 1.0, 1000
v_w, v_b = 0, 0
for i in range(max_epochs):
dw,db = 0,0
for x,y in zip(X,Y):
dw += grad_w(w,b,x,y)
db += grad_b(w,b,x,y)
v_w = gamma * v_w + eta * dw
v_b = gamma * v_b + eta * db
w = w — v_w
b = b — v_b**
此算法 在 一致渐变 方向添加动量 ,如果在 不同方向 则 取消动量 。
基于动量的梯度下降问题
在导致精确的 期望最小值 的 谷 中,有大量的振荡使用基于动量的 GD 。因为它 越过了的最小值与** 的较大步长,并且需要一个 的掉头 但是又一次越过,所以这个过程重复进行。这意味着用更大的步伐移动并不总是好的。**
- 以动量为基础的 GD 振荡为一个 大次数 进出 小次数 。
为了克服这个问题 内斯特罗夫加速梯度下降 被使用。
内斯特罗夫加速梯度下降
在的动量基础上的 GD 随着的梯度向山谷(极小区域)进发,这使得很多 【振荡】 在它之前汇聚。这个问题最初是由一位名叫尤里·内斯特罗夫的研究者发现并回应的。
他建议,先通过 【先前动量】 使运动,然后计算此时的更新参数*。换句话说,在直接进行更新之前,它首先通过用先前的动量移动来向前看,然后它发现梯度应该是什么。*
**这种向前看的帮助 唠叨 比 基于动力的 GD 更快地完成它的工作(寻找最小值)。 因此 振荡 与基于 **动量的【GD】相比更少,并且错过 最小值的机会也更少。
用于重量参数的 NAG 更新规则**
****
Python 中针对 sigmoid 神经元的 NAG 算法
**def do_nag_gradient_descent():
w,b,eta,max_epochs = -2, -2, 1.0, 1000
v_w, v_b, gamma = 0, 0, 0.9
for i in range(max_epochs):
dw,db = 0,0
#compute the look ahead value
w = w — gamma * v_w
b = b — gamma * v_b
for x,y in zip(X,Y):
#compute the derivatives using look ahead value
dw += grad_w(w,b,x,y)
db += grad_b(w,b,x,y)
#Now move further in the opposite direction of that gradient
w = w — eta * dw
b = b — eta * db
#Now update the previous momentum
v_w = gamma * v_w + eta * dw
v_b = gamma * v_b + eta * db**
这里 v_w 和 v_b 分别指 v(t) 和 v(b) 。
适应性学习率的概念
根据更新规则
更新正比于 渐变 ( **∇w).**变小渐变变小更新 而渐变与 输入 成正比。因此更新也依赖于输入。**
对自适应学习率的需求
对于实时数据集,大多数特征是 稀疏 的,即具有零值。因此,在大多数情况下,相应的梯度为零,因此参数更新也为零。为了引起这个问题的共鸣,这些更新应该被提升也就是一个 高学习率 对于的特性。因此的学习率应该是对于相当稀疏* 的数据。*****
换句话说,如果我们处理的是 稀疏特征 那么的学习率应该是高反之对于密集特征** 学习率应该是低。**
Adagrad、RMSProp、Adam 算法都是基于自适应学习率的概念。
阿达格拉德
它采用了基于特征的 【稀疏度】 的学习率( η) 。因此具有小更新(稀疏特征)** 的参数具有高学习率,而具有大更新(密集特征) 的参数具有低学习率。因此 adagrad 对每个参数使用不同的学习率*。***
Adagrad 对重量参数的更新规则
v(t) 累加梯度的平方和。 ∇w(t) 的平方忽略了梯度的符号。 v(t) 表示到时间 t 的累计坡度。ε中的分母避免了 被零除的几率 。
因此,如果对于一个参数来说 v(t) 为低(由于更少的更新到时间 t ,那么有效的学习率将为高,并且如果对于一个参数来说为高**
用于 sigmoid 神经元的 Python 中的 Adagrad 算法
*def do_adagrad():
w,b,eta,max_epochs = -2, -2, 1.0, 1000
v_w, v_b = 0, 0
for i in range(max_epochs):
dw,db = 0,0
for x,y in zip(X,Y):
dw += grad_w(w,b,x,y)
db += grad_b(w,b,x,y)
v_w += dw**2
v_b += db**2
self.w -= (eta / np.sqrt(v_w) + eps) * dw
self.b -= (eta / np.sqrt(v_b) + eps) * db*
Adagrad 的缺点
- 学习率急剧下降
对于密集特征对应的参数*(尤其是偏差),经过几次更新后,由于平方梯度的累积,分母快速增长,导致学习速率 快速衰减 。因此,在有限数量的更新之后,算法拒绝学习,并且收敛缓慢,即使我们运行它大量的时期。梯度达到不良最小值(接近期望的最小值),但不在精确的最小值。因此 adagrad 导致偏差参数的学习率下降。*
RMSProp
RMSProp 克服了的 衰减学习率 问题,防止了**【v(t)中的快速增长。****
它不是从一开始就累积平方梯度*,而是在某个部分(权重)累积先前梯度,这阻止了 v(t) 的快速增长,并且由于这个原因,算法保持学习并试图收敛。*
RMSProp 更新重量参数的规则
*这里的 v(t) 是前面所有平方梯度的 指数衰减平均值 。β参数值被设置为与动量项相似的值。直到时间 t 的移动平均值 v(t) 取决于 加权的先前平均梯度 和 当前梯度 。 v(t) 保持(**)*一个固定的窗口时间。
用于 sigmoid 神经元的 Python 中的 Adagrad 算法
*def do_RMSProp():
w,b,eta,max_epochs = -2, -2, 1.0, 1000
v_w, v_b = 0, 0
for i in range(max_epochs):
dw,db = 0,0
for x,y in zip(X,Y):
dw += grad_w(w,b,x,y)
db += grad_b(w,b,x,y)
v_w = beta * v_w + (1 — beta) * dw**2
v_b = beta * v_b + (1 — beta) * db**2
self.w -= (eta / np.sqrt(v_w) + eps) * dw
self.b -= (eta / np.sqrt(v_b) + eps) * db*
【RMSProp 的问题
- 具有高学习率或大梯度的大量振荡
到目前为止在 Adagrad,RMSProp 中我们在计算不同的 学习速率 对于不同的参数,我们可以有不同的 动量 对于不同的参数。 亚当 算法引入了 自适应动量 连同 自适应学习率 。
圣经》和《古兰经》传统中)亚当(人类第一人的名字
自适应矩估计(Adam) 计算先前梯度的指数衰减平均值 m* (t) 以及一个 自适应学习率。亚当 是基于 动量的 GD 和 RMSProp 的组合形式。*
在 基于动量的 GD 中, 先前梯度(历史)用于计算当前梯度,而在 RMSProp 先前梯度(历史)用于根据特征调整学习率。因此 亚当 处理自适应学习速率和自适应动量其中 RMSProp 确保 v(t) 不会快速增长以避免学习速率和 m(t) 从 动量衰减的机会
亚当 权重参数更新规则
这里的 m(t) 和【v(t)都是从第一时刻得到的 的值。
Adam 使用偏差修正值(无中心方差) 梯度用于更新规则,这些值是通过二阶矩 获得的。**
最终的更新规则如下所示
Python 中针对 sigmoid 神经元的 Adam 算法
*****def do_Adam():
w,b,eta,max_epochs = -2, -2, 1.0, 1000
v_w, v_b = 0, 0
m_w, m_b = 0, 0
num_updates = 0
for i in range(epochs):
dw, db = 0, 0
for x, y in zip(X, Y):
dw = self.grad_w(x, y)
db = self.grad_b(x, y)
num_updates += 1
m_w = beta1 * m_w + (1-beta1) * dw
m_b = beta1 * m_b + (1-beta1) * db
v_w = beta2 * v_w + (1-beta2) * dw**2
v_b = beta2 * v_b + (1-beta2) * db**2
#m_w_c, m_b_c, v_w_c and v_b_c for bias correction
m_w_c = m_w / (1 — np.power(beta1, num_updates))
m_b_c = m_b / (1 — np.power(beta1, num_updates))
v_w_c = v_w / (1 — np.power(beta2, num_updates))
v_b_c = v_b / (1 — np.power(beta2, num_updates))
self.w -= (eta / np.sqrt(v_w_c) + eps) * m_w_c
self.b -= (eta / np.sqrt(v_b_c) + eps) * m_b_c*****
所以在 中亚当 不同于 RMSProp 振荡更少并且它更确定地向正确的方向移动,这导致 更快 收敛 和 更好的优化 。
结束注释
在本文中,我讨论了不同类型的优化算法以及使用每种算法时可能遇到的常见问题。一般来说, Adam 带小批量是深度神经网络训练的首选。****
为什么绿色和银色可能成为新的黑色和金色
(CREDIT: Author on Canva)
使用典型的数据科学家工具箱对白银进行基本面分析。
背景
白银的故事很长,在过去的几千年里,这种白色金属与人类一起享受了一段相当喧嚣的浪漫史——尽管它似乎一直处于黄金的次要地位。
这篇文章试图对贵金属进行一些彻底的分析,同时也作为一种“数据科学”教程——因为我将记录我在进行分析时经历的许多步骤,并在适用的情况下提供代码样本。笔记本和一些数据可以在这个库中找到。对于这篇文章的压缩版本,点击这里。
内容——这篇文章的内容
What to Expect In This Post (CREDIT: Author on Canva)
需求分析
银作为一种贵金属很有意思,因为它的需求远远超出了仅仅作为珠宝和价值储存手段的用途——相反,它的物理特性使它在工业中备受追捧。本节将主要关注当前和近期对白银的需求。
概述和细分
为了有一点基础,让我们看看来自白银协会的 2019 年世界白银调查的要点——与白银需求有关:
- 2018 年实物总需求增长 4%,至 10.335 亿金衡盎司(3.2146 万吨),创下三年新高
- 这主要是由于对珠宝和银器的需求增加(4%),以及对硬币和金条的需求增加(20%),这抵消了工业需求的减少(1%)
- 工业需求的减少主要是由于光伏(太阳能电池板)行业的减少(-9%),这是因为银负载的持续节约(由于价格原因,制造商正试图使用越来越少的银)
CPM 白银年鉴对国际白银市场进行了详细的统计和分析,过去 43 年全球白银加工需求如下:
Silver Fabrication Demand by Year since 1977 (GoldSilver Blog Post)
(图片摘自 这篇博文 使用 CPM 白银年鉴的数据)。
很明显,制造业的总需求已经连续六年呈上升趋势。现在,这一切都很好,但为什么会增加呢?为了了解这一点,让我们深入了解这一需求:
白银协会提供了更详细的全球白银供需数据,但仅限于 2009 年至 2018 年。
World Silver Demand and Silver Closing Price, Per Year (Source: The Silver Institute)
他们提供的数据实际上是 JPEG 图像,所以我必须手动将其记录到 Excel 中,然后再用 Python 读取。相当麻烦,但我已经把这个文件添加到了这篇文章的回购中,以拯救可怜的灵魂,使其在未来不再经历类似的考验。我从一个网站上刮下来的白银收盘价(见上一节)。
我使用熊猫、Plotly 和袖扣来绘制这些数据,对于上面的图表,我实际上使用了在线图形设计工具 Canva ,来结合白银价格和需求图表(我知道这也可以用 Plotly 来完成,但我不知道如何使用袖扣来轻松完成)。我很喜欢 Plotly,我一定会推荐它;Cufflinks 是一个帮助 Plotly 轻松使用熊猫数据框的库。
import pandas as pd
# Standard plotly imports
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import iplot, init_notebook_mode
# Using plotly + cufflinks in offline mode
import cufflinks
cufflinks.go_offline(connected=True)
init_notebook_mode(connected=True)# Reading in data
demand = pd.read_excel('../data/silver_institute_supply_and_demand.xlsx', 'Demand')
demand.set_index('Year', inplace=True)
demand.fillna(0, inplace=True)# Plotting - Total Supply per Year
demand[['Total Physical Demand']]\
.iplot(kind='bar', xTitle='Year', color='#139A43',
yTitle='Demand (million ounces)',
title='Total Demand for Silver, Per Year', width=4)# Plotting - Total Demand per Year & by Sector
demand.loc[:,'Jewelry':'Industrial Fabrication'].iplot(kind='bar', xTitle='Year',
yTitle='Demand (million ounces)',
title='Total Demand for Silver, Per Year and By Sector', width=4)# Plotting - Total Industrial Demand per Year & by Industry
demand.loc[:,'…of which Electrical & Electronics':'…of which Other Industrial*']\
.iplot(kind='bar', xTitle='Year',
yTitle='Demand (million ounces)',
title='Total Industrial Demand for Silver, Per Year and By Industry', width=4)
Global Silver Demand by Sector, by Year (CREDIT: Author on Jupyter Notebook)
Total Industrial Silver Demand by Industry, by Year (CREDIT: Author on Jupyter Notebook)
从上面的图表中可以看出什么?嗯——我从他们那里得到的是:
- 最大比例的白银需求来自工业应用——这与大多数其他贵金属形成鲜明对比
- 在工业需求中,最大的比例是由电气和电子行业驱动的(占所示期间总需求的 43.64%)
- 电气和电子产品需求呈上升趋势(自 2016 年起)
- 光伏需求从 2014 年到 2017 年呈上升趋势,但在 2018 年大幅下降——这似乎是白银研究所在他们的报告中谈论的内容(见上文)
Silver Industrial Demand, By Year Since 1960 (GoldSilver Blog Post)
为什么与其他贵金属相比,白银的工业需求如此之高?为什么会增加?
银作为一种元素的科学属性有很大关系,Ag:
Thermal & Electrical Conductivities of Several Metals (Left), and Silver Nanoparticles Biocide Solution (Right) (CREDIT: Author on Canva)
在地球表面的所有金属中,银具有最高的导电性和导热性。不仅如此,这种金属还是一种众所周知的杀菌剂——意思是:它能杀死细菌。(注意电阻率是电导率的倒数)。
“在地球表面的所有元素中,银的导电性和导热性最高。”
在本需求分析的下几节中,我们将调查和分析白银在几个主要行业中的确切用途。
电气和电子行业的白银
银在金属中无与伦比的导电性能意味着它不容易被其他更便宜的金属取代。银也是一种贵金属,这意味着它在潮湿的空气中耐腐蚀和抗氧化——不像大多数其他金属。
考虑到这些事实,电子产品遥遥领先于工业白银的头号消费者就不足为奇了。
Many electronic applications make use of Silver pastes (CREDIT: Author on Canva)
银可以直接在银矿中开采,也可以作为铅锌矿的副产品开采。熔炼和精炼将银从矿石中提炼出来,之后通常将其加工成条状或颗粒状。电子产品只需要最高纯度的银——意味着没有污染物(99.9%的银)。银在硝酸中的溶解产生硝酸银,然后可以形成薄片或粉末——然后可以制作成隐形眼镜或银浆。总的来说,这些最终产品是直接用于电子产品的。使用它们的例子很多,但包括:
- 许多汽车的后除霜器,
- 印刷电子和纳米银(广泛用于电动汽车的再生制动),
- 发光二极管(可以使用银电极),
- 电池技术(使用氧化锌或银锌合金),
- 超导体(当与银配对时,结果可以比单独的超导体更快地传输电流)
光伏太阳能中的银
如前所述,银是一种独特的贵金属,因为超过一半的供应量实际上用于工业目的。这主要是因为银具有优异的反射和导电性能。银的一个有趣的应用是在太阳能光伏产业。银被广泛用于太阳能电池板的生产。
Silver is used extensively to produce solar panels (CREDIT: Author on Canva using their library)
事实上,含银浆料对光伏电池和 90%的晶体硅光伏电池都至关重要。该浆料用于太阳能电池中,以收集和传输电子,电子的运动是由阳光通过光电效应引起的。实际上,银有助于传导电子,从而产生电流;这些电能可以被储存或消耗。银的优异电阻率增加了捕获的潜在阳光、传导的能量,并最终增加了太阳能电池产生的总功率——因此太阳能电池的效率在某种程度上与其银含量成比例。
鉴于面对气候变化,全球需要追求更可持续的能源,太阳能以及太阳能电池生产的未来确实是光明的。
两个因素对太阳能导致的白银需求的无节制增长构成了明确的威胁:即节约和其他技术相关的效率提高。
节约是制造商试图减少白银用量以降低成本的过程。事实上,根据代表白银协会的报告,到 2028 年,光伏行业生产导电银浆所需的银量可能会减少近一半,从 2016 年的每电池 130 毫克减少到 65 毫克。银的含量已经下降了很多,从 2007 年的 400 毫克下降到 2016 年的 130 毫克。即使银含量下降,太阳能电池的产量实际上还是增长了,而且预计还会继续增长;从现在的 4.7 瓦到 2030 年的 6 瓦。这种增长是由于效率的提高以及太阳能电池板设计和制造方面的其他技术进步。
Solar PV Fabrication and Thrifting, Per Year (The Silver Institute)
尽管如此,银无与伦比的导电特性意味着,事实上,太阳能电池生产中可能的银负载减少量存在“物理极限”。简而言之,总有一天,效率损失会超过使用更便宜的原材料(铜、铝)替代白银所带来的好处。
尽管如此,银无与伦比的导电特性意味着,事实上,太阳能电池生产中可能的银负载减少量存在“物理极限”。简而言之,总有一天,效率损失会超过使用廉价原材料带来的好处
上述报告预测,光伏行业的需求约为每年 7000 万至 8000 万盎司,到 2020 年代中期将降至 5000 万至 5500 万盎司。只有到 2030 年,需求才有望恢复,达到每年约 6600 万盎司。世界银行的报告呼应了类似的观点,预测太阳能光伏发电将导致需求下降。
我认为,这些实体没有考虑到的是:不要低估在对气候变化的持续恐惧中长大的一代人的力量,当他们到了成为市场驱动者的年龄时,他们作为一个集体会做些什么。
但是让我们用一点分析来解决这个问题:
下面是两张图表。第一个是每年全球可再生能源份额图,第二个是每年全球太阳能总消耗量图:
Total Share of Global Energy that is Renewable (Split Between Solar+Wind, and Other Forms of Renewable Electricity) (CREDIT: Author on Jupyter Notebook)
Total World Solar Energy Consumption, Per Year (Our World In Data)
很明显,太阳能的增长是指数级的——我们看到的绿色革命肯定不会阻止我们在未来使用更多的太阳能。
脸书有一个名为“先知”的非常棒的开源库,它非常适合单变量时间序列预测。它也非常容易使用,让我们把我们的全球太阳能消耗数据扔进 Prophet。
Excerpt of Github Gist — See here
Github Gists 似乎不再恰当地嵌入到媒体中——所以跟随链接正确地查看代码(或者检查笔记本)结果预测如下所示(下载数据集这里):
Forecasted Global Solar Consumption Using FbProphet — y is still in TWh (CREDIT: Author on Jupyter Notebook using Facebook’s Prophet library)
为了得到节省的数据,我使用了一个在线工具从 jpeg 图(如上图所示)中映射出来。我已经在这篇文章的资源库中提供了它。数据范围仅为 2009 年至 2018 年。如果我们把这个也扔进 Prophet,我们得到如下预测:
Forecasted Silver Loadings in grams/cell (Gist) (CREDIT: Author on Jupyter Notebook using Facebook’s Prophet library)
嗯。我们知道银负载量不能降到零以下,我们也没有以任何方式嵌入我们的假设,即“太阳能电池生产中可能的银负载量减少量存在物理限制”——因此这在我们的预测中显然不明显。
白银协会在他们的报告中指出,他们预计节约将会继续,到 2028 年,所用的银负载量可能会降至每电池 65 毫克——现在让我们调整我们的数据(和预测)以包括以下条目:
Forecasted Silver Loadings in grams/cell (Taking into account Silver Institute Prediction) (CREDIT: Author on Jupyter Notebook using Facebook’s Prophet library)
老实说,这不是很有帮助,但我必须说:这些数据看起来非常像可以用指数函数来拟合,幸运的是 Scipy 有一个非常酷的函数可以在瞬间为我们做到这一点——使用最小二乘回归。
不过,在我们这样做之前,让归一化我们的银负载数据集——从 0 到 1。我们可以使用 S klearn 的和最小最大缩放器来实现。
import datetime
import pandas as pd
from sklearn import preprocessingest_thrifting = pd.read_excel('../data/silver_solar_thrifting_estimates.xlsx')# Normalize Estimated Silver
min_max_scaler = preprocessing.MinMaxScaler()
thrifting_scaled = min_max_scaler.fit_transform(est_thrifting)scaled_thrifting_df = pd.DataFrame(columns=['Year', 'Silver Loadings (Scaled)'], data=thrifting_scaled)scaled_thrifting_df.set_index('Year').plot(color='green')
我们的标准化数据如下所示:
Silver Loadings per Year (Scaled from 0 to 1) (CREDIT: Author on Jupyter Notebook)
现在我们可以使用 Scipy 的 curve_fit 函数来拟合数据的以下函数(指数曲线)。
Exponential Function Formula (CREDIT: Author on Canva)
import numpy as np
import scipy.optimize as optimize
import matplotlib.pyplot as pltxdata = scaled_thrifting_df['Year'].values
ydata = scaled_thrifting_df['Silver Loadings (Scaled)'].values
x = np.array(xdata)
y = np.array(ydata)def f(x, a, b, c):
return a * np.exp(-b * x) + cpopt, pcov = optimize.curve_fit(f,x,y, bounds=([0,0,-0.15], [10,10, -0.06]))
# popt, pcov = optimize.curve_fit(f,x,y)
x1 = np.linspace(0,2.5,num =50)fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 12
fig_size[1] = 8
plt.rcParams["figure.figsize"] = fig_size
plt.plot(x1, f(x1, *popt), 'g',)
plt.plot(x,y,'ro')
plt.show()
请注意,我限制了 c 的界限,以便得到一个至少趋向于每细胞小于 65 毫克的值的曲线(由 Silver Institute 在 2028 年估计的负载量)。结果如下:
Exponential Curve fitted to Normalized Silver Loadings Data (CREDIT: Author on Canva)
在上图中,x 轴上的 2.00 对应于 2047 年。银负载量趋向于 0.045 左右的值——或 45 毫克/电池。 所以这就是我们的【生理极限】 。
现在——当然,这条曲线有点笨拙,我调整了界限,这样它基本上把图表降低到了一个“看起来差不多”的值,甚至有些保守。
现在,这变得非常有趣,当你把两个: 结合起来的时候,就是
(Normalized) Solar Demand Forecast Using Only Silver Loadings and Solar Consumption (CREDIT: Author on Canva)
我不会在这里张贴上图的代码,只是因为它进行了大量的调整、缩放、创建新的数据框架等等(我的熊猫技能可能也有所欠缺)。但是,包含所有代码的单独笔记本是可用的 这里是 。拜托,伙计们, 检查一下我对这一切的逻辑,并在评论中回复我——我很容易搞砸了一些事情,如果是这样的话,我很想知道。**
当然,这整个过程是假设太阳能银需求与太阳能消耗和每个太阳能电池的银负载成唯一和直接的比例关系——这似乎是有意义的:当然,太阳能银需求与“每个电池中的银量”以及“太阳能电池板消耗的能量”成比例,对吗?
一条不归路。如果这个图表可信的话,看起来我们正处于太阳能白银需求的转折点。如果太阳能电池板中继续使用的银量确实存在物理限制,那么似乎——假设太阳能消耗的增加等于或类似于我们的预测——太阳能行业对银的需求将在未来开始相对快速地攀升,特别是当它达到这一限制时。
看起来,我们正处于太阳能白银需求的转折点。
上图似乎也与过去的 CPM 白银年鉴数据相对应(见 GoldSilver 的博客文章):
Actual Silver Demand for Solar Panels per Year(GoldSilver blog, CPM Silver Yearbook)
水处理中的银
生物杀灭剂在欧洲法律中被定义为“旨在破坏、阻止、使无害或对任何有害生物产生控制作用的化学物质或微生物”。
Silver may have increased future applications in water treatment, but this is speculatory at best (CREDIT: Author on Canva)
银是一种广为人知的广谱杀菌剂,被证明能有效消除越来越多的细菌威胁,包括军团病、大肠杆菌、链球菌和 MSRA;这些微生物占了我们日常接触的细菌的很大一部分。由于这些性质,银长期以来一直用于水处理,在世界各地的许多过滤器中销售。
尽管世卫组织世界卫生组织已经宣布,在其目前的应用中,银是“不是饮用水的有效消毒剂”,纳米技术领域的发展和银纳米粒子的使用可能会在未来几年内看到这种变化。最近的研究表明,银(银)纳米粒子片的银损失低于世卫组织和环境保护局(EPA)提出的饮用水标准,结论是通过沉积有银纳米粒子的纸过滤可以是有效的应急水处理。除此之外,最近的研究调查了将银用作航天器水系统杀菌剂的可能性。事实上,美国宇航局正在考虑将银作为未来探索的杀菌剂。
最近的研究表明,银(银)纳米粒子片的银损失低于世卫组织和环境保护局(EPA)提出的饮用水标准,结论是通过沉积有银纳米粒子的纸过滤可以是有效的应急水处理。
总结一下银在水处理中的应用;如果你像 Michael Burry(《大空头》故事背后的人)一样,认为未来将会出现可获得淡水的严重短缺,并且同样的未来将会看到太空探索的急剧增长,你可能只是想在这种迷人的金属上对冲你的赌注。
Christian Bale as Michael Burry in ‘The Big Short’. Burry has been known to be concentrating on freshwater, as he thinks freshwater reserves per capita will decrease in the future — and it will thus become an ever more economically valuable commodity. (CREDIT: Author on Canva)
供应分析
对白银供应的分析即将出炉,供应数据当然也很有趣。
概述和细分
全球白银供应总量如下图所示:
Total Global Silver Supply by Year since 1977 (GoldSilver Blog Post)
同样,白银协会的数据更加细致:
*supply = \ pd.read_excel('../data/silver_institute_supply_and_demand.xlsx', 'Supply')
supply.set_index('Year', inplace=True)
supply.fillna(0, inplace=True)supply[['Total Supply']]\
.iplot(kind='bar', xTitle='Year', color='#1C7C54',
yTitle='Supply in Tons',
title='Total Supply of Silver, Per Year', width=4)supply[['Mine Production','Net Government Sales','Scrap', 'Net Hedging Supply']]\
.iplot(kind='bar', xTitle='Year',
yTitle='Supply in Tons',
title='Total Supply of Silver, Per Year', width=4)*
Total Silver Supply (Silver Institute) (CREDIT: Author on Jupyter Notebook)
Total Supply by Year and Source (CREDIT: Author on Jupyter Notebook)
到目前为止的一些要点:
- 全球大部分白银供应来自地下(矿山)
- 无论是矿山供应还是废钢供应(白银的两大来源) 似乎都在下降——但是为什么呢?
来自矿山的银供应量的减少似乎是由于银价造成的*。我使用了 Python 库 请求 和 BeautifulSoup 来抓取历史白银价格,然后用 Plotly 绘图:***
*import requests
from bs4 import BeautifulSoup## Silver
res = requests.get("[https://www.macrotrends.net/1470/historical-silver-prices-100-year-chart](https://www.macrotrends.net/1470/historical-silver-prices-100-year-chart)")
soup = BeautifulSoup(res.content, 'lxml')
tables = soup.find_all('table')
headers = ['Year', 'Average Closing', 'Year Open', 'Year High', 'Year Low', 'Year Close', 'Annual % Change']
df_silver = pd.DataFrame(pd.read_html(str(tables[0]))[0])
df_silver.columns = headersdef convert_to_float_if_applicable(cell):
if isinstance(cell, str) and '$' in cell:
try:
cell = float(cell.replace('$', '').replace(',',''))
return cell
except:
return cell
elif isinstance(cell, str) and '%' in cell:
try:
cell = float(cell.replace('%', ''))
return cell
except:
return cell
else:
return celldf_silver = df_silver.applymap(lambda cell: convert_to_float_if_applicable(cell))
df_silver.rename(columns={'Average Closing': 'Average Closing, Silver'}, inplace=True)df_silver.set_index('Year')[['Average Closing, Silver']]\
.iplot(kind='line', xTitle='Year', color='#C0C0C0',
yTitle='Average Closing Price in Dollars ($)',
title='Average Closing Prices for Silver', width=4)*
Historical Silver Prices per year since 1969 (macrotrends.net)
低银价意味着银矿一直难以盈利,导致它们投入勘探项目和增加产量的资金越来越少。请注意下图中十大白银生产国名单中的每个国家开采的白银都在减少。
Mine Production from Top 10 Silver Producing Countries (CPM Yearbook, GoldSilver Blog Post)
此外,即使白银价格飙升,银矿也需要一段时间,甚至几年的时间来增加产量——这种“滞后”可能意味着白银需求高而供应不足的时期会延长。
“……即使白银价格飙升,银矿也需要一段时间,甚至几年才能增加产量”
但是等等,还有。
根据 GoldSilver 今年早些时候的博客文章,白银的“矿山产能”——预计从新矿进入市场的白银量——已经急剧下降(引用一句话,跌落悬崖);自 2013 年以来,它已经下跌了近 90%,这也是白银价格低迷的结果(低价格意味着人们不太可能开始新的银矿)。
此外,根据 CPM 年鉴和,白银废料也有所下降(20 年来的最低点)——同样,低白银价格似乎是罪魁祸首,因为废料经销商发现越来越难赚钱。
Global Silver Scrap Supply Per Year (CPM Yearbook, GoldSilver Blog Post)
现在,如果全球白银需求增加,但供应却停滞不前,那么白银将从何而来?再次引用戈德西尔弗的话:“不是来自政府储备。政府不再囤积白银。没有一个国家在其货币中使用它,所以他们不再囤积它”。
Global Government Silver Inventories Per Year (CPM Yearbook, GoldSilver Blog Post)
Top Silver Producing Countries and Companies (The Silver Institute World Silver Survey 2019)
地缘政治和经济
虽然前面的章节已经通过供需理论的透镜观察了白银,并特别关注了白银的工业应用,但这一节将采取更为的宏观经济方法,并探索可能会在未来显著影响白银价格的几个想法和潜在事件。
“指数泡沫”和另一场衰退?
据亿万富翁投资者兼对冲基金经理雷伊·达里奥称,经济以一种简单而机械的方式运行。他在一个精彩的 YouTube 视频中解释了这个概念,但本质上他说经济是由三种主要力量驱动的
- 生产率增长
- 短期债务周期
- 长期债务周期
According to Ray Dalio, The Economy is the Result of the Accumulation of Three Forces (CREDIT: Ray Dalio on YouTube)
根据 Dalio 的说法,“债务波动”发生在两个大周期(长期和短期),分别为 75-100 年和 5-8 年;在这个时间点(2019 年 12 月),我们正处于与 1935 年至 1940 年相似的时期,这一时期呈现出以下共同特征:
- 巨大的财富差距(最富有的 0.1%人口的净资产现在相当于最贫穷的 90%人口的总和)
- 于是,我们就有了的民粹主义和社会动荡
- 由于前两次经济衰退(20 世纪 90 年代和 2008 年),我们的货币政策也不太有效,因此降低利率和量化宽松作为扭转下一次经济衰退的手段不会那么有效
- 我们正进入经历“紧缩周期”(类似于 1937 年)的阶段
用 Dalio 的话来说:“下一次衰退将会发生,可能是在几年内”,而且将会是一次社会和政治问题将会很严重的衰退——这使得中央银行使用的“杠杆”(利率、量化宽松)的有效性下降,这将意味着我们将很难“扭转”下一次衰退。这将是一个艰难的决定。
“下一次经济低迷可能会在未来几年内发生”——雷伊·达里奥,2019 年 9 月
除此之外,像迈克尔·伯利(Michael Burry)这样的人(成功预测 2008 年房地产市场泡沫的人)最近一直在谈论 我们目前可能正处于一个指数泡沫 。 Burry 指出,“被动投资正在推高股票和债券价格,就像 10 多年前抵押债务债券对次级抵押贷款的作用一样……就像大多数泡沫一样,持续时间越长,崩溃就越严重”。
“被动投资正在抬高股票和债券价格,就像 10 多年前抵押债务债券对次级抵押贷款的影响一样,”Burry 告诉彭博新闻—迈克尔·伯里,2019 年 9 月
现在我不知道我们是否真的处于泡沫之中。也不知道下一次低迷/衰退还有多远。但我认为我们还没有最后一次。在经济低迷时期会发生什么?答案是投资者涌向贵金属——比如白银——这将意味着白银需求的巨大增长。
亚洲
国家中国和印度值得在这篇文章中特别提及。当谈到白银时,这两个国家似乎尤其值得关注。在过去的 18 年里,中国对白银加工的需求增长了 420%——通货膨胀率低于美国。中国也是 2018 年白银需求的主要贡献者, 占新增太阳能电池板安装量 的近一半,报告称,白银产量较 2017 年增长 2%,实现 1.149 亿金衡盎司;Silvercorp 的 Ying 矿区获得了最高的改进(产量和品位)。**
Chinese Silver Fabrication Demand Per Year, (CPM Yearbook, GoldSilver Blog Post)
Annual Chinese Industrial Silver Fabrication (Left) and Asian Mine Production (Right), World Silver Survey
Silver Supply Chain in Global PV Industry (2018), The Silver Institute
Top Exporters of Photosensitive/photovoltaic/LED Semiconductor Devices (2017), Observatory of Economic Complexity
Top Importers of Photosensitive/photovoltaic/LED Semiconductor Devices (2017), Observatory of Economic Complexity
从上述图表来看,中国似乎将受益于电子和可再生能源驱动的白银需求的大幅增长(假设需求确实增长)。
投资中国的白银供应端(矿山和废料公司)可能确实是个好主意——因为这是中国最廉价满足其需求的地方。
Top Exporters of Silver, Observatory of Economic Complexity
Top Importers of Silver, Observatory of Economic Complexity
***另一方面,印度似乎对 白银作为价值储存手段更感兴趣。 看上面的树形图,印度是 2017 年白银的最大进口国。纵观整个世界,在连续两年下降后,2018 年全球 ***实物白银购买总量增长了 5%至 1.61 亿金衡盎司,而这一需求飙升在很大程度上归因于印度。印度的实物白银购买量增长了 53%,也主导了银锭贸易,进口量增长至 36%(2015 年以来的最高水平)。
2018 年,印度的银首饰制造量同比增长 16%,至 7,650 万金衡盎司(2,378 吨)。 未来几年,印度可能确实是全球白银需求的重要驱动力。
关于未来和其他花絮
在这一部分,我决定把其他所有东西都塞进去——那些似乎不适合放在其他地方的东西。我们将看看白银未来可能的应用,以及一些技术分析(黄金/白银比率)。
在未来观看
- 电动汽车
- 银纳米粒子与应急水处理
- 航天工业中的白银
Silver Demand in the Automotive Industry, Silver Institute
由于其优异的导电性,银被广泛用于电动动力系统和其他应用中,这些应用越来越多地出现在混合动力内燃机(ICE)汽车和电动汽车(ev)中。此外——关于水处理——纳米技术可能会创造一种环境,在这种环境中,银在紧急水处理中可能非常有效,这就是为什么美国宇航局将其列为未来太空探索的生物杀灭剂。
金银比率
金银比率代表购买一枚等量黄金所需的白银数量。有趣的是,这一比率接近历史最高水平,这表明白银相对于黄金越来越被低估。
The Ratio of the Gold Price to the Silver Price, Per Year Since 1969 (CREDIT: Author in Jupyter notebook)
上面的图表是使用下面的代码绘制的,基本上是使用 Plotly 和袖扣来绘制黄金&白银价格的比率(从互联网上搜集的)。
***import pandas as pd
import requests
from bs4 import BeautifulSoup
## Silver
res = requests.get("[https://www.macrotrends.net/1470/historical-silver-prices-100-year-chart](https://www.macrotrends.net/1470/historical-silver-prices-100-year-chart)")
soup = BeautifulSoup(res.content, 'lxml')
tables = soup.find_all('table')
headers = ['Year', 'Average Closing', 'Year Open', 'Year High', 'Year Low', 'Year Close', 'Annual % Change']
df_silver = pd.DataFrame(pd.read_html(str(tables[0]))[0])
df_silver.columns = headers## Gold
res = requests.get("[https://www.macrotrends.net/1333/historical-gold-prices-100-year-chart](https://www.macrotrends.net/1333/historical-gold-prices-100-year-chart)")
soup = BeautifulSoup(res.content, 'lxml')
tables = soup.find_all('table')
headers = ['Year', 'Average Closing', 'Year Open', 'Year High', 'Year Low', 'Year Close', 'Annual % Change']
df_gold = pd.DataFrame(pd.read_html(str(tables[0]))[0])
df_gold.columns = headersdef convert_to_float_if_applicable(cell):
if isinstance(cell, str) and '$' in cell:
try:
cell = float(cell.replace('$', '').replace(',',''))
return cell
except:
return cell
elif isinstance(cell, str) and '%' in cell:
try:
cell = float(cell.replace('%', ''))
return cell
except:
return cell
else:
return celldf_silver = df_silver.applymap(lambda cell: convert_to_float_if_applicable(cell))
df_gold = df_gold.applymap(lambda cell: convert_to_float_if_applicable(cell))
df_gold.rename(columns={'Average Closing': 'Average Closing, Gold'}, inplace=True)
df_silver.rename(columns={'Average Closing': 'Average Closing, Silver'}, inplace=True)
precious_metals_avg_cls = pd.merge(df_silver, df_gold, how='inner', on = 'Year')
precious_metals_avg_cls.set_index('Year', inplace=True)ratio_gold_to_silver = precious_metals_avg_cls
ratio_gold_to_silver['Ratio of Gold to Silver'] = precious_metals_avg_cls['Average Closing, Gold'] \
/ precious_metals_avg_cls['Average Closing, Silver']precious_metals_avg_cls[['Ratio of Gold to Silver']]\
.iplot(kind='line', xTitle='Year', color='#1C7C54',
yTitle='Ratio of Gold Closing Price, to Silver Closing Price',
title='Ratio of Gold Price to Silver Price', width=4)***
就这些了,伙计们!感谢你的阅读,如果你已经做到了这一步,那么恭喜你——我喜欢做这个,希望你们中的一些人能从中发现一些价值。请不要把这篇文章当成强硬的金融/投资建议——我不是一个有经验的投资者,白银甚至可能是一个糟糕的投资。我很想知道这种金属在未来会发生什么。
再次感谢阅读!
(CREDIT: Author in Jupyter on Canva)
参考
- http://www . silver institute . org/WP-content/uploads/2017/08/eosilverdemandreportdec 2016 . pdf
- https://www . silver institute . org/WP-content/uploads/2019/04/WSS 2019 v3 . pdf
- https://www . jmbullion . com/investing-guide/types-physical-metals/silver-solar-demand/
- https://www . PV-magazine . com/2018/05/11/silver-prices-to-drop-4-toz-by-2030-world-bank-says/
- https://www . who . int/water _ sanitary _ health/publications/silver-02032018 . pdf?ua=1
- https://www . PV-magazine . com/2018/07/06/amount-of-silver-institute-says/
- https://www.sbcgold.com/blog/silver-supply-demand/
- https://seeking alpha . com/article/4044219-足够-银-电力-世界-甚至-太阳能-电力-效率-四倍
- https://gold silver . com/blog/silver-in-charts-supply demand-crunch-after-years of-the-opposite/
- https://www . science daily . com/releases/2019/04/190417102750 . htm
- https://www.statista.com/topics/1335/silver/
- https://www . macro trends . net/1470/historical-silver-prices-百年走势图
- ***【https://www.silverinstitute.org/silver-supply-demand/ ***
- https://oec.world/en/
为什么 AI/机器学习在企业中停滞不前?
主要是因为合理的云安全考虑。而 AI/ML 的数据胃口引发了与企业安全的严重冲突。有哪些问题?
Photo by Nareeta Martin on Unsplash
为什么企业在云中采用 AI/ML 停滞不前?
简而言之,因为材料,真实的,有效的数据安全问题。不幸的是,这些担忧与 AI/ML 对数据的贪婪胃口直接冲突。在冲突得到解决之前,云原生 AI/ML 在企业中的采用将会停滞不前。
最近关于 Capital One 最近的数据泄露及其成本的头条新闻强调了这一点。它甚至可能让像 Capital 这样的重度云消费者猜测他们的云数据安全和隐私状况。
由于潜在的巨额损失和罚款,可以预料,许多企业在将少量敏感数据迁移到云中时都会非常谨慎。
然而,尽管有潜在的风险,公司继续将目标对准 AI/ML 云平台上可用的高级计算能力。因此,像之前的通用计算一样,人工智能/人工智能在云上的进军现在正在开始,早期采用者正在建立云原生人工智能/人工智能能力的滩头阵地。
但是使用云的早期企业 AI/ML 采用者看到一个主要障碍反复出现:云数据安全和隐私问题。事实上,AI/ML 的独特特征加剧了这些担忧,毕竟,AI/ML 的成功与大量数据的可用性直接相关,其中大部分可能是机密或非常敏感的数据。
在这些严重的、实质性的、有效的云数据安全问题得到解决之前,云上的企业 AI/ML 采用将停滞不前,被降级为小项目,交付缓慢,不幸的是,提供的价值有限。
在本文中,我将讨论 AI/ML 的独特特征,这些特征导致了数据安全问题,阻碍了云原生 AI/ML 的广泛采用。
AI/ML 向云的进军本来应该很简单
“理论”是,向云原生 AI/ML 进军应该很简单。毕竟,互联网巨头已经展示了如何应用基于云的人工智能/人工智能来解决以前难以解决的问题,例如提供比人类更好的机器视觉,实时音频和文本翻译。
毫不奇怪,企业认为使用相同的云功能、相同的开源软件以及相同的丰富网络和计算能力将有助于轻松实现云原生 AI/ML。
然而,在实践中,企业遇到了一些障碍。在最近的一份报告中,德勤指出,尽管有很大的兴趣,“43%的公司表示他们对潜在的人工智能风险有重大或极端的担忧。”而且,在这些担忧中,“排在首位的是网络安全漏洞(49%的人将其列为三大担忧之一)。”事实上,“对大多数国家来说,对潜在人工智能风险的担忧超过了他们应对这些风险的信心。”
但是,这些担忧与安全性旨在保护的东西(即数据)交织在一起。不幸的是,大多数企业可能没有做好准备。根据 Irving Wladawsky-Berger 在《华尔街日报》的一篇文章中的说法,只有“18%的人说他们的公司制定了访问和获取人工智能工作所需数据的战略”。
事实证明,企业采用云原生人工智能/人工智能并不那么简单。事实上,云上的企业 AI/ML 采用正在停滞。在云上采用企业 AI/ML 时,有一个棘手的挑战是一个基本问题:数据安全和隐私。
Photo by Srh Hrbch on Unsplash
AI/ML 的独特需求是重新思考云安全策略的催化剂
AI/ML 在企业中有一些独特的特征:首先,数据科学家——实际上是 AI/ML 从业者——需要频繁访问敏感数据。无论它被认为是私有的(客户数据)还是机密的(财务数据),或者介于两者之间,底线是企业将从对其唯一的数据中获得最大价值。对于企业来说是唯一的数据,根据定义,这些数据几乎都是敏感的,必须受到保护。过去,对敏感数据的访问通常受到严格控制。
其次,数据科学家要求敏感数据“畅通无阻”。过去,数据存储在被锁定的生产系统中,只有在受控和特定的情况下应用程序才能访问,即使可以访问,生产数据也被严重屏蔽。
但是,今天的数据科学家有一个基本需求,即以无屏蔽的形式访问生产数据。简而言之,如果数据科学家需要某个数据属性或特征来进行模型开发、培训或验证,那么该数据必须在处理时“清晰地”(无屏蔽地)可用。其含义很清楚:如果培训活动要利用云资源,那么数据必须“明文”驻留在云上。
第三,AI/ML 因数据而兴盛。然而,更多的数据——尤其是云中更敏感的数据——大大增加了风险。显而易见的含义是,如果发生数据泄露,那么这将是一个巨大的数据泄露,并带来相应的巨大成本。
最后,保护云中的数据非常困难。必须建立安全边界。必须在企业及其云租赁之间创建安全的链接。对数据的访问必须在一定的粒度级别上进行仲裁,这需要复杂的治理和基于角色的访问控制(RBAC)机制。
这只是典型问题的一小部分。经验表明,这些问题,以及建立和实施解决这些问题的强大数据安全和隐私政策的相关高成本,是在云上广泛采用 AI/ML 的重大障碍。
显然,AI/ML 的独特需求与所需数据的敏感性相结合,迫使企业不得不采取行动——需要一套新的安全策略来保护云中的敏感数据。
Photo by Randy Colas on Unsplash
云安全策略必须应对一系列新的威胁
在某些方面,这些天的头条新闻几乎像一本漫画书,其中我们的英雄——企业——不断受到攻击。就像漫画书一样,大多数攻击都被击退了,但也有一些总能成功。下面是企业必须应对的一些威胁(见图 1)。
Figure 1
场景 1:首先想到的是恶意黑客的攻击,他们试图渗透到企业云租赁中。关于这一点已经写了很多,所以不需要多说什么,除了损害可能是广泛的:想想最近的优步黑客事件,据 TechCrunch 报道,两名黑客绕过安全控制,“窃取了数百万用户的数据”。
场景 2:管理企业云租赁的员工可能会无意中出错,这可能是由于基础架构配置错误或未打补丁,从而导致未被发现的数据泄露。例如,在 Capital One,泄露 1 亿客户数据的大规模数据泄露事件是由错误配置的防火墙引起的。类似地,Equifax 的数据泄露导致 1.48 亿客户的数据泄露,这是由未打补丁的软件造成的。
场景 3:企业需要处理由于潜在的松散控制而导致的敏感数据的无意泄露。最近关于英国 Monzo 银行的头条新闻强调“该银行近 50 万的客户被要求重置他们的个人识别码,因为这些信息被保存在一个员工可以访问的不安全文件中。”
场景 4:有权访问敏感数据的员工可能会非法泄露这些数据。环球邮报报道影响 290 万客户的 Desjardins 集团数据泄露是由一名违规员工引起的,该员工涉嫌窃取和暴露敏感数据,包括个人信息,如姓名、出生日期、社会保险号(类似于美国社会保险号)以及电子邮件、电话和家庭地址。
场景 5:企业还需要考虑第三方或云供应商对其云基础设施做出的意外更改。最近,一家领先的云供应商对导致客户数据泄露的违规事件承担了责任。值得庆幸的是,这种情况很少发生,但仍然值得关注。
云上的企业 AI/ML 可能已经停滞了,但还是有解决方案的
回到我最初的问题:为什么云上的企业 AI/机器学习停滞不前了?简而言之,主要是由于有效的数据安全问题。而且随着企业 AI/ML 不断需求大量敏感的。如果有人能从中得出什么结论,那就是赌注每天都在变得越来越大。
解决方案是有的,但业界已经承认,过去的解决方案可能不会像需要的那样有效。事实上,据麦肯锡的称,“大多数传统 IT 环境采用基于边界的‘城堡和护城河’方法来实现安全性,而云环境更像是现代酒店,通过钥匙卡可以进入特定楼层和房间”。
在下一篇 文章 中,我将分享一些与建立云原生 AI/ML 功能相关的个人经验。特别是,我将讨论“城堡和护城河”方法的缺点,然后解释麦肯锡倡导的“现代酒店房间”和“钥匙卡”概念如何解决阻碍企业在云中采用 AI/ML 的许多安全问题。
为什么&如何:可解释的 ML
Explanation of classification ‘tabby’ as produced by LRP. Photo by author, heatmap implementation available at https://lrpserver.hhi.fraunhofer.de/image-classification.
可解释的机器学习(或可解释的人工智能)技术最近受到了很多关注,因为它试图打开现代预测算法(主要是神经网络)的黑匣子。不仅仅是在学术界,决策者和企业也已经意识到,可解释性是避免在企业、公共卫生、刑事司法等领域部署众所周知的不稳定的 ML 模型所带来的潜在危险的关键。例如,美国军方致力于开发他们所谓的可解释的人工智能系统(XAI) ,欧盟 通用数据保护条例(GDPR)2016包含算法决定的“解释权”,美国的 平等信贷机会法案 主张拒绝信贷的具体原因的权利。可解释的 ML 也催生了众多初创企业,比如可解释的 AI 、 Clarifai 和 Aignostics 等等。
这篇文章的目的是给你一个关于可解释 ML 的概述,为什么它如此有用,你可能从中受益的地方,并给你一些现有方法的初步指示。在这篇文章中,不会涉及任何具体技术的细节。
那么什么是可解释性 ML 呢?
简而言之,可解释的 ML 意味着你的算法做出的决定可以以某种方式被翻译成人类可以理解的领域。例如,如果该算法对猫的图像进行分类,那么一种方法是简单地突出显示该算法已经使用了哪些像素来达成分类决定。
如果你想精确一点,你应该区分解释和解释之间的。解释将预测的类别转换到人类可以理解的领域,例如图像、文本或规则。解释只是负责模型输出的输入特征的集合,它可以是你输入到算法中的任何东西。通常,你会发现这些术语可以互换使用。
可解释 ML 有什么好处?
除了上述的法规要求,可解释的 ML 在许多情况下是有用的,但并不相互排斥:
- 建立信任:当必须做出安全关键决策时,例如在医疗应用中,提供解释非常重要,以便相关领域的专家能够理解模型是如何做出决策的,从而决定是否信任模型。(这里一篇考虑信任的论文。)
- 故障分析:自动驾驶等其他应用在部署时可能不涉及专家。但是,如果出现问题,可解释的方法可以帮助回顾性地检查在哪里做出了错误的决策,并了解如何改进系统。
- 发现:想象一下,你有一种算法可以准确地检测出早期癌症,除此之外,还可以开出最佳治疗方案。能够将它作为一个黑匣子已经很棒了,但是如果专家们能够检查为什么算法做得这么好,并随后深入了解癌症的机制和治疗的功效,那就更好了。
- 验证:在训练 ML 模型的时候,往往很难说出模型有多健壮(即使测试误差很大),以及为什么它在某些情况下做得很好,而在其他情况下却不行。尤其令人发指的是所谓的虚假相关性:与你想在训练数据中预测的类别相关的特征,但不是这个类别正确的真正潜在原因。有很多虚假关联的例子,也有学术文献中记载的案例。
- 模型改进:如果你的模型做得不好,你不知道为什么,有时可以看看模型决策的解释,确定问题是出在数据还是模型结构。
方法动物园
值得注意的是,有许多不同的方法来实现可解释的 ML,并且不是每个方法都适合每个问题。
基于规则的系统,例如 70 年代和 80 年代成功的专家系统,通常是可解释的,因为它们通常将决策表示为一系列简单的 if-then 规则。在这里,整个,可能是复杂的,决策过程可以被追踪。一个主要的缺点是,它们通常依赖于手动定义的规则,或者依赖于以可以从中导出规则的参数形式(即,以符号形式)准备数据。
决策树也遵循 if-then 模式,但是它们可以直接用于许多数据类型。不幸的是,如果决策是复杂的,甚至它们也是不可理解的,而树木肯定不是我们所能使用的最有力的工具。如果您的问题不太复杂,并且您希望模型天生易于解释和交流,那么它们是一个很好的选择。
线性模型(如线性回归)非常有用,因为它们能以与每个输入变量相关的权重形式立即给出解释。由于其性质,线性模型只能捕捉简单的关系,对于高维输入空间,解释可能是不可理解的。
如果你的问题很简单或者符合专家系统的设置,那么上面的一种方法就足够了。如果你想要更强大的最新模型的解释(例如,深度神经网络或内核方法),请继续阅读。
一些模型具有内置的可解释性。例如,神经注意力架构学习可以直接视为解释的输入的权重。解开模型,如贝塔-VAE ,也可以被视为解释产生模型,因为它们为我们提供了数据中有意义的变异因素。
与上面的方法相反,事后可解释性方法处理在模型已经被训练之后提供解释*。这意味着您不必改变您的模型或培训管道,或者重新培训现有的模型来引入可解释性。这些方法中的一些具有与*模型无关的巨大优势,这意味着你可以将它们应用于任何先前训练过的模型。这意味着您也可以轻松地比较不同模型提供的解释。
最著名的事后可解释性技术之一是局部可解释的模型不可知解释 (LIME)。基本思想是,为了局部地解释算法对于特定输入的决定,学习线性模型来仅针对输入周围的小区域仿真算法。这个线性模型本质上是可以解释的,它告诉我们,如果我们稍微改变任何输入特征,输出会如何变化。
SHapley Additive explaints(SHAP)是一种建立在 SHapley 分析基础上的方法,该方法本质上是通过在所有可用特征的多个子集上训练模型来判断特征的重要性,并评估特征的省略会产生什么影响。在 SHAP 的论文中,对石灰和深度提升也进行了连接。
可解释性方法的另外两个密切相关的分支是基于传播和基于梯度的方法。它们或者通过模型传播算法的决定,或者利用损失梯度提供的灵敏度信息。突出的代表有反卷积网络、导向反向传播、 Grad-CAM 、综合梯度、逐层相关传播 (LRP)。
这些方法中有许多是专为(卷积)神经网络设计的。一个显著的例外是 LRP,它也已经被应用于例如内核方法和lstm。2017 年,LRP 获得了额外的理论基础和扩展,即深度泰勒分解。一些基于传播/梯度的方法已经在工具箱中实现并准备好使用。
我试图捕捉最重要的技术,但是当然还有更多的技术,而且这个数字随着每次相关会议的召开而增加。
总结一下,以下是一些要点:
- 可解释的 ML 扮演着越来越重要的角色,并且已经是一个(监管)需求。
- 这在许多情况下都很有帮助,例如,与用户建立信任,或者更好地理解数据和模型。
- 有大量的方法,从有悠久传统的非常简单的工具(基于规则的系统,或线性回归),到可以用于现代模型的技术,如神经网络。
希望你学到了有用的东西。如果您有任何意见或反馈,请告诉我!
为什么我相信因果报应。
为什么你也应该!一个数学家的视角。
我相信因果报应。你也应该这样。为什么?不是因为我有灵性或者类似的东西。我认为你应该相信因果报应,因为因果报应是一个数字游戏。这是一个简单的概率现象。
Photo by Holger Link on Unsplash
让我们采用概率方法,并使其在数学上更加严格。
一个随机的人可能相信因果报应( K ),也可能不相信因果报应( NK )。同样,一个随机的人可能会做好事( G ),也可能会做坏事( NG )。
既然一个人要么相信因果报应,要么不相信因果报应,那么事件 K 和 NK 的概率加起来就是 1 。因为我们把行为分为好的或坏的(我知道,那些数学家,…),事件的概率也加起来是 1。
如果有人相信因果报应,我认为可以有把握地假设,平均来说,他们做好事的次数比做坏事的次数多。我们用 P(G|K) 表示相信因果报应的人做好事的概率,用*P(G | K)*表示不相信因果报应的人做好事的概率。
因此,我们有以下相关概率的事件:
- 一个人相信因果报应的概率: P(K)
- 一个人不相信因果报应的概率: P(NK) = 1-P(K)
- 好行为的概率: P(G) 和
- 不良行为的概率: P(NG) = 1-P(G)
- 相信因果报应的人做好事的概率: P(G|K)
- 一个不相信因果报应的人做好事的概率: P(G|NK)
按我们的假设,相信因果报应的人平均表现更好, P(G|NK) < P(G|K) 。
我身上发生好事的概率有多大?
给定以上所有的概率(不要担心,我们很快会输入数字使其更清晰),我们如何计算P(G)——一个随机的人做一件好事的概率?
我们可以用“全概率法则”从条件概率中确定这个概率,这个法则直接来自条件概率的定义。
Definition of conditional probabilities.
那么总概率的定律由下式给出
Law of Total Probabilities for G and K. It follows from a direct calculation using the definition of conditional probabilities!
现在我们来修正一下 P(G|K)=0.9 和 P(G|NK)=0.5 。因此,我们可以根据给定的条件概率确定 P(G) 和 P(K) 如下
我们甚至可以画出最后一个公式的图表,在这里我们可以直接看到 P(G) 如何随着 P(K) 的变化而变化。在我们的线性方程中, P( G|NK) 是 y 轴交点,差 P(G|K)-P( G|NK) 是斜率。
对此我们该如何解读?
我们来解读一下这个。
想象一下汤姆,一个非常普通的人。他周围都是冷静的人,他们都相信好事会回到他们身边,他们中的大多数人都相信因果报应,即我们为 K 选择高概率,例如 P(K)=0.8 。
然后还有保罗。保罗的环境和汤姆的有点不同。保罗周围的人更喜欢自私,他们中很少有人相信因果报应,即我们为 K 选择低概率,例如 P(K)=0.2。
如果我们输入数字会发生什么?
在汤姆的案例中:
P(G) = 0.40.8 + 0.5 = 0.82*
汤姆遇到好事的概率是 0.82 或者 82%。
在保罗的例子中:
P(G) = 0.40.2 + 0.5 = 0.58*
保罗遇到好事的概率是 0.58%或 58%。
一般情况:
一般来说, P(K) 是一个概率,因此它总是取 0 到 1 之间的值。正如我们上面看到的,概率 P(G) 是一个线性依赖于 P(K)的函数。所以对于给定的概率*P(G | K)**P(G | NK)】来说, P(G) 总是取 0.4 (if P(K)=0 )到 0.9 (if P(K)=1 )之间的值。*我们在上图中也能看到这一点。
看到了吗?有区别。让你周围的人相信好的行为会——至少平均而言——带来更多好的行为并回到你身边是有意义的。因果报应是一个数字游戏,我选择相信它。
你甚至不需要数学来理解这一点。你也可以运用常识。
但是有了数学的支持,这个猜想变得更加美好,你不觉得吗?