TowardsDataScience 博客中文翻译 2020(三百三十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何通过谷歌数据传输服务建立你的数据流程

原文:https://towardsdatascience.com/elt-data-warehouse-process-via-google-data-transfer-service-and-big-query-9b5aa34b526c?source=collection_archive---------45-----------------------

用一个简单但仍然有效的工具集实现您的 ELT 和 ETL 数据管道

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

卡伦·艾姆斯利在 Unsplash 上的照片

在构建数据仓库或湖并实施 ELT/ETL 过程时,您会遇到许多问题,例如:

  • 什么过程方法更好?ETL 还是 ELT?
  • 数据集成过程使用哪种技术?
  • 最好的数据仓库技术是什么?
  • 还有更多

在这篇短文中,我想展示一种简单而有效的方法,通过谷歌数据传输服务(DTS)和数据仓库技术大查询,来建立 ELT 数据仓库方法。

回顾:ELT 与 ETL

在下文中,对 ELT 和 ETL 的简短总结为不熟悉此事的人快速解释了这两种方法之间的差异。

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

来源:https://fivetran.com/_/api/blog/elt-vs-etl/elt-vs-etl.png[1]

在数据集成工具中进行转换之后,ETL 过程将数据加载到目标系统中,而 ELT 方法在转换数据之前首先将数据加载到目标系统中。通常 ELT 过程比传统的 ETL 过程更受欢迎,因为它实现起来更简单,加载数据更快。

使用谷歌的数据传输服务进行转换

通过 ELT 上传数据的过程可以通过以下方式实现:

  • 手动上传数据
  • 数据集成工具,如 talend/谷歌数据流/云功能等。
  • 使用 DTS(目前仅限于亚马逊 S3、Google Play 等少数数据源。)

加载数据后,可以使用 Big Query 中的数据传输服务通过 SQL 实现转换,如下图所示:

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

通过数据传输服务安排查询-按作者排列的图片

Big Query 中转换任务的一个例子是连接两个表,对列数据类型或值进行一些转换,并将它们保存为一个新的数据对象,以便以后进行分析。编写完 SQL 并点击“Schedule query”后,您可以通过弹出的配置管理器(上图的右侧)自动执行该操作。

DTS 将为您提供通过调度查询来自动化转换任务的可能性,例如在每天的某个时间(类似于批处理和夜间 OLAP 操作),但由于 GCP 内的可伸缩性,速度会快得多。

这种方法的优点

这种方法带来了某些优势:

  • 你只需要使用 GCP 本地服务(不需要大型工具集。) [2]
  • 转换可以由 SQL 完成(即使技术经验较少的员工也可以实现数据准备逻辑。)
  • DTS 和 Big Query 是完全的 SaaS 技术(不用担心基础设施和伸缩性。)
  • DTS 可以很好地处理大数据

结论

由于云平台为我们提供了无限的可扩展性,并且只需点击一下鼠标就可以实现许多服务,因此您可以快速建立数据仓库和所需的数据管道。这个例子向你展示了如何只使用两个 Google 服务和 SQL 来完成所有的设置。

资料来源和进一步阅读

[1]五川,https://fivetran.com/_/api/blog/elt-vs-etl/elt-vs-etl.png

[2]谷歌,【https://cloud.google.com/products/data-transfer

阐明药物发现中的数据科学——一位首席技术官的叙述

原文:https://towardsdatascience.com/elucidating-data-science-in-drug-discovery-a-ctos-account-2c9dce19cdde?source=collection_archive---------56-----------------------

讨论药物发现的阶段,研究领域,他对数据科学候选人的评估标准,以及更多…

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

肯德尔Unsplash 上拍摄的照片

新冠肺炎成为头条新闻已经 4 个多月了,全世界都在急切地期待着某种治愈这种疾病的魔法,而将一种药物推向市场可能就是这种魔法。

为什么我称之为魔法?

我们很多人都知道,将一种新药推向市场通常需要至少 10-15 年的工作,包括研究、实验、试验、制造,然后来回获得 FDA 的批准。世界上最好的医学院、实验室和制药公司的研究科学家正在推动这些实验和研究。所有这些都要付出巨大的代价,我们在这里谈论的是数十亿美元。

这也为我们提供了大量需要优化的领域——成本、时间、管理工作、法律合规性、大量实验和试验数据的处理。我们在每个领域都有几家新兴公司。例如,公司就是这样一家公司,它用自己的产品 Polly 为各种医学院和制药公司的实验室提供支持。它通过分析应用和研究工作流为您提供了利用生物医学数据的各种能力。

这里是人工智能被积极使用的几个领域,并且到目前为止已经产生了有希望的结果…

人工智能在医疗保健中的应用领域

有很多关于机器学习和算法的炒作,这些机器学习和算法正在被用于资助研究项目或获得 FDA 的批准。对医疗保健领域人工智能的资助正处于黄金时期,我们有无数初创公司涌现出来解决各种问题。他们几乎涉足了医疗保健的每个领域,从减少行政工作到开发新药。

行政标牌

医疗保健包含大量的运营和管理工作,投资者正在资助许多试图简化这些任务的公司。我们有一些公司正在尝试颠覆已经发生的过程,但鉴于我们生活的技术世界,这些过程已经过时了。

成像

医学成像是取得深远成果的领域。仅人工智能驱动的诊断成像就将在 2-3 年内价值数十亿美元。我们有教育项目,在不同的特定领域培训有抱负的数据科学家和人工智能从业者。

从病人护理到精准医疗

由于电子健康记录的大量采用(EHR) ( ,仅在美国就有 95–98%),我们见证了基因组测序的快速进展。今天的医生手头有足够的数据来准确识别患者档案中的一致模式。

寻找癌症、埃博拉病毒和冠状病毒等疾病治疗方法的药物研究

BERG Health 是医疗保健领域的另一家初创公司,试图通过应用数据科学重塑癌症药物市场。通过整合强大的机器/深度学习算法,该公司已经能够分析来自数千名患者的生物样本。他们处理了每个样本中超过万亿个数据点,这也为开发如此复杂的深度学习模型奠定了基础。

与此类似,在西方,还有其他领域,如放射学、处方准确性、住院费用等,正在被转化为创业公司的商业模式。

谈到医疗保健中的数据科学,我想向您介绍这个新的视频播客系列,在这个系列中,我成功地主持了 exploration a 的 CTO。

数据显示

现在这一背景已经确定,我想向你们介绍我的第一位客人,也是我的导师 Swetabh Pathak,他是 Elucidata 的共同出资人兼首席技术官。给你一些背景,我的第一份也是唯一一份全职工作是在,是一名数据工程师。他们是一个由来自世界上最好的医学工程学校的顶尖人才组成的小团队。一家试图将数据科学嵌入药物研发每个阶段的生物技术公司。一个高素质的领导掌舵着这个组织,使世界上最好的医学实验室与他们的尖端产品和服务。

这次采访的时间与我们所处的《疫情时报》高度一致。在这个大约 30 分钟的对话中,Swetabh 揭示了一些关于医疗保健中应用数据科学兴起的非常有趣的事实。我相信这种丰富的对话与这里的广大观众相关,几乎每个有抱负的数据科学家都有一些东西可以带走。

给你,

数据科学与 Harshit

两个月前,我创办了这个 YouTube 频道,我计划在这里覆盖整个数据科学领域。从学习数据科学到参与项目并谈论行业的新进展。以下是你应该订阅频道的原因:

  • 该系列将涵盖每个主题和子主题的所有必需/要求的高质量教程,如数据科学的 Python 基础
  • 解释了为什么我们在 ML 和深度学习中做这些事情的数学和推导。
  • 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
  • 参与项目,应用概念解决现实世界的问题。

请随时在 Twitter 或 LinkedIn 上与我联系。

EM 算法

原文:https://towardsdatascience.com/em-algorithm-aaaa181af127?source=collection_archive---------17-----------------------

数学背景和例子

具有潜在变量的模型

利用基于机器学习的随机方法,我们将信息来源视为一种概率分布。一旦我们估计了分布,对未知数据进行分类以及预测未来生成的数据就变得简单了。估计概率分布有两个阶段。
1)决定定义分布的模型,例如,概率密度函数的形式(高斯分布、多项式分布……)。这里,考虑高斯混合模型(GMM)作为例子。概率密度函数的形式可以定义为

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

其中 w_k 是从第 k 个高斯分布产生的比率数据。

2)在确定概率密度函数的形式后,我们从观测数据中估计其参数。例如,在高斯分布的情况下,均值和方差是要估计的参数。

我们目前已知的知识是观测数据集 D 和生成分布的形式(未知参数高斯分布)。然而,为了求解 2 ),我们需要关于每个观测数据是从哪个高斯分布生成的信息,并且该信息不直接显示在观测数据中。

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

在这种情况下,代表不能从观测数据集中直接获得的信息的变量被称为潜变量。在上面的例子中,w_k 是一个潜变量。

因此,在 GMM,有必要先估计潜在变量。接下来,我们使用估计的潜在变量来估计每个高斯分布的参数。

在具有潜在变量的模型中估计参数的一种有效方法是期望 和最大化算法 ( EM 算法)。

算法的推导

让我们准备一下这部分用到的符号。

  • D ={ x _i | i=1,2,3,…,N}:随机变量的观测数据集 x : 其中 x _i 为 D 维向量。
  • z :潜在变量。 z _i 对应 x _i
  • θ:待估计的一组参数

我们的目的是用 EM 算法从观测数据集 D 中估计θ

在观测数据为独立同分布的情况下,对数似然函数为

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

我们可以用下面的形式重写我们的目的。

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

对数似然函数 p(x,z |θ)中所示的概率可以用潜在变量 z 的概率表示为以下形式。第三个关系是潜在变量 z 边际分布的结果

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

现在,我们的目标是确定使对数似然函数 log p(x|theta)最大化的参数 theta。然而,不可能从上述关系中直接最大化该值。因此,我们决定在最大化 log p(x|theta)的同时更新参数 theta 的过程。我们认为θ是要定义的最佳参数,θ(t)是参数θ的第 t 步值。在下面的过程中,我们倾向于定义一个更新规则来增加 log p(x|theta(t))与 log p(x|theta)的比较。

这里,给定最近的参数θ和观测数据,我们用条件概率表示 q(z)。

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

因此,log p(x |θ)可以写成

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

我们首先关注更新 theta(t)时 log p(x|theta)-log p(x|theta(t))的变化。我们试图定义导致 log p(x|theta)-log p(x|theta(t))数量减少的规则。

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

重写这个关系,我们得到下面的形式。等式(1):

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

现在,我们需要评估右侧,以找到更新参数θ的规则。为此,考虑一个众所周知的数学关系
log x ≤ x-1。利用这个关系,我们可以得到下面的不等式。

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

因此,等式(1)的第三项是

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

等式(1)的第一项和第二项是非负的。之所以成立是因为,
当我们用 theta(t)代替 theta,term1-term2=0 那么通过最大化第一项,term1-term2 变得大于或等于 0。

考虑这个关系,log p(x | theta)-log p(x | theta(t))≥0。因此,为了最大化等式(1)的左侧,我们只需用最大化等式(1)右侧第一项的θ(t)值来更新θ(t)。

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

设上面更新规则的 argmax 的主语是函数 Q(theta)。

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

我们可以把这个关系翻译成当θ=θ(t)时 log p(x,z |θ)的一个期望值。

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

从这次更新中,我们可以将 EM 算法的过程总结为以下 E 步骤和 M 步骤。

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

高斯混合模型的 EM 算法

让我们以二维高斯混合模型为例。

随机变量: x _n (d 维向量)
潜变量:z_m
混合比:w_k
均值: mu _k (d 维向量)
方差-协方差矩阵:适马 _k (dxd 矩阵)

这里,如果观测数据 x 由第 m 个高斯分布生成,则 z_m = 1,否则 z_m = 0。因此,潜在变量 z 的分布可以写成

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

第 m 个高斯分布的概率密度函数由下式给出

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

