TowardsDataScience 博客中文翻译 2021(一百九十)
随着计算能力的提高和模型架构的进步,深度学习是一个在过去几年中飞速发展的研究领域。当阅读深度学习时,你会经常听到两种网络,即全连接神经网络(FCNN)和卷积神经网络(CNN)。这两个是深度学习架构的基础,几乎所有其他深度学习神经网络都源于此。在本文中,我将首先解释全连接层如何工作,然后是卷积层,最后我将通过一个 CNN 的例子。假设,我将我的模型训练设置为 100 个时期,但是我的模型不需要 10
卷积层与全连接层
深度学习基础
当您使用卷积层与全连接层时,实际情况是怎样的?
作者图片
一开始,神经网络的设计是一件很难理解的事情。设计神经网络包括选择许多设计特征,如每层的输入和输出大小、何时何地应用批量标准化层、丢弃层、使用什么激活函数等。在本文中,我想讨论全连接层和卷积背后真正发生的事情,以及如何计算卷积层的输出大小。
介绍
随着计算能力的提高和模型架构的进步,深度学习是一个在过去几年中飞速发展的研究领域。当阅读深度学习时,你会经常听到两种网络,即全连接神经网络(FCNN)和卷积神经网络(CNN)。这两个是深度学习架构的基础,几乎所有其他深度学习神经网络都源于此。在本文中,我将首先解释全连接层如何工作,然后是卷积层,最后我将通过一个 CNN 的例子。
完全连接的层(FC 层)
神经网络是一组相关的非线性函数。每个单独的功能由一个神经元(或感知器)组成。在完全连接的层中,神经元通过权重矩阵对输入向量进行线性变换。然后通过非线性激活函数 f 对产品进行非线性变换。
作者图片
这里我们取权重矩阵 W 和输入向量 x 之间的点积,偏差项(W0)可以添加到非线性函数中。我将在本文的其余部分忽略它,因为它不影响输出大小或决策,只是另一个权重。
如果我们以输入大小为 9、输出大小为 4 的 FC 神经网络中的一个层为例,则操作可以如下所示:
作者图片
激活函数 f 在该层的输入和该层的权重矩阵之间包装点积。注意,权重矩阵中的列将具有不同的数字,并且将随着模型的训练而被优化。
输入是 1×9 向量,权重矩阵是 9×4 矩阵。通过取点积并利用激活函数应用非线性变换,我们得到输出向量(1×4)。
人们也可以通过以下方式来可视化该层:
作者图片
上图显示了为什么我们称这种类型的层为“完全连接”或有时称为“密集连接”。所有可能的层到层的连接都存在,这意味着输入向量的每个输入都会影响输出向量的每个输出。然而,并非所有权重都会影响所有输出。看上面每个节点之间的连线。橙色线代表该层的第一个神经元(或感知器)。这个神经元的权重只影响输出 A,对输出 B、C 或 d 没有影响。
卷积层(Conv 层)
作者图片
卷积实际上是一种滑动点积,其中内核沿着输入矩阵移动,我们将两者之间的点积视为矢量。下面是上面显示的卷积的矢量形式。您可以看到为什么橙色字段之间的点积会输出一个标量(1x44x 1 = 1x1)。
作者图片
同样,我们可以将这个卷积层想象为:
作者图片
卷积不是密集连接的,不是所有的输入节点都影响所有的输出节点。这使得卷积层在学习中具有更大的灵活性。此外,每层的权重数量要少得多,这对于图像数据等高维输入非常有帮助。这些优势赋予了 CNN 在数据中学习特征的众所周知的特性,例如图像数据中的形状和纹理。
与 CNN 合作
在 FC 层中,通过选择权重矩阵中的列数,可以非常简单地指定层的输出大小。对于 Conv 层就不一样了。卷积有许多可以改变的参数,以适应运算的输出大小。
我强烈推荐你查看这个链接到弗朗切斯科对卷积的解释。在这本书里,他解释了卷积的所有变体,比如有和没有填充的卷积、步长、转置卷积等等。这是迄今为止我所见过的最好的,最直观的解释,我仍然经常回头参考它。
Conv 输出大小
要确定卷积的输出大小,可以应用以下公式:
作者图片
输出大小等于输入大小加上两倍的填充减去步幅上的内核大小加上 1。大多数时候我们处理的是方阵,所以这个数字对于行和列是一样的。如果分数不是整数,我们就向上取整。我建议试着理解这个等式。除以步幅是有意义的,因为当我们跳过操作时,我们是将输出大小除以该数字。两次填充来自于填充被添加到矩阵的两侧,因此被添加两次。
转置 Conv 尺寸
根据上面的等式,输出将总是等于或小于输出,除非我们添加大量填充。然而,添加太多填充来增加维度将导致学习中的巨大困难,因为每层的输入将非常稀疏。为了解决这个问题,转置卷积被用来增加输入的大小。示例应用例如在卷积 VAEs 或 GANs 中。
作者图片
上述等式可用于计算转置卷积层的输出大小。
有了这两个方程,你就可以设计一个卷积神经网络了。让我们看看 GAN 的设计,并使用上面的等式来理解它。
GAN 示例
在这里,我将介绍一个使用卷积层和转置卷积层的生成式对抗网络的架构。你会明白为什么上面的等式如此重要,为什么没有它们你就不能设计 CNN。
我们先来看看鉴别器:
作者图片
鉴别器的输入大小是 3x64x64 图像,输出大小是二进制 1x1 标量。我们大幅降低了维度,因此标准卷积层是这种应用的理想选择。
注意,在每个卷积层之间(PyTorch 中表示为 Conv2d ),指定了激活函数(在本例中为 LeakyReLU ),并应用了批量归一化。
鉴别器中的 Conv 层
nn。Conv2d(nc,ndf,k = 4,s = 2,p = 1,bias=False)
第一卷积层将“ndf”卷积应用于输入的 3 层中的每一层。图像数据通常有 3 层,分别用于红绿蓝(RGB 图像)。我们可以对每一层应用一些卷积来增加维度。
应用的第一个卷积的内核大小为 4,跨距为 2,填充为 1。将此代入等式得出:
作者图片
因此输出是一个 32x32 的图像,正如代码中提到的。您可以看到,我们已经将输入的大小减半。接下来的 3 层是相同的,这意味着每层的输出大小是 16x16,然后是 8x8,然后是 4x4。最终层使用的内核大小为 4,步幅为 1,填充为 0。代入公式,我们得到 1×1 的输出大小。
发生器中的转置 Conv 层
nn。ConvTranspose2d( nz,ngf * 8,4,1,0,bias=False)
作者图片
让我们看看发生器中的第一层。发生器有一个 1x1x100 矢量(1xnz)的输入,想要的输出是 3x64x64。我们正在增加维度,所以我们想使用转置卷积。
第一个卷积使用的内核大小为 4,步长为 1,填充为 0。让我们把它代入转置卷积方程:
作者图片
如代码所示,转置卷积的输出大小为 4x4。接下来的 4 个卷积层是相同的,核大小为 4,步长为 2,填充为 1。这使每个输入的大小加倍。于是 4x4 转 8x8,然后 16x16,32x32,最后 64x64。
结论
在本文中,我解释了全连接层和卷积层是如何计算的。我还解释了如何计算卷积和转置卷积层的输出大小。不了解这些,就无法设计自己的 CNN。
支持我👏
希望这对你有所帮助,如果你喜欢,你可以 关注我!
你也可以成为 中级会员 使用我的推荐链接,获得我所有的文章和更多:https://diegounzuetaruedas.medium.com/membership
你可能喜欢的其他文章
卷积神经网络冠军第 3 部分:VGGNet (TensorFlow 2.x)
这是关于最流行的卷积神经网络(CNN)架构的多部分系列的第 3 部分,包含可复制的 Python 笔记本
卷积神经网络是一种特殊类型的神经网络,用于对具有强空间相关性的数据进行建模,例如图像、多元时间序列、地球科学研究(地震分类和回归)以及许多其他应用。自 1998 年以来,卷积网络经历了重大变化,在这一系列文章中,我的目标是再现著名的模型架构冠军,如 LeNet、AlexNet、ResNet 等。我的目标是与更广泛的受众分享我的发现和研究,并提供可复制的 Python 笔记本。
里卡多·弗兰茨在 Unsplash 上的照片
**第一部分:**tensor flow 中的 Lenet-5 和 MNIST 分类:
**第二部分:**ImageNet 和 Tensorflow 上的 AlexNet 分类:
本研究的 Python 笔记本位于我的 Github 页面: 链接
在本系列的前几部分中,我们回顾了 LeNet-5 和 AlexNet 型号。这些部分讨论了一些基本概念,如 conv 层、池层和激活函数。如果读者对这些概念不熟悉,我强烈建议在阅读本文之前先回顾一下。
在这篇文章中,我将讨论卷积神经网络架构的下一个主要发展,称为 VGGnet 。Simonyan 等人[2014]首先在 ILSVRC (ImageNet 大规模视觉识别挑战赛)上发表了来自牛津大学工程科学系视觉几何小组(VGG)的两个神经网络架构的结果,在这次比赛中获得了第一名和第二名。完井中输入的两个 VGGnets 具有 16 和 19 个隐藏层。VGGnet 结构与 AlexNet 结构相比没有多少优势:
- 网络深度:根据 VGG 小组的实验,深度越大,性能越好。
- 更小的滤波器尺寸:前身神经网络 ZfNet 提出,更小的滤波器尺寸可以提高 CNN 的性能。因此,VGG 用 3×3 的滤镜取代了 11×11 和 5×5 的滤镜。减小核的大小导致了参数的减少和计算复杂度的降低。
VGG 集团提出的六个模型有 11 到 19 个不同的层,最著名的 16 和 19 层模型(VGG16,VGG19)实现了卓越的性能。下图总结了这两种模型的体系结构。两个模型之间的唯一区别是在区块 3、4 和 5 中增加了三个 conv 层。他们有 1.38 亿和 1.43 亿个可训练参数,而 AlexNet 有 6200 万个可训练参数。在每个块中堆叠 conv 图层有助于模型从输入数据中提取多个高级特征。
使用 Tensorflow 的 VGG16、VGG19 模型架构
批量大小设置为 256,动量设置为 0.9。学习率最初设置为 0.01,然后当验证
设置精度停止提高时,学习率降低 10 倍。然后使用 SGD 优化器对该模型进行 74 个时期的训练。网络最初使用具有随机权重的较浅网络进行预训练。然后,使用浅预训练网络的权重来初始化每个深网络的权重(这稍后被 Glorot 初始化算法所取代)。
Tensorflow 中的列车 VGG16
下面的示例演示了如何在 Tensorflow 中对 VGG16 模型进行定型。因为训练深度学习模型的计算量很大,所以我演示了如何使用本地资源和仅 10 个 ImageNet 类来训练模型。VGG
函数在 Tensorflow 中建立模型。很容易看到该模型有三个主要组件Conv2D
、MaxPooling2D
和Dense
层堆叠在一起以实现高性能。有关在 Tensorflow 中构建模型的更多细节,请参考本系列的前两节。
在 Tensorflow 2.x 中构建 VGG 模型的代码片段
在这个例子中,我只训练了 40 个时期的模型(与 VGGnet 开发人员提到的 74 个时期相反)。模型的学习曲线可以在下图中看到。对于前 20 个时期,模型似乎在学习特征,因此损失减少,准确性增加。在第 20 个时期之后,模型过度适应训练数据,并且在验证集上的性能在将来不能被提高。这种现象可以通过 Tensorflow 中的EarlyStopping
回调函数来缓解(更多信息在此),该函数试图监控验证损失,如果损失函数没有进一步改善,则停止训练过程。
在 10 个 ImageNet 课程上培训的 VGG16 的学习率
评估结果
评估模型最简单的方法是在 Tensorflow 中使用model.evaluate
提示符。从下图可以看出,该模型在测试集上的性能为 42%。
模型损失和准确性
模型精度并没有给我们关于每个类的模型性能的详细信息。评估分类性能的最常用方法之一是使用所谓的混淆矩阵。混淆矩阵是一个简单的计数矩阵,它展示了每个标签的实例是如何分类的。该矩阵的对角线代表正确分类的实例,而非对角线的实例表明错误分类。
下图演示了 VGG16 10 类的混淆矩阵示例。每个类包含 50 幅图像。可以看出,经过训练的模型在两个类别上具有良好的准确性,而在另外两个类别上具有非常低的准确性。模型精度是正确预测的样本占样本总数的比例。
10 类模型的混淆矩阵
VGG16 -10 级模型精度
从下面的图片可以看出,准确率最低的两个类属于两种不同类型的猴子。两个猴子类的误差最高。分类错误率高的其他类别是桶和篮子。值得注意的是,与原始的 VGGnet 在 1000 个类上训练相比,该模型只看到了 10 个类,因此我们训练的模型的准确性要低得多。
错误分类的图像示例(在 ImageNet 2014 之后修改)
超越 VGGnet
VGG 模型在研究界非常受欢迎,因为它的方法简单,而且预先训练的权重可以在网上免费获得,便于在新任务中对这个强大的模型进行微调。VGG 展示了简单和准确。然而,VGG 模式有几个缺点:
- 训练很慢。模型培训在配备了四个 NVIDIA Titan 黑色 GPU 的系统上进行,为期 2-3 周
- VGG 模型拥有超过 1.36 亿个参数,是最大的 CNN 模型架构之一。因此,VGG-16 训练的 imageNet 权重大小的模型是 528 MB。因此,它需要相当多的磁盘空间和带宽,使其效率低下。
- VGGnet 模型的内存使用率在模型开发期间非常高。VGG16 需要至少 1gb 的内存,更多信息[ 链接。
VGG 在 ImagNet 数据集上展示了良好的精度性能,但是,所有上述限制导致了不同模型结构的发明,如 ResNet,这将在本系列的下一部分中讨论。
感谢阅读!我叫 阿米尔·内贾德,博士。 我是一名数据科学家,也是QuantJam的编辑,我喜欢分享我的想法,并与其他数据科学家合作。可以在GithubTwitter和LinkedIn上和我联系。
你可以在以下网址看到我的其他作品:
**http://amirnejad.medium.com/ **
参考
- 西蒙扬,凯伦和安德鲁·齐泽曼。“用于大规模图像识别的非常深的卷积网络。”arXiv 预印本 arXiv:1409.1556 (2014)。
- Russakovsky,Olga 等人“Imagenet 大规模视觉识别挑战。”国际计算机视觉杂志 115.3(2015):211–252。**
- 卷积神经网络硬件加速器的内存需求。2018 IEEE 工作负载表征国际研讨会(IISWC)。IEEE,2018。
所有图片均由作者制作,除非另有说明。
卷积神经网络:对层的良好理解和图像分类示例
艾莉娜·格鲁布尼亚克在 Unsplash 上的照片
包含了大量的信息
卷积神经网络(CNN)是一种多层神经网络,已知能够检测模式和复杂特征。它在人脸检测、自动驾驶汽车和许多非常复杂的任务中非常有用。在本文中,我将向您介绍卷积神经网络是如何工作的。
本文将涵盖:
- 卷积层如何在正向过程中工作。
- 池层如何工作。
- 用于图像分类项目的卷积神经网络的完整模型结构。
- 模型总结分析。
- 训练模型并显示结果。
CNN 是如何运作的?
CNN 可以用于很多不同的领域,但是在这篇文章中,我们将讨论图像分类的例子。图像数据可以表示为数字像素值。然后这些数值被传入 CNN 进行处理。普通的神经网络也能够检测图像,但 CNN 在准确性和速度方面更有效。
卷积层
卷积层是 CNN 中非常重要的层,因为这是它成为卷积神经网络的原因。在这一层中,使用过滤器或内核来检测重要的特征。目的是使数据集更小,并且只将重要的要素发送到下一个图层。这样节省了密集层的大量计算,也保证了较高的精度。让我们来看一张图。
作者图片
上图是深度 3 的输入数据,一个深度和偏置项相同的核。
这个内核如何过滤输入数据?
接下来的几张图片将一步步展示这一点。
作者图片
计算是这样进行的:
作者图片
让我们把剩下的三个输出填满。下面是如何移动过滤器或内核来计算 y12。
作者图片
我没有展示计算部分。这是相同的项目-明智的乘法,然后求和,如前所示。下图显示了 y21 的内核位置和偏差:
作者图片
最后,y22 计算的内核和偏差:
作者图片
在上图中,只使用了一个内核。但是在真实模型中,可以使用几个内核。在这种情况下,相同大小的输出会更多。我在这里使用的填充类型称为“有效”。这意味着我实际上没有使用任何填充。还有另外两种主要类型,称为“全”和“相同”。我不打算在本文中讨论这些。但是在练习部分,我会用‘有效’。在 high label 思想中,填充“相同”意味着在输入数据的所有边上添加一个零层,然后在其上使用内核。
汇集层
汇集层减少了数据的维数,并且还检测特征,而不管特征在图像中的位置如何。下面是一个 MaxPooling2D 如何工作的例子。
作者图片
上图展示了 MaxPooling 的工作原理。紫色方框的最大值是 15,所以只需要 15。绿框最多 19 个,所以只剩 19 个了。另外两个盒子也是如此。还有其他类型的池,如平均池或最小池。这个名字表明了它们是如何工作的。在平均池中,我们取每个盒子的平均值,在最小池中,我们取每个盒子的最小值。
这些是理解本文练习的重要思想。
卷积神经网络练习
在这个练习中,我将使用 TensorFlow 库自带的免费“cifar”数据集。该数据集包括对象图像的像素值,标签包括数字。每个对象由一个数字表示。我们将首先训练网络,并使用测试数据集检查准确性。数据集已经由训练集和测试集分隔。我正在加载数据:
import tensorflow as tf
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.cifar10.load_data()
数据集包含以下类:
'airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'
每一类都用一个数字来表示。
如果打印 y_train 数据,它看起来像这样:
从训练集中检查一个图像:
import matplotlib.pyplot as plt
image=X_train[3]
plt.imshow(image)
plt.show()
输出:
作者图片
缩放输入数据总是好的。因为我们有像素值,我会把它们除以 255。
X_train = X_train/255
X_test = X_test/255
让我们检查一下训练输入的形状:
X_train.shape
输出:
(50000, 32, 32, 3)
从这个形状我们知道什么?
我们有 50000 个训练数据。输入大小为 32x32,深度为 3。这意味着图像是彩色图像。我们有 RGB 值。
CNN 结构
对于这个项目,我将使用 3x3 的内核大小,我将在第一个卷积层使用 32 个输出窗口。下面是它的样子:
作者图片
在之前的演示中,为了简单起见,我只解释了一个内核。但是您可以根据需要使用任意数量的内核。在这个练习中,我将使用 32 个内核。
为了澄清,上图显示的是 3x3 和深度 3 的输入数据。我们的数据也有三个深度,正如您从 X-train 形状中看到的。但是尺寸是 32x32 而不是这张图所示的 3x3。
图中所有的内核都是 2x2。但是我会用 3x3 内核。你可以试试其他尺寸的。事实上,核不一定是正方形的。它们可以是 4x2 或任何其他矩形形状。
但是内核肯定不能比输入形状大。在此示例中,输入形状为 32x32。所以,内核不能比这个大。
此外,当我们使用一个内核时,我们有一个输出窗口。因为我在这里使用了 32 个内核,所以我将有 32 个输出窗口。
卷积层之后,会有一个 MaxPooling 层。我用了一个 2x2 的过滤器。此外,步幅为 2 意味着将有 2 个步骤。可以尝试不同的步幅。
我将有另外两个卷积和最大池层。然后会有一个’扁平化’层。它确实如其名。它会将三维数据展平为一维列。因为之后我们会把这个一维数据传到致密层。我假设你知道常规神经网络。密集层采用一维数据。对于这个项目,将有三个密集层。最终,输出层。
输出层将使用“softmax”激活。所有其他层将使用“relu”激活功能。
模型如下:
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), padding="valid",
activation="relu", input_shape=(32, 32, 3)),
tf.keras.layers.MaxPooling2D((2, 2), strides=2),
tf.keras.layers.Conv2D(48, (3, 3), padding="valid", activation="relu"),
tf.keras.layers.MaxPooling2D((2, 2), strides=2),
tf.keras.layers.Conv2D(48, (3, 3), padding="valid", activation="relu"),
tf.keras.layers.MaxPooling2D((2, 2), strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(100, activation="relu"),
tf.keras.layers.Dense(100, activation="relu"),
tf.keras.layers.Dense(100, activation="relu"),
tf.keras.layers.Dense(10, activation="softmax")]
)
以下是该模型的总结:
model.summary()
输出:
Model: "sequential_25"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_81 (Conv2D) (None, 30, 30, 32) 896
_________________________________________________________________
max_pooling2d_79 (MaxPooling (None, 15, 15, 32) 0
_________________________________________________________________
conv2d_82 (Conv2D) (None, 13, 13, 48) 13872
_________________________________________________________________
max_pooling2d_80 (MaxPooling (None, 6, 6, 48) 0
_________________________________________________________________
conv2d_83 (Conv2D) (None, 4, 4, 48) 20784
_________________________________________________________________
max_pooling2d_81 (MaxPooling (None, 2, 2, 48) 0
_________________________________________________________________
flatten_27 (Flatten) (None, 192) 0
_________________________________________________________________
dense_98 (Dense) (None, 100) 19300
_________________________________________________________________
dense_99 (Dense) (None, 100) 10100
_________________________________________________________________
dense_100 (Dense) (None, 100) 10100
_________________________________________________________________
dense_101 (Dense) (None, 10) 1010
=================================================================
Total params: 76,062
Trainable params: 76,062
Non-trainable params: 0
_________________________________________________________________
让我们试着理解这个总结。为了便于理解,我将讨论一个卷积层和一个 MaxPooling 层。第一个卷积层输出后的形状是(无,30,30,32)。
让我们来理解一下 30,30 和 32。这里最后一个元素是 32。这很容易理解。因为我们使用了 32 个内核,所以预期有 32 个输出窗口。
**这是什么 30,30?**因为我们使用了“有效”的填充,所以输出形状应该是:
输入大小—内核大小+ 1
这里输入大小为 32,内核大小为 3,因此,
32–3+1 = 30
此公式仅用于“有效”的填充。如果你使用“相同”或“完整”的填充,公式是不同的。
下一个元素是 MaxPooling 层。第一个 MaxPooling 层的输出形状是(无,15,15,32)。如前所述,32 来自 32 个内核。因为我们在 MaxPooling 层中使用了 2x2 过滤器,所以数据在两边都变成了一半。所以,卷积层的 30,30 变成了 15,15。
在我开始训练模特之前。我想用一个提前停止的条件。
什么是提前停止?
假设,我将我的模型训练设置为 100 个时期,但是我的模型不需要 100 个时期。可能它在 50 个纪元后收敛。在这种情况下,如果我让它运行 100 个纪元,就会导致过度拟合。我们可以用我们选择的耐心值来设置提前停止条件。我将在这里使用耐心值 5。这意味着,如果模型损失在 5 个时期内没有足够的变化,则模型将停止训练,即使它仅运行 30 个时期或 50 个时期。
from tensorflow.keras.callbacks import EarlyStopping
callbacks=[EarlyStopping(patience=5)]
训练模型
首先,我们需要编译,然后开始训练:
model.compile(optimizer="adam",
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs = 50,
validation_data=(X_test, y_test), callbacks=callbacks)
我设定了 50 个纪元的模型。但是它在 17 个周期后停止,因为提前停止条件节省了大量时间。
以下是结果摘要:
met_df1 = pd.DataFrame(history.history)
met_df1
输出:
作者图片
这是每个历元的训练准确度和验证准确度的曲线图:
met_df1[["accuracy", "val_accuracy"]].plot()
plt.xlabel("Epochs")
plt.ylabel("Accuracy")
plt.title("Accuracies per Epoch")
plt.show()
作者图片
从上面的图中可以看出,训练精度一直在上升,但验证精度在几个时期后几乎稳定下来。
模型改进
在这篇文章解释的思想范围内,你可以尝试很多事情。如果你想尝试一下,这里有一些想法给你:
- 改变内核形状。您可以尝试 2x2、4x4、2x4、3x2 或您选择的任何其他形状。
- 请随意尝试使用“相同”或“完整”作为填充值,而不是“有效”。
- 更改内核数量,并使用不同的数字,如 48、64、56 或任何其他数字,而不是 32、48 和 48。
- 添加或移除卷积层。
- 尝试用平均池代替最大池。
- 添加或删除密集层,并改变神经元的数量。
- 尝试其他激活功能,如 tanh、elu 或 leakyRelu。
我敢肯定,如果你足够努力,你可能会得到比我在这里显示的结果更好的验证准确性。
结论
我试图让卷积神经网络的想法,它如何在幕后工作。尽管如果你不得不从头开始实现它,会涉及到更多的数学问题。尤其是参数更新。但幸运的是我们有张量流。这为我们更新了参数,我们不需要对所有的元素做偏导数。请随意尝试我上面建议的一些不同的模型架构,如果你觉得有趣,请分享你的发现!
欢迎随时关注我的推特(Twitter)和我的新 T2 YouTube 频道(T3)。
更多阅读
https://pub.towardsai.net/text-data-visualization-with-wordcloud-of-any-shape-in-python-8cec334e5c4f
平面场景的坐标
从像素转换到毫米,反之亦然
你有没有想过生活在平原会是什么样子?我不知道你怎么想,但是我不想把宇宙降级到二维。我对 3D 空间提供的可能性感到满意,比如在我的鞋带上打结和其他拓扑满足感。
当编码自动化检查时,通常不得不冒险进入平原。例如,您可以考虑一个检测系统,其中零件在传送带上移动,摄像机从顶部捕捉图像。在这个场景中,感兴趣的对象被限制在传送带平面上,因此场景本质上是二维的。另一个例子是待检查的物体具有平坦表面的情况。可能希望在图像中定位这些表面,以检查缺陷的存在或验证某些特征是否存在。
在由单个相机拍摄的 3D 场景的一般情况下,场景中的点的 3D 坐标和图像中的 2D 坐标之间没有一对一的关系。多个 3D 点将被投影到给定的图像点。你可以通过想象你正在通过一系列多个透明的窗口拍照来想象这一点。如果每个窗户上都有一只苍蝇,而且每只苍蝇都对准相机的焦点,那么你只能看到一只苍蝇。最近的一个会遮挡其他的,因为苍蝇占据的所有 3D 点都被投影到同一个像素。换句话说,场景中的 3D 坐标和图像中的 2D 坐标之间存在多对一的关系。
在单个平面中具有有趣特征的情况下,情况是不同的。您可以记下感兴趣的平面(位于 3D 世界中)和图像平面(坐标以像素为单位)之间的线性关系。在这种特殊情况下,感兴趣平面上的点的 2D 坐标(去掉 Z 坐标,我们将它任意设置为 0)和图像中的 2D 坐标之间存在一一对应关系:这是一个单应。让我们考虑相机图像平面和 3D 场景中感兴趣的平面之间的映射。
图片来自 Unsplash
一个同性恋?听起来很棒。现在,如何计算呢?
关键是在平面上具有已知坐标(通常以毫米为单位)的点与它们在图像中的坐标(以像素为单位)之间有对应关系。我们知道,用一个型号的针孔摄像机,这些对应点以线性关系联系在一起。
T 是从像素到毫米的 3x3 变换矩阵。(X,Y)是约束到感兴趣平面的点的 2D 坐标(参考轴在该平面内),而(X,Y)是其对应的像素坐标。
为什么我们要添加第三个总是设置为 1 的虚拟坐标呢?
该变换是缩放、剪切、旋转和平移的组合。这些操作可以用 2×2 矩阵和一个附加的 2×1 矢量来表示。通过引入虚拟第三坐标(即齐次表示),我们可以用一个 3×3 矩阵封装复合转换。
这是一个紧凑的问题。
我们的目标将是计算变换矩阵 T ,,这将允许我们从图像中的相应坐标获得场景中点的坐标。让我们显式地写出转换方程,对于给定的对应关系( X ᵢ ,Y ᵢ ,x ᵢ ,y ᵢ):
将方程重组为 Az = b 的形式后,其中 z 包含我们的未知数{t₀₀,… t₁₂}:
我们看到,每封信都为我们提供了两个 6 个未知数的线性方程。为了解这个线性方程组,我们需要至少三个对应,以得到最少 6 个线性独立的方程。在实践中,我们将尝试获得三个以上的对应,并用最小二乘法求解超定系统。
下面的代码和图片可以在这个 github 库中找到。
图像checkerboard.png显示的是一个平面。X 和 Y 轴用蓝线标注。
作者 checkerboard.png
对物理对象的测量允许我们将 2D 坐标(以毫米为单位)与其对应的坐标(以像素为单位)进行映射。
将(798,67)手动识别为真实世界坐标(214.2 毫米,178.5 毫米)的对应关系
有了四个这样的对应(彼此尽可能远),超定方程组可以用 numpy 函数numpy . linalg . lstsq()来求解
有了{t₀₀,… t₁₂}矩阵条目(在上面的代码片段中用向量 z 表示),我们就有了我们的变换矩阵 T 。有了它,我们可以得到一个点的毫米坐标,我们有像素坐标。例如,将像素坐标(399,500)与 T:
预测值(72.3 毫米,74.8 毫米)与测量坐标(71.4 毫米,71.5 毫米)的误差在 4 毫米以内。4 mm)。相反,通过反转 T,我们可以得到一个点的像素坐标,我们有毫米坐标。例如,点(107.1 毫米,107.1 毫米)位于原点右侧三个方格处。
逆变换预测其舍入后的像素坐标应为(496,370):
绿色十字表示预测位置(107.1 毫米,107.1 毫米)。它落在离实际位置几毫米的地方(向右三格,原点向上三格)
正如我们所见,预测很接近,但不准确。这可能是因为我们假设了一个简单的针孔摄像机模型。为了超越针孔照相机模型,我们的成像系统的校准将需要考虑任何非线性失真。
我们已经介绍了构建变换矩阵的步骤,当我们处理平面场景时,变换矩阵给出了像素坐标和毫米坐标之间的线性关系。这是一项基本的计算机视觉操作,需要在自动化检测中经常执行。在实践中,待检查的零件可能具有一些易于定位的基准标记或独特特征。平面上特征的已知 2D 位置(以毫米为单位)及其检测到的图像位置(以像素为单位)将构成一组对应关系,用于计算变换矩阵 T 。然后,已知真实世界坐标的平面上的任何物体都可以在图像中定位,即使这个物体很难检测到,甚至不存在。
假设感兴趣的平面不通过照相机的焦点
针孔相机模型忽略了镜头失真和失焦模糊。它是真实相机的一阶近似。
冠状病毒相关性
探索新冠肺炎国家死亡率与各种社会经济指标之间的相关性。
冠状病毒(新冠肺炎)扰乱了现代世界,这在近代史上是前所未有的。这种病毒的影响只能与二十世纪世界大战造成的破坏相提并论。这种感染已经肆虐地球一年多了,但是关于这种疾病的起源、传播和严重性的许多问题仍然没有答案。持续激烈辩论的一个关键问题是“为什么病毒对一些国家的影响比其他国家更大?”。这篇文章的目的是用数据来说明答案可能非常复杂和令人费解。
下图显示了受疫情影响最严重的 20 个国家。在 x 轴上,我们绘制了一个国家的“每 10 万人口累计死亡人数”(CDP)。这一数字已相对于人口进行了标准化,并取自世界卫生组织(世卫组织)的官方网站,用于冠状病毒更新[1]。CDP 的全球平均值为 30.79。然而,从下文可以清楚地看出,许多国家的情况比这糟糕得多。令人惊讶的事实是,这些受影响严重的国家大多来自拥有良好卫生保健设施的高收入国家,如比利时(第 4 位)、英国(第 5 位)和美国(第 10 位)。即使在这些国家中,趋势也不一致。英国、意大利、西班牙和法国的 CDP 分别为 1651、1505、1300 和 1200,而邻国德国的 CDP 为 734,几乎低了一半。
作者图片
为了进一步分析,使用 python 的WB DataAPI[2,3],从世界银行的开放数据存储库中提取了关于各种社会经济指标的数据。目的是找出 CDP 和这些指标之间的相关系数。我们在这项研究中同时使用了 Spearman 和 Pearson 系数,因为数据中有异常值,并且不能假定变量和 CDP 之间存在线性关系。一般来说,皮尔逊系数§略低于斯皮尔曼系数(S)。让我们先来看看 2019 年一个国家的 CDP 与其使用购买力平价(GDPP)的人均 GDP 的相关性[4]。下面的散点图显示了两个变量之间的关系。CDP 与 GDPP 呈正相关(S=0.54,P=0.36)。与直觉相反的是,数据显示,与较贫穷国家相比,较富裕国家的人均新冠肺炎死亡率更高。
作者图片
世界银行的“营商便利度”(EDB)排名是一个相对较新的综合指标,它考虑了一个国家的各种经济因素。在 EDB,高职位代表着一个运转良好的监管和法律体系,拥有高效的公共官僚机构[5]。该指数排名最高的国家是发达的高收入国家,如新西兰(第 1)、新加坡(第 2)、美国(第 6)和英国(第 8)等。同样矛盾的是,EDB 的国家排名与 CDP 显著负相关(S=-0.45 和 P=-0.44)。EDB 排名靠前的国家在新冠肺炎相关死亡人数方面表现更差。这里需要强调的是,这些相关性并不表明新冠肺炎相关死亡与国家财富之间存在因果关系。但数据分析确实提出了一些附带问题,即来自中低收入国家的新冠肺炎报告数据的可靠性问题。这也暗示了可能影响感染严重程度的更深层的社会经济因素的存在。
一个非常重要的因素是人口统计学和新冠肺炎相关死亡之间的联系。研究已经表明,这种病毒对老年人更加危险。一个国家的预期寿命与 CDP 的相关性相当高且显著(S=0.57,P=0.50)[6]。下图显示了这种关系。CDP 与人口增长的相关性也很高且为负(S=-0.52,P=-0.48)[7]。人口增长率较高的县比人口增长率较低的国家要好得多。较高的城市人口占总人口的百分比也与 CDP 有很强的正相关性,表明生活在城市的人受到疾病的不利影响更大(S=0.48,P=0.40)[8]。该数据表明,新冠肺炎相关死亡与人口统计学之间有很强的联系,这方面应该是严格研究的主题。
作者图片
总之,我们试图强调一些与新冠肺炎人口标准化死亡率统计相关的社会经济指标。人口统计学就是这样一个重要因素。还有一些违反直觉的观察结果,对中低收入国家报告的新冠肺炎数据的准确性提出了质疑,需要进行调查。在此必须指出,这一分析绝非详尽无遗。在未来的研究中,肯定还有其他指标需要考虑,事实上,这些数据确实支持这些隐藏变量的存在。数据是用来分析的,愿力量与数据探索者同在!
注:使用了社会经济指标的最新数据,有些指标的数据是几年前的。
此分析的代码可在以下网址公开使用:
https://github . com/janjuatest/Public-Sector/blob/main/corona . ipynb
参考文献和脚注:
- https://covid19.who.int/table
世卫组织冠状病毒病(新冠肺炎)仪表板,数据检索于 2021 年 2 月 8 日。 - 世界银行公开数据,
https://data.worldbank.org/ - 世界银行数据 Api,
https://Data help desk . world Bank . org/knowledge base/topics/125589 - 世界银行按购买力平价计算的人均国内生产总值指标 ID 为 NY。GDP.PCAP.PP.CD
这种相关性是用 168 个国家的数据计算出来的。 - https://www.doingbusiness.org/en/rankings
世界银行 EDB 指标 ID 为 IC。这种相关性是用 174 个国家的数据计算出来的。 - 世界银行关于一个国家预期寿命的指标 ID 是 SP。在
中,相关性是用 181 个国家的数据计算出来的。 - 世界银行指标 ID 人口增长率为 SP。这种相关性是根据 186 个国家的数据计算出来的。
- 世界银行城市人口占总人口百分比的指标 ID 为 SP。这种相关性是根据 185 个国家的数据计算出来的。
企业需求和人工智能的未来,第一部分
思想和理论
经济意识形态有没有拉拢 AI 研发?
企业追求股东价值最大化是在慢慢破坏人的价值吗?照片由雷扎·哈桑尼亚在 Unsplash 上拍摄
新冠肺炎·疫情标志着人类与数字技术关系的一个转折点。在线合作、远程学习和远程工作成为新的常态。我们现在每天的平均屏幕时间可能比以往任何时候都长。包括传感器、设备和应用在内的新技术的巨大网络,加上 5G 、物联网 (IOT)、边缘计算和 AI/ML 的进步,为自动化数据收集和影响用户行为以实现公共政策和企业目标提供了新的可能性。在这里,我考虑基于强化学习(RL)的技术,因为它在商业上应用于个人和社会。
为什么关注 RL?根据 deep mind 的大卫·西尔弗 T19 和理查德·萨顿最近的一篇论文 T17,人工智能很可能是我们实现人工智能的最佳机会。当然,Deepmind 是谷歌母公司 Alphabet Inc .的一部分。
这篇文章探讨了以下问题:
- 公司对股东价值最大化的追求,加上新自由主义经济思想,是否正在将人工智能的研究、开发和应用推向潜在的病态方向?
- 我们应该相信市场驱动的“私人利益”人工智能研究和开发将符合透明、公正、公平、责任、问责、信任、尊严、可持续和团结的以人为本的价值观吗?
强化(学习)简介
今天,由行为主义心理学家给出的对强化的最初定性描述可以——并且越来越多地——以数字方式实现,并以公司利润最大化为目标。这些数字干预对他们的目标——使用数字系统并与之互动的个人——来说是有效的隐形。在我们的个人设备和应用程序上,我们孤立无援地在 信息圈 中导航,不知道我的谷歌是如何或者为什么以这种方式“个性化”而你的是那种方式。然而,数据平台可以看到、知道并分析所有信息。这个平台在数字上无所不知,几乎无所不能,但显然不是仁慈的。
最初作为强化的语言学描述,被称为桑代克的 效应定律已经逐渐演变成一种精确的算法。“定律”指出,过去导致积极奖励的行为在未来更有可能重复,而导致消极奖励(惩罚)的行为则不太可能重复。至关重要的是,这种想法现在可以由计算机来实现,以自动学习在大规模上操纵人类个体和集体的行为。最近的一篇论文为 RL 在人类身上的“对抗性”使用提供了关键的经验证据。
RL 是一种看似简单的形式主义。它的算法通过提供一种算法机制,允许理想化的代理根据过去的经验,使其行为最佳地适应其环境,从而使效果法则变得清晰。然而,RL 算法的理论和实践性质是复杂的。计算机科学、统计学、经济学和认知科学等不同的领域都有大量的相关文献。但直到现在,这些科学见解才渗透到面向消费者的技术中。
把 RL 看成是解决问题的通用方法。它通过学习感知刺激(状态)和行动之间的工具关联来工作,以便最大化算法设计者确定的一些积极回报。一个基本的交互序列看起来是这样的:代理观察环境的状态,选择一个动作,环境转换到一个新的状态。代理人的目标是找出哪种状态下的哪种动作序列导致最大的累积奖励。与监督学习范式,不同的是,智能体只通过奖励信号接收关于其在给定状态下行动质量的“评估性”反馈——没有“基本事实”告诉它什么是“正确的”行动。
RL 不仅仅是动物学习中一个有趣的话题。RL 已成功应用于机器人、临床决策和个性化医疗、能源网格优化和“及时”行为干预中的问题。RL 是一种优化控制任何复杂系统的手段,包括由数百万用户组成的数字平台。任何你可以想象为决策序列的东西都可以用 RL 形式来建模。
RL 也可以说是我们关于动物如何通过试错来学习复杂行为的最佳理论。例如,在计算神经科学中,RL 模型的参数可以非常精确地拟合实验收集的人类(和猴子)行为数据,这表明我们大脑的某些区域实现了类似 RL 算法的东西。事实上,腹侧被盖区(VTA)的多巴胺神经元的阶段性活动被认为编码了奖励预测误差*(对应于对事件的惊讶,并随后驱动各种对我们环境变化的注意机制)*。奖励预测误差的概念也用于基于时间差异学习 g 更新 RL 中的状态值估计,从而将 AI 与神经科学联系起来。
基于 RL 的个性化的经济含义
如果我们的大脑真的实现了 RL 算法,那么当我们在社交媒体平台上与基于 RL 的系统交互时,我们就参与了类似多代理 RL 的场景。但是我们的利益一致吗?我们是在合作,还是陷入彼此的冲突?
如果我们处于冲突中,对个人的长期认知影响以及对社会的政治和社会影响是什么?肖珊娜·祖博夫、卡伦·杨和米蕾尤·希尔德布兰特和其他学者关心的是,通过几十年的动物学习、反馈控制、人工智能/人工智能和计算神经科学研究获得的知识如何部署在社交媒体平台上。他们的工作表明,经济需求如何使科学知识的应用偏向于以牺牲人类长期福祉为代价来产生短期、直接利润的技术。
但是,对预测复杂系统(特别是经济和自然生态系统)行为失败的仔细历史考察应该提醒我们谦逊认知的重要性。控制可能是理解复杂自然现象的必要条件,但不是充分条件。气候变化和金融危机,有人知道吗?
下面是一个非常简单的示意图,说明反馈控制的基本过程如何通过社交媒体平台上的个性化推荐系统来实现。
平台更好和更多的数据行为收集意味着对“系统状态”更精确的测量,这是在平台上交互的人类用户的集合。对未来状态的更好的预测使得更容易引导、推动或“控制”系统朝着期望的方向发展。基于强化学习的推荐系统在旨在实现公司目标的平台上充当用户“环境”的自适应控制器。来源:作者。
行为主义、科学和深度神经网络
行为主义者是第一个看到概率、统计和强化之间联系的人,尽管他们依赖一种避开大样本和统计推断的古怪方法。然而,随着 Herrnstein 的 匹配定律 的发现,行为主义者意识到,通过对最初随机试错行为的适当强化,动物可以学会“匹配”它们环境中的统计规律。也就是说,动物(和人类)似乎会自然地调整行为频率,以接近环境的潜在回报统计。
通过在正确的时间以正确的方式进行干预,动物的行为可以被逐渐塑造或控制,以解决任意的任务,例如鸽子通过奖励塑造学习堆叠木块以达到食物分配杆。这表明,当我们行为时,无论我们的大脑做什么,它们都会实现类似 RL 算法的东西。
行为主义基于一种以工程为中心的科学哲学,这种哲学起源于奥地利物理学家恩斯特·马赫,后来被物理学家 T2·珀西·布里奇曼改编,最后由 T4 的 BF·斯金纳普及。马赫认为,科学应该致力于压缩知识,而不是不必要地扩大其理论词汇——除非这样做可以解释更广泛的经验观察到的现象。一种严格的科学方法理想地去除了所有的噪音和冗余,只保留信号,然后将信号传达给未来的科学家,以进一步压缩和理解,直到可能找到万物的统一理论。
马赫有影响力的观点结合了进化论和信息论的一些方面来解释科学知识的积累和压缩。他的思想后来也影响了科学的实证主义哲学,这种哲学消除了对不可观察的原因的谈论以及其他源自康德和黑格尔哲学的“形而上学的、先验的晦涩难懂的东西”。行为主义要求将 意向性 的精神术语替换为 由实验者定义的操作性定义的行为。例如,在 1938 年的一篇论文中,爱德华·托尔曼将老鼠在迷宫中的“来回张望”等同于“意识的行为主义定义”。不可观察的精神状态,如关于的“信念”、“欲望”或“意图”,或代表生物体环境的特征的,现在在理论上是禁区。**
但是行为主义并不完全错误。虽然今天经常受到批评,行为主义的见解已经渗透到各个领域。它的主要罪过在于它急于将人类经历的所有降低到无意识的僵尸般行为的水平,而事实上,我们的行为中只有是由这些次个人的、目标导向的过程驱动的。人文主义者不喜欢这种不公正地贬低自我意识在人类思考中的作用,并把人类的自主性、自由意志和道德责任归结为一系列环境互动,这些互动可能受到并不总是仁慈的社会工程师的控制和塑造。**
控制平台用户的强化计划
行为主义与深度学习的进步相结合,标志着一个基于平台的观察、预测和控制用户的新时代。JB Watson、Skinner、Egon Brunswik、Edward Tolman 和其他人的行为主义守卫者依赖于发射行为的共时定义。他们只关心是否有老鼠或鸽子在某个时间点按下了控制杆。老鼠用左臂还是右臂并不重要。就操作定义而言,这两项行动是相同的。要了解行为主义对当今个性化研究的影响,只需将“杠杆按压”替换为“点击”同样的想法也适用。
剥皮器盒子。来源:维基百科。
早期的行为主义者缺乏技术来分析导致特定杠杆按压的行为(状态)的复杂时间序列。纸笔根本效率不高。BF 斯金纳将开发斯金纳盒子来处理这个问题。这个设备实际上实现了一个特定的强化计划,它是描述在操作性条件反射中某些目标行为如何被奖励或惩罚的规则。通常使用固定或可变的时间间隔或试验比率。
在 1958 年发表在美国心理学家杂志上的一篇文章中,斯金纳描述了强化时间表是如何被一个用物理术语描述的“程序系统”执行的。我用加粗的关键词和短语来说明与 RL 的联系,因为它可能会被一个旨在加强有利于其业务目标的用户行为的社交媒体平台所应用。
由一个 编程系统 安排一个加固进度,该进度可以用物理术语来指定。在钥匙和弹匣之间的电路中引入一个时钟,以便在给定的时间间隔后对钥匙的第一个响应将是 加强 。在电路中引入一个计数器,根据每个强化发出的响应数量来建立一个偶然性。
由于精心安排的结果,鸽子、老鼠和猴子在过去的五年里做了它们物种成员从未做过的事情。这并不是说他们的祖先没有这种行为的能力; 大自然从来就没有安排过有效的序列表 。
…从强化研究中涌现出来的新的原理和分析方法可能被证明是二十世纪最有成效的社会工具之一。
强化学习的创新
斯金纳的原始“编程系统”今天已经演变成以商业为中心的 RL。RL 的商业价值源于它能够无形地自动干预数字空间,从而推广昂贵的 A/B 测试。事实上,RL 技术的进步越来越吸引企业和政府对实现财务和公共政策目标的兴趣(例如,自动化和个性化的“轻推”)。
然而令人担忧的是,现在基于递归神经网络 (RNNs)(包括lstm和更新的基于注意力的变压器)的深度神经网络(DNN)架构,可以以自我监督的方式发现和编码这些复杂的行为交互序列,如 RL 形式中的状态。DNNs 允许我们应用黑盒函数逼近器来自动生成状态表示,以调节 RL 代理的动作。DNNs 可以处理非线性用户-项目关系和未标记的非结构化数据,如图像、文本和交互序列,极大地扩展了个人数据收集的可能性。**
这些新技术进一步允许我们放松 RL 中使用的传统马尔可夫决策过程的严格“马尔可夫”假设。这些漫长而复杂的行为序列中的规律可以被自动而有效地发现——几乎不需要人类理解——平台可以通过正确选择旨在实现奖励的行动来指导或塑造它们。从平台的角度来看,控制就是在给定用户处于特定状态(以 RNN 为代表)的情况下,选择一个最优的行动,以获得最大的累积奖励。
效用和平台经济学
平台数据科学家假设“停留时间”和“点击率”等行为指标允许他们窥视平台用户的内心世界。数百万美元花费在数据科学研究上,专注于以业务为中心的“参与度”指标,这些指标来自大杂烩式的营销理论(将可观察到的行为等同于“客户满意度”的表达)和规范经济理论,如 揭示对各种事务状态或对象的偏好 ,按其对用户的效用排序。
现代数据科学家保留了行为主义的大部分方法,同时更新了他们的理论词汇,以包括不可观察的潜在心理状态。但这样做的原因是务实的,而不是认识论的。定位不可观察的潜在偏好允许更好、更准确地预测用户行为,并且似乎口头上尊重消费者作为一个独特的思维、感觉和自我意识的人,其主观体验不同于海鞘。然而,在实践中,同样的效用理论形式适用于海鞘和人类平台用户。
正如哲学家如阿玛蒂亚·森、伊莉莎白·安德森和查尔斯·泰勒很久以前指出的,效用是经济学的一元通用货币。所有有价值的问题都归结为效用。它现在在数据科学中也是一个上升的概念,尽管它受到严重的理论和哲学问题的困扰。然而,总的来说,工程师和数据科学家似乎乐于依赖效用的概念。想想有多少https://www.dssgfellowship.org/有益于社会的数据科学计划是围绕着 社会福利最大化 的功利主义观念制定的。
效用至少融合了价值这个词的三种含义:经济价值、道德价值和数字价值。很容易看出这一举措对算法驱动的数字平台的吸引力。道德价值是模糊的东西,不容易理解,而且经常引起争议。将道德价值简化为一个也可以用金钱来表达的数字,使得决策变得简单,更重要的是,在计算上更容易处理。它允许对科学计算进行自然主义的伦理学还原。例如,如果道德价值可以归结为快乐(即“兴趣”),快乐可以归结为行为现象(即停留时间),行为现象可以归结为神经元活动,那么关于“不可通约的价值”或“商品的多样性”的问题可以礼貌地回避。
数据科学中使用的效用理论的规范方面尤其危险,因为它夹杂了各种关于人性和认知的不合理假设。显示偏好理论建立在理性选择理论的基础上:观察到的行为被认为是理想化合理化过程的结果,其中效用和概率以最佳方式结合,如贝叶斯法则所述。
如果揭示的偏好被规范地看待——作为具有完全信息、无限时间和计算资源的理想化贝叶斯代理的结果——那么我们也为消费者主权的意识形态找到了正当理由。当消费者的选择是可证明的最佳数学程序的输出时,我们有什么资格去批评他们呢?现代经济理论的教父保罗·萨缪尔森在行为主义主导学术心理学的时候发展了显露偏好理论,这并不是巧合。
数字营销漏斗和老鼠迷宫
1938 年,爱德华·托尔曼(Edward Tolman)写道,老鼠迷宫作为一种研究动物学习过程的工具,具有强大的力量,这预示着数字营销漏斗的现代理念。
现在,让我以最后的信仰告白来结束。我相信,心理学上的一切重要事情……都可以通过继续的实验 的理论分析 的决定因素 在 选择点 在 迷宫 中进行本质上的探究。
考虑到经济需要,RL 将越来越多地被用作针对企业目标的人类行为修正的自动化手段。对于数字营销来说,RL 可以用来系统地影响用户在选择选择点的行为,以达到产品购买(转化)的目的。漏斗的各个部分可以被视为用户状态和营销干预(例如,通知/展示/推荐商品 x)的动作*。最佳营销策略选择给定用户状态下的最佳行动。更好的用户监视和数据捕获意味着更细粒度的状态表示。来源:可行性。*****
如果比较不清楚,平台的用户就像迷宫里的老鼠。这个平台是公司的实验者,他希望你跑到迷宫的尽头,购买一些产品或点击一些广告。因为数据平台可以以类似 全景视觉 - 的方式全面监控和记录用户行为,所以 RL 算法现在可以用来塑造和引导它朝着平台的业务目标发展。事实上,通过指定奖励函数,可以同时实现几个优化目标。例如,奖励可能是点击行为(控制浏览行为)和购买(确保 RL 代理选择最终有助于购买的行为,而不是简单的大量点击)的函数。
你可以想象一个 RL 代理可能如何选择一个最优策略(即,一系列干预行动)来推动用户购买更多的产品,为某些政治候选人投票,或者——举一些行为矫正的非邪恶应用的例子——减肥或戒烟。数字营销和计算广告现在是行为修正科学与 RL 相遇的地方。结合的生成性对抗网络 (GANs)和创建适应性强的“个性化”音频、视频和基于图像的内容的能力,可能性是无限的。数十亿美元将被创造,而目前在这个领域几乎没有监管。
想象一下在中国这样的社会中这是多么的巨大。RL-agents 可以在淘宝、微信、美团外卖、 JD 、滴滴出行出行等平台上每天与数十亿用户互动。一个巨大的多智能体 RL 系统可以使用由中国共产党拥有和运营的中央数据存储器“重放缓冲器】来构建,其中无数专门的 RL 智能体的个体交互通过汇集状态-行动-回报历史来共享和改进行为政策。虽然有些牵强,但这并非不可能:斯坦福大学的 2021 年人工智能指数报告显示,中国在人工智能期刊引用方面已经超过美国。**
Joshua Hoehne 在 Unsplash 上拍摄的照片
私人利益中的数据科学&制造怀疑
将企业需求与自动化行为修正技术混合在一起是一个社会灾难的处方。举个例子,华尔街日报最近发表了一篇文章,披露了脸书如何在 2017-2018 年左右对其新闻推送算法进行修改,以抵消用户参与度下降的影响。这些变化旨在鼓励更多的个人联系和改善心理健康,但它们适得其反。相反,该算法实际上成为了一台愤怒和错误信息的传播机器,企业利润需求是扎克伯格和其他人没有采取任何行动来对抗随之而来的社会外部性的主要原因。
然而,脸书的研究负责人对《华尔街日报》的说法进行了官方反驳。但是这有点像期望菲利普莫里斯给你关于吸烟影响的公正信息。鉴于企业利润的必要性,很难知道该相信什么。不幸的是,如果学术人才继续以目前的速度流失,前景似乎并不乐观。斯坦福大学的人工智能指数报告指出,现在北美 65%的人工智能博士毕业后进入行业,而 2010 年只有 44%。
因此,我们能做些什么来对抗不可避免地使用基于 RL 的技术作为以牺牲我们的精神健康、政治和社会稳定为代价来获取更大公司利润的手段吗?在他的书《私人利益中的科学》中, 谢尔登克里姆斯基详细描述了在烟草、产品安全、环境污染、工作场所有毒物质以及药物对成人和儿童的疗效和副作用等领域研究“被忽视的人类需求和不公正”的自由思想科学家“稀疏队伍”背后的历史。
像内奥米·奥雷斯克斯和克林姆斯基这样的学者揭示了协调一致的企业战略制造怀疑,以便在诸如吸烟和气候变化等具有集体重要性的问题上故意混淆和误导公众。这一战略的前提是有害后果的不确定性有利于现状。极不可能发生的危险,即使很大,也不需要采取预防措施。为什么平台不能使用类似的策略来“搅浑”青少年福祉、心理健康和社交媒体使用的研究水呢?我们已经看到类似的事情被用来回应脸书的告密者 Frances Haugen。****
企业数据平台掌握着回答具有重要社会意义的类似问题的关键。他们收集和控制数十亿用户的行为数据,从广告中获得大量现金,并可以随意干预数百万用户的在线体验,以测试关于情感传染等事情的因果假设。资金紧张、渴望发表论文的数据科学学者很难与之竞争。
为了公众利益走向数据科学
克林姆斯基有力地指出,我们必须捍卫美国研究机构的完整性,尤其是研究型大学。为什么?因为
大学不仅仅是智慧的源泉……大学是一个舞台,通过这个舞台,有奉献精神的男男女女可以为了社会的进步而向权力说真话。
我们可能需要政府监管机构和机构的帮助,以使公共利益数据科学研究成为现实。但立法者需要认识到,有意义的平台研究不仅需要访问行为数据,还需要访问推荐服务系统本身。好的科学旨在揭示现象的不可观察的原因;它必须超越简单地描述以前由平台管理的数据集中可观察到的相关性。最后,公共利益而非私人利益的学术数据科学研究遵守国际人类受试者研究伦理协议,我们可能还需要更新这些协议,以反映对社会负责的数据科学研究的新范式。
因此,这是为了培养新一代愿意向当权者说真话的学术数据科学家。
纠正波士顿住房市场数据集
使用谷歌的地理编码器 API 修正纬度和经度坐标
图片来自 Sam Clarke 在 Unsplash ( 来源)
TL;博士
波士顿住房市场数据集的纬度和经度不正确。校正后的数据集可以在这里找到。
波士顿住房市场数据集无处不在。尽管如此,纬度和经度值是错误的。这篇文章相当短,旨在:a)引起人们对问题的注意,b)提供校正数据集的链接,以及 c)描述用于校正数据集的方法。
数据集有问题
如图 1 所示,住宅的快速绘图显示了纬度和经度的问题。
图 1:校正前的住宅图
我们首先注意到大量的城镇实际上出现在水中,如图 2 所示。
图 2:放大的图片显示许多城镇出现在水中
此外,我们可以通过检查谷歌地图上的各个城镇来确认纬度和经度是不正确的。图 3 显示了一个在 Nahant 的住宅的例子。
图 3:(左)出现在谷歌地图上的 Nahant 和(右)使用数据集坐标的 Nahant
这个数据集的很多在线分析都没有考虑这个问题(比如这里的)。尽管他们进行了出色的分析,但住宅的绘制是错误的。
修复方法
为了固定数据集,做了一个关键的假设。这就是纬度和经度的误差实际上是它们都移动了一个常量。在这个公式中,我们猜测误差是系统性的,而不是随机的。
我们假设每个住宅到其各自城镇中心的距离是一致且正确的。我们猜测这个误差实际上来自于城镇中心的转移。然后我们定义:
其中 x_i 是我们数据集中一个住宅 i 的坐标(纬度或经度), x_bar_j 是住宅 i 所在城镇 j (即城镇中心)的平均坐标, D_i 是住宅 i 到城镇中心 x_bar_j 的坐标距离
基于我们对误差性质的假设,这意味着如果我们用修正的 x_bar_j* 替换**x _ bar _ j ***,保持 D_i 不变,我们可以找到每个住所的修正位置。
为了找到正确的城镇中心 x_bar_j* ,我们使用了谷歌的地理编码器 API。这方面的代码如下所示:
完整的实现可以在这里找到。
结果
下面的图 4 并排显示了校正和未校正的坐标。
图 4:(左)未修正的城镇坐标和(右)修正的城镇坐标
值得注意的是,坐标比校正前更有意义,因为:
- 水上没有住宅
- 住宅成群出现(这是有道理的,因为它们应该来自同一个城镇)
可在处找到校正数据集的链接。
我希望这篇文章对希望对波士顿住房市场数据集进行分析的数据科学初学者(或专家)有所帮助。
除非另有说明,所有图片均由作者制作。
蒙特卡罗模拟中的相关变量
入门
香草冰淇淋的销量能超过巧克力吗?
目录:
- 介绍
- 问题陈述
- 数据准备
- 错误方法 1-独立模拟(参数化)
- 错误方法 2-独立模拟(非参数)
- 方法 1 —多元分布
- 方法 2-具有边缘分布的连接函数
- 方法 3——模拟销售增长的历史组合
- 方法 4——使用 PCA 消除商店销售增长的相关性
介绍
蒙特卡洛模拟是销售、资产回报、项目投资回报率等的一个很好的预测工具。
在之前的文章中,我提供了如何在商业环境中使用蒙特卡罗模拟来预测一系列可能的商业结果及其相关概率的实用介绍。
在本文中,我们将解决蒙特卡洛模拟中相关变量的挑战。我们将研究 4 种处理相关性的适当方法。
问题陈述
在我们的样本数据集中,20 年前,巧克力冰淇淋的年销售额为 500 万美元,香草冰淇淋的年销售额为 400 万美元。巧克力冰淇淋的需求量比香草冰淇淋多 25%。
在过去的 20 年里,对巧克力和香草的需求都在增长,但是巧克力和香草之间的销售差距已经缩小。去年,巧克力冰淇淋销售额为 1260 万美元,香草冰淇淋销售额为 1190 万美元。现在对巧克力的需求仅比香草多 6%。
注 —巧克力和香草冰淇淋的销量正相关,即巧克力冰淇淋和香草冰淇淋的销量往往同增同减。
问题:明年会是香草冰淇淋销量超过巧克力冰淇淋销量的一年吗?
巧克力和香草冰淇淋销售之间相互关系的图解(图片由作者提供)
解决方案:我们可以运行蒙特卡洛模拟来回答我们的问题。
独立模拟巧克力和香草冰淇淋的销售是错误的。
数据准备
我们首先配置巧克力和香草冰淇淋销售的样本起始销售数字。选定的数字分别为 500 万美元和 400 万美元。我们假设大多数人都有点偏爱巧克力冰淇淋。
START_CHOC = 5
START_VAN = 4
然后,我们想要绘制 20 个随机的年销售增长率,假设香草和巧克力冰淇淋的销售增长率遵循多元正态分布。这是正态分布的扩展,我们假设两种冰淇淋口味的销售增长率都遵循正态分布,但两个正态分布之间存在关系。
我们假设两种口味的平均增长率为 5%,标准偏差为 10%,两种口味的增长率之间的相关性为 0.9。
# Config for multivariate normal distribution
CORR = 0.9
MU = 1.05
SIGMA = 0.1
下面是生成增长率和年销售额的代码。
# Generate sales and growth rates for 20 periods
# using a multivariate normal distribution
cov_matrix = [[(SIGMA**2), CORR*(SIGMA**2)],
[CORR*(SIGMA**2), (SIGMA**2)]]distribution = ss.multivariate_normal(
mean=[MU, MU], cov=cov_matrix)sample_data = distribution.rvs(20, random_state=5)chocolate_growth = sample_data[:, 0]
vanilla_growth = sample_data[:, 1]chocolate_sales = np.cumprod([START_CHOC] + list(chocolate_growth))
vanilla_sales = np.cumprod([START_VAN] + list(vanilla_growth))# Prepare dataframes
growth_df = pd.DataFrame(data={
"Growth Rate - Chocolate": chocolate_growth,
"Growth Rate - Vanilla": vanilla_growth})sales_df = pd.DataFrame(data={
"Sales Chocolate (USD mln)": chocolate_sales,
"Sales Vanilla (USD mln)": vanilla_sales})df = pd.concat([growth_df, sales_df], axis=1)
df
冰淇淋销量和增长率(图片由作者提供)
错误方法 1-独立模拟(参数化)
首先,我们将运行一个蒙特卡洛模拟,我们将研究香草和巧克力销售的统计分布,但是将这两种分布都视为独立变量。这是一个错误的方法,因为香草和巧克力冰淇淋的销售是相互关联的。
我们知道分布的参数,因为我们已经创建了数据集,假设巧克力和香草的销售增长率遵循均值为 1.05(平均增长 5%)和标准差为 0.1 (10%)的正态分布。参见上一节。
然而,让我们假设我们不知道这些参数,以便复制我们在现实生活中会面临的挑战。我们必须使用历史数据来估计参数。
# Estimate means
mean_choc = np.mean(df["Growth Rate - Chocolate"])
print(f"Mean (Chocolate): {mean_choc}")mean_van = np.mean(df["Growth Rate - Vanilla"])
print(f"Mean (Vanilla): {mean_van}")# Estimate standard deviations
std_choc = np.std(df["Growth Rate - Chocolate"],
ddof=1)
print(f"StDev (Chocolate): {std_choc}")std_van = np.std(df["Growth Rate - Vanilla"],
ddof=1)
print(f"StDev (Vanilla): {std_van}")# Define normal distributions
distribution_choc = ss.norm(mean_choc, std_choc)distribution_van = ss.norm(mean_van, std_van)
来自 20 年样本的平均值和标准偏差(图片由作者提供)
接下来,我们模拟巧克力和香草冰淇淋销售的 1000 个样本增长率。
growth_vanilla = distribution_choc.rvs(1000,
random_state=1)growth_chocolate = distribution_van.rvs(1000,
random_state=2)
现在让我们准备一个函数,我们可以用它来检查香草的销售额是否会超过巧克力的销售额。
def exceed_check(growth_vanilla, growth_chocolate):
'''This function takes sample growth rates for
vanilla and chocolate ice cream sales and checks
if vanilla ice cream sales would exceed chocolate
given the combination of growth rates.
Args:
growth_vanilla (list): growth rates for vanilla sales
growth_chocolate (list): growth rates for chocolate sales
Returns:
flags_list (list): A list of True/False flags indicating
whether vanilla sales exceeds chocolate sales for the
given combination of growth rates
mean_pass_rate: Mean value of flags_list indicating the
probability vanilla sales exceeds chocolates given the
combination of growth rates
'''
# Last year's chocolate and vanilla ice cream sales
# set as constants to improve performance
FINAL_CHOCOLATE = 12.59
FINAL_VANILLA = 11.94
flags_list = [v*FINAL_VANILLA > c*FINAL_CHOCOLATE
for v,c in zip(growth_vanilla, growth_chocolate)]
mean_pass_rate = np.mean(flags_list)
return flags_list, mean_pass_rate
最后,我们来查一下香草销量超过巧克力的概率…
exceed_check(growth_vanilla, growth_chocolate)[1]
概率: 34.1%
错误方法 2-独立模拟(非参数)
在第二个错误的方法中,我们独立地模拟了巧克力和香草的销售增长率,但是我们没有假设任何统计分布。我们从历史中得出样本增长率。
growth_vanilla = df["Growth Rate - Vanilla"].dropna(
).sample(1000, replace=True, random_state=1)growth_chocolate = df["Growth Rate - Chocolate"].dropna(
).sample(1000, replace=True, random_state=2)
现在我们检查香草销售额超过巧克力的可能性…
exceed_check(growth_vanilla, growth_chocolate)[1]
概率: 35.9%
到目前为止,我们分别对待巧克力和香草销售的两种错误方法给了我们 34%到 36%之间的可能性…毕竟明年很有可能是香草冰淇淋爱好者之年…
图片来自 Pixabay 的 Clker-Free-Vector-Images
方法 1-多元分布
我们将用来检查香草销售额是否可能超过巧克力销售额的第一个适当方法是估计代表数据的多元分布,并从该样本中得出潜在增长率。多元分布模拟多元变量的组合分布。相关性被捕获。
请记住,我们实际上是从多元正态分布中生成的数据,巧克力和香草的平均值为 1.05,标准偏差为 0.1,相关性为 0.9。不过,这里我们将假设我们不知道参数,我们将使用历史数据来估计分布参数,就像我们在独立参数模拟中所做的那样(“错误方法 1”一节)。
我们已经估算了前面提到的平均值和标准偏差,但是我们仍然需要估算巧克力和香草冰淇淋销售之间的相关性。
corr = df.corr().iloc[0, 1]
corr
估计的相关性与我们用来生成数据的实际值 0.9 相差不远(图片由作者提供)
我们现在可以从多元正态分布中得出 1000 个样本的增长率…
# We need to recalculate the covariance matrix
# using the estimated paramaters
cov_matrix = [[std_choc**2, corr*std_choc*std_van],
[corr*std_choc*std_van, std_van**2]]growth_rates = ss.multivariate_normal(
mean=[mean_choc, mean_van],
cov=cov_matrix).rvs(1000, random_state=1)growth_chocolate = growth_rates[:, 0]
growth_vanilla = growth_rates[:, 1]
最后,我们计算香草销售额超过巧克力的概率…
exceed_check(growth_vanilla, growth_chocolate)[1]
概率: **11.3%!**请注意,在我们考虑了巧克力和香草冰淇淋销售之间的相关性后,这种可能性现在低了很多。
看起来巧克力可能仍然是主要的口味…
图片来自请不要出售我的作品,因为是来自 Pixabay 的
方法 2-具有边缘分布的连接函数
在上一节中,我们看了多元正态分布。巧克力和香草冰淇淋的销量都服从正态分布,它们是相关的。这使得用多元正态分布来表示它们变得很容易。
有时,我们可能有两个或更多来自不同统计分布的变量,并且没有已知的多元分布可以解释它们的组合分布。如果我们确实知道变量 + 的个体(边际)分布,我们知道它们之间的相关性,那么连接函数可以有所帮助。
对系词的详细解释超出了范围,但简单地说…
假设一个变量可能的最低值是 0,最高值是 1。Copulas 生成该范围内的值的组合,从而保持变量之间的相关性所暗示的关系。由于我们的变量是巧克力和香草冰淇淋销售额,并且它们正相关,当香草冰淇淋也具有高价值时,copulas 将绘制更接近 1(最高值)的巧克力冰淇淋销售额增长值,反之亦然。
有一些现有的库可以安装来利用 copula,但下面我们将使用 hack 从头构建一个 copula(高斯函数),这可能有助于更好地理解这个过程。
首先,我们需要重新计算巧克力和香草销售增长这两个变量之间的相关性,因为 copulas 是基于**等级相关性的。**在上一节中,我们计算了皮尔逊相关系数,但现在我们将使用 Kendall 的 Tau 来衡量等级相关性。等级相关性是基于计算值的等级之间的相关性,而不是值本身。
corr = ss.kendalltau(
df.dropna().iloc[:, 0], df.dropna().iloc[:, 1])[0]corr
0.74 的等级相关性低于我们之前计算的 0.93 的相关性(图片由作者提供)
现在我们可以构建我们的系词…
# We set variances to 1 because the covariance matrix we
# are constructing will be used with a multivariate normal
# distribution of means 0 and std 1 to derive a copula
cov_matrix = [[1, corr],
[corr, 1]]# We will draw 1000 combinations from the distribution
random_vals = ss.multivariate_normal(cov=cov).rvs(
1000, random_state=1)# Finally a cumulative density function for a distribution
# ranges between 0 to 1 so it will be used to convert the
# drawn samples to the values we need for our copula
copula = ss.norm.cdf(random_vals)
print(copula.shape)
copula
作者图片
我们可以看到 copula 有 1000 个跨 2 个变量的相关条目,它们的范围从 0 到 1。
下面是我们两个变量的相关 copula 值的散点图。
sns.scatterplot(x=copula[:, 0], y=copula[:, 1])
作者图片
介于 0 和 1 之间的 copula 值捕获了变量之间的相关性,因此现在我们只需将 0–1 值转换为我们希望用于巧克力和香草冰淇淋销售增长率的实际值。
我们使用百分点函数来表示每个变量在转换中的分布。我们已经在独立参数模拟部分估计了分布(“错误方法 1”)。不同之处在于,我们现在不只是从每个分布中随机抽取值,而是使用 copula 值和百分点函数从每个分布中抽取相关随机值。
# distribution_choc and distribution_van area already
# calculated in previous sections
growth_chocolate = distribution_choc.ppf(copula[:, 0])
growth_vanilla = distribution_van.ppf(copula[:, 1])
最后,让我们将这些增长率传递给我们的函数,以检查香草销售额超过巧克力销售额的可能性…
exceed_check(growth_vanilla, growth_chocolate)[1]
概率: 11.1%
11%的概率与上一节中的概率相似,证实了我们在最初应用的 2 个错误方法中严重高估了概率。
这种方法有几个步骤,可能需要对不同的概念进行更彻底的解释。不过需要记住的一点是,我们使用 copula 生成的介于 0 和 1 之间的值可以用于任何统计分布的组合。
我们的例子很简单,因为两个变量的分布都是正态的,所以上一节的方法(多元正态分布)是足够的,实际上应该产生与本节相同的结果。但是想象一个不同的场景,其中变量 A 是正态分布,变量 B 是二项式分布等等。在这种情况下,将需要系词。
一个假设的场景是预测电影票销售和爆米花销售,其中我们将电影院游客的数量建模为泊松分布,然后我们使用二项式分布来建模爆米花销售,其中每个买票的电影院游客都有一定的概率购买爆米花。
方法 3——模拟销售增长的历史组合
这是一种类似于独立非参数模拟的简单方法(第 2 节“错误方法”),其中我们不估计任何统计分布,而是直接从历史中抽取样本。
我们应用的修正是,我们不独立地从不同的历史点获取巧克力和香草销售的历史增长率。相反,我们随机选取历史上的一个点,从历史上的同一点**中选取两个增长率。**然后,我们在历史中绘制另一个点,并做同样的事情,直到我们达到我们想要运行的模拟轮数。
例如,我们回放历史,并在第一轮模拟中从第 5 年开始计算两种口味的增长率,然后在第二轮模拟中从第 11 年开始计算,依此类推。
在“错误方法 2”一节中的独立方法中,例如,我们可以在同一轮模拟中采用第 5 年香草的增长率,以及第 11 年巧克力的增长率。我们在重演巧克力和香草冰淇淋的销售历史,两者相互独立。
resampled_history = df[["Growth Rate - Chocolate",
"Growth Rate - Vanilla"]].dropna(
).sample(1000, replace=True, random_state=1)growth_chocolate = resampled_history["Growth Rate - Chocolate"]
growth_vanilla = resampled_history["Growth Rate - Vanilla"]exceed_check(growth_vanilla, growth_chocolate)[1]
概率: 21% 这一概率高于从最后两种适当方法得出的预期的约 11%,但低于错误模拟方法暗示的约 35%。
这种方法依赖于有足够的历史记录,通常更适合于财务数据,例如,我们有许多历史数据点。
在我们的示例中,我们只有 20 年的数据,代表巧克力和香草冰淇淋销售的 20 种历史增长率组合。这是一个很小的数字,我们会对过去发生的一些事情给予过多的重视。
方法 4——使用 PCA 消除商店销售增长的相关性
在前一种方法中,我们的方法面临的挑战是,我们只从 20 个数据点进行重新采样,因为我们有 20 个香草和巧克力冰淇淋历史销售增长的组合。
在独立的非参数模拟中(“错误方法 2”部分),该方法是错误的,因为我们将香草和巧克力的销售增长率视为独立的。这使得我们有 400 (20 x 20)个历史数据点进行重新采样,因为我们可以将巧克力的 20 个历史销售增长率中的任何一个与香草的 20 个历史增长率中的任何一个结合起来。我们能够将第一年巧克力的增长率与第二年香草的增长率结合起来…在方法 3 中,我们做不到。
在这最后一种方法中,我们遵循一个非常相似的方法,即我们不估计任何统计分布,我们重放历史增长率。
这个方法的核心是我们首先去关联两种口味的冰淇淋销售增长率。这种方法将允许我们将某一年的巧克力的历史增长率与另一年的香草的历史增长率结合起来,因为我们消除了我们必须控制的相关性。我们最终会有更多的数据点需要重新采样。
步骤 1 是使用去相关方法。我们在这个例子中使用主成分分析,我想你应该很熟悉。Choletsky 分解也是金融中一种流行的替代方法。
请注意,PCA 通常用于数据科学中的降维,但我们真正感兴趣的是这样一个事实,即 PCA 组件是去相关的。在我们的例子中,我们不希望减少维度,所以我们将传递两个变量(巧克力和香草的销售增长率),我们将获得两个去相关的组件。由于这些主要成分是去相关的,我们可以混合和匹配历史上不同时间点的成分,并得到巧克力和香草销售增长率的 400 种组合,我们可以从中重新取样。
pca = PCA(n_components=2)# Normalize chocolate and vanilla growth rates to apply PCA
normalized_chocolate = (
df["Growth Rate - Chocolate"].dropna() - mean_choc
) / std_chocnormalized_vanilla = (
df["Growth Rate - Vanilla"].dropna() - mean_van
) / std_van# Apply PCA transformation on normalized values
components = pca.fit_transform(
np.array([normalized_chocolate,
normalized_vanilla]).T)components
代表 20 年数据的 20 x 2 阵列和 2 个 PCA 组件(图片由作者提供)
接下来,我们运行 1000 次模拟,从元件阵列中取样。
np.random.seed(1)sampled_components = [[x[0], x[1]] for x in zip(
# Sampling 1000 entries from first PCA component
np.random.choice(components[:, 0], 1000),
# 2nd PCA component
np.random.choice(components[:, 1], 1000))]
下一步是通过反转我们已经完成的转换(标准化和主成分分析)将采样成分值转换为增长率。
inverse_pca = pca.inverse_transform(sampled_components)# Denormalizing
growth_chocolate = [(x * std_choc) + mean_choc
for x in inverse_pca[:, 0]]
growth_vanilla = [(x * std_van) + mean_van
for x in inverse_pca[:, 1]]
最后…
exceed_check(growth_vanilla, growth_chocolate)[1]
概率: 17.1% 更接近我们基于方法 1 和方法 2 预期的 11%。
结论
下面是我们预测的香草冰淇淋销量超过巧克力的可能性。我们使用了 2 个错误的方法和 4 个合适的方法。
作者图片
两个错误的方法,运行蒙特卡罗模拟,假设香草和巧克力冰淇淋的销售是独立的,大大高估了香草的销售可能在明年超过巧克力的概率。
因为两种口味的销售被认为是独立的,所以有一个不切实际的高概率被认为香草的销售将会比正常的增长率高得多,而巧克力的销售将会比正常的增长率低得多。现实表明,这两种口味的销售彼此正相关,因此在大多数情况下,这两种口味的增长都很高,或者都很低,表现略有不同。
方法 1 和 2 是最准确的,这意味着香草有 11%的可能性超过巧克力。这是因为实际数据来自多元正态分布。然而,最佳方法的选择取决于手头的数据集。
方法 1 和 2 要求基本的统计分布能够被相当精确地估计。方法 3 和 4 依赖于拥有足够大的数据集。
最重要的一点是不要忽略蒙特卡罗模拟中的相关性。
相关性和因果性——“啤酒和尿布”的故事?
用图解和例子理解相关性和因果关系
图片由 SparrowsHome 来自 Pixabay
我猜想你正在为一家在线零售商设计推荐引擎。你做的一切都是对的(至少你是这么认为的……)。在结果中,你发现当啤酒被男性购买时,你的算法正在推荐尿布。牵强的想象?还是你的算法推荐错了还是对了?啤酒和纸尿裤有关联吗?或者他们有因果关系——可笑吧?
了解不同自变量和因变量之间的关系是探索性数据分析或机器学习模型构建的关键步骤之一。相关性、共线性、协方差和因果关系是理解这种关系的一些选项。在本文中,我们将讨论相关性和因果关系。
让我们更好地理解这些术语。相关性的正式定义是,在统计学中,相关性或依赖性是两个随机变量或二元数据之间的任何统计关系,无论是否是因果关系。(来源: 维基百科 )
并且,因果关系(也称为因果关系,或原因和结果)被定义为— 是一个事件、过程、状态或对象(原因)对另一个事件、过程、状态或对象(结果)的产生产生影响,其中原因部分地对结果负责,结果部分地依赖于原因。(来源: 维基百科 )
唷…令人费解,对吧?这是大多数统计术语的问题。所以让我们来分解一下—
- 有什么关联?
- 什么是因果关系,即原因和结果?
- 如何确定因果关系
有什么关联?
简而言之,相关性是两个变量之间的关联或变化的度量。这两个变量之间的关系用强度和方向来解释。如果一个变量的增加导致第二个变量的增加,那么这两个变量是正相关的。如果一个变量的增加导致另一个变量的减少,那么两个变量是负相关的。同样,如果一个变量的变化导致另一个变量的显著变化,那么两个变量是强相关的,否则是弱相关的。
当讨论相关性时,最常见的是线性相关性(例如,身体的重量与身体的质量线性相关,即 W = mg,其中 m 是质量,g =重力或重力加速度)。然而,两个变量也可以具有非线性关系(例如,圆的体积和半径具有非线性关系)
相关系数
相关系数提供了幅度和方向的信息。基于不同类型数据(正态与非正态数据、连续与离散或分类数据、有序数据等),有不同的方法来计算相关系数。)-
皮尔逊积差相关系数 :又称皮尔逊相关系数或简称皮尔逊系数,是一种衡量两个变量之间相关性的统计方法。该系数提供了线性关联强度的度量。皮尔逊相关系数从-1 到 1 不等。正负符号表示关系的方向,数值表示关系的强度。
图片由萨加尔·加瓦利拍摄
让我们看看皮尔逊系数的例子:
- 模拟数据(图 1、2 和 3)及其相关系数,以了解如何解释皮尔逊系数。
图片由萨加尔·加瓦利
2.使用“来自 scikit-learn 库的 Iris 数据集”的皮尔逊系数
图片由萨加尔·加瓦利
然而,为了有效地使用人员系数,应满足以下假设:
- 两个变量都是连续的,并且是联合正态分布的。如果 aX +bY 具有正态分布,则两个变量 X 和 Y 被认为是联合正态分布的。
- 数据中没有异常值。极端异常值对系数值有不适当的影响。(地块 7 和地块 8)
图片由萨加尔·加瓦利
与皮尔逊相关系数类似,还有其他类型的相关系数,如斯皮尔曼相关系数,用于非正态分布的连续数据、有序数据或具有有效异常值的数据。其他类型的相关系数包括 Kendall、Phik 和 Cramér 的 V 相关系数等。
什么是因果关系,即原因和结果?
两个变量之间的因果关系可以用因果关系来定义。如果一个行为或事件(原因)导致了一个现象(结果),那么这个行为或事件和这个现象(另一个行为或事件,观察,结果)就有因果关系。
理解两个变量是否具有因果关系(即两个变量之间的因果关系)对于机器学习模型的建立是至关重要的。然而,在对相关的两个变量之间的关系进行分类时,必须小心谨慎;相关性并不意味着因果关系。
如何确定因果关系?
现在,要确定两个变量是否有因果关系,需要满足一定的条件。
- 逻辑表明原因和事件应该是连续的事件,即一个接一个。这就形成了确定因果关系的第一个条件——时间顺序。例如,为了通过营销努力增加销售额,营销必须在 delta 增加销售额之前进行。
- 关联:两个变量要有因果关系,首先要有关联。如果两个变量之间没有关系,就不可能有因果关系。通常使用相关系数来识别关联性。
- 所有其他的因果解释都应该被排除。例如,变量 A 和 B 之间的关系可能是以下任何情况的结果:
- 事件 A 和事件 B 可能是事件 c 的结果。例如,空调销售量的增加不可能是冰淇淋销售量增加的原因,但两者都是夏季温度升高的结果。
- 事件 A 是事件 B 的必要条件,但不是事件 B 的原因。例如,燃烧需要氧气,但不是燃烧的原因。
- 事件 A 会导致事件 C,而事件 C 又会导致事件 D,最终导致事件 b。
确定因果关系的主要方法之一是进行实验(如假设检验、A/B 检验或对照组研究)并检验结果。在设计实验时,必须小心避免偏见,并检验上述标准的有效性。
然而,对于大多数数据科学家来说,这在大多数情况下也是不切实际的——在大多数情况下,数据已经被收集并提供给你了。在这种情况下,必须依赖前两个标准(时间排序和关联),而对于第三个标准,则依赖业务用户。执行分析,完成建模并测试问题的结果。如果是有效的和想要的,一切都准备好了,如果不是,就必须回到绘图板,重新评估因果关系。
你遇到过这样有趣的关系吗?请在下面的评论中告诉我——谢谢。
附言:
- 这里举的啤酒和尿布的例子是为了增加读者的兴趣。然而,啤酒和尿布似乎在零售行业的设置中没有任何关联。在这里阅读关于它的起源和争论的详细故事。
- 绘制散点图和计算皮尔逊系数的代码(图 1-6):
代码由萨加尔·加瓦利
直观解释相关性
皮尔逊相关的几何方法有助于深入理解它,并更准确地解释其结果。
[图片由作者提供]
不时会有人过来说“我终于找到了皮尔逊相关的替代品”。事实是——尽管有缺点——皮尔逊相关系数(又称 T0 系数)因其简单、稳健和可靠而难以替代。
但是,冷硬公式可能有点难以把握。因此,我试图找到皮尔森的 r 的视觉解读,我希望它能帮助你(就像它帮助我一样)深入理解它。
从公式开始
你可能已经见过这个公式成千上万次了:
皮尔逊相关系数公式。[图片由作者提供]
如果你对代码比对数学更熟悉,那么你会更喜欢这个 Python 片段:
import numpy as npx = np.array([1,2,3,4])
y = np.array([7,6,8,9])codev_xy = np.sum((x — np.mean(x)) * (y — np.mean(y)))
ssd_x = np.sum((x — np.mean(x)) ** 2)
ssd_y = np.sum((y — np.mean(y)) ** 2)corr_xy = codev_xy / np.sqrt(ssd_x * ssd_y)
但是公式 是什么意思 ?
该公式可以分解为三个具有一些著名名称的构造块:
皮尔逊相关的三个组成部分。[图片由作者提供]
最有趣的部分是分子:。其实分母只是一个归一化因子,绑定了-1 和 1 之间的相关系数(数学证明见此处)。实际上,在其他条件相同的情况下,相关性越大,相关系数越大。
这个配方可能看起来有点模糊,但是再看一眼,就很清楚它只由两种成分组成:
皮尔逊相关系数是由“距离”构成的。[图片由作者提供]
而且,因为我们只处理二维( x 和 y ),所以在一个图中表示它们很容易。
所以,让我们借助一些数据点,将相关性带入生活吧!
一些数据点。[图片由作者提供]
从几何学上来说,共生现象很容易被发现。它只是每个数据点和质心之间的所有“矩形”的面积之和(即以 x 的平均值作为其自身的 x 以及以 y 的平均值作为其自身的 y 的点)。
相互依存的图形解释。[图片由作者提供]
真正起作用的是每个矩形的“符号”!事实上,
- 右上和左下象限(图中绿色)中的矩形有正号,因此它们被添加到 codeviance 中。当 x 和 y 都高于(或都低于)平均值时,就会出现这种情况。换句话说,它们是一致的。
- 左上和右下象限(图像中的红色)中的矩形有负号,因此它们被从余度中减去。当 x 高于(低于)平均值,而 y 低于(高于)平均值时,就会出现这种情况
因此,当大多数数据点相对于 x 和 y 一致时,我们可以近似地说相关性(以及相关性)为正。反之,大部分点不和谐时为负。想想也很有道理:codeviance 试图表达 x 和 y 如何“一起改变”。
为了完整起见,我们也可以将分母的构件形象化:
离差平方和的几何解释。[图片由作者提供]
最后的结局是:
分子和分母的最终结果。[图片由作者提供]
在大多数值得注意的情况下,现在很容易弄清楚为什么相关系数是现在这个样子。例如,让我们看看其中的两个:
- 辛普森悖论;
- 对称关系。
1.辛普森悖论
辛普森悖论是数据科学面试中反复出现的话题。这让很多人感到困惑。但是希望,多亏了这种图形化的方法,你再也不会感到困惑了!
我们举个例子,灵感来自 ResearchGate 。
你有两个群体:男性和女性。你对两组都进行了一些医学治疗(而且,由于男性更高更重,他们接受了更高的剂量)。你计算剂量和恢复之间的相关性,它是强正的:0.68。很好,这意味着药物是有效的,对吗?
嗯,等一下。你看一下两组的曲线图,你会注意到下面的情况:
一些数据点说明了辛普森悖论。[图片由作者提供]
虽然在每组中剂量和恢复之间存在反比关系(这应该与负相关相关),但是您的皮尔逊r是强正的。这是为什么呢?
通过我们的几何解释,我们可以立即了解正在发生的事情:
辛普森悖论:计算偏差。[图片由作者提供]
实际上,与剂量平均值和恢复平均值相比,所有男性都在右上象限,而所有女性都在左下象限。因此,即使在每个单独的组中,这种关系是负的,但是这种相关性在很大程度上是正的。因此,正相关。
将所有东西放在一起:
辛普森悖论的几何解释。[图片由作者提供]
2.对称关系
当两个变量具有“对称”关系时,它们的相关性将(接近)为零。
为了理解为什么会发生这种情况,让我们取一条关于 y 对称的抛物线(但对于 x 也是一样)。
现在,很明显为什么分子是零。事实上,左侧的所有数据点都与右侧的数据点“抵消”(即,它们具有相反的符号)。
我们来直观的证明一下:
抛物线皮尔逊相关的几何解释。[图片由作者提供]
感谢您的阅读!我希望这篇文章对你有用。
如果你对我在剧情中使用的 Python 函数感兴趣,你可以在Github 项目中找到它。
我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以发短信给我我的 Linkedin 联系人。
同量异位标记蛋白质组学中的相关性
在基于同位素标记质谱的蛋白质组学中,基本统计量是如何表现的?
作者图片
皮尔逊相关系数用得很多。介绍完毕。我们利用它作为各种数据集中线性相关的量度,今天我想讨论一下这种无处不在的统计指标在蛋白质组学中的应用。我将重点介绍基于质谱(MS)的同量异位标记蛋白质组学,这是一种在生物学和临床研究中测量相对蛋白质丰度的流行技术。如果你想了解更多关于这项技术的信息,可以看看我之前的文章或者 Rauniyar 和 Yates 的开放访问 T2 评论。
假设和数据结构
同量异位标记蛋白质组学可以应用于不同种类的实验,但是典型的设计具有以下共同点:
- 研究中的样本彼此相似,它们属于相同的生物物种和相同的类型,例如,都是血浆样本。与此相关,我们预计在不同的条件下,大多数蛋白质的丰度保持相当稳定。
- 从每个样品中取出等量的蛋白质材料,例如,通过具有分光光度检测的生化蛋白质分析来测量。例如,均衡蛋白质含量通常是可行的,而精确估计活检组织的干重可能是困难的。
但是固定蛋白质总量意味着我们可以有效地利用相对量。这反过来意味着同量异位标记蛋白质组数据是 组成的 ,对组成数据应用相关性分析应该谨慎,正如在许多出版物中所讨论的,例如,在 Lovell 和合著者【2】的论文中,作者清楚地说明了解释组成基因表达数据相关性的危险。
此外,同量异位标记质谱数据由于其获取方式而具有内在的组成性,正如 O’Brien 等人【3】在 2018 年的一篇论文中所讨论的。简而言之,标记批次中所有样品的定量信号在相同的光谱中获得,并且信号的总丰度通常受到限制,这取决于环境和某些获取设置。这意味着一批中的肽信号强度不是相互独立的:
同时测量整个标记批次的同量异位报道分子强度,并且通常不是相互独立的。作者图片
然而,尽管数据具有多种成分的性质,但对于相关性分析来说,事情并不都是令人沮丧的。由于样本之间很大程度上彼此相似,我们预计只有参与有趣生物过程的某些蛋白质会(有希望)在样本之间发生急剧变化,而可能不是最丰富的蛋白质。任何特定蛋白质对总丰度的影响都可以忽略不计。然而,从鸟瞰图来看,每个样本中上升和下降的蛋白质应该相加。那么,同量异位素标记数据集的关联情况是怎样的呢?
为了说明真实数据的相关性,我将使用由十个大肠杆菌样本组成的研究。MS 数据可从 PRIDE archive 网站获得,我已经重新处理了文件,并将蛋白质丰度表和所有相关代码放入 GitHub 储存库。在加载、过滤和对数转换报道分子强度值后,我们得到列中有 10 个样品、行中有 1836 个蛋白质的表,其中 Uniprot 成员作为索引:
数据集包括 5 种不同的遗传/刺激条件,每种条件在 2 个生物重复中平行制备。重复对(1/2、3/4、5/6、7/8、9/10)中的样品非常相似,而条件之间存在显著差异。正如你在上面看到的,除了 P25665,对数转换的报告强度值在每一个显示的蛋白质行中都是稳定的,这符合我们对样品相似性的假设。这些值的分布并不完全像钟形曲线,但是它们是对称的、单峰的,并且具有非常接近的中间值:
作者图片
事实上,这些值非常集中,因为它们已经被总肽强度标准化。由于我们提取了等量的蛋白质,我们预计每个样品的总信号强度大致相等。如果不是后者,我们可以假设出现了问题,例如蛋白质浓度测量或样品制备过程中的异常,可以通过调整总丰度或中值丰度进行纠正。在这种情况下,在处理 LC-MS 文件的过程中,每个样品的总强度都被提取出来,然后进行均衡。蛋白质表中的列和确实非常相似:
dfLog.sum()S01 5407.358507
S02 5415.529107
S03 5421.951839
S04 5413.545848
S05 5420.977531
S06 5410.352606
S07 5424.180405
S08 5425.054158
S09 5399.895850
S10 5405.012957
dtype: float64
总和略有不同,可能是因为平衡发生在工作流程的中间,一些肽和蛋白质在最终报告前被过滤掉。是的,这种规范化强化了数据的组合性质!但我认为这是合理的,因为这是根据基于实际相等蛋白质含量的实验设计完成的。它不创造组合性,而仅仅反映实验性设计。
样本-样本相关性
让我们来看看样本间对数 10 转换的同量异位素报告子丰度的成对相关性。计算的一个原因是评估样本之间的相似程度。然而,查看散点图,我们注意到所有的相关性都非常好,无论是在生物重复之间还是在不同条件之间:
作者图片
皮尔逊相关系数都很高,在 1.0 左右:
很容易看出它们如此相似的原因:定量光谱中的总强度取决于绝对肽量和其他因素,并且对于批次中的所有样品,它同步变化。由于大多数蛋白质在样品间保持相对恒定,对于大多数数据行,所有样品的绝对信号强度将非常相似,产生高相关系数。
不过,我们不需要查看绝对信号强度。该分析针对的是相对蛋白质丰度,那么我们为什么不缩放数据呢?将每行中的值除以该行中的平均强度,并对缩放后的值进行对数变换后,我们得到了结构非常不同的数据集。大多数值现在集中在 0 附近,分布看起来比以前更像钟形:
作者图片
缩放后的数据集具有完全不同的相关性前景:
作者图片
作者图片
现在有了正相关和负相关,这是意料之中的,因为我们已经将每个蛋白质的值的总和限制为一个常数。我们有效地增加了另一个层次的组合性!但是我们能从这个多成分数据集中的相关性推断出有用的信息吗?我们有成对的 1/2、3/4 等生物学重复,它们之间的相关性确实很好,而生物学上不同的样品之间的相关系数的绝对值较低,符号为正或负。所以在某种程度上,这些相关性确实揭示了样本之间的相似关系。
缩放同量异位素数据的另一个实用方法是使用其中一个样本作为分母。例如,该样本是疾病研究中的健康对照,或者是可用于数据集之间可比性的参考样本。假设样品 S01 是我们数据集的分母:
作者图片
所有的相关性都变成了正号!我们还没有引入蛋白质值的限制,就像我们对蛋白质平均值进行缩放时一样,所以我们不希望正相关和负相关处于某种平衡状态。同时,我们仍然看到生物复制之间的相关性更高。
样本间的相关性可能不是比较重复的完美方法,因为相关性的前景是由分母的选择决定的。如果我们除以对照,与对照非常不同的样品可能表现出高相关系数,而对照样样品可能具有低的成对相关性,这仅仅是因为经对数变换的相对强度在 0 附近,并且受噪声的影响大于强相对变化。
蛋白质-蛋白质相关性
蛋白质丰度的成对相关性可用于构建在全球范围内表征蛋白质/基因之间关系的相关性网络。我们可以计算所有蛋白质之间的相关性,将行为相似的蛋白质分组,找到各组之间的关系等等,这非常酷[5]!这是我们的大肠杆菌数据集的蛋白质-蛋白质相关矩阵,根据对数强度计算得出:
作者图片
看起来很迷人!正负符号相关性或多或少处于平衡状态,鉴于数据集的组成性质,这是可以预料的:随着一些蛋白质的相对强度下降,其他蛋白质也下降。较低的绝对值是普遍的,如果我们取相关矩阵,提取上面的三角形而不取对角线,展平阵列并构造直方图,这就变得很清楚了:
作者图片
我们预计蛋白质-蛋白质相关性不会受到重新缩放的影响。事实上,如果我们采用均值标度表并计算相关系数,分布结果是相同的:
作者图片
我们的原始数据矩阵包含 5 个不同的条件,每个条件 2 个重复。虽然观察组内重复的再现性很重要,但我们可以对重复值进行平均,并获得每个条件下每个蛋白质的单个值,用于进一步的生物学解释。从图片中移除生物可变性使得关联图更加清晰:
作者图片
正如我们之前讨论的,根据实验设计,数据集已被归一化为每个样本中相等的总丰度。如果没有执行标准化会发生什么?让我们模拟蛋白质丰度的系统偏差,假设 S02 的浓度测量值错误,我们采集了多余的材料,而 S04 和 S08 的平均强度较低,假设过滤单元在样品制备过程中悄悄泄漏:
作者图片
不规则是明显的,但也没那么糟糕吧?相比之下,相关矩阵的变化是剧烈的:
作者图片
作者图片
蛋白质在全球范围内变得高度相关!回到假设,我们让大多数蛋白质保持在几乎恒定的水平,当我们引入高于背景噪声水平的偏移时,它对受影响样品中的强度的影响最大。我认为这加强了在 LC-MS 数据处理过程中标准化的重要性:如果我们研究相似的样品并计算相同的蛋白质含量,我们最好确保样品平均值/中位数在结果数据集中没有偏差,因为我们的假设表明分布应该集中。
结论
我们已经查看了同量异位标记基于 MS 的蛋白质组数据中的样本-样本和蛋白质-蛋白质相关性,蛋白质表和 Python 代码可在 GitHub 上获得。我们已经讨论了数据的组成性质,这意味着在解释相关性时应该谨慎。样品间的相关系数受我们测量蛋白质值的方式影响很大,无论样品的性质如何,未经测量的报道强度的相关系数都非常高。蛋白质-蛋白质相关系数受到总样品丰度标准化的强烈影响。
参考
[1] N .劳尼亚尔和 J. R .耶茨,三。鸟枪法蛋白质组学中基于同量异位标记的相对定量 (2014),蛋白质组学研究杂志,13,12,5293–5309。开放访问。
[2] D .洛弗尔等人。比例性:相对数据相关性的有效替代 (2015),PLOS 计算生物学 11(3): e1004075。开放访问。
[3] J.J .奥布莱恩等人。组成蛋白质组学:空间限制对利用同量异位标签进行蛋白质定量的影响 (2018),J. Proteome Res. 17,1,590–599。根据 CC-BY license 开放访问。
[4]j . jerlstrm Hultqvist等 一种噬菌体酶诱导细菌代谢扰动,赋予一种新的混杂功能 (2018),Nat Ecol Evol 2,1321–1330
[5]朗菲尔德和霍瓦特。 WGCNA:用于加权相关网络分析的 R 包 (2008),BMC 生物信息学 9,559。开放访问。
相关性与因果性
比较相关性和因果性
Benjamin Behre 在 Unsplash 上的照片
相关性也称为关联。它指的是两个不同实体或数据点之间的关系。当一个事物上升时,另一个事物下降,反之亦然,这意味着它们一起变化。
让我们以一家跨国公司为例,该公司正在研究其过去 10 年的销售数据,这些数据包含每年以美元计算的销售额和不同的特征,如通过电视、广播和报纸投放的广告金额。
为了理解这些数据,我们创建了散点图,并发现所有这些特征都与销售额呈线性正相关。如果我们增加在这些广告上的花费,销售额也会增加,反之亦然。
来源(作者)
正如你在这里看到的,我们无法明确说明是销售导致了广告的增加,还是广告导致了销售的增加,或者是否有第三个因素导致了销售和广告的增加。这是因果关系的问题,因为在这里我们不能决定什么导致什么。
为了理解什么是因果关系,让我们举个例子。但在此之前,我们应该知道,因果关系是指由于某种原因导致的事情,如德里因 covid 病例增加而实行封锁。在这种情况下,我们可以说增加的 covid 案例导致了锁定。
让我们举一个例子,我们正在研究德里由于不同原因造成的事故数量,在这个数据集中,我们发现大多数事故发生在司机打电话的时候。那么,这是否意味着如果你在德里打电话,你会遇到事故?
答案是否定的。因为事故背后的主要原因可能是粗心大意或打电话时没有注意交通状况。我们需要明白,相关性是一个量化两个不同事物之间关系强度的数字量。而因果关系可以被认为是一个结论,它表明某事物引起了某事物。
因此,在预测特征和目标变量之间的因果关系和相关性之间的差异时,理解这一点非常重要。我希望读完这篇文章后,你能清楚地理解因果关系和相互关系。
本文是与 Piyush Ingale 合作的。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。
余弦相似直觉及其 Python 实现
包括使用余弦相似性公式的实际计算
机器学习中经常会出现这种情况,你需要比较数据,分析它们有多相似。
例如,在自动文本摘要中,在训练期间,您需要识别原始文档中的哪些句子与参考摘要中的句子相似。评估摘要的质量也需要这样做。
或者你可能需要将一份文件分类,比如说,科学、育儿或技术。
一种用于计算两个文本之间相似度的技术叫做余弦相似度。
考虑下面的基本文本和其他三个文本。我想测量文本 1、文本 2 和文本 3 与基本文本的相似程度。
**Base text** Quantum computers encode information in 0s and 1s at the same time, until you "measure" it**Text1**
A qubit stores "0 and 1 at the same time" in the same way how a car travelling north-west travels north and west at the same time**Text2**
Considering how quickly the brain reorganizes, it’s suggested that dreams are a defence mechanism**Text3**
Computers will come with more processing power due to more advanced processors
你是怎么做到的?
文本变成了载体
这个案例很简单,可以帮助你清楚地想象它是如何工作的。
首先,你需要选择——在什么方面相似?!比如同样字数的两个文本相似吗?
这里有两个属性,或称为特征,我用来衡量相似性。
- 字数统计(无介词或冠词)
- 基础文本中的单词
图一。作为向量表示的文本。按作者。
这两个属性可以被认为是向量的元素,如图 1 所示。如您所见,X 轴和 Y 轴代表了这些特征。
这两个矢量之差形成一个角度。这个角度告诉你它们有多相似或不同。
0 度角=它们是一样的。
90 度角=它们彼此相反。
余弦相似性
虽然知道角度会告诉你文本有多相似,但最好是 0 到 1 之间的值。1 表示文本相同。
这就是余弦相似性出现的原因。这是计算它的公式。
图二。来源:https://en.wikipedia.org/wiki/Cosine_similarity
这里有一些数学让你玩得开心。
a 和 B 是两个文本的向量表示。分子 A . B 表示两个向量的点积。||A 或 B||表示矢量的大小。
让我们来计算其中一对——基础文本和文本 1。
Let A be the Base text vector = 11, 11
Let B be text1 vector = 4, 17**Dot product of A and B** = 11 * 4 + 11 * 17 (A first element times B first element + A second element times B second element)
= 44 + 187
= 231The magnitude is taken by squaring each element and adding them up, then taking the square root.||A|| = **√**11**² +** 11²
||B|| = **√**4**² +** 17²||A|| = 15.5563
||B|| = 17.4642||A||*||B|| = 15.5563 * 17.4642
= 271.6783Cos sim = 231 / 271.6783
**= 0.85 (85% similar!)**
Python 代码
代码很简单,特别是因为我使用了一个内置函数来计算余弦相似度。
Python 代码。来源: codebasics 。
结果如下:
结论
正如您在结果中看到的,文本 2 与基础文本不太相似。Text2 是关于梦的,和关于量子计算机的基础文字没有任何共同之处。
但是,你有没有注意到,有 70%的相似!?这不可能。
那是因为我选的功能不太对。单词特别重要。除非这是我真正想要的——字数相似的文本是相似的,主题无关紧要……这是对文本比较的一种奇怪的理解。
在以后的文章中,我将更多地探索现实世界中用于特性选择的技术。
感谢阅读。
延伸阅读:
https://medium.com/programming-for-beginners/the-other-approach-to-solve-linear-regression-90be71778b58 https://medium.com/programming-for-beginners/unsupervised-versus-supervised-machine-learning-1e55aeb3d2df
使用 Elastic Horovod 和 Amazon EC2 Spot 实例进行经济高效的分布式培训
理解大数据
根据员工系统的可用性动态调整您的培训课程
Horovod是一个流行的框架,用于在多个 GPU 工作人员和多个主机上运行分布式培训。在这篇文章中,我将解释如何使用 Elastic Horovod 来降低分布式培训环境中的成本,并演示在Amazon Elastic Compute Cloud(Amazon EC2)spot 实例上运行它所需的配置步骤。
本文包括四个部分。在第 1 部分中,我们首先描述如何使用 spot 实例来降低培训成本。在第 2 部分中,我们将讨论数据分布式训练,并介绍在多个 spot 实例上进行训练的挑战。在第 3 部分中,我们描述了 Elastic Horovod 解决这一挑战的方式,并阐述了解决方案的一些方面。在第 4 部分中,我们在 Amazon EC2 spot 实例上演示了一个弹性 Horovod 的例子。
我要讲的故事和我要分享的例子是基于 Gloo 0 . 21 . 2 版本的 Horovod、PyTorch 1.4 版本的 py torch 和 tensor flow 2.3 版本的。这些框架继续快速发展,一些 API 定义、使用流程和功能行为可能会发生变化。请务必重新评估我们将针对未来版本做出的任何假设和结论。
免责声明 1: 这篇文章的目的是引起人们对这个有趣而重要的新特性的注意。不一定推荐使用它。是否集成弹性 Horovod 应由多种考虑因素决定,其中一些我们将在下面讨论。
免责声明 2: 本帖绝不是为了取代弹性 Horovod 文档。我们将多次参考文档,详细阐述一些微妙之处,扩展其中一个示例,并演示一个端到端的示例。但是,对于您自己的任何实现,官方文档都应该是您的参考来源。
第 1 部分:使用 Spot 实例降低培训成本
现代 DNN 培训项目的主要挑战之一是管理培训成本。训练模型所需的硬件是昂贵的,考虑到我们经常需要运行多个训练实验,有时在多个设备上,不难看出成本会很快成为一个问题。
在云中进行培训时,降低成本的一个令人信服的方法是使用剩余云服务容量中的折扣计算引擎。在 AWS 中这些被称为 Amazon EC2 Spot 实例 ,在 Google Cloud 中它们被称为 可抢占 VM 实例 ,在微软 Azure 中它们被称为 低优先级 VM。这些产品的具体细节往往会有所不同,但共同点是它们都为未使用的计算引擎提供了显著的折扣。
代价是,与按需或保留实例相反,这些机器可能不可用(例如在高峰使用期间),即使成功获得,它们也可以在任何时候被抢占。因此,spot 实例可能不是时间关键型训练任务的好选择。但对于其他任务,它们可能会节省大量资金。
当然,需要考虑培训工作提前终止的可能性。没有人愿意花几个小时训练一个模型,只是为了在他们即将完成的时候让他们的训练机器被抢占。正如我在上一篇文章中描述的,我们可以通过在我们的训练应用中开发 容错 来防止这种情况。具体来说,通过定期存储模型检查点,我们可以确保终止的训练会话可以从最后存储的检查点恢复,而不是从头开始训练。存储检查点的频率应该通过权衡存储检查点的计算开销和在终止的情况下必须从最后存储的检查点重新运行训练的开销来确定。以高频率存储检查点将减少终止后恢复的开销,但是将增加存储模型权重的开销。以低频率存储检查点减少了捕获模型权重所花费的时间,但是在过早终止的情况下增加了更长时间重新训练的风险。
第 2 部分:通过数据分发加速训练
加速 DNN 开发的常用方法是执行数据分布式训练**。在数据分布式训练中,我们在多个工作器(GPU)上并行训练我们的模型。多个工作者可以在单个设备上(具有多个 GPU),或者在多个设备上。在每个训练步骤中,每个工人训练不同批次的样本,然后与所有其他工人分享其结果梯度。用 N 表示工人的数量,分布式培训的效果是,我们在每个培训步骤结束 N 批培训。如果配置正确,这可以将模型收敛所需的步骤数减少 n 倍。**
越来越多的趋势是在越来越多的(GPU)工作人员和越来越多的设备上分布模型(尤其是大型模型)的训练。自然,多台昂贵机器的使用放大了在低成本现场实例上培训的潜在节省。然而,在这种情况下,我们现在需要考虑多个训练设备中的任何一个上的现场中断的可能性。(一个有趣的问题是,使用超过 1/N 训练步数的 N 个设备是否会增加我们对现场中断的整体脆弱性。另一个有趣的问题是,一个实例的局部中断是否会增加其他实例的局部中断的可能性。虽然很难预测现场中断或计算其可能性,但您可以采用一些策略来减少对多个现场中断的脆弱性。有关该主题的更多信息,请参见此处的。)
在许多分布式训练框架中,包括 Horovod,在单个设备的现场终止的情况下,整个训练会话将失败。因为在 N 个工作线程的情况下,点中断的开销要高得多,所以增加捕获检查点的频率是有意义的(如上所述)。但是捕获每个检查点的开销也要高得多,因为现在有 N 个工作线程在捕获检查点期间暂停。
有人可能想知道,在多个训练设备的情况下,当只有一个设备被中断时,我们为什么需要终止整个训练会话。为什么训练不能简单地在剩余的设备上继续?这就是弹性 Horovod** 的用武之地。**
**https://horovod.readthedocs.io/en/stable/elastic_include.html
第 3 部分:弹性卵形线
在 Horovod 版本 0.20 中引入的 Elastic Horovod 支持动态增减工作人员的数量,而不会中断培训过程。特别是,如果您正在运行多个 spot 实例,并且其中一个实例被中断,您将无需(从最新的检查点)重新启动培训会话,从而节省大量时间(和成本)开销。当同一个 spot 实例恢复活动时(如果它被配置为“持久”),或者引入一个新的 spot 实例时,这也适用。在接下来的小节中,我们将讨论这个特性的一些方面。
有 Gloo 的 Horovod
弹性 Horovod 需要 Gloo 控制器来协调 Horovod 进程之间的工作。这与更常见的不支持弹性 Horovod 的 MPI 控制器相反。关于 Gloo 的更多细节,参见 Horovod 安装指南。
发现主机
为了支持动态伸缩,Elastic Horovod 需要一种发现主机设备的机制。这是通过用户定义的“主机发现脚本”提供的,该脚本被传递给 horovodrun 命令行。该脚本必须定义为输出可用主机的名称列表。更多详情见此处。下面是一个非常简单的主机发现 bash 脚本的示例,它遍历一个预定义的 IP 地址列表,并只打印从其中接收到成功 ping 响应的地址:
#!/bin/bash
hostArray=(
"10.0.1.20"
"10.0.1.21"
"10.0.1.22"
)
for host in ${hostArray[*]}; do
if ping -c 1 $host &> /dev/null
then
echo $host
fi
done
在实际场景中,主机发现脚本可能要复杂得多,并且将取决于您分配工作机的机制以及您如何为它们分配 IP 地址或主机名。
PyTorch 示例
下面是一个如何使用 PyTorch 和 Elastic Horovod 创建一个简单的训练脚本的例子。该脚本基于这里提出的模板,添加了缺失的功能。我们突出显示了与弹性 Horovod 相关的代码部分。
import torch
import horovod.torch as hvd
import torchvision.models as models
import torch.nn as nn
import torch.optim as optimhvd.init()
torch.cuda.set_device(hvd.local_rank())
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
lr = 0.001
model = models.resnet50(pretrained=True)
model.to(device)
loss_optim = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr * hvd.size())
optimizer = hvd.DistributedOptimizer(optimizer)def get_random_batch():
batch_size = 2
data_in = torch.rand(batch_size, 3, 64, 64).to(device)
target = torch.zeros(batch_size).long().to(device)
return data_in, target# training loop must be wrapped by [@hvd](http://twitter.com/hvd).elastic.run
[**@hvd**](http://twitter.com/hvd)**.elastic.run** def train(**state**):
for **state.epoch** in range(state.epoch, 100):
print("Epoch", state.epoch)
for **state.batch** in range(state.batch, 100):
data, target = get_random_batch()
optimizer.zero_grad()
output = model(data)
loss = loss_optim(output, target)
loss.backward()
optimizer.step()
# commit the state at the end of each epoch
# see documentation for how to choose frequency of 'commit'
**state.commit()**
**state.batch = 0****def on_state_reset():
# adjust learning rate on reset
for param_group in optimizer.param_groups:
param_group['lr'] = lr * hvd.size()**# state object tracks and synchronizes state among the workers **state = hvd.elastic.TorchState(model, optimizer, batch=0, epoch=0)
state.register_reset_callbacks([on_state_reset])** train(state)
下面是如何使用 disover_host.sh bash 脚本运行 Elastic Horovod 的示例,每个主机设备包含 4 个 GPU(插槽),以及上面的 Python 脚本(我们将其命名为 train.py):
horovodrun -np **8** \
--min-np **4** \
--max-np **12** \
--host-discovery-script **discover_hosts.sh** \
--slots **4** \
python **train.py**
在本例中,一旦有 8 名工人可用,培训就会开始,只要有 4 名工人可用,培训就会继续,并且在任何给定时间,培训的工人都不会超过 12 名。
弹性态物体
培训工人之间的同步由弹性状态对象管理。该对象封装了需要在工作线程之间同步的所有变量,包括模型权重、优化器变量、epoch 和批号。
状态对象包括用于备份训练状态的提交功能。这是一个自动防故障装置,旨在防止由于某个工作线程意外崩溃而导致状态损坏的可能性。类似于上面讨论的关于选择检查点捕获频率的难题,决定提交训练状态对象的频率是在减少失败情况下从最后一次备份重新训练的开销和提交动作的开销之间的权衡。我们的目标应该是配置我们的环境,使意外崩溃的可能性极小,并将提交减少到最低限度。例如,我们可以依靠 AWS 现场中断通知来确保发现脚本以优雅的方式处理现场中断,并避免意外的连接故障。
关于弹性 Horovod Keras API 的重要提示:使用 TensorFlow Keras 训练时,弹性状态承诺通过hvd . Elastic . commitstatecallback回调进行管理。注意这个回调的默认行为(如 elastic keras 示例所示)是在每批之后提交。这将大大降低你的训练速度。为了避免这种情况,在回调构造函数中指定一个 batches_per_commit 值。
重置回调函数
重置回调函数负责根据培训人员的添加或删除对模型配置进行更改。需要特别注意训练可能依赖于全局批处理大小的超参数,尤其是优化器参数。许多流行的优化器(如 Adam )的性能取决于全局批处理大小的值。如果在训练期间全局批处理大小发生变化,而没有对优化器设置进行适当的调整,则训练收敛可能会受到负面影响。 Elastic Horovod 文档建议根据活动工作者的数量来调整学习率(如上面的 PyTorch 示例),或者使用对工作者数量变化不太敏感的优化器(如 Adasum)。另一个选项是修改每个工作线程的本地批处理大小,以便不改变全局批处理大小(假设 GPU 内存允许这样做,并且不会导致 GPU 资源利用不足)。但是不能保证这些技术就足够了。在调整弹性训练之前,您应该验证您的训练算法能够处理工人数量的变化,而不会损害收敛。
数据划分
执行多员工数据分布式培训时,需要做出的一个决定是如何在不同员工之间分配培训数据。在弹性训练场景中,这个决定有些复杂。如果您选择对数据进行分割,使每个工作人员在独立的数据子集上进行训练,那么您可能希望在每次工作人员数量发生变化时对数据进行重新分区,以确保每个数据样本都受到相同的关注。
通过定义每个工作者在整个数据集的随机洗牌上进行训练,可以避免随着拓扑的每次变化而更新数据集的需要。虽然这种策略中的数据采样结果可能与分片的情况有很大不同(例如,在训练过程中给定样本的外观不一定像分片的情况那样均匀分布),但在许多情况下,它不会影响训练的收敛能力,尽管您可能希望在自己的模型上验证这一点。
主机排除策略
弹性 Horovod 包括一项相对严格的政策,将变得不响应的员工排除在外。(在撰写本文时,Horovod 源代码将此功能称为“黑名单”。)这可能会对训练环境造成限制,在训练环境中,主机可能会被中断,但稍后会以相同的 IP 地址或主机名恢复。在撰写本文时,有一个开放拉取请求旨在放松这一政策,这将有望进入即将到来的版本。在任何情况下,您都可能需要通过覆盖默认行为来自定义排除策略。
调度员的脆弱性
弹性 Horovod 将使您能够从任何主机系统的故障中恢复,除了使用 horovodrun 命令运行培训会话的主机。如果这台主机出现故障,整个培训课程将会终止。
为了增加系统的容错能力,你可以在一个不可抢占的设备上运行 horovodrun 命令,比如一个按需 AWS EC2 实例。为了降低成本,您可以将该设备指定为专用调度程序,而不需要其自身的任何 GPU 工作程序。然而,这种方法有一个潜在的问题。当前 Horovod 代码中内置了一个假设,即所有设备的网络接口名称都是相同的。虽然在相同的 GPU 工作设备上确实经常是这种情况,但在非 GPU 设备上可能不是这样。我们将在下一节中看到这样的例子,我们将在 EC2 实例上演示弹性 Horovod。
有一个开放的特性请求来解决这个问题,所以希望这个问题会在未来的版本中得到解决。与此同时,您可以尝试重命名网络接口,或者尝试以下简单的解决方法(hack):打开 launch_gloo_elastic 函数中的*horovod/runner/gloo _ run . py .*创建一个 dispatcher_nics 列表以及现有的 nics 列表,并将此列表传递给后续的 network.get_driver_ip 调用,而不是如中所示的 nics
nics = get_common_interfaces(driver)
**dispatcher_nics=['ens5']**
server_ip = network.get_driver_ip(**dispatcher_nics**)
另一个要考虑的选项是将 GPU 设备的子集配置为按需实例。虽然这种解决方案可能成本更高,但它具有额外的优势,即使在零现场实例可用性的情况下也能确保持续培训。
弹性射线
Ray 是一个构建分布式应用的流行框架,支持启动云集群和自动集群扩展。Elastic Horovod 包括与 Ray 的集成,可以用来简化环境设置。参见文档了解如何轻松扩展您的脚本以使用 Ray 功能。
第 4 部分:Amazon EC2 Spot 实例上的弹性 Horovod
在本节中,我们将在 Amazon EC2 集群上演示一个端到端的弹性 Horovod 示例。特别感谢我的同事 Max Rabin 对这一部分的帮助。
有许多不同的方式来配置和启动云集群,包括高级 API(比如 Ray )。我们选择使用 boto3 Python API 来演示实例创建,但是该示例可以很容易地适用于其他方法。
步骤 1:创建 EC2 Spot 实例
我们从启动三个 p2.xlarge spot 实例主机设备和一个 c5.xlarge 按需实例开始,它将充当我们的调度程序。我们选择了单个 GPU 设备(即插槽=1),但在现实世界中,与主机数量更多、每个主机的插槽数量更少的情况相比,主机数量更少、每个主机的插槽数量更多(例如 p2.8xlarge)的情况下,您通常会获得更好的性能。
在下面的代码块中,您可以找到如何创建三个 GPU spot 实例的示例。要创建 dispatcher 实例,只需将 count 设置减少到 1,将实例类型更改为 c5.xlarge,,并删除 InstanceMarketOptions 设置。记下创建调用返回的实例 id,因为这些 id 可用于从命令行管理实例。
import boto3
ec2 = boto3.resource('ec2', region_name="us-east-1")
instances = ec2.create_instances(
MaxCount=3, MinCount=3,
ImageId='ami-072519eedc1730252',#replace with ML AMI of choice
InstanceType='p2.xlarge',
SubnetId='<subnet id>', # <-- fill this in
IamInstanceProfile={'Arn':'<InstanceProfile>'}, <-- fill this in
SecurityGroupIds=['<SecurityGroupIds>'], <-- fill this in
InstanceMarketOptions={
'MarketType': 'spot',
'SpotOptions': {
"SpotInstanceType": "persistent",
"InstanceInterruptionBehavior": "stop"
}
}
)
print(instances)
对于我们的图片 ID,我们选择了最新的 Ubuntu 18.04 AWS 机器学习图片。下面是提取最新图像的命令行代码片段。
aws ec2 describe-images --owners amazon \
--query 'Images[?Name!=`null`]|[?starts_with(Name,`Deep Learning AMI (Ubuntu 18.04)`) == `true`].[ImageId,Name,CreationDate]' \
--output text | sort -k2 | tail
第二步:SSH 设置
Horovod 依赖于调度员和所有工人之间的无密码 SSH 通信。要设置这个,使用一个记载的机制连接到 EC2 实例。在 dispatcher 上创建无密码的 SSH 密钥,并将公钥复制到每台主机设备上。有关详细信息,请参考下面的链接。
https://linuxize.com/post/how-to-setup-passwordless-ssh-login/
在真实的场景中,这一步应该是自动化的。
第三步:作为 Ubuntu 用户,激活虚拟环境并安装 Horovod
需要在所有实例上执行此步骤。
source activate pytorch_p36
pip install --upgrade pip
HOROVOD_WITH_GLOO=1 pip install --no-cache-dir horovod
在 dispatcher 上运行 ifconfig 以查看网络接口的名称,并按照上一节所述更新horovodrun/runner/gloo _ run . py文件。
步骤 4:配置 discover_hosts.sh 脚本
将我们在上面创建的 discover_hosts.sh 复制到 dispatcher 实例上,并用三个主机实例的 IP 修改 hostArray。
确保该脚本是可执行的,并且其目录在$PATH 环境变量中。
步骤 5:使用 horovodrun 进行 PyTorch 训练
将上面的 PyTorch 脚本复制到每个主机设备,并运行以下测试:
测试 1 —主机添加 : 停止三台主机中的一台。这可以通过 Amazon EC2 仪表板或使用 AWS CLI 来完成:
aws ec2 stop-instances --instance-ids i-<id1>
在有两个活动主机的调度程序上运行horovudrun:
horovodrun -np **2** --min-np **1** --max-np **3** --host-discovery-script **discover_hosts.sh** --slots **1** python **train.py**
在培训运行时,启动第三个 EC2 实例(从仪表板或 CLI),验证培训会话是否识别了添加内容,并将第三个实例添加为培训主机。
aws ec2 start-instances --instance-ids i-<id1>
**测试 2 —主机移除:**由于我们无法确定现场终止的时间,我们将通过简单地停止其中一台主机来模拟。像以前一样,开始对所有三台主机进行训练,经过几个训练步骤后,停止其中一台主机。验证是否已识别出移除操作,以及培训会话是否能够仅使用剩余的两台主机继续进行。
请注意,我们刚刚执行的主机移除会被视为不合适的,并且会导致故障主机被添加到排除列表中。(如果您使用相同的 IP 重新启动同一台机器,它将不会被重新添加到相同的培训课程中。)在真实的场景中,应该增强主机发现机制,以确保优雅地处理现场中断*。*
***测试 3——将运行时间与非弹性 Horovod 进行比较:*您可能有理由希望验证增加的功能不会带来任何额外成本。为此,将运行时与非弹性运行进行比较:
*horovodrun --gloo \
-np 3 \
-H server1:1,server2:1,server3:1 \
python train.py*
***测试 4 —测量提交频率的影响:*使用弹性状态提交的频率来测量对训练运行时的影响。
第六步:清理
不要忘记在工作结束时删除所有 EC2 实例。
这可以通过 EC2 仪表板或使用 AWS CLI 来完成:
*aws ec2 terminate-instances --instance-ids i-<id1> i-<id2> ...*
摘要
Elastic Horovod 是 Horovod 的一个引人注目的新特性,它支持在可抢占实例集群上进行训练,而没有在设备中断时必须从检查点重新开始训练的潜在开销。这种解决方案可以在对培训进度影响最小的情况下,显著降低培训成本。然而,Elastic Horovod 可能不是每个团队和每个项目的最佳解决方案。时间关键型任务通常最好在完全可靠的按需实例上运行,即使对于非关键型培训任务,您也应该验证收敛性不受动态变化的工作人员数量的影响。祝你好运!**
人工智能会有情感吗?
人工智能概论系列的第 4 部分
情绪、感觉和 AGI。资料来源:Tengyart via Unsplash 。
随着意识程度的每一次增加,绝望的强度也成比例地增加:意识越多,绝望越强烈。
-索伦·克尔凯郭尔
欢迎来到探索人工智能系列的第 4 部分(AGI)!如果你错过了前三部,在这里看看,从第一部开始。本周我们将着眼于一个情绪和感觉的模型,并试图解开和分离一些非常复杂和误用的术语。
具体来说,本周我们来看看并解决这些问题:
- 什么是情绪和感情?
- 在 AGI 语境中,动机、驱力、情感和感觉之间有什么区别?
- AGI 人能像我们一样体验事物或感受事物吗?
下周我们将关注意识本身:我们认为它是什么,它与情绪和感觉有什么关系,以及人工智能和 AGI 将如何迫使人类进行一些严肃的反思,到底对人类意味着什么…
在这个系列中,每周/每隔一周会有一个新的帖子出现(我希望如此),如果有问题、评论或澄清,可以随时给(mferg@mit.edu 发电子邮件。尽情享受吧!
免责声明:毫无疑问,有些人更有资格对我将涉及的问题和主题进行深入的讨论,从情感到神经形态计算。对于这些人来说,这个系列只是对这些主题的介绍,因此,如果为了简洁而省略或浓缩了一些内容,请见谅。我真的只是想要这个系列,以及激发它的课程,作为一个相关 AGI 主题的调查,这些主题通常在学习人工智能或人工智能时不会被教授。还要注意:这个系列与麻省理工学院或其品牌没有任何关系——我只是喜欢写一些我感兴趣的东西,麻省理工学院并不正式认可这里陈述的观点。
第一部分:什么是情绪和感受?
它们是一样的吗?不一样?有点相同又有点不同?
“我们的每一次呼吸,我们的每一步,都充满了和平、快乐和宁静。”
―一行禅师
正如与本系列中的大部分概念一样,情绪和感受的定义也有很多,很多时候是可以互换使用的,甚至在研究论文中也是如此。理解所指的到底是什么经常令人困惑,因为在用词上也没有固定的一致。我在阅读论文时经常遇到这种困惑,即使这样,仍然很难确切知道作者在想什么。然而,这并没有阻止我们,所以现在也不会。让我们试着解开一些术语。
来自麻省理工学院认知科学百科全书[1],一种 情感 是:
在目标管理中起作用的心理状态或过程。
就这样?这听起来与本课程第 1 部分中人工智能研究人员如何看待智能本身的定义惊人地相似,我们将很快重新审视这种联系。本质上,情绪的核心是准备好以某种方式行动;这是一种紧迫感,或者说是一种将一些目标和计划优先于其他目标和计划的方式。情感和意识的主要研究者安东尼奥·达马西奥说:
情绪是复杂的,很大程度上是由进化炮制的自动化行动程序。这些行动是由一个认知程序来补充的,这个认知程序包含了某些想法和认知模式……[2]
让我们再深入一点。查尔斯·达尔文对情绪的用途有一些想法,并认为情绪表达是退化器官如阑尾的行为等价物[1]。因此,根据达尔文的解释,情感是我们过去进化的残余,现在已经没有任何用处了。然而,现代心理学之父威廉·詹姆斯认为情绪是身体对事件的生理反应的感知(根据现代研究,我们会看到他倒过来理解,但非常接近)。
心理学家西尔万·汤姆金斯认为,情绪实际上是有目的的,它们是特定动机系统的放大器。情感也可以被视为人类在无限的问题空间中做出决定的一种方式。这不是一个无关紧要的问题,这应该会引起任何人工智能研究人员的兴趣——情绪作为一种选择的方式,或者更好的是*,最显著的刺激;它们是区分优先次序的一种方式。他们根据目标来促进某些选择;生活中完全理性的选择很少。[1]更一般地说, 情绪引导行为 。这也被称为体细胞标记假说(稍后会有更多内容),由达马西奥提出。*
假设你是几千年前非洲大草原上的原始人。你有多种刺激争夺你的注意力,从你原眉上烦人的虱子到河对岸有吸引力的伴侣,再到近在咫尺的装满蜂蜜的蜂巢。你关注哪个?在这种情况下,以上都不是,因为相反你很快看到一只老虎向你扑来,而恐惧成为你情绪中最突出的部分(不是欲望、饥饿或原眉平衡)——它帮助你的大脑优先考虑最重要的生存方面。如果你死了,你就不能吃蜂蜜或交配,所以情绪是一种管理你所关注的,甚至是记忆的方式。
情绪是一种筛选生存所需刺激的方式。来源:Ian Keefe Via Unsplash
*所以,在很大程度上,情绪为了这个系列可以被认为是对刺激的**自动反应。*它们是伴随着想法和特定思维模式的行动。把情绪想象成大脑和身体对某些刺激的反应,比如皮质醇增加,杏仁核处理增加等。像恐惧这样的情绪。[2]我们拥有它们的最大原因之一是作为决策的启发。[1]例如,当你不得不在一大群观众面前演讲时(如果你不喜欢公开演讲),你的情绪反应会是皮质醇增多、出汗、肾上腺素增加、视野狭窄、血压和心率加快等。因此,基于[1]和[2],如果你听到情绪这个词,那么思考对刺激的生理反应。
感情呢?它们是什么?根据达马西奥[2]:
“感觉主要是对我们的身体在情绪激动时所做的事情的感知,以及对我们在那段时间的精神状态的感知。”
因此,感觉可以被认为是身体的头脑/大脑在表达情感时的感知。害怕公开演讲 感觉 像什么?它可能因人而异,但在大多数情况下,大的,高层次的感觉是相同的。他还指出,在没有思维过程的生命中,情感可以存在并且很好,但是情感感觉可能不存在。他还指出,对人类来说,感情[2]:
…发布“认知资源的状态和某些心理脚本的部署”
这基本上意味着当你“有情绪”时,你会以不同的眼光看待这个世界,期待不同的事情。如果我开了几个小时的车,感到烦躁/疲劳,与我无处可去/无事可做相比,我对交通堵塞的体验是完全不同的。我们对他人的看法,我们喜欢什么,容忍什么,不喜欢什么,讨厌什么等等。所有的变化都基于我们的心情——也就是我们的感觉*。*
因此,在很大程度上,感觉可以被认为是一系列随着时间推移而展开的情绪感知,其中它们改变了人的精神状态并导致 体验一种情绪 像悲伤,像我们体验悲伤时的感觉(疲劳、分散等)。).把这看作是一种“更多精神”的成分,而不是“更多物质”的情感。情绪是生理反应,而感觉是你对它们的感知,它们让你有怎样的感觉。**
这里有一个例子,我希望它能使这种区别更加清楚。让我们看看每个人都希望经历的事情:爱。爱是一种情绪还是感觉?在这种情况下,我要说它是一种感觉,因为你知道体验爱的物理成分是什么样的:唤起(血流、眼睛眯着、体温升高)、舒适(皮质醇减少、血清素增加)、平静(血清素增加、催产素)、结合(催产素)等…所以在这种情况下,体验情绪的感觉就是感觉本身。
爱:一种感觉还是一种情感?来源:维多利亚罗马 via Unsplash 。
还记得那句话“ ”是什么感觉……”。我们回头再来看,我们会看到在过去的几个世纪里,这句话引发了多少场辩论。好了,根据达马西奥的观点,我们有了一个区分感觉和情绪的起点,以及它们各自是什么。请注意,显然还有其他关于情绪的理论,只是在细节上有所不同,但它们的目的和区别的高层次结论大体上是相同的。查看丽莎·费尔德曼-巴雷特和约瑟夫·勒杜的作品,深入了解更多。
第二部分:合成情绪和合成感觉
在人工智能/AGI 中实现情感/感觉
“我可以给你四万个理由来证明那个太阳不是真实的。我知道它是因为发射器的瑞利效应与其建议的大小不成比例。我知道它是因为它的恒星周期比真正的恒星更对称。尽管如此,我永远也不会知道它看起来是不是真的……感觉是不是真的。”
Cortana,光晕 4
现在,我们有了一个情感和感觉的坚实的起始模型,你如何在一个合成智能系统中编程/实现它们(无论是人工智能还是 AGI)。首先,情感在机器中会是什么样子?嗯,我们可以看看一些系统,他们已经实现了决策启发式,我们会的,但首先,一些更多的信息。
回到 1967 年,认知心理学家/人工智能先驱希尔伯特·西蒙(他将在 8 年后获得图灵奖,以及 1978 年的诺贝尔经济学奖,谈谈他的简历吧!)认为,因为资源是有限的,所以在任何复杂环境中运行的任何计算系统都需要一些能够中断正在进行的过程的系统来管理规划[2]。再一次,考虑到我们刚刚讨论的内容,这肯定会敲响警钟。对于你们这些铁杆计算机科学家来说,这或许可以被认为类似于操作系统中的内核,因为它负责管理文件和进程、访问、异常、虚拟内存和分页等…
人工情感会是什么样子?嗯,你必须有一些管理过程、资源和目标的方法,以及对它们进行优先排序的方法。这些已经在像 LIDA 这样的认知架构中实现了(我们将在几周后再次讨论),但是在没有身体的头脑中更难实现。许多认知架构都有一个模块专门用于目标优先化、,许多架构还有一个模块专门用于“躯体”记忆的形成、提取和重建。然而,很难说这些是否应该被认为是真实的情绪,因为,从技术上来说不是身体反应(因为没有身体——令人毛骨悚然,对吧?),然而(但是如果该架构是在一个实体介质上实现的,则可能有一个)。最后,在需要学习和发展的情况下,人工情感将被证明是最有价值的动机工具。
LIDA 的赛拉托尔·斯坦·福兰克林展示了它[3]:
“对 LIDA 体系结构的这个案例研究似乎表明,人工感觉和情感可以预期在软件代理或机器人中最有用,其中在线学习对象、类别、关系、事件、事实和/或技能是最重要的。如果这个要求存在,那么通过人为的感觉和情绪来实现主要动机也是有意义的。”
人造的“情绪”已经存在于一些软件中。来源:Arseny Togulev viaUnsplash
他说的“主要动机”是什么意思?这里有一个很好的分类:
- ****动机可以被认为是促使一个代理做事情的原动力,比如口渴、饥饿、疲劳和他们的主要行动。
- ****驱力是主要的动机,通常被认为是“最终目标”,比如“繁衍后代”,或者“活下去”。
- ****值是长期动机,通常被实现为损失函数,并且独立于环境或内部状态。
- ****情绪,也是感觉,可以认为是对价值成就/忽视/否定的一种反应。
这有很多术语(听起来都一样),但这里最重要的一点是,合成智能可能会优先考虑/追求不同层次的概念,情绪和感觉在其中扮演(或可能扮演)关键角色。我们绝对会探讨一致性问题(如何让一个合成智能做你想让它做的事情)和目标问题,但这并不像说“AGI 只会做它想做的事情”或“AGI 只会做我们告诉它的事情”那样明确…
第三部分:AGI 人能经历事情吗?
这种“感觉”是什么意思?
“创造一个讨厌你的东西,是不是很奇怪?”
―艾娃,不包括玛奇纳
感情和主观体验的问题,曾经是计算机科学、认知科学和哲学的眼中钉,现在它也将成为你的眼中钉!不客气
我想重温一下之前的那个“是什么样子的”短语。这在哲学上有个名字:感受性。来自麻省理工学院[2]:
“感受性最常用于描述精神状态的定性的、经验的或感觉的特性.”
简而言之,感受性是离散的“感觉”时刻。感受性的一些例子包括:
- 放下车窗快速驾驶汽车的感觉
- 你的狗舔你的胳膊
- 晚上把小腿撞在咖啡桌上
- 对日落的感知
- 甜甜圈的味道
- 书店的味道
- 在棒球场的泥土上玩耍
- 上课无聊透顶
啊,甜甜圈。生命中最伟大的礼物之一。来源:杆长 via Unsplash 。
基本上,有无限多的感受性,可能我的感受性和你的略有不同——我喜欢芫荽叶和咖啡冰淇淋(不是一起),但你可能不像我一样喜欢它们,或者可能讨厌它。因此,我们的感受性可以相似,但极有可能不同。
然而,你可以否认感受性的存在,许多哲学家也是这样做的,因为它们只不过是复杂神经网络的神经化学反应。如果你接受感受性的存在,那么你就是在说 知道一切 知道精神状态(知道所有关于神经元和它如何产生主观性)和 体验 某事之间是有区别的。强调这一点的经典论点/例子是玛丽的房间思想实验(我们下周会看,但如果你感兴趣,这里有概述)。如果你拒绝感受性的存在,那么你就是在说[2]:
"除了可以通过功能或偶然的特征来解释的内容之外,我们的定性概念没有确定的、连贯的内容。
丹尼尔·丹尼特(1991 年)
这到底是什么意思?他的意思是,如果你知道所有关于大脑的事情,那么你就会知道经历某事是什么感觉,因为你知道大脑是如何引起它的。也就是说,在大脑过程之外没有什么额外的东西——感受性不是大脑的一些深奥或神秘的额外组成部分——相反,它们只是大脑的产物。下周我们将更深入地探究感受性,因为它与意识密切相关。
为什么或艾人关心感受性?qualia 是否存在可能意味着简单地关掉超级笔记本电脑和真正的谋杀之间的区别——消除一个能够忍受痛苦和经历的心灵。
没有人会在意你是否摧毁了一些没有意识的东西,比如石头,但是社会倾向于看不起那些摧毁有意识意识的人。这就引出了这个系列最重要的一个概念:主观体验以及一台机器是否能拥有它们。我们将在下周讨论这个问题,从下周开始,当我们讨论意识的时候。
更一般地说,这就是人们通常提到“有意识的机器”或“有感觉的机器”时的意思——一个拥有感受性并且能够感觉到的 AGI。于是,抛回之前的话题,感情=情绪+感受性。这是一个简单的等式,但在很大程度上是成立的:)
TL;速度三角形定位法(dead reckoning)
情绪和感受是不一样的。情绪可以被认为是对刺激的生理反应,而感觉是你对这些情绪的感知。情绪可以被认为是一种启发,用来判断一个头脑应该做什么,有一些系统已经实现了这种“情绪启发”来帮助解决问题。最后,感受性和感觉密切相关,因为感受性通常被定义为“它是什么样的”下周,当我们试图解决意识问题时,会有更多的内容。
二元划分。来源:约书亚·富勒通过 Unsplash 。
“造物主,我从我的泥土里请求过你吗
塑造我的人,我恳求你吗
从黑暗中提拔我?"
——玛丽·雪莱,《弗兰肯斯坦》,引用弥尔顿的《失乐园》
其他需要考虑的问题:
- 你认为我们应该试着把感情编程成一个 AGI 吗?****
- 你认为 AGI 人必须有感情才能生存吗?
- 你觉得一个有感情的 AGI会想要什么?**
关于作者
Mike Ferguson 是麻省理工学院 DiCarlo 实验室的计算研究开发人员。他将致力于大脑评分,这是一种测量人工神经网络有多像大脑的工具。他将于 2021 年春天从弗吉尼亚大学毕业,获得计算机科学和应用数学学士学位,以及认知科学和哲学学士学位。他是《一周挑战》一书的参与者,在两年内阅读了超过 138 本关于人工智能、哲学以及对人类意味着什么的书籍。他和他的伯恩山犬“博伊·温斯顿”以及收养的边境牧羊犬“影子”住在弗吉尼亚州的夏洛茨维尔。
参考资料:
- 罗伯特·威尔逊和弗兰克·凯尔。麻省理工学院认知科学百科全书。麻省理工学院出版社,1999 年。
- 安东尼奥·达马西奥。自我浮现在脑海中:构建有意识的大脑。万神殿图书公司,2010 年。
- 富兰克林,斯坦和乌玛·拉马姆西。"动机、价值观和情感:一枚硬币的三面."第六届表观遗传机器人国际研讨会会议录,法国巴黎,2006 年 9 月,隆德大学认知研究。№128.2006.
Kubernetes 豆荚会被废弃吗?
Pods、服务或部署等资源会被弃用并从 Kubernetes 中删除吗?这将如何发生?
在任何软件项目中,随着时间的推移,会添加新的特性和 API,有时它们中的一些也会被弃用并最终被删除。即使是像 Kubernetes 这样的大型项目也不例外,但是当考虑弃用和最终移除时,并没有真正想到其 API 的核心部分。因此,问题是 Kubernetes 中的核心对象或 API,如 Pod、部署或服务,是否可以删除?如果可以,如何删除?
长话短说
如果这个问题的答案是*“否”*,那么这篇文章就没有存在的理由了,长话短说— “是”—GA 中的任何核心 API 对象,例如来自v1
API 组的某些东西都绝对会被弃用。
这个简单的一般答案并没有告诉我们太多。当谈到弃用时,Kubernetes 区分了几种类型的对象,例如 REST APIs、CLI 或特性门。它们中的每一个都有自己的一组不同成熟度的对象,如 alpha、beta 或 GA。所有这些都决定了某个对象——甚至像 Pod 这样的东西——在多长时间内以及在什么条件下会被弃用。所以,让我们更仔细地看看每一个,以及一些过去的例子和一些假设的未来可能发生的例子。
说来话长
不同的规则适用于不同的对象/功能,因此在我们讨论弃用规则和时间表之前,让我们先看一下所有不同的对象组:
- REST 对象——我们最感兴趣的部分——REST 对象或 REST APIs 涵盖了我们最经常交互的所有东西,即——顶层对象,如 Pods 或 Deployment,它们的模式字段,如
containers
、volumes
或env
,以及用于imagePullPolicy
的常量,如Always
、IfNotPresent
和Never
。 - 标志或 CLI—第二个最相关的组涵盖所有 CLI。这里最明显的是
kubectl
,但它也包括像kubelet
、kube-apiserver
或kube-scheduler
以及它们所有的子命令和标志。 - 特性/行为 —并不是所有的东西都可以用 API 准确标记或者成为 CLI 的一部分。还有整个系统的行为以及不同成熟度的实验特征。这些也需要(并且有)自己的弃用流程和时间表。
- 指标 —最后,Kubernetes 还公开了许多关于各种服务的
/metrics
端点的指标。考虑到它们中的许多被用于例如监控,它们也不能随时被改变或删除,所以它们有自己的一套规则。
剩余对象
对于 REST APIs 或对象,一般规则是在宣布弃用后,API 版本必须至少支持:
- GA: 12 个月或 3 个版本(以较长者为准)
- 测试版:9 个月或 3 个版本(以较长者为准)
- Alpha: 0 版本
这听起来很简单,但是还有许多其他的(不太容易理解的)规则适用于这里,所以让我们直接看一个例子,这样应该就清楚了。让我们假设一个名为 Task 的 API 对象(有趣的事实——这实际上是 Pods 的原名——参见 Kubernetes 的 first commit)。这个任务在 API 版本v1
中是 GA,并且决定它应该被弃用,那么真正会发生什么呢?
从上表中可以看出,如果在 API 版本v2alpha1
中任务对象被弃用,那么它还需要 9 个版本才能从 Kubernetes 中真正消失。让我也提醒你,以目前每年 3 个版本的发布节奏,整个弃用过程将需要 3 年以上!
然而,你应该考虑所有不是 GA 的对象,然而我们都在使用它们,就好像它们是 GA 一样。一个这样的例子是 Ingress,它在 1.19 才成为 GA,或者最近在 1.21 成为 CronJob。在这种 beta 甚至 alpha 特性的情况下,折旧时间表就不会这么慷慨了。如果您想检查某些资源属于哪个类别,您可以运行例如kubectl api-resources | grep beta
获取集群中所有测试 API 的列表。
几乎相同的规则适用于整个 REST API 对象及其字段、常量值或对象结构。这意味着我们都用来表示imagePullPolicy
的Always
、IfNotPresent
和Never
等常数不会凭空消失或随机变化,同样,字段也不会从一个部分移动到另一个部分。
至于一些现实世界的例子— PodSecurityPolicy 可能是最近历史上最大的一个。该 API 对象将从 v1beta1 升级到 EOL,从 1.21 版开始已被弃用,并将在 1.25 版中被移除。有关详细信息,请查看 KEP-2579 。
另一个重要的最近/正在进行的弃用是移除selfLink
字段。这是 KEP-1164 的一部分,在这个 GitHub 问题中也对这一变化进行了跟踪。
如果你想知道还有哪些反对意见,他们的理由是什么,或者他们的整个删除过程,那么你可以搜索kubernetes/enhancements repository中提到的*“反对”*,你会找到所有相关的 KEPs。
标志或 CLI
类似于 REST 对象,kubectl
或kubelet
子命令或它们的标志也可以被弃用,因此有自己的策略。
这比前一种情况简单得多。这里,对于面向用户的组件,例如kubectl
,策略是:
- GA: 12 个月或 2 个版本(以较长者为准)
- 测试版:3 个月或 1 个版本(以较长者为准)
- Alpha: 0 版本
对于面向管理的组件,如kubelet
、kube-apiserver
或kube-scheduler
,它是:
- GA: 6 个月或 1 次发布(以较长者为准)
- 测试版:3 个月或 1 个版本(以较长者为准)
- Alpha: 0 版本
这方面最近一个大的例子是dockershim
,它是kubelet
的一部分。以下章节概述了其弃用和移除,其中包括移除计划的整个章节,该计划将版本 1.20 列为弃用目标,版本 1.24 列为移除目标。
这方面的另一个显著变化是seccomp
配置文件将正式发布,在本 KEP 中概述。seccomp
配置文件实际上不是对标志或任何 CLI 的直接更改,但是将它们正式发布需要弃用kubelet
标志--seccomp-profile-root
,此处标注为
因此,本节的底线是 CLIs 的弃用时间表也相当宽松,但是如果您使用一些kubectl alpha ...
命令来实现自动化,那么您最好在升级您的集群甚至 CLI 二进制文件/工具之前检查弃用情况。
特征门
在任何时间点上,Kubernetes 都包含了许多实验性的特性。这些功能由所谓的功能门控制,这些功能门是我们可以用来打开或关闭它们的键/值对。
考虑到特性门用于实验特性,它们的弃用策略不同于其他 Kubernetes 对象。此外,随着特性经历成熟阶段,其门的行为也会发生变化。对于 alpha 特征,默认情况下门是禁用的;对于测试版功能,默认情况下是启用的;并且当特征达到 GA 状态时,门不再需要,并且变得废弃和不可操作。
至于弃用和移除这些功能所需的时间——alpha 功能可以随时消失,beta 功能在 1 次发布后(如果它们被移除)或 2 次发布后(如果它们进入正式版状态)就会消失。
如需具体示例,您可以点击查看功能门的完整列表。例如,您可以看到AffinityInAnnotations
功能从 alpha 版本升级到了弃用版本,对于一直升级到 GA 版本的功能,我们可以列出BlockVolume
、DryRun
或EndpointSlice
。至于功能在测试阶段后被弃用的情况,我找不到任何证据。
如果您决定打开其中的任何一个,请确保在升级集群之前检查它们的状态变化,尤其是在集群升级之后可能会消失的 alpha。
韵律学
列表中的最后一种对象是指标,在弃用时也需要保留相当长的时间,因为它们中的许多都是由监控工具消耗和聚集的。与前几节不同,指标只分为两类。在这里,我们只有稳定和 alpha 指标,其中稳定指标可能会在宣布弃用 3 个版本后被删除,而 alpha 指标可以随时被删除。
关于已弃用和已删除指标的示例,您可以看看这个删除了rest_client_request_latency_seconds
指标的提交。您还可以在 1.17 版本的发行说明中找到它,以及其他一些变更/废弃的指标。
如果您想了解关于指标生命周期及其组成部分的更多信息,您可以查看此文档页面。
结论
如今,似乎许多项目更多地采用了一种*“快速移动和打破常规”*的方法来弃用,同时频繁地进行大量更改,因此很高兴看到像 Kubernetes 这样的大项目具有经过深思熟虑的弃用过程,这为用户从计划要删除的 API 和功能中迁移出来留出了大量时间。
那么,这篇文章的要点是什么呢?—有什么东西会被废弃吗?— 是。你应该担心吗?——明明没有。由于一些折旧时间表很长,没有真正的理由担心东西突然被拿走。也就是说,你可能应该查看发行说明,留意所有你可能会用到的 alpha 特性,就好像它们是正式版一样。你也可以查看废弃的 API 迁移指南,它列出了所有将在未来某个时候被移除的 API。最后要注意的是——这些都不一定适用于 CRD——对于外部供应商开发的 CRD,您必须检查他们自己的策略,因为他们可以对其应用程序/集成/解决方案为所欲为。
本文最初发布于martinheinz . dev
https://itnext.io/hardening-docker-and-kubernetes-with-seccomp-a88b1b4e2111
机器学习有可能预测到 GameStop 的疯狂吗?
因为数据也有话要说…
马克西姆·霍普曼在 Unsplash 上的照片
我非常怀疑到今天为止你仍然不知道过去几天 GameStop 发生了什么。但是,假设你不知道。那没问题,除了一些头条,我也没有。像任何其他被误导的人一样,我决定阅读一些文章来了解正在发生的事情。经过进一步的调查,我被这个现象的名字震惊了。出现了一个新名词:“模因股票”。
我不想详细描述发生了什么,因为有很多信息,你会从其他伟大的、更有见识的作家那里找到更好的解释。但是,嘿,一个简短的概述不会伤害任何人。
GameStop 是一家中型零售商,没有什么特别之处。上周它的股票从 20 美元涨到了 400 多美元。最令人印象深刻的是,没有任何关于他们新的创新战略的消息,也没有关于他们销售的令人难以置信的报告,也没有他们聘请了 500 名数据科学家在他们的业务中使用人工智能。没什么。
股价上涨仅仅是因为 Reddit 中的协调小组决定投资它。
如果你想知道更多的原因,请在此之后再做,我会为你重新定向一些很棒的资源。如果你从这里开始,你可以和我一起试着用股市数据来理解这一点。
作为一个有一定金融知识的数据科学家,我会全程指导我的思考过程。我们将深入研究这个问题,像任何其他问题一样,思考是否可以使用机器学习来预测发生的*。*
股票市场数据
谈到股票市场,这有点令人生畏:市场上有数万亿种策略和指标,只有少数几个“定量分析师”可以声称知道所有这些。如果你不是其中之一,那你来对地方了!。我不认为你在这里需要任何这方面的知识。我将通过一些关于市场提供的最相关信息的直观解释来指导你,这对你理解将要发生的事情应该绰绰有余。
在我们继续之前,有必要介绍两个术语:数量和价格。在它们上面你会找到预测股票市场所需的大部分信息。 成交量 是指在特定时间范围内买入或卖出的资产数量。 价格 反映了——不出所料——交易的平均价格。
像任何其他数据科学问题一样,我们应该从查看数据开始,以便更好地理解上下文。感谢 yfinance ,我们可以收集数据,使用 mplfinance 我们可以顺利地将价格和交易量结合在一个可视化界面中。在下图中,你会发现 GameStop 的股票。
图片作者。这里的代码。
这里我想让你注意两件事。首先,价格非常稳定,并且在缓慢下降。第二, 成交量一直没有很高,直到现在 。这一点非常重要,因为我希望大家关注音量。让我们把上个月的情况放大一点。
图片作者。这里的代码为。
1 月 13 日成交量大幅增加。该股当天收盘时,价格几乎翻了一倍。在接下来的日子里,交易量逐渐减少,在 1 月 22 日达到最大值。
如果我们看到这一点,我可能会认为,在接下来的几天里,成交量一次又一次地推高了价格。但你可能会说,“不是数量,而是人”。
数据科学家实际上做的是检查数据是否反映了一些潜在的现实。
在这里,数量增加的原因是集体的、协调的努力,而不是数量本身。但一旦成交量实际增加,数据揭示出“有事”正在发生的信息。
不可否认的事实是,其他人用成交量来投资。正是在那里, 你已经失去了真正原因 的每一条线索。你无法知道这只股票因为 Reddit 的影响涨了多少,又因为不寻常的成交量涨了多少。对我们来说幸运的是,交易量还在,它还在给我们关于价格的有价值的信息。
仅仅看一个案例可能是不够的。读得多一点,我意识到这种事以前也发生过。对于赫兹:
图片作者。这里的代码是。
柯达。
图片作者。这里的代码是。
诺基亚。
图片作者。这里的代号。
还有 AMC。
图片作者。此处代码。
图案与 相同。前所未见的交易量和难以想象的价格。
为了让您看到典型图表的样子,我将显示亚马逊的股价和成交量。
图片作者。这里的代码是。
差异令人震惊。一只普通的股票会振荡,但是成交量在一个很小的区间内。不寻常的库存达到最低值的 50 多倍。
在没有将问题框架化为机器学习问题的情况下,我永远不会假设体积是决定性的预测变量。上面的想法只是指出可能有用的信息。
预言;预测;预告
那么,我们想预测什么呢?如果我们想仅用市场信息来预测一次反弹, 我们可以做得更好,因为价格和交易量都反映了 原因。预测下一个“迷因股票”这样不可预测的事情是不可能的。但是,更有意义的是在它一发生就预测它。一个“早期发现”就足够了。因此,我们需要检索的数据应该是低间隔的。
那么,使用什么类型的机器学习类型呢?后者非常重要,因为尝试对超低发生率事件使用监督学习可能不是最佳方法。尽管如此,无监督学习也有自己的分支 异常检测 。发现异常现象并不一定意味着股票会上涨,但肯定会告诉我们是否有什么奇怪的事情正在发生。
为此,我们将使用过去两个月的 5 分钟间隔数据(由于 API 限制)。我们将用前 40 天来训练模型,以检查模型是否能检测出奇怪的行为。这是为了 模拟 我们在 1 月 12 日将我们的模型投入生产。
直接使用价格和数量作为特征是很有诱惑力的。但一只股票可以上涨很多,这不一定是异常现象。出于这个原因,使用连续观测值之间的差值更安全。我们将使用不同的特征,包括成交量、价格和一些交易者常用的指标,每一个都与有所区别。 ta 包创造指标太棒了。**
K-means 是一种迭代定义质心的算法,试图最小化每个数据点与定义的质心之间的距离。您最终得到一些质心,聚类被定义为最接近特定质心的一组数据点。
对于这种情况,想法是观察训练数据中数据点和聚类之间的距离。然后,使用 25 个最大距离的平均值作为参考,如果来自预训练聚类的距离比参考大三倍,则我们将其宣布为异常。重要的是,我们将使用三个聚类来训练模型,只考虑最小的距离。
我们为每一只想要分析的股票训练一个模型。让我们先从 TSLA 开始,让你明白这个想法。第一种颜色表示训练数据,第二种颜色表示测试数据。异常的形状将是菱形。
注:在下面,你会找到特斯拉股票的代码。你只需要改变其他情况下的参数。此外,可视化要求您在运行之前使用正确的参数运行以下代码。
图片作者。这里的代码是。
下面是另一个使用谷歌股票的例子。
图片作者。这里的代码是。
无论是特斯拉还是谷歌,我们都没有发现任何异常。这很有趣,因为这些股票的行为相当活跃。在这里,我们可以推断该模型能够理解有规律的运动,因为新的数据点从未离开预训练的质心太远。
GME 的故事
好了,现在是时候记住我们最初的问题了。这是可以预测的吗?。让我们从 1 月 11 日 GME 的最后一次训练数据开始模拟。想象一下,你负责这个模型,你看到如下。
图片作者。这里的代码为。
1 月 12 日没什么奇怪的。但是在 1 月 13 日和 14 日,你会得到大量的异常,与其他数据点的质心的距离看起来比正常的一天要远。看到这里,你开始想,我应该采取行动吗?。下周再说吧。
图片作者。这里的代码是。
19 日,出现了一些异常,你会有点担心,但仍然没有决定性的东西。的确,在那之后,你会在 20 日和 21 日有两天没有异常。也许一切又恢复正常了,你可以暂时放松一下。但是在 22 日下午,一切都变得疯狂了。几乎你收到的每一个新数据点都是异常的。记住,在每个数据点之间,你有 5 分钟的时间。想象你自己一遍又一遍地接收这个信息超过 2 个小时。
距离几乎达到了我们定义的阈值的三倍。显然,“有事”正在发生。但是是时候看看一切都失控的那一周了。
图片作者。此处代码。
视觉效果会自己说话。上周只有异常。
最后,整个画面。
图片作者。这里的代号。
机器学习可能预测到 GameStop 的疯狂吗?
给定最后的信息,是时候回答我们最初的问题了。我想围绕机器学习算法的可能性展开讨论。在上一节中,我们看到,甚至在股票达到最高价的两周前就发现了异常。
这是否意味着我们可以预测到这一点? 绝对不是 。
我们发现了一些异常,在我们观察它们的同时,价格也在上涨,但这并不一定能告诉我们,股票在未来肯定会上涨或下跌。我们必须非常小心异常现象代表了什么。
股票价格由复杂的交易算法甚至更复杂的人类行为所控制。上周,有一件事情变得很清楚,那就是试图预测社会现象是最具挑战性的任务之一,因为它取决于许多因素,其中大多数甚至不可能作为数据检索。
使用的方法证明了股票正在经历一些不寻常的情况,仅此而已。我们需要的不仅仅是机器学习算法来预测上周发生的事情。也许一个拥有这些信息以及更多信息的金融专家可能已经预料到了这一点。但是,机器学习模型本身完全依赖于它们所接受的应用程序。
最后的想法
使用异常检测方法,我们发现这个事件在成为现实之前揭示了一些线索。需要进一步的调查来确定这是否真的可以在其他场景中工作。
比技术讨论更重要的是,我认为我们应该分析股票市场的缺陷。人们一直拥有这种力量,但它从未以这种方式使用过。监管机构目前正在谴责这种行为,但现在是时候真正深入研究大型对冲基金的做法了。您刚刚看到了使用公开信息(如价格、交易量和一些指标)来检测异常是多么容易。想象一下监管者的可能性,因为他们有更多的详细信息。
我确信 机器学习将成为监管者 的最佳盟友之一。现在他们的工作是迈出第一步。
再见
我真的希望这个博客能让你感兴趣。如果你喜欢就跟着我!很快会有更多内容!。
我也在 Linkedin 和 Twitter 上。我很乐意与你交谈!如果你想多读一点,看看我最近的一些帖子:
**
承诺的文章
https://marker.medium.com/gamestop-proves-were-in-a-meme-stock-bubble-b3f39163a77f https://www.denofgeek.com/games/gamestop-gme-nokia-amc-hedge-fund-stock-market-wall-street-memes/ **
更多推荐
所有评论(0)