获奖照片背后的结构——深度学习方法
通过可视化 CNN 架构的各层,我们深入了解机器如何处理图像。
来源https://unsplash.com/photos/hJKkyoG8_ng由哈迪·雅兹迪·阿兹纳韦—昂斯普拉什奖 2019 年入选《时事要闻》
卷积神经网络(CNN)允许计算机对图像进行分类。除了对物体进行分类,它们还能让我们了解是什么构成了一幅图片。一幅画的本质是什么?通过可视化 CNN 架构的各层,我们深入了解机器如何处理图像。这也提供了人类如何“看见”图片的见解。
这篇文章将在一边展示什么元素构建了一幅图片,并提供了用 Keras 实现 Python 的代码。
目录
放弃
我与本文中使用的任何服务都没有关联。
我不认为自己是专家。如果你觉得我错过了重要的步骤或者忽略了什么,可以考虑在评论区指出来或者联系我。
我总是乐于听取建设性的意见以及如何改进。
**这篇文章写于 2020 年 10 月 25 日。**我无法监控我的所有文章。当你阅读这篇文章时,提示很可能已经过时,过程已经改变。
如果你需要更多关于某些部分的信息,请在评论中指出来。
基本图像
来源https://unsplash.com/photos/hJKkyoG8_ng由哈迪·雅兹迪·阿兹纳韦—昂斯普拉什奖 2019 入选《时事热点》
我喜欢这张图片,因为它有一个故事,它激发了情感,但也在摄影的层面上提供了一个丰富的结构。
为了解释我为什么选择这张图片,我直接引用 Vice 的设计总监 Joel Tellier 的话(摘自 Unsplash Awards 页面):
这张照片的构图令人难以置信。每个元素都有故事和历史层次。这个主题的随意性表明,她在一个她和她的性别在历史上从未受到欢迎的地方完全自在。她受伤,因此很难参加那一天,增加了她爱国庆祝活动的轻松性质,暗示了一个更复杂的故事。座位上的数字有助于暗示历史,让我想知道在一个(第一个)女人被允许之前,有多少男人坐在她坐的地方。
这使得用 CNN 提取信息成为一个非常有趣的图像。
使用 VGG 网络
我假设理解卷积神经网络(CNN)。这种架构对于计算机视觉和深度学习中的许多事情都非常关键。网上有很多可用的资源。作为复习,我建议这篇文章。
为了理解随后的可视化,有必要说明 CNN 的不同层代表什么。
- CNN 的较浅层倾向于检测较低级别的特征,例如边缘和简单纹理。
- 更深的层倾向于检测更高级的特征,例如更复杂的纹理以及对象类别。
来自研究论文的 VGG19 架构使用深度卷积神经网络和 SVM 分类器和知识共享许可进行乳房自动肿块检测
可以可视化过滤器和特征图。过滤器也是描绘特定特征的图像。应用这些过滤器导致特征图。实际上,图层越浅,要素地图看起来就越像原始输入。在这篇文章中,我想把重点放在特征地图和它们的可视化上,因为它们给 CNN“看到”和学到的东西留下了很好的印象。
卷积图层要素地图
VGG19 模型具有以下结构和层:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, None, None, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (3, 800, 1199, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (3, 800, 1199, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (3, 400, 599, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (3, 400, 599, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (3, 400, 599, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (3, 200, 299, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (3, 200, 299, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (3, 200, 299, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (3, 200, 299, 256) 590080
_________________________________________________________________
block3_conv4 (Conv2D) (3, 200, 299, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (3, 100, 149, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (3, 100, 149, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (3, 100, 149, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (3, 100, 149, 512) 2359808
_________________________________________________________________
block4_conv4 (Conv2D) (3, 100, 149, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (3, 50, 74, 512) 0
_________________________________________________________________
block5_conv1 (Conv2D) (3, 50, 74, 512) 2359808
_________________________________________________________________
block5_conv2 (Conv2D) (3, 50, 74, 512) 2359808
_________________________________________________________________
block5_conv3 (Conv2D) (3, 50, 74, 512) 2359808
_________________________________________________________________
block5_conv4 (Conv2D) (3, 50, 74, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (3, 25, 37, 512) 0
=================================================================
Total params: 20,024,384
Trainable params: 20,024,384
Non-trainable params: 0
_________________________________________________________________
所以这是原图:
通过 CNN 的不同层,我们可以观察到不同过滤器应用于原始图像的结果。我将用“热”色图显示它。只是因为我觉得它比其他色彩映射表更能突出特色。
请注意,过滤器的尺寸和数量随着块的数量而变化。为了简单起见,我将只绘制 8*8 的网格。
我们先来看一下每个块的第一个卷积层:
每个块的第个卷积层
我们来看看每个块的最后卷积层:
每个块的最后一个卷积层
我们能观察到什么?
两件事:
- 我们可以清楚地看到在更深的层中物体被探测到。例如,孤立的女人,但也有一个座位,国旗,甚至有色座椅脱颖而出。
- 这幅图像吸引人的很大一部分是它的结构本身。我们可以看到图片中的女人是如何在非常结构化的环境中带来柔和感的。它看起来很吸引人,因为它的结构是圆形的。圆形的元素使观察者能够将注意力集中在这个独特的物体上,而不是类似的座位上。
本质上,我们可以看到一个图像的相当有趣的组成。我们通过竞技场中的座位提供了许多纹理和结构,但这种结构在人类的形式中是一种扭曲。这将观察者的眼睛直接引导至图像的主角,即女性。它完全符合故事情节。我想说这是区分好照片和优秀照片的地方。通过可视化来支持故事情节。
它就像一个视频,完美地将音乐切割成了它的视觉表达。明白我对这个视频的意思了吗:
为什么音乐在视频中如此重要
至少这些是我的观察。你认为是什么让这张照片吸引人?请在评论中告诉我。
用代码可视化
网格中的特征
在我对 CNN 图层的特征地图进行可视化的研究中,我经常会找到一些教程和实现,这些教程和实现提供了关于如何实现可视化的见解,但并没有真正看到和理解图像所显示的内容。
在我的“灵感”部分,你可以找到形象化的各种实现。通常提取图像的方法是很好的。我只是总觉得它们太小了,不足以表达自己的观点。
如果您遵循现有的解决方案,您可以这样做:
import numpy as np
from keras.preprocessing.image import save_img, load_img, img_to_array
from PIL import Image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
from keras.applications import vgg19
import matplotlib.pyplot as plt size = 224image = load_img(image_path).resize((size, size))
image = img_to_array(image)
image = np.expand_dims(image, axis=0)
image = preprocess_input(image)model = vgg19.VGG19()layer_dict = dict([(layer.name, layer) for layer in model.layers])layer_name = 'block1_conv1'model = Model(inputs=model.inputs, outputs=layer_dict[layer_name].output)feature_maps = model.predict(image)tiles = 8
index = 1
fig, ax = plt.subplots(figsize=(size, size))
for _ in range(tiles):
for _ in range(tiles):
ax = plt.subplot(tiles, tiles, index)
ax.set_xticks([])
ax.set_yticks([]) plt.imshow(feature_maps[0, :, :, index-1], aspect='auto', cmap='hot')
index += 1plt.tight_layout()
plt.show()
如果您想要在不同的图层上显示多个可视化效果,这将非常有用。喜欢
for layer in layer_names:
print(f'{"-"*100}\nLayer {layer}')
model = Model(inputs=model.inputs, outputs=layer_dict[layer].output) feature_maps = model.predict(image)
print(feature_maps.shape)tiles = 8
index = 1
fig, ax = plt.subplots(figsize=(size, size))
for _ in range(tiles):
for _ in range(tiles): ax = plt.subplot(tiles, tiles, index)
ax.set_xticks([])
ax.set_yticks([]) plt.imshow(feature_maps[0, :, :, index-1], aspect='auto', cmap='hot')
index += 1 plt.tight_layout()
plt.show()
这导致每层 8*8 的网格:
图像更大,可以快速发现您想要更详细检测的类型。尤其是在笔记本里。提醒一句:如果你在网格中渲染了太多细节太多的图像,在某个时候,你的笔记本会崩溃。
笔记本电脑显示屏的特性
假设您想要以全尺寸显示每张图片。那么以下内容会有所帮助:
for index in range(feature_maps.shape[-1]):
display(Image.fromarray(np.uint8(feature_maps[0, :, :, index])).convert(
'RGB').resize(display_size))
这将显示灰度图像。如果你想要一个特定的颜色图,你需要做如下的事情:
from keras.preprocessing.image import img_to_array
from IPython.display import display
from PIL import Image
from matplotlib import cmcmap = cm.get_cmap('hot')
display_size = 1000, 1000for index in range(feature_maps.shape[-1]):
im = Image.fromarray(np.uint8(feature_maps[0, :, :, index])).convert('L').resize(display_size)
im = np.array(im)
im = cmap(im)
im = np.uint8(im * 255)
im = Image.fromarray(im).resize(display_size)
display(im)
滚动浏览它们看起来像这样(作为. gif 文件):
使用调整大小功能,可以以合适的尺寸检查所有图像。
奖金——一种神经传递方法
在我之前的文章神经类型转移——一种高级方法中,我提供了神经类型转移的概述。使用以下风格图像的想法。
来源https://unsplash.com/photos/Cj8h7-b47ko作者约书亚·科尔曼
会产生这样一幅图像:
神经类型转移
灵感
CNN 图层可视化阅读清单(排名不分先后):
- https://towards data science . com/visualizing-filters-and-feature-maps-for-deep-learning-d 814 e 13 BD 671 #:~:text = The % 20 feature % 20 maps % 20 of % 20a,what % 20 features % 20 our % 20 CNN % 20 detects。
- https://towards data science . com/extract-features-visualize-filters-and-feature-maps-in-vgg 16-and-vgg 19-CNN-models-d2da 6333 edd 0
- https://debugger cafe . com/visualizing-filters-and-feature-maps-in-convolutionary-neural-networks-using-py torch/
- https://towards data science . com/how-to-visualize-convolatile-features-in-40-line of-code-70b7d 87 b 0030了解神经网络如何识别某种模式
- https://arxiv.org/pdf/1804.11191.pdf卷积网络如何看待世界
- **【https://www.deeplearningbook.org/contents/convnets.html **
- https://www . analyticsvidhya . com/blog/2019/05/understanding-visualizing-neural-networks/
- https://towards data science . com/convolutionary-neural-network-feature-map-and-filter-visualization-f 75012 a5 a49c
关于
丹尼尔是一名企业家、软件开发人员和商业法毕业生。他曾在各种 IT 公司、税务咨询、管理咨询和奥地利法院工作。
他的知识和兴趣目前围绕着编程机器学习应用程序及其所有相关方面。从本质上说,他认为自己是复杂环境的问题解决者,这在他的各种项目中都有所体现。
如果您有想法、项目或问题,请不要犹豫与我们联系。
你可以在https://www.buymeacoffee.com/createdd上支持我
连接到:
- 领英
- Github
- 中等
- 推特
- createdd.com
主成分分析的本质
深入探究 PCA 背后的直觉,完全涵盖数学和代码
西尔维·沙伦在 Unsplash 上拍摄的照片
概述:
*PCA 是最简单的基于真特征向量的多元分析。它最常用作一种降维技术,降低大型数据集的维数,同时仍能解释数据中的大部分差异。*看起来很可爱,不是吗?
通过这篇文章,我努力使 PCA 的思想变得直观。要理解这篇文章,你应该知道-初等线性代数和高中统计。那么,我们开始吧。
维度的诅咒:
维数灾难指的是处理多维研究的不利后果。让我们举一个简单的例子——考虑采样 N 个数据点,其中每个数据点是一个 d 维向量。现在,对于相同的 N,数据变得稀疏,因为我们增加了维度。想想看,在一条直线上随机分布 N 个点与在一个平面上随机分布 N 个点,两者中哪一个的密度更高?答案挺直观的,线(参考这些图)。
好吧,当我们向数据中添加维度时,我们使它变得稀疏,但是为什么这是一个问题呢?如果我们的数据缺乏足够的密度,我们永远无法确定我们的预测。对于我们来说,训练一个模型来预测相当准确的结果,数据必须得到很好的表示,否则我们就有过度拟合的风险。虽然我们生活在大数据领域,但密度的妥协只能通过数据(N)的指数级增长来解决,而这可能是不可用的。高维数据的另一个问题是,我们无法轻松地可视化 3 维以上的数据。距离在更高维度中失去意义。
因此,如果我们能够找到一种方法来减少数据的维数,同时保留大部分信息,我们将能够更有效地处理我们的数据。
特征向量:
这是线性代数中最吸引人的想法之一。通过将一个矩阵乘以一个向量,我们可以对该向量进行线性变换。如果你觉得你对基础线性代数的掌握有点松,我强烈建议你看 3b1b 关于线性代数的系列。
一个非平凡向量的跨度在乘以一个矩阵后不变,这就是该矩阵的特征向量。现在,让我在这里澄清两件事,首先,跨度粗略地表示向量的方向,其次,虽然方向不变,但大小可以。本征向量被拉伸或压扁的程度,即相乘时幅度变化的因子,称为该本征向量的特征值。特征向量使线性变换易于理解。它们是线性变换作用的轴。现在,我们怎样才能为矩阵找到这样的向量呢?
考虑矩阵 m。设λ是矩阵 m 的特征值,v̅是矩阵 m 的特征向量
因此,M v̅ = λ v̅
mv̅=(λI)v̅,其中 I 是单位矩阵
det(m—λI)v̅= 0
由于 v̅是非平凡矩阵
det(M—λI)= 0
对于满足此方程的所有特征值(λ),求相应的特征向量(v̅)
现在,我来告诉你一个离奇的事实——如果你把矩阵 M 乘以任意向量若干次,结果几乎是沿着特征值最大的特征向量的跨度!当我第一次遇到这个事实时,我大吃一惊,因为不管矢量是什么,答案的跨度都保持不变。
(M x M x M…x M) a̅ ≈ α v̅,其中α为常数,a̅为随机向量,v̅为最大| λ| (特征值)的特征向量。
(Mᵏ) a̅ ≈ α v̅,k 为大值
这里要注意的一件重要事情是,M^k 也是一个矩阵。因此,如果我们将一个矩阵乘以足够多的次数,我们最终会得到一个将每个向量变换到相同跨度的矩阵。
让我们来演示一下-
我建议您尝试自己编写这段代码,并观察改变 k 的值(保持它> 20)如何改变矩阵 M_k,但属性保留。
现在,让我们来看看这个看似荒谬的财产背后的原因。原因与下面的等式有关-
mᵏ= s x(λᵏ)x 逆(S) 即特征向量可以很容易地表示矩阵 m 的任意次幂。
λ是具有所有特征值的对角矩阵
S 是(M — λI)的零空间,对于所有λ,即矩阵 S,是所有特征向量的矩阵。
这个等式成立是因为-
m x S = S xλ;(根据特征值向量定义)
M x S x 逆= S xλx 逆
M = S xλx 逆(S);(S x 逆(S) = I)
M x M = S xλx 逆 x S xλx 逆
M = S x(λ)x 逆(S);(S x 逆(S) = I)
因此,这可以一次又一次地重复,以获得-
mᵏ= s x(λᵏ)x 逆(s)
然而,这个等式似乎并不能解释其中的神奇之处!是的……但是它藏在众目睽睽之下。
考虑一个向量 a̅ ∈ ℝ(n),矩阵 m∈ℝ(n×n)。更新 a 的算法是-
a̅ = M x a̅
原来 a̅ = c1( v̅1 ) + c2 ( v̅2 ) + … cn ( v̅n),其中 v̅i 为第 I 个最大特征值的特征向量,ci 为对应常数。特征向量跨越ℝ(n).
现在,在第 k 次迭代之后-
a̅=(mᵏ)x(C1(v̅1)+C2(v̅2)+…cn(v̅n))
=(s x(λᵏ)x 逆(S)) x (c1( v̅1 ) + c2 ( v̅2 ) + … cn ( v̅n))
= C1(λ₁ᵏ)( v̅1)+C2(λ₂ᵏ)( v̅2)+…cn(λₙᵏ)( v̅n)
将 RHS 除以λ₁ᵏ
对于 k→∞:span(a̅)= v̅1;(|λ1| > |λ2| > … > |λn|)
因此证明。
现在,我提出这个属性的目的(除了让你吃惊之外)是为了强调特征值-向量对的重要性。这么想吧,每个特征向量对于解释矩阵中信息的重要性直接关系到它的特征值有多大。
执行 PCA:
假设你对特征向量部分的最后一个语句没有意见,这里的大部分工作就完成了!剩下的就是几个基本公式了。
以下是执行 PCA 的步骤
- 标准化您的数据。
- 计算特征(维度)的协方差矩阵。
- 计算特征值向量对,并按特征值降序排列。
- 选择总数 n 的前 r 个特征值。
方差计算=(第一个 r |λ|的和)/(所有|λ|的和)
5.将数据投影到所选的特征向量上。
标准化数据集
计算协方差矩阵
找到特征值向量对并投影数据
关于特征向量,它们并不总是相互正交的。然而,如果矩阵是对称的,即矩阵的转置等于其自身,则这种矩阵的特征向量是正交的。注意协方差矩阵。对,是对称的!这意味着我们的特征向量相互正交。为什么这是一件好事?我把这个问题留给你去研究。请在评论区告诉我你的想法。
因此,使用主成分分析,我们将 4 维数据集转换为 3 维(正交的),同时保留超过 99%的方差。
解读结果:
让我们来看看我们之前选择的 3 个特征向量-
现在,这些四维向量意味着什么?回想一下,我们之前有 4 个维度——性(a̅)、age(b̅、educ(c̅和 hours(d̅).所以,
v̅1=-0.00497184a̅+0.95424153b̅+0.01435652c̅+0.29865074d̅
因此,最终向量不沿着任何原始维度。它们是所有这些的线性组合。当我们投射数据时,这些向量成为我们的新维度(轴)。
让我们把我们的标准化数据矩阵(X)投影到一个单位矩阵(I_4)上,得到一个矩阵(A),让这个想法更直观一些。
注意矩阵 A 和 X 是相同的。这是因为通过将 X 乘以一个单位矩阵,我们没有改变任何维度!
谢谢你能走到这一步。我希望这篇文章值得您花费时间,并且您现在已经直观地理解了 PCA。请在评论区告诉我你的建议和问题。
干杯!
基本的 dplyr
很多 R 班等着教这个包。幸运的是,你有互联网。
这个神秘命名的包是 R 中清理、组织和查看数据的救命稻草。许多教授等着教 dplyr,以支持教授基本的 R 方法作为基础,但这并不意味着您必须等着学习它。在本文中,我们将研究一些最省时的 dplyr 函数,并学习如何使用它们来操作数据集。
什么是 dplyr?
Dplyr 是由 Hadley Wickham 和 Romain Francois 编写的一个包,用于帮助您将原始表格数据处理成一个整洁的数据集,以便进行分析。在他 2014 年关于该包的前身 plyr 的论文中,Wickham 写道:
人们常说,80%的数据分析花费在清理和准备数据的过程中。
准备数据仍然需要时间,但是由于 dplyr 和其他 tidyverse 软件包,我们可以比我们的前辈花费更少。在本文中,我将使用墨西哥城的空气质量数据集作为展示以下关键 dplyr 函数的基础:
- tible():产生一个tible.)而不是你的标准数据帧。
- mutate() :使用其他函数创建新的计算字段。
- filter() :通过指定要保留的行来过滤您的行。
- select() :选择您希望保持其显示顺序的列。
- % > %操作符允许管道。
- group_by() 根据各个字段的值对数据进行分组。
- **summary()**根据您建立的组汇总您的数据。
- inner_join() 将返回第一个表中与第二个表中的值相匹配的所有行,以及两个表中的所有列。如果有多个匹配,将返回所有组合。这是 dplyr 包中包含的许多连接选项之一。
- 按特定字段对表格进行排序。它会自动按升序排序,除非使用了 desc() 。
展示墨西哥城的空气质量数据
我们将通过对墨西哥城的空气质量数据集执行一些初步的数据操作来查看 dplyr 包中的函数。下面的代码将从墨西哥城的空气质量监测网站下载 2016 年 1 月至 2020 年 4 月的颗粒物 (PM)浓度的数据。for 循环允许您通过编辑 z 向量来指定数据中包含的年份。
##getting the data
data<- data.frame()
z<-c(2016,2017,2018,2019,2020)
for(i in z) {
url <- paste("[http://www.aire.cdmx.gob.mx/opendata/promedios_diarios/promedios_](http://www.aire.cdmx.gob.mx/opendata/promedios_diarios/promedios_)",i,"_ps.csv", sep = "")
data <- rbind(data, read.csv(url,header = T, skip = 8))
}
罕见晴朗天气下的墨西哥城,作者拍摄
让我们从问题开始。我想知道 2020 年 4 月的空气质量是否会因为冠状病毒的封锁而比往年好。这是一个相当复杂的问题,但为了快速了解这是否值得深入研究,我将 2020 年的月均值与前几年的月均值进行比较。
让我们通过将数据更改为 tibble 来查看数据的当前状态:
pm <- tibble(data)
pm
tibble 看起来比常规的数据框要好:输入它的名称,R 会给出维度、10 行数据预览以及每一列的类。关于数据集中的实际数据,我们可以看到,它包含了 PM10 和 PM2.5 的每日测量值,单位为微克/立方米,分布在墨西哥城的多个站点。
为了回答我们的问题,我们需要做一些处理。
变异、过滤、选择、重命名和%>%
下面,我使用了 mutate 命令来创建一个日期时间(POSIXlt)格式的新日期字段,并为月份和年份创建单独的字段。我通过 filter 命令过滤数据,去掉所有 NAs,然后使用 select 重新排序字段。我使用 rename 将我的 datetime 字段 datex 重命名为“date”。
pmclean <- pm %>%
mutate(datex = strptime(date,"%d/%m/%Y"),
month = month(datex), year = year(datex)) %>%
filter(!is.na(value)) %>%
select(datex, id_station:value, month, year) %>%
rename(date = datex)
您可能已经注意到的另一点是 % > % 操作符。这个操作符是用 dplyr 包加载的,大致翻译为“then”。它允许我们将下一行的代码应用于 pm 数据集,而不是必须在每个函数中重写数据集名称,并将我们的更改分配给中间变量。这个过程被称为管道。
如果没有它,代码将如下所示:
##clean
pm2<- mutate(pm, datex = strptime(date,"%d/%m/%Y"),
month = month(datex), year = year(datex))
pm3 <- filter(pm2, !is.na(value))
pm4 <- select(pm3, datex, id_station:value, month, year)
pmclean <- rename(pm4, date = datex)
结果是一样的,但是使用 % > % 操作符让我们用更少的击键次数就到达了那里,并且需要创建更少的中间变量,保持了我们工作空间的整洁。
分组依据和汇总
现在,我的数据集更整洁了,我想看看值字段的一些摘要信息。
这个总结没有告诉我太多,因为它包括 PM 10 和 PM 2.5 值。PM 10 和 PM 2.5 的行为、健康影响和监管阈值不同,放在一起分析没有太大意义。
幸运的是,dplyr 有一个简单的解决方案。要将我的数据分组,我可以使用 group_by 函数,按 id_parameter 字段分组。我还知道,我想将 2020 年每个月的平均值与过去几年相同月份的平均值进行比较,所以我也将按月份和年份分组。这对我的 pmclean 数据集不会有任何明显的影响,但是如果我使用summary创建一个新表,列出的函数将基于这些组进行计算。
这里我用平均值、中值、最小值、最大值汇总value 字段,并赋值给 pmsummary 数据表。请注意,该指定放置在管道的顶部。
pmsummary <- pmclean %>%
group_by(id_parameter, year, month) %>%
summarize("mean" = mean(value), "median" = median(value),
"min" = min(value), "max" = max(value))
结果是下面的表格。您可以看到,平均值、中值、最小值和最大值是针对月、年和参数的每个唯一组合计算的。
安排
Arrange 本质上与 Excel 中的 sort 一样。让我们用它来比较 2020 年前四个月的平均污染物浓度和前几年的相同月份。为此,我们将使用过滤器获得我们想要的参数和月份,然后我们将按月份和平均值排列结果。我在这里不这样做,但是你可以使用排列中的 desc 函数来按降序排列你的数据。
##PM10
arrange(filter(pmsummary,id_parameter == "PM10" &
month %in% 1:4),month, mean)
##PM2.5
arrange(filter(pmsummary,id_parameter == "PM2.5" &
month %in% 1:4),month, mean)
这里我们可以看到,2020 年 4 月确实有更低的 PM 10 和 PM 2.5 平均浓度,但在墨西哥城进入冠状病毒封锁之前,2020 年 1 月和 2 月也是如此。让我们从视觉上来看这些信息。
过去五年每月 PM 2.5(空心三角形)和 PM 10(实心圆圈)的平均浓度。2020 年是用珊瑚色绘制的,所以很醒目。
##Graph the summary data
plot(pmsummary$month,pmsummary$mean,
col = ifelse(pmsummary$year == "2020", "coral1", "grey"),
pch = ifelse(pmsummary$id_parameter == 'PM10', 19,2),
xlab = "Month",
ylab = "PM Mean Concentration (ug/m3)",
cex = 2,
type ="p" )
legend("bottomright", c("PM10", "PM2.5", "2020"),
col = c("grey","grey", "coral1"),
pch = c(20, 2, 1))
这使得逐月观察趋势变得更加容易。有趣的是,与其他年份相比,2020 年 3 月的 PM 10 平均浓度相当平均,然后在 4 月急剧下降。对于 PM 2.5,我们看到从 2020 年 3 月到 2020 年 4 月略有增加。虽然远非确定,但我认为这个问题值得进一步分析。
与 dplyr 连接
dplyr 附带了许多 join 函数。它们包括标准的 inner、right 和 left 联接,以及允许您基于其他表过滤表的函数,如 anti_join()、semi_join(),甚至 nest_join,它允许您将一个表中的数据嵌套在另一个表的行中。
我们清洁的颗粒物质
比方说,我想查看我的车站级别的空气质量数据。我目前的数据是按电台分类的,但我不太了解这些电台标签的含义。幸运的是,墨西哥城也出版了他们的电台目录:
url <- "[http://www.aire.cdmx.gob.mx/opendata/catalogos/cat_estacion.csv](http://www.aire.cdmx.gob.mx/opendata/catalogos/cat_estacion.csv)"
datastations <- tibble(read.csv(url,header = T, skip = 1))
他们的台站数据为我们提供了每个台站的纬度、经度和海拔高度。让我们使用 join dplyr 函数之一将该信息添加到我们的主数据集。
pmclean 数据集中的每个值都应该有一个与之关联的站(测量该值的站),并且数据集中的每个站都应该在墨西哥城站目录中。这意味着我们可以做一个内部连接。我们希望加入站缩写,即 pmclean 数据集中的 id_station 和 stations 数据集中的 cve_estac。让我们解决这个问题,然后进行连接。
stations <- datastations %>%
select(cve_estac:obs_estac)%>%
rename(id_station = cve_estac)pmstations <- inner_join(pmclean,stations)
您可以看到,因为我在 stations 数据集中重命名了我的连接字段以匹配 pmclean 数据集中的字段,所以连接操作不需要我指定要连接的字段;它会自动选择匹配的字段。
多做数据科学
清理和操作数据并不是数据分析中最有趣的部分,但它是一个不一定很痛苦的关键过程。使用我们今天看到的数据集或使用 dplyr 附带的数据集之一来熟悉这些函数。一旦你的工具包里有了它们,你就可以花更少的时间和眼泪去弄清楚如何操作你的数据,而有更多的时间去做数据科学。
本文中使用的所有代码都可以在这里找到。
创造人工智能产品的基本指南
在研究一种新的人工智能产品?如果你不知道从哪里开始,我希望这篇文章能帮助你在深入研究之前找到问题的答案,理清思路。
在我们开始之前,让我们设定这篇文章的范围并确定读者,以确保你在正确的地方。我从过去十年构建人工智能解决方案的经验中总结了一些知识,并以某种方式展示出来,希望在你开始构建人工智能产品并将其快速送到用户手中的旅程时,能引起你的共鸣。我试图在一个组织中为人工智能产品所有者的利益构建它,该组织的任务是确定要构建的产品,组建团队,构建它,并为有痛点的真实用户推出它。对于团队成员——产品经理、项目经理、工程师、数据科学家、ML 工程师、ML Ops 和实习生——来说,概述开发人工智能产品的精益方法同样有用。如果你正在运行一个研究项目,你也不会完全不知所措,因为这里描述的方法只能提高你的“启动”时间,即使是一篇论文或出版物。但是,需要一些 AI 方面的背景。但是有了像这种这样的好课程和其他在线内容,以更好的方式解释了什么是人工智能,我假设你已经读了足够多的书来了解基础知识。但是这个系列也不是对 ML 或深度学习的技术深入研究(这是时代精神,是我很大程度上假设你会使用的),所以你不会看到任何神经网络架构或代码。
让我们从理解为什么我们需要一个单独的指南来构建人工智能产品,而不是像对待常规软件开发方法一样对待它开始?就像你对任何其他项目一样,你要确保你理解技术可以实际实现什么,定义人工智能增强的用户体验(UX),规划你的团队构建产品功能的努力,并在用户痛点真实存在的情况下推出你的产品。但当你的项目涉及人工智能时,挑战在于做到所有这些,但面临快速发展的技术的额外限制,构建它所需的稀缺和昂贵的专业知识,以及能够及时推出这些功能。你还想避免代价高昂的人工智能项目陷阱,这些陷阱可能最终导致几个月的延迟,甚至更糟——整个项目失败。错误的 ML 问题框架,没有好的数据来训练你的模型,迭代太慢,这些陷阱都太常见了。
在本文的其余部分,我将讨论如何着手确定要构建的产品、组建团队、构建产品时要记住的事情,以及克服过程中的挑战和避免陷阱的一些技巧。但是为了有效地做到这一点,我需要将本指南分成几个小部分,由于缺乏更好的结构,我们称之为“步骤”(剧透:最后有一个迭代步骤,这基本上是一个循环)。
步骤 1:定义价值主张和用户利益
开始构建一个人工智能产品的第一步,就像其他任何产品一样,是澄清我们正在构建的是什么。
哈尔·盖特伍德在 Unsplash 上拍摄的照片
定义价值主张和人工智能增强的用户优势
像任何产品或功能一样,我们从用户痛点出发,定义您的解决方案将为用户提供的价值主张(价值主张)。然而,你的价值主张与你是否使用人工智能没有根本联系。非常重要的是,你要认识到,人工智能只是通过提供以下一个或多个好处来增强价值主张——降低用户的成本,更快地提供解决方案,或扩展到你拥有的不同用户(即自动化、协助或个性化),而不是你针对用户的痛点销售的主要“药丸”。坦白说,用户并不在乎你用不用 AI。他们关心他们的痛点,以及与其他解决方案相比,您的产品是否能带来更多好处。
举个例子,Gmail 一直在用人工智能为他们的邮件提供尽可能好的 UX,甚至从他们早期的“永久测试”开始。我在 21 世纪初改用 Gmail 的最大原因之一是他们的垃圾邮件过滤功能——这在当时是世界上最好的。该产品一直专注于用人工智能改善 UX,而不是出售人工智能本身。他们对重要邮件与促销邮件、社交邮件等的自动分类。以及他们最近推出的在写电子邮件时使用智能撰写,都是在人工智能的帮助下提高用户生产力的绝佳例子。(我将在本系列的其他地方使用这最后一个例子进行说明)
定义你产品的价值主张,不要和人工智能捆绑在一起。相反,确保你的解决方案相对于其他竞争对手提供给用户的好处,为人工智能提供一个令人信服的案例。
为早期验证构建最小可行产品(MVP)
就我个人而言,我是过去十年“精益创业”运动的忠实追随者,该运动已经形成了一种在产品与市场匹配存在巨大不确定性的情况下创造成功产品的哲学。通过将 MVP 快速放在用户面前并快速迭代,您可以更快地确定您的解决方案是否确实是用户所需要的,并愿意为此付费。那么,我们如何构建一个带有“人工智能引擎”的 MVP 来提供相同的用户利益,而不实际实现人工智能呢?好吧,我们可以通过使用一些方法预先花费一些人力来“模拟”人工智能引擎:
答:人在回路解决方案:有什么比真实智能更好的模仿人工智能的呢?通过从用户那里抽象出一个真正的人作为“智能”引擎,为用户提供同样的好处(通过让某人在你的测试期间准备好“在线”)。也被称为“绿野仙踪”UX 测试,这种方法已被广泛用于语音助手界面的原型开发——用户认为他们正在与一个全功能的语音助手交谈,但实际上是一个人在完成用户请求。它有助于确定用户要求的正确用例以及用户可能说出的命令的措辞类型,然后产品团队可以为开发人工智能解决方案确定优先级。
*b .基于启发式的解决方案:*在大多数情况下,您可以将您的领域知识或经验法则编码到您的软件中,并让您的用户进行测试。想到的使用启发式方法的一个例子是地理空间搜索查询的处理。例如,如果你在手机上向你最喜欢的搜索引擎请求“咖啡店”,作为人类,我们理解搜索请求的常识性额外要求——咖啡店应该在用户位置周围(例如使用 GPS)并且在一定距离内(例如可步行),并且应该在当前时间营业。与其等待 ML 团队构建一个可以做出这些常识性猜测的模型,为什么不将这些编码为模型输出的编程扩展呢?这有助于您快速启动或验证。一旦启发式开始变得太复杂,或者当你有足够的数据来学习个性化时,你可以替换它。
也许这两种解决方案并不适用于所有用户或边缘情况。但是,如果在某些情况下它确实有效,用户对你的解决方案的需求得到了验证,你就可以放心地把时间、金钱和资源花在构建实际的人工智能上。如果解决方案无效,那么您可能会认为市场不正确,并通过转移到另一个棘手问题来解决,从而为公司节省相同的时间、金钱和资源。
通过使用人在回路中或基于启发式的‘绿野仙踪’MVP,获得你的价值主张和人工智能增强的利益的早期验证或无效。
确定产品的关键性能指标
在为你的产品的用户确定价值主张的同时,你也将更好地理解你的组织如何从向客户推出产品中获益。是时候以你的产品所针对的指标的形式清楚地捕捉这些好处了。例如,让我们说你的人工智能增强的 UX 让你的用户更快地键入电子邮件。因此,他们现在可以发送更多的电子邮件。当然,这导致了更多的产品粘性,结果是,你的(a)每日活跃使用量增加了,( b)基于订阅的产品的流失率降低了,增加了你每月的经常性收入。当你设计 ML 问题时,这些可以作为参考,这样你的模型的目标与产品的目标一致,而这些目标反过来又与你的业务目标一致。
确定你的产品的业务 KPI 和 UX 指标,以及使产品成功的目标。当你定义你的 ML 模型的度量时,比如准确性、推理时间等,你可以使用这些。
步骤 2:正确构建 ML 问题
一旦我们对产品的价值主张进行了一些早期验证,我们将通过确定要使用的 ML 技术、确定输入、输出和中间步骤,以及将 UX 和业务指标与 ML 解决方案的指标联系起来,来构建 ML 问题。以我的经验来看,你构建 ML 问题的方式导致解决方案性能的最大收益,并且是促成项目成功的最大因素。
斯蒂芬·道森在 Unsplash 上拍摄的照片
识别“模型”输入和输出
任何人工智能解决方案的核心都是一个“模型”,它通过使用关于用户上下文/需求的已知信息来预测与用户利益相关的一些关键特征,从而实现自动化、辅助或个性化。例如,Gmail 中的智能撰写功能可以帮助您根据目前已键入的内容完成即将键入的句子,从而节省您键入可预测句子的时间。在这种情况下,模型输入是部分键入的文本,输出是基于上下文的完整文本句子(例如,电子邮件收件人的姓名等)。).
您希望尽可能清晰地定义模型输入和输出,没有任何歧义。也就是说,给定输入和上下文,应该只有一个“最佳”输出。如果有多种可能的输出,UX 需要确保它知道如何向用户提供解决方案(例如,在 Gmail 中,键入“希望你”只会显示最佳猜测—“…做得很好”。其他可能的输出,如“…感觉更好了”将不会显示,直到用户键入更多的字符。)
定义输入和输出的另一个重要测试是确认确定输出所需的所有信息是否在输入中可见。这一点非常重要,因为如果您决定使用监督学习方法,那么您的注释器也不会有这些信息,并且您的训练数据不足以供模型学习。举个例子,如果我给你看一张放大后高度像素化的照片,如果一个人不能识别照片中的物体,那么它只会被注释器错误地标记,模型也不能从中学习。
清楚地确定你的 ML 模型的输入和你期望模型预测的输出——输入应该在推理时可用,并且人类应该可以在没有除输入之外的任何上下文的情况下注释输出。
选择 ML 技术
用于训练和建立模型的算法属于三种机器学习技术之一——监督学习(即从例子中学习)、非监督学习(即学习识别常见模式)或强化学习(即基于“游戏化”的自我学习)。在 ML 专家的帮助下(参见下一步“人员”部分),您可以识别 ML 技术,同时识别您需要的数据和平台:
*a)监督学习:*人类知道输入和输出之间的关系,我们可以得到对输入进行注释的输出,而不需要输入中存在的任何上下文信息。从该数据中学习的模型近似于人类的判断,并在给定输入的情况下生成输出,假设该输入与它被训练的示例相似。
*b)无监督学习:*输出随数据变化。例如,您可能希望将您的输入分组到不同的组中,但是不知道应该是什么样的分组,例如在查找客户细分时,最重要的功能是什么,等等。随着数据的变化,这些组或聚类也会发生变化。
*c)强化学习:*你学习一个基于你的状态来预测行动的策略,但不是教模型如何做出决定,而是知道你可能会奖励或惩罚模型预测,你可以通过模拟一个类似游戏的学习引擎来训练模型——使模型更加健壮。
选择最适合为您的人工智能解决方案构建模型的 ML 技术(在监督学习、非监督学习或强化学习之间)。这也有助于定义您的标记数据或 ML 平台需求。
如果需要,分解问题
有时,使用单一模型的步骤并不能解决问题。在这种情况下,最好将问题分解成一系列模型,这些模型可以在管道中组合在一起。例如,像 Alexa 或 Siri 这样的个人助理不能使用一个单一的模型来接收语音输入并产生语音输出。还有一些中间步骤,如将语音转换为文本、理解请求的上下文、执行请求、记住来自以前请求的用户信息、生成结果以及将结果转换回语音。这高度依赖于可用的 ML 解决方案的状态,以及 ML 专家将问题分解成现实步骤的技能。不过要预先警告,就像糟糕的编程一样,也可能会出现问题的糟糕分解。
分解 ML 问题的另一个原因可能是结合试探法和模型来强制模型以某种方式运行。例如,你可能没有足够的训练数据,处理边缘案例,甚至执行一些基于规则的逻辑(这些不需要学习)。
一个模型很少能完全解决业务问题,可能需要分解成更小的可解决的问题,或者采用启发式方法,或者处理异常。
将 ML 模型指标与 UX 联系起来
在我们开始构建模型之前,我们首先应该建立成功标准。您的解决方案的 UX 直接受模型精度和预测时间的影响,如下所示:
*a)准确性:*模型准确性告诉您您的模型将成功满足多少用户请求。比如一个语音助手(像 Siri,Alexa 等。)80%的准确率(假设评估数据中用例的分布与真实世界相似)将导致 1/5 的用户请求得不到满足,这些请求要么需要人工服务,要么可能会对 UX 产生负面影响。现在,如果手动解决或允许这 20%的错误失败会导致成本过高或更糟——导致用户停止使用您的产品,那么您的准确性目标需要更高。如果用例要求在 I 型或 II 型错误之间进行权衡,那么应该使用其他度量标准,如 F-beta 分数。
*b)预测时间:*如果预测的时间比人类习惯的时间长,UX 可能会变得无法使用。例如,如果语音助手需要 1 分钟来确认它是否理解你所说的话,这可能会非常烦人,以至于你在未来不会使用它。因此,模型预测应该满足时间限制(例如,对于语音助手,少于一秒)。这还将帮助科学家确定要使用的 ML 算法/模型的类型,以及是在设备上还是在云上部署解决方案。
有时,区分用例的优先级有助于减轻一些准确性或时间的限制。例如,对于语音助手的例子,请求天气和音乐可能是最常用的功能,因此需要具有更高的准确性和更快的响应时间,而控制智能家居物联网设备可能具有较低的重要性,因为用例可能有较少的用户。
通过根据用户利益的 UX 目标设定准确性和预测时间目标,定义人工智能解决方案的成功标准。对用例或 I 型和 II 型错误进行优先级排序有助于关注于提供对用户更重要的用户利益,以及选择正确的 ML 算法、模型架构等。
步骤 3:让人员、数据和平台就位
好吧。你已经确定了你的人工智能增强的价值主张,并框定了 ML 问题。下一步是召集一个团队,为成功构建模型做好准备。
安妮·斯普拉特在 Unsplash 上的照片
人
建立一个数据科学团队很难,因为专业知识稀缺,因此,就业市场的招聘成本很高。在外部寻找人才时,很难找到已经将模型投入生产的人。但从好的方面来看,由于薪水丰厚,我们也看到大量工程师转向数据科学,这很好。如果你是一个已经有内部数据科学职能的大型组织的一部分,你的挑战可能是他们的可用性,因为项目需要他们的技能。无论哪种方式,你都需要为你在团队中寻找人才所需的技能做一个强有力的证明。那么什么样的数据科学/ML 能力适合你的项目呢?
*a) ML 工程师:*我认为对于一个产品团队来说,最有影响力的数据科学角色是 ML 工程师。如果 ML 问题可以被构建到一个已知的算法和架构中,ML 工程师可以使用流行的框架来训练模型,并将模型打包以供部署。他们还有一套工程辅助技能,这对于移动数据来训练模型以及将模型投入生产非常重要。
*b)数据科学家:*如果你的产品需要以一种没有已知算法和架构的新颖方式使用 ML,你的团队应该有一个计算机视觉、自然语言处理、强化学习等方面的专家。谁将帮助你创造技术。请注意,这个角色是研究型的(想想博士),并且通常有一个长达数月的模型创建生命周期。我认为,只有当你在人工智能领域创造你的竞争对手不应该获得的知识产权时,数据科学家才是成功的关键。但在这一点上,你应该调查你的产品时间表——也许你正处于研究阶段,技术还没有准备好黄金时间。
让我用例子来对比这两个角色,以便更好地进行比较——假设您正在为咖啡店和餐馆创建一个人流量计数器,试图对进门的人进行计数——有大量的对象检测算法可供选择,您可能需要一名 ML 工程师来使用这些模型并构建您的人流量计数器。但是,假设您还想为同一产品构建行业首创的自动人口统计跟踪功能,这里没有足够的高精度算法,您需要创建新的模型,因此,您可能需要一名数据科学家。数据科学家需要专注于让模型工作,而 ML 工程师需要专注于将已知的工作模型投入生产。
ML Ops —一个最近出现的角色,ML Ops 负责在生产中部署和维护模型。将 ML Ops 视为 DevOps 功能中专门部署您的模型的角色。这个角色的范围很大程度上由您选择的平台定义(见下文,我们在这里讨论云平台),但是当您发布产品时,责任是最重要的——保持 ML 模型预测服务的健康和性能。
d)其他工程师 —最后,与上面的数据科学角色一样重要的是,您的团队还将拥有前端工程师(创建 UI /应用程序)、后端工程师(移动数据所需的业务逻辑和服务)和开发运维工程师(在生产中部署和维护模型和后端服务器)。
虽然建立一个数据科学团队很难,但需要数据科学家、ML 工程师、ML Ops 和其他工程师的适当平衡,以确保您拥有实现您的解决方案的正确技能和专业知识。
数据
您将使用哪些数据源来训练您的模型?在“ML 问题的框架”之后,你的数据来源对你的模型性能有最大的影响。因此,确保您拥有模型输入和输出的正确数据非常重要。
*a)模型的输入:*除此之外别无他法——让你的训练数据尽可能接近生产数据。例如,对于计算机视觉用例,用于捕捉图像的摄像机、其位置、移动、照明条件等。需要与生产环境完全匹配。使用公开可用的数据作为用例来启动模型训练可能很有吸引力,但是基于网络上的一般数据(例如,来自 Google 搜索的图像)或为其他目的构建的数据集训练的模型在生产中使用时几乎肯定会失败。迁移学习或生成合成数据看起来可能是一个有趣的选择,但这些方法可能还不够成熟,无法为您的模型生成现实案例。
*b)模型的输出:*如果您使用监督学习技术,您将需要模型输出的注释数据,以便训练模型。标注数据成本高昂,尽管有多家公司提供标注服务(大多数众包来自劳动力廉价的发展中国家),但你需要选择一家质量检查到位的公司。您还需要了解数据隐私、安全性以及其他关于人们滥用您的数据的问题。标记数据通常比模型本身更有价值,主要是因为任何获得您的标记数据的竞争对手都能够构建类似的产品,但没有您的数据的竞争对手无法提供相同的用户优势。我在这个行业的不同团队工作中获得的一个见解是,成功开发人工智能解决方案的产品团队,有一个内部数据实习生或经理,他们在培训数据管理、清理、确保质量检查以及管理注释工具或平台方面发挥着至关重要的作用。
数据是您的模型学习的燃料,对于在与生产环境完全相同的条件下捕获的训练数据,没有什么好的替代方法。在模型输出方面,获得明确的高质量数据比花费时间改进模型本身更重要。
平台
除了训练模型所需的人员和数据,您还需要确保为您的需求选择正确的平台。
*a)内部:*像 Scikit、Tensorflow 和 Pytorch 这样的框架仍然是内部开发模型最流行的,但是你需要花费额外的基础设施来训练和服务生产中的模型。虽然可以选择购买 GPU 工作站,使用 IaaS 提供商,如 AWS、GCP、Azure 等。如果您需要大规模按需训练您的模型,或者利用或 TPU 等提供的硬件优化,通常会更好。对此,一个可能的解决方案是在使用带有 GPU 的本地机器来开发用于训练和服务的代码,但使用 IaaS 提供者来大规模训练和服务之间找到平衡。在这两种情况下,需要注意的一个挑战是移动数据所花费的时间,特别是在数据集大小可能以 TB 为单位的图像中。
b)云中: 2019 年见证了一系列 ML 即服务平台(即云中的 ML)的推出和增长,这些平台允许更快地培训和部署您的 ML 模型。您可以使用图形用户界面(ide、Jupyter 笔记本等),而不是使用 Tensorflow 或 Pytorch 之类的框架。)来构建和部署模型。灵活程度通常因平台而异。有些试图提供“无代码”解决方案,您可以将数据拖放到您的模型中,并使用 ide 来训练和部署您的模型,而有些提供“托管框架”作为服务,您可以使用自己的代码作为软件的一部分来训练和部署模型。这些服务通常看起来比你的内部平台更贵,但通常会承担很大的责任。例如,如果您有一个内部平台,ML Ops 的职责是为培训和服务模型提供服务和维护基础架构,而在托管云平台中,基础架构由软件提供服务和维护,从而减少了雇用单独的 ML Ops 成员的需要。也就是说,仍然需要一些运营专业知识来供应云软件、维护对数据的访问等。
确保以上三件事情一致的最后一件重要的事情是,您已经清楚地确定了您的模型将要部署的环境。回想一下,对于数据,您的输入是从相同的环境中收集的。用于部署模型预测服务-如果它位于本地或云中的服务器上,您的模型将有更多的资源进行计算,因此您的团队可以使用更复杂的架构。但是,如果是在智能手机、浏览器或边缘设备上,您的团队需要选择适用于这些计算受限环境的架构,同时还要考虑电池消耗等问题。
无论你选择内部还是云框架,都会影响你构建人工智能解决方案的灵活性,你需要提供一个成功的 UX,与此形成对比的是,你可以启动模型或团队/资源的速度,你需要自己启动它。
步骤 4:构建和集成人工智能微服务
你如何构建人工智能服务将在很大程度上取决于你选择的模型训练和服务架构,你遵循的最佳实践,以及你拥有的集成和优化。
体系结构
*a)减少培训的等待时间:*当我与数据科学家交谈,问他们在我可以优化的培训中花费最多时间的是什么时,他们主要谈到了两件事— (i)将数据从云中的数据源移动到桌面进行开发需要很长时间,以及(ii)他们必须等待模型进行培训,然后才能尝试不同的超参数或捕获代码中的错误。密切关注这些痛点,你会意识到科学家在这些活动中被阻止应用他们的专业知识来实际解决问题。
在过去的几年里,ML 基础设施即服务已经走过了漫长的道路。云中的数据存储很便宜,可以直接插入运行在云上训练模型的机器中。最近,这些云提供商也开始在与您的数据相同的环境中提供 ide(例如 Jupyter 笔记本),允许您将代码从桌面移动到离数据存储更近的地方。除了邻近优势,在云中训练您的模型还提供了高性能计算(专门为深度学习设计的 GPU 或 ASICs)可用性的额外优势,这可以随着您的数据而扩展(得益于分布式学习技术的最新进展)。我强烈建议尝试这些方法,并围绕这些方法构建您的架构和工作流,以减少在上述工作中浪费的时间。
*b)分离用于推理的微服务和您的业务逻辑:*根据我过去几年在生产中部署多个模型的经验,构建用于部署的模型的最佳方式是在后端将推理从业务逻辑中分离出来。也就是说,我们需要一个微服务来接收模型的输入并预测输出,而逻辑用于从数据库转移数据,任何业务需求,如访问控制,将模型的输入和输出包装到用户体验中,等等。应该放在一个单独的微服务里面。当您可以访问专用于推理的硬件优化计算资源(例如,像 TPU 这样的 ASICs 等)时,这还允许仅推理微服务的可扩展性。).
构建模型推理微服务的一种方式是使用容器化(例如,创建自己的 Docker 容器,或者使用 TF-Serving、Seldon 等。)来为模型服务。然后,容器编排层可以负责根据计算或传入请求的数量自动扩展模型。如果在构建 ML 问题时,您已经决定将模型分解成几个部分,那么您可能想要创建多个推理微服务。确保您考虑了要在模型之间传输的数据量(例如图像),否则您的模型预测会受到网络限制。当然,如果您使用基于云的 MLaaS 服务,服务架构由该服务负责。
对于培训来说,将您的数据和培训代码迁移到云中是一个显而易见的选择,这样可以减少您的团队每天花费数小时在笔记本电脑和培训服务器之间移动数据的等待时间。为了部署推理模型,您应该将模型推理和业务逻辑分离到单独的微服务中,这样您就可以根据需要扩展推理。
构建模型的最佳实践
我还想分享一些构建模型的后续最佳实践。如果这变得有点技术性,我很抱歉,但是最好在我们讨论构建模型服务、它们的架构和集成的这一节中指出。
*a)同行评审和行业协会:*随着最近对深度学习的浓厚兴趣推动了对 ML 研究的强劲增长,最先进的最佳方法、算法和架构每年都会更新两次。如果您的解决方案没有考虑到快速变化的技术,那么它可能是次优的。在将代码提交到主分支之前,工程团队已经有了一个“拉式请求”审查过程。ML 团队应该采用类似的实践,将他们的代码检查到主要分支中,或者将冠军模型部署到产品中。
在工作场所发展强大团队的最近趋势是引入“行业协会”,其中在组织内具有核心能力(例如深度学习等)的团队中的从业者。).如果你有一个职能部门,可以把他们想象成某个职能部门内某个特定主题的“专家”(例如“医疗保健中的计算机视觉”等)。),在这里你可以从人们的兴趣、以前的工作经验和现在的技能中吸取经验。定期对 ML 解决方案进行同行评审是确保您拥有合适的运营支持的关键。请记住,好的想法应该获胜,而不是排名顺序。
*b)模型架构、超参数和数据版本化:*数据科学家经常根据他们的假设尝试不同的模型架构来为数据构建模型。他们还改变模型训练的超参数。数据科学家在构建模型时遇到的最大挫折之一是,当他们做出更改时,他们无法回到以前性能更好的超参数或模型架构。随着时间增长的训练数据也是如此。这里的一个好的实践是至少维护一个“冠军模型”,并使用一个类似“Github”的代码版本控制系统跟踪该模型的架构和超参数。最近的一些服务如 Weights&bias,MissingLink 等。我试图通过追踪以前版本的模型和数据来帮助科学家解决这个问题。
*c)自动化管道:*工程团队最近通过创建持续集成和持续交付(CI/CD)管道优化了构建和部署流程,确保快速可靠地将代码部署到生产环境中。ML 模型训练和部署需要类似的过程改进。至少,ML 模型部署过程需要编写脚本,这样,如果一个新的“竞争者”模型在测试数据的优化和满意指标上击败了“冠军”模型,那么该模型可以自动部署。例如,部署可能包括构建服务容器、将容器推送到容器存储库,以及将容器部署到托管实例。在训练方面,CI/CD 过程可以包括获取新数据、对其进行标记、使用自动化超参数选择来训练模型,然后将最佳性能模型存储在共享卷中以用于部署。
当您的团队构建模型并迭代时,这些最佳实践将确保您的模型更频繁、更可靠地部署到生产中。
由行业专家组成的“行会”进行同行评审,有助于确保你的方法是合理的、优化的,并跟上快速变化的技术。模型、超参数和数据版本化帮助您系统地提高模型性能。建立模型和数据 CI/CD 可确保您的模型更频繁、更可靠地部署到生产中。
综合
我还想简单介绍一些集成和优化。虽然这些项目的实施时间表可能会从短期到长期有所不同,但最好事先了解这些项目,以便知道您未来可能希望在哪些方面开展工程工作。
*a)服务集成:*像任何其他软件系统一样,您的前端通常会与您的后端(具有业务逻辑、数据库、身份验证等)进行对话。)然后你的后端会和你的模型对话。如果用户交互正在等待模型预测(例如我们的电子邮件文本预测),您的前端和后端之间的交互将是同步的(例如 HTTP/S)。然后,您的模型服务本身可以同步/异步地与后端集成。如果您的模型由 HTTP 端点提供服务(即同步),请确保您的后端服务器正在使用非阻塞 IO(因为预测时间可能会很长)。如果您希望您的前端直接访问模型(以防没有重要的业务逻辑),我建议使用像 Ambassador 这样的网关,它可以帮助您进行身份验证。最后,如果您的预测是离线的(即,没有等待预测的 UI),您可能想要考虑使用基于消息的架构(例如,消息队列、Kafka 等)来集成您的模型。).我将在下面的优化部分详细讨论这一点。
*b)工作流集成:*在上面的自动化管道部分,我们谈到了当新数据可用时,如何使用 CI/CD 来训练您的模型,以及当新的“冠军”可用时,如何自动部署您的模型。一个可能很重要的部分是整合您的数据注释步骤、数据清理、质量检查、A/B UX 测试等。然而,这些需要更复杂的设置,并且可能只有在启动生产后几个月才能实现(当然,除非您使用托管 ML 作为服务)。
c) HITL 备份——最近,我参观了旧金山市中心的亚马逊 Go 商店,对结账过程的便捷感到惊讶。也许我第一次去商店时,我的体验有点笨拙,因为我学会了“互动”,但我可以很容易地想象出结账是一个超级简单的过程,只要你去过商店几次,就可以带走午餐卷饼。需要注意的重要一点是,Amazon Go 似乎没有等待整个 ML 变得完美。事实上,他们成功地使用了一个人在回路的解决方案来纠正一个系统——无法决定我拿走了什么,把它发送给一个人类贴标机。
*d)性能优化:*对于真正高级的情况,一个有趣的架构优化是进行小批量预测,这是针对 GPU 进行优化的。因此,当您的前端与后端同步对话时,后端将预测请求放在一个消息队列中。模型服务成批地从队列中拉出,等待时间少至几十毫秒,批量大小为它一次可以处理的模型(例如,8 到 16 个图像等)。).它异步写回预测输出,然后后端可以为等待请求的前端服务。这种架构之所以有效,是因为 ML 推理代码针对批量进行了优化——使用 8 个图像的小批量进行预测比 8 个单独预测请求要快。另一个最后的优化可以是硬件优化(例如,使用 TPU、ASICs 或将浮点运算转换为固定整数运算等)。)
使用同步和异步消息传递平台的组合将您的模型与后端和前端服务集成,构建端到端的模型培训工作流,进行人在回路中的故障预防,以及性能优化,这些都是将您的模型与支持它的服务成功集成的技术。
步骤 5:快速迭代
最后,我不能重复这一点,你需要快速迭代。如果你经常和你的客户交谈,这应该是显而易见的。
这降低了您的项目风险,也有助于说服涉众对您的进展和您的解决方案的商业价值感到满意。理想情况下,在验证了一个“绿野仙踪”MVP 之后,你应该首先设定一个每月发布的节奏,然后遵循流行的 scrum 标准——每个 sprint 一次。超过这个时间,你就有可能让你的模型探索变得太“研究性”了。每次迭代,你都可以通过改进你的人工智能增强的 UX,扩展所提供的功能,提高模型性能,以及用更好的数据训练模型来取得进展。
更好的 UX
作为精益循环的一部分,您从客户那里获得的反馈对于确定您提供的价值主张和用户利益是否是用户所需要的非常有价值。任何验证或无效,对 UX 的任何更改,都会推动模型、数据等的下游更改。否则,您可能会花费大量的时间、金钱和资源来解决一个不再相关的问题。
更好的模型
模型训练本身就是一个迭代的过程。无监督、有监督和强化学习的每种技术都有多种算法,您的解决方案可能会从中受益。您的数据科学家或 ML 工程师应该优化培训管道,以便减少您的实验时间,并尽可能根据数据做出决策。模型版本化,在测试数据集上有一个基准度量,以便将新模型投入生产,为模型的代码建立一个 CI/CD,以及业务逻辑,这些都是重要的操作优化,使您可以轻松地在生产中逐步改进您的模型。有时,您可能希望重新审视您的 ML 问题框架—模型性能的一些最大改进可以通过改变您构建 ML 问题的方式来实现,或者如果在最先进的模型中有重大改进。
更好的数据
一旦你发布了你的产品,你可能会很快意识到客户使用你产品的方式与你最初的计划不同。用例的优先级可能会改变,输入数据本身可能会非常不同(数据漂移),或者您可能希望以不同于您最初计划的方式处理用例(例如,季节性、市场趋势等)。),或者输入和输出之间的关系可能改变(概念转变)。所有这些都需要您对模型的输入和输出进行定期检查——您可能希望使用生产中的使用数据来增量地训练您的模型。在对模型进行注释之后,您可能需要收集更多的数据,甚至对数据进行不同的标记。所有这些都要求您的数据管道不是为一次性的导出和导入而设置的,而是作为模型的连续“批处理”增量,这一点我们在上一步中已经简单地提到过。
通过快速迭代你的产品,快速验证/否定你的价值主张和特性,你可以确保不断地为你的用户提供利益,为你的利益相关者提供价值。
我希望这篇文章能引起你的共鸣,并让你在构建人工智能产品的正确方向上起步。如果您有任何问题或有任何反馈,请随时在评论中联系我们。
祝你的人工智能产品成功上市🍾 🥂 🎉 🥳
(更新:删除了对 2020 年的提及,因为该文章仍然相关)
这个系列是 Rahul Parundekar 为 AI Hero 写的。
Rahul 是一名人工智能专家,在设计和构建人工智能产品、工程、研究和领导方面拥有 11 年以上的经验,热衷于通过人工智能改善人类体验。
AI Hero 是一个无代码平台,可以帮助你的产品团队管理你的完整 AI 工作流——从构建 ML 问题,到培训、部署和优化你的模型——而不需要雇用数据科学团队。
数据科学家调试和错误解决基本指南
更快地解决错误,有更多时间进行创造性工作
调试是一个听起来很滑稽的词。这个词起源于最初的计算机时代,一个实际存在于计算机中的错误,它阻碍了计算机的功能。从那以后,它有了新的含义。现在,它意味着找到代码中问题的根源并解决它。
当您第一次开始编码时,调试代码或解决错误可能是最困难的事情之一。毕竟,教授如何编码的课程并没有为你提供找到问题根源并解决问题所需的工具。因此,当有抱负的数据科学家在代码中遇到问题时,他们会感到失落和困惑。
实际上一点也不复杂。您只需要确保遵循一些简单的程序来确定问题的根源。让我们看看它们是什么。
阅读错误
:我知道这听起来很明显,但是对于一个刚开始编程的人来说,把错误信息当成胡言乱语是很常见的。这导致他们没有利用这个错误消息的全部潜力,最终在试图找出问题时漫无目的地在代码中摸索。这就是为什么你应该做的第一件事,阅读,真正地阅读错误信息。很有可能,它会告诉你到底哪里出了问题。
让我们看一些例子:
在这种情况下,代码告诉我们,它找不到文件,因为它不存在。所以,我知道你的第一反应会是说,“不,文件在那里,我正在看”。不要慌张,重要的是理解这个信息意味着什么。不要担心,随着时间的推移,你会更好地认识到某些错误背后的含义,因为你会经常看到它们。
您的代码并没有说您是骗子,它只是说在您所说的位置找不到名为 iris-dataset.csv 的文件。这可能意味着:
- 您在文件名中输入了错误,或者
- 您的文件与笔记本不在同一个文件夹中。
因此,您可能需要:
- 确保名称书写正确(在本例中是 iris_dataset.csv,带有下划线而不是破折号),或者
- 添加该数据所在文件夹的名称。
另一个例子:
看起来很吓人,但是它告诉你的是在你的数据中没有这样一个名为“sepal_widt”的列。这可能意味着:
- 您忘记在数据框中包含所有需要的列,或者
- 你打错了。
我会在本文后面告诉你如何理解哪一种是这种情况。我选择了上面的两个例子,因为它们在数据科学工作中相当常见。但是阅读错误消息还有另一个技巧:跟踪错误。例如,在下面的例子中,我们得到一个 TypeError。
因此,TypeError 听起来非常抽象,但是我们可以通过回溯特性来跟踪错误,从而了解错误的原因。上面的箭头指向代码中导致这个错误的那一行。但是它并没有就此结束,因为它指向的错误发生在另一个函数内部。这段代码调用的函数。它用下面的箭头显示了函数内部出错的时间。这样,你就知道去哪里解决你的问题。
这里有一个小说明;此错误可能不是由回溯箭头指向的确切代码行引起的,而是由您在此代码的不同部分设置的值引起的。在本文中,我们将看到如何跟踪这一点。
谷歌一下这个错误,不管它看起来有多不寻常
当你第一次得到一个错误时,你可能会觉得你是地球上第一个得到这个错误的人。但是 99.999%的时候,除非你正在使用一个很少有人使用的框架或库,否则 Google 会给你一个答案。
你所要做的就是复制并粘贴你所看到的错误。例如,在前面的图像中,不要复制和粘贴整个消息,而只复制和粘贴“TypeError: 'list '对象不能被解释为整数”的部分。
这是我在谷歌上搜索这个错误时发现的。是的,这正是这段代码的问题所在。
谷歌错误有助于理解错误信息,有时也有助于找到解决方案。但是除了解决错误之外,通过阅读别人对这些错误的看法,你会学到很多东西。你编码得越多,得到的错误越多,修复得越多,你就越能理解他们通过阅读错误信息所表达的意思,最终你就越不需要咨询谷歌。
在 Jupyter 笔记本上,向后工作
在笔记本环境中工作意味着很容易运行部分代码并看到结果。我们不仅仅把我们的代码分成笔记本的不同单元,因为这很有趣。这是一种观察数据流并检查一切是否按预期顺利运行的方法。
因此,当您遇到错误时(或者一段代码没有输出您期望的结果),您的下一步应该是追溯问题。
我所做的是打印我在某个单元格中使用的变量/数据帧,并将它们与我期望看到的进行比较。这包括用 df.head()检查值或用 df.dtypes 检查列的类型。
让我们看一个例子。假设我有一个包含花的萼片长度和萼片宽度的数据框。我创建了一个新的列,取这两个值的平均值。但是当我绘制它们时,我看到平均列的值意外地不在 sepal_length 和 sepal_width 值之间。很明显,出问题了。
蓝色条:萼片长度,橙色条:萼片宽度,绿色条:萼片值的平均值。
蓝色条:萼片长度,橙色条:萼片宽度,绿色条:萼片值的平均值。
然后我要做的是打印出我在这个图中使用的数据框,看看数据是什么样子的。查看数据,我发现萼片平均值并不反映萼片长度和萼片宽度的平均值。很可能这个新列的计算有问题。
是的,检查新的 average 列的计算,我看到我将总和除以 3,而不是 2。
当然,问题并不总是这么明显。同样的问题可能是由于我在设置 sepal_average 列的值后意外地更改了它的值而引起的。但是通过从问题中回溯并检查我在哪里修改了有问题的列的值,总是可以帮助我找到问题的根源。
为更复杂的代码编写打印件
有时你的代码可能有函数、循环和其他复杂的结构,让你很难手动追踪错误。在这种情况下,一种解决方法是使用 print 命令。让我们看一个例子:
比方说,当您运行这段代码时,accumulated_list 值看起来并不像您预期的那样,或者这段代码中的某个部分给了您一个错误,而您不理解它。在这种情况下,您可以将打印命令放在发生某种值转换的特定位置,以查看哪里出错了。
有了新增加的内容,您可以打印代码正在处理的值。您将能够观察到该值随着时间的推移发生了什么变化,以及中间列表(new_list)是什么样子的。它将帮助您确定事情开始变得出乎意料的确切原因,或者在触发错误之前变量的值是正确的。因此,给你更多关于如何解决问题的见解。
就是这样,仅仅通过使用这四种简单的方法来检查你的错误,你就可以更有效地调试你的代码。正如我在另一篇文章中所说,如果你需要一些时间来解决问题,或者在你习惯处理错误之前需要一些时间,不要担心。通过动手实践,你在训练你的大脑,每次都能越来越快地发现模式和解决问题。就我个人而言,我发现在网上调试和寻找答案是我目前知识的主要来源。所以不要让错误和问题让你气馁,坚持下去!
🐼想更多地了解熊猫吗? 获取我的免费熊猫小抄。
基本机器学习项目清单
引导你一步一步地从原始数据到工作的 ML 模型。
TL;博士?点击此处获取我的清单副本,以便在你的下一个 ML 项目中使用。这个 Github 回购也包含一个。清单的 ipynb 模板和数据清理实验室,如果您想练习或了解如何使用模板,可提供解决方案。
为什么这很重要?
你是否曾经尝试过真正的 Kaggle 竞赛(或其他 ML 副业),并因为你仍在学习 ML、习惯 Python 库或对数据集的复杂性感到不知所措而感到失落?
我当然有——很多很多次。
当我从事数据分析或 ML 项目时,最糟糕的感觉之一是陷入前 3-5 个小时的无方向编码,感觉自己进展缓慢,担心自己做出错误的决定。
这就是为什么我创建了这个清单!它应该放在你的办公桌附近或几下鼠标之外作为参考,以帮助你看到全局。
当您处理数据集时,可能会遇到很多挑战和障碍,如果您不习惯,很容易感到不知所措。如果你开始感到迷失,用这个清单作为你的北极星。
这是终极目标吗? 绝对不是。
你能以不同的顺序做事吗? 是的,当然是。
这张清单对你有帮助吗?是的,如果你喜欢把结构和秩序带入你的问题中。
这篇博文是写给谁的?
这是为任何人写的,要么是刚刚开始使用 Python 进行机器学习的人,要么是需要复习 ML 工作流的人。
在这篇博文中,我将解释在清单的每个阶段你应该做什么。
在这个 Github Repo 中,我创建了一个练习。ipynb 和 a 解决方案。ipynb 基于一个简单的 Airbnb 机器学习项目。我将给出几个来自解决方案文件的代码示例。如果您想继续学习,请下载。
让我们开始吧。
先决条件:业务和数据理解
我能听到你的眼睛在我身上转动。
来吧,伙计。让我们进入编码部分。
如果你坚持跳过这一步,那就继续吧,但是正确地做这件事会节省你几个小时和头疼、 我保证 !
第一:业务部分。
假设你的经理阿曼达给了你一个 Airbnb 数据集。它有 106 个功能,她告诉你,我们想更好地了解租赁清单。
OK 。首先,她想让我把它们分类吗?她想让我做一个仪表板吗?她想让我回答什么问题?目标是什么?
弄清楚你的目标是什么,并试着计划实现目标的不同方法。
第二:数据部分。
有没有可以打印或保存的数据字典或模式?利用这一点。
花 1-2 个小时了解这 106 个特性中的每一个。写下你打算删除的功能,名字没有直观意义的功能,以及看起来需要大量清理的功能。
这是事件级的吗?一个列表可以有多行,每一行都有一个时间戳和一个事件。或者这是单元级的,每行唯一地标识一个可出租的单元?
在你开始编码之前,先熟悉你正在做的事情。
理解并回答这样的问题会帮助你开始朝着正确的方向前进。就像踏入迷宫前先看地图一样。
I .导入数据和库
将所有的导入放在分析的顶部是一个很好的做法。每当你需要一个还没有导入的库或函数时,回到顶部,在那里导入它。
现在导入数据集,如果您必须连接它们,请尝试等到完成探索性数据分析(EDA)后再进行连接。
二。探索性数据分析
由于篇幅较长,本节分为 5 小节。
你知道人们怎么说数据科学家花费高达 80%-90%的时间清理数据吗?对,那主要是因为这部分。
一定要慢慢来。这里要彻底。一旦你完成了这一部分,你就已经完成了 ML 算法的一半。
A.检查重复项
请花点时间删除完全重复的行或调查数据集中的冲突 id。这很容易忘记,但这是你应该永远走的一步。
B.分离您的数据类型
清点您的数据类型。通常,您可能会遇到 6 种数据类型,按频率降序排列。
- 数字(可以是离散的或连续的)
- 分类(序数、名词性和二进制)
- 日期/时间
- 文本
- 图像
- 声音
首先将数据分成数字数据类型和其他类型。这可以通过以下方式实现:
先浏览一下你的数字数据。最常见的情况是,这里唯一的问题是缺少值(我们将在后面处理)。
现在,看看你的分类数据。可能会有很多问题需要你去解决。其中一些是…
- 数字数据、二进制数据和日期/时间数据被输入为字符串
- 多个值被打包到一个要素中
- 功能的命名可能不正确
- 你认为听起来有用的功能似乎毫无意义
不要一看到问题就开始清理。我们不要操之过急。
把你现在能看到的问题列一个待办清单。你可能不会发现所有的问题,所以如果以后又有新的清洁问题出现,就把它加到这个列表中。
在我的练习笔记本里(如下图),在我开始打扫之前,我花了一些时间写下这些。
Jupyter 笔记本截图。
C.初始数据清理
注意: 如果你把“填补缺失值”加到了你的清理待办事项中,现在就把它去掉吧。先别做。我将在后面的步骤中解释原因。
一旦你有了一个全面的清洁待办事项清单,一次完成一个。下面是一个例子,说明我是如何解包一个具有多个值的特性的。
打包功能。
一旦你完成了清洁待办事项清单,是时候想象一下了。
D.想象和理解
请注意,你在这一节中找到的事情能够并且将会发现你想要添加到清洁待办事项列表中的事情。
如果您确定了想要应用于数据的任何异常值或转换,您现在可以应用它,但是最好在您将数据分成训练和测试之后再做。
如果需要,可以用直方图、分布图或条形图检查数据的分布情况。也许探索特征之间的关系。
使用这一部分,看看您能否回答最初向您提出的业务问题。你还不能执行任何机器学习,但并不是所有的问题首先都需要机器学习。
利用像 Matplotlib 或 Seaborn 这样的数据库。也许可以使用散景或 Plotly 探索交互式可视化。世界是你的。
这里有一个例子,说明我是如何试图理解评论的新近性和 Airbnb 房源的定价之间是否存在某种关系的。
E.评估缺失值
在我们离开 EDA 之前,我们必须解决另一个问题:缺少值。除非你使用像 XGboost 这样的高级算法,否则你必须处理丢失的值,这样你的数据才是 ML 友好的。
简单地说,你有两个选择:删除或估算(又名填充)。
在这一部分中,如果你认为合适的话,删除缺失的值,然后制定策略来填充它们,但不要估算它们。
一般来说,将缺失值的插补视为您想要调整的另一个超参数是一种很好的做法。因此,在对数据进行训练/测试分割后,您需要运行插补策略。如果您愿意,也可以用同样的方式处理缺失值的删除(即,在训练/测试分割后删除缺失值)。
这样,当您在验证集上测试整个机器学习工作流时,您还可以看到更改插补或移除策略如何影响工作流的性能。
让我们回顾一下我们的选择:
1.移除它们
- 特定特征中是否有许多缺失值?选择一个阈值(比如说 70%),如果你觉得这些特性没有价值,就去掉它们。
- 特定行中是否有许多缺失值?首先,调查它们可能丢失的原因,以防您能想到行丢失值的合理解释。如果你觉得它们没有价值,扔掉它们。
- 哪些行缺少您要预测的目标要素?监督学习方法需要一个标签,所以删除不包含目标变量的行。
红色的特征可能应该被移除。
2。估算它们(现在制定策略,以后估算)
- 根据你的知识从其他特征推断它们的值
- 数值?用平均值或中值填充很简单。
- 绝对的?填写最频繁的。
- 想要挑战吗?研究使用机器学习来预测你丢失的价值观。Scikit-learn 的迭代输入器很有意思。
对于您使用的每个策略,记下您希望每个策略应用于哪些功能。这使得分割数据后的插补更加容易。
太棒了,现在我们完成了项目的 EDA 部分。
三。训练/测试分割
通常将 80%-90%的数据用于训练/验证,而将剩余的数据用于测试(取决于你有多少数据)。
如果您想要使用交叉验证或 K-Fold 交叉验证,请在以后选择模型或调整模型时将验证数据与训练数据分开。
从现在开始,你所做的一切都可以被评估和调整。调整并不仅限于模型超参数。
四。准备 ML
既然您已经将数据分成了训练和测试,我们需要将数据转换成 ML 友好的格式。这一部分分为 4 个部分,在它结束时,你已经为机器学习做好了准备。
A.处理缺失数据
现在,我们执行插补策略,确保您的训练和测试数据中不再有缺失值。
提示:使用 scikit-learn 的 SimpleImputer()或其他估计器来填充您缺少的值。使用这些估算器/变形器可以让您将它们适合您的训练 数据 然后 使用它们将 变换 您的 训练和测试数据 。
这里有一个用零填充一组特征的例子…
请注意,在实践中,我们可以一次估算整组特征。在练习 .ipynb 中,为了简单起见,一次只针对一个特性。
B.特征工程
一旦您处理好了所有丢失的值,就可以利用这一部分来设计更多您认为对您的 ML 模型有用的特性。
同样,把它当作一个您可能决定要调整的超参数。
与广泛的模型超参数调整相比,特征工程有时更能改善模型。
这里有一个简单的例子:
请注意,每当您设计自己的特征时(特别是,如果您执行除法或对数运算),您就有可能创建无效的无穷大值或 NA 值。
C.转换数据
一旦您对所拥有的特性感到满意,现在您必须调整/缩放/转换您的数字变量,或者将您的所有分类或文本特性转换为数字。
让我们一次看一个:
数值数据
如果您有非常倾斜的数据,对数变换或平方变换可能是一个好主意,使您的数据看起来更正态分布。
清理费的对数变换。
如果您怀疑离群值对模型的性能有负面影响,现在就删除离群值。
并非所有的 ML 算法都要求特征在相同的尺度上,但有些算法要求(线性回归、神经网络、K-Means 聚类等)。).如果你是这种情况,你必须缩放你的功能。一些选项包括标准化、规范化和最小-最大缩放。
分类数据
通常有三种类型的分类数据,下面是您如何处理每一种数据:
- 名义上的(如红色、绿色、蓝色):类别没有固有的顺序。我们可以使用 sklearn 的 MultiLabelBinarizer(如果值被压缩到一个特性中)或 OneHotEncoder(如果特定特性的每一行只有一个类别)这样的转换器对这些特性进行热编码。
- 序数(例如,低、中、高):通过将这些特征编码为序数(例如,1、2、3),尝试保持数据中的自然顺序。你可以自己创建一个自定义转换器来将这些值映射到一个期望的数字,或者使用 sklearn 的 OrdinalEncoder。
- 二进制:如果你还没有处理过你的二进制特征,使用 sklearn 转换器,比如 LabelBinarizer 或者 MultiLabelBinarizer,将它们编码为 0 或者 1。
文本数据
无需深入自然语言处理领域,在处理文本数据时,通常可以采取以下基本步骤:
- 使用 nltk 的 word_tokenize 或 sentence_tokenize 对文本进行标记。将文本数据标记化就是将单词、表情符号等分解成它们自己的单独的字符串/对象,而不是一个大字符串。
- 使用 nltk 的停用词语料库移除停用词。
- 词干或词汇化你的词汇。词干是指去掉对单词没有太大意义的字母(例如,“-ing”、“ed”等)。).词汇化完成了词干提取,但是计算量更大。
- 将令牌转换为包含令牌计数或令牌的 TF-IDF 值的矩阵。
D.特征选择
最后,现在是我们执行一些降维的时候了。
这不仅可以提高模型的预测性能,还可以减少计算时间。
以下是一些想法:
- 方差阈值:忽略方差低的特征,因为方差高的特征通常包含模型的大部分信息。
- 移除高度相关的特征:识别具有高度相关的成对特征,并移除其中之一。
- 类别特征无关性?使用卡方测试删除与目标特性不相关/无关的特性。
- 数字特征无关性?使用ANOVA F-statistics来确定可能与目标特征无关的特征。
- 递归消除特征
以下是移除高相关性要素的示例:
一旦你完成了特征选择,我们就正式准备好机器学习了!
接下来的部分很简短,因为它们只描述了数据准备充分后要采取的基本步骤。
动词 (verb 的缩写)挑选你的模特
根据您的问题,选择您认为有效的适当模型。
图信用:此处
不及物动词型号选择
一旦你选择了一些候选模型,使用 K-Fold 交叉验证等方法来确定 2-3 个最有希望的模型!
七。模型调整
使用标准技术,如网格搜索或随机搜索,以确定性能最佳的超参数。
如果你准备好了,探索像 hyperopt 这样的库,它们利用贝叶斯统计来调整你的模型。这基本上是一种“智能”随机搜索,也就是一种“更快”的网格搜索。
八。挑选最好的模型
展开,就大功告成了!
总结想法
注意这篇博文是如何 90%的数据清洗、探索和预处理,但只有 10%的机器学习。
当你开始一个机器学习项目时,可能会觉得需要永远才能达到一个简单的工作模型。尝试不同的模型、了解高级超参数调整等非常有趣。但是在你到达那个点之前,在数据集里磨来磨去会感觉灵魂枯竭。
清洁和预处理并没有被浪漫化为十年来最性感的技能。然而,我希望这已经向你展示了当你不得不这样做的时候,保持有条理和从容不迫是多么的重要和复杂。
如果你已经写了这么多博文,感谢你的阅读!我希望你喜欢这个并从中有所收获。
请记得查看此处的清单或 GitHub repo 中的练习实验室、解决方案文件和清单附件。ipynb 模板。
大多数数据科学课程不会教给你的基本技能
…以及如何学习它们
在 Unsplash 上由 Lacie Slezak 拍摄的照片
如果你曾经在数据科学领域寻找工作,你可能会注意到,几乎所有的工作都需要有数据科学家工作经验的人。
因此,新人很难进入这个领域,也很难找到第一份工作。
大多数公司想要一名有经验的数据科学家而不是一名新合格的候选人的原因是,在商业环境中提供数据科学解决方案需要许多极其重要的技能,而大多数数据科学课程、训练营和学位课程都不会教你这些技能。
在本文中,我将介绍通过数据科学实现商业价值所需的三项重要技能,以及如何获得这些技能。
1.软件工程
几年前,当查看数据科学家的招聘广告时,技能通常主要集中在拥有数学和/或统计学背景上。博士学位或至少硕士学位通常被列为一项要求。
如今,所需技能更多地转向编程和软件工程技能,如 Python、Github 和 SQL 知识。现在很少看到数据科学招聘广告中把博士学位列为基本要求。
这背后的原因主要有两个:
- 企业已经意识到,不管模型的质量如何,也不管开发过程的复杂程度如何。如果您不能将模型部署到业务的运营部分,如网站,那么该模型实际上是无用的。
- 与此同时,机器学习包、平台和工具变得越来越容易获得,实施这些工具的门槛已经大大降低。这一点,加上 autoML 工具越来越多的可用性,意味着您不再需要深入的机器学习技术理论知识来开发模型。现在的挑战实际上是将这些模型引入生产环境,并将它们连接到前端系统。
数据科学家现在通常被期望能够编写生产质量的代码,或者这样他们可以独立于其他团队部署模型,或者至少这样部署模型的软件工程师可以很好地阅读、使用和解释代码。
那么,你如何获得这些软件工程技能:
- 参加一些软件工程课程/阅读数据科学书籍。上周,我发表了 5 本我最喜欢的 Python 编程书籍,它们很好地涵盖了一般编程的最佳实践。
- 构建一个实用的附带项目,涵盖整个模型开发过程——从数据编排到模型开发,再到模型部署。请确保您的代码结构良好,包括测试,并遵循一般的软件工程最佳实践。
- 为开源项目做贡献(或者阅读贡献指南并在自己的项目中实现)。开源软件包必须遵循严格的软件工程实践,这样许多人才能安全地维护和添加到同一个项目中。参与这些项目(通常有黑客马拉松为新手提供支持)可以帮助你获得软件开发的实际经验。或者阅读一些库的文档,Scikit-learn 的非常好,可以帮助你理解这些技术在实践中是如何使用的。
2.沟通
最近我看到越来越多的人使用一个短语,即**“数据科学不是产品”**。这意味着,数据科学家构建的机器学习模型并不是最终产品。机器学习模型的价值在于它在解决业务问题的现有业务系统或产品中的部署。
数据科学不是产品
从数据收集一直到在产品中使用模型的过程不能由数据科学家独立完成。数据科学家需要处理:
- 项目干系人如产品经理和总监,将他们的业务问题转化为数据问题,随后,以非技术人员能够理解的方式将数据解决方案传达给他们。
- 数据工程师他们将确保数据科学家构建模型所需的数据被准确收集、转换并在正确的位置可用。
- 软件工程师将现有系统或产品与机器学习模型连接起来的人。数据科学家需要确保他们清楚地传达了哪些数据需要输入到模型中,以及任何需要到位的限制和安全网。
因此,数据科学家需要成为优秀的沟通者,因为如果没有在正确的时间以正确的方式传达或解释正确的信息,项目将面临巨大的风险。
要发展沟通技巧,全靠练习。如果您正在学习数据科学,有很多机会可以练习这些技能,同时增强您的学习过程。因为向某人解释你所学到的新概念是被称为 费曼技巧 的最受认可的学习技巧之一。
“想学好一件事,就去解释!”,理查德·费曼
有很多方法可以通过学习磨练你的沟通技巧:
- 主动为比你处于学习阶段更早的人提供辅导。
- 找机会谈谈你学到的东西。尽管目前大多数国家对大型聚会有限制,但仍有许多在线会议和聚会在进行。
- 写教程、博客帖子、书评或项目综述。你可以把这些放在你自己的网站上或者写在这里。
3.商业头脑
你会经常看到领域知识被列为数据科学家需要的技能。现实情况是,数据科学可以应用于如此多的不同领域,以至于在开始某个特定领域的工作之前很难获得知识。
然而,一项可以磨练的技能是商业头脑。
在过去的几年里,数据科学领域见证了公民数据科学家的崛起。在特定业务领域工作的非数据科学家,他们使用新的、更易访问的数据科学工具来应用数据科学解决其领域中的问题。
公民数据科学家兴起的原因是,在特定领域工作的人,例如营销部门,将最了解存在的问题,这些问题已经成熟,可以通过应用机器学习来解决。
“世界是一个大数据问题。”安德鲁·迈克菲
因此,数据科学家必须很好地理解业务流程和业务运营的基本原理,因为这将确保他们能够利用数据交付价值和解决业务问题。
那么,你如何获得这些商业知识:
- 通过文章或短期课程,至少学习一点商业领域的知识,尤其是在数字领域。例如,了解一些现代数字营销(PPC、电子邮件、展示和 SEO)以及存在的问题和潜在的优化是一个好主意。
- 如果你目前在一家企业工作,试着花时间在其他领域,并不时与其他团队坐在一起,了解他们的具体领域。如果你不在企业工作,那就自己创造机会,实际了解业务流程。例如,我经营一份定期的电子邮件简讯,这帮助我了解了一些电子邮件营销中存在的挑战。
可以通过在线课程、训练营和学位课程学习数据科学的理论和实践元素。然而,与开发数据科学项目来解决实际业务问题相比,在教育环境中开发项目和模型有着本质的区别。本文中列出的其他技能将帮助您理解这些挑战,并获得成为真正有用的数据科学家所需的技能。
感谢阅读!
我每月都会发一份简讯,如果你想加入,请点击此链接注册。期待成为您学习旅程的一部分!
正则表达式的要点
它们是什么,你应该知道的特殊角色和帮助你建立它们的资源
它看起来有点像 Gobbly-glook,不是吗?来源:https://regex101.com/
不可避免地,一个人可以进入软件工程的各种方式导致我们许多人学习(在这种情况下不是学习)各种不同的概念。也许软件工程师能够理解和利用的最有用的概念之一是正则表达式。你可能之前遇到过它们,已经被你面前看到的字符完全迷惑了,或者你已经使用过它们,想要获得更全面的了解。本文旨在定义什么是正则表达式,正则表达式的基础以及如何使用它们,并为测试正则表达式和进一步学习提供有用的资源。
定义正则表达式
正则表达式(或简称为 regex)允许我们定义和设置规则来检查一个文本字符串中是否存在某个字符模式。正则表达式帮助我们匹配、定位和管理文本,提供了一种快速且相对简单的方法来操作数据,尤其是在大型复杂程序中。
正则表达式:用于检查文本字符串中模式存在与否的字符序列或模式
让我们以电子邮件地址为例。当你注册 Medium.com 时,你需要提供一个电子邮件和密码。在幕后,Medium.com 应该(你永远不知道)使用正则表达式来验证电子邮件地址的格式是有效的,或者密码是有效的。通常情况下,它会显示一条烦人的小消息,上面写着:“您的密码不包含下列特殊字符之一:?,!,.、“、'等。”.举个简单的例子,我们可以使用下面的正则表达式来过滤以“@gmail.com”结尾的文本字符串中的电子邮件:
(@gmail。*.com$)
实际上,这可能不是正则表达式的实际用途,但它展示了正则表达式测试字符串匹配特定字符的能力,在本例中,文本字符串以“@gmail.com”结尾。
正则表达式基础
正则表达式是由字母和字符组合而成的。简单来说,如果你想测试单词“苹果”或“梨”,你只需输入:
r" appler" pear
第一个测试中包含单词“apple”的字符串或第二个测试中包含单词“pear”的字符串都可以通过。从这个意义上说,大多数字母和字符都是匹配的,但是有些字符和特殊字符在正则表达式中有特定的含义,下面列出了这些字符,并将进一步详细讨论:
- 元字符
- 特殊序列
- 转义序列
- 字符类别
- 事件指示器
- 定位锚
我们还将讨论正则表达式中贪婪与非贪婪匹配的概念。这看起来确实涵盖了很多内容,但是不要担心,因为在本文的底部有一个摘要,其中包括关键的定义,以及各种帮助您创建和记住正则表达式的资源。
元字符
元字符是正则表达式中具有特殊含义的字符。下表显示了一些常见的正则表达式元字符以及每个元字符的定义:
**Metacharacter** | **Description**. Finds any single character
^ Start of string
$ End of string
* Matches zero or more times
+ Matches one or more times
? Matches either 0 or 1times
{} Matches all inside a set amount of times
[] Specifies a set of characters to match
\ Escapes metacharacters to match them in patterns
| Specifies either a or b (a|b)
() Captures all enclosed
为了帮助您进一步理解每个元字符本身,下面是每个元字符的实例
.**Regular Expression**
r” .**Test String**
word
在本例中,元字符“.”将匹配测试字符串中的任何字符。因此,测试字符串“word”在所有情况下都会通过。
^**Regular Expression**
r” ^word**Test String**
word
元字符“^”匹配字符串的开头,不消耗任何字符。这意味着正则表达式在测试字符串的开头测试“word”。如果我们将测试字符串改为“aword”而不是“word ”,那么测试字符串将不匹配正则表达式,因为“word”不在字符串的开头。
$**Regular Expression**
r” word$**Test String**
word
在本例中,元字符测试测试字符串末尾的“word”。与上面相反,如果我们将测试字符串更改为“aword ”,那么测试字符串将会通过,因为“word”在字符串的末尾。
+**Regular Expression**
r” a+**Test String**
aa
当元字符“+”测试一个或多个连续字符时,测试字符串“aa”将通过,因为正则表达式已经识别了两个“a”字符。
?**Regular Expression**
r” ba?**Test String**
ba b a
元字符“?”将测试一个字符一次或多次。在这个上下文中,正则表达式测试字符“ba”或更多次,而不是字符“a”本身。在文本字符串“ba”中,当它与“ba?但是“b”也会通过,因为正则表达式测试的是后面没有特殊字符的字符“b”。
[]**Regular Expression**
r” [abc]**Test String**
aa bb ccc
方括号元字符也称为字符类,用于测试括号中的一组字符。因此,测试字符串将完全通过,因为“a”、“b”和“c”都被指定为方括号内的字符。
\**Regular Expression**
r” \Ahello**Test String**
hello
反斜杠元字符将在后面更详细地讨论,但它本质上表示一个特殊的序列。在本例中,“\A”指定了一行的开始,因此“hello”将通过测试。
|**Regular Expression**
r” a|b**Test String**
a hello b
“|”正则表达式表示或,该正则表达式指定字符“a”或“b”。因此,测试字符串将匹配测试字符串中的“a”和“b ”,但不匹配单词“hello”或空格字符。
{}**Regular Expression**
r” a{3}**Test String**
aaa
花括号元字符指定一个字符出现的次数。在这个例子中,正则表达式寻找测试字符串提供的 3 个连续“a”字符的模式。
(…)**Regular Expression**
r” (abc)**Test String**
a b abc
这与括号中的正则表达式相匹配,从字面上表示一个组的开始和结束。本例中的测试字符串不会匹配字符“a”或字符“b ”,但会匹配字符“abc”。
特殊序列
一个特殊的序列是反斜杠 ‘’ ,后跟下面列表中的一个字符,每个字符在正则表达式中都有特殊的含义:
**Special Sequences** | **Description**\A Matches character at beginning of string\b Matches character at beginning or end\B Matches character NOT at start or end\w Matches any word character\W Matches any non-word character\d Matches any digit, ie. 0-9\D Matches any non-digit character\s Matches any whitespace character\S Matches any non-whitespace character\0 Matches any NULL character \n Matches any new line character\f Matches any form-feed character\t Matches any tab character\v Matches newlines and vertical tabs\Z Matches specified character at end of a string
转义序列
转义序列用于匹配正则表达式中的特殊字符。这意味着我们可以使用带有前缀“\”的特殊字符。比如说;
**Escape Sequence** | **Description**\. Matches “.”
\+ Matches “+”
\( Matches “(“
字符类别
字符类在正则表达式中指定要在方括号之间匹配的字符。它们允许我们在一个文本字符串中找到一系列字符。以下是一些常见的括号以及允许我们在正则表达式中指定的内容的描述:
**Brackets** | **Description**[abc] Finds any character within the brackets[^abc] Finds any character NOT within the brackets[a-z] Matches any characters between a and z[^a-z] Matches any character excpet those in range a-z[a-\A-Z] Matches any character in range a-z or A-Z[0-9] Finds a digit within the brackets[^0-9] Finds a digit NOT within the brackets[(] Matches the literal '('
例如,如果您想要匹配“a”或“e”,请使用[ae]。如果我们将世界指定为“hello ”,那么“hello”或“hello”将匹配。字符类是正则表达式的一种非常常见的用法,在本文开头使用的电子邮件示例中,我们可以测试用户意外输入“@gmeil.com”而不是“@gmail.com”的情况。
出现指示符(或重复运算符)
上面提到的一些元字符也属于出现指示符的范畴。这些本质上是元字符,它们匹配字符串中一个字符、字符组或字符类的多个实例。一个正则表达式中允许有多个出现指示符。这些指标列举如下:
**Occurrence Indicators** | **Description**+ Matches one or more times? Matches zero or one time* Matches zero or more times{n} Matches exactly *n* number of times{n,} Matches at least *n* number of times{n,m} Matches from *n* to *m* times{,n} Matches up to *n* times
定位锚
锚点不匹配任何字符,而是匹配一个位置,通常在字符之前、之后或之间。
**Anchors** | **Description**^ Start of string$ End of string\A Start of string\Z End of string\b Matches between start/end of a word \B Inverse (non-start or non-end of a word)
贪婪 vs 非贪婪匹配
默认情况下,重复是贪婪操作符,意味着首先匹配尽可能多的字符。这意味着如果您测试了以下正则表达式:
**Regular Expression** {START}.*{END}
**Test String** {START} Hello world 2{END} and {START} hello world 2{END}
正则表达式将返回一个完全匹配:
**Full Match**: {START} Hello world 2{END} and {START} hello world 2{END}
然而,我们可以通过添加一个额外的“?”来解决这个问题经过重新分配,经营者限制其贪婪。现在,当我们用相同的测试字符串测试下面的正则表达式时,我们实际上返回了两个匹配。
**Regular Expression** {START}.*?{END}
**Test String** {START} Hello world 1{END} and {START} hello world 2{END}**Match 1**: {START} Hello world 1{END}
**Match 2**: {START} Hello world 2{END}
既然我们已经完成了正则表达式和所使用的不同元字符的 whistlestop 之旅,接下来要做的事情就是练习。下面是一些资源,希望能帮助你创建和测试你的正则表达式。
资源
正则表达式测试器
有各种各样的资源可以用来测试正则表达式,我在下面列出了其中的一些。它们对于快速编写和验证正则表达式非常有用,但是您应该通过将正则表达式合并到正在构建的解决方案的测试中来对表达式本身做进一步的测试。
- regex 101—https://regex101.com/r/22QfRq/2
RegEx101
也许是我最喜欢的正则表达式编辑器,RegEx 提供了一个干净易用的用户界面。在左侧,您可以指定表达式将使用的语言,在中间,您可以构建和测试表达式,在右侧,您可以参考快速参考手册。
- https://regexr.com/
regexr.com
regexr 对于 JavaScript 和 PCRE 正则表达式非常有用,它提供了一个简单的用户界面,左边是一个参考指南,右边允许您测试表达式。这个编辑器有些局限性,因为它只能测试 JavaScript 和 PCRE。
- https://www.regextester.com/
regextester.com
另一个有用的编辑器 regextester 允许你编写和保存正则表达式,也可以点击有用的超链接来显示普通正则表达式的例子。
归根结底,选择正则表达式编辑器很可能取决于个人偏好。我最喜欢的是 regex101,这绝不是一个详尽的编辑器列表,所以值得一看。
正则表达式文档
同样,对于正则表达式测试器,也有各种参考指南可以帮助您构造正则表达式。
- 微软—https://docs . Microsoft . com/en-us/dot net/standard/base-types/regular-expression-language-quick-reference
- w3Schools(Python)——https://www.w3schools.com/python/python_regex.asp
- w3Schools(JavaScript)——https://www.w3schools.com/jsref/jsref_obj_regexp.asp
- Python 正则表达式备忘单—https://www.debuggex.com/cheatsheet/regex/python
- JavaScript Regex cheat sheet—https://www.debuggex.com/cheatsheet/regex/javascript
- Regex 备忘单—https://www.debuggex.com/cheatsheet/regex/PCRE
摘要
概观
- 正则表达式是描述正则表达式引擎试图匹配的字符模式的文本字符串
- 正则表达式允许我们检测、提取、替换和匹配字符串,以便从文本中提取关键信息
- 有各种各样的正则表达式参考指南和在线编辑器可供使用,它们允许您在将正则表达式合并到您的解决方案之前对其进行测试
特殊字符:
- 元字符:具有特殊含义的字符
- 特殊序列:反斜杠“\”后跟一个特定字符
- 转义序列:用于匹配正则表达式中的特殊字符
- 字符类:在方括号内指定要匹配的字符
- 出现指示符:匹配一个字符的多个实例的元字符
- 定位符:匹配一个位置,通常在字符之前、之后或之间。
如果你已经花时间阅读这篇文章,那么感谢你这样做。希望这对您有所帮助,参考资料部分可以指导您进一步的学习。
爱沙尼亚危机引发全球黑客马拉松
爱沙尼亚拉开了即将举行的全球黑客马拉松的序幕,这场对抗电晕危机的马拉松有超过 100 万人参加
图片来源:pexels.com
黑客、生活黑客、数据科学家、产品开发人员、应用工程师等将在即将到来的最大的在线全球黑客马拉松中联合起来。
世界陷入了前所未有的疫情危机。近一半的人类被封锁——身体活动受阻,边境关闭,学校封锁,整个行业基本关闭,一个又一个国家的医疗保健系统已经不堪重负,处于危急状态的病人数量呈指数级增长。但是我们在线无国界。那么,在这种情况下你会怎么做呢?当然,爱沙尼亚的方式是建立一个超过 1 00 万人的全球黑客马拉松。
全球黑客大会将于 4 月 9 日至 12 日举行,黑客马拉松的目标是改变我们所知道的世界,越多的人参与其中,整个全球社区的利益就越大。
由于疫情,周围发生了很多事情,我不会用另一个悲伤的统计数据摘要来加重你的负担,你可以从许多不同的来源获得更新。我想概述的是爱沙尼亚电晕危机前奏的某些线索——这是一个关于爱沙尼亚如何从一个 20 年前人们甚至不知道“初创企业”这个词是什么意思的国家变成欧洲人均初创企业最多的国家的故事,现在引发了一系列事件,仅在过去几周内,就导致了 40 多个国家的本地黑客马拉松,已经有超过 10 万人参与,并旨在在 4 月份超过 100 万人的全球黑客活动中达到高潮。
历史的开端
20 年前,从字面上看,爱沙尼亚很少有人知道“创业”这个词的存在。想想这个:爱沙尼亚的总人口是 130 万。无法确定准确的跟踪记录,但据估计,2006 年爱沙尼亚总共只有 5 笔创业投资,这些交易筹集的资本总额估计约为 570 万欧元。到 2019 年,同样的数字已经增长到每年约 3 亿欧元和 74 笔交易。
整个数字历史看起来是这样的:
来源:“资助,失败&爱沙尼亚科技创业公司的退出 2006–2019 # EstonianMafia”,由马丁·维利格(Bolt)和爱沙尼亚创业领袖俱乐部提供和策划的数据集
引发公众对创业公司认识的最引人注目的事件是 Skype 的出现,该公司由瑞典人、丹麦人和爱沙尼亚人共同创立,其工程团队位于爱沙尼亚塔林。特别有趣的是,当爱沙尼亚还没有任何显著的创业文化时,我们突然…繁荣!…我家后院有只独角兽。
对于那些不记得的人来说,Skype 最初的品牌是“Kazaa 作者开发的 P2P VoIP 客户端”。P2P 文件共享平台 Kazaa 本身就是一个很酷的故事。如果你感兴趣,你可以从维基百科的文章中阅读一些关于它的历史记录,例如,如果你感兴趣的话,但这里足以说明 Kazaa 设法产生了相当多的模糊信息,所以当它的作者开始使用 Skype 时,它立即成为一个曲棍球棒式的增长,因为早期采用者当时的公众看法是,如果它是由 Kazaa 的创造者完成的,它一定是好的。
从多个方面来看,Skype 似乎是一个疯狂的意外。在一个没有任何创业文化的国家,它不仅仅是一只突然冒出来的独角兽,而且它的独角兽退出速度极快 Skype 从 2003 年成立到 2005 年 9 月以 41 亿美元退出易贝只用了两年时间。又过了 6 年被微软以 85 亿美元收购。从 2005 年 1 月到 2007 年 11 月,在易贝收购 Skype 期间,我个人在 Skype 工作,最初是一名后端开发人员,建立了一个机器学习管道来对抗信用卡欺诈,后来在我离开去追逐其他挑战之前,建立了一个从 0 到大约 40 人的 Skype for Mobile 工程团队。
这种对创业公司一无所知的经历对年轻的科技社区产生了巨大的影响。在硅谷,每隔一周就有大宗交易发生,但爱沙尼亚仍对极权共产主义苏联政权的历史记忆犹新(当时刚刚在 15 年前重获独立),薪资水平仍很低,远低于任何合理的西方标准。收购易贝 Skype 的那一刻,对 Skype 早期员工来说,股票期权像钱一样按季度分配,突然开始下雨了。Skype 和这些事件的整个故事在爱沙尼亚公共媒体上被广泛关注,对创业公司作为一个概念的认识总体上得到了强烈的推动。
前进的基础
Skype 退出后,紧接着发生了几件事,推动了这个即将成为初创国家的车轮。首先,爱沙尼亚的 Skype 联合创始人成立了一个名为环境声音投资(ASI)的投资工具,开始在爱沙尼亚及其周边地区进行天使投资。我个人碰巧为他们的投资渠道的技术尽职调查过程提供建议,还领导了一个在他们的孵化器类型的实验中构思的创业项目。由于这些参与,我看到了另一个重要的关键事件的发生。也就是说,ASI 的人们为其投资组合的公司建立了一个每周的早间咖啡活动,面对面地聚在一起,交流经验,培训推销,获得反馈等。在某种程度上,这种俱乐部式的聚会扩展到了 ASI 投资组合公司之外,于是成立了爱沙尼亚创业领袖俱乐部。
在那之后没多久,一些来自创业领袖俱乐部的最活跃的人成立了另一个运动,叫做garages 48,这是一个独立的 48 小时黑客马拉松系列。这发生在 2010 年初第一次举办黑客马拉松的时候。我个人不仅参与了活动的组织,还作为一个参赛团队的一员(在最初的 20 个小时里已经设法创造了实际收入)。后来,越来越多的事件被创造出来,这个系列已经成为一个巨大的成功,其形式被出口到许多不同的国家,甚至远至非洲。你可以在这里看到从举办的所有赛事的历史。
最初,当我们开始这个系列时,我们的期望很低,因为我们不一定期望真正的创业公司会从这些黑客马拉松中出现。整个想法更像是把人们聚集在一起,创造完成事情的经验和态度,让志同道合的人找到彼此,也许在事件和经验之后共同发现一些真实的东西。然而,时不时会有真正的创业公司作为额外的奖励出现,其中也有一些非常酷的故事。例如,一个名为 MSQRD 的项目是 2015 年明斯克(白俄罗斯首都)活动的获胜者,仅 3 个月后就被脸书收购,交易规模估计为 4000 万美元。
#EstonianMaffia
从早期开始,这个国家就一直在输送优秀的团队。以 2011 年 9 月 SeedCamp 介绍日为例,20 支决赛队伍中有 4 支爱沙尼亚强队。当时来自 500 Startups Accelerator 的戴夫·麦克卢尔(Dave McClure)创造了现在仍然存在的 Twitter 标签#EstonianMaffia,该推文的标题是。
甚至当时的爱沙尼亚总统(2006 年至 2016 年)托马斯·亨德里克·伊尔韦斯也在推特上吹嘘#爱沙尼亚黑手党。他是一个非常酷的总统,他非常精通技术,了解各种东西,他是初创公司的忠实粉丝,并定期访问公司。当他参观我们月饼公司办公室时,我了解到他甚至在大学学习期间编写过汇编程序。我们让他坐在一台工程师的电脑前,写了几行代码。那就是向我们在 TUNE.com 西雅图的客户传递一个惊喜的信息,并附上一句私人问候“来自塔尔图的西雅图问候”。我曾经住在那里,在 Enumclaw 美国林务局办公室担任森林消防队员。
爱沙尼亚总统托马斯·亨德里克·伊尔韦斯在访问爱沙尼亚塔尔图的月饼办公室时,用密码文件给 Tune.com 留下了一个惊喜的信息。图片来源:Mooncascade.com。
当前的创业场景
目前,爱沙尼亚投资最多的公司列表如下:
来源:“爱沙尼亚科技初创公司 2006–2019 # EstonianMafia 的融资、失败&退出”,由 Martin Villig (Bolt)和爱沙尼亚初创公司领导者俱乐部提供和策划的数据集
被收购或首次公开募股的爱沙尼亚初创公司的例子有 Skype、PlayTech、ZeroTurnaround、GrabCAD、PlanetOS、Teleport、VitalFields、Ecofleet 等。爱沙尼亚初创企业可以获得资金的当地来源的例子有 EstBAN(商业天使网络)、Startup Wise Quys(加速器)、Karma.vc(风险投资基金)、SuperAngel Fund、Contriber Ventures、crowd funding (Funderbeam,Fundwise)等。爱沙尼亚的启动相关事件的例子是纬度 59、启动日、Garage48、移动星期一等。
战胜危机
冠状病毒一传播到欧洲和爱沙尼亚,Garage48、accelerate 爱沙尼亚和整个爱沙尼亚创业社区的人立即做出反应,通过在线方式创建了该系列的第一个黑客马拉松,并有多个目标。首先,我们的目标是找到应对不断升级的危机的方法,但也是为了相互证明并树立一个榜样,即这样的活动只能通过在线方式组织,并且规模更大。该活动于 3 月 13 日至 15 日举行,就在两周前。
现在,同样形式的活动已经在世界各地出现,以帮助他们的社区解决问题。这里的地图可以看到。其高潮将是全球黑客,目的是对抗我们目前正在全球经历的前所未有的全球危机。
来自不同团队的许多人已经为准备这次活动付出了巨大的努力。我真的很钦佩让这一切发生的人们的坚持和艰辛。我很高兴我们来自月饼店的团队为全球黑客捐赠了网站建设。《脸书邮报》的列出了一份更长的(尽管可能还不全面)促成此事的人的名单。
艾的伦理学
苹果 | 谷歌 | SPOTIFY | 其他
安妮特·齐默曼在 TDS 播客上
要选择章节,请访问我们的 Youtube 视频这里
编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分,由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。你可以听下面的播客:
随着人工智能系统变得越来越强大,它们被用来解决越来越多的问题。
以计算机视觉为例。不到十年前,计算机视觉算法最先进的应用之一是对邮件上的手写数字进行分类。然而今天,计算机视觉正被应用于从无人驾驶汽车到面部识别和癌症诊断的方方面面。
实际上有用的人工智能系统现在已经坚定地从“如果会怎样?”领土到“现在怎么办?”领土。随着越来越多的我们的生活由算法管理,越来越多来自计算机科学和工程以外领域的研究人员开始注意到这一点。其中最引人注目的是哲学家,他们中的许多人担心将我们的决策外包给机器所带来的伦理影响,我们常常无法理解甚至解释这些机器的推理。
人工智能伦理学领域最重要的声音之一来自 Annette Zimmermann 博士,她是哈佛大学卡尔人权政策中心的技术和人权研究员,也是约克大学 T2 分校的哲学讲师。Annette 的很多工作都专注于探索算法、社会和治理之间的重叠,我有机会与她坐下来讨论她对机器学习偏见、算法公平和人工智能伦理大局的看法。
以下是我们谈话中我最喜欢的一些带回家的东西:
- 机器学习问题经常被框定为工程问题,而不是哲学问题。因此,如果它们出错了,我们倾向于考虑技术解决方案(“我们应该增加数据集还是尝试不同的算法?”)而不是更基本的问题(“也许这不是自动化系统开始的合适用例?”).出于这个原因,不部署有争议系统的选择往往没有得到应有的重视。
- 工程师和数据科学家没有意识到,他们设计、选择并输入到模型中的功能成为了这些模型观察世界的镜头。一个应用于一组不同工程特征的模型确实会以不同的方式看待这个世界——以及这种新视角所带来的所有偏见。因此,与普遍持有的观点相反,机器学习中的偏见不仅仅来自数据集:我们选择标记为“相关”或“有用”的特征直接反映了我们的信念和价值观。
- 人工智能系统经常创造出近乎临床客观的假象。毕竟,我们倾向于认为,如果一个决策是自动化的,这难道不会从过程中消除人类的主观性——从而消除偏见——吗?当然,在现实中,机器学习模型的输出只是反映了训练该算法的程序员的决定,仅仅因为这些程序员没有直接参与生成模型的每个输出,并不意味着他们的世界观和假设没有隐含在模型本身中。
- 随着人工智能变得越来越强大,有一种自然的诱惑将它们应用于预测各种形式的人类行为,从工作表现到学术能力。但是这些应用经常挑战人类的能动性,消除我们对抗过去表现趋势的能力。如果一个超级精确的机器学习模型预测你会通不过下一次驾驶考试,你还会去学习吗?人工智能系统正在越来越多地破坏我们的自由意志,质疑这是否是一件好事,或者是否有某些事情我们可能不想预测自己或他人,即使我们的模型非常准确,这似乎很重要。\
章节:
- 0:00 介绍
- 2:36 什么是 AI 伦理?
- 6:08 核心问题
- 10:31 我们希望如何失败?
- 12:00 有前途的策略
- 16:17 优化是实践,而不是目标
- 数据和利用
- 20:55 人类决策
- 24:32 权力和责任
- 26:34 民主决策
- 29: 33 民主化人工智能和算法正义
- 31:06 具有时域灵活性的系统
- 34:12 人工智能中的不可信
- 37:33 长期问题
- 40:33 结构效度
- 45:11 英国学校考试(COVID)
- 50:25 围绕自由意志的道德哲学
- 53:32 自动化偏差
- 55:44 总结
下面是第二季第三集的脚本:
杰瑞米·哈里斯(00:00):
嗨,大家好。我是杰里米。如你所知,我是播客的主持人,也是 SharpestMinds 数据科学导师项目团队的成员。我对今天的播客感到非常兴奋,因为这是我们第一次真正深入探讨人工智能伦理问题的机会。人工智能伦理显然是今天空气中弥漫的东西。很多人都在谈论这件事,当然比以前多了很多。随着机器开始越来越多地接管我们作为一个物种的集体认知,这变得越来越重要。我们将越来越多的思维外包给机器。当我们这样做的时候,开始反思我们如何做,以及我们是否应该在某些领域这样做,变得越来越重要。
Jeremie Harris (00:38):
人工智能伦理领域就是围绕这样的问题出现的。这一领域的主要声音之一是安妮特·齐默曼博士,我很兴奋地说,她是我们今天播客的嘉宾。现在从技术上来说,安妮特称自己为政治哲学家,但我实际上认为这个头衔隐藏了她思想的一些复杂性。实际上,她一部分是伦理学家,一部分是哲学家,一部分是技术专家。我的意思是,她实际上必须知道很多关于工程、数据科学和人工智能方面的知识,比如系统是如何部署的,以及它们是如何构建的,以便能够提供她的观点和她对整个领域的见解。
Jeremie Harris (01:16):
人工智能伦理学实际上是不同专业的结合,她真的把它们都锁定了。你会在对话中看到这一点。我还应该提到,安妮特在谈论和思考人工智能伦理及相关问题方面有着丰富的经验。她目前是哈佛大学卡尔人权中心的技术和人权研究员。除此之外,她还是约克大学的讲师。她确实看到了学术前沿的东西。她还做了应用研究,并在许多不同的流行出版物上写了许多关于这个主题的文章。你绝对可以去看看。我们将在视频描述以及播客附带的博客文章中链接这些内容。
Jeremie Harris (01:53):
我希望你喜欢听这一集,就像我喜欢录制它一样。这绝对是我未来想做更多的剧集之一。我们肯定会有更多的人来讨论像人工智能偏见和人工智能伦理这样的问题。与此同时,享受表演吧。
杰里米·哈里斯(02:06):
你好,安妮特。非常感谢你加入我们的播客。
安妮特·齐默曼博士(02:10):
你好,杰里米。非常感谢你邀请我。
杰瑞米·哈里斯(02:12):
你能来我真的很兴奋。我认为公平地说,你是我最兴奋与之交谈的客人之一,因为你的兴趣如此广泛,而且你对人工智能伦理的想法如此专注。我觉得 AI 伦理显然越来越重要了。我认为这已经非常重要了,但我也不认为很多人,包括我自己,对人工智能伦理到底是什么有完整的理解。所以也许这是个好的开始。什么是 AI 伦理?
安妮特·齐默曼博士(02:36):
我认为你对目前围绕这个话题的混乱状态和公众辩论的诊断是完全正确的。我认为很多人不同意人工智能伦理到底是什么,以及它在任何方面是否有用。从我的立场来看,这是一个受过训练的哲学家的观点,我认为伦理学是一种试图确定社会应该如何运作的学科。那么应该如何分配权力呢?我们应该如何安排我们的社会和政治制度?当我们与其他人交往时,我们应该如何行动?就道德而言,我们欠别人什么?
Annette Zimmermann 博士(03:18):
当然,这是一种非常特殊的构建伦理的方式。还有许多其他人研究人工智能伦理,但他们基本上将伦理视为一种法律合规框架,或者一种企业愿望,一种企业价值观的表达。因此,许多大型科技公司目前正在发布人工智能伦理原则,而且通常它们也采取声明的形式,说,你应该做 X,Y,z。例如,a 不伤害。这与一位哲学家可能会说的话非常相似,但它通常不太关注一种非商业动机。显然,大型科技公司有阐明这些原则的商业动机。
Annette Zimmermann 博士(04:09):
我确实认为这些原则经常是善意的,但我认为我们需要批判性地思考它们,因为它们经常是非约束性的原则。因此,很容易就能发表一种自愿声明,说明我们理想中想要做的事情。但是,如果没有适当的问责机制,如果你是一个可以设置议程的人,因为你背后有大量的计算能力和大量的资源,那么问题是,人工智能伦理到底意味着什么?我认为这真的解释了为什么很多人对人工智能伦理持怀疑态度,因为它看起来真的没有效力,有点唯意志论。
杰里米·哈里斯(04:46):
哦,对不起。
Annette Zimmermann 博士(04:48):
补充一下,我认为怀疑是正确的,但我不认为我们应该因此得出结论,我们应该把人工智能伦理学扔出窗外。我确实认为,人工智能伦理可以成为一个很好的工具,来思考我们不仅作为大型科技公司的成员,而且作为整个社会的成员应该做什么。因此,作为一名普通公民,我应该如何看待我们在许多不同领域的高风险决策中使用人工智能和人工智能的方式,例如,人工智能现在正在取代我们公共机构中的许多人类决策者。所以从道德和政治上思考这些问题,这是人工智能伦理学有益的,也是应该做的,我认为这真的很有价值。所以我们不应该放弃努力。
杰里米·哈里斯(05:39):
我觉得这很有趣,部分原因是它揭示了我的前科。当我想到人工智能伦理时,我想我可能和大多数人一样。我确实想到了这些,就像你说的,谷歌和脸书发布的这些大的道德声明等等。我想在某种程度上,这也反映了知识和资源的不对称,这些公司甚至不得不试验这些技术。我的意思是,感觉上好像有一种感觉,政府经常在玩追赶游戏-
安妮特·齐默曼博士(06:07):
当然。
Jeremie Harris (06:08):
…所有的尖端技术都是由大型科技公司内部开发的,因此可以宣称不仅处于技术的边缘,也处于伦理的边缘。你的研究重点是什么,或者你有没有思考过这样一个问题,即我们如何在更广的层面上,也许是更高的抽象层面上做出社会决策,而不仅仅局限于公司和企业?如果资源是一个限制,知识也是一个限制,我们如何把它融入到游戏中呢?
安妮特·齐默曼博士(06:39):
是的。我认为你对我们目前面临的核心问题的诊断是完全正确的。目前,对于真正有才华的 ML 程序员来说,没有太多的激励去公共部门工作或留在研究部门。显然,有很多激励因素有利于进入企业领域,因此,目前确实有很多人才在私营行业。问题是,这是否意味着大型科技公司可以在设定技术议程的基础上设定伦理议程?
Annette Zimmermann 博士(07:13):
议程设置当然是一个关键的民主问题,对吗?所以民主决策不仅仅是做出实际的选择。这也是关于共同决定我们首先应该考虑什么。那么,我们在做决策时会考虑哪种解决方案呢?这就是我认为人工智能的决策应该并且可能渗透到正常的民主讨论中的地方。
Annette Zimmermann 博士(07:42):
当然,政府中的许多人不太了解新兴技术,我认为这解释了为什么人们普遍不愿意将这些与人工智能相关的问题列入民主党的议程。但是到最后,如果你考虑使用这些工具的道德和政治空间,最终它们不是纯粹的技术,你可以用不依赖于应用数学或应用统计学学位的方式向普通公民解释它们。
Annette Zimmermann 博士(08:16):
例如,如果我们考虑一个像 COMPAS 这样的系统,一个刑事累犯风险评分工具,它显然吸引了很多争议,因为 ProPublica 的调查记者发现它有巨大的种族差异,这对黑人被告来说更糟。这似乎是一个明显的道德和政治问题。如果你向人们解释,你可能会说,“嗯,我们在这个领域的一个政策目标就是改进这个算法。所以我们可以尝试优化它,以消除这种种族差异。”因此,希望这将使该系统更加公平。
Annette Zimmermann 博士(08:53):
这是你可以向普通公民解释的事情,当然,他们可能会接着说,“嗯,计算机科学家实际上已经向我们展示了完美地优化这种算法是非常非常困难/不可能的。”许多计算机科学家已经阐明了不可能性定理,这些定理与优化许多不同种类的公平有关,而这些公平在同一时间都是各自看似合理的。所以我们在缓解和优化算法系统的时候不可能做到完美。
耶雷米·哈里斯(09:27):
对。我一直认为这是机器学习的一个特征,它开始迫使我们真正面对我们的哲学空白,我的意思是我们缺乏哲学的领域。从某种意义上说,机器学习真的迫使我们用方程式来编纂,用真正具体的术语来说,我们的道德哲学在我们确实不知道的情况下是什么。你刚刚提到了这些不可行定理,不可能定理。你不能在拥有一定水平的表现或其他什么的同时拥有隐私,这些事情是相互冲突的。我的意思是,似乎有类似的问题,甚至仅仅是在概念上,比如说,民主,我们不仅仅有像群众暴政之类的东西,还有其他更基本的约束,比如阿罗不可能定理。
Jeremie Harris (10:13):
关于如何将知识从个人归纳到集体中,有一些不可行的定理。你认为这些是同一个连续统一体吗?这真的是一个大问题吗,或者有没有一种感觉,我们实际上可以有意义地划分问题的机器学习部分和问题的社会部分?
Annette Zimmermann 博士(10:31):
我认为这些问题中的许多都是结构相似问题的一部分。所以我认为,当人们想到人工智能时,他们真的非常专注于识别人工智能的真正独特的功能,因为显然人们目前对人工智能和人工智能非常兴奋。但是正如你刚才提到的,很多集体决策场景实际上是以相似的方式构建的,很难完全优化。因此,作为民主公民,我们的问题是,如果我们知道我们会在某种程度上失败,我们希望如何失败?
Annette Zimmermann 博士(11:08):
我们是否希望这种失败给已经处于不利地位的人带来更大的负担,或者我们能否找到一种不同的方式来处理不完美、伤害和不确定性?我认为最糟糕的情况是,事实上,不完美、伤害和不公正对那些已经受到这些不公正和伤害的人来说是雪上加霜,不幸的是,这种情况最近在许多领域已经发生了。这似乎与民主价值观根本对立。因此,如果我们真的关心所有人的平等自由,那么这是我们绝对应该避免的情况。
Annette Zimmermann 博士(11:49):
正如你所说,我们发现在民主决策的许多其他领域,实际上与人工智能没有任何关系。一旦我们开始处理社会复杂性,我们就会发现自己处于那种问题空间。
Jeremie Harris (12:00):
我想在某种程度上,这几乎掩盖了人类本身在某种意义上是机器学习代理的事实。我的意思是我们有一个神经网络。我们有某种强化学习电路。是啊。我不想说更具体的方面,但是在处理这些问题的时候,你认为最有希望的策略是什么?我们开始在算法中巩固现有的规范,不管它们是什么?
Annette Zimmermann 博士(12:27):
有一个非常具体但非常有争议的策略,就是不在目标区域部署。最近很多人都特别关注面部识别技术的非部署,这也是因为该技术的种族差异影响。事实上,许多大型科技公司现在都说,“好吧。我们将在这里暂停。我们不会在固定的时间内部署这些工具。”因此,IBM、亚马逊以及许多其他公司已经对 Joy Buolamwini 等人的压力做出了回应。所以很明显,有一种公众意识,实际上有限的和有针对性的不部署可能是处理这类问题的最佳方式,直到我们有更好的技术解决方案来解决这些问题。
Annette Zimmermann 博士(13:21):
现在,是否总会有可行的技术解决方案,我认为这取决于部署的领域,也取决于我们的目标。回想一下我之前提到的另一个例子,COMPAS 的例子。如果你看到这个案例,你可能会想,“那么,为什么我们首先要预测人们的再犯风险率呢?这真的是确保我们的刑事司法系统最佳运作的最佳方式吗?这意味着什么?”我想我们可以在我们的议程或民主决策议程上提出的另一个选择是,“那么,我们不能改造监狱吗?难道我们不能进行制度、社会、结构和法律的变革,改变量刑指南,改变强制性最低量刑标准吗?”
Annette Zimmermann 博士(14:06):
所有这些都是可能的解决方案。不是所有的都是算法。其中一些可能是,但我认为我们需要对整个解决方案空间有一个非常非常清晰的认识,然后将人工智能方法融入其中。我认为这将帮助我们确定我们应该在哪里推迟部署某些东西,也许直到我们测试了技术并使其更加可靠,或者也许一旦我们部署了其他社会和体制机制,那么在那个领域部署可能会更安全。但我认为我们真的需要适应社会世界和技术世界之间的相互作用,因为它们必然会相互作用。因此,这应该指导我们在诸如不部署等问题上的决策。
耶雷米·哈里斯(14:55):
是的。当您遇到问题时,您真的会看到默认部署的诱惑,特别是当问题变得具体时,对吗?作为一名工程师,你可以看着这个问题,说,“哦,我可以定义一个损失函数。为什么我不把这当成一场比赛来训练,然后继续部署呢?”然而,这种认为你实际上是在处理一个非常复杂的系统的想法。不同的部分相互作用。你不可能在不引发其他问题的情况下真正解决一个子问题。是的,这真的很有趣,在这种情况下,不部署是它自己的选择。
Annette Zimmermann 博士(15:26):
对。我觉得不陷入优化陷阱真的很重要。哲学家在这个问题上与技术从业者交流常常很有趣,因为在哲学中有一个众所周知的口号,叫做应该意味着可以。所以这基本上意味着,如果你不可能履行道德义务,我就不能把道德义务强加给你。这要求过高,因此不符合道德。但是在技术从业者的空间里,许多人把它颠倒过来。所以他们可以说,“can 意味着应该。”所以如果我能做点什么,我就应该创新。我应该把它放在外面。
Annette Zimmermann 博士(16:05):
正如你所说,有一种倾向于把东西放在那里,看看它们是否有效,而不是思考,我们想要这个吗?首先,我们使用这个工具的目的是什么?
Jeremie Harris (16:17):
你也谈到过优化的想法,它本质上不是一个需要的,不是目标,而是实践。你能对此多说一点吗?你对此有什么想法?
安妮特·齐默曼博士(16:31):
对。我认为我们经常把优化看作是增量改进,这是一个非常合理的观点,对吗?所以,如果你想知道我如何改善我的日常习惯,那么,我会做五分钟,也许我会建立一个日常锻炼的习惯。随着时间的推移,我会逐步改进。总的来说,我认为这是一个很好的原则。问题是,在机器学习领域,当我们在没有询问我们是否应该首先在那个方向上优化的情况下进行增量改进时,它实际上可能会使我们离公正更远。
Annette Zimmermann 博士(17:13):
为了给你一个非常具体的例子,回想一下我们刚刚讨论的面部识别案例。在公司发布这些非部署禁令之前,他们实际上有一种不同的方法。他们说,“嗯,我们只是要改进这项技术。”你是怎么做到的?你需要更多的数据。特别是,为了解决这些技术带来的种族不公正问题,这些公司的人说,“我们需要更多关于黑人和棕色人种的数据。”不幸的是,获取更多数据的过程往往非常具有剥削性。
安妮特·齐默曼博士(17:51):
例如,谷歌的一个分包商走到洛杉矶的街道上,对无家可归的人说,“你知道,让我们玩个游戏。我们有自拍游戏。我们会记录下你的脸,你会得到一张 5 美元的代金券。”他们没有告诉这些人,他们的脸被用作面部识别工具的生物数据。因此,这个已经相当脆弱的群体,一旦这个工具得到扩大,很可能会成为进一步不公正的受害者,这正是被用来优化的群体。
Annette Zimmermann 博士(18:26):
我认为这是一个很好的指标,表明我们的优化努力使我们走上了一条并非真正面向更大公正的道路。因为如果那些必须为优化付费的人,或者必须为优化提供某种服务的人,如果他们没有真正拥有这个过程,如果他们没有被告知发生了什么,那么我认为我们真的走错了路。这是一种渐进的改进最终会给人们带来更大负担的方式。
杰里米·哈里斯(18:59):
我认为这是整个对话中最吸引人的一个方面,是这场辩论与渐进主义和某种几乎是基本原则的辩论,是对我们采取的社会结构等整个方法的反思。在某种程度上,我是说,在我这个政治哲学家身上,这让我想到了两位著名的美国政治哲学家之间的区别。埃德蒙·伯克和托马斯·潘恩。伯克是一个典型的保守主义者,他说,“渐进主义是真正的解决方案。我们有体面的结构,随着时间的推移,通过进化和经济学的结合而进化。我们现在处于一个很好的位置,我们应该尊重这一点,不要冒险。”
耶雷米·哈里斯(19:37):
托马斯·潘恩说,“嗯,我们……”我想他的话是,“我们有能力重新开始这个世界,”或者类似的话,从基本原则开始重新思考整个结构。也许伯克的想法更像一个优化引擎。托马斯·潘恩的思维更像一个物理学家,从零开始想出这个方程。让我们重做这个,做一个漂亮的系统。有没有可能采取伯克的立场,进一步采取渐进主义的立场,说,看,如果他们去帮助无家可归的人,他们这样做,显然是一个巨大的错误。
耶雷米·哈理斯(20:08):
如果他们得到这些信息,重复,再试一次呢?有没有可能是我们尝试的时间还不够长?这是对这个观点的一种合理的反驳吗?
Annette Zimmermann 博士(20:19):
我认为这也取决于领域。我是迭代决策和评论方法的忠实粉丝。我认为这通常是非常非常有用和必要的,主要是因为许多技术问题实际上只是随着时间的推移才浮出水面。因此,在许多不同的领域,我可以从一个实际上没有偏见的机器学习系统开始,这在偏见方面完全没有异议,但随着时间的推移,微小的增量变化会复合,最终仍然会给我们带来巨大的差异。
Annette Zimmermann 博士(20:55):
实际上,我们从人类决策中了解到类似的现象。思考信仰极化的社会学现象。你可以给两个人完全相同数量的数据,相同数量的证据,根据他们的前科,他们最终会有非常不同的观点。这有点类似于机器学习系统。社会世界中的偶发事件,仅仅是随机的偶发事件,可能会影响一个系统中的路径依赖,这个系统是不完全可预见的,我们必须依次减轻。这就是为什么顺序干预可以成为一个非常非常有用的工具,以一种动态的方式改善系统。这将再次支持反对纯粹的第一原理方法的观点。
Annette Zimmermann 博士(21:45):
话虽如此,我认为我们确实需要对我们的总体目标进行一些思考。这可能是一种灵活的表达方式,但我认为如果我们只是说,“我们将一直是渐进主义者”,那么我们可能会忘记为什么我们一开始就试图优化一些东西。
杰里米·哈里斯(22:08):
对。
Annette Zimmermann 博士(22:09):
我认为这种路径依赖是我们应该担心的。需要有一种方法来协调这两个极端,我认为这样做的方法是首先进行基于原则的对话,讨论目标定义应该是什么,然后依次迭代,如果事实证明有必要,随时准备改变我们的目标。
杰里米·哈里斯(22:34):
说得好。这是一个在这一点上甚至没有真正发生的对话,或者至少我想它不会特别发生在 OpenAI 和 GovAI policy 等非常狭窄的领域之外,这些政策智库正在思考这些优化流程是什么。当人们退后一步问自己,我们应该建造什么时,在那个生态系统中有哪些大的讨论点?这是你看过的东西吗?
安妮特·齐默曼博士(23:00):
是的。我的意思是,我认为许多技术从业者对个人责任问题非常感兴趣。我最近关注的一个问题是这位脸书员工发布了一份 6000 字的备忘录。我不知道你是否关注了这个故事,但实际上,脸书雇佣的一个人越来越担心她有巨大的职业责任。据她说,她会看到地缘政治对她在脸书工作期间所做的微小决定的反应。这让她非常不安,她试图在公司内部提出这个问题,但遭到了强烈反对。
安妮特·齐默曼博士(23:47):
她似乎面临的问题是,她无法调整自己的行为以防止这些不良后果,所以她作为一个个体无法防止伤害,对,只是因为权力过剩。即使她拒绝了这种权力,她仍然是一个非常非常糟糕的过程的一部分,这就是为什么她当时批评公司,并最终因此被解雇。这是一个在从业者中发生的不太令人鼓舞的伦理审议的例子,但是我发现看到有人明确表达这种非常具体的担心,一个人可能有太多的权力,这很有趣,对吗?
耶雷米·哈里斯(24:32):
是的。
安妮特·齐默曼博士(24:32):
因为我们经常认为责任的增加是一种荣誉,或者是做一些真正有益的事情的机会,但是我认为这个人在辩论中提出的真正必要和真正有用的观点是,嗯,有没有一种足够程度的责任是一个人不应该超越的?同样,我认为这可能最终是一个民主的关注,对不对?
Annette Zimmermann 博士(24:58):
显然,如果我们选举某人担任一个拥有巨大权力的职位,那么这个人必须向我们汇报,至少在技术上,如果事情进展顺利,以及他们为什么要做某些事情。所以他们必须让自己经历向我们证明、解释、合理化和争论的过程,这是脸书工程师绝不会对整个社会做的事情。我的意思是,即使他们试图让这个过程在公司内部进行,也不会以同样的民主规模进行。所以我直觉地认为,这让那些想把工作做好的人感到担忧。
耶雷米·哈里斯(25:34):
对,是的。我的意思是,在某种程度上,这又回到了我们之前的对话,关于民主制度以及它们与一些科技的互动。我想在某种程度上,问题之一是民主进程实在是太慢了。随着技术发展速度的加快,实际上可能没有足够的时间让有意义的反馈,民主地说,反馈给决策者。会越积越多,离我们越来越远。
Annette Zimmermann 博士(26:03):
对,是的。我确实认为这是人工智能政策的一个巨大障碍,特别是民主制度有充分的理由被设计得强大,这减慢了它们的速度。所以这里有一个明显的交易。一方面,我们希望有牢固的制衡,但另一方面,我们希望我们的民主机构有反应能力。在我们面临快速变化的决策环境的领域中,这些可能会完全分开。
Annette Zimmermann 博士(26:34):
我想在这里补充一点,民主决策并不总是意味着涉及整个民主党选区的选举政治。我认为这可能是民主决策最明显的形式,但可能不是最重要的形式。例如,很多人关注人工智能领域的专家。我认为选择什么构成这个领域的专业知识可能真的是有争议的。
耶雷米哈里斯(27:04):
是啊,是啊。
Annette Zimmermann 博士(27:05):
很多时候,当我们想到医学创新时,我们可能会问医生,但我们也可以问慢性病患者,对吗?
耶雷米·哈里斯(27:13):
是的。
Annette Zimmermann 博士(27:14):
这些选择中哪一个可能更好,或者组合是否会产生更有见地的结果,这并不一定是显而易见的。同样,当我们谈论在刑事司法和警务环境或移民执法环境中部署的人工智能时,我们只有在警察部队中服务的人,我认为我们将错过一个非常重要的视角。我认为我们需要重新考虑谁可以成为这些讨论中的专家,以及当我们试图做出真正快速的决策时,我们应该重视谁的意见。它不必是全面的,但它必须是一种理性和平等的思维,帮助我们选择这些人。
Jeremie Harris (27:59):
只是为了在民主方面唱反调,所以至少有一件事已经浮现在脑海中,特别是当我们开始看到越来越复杂的语言模型、GPT-3 等方面的一些发展时,当你看到目前在人工智能伦理、人工智能联盟特别是广泛的人工智能安全、人工智能政策生态系统中的人时,我总是在我的谈话中被这些人近乎荒谬的素质水平以及他们的正直和思想深度所震惊。在这种情况下,从某种程度上说,这是真的,它激发了我的想法,可能不是立即可取的,实际上把它开放给完整的阵列,让我们说,说得好听点,我们在 Twitter 这样的东西上看到的人类行为和病理,人们在那里进入它。
耶雷米·哈里斯(28:53):
我的意思是,我无法想象如果这些争论与一个决定一个人是否获得银行贷款或其他东西的算法的性能有关,会是什么样子。我是说,一想到这个我就有点害怕。我不知道。这是你一直在思考的事情吗,高度信任和高度专业化的封闭系统可能会在多大程度上与民主开放系统有所取舍?
安妮特·齐默曼博士(29:16):
是的,当然。这是政治哲学中非常非常核心的问题,也是道德哲学中的问题。我认为你在这里得到的问题是,正义和民主可能是相互正交的,对吗?
耶雷米·哈理斯(29:33):
对。
安妮特·齐默曼博士(29:33):
我可能会有一个非常反平等主义或非常分裂、非常敌对或彼此不再真诚合作的民主党选区。所以这可能会玷污民主决策,以一种实际上根本不关心公正和平等的方式,也可能根本不关心决策的质量。它可能会以不再基于任何事实的非常糟糕的决策而告终,因此对许多人来说,这可能是非常不公平和非常有害的。
Annette Zimmermann 博士(30:11):
我不认为我们应该得出这样的结论,即民主化的人工智能一定会消除算法不公正等问题。我当然不认为那是真的。我认为,要建立人工智能和机器学习的公正形式,或者人工智能和机器学习的道德辩护形式,还需要更多的东西。
耶雷米·哈里斯(30:32):
多么易变……哦,对不起。
安妮特·齐默曼博士(30:34):
哦,没关系。
Jeremie Harris (30:35):
对不起,我只是想问你对这些道德框架可变性的看法。在某种意义上,我们设计算法,通过设计它们,当然也通过部署它们,我们确实开始了,正如你所说的,将一些社会规范奉为神圣,无论我们是意识到这是正在发生的事情,还是只是含蓄地这样做。但是随着时间的推移,很明显,我们希望我们的道德观改变。我的意思是 50 年前跨种族婚姻是有争议的。当然,我们对待同性恋等等的方式已经彻底改变了。
Jeremie Harris (31:06):
那种认为我们今天已经建立了一套令人满意的道德规范,而这种道德规范将永远保持不变的观点可能是站不住脚的。对于我们如何设计具有这种时域灵活性的系统,有什么想法吗?
安妮特·齐默曼博士(31:21):
是的。我的意思是,我认为这样做的第一步是承认我们所做的任何选择都在某种程度上受到道德和政治的影响。很多时候,我认为我们希望自己做一个完全道德中立的决定,一个纯粹的技术决定。举个例子,当我们设计一个系统时,当我们决定选择和衡量哪些特性时,表面上看起来是非常中立和客观的,因为我们只是试图代表事实,我们试图从这些事实中抽象出来,以得出一个通用的决策规则。
Annette Zimmermann 博士(31:57):
在一天结束的时候,我可以做出许多不同的选择来决定到底看什么。所以根据我想让我的模型讲述什么样的故事,我会从中获得一种强化效果。如果我决定测量逮捕率之类的东西,但实际上我感兴趣的是提出一个模型,告诉我一个关于犯罪的故事,我将有一个真正不完美的故事。我越不承认我实际上是在用一个不完美的近似数据工作,这个故事可能会越来越脱离现实。
Annette Zimmermann 博士(32:32):
我认为解决这个问题的办法是始终意识到我们在设计过程中所面临的不确定性程度以及对选择的依赖程度。我认为我们不应该说,“这是我们的静态原理。让我们尽可能地接近它。有一次我们要测量某样东西一次,然后我们只是要看看会发生什么。”不,我们必须回到这一点,我们必须问,等等,我们真的测量了正确的东西吗?我们真的想出了正确的决策规则吗?为什么我们一开始就采用这种价值观?
Annette Zimmermann 博士(33:06):
在我们试图通过做出这些表面上客观的设计决策来达到的价值观中建立一个购物清单并不好。我认为我们必须始终保持灵活性,这种灵活性包括质疑我们之前的假设和选择。尽管它们在当时看起来是可以辩护的,但如果事实证明它们大错特错,我们需要准备好彻底改变它们。
耶雷米·哈里斯(33:32):
是的。至少对我来说,看了你的一些作品,你的写作和你的 YouTube 视频后,有一件事变得很清楚,那就是我还没有完全意识到特征选择和特征工程在多大程度上真的等于选择了你的算法用来看世界的镜头。我们知道让某人在一年中阅读《纽约时报》与让某人在一年中只阅读福克斯新闻频道的影响。你最终会得到两个非常不同的世界模型,因为降维,本质上是特征选择,他们在这个世界上所做的,给你呈现名义上相同的事件,但从不同的角度来看,通常只是,我的意思是,完全改变了你解释事物的方式。
Jeremie Harris (34:12):
将这些映射到这些算法上很有意思,如果你真的选择给这个算法提供类似 MSNBC 对 CNN 的信息,你会得到不同的算法和不同的结论。
安妮特·齐默曼博士(34:24):
是的。我认为这是绝对正确的,我认为这是人工智能中不可信的一个真正被低估的方面。我认为当你问某人,什么会让人工智能值得信任,他们的本能反应会是这样的,“嗯,我们想确保人工智能不会犯任何严重的错误,”所以我们已经讨论过的错误。所以没有严重的伤害,没有严重的不公正。但是想想这种反事实。想想一个实际上还没有真正失败的人工智能系统。它还没有真正背叛我们的信任。
Annette Zimmermann 博士(35:04):
我们喜欢委托给这个系统,因为我们不确定它是否会表现良好,或者因为我们有一些关于它的信息,让我们有理由相信这个系统不会以某种方式失败。但是我们仍然没有排除这种可能性,那就是这个系统的本体可能并不是我们想要表现的世界的忠实表现,对吗?这个系统可能会理想化,我们会觉得疏远、怪异,而且不太合适。这可能是不可信人工智能的一个完全不同的方面,它实际上不依赖于结果。这是我们对人工智能更基于过程的关注。
Annette Zimmermann 博士(35:48):
我之所以说它是基于过程的,是因为我认为我们不仅仅关心做正确的事情。我们也关心为了正确的理由做正确的事情。这也是我们对人类的评价。如果你有一个朋友,他通常只是做好事,并没有给你任何理由怀疑他们对你的忠诚,但假设你在某个时候发现他们只是买了一个非常非常奇怪的推理结构。他们作为朋友对你这么好的全部原因是因为他们同情你。他们认为你真的需要帮助,而且你自己也应付不了,但是他们对你没有友谊。如果你发现了这一点,你会说,“哦,上帝,你为我做这些好事的所有理由都是糟糕的理由,它们不符合友谊的精神。”所以你真的错过了这里发生的一切。
安妮特·齐默曼博士(36:39):
我认为,当人工智能建立在一个怪异和疏远的本体上,而这个本体没有以正确的方式连接正确的点时,人工智能也会出现类似的问题。在我看来,这将使人工智能变得不可信,因为你无法保证它会继续做正确的事情,因为它不会出于正确的原因去做这些事情。
杰里米·哈里斯(37:03):
因为我想有一种相反的哲学观点认为,系统的目的是它做什么,所以如果一个系统对你做了好事,那么它就是一个好系统,与它的耳朵之间发生的事情无关。我想你在这里真正得到的是,最终可能会出现短期内不明显的行为,但你会突然意识到,“哦,该死,这东西只是想看起来很好,以获得我的信任,这样它就可以做一些绝对毁灭性的事情。”这种评价公平吗?
安妮特·齐默曼博士(37:33):
是的。没错,我现在的主要担忧是一种长期担忧。我不认为我们必须假设一个真正二年级形式的人工智能是恶意的,所以我认为将人工智能拟人化是非常危险的。我甚至没有在这里想象一种恶意的 AGI 案件。我认为这种长期问题甚至可能出现在狭窄的人工智能应用中,这些应用本身具有怪异的本体,但显然不会追求自己的议程,因为它们不是有意识的代理。
杰里米·哈里斯(38:11):
好的,是的。很有意思。好吧。让我尽我所能,为人工智能问题的某种客观主义框架做出最好的钢铁侠论证。假设我想摆脱特征选择问题,因为我知道选择特征和设计我自己的特征是有偏见的。它将反映我认为重要的东西,而不是真实的东西。
杰瑞米·哈理斯(38:33):
我能把这推到真实的极限吗?我能不能开发一个系统,它知道最小的行星地球或太阳系或其他什么的每个原子的位置和动量,那会更令人满意吗?这至少能让我越过特性选择和特性工程的障碍吗?或者,即使做了这样的事情,我还是会错过一些东西吗?
Annette Zimmermann 博士(38:59):
这可能会让你避开特征选择的问题,但我认为你会处理一个不同的问题,哲学家会称之为仁慈的独裁者问题。再一次,这是一种政治哲学的思想实验,你可以想象如果你有一个经常做令人惊讶的事情的独裁者,就像一个统治良好的独裁者。他确保每个人都被平等对待,只是比他们不平等。所以问题是,如果事情以那种方式对每个人都很好,你有什么可抱怨的?
安妮特·齐默曼博士(39:35):
我们没有理由相信独裁者会改变他们方式。我们不需要担心它们会变坏。但是直觉上,我们仍然非常担心我们完全失去控制。我经常想,作为人类,我们确实需要能够说,“嗯,我在这种互动中有代理。”所以我认为,如果我们有这个非常非常非常非常复杂的细粒度人工智能,我们可能会有更多的结构有效性。所以我们可以更好地近似忠实抽象的问题。我们在这方面做得更好,但我们也在处理仁慈的独裁者问题。那么这可能会削弱我们的机构。
哈利斯(40:24):
对。我想回到道德易变性的观点,我们希望能够改变我们的道德思维,这在某种意义上锁定了我们。
安妮特·齐默曼博士(40:33):
正是如此。所以事实上在这两种不同的元目标之间有一个权衡,我认为这是我们在人工智能伦理中应该追求的。一方面,我们想要高的结构效度,但这可能再次与大量的代理和顺序缓解不可调和,所以这是一个主要问题。
Jeremie Harris (40:54):
实际上,你能详细阐述一下结构效度概念吗?因为这对我来说是新的,所以…
安妮特·齐默曼博士(41:00):
好的。结构效度更多的是计算机科学术语。哲学家可能会说忠实的抽象或忠实的表现。这个想法就是,当我们制作模型,当我们阐明基本定律和理论时,我们总是要以某种方式从社会世界中抽象出来。所以很多人对此感到担心,因为我直觉地认为,我们都知道,一旦你建立了一个普遍的理论,你将会失去它对现实生活中个别实例的适用性。但这可能没问题,因为我们希望理论和模型是通用的。统计学家对此有一个简洁的口号。大多数统计学家认为所有的模型都是错的,这没什么。它们仍然有用。
Annette Zimmermann 博士(41:51):
我的问题是,当一个模型不再有用时,我们如何进行分类?我们与社会现实差异如此之大,以至于模型实际上失去解释力的界限在哪里?我还想在这里补充一点,当人们考虑像结构有效性这样的事情时,就像获得真实世界的一个非常精细的图片一样,人们经常会忘记观察真实世界也可能重现不公正。这是另一个重要的权衡。
安妮特·齐默曼博士(42:25):
计算机科学家已经就此谈了很多。如果我有一个真正校准良好的算法系统,它只会准确地反刍我们已经有的社会阶层。这也是为什么我们的介入如此重要,因为我们可以选择我们想要表现的现实,对吗?我们想要抽象和理想化哪些结构,从而复制它们?我意识到,关于一个人、一个团体或一个社会,我可以讲述很多故事,并选择合适的故事来讲述,我认为这非常重要。
安妮特·齐默曼博士(43:07):
柏拉图有一个标准的哲学例子。柏拉图思考了很多关于理想化和理想化是否符合现实的问题。他举了一个希腊雕像的例子。在古希腊,雕像被建造得有点头重脚轻,所以有更大的头和更大的肩膀等等,因为你从下面看它们。所以你作为一个观众的普通视角要求我们实际上扭曲雕像,以便它给我们一个现实的图像。这是一种理想化,但不是我们能想到的唯一的理想化,因为,当然,我们可以完全按照人类的比例复制雕像。但那会让观众觉得疏远和扭曲。我认为这是一个很好的例子,可以思考不同的方式来表现现实,以及做出这些决定的意义。
Jeremie Harris (44:07):
这真的很有趣,我想这也引发了一些关于自由意志和决定论的想法。你之前提到过,你说,“我们可以选择决定我们的抽象是什么,决定世界对我们的模型来说是什么样子。”如果这些模型变得非常好,在某一点上它们将能够,事实上,在许多情况下它们确实比我们更好地预测我们的行为。我知道我有过 Duolingo 每隔一段时间就会给我打电话,告诉我,“该上课了。”我说,“是啊,你知道吗?该是上一课的时候了。”在某种程度上,我想这是一场游戏…当你的行为被预测得比你所能预测的更好时,肯定会很不舒服。
杰瑞米·哈里斯(44:47):
有没有一种方法可以将现实拼接在一起,决定在哪里说“好吧,让我们把这个系统视为确定性的,但让我们明确地为自由意志腾出空间”是有意义的?也许你也想谈谈,有一个你从最近在英国举行的一次考试中引用的例子。也许我会把想法放在那里,让你从那里开始。
Annette Zimmermann 博士(45:11):
对。你提到的英国案例非常非常有趣。由于新冠肺炎事件,一些英国政府决定取消高中生的期末考试。相反,他们要做的只是预测高中生最终会得到多少分数。在英国,这真的决定了你的一生,包括你去哪所大学。他们的系统是你在高中毕业前申请,然后你从老师那里得到一个关于你成绩的初步预测。如果你在期末考试中符合这些预测,那么你实际上就能在大学里占有一席之地。
安妮特·齐默曼博士(45:52):
不幸的是,在这种情况下,英国决定使用一种非常粗糙的统计模型,这种模型可以很好地预测上私立学校的人的成绩,这些私立学校有着非常好的历史记录和很高的教育成就。我们有关于这些私立学校的可靠的长期数据,所以这个模型在那里运行得很好。但是对于那些成绩差距很大的中等学生来说,这种方法真的不太管用。对于那些曾经成绩很差,但在最近几年迅速改善的学校里的人来说,这种方法也非常有效。所以事实上,这个模式最终不利于工人阶级的学生,有色人种的学生。
安妮特·齐默曼博士(46:43):
所以会有这些非常不公平的结果,因为模型的不同特质,一些本可以得到 B 的人突然没有通过 A 级考试。该模型没有真正考虑到不确定性,因此做出了生硬的预测,考虑到灵活性会更合适,也更好地反映了教育程度。在这种情况下,使用这种预测似乎真的被误导了。
Annette Zimmermann 博士(47:13):
即使这个模型实际上非常准确,但它并不准确,但假设我们可以有一个非常好的模型。你可能会想,“嗯,也许你想有机会让自己经历期末考试的过程。”是的,这将是非常紧张的,但是许多学生表达了这种感觉,你知道,我真的为此而努力,这是我向人们证明我能做到的机会。我投入了所有的时间和精力,最重要的是克服压力,尽我最大的努力。我的意思是,在新冠肺炎疫情爆发期间,你的孩子在街上举着标语说,“让我们抛弃这种算法。我想实际做这个考试。”
Annette Zimmermann 博士(47:59):
我认为这确实告诉我们,通常仅仅是预测并不是我们想要得到的。我们想要体验。每当我们需要经验和艰苦的人的过程时,我认为这就是我们不能真正取代这种过程的地方。问题是,我认为很难预测它将应用于生活的哪些领域。我也认为人们会对此有很大的分歧。所以我不认为这个问题有一个很好的原则性解决方案。
安妮特·齐默曼博士(48:31):
我认为我们需要一个持续的政治辩论过程,因为否则我们最终会将一项政策强加给人们,基本上就是说,在你生活的这个领域,你可以拥有代理权。在你生活的这个领域,我们并不关心你的自由意志。我们会给你一个预测,猜猜看,它非常准确。那将是不令人满意的。
耶雷米·哈里斯(48:57):
是的。你肯定也能理解这种怨恨,即使,就像你说的,即使算法基本上是 100%准确的,或者有一个很好的 F1 分数或其他值,如果有人告诉你,“嘿,你知道吗?我们算了一下数字。基于所有这些数据,其中大部分与你个人通常会联想到的特征无关。它是关于你所在社区的特写,关于你的家庭生活、你的成长经历以及诸如此类的特写。”
哈利斯(49:25):
然后我们告诉你,“好的。有 99%的把握,我们可以告诉你,你会在这里得到 B 到 B+之间的分数。”这是一颗难以下咽的药丸,在某些方面,系统越精确,情况就越糟糕。我的意思是,你可以看到人们变得更加愤恨,因为他们被告知他们对社会的价值在某种意义上是由这些系统决定的。
安妮特·齐默曼博士(49:45):
是的。有时候量化的过程本身在某些方面是令人不快的,对吗?有时候,我们对成为一个人意味着什么的评估越来越细,这实际上并不是我们想要的。有时候我觉得我们应该退一步,不要在意某些细微的细节。我的意思是人与人之间可以有微小的差异。同样,显然哲学家对此有一个概念,因为我想我们会给每个微小的想法贴上标签。在这种情况下,我想到的概念是不透明尊重的概念。
Annette Zimmermann 博士(50:25):
不透明的尊重基本上意味着,在某些问题上,我们不想过于关注人与人之间的差异,因为我们只是认为这些差异可能与我们对这种人的贡献或我们应该如何在社会上分配某些利益和负担的决定无关。有时候,我们实际上并不需要了解某人的一切才能尊重他们。因此,如果我们问太多问题,可能会损害尊重。你到底有多擅长这个,或者你真的考虑过这个问题吗?这类问题,尤其是当涉及到给人们分配责任和权利的时候,往往是有害的。
耶雷米·哈里斯(51:08):
是的。这真的让我想到,显然,有一整套道德哲学围绕着自由意志和这个问题,如果你有一个绝对的精神病患者,他们四处杀人,你觉得有权对他们非常愤怒。但是后来你发现他们有脑瘤,脑瘤完全解释了他们所做的一切。突然间,他们的态度发生了 180 度的转变,从一个绝对的怪物变成了一个真正值得同情的人,你只会为这个人感到难过。
Jeremie Harris (51:39):
有时候发现越来越多……我想发现癌症或类似的东西,肿瘤,是我们想知道的事情,但是然后有一个连续体,你开始进一步深入,你开始说,“哦,好吧。嗯,Jeremie 刚刚说了那件非常讨厌的事情,因为第 25 号神经元以这种方式连接到第 47 号神经元,所以它真的是完全确定的。这不是他的错。他的大脑就是这样。”但是在某一点上,这些事情开始变得非常不舒服。
安妮特·齐默曼博士(52:10):
没错。我想那是对的。我的意思是一个问题是在这个领域的侵扰,侵扰可能是不尊重。但我也认为,寻找更多关于某人的信息往往是无益的,因为我们往往只对该不该受到指责和责任感兴趣。我们可以回答关于责任和责备的问题,而不需要非常详细地解释为什么这个人会说这种非常讨厌的话。
安妮特·齐默曼博士(52:45):
所以在许多领域,我们只想说,“看,你做了这件事。我们不在乎为什么,但你能道歉吗?造成了一些伤害,我们要让你为此负责。”我认为这是我们对人的一种普遍看法,我认为我们在人工智能环境中也会有这种看法。这样的信息并不能告诉我们太多。更重要的是我们在处理什么类型的信息,以及我们用这些信息做什么。
Jeremie Harris (53:16):
正如你过去指出的那样,我想用算法来做这件事也会导致我们有时对这些系统的输出过于自信。我们开始想,“哦,如果算法说这个人在道德上有责任,那么毫无疑问。我们不需要陪审团审判,对吗?
安妮特·齐默曼博士(53:32):
是的。我的意思是,有一种被充分研究过的心理现象叫做自动化偏见,这绝对是我们必须努力解决的问题。作为人类,我们有这样的偏见,当我们处理一个量化的故事时,我们更有可能相信这个量化的故事,因为我们认为,嗯,一旦某个东西是可测量的,它就会变得更有形,更客观,甚至可能是公正的。因为我们会想,“好吧,如果只是数字,那它背后不可能有什么议程。背后不能有偏见。”
安妮特·齐默曼博士(54:07):
这种想法很危险。我的意思是,很明显,我们应该接受这样的观点,一些量化的方式确实是不偏不倚的,但是不用说所有形式的量化都是不偏不倚的。这是我们必须时刻牢记的事情,我认为这对于技术从业者来说尤其重要,因为他们必须每天判断应该对一个系统给予多大的信任。
耶雷米·哈里斯(54:33):
是的。是啊。这几乎就像机器学习工程师开始…正如你提到的,他们通过选择架构,通过选择工程特性中的抽象级别来做出这些元决策。他们做出这些选择。然后他们就离开了,这就造成了一种从未做出选择的错觉,因为这个系统只是在某种程度上自行运转。然而,如果你让人类来做,就好像不,每个人都在重新设计特征,重新部署他们的判断。是啊,我们要去的是一个有趣的世界。
安妮特·齐默曼博士(55:03):
是的。我认为主要的事情是没有一个简单的解决方案适用于所有形式的技术和所有领域,所以我认为我们应该对全面的技术乐观主义持极度怀疑的态度。但我们同样应该对全面的技术悲观主义或技术敌意持怀疑态度,因为我不认为任何道德和政治观点会适用于所有不同的应用。
杰瑞米·哈里斯(55:35):
不幸的是,作为一个不能同时有一个以上想法的人,我必须找出其中一个,但是我真的很感激-
安妮特·齐默曼博士(55:43):
很抱歉。
耶雷米·哈里斯(55:44):
就是这样,就像现在所有的事情一样。非常感谢你的时间,安妮特。这是一次很棒的谈话。我确实想确定,如果人们想在各种社交媒体上关注你,关注你的最佳方式是什么?
Annette Zimmermann 博士(55:56):
最好的方式可能是在 Twitter 上,所以是@DrZimmermann,末尾有两个 N。是啊。我一直在推特上。
杰瑞米·哈里斯(56:06):
完美,耶。很不幸,我也是。改天的话题。太好了。我们会确保链接到那个。我们要写一篇博客文章来配合播客。人们也可以阅读,我们会提供一些你作品的链接,这也很有趣。非常感谢你抽出时间。真的很感激。
安妮特·齐默曼博士(56:21):
非常感谢。谢谢你邀请我。这是一次令人着迷的谈话。
哈利斯(56:26):
牛逼。
数据收集的伦理
您的数据来源是否符合道德规范?
所以你已经准备好收集一些数据并开始建模,但是你如何确定你的数据来源是合乎道德的呢?
CW:我将在下面的一节中谈论心理健康和自杀预防。
当前的数据保护形势
1996 年通过了《健康保险可携带性和责任法案》,简称 HIPAA,以保护医疗后的敏感和识别个人健康数据。目标是一个严格的“需要知道”的医疗数据共享,除非患者签署了特定用途的同意书。为了“共同利益”也有一些例外,包括枪伤和刀伤、与犯罪有关的伤害、可能的虐待案件和传染病。
后来的补充,2013 年的综合最终规则,更新了 HIPAA,包括对违反法律的组织进行更严厉的经济处罚,患者访问电子信息的权利,并将遗传数据纳入 HIPAA 保护区。正如Weisse博士指出的,虽然完全控制个人医疗记录的访问是“隐私权倡导者的圣杯”,但我们当前的医疗管理和保险系统使之不可能。
虽然这些法律是必要的,并且在理论上是可行的,但在实践中,它们在医患双方都造成了巨大的混乱。此外,像许多管理新兴技术的立法一样(见面部识别,Siri 总是在听,…),它对于有效覆盖尚未建立或想象的技术来说是可悲的不足。
最近的欧盟立法《一般数据保护条例》(GDPR)在保护个人数据方面走得更远。关于该法律的效力有很多讨论,但毫无疑问,它是世界上最严格的数据保护法之一。与 HIPAA 或其他美国数据保护法不同,GDPR 要求组织在默认情况下使用最高的隐私设置,并将数据使用限制在六个级别,包括同意、重要利益和法律要求。
此外,在为此目的给予明确同意之前,不得收集任何数据,并且该同意可以随时收回。这意味着一个服务协议条款不能让一家公司无限期地自由支配用户的数据。违反 GDPR 的组织将被处以高额罚款,最高可达 2000 万欧元或上一年总收入的 4%。例如,英国航空公司被罚款 1.83 亿英镑,因为糟糕的安全性导致了针对其 50 万用户的略读攻击。
在这些措施不足的地方
脸书的自杀算法
2017 年,在一系列直播自杀事件后,脸书在未经同意的情况下开始抓取用户的社交媒体内容**,以建立一个自杀预防工具。在非自愿收集之外,人们会认为对精神健康、抑郁和自杀意念的评估会被归类为敏感的健康信息,对吗?根据 HIPAA 的说法,因为脸书不是医疗保健组织,所以他们不受该领域法规的约束。**
这是一个明显的、但在当时可以理解的失误。当 HIPAA 被编写时,只有医疗保健组织可以访问这些个人健康标识符(PHIs)似乎是合理的。随着复杂的人工智能和资源无穷的科技巨头的出现,私人、非医疗保健组织正在试图在没有直接监督的情况下在医疗领域进行创新。
让这种影响具体化的是脸书在他们的系统将用户标记为自杀后联系执法部门的 3500 个案例。有一次,执法部门甚至将用户的个人信息发送给了《纽约时报》,这显然侵犯了隐私。
欧盟 GDPR 实际上禁止了脸书的收集方法,因为收集精神健康信息需要用户的明确许可。虽然脸书的项目确实有做好事的潜力,但其道德、有效利用的下一步还不明朗。
23andMe 的基因数据
监管不力的另一个例子是流行的基因和血统测试公司 23andMe——同样不受 HIPAA 约束——以及他们向制药公司出售用户的基因信息。保险公司使用用户的基因数据在任何症状出现之前识别预先存在的状况存在潜在的风险。这种做法在某些情况下是不合法的,特别是对于健康保险,但对于人寿保险或伤残保险则不是。
这种做法已经暴露出一些伦理上的模糊之处。一个例子是亨廷顿氏病,一种由单个缺陷基因控制的迟发性大脑疾病。美国亨廷顿氏病协会有一份关于选择是否进行基因检测的完整指南,因为尽管从技术上来说保险公司利用这一信息是非法的,但这一信息总有被滥用的潜在风险。
未来和你
随着技术的不断进步,我们将不可避免地听到更多监管失误的故事。至关重要的是,政府要及时了解新兴创新的影响,以及如何在一个越来越缺乏数据隐私的世界中保护公民的数据隐私。
作为一名数据科学家,您必须了解您的数据是如何收集和利用的。这里有一大堆问题要问你自己和你的模特。
以下是候选名单:
- 同意:用户必须明确同意对其个人数据的每一次新的使用。在某些司法管辖区,这是一种法律依赖,但在所有情况下都是一种良好的做法。
- 透明度:特别是在有具体影响的情况下,你能解释一下你的模型和数据处理是如何得出一个决定的吗?
- 责任:评估模型的潜在危害,并努力限制所述危害。模型被误解的可能性有多大,善意的还是恶意的?
- 匿名:在数据科学过程的各个阶段,如何保护用户的身份信息?在任何时候,谁有权访问这些数据?识别数据甚至需要在数据集中吗?如果没有,请删除它。
- 偏差:采取了哪些步骤来理解数据集中的潜在偏差?甚至缺失值也能代表偏见吗?参见标记。
来源
[1] T. Truyen,W. Luo,D. Phung,S. Gupta,S. Rana 等人,从医院医疗数据中提取特征并应用于风险预测的框架 (2014),BMC 生物信息学 15:425–434。
[2] D. Wade,收集和使用医疗保健数据的伦理:主要责任在于相关组织,而不是伦理审查委员会 (2007),BMJ 334:1330–1331。
[3] S. Mann、J. Savulescu 和 B. Sahakian,《促进健康数据的道德使用以造福社会:电子健康记录、同意和简易救援的责任》 (2016 年),《皇家学会哲学汇刊》374:1–17。
[4] A. Weisse, HIPAA:一项有缺陷的立法 (2014),贝勒大学医学中心学报 27(2):163–165。
无人驾驶汽车的伦理
汽车应该决定你的生死吗?
Bram Van Oost 在 Unsplash 上拍摄的照片
前言
自动驾驶汽车已经存在,人类与它们分享我们的道路和高速公路。它们是迄今为止人类创造的技术最先进的创新之一。像任何新技术一样,会有新的伦理问题围绕着它。
生产自动驾驶汽车,其选择会影响司机和周围环境的生计,这是否道德?
我将讨论为什么生产自动驾驶汽车是道德的证据,以及反对生产自动驾驶汽车的证据。在采取结果论的方法分析双方后,我将对上述问题给出最符合伦理的答案。
利益相关者的期望和价值观
自动驾驶汽车爱好者:
他们的期望是能够利用自动驾驶汽车将他们从 A 点到 b 点。他们重视自动驾驶汽车的创新、效率、可靠性、安全性和可达性。
制造自动驾驶汽车的公司(即特斯拉和谷歌):
他们的期望是能够提供自动驾驶汽车爱好者所要求的服务。他们重视社会对自动驾驶汽车的开放、创新的自由以及自动驾驶汽车爱好者的持续支持。
旁观者:
他们的期望是在旅行时不会受到自动驾驶汽车的伤害。他们认为,确保所有旁观者的安全和福祉是公司和政府的社会和企业责任。他们重视自动驾驶汽车公司和车主将对他们的汽车造成的任何伤害负责。
决策者和政府:
他们的期望是通过为新的创新创造规章制度、最小化风险和保护公民来改善社会。他们重视安全、效率和生产力。
自动驾驶汽车是道德的
这些算法非常聪明,是由最伟大、最聪明的人创造的:
- 在无人驾驶汽车做出道德选择中,尼尔森解释了谷歌和类似公司为创造无人驾驶汽车而构建的复杂算法。构建软件的过程并不简单,需要全世界最聪明的人。毕竟谷歌的招聘率在 0.2%左右(Eadicicco)。众所周知,这些公司不仅雇佣最有声望、具备适当技能的申请人,还雇佣最有道德、最世故的人。建造自动驾驶汽车需要跨职能团队多年的研究、开发和合作,因为每个细节都经过了细致的研究和测试。算法在不断学习,不断进行改进,以提高自动驾驶汽车技术。
- 尼尔森解释了谷歌自动驾驶算法的工作原理。当自动驾驶汽车看到一名骑自行车的人时,它会在其车道上稍微移动一下,给骑自行车的人更多空间。谷歌的算法通过风险大小来计算概率,将其与要获得的信息的价值进行比较,并使用它来做出决策。被卡车擦撞的风险大小为 5000,与另一辆车迎头相撞的风险大小为 20000,撞到行人的风险大小为 100000(Nelson)。这个评分系统计算不同场景、人、动物、物体的价值,并快速做出最佳行动方案的决策。
- 驾驶总是会涉及各方的风险,谷歌通过在各方之间分配风险分享了其关于道德决策过程的观点。谷歌认为,如果工程师对自动驾驶汽车进行编程,让它们学习和计算现实生活中的价值,自动驾驶汽车可以做出道德决定。谷歌和类似公司开发的算法包含了世界顶级思想家多年的思考和研究。因此,许多人可能会认为这证明了自动驾驶汽车的合理性。
证据显示,自动驾驶汽车比人工控制的汽车更安全
- 在麦肯锡公司(McKinsey and Company)2015 年的一份报告中,有证据表明,自动驾驶汽车将大幅减少高达 90%的车祸,每年防止高达 1900 亿美元的损害和健康成本,并拯救成千上万的生命(拉姆齐)。自动驾驶汽车被编程为遵守所有交通法规。自动驾驶汽车在行驶过程中从不被手机分心,也不会酒后驾车或睡着。自动驾驶汽车在检测和避免障碍方面表现出色,在糟糕的道路上具有比人眼更强的视觉敏锐度。自动驾驶汽车对周围环境有 360 度的视角,可以处理比任何人都多得多的信息。2017 年,美国估计有 4 万起交通死亡事故,其中 90%以上是由人为错误造成的(Isidore)。自动驾驶汽车有可能防止 90%的碰撞,仅在美国每年就能挽救约 3 万条生命(斯科特)。研究表明,自动驾驶汽车事故比人为事故要罕见得多;负面的看法主要是由于媒体夸大了情况(博恩)。
- 而且,由于人类情感的虚弱,人们对自动驾驶汽车的接受度不高。当人类卷入一场车祸时,原谅是很容易的,因为我们认识到人们在情绪激动时会保护自己。然而,当谈到自动驾驶汽车时,人们并没有相同的思维模式,因为机器不会做出反应;它们被有意编程来执行特定的动作(Trappl)。尽管有明确的证据表明,通过消除驾驶等式中的人为错误,自动驾驶汽车比人类驾驶的汽车安全得多,但许多人不能忽视这种好处,因为他们被已经发生的几起自动驾驶汽车事故弄得措手不及。
自动驾驶汽车将让世界变得更美好
- 自动驾驶汽车可以改善每个人的生活方式。美国国家科学基金会(National Science Foundation)发现,有了自动驾驶汽车,交通流量的改善得到了推动:“路上有一辆自动驾驶汽车可以通过影响周围至少 20 辆人类控制的汽车的交通流量来减少拥堵”(布朗)。自动驾驶汽车有助于确保以恒定的速度移动,而不是造成交通堵塞,交通堵塞通常是由人类强行刹车和减速造成的。由于交通是世界各地城市的一个主要问题,这是证明无人驾驶汽车合理性的众多原因之一。
- 此外,自动驾驶汽车的油耗也降至最低。美国国家科学基金会发现,自动驾驶汽车可以在交通堵塞期间减少 40%的总油耗(Brown,2018)。能源信息管理局预测,到 2050 年,自动驾驶汽车可以减少车辆 44%的燃料消耗,减少卡车 18%的燃料消耗(麦克马洪)。美国运输协会预测,自动驾驶汽车可能会导致石油消耗和相关温室气体排放减少 2-4%(Pyper)。这些统计数据显然为自动驾驶汽车建立了一个坚实的案例,因为与普通汽车相比,自动驾驶汽车对环境的影响较小。
- 最后,自动驾驶汽车可以减少无效和紧张的驾驶时间。如果一个人不容易晕车,花在开车往返目的地的时间可以用于其他任务。根据美国人口普查局的数据,美国人的平均通勤时间为 25.4 分钟;然而,像纽约、洛杉矶和旧金山这样的大城市可以看到单程 30 分钟以上(西迪基)。此外,从家到工作单位单程花费超过一个小时的极端通勤者比以前增长得更快。有了自动驾驶汽车,生产力水平将会提高,因为人们可以在汽车行驶时工作、睡觉、吃饭或完成其他任务。
自动驾驶汽车不道德
随机决策优于预先确定的决策
- 一些人可能会认为,随机的人类事故比已经预先确定了某人在车祸中死亡的算法更合理。此外,许多人问谁将为自驾车造成的事故负责。这是司机的责任吗?汽车制造商?开发软件的工程师?有些人认为情况太复杂,人们应该让事故自然发生。其他人认为,人们对另一个人的生活做出决定,并支持随机事故,这是不道德的。
- 来自博洛尼亚大学的 Guiseppe Contissa 探索了如果自动驾驶汽车的控制权和责任交还给司机(Beall)会发生什么。该团队设计了一个转盘,允许司机将汽车设置为三种驾驶选项之一:完全利他、完全利己或公正。这个特征允许驾驶员给出他或她相对于其他人的价值。汽车将获取驾驶员提供的知识,并执行预先确定的动作。然而,寻找自动驾驶汽车解决方案的预期目的引发了更大的伦理问题。如果每个人都把旋钮转到完全利己主义模式会怎么样?如果人们把旋钮转到不偏不倚:那么谁来负责?孔蒂萨试图解决的问题让人们再次对他们的自动驾驶汽车有了一些控制,但只是在一定程度上,主要的伦理问题仍然没有解决。由于没有明确的解决方案,许多人会认为随机和无计划的事故比自动驾驶汽车的预定算法更道德。
我们不应该让公司、政府和决策者控制我们的命运
- 人们也可能会争辩说,在车祸中让别人而不是自己来控制自己的命运是不道德的。在自动驾驶汽车的例子中,工程师基于他们的道德规范开发了这项技术。他们认为正确和错误的东西控制着自动驾驶汽车,他们的决定影响着司机、乘客和旁观者的生活。政策制定者和政府还试图制定无人驾驶汽车的规则和法规,增加对司机、乘客和旁观者的额外影响。因为这赋予了人们控制他人生活的权力,许多人感到不安,并认为无人驾驶汽车是不道德的。人们认为这是不道德的,因为他们认为一个人不应该被别人控制。
- 德国试图用实际的指导方针来解决自动驾驶汽车的伦理问题。国家提出:“自动驾驶汽车应该总是试图将人类死亡降至最低,不应该基于年龄、性别或任何因素对个人进行歧视。人的生命也应该永远优先于动物或财产”(诺瓦克)。德国认为,自动驾驶汽车应该根据政府制定的先例规则,就拯救或伤害谁做出道德决定。根据科学杂志发表的一项研究,超过 75%的参与者支持这种功利主义的方法。然而,另外 25%的人对政府干预他们的生活没有强烈的感觉。他们不相信政府有权给生命定价。无人驾驶汽车的反对者有充分的理由反对它,因为人们对道德有不同的看法。
数据存储和黑客对社会构成威胁
- 为了让自动驾驶汽车高效运行,必须通过汽车的传感器收集大量数据。在驾驶过程中,自动驾驶汽车会不断存储周围环境的数据,让它们能够学习并变得更加智能。这引发了许多安全问题,因为自动驾驶汽车持有大量数据,包括司机和乘客去过哪里,手机连接时的司机通信,以及司机和乘客在车内的对话。反对自动驾驶汽车的人认为,自动驾驶汽车收集这种个人敏感信息是不道德的。滥用数据可能会对一个人的身份、财务和生计造成损害。
- 还有一个很大的恐惧就是不法分子远程黑指挥一辆车。在播客中,自动驾驶汽车的法律影响,Ballard Saphr 隐私&数据安全集团的合伙人 Phil Yannella 表示,自动驾驶汽车的不断发展也将导致黑客攻击的风险增加(路透社)。Yannella 解释说,自动驾驶汽车有多个连接点,包括计算机局域网、制动器、传动系统、汽车和制造商之间的连接、汽车和其他自动驾驶汽车之间的连接以及任何有线公共基础设施。这些连接可能会被黑客攻击,如果放在错误的人手里,可能会导致严重的损害。由于自动驾驶汽车的风险增加,许多人认为它们对社会不道德。
结论
自动驾驶汽车的功利主义受到了有力的辩护和攻击。当人类坐上汽车的驾驶座时,实在法规定他们对自己的行为负全部责任。当涉及到自动驾驶汽车时,有一个明显的灰色地带:司机是否应对自动驾驶汽车伤害无辜的旁观者负责?还是自动驾驶汽车对无辜旁观者的伤害负责?陷入事故的人类司机和自动驾驶汽车必须在保护自己还是保护他人的问题上做出瞬间的道德选择。因为灰色地带,关于自动驾驶汽车是否道德的争论一直很多。
无人驾驶汽车的反对者有充分的理由。一些人认为车祸应该自然发生,而不是由算法提前几个月或几年决定的预定结果。一些人也认为让别人决定自己的命运是不道德的。通过将驾驶体验交给自动驾驶汽车,司机失去了对自己命运的控制。收集和存储的数据量增加了一些人的担忧。人们担心黑客不仅会窃取他们的私人数据,还会对社会造成重大危害。他们认为保护无辜的旁观者免受伤害是公司、政府和决策者的社会和企业责任。
对我来说,自动驾驶汽车的好处大于坏处。首先,自动驾驶汽车是由当今社会一些最具创新性和受教育程度最高的人创造的。发明者的目的是为司机和地球创造一个更好的社会。此外,事实证明,自动驾驶汽车比真正的司机安全得多;许多研究和从他们那里收集的数据表明了这一点。从长远来看,自动驾驶汽车将提高全世界人民的效率和生产力。为了让更多人对自动驾驶汽车感到放心,公司和自动驾驶汽车的车主应该明白他们对所有利益相关者的安全负责。风险管理技术可用于以透明和灵活的方式量化概率风险。为了创建道德工具,开发人员应该继续从过去的风险管理和道德挑战情况中学习经验。
允许自动驾驶汽车将满足自动驾驶汽车爱好者、司机和生产这些汽车的公司的期望和价值观。随着科技的进步,不可避免的会有更多的发明被开发出来。就无人驾驶汽车而言,这既创造了机会,也带来了危害。人类将需要创造工具,如规则和条例,来保护自己。随着更多关于自动驾驶汽车的法律法规的制定,这些法律法规将致力于平衡自动驾驶汽车的道德和经济。
资源
Beall,a .(2017 年 10 月 18 日)。你可以编程的汽车在车祸中牺牲你。*新科学家。*从 Nexis Uni 检索。
博恩博士(2016 年 10 月 20 日)。埃隆·马斯克:媒体对自动驾驶汽车的负面报道可能会“害死人”。检索自https://www . the verge . com/2016/10/19/13341306/elon-musk-negative-media-autonomous-vehicles-killing-people
布朗博士(2018 年 7 月 04 日)。自动驾驶汽车或自适应巡航控制如何缓解交通堵塞。检索自https://www . USA today . com/story/money/2018/07/03/自驾-减少-堵车-学习-说/741985002/
你所在地区的通勤时间。(未注明)。从 https://project.wnyc.org/commute-times-us/embed.html取回
Eadicicco,L. (2014 年 10 月 23 日)。以下是你可能不会被谷歌聘用的原因。检索自https://www . business insider . com/Google-hiring-process-Committee-2014-10
c .伊西多尔(2018 年 3 月 21 日)。自动驾驶汽车已经非常安全了。检索自https://money . CNN . com/2018/03/21/technology/自驾-汽车-安全/
南基奥(2016 年 9 月 20 日)。“自动驾驶”汽车炒作的危险。*华尔街日报。*从http://ezproxy.redlands.edu/docview/1820989399?取回 accountid=14729
j .麦克马洪(2017 年 4 月 19 日)。自动驾驶汽车节省大量燃料。检索自https://www . Forbes . com/sites/jeffmcmahon/2017/04/17/big-fuel-savings-from-autonomous-vehicles/# 7e 85 C3 f 34390
尼尔森 g .(2015 年 7 月 13 日)。自动驾驶汽车做出道德选择。*汽车新闻印刷版。*从 Nexis Uni 检索。
诺瓦克,P. (2018 年 2 月 02 日)。无人驾驶汽车的伦理困境。检索自https://www . the globe and mail . com/globe-drive/culture/technology/the-ethical-dilemmas-of-self-driving cars/article 37803470/
隐私问题和自动驾驶汽车:我们准备好迎接自动驾驶汽车了吗?(2018 年 2 月 15 日)。检索自https://blogs . Thomson Reuters . com/answer son/privacy-concerns-self-driving-cars-ready-autonomous-vehicles/
j . pyper(2014 年 9 月 15 日)。无人驾驶汽车可以减少温室气体污染。检索自https://www . scientific American . com/article/无人驾驶汽车可减排温室气体污染/
拉姆齐,M. (2015 年 3 月 05 日)。研究表明,自动驾驶汽车可以减少事故。检索自https://www . wsj . com/articles/self-driving-cars-can-cut-down-on-accidents-study-says-1425567905
西迪基,F. (2018 年 9 月 17 日)。调查数据显示,美国人的通勤时间越来越长。检索自https://www . Washington post . com/transportation/2018/09/17/American-commutes-keep-get-longer-again-during-survey-data-show/?utm_term=.eebde421d861
特拉普尔河(未注明日期)。自动驾驶汽车的伦理系统:导论。应用人工智能, 30 (8),745–747。https://doi.org/10.1080/08839514.2016.1229737
AlphaGo 向 MuZero 的进化
DeepMind 的 MuZero 算法在 57 款不同的 Atari 游戏中达到了超人的能力。这篇文章将解释导致它的背景!
DeepMind 最近发布了他们的 MuZero 算法,在 57 款不同的 Atari 游戏中以超人的能力为标题。
可以玩雅达利游戏的强化学习代理很有趣,因为除了视觉上复杂的状态空间,玩雅达利游戏的代理没有一个完美的模拟器,它们可以像在国际象棋、日本象棋和围棋中那样用于规划。
这种“完美模拟器的想法是限制 AlphaGo 及其后续改进(如 AlphaGo Zero 和 AlphaZero)的关键之一,仅限于国际象棋、Shogi 和 Go,而对某些现实世界应用(如机器人控制)毫无用处。
强化学习问题包含在下面描述的马尔可夫决策过程(MDP)中:
国际象棋、围棋和松木带有一个知道如何操作的模拟器
AlphaGo、AlphaGo Zero、AlphaZero 和 MuZero 的算法家族通过使用规划扩展了这一框架,如下图所示:
整合规划扩展了强化学习问题的框架
DeepMind 的 AlphaGo、AlphaGo Zero 和 AlphaZero 利用了(动作、状态)→下一个状态的完美模型,以蒙特卡罗树搜索(MCTS) 的形式进行前瞻规划。MCTS 是使用深度神经网络进行策略映射和价值估计的完美补充,因为它平均了这些函数近似的误差。MCTS 为 AlphaZero 在国际象棋、围棋和围棋方面提供了巨大的推动力,在那里你可以做完美的规划,因为你有一个完美的环境模型。
穆泽罗通过学习下面描述的动力学模型,提供了一种挽救 MCTS 计划的方法:
穆泽罗的蒙特卡洛树搜索
MuZero 的基于模型的强化学习方法,具有从(s,a)→(s’,r)的参数模型图,在于它**没有精确地重建 s’**处的像素空间。与 Ha 和 Schmidhuber 的“世界模型”中的图片形成对比:
基于模型的 RL 在模型中重建像素空间的例子。图片来自:https://worldmodels.github.io/
MuZero 的这种规划算法在 Atari 领域非常成功,在强化学习问题上有巨大的应用潜力。本文将解释 AlphaGo、AlphaGoZero、AlphaZero 和 MuZero 的发展,以便更好地理解 MuZero 的工作方式。如果你感兴趣,我还制作了一个视频来解释这一点:
AlphaGo
AlphaGo 是该系列的第一篇论文,表明深度神经网络可以通过预测策略(从状态到行动的映射)和价值估计(从给定状态获胜的概率)来玩围棋。这些策略和值网络用于通过选择从给定状态采取哪些动作以及哪些状态值得进一步探索来增强基于树的前瞻搜索。
AlphaGo 使用 4 个深度卷积神经网络,3 个策略网络和一个价值网络。策略网络中的 2 个使用专家移动的监督学习进行训练。
监督学习描述了由某种 L(y ',y)组成的损失函数。在这种情况下,y’是策略网络从给定状态预测的动作,而 y 是专家玩家在该状态下已经采取的动作。
首次展示策略是一个较小的神经网络,它也接受较小的输入状态表示。因此,与高容量网络相比,首次展示策略具有明显较低的专家移动建模准确度。然而,首次展示策略网络的推理时间(对给定状态的动作进行预测的时间)是 2 微秒,相比之下,大型网络的推理时间是 3 毫秒,这使得它对于蒙特卡罗树搜索模拟非常有用。
S1 策略网络用于初始化第三策略网络,该第三策略网络通过自播放和策略梯度来训练。与学习价值函数然后使策略相对于价值函数贪婪的其他 RL 算法相比,策略梯度描述了直接相对于结果奖励优化策略的思想。策略梯度训练的策略网络与其自身参数的先前迭代进行对抗,优化其参数以选择导致胜利的移动。自玩数据集随后用于训练价值网络,以从给定状态预测游戏的赢家。
AlphaGo 最后的主力是 MCTS 政策和价值网络的结合,如下图所示:
MCTS 的想法是执行前瞻搜索,以更好地估计要立即采取的行动。这是通过从一个根节点(棋盘的当前状态)开始,通过选择一个动作来扩展该节点,并对状态“动作转换”产生的后续状态重复这一操作来完成的。MCTS 基于这个 Q + u§ 项来选择沿着树的哪个边,这个项是价值网络对状态的估计、策略网络给予该状态的原始概率密度、以及该节点被访问过多少次的负加权的加权组合,因为这被一次又一次地重复。AlphaGo 的独特之处在于使用首次展示策略模拟来平均价值网络的贡献。首次展示策略将一直模拟,直到导致成功或失败的情节与带有额外参数 lambda 的该状态的价值函数估计相混合。
AlphaGo Zero
AlphaGo Zero 通过使 AlphaGo 算法更加通用,并从**“零”人类知识**出发,显著改进了 AlphaGo 算法。AlphaGo Zero 避免了专家走法初始化的监督学习,并将值和策略网络结合到单个神经网络中。与 AlphaGo 中更简单的卷积网络相比,这个神经网络也是按比例放大的,以利用一个 ResNet 。执行值和策略映射的 ResNet 的贡献在下图中是显而易见的,该图比较了双重任务 ResNet 和独立任务 CNN:
AlphaGo Zero 最有趣的特征之一是它使用 MCTS 发现的动作分布来训练其策略网络的方式,如下所示:
MCTS 通过将其用作监督来训练策略网络,以更新策略网络。这是一个聪明的想法,因为与政策网络从状态到行动的即时映射相比,MCTS 通过前瞻搜索产生了更好的行动分布。
阿尔法零
AlphaZero 是将 AlphaGo 家族推广到围棋之外的第一步,着眼于下棋和下日本象棋所需的变化。这需要公式化残差神经网络的输入状态和输出动作表示。
在 AlphaGo 中,状态表示使用一些手工制作的特征平面,如下所示:
AlphaGo Zero 使用一种更通用的表示法,简单地传入两个玩家的前 8 个棋子位置和一个二元特征平面,告诉代理它正在控制哪个玩家,如下所示:
AlphaZero 使用类似的思想对 Chess 和 Shogi 的输入状态表示进行编码,如下所示:
AlphaZero 还对算法进行了一些更微妙的改变,例如自玩冠军的加冕方式,以及取消围棋棋盘游戏中的数据增强,如反射和旋转。
穆泽罗
这就把我们带到了这个系列目前最先进的,MuZero。MuZero 对算法提出了一个非常强大的概括,允许它在没有完美模拟器的情况下学习**。国际象棋、象棋和围棋都是带有完美模拟器的游戏,如果你将你的棋子向前移动 2 个位置,你就能确切地知道棋盘的最终状态。在 OpenAI 的魔方手这种复杂灵巧的操控任务中,对给定关节施加 30 N 的力就不能说是一回事了。**
下图说明了 MuZero 的主要观点:
图 A 示出了使用表示函数 h 将原始观察值映射到用于基于树的规划的隐藏状态 s0 的流水线。在 MuZero 中,组合的价值/政策网络在这个隐藏状态空间中推理,因此不是将原始观察映射到行动或价值估计,而是将这些隐藏状态作为输入。动态函数 g 学习从隐藏状态和动作映射到未来的隐藏状态。
图表 B 示出了如何通过模仿由 MCTS 产生的动作分布来类似地训练策略网络,该动作分布首先在 AlphaGo Zero 中引入。
图表 C 显示了这个系统是如何被训练的。三个神经网络中的每一个都在价值网络和实际回报之间的差异、动态模型经历和预测的中间回报之间的差异以及 MCTS 行动分布和政策映射之间的差异的联合优化中被训练。
如何在这个优化循环中训练表示函数 h?
表示函数 h 通过随时间的反向传播在该联合优化方程中发挥作用。比方说,您正在计算 MCTS 行动分布 pi(s1)和策略分布 p(s1)之间的差值。p(s1)的输出是 p(g(s0,a1))的一个结果,p(g(h(raw_input),a1))的一个结果。这也是时间反向传播将更新信号一路发送回隐藏表示函数的方式。
alpha go→alpha go Zero→alpha Zero→MuZero
我希望这篇文章有助于澄清 MuZero 如何在以前的算法 AlphaGo、AlphaGo Zero 和 AlphaZero 的上下文中工作!感谢阅读!
纸质链接
alpha go:https://www.nature.com/articles/natur…
AlphaGo 零分:https://www.nature.com/articles/natur…
阿尔法零:https://arxiv.org/abs/1712.01815
穆泽罗:https://arxiv.org/abs/1911.08265
基于树的分类模型的演变
充分利用决策树
基于树的分类模型是一种监督的*机器学习算法,它使用一系列条件语句将训练数据划分为子集。每一次连续的分裂都会增加模型的复杂性,这可以用来进行预测。最终结果模型可以被视为描述数据集的逻辑测试路线图。决策树对于中小型数据集很流行,因为它们易于实现,甚至更易于解释。然而,它们并非没有挑战。在本文中,我们将强调基于树的分类模型的优点和缺点,以及克服它们的进展。*
照片由 chrilejarazu 在上拍摄
决策树的构造
以下示例描述了一个只有两个要素和两个类的样本数据集(左)。决策树算法从根节点中的所有 15 个数据点开始。该节点被称为不纯的,因为它包含异构数据的混合。在每个决策节点,该算法在杂质减少最多的目标特征上分割数据集,最终产生具有同质数据的叶节点 / 终端节点(右图)。有几个比较流行的衡量杂质的指标——基尼杂质 和 熵 。虽然不同的决策树实现在计算中使用的杂质度量会有所不同,但总的概念是相同的,并且结果在实践中很少发生实质性变化。划分过程继续进行,直到不能再进行进一步的分离,例如,模型希望达到每个叶节点尽可能快地变成纯的状态。在进行预测时,新的数据点会遍历一系列决策节点以得出决定。
简单决策树的可视化
强项
- 它们是直观的和容易理解的的*,甚至对于非分析背景的人来说也是如此。***
- 决策树是一种非参数方法,不要求数据集遵循正态分布。
- 它们能够容忍数据质量问题和异常值,例如,它们需要较少的数据准备,如实施前的缩放和标准化。此外,它适用于分类变量和连续变量。
- 它们可以在数据探索阶段用于快速识别重要变量。
挑战
- 决策树容易出现过拟合,当函数过于接近训练数据时就会出现这种情况(参见 偏差-方差权衡 )。当决策树模型学习到训练数据中的粒度细节和噪声,以至于削弱了它对新数据进行预测的能力时,就会出现这种情况。创建一个过于复杂的模型有可能对以前没有见过的数据做出糟糕的预测。
- 决策树遭受高方差。如果数据集很小,根据训练和测试样本的拆分方式,结果可能会有很大不同。
进化
最近,为了进一步挖掘基于树的模型的潜力,已经进行了大量的改进和验证。以下流程记录了进度:
基于树的模型的演变
提前停止(预修剪)
有几种方法可以减少过度拟合,防止模型学习过于具体和复杂的模式。
- 节点分割的最小样本
- 树的最大深度
- 分割时要考虑的最大特征数
因为很难提前知道什么时候停止种树。可能需要一些迭代来微调这些超参数。建议在训练时可视化树,从较低的 max_depth 开始,迭代增加。
使用 CV 对包含 20 个特征的样本数据集进行测试
修剪(修剪后)
修剪通过删除对模型的预测能力没有好处的叶节点来进行。这是简化模型和防止过度拟合的另一种方法。在现实中,一个完全成长的决策树可能有太多的分支,最终成为冗余的。剪枝通常是在模型建立后,通过检查模型在验证或测试数据集上的性能来完成的。通过删除对性能产生最小负面影响的节点,这一过程被称为成本复杂性修剪, it 降低了复杂性,并允许模型更好地概括。
引导聚集
Bagging 是一种集成技术,用于通过考虑来自多个决策树模型的结果来减少预测的方差,这些决策树模型是在同一数据集的不同子样本上训练的。当数据大小有限制时,这尤其有用。根据问题,使用平均值、中值或众数组合所有模型的预测。
使用 CV 对包含 20 个特征的样本数据集进行测试
随机森林
随机森林是一种集成学习方法,使用不同的特征子集构建多个树模型,有或没有采样(即引导)。它可以有效地处理具有许多变量的高维数据集,因为只有一个子集用于构建单独的树。限制每个树模型的特征数量的直觉是去除它们之间的相关性,这发生在强预测器被决策节点一致使用时。高度相关模型的协作并不能有效减少结果的差异。随机森林很受欢迎,因为它是通用的,并且可以以高精度快速训练。
值得注意的是,这种方法通常用于理解数据集和确定变量的重要性,因为它与解决问题有关——排除有价值的特征会导致错误增加。
助推
Boosting 是另一种类型的集成学习,组合弱学习器以实现改进的模型性能。弱学习者是预测相对较差的简单模型。boosting 的概念是按顺序训练模型,每次都试图比以前更好地拟合。一种被称为自适应增强 (AdaBoost)的方法基于先前的结果修改数据点的权重。对于模型构建的每个后续实例,正确分类的数据点被给予较低的权重,而错误分类的数据点被给予较高的权重。较高的权重指导模型学习这些数据点的细节。最终,所有的模型都有助于做出预测。
装袋与增压
梯度增强(和 XGBoost)
梯度增压方法更加复杂。梯度增强不是在每次模型构建迭代中调整权重,而是将后续模型与前一个模型的残差相匹配。这种方法有助于树木在表现不好的地方逐渐得到改善。换句话说,它迭代地提高了单棵树的精度,从而提高了整体模型的性能。梯度提升受众多调谐参数的影响,必须仔细考虑这些参数。当数据集中的关系高度复杂和非线性时有效。
extremeGradientBoosting,或简称为 XGBoost,是标准梯度增强方法的一种实现,只是增加了一些内容。首先,它使 正则化 成为可能,这进一步有助于减少过度拟合。XGBoost 的开发目标是优化计算性能。由于梯度推进按顺序训练模型,因此实施起来可能会很慢。XGBoost 的一些显著特性包括并行化、分布式计算、核外计算和缓存优化。
摘要
在本文中,我们回顾了一些宽泛的术语和技术,以改进基于树的模型。基于树的模型因其直观性而广受欢迎。理解这些机制将有助于创建基线模型。也就是说,没有免费的午餐——即使使用这些技术,调整模型仍然是一个迭代过程,以便充分优化模型性能。