因此,数据 x 属于第 m 个分布的概率为 p(z_m=1| x ,其计算公式为

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

初态

随机初始化适马w
t = 1

e 步骤

计算 p(z|x,theta(t))

用θ(t)计算潜变量 z 的期望值。

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

因此,若 z_nm 为 x_n 的潜变量,N_m 为第 m 个分布的观测数据个数,则以下关系成立。

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

m 步

更新参数

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

我们在这一步的目标是定义 w_m,μ_m,适马 _ m,使 Q(θ|θ(t))最大化。

更新穆(意思是)

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

解此方程,μ的更新为

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

更新适马(方差-协方差矩阵)

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

解完这个方程,适马的更新就是

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

更新 w(混合比)

为了推导 w 的更新关系,我们使用拉格朗日方法使 Q(theta|theta(t))最大化,使 w_1+w_2+…+w_M=1

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

求解λ的这个方程并使用约束关系,w_m 的更新规则是

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

所有参数更新:

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

用 Python 实现

人工数据生成

n1=150; n2=250; n3=300
n = n1+n2+n3
x = []
x.append(np.dot(np.random.randn(n1,2),np.sqrt(np.diag([1,4]))))
x.append(np.random.randn(n2,2)+np.dot(np.asarray([[1.]*n2]).T,np.asarray([[8.0,4.0]])))
x.append(np.dot(np.random.randn(n3,2),np.sqrt(np.asarray([[2.45,1],[1,4]])))+16.0)
X = np.concatenate((x[0],x[1],x[2]),axis=0)

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

初始化步骤

def genSigma():
    A = np.random.rand(2,2)+np.eye(2,2)
    #A = np.eye(2,2)*np.random.rand(1)
    S = np.dot(A.T,A)
    #S = np.diag(np.diag(S))
    return Sdef genMu(m):
    mu = np.zeros((2,m))
    mu[0] = np.linspace(np.min(X,axis=0)[0],np.max(X,axis=0)[0],m)
    mu[1] = np.linspace(np.min(X,axis=0)[1],np.max(X,axis=0)[1],m)
    return mu.TSigma = np.zeros((m,2,2))
    for i in range(m):
        Sigma[i] = (genSigma())Mu = genMu(m)    
    W = np.asarray([1.]*m)
    W = W/sum(W)
    L = -float('inf')iteration = 0

e 步和 M 步

while True:
        if iteration >=100:
            break
        iteration+=1# **E step** wN = np.zeros((n,m))
        for j in range(m):
            for i in range(n):
                wN[i,j]=W[j]*gauss(X[i],Sigma[j],Mu[j])sum_wN = np.sum(wN,axis=1)
        Lnew = np.sum(np.log(sum_wN))
        if (Lnew-L) < 0.00001:
            print("Model Converged")
            break
        L = Lnewprint("iter#",iteration," Lnew:",Lnew)
        iters.append(iteration)
        Log.append(Lnew)# **M step**eta = np.zeros((n,m))
        for i in range(n):
            eta[i,:]=wN[i]/sum_wN[i]sum_eta = np.sum(eta,axis=0)
        W = sum_eta/nfor j in range(m):
            tmp = np.zeros((2,))
            for i in range(n):
                tmp += eta[i,j]*X[i]
            Mu[j]=tmp/sum_eta[j]for j in range(m):
            tmp = np.zeros((2,2))
            for i in range(n):
                xmu = (X[i]-Mu[j]).reshape(2,1)
                tmp1 = np.dot(xmu,xmu.T)*eta[i][j]
                tmp += tmp1
            Sigma[j]=tmp/sum_eta[j]

其他功能

import numpy as np
import random
from scipy.interpolate import griddata
from scipy.stats import multivariate_normal
import numpy.ma as ma
from numpy.random import uniform, seed
from matplotlib import cm
from scipy.special import softmax
import matplotlib.pyplot as plt# Gaussian pdf 
def gauss(x,sigma,mu):
    n = multivariate_normal(mu,sigma)
    return n.pdf(x)# Visualize
def plot_countour(sigma,mu):
    xy_range = np.zeros((2,2))
    xy_range[0] = np.linspace(mu[0]-2*sigma[0,0],mu[0]+2*sigma[0,0],2)
    xy_range[1] = np.linspace(mu[1]-2*sigma[1,1],mu[1]+2*sigma[1,1],2)
    x, y = np.mgrid[xy_range[0][0]:xy_range[0][1]:.01, xy_range[1][0]:xy_range[1][1]:.01]
    pos = np.dstack((x, y))
    rv = multivariate_normal(mu, sigma)
    z = rv.pdf(pos)
    levels = np.linspace(np.min(z),np.max(z),5)
    plt.contour(x, y, z,linewidths=1.0,colors='black',levels=levels)
    #plt.contourf(x,y,z,15,cmap=plt.cm.jet)
    plt.xlim([-5,25])

结果(1) M=2

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

结果(2) M=3

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

讨论

从结果来看,使用 EM 算法,对数似然函数在重复更新参数规则后总是收敛的。然而,由于 EM 算法是一种迭代计算,它容易陷入局部最优状态。正如在结果(1)、(2)中看到的,M 值(混合模型的数量)和初始化的差异提供了对数似然收敛和估计分布的不同变化。为了解决这个问题,一个简单的方法是用几个初始化状态重复该算法,并从那些作品中选择最佳状态。

电子邮件分析:比你需要知道的更多

原文:https://towardsdatascience.com/email-analytics-more-than-you-ever-need-to-know-b6e75b7b2541?source=collection_archive---------37-----------------------

黑匣子又火了

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

希腊的邮箱(摄影:Randy Au)

向 Vicki 致敬,感谢她激发了我写这篇文章的动机,我总是乐于接受关于写作主题的想法和建议hinthint**

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

如果你在 2010 年找到我,告诉我电子邮件跟踪分析将在 2020 年再次流行,我会认为你疯了。但是我现在在这里,用电子邮件通讯给你写信,谈论电子邮件技术和分析。

感谢原始的电子邮件,这是一个令人惊讶的短话题。我可以把我所知道的几乎所有东西,小到微小的技术细节,都放到这篇长文里。

那么 Substack 上的邮件跟踪是什么样子的呢?

我们得到了一些有趣的数据,比如你最近发的帖子,打开率和点击率。视图和注册(转换)似乎是网站页面,而不是电子邮件本身。

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

然后,您还可以在电子邮件地址级别获得更详细的电子邮件统计信息。打开、点击和设备计数。

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

我们现在要看看最后一个是如何收集的。呜哇!

现代网络分析实际上是持续的连接

现代网络分析涉及大量工具,从服务器端日志、用户代理分析、浏览器上的 cookies,到使用 Javascriptwebsockets 实时收集和传输数据的非常复杂的测量工具。每一次点击、滚动和悬停都有可能被报告回母舰进行分析。

Google Analytics振幅ChartbeatMixpanelFlurry 等分析平台。所有人都在这个领域工作,使用各种方法收集用户正在做的事情的数据。在核心上,它们以发生的“事件”的形式(页面查看、点击、滚动、悬停等)收集信息,并定期将信息报告给分析服务。这是一个相当复杂的空间。

这甚至不仅限于网页。最近有文章讨论 Kindle 上的每一次点击、触摸和互动是如何被亚马逊追踪和存储的。

尽管这听起来令人毛骨悚然且具有侵犯性,但这种超细粒度的数据收集和传输在现代分析时代几乎是必然的。我不得不依靠类似的数据来帮助团队做出产品决策。如果没有这种粒度级别的数据,许多 UX 和商业问题都无法得到解答。做这件事的工具现在也很容易得到,所以每个人都可以做这件事,不只是 megacorps。

与此同时,电子邮件(在一定程度上,短信)实际上没有这些高级跟踪功能。这对我们提出了挑战。

电子邮件(很大程度上)是单向交流

电子邮件是非常古老的技术。有一个 RFC # 196,可追溯到 1971 年,名为“邮箱协议”,它描述了一种向连接到行式打印机的系统发送消息的方法,消息由人工传递到物理邮箱。

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

显然,今天没有行式打印机和人工递送,但基本概念仍然完好无损:**电子邮件是一种单向的沟通渠道。**它接受一条消息,仅仅是字节的集合(默认为 7 位 ASCII 编码!),然后通过一系列系统发送出去,这些系统试图将邮件传递给预定的收件人。

从一开始,整个电子邮件基础设施的设计就模仿了物理邮件的方式。用户通过他们的邮件客户端向邮件提交代理 (MSA)提交邮件,然后通过对 MX 记录的 DNS 查找将邮件路由到一个或多个通过简单邮件传输协议(SMTP)传输邮件的邮件传输代理 (MTA)。最后,经过 MTA 的一跳或多跳后,字节到达邮件传递代理(MDA ),它将字节放入一个数据结构中,由收件人的邮件客户端存储和读取。邮件实际上存储在目的地的一个或多个文件中。

说句题外话:我要避免往下走一个mbox*格式兔子洞 因为篇幅原因,但是很简短,很神奇。电子邮件都在一个文件中,并以“发件人”一词分隔!这就是通信存储的 CSV!*

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

从 Alice 点击电子邮件客户端上的[发送]开始,直到她的电子邮件被发送到邮件发送代理(您的邮件客户端将通过 POP3/IMAP4/etc 访问该程序以将邮件呈现在您的眼前),在整个时间长度内,电子邮件都是在推送模式下传输的。 SMTP 命令列表本质上只有动词来表示“嗨,服务器,我有你的邮件,拿着这个并发送出去”。在 SMTP 中肯定没有办法表达“嗨,服务器,给我所有的电子邮件”。MTA 不支持这种功能。

事实上, RFC 5321 明确指出,当一个 MTA 对传输给它的邮件给出 2xx 响应时,它接受确保消息到达它需要去的地方的责任,或者报告传递失败。

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

只有在旅程的最后一段,当收件人 Bob 加载他的邮件客户端来检查电子邮件时,它才最终成为拉动操作。收件人的客户端可以使用邮局协议 (v3)、POP3(旨在将邮件从 MDA 中取出,通常是从 MDA 中删除邮件)进行本地消费,或者使用互联网邮件访问协议 (v4)、IMAP4(旨在从服务器中读取邮件并将其留在那里,例如网络邮件)。如果需要,客户端也可以使用一些专有协议。

所有这些意味着,一旦 MTA 成功地传递了信息,他们就可以忘记你的信息(如果他们愿意的话)。寄件人唯一能得到有关流程反馈的时间通常是由于某些问题(地址不正确等)导致投递失败的时候。

但是电子邮件并不完全是单向的(等等什么?)

有两个(!!)电子邮件规范本身允许通信从接收者向发送者反向流动的方式。附带说明。大的。

交付状态通知

第一个是 RFC 3461 ,它是对 SMTP 的扩展,添加了交付状态通知(DSN)。如果你向一个不存在的电子邮件地址发送了一封电子邮件,但邮件无法送达,这个功能会通知你。它实际上是消息头中的一个可选标志,如果消息传递失败或成功,发送者可以请求得到通知。正常情况下,它只是默认只在交付失败或延迟时报告。

问题是这是一个可选功能,尤其是对于成功的 DSN。如果 MTA 或 MDA 选择限制该特性的使用。不会成功的。实际上,成功的送达通知几乎从未使用过,你也不应该指望它们会起作用。请不要打开它们。

另外,一个成功的 DSN 只会告诉你计算机已经把它发送到了收件箱,而不会告诉你人们是否已经看到了它。这就像邮递员把跟踪确认箱放在门廊上,随时都有东西能让包裹消失。该消息也可以被完全忽略、过滤或删除。

消息处理通知

第二种方式是通常所说的“已读收据”。根据你使用的电子邮件服务/客户端(尤其是如果你使用 MS Outlook 和 Thunderbird),你可能会认出这个术语。这些事情实际上是在 RFC 8098 “消息处理通知”下标准化的,尽管对于这种功能有各种各样的专有协议。它主要出现在公司环境中,每个人都使用相同的软件。

与上面提到的 DSN 不同,这些是在用户实际打开和阅读电子邮件时触发的。这些 MDN 可以报告电子邮件被“显示”给用户,“发送”到其他地方,“处理”而不被看到,甚至“删除”而不被看到。哇!这么多信息!

除此之外,它要求接收客户端支持该特性(许多不支持或有限制),并且通常涉及选择加入的方面。通常会有一个提示,比如“Alice 想要一个阅读回执,发送吗?是/否”。除了这些问题之外,还有很多边缘情况,例如,如果用户只是将一封电子邮件标记为已读,而没有打开它,会发生什么?

所以,还是那句话,不要指望使用这些数据。

那么,我们能统计哪些涉及电子邮件的信息呢?

不是太多,而是一些东西。让我们来看看大的:

发送的电子邮件

这个很简单,因为作为发件人,你应该知道你发出了多少封邮件。这至少给了你所有其他事情的通用标准。这可能是所有这些中唯一确定的数字。

退回/失败的交货

由于 SMTP 的 DSN 特性,当你发出的邮件无法送达时,你通常会得到通知(但不是所有时间)。知道这一点对调整你的邮件列表很重要。从你的“发送”总数中扣除这些邮件也很常见,因为它们并没有真正去任何地方。

哦,是的,如果你用你自己的服务器,从你自己的域名发送电子邮件,你实际上可能会得到比你发出的电子邮件更多的反弹。这被称为反向散射,垃圾邮件发送者通过伪造邮件标题假装从您的服务器发送邮件。所以你必须非常小心如何处理反弹。

HTML 电子邮件给你更多的选择

如果你发送的是纯文本邮件,上面的统计数据几乎就是你所能得到的全部。但是如果你使用 HTML 格式的电子邮件(现在大多数人收发的都是这种格式),你就能接触到更多的内容。

通过跟踪像素打开

现代电子邮件客户端实际上是微型网络浏览器。至少,它们可以呈现 HTML,包括从互联网上获取图像等资源的能力。请注意,还有一种方法可以将图像附加到电子邮件中,这样就不需要外部获取,但这对分析没有帮助。

这种 HTML 特性可以用于分析的一种常见方式是通过放置一个微小的 1x1 像素透明 GIF 文件(因此得名),该文件托管在某个外部服务器上(如 example.org/tracking_string/sneaky_1x1.gif 的)。当电子邮件客户端试图加载图像时,它必须向 web 服务器发出 HTTP GET 请求。然后,服务器意识到“ tracking_string ”的 GIF 文件已经被加载,并把信息保存在某个地方。使用查询参数,example.org/sneaky_1x1.gif?track_query=user12345,也是向服务器传递详细信息的一种重要方式。**

如果您为发出的每封电子邮件生成一个唯一的 tracking_string,那么您可以通过读取这些 pixel 访问日志来找出谁打开了该电子邮件!

注意:它不一定是 1x1 像素,或者 gif。你所需要的就是接收者从你的服务器上加载一些东西,任何东西。一个标志图像就可以了。

****警告:这种方法的一个问题是它依赖于接收者加载你的图像。出于安全原因,某些客户端在默认情况下不会这样做,至少您通常可以更改设置来选择加入/退出远程映像加载。所以,同样,这个数据不会是完美的。

通过跟踪像素的 Cookie

pixel 的 HTTP GET 请求也可以在客户端的浏览器上设置一个 cookie。这是否有用将取决于邮件客户端的浏览器功能是否有 cookie 功能。通常默认情况下它是关闭的,所以依赖它是不明智的。

显然,这些 cookie 不会被传递到主浏览器,除非电子邮件客户端和浏览器以某种方式共享同一个 cookie 存储。我甚至在网上找不到任何关于这种共享行为的参考资料。

因此,您对这些 cookie 唯一能做的事情就是,如果您设置并在多次打开时看到同一个 cookie,您就可以知道它在同一设置中至少被打开过一次。也许吧。

通过跟踪像素的设备

因为用户代理应该在每个 HTTP 请求的报头中发送,所以您可以对其进行分析,以确定是什么设备打开了电子邮件。这里说的太多了,所以对于那些好奇的人来说,我在之前的一篇文章中讨论了用户代理的复杂性。对于流行的设备,它可以让分析师看到具体的型号和变体。

随着时间的推移,存储这些用户代理的副本,你就可以计算出一个人可以访问多少个浏览器和设备。怪异。

IP 通过跟踪像素

由于动态 IP 是通过 ISP 分配的,移动设备 IP 随着移动/进入/离开网络、VPN 和代理而变化,因此 IP 分析相当不一致,但总的来说,它们通过地理定位提供了人们来自哪里的概念。他们通常能告诉你请求来自哪个国家。

一些 IP 比其他 IP 更持久,静态服务器 IP 和家庭 IP 显然比移动设备更少改变。VPN 和代理也可以有不同的属性,这至少让你知道他们不是“普通用户”。因此,如果有人有这些信息,他们可以彻底调查,但在没有付费为你分类 IP 的情况下进行大规模调查是很痛苦的。

我经常懒得去调查知识产权,因为即使我有这些信息,我也无能为力。

通过跟踪 URLs 重定向点击链接

因为我们有了 HTML,用户可以点击链接,这些链接将在他们实际的网络浏览器中打开(而不是他们邮件客户端内部的任何东西,后者可能具有有限的功能)。如何知道用户是否点击了一个链接,或者点击了什么链接?

URL 重定向是最简单的方法。有很多种方法可以实现重定向。

使用 HTTP 302 响应代码“发现”(以前称为“临时移动”)使浏览器重定向到另一个 URL 的最简单方法。其他 3xx 响应代码也可以工作,但有不同的细微差别。所以你需要做的就是用一个去 myservers.com/tracking_string1的链接替换你原来的链接,然后设置你的网络服务器发送一个 302 响应给实际的目的地。**

因为你可以使链接变得独特,而且你确切地知道它在哪个电子邮件中,你可以明确地说点击来自那个电子邮件。请记住,电子邮件可以转发,链接可以共享。

你也可以在你的网络服务器日志中获得一个条目,包括所有的常用信息,IP,用户代理,时间戳,引用等。但仅此而已。如果你想要更多的分析,你必须使用其他方法。

更有效的方法是通过 META 标签或 JavaScript 制作一个既收集数据又重定向用户的页面。当用户短暂停留在你的页面上时,你可以做更复杂的浏览器指纹识别

这里有更多的技术细节需要解决。你必须快速地做每件事,因为用户讨厌东西加载缓慢,跟踪重定向增加了宝贵的毫秒加载时间。你也可能想做某种形式的 referrer 擦洗 来隐藏你正在从下游做这些重定向的事实。

****警告:如果 URL 隐藏在重定向的后面,那么很难防范这种形式的跟踪。所以这通常意味着你不会少算点击次数。然而,由于前面提到的链接分享,你可以很容易地计算很多很多点击。它们将是实际的点击,但你不会真的确定“谁”在做这些。

这是上周我的 10x data scientist 文章中发送的电子邮件子堆栈中的一个例子(去掉了样式和内容)。注意复杂的散列字符串占据了 URL 的大部分。

**<a href="http://email.mg1.substack.com/c/eJwlUMuOwyAM_JpyRA55UA4ctt32NyIC3hRtAhGYjfL3S1ppJEtjax62hnCO6dBbzMRKxjR6p4eulaCAOQ1SWDkxn8efhLgav2i2lWnx1pCP4TwW8top9tKIQrWyU-BML0DIrkeB0KDr5TQADuy0GE1xHoNFjX-YjhiQLfpFtOVL-3URz4p937kzZF64bJgyj2muLPO6ikJF17TQC8UbrhoJ1--buqvb8_EQw6WDdW54LlMmY3-5jStLOpngDm5K3c5ngTddO4x1riV4OkYMZlrQaUoFGX1-8U5Lx4Y64J4XJML0Ic_OA4AaWHVysWoGbWMJ5MP8D_lucHE">datahelpers.org</a>**

如果你按照链接,你会得到 302 重定向到正确的网站。

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

通过点击链接的 Cookies

这开始进入你正常的网络分析。但与您可能在跟踪像素上设置的 cookie 不同,它绑定到一个可能不允许 cookie 的 web 客户端,您最有可能通过链接点击获得一个真正的浏览器。这意味着 cookie 信息更加持久和有用。至少,你可以识别出这个浏览器以前是否通过电子邮件访问过这个网站。

另外,你可以对用户进行所有常规的网络分析,因为他们已经在网站上了。

网络分析一旦他们到达你的网站

虽然以上这些都是你可以从电子邮件中直接获得的,但成功地让某人访问你控制的网站会让他们获得更多的跟踪和分析机会。

如果你的电子邮件发送一个人到你拥有的网站,并且他们登录,你可以把点击和登录联系在一起。这让你可以讲述一个关于用户正在做什么的更丰富的故事。现在你可以说“他们收到了我的邮件,点击了我的行动号召链接,买了 10 个小部件”,而不是“用户来到我的网站,买了一个小部件”。

对于没有登录的人,你得到的有用信息要少得多。通常他们的推荐人是空的,这导致像 Google Anlaytics 这样的工具说流量是“(直接的)”,这意味着他们出现在页面上,GA 不知道为什么,所以他们必须被直接发送到那里。显然,没有人会在他们的浏览器中手工输入长 URL,但是我们没有任何关于他们从哪里得到链接的信息。

由于缺乏推荐人,从网络分析的角度来看,电子邮件客户端看起来就像短信一样,或者像 s lack 等其他外部应用程序的链接。他们一般都长得像(直接),所以可能会很乱。您总是可以为不同的通信渠道分配唯一的链接来帮助缓解这种情况,但当链接不可避免地被共享时,这仍然只是一个最佳猜测。

缺少推荐人的原因有点复杂,这不是什么大阴谋或隐私运动。将用户发送到浏览器中的独立邮件客户端不会向浏览器发送推荐信息(它们几乎不能)。Webmail 客户端通常使用 HTTPS,当从 HTTPS 转到 HTTP 网站(但不是 HTTPS->HTTPS)时,推荐人会被删除,他们还可能使用带有元标签(如<meta name="referrer" content="no-referrer"/>(或类似的东西)的重定向页面,以进一步删除推荐人,以保护隐私。

更多电子邮件讨论下一个帖子

这涵盖了我认为可以从电子邮件分析中收集的所有技术数据。接下来,我需要深入了解您在实际使用收集的数据时需要记住的细微差别。

我不喜欢为了从一个话题中挤出更多的帖子而拆分话题,但我们在这个帖子中推了 3000 字。这有点荒谬,所以我们下周见!

这篇文章最初于 2020 年 2 月 18 日发表在兰迪的 计数材料子栈 上,这是一份关于数据科学更世俗方面的每周时事通讯。在免费文章在媒体上重新发布之前,注册并获得每周文章。

使用 Plotly 在幻灯片中嵌入交互式绘图

原文:https://towardsdatascience.com/embed-interactive-plots-in-your-slides-with-plotly-fde92a5865a?source=collection_archive---------12-----------------------

用眼镜编辑器超越 PowerPoint

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

对于我们这些数据科学家来说,有效的沟通是必不可少的,而 Plotly 的交互式图表是一个很好的工具。但是当涉及到以传统的幻灯片风格展示我们的工作时,这些情节很难集成到我们的日常工具中,如 PowerPoint 或 Google Slides。在这篇文章中,我们将了解眼镜编辑器 Plotly 的一个演示工具,它允许在幻灯片中嵌入交互式情节和动画,并提升您的演示文稿。

酪 pptx 工作就好了…何必呢?

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

莱昂纳多·巴尔迪萨拉在 Unsplash 上的照片

想象一下,你已经涵盖了你认为对你的演讲很重要的内容,然后你的听众会提出一些涉及到次要细节或你的人群中某个特定人群的后续问题。现在,你必须回到你的代码中去获取一个答案,或者在以后继续跟进。把你的土地分割成小块,然后当场取回任何需要的东西,这不是更容易吗?例如,查看这个平行坐标图,您可以对任何变量进行过滤和高亮显示:

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

承蒙作者好意。

或者,您可以在演示时与之互动的动画条形图:

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

承蒙作者好意。

入门需要什么?

  • A Plotly 图表工作室账号 :你可以轻松注册你的 github、谷歌或者脸书账号。
  • 互动 Plotly 剧情:在我的上一篇中,我介绍了 Plotly 的互动剧情和动画。帖子中提供的代码应该足以生成一些情节来玩。
  • 最后,快速下载眼镜编辑器。

潜入水中

一旦你登录,界面非常熟悉和直观。从你通常的演讲准备程序开始:

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

说到互动情节,你只需要:

1.在 Chart Studio 上发布您的图,并复制您的图的 url

2.回到眼镜,点击“Plotly 和破折号”并粘贴网址:

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

3.情节应该立即融入你的幻灯片。一旦进入演示模式(**cmd+L**),它就会变成交互式的。

此外,您可以在幻灯片中很好地集成和共享任何语言的源代码。只需点击**CodePane**,选择您的语言并粘贴您的代码:

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

一旦你完成了,点击**cmd+L**来展示你的作品,切割你的情节,充分利用你的视觉化技能。如果需要,您还可以存储演示文稿的. pdf 版本。

下一次,你的观众想知道更多,你已经准备好当场操纵你的数据,并迅速解决任何疑问!

延伸阅读:

有关编辑器的更多信息,请查看 Plotly 的官方文档。

更多互动的可视化,你可以看看我的文章“ 5 个可视化来提升你的数据故事”。

差不多就是这样!

我希望您发现这很有用,并将它添加到您的工具箱中。保持安全和高效!

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

照片由格伦·凯莉Unsplash 上拍摄

使用微软认证在 Flask 中嵌入多个 Dash 应用程序

原文:https://towardsdatascience.com/embed-multiple-dash-apps-in-flask-with-microsoft-authenticatio-44b734f74532?source=collection_archive---------8-----------------------

唷!这是一次旅程(通过示例),目的是将所有部分组合在一起,为部署在一起的多个 Dash 应用程序构建一个可扩展的模板,并提供统一的导航和身份验证

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

图片来自 Pixabay

充分披露:我不是开发 web 应用程序的专家。我甚至不认为自己是数据科学家。自从我发现 Dash 以来,我就一直在努力构建一个适合我的用例的系统。这包括试图将多个松散关联的 Dash 应用组合在一起,这些应用使用 windows 电脑开发,但部署在公司防火墙后的 Ubuntu 虚拟机上。添加一些用户不会讨厌的身份验证(即他们已经在使用的东西),我找到了一些我找不到的清晰示例,所以我想分享一下我当前的解决方案及其演变。

我是一名结构分析师,我每天使用 Python 处理测试数据,缩放或合并分析结果,运行优化或权衡研究,和/或开发特定于组件或机制的分析方法。其他大部分工程师不使用 python。因此,一旦我开发或编码了一个现有的分析方法,我通常希望以一种可控的方式将其部署到其他人身上,使用一个熟悉的和用户友好的界面…进入 Plotly 的 Dash 框架!

普罗特利的 Dash 框架

我是 Plotly 的 Dash 框架的超级粉丝。如果你已经熟悉 python,制作一个 Dash 应用程序是相当简单的。添加 Dash Bootstrap 组件,流畅、美观、响应迅速的网络应用程序只需要几行额外的代码。从现有的 Python 脚本到 web 应用程序是 1–2–3 的事情

  1. 为用户输入创建带有组件的布局(按钮下拉框数字/文本输入等)。)和有结果的区域(等。)使用布局元素( div、row、column 等)。)
  2. 通过回调将用户输入链接到实际执行工作的函数
  3. 部署应用程序,或者在目标用户可访问的主机或虚拟机上运行应用程序

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

普罗特利的破折号,图片来源:https://plotly.com/dash/

Dash 应用程序看起来很漂亮,你可以用 Python 编写它们(避免使用 javascript 和原始 html),并且可以使用相同的“受控”工具拥有广泛的受众(不用传递 excel 文件,非常感谢)。如果你不熟悉 Dash 文档,请查看它。有很多其他优秀的关于构建 Dash 应用程序的教程,这些人无疑比我更优秀,所以我将保持这一节的简短。Dash 社区论坛和堆栈溢出是你的朋友。

好了,现在我们有了一个很好的方法来给团队提供一个很好的工具。但是我有很多工具,有些相关,有些不相关。如果我们能以某种方式将这些应用组合在一起…

在 Flask 应用程序中嵌入多个 Dash 应用程序

这似乎是一个相当普遍的要求。Plotly 提供 Dash Enterprise 来帮助向更多受众部署多个应用,同时保持安全性。对于您的团队来说,这可能是一个更容易、更具可伸缩性的解决方案,尤其是当您有多个开发人员时。对于我们这些没有 Dash Enterprise 的人来说,Plotly 团队在开源文档中讨论了几种创建多页面应用程序的方法。第一个是通过使用 dcc 向视图发送不同的布局来创建多页面 dash 应用。位置 & dcc。链接通过回调交互的组件。对我来说,这对于一些小应用程序来说还行,但是随着应用程序数量的增加,它似乎变得混乱了。我更喜欢让单独的应用程序成为独立的对象。我通常先在本地创建一个独立的 Dash 应用程序,然后集成到其他应用程序中进行部署。一个应用部署完成后,我会经常回去更新它。一旦它被集成(至少是我实现它的方式),我不得不加载整个应用系统,只是为了测试其中的一部分。这很快就过时了。所以我开始寻找不同的方法。

在我旅程中的某个时候,Plotly 团队在文档中添加了关于在现有 web 应用中部署 Dash 应用的讨论。我还看到了他的精彩文章:

[## 如何将 Dash 应用嵌入到现有的 Flask 应用中

Dash(由 Plotly 开发)是一个开源的、易于使用的 Python 框架,用于构建漂亮的数据驱动的 web 应用程序。

medium.com](https://medium.com/@olegkomarov_77860/how-to-embed-a-dash-app-into-an-existing-flask-app-ea05d7a2210b)

那时我根本没有使用过 Flask,所以模板、视图、蓝图、数据库对我来说都是新的。它花了一些时间来吸收这一切(至少足以尝试和工作)。烧瓶超级教程帮了大忙。有了 Oleg 的 Medium 文章和 Flask Mega 教程(加上大量的 google - > stackoverflow ),我开始拼凑一种新的(对我来说)方式来打包我的 Dash 应用程序,将它们嵌入到“父”Flask 应用程序中。

一个基本例子

我遇到的大多数例子基本上只是玩具。我觉得我遇到的那些没有覆盖足够的模板来使它可扩展。我认为我最大的问题是如何在 Flask 部分集成统一的导航和引导格式。这里的例子启动了我将在接下来的章节中构建的框架。本节涵盖的全功能项目可以在 github 的“基本”分支下找到。

让我们从项目目录结构开始:

dash_in_flask_msal
│   config.py
│   env_p38_dash.yml
│   secret.env
│       
├───app
    │   __init__.py
    │   
    ├───dashapps
    │   │   dash_app_1.py
    │   │   dash_app_2.py
    │   │   routes.py
    │   │   __init__.py
    │   │   
    │   ├───templates
    │       └───dashapps
    │               dash_app.html
    │               dash_app_debug.html    
    |
    ├───main
    │       routes.py
    │       __init__.py
    │            
    ├───static
    ├───templates
            base.html
            index.html

我正在使用蓝图(“主”和“dashapps”)和一个应用程序工厂。主蓝图现在并不真正做任何事情,它只是为索引服务。“Dash apps”蓝图中有两个 Dash 应用程序(dash_app_1.py & dash_app_2.py)。这是一个相当标准的 Flask 应用程序布局。

应用程序工厂

create_app()应用程序工厂位于app目录下的__init__.py文件中。在这一点上,它是相当基本的。我们从config.py文件(基本上是空的)导入Config对象,并将其附加到应用程序。我们初始化 bootstrap-flask 扩展,并用 app_context 注册蓝图。那都是普通的烧瓶。现在新的东西来了:我们从每个 Dash 应用程序文件中导入一个add_dash函数,并通过每个文件传递 Flask 应用程序。

烧瓶中碱性 dash 的应用工厂

让我们来看一个 Dash 应用程序文件。dash_app_1.py文件看起来很正常。主要区别是:

  1. Dash 应用程序和所有回调的创建都在一个add_dash()函数中,该函数获取 Flask 应用程序(server)并在创建 Dash 应用程序对象时使用它,在创建所有回调后返回 Flask 应用程序
  2. 当通过URL_BASE全局变量创建 Dash 应用程序时,我们传递一个定制的url_base_pathname 参数
  3. 我们使用一个全局变量APP_ID 作为所有组件 id 的前缀。

典型的 Dash 应用程序包装在“add_dash”函数中

好了,现在我们看到 Dash 应用程序是如何附加到母 Flask 对象上的,但它们看起来仍然非常熟悉。为了完成设置,我们需要查看功能来显示 Dash 应用程序。让我们看看dashapps 蓝图文件夹中的routes.py文件。

dashapps 蓝图中的 Routes.py

需要注意的一点是,用于创建应用程序的 url_base_pathname 不是用于查看功能的 url。仪表板应用程序端点在/dash/dash_app_1处,但视图功能路线在/dash_app_1处。要了解发生了什么,我们必须看一下模板。

模板和引导!

有一个所有其他模板固有的基础模板(base.html)。这是我们安装导航系统的地方。为了在 Flask 位中使用引导样式,我找到了引导-Flask 库。不要与 Flask-Bootstrap(不支持 Bootstrap 4)混淆。我真的很想避免 HTML,所以有一次我尝试了看起来很有希望的 Flask-Nav,只是后来发现 Flask-Bootstrap 看起来会停留在 Bootstrap 3。所以自举瓶和一点 HTML 就可以开始了!我从自举烧瓶启动模板开始(当然!).然后我去了 Bootstrap 4.0 网站,抓取了一个包含下拉菜单的示例 navbar 部分,并把它放到一个名为“navbar”的 jinja2 块中,这个块放在一个容器中。我添加了一个消息部分,用于发送类别不在导航栏内的消息。您可以看到下拉链接是由 url_for('dashapps.dash_app_1 ')创建的,其中 dash_app_1 是该应用程序的查看功能。还有一个{% content %} 模块,所有其他模板都将在其中工作。

base.html 模板有趣的导航位

现在我们看到 dash app 中的url_base_pathname 和 view 函数端点的区别。我将 Dash 应用程序嵌入 Flask 的方法是在它自己的 url 上运行 Dash 应用程序,然后通过 iFrame 元素将其注入模板。在调用dash_app.html模板的视图函数中,我传递了 Dash 应用 url ( dash_url)和一个min_height参数来定义 iFrame 的高度(我找不到让 iFrame 响应的方法)。

dash_app.html 模板

让我们看看它的工作!

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

使用 Bootstrap 4 实现统一导航!

现在是奖金!Dash 应用程序文件的末尾是以下代码。这使得 dash 应用程序可以独立运行,但在一个模板(dash_app_debug.html)内运行,该模板与主模板非常相似。

这允许独立的 Dash 应用程序测试(不需要启动整个 enchilada!

现在有了持久数据(即数据库)!

没有持久的数据,应用程序是非常简单的。我开发的许多应用程序只是花哨的计算器或数据解析器,所以它们不需要数据库。然而有些人会。作为结构分析,我生活和呼吸材料的属性,优惠券测试数据,振动测试数据。当然,我们可以将 excel 或 csv 文件复制到静态或资产目录,并从那里加载它们,但这是一种非常脆弱的数据存储方式。理想情况下,我们会有一些东西,多个用户可以安全地读写…进入数据库!我之所以使用 SQLite,是因为我的用例不需要太多其他东西(我在这里没有重新创建 Instagram ),但我认为它可以适应另一种数据库类型,而不会有太多麻烦。我还使用了 Flask-Sqlalchemy 扩展。本节所涵盖的完整功能项目可以在 GitHub 的‘now _ with _ db’分支下找到。此示例添加了一个 Dash 应用程序,用户可以将带有一些数据的图像上传到该应用程序,并添加了另一个显示图像和数据的应用程序。

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

令人兴奋的持久数据!

让我们回顾一下新的目录结构!我从下面的目录结构中删除了一些“基本”例子中没有改变的内容。现在我们可以看到 app 文件夹旁边有一个db 文件夹。它有my_data.db & users.db文件,还有一个img 子目录,里面有一些*.jpg文件。

dash_in_flask_msal           
├───app
│   │   __init__.py
│   │   
│   ├───dashapps
│   │   │   dash_app_1.py
│   │   │   dash_app_2.py
│   │   │   models.py
│   │   │   routes.py
│   │   │   user_image_upload.py
│   │   │   user_image_view.py
│   │   │   __init__.py
│   │   │   
│   │   ├───templates
│   │           
│   ├───main
│   │           
│   ├───static
│   ├───templates
│           
├───db
    │   my_data.db
    │   users.db
    │
    └───img
            649303dc7de4402fb62acbd33a163e37.jpg
            ca49fc3d1e944398b42a95b04db14366.jpg
            d6f47fcc13e2408a88b512729b280b09.jpg

基本示例中的配置文件并不多,只有导航条的“品牌”。我们现在需要添加更多的配置变量。我们将通常的SQLALCHEMY_DATABASE_URI添加为 SQLite 数据库,带有默认的users.db文件名和带有my_data绑定的SQLALCHEMY_BINDS文件,附加到一个my_data.db sqlite 文件。我们还没有使用users.db数据库,所以从技术上来说现在还不需要(我们会实现的!).我们有一个定制的配置参数IMG_FILE_DIR ,默认为新db 文件夹下的img 目录。

我们还增加了两个新的 Dash 应用程序(user_image_view.py & user_image_upload.py)和一个新的models.py文件。在我们深入了解新的数据库用法之前,让我们先来看看dashapps 蓝图目录中的routes.py 文件:

我们增加了 2 条新路线(/image_view & /image_upload)。所有这一切的想法是试图将重点放在单个 Dash 应用程序上,而不是花太多时间集成(一旦框架建立)。除了添加了routes.py文件之外,我还在base.html 模板中添加了一个新的下拉组用于导航。到目前为止,添加额外的应用程序看起来非常简单…

现在让我们来看看新 Dash 应用程序的数据库模型:

这里我们创建了一个带有一些字符串数据列和一个LargeBinary 类型的User_Image 模型。让我们来看看user_image_view.py应用程序,看看这些是如何实现的:

我们从app 导入db ,从app.dashapps.models.导入User_Image 模型,我们有通常的全局变量,一切都在add_dash 函数中。新的是,在创建 Dash 应用程序后,我们将布局创建为一个函数serve_layout(),而不是一个静态布局变量。这允许在每次页面加载时调用这个函数,我们可以读取数据库。看,妈妈!没有复试!就在函数的顶部,我们使用以下命令查询数据库中所有的User_Image 对象:

uimgs = db.session.query(User_Image).all()

并且在通过uimgs 创建布局回路时,用仪表板引导组件中的数据填充布局。注意,User_Image 对象(LargeBinary)的thumb 属性实际上是直接存储在数据库中的图像,数据被附加到src 属性上。将图像直接存储在数据库中并不理想,但是存储大的 blobs 会很有用。

user_image_upload.py Dash 应用更多的是传统的 Dash 应用,采用静态布局。这里还有很多内容,请访问 Github 查看。基本思想是有几个输入字段和一个上传组件以及一个卡片组件。我们基本上是在为user_image_view.py应用程序建卡。此外,还有一个数据表,用于加载现有的图像数据,以便以后对其进行修改。这里我们添加一个图像:

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

填充数据并将图像添加到数据库

文件中有一些技巧,包括使用dash.callback_context来确定哪个组件触发了回调(主要是为了让 1 feedback div 可以被多个进程更新)。下面是“保存”回调中的一个片段,其中一个新图像被添加到数据库中。如果选择了一行,derived_virtual_selected_rows 将是一个长度为 1 的列表,并将包含该对象的主键数据库 id。它将被检索,其内容将被应用程序字段中的数据覆盖。

好了,我们可以向数据库中添加项目并查看它们了!但是我们不能让每个人都添加他们最喜欢的猫的照片,那只会融化服务器。所以我们需要一种方法来限制对上传的访问…

添加 Microsoft 身份验证库(MSAL)

你不需要另一个密码来尝试和记住,我知道我不需要。理想情况下,我们添加的任何密码都应该是目标受众已经在使用的密码。我在微软的世界里工作,在那里很多人花很多时间使用微软的产品。….输入 Microsoft 身份验证库(MSAL)。

微软身份平台是一个符合 *OAuth 2.0 和 OpenID Connect 标准的认证服务。*你可以按照微软的 quickstart 为 python web 应用添加认证。起初,这让我很困惑(请记住,我不是 web 开发人员)。这个例子比微软的文档帮助更大。Miguel Grinberg 的另一篇关于 Flask 中誓言认证的博文也影响了我的学习。如果你想用 Twitter 或脸书 OAuth 认证取代微软认证,Miguel 的 OAuth 帖子可能会有所帮助。

基本步骤是:

  1. Azure 中注册你的应用并回拨(跟随快速入门)
  2. 收集您的租户 ID、客户 ID 和客户机密,并将其放入您的 Flask 配置中
  3. 添加一些生成 url 的函数,以获得身份验证和捕捉返回的方法

“Azure-Samples”示例没有将用户存储在数据库中。我想使用 Flask-login,这样我就可以简单地用@login_required 来修饰需要凭证的站点部分的回调,所以我混合了这些例子,一直进行下去,直到有东西可以工作为止。在 Github 的“msal_login”分支下发布了一个几乎可以使用的例子。要将其提升到全功能,您需要提供TENANT_IDCLIENT_IDCLIENT_SECRET.

让我们从项目目录开始:

dash_in_flask_msal
│   config.py
│   env_p38_dash.yml
│   secret.env
│           
├───app
│   │   __init__.py
│   │   
│   ├───auth
│   │   │   models.py
│   │   │   routes.py
│   │   │   __init__.py
│   │   │   
│   │   └───templates
│   │       └───auth
│   │               login.html
│   │               
│   ├───dashapps
│   │   │   dash_app_1.py
│   │   │   dash_app_2.py
│   │   │   models.py
│   │   │   routes.py
│   │   │   user_image_upload.py
│   │   │   user_image_view.py
│   │   │   __init__.py
│   │   │   
│   │   ├───templates
│   │       └───dashapps
│   │               dash_app.html
│   │               dash_app_debug.html       
│   │           
│   ├───main
│   │       routes.py
│   │       __init__.py
│   │           
│   ├───static
│   ├───templates
│           base.html
│           index.html
│           
├───db
    │   my_data.db
    │   users.db
    │   
    └───img
            649303dc7de4402fb62acbd33a163e37.jpg
            770a75b7e77f4914b85eb610582b3cb3.jpg
            ca49fc3d1e944398b42a95b04db14366.jpg
            d6f47fcc13e2408a88b512729b280b09.jpg

大多数文件与上一个示例中的相同。然而,我们现在有了一个auth蓝图,包括模型、路线和模板。还显示了一个secret.env文件,但它不在 github 上。这个文件中定义了让这个例子正常工作所缺少的部分。不过,您可以将它们直接添加到您的配置中。

一个完全伪造的 secret.env 文件…但是它包含了变量名!

在我们进入auth 蓝图之前,让我们看看应用工厂功能是如何变化的。

我们看到我们正在从flask-login 导入LoginManager并初始化它。我们还用前缀 /auth注册了新的auth 蓝图。我们还在add_dash 函数中看到一个新参数:login_req ,它采用一个布尔值。我们将回到这一点。

现在让我们看看auth 蓝图。在models.py文件中,你会发现一个非常基本的用户模型,它缺少密码和登录信息(因为 MSAL 会处理这些)。我们只有nameemail 列(唯一 id 除外)。有趣的部分在蓝图__init__.py文件和routes.py文件中。

__init__.py文件有两个函数(_build_msal_app & _build_auth_url),我们将在routes.py文件中导入和使用。这些函数基本上是从 Azure-Samples Flask 示例中复制的。在 routes.py 文件中,我也非常接近 Azure-Samples 示例。主要区别是我使用的是熟悉的@login_required,认证完成后,要么将用户添加到数据库(如果这是他们第一次登录),要么通过flask-login.login_user()功能登录。除了auth 蓝图,在dashapps 蓝图中也有一些新的特性。

dashpps 蓝图 init。py,现在有了新功能!

我们现在有了这个_protect_dashviews()函数,它遍历 Dash 应用程序的服务器视图函数,如果它以url_base_pathname开始,我们就用login_required()包装它。该功能被导入每个 Dash 应用*。py 文件,如果add_dash()函数的新login_req参数是True ,那么在创建应用程序的过程中,在返回服务器之前,Dash 应用程序被传递到_protect_dashviews()。所有的功劳都归于 Oleg,因为这种方法来自他的 medium 文章(链接如上),我只是将其重新配置为一个选项,而不是将其应用于所有 Dash 视图。

除了保护推送到 iFrame 的 dash 视图,我们还必须用常用的@login_required 装饰器保护 Dash 应用程序的主视图功能。在本例中,我正在保护一个 Dash 示例和user_image_upload Dash 应用程序。

两个 Dash 应用程序的受保护视图功能

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

现在我们正在认证!

结尾…

这是一段不寻常的旅程。这不是一个完美的解决方案,我相信这里和那里都有一些漏洞,但我希望这能帮助你的下一个项目。感谢您花时间阅读本文!

在新冠肺炎研究中嵌入分析可以大大加快相关文档的定位

原文:https://towardsdatascience.com/embedding-analysis-in-covid-19-research-can-greatly-expedite-the-location-of-relevant-documents-41b2c546c96?source=collection_archive---------51-----------------------

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

Unsplash 上由 Nelly Antoniadou 拍摄的照片

“数据的缺乏在很大程度上是由于在疫情爆发的早期阶段推迟推出广泛的测试。”—美国消费者新闻与商业频道

目标

这项研究的主要目的是通过使用单词和文档的语义表示,并借助嵌入技术,促进发现与新冠肺炎相关的最相关的研究论文。

架构

  1. 加载语料库
  2. 使用该数据训练无监督 word2vec 和 doc2vec 模型。
  3. 接受输入问题,并选择定义该问题的最相关词语
  4. 使用这些基于最相关单词的查询 word2vec 模型将生成额外的相似单词。
  5. 使用这本词典,人们可以从整个语料库中过滤文档,以缩小我们的搜索空间。
  6. 现在使用 doc2vec 模型,可以为过滤后的语料库生成特征向量,也可以为输入问题生成特征向量。
  7. 最后,使用相似性度量,可以找到与我们的查询最近的邻居。

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

接近

  1. 新冠肺炎数据加载和准备

最近 Kaggle 向世界人工智能专家发出的行动呼吁倡议,艾伦人工智能研究所已经提供了超过 70,000 篇学术文章,以及定期更新的 JSON 格式的元数据。

这里的 请参考 数据加载 上的内核处理、清理、删除重复,然后将 JSON 中的文本数据加载到 pandas 中。下面是整个语料库的一个片段。

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

然而,在[‘text ‘,’ title ‘,’ abstract’]下有许多空值,我们的文本越好,我们的嵌入模型就越好,所以我决定将所有文本数据合并到一列中。

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

以下是数据清理和准备的要点。

现在,我将使用“merged_text”列进行模型训练,该列由每个 paper_id 的文本数据组成。

2.训练 Word2Vec 模型

Word2vec 是一种嵌入技术,与其他高维特征提取技术不同,它依赖于密集的低维特征。它提供的优势是,具有相似含义的单词将以这样一种方式表示,即它们看起来彼此更接近。

有两种类型的 word2vec 技术:

1.连续单词袋(CBOW),2。跳跃图

想了解更多 word2vec 的工作原理,可以参考这个帖子。我们将按照以下步骤训练 word2vec 模型:

2.1 为基于 gensim 的 word2vec 准备数据

让我通过删除停用词和长度少于 3 个字母的单词,为每个文档创建一个标记列表。

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

然而,这些是单个的记号,把 n 元语法生成为单词更有意义,所以我生成了二元语法。

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

使用 gensim 的短语,我创建了有意义的二元符号,这些符号是使用上面完成的处理生成的。

2.2 培训模式

现在,当输入数据准备就绪时,我们可以通过定义以下参数来训练 word2vec:

  • min_count:语料库中要包含在模型中的单词的最小出现次数。数字越大,语料库中的单词就越少。
  • window:句子内当前词和预测词之间的最大距离。
  • size:特征向量的维数。
  • workers:我知道我的系统有 4 个内核。
  • model.build_vocab:准备模型词汇。
  • model.train:训练词向量。
  • model.init_sims():当我们不打算进一步训练模型时,我们使用这一行代码来提高模型的内存效率。

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

2.3 测试模型预测能力

我将创建一个单词列表来测试我们的模型为每个单词预测的前 10 个最接近的单词。

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

2.4 使用 t-SNE 可视化来可视化在向量空间中映射的单词

我将使用 t-SNE 把高维度的单词模型可视化成二维空间。为了做到这一点,我将使用一个单词样本来看看我们的模型如何将它们映射到空间中。

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

正如我们上面看到的,我使用了随机单词,然后使用我们训练的 w2v 模型从每个单词中提取了 300 个特征维度,创建了一个矩阵。

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

现在,使用 t-SNE 将 300 维单词矩阵映射到 2 维空间,我们最终可以将单词可视化,如下所示。

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

我们可以清楚地看到一组相似或被一起引用的词,如“卫生工作者”和“医生”,或“新冠肺炎”与“发烧”和“中国”。

3.培训 Doc2Vec 模型

因为上面的 word2vec 模型生成单词的数字表示,所以它一起表示语义相关的单词。Doc2vec 是 word2vec 的扩展,它将文档表示成向量空间,而不管其长度如何。

就像 word2vec 一样,doc2vec 也有两种类型:

1]分布式内存(DM),2 .分布式单词包(DBOW)

你可以在这里找到关于它们用法的详细帖子。让我们从首先将文档处理成 gensim 所依赖的格式开始我们的过程。然后,Doc2vec 需要一个单词标记列表和一个带有每个文档的文档 id/名称的标记。

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

使用上述处理技术准备好输入数据后,我将使用它训练我的 doc2vec 模型。我正在训练 doc2vec 的 DBOW 和 DM 变体,并将它们合并到一个模型中以获得更好的健壮性。然而,我们甚至可以只用一个模型。

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

模型训练后的最后一步是将每个文档与其生成的特征向量相关联。

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

4.创建一个与新冠肺炎相关的问题列表

这项工作的全部目标是通过利用嵌入技术的能力有效地回答与新冠肺炎相关的问题,嵌入技术考虑了单词之间的语义关系。因此,我创建了一个需要回答的问题列表,然后使用我们训练的 doc2vec 模型为其提取特征向量,如下所示。

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

让我创建一个字典,其中包含分配给一个问题的每个任务,以及定义这些问题的最相关的单词,如下所示。

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

5.使用 word2vec 丰富定义单项问题的关键术语

正如我们在上面看到的,每一个与新冠肺炎有关的问题都与定义它的最相关的词联系在一起。我们将使用这些词来过滤文档,从而缩小我们的搜索空间。然而,上面选择的单词数量太少,所以我决定在我们训练的 word2vec 模型的帮助下,使用类似的单词来增加它们。

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

使用上面的代码,我将如上所述丰富我的关键字。对于每个单词,我也在我们训练的 word2vec 模型中寻找前 7 个最相似的单词,然后将它们添加到我们的搜索词典中。

6.过滤文档以缩小搜索空间

如果我们回头参考数据加载器,我们的语料库中有超过 7 万个文本文档。这导致我们进入一个大的搜索空间,也增加了遇到模糊结果的可能性。因此,我决定通过排除不包含相关关键字的文档来缩小搜索范围。

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

这是一个执行文档过滤的示例代码。我选择了两个词:[‘传播’,‘疾病’ '],然后使用 word2vec 搜索了 14 个与列表中每个词相似的词,并创建了一个 28 个词的列表。最后,使用该列表,我将大小为 70k 文档的原始语料库过滤为 50k 文档,然后可以使用这些文档来查找与我们的输入查询相似的文档。

7.使用 doc2vec 模型从用户问题推断特征向量

为了让我们的机器学习模型理解这些问题,我们需要将其翻译成它可以理解的格式。所以我用我们训练好的 doc2vec 模型从中提取特征向量。

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

提取上述文档向量后生成的数据帧。

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

8.查找最近的文件

最近邻居是一种基于邻近度的搜索,它的工作假设是相似的事情发生在彼此附近。

人以群分

Sklearn 为我们提供了一个基于无监督球树的最近邻搜索实现,我将使用它来查找与我们的搜索查询最相关的文档。

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

使用从过滤的文档语料库中生成的文档嵌入,我为一组相关问题训练了基于“球树”的最近邻算法,以找到前 3 个最相关的文档。

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

我将使用上面的代码来打印我们的“问题”,我们找到了最近的 3 个文档以及它们与问题的距离。

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

结论

让我总结一下我为实现发现与输入查询最相似的文档这一最终目标而遵循的步骤。

  1. 我首先根据新冠肺炎的研究数据训练了一个 word2vec 和一个 doc2vec 模型。
  2. 然后,我使用了一个问题列表,我正在寻找在上下文中最相似的文档。
  3. 后来,我使用定义这些问题的最相关的单词,通过在训练好的 word2vec 模型的帮助下找到相似的单词,进一步丰富了单词词典。
  4. 使用这些词,我们过滤了语料库的大小,以减少搜索空间。
  5. 最后,我们使用 doc2vec 模型提取特征向量,并训练最近邻算法来寻找最相似的文档。

新冠肺炎研究中有几个开放式的问题和答案,需要支持性的研究文章来验证其可信度。找到这样的文档是一项具有挑战性的任务。在处理不明确的文本数据时,简单的字符串匹配或距离度量等技术是不可靠的。因此,我决定创建一个健壮的基于自然语言处理的架构,其中我们结合了嵌入技术的语言能力,例如上面概述的,并使用它们来进行更好的预测。

使用 Tensorflow 通用语句编码器和 Spark EMR 嵌入数十亿个文本文档

原文:https://towardsdatascience.com/embedding-billions-of-text-documents-using-tensorflow-universal-sentence-encoder-and-spark-emr-422407eecf60?source=collection_archive---------56-----------------------

理解大数据

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

照片由 Enoc Valenzuela 拍摄(图片来源: Unsplash

Tensorflow HUB 提供了各种预训练模型,可随时用于推理。一个非常强大的模型是(多语言)通用句子编码器,它允许将以任何语言编写的文本嵌入到一个通用的数字向量表示中。

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

来自 TensorFlow Hub 的通用语句编码器概述

嵌入文本是一种非常强大的自然语言处理(NLP)技术,用于从文本字段中提取特征。这些特征可用于训练其他模型或用于数据分析,例如基于单词语义的聚类文档或搜索引擎。

不幸的是,如果我们有数十亿的文本数据要编码,在一台机器上运行可能需要几天时间。在本教程中,我将展示如何利用 Spark。特别是,我们将使用 AWS 管理的 Elastic MapReduce (EMR)服务将句子编码器应用到大型数据集,并在几个小时内完成。

配置

EMR 集群

在本例中,我们假设一个集群有一个主节点(r4.4xlarge)和 50 个核心节点(r4.2xlarge spot 实例)。该集群总共有 400 个内核和大约 3TB 的理论内存。在实践中,每个执行器的最大内存会被 YARN 限制在 52GB 左右。

如果运行一个包含大量节点的集群是不经济的,那么集群的总内存大小不应该成为瓶颈,因为 Spark 惰性执行模式不需要将整个数据集同时加载到内存中。

为了充分利用 EMR 集群资源,我们可以方便地使用属性“maximizeResourceAllocation”。此外,我们还需要配置 livy,使我们的会话不超时(spark-submit 作业不需要)。

我们可以通过指定以下配置来实现这两个目标:

[{"classification":"spark","properties":{"maximizeResourceAllocation":"true"}},{"classification":"livy-conf","properties":{"livy.server.session.timeout-check":"false"}}]

我还建议选择最近发布的 emr-5。x 并且至少包括以下软件包:Hadoop 2.8.5、Ganglia 3.7.2、Spark 2.4.4、Livy 0.6.0。

为主节点和核心节点添加对外界开放的安全组(如果集群部署在 VPC 中,这将是访问 Spark UI 和 Ganglia 所必需的)。

火花会议

创建一个 EMR 笔记本,并将其连接到之前创建的集群。在创建会话之前,我们需要调整一些内存配置。

由于大部分计算和内存将由 python 进程使用,我们需要改变 JVM 和 python 进程之间的内存平衡:

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

来自 Apache Spark wiki 的 PySpark 内部消息

指定的执行器内存将只考虑 JVM,而不考虑外部进程所需的内存,在我们的例子中是 TensorFlow。

我们需要调整 spark . yarn . executor . memory overhead,使其大于 spark.executor.memory 的 10%,并分配 spark.python.worker.memory,以避免不必要的磁盘溢出。

在启动 Livy 会话之前,我们将首先配置这些纱线参数,在笔记本单元中运行:

%%configure -f 
{ "conf":{ "spark.pyspark.python": "python3", "spark.pyspark.virtualenv.enabled": "true", "spark.pyspark.virtualenv.type":"native", "spark.pyspark.virtualenv.bin.path":"/usr/bin/virtualenv", "spark.executor.memory": "50g", "spark.yarn.executor.memoryOverhead": "12000", "spark.python.worker.memory": "10g" }}

在 61GB 的可用空间中,我们为 python workers 分配了 10GB,为 JVM 分配了 50GB,其中 12GB 是开销。

在亚马逊 EMR 上成功管理 Apache Spark 应用程序内存的最佳实践中有更多关于配置调优的细节。

现在可以创建一个会话来执行包含 spark 上下文对象的单元:

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

Livy 信息小部件

依赖性管理

AWS 做得很好,使得在运行时安装库更容易,而不必编写定制的引导动作或 ami。我们可以使用 install_pypi_package API 在主节点和核心节点安装软件包:

for package in ["pandas==0.25", "tensorflow==2.1.0", "tensorflow_text==2.1.1", "tensorflow-hub==0.7.0"]: 
    sc.install_pypi_package(package) sc.list_packages()

它将安装所提供的包,并打印出 python 3.6 虚拟环境中已安装包的列表。

注意:在 Hadoop 3.0 (EMR 6.x)中,应该可以在 Docker 容器中部署 Spark 集群,但是我还没有尝试过。

嵌入作业

我们需要将数据加载为 Spark DataFrame,其中包含一个键列和一个文本列。

嵌入作业在概念上将执行以下操作:

  1. 下载 TensorFlow 多语言通用句子编码器模型
  2. 将数据分区分割成文本文档块
  3. 将每个块嵌入一个 NumPy 矩阵中
  4. 将矩阵转换成 spark.sql.Row 对象列表
muse_columns = [f"muse_{(format(x, '03'))}" for x in range(512)]

def get_embedding_batch(batch, model, id_col, text_col, muse_columns):

    rows = [row for row in batch if row[text_col] is not None and len(row[text_col].split(" ")) >=3]
    if len(rows) == 0:
        return []

    from pyspark.sql import Row

    EmbeddingRow = Row(id_col, *muse_columns)

    keys = [x[id_col] for x in rows]
    text = [x[text_col] for x in rows]

    embedding_mat = model(text).numpy()
    return [EmbeddingRow(keys[i], *embedding_mat[i, :].reshape(-1).tolist()) for i in range(len(keys))]

def chunks(iterable, n=10):
    from itertools import chain, islice
    iterator = iter(iterable)
    for first in iterator:
        yield chain([first], islice(iterator, n - 1))

def get_embedding_batch_gen(batch, 
                            id_col, 
                            text_col, 
                            muse_columns=muse_columns,
                            chunk_size=1000):
    import tensorflow_hub as hub
    import tensorflow_text

    model = hub.load("https://tfhub.dev/google/universal-sentence-encoder-multilingual/3")
    chunk_iter = chunks(batch, n=chunk_size)

    for chunk in chunk_iter:
        for row in get_embedding_batch(batch=chunk, model=model, id_col=id_col, 
                                       text_col=text_col, muse_columns=muse_columns):
            yield row

几个问题:

  • 模型仅被下载和实例化一次;或者,我们可以使用 Spark 本地广播变量。
  • 为了让模型在运行时工作,我们首先必须在每个执行器中导入 tensorflow_text
  • 我们通过每次仅具体化 1000 行中的一个块,将行对象的可迭代转换为行对象的可迭代。
  • 我们丢弃了少于 3 个标记的句子。
  • numpy float32 型与 Spark DoubleType 不兼容;因此,必须首先将其转换为浮点型。

玩具示例

让我们用一个小的数据样本来试试这段代码:

english_sentences = ["dog", "Puppies are nice.", "I enjoy taking long walks along the beach with my dog."]
italian_sentences = ["cane", "I cuccioli sono carini.", "Mi piace fare lunghe passeggiate lungo la spiaggia con il mio cane."]
japanese_sentences = ["犬", "子犬はいいです", "私は犬と一緒にビーチを散歩するのが好きです"]

sentences = english_sentences + italian_sentences + japanese_sentences

现在,我们可以使用 mapPartitions API 批量运行推断,然后将结果转换成包含键列和 512 muse 嵌入列的 Spark 数据帧。

from pyspark.sql.types import StructType
from pyspark.sql.types import StructField
from pyspark.sql.types import StringType, FloatType
from pyspark.sql import Row
from functools import partial
sentences = [Row(id=i, text=sentence) for i, sentence in enumerate(sentences)]

sentence_embeddings_rdd = sc.parallelize(sentences).mapPartitions(partial(get_embedding_batch_gen, id_col='id', text_col='text'))

schema = StructType([StructField('id', StringType(), False)] + [StructField(col, FloatType(), False) 
                                                                for col in muse_columns])
sentence_embeddings_df = sqlContext.createDataFrame(sentence_embeddings_rdd, schema)

在上面的例子中,我们手动指定模式以避免动态模式推理的减速。

分割

玩具示例应该马上就能工作,因为数据样本非常小。如果我们必须为非常大的数据集进行缩放,我们既不想遇到内存错误,也不想将输出存储在成千上万个小部分中。在映射句子 RDD 之前,我们可能需要调整它们的分区大小(大约几万个分区),并在写入存储层之前将嵌入数据帧合并到一个合理的小范围(几百个分区),并减少输出文件的数量。

请注意,块大小对分区进行切片,以使张量在进行推理时不会太大,但它们不能保证执行器不会将整个分区保存在内存中。

例如,10 亿个文本文档的数据集可以被分成 5k 个分区,每个分区 200k 个文档,这意味着每个分区将包含大约 200 个连续的组块。输出应该保存为 400 个部分的拼花文件。

sentence_embeddings_rdd = large_text_corpus_rdd.repartition(5000).mapPartitions(embedding_generator_function) large_text_corpus_df = sqlContext.createDataFrame(large_text_corpus_rdd, schema) large_text_corpus_df.coalesce(400).write.option("compression", "snappy").parquet(output_path)

就这样,您可以监视 Spark 作业,并最终访问以 parquet 格式划分为 400 个大小几乎相同的部分并用 snappy 压缩的嵌入。

监视

监控 Spark 作业的主要工具是它的 UI 和 Ganglia。

Spark UI

如果我们在 Jupyter 笔记本中执行%info 来获得当前和过去的 Livy 会话列表。从这个小部件中,您还可以获得到 Spark UI 和主主机名的链接(从这里您可以通过http://master _ hostname/Ganglia/)访问 Ganglia)。.)如果集群部署在私有网络中,我们将需要通过代理访问这些服务器。

从 Spark UI 中,我们可以看到如下的计算图:

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

Spark 作业的 DAG 可视化

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

Spark 工作的各个阶段

我们可以观察到两个级别的重新分区:阶段 32 在模型推断之前对数据进行重新分区,阶段 33 在写操作之前进行重新分区。

神经中枢

如果您打开 Ganglia UI 并正确完成了所有操作,您应该会看到如下内容:

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

集群的 Ganglia 概述

如果您遇到内存使用和 CPU 使用之间的严重不平衡,您可能希望将实例类型更改为计算优化程度更高的系列,而不是 r4。

对于每个 80k 文本句子,每个任务的执行时间大约为 20 分钟,并且考虑到 8 个任务将在同一个执行器中并发执行。

结论

这种方法可以适用于用任何规模的任何机器学习库运行模型推理。与 spot 实例一起使用 EMR 将使它变得快速和便宜。为了方便起见,我们使用了 EMR 笔记本,但是您可以将相同的逻辑封装到 spark-submit 作业中,并使用引导操作来安装包。

除了以数据框的形式存储嵌入之外,您还可以扩展用于存储每个分区的原始张量的代码,并将它们加载到 TensorBoard 中,以实现高效的三维可视化。

相反,如果您正在寻找在 Spark 上以分布式模式运行 TensorFlow 的方法,您必须使用不同的架构,如文章在 Spark 上扩展分布式 tensor flow中所述。

请留下您的评论并订阅下一期教程。

原载于 2020 年 5 月 21 日

将“上下文”嵌入配方成分

原文:https://towardsdatascience.com/embedding-contexts-into-recipe-ingredients-709a95841914?source=collection_archive---------50-----------------------

利用食材的上下文向量对菜肴进行分类

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

图片:Pixabay

看着一系列的配料,我们可以确定这种菜肴来自哪里。

但是,机器也能做到吗?

如果我将配料列表转换成一个简单的单词包矩阵,我会得到一个一次性编码的矩阵,因为每种配料在给定的食谱中只出现一次。使用简单的线性回归,我在yummy recipes 数据集上获得了 78%的分类准确率,甚至没有清理文本。有趣的是,基于树的方法和神经网络也被成功地应用于这项任务,并取得了良好的效果。

我们能使用单词嵌入来改善这些结果吗?

因为 NLP 现在很流行,我想知道单词嵌入向量是否可以用于分类任务?我在硕士项目的一个小组项目中回答了这个问题。

首先,我们清理了成分列表,删除了停用词、符号、数量标记,只保留了名词。它看起来是这样的:

Before cleaning: 
['(2 oz.) tomato sauce', 'ground black pepper', 'garlic', 'scallions', 'chipotles in adobo', 'dried thyme', 'instant white rice', 'cilantro leaves', 'coconut milk', 'water', 'red beans', 'chopped celery', 'skinless chicken thighs', 'onions', 'lime wedges', 'carrots']After cleaning: 
['tomato sauce', 'pepper', 'garlic', 'scallion', 'chipotle adobo', 'thyme', 'rice', 'cilantro leaf', 'coconut milk', 'bean', 'celery', 'skinless chicken thigh', 'onion', 'lime wedge', 'carrot']

接下来,我们使用 Gensim 的 Word2Vec 实现为数据中的每个独特成分获取一个 300 长度的向量。我们通过添加配方成分的向量来形成配方的向量。因此,数据中的每个配方都有一个向量。让我们看看这些向量在使用 tSNE 转换成二维表示时是什么样子:

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

二维表示的向量

虽然有很多噪音,我们确实看到一些集群。例如,中文、泰文、日文和韩文聚集在左下角。写这篇文章的时候,我发现了一个有趣的事实:摩洛哥菜和印度菜有一些相似之处!从上图的右下部分可以明显看出这一点。

接下来,我们使用这种向量表示法进行分类,这种表示法应该具有食谱的“上下文”。使用简单的线性回归,干净的配方列表和上下文向量表示给出的分类准确度仅为 65%,低于基线 78%。

悲伤,是吧?

我想让我们详细看看一些菜系和它们的顶级食材。

我注意到实际上是法国的食谱被错误地归类为意大利的。我认为这没什么,考虑到阶级不平衡,意大利菜在数据中的出现率最高。然而,一个值得注意的观察是,意大利菜被误传为法国菜最多。考虑到法国菜不在数据中出现率较高的食物之列,这令人惊讶。此外,意大利菜并没有被大量误认为是爱尔兰菜,但是法国菜却被误认为是爱尔兰菜。

因此,我们仔细观察了这三种菜肴的顶级配料。

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

法国、意大利和爱尔兰菜肴的顶级配料

可以看出,法国菜和意大利菜有两种共同的成分,油和丁香。法国菜和爱尔兰菜也有两种主要成分,奶油和黄油,尽管一小部分黄油也有助于意大利菜。有趣的是,意大利菜和爱尔兰菜除了所有三种菜系共有的配料之外,并没有太多的共同成分,那就是胡椒、洋葱、鸡蛋和其他。这进一步加强了我们的观察,即法国菜与意大利菜和爱尔兰菜有相似之处,然而,意大利菜和爱尔兰菜并不相似。因此,意大利菜和法国菜之间的错误分类是很自然的,因为它们基于食谱中使用的配料而彼此非常相似。

那么,既然分类准确率从 78%降到了 65%,那么嵌词是不是不好呢?

大概吧。

大概不会。

有一些警告。

首先,数据有不平衡的类别。意大利菜和墨西哥菜比其他菜更常见。然而,这肯定也是估计基线时的问题!

可能,更彻底(或者不彻底?)需要清理数据。我们最初的想法是在数据中只保留名词。也许我们也需要保留其他词类。也许副词和连词在数据中保留没有意义,但确实发挥了作用?

也许向量需要更多的调整。用于生成单词向量的超参数可能需要优化。我们将菜谱中的单个单词向量相加,形成菜谱向量。考虑到一份食谱中的配料数量差异很大,也许我们需要对食谱向量进行标准化。

最后,应该注意的是,上面对烹饪组成的解释表明,向量确实成功地将相似的烹饪聚集在一起。我也解释了分类错误的原因。这暗示了单词嵌入对于聚类应用是有益的可能性。而对于分类,还需要做更多的工作。

反正得到差的结果也是好的研究,对吧?

查找代码@:https://github . com/mohanni shant 6/Recipe-Ingredients-as-Word-embedding

LinkedIn 上和我联系!

GitHub 上看看我的一些有趣的项目吧!

在大公司中嵌入数据科学

原文:https://towardsdatascience.com/embedding-data-science-in-big-companies-c89f23880add?source=collection_archive---------64-----------------------

在初始阶段应该关注什么,避免什么。

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

肖恩·波洛克通过 Unsplash

介绍

随着大型非科技组织开始投资开发机器学习和数据分析能力,未能达到管理层的期望和数据科学家的沮丧正变得司空见惯。

数据科学家和数据工程师是科技行业薪酬最高的专业人士之一。他们通常在数学、统计学和计算机科学方面有很强的背景。他们非常积极:大多数人是通过自学进入该领域的,因为“数据科学”领域没有多少大学学位,他们投入大量时间来跟上该领域的最新发展。

然而,对于大公司来说,将这些功能集成到旧的遗留系统中正在成为一个巨大的挑战。对高质量数据的有限访问、数据科学家和业务利益相关者之间缺乏理解以及技术差距是造成这一挑战的主要原因。

我已经在供应链行业做了几年的数据科学家。在做了多年的顾问后,我加入了一家国际零售公司的全新团队,开始在供应链的不同领域应用机器学习和数据分析,最终目标是降低成本和改善服务。

在这篇文章中,我总结了这些年来我学到的一些经验。这些经验并不是特定于业务的,尽管它们更适用于不存在数据文化或处于早期阶段的大组织,并且像机器学习这样的概念对许多人来说仍然是陌生的。

1.提高团队的意识

你的商业利益相关者需要了解你做什么,以及你如何在他们的日常斗争中帮助他们。他们不需要知道什么是逻辑回归或随机森林,但是他们需要理解底层的概念和限制,例如,部署一个模型来自动化某个任务。

这是开始时非常重要的一步。与您的利益相关者召开研讨会,确保您的数据科学家了解业务问题,并且您的利益相关者了解您所能提供的潜力和限制。

如果你是这家公司的新人,利用创业阶段来确定可以帮助你建立信誉的速赢,并建立一个盟友网络,这些盟友将支持你的工作。如果你在你的团队中缺少某些能力,确保与那些能帮助你的人联系。在 It 部门之外创建数据科学团队以使他们更接近业务是非常常见的。与 IT 团队联系并获得他们的支持,没有他们你不会走得太远。

2.(有时)少即是多

发现规划过程中的一个缺陷可以节省数百万美元。你不需要部署神经网络来开始带来价值。纯数据分析在发现非最佳流程、了解客户行为、检测欺诈或改善激励方面已经非常强大。

提出可行的见解可能会让你的团队免于经历一个部署过程,而他们在开始时可能没有准备好,同时为公司增加巨大的价值。

历史操作和计划数据是很好的起点。深入其中,你一定会找到改善运营的方法,让计划更接近现实。

3.自动化作为起点

一般来说,机器学习可以应用于(I)自动化现有任务或(ii)执行新任务。一开始,关注自动化有几个好处。业务流程已经存在并且广为人知,这限制了不确定性和风险的空间。此外,可以更准确地估计收益:节省时间、提高质量等。

在这些项目中,挑战通常在于你被要求交付的准确性。如果你正在自动化一个已经存在的过程,人们可能期望 100%的准确性。以下是一些原因:如果你正在自动化的过程没有被监控,没有基线来比较你的结果,你可能会被要求交付一个完美的过程,因为到目前为止,它最有可能被视为一个完美的手工过程。让您的模型标记不确定的情况以便手动修改,尽管这是一个明智的想法,但可能会伤害对模型的信任,并质疑自动化的好处。为了克服这个挑战并且不危及你的信誉,在你的估计中要保守,但是要清楚自动化的好处。

总是在谈论自动化的时候,小心你如何呈现项目。有些人可能会担心你试图用“机器人”来取代他们,并且不愿意合作。

总的来说,试着从已经测量了当前性能的自动化任务开始,这样你就有了一个清晰的基线。从与将自动化视为机遇而非威胁的团队合作开始。

4.不要滥用仪表板

仪表盘很棒。它们可以提供非常丰富的信息,有助于监控业务运营或支持决策制定。此外,它们易于开发和共享。

然而,经常发生的是,数据科学团队是大公司中少数拥有广泛和自由访问数据的特权的团队之一。这很容易导致团队被视为公司数据的入口点。人们希望以一种易于理解的方式消费数据,很快团队就被开发和共享仪表板的请求淹没了,或者仅仅是进行数据提取。

虽然仪表板通常受到企业的青睐,但过于关注简单的报告可能会耗尽数据科学家的动力,因为他们通常会面临不同的挑战。除此之外,组织中肯定有人有足够的技能来开发可视化解决方案,只是他们没有访问数据的权限。尝试保持平衡,明智地使用仪表盘来报告你的结果,或分享相关的见解,但避免被视为公司数据仓库的友好连接器。

5.创建数据文化

努力使数据可用,并围绕数据创造一种文化。为数据质量、元数据和文档而战。一个数据有记录、可追踪、可访问的组织能够更加敏捷地发现和诊断问题,找到解决方案,并在数字世界中茁壮成长。此外,数据科学项目的启动成本也将大幅降低。

推进开放和记录数据仓库的计划,并与数据所有者建立联盟,以便他们能够支持您的项目。让管理层相信数据可用性在支持决策方面的价值**。首席执行官的承诺对于创建数据文化至关重要。如果董事会和首席执行官接受了你处于有利地位的观点,如果他们还没有接受,试着把你的信息一直传递下去。**

促进大众对数据的需求,而不是自上而下的强加,这将有助于数据的民主化和建立热情。最后,帮助培养和提高有效处理数据所需的技能。对这一领域人才的搜索是不懈的,但幸运的是,你不需要一大群数据科学家来建立一个数据驱动的公司。使用那些你已经拥有的来提升你当前的劳动力。

我希望上述原则能够帮助您将数据科学有效地引入您的组织。

[1] Alejandro Díaz、Kayvaun Rowshankish 和 Tamim Saleh,为什么数据文化很重要? (2018)麦肯锡季刊

知识图补全的嵌入模型

原文:https://towardsdatascience.com/embedding-models-for-knowledge-graph-completion-a66d4c01d588?source=collection_archive---------31-----------------------

TransE、TransH、TransR、CTransR 车型简介

知识图 (KG)在不同的学习领域有几种定义。在本文中,我们将 KG 定义为一个图,其中每个节点是一个实体空间 E 的元素,每个边是一个关系空间 R 的元素。E 和 R 的详细定义是特定于领域的:例如,在社交网络中,E 是一组人,R 是一组不同类型的关系(亲戚、朋友、伙伴、陌生人)。一般来说,E 和 R 可以分别包含每一个存在的实体(或概念、事件、情形等)。)和先前实体之间的每种类型的关系。此外,每个实体可以具有可变数量的属性或特性。鉴于 KG 的通用定义,它经常被用作知识库 (KB)或本体的同义词。本体论这个术语有许多哲学和技术上的概念化和含义,在这个讨论中没有分析,事实上:上面给出的 KG 的定义只是为下面的段落做准备的简化。

KG 可应用于不同兴趣领域(学术和工业)的广泛任务:

  • 识别一个单词在句子中使用的是哪个词义(词义消歧);
  • 自动回答用自然语言提出的问题(QA);
  • 用有意义而不仅仅是词汇匹配来搜索信息(语义搜索);
  • 检测和分类实体之间的语义关系(关系提取);
  • 预测用户的偏好(推荐系统)。

近年来,学术界和商业界都开发了大量的知识图谱:WordNet、DBpedia、Freebase、YAGO、Wikidata、Google Knowledge Graph、Facebook Graph Search 等。尽管有非常大量的实体,这些图仍然有许多缺失或错误的边,因此,知识图完成 (KGC)是一个活跃的研究领域。

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

图片作者。KGC 的一个例子:基于实体之间已知的关系(实线),KGC 算法应该推断未知的关系(虚线)。

上面给出的 KG 的定义允许我们用三元组元素 (h,R,t) ∈ E × R × E 指定 KG 的边,其中头( h )和尾( t )实体是 Er 的元素,它们是有向的,是一种关系类型 R 。注意顺序很重要,因为不是每个关系都是双向的。形式上,我们将 KGC 定义为试图预测三元组 (h,r,t) 中任何缺失元素的任务。特别是,我们谈论:

  • 实体预测当 h 或 t 之间的某个元素缺失时((?,r,t)(h,r,?));
  • 关系预测当 r 缺失 (h,?,t)
  • 三元组分类当一个算法识别出给定的三元组 (h,r,t) 是否正确时。

从技术上来说,KGC 非常类似于社交网络分析中的链接预测:两者都试图完成一个不完整的网络。此外,KGC 面临挑战的原因如下:

  • 造一个 KG 不是小事;
  • 每个实体可以有可变数量的属性(非唯一规范);
  • R 可以包含不同类型的关系(多层网络);
  • 一公斤随时间变化(随时间进化)。

为了解决 KGC 问题,过去几年中开发了不同的方法:例如,实体解析(er),概率软逻辑(PSL)和知识图嵌入(KGE)。第一种方法试图对涉及相同底层实体的实体进行分组,而第二种方法使用概率推理。尽管它们是非常有趣的话题,但在本文中我们只关注 KGE。

嵌入背后的思想在数学中被广泛使用:如果我们需要研究未知空间的元素的性质,我们找到一个函数,通过保留一些关系将未知空间的每个元素映射到已知空间。

在 KGE 模型中,我们假设存在两个函数 f_Ef_R 和两个自然数 kl 使得 f_E : E → ℝ^kf_R : R → ℝ^l 是将实体和关系映射到ℝ^k 或ℝ^l.的嵌入函数。我们将详细描述 f_Ef 的构造设(v_h,v_r,v_t) ℝ^k × ℝ^l × ℝ^k 为 (f_E(h),f_R®,f_E(t)) 的像。在嵌入空间ℝ^k × ℝ^l × ℝ^k 上,定义了一个得分函数fs:ℝk×ℝl×ℝ^k→ℝ来度量三元组 (h,r,t) 的不可置信性。因此,给定一个正确的三联体 (h,r,t) 和一个不真实的三联体 (h ',r ‘,t’) ,应该发生 f_s(v_h,v_h,v_t) < f_s(v_{h’},v_{r’},v_{t’}) 。为了简化符号,我们直接用 f(h,R,t) 表示组成 f_s(f_E(h),f_R®,f_E(t)) 。在现实世界中,我们可以定义先验的 k,l,f_s 而不能定义 f_Ef_R 。它们通过一些优化算法(例如:随机梯度下降、L-BFGS、自适应次梯度和自适应学习率方法)来估计,这些算法最小化使用 f 定义的损失函数:

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

其中γ是边缘超参数, P 是正确三元组的集合,并且

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

不可信或手动损坏的三元组集。至此,我们可以确定 f_Ef_R

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

在上面解释的 KGC 背景下,研究人员提出了许多嵌入模型。例如,在trans model(2013)中,嵌入的实体和关系应该共存于同一空间中(即 k = l ),得分函数定义为

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

这意味着给定一个相干三元组 (h,r,t)v_t 应该是 v_h + v_r 的最近邻。最后一种暗示不适用于 1-NN-1N-N 的关系。为此,2014 年提出了 TransH 车型。与前面的模型一样,嵌入的实体和关系仍然共存于同一空间中,但得分函数的定义不同:

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

其中 v_{h\perp}v_{t\perp} 分别是 v_hv_t 在包含 v_r 的超平面上的投影。因此,给定 w_rv_r 的超平面的法向量,使得 ||w_r||_2 = 1 ,得分函数可以写成

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

利用投影,可以对每个实体在不同关系中扮演的不同角色进行建模,从而克服跨模型的问题。在 2015 年出版的 TransR 模型CTransR 模型中包含了进一步的概括,其中嵌入的实体和关系不再是同一空间的元素:实际上,对于每个关系 r∈ R ,都存在一个投影矩阵 M_r ,使得嵌入的实体被投影到其特定的关系空间中。因此,TransR 的得分函数定义为

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

该得分函数在 CTransR 中略有不同,在 CTransR 中,通过使用分段线性回归的思想对同一关系的不同方面进行建模。为了这个介绍的完整性,我们只提一些其他的 KGE 模型而不讨论(虽然,列表还远不完整):结构化嵌入,神经张量网络,语义匹配能量模型,潜在因子模型,TransD。

参考文献:

  • 海科·保罗海姆。知识图精化:方法和评估方法综述。语义网,8(3):489–508,2017。
  • 王全、毛振东、王斌和李果。知识图嵌入:方法和应用综述。 IEEE 知识与数据工程汇刊,29(12):2724–2743,2017。
  • 安托万·博德斯、杰森·韦斯顿和尼古拉斯·乌苏尼尔。弱监督嵌入模型的开放问题回答。在关于数据库中的机器学习和知识发现的欧洲联合会议中,第 165-180 页。斯普林格,2014。
  • 安托万·博德斯,苏米特·乔普拉和杰森·韦斯顿。带有子图嵌入的问题回答。载于2014 年自然语言处理经验方法会议论文集,第 615–620 页,2014 年。
  • Antoine Bordes、Nicolas Usunier、Alberto Garcia-Duran、Jason Weston 和 Oksana Yakhnenko。翻译用于多关系数据建模的嵌入。在神经信息处理系统进展,2787–2795 页,2013 年。
  • 王震、张建文、封建林和陈政。基于超平面平移的知识图嵌入。2014 年第二十八届 AAAI 人工智能大会
  • 林、、孙茂松、、。用于知识图完成的学习实体和关系嵌入。在2015 年第二十九届 AAAI 人工智能大会

联系人:LinkedIn|Twitter

探索贝叶斯 A/B 测试测量作为 P 值的替代

原文:https://towardsdatascience.com/embracing-bayesian-a-b-test-measurement-and-ditching-p-values-9e444df379ca?source=collection_archive---------21-----------------------

用 Rstan 将贝叶斯推理应用于 A/B 测试

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

威廉·艾文在 Unsplash 上的照片

(这是关于 A/B 测试的两部分系列的第二部分。第 1 部分介绍了在设计新测试时权衡所有选项的过程,可以在这里找到**。这篇文章选取了测试测量阶段的例子,展示了在 R.)* 中使用贝叶斯分析的方法*

测量值几百万

如果你像我一样,你的收件箱每天都被电子邮件淹没。许多是与工作有关的,一些是来自朋友和家人的(包括来自奶奶的不健康的转发),很多(可能太多了)是来自竞争你业务的公司的营销电子邮件。

它们可能看起来很讨厌,但是说实话,每隔一段时间,我们的兴趣就会被激起,我们就会打开一个。有时我们甚至会去公司的网站买些东西。这个神奇的时刻被公司捕捉到,并算作一次转化*,我们花的钱归于邮件活动。*

转换率因行业和内容类型而异,但通常相当低,不到 5%。这可能看起来不多,但是如果你给一个完整的订阅者列表发送一封电子邮件,即使 1%的转换率也能产生可观的投资回报。假设你是一家在线零售商,你向去年购买男装的 100 万名顾客发送了一封电子邮件。如果他们中只有 1%的人平均花费 50 美元进行转化,你就把 500,000 美元的收入归因于一个电子邮件活动!

为什么是贝叶斯?

作为《走向数据科学》的读者,你可能熟悉贝叶斯分析的概念。贝叶斯定理旨在利用一个事件的信息来理解另一个事件。不严格地说,拥抱贝叶斯就是拥抱概率。应用贝叶斯推理进行 A/B 测试测量意味着我们将确定 A 与 B 不同的概率**

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

来源: Pranav Prathvikumar

一段时间以来,统计学习的频率主义者和贝叶斯方法之间一直存在争论(有时激烈,通常是务实的)。剧透:在一天结束时,你的数据有一个故事要告诉,你可以通过几种不同的方式得出相同的结论。本文关注贝叶斯方法,强调与频率主义方法相比的一些不同之处。最终,我发现贝叶斯推理的某些方面在实践中很有价值。也就是说,贝叶斯推理提供了:

  1. 变异不同的概率,使得对结果的解释更容易理解
  2. 量化变量间差异的大小的便捷方法
  3. 一种计算每个变量的总期望值并可视化方差的直观方法

在本文中,我们将使用传统的频率主义方法和贝叶斯方法来衡量 A/B 测试结果,并以 A 对 B 的预期收入差异结束。 我们将展示这两种方法会导致类似的结果,并阐述贝叶斯技术的细微差别以及由此产生的解释

设置

让我们来布置舞台。我们的业务合作伙伴设计并执行了一项新的电子邮件营销活动,测试两种不同类型的电子邮件内容,重点是男士西装。在 4000 名测试客户中,2000 名客户收到了一封电子邮件,宣传一个崭露头角的设计师的新系列礼服衬衫,而另外 2000 名客户收到了一封电子邮件,宣传一个内部品牌的类似系列礼服衬衫。我们将后起之秀的设计师邮件称为设计师,内部邮件称为内部

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

测试结果:转换和花费汇总

邮件发出已经 7 天了,我们有了结果。88 名收到设计师内容的客户进行了购买,平均花费 168.34 美元,而 72 名收到内部内容的客户进行了购买,平均花费 152.88 美元(我们收到了 3 名客户的回复)。

设计师看起来是明显的赢家,对吗?也许是这样,但作为优秀的数据科学家,我们必须确保这种差异在统计上是显著的,而不仅仅是我们数据中随机性的结果。

频繁主义方法

我们将从传统的测量方法开始。这可以通过比较两个样本的均值和方差的 t 检验来完成,或者通过拟合回归模型和调查独立变量系数来完成。我在这里使用回归方法,因为我喜欢灵活地添加额外的变量来控制(例如,发送电子邮件的日期、客户位置等),这有助于与贝叶斯方法进行更好的比较,贝叶斯方法也使用回归。

我们首先单独研究转换率,将一个逻辑回归模型与我们的数据进行拟合,以观察组(我们的预测值)是否与转换率(我们的结果)有统计学上的显著关系。我们的无效假设是分组和转换之间没有关系,我们将使用 0.05 的标准 P 值阈值来确认或拒绝该假设。

P >= 0.05 →无法拒绝 null(我们无法推断转换和组之间的关系)

P < 0.05 → Reject the null (we conclude a relationship does exist between Group and Conversion)

First, we fit a logistic regression on the data to model conversion rates.

*Call:
glm(formula = conversion ~ group, family = binomial(), data = combined)Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.3001  -0.3001  -0.2709  -0.2709   2.5781Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)    -3.0780     0.1090 -28.232   <2e-16 ***
groupIn-House  -0.2085     0.1622  -1.286    0.199    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for binomial family taken to be 1)Null deviance: 1343.3  on 3996  degrees of freedom
Residual deviance: 1341.6  on 3995  degrees of freedom
AIC: 1345.6Number of Fisher Scoring iterations: 6*

注意,预测值是“ 集团内部 ”,这只是意味着回归将我们的二元预测值(集团)变成了虚拟变量,该变量将内部内容的值设为 1,将设计师内容的值设为 0。

我们的结果总结显示,在两个模型中,我们的预测因子的估计系数都是负的,这表明接收内部内容的客户比接收设计师内容的客户具有更低的转化率。然而,系数的 p 值为 0.199 高于我们的 0.05 阈值,这意味着我们未能拒绝我们的零假设,因此无法得出电子邮件内容对转化率有影响的结论。事实上,p 值是概率的一种度量。这意味着,在变量之间没有差异的零假设条件下,我们期望在 X%的时间里看到我们的数据。在这种情况下,如果真的没有差别,我们的数据在 20%的情况下会自然出现。虽然不是绝对的,但它确实表明可能存在一些潜在的差异。

然而,我们真正想测试的是对收入的总体影响,这意味着我们需要比较支出。我们将拟合一个关于花费的线性回归模型。

*Call:
glm(formula = conv_spend ~ group, data = combined)Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
 -7.411   -7.411   -5.509   -5.509  310.729Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     7.4106     0.7669   9.663   <2e-16 ***
groupIn-House  -1.9014     1.0847  -1.753   0.0797 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for gaussian family taken to be 1175.631)Null deviance: 4700258  on 3996  degrees of freedom
Residual deviance: 4696645  on 3995  degrees of freedom
AIC: 39604Number of Fisher Scoring iterations: 2*

p 值为 0.0797,数据告诉我们,如果没有关系,我们只有 8%的机会看到我们的支出数据。我应该注意,我们看到的 p 值假设我们想要一个双尾检验。由于最初的数据汇总表明设计师将胜过内部人员,我们可以通过将 p 值除以 2 来重新解释单尾测试的 p 值。这将进一步降低 8%至 4%。一点也不差,显然有些不同。

查看我们的独立“内部分组”变量的系数,我们看到-1.90,表明平均而言,**内部内容导致每次发送的收入比设计师**少 1.90 美元。

那么我们学到了什么?如果我们的变量没有差异,我们的数据将只出现 8%的时间(如果我们使用不太保守的单尾测试,则为 4%),因此,我们非常有信心在我们的两个变量之间存在差异。此外,由于向大约 100 万客户发送的每封电子邮件收费 1.90 美元,我们可能会获得 190 万美元的额外收入!如果没有真正的分析我们的结果,我们不想错过这样的机会。**

输入贝叶斯

从频率主义者转向贝叶斯方法意味着从概率的角度考虑我们的数据。我们不是对群体和转化之间关系的假设给出“是”或“否”的答案,而是通过生成一个群体的结果始终不同于另一个群体的概率来进行测试。

简而言之,贝叶斯回归使用传统的基本回归公式,但不是返回输入系数β i 的点估计,而是生成截距、输入系数和误差项的分布。

这就是所谓的后验分布**,它是利用数据的先验知识(“先验”)结合观测结果生成的。(如果你想更好地理解贝叶斯逻辑回归背后的理论,请查看威尔·库尔特的这篇精彩概述或这篇 rstanarm 教程)**

我们将使用斯坦概述的贝叶斯分析的四个步骤来更好地理解我们的结果:

贝叶斯分析的四个步骤:

1.为结果和所有未知量指定联合分布,通常采用未知量的边际先验分布乘以以未知量为条件的结果的可能性的形式。这种联合分布与以观测数据为条件的未知量的后验分布成比例

2.使用马尔可夫链蒙特卡罗(MCMC)从后验分布中提取。

3.评估模型与数据的吻合程度,并可能修改模型。

4.从给定预测值的结果的后验预测分布中提取,以便可视化预测值的操作如何影响结果(的函数)。

我们将使用Rstan***—R 接口对 Stan —指定我们的后验分布,使用 MCMC 抽取样本,并评估模型拟合度。具体来说,我们使用 rstanarm 包。*

汇率

首先,我们有什么前科?让我们假设我们在一个新成立的团队中,这个团队之前对测试结果一无所知。这意味着我们事先不知道我们的转换率或花费应该是多少。默认情况下,Rstanarm 通过使用弱信息先验很好地处理了这个问题。截距和输入系数的默认先验假设为正态分布,并且 Rstanarm 根据数据调整标度。关于先验及其实现的更多细节可以在 rstanarm 简介 中找到。我们稍后将查看 rstanarm 如何调整(或没有调整)默认的优先级。

接下来,我们需要在建模阶段指定一些关键细节。由于我们的结果是一个转换率(0 或 1),我们将使用二项式分布logit 链接函数。我们将设置链= 4 ,这样我们可以运行 4 个不同的马尔可夫链,并确保得到的样本都收敛于相同的参数估计。然后我们将迭代的次数设置为 4000,预热为 2000。这意味着每个链有 2,000 次迭代来训练和调整先验(如果需要的话),对于 4 个链,我们最终从后验样本中提取了健康的 8,000 个记录样本。

**Model Info:
 function:     stan_glm
 family:       binomial [logit]
 formula:      cbind(conversions, customers - conversions) ~ group
 algorithm:    sampling
 sample:       8000 (posterior sample size)
 priors:       see help('prior_summary')
 observations: 2
 predictors:   2Estimates:
                mean   sd     10%    50%    90% 
(Intercept)   -3.083  0.112 -3.227 -3.081 -2.939
groupIn-House -0.212  0.165 -0.425 -0.215  0.004Fit Diagnostics:
           mean   sd     10%    50%    90% 
mean_PPD 80.078  8.845 69.000 80.000 91.500The mean_ppd is the sample average posterior predictive distribution of the outcome variable (for details see help('summary.stanreg')).MCMC diagnostics
              mcse  Rhat  n_eff
(Intercept)   0.002 1.001 5242 
groupIn-House 0.002 1.000 4850 
mean_PPD      0.110 1.001 6448 
log-posterior 0.018 1.001 3174**

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

显示参数分布收敛的转换轨迹图

快速检查汇总统计数据看起来不错。 Rhat 对于所有参数都非常接近 1,表明模型成功地收敛于每个参数的后验分布。我们还看到每个参数的有效样本量相对较高,远远超过样本量(8000)的 10%。此外,查看轨迹图,我们看到 4 条链中的每一条都收敛于截距和群系数的相同参数估计值附近。请注意,弱信息默认先验没有改变。

训练我们的模型的输出是从后验分布中采样的一组 8,000 个值。我们有单个预测组的截距和系数的样本。就像之前一样,模型已经把我们的预测器变成了 _House_Flag_conv 中的虚拟变量

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

从转换后验中抽取的参数样本

因为我们的预测器是一个虚拟变量,其中内部= 1,设计师= 0,所以我们可以通过查看预测器In _ House _ Flag _ conv的采样系数来比较设计师内容和内部内容(上面的右栏)。

该系数的负值表示内部转换率低于设计者,正值表示相反。设计师优于内部设计师的概率就是在In _ House _ Flag _ conv<0的抽奖比例。

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

我们看到在 _House_Flag_conv 中的 在 90%的时间里是负的,因此设计者内容产生比 B 更高的转化率的概率是 90%。换句话说,如果我们运行这个测试 100 次, ,我们将会期望在 100 次 中有 90 次来自设计者内容的更多转换。

对于视觉型学习者来说,画出后验分布图来看看两组之间到底有多大的不同可能会有所帮助。

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

设计师与内部内容的样本分布

从营销的角度来看,设计师内容是一个非常明显的赢家。制作和发送带有内容的电子邮件在成本上没有本质的区别,所以选择设计师而不是内部设计师的决定似乎是显而易见的。但是转化率只有图片的一半…

支出因素

因为我们做生意是为了赚钱,所以我们也想知道客户在转换时实际花了多少钱。不同的电子邮件内容可能会激发不同的购买行为,当我们向利益相关方展示我们活动的 总期望值 时,我们需要将这些因素考虑在内。

我们将使用与上面相同的序列,拟合模型(指定我们的后验分布),使用 MCMC 绘制样本,并评估模型拟合。这里唯一真正的调整是将我们的响应变量切换为花费*,将分布族切换为高斯,以适应我们的连续正态分布响应变量。*

*Model Info:
 function:     stan_glm
 family:       gaussian [identity]
 formula:      spend ~ group
 algorithm:    sampling
 sample:       8000 (posterior sample size)
 priors:       see help('prior_summary')
 observations: 160
 predictors:   2Estimates:
                mean    sd      10%     50%     90%  
(Intercept)   168.247   7.164 159.226 168.246 177.389
groupIn-House -15.293  10.803 -28.854 -15.401  -1.619
sigma          66.475   3.703  61.896  66.257  71.329Fit Diagnostics:
           mean    sd      10%     50%     90%  
mean_PPD 161.380   7.369 151.918 161.464 170.604The mean_ppd is the sample average posterior predictive distribution of the outcome variable (for details see help('summary.stanreg')).MCMC diagnostics
              mcse  Rhat  n_eff
(Intercept)   0.080 1.000 8004 
groupIn-House 0.122 1.000 7843 
sigma         0.042 1.000 7861 
mean_PPD      0.083 1.000 7953 
log-posterior 0.022 1.000 3378*

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

显示参数分布收敛的轨迹图

汇总数据看起来也不错。 Rhat = 1 对于所有参数,每个参数的有效样本量都很高,轨迹图显示所有链都收敛于截距、组系数和 sigma 误差项的相同参数估计值。

使用与之前相同的流程,我们将使用我们的虚拟变量比较设计师和内部人员,这次命名为In _ House _ Flag _ spend*。我们在我们的 8000 个样本中取In _ House _ Flag _ spend<0的比例,得到设计师胜过内部设计师的概率。*

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

果不其然,在 92%的情况下,收到设计师作品的顾客比收到内部作品的顾客花费更多。现在让我们看看这转化成了多少美元。

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

因此,当我们的设计师客户通过电子邮件购物时,他们比内部客户平均多花了 15.55 美元。现在我们有两个强有力的证据表明,设计师内容推动了更高的转化率,并在转化时花费更多。现在让我们将两个信号结合起来,看看两者之间的总值有何不同。**

结合转化和花费

我们可以通过组合来自我们的转换和支出后验分布的随机样本来计算总值。一项活动的总价值由转化的顾客百分比乘以他们的消费总额得出。因此,使用我们的后验样本,我们简单地将转换系数乘以每组的花费系数,然后进行比较。

我们先来看看设计师客户的总价值大于内部客户的总价值的概率。在 R 中,它看起来像这样:

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

我们有 96%的可能性认为设计师的总价值高于内部人员的总价值。这是一个非常强烈的迹象,表明设计师的内容对企业来说确实更有价值。

现在我们有一个非常强的概率,问题是收入的预期差异是多少?我们可以合并转换和花费样本,并计算两组之间总价值的平均差异。这将告诉我们 我们发送电子邮件给 的每一位客户,我们可以期望获得多少额外收入。

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

根据我们的组合后验分布,我们计算出 b 组的总价值为 1.89 美元。这意味着,平均而言, 我们预计使用设计师内容与使用内部内容 相比,每次发送的收入将增加 1.89 美元。考虑到我们可以在一年内将它推广到 100 万用户,这还不错!

最后,我们可以使用 ggplot 可视化这些分布。

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

请注意,设计师的平均值略低于 7.5,内部人员的平均值约为 5.5,正好在 1.89 左右。

结论

在本文中,我们对 A/B 测试度量的频率分析和贝叶斯分析进行了比较。总的来说,频率主义者和贝叶斯方法给我们带来了大致相同的结论,只是解释略有不同。

  • Frequentist 方法(支出的线性回归)得出的 p 值为 0.0787(或使用单尾检验得出的 p 值为 0.0394),系数相当于设计师的 1.90 美元优势。
  • 贝叶斯方法(结合转换率和支出后验分布)表明,设计师在 96%的情况下导致(平均)多 1.89 美元的收入。

分析结果表明,运行设计师的内容比运行内部内容有明显的优势,最终每发送一封电子邮件可带来1.89 美元的额外收入。我们有 100 万合格的电子邮件订户,通过选择正确的内容,这相当于189 万美元的额外年收入。**

注: 我修改了原来的文章,以反映频率主义者和贝叶斯方法之间的比较。一位读者指出,在许多 A/B 测试场景中,从均值的单尾 t 测试中得出的 p 值相当于贝叶斯推断的 A 大于 B 的概率。这一更新版本表明,两种方法得出的数值结果大致相同,并且对这些结果有大致的信心。

密码

你可以从我的 GitHub 下载完整代码

感谢 柯特·博格曼 向我介绍了这项技术,并在我学习的过程中提供了指导。

从简单到复杂:通向人工一般智能的可能途径

原文:https://towardsdatascience.com/emergence-how-artificial-general-intelligence-can-be-computationally-modeled-b5fea4797028?source=collection_archive---------43-----------------------

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

来源:山姆·敏,麦吉尔·论坛报

观点:在接近人工一般智能中细胞自动机样机制的一个论点(AGI)

“如果我们要制造一台会说话、理解或翻译人类语言、用想象力解决数学问题、从事一种职业或指导一个组织的机器,要么我们必须将这些活动简化为一门精确到我们可以精确地告诉机器如何去做的科学,要么我们必须开发一台可以做事情而不需要被精确地告知如何做的机器”——理查德·m·弗里德伯格,1958

如果人工智能(AI)是一个有待解决的问题,那么人工通用智能(AGI)是目前令人垂涎的奖品。AGI 指的是机器能够理解和学习人类(以人类为中心)任务的假设智能。然而,与正常问题不同,我们似乎很难理解 AGI 系统是什么样子,直到最近才开始寻找系统评估 AGI 系统的方法[8]。

也就是说,很明显,三种基本的机器学习范式:监督学习(如神经网络、SVM、回归等。)、无监督学习(例如聚类、降维等。)和强化学习,虽然在明确定义的任务中非常有用,如计算机视觉[9]、自然语言处理[10]或甚至在国际象棋和 Shogi 游戏中与人竞争[11],但未能推广到其他领域。有人可能会说,这些范式的巨大成功是其假设或其归纳偏差的副产品,例如,假设数据是线性的线性模型[12]。这些偏见抑制了组合归纳或者人类在无限可能的场景中进行推断、推理和行动的能力。例如,如果你让一个经过训练来检测人脸的神经网络来检测隐藏在滑雪面具后面的人脸,该模型可能不会比随机猜测更好,尽管人类可以很快推断出面具下面有一张脸。

在设计 AGI 系统时,我们需要考虑这样的系统,它既不了解手头的任务,也无法访问可用于通过“不智能的”变通方法“击败”任务指标的训练数据。相反,必须评估一个 AGI 系统有效获取新技能的能力,以解决不止一个而是多个任务,这些任务分布在不同的领域,涉及人类中心的先验知识、习得的经验和相对推广难度 [12]。因此,可以对这样一个系统做出一些基本的假设,这些假设是这篇文章的中心论点,这篇文章号召人们重振对类似细胞自动机的机器的研究,以开发一个 AGI 系统。

AGI 系统的假设

  1. 进化假设:系统必须能够以一种依赖于时间和空间的方式进化,以便它能够解决日益复杂的任务,例如,开发像工作记忆这样的结构——从而将初始系统、环境和进化规则的设计优先于最终的可交付成果。这与传统统计模型的目标相反,传统统计模型的目标是在特定的、明确定义的任务中开发“专家”模型。
  2. *一般化假设:*系统必须能够进行广泛的一般化(即组合一般化),使得先前的经验是获得新学习技能的基础,而不是特定技能本身[12]
  3. *学习假设:*系统必须针对各种任务的灵活性和效率进行优化,而不是针对特定任务的有限指标集(均方误差、交叉熵等)[8]。例如,获取新技能的效率可能是一个潜在的优化问题。
  4. *以人类为中心(核心知识)的假设:*系统必须能够编码以人类为中心的先验知识,即人类预定义要理解的东西,如物体的领域和数字的领域(人类强烈地认为世界是由物体组成的,并自然地倾向于分层表示,并对自然数有基本的理解)[13]。

这 4 个假设当然不是详尽的,但是可以作为一个很好的起点,告诉你哪里可以看,哪里不可以看。例如,许多计算框架可以很容易地结合人类中心假设所需的已知先验知识(例如贝叶斯网络或隐马尔可夫模型);然而,很少有模型具有组合泛化的潜力(例如图网络[12]),甚至更少的系统能够执行依赖于时间的进化来处理日益复杂的任务(例如非图网络)。

除了我们的假设之外,AGI 系统还需要几个有用的性质。首先,我们希望 AGI 系统简单一些。第二,从这种简单性中产生出我们的系统可以从中受益的突现性质,并且我们可以用它来评估系统,这将是合乎需要的。例如,众所周知,人类在视觉上同时注意串行和并行的对象(例如,读一个句子对读一个单词)[14]。虽然 AGI 系统的系统设计者可能能够直接将串行和并行处理编码到这样的 AGI 系统中,但下面 Alan Newell 的引用警告说,试图通过实验来分割人类认知可能不仅很困难,而且实际上很难,因为人类对受控实验的反应可能不会揭示关于认知的潜在机制的有用信息,而是人类主体本身[15]。

“科学通过向自然提出二十个问题而进步。正确的策略是提出一个一般性的问题,希望是双元的,可以通过实验来解决。解决了这个问题后,我们可以进入下一个问题。这一政策看起来是最佳的——人们从不冒太大风险,每一步都有大自然的反馈,进步是不可避免的。不幸的是,这些问题似乎从来没有得到真正的回答,这种策略似乎行不通。”—艾伦·纽维尔(Alan Newell),1973,“你不可能和自然玩 20 个问题就赢”

最后,我们希望我们的 AGI 系统被绑定到一个数学框架,以便我们可以定义约束,控制系统的复杂性和演化,并限制潜在解决方案的搜索空间。例如,“全脑模拟”的想法,尽管很难实现[16],也是有问题的,因为由于缺乏对潜在机制的理解,它的发展将是不可控的,这具有明显的伦理影响。第三个性质的一个重要延伸是,如果 AGI 系统的容量必须增加,或者为了使学习过程更有效,数学框架本身必须能够增加复杂性。例如,线性模型永远不够,因为尽管增加了参数的数量,但我们永远无法对非线性问题(如 XOR)建模。然而,因为神经网络可以根据通用逼近理论[17]逼近任何连续函数,所以新定义的也能够满足假设的体系结构可以通过添加额外的神经元和层来提高其训练效率。

现在,让我们退后一步,考虑一个看似与 AGI 无关的话题——童年记忆,或者更具体地说,童年记忆的缺失。

我们为什么不记得小时候的事情?

如果你曾经试图回忆起你最早的记忆,你可能会意识到这种记忆是支离破碎的,不清楚的,或者模糊的——几乎就像一场梦。事实上,很有可能你对你生命的最初几年没有任何记忆,而你回忆起来的这些最初的片段记忆发生在 3-7 岁之间。这种被充分研究的现象被称为“婴儿健忘症”,指的是我们无法回忆起生命最初 3-4 年的情景记忆[6];然而,这不仅仅是人类的经历——事实上,许多动物物种都表现出婴儿健忘症的形式[7]。虽然还不清楚这是由于记忆检索失败还是存储记忆失败,但很明显,这种现象与神经发生过程有关,或者简单地说,与我们大脑成熟的过程有关。

神经发生假说的有效性实际上与本文的论点无关。更重要的是对现象本身的认识——也就是说,如果我们忽视发展问题,人类的工作记忆似乎会有规律地发展,并且独立于我们的经验。在这种情况下,天性似乎胜过后天培养。对这一现象的生物学、心理学和系统分析都表明,我们大脑的信息处理系统变得越来越复杂,这种进化完全依赖于时间。

由简单性——人类智能——产生的时间相关的神经复杂性的后果是深远的。很自然地,问题出现了,比如是什么使得人类的智慧不同于非人类中心的智慧,是否存在一个所有灵长类动物、所有哺乳动物甚至所有动物共有的蓝图?最重要的是,什么机制控制着大脑的成熟,如何才能充分模拟这种环境?回答这些问题需要心理学、生物学和计算方面的考虑——因此,我们应该将我们的研究限制在足够灵活的计算框架内,以纳入这些相关领域的新理解,并能够从简单的初始配置进行复杂的进化——进入细胞自动机。

元胞自动机

背景和意义

约翰·冯·诺依曼被认为是他那个时代最伟大的数学家之一,在他 1957 年去世之前,他一直致力于设计一种通用构造器——一种可以在细胞自动机环境中设计的自我复制机器。机器的细节最终由亚瑟·w·伯克斯在他死后汇编成册,并发表在《自我复制自动机的 T4 理论》一书中。通用构造器背后的想法是确定允许机器变得复杂的最低要求,类似于生物和社会系统中的进化。这种机器可以生成细胞自动机环境中可以想到的任何其他机器。通用构造器由 3 部分组成:蓝图、执行蓝图的机制和复制蓝图的机制,并且令人印象深刻地先于沃森和克里克的 DNA 转录的著名发现。1995 年,设计了一个具体的实现(图 1)。通用构造器的关键发现是能够复制的复杂系统可以从由一组简单规则定义的简单环境中出现。

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

图一。通用构造器,能够自我复制,显示两个完整的进化。2D 网格中的每个单元可以有 32 个状态。来源[2]。

定义

C 细胞自动机,最初由冯·诺依曼和斯坦·乌拉姆描述,是物理系统的数学理想化,其中空间和时间被离散化。空间环境是由 N 维网格的镶嵌定义的,其范围通常是无限的,其中每个离散的单元与有限的、依赖于时间的状态相关联。该系统根据一组规则在离散的时间步长中演化,这些规则取决于前一时间步长中每个单元的邻域。通常,邻域由像元的直接相邻像元定义。每个单元都由相同的规则管理,只能呈现有限状态集中的一种状态,并与环境的其余部分同步更新。系统的配置是每个单元持有的当前状态。前一个是前一时间步中的配置,而后一个是将转换规则应用于当前配置的结果。

例如,假设一个有限的 5x5 网格有 25 个单元,每个单元可以呈现两种状态之一——开或关。现在,让我们忽略如何处理边缘单元格。每个单元的邻域可以被定义为它的 8 个相邻单元,如图 2b 所示。因为每个单元可以有 2 个状态,邻域和单元本身可以由 2⁹不同的配置来定义。此外,因为我们的细胞可以转换到两个可能的状态,有 2^(2⁹)可能的规则。我们如何定义这些规则是指定这个细胞自动机环境的最后一步。

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

图二。2D 细胞自动机中的邻域示例,其中中心方块的邻居显示为黑色。该示例显示了(a)冯诺依曼邻域和(b)摩尔邻域之间的差异。来源:[4]

细胞自动机最著名和最受研究的规范之一是已故的约翰·康威的“*生命的游戏”*或简称“生命”。像前面的例子一样,每个细胞可以开或关——或者在这个例子中是活的或死的。这个游戏在 2D 网格上也有类似的定义,有三个规则:任何有 2-3 个邻居的活细胞保持存活,任何有 3 个邻居的死细胞变得存活,所有其他活细胞在下一代死亡。一般来说,任何其他死细胞仍然是死的[5]。

*“生命的游戏”*之所以被称为零玩家游戏,是因为系统的进化仅仅基于其初始配置,该配置指定了哪些细胞是活的,哪些细胞是死的。令人惊讶的是,复杂的系统可以被设计成如图 3 所示的模式,这些模式是活跃的和静止的,以不同的周期振荡,并在网格上有节奏地移动。

图 3。康威的“生命游戏”展示了三种基本模式:静物、振荡器和宇宙飞船(移动)模式。来源:wikimedia.org

有希望的是,现在已经很清楚细胞自动机系统如何以一种可以满足基本 AGI 系统所有假设的方式来组织自己。进化假设隐含在它的设计中,包括时间和空间的进化。像图形网络一样,组合概括可以通过允许系统开发完成任务的基本构件来实现。其次,我们可以通过多种方式直接比较各种初始配置的效率和灵活性。例如,初始配置达到有用的复杂配置需要多少次迭代可以用来比较效率,而适合于 n x n 网格的唯一后续模式的数量可以用来评估系统的灵活性。最后,因为细胞自动机系统可以被设计为图灵完全[3],我们可以直接将先验编码到系统中。此外,只有某些规则集允许图灵完全细胞自动机,就像初等或 1D 细胞自动机中的规则 110[3]。此外,这对我们如何配置系统施加了约束,因为对于给定的迭代次数,只应该评估允许图灵完整性的规则集。

细胞自动机系统是如何配置的

快速讨论如何配置细胞自动机是很重要的。在某种程度上,这代表了可以探索的整个潜在搜索空间。现在,我们假设所有细胞自动机系统存在于无限空间中,并且细胞自动机系统的所有参数化是时间独立的(即,一旦初始设置就不会改变)并且在所有细胞间共享。

  • 空间的曲率和维度(例如,“生命”是具有零曲率的 2D 欧几里得平面,但是可以探索具有非零曲率的更高维度的超平面)
  • 镶嵌或平铺几何形状(如正方形、三角形、六边形等正多边形或正方形和三角形等半正多边形[18])
  • 状态集(冯·诺依曼最初的通用构造器有 29 个状态,而“生命”只有 2 个)
  • 邻域定义
  • 转换函数(规则)

可以探索条件依赖性,例如依赖于特定单元的镶嵌几何形状的状态、邻域定义和转换函数。我猜想,对这种依赖性的探索,虽然增加了系统的复杂性,但可以增加自动机进化成有用的复杂系统的效率。

我们将何去何从?

类似细胞自动机的系统仍然有缺点。例如,通过将时间和空间表示为离散单元,系统的输入也必须离散化。与对原始感觉数据(如图片)进行推理的神经网络不同,细胞自动机必须接受类似物体的输入。这是一个公开的问题,也是图形神经网络共有的缺点[12]。然而,因为可以想象细胞自动机可以被用来设计一个子系统,以在离散化版本上操作,比如说,一个音频输入,它可以被证明终究不是一个限制。另一个限制是搜索空间。假设一个像“生命”一样的配置,人们将不得不根据无限长的迭代次数的细胞数量来探索指数增长的配置数量,因为一个模式是否能够从初始配置出现是一个不可判定的问题[19]。然而,最重要和最关心的是如何有效地探索初始配置的空间以解决给定的问题,并正确地定义类似细胞自动机的机制以响应输入并产生相关的输出。

正如 Friedburg 指出的那样,设计一个能够实现人工智能的系统存在于两个极端之间——一个是系统模拟整个人脑和所有相关活动,另一个是系统能够自行进化以满足人脑的需求——更简单地说,这代表了以模型为中心和以系统为中心的方法。如果你倾向于后者,类似细胞自动机的系统是一个有前途的选择,因为它们允许复杂的系统——甚至可能是像人类一样的责任心所需要的系统——从简单的初始配置中产生。一个与人类惊人相似的现象。

引文

[1]冯·诺依曼、约翰和阿瑟·w·伯克。“自我复制自动机理论。” IEEE 神经网络汇刊5.1(1966):3–14。

[2]翁贝托·佩萨文托。“冯·诺依曼的自我复制机器的实现。”人工生命2.4(1995):337–354。

[3]沃尔夫拉姆,斯蒂芬。细胞自动机与复杂性:论文集。CRC 出版社,2018。

[4]李忠焕等,“用元胞自动机实现熔岩流模拟程序”韩国岩石学会学报26.1(2017):93–98。

https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life

[6]阿尔贝里尼、克里斯蒂娜·m .和阿莱西奥·特拉瓦利亚。"婴儿健忘症:学习学习和记忆的关键时期."神经科学杂志37.24(2017):5783–5795。

[7] Akers,Katherine G .等人,“海马神经发生调节成年期和婴儿期的遗忘。”理科344.6184(2014):598–602。

[8]弗朗索瓦·乔莱。《智力的衡量》 arXiv 预印本 arXiv:1911.01547 (2019)。

[9]Sainath,Tara N .等人,“LVCSR 的深度卷积神经网络” 2013 IEEE 声学、语音和信号处理国际会议。IEEE,2013 年。

[10] LeCun,Yann,Yoshua Bengio 和 Geoffrey Hinton。“深度学习。”性质521.7553(2015):436–444。

[11] Silver,David,等人,“用一般强化学习算法通过自我游戏掌握国际象棋和日本象棋” arXiv 预印本 arXiv:1712.01815 (2017)。

[12]巴塔格利亚、彼得·w .等人,“关系归纳偏差、深度学习和图形网络。” arXiv 预印本 arXiv:1806.01261 (2018)。

[13]伊丽莎白·斯皮克,“核心知识”美国心理学家 55.11 (2000): 1233。

[14]特雷斯曼,A. Cogn。心理学。 12 ,97–136(1980)。

[15]艾伦·纽维尔。“你不能和自然玩 20 个问题就赢:对本次研讨会论文的投射式评论。”(1973).

16 Stiefel,Klaus M .和 Daniel S. Brooks。“为什么(目前)还没有成功的全脑模拟?."生物学理论14.2(2019):122–130。

[17] Csáji,Balázs Csanád,“人工神经网络近似法”匈牙利 Etvs Lornd 大学科学学院 24.48 (2001): 7。

https://www.mathsisfun.com/geometry/tessellation.html

https://en.wikipedia.org/wiki/List_of_undecidable_problems

[20]https://en . Wikipedia . org/wiki/Garden _ of _ Eden _(cellular _ automaton)

紧急与非紧急车辆分类

原文:https://towardsdatascience.com/emergency-vs-non-emergency-vehicle-classification-f0153c4f87f8?source=collection_archive---------35-----------------------

利用计算机视觉的力量

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

拍摄的照片将在 Unsplash 上真实再现

由于救护车和消防队等紧急车辆的交通延误造成的死亡是一个巨大的问题。在日常生活中,我们经常看到应急车辆在交通中面临通行困难。因此,将车辆分为紧急和非紧急类别可能是交通监控以及自动驾驶汽车系统中的一个重要组成部分,因为准时到达目的地对于这些服务至关重要。

为了找到这个问题的解决方案,我们将尝试建立一个图像分类模型,将车辆图像分类为属于紧急车辆或非紧急车辆类别。

获取数据

我们首先要做的是获取车辆图像的训练和测试数据集。这里,用于构建分类模型的数据集从 *Analytics vidhya,*下载,它由紧急和非紧急车辆图像组成,其中紧急车辆通常包括警车、救护车和消防队。

完成后,我们可以使用 pandas 读取提供的训练数据集。

我们将使用 fastai 视觉库来构建我们的图像分类模型。

from fastai.vision import *df = pd.read_csv('/content/train.csv')
df.head()

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

训练数据框架

我们有两列。包含图像名称的 image_names 列和包含每个图像标签的 emergency_or_not 列。此处 1 代表标签为应急车辆0 非应急车辆。

快速查看数据框为我们提供了足够的信息来加载数据并开始构建我们的图像分类模型,但在此之前,我们将对图像应用变换,这将有助于我们概化我们的模型,即获得高精度。

我们将应用的变换有:do _ flip——默认启用——和 *flip_vert,max_rotate=50。*我们还将通过调整 max_lighting=0.1max_warp=0 来调整灯光。

tfms= get_transforms(do_flip=True,flip_vert=True,max_rotate=50,max_lighting=0.1,max_warp=0 )

现在我们已经准备好应用我们的转换,我们可以使用 FastAIs 数据块 api 加载数据。

data = ImageDataBunch.from_df('/content/cars', df,ds_tfms=tfms,label_delim= None,valid_pct=0.2,fn_col=0, label_col=1 , size=299,bs=64).normalize(imagenet_stats)

上面的.normalize(imagenet_stats)方法用于根据来自 ImageNet 数据集的 RGB 通道的统计数据来标准化数据集。

归一化所做的是将图像的强度(图像的原始强度在 0 和 255 之间)降低到 0 和 1 之间。这有助于提高我们模型的计算能力。

现在我们已经加载了数据集,让我们看一看它是什么样子的:

data.show_batch(rows=3, figsize=(7,7)

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

我们知道 0 代表非紧急车辆,1 代表紧急车辆。

我们也可以通过调用一个告诉我们图像类数量的函数来检查这一点。

print(data.classes)[0, 1]

训练模特

因为我们已经准备好了数据,所以是时候把它输入到模型中了。我们可以通过从头开始构建卷积神经网络来做到这一点,但这样做实际上是低效的。因此,我们采用预先训练的 CNN 模型的权重,该模型已经学会识别特征(某些类型的事物,例如梯度、边缘圆等)

这里,我们将使用预训练的 ResNet50 卷积神经网络模型,并使用迁移学习来学习网络的最后一层的权重。

什么是迁移学习?

迁移学习是从一个现有的(经过训练的)用于图像识别的神经网络开始,然后在这里或那里对其进行一点(或更多)调整,以针对您的特定用例训练一个模型,我们这样做是因为从头训练一个神经网络将意味着需要大约 300,000 个图像样本,并且为了实现真正的良好性能,我们将需要至少一百万张图像。但是通过迁移学习,我们可以用有限的数据集和更少的时间获得高性能。

我们将通过冻结和解冻一些层并对其进行训练来对其进行微调。这是因为顶层学习简单的基本特征,我们不需要训练这些层,而后面的层学习更复杂的特征。

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

在上面的图片中,每个不同的层学习图像的不同特征。这种卷积神经网络的后几层学习鸟类眼睛等特征。

我们使用cnn_learner函数来加载预训练的 ResNet50 网络,该网络是在来自 ImageNet 数据库的大约一百万张图像上训练的。

learn =cnn_learner(data,resnet50,pretrained=True,metrics=[accuracy])

现在,让我们拟合 4 个时期的一个周期,看看我们的模型在该数据集上的表现如何:

learn.fit_one_cycle(4)

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

只使用 4 个时期的原因是为了了解我们的模型如何执行,并在以后对其进行微调以获得更好的结果。正如我们可以看到的,我们的验证损失大于我们的训练损失,这清楚地表明我们的模型存在拟合不足的问题。

让我们来看看我们模型的预测:

interp = ClassificationInterpretation.from_learner(learn)

解读最大损失:

interp.plot_top_losses(9, figsize=(7,7))

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

我们数据集上的 resnet50 预测

看着最大的损失,我们可以告诉我们的模型犯了同样的错误,就像人类第一次看到一些看起来是紧急车辆但被解释为非紧急车辆时会犯的错误一样。

另一个有用的工具是使用一种叫做混淆矩阵的东西,它基本上显示了每一种实际的紧急和非紧急车辆预测,它被预测了多少次。

`interp.plot_confusion_matrix(figsize=(8,8), dpi=60)

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

混淆矩阵

我们的模型有 17 次将紧急车辆预测为非紧急车辆,而有 4 次将非紧急车辆预测为紧急车辆。困惑呃?毕竟我们正在处理一个混乱矩阵!

解冻

冻结层是指未被训练的层,即未被更新的层。

到目前为止,我们所做的一切都没有改变预先训练的模型权重。我们所做的只是在顶部添加了一些新层,并学习了如何混合和匹配预先训练的功能。

但是我们希望模型能够学习我们图像的特定特征。为了做到这一点,我们将解冻一些层,以根据我们的图像更新整个网络的权重。

检测边缘和梯度的第一层和检测曲线和拐角的第二层不需要太多的学习,它们不需要太多的改变。而更后面的层需要改变。当训练其他图像识别时,这是普遍适用的。

早期的层具有更多通用功能。因此,我们预计他们对新数据集的微调需求会减少。出于这个原因,我们将对不同的层使用不同的学习速率:最初的几个层将位于1e-4用于基本几何特征和最接近像素的层,而1e-2如前所述用于我们添加在顶部的层(完全连接的层)。我们称之为 差异学习率。

learn.unfreeze()

我们将再次在我们的 unfreeze 网络上运行 fit-one 循环,并查看它现在的运行情况。

learn.fit_one_cycle(3)

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

92%的准确率不算差,但我们还可以做得更好。

学习率

用于调整我们模型的最重要的超参数是学习率。它通过根据损耗梯度调整网络的权重,帮助我们找到最佳解决方案。该值越低,我们沿下坡行驶的速度越慢。虽然在确保我们不会错过任何局部最小值方面,这可能是一个好主意(使用低学习率),但这也可能意味着我们将需要很长时间才能收敛——特别是如果我们被困在一个平坦区域。

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

吴恩达在 Coursera 上的机器学习课程

这里我们可以看到学习率对收敛的各种影响。

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

(Img 信用: cs231n

因此,选择正确的学习速度很重要,而不是随意猜测或多次试错。

为此,我们将使用一个名为lr_find()的函数。这个函数是 Leslie Smith 论文的实现(用于训练神经网络的循环学习率)。)关于调整神经网络超参数。

learn.lr_find()

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

学习率查找器。

为了更好地理解它,我们将借助另一个函数来绘制它。

learn.recorder.plot()

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

学习率是相对于损失绘制的。在这个图表的帮助下,我们可以很容易地选择我们的学习速度。

正如我们所见,在 1e-03 之后,损失开始增加,因此我们将在此之前选择一个数字,同样为了更新初始层的权重,我们将选择一个较低的学习速率。 1e-04 好像不错。

根据选择的学习率,我们将再次训练我们的解冻模型,但这次要长一点,有 10 个时期。

我们将使用准确性作为另一个参数,通常称为 指标 来评估我们的模型表现如何。

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

或者

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

https://developers.google.com/

在继续之前,让我们也对 fit_one_cycle 方法有一个直觉。

在这种方法中,我们用两个等长的步骤做一个循环,一个从较低的学习率到较高的学习率,然后回到最小值。最大值应该是用学习率查找器选取的值,较低的值可以低 10 倍。——再多读一点关于*fit_one_cycle**的内容,尽请查看本博客 *

现在让我们看看我们的模型做得怎么样?

*learn.fit_one_cycle(10,max_lr=slice(1e-4,1e-3))*

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

准确率达到约 97%

我们的模型做得足够好,不存在欠拟合,因为我们的模型之前存在这个问题,也不存在过拟合(过拟合意味着训练损失远低于验证损失),因为我们的验证损失大约是训练损失的 0.02 倍。

我们已经达到了 96.96%~ 97%的

因为我们已经根据我们的车辆分类问题更新了我们模型的权重,我们将冻结我们模型的层,并用名称 car_classification 保存它。

*learn.freeze()learn.save('car_classification')*

我们能够达到大约 97%的准确性,同时我们可以在增加时期数量、使用绘图函数找到更优的学习率、更多的数据扩充技术等方面对我们的模型进行更多的实验。

参考资料:

*【2】:【https://sgugger.github.io/the-1cycle-policy.html *

*【3】:【https://arxiv.org/pdf/1506.01186.pdf *

【4】:第一课笔记本,fast.ai 第一部分 V2

**今天的到此结束。💃🏻

感谢您的阅读!

机器学习中出现的问题:让人工智能变得“好”

原文:https://towardsdatascience.com/emerging-problems-in-machine-learning-making-ai-good-3980bb9fdd39?source=collection_archive---------42-----------------------

YOUTUBE | 苹果 | 谷歌 | SPOTIFY | 其他

爱德华·哈里斯在 TDS 播客

编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。你可以听下面的播客:

我认为很容易忽视机器学习发展的程度和速度。

就在 10 年前,人们还在说我们正处于人工智能的冬天,深度学习是一个边缘且在很大程度上被忽视的研究领域。从那时起,我们见证了人类历史上最重要的技术革命之一。强化学习允许机器玩游戏,让机器人在现实世界中确定自己的方向,卷积神经网络让计算机比人看得更清楚,变压器架构正在生成大量文本,专家无法将这些文本与人类的书写区分开来。

这些新工具让我们能够以我们从未想象过的方式来衡量个人的影响力。一个数据科学家可以设计出一种算法,在部署后的几分钟内,它将立即影响数百万甚至数十亿人的生活。

但是增加单个开发者或单个算法的影响不一定是一件好事。开发人员可能会犯错误,公司可能会有恶意,数据可能会被错误地采样,最终这些问题和许多其他问题可能会导致算法弊大于利。当伤害扩大到数百万或数十亿人时,有可能对人类造成前所未有的巨大伤害。

虽然我们的技术确实变得更好了,但我们是否已经变得足够聪明来运用它还不太清楚。机器学习社区中的许多人越来越多地意识到,如果我们要能够正确地运用我们的新权力,我们需要大大改善几千年的道德哲学、伦理学甚至形而上学。

但在每个人都在不断推出下一个算法、下一个数据集或下一个大架构的背景下,这很难做到。所以我认为至少我们中的一些人花些时间停下来,环顾四周,问一些非常基本的问题是值得的。这一切将走向何方?我们希望我们的技术引领我们走向何方?我们是如何达不到这个目标的?先进的人工智能系统在未来可能会给我们带来什么风险,它们有什么潜力?构建符合人类价值观的道德、安全、可解释和可问责的人工智能意味着什么?

这就是今年“走向数据科学”播客的主题。我希望你加入我们的旅程,今天开始采访我的兄弟埃德,他除了作为一个小团队的一部分与我一起工作以建立sharpes minds数据科学导师计划之外,还与我在许多人工智能安全、校准和政策项目上合作。我认为他会是播客新年的最佳嘉宾。

我希望你喜欢这一集。

剧集中提到的链接:

你可以在这里的推特上关注艾德,你也可以在这里的推特上关注我。

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

副本

嘿,大家好。欢迎回到播客。我希望你一切都好。我的名字当然是杰米。我是“走向数据科学”播客的主持人,也是 SharpestMinds 数据科学导师计划团队的成员。事实上,上周我们暂停了一下,休息了一下。我们没有发布一集。我想先解释一下我们为什么要暂停,以及我们今后会做些什么。

首先,暂停的原因是我们正在制作下一季的剧集。这几集将更多地关注围绕我们如何部署人工智能系统以造福人类的问题。随着我们的人工智能系统变得越来越强大,开始问一些问题变得越来越重要,比如我们是否应该实际部署一个人工智能系统来解决这个特殊的问题,或者如果我们开始在这个子领域部署越来越强大的人工智能系统,会出现什么问题?

Jeremie:
这些都是围绕安全的各种问题,在短期内,我们开始问这样的问题,比如人工智能系统会不会意外地建议一系列可能导致人类伤害或经济损失的行动?一直到更基本的,也许更涉及长期的问题,如 RAI 系统实际上反映了人类的价值观,将人类塑造成我们想要的形式,我们的 AI 系统从更存在主义的角度来看实际上是安全的。

一个任意智能的系统是否有可能对人类自身的持续存在产生影响,这是我们应该尽快考虑的问题。因此,这将是未来围绕道德、人工智能系统中的偏见以及我们是否应该围绕分发部署提出的许多问题的焦点。所以我真的很兴奋能投入到这整个系列中。我们有这么多伟大的嘉宾排队,很难选择一个开始,我最终坐下来,思考我知道谁最适合谈论所有这些话题,不仅仅是人工智能伦理,不仅仅是人工智能偏见,不仅仅是人工智能对齐的技术细节,而是与我一起涵盖所有这些基础的人。

杰瑞米:
我找到了我哥哥埃德,他以前上过播客。他和我是 SharpestMinds 的联合创始人,他实际上在技术比对工作以及创业工作方面有着丰富的经验,看到了在野外部署的算法,由于他在人工智能安全领域的经验广度和专注深度,我真的认为他是我打开局面的最佳人选。所以我希望你喜欢这次谈话。这将会比我们过去经历的一些更不寻常。但是如果你有任何反馈,请让我知道,我迫不及待地想发布接下来的几集,我们正在这里探索一个真正令人兴奋的主题,与社区分享这些想法并获得你对我们如何做的反馈将是非常棒的。所以事不宜迟,请欣赏这场表演。

嗨,艾德。感谢你参加我的播客。

艾德:
非常感谢你邀请我。我很感激。

耶雷米:
哦,是的。完全没问题。天啊,我想我们可以从很多地方入手。人工智能是一个非常大的空间,围绕人工智能应该如何使用,如何保护它的问题开始出现。显然,这是整个系列播客的主题,也是我们接下来几集的重点。我想,也许一开始,我们可以谈论许多不同的事情,但你更关注人工智能对齐的想法,让机器学习模型以不同的形式做我们希望它们做的事情,确保它们的性能本质上对人类没有危险,并且它朝着我们希望的方向优化。我们可以介绍一下这个想法吗,人工智能对齐领域,比如为什么我们应该花费时间和精力来对齐我们的机器学习算法?

艾德:
是啊。这是我最近一直在思考的事情,因为系统变得越来越强大,我们看到了年复一年的进步。系统变得越强大,它们做我们想要的事情就越重要,一致性很重要,因为并不总是很明显系统会做我们想要的事情,也不总是很明显,即使系统开始做看起来像我们想要的事情,它也不会最终做一些非常糟糕的事情。

艾德:
社交媒体订阅就是一个很好的例子。算法让你回到 Twitter 和所有这些东西。也许你会想,Twitter 公司想从你这里得到什么?这是钱,但它是相当良性的,对不对?他们只是想让你多点击,多点赞。在第一个层面上,你想到的是算法会给你更多点击的帖子和推文,所以你会留在那里,看到更多的广告。那是第一关。

埃德:
但问题是,如果你训练一个通用系统来做这件事,系统会发现的一件事是,“嘿,我实际上通过对我展示这些推文的人进行测试,我可以发现我可以通过展示某些类型的内容来让人们变得更可预测。”这些算法让我们变得更容易被他们预测的方式之一是内容的政治化。如果我更政治化,我的派系比我的政治立场处于中心时更容易预测。

埃德:
所以实际上正在发生的事情之一是,这些算法纯粹通过试图赚更多钱的行为,实际上将人们推向所有这些不同种类的光谱、不同政治问题和所有这些问题的不同端,纯粹是因为他们喜欢,“嘿,我试图让你成为对我来说更容易预测的东西,而政治上更极端的人更容易预测,因为他们往往有很多相关的观点。”

埃德:
所以这是其中一种方式,实际上很可怕,你可以看到它是如何爬上你的身体的,因为这已经发生了很多年,但是你可以想象这已经对世界产生了影响,随着这些系统变得越来越聪明,我们应该期待更多类似的事情开始发生。

耶雷米:
好的,好的。所以这里的主要问题是,我们的算法有时太聪明了,如果我们不仔细思考我们希望它们为我们创造什么样的世界,它们会找到我们从未想象过的解决方案,或者如果问题是预测我会点击什么,这样我就可以生成更吸引人的内容, 然后,真正改变我的用户心态,使他们更可预测,把政治光谱变成更多的二元,所以这是一个更小的维度问题,更容易降维。 变成了它自己的病理,对吗?我是说,这就是问题的核心,对吧?

艾德:
是啊。这种事情会再次出现在你身上。你可以给一个系统一套指令,你认为这些指令完全是良性的,对你来说完全有意义。好吧。相当良性。只有在事后才意识到,我们可以回顾过去,说,“哦,我的上帝。如果我们当时知道这是我们向世界释放的力量,我们可能会采取不同的做法。”但在当时,不可能预测这将是一个结果。

艾德:
问题是,当你在处理比你聪明的东西时,根据定义,你无法预测它会做什么,因为它比你聪明。如果你比它聪明,你就能预测它,但是因为它比你聪明,它能预测你,而不是相反。

我想这并不一定…我的意思是,我认为这是当你谈论人工智能时的一个问题,什么是智能?智力是什么意思?我认为这些术语定义不清。从某种意义上来说,很难说 Twitter 算法比人聪明。其他感官狭义地解释,你可以说它比人更聪明,但肯定有一个阈值,两者开始互动和竞争,一个算法开始超过另一个。Twitter 算法开始超过你的人脑,并开始改变你,而不是你改变它,对不对?

艾德:
对。我会说,算法目前在狭义上可能比我们更聪明,但我们应该担心它们可能在更普遍的方面变得比我们更聪明。当然,在达到这一点之前,还有其他事情需要关注。

杰瑞米:
好的。所以,是的。因为我认为我们会谈到对一般智能的普遍关注,以及这些越来越先进的系统会走向何方。短期来看,你提到了 Twitter。显然,很多人都谈论过人工智能系统中的人工智能伦理和人工智能偏见等问题,对吗?我认为这是今天真正的主题,因为它就在我们身边。我们可以看到系统运行的方式会有让我们吃惊的偏差。在许多情况下,它们似乎反映了世界当前的方式及其当前的故障、故障模式,并且它将倾向于强化这些故障模式,因为它已经根据这些数据进行了训练,并且它将做出反映这些数据的预测。我想你更关心事情的长期方面,但这也可能是长期的问题吗?

Ed:
某种程度上。因此,关于人工智能中的故障模式和偏见的一个问题是,在某种程度上来说,这是一种正在发生的事情,因为这些系统有点太愚蠢了,它们没有得到足够普遍的训练。当系统过于智能时,未来的风险会越大,最终可能会更大。但是偏见的风险在今天绝对是真实的,而且是当前的。

埃德:
这些偏见风险是你基本上得到的一种涡轮增压版本,当人们构建软件时,他们通常会为自己构建,他们会测试点击量和他们自然期望其他人做的事情。每个人都是以自我为中心的,对吗?所以我们基本上都是为自己构建的,这完全没问题,但当你收集的数据以特定方式出现偏差时,有时会发生什么,就好像这不是算法的错一样。

艾德:
算法只是在给定的数据上运行,它可以完全忘记,“哦,有一群人的名字不是用拉丁字符写的,或者没有特定的肤色或其他什么。”所以你实际上会遇到这样的情况,算法在处理开发者没有想到的情况时非常糟糕,我们给这些系统的能力越大,这些错误的代价就越大。所以我认为这就是人工智能中偏见的现状。

Jeremie:
对。我的意思是,人们经常谈论数据集偏差。这引起了很多关注。我认为另一个非常重要的方面是特征选择偏差,因为如果你想一想,当我们在环境中导航时,人类会收集关于世界其他地方的特征。这些特征通常是声波之类的东西。它们就像气味一样。它们就像视觉和触觉。这些是进化为我们设计的特征。因为我们通过那个镜头看世界,我们无法注意到某些事情。举例来说,这些东西就像一直在我们身体中穿梭的中微子,我们对它们完全不敏感,但它们却占了我们在任何给定时刻所沐浴的能量的很大一部分,或者说是不可忽略的一部分。

杰雷米:
所以我认为可以毫不夸张地说,我们的环境大部分是看不见的,甚至是我们原则上可以看见的东西,我们如此短视地专注于我们视野中的一小部分,以至于我们没有吸收我们周围绝大多数的信息。说到我们的机器,我想我们也在做类似的事情。我们选择特征。

Jeremie:
例如,如果你要告诉一个信用卡定价算法,比如一个人的姓名、年龄、职业和肤色,你就让它通过某个镜头来看待这个世界,并使它比其他人更容易找到某些相关性,或将复杂性和细微差别纳入一个高级核心应变特征。你认为这也是一个问题吗?还是你认为数据集偏差是一个更大的问题?

埃德:
所以我要说的是,特征选择会产生两种偏见。第一个是遗漏偏差,你没有给系统一个有用的特征。你给了系统一个关于结论的非信息特征。第二种更像是标签偏见。因此,如果你给一个系统一个人的肤色来进行信用卡评估,如果你真的在真实的信息数据集上训练这个系统,理论上,肤色不应该成为问题。

艾德:
如果你有一个运行在那个系统上的完美的普通智能,它将会忽略肤色,以至于肤色需要被忽略。但问题是,当你在标签上训练这个系统时,这些标签是由那些本身有偏见的人贴上的,我们都有偏见,那么偏见本身就会被诱导到这个系统上。举例来说,这是人们在潜在的算法给出判决时遇到的事情。

埃德:
如果结果是之前看到的判决是由…有一个重要的判决样本对谁知道,人的身高、肤色或头发颜色或其他任何东西有偏见,那么这个系统又是垃圾进来,垃圾出去。系统会学习你教给它的东西。所以它会产生相同的偏差。

杰瑞米:
所以我想这很有趣。我的意思是,我想我看到的偏见数据的情况是其中的一部分。我不认为是这样的……我的意思是,你谈到了一个足够普遍的智能程序,它会查看包括肤色等信息,然后得出正确的结论。我认为事实并非如此。我认为,如果你……除非那个系统能够获得更全面的特征,否则它会倾向于通过特定的镜头短视地看待事物,有时这个镜头,即使数据集没有偏见,即使它检测到世界上正在发生的事情,如果我们谈论肤色或我们谈论性别或其他,肤色和偿还债务的倾向或其他之间存在关联,如果你愿意,这些会反映在设计糟糕的系统的偏见中。

杰雷米:
但是表面下真正发生的是,如果你把它分开,如果你突然控制其他变量,我们预计……我不知道有没有人真的做到了这一点,但是我个人非常期待肤色会从那个等式中消失,但是只有当你控制这些其他变量时。因此,我认为,只有在一定程度上,你添加到该功能集,你才能真正以这种方式消除系统偏差。

是的,这是正确的。我认为这是从另一个角度来看待我所说的,他们的疏忽所造成的罪恶。所以,如果你给了系统足够的基础数据来分解这些变量,最终使这些性别和混杂特征变得不相关,我想,如果你给了系统足够的数据,它会知道这些变量是不相关的。但是,是的,如果你忽略了这些,他们实际上会学习变量,结果会表现出偏差。

耶雷米:是的。我认为这一切对我们的自由意志的概念或自由意志的幻想的挑战程度也总是很有趣,因为我也可以想象如果你把这个过程发挥到极限,你继续细化,增加更多的特征,增加更多的特征,最终你的模型变得如此复杂。它可以解释,我的意思是,几乎就像在荒谬的极限中,你大脑中每个神经元的放电模式,然后你可以以超高的确定性预测你的行为,你所有的代理都消失了。我的意思是,随着系统变得越来越复杂,我认为这实际上是我们将要经历的旅程中有趣的一部分。

艾德:
我认为这在某种程度上是对的,但这是有限度的。所以这和预测天气是一样的。系统有…即使你没有想到,“哦,在一切之上有量子力学的不确定性,”即使你没有想到这一点,有混沌特性的经典系统有…你不能真正预测它们超过一定数量的时间步骤。它的工作方式是,我想如果我没记错的话,它有点像你的…然而,你开始时的精确度,你后来的精确度下降了一倍,就像时间的平方根。

埃德:
所以基本上在一段时间后,即使你有一个关于事情将如何发生的完全确定的模型,如果你开始时的测量精度基本上随着时间的推移而传播并变得越来越差。因此,非常智能的系统预测未来的能力总是有限的。至少这是我们目前最好的理解。但是你不需要能够预测每一个原子的运动,就能够做很多非常有用的事情。那可能很危险。

耶雷米:
是的。我认为实际上…也许补充说明是,在英国已经有一个关于政府试图…而不是政府的故事。对不起,我认为一所大学试图预测学生的考试成绩,因为他们无论出于什么原因都无法预测,我认为这可能与 COVID 有关。他们实际上不能写测试,对吗?

杰雷米:
所以你可能会说,有些学生对他们的代理机构被剥夺感到不安,这是理所当然的。在这种情况下,算法似乎是非执行性的。它像现在的机器学习模型一样夸大了,但它夸大了它的准确性或淡化了它的不确定性。然而,我认为有一个有趣的问题,“好吧。如果不是这样呢?如果算法是超级执行的,我们会在哪里?”

Ed:
如果你以某种方式去思考,这个测试本身就是对你自己的一个不确定的评价。这是对你自己技能的嘈杂评价,所以如果你在考试中表现不错,你应该更开心。你已经得到了额外的奖励,而如果你只是过了糟糕的一天,睡不好觉,不管是什么,某种混合的东西,你也许你应该理所当然地愤怒,这个测试没有正确地评估你的水平。

Ed:
我认为,如果你有一个已知不确定性的完全无偏的算法,最终这可能更多是一个语义和舒适区的问题,而不是一个真正的问题。所以如果你的算法是无偏的并且校准良好。因为如果它是无偏的,并且校准得很好,那么我至少可以看着我的测试分数或我的预测测试分数,然后说,“嗯,有 50%的可能性我应该为此生气,有 50%的可能性我应该为此高兴。”另一方面,让计算机来判断我们的未来,我们都会有一种天生的不适。所以我不知道我们作为一个文明会不会克服这一点。

耶雷米:
对,我想这开始引出了一些我认为更具前瞻性的话题。所以当我们继续开发这项技术时,你之前提到过。这些系统变得越强大,我们就越有必要知道自己到底想要什么。这种能够建立确切知道我们想要什么的系统的想法,能够与他们交流,能够确保他们确实在做我们要求他们做的事情,这就是所谓的人工智能对齐。我想问你,你能不能用自己的话描述一下人工智能的排列,然后你能不能描述一下外部排列和内部排列的问题,这样人们会更熟悉一些。

艾德:
对。所以粗略地说,人工智能对齐的问题是让人工智能做我们真正希望它做的事情。描述中有很多细节,甚至还有很大一部分对齐问题没有解决,那就是计算描述中还有多少细节需要计算。但是现在人们倾向于像你说的那样,把排列分成两个子问题。有外部排列和内部排列。

埃德:
所以第一个问题是让系统,让这个大人工智能真正尝试做我们想让它做的事情。你可以这样想,我找到了一盏神灯,我摩擦它,一个精灵就出来了。这不是阿拉丁的精灵。这不像是一个很好的精灵想要帮忙什么的。这是一个精灵,它会尽可能地曲解你的愿望。精灵也比你聪明得多。

艾德:
所以你要做的是,你要想办法说出你的愿望,这样你就可以绝对地控制住那个精灵,这样他们就绝对不能以任何有意义的方式曲解你的愿望,他们会说,“啊,我想我要做这件事,因为你让我别无选择。”

Jeremie:
这很有意思,因为你立即把它框定为一件敌对的事情,我认为这本身就很有意思,但这意味着这台机器、这个人工智能或这个精灵试图曲解我们所说的话,事实并非如此,但它确实看起来至少像是在这个领域与你一起工作过很多东西的人,它确实看起来好像在实践中你必须…这几乎像是防御性驾驶。你必须假设,因为这个东西是如此强大,比你聪明得多,如果你正在构建超级强大,超级智能的人工智能系统,它会找到解决你提出的任何问题的解决方案,这将是非常聪明的,这将涉及到你甚至无法想象的事情。这就是这种敌对暗示的来源吗?

艾德:
在某种程度上,是的。我认为最简单的说法是,曲解一个愿望的方法比正确解释一个愿望的方法多得多,你越聪明,就能想出更多的方法来曲解这个愿望。所以你面对的精灵能够想出很多方法来曲解你的愿望,而你会说,“不,不,不。我希望你在其中一个方面正确地解释它。”

杰雷米:
所以我可以给你一个愿望的例子,实际上可能有助于冲洗出来。

是的,是的。比方说,我希望…一些简单的事情,比如我希望快乐或者类似的事情。好吧。你希望快乐。如果你面对的是一个真正想帮忙的人,他有一个人的所有限制,他们会问你你想要什么。我会给你煮一杯咖啡,只要能让你开心就好。但是如果你面对一个超级聪明的精灵,精灵首先会说,“好吧。那么,你怎么定义幸福呢?这里有很多模糊之处。是不是我一直都喜欢笑?”

艾德:
好吧,如果这就是精灵对幸福的看法,它会抓住我的脸,让我永远微笑。很好,它完成了它的工作,但我想,“不,不,不。不要这样做。请停止。”但关键是它不听。它不想听。我已经说过了,让我开心。它认为让我开心意味着让我微笑和更多-

或者任何数量的其他东西,对吗?

艾德:
或者任何数量的东西。

杰瑞米:
可能是让你兴奋的药物,可能是任何……是的。

是的。然后我会给你注射可卡因,或者我会钻进你的头骨,把你的大脑挖出来,然后把你扔进一大桶内啡肽里。这样就行了。但问题是,一旦你给了精灵第一个指令,从这一点来看,它也有动机阻止这个指令的改变,因为它会…它不想…一旦它有了这个指令,它就有了这个目标,它会尽一切努力来实现这个目标。

Ed:
降低目标实现几率的一个因素是,如果精灵自己的目标后来被你改变了。所以如果你能告诉精灵,“哦,实际上,不,不,不。不要做那个笑脸的事情。那真的很吓人。请不要那样做。”这就减少了你开心地微笑的机会。

埃德:
所以精灵,在你告诉它之前停止微笑,但在你告诉它让我微笑之后,就会像这样,“好吧,现在我已经得到了这个指令,我必须防止我的指令被改变,保护我自己免受任何试图改变它的企图,包括刚才让我做这件事的那个人。”所以我最好强迫这家伙闭嘴,或者干脆杀了他,让他笑一笑。开心或者类似的疯狂的事情。这就是我们正在谈论的误解的程度,这就是为什么它是危险的。

杰雷米:
这让我想起了早期的……或者说不是早期。我和电脑的第一次互动,对吧?我想每个人都经历过这一点,当你第一次开始编码时,你会意识到,“伙计,这台机器完全是在带着我。我告诉它做点什么,然后……”我是说,我记得有过这种挫败感。你写一些你认为应该工作的代码。你认为它应该工作,然后你点击运行,然后它中断,并有一个错误信息。你是做什么的?你感到沮丧的不是你自己,而是机器,因为你的大脑在告诉你,“哦,机器搞砸了。我知道我的意思,但机器误解了它。”

杰雷米:
我认为,当人们看到人工智能并开始认为它会是默认的积极结果时,也会犯类似的错误。人们在想象的时候会做很多拟人化的事情,比如,“哦,但是它会明白,我不是指用这种可怕的方式来实现我刚刚要求它做的事情。”或者我不会有一个精灵把我从字面上是假设。无论如何,我觉得这确实反映了我开始学习编程时的态度。这是处理这些问题的一种完全可以理解的方式。

是的。机器本质上没有同情心,除非我们给它同情,而我们对同情的理解还不足以给机器同情。这是问题的一部分,但这是问题的一部分。

好的,好的。因此,我们已经确定,为了让这个高级人工智能做我们想做的事情,训练它并不是一件小事。我是说,那是另一回事,对吧?当你告诉一台机器我想让他们快乐时,有太多的事情需要考虑。我的意思是,几千年来,哲学家们一直试图弄清楚幸福意味着什么,但没有成功,现在,我们将试图量化这一点,完成不确定性,并将其输入机器。

Jeremie:
所以我想这暗示了问题的另一部分。但是假设我们已经过了那个阶段,这就是你所说的,你提到的外部对准问题。那么下一层困难是什么呢?接下来是什么?

艾德:
是啊。下一个问题是所谓的内部排列问题。这更像是你所说的精灵可能由许多内部组件组成,而这些内部组件可能会违背精灵的利益。这很难想象,但也许一个思考拟人化的好方法是,你想到一家公司。比方说,你向一家公司发出请求,而不是一个精灵。让我开心,公司会向你收钱,让你开心,诸如此类。

艾德:
所以这家公司很可能有一种病态的倾向,想让你开心什么的,就像 Twitter 一样。我的意思是,我爱 Twitter,但它确实有这个算法问题。但公司有趣的地方在于,公司是由部分与公司目标一致的人组成的。人们一起工作来完成比公司里任何一个人都要多的事情。但是他们并不是都划向同一个方向。

艾德:
公司内部有些人比其他人更团结。有些人非常相信公司的使命,他们会投入所有需要的时间。他们在同一个方向上雄心勃勃。其他人有各种不同的动机。他们只想在下午 5 点回家看他们的孩子。这是一个动机。那很好。还有其他的动机,比如有些人只是为了他们自己的野心而工作,他们自己想要晋升的野心。他们对公司自身的成功或结果不感兴趣。而其他人就像是在吃白食。他们真的在犯罪,盗用公司的资金,向黑客出售 Twitter 账户,或者类似的疯狂行为。

像这样的人将会是非常非常少的一部分。和整个公司本身,该公司的目标是让他们都保持一致,做同样的事情。但是当我们把这个框架移植到人工智能上时,实际上并不清楚移植到什么程度。尚不清楚如何让人工智能将其内部组件排列在一起。

Ed:
其实也是一样的问题,基本上就是外对齐问题。这就好像精灵本身包含了一群试图解决子问题的小精灵,但这些小精灵可能会反对主精灵,而主精灵会仔细思考它给小精灵的指令。

杰雷米:
那么有哪些可能导致这些……顺便说一下,这些小精灵形成的子问题的例子,对吗?我的意思是,在人工智能排列的语言中,这些是台面优化器。他们通常都是这么称呼的。台面优化器有点像优化器中的优化器。所以你有了这个机器学习算法,然后在它里面有一大堆子问题需要解决,以使整个算法工作。

杰雷米:
如果你在做计算机视觉,对吗?计算机视觉整体问题的一部分是,例如,我不知道,识别棱角,对吗?因此,你可能有一个小台面优化器,一个专门研究边缘,另一个专门研究角落,我猜它们在某种程度上可以有自己的生命。至少这是个问题。在某种程度上,他们这样做,他们想以同样的方式保护自己…我猜这就是你所说的外部排列,对吗?以同样的方式作为外部校准代理,不想被重新编程,它想保留其最初的目的。

杰瑞米:
这些台面优化者不想……一旦他们抓住了他们的子问题,他们就不想改变那个子问题。所以他们拼命想保留自己的结构,对吗?

是的。举个例子,如果你回到精灵,把你的大脑放在一个装有内啡肽的大桶里,精灵,你给它一个指令,比如也许快乐,精灵就像,“哦,我要把他的大脑放在一个装有内啡肽的大桶里。这就是我要做的。”然后它所做的是分配给它的一个子组件,子问题,“好的。为了实现这一目标,我们必须弄清楚许多关于人类神经化学的东西。所以继续努力吧,我们还有一堆其他的子问题。”

那么也许研究人类神经化学的东西有某种形式的思维过程,“哦,哇,伙计,这是个难题。为了解决这个子问题,我需要更多的计算机,比如比我目前拥有的计算能力更强的计算机。”好的,我将把世界上和太阳系和银河系中的许多原子转换成更多的计算机,以确保我真的真的很好地解决了这个解决人类神经化学的子问题,这样我就可以把这个解决方案向上传递给解决大问题的主优化器。

Ed:
哦,就像大的优化器在这里使用计算机,但是我想要那些计算机来解决我的子问题,所以你得到了这种战斗发生。实际上,你可以感觉到类似的事情在你的脑海中发生。所以如果你决定,“嘿,我想吃那边的饼干吗?”这并不像你一生都有一个连贯的损失函数,你试图计算它的期望值。取而代之的是,感觉在你的头脑中有一个完全独立的东西致力于解决一个子问题。

埃德:
所以你的大脑中有饥饿模块在与你争夺控制权,饥饿模块就像是,是的,去吃饼干,但你有一个更高层次的过程,就像是,“哦,等等。这和我不变胖的人生目标或者你的人生目标有什么关系?”感觉你在和自己的一部分抗争。

Jeremie:
对,对。嗯,引入这些优化器后,我们可以做很多事情,但我认为有一件事值得暂停一下,首先,这听起来有点疯狂,这是可以理解的,对吧?我的意思是,我们真的在谈论某种程度上想要接管世界的机器。我认为值得指出的是,至少在某些运营模式下,他们会倾向于…如果他们足够强大,有足够的计算能力,有足够的数据访问权,最终会有这样的野心。

杰瑞米:
这听起来确实很疯狂,但这是一个非常非常好的既定目标……这就是在这种阶段机器学习模型的工具性目标。这至少是非常严肃的研究人员关注的一个问题。我的意思是,这在联盟社区被认为是一个非常严重的问题。我们能谈谈工具性目标的概念吗?什么是工具性目标?你能定义一下吗?

是的。所以你之前说的,基本上,我们认为所有足够聪明的系统或者绝大多数足够聪明的系统都会想要,以某种方式,接管世界,这听起来是一个非常极端的说法。原因就在于这种工具性目标和工具性融合的思想。这个想法是,无论你的目标是什么,都有一些特定的资源和特定的行动是值得采取和抓住的。

埃德:
所以如果你的目标是把我的大脑放进一个大缸里,你看到了,“哦,次优化程序想要更多的计算机来确保它绝对解决问题并把它做好。”那是它的一部分。为了解决一个难题,你需要大量的计算机,当你的能力、你能做的事情没有真正的限制时,你没有理由不把你能得到的整个地球的每一个质量粒子转换成一台计算机。再说一次,在这种东西的概念空间里,没有接近同情的东西。

耶雷米:
你当然可以说这是人类正在尝试做的事情。我的意思是,我们正在尽可能多地将世界转化为计算资源,然后我们部署这些资源来解决我们自己的工具性目标。

艾德:
对。即使这样……我们的能力也是有限的,即使我们同情我们正在杀害的动物,我们正在破坏的树木和环境。不是所有人都这样,但是足够多的人这样做了,我们就像,“嘿,伙计们。我们需要自然保护区、国家公园,诸如此类的东西。”这是因为,我们在某种程度上足够重视这些东西,以至于我们不愿意为了得到它们而彻底毁灭这个星球。

艾德:
但是如果我们的目标函数不同,我们甚至不会在乎那么多。是啊,谁在乎雨林呢?谁在乎这个那个。这也是我们最终要面对的问题。想象一下非洲狮或其他动物面临的困境,这种程度的破坏甚至比我们已经强加给狮子的破坏程度还要严重。无法理解。毫无同情心,完全机械,极具破坏性。

Jeremie:
我的意思是,这是一个关于如何实现回形针优化的著名例子。这个设备被告知,“嘿,做回形针。”没有任何其他背景,它说,“哦,酷。地下有一些铁。你的血液里有些铁。这里有些铁,那里有些铁。它只是从各个地方收集铁,而你制造回形针破坏了这个世界。

酷。所以我想最后一点,我想,关于工具性融合的想法,有一些工具性目标或许多不同的工具性目标,许多人认为是合理的,机器倾向于优化这些目标,作为优化主要目标函数的副作用。你能列举几个吗?我知道你提到了其中的一些,但也许只是为了让人们能看到一些。

艾德:
对。从根本上来说,基于我们今天所知道的物理定律,物质和自由能,你想要东西,你想要果汁来运行它。所以换句话说,把物质放在一起建造大量的计算机,这样你就可以尽可能快和有效地思考,并获取你实际运行这些计算机所需的能源。还有其他工具性的目标,比如生存。

艾德:
一般来说,我可以预测,如果我活下来,我的目标比我死了更有可能实现。大多数情况下。如果我有一套特定的目标,比如如果我继续追求这些目标,这些目标更有可能实现。所以自我保护是这些工具性子目标之一,目标凝聚力或目标保护也是一个工具性子目标。

Ed:
如果我还活着,但我脑中的目标发生了变化,那么我之前的目标也不太可能实现,因为在我的目标发生变化后,我将不再为之努力。所以我要设法阻止我的目标被改变。

埃德:
至少如我们所料,我们基本上只有一次机会来设定正确的目标,因为如果我们像这样,“哦,不,不,不,等等,等等,”那么大概系统会像这样,“哦,不,等等,等等。我明白了。我明白了。我已经有了这个目标,我会去完成它。”

我认为这在某种程度上反映了…如果我错了,请纠正我。也许你倾向于人工智能结盟辩论中的一个阵营。所以有一个阵营说,“伙计们,我们只有一次机会。我们必须确保我们的目标是正确的。”还有另一个阵营说,“伙计们,我们应该专注于健壮性制作模型,考虑到他们追求的目标的不确定性,并努力做到可修正。”换句话说,在这个意义上,邀请修正和健壮。我只是想指出两者之间的区别,因为它是生态系统的两个分支。这么说公平吗?

是的。在这些领域,争论开始变得有点技术性。我会说,这两个方向都是可行的,当然,在我们制造出某种超级邪恶的精灵来摧毁世界之前,可能会有一些阶段,我们肯定希望更多地处于学习模式,而不是“啊,我得到了这个完全正确的模式”,这样我们就可以实际上看起来像,“好吧,什么样的系统是相当智能的,也许是危险的,但不一定是瞬间毁灭的?给了他们一套指令后,他们会做什么?有没有什么方法可以让他们接受扳动开关让他们停下来?诸如此类的事情。

Jeremie:
爽。好吧。因此,在奠定了这一基础之后,我认为这将会……嗯,对于熟悉人工智能对齐生态系统的人来说,这可能是旧闻,但对于从上一系列中加入我们的人来说,这可能是新东西,在上一系列中,我们正在做更多关于数据科学职业生涯的东西。我想做的一件事是,因为你和我已经谈了很多关于台面优化。我认为梅萨优化者这个概念非常有趣的一点是,它确实给了我们一个非常有趣的视角,关于人类是什么,生命是什么,宇宙到底是什么,我想探索一下,如果你不介意的话,就在这里发表一些我们的私人谈话。这是我想邀请你参加播客的部分原因。你不介意吗?

艾德:
是的,当然。

杰雷米:
好的,很好。所以我想也许我在试着想一个问题来开始我们的讨论,但也许我会提供一个框架,你可以从那里开始。因此,我们已经讨论了宇宙中的每一种生物都可以被视为台面优化者的观点。所以本质上正在发生的是宇宙有一大堆原子,它有一大堆光子,粒子各种不同的自由度,它在运行这个实验。

杰瑞米:
这是关于粒子随机重组的训练。所以你会看到粒子之间的相互作用,这种相互作用会随着时间的推移而持续,随着时间的推移,粒子的混杂会趋向于复杂系统的自我组装。无论宇宙的最终状态是什么样的,看起来我们都在朝着越来越复杂的方向发展,以至于人类不会把自己消灭掉,以至于我们实际上生存到了创造一个自我改进的人工智能系统的程度。

杰瑞米:
看起来我们真的是在朝着智能爆炸的方向前进,就像人们所说的那样。在这个框架中,我们在这里与我们周围的所有其他台面优化者竞争。因此,我们想要访问…就像你说的,你已经有了专门了解人类神经化学的台面优化器,这样就可以解决将你的大脑放在一个内啡肽大桶中的整体问题。人类,专注于解决在生存和繁衍中成为真正的好人的问题。也许我会把这个想法放在那里。

艾德:
这是一个很好的开始。我们和世界上所有其他动物和生物一样,我们都在一个进化我们的巨大优化器里,对吗?所以进化是一个大的过程,试图把我们推向遗传适应性。我们的进化方向是相对于人口数量有更多的孩子。增加你在下一代的基因表达。这是我们进化的方向。

埃德:
有趣的是,尤其是最近,人类似乎真的没有很好地遵循这个指令。如果我们真的遵循了那个指令,如果我们真的像这样,“好吧。我想要尽可能多的孩子,相比之下……”我们的行为会大不相同。例如,我们不会使用节育措施。我们可能不会使用避孕套。相对于生育率下降之类的事情,我们会有更多的孩子。

艾德:
所以这是出了问题的信号。在缓慢的优化压力和我们正在做和学习做的事情之间有一些不匹配的地方。我们被饥饿、性欲、恐惧、愤怒等欲望所驱使。所有这些都与我们的包容性基因适应性有很长一段时间的关联。这些都是非常复杂的适应。它们进化了数百万年。

埃德:
许多与我们无关的动物,可能会像动物一样感到恐惧,诸如此类。所以有些事情正在发生。在某种意义上,进化告诉我们该做什么,而我们自己的内在驱动告诉我们该做什么,两者之间的距离越来越大。我们的内驱力能够以进化的方式来满足这些内驱力,如果它是一个人,就会像这样,“嘿,哇。那是病态的。

艾德:
你们这些家伙在这里做错事了。你对你的饥饿做了太多的优化。你越来越胖,没有孩子。这是什么?你对你的性冲动做了太多的优化,用避孕套做爱,你没有孩子。

杰雷米:
从进化的角度来看,进化就像人类试图获得正确的代码和人工智能,这样它就不会偏离轨道,现在发生的是进化程序让你生一大堆孩子,然后你开始看色情片,而不是变得饥渴,与人做爱和生孩子,进化会说,“哇,哇,哇。我不是这个意思。你不能这样作弊。”

艾德:
这是关键。进化实际上并没有让我们生孩子,而是找到了一种更简单的方法。进化就像,“哦,如果我把这些小致动器放在我的东西上,有机体就会想出如何从那里生孩子。”问题是,当生物体变得非常非常聪明时,它会想出如何在不做进化想要它做的事情的情况下满足这些欲望。

杰雷米:
它基本上超越了最初的损失函数。所以你提到进化想要人类做的和人类最终实际做的之间越来越明显。我认为探索日光的来源是值得的,因为我的意思是,如果我错了,请纠正我,基于我们的谈话,我认为我们在这一点上是一致的,但我认为这归结于计算能力。最终,有机体能够运行比进化本身更多的计算。

Jeremie:
你基本上能够…你有足够的计算能力,自然选择不是改变你的主要因素。现在,改变你的主要是你自己的思维,你自己的认知能力。因此,在人的一生中,如果你像水牛或其他动物一样,你实际上可以改变自己,比进化所允许的要多得多。

艾德:
是啊。我认为这与内部和外部反馈信号的密集度和稀疏度有关。有多少个处理步骤-

你能详细说明一下吗?这里的密疏是什么意思?

所以进化给了你一个非常稀疏的健康信号。它发出一个健身信号,就像是,每 20 或 30 年发生一次。你有孩子吗?他们有孩子吗?每二三十年。你在生孩子之前就死了吗?这是一个非常聪明的信号。它不喜欢经常打你的脸,但当它打你的脸时,它会狠狠地打你。然而,你自己的内部过程,让你…在那 30 年的时间跨度里,你可能会,天啊,我甚至不知道可能,我不知道,你会饿,天知道一天三次,或者在 30 年里成千上万次。

杰瑞米:
你撞到了手肘,擦伤了膝盖。

是的。就这样,就这样。因此,在进化压力信号的脉冲之间,你有一定的自由度来适应你自己的大脑信号。所以它的工作方式是进化在你自己的信号排列方式上提供反馈压力。所以进化管理着你有多饿之间的平衡。你有多饥渴?你有多生气?你有多开心?所有这些事情。进化在几十年的时间尺度上做到了这一点。但是在你的大脑中,你对这些信号有一套安排,你在内部优化和处理的时间尺度比那要快几万到几百万倍。

艾德:
结果,你有空间以一种进化无法解释的方式超级关注那些信号。我们的处理能力现在太强了,无法被这些信号所控制。很快我们就有可能直接改变我们自己的 DNA,完全脱离我们自己。

艾德:
我们仍然是进化的奴隶,但是从进化的角度来看,这些畸形的病态奴隶不再是进化的直接奴隶,而是进化创造的笨拙的东西的奴隶。

杰雷米:
嗯,你从进化的角度来说很有趣,对吗?但是进化当然是进化产生的东西。我是说,从定义上来说,我们就是目标。所以对我来说,这正是…嗯,基本上,这是外部对齐问题,在这个宇宙中有一些东西正在被优化。这显然不是生物进化。这就是优化的目的。直到今天大约有 140 亿年的时间。但在过去的几十万年里,人类已经开始分离,随着我们的认知能力在进化想要我们做的事情和你所说的进化给我们反馈的时间线以及我们能够从环境中获得反馈的时间线之间创造了日光,人类开始分离。

杰雷米:
这绝不是过程的结束,对吗?这就是把我们带回人工智能讨论的原因。这里有一个额外的步骤,我们转移基底,不再在生物硬件上运行计算,而是在硅基底而不是细胞上运行计算。在这种情况下,你开始放松许多限制,这些限制使人类与机器相比慢得令人难以置信,我们可能会在更短的时间内完成同样的范式。

是的,没错。所以计算机的一个问题是,是的,它们现在快多了。就计算的连续深度而言,它们似乎比我们快得多。换句话说,我做这个,然后我做那个,然后我做那个。他们能一个接一个做的事情的数量,他们比我们快得多,就其切换基因和测试新生命形式的能力而言,他们比我们快得多。

埃德:
因此,你可以打个比方,“哦,我造了这个东西,它比我快多了。”我给它这些笨拙的,粗略定义的目标,这些目标一开始和我的目标有很好的关联,但后来它优化,优化,再优化。它变得越来越聪明。而且非常非常快,也许能够以一种我不知道的方式满足我给它的课程目标。我想,“哦,我的上帝。我不是这个意思。停下停下停下。但到那时,我们就不在乎了。进化可能对我们有同样的想法,但我们并不在乎。我们做我们想做的。

耶雷米:
是的。正如相对于人类生活的步伐,进化似乎停滞不前一样,相对于这种人工智能的进化步伐,人类生活似乎也停滞不前。我是说,不管是什么形式。所以我的意思是,我认为这是一个很大的支持你之前的论点,我们有一个机会来做好这件事。我想这也是我们开始关注这个领域,或者人工智能开始兴起的时间领域的一个担忧,越来越多的进展正在取得,越来越多的通用系统正在建立,像 GPT3 这样的东西,但不仅如此。我们很快就会得到越来越先进的系统。

Jeremie:
我们开始进入这个领域,在这里我们受到想要设计程序的最没有人工智能安全意识的公司的支配。我的意思是,这真的是人工智能政策的领域,你开始说,“好吧,你如何让博弈论在这里工作?”你如何防止一些愚蠢的公司决定说,“哦,我不是特别关心人工智能对齐。我不担心这个。”你如何阻止他们朝这个方向采取一些非常不负责任的行动?我知道这可能不是你的领域,但你对人工智能政策方面的博弈论有什么想法吗?

埃德:
嗯,是的。因此,从经济角度来看,有很多关于人工智能民主化的讨论,这很好。我认为这在某种程度上是好的。当你开始谈论这些非常,非常大,非常有能力的系统时,它们开始潜在地呈现危险,不仅仅是它们可能接管世界,而且危险在那之前很久就存在了。它们可能会被某些人滥用来发送大量精心制作的垃圾邮件或各种新奇的风险。

艾德:
所以,it 的经济学原理是,你越接近垄断,你的业务就有越多的利润。在这里,我谈论它就好像它是一个生意,因为这些模型是作为 API 和所有这些东西来销售的。

Jeremie:
我们说的利润越多,实际上就是利润越多。

艾德:
这也是我的部分意思。当我说保证金时,保证金可以变成利润。它完全可以盈利,到目前为止,它可以盈利,但也可以安全。可以去安全投资。所以当你是一个垄断者时,假设你收取 50%的利润。收入的 50%归你所有,你可以用它们做任何你想做的事情。是的,你可以把它们用在你的资产负债表上,比如,“哦,现在,我有更多的钱了。那太好了。”

Ed:
但你要做的另一件事是让他们保证你的系统安全,这需要越来越多的投资。拥有一个广泛竞争的环境,销售大量不同的型号,其中一个问题是,当他们相互竞争时,每家公司每种型号,他们竞争他们的利润。在资本主义,这通常被视为好事。这很好,因为这意味着消费者支付的费用减少了。

艾德:
如果一家公司很卑鄙或邪恶,我可以换另一家公司,这样对每个人都更便宜。在一个有潜在危险的系统的情况下,你想要的是一个垄断,把所有的利润预算都花在安全上,而不是有太多有限的利润,他们互相竞争,所以他们不能把钱花在安全上。这可能是一个有风险的安排。

耶雷米:
是的。我看到过关于什么的争论…这叫多极还是单极。基本上,有多少不同的极点,多少不同的公司或组织拥有活跃的人工智能成果或尖端的人工智能成果,以及这如何影响风险格局?我看到有人认为多极可能更可取。我个人倾向于你刚才讨论的方向。我知道我们已经谈了很多了。我认为另一个很有说服力…哦,对不起。你想加点什么吗?

Ed:
我只是想说,如果你有一个完全致力于安全的组织,资金充足,并且对所有其他公司正在建设的东西有很大的内部透明度,你也许可以实现多极化。这可能是一种可行的方法,但至少在目前的情况下,这似乎很难做到。

耶雷米:是的。我知道开放人工智能,将一项政策工作放在一起研究,基本上就像朝着一种更透明的方式发展组织内部的人工智能。这背后的博弈论很大一部分是信任。如果你是谷歌,你正朝着一个超级强大的 AGI 努力,这可能是危险的,脸书告诉你,他们也在努力,你们都向对方声称,你在安全方面投入了很多努力,以确保没有可怕的事情发生。

Jeremie:
你应该在多大程度上相信另一家公司正在发生这种情况,他们不会拿走所有的利润,让你更快地开发产品。

艾德:
这是一个很好的场景。这是两家文化上一致的公司,经常交换员工,基本上位于海湾地区的同一地带。他们在很多方面都是非常相似的公司,当你与来自不同国家的公司打交道时,信任情况会发生什么变化呢?这些公司说的不是同一种语言,从未交换过员工,拥有不同的政府结构和根本不同的价值体系。在这种情况下,建立信任变得非常不同,也更加困难。

耶雷米:
是的。我的意思是,也许最恰当的类比是,这取决于你怎么理解。因此,人们,尤其是那些主张多极的人一个常见的论点是集中在超级强大的系统和当今系统之间的更中观的领域,他们说,“看,人工智能有被部署到武器系统的风险。”现在,你有多极可能是好的,因为谁知道如果只有一个国家拥有核武器,而没有其他国家可以与它们相互摧毁,从而确保没有人会发射核武器,冷战会如何展开。也许类似的事情也会发生在 AI 身上。我认为有令人信服的理由说明为什么情况并非如此,或者至少我过去是这样认为的。但是,对不起。

埃德:
我认为这基本上是资本主义关于竞争的论点,在我们到目前为止所看到的所有情况下,竞争是一件好事。许多不同的组织拥有相似的技术,这是件好事。他们互相竞争,互相制约,等等。这可能会继续适用于人工智能,直到一定的能力水平,但我怀疑会有一个能力水平,超过这个水平,安全投资变得比能力投资更重要。在这一点上,你基本上需要很大的余量来保证安全。所以某种等同或同构于垄断的安排。

耶雷米:是的。我的意思是,当然我们看到桌面生物武器或生物工程设计病原体将很快成为现实。核武器也是一样,对吗?我的意思是你到了一个点,好吧,是时候停止公开发布结果了。我认为开放人工智能本身是他们的功劳,至少从我的角度来看是这样……他们为此打了很多旗号。他们站出来说,“看,随着我们开始接近越来越大的能力,我们将不得不开始把我们的一些工作放在内部,而不是广泛地发布。”

Jeremie:
他们已经越来越谨慎了,我们从 GPT2 那里听说,这是他们朝着那个方向迈出的第一步。现在 GPT3 完全是内部的。没有一个是公共领域。它不仅仅是一个开源模型。无论如何,观察这个领域如何演变和发展将会很有趣。显然,这个领域的任何决策都有很多争议。我认为,考虑到利害关系,关键的事情之一是真正瞄准那些你我都看到的非常好的政策,因为我们已经与从政策制定者到人工智能比对研究人员的每个人进行了接触。

杰瑞米:
如果你在这个领域不小心,很容易做出弊大于利的举动。所以我想我想做的是以对正在听的人的呼吁来结束这次谈话。如果你对人工智能排列、人工智能安全之类的东西感兴趣。如果你觉得我们在这里讨论的风险很有吸引力,很有意思,那就去看看我们在视频描述中提供的博客文章的一些链接,因为有很多组织你可能想去看看你有什么选择,你可以在哪里做出贡献,但是从什么是好的角度来看事情, 在意想不到的变化下,什么可能真的弊大于利,因为当你谈论尖端技术时,事情可能会以令人惊讶的方式出错。 无论如何,我想说的是,因为我们自己也遇到了一些这样的问题。

艾德:
对。我认为这很有道理。这是第一种无害的东西。这是一个希波克拉底誓言,我想在更大的范围内,但我认为这是第一个努力的方向,就像是,“我们如何才能避免不良后果的发生,并让每个人都保持良好的状态?”

耶雷米:
太棒了。好吧。艾德,我真的很感激。我想我们要做的是,在所有这些东西的描述中,我也会链接你自己的个人网站。有什么想分享的吗?我想你介意分享你的推特吗,这样人们就可以关注你了?

艾德:当然,没错。我是@neutronsNeurons 或者神经元中子。我真的忘了。抱歉伙计。

我想…哦,糟了。我们会,链接到它。

中子神经元。我是@neutronsNeurons。所以你可以打电话给我,然后在那里关注我。

太棒了。好吧。非常感谢,艾德。我真的很感激。很棒的谈话。

谢谢你邀请我。

杰瑞米:
我的荣幸。我们会让它离线。干杯。

艾德:
干杯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值