评估分类模型
当您有分类数据时,您可以建立几个模型来根据给定的数据预测新的观察值。您可以构建逻辑回归、决策树、随机森林、助推模型等等。你如何比较它们,如何确定哪种型号是最好的?
混淆矩阵
假设我们有一个二元分类数据集,我们的目标是预测某事是真还是假。我们建立了几个模型,现在我们需要一种方法来组织我们的结果。一种方法是通过使用混淆矩阵。我们的模型预测数据为真或为假。我们可以按照下面的指南将数据组织成一个混乱矩阵:
The confusion matrix with an explanation of each category of results.
我们的模型既可以在一个观察值实际为真时预测它为真( TP ),在它实际为真时预测它为假( FN ),在它实际为假时预测它为假( TN ),在它实际为假时预测它为真( FP )。混淆矩阵将有和目标变量的类别一样多的列和行,因此它将总是一个正方形。我们可以组织我们的结果,并通过挑选具有最高真实预测的模型来确定哪个模型是最好的?
精确度、召回率、准确度和 F1 分数
不同的情况需要不同的评估指标。例如,为垃圾邮件过滤器和医学测试建立的分类模型需要进行不同的判断。如果垃圾邮件过滤器将一封重要的电子邮件标记为垃圾邮件(假阳性),比将一封垃圾邮件标记为非垃圾邮件(假阴性)要麻烦得多。根据预测的假阳性有多少来判断模型的标准被称为精度。如果医学测试告诉患病的患者他们是健康的(假阴性),这将比当他们实际上是健康的(假阳性)时告诉患者他们可能生病更成问题,因为测试的管理者可以建议进一步的测试来验证患者的健康。当你实际上并不健康的时候,寻求进一步的测试比走来走去认为你是健康的要好。根据预测到的假阴性的数量来判断模型的标准被称为召回。
也可以使用其他指标。准确性通过做出多少个正确的预测来判断模型。F1 分数是精确度和召回率的调和平均值。您必须决定哪个指标最适合您的情况。
The equations of some binary categorical model evaluation metrics.
结论
以上指标用于评估二元分类模型。当添加多个类别时,我们必须调整我们的评估指标。Python 的 Scikit-Learn 库有方法来可视化混淆矩阵和评估模型。您必须决定哪个评估指标最适合您的项目。
评价分类模型 II:敏感性和特异性
上周我讨论了二元分类模型的评估指标。这些二元模型的预测可以分为四组:真阳性、假阳性、假阴性和只考虑一类的真阴性。
The confusion matrix for a binary classification model
当添加其他类别时,预测可能会落入其他组。有多少个类别,就有多少种方法来计算每个评估指标。下面我将介绍这些类型的多分类模型的评估指标。
The confusion matrix for a multi-categorical classification model
定义灵敏度和特异性
二元分类模型可以用精确度、召回率、准确度和 F1 度量来评估。我们不必指定指标适用于哪个组,因为模型只有两个选项可供选择;观察值要么属于该类,要么不属于该类,模型可能是正确的,也可能是不正确的,因此有混淆矩阵的四个部分。当模型有多个类别作为预测选项时,我们必须计算适用于每个类别的指标。
敏感度是评估模型预测每个可用类别的真阳性的能力的指标。特异性是评估模型预测每个可用类别的真实否定的能力的指标。这些指标适用于任何分类模型。计算这些指标的公式如下。
The equations for calculating sensitivity and specificity
你可能已经注意到回忆的方程式看起来和敏感度的方程式一模一样。何时使用任一术语取决于手头的任务。
计算灵敏度和特异性
上面的多分类模型可以预测每个观察值的类别 A、B 或 C。当有两个以上可能的预测选项时,必须为每个可能的类别计算这些度量。灵敏度的计算如下:
Sensitivity calculations for multi-categorical classification models
特异性决定了模型预测观察值是否不属于特定类别的能力。当观察实际上属于除了正在考虑的类别之外的每一个其他类别时,它需要模型性能的知识。特异性的计算如下:
Specificity calculations for multi-categorical classification models. The color shade of the text on the right hand side is lighter for visibility.
摘要
多类别分类模型可以通过每个可能类别的敏感性和特异性来评估。一个模型对预测一个类别很有效,但对其他类别可能很糟糕。这些评估指标允许我们为不同的目的分析模型。您必须决定哪个评估指标最适合您的项目。
评估 Python 中的机器学习分类问题:重要的 6+1 度量
评估您的 ML 分类项目性能的指南
Photo by Franck V. on Unsplash
机器学习分类和评估模型可能是一项艰巨的任务。本文将试图通过解释“混淆矩阵”、评估指标以及二元分类问题的 ROC AUC 来消除这种“混淆”。对于每个部分,还提供了一个示例 Python 代码,以帮助读者理解 Python 中的机器学习二进制分类和评估。
分类 vs 回归
数据科学家通常利用机器学习(ML)工具和库来开发代码,这些代码在不使用显式指令的情况下有效地执行特定任务,而是依靠模式和推理来预测连续变量或变量的类别/类别。一般来说,我们可以把这些 ML 问题分为三类:
回归:这些问题涉及到预测一个连续变量,比如温度、价格、年龄等。例如:
- “根据房子的特点,它的售价是多少?”
- “客户将在这个网站上订购多少产品?”
**二元分类:**这些问题通常涉及需要是/否或 1/0 结果的问题。例如:
- “这是欺诈交易吗?”
- “这个客户会订购这个产品吗?”
**多类分类:**这些类似于二元分类,但是在这种情况下,问题涉及在两个以上的类别之间进行选择。例如:
- “这是什么样的交易?借方、贷方等。”
- “这位顾客对哪类产品感兴趣?”
评估二元分类问题
通常,在回归和分类模型中,数据集被分为训练数据集和测试数据集。然后,该模型在“训练数据集”上进行训练和拟合,并用于基于“测试数据集”进行预测,以 评估 性能。这种训练/测试分割的原因是为了模拟未来的数据集,也是为了避免模型过度适应训练数据集。这种方法的好处是测试数据集中目标的实际值是已知的,这对于评估模型是至关重要的。 但是这个测评是怎么做的呢?
对于二元分类问题,可以计算多种度量来评估预测模型的性能。这些指标是基于所谓的“混淆矩阵”计算出来的。
混乱矩阵
《关于混淆矩阵的理论》把矩阵描述为:
混淆矩阵包含关于由分类系统完成的实际和预测分类的信息。通常使用矩阵中的数据来评估这种系统的性能。
下面给出的这个矩阵是所有二进制分类问题的基础,并且广泛用于机器学习模型中。表中的缩略语也有描述。
正 在这种情况下就是 的类息 。例如,“识别欺诈交易”。
真阳性(TP): 当模型预测为阳性,并且它们实际上为阳性时(例如,欺诈交易被识别为欺诈)。
真阴性(TN) :模型预测为阴性,实际为阴性(例如,非欺诈交易被识别为非欺诈)。
**假阳性(FP)(也称为 I 型错误)😗*当模型预测为阳性,但实际上却为阴性时(例如,非欺诈性交易被识别为欺诈性交易)。
**假阴性(FN)(也称为第二类错误)😗*当模型预测为阴性,但它们为阳性时(例如,欺诈性交易被识别为非欺诈性交易)。
通常,第二类错误(FN)具有更严重的后果,而在 ML 中,目标是最小化第二类错误。另一方面,第一类错误的后果较小。然而,在理想情况下,一个完美的模型应该没有这些错误。
让我们用 Python 写一个函数来创建混淆矩阵。 Scikit Learn (SKLearn)库有一个 [metrics](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html)
包,其中包含了 [confusion_matrix](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html)
方法。
# Importing the metrics package from sklearn library
from sklearn import metrics# Creating the confusion matrix
cm = metrics.confusion_matrix(y_test, y_pred)# Assigning columns names
cm_df = pd.DataFrame(cm,
columns = ['Predicted Negative', 'Predicted Positive'],
index = ['Actual Negative', 'Actual Positive'])# Showing the confusion matrix
cm_df
重要的六项指标
在统计书籍中有许多评估混淆矩阵的度量,但其中六个在 ML 问题中使用得更广泛。
准确度是正确预测占预测总数的比例。
准确率= (TP + TN) /所有预测
误分类为(1-准确性),指预测总数中的所有错误预测。
灵敏度(又名回忆) 表示“在所有实际阳性中,我们预测为阳性的有多少”,可以解释为:
灵敏度(回忆)= TP / (FN + TP)
特异性(又名选择性或真阴性率,TNR) 表示“在所有实际阴性中,我们预测多少为阴性”,可以写成:
特异性= TN / (TN + FP)
精度(又名阳性预测值,PPV) 表示“在所有预测的阳性病例中,有多少实际上是阳性的”,或
精度= TP / (TP + FP)
F1 得分是精确度和灵敏度的调和或加权平均值,是分类问题精确度的一种广泛使用的测量方法。其计算方法如下:
F1 得分= 2 (精度灵敏度)/(精度+灵敏度)
Python 中的这个函数将计算并报告混淆矩阵的这六个指标。
# Creating a function to report confusion metricsdef confusion_metrics (conf_matrix):# save confusion matrix and slice into four pieces TP = conf_matrix[1][1]
TN = conf_matrix[0][0]
FP = conf_matrix[0][1]
FN = conf_matrix[1][0] print('True Positives:', TP)
print('True Negatives:', TN)
print('False Positives:', FP)
print('False Negatives:', FN)
# calculate accuracy
conf_accuracy = (float (TP+TN) / float(TP + TN + FP + FN))
# calculate mis-classification
conf_misclassification = 1- conf_accuracy
# calculate the sensitivity
conf_sensitivity = (TP / float(TP + FN)) # calculate the specificity
conf_specificity = (TN / float(TN + FP))
# calculate precision
conf_precision = (TN / float(TN + FP)) # calculate f_1 score
conf_f1 = 2 * ((conf_precision * conf_sensitivity) / (conf_precision + conf_sensitivity)) print('-'*50)
print(f'Accuracy: {round(conf_accuracy,2)}')
print(f'Mis-Classification: {round(conf_misclassification,2)}')
print(f'Sensitivity: {round(conf_sensitivity,2)}')
print(f'Specificity: {round(conf_specificity,2)}')
print(f'Precision: {round(conf_precision,2)}')
print(f'f_1 Score: {round(conf_f1,2)}')
加一指标:ROC AUC[或受试者工作特征曲线下面积(ROC)]
据维基百科:
受试者操作特征曲线,或 ROC 曲线,是一种图示,说明了二元分类器系统在其辨别阈值变化时的诊断能力。ROC 曲线是通过在各种阈值设置下绘制真阳性率(TPR)对假阳性率(FPR)来创建的。在机器学习中,真阳性率也称为灵敏度、召回率或检测概率[4]。
我们可以利用 ROC 曲线来可视化阳性和阴性类别之间的重叠。为此,我们可以遵循以下步骤:
1)将分类阈值设置为 0,这意味着所有预测都被分类为第 1 类(阳性)。
2)计算该阈值的灵敏度和 1-特异性。
3)绘制数值(x = 1-特异性,y =敏感性)。
4)提高小数字的分类阈值(如 0.005)。
5)重复步骤 1–4。
6)重复直到阈值等于 1(这意味着所有预测都是 0 类,负的)。
这个过程的结果看起来会像这个图表。曲线下面积(AUC)是我们可以用于分类模型的另一个评估指标。45 度线是 AUC 为 0.5 的基线。完美模型的 AUC 为 1.0。AUC 越接近 1.0,预测越好。
ROC Curve (from https://www.medcalc.org/manual/roc-curves.php)
让我们用 python 构建一个 ROC AUC,使用Logistic Regression
模型。
# The codes below is partly copied from the code written by Matt Brem, Global Instructor at General Assembly.# Importsimport matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression# Train/test split
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 42)# Instantiating a logisitic regression model
logreg = LogisiticRegression()
logreg.fit(X_train, y_train) # model fitting
y_pred = logreg.predict(X_test) # Predictions# Calculating class probabilities
pred_proba = [i[1] for i in logreg.predict_proba(X_test)]pred_df = pd.DataFrame({'true_values': y_test,
'pred_probs':pred_proba})# The codes below is motly copied from the code written by Matt Brem, Global Instructor at General Assembly.# Create figure.
plt.figure(figsize = (10,7))# Create threshold values.
thresholds = np.linspace(0, 1, 200)# Define function to calculate sensitivity. (True positive rate.)
def TPR(df, true_col, pred_prob_col, threshold):
true_positive = df[(df[true_col] == 1) & (df[pred_prob_col] >= threshold)].shape[0]
false_negative = df[(df[true_col] == 1) & (df[pred_prob_col] < threshold)].shape[0]
return true_positive / (true_positive + false_negative)
# Define function to calculate 1 - specificity. (False positive rate.)
def FPR(df, true_col, pred_prob_col, threshold):
true_negative = df[(df[true_col] == 0) & (df[pred_prob_col] <= threshold)].shape[0]
false_positive = df[(df[true_col] == 0) & (df[pred_prob_col] > threshold)].shape[0]
return 1 - (true_negative / (true_negative + false_positive))
# Calculate sensitivity & 1-specificity for each threshold between 0 and 1.
tpr_values = [TPR(pred_df, 'true_values', 'pred_probs', prob) for prob in thresholds]
fpr_values = [FPR(pred_df, 'true_values', 'pred_probs', prob) for prob in thresholds]# Plot ROC curve.
plt.plot(fpr_values, # False Positive Rate on X-axis
tpr_values, # True Positive Rate on Y-axis
label='ROC Curve')# Plot baseline. (Perfect overlap between the two populations.)
plt.plot(np.linspace(0, 1, 200),
np.linspace(0, 1, 200),
label='baseline',
linestyle='--')# Label axes.
plt.title(f"ROC Curve with AUC = {round(metrics.roc_auc_score(pred_df['true_values'], pred_df['pred_probs']),3)}", fontsize=22)
plt.ylabel('Sensitivity', fontsize=18)
plt.xlabel('1 - Specificity', fontsize=18)# Create legend.
plt.legend(fontsize=16);
Sample Output of the Above Code
多类分类的混淆矩阵
评估多类分类问题与评估二元问题没有什么不同,但是在这种情况下,将为每个类单独计算上面讨论的度量。在具有N
类的分类模型中,混淆矩阵将是NxN
,左轴显示实际的类(如测试集中已知的),顶轴显示预测的类。矩阵的每个元素𝑖,𝑗将是被分类为预测类别𝑗.中的具有实际类别𝑖的项目的数量
与二元分类问题的过程不同,您不需要选择分数阈值来进行预测。预测答案是具有最高预测分数的类别(即标签)。在某些情况下,您可能希望仅在预测的答案得分较高时才使用它。在这种情况下,您可以选择预测分数的阈值,根据该阈值您是否接受预测答案。
Multi-Class Confusion Matrix (from Amazon AWS website https://docs.aws.amazon.com/machine-learning/latest/dg/multiclass-classification.html)
亚马逊 AWS 文档中也提到:
多分类中使用的典型度量与二分类情况中使用的度量相同。在将所有其他类分组为属于第二类之后,通过将每个类视为二元分类问题来计算每个类的度量。然后,对所有类别的二进制度量进行平均,以获得宏平均(平等对待每个类别)或加权平均(按类别频率加权)度量。
将所有这些整合在一起…
正如本文中所解释的,有许多度量标准可以用来评估分类模型的性能。本文介绍了二进制分类模型、评估此类模型的指标,并提供了一组 python 代码片段来帮助读者进行此类评估。
还讨论了多类分类并与二元分类进行了比较。
尼克·米奈博士*(*LinkedIn 简介 )是一位资深顾问和富有远见的数据科学家,代表了领导技能、世界级数据科学专业知识、商业敏锐度和领导组织变革能力的独特组合。他的使命是推进人工智能(AI)和机器学习在行业中的实践。
评估机器学习模型的公平性和偏见。
引入一些工具来轻松评估和审核机器学习模型的公平性和偏见
评估机器学习模型的偏差正成为不同行业和数据研究人员越来越普遍的关注点。模型公平性是机器学习中一个相对较新的子领域。在过去,对歧视的研究是从分析人类驱动的决策和这些决策背后的基本原理中产生的。由于我们开始依赖预测性 ML 模型为保险和银行等不同行业做出决策,我们需要实施策略来确保这些模型的公平性,并在预测过程中检测任何歧视行为。
随着 ML 模型变得越来越复杂,解释它们变得越来越困难。预测模型通常是一个黑盒函数,它接受某个输入( x )并输出一个预测( y )。假设一家保险公司希望使用一个预测模型来衡量接纳客户的风险。输入( x )可以包括特征或属性,例如种族、年龄、性别、民族、教育水平和收入。他们还可以根据模型预测来决定是否应该要求一个人支付更高的保费,这些预测研究了我刚才提到的相同属性。在美国的银行和金融行业,这可能会有一些法律影响,因为它不批准正确申请人的信贷请求,违反了平等信贷机会法案(公平贷款)。
随着预测模型的使用迅速增长,并被部署为做出获取某些服务(如银行贷款、信誉或就业)的明智决策,现在重要的是审计和解释这些模型的输出决策,并在早期阶段进行公平设计。在本文中,我将讨论 5 种工具,它们可以用来探索和审计预测模型的公平性。
1- FairML:
Source: https://github.com/adebayoj/fairml
FairML 是一个用 python 编写的工具箱,用于审计机器学习模型的公平性和偏见性。这是一种量化模型输入重要性的简单方法。它使用四种输入排序算法来量化模型对模型输入的相对预测依赖性。
关于安装和演示代码,可以参考库的主 Github repo。
在 GitHub 上创建一个帐户,为 adebayoj/fairml 的发展做出贡献。
github.com](https://github.com/adebayoj/fairml)
2-石灰
Lime 是一个开源项目,旨在解释和说明机器学习模型是如何工作的。Lime 的伟大之处在于它支持的机器学习或深度学习模型的广泛范围。我可以解释文本分类,多类分类,图像分类和回归模型。
这里有一个使用 Lime 来理解和探索做出预测性决策的决策标准的快速演示。在这个例子中,我训练了一个使用 20 个类别新闻组数据集的文本分类器。以下文本被归类为 comp.windows.x 类别。
现在,让我们用 Lime 来探究这篇课文中哪些特定的词最有分量来得出这个决定。
如你所见,客户端,应用程序这几个词最有分量。我们来做个小实验。我将从上面的文本中删除这两个单词,并放置另一个单词,然后再次尝试预测。
你可以看到单词空格引入了偏见并完全改变了预测,尽管文本的上下文仍然相同。
要了解代码是如何工作的,可以参考代码库和下面链接中的示例代码:
Lime:解释任何机器学习分类器的预测— marcotcr/lime
github.com](https://github.com/marcotcr/lime)
3- IBM AI 公平 360
AI Fairness 360 是一个开源库,它使用一系列偏差缓解算法来检测和缓解机器学习模型中的偏差。这个库非常全面,充满了评估偏倚的指标。
他们创造了一种互动的体验,在这种体验中你可以看到衡量标准并测试能力。
他们还创建了 G 指南材料,可以指导哪些度量标准可以用于哪些用例。
数据集和机器学习模型的一套全面的公平指标,对这些指标的解释,以及…
github.com](https://github.com/IBM/AIF360)
该库依赖于一系列偏差缓解算法,例如:
- 优化预处理( Calmon et al .,2017 ): 它提出了一种学习数据变换的优化,具有三个目标:控制区分度、限制单个数据样本中的失真、保持效用。
- 异类冲击清除器( 费尔德曼等人,2015 )
- 均衡赔率后处理( 哈特等人,2016 )
还有很多。
4- SHAP
SHAP 可以通过将博弈论与局部解释联系起来,解释任何机器学习模型的输出。它使用一些漂亮的 JS 可视化来解释模型。
有关其工作原理的详细解释和指导,请参考下面的链接
解释任何机器学习模型输出的统一方法。-slund Berg/shap
github.com](https://github.com/slundberg/shap)
5-谷歌假设工具
Smile Detection Example
Google What-If Tool (WIF)是一个 tensorboard 插件,用于理解黑盒分类或回归 ML 模型。它有多个演示,互动体验和全面的文件。
TensorFlow 的可视化工具包。通过在 GitHub 上创建帐户,为 tensorflow/tensorboard 的发展做出贡献。
github.com](https://github.com/tensorflow/tensorboard/tree/master/tensorboard/plugins/interactive_inference)
总之,ML 模型中的任何偏差都是由于注释数据的人员中存在的某种偏差,或者是由于偏斜或缺少特征或任何其他需要挑选和调查的原因而存在于数据本身中。未能捕捉这些特征并概括数据来训练模型会导致模型偏差。有偏见的机器学习模型可能会导致做出不公平/有偏见的决策,从而影响最终用户。因此,所有利益相关者都应该集中精力检测他们开发的模型中是否存在偏见,这一点非常重要。
评估推荐系统:均方根误差还是平均绝对误差?
推荐系统的准确性通常通过两个主要指标来评估:均方根误差(RMSE)和平均绝对误差(MAE)。两者都很好,因为它们允许容易的解释:它们都与原始评级的规模相同。然而,根据数据集的上下文,使用其中一个可能更好。我们来探究一下原因。
成本和收益:
Source: the Surprise Library Docs, where R is the predicted Ratings Matrix.
平均误差(MAE)的一个大的特征是在误差项中不会对极值产生任何偏差。如果有异常值或较大的误差项,它会将这些与其他预测进行同等加权。因此,当您不真正关注异常值的重要性时,在关注评级准确性时,MAE 应该是首选。要获得推荐系统的整体视图或表示,请使用 MAE。
Source: the Surprise Library Docs, where R is the predicted Ratings Matrix.
均方根误差的一个趋势是,当残差(误差项)被平方时,它倾向于不成比例地惩罚大误差。这意味着 RMSE 更容易受到异常值或糟糕预测的影响。
根据定义,RMSE 永远不会像梅一样小。然而,如果误差项遵循正态分布,T. Chai 和 R. R. Draxler 在的这篇论文中表明,在给定足够数据的情况下,使用 RSME 允许误差集的重构。另一方面,MAE 只能准确地重建 0.8 的数据集。此外,RSME 不使用绝对值,这在计算距离、梯度或其他度量时更方便。这就是为什么机器学习中的大多数成本函数都避免使用 MAE,而是使用误差平方和或均方根误差。
长尾的重要性:
Source: Recommender Systems: The Textbook by Charu Aggarwal
推荐系统的数据集通常只有很少的项目包含最多的评价,而大多数项目只有很少的评价。这影响了准确度测量,因为对流行项目的准确度预测通常不同于对稀疏评级项目的准确度预测。这个问题的一个解决方案是,在计算 RSME 或 MAE 时,给每个商品一个特定的权重,这是由商家决定的。这些可以允许推荐系统如何评估所有项目的更准确的表示。
来源及延伸阅读:
大量信息来源于 Chai 和 Drexler 的这篇论文,https://www . geosci-model-dev . net/7/1247/2014/gmd-7-1247-2014 . pdf
以及 Charu Aggarwal 的《推荐系统:教科书》第七章的讨论。
评估 NLP: BLEU 中的文本输出风险自担
刚进入 NLP 的人经常问我一个问题,当系统的输出是文本,而不是输入文本的某种分类时,如何评估系统。这种类型的问题,你把一些文本放入你的模型,并从中获得一些其他文本,被称为序列到序列或字符串转换问题。
这些问题真的很有趣!序列到序列建模的一般任务是 NLP 中一些最困难任务的核心,包括:
- 文本摘要
- 文本简化
- 问题回答
- 聊天机器人
- 机器翻译
这种技术完全出自科幻小说。有了如此广泛的令人兴奋的应用,很容易理解为什么序列到序列建模比以往任何时候都更受欢迎。真正不容易的是评估这些系统。
不幸的是,对于那些刚刚起步的人来说,对于应该使用什么样的指标来评估你的模型,没有简单的答案。更糟糕的是,评估序列到序列任务的最流行的度量标准之一 BLEU 有重大缺陷,特别是当应用于它从未打算评估的任务时。
幸运的是你,你已经找到了这篇有深度的博文!在这篇文章中,我将介绍这个流行的度量标准是如何工作的(别担心,我会尽量减少方程)。我们将看看 BLEU 的一些问题,最后,你如何在你自己的工作中最小化这些问题。
Orange painted blue on a blue background. (There, uh, aren’t a lot of eye-catching photos for NLP evaluation metrics as it turns out.)
一个非常困难的问题
BLEU 最初是为了测量机器翻译而开发的,所以让我们来看一个翻译示例。下面是语言 A(又名“法语”)中的一段文本:
你好,曼杰特罗伊斯·费尔伯特。
这里有一些 B 语言(又名“英语”)的参考译文。(注意,一些说英语的人称榛子为“filberts”,所以这两个都是非常好的翻译。)
我已经吃了三颗榛子了。
我吃了三块榛子。
这里的是一个生成的“神经”翻译。(在这种情况下,“神经”是“雷切尔用她的大脑想出了一个可能的翻译”,但假装这是由你正在训练的网络生成的。)
我吃了三颗榛子。
现在,这里有一个非常困难的问题: 我如何给这个翻译分配一个单一的数字分数,告诉我们仅使用提供的参考句子和神经输出,它有多“好”?
**为什么需要单个数值分数?**很棒的问题!如果我们想使用机器学习来建立一个机器翻译系统,我们需要一个单一的实数分数放入我们的损失函数。如果我们还知道潜在的最佳得分,我们就可以计算两者之间的距离。这使我们能够在系统训练时向系统提供反馈,即潜在的变化是否会通过使分数更接近理想分数来改善翻译,并通过查看相同任务的分数来比较经过训练的系统。
您可以做的一件事是查看输出句子中的每个单词,如果它出现在任何参考句子中,则给它打分 1,如果没有出现,则给 0。然后,为了标准化该计数,使其始终介于 0 和 1 之间,您可以将某个参考译文中出现的单词数除以输出句子中的总单词数。这给了我们一个叫做的度量单位精度。
所以,对于我们的例子,“我吃了三个榛子”,我们在至少一个参考句子中看到输出句子中的所有单词。除以输出中的单词数,4,您最终得到这个翻译的得分为 1。到目前为止一切顺利!但是这句话呢?
三三三三。
使用同样的标准,我们也会得出 1 分。这并不好:我们需要某种方式来告诉我们正在训练的系统,像第一个这样的句子比第二个这样的句子更好。
你可以根据每个单词在任何参考句子中出现的最高次数,通过限制次数来调整分数。使用这种方法,我们的第一句仍然会得到 1 分,而我们的第二句只会得到 0.25 分。
这让我们摆脱了“三三三三”的问题,但对于像这样的句子没有帮助,因为某种原因,单词是按字母顺序排列的:
我吃了三颗榛子
用我们现在的方法,这句话得 1 分,最高分!我们可以通过计数来解决这个问题,不是单个单词,而是相邻出现的单词。这些被称为 n-grams ,其中 n 是每组的字数。单字、双字、三字和四字分别由一个、两个、三个和四个单词组成。
对于这个例子,让我们使用二元模型。一般来说,BLEU 分数是基于一元、二元、三元和四元精度的平均值,但为了简单起见,我们在这里只坚持二元。同样为了简单起见,我们不会添加一个“单词”来告诉我们在句子的开头和结尾有一个句子边界。根据这些原则,单词按字母顺序排序示例中的二元模型是:
[吃了榛子]
[榛子一号]
[我三]
如果我们用同样的方法计算单词,我们现在得到的分数是 0;最差的分数。我们的“三三三三”示例也得到 0 分,而不是现在的 0.25 分,而第一个示例“我吃了三颗榛子”的得分是 1 分。不幸的是,这个例子也是如此:
我吃过了。
解决这个问题的一个方法是将我们目前的分数乘以一个惩罚比我们的参考译文短的句子的标准。我们可以通过比较它和长度最接近的参考句子的长度来做到这一点。这就是简短的代价。
如果我们的输出和任何参考句子一样长或者更长,惩罚是 1。因为我们用它乘以我们的分数,这不会改变最终的输出。
另一方面,如果我们的输出比任何参考句子都短,我们用最接近的句子的长度除以我们的输出长度,从中减去 1,然后将 e 提高到整个句子的幂。基本上,最短的参考句子越长,我们的输出越短,简短惩罚就越接近于零。
在我们的“我吃了”例子中,输出句子是两个单词长,最接近的参考句子是四个单词。这给了我们 0.36 的简洁性损失,当乘以我们的双字母精度分数 1 时,我们的最终分数下降到只有 0.36。
这种方法着眼于输出和参考翻译之间的 n-grams 重叠,对较短的输出进行惩罚,被称为 BLEU (“双语评估替角”的缩写,人们实际上只在解释缩写词时才会说),由 IBM 的 Kishore Papineni、Salim Roukos、Todd Ward 和 Wei-朱婧于 2002 年开发。这是 NLP 中一个非常流行的度量,特别是对于系统输出是文本字符串而不是分类的任务。这包括机器翻译和越来越多的自然语言生成。这是我在这篇文章开始时提出的一个非常困难的问题的解决方案:开发一种方法,给一个翻译分配一个单一的数字分数,告诉我们它有多“好”。
它也有很大的缺陷。
布鲁的问题
此时,您可能会疑惑,“ Rachael,如果这个指标有这么大的缺陷,您为什么要向我们介绍如何计算它呢?“主要是给你看这个指标有多合理。这是相当直观的,其基本思想是,你可以通过与参考翻译进行比较来评估机器翻译系统的输出,这在 NLP 中具有极大的影响力(尽管并非没有批评者)。
BLEU 也当然有一些长处。在 NLP 工作的人们最关心的是它对研究人员来说有多方便。
- 计算起来既快又容易,尤其是与让人工翻译来评估模型输出相比。
- 它无处不在。这使得将您的模型与相同任务的基准进行比较变得容易。
不幸的是,这种便利性导致人们过度使用它,即使对于它不是度量标准的最佳选择的任务。
尽管我只举了一个句子的例子,BLEU 一直被认为是一个语料库级别的测量方法。获取语料库中每个句子的 BLEU 分数,然后对它们进行平均,这将人为地抬高你的分数,如果你试图在你做的地方发表作品,你肯定会被评论者批评。
即使它没有被过度应用,在你选择花费时间和计算追求更好的 BLEU 分数之前,你应该知道这个指标有严重的限制。虽然有很多关于 BLEU 缺点的讨论,但我认为最重要的四个问题是:
- 它不考虑意义
- 它不直接考虑句子结构
- 它不能很好地处理形态丰富的语言
- 它不太符合人类的判断
让我们逐一讨论这些问题,这样我可以向您展示为什么我认为这些是问题。
BLEU 不考虑意义
对我来说,这是不仅仅依靠 BLEU 来评估机器翻译(MT)系统的最有说服力的理由。作为机器翻译的人类用户,我的主要目标是准确理解原文中文本的潜在含义。我很乐意接受输出句子中的一些句法或语法怪异,只要它符合原文的意思。
BLEU 不衡量意义。它只奖励在参考系统中有精确匹配的 n 元文法的系统。这意味着一个虚词(如“an”或“on”)的差异与一个更重要的实词的差异一样严重。这也意味着一个翻译有一个完全有效的同义词,只是没有出现在参考翻译中,这将受到惩罚。
让我们看一个例子,这样你就能明白为什么这是一个问题。
原文(法语): J’ai mangé la pomme。
参考译文:我吃了苹果。
基于 BLEU,这些都是“同样糟糕”的输出句子。
我吃掉了苹果。
我吃了一个苹果。
我吃了土豆。
作为一个机器翻译系统的最终用户,我实际上对前两句没什么意见。尽管它们与参考译文不完全相同,但它们表达了意思。然而,第三句完全不能接受;它完全改变了原来的意思。
基于 BLEU 的指标之一, NIST ,通过对不匹配的 n-grams 进行加权来解决这个问题。因此,在更常见的 n-gram(如“of of”)上的错配将受到更低的惩罚,而在更罕见的 n-gram 上的错配(如“水牛”)将受到更高的惩罚。但是,虽然这解决了给予虚词太多权重的问题,但它实际上使惩罚同义词的问题(如“ambled”代表“walked”)变得更糟,因为这些同义词只出现在更罕见的 r-gram 中,因此被赋予更高的惩罚。
BLEU 不考虑句子结构
也许你不相信“即使你弄乱了几个关键词,完全改变了句子的意思,你仍然可以得到很好的 BLEU 分数”这句话。也许一些语法会说服你?
句法是对句子结构的研究。这是一个研究领域,它允许我们正式地模仿像“我用望远镜看到了狗”这样的句子,这可能意味着要么我在用望远镜看狗,要么狗拿着望远镜。这两种意思之间的差异只能通过模拟句子中的单词可以彼此具有不同关系的事实来捕捉。
我不是世界上最伟大的句法学家(差得远),但即使是我也知道自然语言中有很多重要的内部句法结构,如果你随机打乱一个句子中单词的顺序,你要么得到 1)无意义的单词,要么得到 2)意义非常不同的东西。
幸运的是,在开发系统以自动建模该结构方面已经做了大量的工作,这被称为解析。
不幸的是,BLEU 并没有建立在这些研究之上。我可以理解你为什么想要避免它,因为解析往往是相当计算密集型的,每次求值都必须解析所有的输出确实会增加一些开销。(尽管有一些度量标准,如 STM 或子树度量标准,直接比较引用和输出翻译的解析。)
然而,不考虑句法结构的结果意味着表面词序完全混乱的输出可以得到与那些更加连贯的输出相同的分数。
Callison-Burch 等人(2006 年)对此有一个很好的说明。对于这组参考句子:
Orejuela 在被带到美国飞机上时显得很平静,这架飞机将把他带到佛罗里达州的迈阿密。
Orejuela 在被护送到飞往佛罗里达州迈阿密的飞机上时显得很平静。
Orejuela 看起来很平静,因为他正被带到美国飞机上,飞机将带他去佛罗里达州的迈阿密。
Orejuela 看起来很平静,因为他被带到了美国飞机,将带他到佛罗里达州的迈阿密。
他们生成了这个机器翻译。
当他被带上飞往佛罗里达州迈阿密的美国飞机时,显得很平静。
这不是一个完美的翻译——这个人的名字被省略了,在句子的后半部分“will”后面没有动词——但也不是完全没有意义。然而,这个例子是:
在飞往佛罗里达州迈阿密的美国飞机上,他看起来很平静。
踢球者?第一个和第二个输出得到完全相同的 BLEU 分数,尽管第一个输出显然是更好的英语翻译。
BLEU 不能很好地处理形态丰富的语言
如果像地球上的大多数人一样,你碰巧使用英语以外的语言,你可能已经发现了这个指标的问题:它是基于单词级匹配的。对于形态丰富的语言来说,这很快就会成为一个问题。
语素是语言中最小的意义单位,组合在一起构成单词。英语中的一个例子是“cats”中的“s ”,它告诉我们不止有一只猫。一些语言,如土耳其语,在一个单词中有很多语素,而其他语言,如英语,通常每个单词的语素较少。
想想秘鲁人所说的 Shipibo 语中的下列句子。(这些例子来自 Pilar Valenzuela 的《Shi pibo-koni bo 中的言据性,以及 Panoan 中的类别比较概述。)
你好,我好。
Jawen jemaronki ani iki。
这两个都是英语句子“她的村庄很大”的完全可以接受的翻译你可能会注意到,以“jemar-”开头的中间词在两个句子中有不同的结尾。不同的词尾是不同的词素,表明说话者对村庄很大这一事实有多确定;最上面的意思是他们确实去过那里,最下面的是他们从别人那里听说的。
这种特殊类型的语素被称为“据实性标记”,而英语没有这种标记。然而,在 Shipibo 中,你需要这两个语素中的一个来使句子合乎语法,所以我们的参考译文肯定会有这两个语素中的一个。但是,如果我们没有碰巧生成我们在参考句子中的单词的精确形式,BLEU 会为此惩罚它…即使两个句子都很好地捕捉了英语的意思。
蓝色不太符合人类的判断
如果你的眼睛开始呆滞,当我进入语法位,现在是时候调回来了。
构建机器翻译、聊天机器人或问答系统的最终目标是什么?你最终希望人们使用它,对吗?如果一个系统不能提供有用的输出,人们就不会使用它。因此,你实际上想要优化的是使用你的系统的人喜欢它的程度,这是有道理的。我们使用的几乎所有指标都被设计成不同的近似方式。
当 BLEU 第一次被提出时,作者确实做了一些行为测试,以确保该测量与人类判断相关。(并为此向他们表示祝贺!不幸的是,随着研究人员做了更多的实验来比较 BLEU 分数和人类的判断,他们发现这种相关性并不总是很强,其他指标往往更接近人类的判断,这取决于具体的任务。
例如,Turian 等人(2003 年)发现,在三种度量中,BLEU 与机器翻译的人类判断的相关性最差,简单 F1 与人类判断的相关性最强,其次是 NIST。 Callison-Burch 等人 (2006)研究了为共享任务开发的系统(就像学术上的 Kaggle 竞赛,但没有奖金),发现这些系统的相对排名非常不同,这取决于你是在看 BLEU 分数还是人类评估员的判断。而孙 (2010)比较了三个不同的指标——BLEU、GTM 和 TER——再次发现,BLEU 评分与人类判断的相关性最小。
换句话说:如果你想让人们喜欢使用你的系统,你不应该只关注获得更高的 BLEU 分数。
我不是唯一有所保留的人
也许你仍然不相信 BLEU 并不总是这项工作的合适工具。那也行;事实上,我赞成你的怀疑态度!然而,我并不是唯一一个不热衷于这一指标的 NLP 从业者。这里有一些同行评议论文的快速链接,这些论文对 BLEU 的其他一些缺点进行了更多的讨论。
同行评审论文:
- Reiter (2018)对使用 BLEU 和人类判断进行评估的 ACL 论文进行了元综述,并发现它们仅在机器翻译系统的系统级审查中一起使用。
- Sulem 等人 (2018)建议不要使用 BLEU 进行文本简化。他们发现,BLEU 分数不能很好地反映语法或意义保留。
- Novikova 等人 (2017)表明,BLEU 以及其他一些常用的指标,在评估 NLG(自然语言生成)任务时,不能很好地映射到人类的判断。
- Ananthakrishnan 等人 (2006)列出了几种对 BLEU 的具体反对意见,并对 BLEU 得分较高的英语/印地语翻译中的具体错误进行了深入探究。
这里有一些未经同行评审的资源。(虽然它们可能不会让看你写的研究论文的同行评议者信服,但它们可能更容易说服你的老板。)
其他资源:
- Amazon Research 的 Matt Post 对预处理对 BLEU 分数的影响进行了精彩的讨论。
- 本文由从事翻译工作的 Kirti Vashee 撰写,从译者的角度讨论了 BLEU 的问题。
- Yoav Goldberg 做了一个非常好的演讲,其中包括在 2018 年自然语言生成国际会议上讨论为什么不应该为 NLG 使用 BLEU。您可以在此处找到幻灯片(搜索“BLEU 可能会误导”以获得相关幻灯片)。特别是,他和他的合作者发现,他们的句子简化模型即使通过添加、删除或重复信息也能获得很高的 BLEU 分数。
- Ana Marasovi 的博客文章" NLP 的泛化问题,以及研究人员如何解决它"讨论了包括 BLEU 在内的个体指标如何无法捕捉模型处理与他们在训练期间接触到的数据不同的数据的能力。
那么你应该用什么来代替呢?
我想让你在评估以文本为输出的系统时使用的主要东西是小心,尤其是当你正在构建最终可能会投入生产的东西的时候。对于 NLP 从业者来说,思考我们的工作将如何被应用,以及什么可能出错,这真的很重要。想想这个因为脸书把一篇说“早上好”的帖子翻译成“攻击他们”而被捕的巴勒斯坦人!我不是特别针对脸书,我只是想指出,NLP 产品的风险可能比我们有时意识到的要高。
仔细挑选我们优化的指标是确保我们工作的系统实际可用的重要部分。例如,对于像机器翻译这样的任务,我个人认为惩罚意义上的巨大变化是非常重要的。
也就是说,有很多自动评估指标可以替代 BLEU。它们中的一些将更适合不同的任务,因此值得花一些时间来评估什么是适合您的特定项目的最佳选择。
两种流行的方法实际上是 BLEU 的衍生,旨在帮助解决它的一些缺点。
- NIST ,正如我上面提到的,根据其稀有程度对 n-grams 进行加权。这意味着正确匹配一个罕见的 n-gram 比正确匹配一个常见的 n-gram 更能提高你的分数。
- ROUGE 是 BLEU 的修改版,侧重于召回而非精确。换句话说,它查看参考翻译中有多少 n 元语法出现在输出中,而不是相反。
还有许多方法可以用来评估不基于 BLEU 的序列对序列模型。其中一些是从机器学习的 NLP 的其他领域采用的方法。
- 困惑是信息论中的一种度量,更常用于语言建模。它衡量单词的学习概率分布与输入文本的匹配程度。
- 单词错误率,或称 WER ,是语音识别中常用的指标。它测量在给定参考输入的情况下,输出序列中的替换(“an”代表“the”)、删除和插入的数量。
- F 值,也就是通常所说的 F1,是精确度(有多少预测是正确的)和召回率(有多少可能的正确预测被做出)的平均值。
其他的是专门为序列到序列任务开发的。
- STM,或子树度量(我在上面提到过)比较参考和输出翻译的解析,并惩罚具有不同语法结构的输出。
- METEOR 类似于 BLEU,但包括额外的步骤,如考虑同义词和比较词干(这样“running”和“runs”将被视为匹配)。与 BLEU 不同的是,它被明确设计用来比较句子而不是语料库。
- 之三,或翻译错误率,衡量将原始输出翻译转变为可接受的人工翻译所需的编辑次数。
- TERp ,或 TER-plus,是 TER 的扩展,它还考虑了释义、词干和同义词。
- hLEPOR 是一种度量标准,更适合于像土耳其语或捷克语这样形态复杂的语言。除其他因素外,它还考虑词类(名词、动词等)。)可以帮助捕获语法信息。
- 像赫莱波里一样,里伯斯并不依赖与英语具有相同品质的语言。它旨在为亚洲语言——如日语和汉语——提供更多信息,而不仅仅是单词边界。
- MEWR 可能是列表中最新的指标,我发现它特别令人兴奋:它不需要参考翻译!(这对于可能没有大型并行语料库的低资源语言来说非常好。)它结合使用单词和句子嵌入(捕捉意义的某些方面)和困惑来给翻译评分。
当然,我这里没有足够的空间来涵盖研究人员在这里开发的所有自动化指标。尽管如此,请随意在评论中加入一些你最喜欢的,以及你为什么喜欢它们!
所以你的意思是…这很复杂?
这几乎是问题的核心。语言是复杂的,这意味着自动测量语言是困难的。我个人认为,为自然语言生成开发评估指标可能是目前 NLP 中最困难的问题。(如果你和我一样感兴趣的话,实际上在 NAACL 2019 上有一个 n 即将举行的研讨会。)
也就是说,有一个很好的方法可以确保你的系统确实在做人类喜欢的事情方面做得更好:你可以问真实的人他们是怎么想的。人工评估曾经是机器翻译的标准,我认为它仍然有一席之地。是的,它很贵,而且,是的,它需要更长的时间。但至少对于即将投入生产的系统,我认为你应该至少和人类专家进行一轮系统评估。
不过,在你进入那一轮之前,你可能需要使用至少一个自动评估指标。我强烈建议你使用 BLEU 当且仅当:
- 你在做机器翻译
- 你在评估整个语料库和
- 你知道指标的局限性,并准备接受它们。
否则,我会花时间找到一个更适合您的特定问题的指标。
关于作者:
Rachael 是 Kaggle 的数据科学家(有趣的是,ka ggle 从未举办过使用 BLEU 作为评估指标的比赛)。她有语言学博士学位,还有一只名叫古斯塔夫的刺猬。如果你有兴趣看更多她的 NLP 教程和项目,你可以在这里查看。
对机器学习的规避攻击(或“对抗性例子”)
机器学习的安全性
你的 ML 模型比你想象的要容易骗
机器学习令人兴奋。然而,就像任何新的技术或发明一样,ML 不仅带来了新的惊人能力——但不幸的是,也带来了新的漏洞。
之前我已经讨论过如何以结构化的方式考虑这些漏洞(或者如何为你的 ML 开发一个“威胁模型”)。这一次,我将深入探讨如何通过所谓的规避攻击在推理时间利用您的 ML 系统。
没有时间浪费了,让我们开始吧。
逃避机器学习
当网络被输入一个**“对立的例子”**——一个仔细扰乱的输入,看起来和感觉上与人类未经篡改的副本完全一样——但完全摆脱了分类器时,规避攻击就发生了。
尽管所有关于对立例子的宣传都是“新”现象,但它们实际上并不那么新。对抗性 ML 的领军人物之一 Battista Biggio 的一篇论文指出,攻击机器学习领域最早可以追溯到 2004 年。当时,在垃圾邮件过滤的背景下研究了对立的例子,表明线性分类器可以很容易地被垃圾邮件内容中几个精心制作的变化所欺骗。
完整时间表:
对立例子的“新奇”真正来自于它们是在深度学习的背景下被发现的。2013 年,谷歌人工智能的 Christian Szegedy 致力于理解神经网络如何“思考”,但却发现了一个所有神经网络似乎都拥有的有趣特性——很容易被微小的干扰所愚弄。鉴于深度学习已经变得如此之大——对抗性例子和对抗性 ML 领域已经成为焦点。
当谈到对立的例子时,我将主要使用计算机视觉论文——但实际上它们同样适用于任何类型的机器学习系统,从复杂到不复杂。以下是我个人最喜欢的一些:
图片:用对抗眼镜糊弄人脸检测。
视频:DEFCON上的隐身 t 恤。
音频:语音转文本转录。
语言:情感分析和文本推导。
强化学习:赛船。
恶意软件:利用 RL 躲避恶意软件分类器。
为什么会有对抗性的例子存在?
这是个很好的问题。到目前为止,对于这种情况的原因,机构群体还没有达成共识。存在许多假设。
试图解释对立例子的第一个也是最初的假设来自 Szegedy 自己的论文,其中他们认为它们的存在是由于流形中低概率“口袋”的存在(即太多的非线性)和网络的不良正则化。
后来出现了一种相反的理论,由 Goodfellow 首创,认为事实上对立的例子是由于现代机器学习,特别是深度学习系统中太多的线性而发生的。Goodfellow 认为,像 ReLU 和 Sigmoid 这样的激活函数基本上是中间的直线(在这里,碰巧我们更喜欢保持梯度,以防止它们爆炸或消失)。所以在一个神经网络中,你有大量的线性函数,所有的都延续着彼此的输入,都在同一个方向。如果你对一些输入(这里或那里的几个像素)添加微小的扰动,这些扰动在网络的另一端积累成巨大的差异,它就会吐出乱码。
第三个也可能是今天最普遍采用的假设是倾斜边界。简而言之,作者认为,因为模型永远不会完美地拟合数据(否则测试集的准确性将一直是 100%) —在分类器的边界和采样数据的实际子流形之间,总会存在对立的输入口袋。他们还从经验上揭穿了前两种方法,所以如果你是技术人员,这篇文章值得一读。
还有其他一些非常数学化的解释:
最后是我个人的最爱。麻省理工学院最近的一篇论文认为,对立的例子不是一个错误——它们是神经网络看待世界的一个特征。仅仅因为我们人类局限于三维空间,不能区分噪声模式,并不意味着这些噪声模式不是好的特征。我们的眼睛只是糟糕的传感器。因此,我们在这里真正处理的是一个比我们自己更复杂的模式识别机器——而不是把我们不理解的模式称为“对立的例子”,我们应该接受这个世界比看起来更复杂(明白吗?).
如果整篇论文太长——我强烈推荐这篇11 分钟的博客摘要。
顺便说一句,那篇论文独特地解释了与对立例子相关的另一个真正有趣的现象——它们的可转移性。以前的工作指出,对立的例子很容易在不同的模型和不同的数据集之间转移。没错——你可以在狗和猫之间训练一个模型,但你可以在输入中加入相同的敌对噪音,愚弄一个在热狗和非热狗之间训练的完全不同的模型。因为麻省理工学院的论文指出,噪音实际上是一种特征,所以图像领域的其他图像(无论是猫、狗、热狗还是不是热狗)都共享它是有道理的。迷人的东西。
攻击者的能力和敌对的例子
攻击者对目标系统的了解(或他们的"能力")非常重要。他们对你的模型和它是如何构建的了解得越多,他们就越容易对它发起攻击。
在 Calypso 我们将闪避攻击分为五个独立的类别:
- 那些使用渐变的
- 那些使用置信度分数的
- 那些使用硬标签的
- 那些使用代理模型的
- 暴力攻击
根据定义,基于梯度的攻击需要访问模型的梯度,因此是一种白盒攻击。这些无疑是最强大的,因为攻击者可以利用他们对模型如何思考(其梯度)的详细理解来数学优化攻击。
这也是最适合攻击硬化模型的技术。事实上,的研究已经表明,如果攻击者能够访问模型的渐变——他们将总是能够编造一套新的对抗性例子来欺骗模型。这就是为什么对立的例子如此重要的原因——通过模糊性获得安全性除此之外,防御它们实际上是相当困难的(稍后将详细介绍)。
迄今为止,三种最强大的基于梯度的攻击是:
置信度得分攻击使用输出的分类置信度来估计模型的梯度,然后对上述基于梯度的攻击进行类似的智能优化。这种方法不需要攻击者了解模型的任何信息,因此属于黑盒类型。
迄今为止,三种最强大的基于信任的攻击是:
硬标签攻击只依赖模型输出的标签(“猫”、“狗”、“热狗”),不需要置信度得分。这使得攻击更加愚蠢——但可以说更加现实(你知道有多少公共端点输出分类分数?).这一类别中最强大的攻击仍然是边界攻击。
代理模型攻击与基于梯度的攻击非常相似,只是它们需要一个额外的步骤。当对手无法访问模型的内部,但仍想发起白盒攻击时,他们可以尝试首先在他们的机器上重建目标的模型。他们有几个选择:
- 如果目标模型作为一个 oracle 可用,攻击者可以通过重复查询端点和观察输入输出对来了解它(我在这里将更多地讨论这种“逆向工程”攻击
- 如果目标模型应用于标准的分类任务(例如人脸检测),攻击者可能只是猜测模型被训练的架构和数据,并使用它来构建副本
- 如果攻击者没有任何信息,由于我们之前讨论的可转移属性,他们可以简单地使用任何现成的图像分类器,并生成不完美但功能强大的对抗示例
最后,还有蛮力攻击。这些攻击根本不使用优化来生成对立的例子,而是求助于简单的东西,如:
如何针对对抗性的例子进行辩护?
简而言之——很难。我们真的是进退两难。让我们检查两大类辩护——经验辩护和形式方法。
让我们从正式方法开始,因为它们讨论起来更快。你们当中那些在芯片设计或航空航天&国防等行业工作过的人应该对形式化方法很熟悉。对其他人来说——形式方法是一种数学技术,用于保证软件/硬件系统的健壮性。在大多数软件中,如果你设计或构建错误,可能会导致一些停机时间和一些愤怒的客户评论——但它可能不会杀死任何人。然而,在某些行业,这样的缺陷是不可接受的。你不能制造了 1 亿个芯片却发现芯片的某个部分有缺陷——你也不能把一架飞机放在空中,除非你已经用数学方法验证了每个组件都按预期工作。
形式方法的工作方式非常简单,就是尝试每一种可能的场景,然后看看它是如何进行的。在规避攻击的世界里,这意味着试图在一定的干扰半径内产生每一个可能的敌对例子。例如,假设您有一个只有两个灰度像素的图像,比如 180 和 80。那么让我们假设你决定在每个方向上的扰动范围为 3。这给了你(3+1+3)或 49 种组合来尝试——如果你想正式验证这些组合中没有一个是敌对的,你就必须将每一个都放入你的模型中,看看另一端会出现什么。
二维无色图像的 49 种组合。一幅 1000 x 1000px 的彩色图像,每个方向的扰动范围都是 3,会怎么样?这是要检查的(3+1+3)^(3*1000 *** 1000 个)组合(excel 拒绝提供数字)!
希望你能很快发现正式方法的问题——从计算的角度来看,它们并不便宜,而且通常完全难以处理。事实上,当应用于神经网络时,目前最先进的形式方法技术不能验证超过几层深度的网络。因此,目前这是一个有价值的——但难以实现的愿望。
如果你确实想更深入地了解神经网络的形式方法,这里有一些不错的论文:
否则,让我们继续进行**实证防御。**经验辩护顾名思义,就是依靠实验来论证辩护的有效性。例如,你可能攻击一个模型两次——首先是一个正常的、不设防的版本,然后是一个加固的版本——观察每个版本有多容易被欺骗(希望加固的模型表现得更好)。因此,正式方法试图计算每一种可能的情况,并在这样做的过程中验证不存在对立的例子——经验方法采取“你看它有效,为什么要计算”的方法。
让我们来看看一些更受欢迎的类型:
- 对抗训练
- 梯度掩蔽
- 输入修改
- 侦查
- 额外课程
对抗性训练——传授当今最受关注、也可以说是最有效的防守。在对抗训练期间,防御者用训练池中包含的对抗例子来重新训练模型,但是用正确的标签来标记。这教导模型忽略噪声,并且仅从“鲁棒的”特征中学习。
对抗性训练的问题在于,它只能保护你的模型免受与最初训练样本相同的攻击。因此,如果有人随后发起使用不同算法优化的攻击,或者发起适应性攻击(即针对防御模型的白盒攻击),他们就能够再次欺骗分类器,就好像没有防御措施一样。
你可能会想,嗯,你可以不断地重新训练你的模型,一遍又一遍地包括新伪造的对立例子——但在某些时候,你已经向训练集中插入了如此多的虚假数据,以至于模型学习的边界基本上变得无用。
也就是说,如果目标只是让攻击者更难绕过分类器,那么对抗性训练是一个可靠的选择。实际上也有很多创造性的方法来做这件事:
接下来,**渐变蒙版。**基本上是不防。有一段时间,敌对的 ML 社区认为,因为需要梯度来计算对模型的强大攻击,隐藏梯度应该可以解决这个问题。防御性蒸馏非常受欢迎——但很快被证明是假的。
梯度掩蔽不能作为一种防御策略的原因是因为对立例子的可转移性。即使你成功隐藏了模型的渐变——攻击者仍然可以构建一个代理,攻击它,然后转移例子。
输入修改发生在输入在被传递到模型之前,以某种方式被“清理”以消除敌对噪音。例子包括各种去噪解决方案(自动编码器、高级代表性去噪器、颜色位深度减少、平滑、重整 GANs 、 JPEG 压缩、fova tion、像素偏转、通用基函数变换等等。
接下来,检测。一些检测方法与输入修改密切相关,因为一旦输入被清除,就可以将其预测与原始预测进行比较,如果两者相差很远,则很可能输入已被篡改。下面是几个 的例子。
其他的就不一样了。他们实际上训练了一个独立的检测网络,其唯一的工作就是决定一个输入是否是敌对的。此外,还有许多检测防御措施,用于检查在输入馈送/预测流程的不同点计算的原始统计数据:
总的来说,输入修改和检测方法很棒,因为它们可以应用于已经训练好的模型,并且不需要数据科学家回到原点。在卡里普索,我们是这种防守的忠实粉丝。
最后,还有额外(空)类方法。这个想法很简单。分类器是在一个非常特殊的数据分布上训练的,根据定义,当超出这个范围时,分类器是没有线索的。因此,与其强迫分类器在它显然不知道标签是什么的时候猜测标签,为什么不给它弃权的选项呢?这就是空类所支持的(论文)。
总而言之,经验防御是不完美的——但它们是有效的,有时只需要几行代码。是的,不可否认,他们是攻击者的一场永无止境的猫捉老鼠游戏,新的游戏通常会很快被打破——但是如果你认为攻击者像电一样(总是选择阻力最小的路径)——我们的工作就是让他们的生活足够艰难。
结束语
唷!这是一篇很长帖子——但希望你觉得它有趣且有用。
最后一点,如果你是一名工程师而不是数学家,并且更喜欢通过做来学习,那么人工智能伦理研究所&机器学习有一个关于对抗性鲁棒性的优秀开源工具集合。去玩吧。
否则,如果你已经完成了规避攻击,但还想了解更多关于 ML 安全的知识,我推荐你阅读我的其他关于 ML 安全威胁模型和中毒和隐私攻击的帖子。
确保每个人的安全。
洗过熊猫吗?
熊猫数据帧清理简介
通常在数据科学中,我们会对项目的目标感到兴奋。“我要用回归模型来预测燃油效率,并让我的结果达到 5%以内的准确度!”我们很想马上就去实践这个想法。在头脑中开始一个伟大的目标可能是一个巨大的动力,但是要小心跳过任何项目中最重要的部分之一的危险:数据清理。它也许并不华丽,也许你并没有拯救世界,但是用一个比我更聪明的人的话来说:
A wise old tree teaches life lessons
在匆忙进行预测之前,真正了解一个数据集是建立健康、持久关系的最佳方式。
At the panda wash! woah woah woah at the…
相信我,数据奖励我们慢下来从各个角度考虑问题。让我们问一些基本的问题:当我们看我们的数据时,我们看到了什么?我们应该看吗?每一列的意图是什么?这些值是字面意义上的还是分类意义上的?该列中的值如何与其他列中的值相关联?我知道这些问题看起来很简单,但是从小处着手可以帮助你抓住一些你在匆忙中可能会错过的东西。你可能会惊讶于简单的问题会引出更复杂的问题。
好了,是时候穿上我们的雨衣,拿起海绵和橡胶扫帚,变得有点脏了。
出于这个练习的目的,我们会说我正试图根据可用的数据来预测游戏分数。我将使用 kaggle 的游戏评论数据集,可以在这里找到:https://www . ka ggle . com/egrinstein/20-years-of-games/downloads/20-years-of-games . zip/2
- 当我们查看数据时,我们看到了什么?我们应该看吗?
让我们从导入 pandas 开始,将 csv 文件读入数据帧:
import pandas as pd
df = pd.read_csv('ign.csv')df.head()
a first look at our dataframe
从一开始,我就能看出一些问题。首先,看起来这个 csv 文件有自己的索引列。保留这两个都是多余的,所以让我们通过专门调用 csv 索引列来去掉我们的。
df = pd.read_csv('ign.csv',index_col='Unnamed: 0')
2.每一列的意图是什么?这些值是字面意义上的还是分类意义上的?
我们有两个可能包含分数的列:score_phrase,看起来像文本,score,看起来像数字。在上下文中,这两列似乎都表示分类数据。让我们看看它们的数据类型和值:
df.score_phrase.value_counts()Great 4773
Good 4741
Okay 2945
Mediocre 1959
Amazing 1804
Bad 1269
Awful 664
Painful 340
Unbearable 72
Masterpiece 55
Disaster 3
Name: score_phrase, dtype: int64df.score.describe()count 18625.000000
mean 6.950459
std 1.711736
min 0.500000
25% 6.000000
50% 7.300000
75% 8.200000
max 10.000000
Name: score, dtype: float64
所以看起来 score_phrase 有 11 个不同的文本值,可以很容易地转换成 11 个数字排名。分数似乎是一个数字排名系统,从 0 到 10。现在是做决定的时候了。我用分数吗?score_phrase?还是两者的混合?让我们在做决定之前获得更多的信息。
在同一个数据集中同时包含 score 和 score_phrase 列似乎很奇怪。我假设 score_phrase 可能基于 score 列中的分数,让我们来看看。下面,我将在数据帧中查找灾难的行,以查看分数列中的值。我将对 score_phrase 的所有唯一值进行同样的操作。
score_dict = {'Disaster': [],
'Unbearable': [],
'Painful': [],
'Awful': [],
'Bad': [],
'Mediocre': [],
'Okay': [],
'Good': [],
'Great': [],
'Amazing': [],
'Masterpiece': []}for name in score_dict.keys():
score_dict[name] = df.loc[df.score_phrase == name].score.values
print(name,
score_col_dict[name].min(),
score_col_dict[name].max())Disaster 0.5 0.8
Unbearable 1.0 1.9
Painful 2.0 2.9
Awful 3.0 3.9
Bad 4.0 4.9
Mediocre 5.0 5.9
Okay 6.0 6.9
Good 7.0 7.9
Great 8.0 8.9
Amazing 9.0 9.9
Masterpiece 10.0 10.0
为了确保万无一失,让我们用一个方框图来看看我们的结果,0 代表灾难,10 代表杰作:
看起来 score 列中的值直接影响 score_phrase 值,所以我们可以完全去掉 score_phrase 列。
现在,让我们再来看看我们的数据框架:
editors_choice 列似乎也是一个二元 yes 或 no 列。让我们把它变成 0 和 1,这样更容易处理。
df.editors_choice = df.editors_choice.astype('category')
df.editors_choice = df.editors_choice.cat.codes
Change the editors_choice column
既然我们已经做了更明显的事情,是时候做出更深思熟虑的决定了。对我们的预测有用的信息是什么?书名?虽然标题肯定很重要,但我不认为它们会影响收视率,只会影响游戏的发现。网址?这只是一个工具,让人们使用数据集来了解每一个。平台呢?你发布游戏的平台会影响你的评分吗?我会说是的。让我们把它再修剪一下。
那些年、月和日的不同列又是怎么回事呢?将它们放在一个日期时间列中会更好吗?应该如何看待站台柱的不同价值?流派呢?这些都是很好的问题,重要的是不仅要问和回答这些问题,还要问和回答更多关于数据集的问题。一旦你最终清理了所有的东西并完全理解了数据,那么也只有到那时你才应该继续。
Don’t be hasty
每个数据科学家都需要阅读这些模拟故事
使用智能模拟解决的业务用例
专注于机器学习算法以使其预测模型更好的数据科学家,经常忽视通过模拟进行随机控制的力量。凭借他们对概率和统计分布的丰富知识,模拟不再是陌生的概念,可以提供更快更直观的结果。在我的经历中,有些情况下,模拟比预测模型揭示了更多可操作的见解。我奉献这篇文章来解释一些极其常见的商业情况,以及模拟是如何成为救世主的!
模拟是指由已知关系定义的系统或过程的表示。
模拟,允许我们建立一个世界的数学模型,并在计算机上运行几次。这使我们能够评估各种决策,并从中做出选择。也就是做决策。这是试图用更简单的语言来描述模拟。让我们深入研究数学和代码。当谈到统计和概率时,R 当然是我的首选语言,因此我用 R 写了所有的代码来模拟不同的过程。
1.航空公司机票超售——明智还是不明智?
航空业巨头说,达美航空公司不断面临的问题是,订了票的顾客没有出现在航班上。为了减少损失,他们倾向于超额预订一些额外的机票。例如,飞机上有 50 个座位。平均有 10%买票的人不露面。每张票的价格是 100 美元。由于超额预订,如果最后一分钟乘客不能登机,他们将获得 250 美元的补偿。应该超订多少座位才能使预期收益最大化?
解决方案在下面注释良好的代码中。56 是预定座位的最佳数量,以最大化预期利润,如代码片段下面的图表所示。
Profits with different No. of seats booked
2.在两个股票投资组合中选择
有一个概念是在给定期限内重组股票投资组合。它也有年度收益(5%)和亏损上限(30%)。假设股票的年回报率服从正态分布,均值= 3%,标准差= 5%。如果你可以选择投资另一项 10 年期传统固定 1%年回报存款,你会选择哪一项?
解决方案在下面的代码中。如图所示,几乎 77%的重组投资组合的回报率超过 1%。因此,这是一个更好的选择。
3.33 扇门。一辆车。许多山羊。留下或交换。你还记得那个游戏节目吗!!
在一个有 33 扇门的游戏节目中,一扇门后有一辆车,另一扇门后有一只山羊。你选了一扇门,主人为你打开了另一扇有山羊的门。你会换门还是留在你选择的门上?
4.像黑色星期五这样的促销活动,开放收银台的最佳数量是多少?
一年中最关键的购物日,大型零售商(如沃尔玛)必须在顾客等待时间和成本之间取得平衡。很少,他们的目的是试验不同的排队系统,以更好地了解他们的客户。比方说,总共有 20 个计数器。每个营业柜台的运营成本为 20 美元,等待超过 10 分钟的顾客会被“惹恼”,每位顾客将被罚款 1 美元。假设每个柜台都有自己的队列,到达的顾客随机加入一个队列,保持开放的最佳结账柜台数量是多少?
注:基于排队系统理论,顾客到达间隔时间和服务时间假设为无记忆分布。伽玛分布最适合它。下面是解决问题的模拟代码。正如我们所见,在这种情况下,15 个开放式收银台的成本最低。
致读者…
上面列出的业务用例是非常标准的,不需要在您的专业领域中完全复制。尽管如此,我有信心,一些修改版本的那些实例可以遇到,现在,你知道鸭汤食谱攻击他们!!
感谢阅读。如果你在任何其他的另类模式中使用过模拟的力量,请分享评论。
每个人都有权利知道地球正在发生什么:走向全球公域
遥感、传统实地观测、数据科学和可重复研究对监测环境的关键作用
*自 2004 年以来, OpenStreetMap 一直是构建世界开放地图的主要平台。最近,通过分布式工作和共同所有权建立地理信息的概念已经产生了几个鼓舞人心的企业;比如——街头级影像平台。然而,目前 OpenStreetMap 和 mapi pile 都只关注城市和城市地区。地球的其他地方呢?制作公开的全球环境变量地图怎么样,比如土地覆盖、土地使用、气候、土壤、植被和生物多样性?一些盈利和非盈利组织已经开始这样做了,提供了绘制世界土地利用(【https://osmlanduse.org】T4)、土地覆盖(https://geo-wiki.org)、生物多样性(https://gbif.org)、森林动态(https://globalforestwatch.org)、天气(https://openweathermap.org)和地形(https://opentopography.org)等平台。这些开放的数据源很棒,但是很分散。如果将组合成一个完整和*一致的“开放地图”式的世界环境系统,这样的信息会更加有效。如果实现的话,这样一个系统可以成为任何人都可以像维基百科一样自信地跟踪我们环境的现状和变化的地方。为了促成这一想法,OpenGeoHub 基金会最近推出了一款网络地图应用和一项名为“land GIS”的数据服务。
了解我们环境历史的重要性
如果我们不知道昨天发生了什么,我们怎么能判断今天呢?任何人要想了解生态系统服务及其对环境的价值,首先必须了解过去的环境状况。过去选定的某个点(在环境科学中通常称为“基线”*)是最终的参考点,使我们能够量化环境退化/恢复的规模以及所涉及的潜在成本/收益。跟踪环境历史的一个典型的、被广泛认可的例子是全球年地表温度的变化状况(见图 1)。*
Fig 1: Global temperature reconstruction from proxy data of Marcott et al (2013). This example indicates two major patterns: 1) mean annual temperature of the planet fluctuates systematically due to glacial and interglacial periods, and 2) the rate of increase of mean annual temperature due to human-induced CO2 emission (last 100 years) is unprecedented. Graph by: Klaus Bitterman.
如果我们关注上图中过去的几百年,我们会注意到地球可能一直在变冷而不是变暖。全球年气温的预期(【自然】)趋势与【人为引起】趋势有明显差异。在这种情况下,它是全球变暖效应,我们现在知道这主要是由于化石二氧化碳排放(化石燃料工业,交通,农业)。 Ricke 等人(2018) 估计,每增加一吨化石碳排放的社会成本(“每增加一吨二氧化碳排放所导致的与气候损害相关的全部经济成本”*)平均为每排放一吨二氧化碳当量 417 美元。我们仍然在 2017 年人均排放了约 4.9 tCO2(美国为 15.7 tCO23.8 其他 G20 国家的 tCO2 根据 Olivier 和 Peters,(2018) ,这意味着 2017 年二氧化碳排放的总社会成本约为 15.4 万亿美元!即使把 Ricke et al. (2018) 估算的数字换成美国环保局使用的保守数字(40 美元),我们也可以看到,CO2 排放具有严重的经济后果。因此,环境管理和计算环境破坏的社会成本很可能成为一项主要的经济活动(也就是说,如果我们的全球文明所运行的当前经济体系要生存下去的话)。*
前面的例子说明了地表温度等物理变量如何与二氧化碳排放量的测量值相关联,然后可以根据经济成本对二氧化碳排放量进行评估。但是我们的星球有着多种多样的景观、气候带和地质材料,并且地球的这些不同部分对全球事件和过程有着不同的反应。为了更好地展示这些过程的地理分布,科学家们以不同的空间分辨率绘制了全球地图。使用这些图意味着我们不仅知道每个物理变量的平均变化的单个值,而且还知道变化最显著的地方的 T2,并且通常还知道是什么在驱动 T5(图 2a)。此外,在记录和量化全球环境动态时,科学家记录了科学上认可的特定严格变量的动态,我们可以将其称为土地管理指标**(图 2b)。**
Fig. 2: Difference between the historic, actual and potential values of land management indicators (a), and examples of some common environmental variables and land management indicators (b) of importance for monitoring the status of the Earth’s environment.
在这里,并不是所有的土地管理指标都同样重要。一些变量是人类生活质量的直接指标,当用于预测潜在的未来自然灾害、生态系统服务的收益或损失等时,其价值可达数十亿甚至数万亿美元(见前面的二氧化碳排放例子)。例如,《联合国防治荒漠化公约》(《荒漠化公约》)选择了以下三个土地退化关键指标:
- 土地覆被分类,
- 土地生产力,
- 生物量中的地上和地下碳,
保持这三项中的每一项不变,或者至少不显著恶化,是朝着土地退化中立迈出的一步。
谈到土地管理指标,现在越来越重要的是能够【绘制过去】**【预测未来】,即制作不同时期的土地管理指标图,同时保持相同的空间参考。记录过去 10,000 年土地利用变化的完整全球数据集的一个例子是 海德数据集 ( Klein Goldewijk 等人,2011 年),该数据集包括 10 种主要土地利用类型、人口密度和城市及农村地区覆盖率的时间序列图像,由荷兰环境署(PBL)制作和分发。人们可以很快观察到,大多数这样的历史时间序列图都有同样的问题,那就是它们对于在更远的过去发生的事件和条件的确定性相对较低。由于这个原因,海德只能在 10 公里的相对粗糙的空间分辨率下使用,随着我们回到前工业时代,空间模式的可靠性急剧下降。2019 年,我们可以以精细的空间分辨率绘制几乎所有世界森林和树冠高度的地图。但是 100 年前的森林所在的位置(更不用说 2000 年前了)就很难重建了。**
地图的空间分辨率往往定义了一个系统的大部分技术规格和地图的可用性( Hengl 和 MacMillan,2019 )。从管理的角度来看,地球的陆地可以划分为离散的空间单元或像素,理想情况下对应于地球表面的等面积块。例如, What3Words 公司(图 3)为每个 3⨉3m 像素分配了三个常用词的唯一组合(总土地面积估计为 148,939,063 平方公里,超过了 1.65⨉10^13 的唯一像素!).通过使用 with 单词,你可以与 3⨉3m 空间街区内的其他人联系。我们现在还可以将所有关键土地管理指标的值附加到每个独特的像素上,然后跟踪它们随时间的变化。这种精细的土地管理应用于农业用地时,被称为“精准农业】**。正如我们将在后面的章节中看到的,在 2019 年以 1-5 米的分辨率绘制地球陆地地图当然是可行的,但也将需要大规模的计算基础设施。**
Fig. 3: What3words map browser screenshot showing pixelation/discretization of the Earth’s surface.
迄今为止,我们认为需要监测的最重要的全球土地变量类型是土地覆盖、土地使用、温度、降水、蒸汽压力不足、空气传播的微粒、火灾、地上和地下生物量、气体排放、有效光合作用、动植物种类及其特征、土壤水和土壤宏观和微观动植物。这些变量类型的变化可进一步解释为得出土地管理指标,然后可用于跟踪业绩和估计潜在的财务损失或收益。通过长时间监测这些指标,并对其精确的空间分布进行建模,我们可以评估环境的各种潜在状态,预测未来状态,并使用这些信息不断改善和优化土地管理。
天空中的眼睛
如同在许多科学领域一样,减少量化土地退化方面的政治偏见或争议的一个方法是依靠强大的技术和客观的测量。自 20 世纪 60 年代以来,很明显,跟踪全球植被状况的最有效方法是使用基于卫星的遥感系统(RS)作为连续地球观测(EO)的基础。从 2008 年开始, NASA 和 USGS 制作了所有的 Landsat 影像,免费开放象征性地开启了遥感数据的新时代朱等 2019 。事实证明,国家机构开放遥感数据也能产生经济效益。朱等人(2019) 估计,仅美国用户 2011 年的生产率节约就达 17 亿美元,国际用户增加 4 亿美元,这几乎足以支付整个项目的历史费用(仅从 2011 年的利润中计算)!支持改进资源管理的应用将不可避免地导致 EO 应用呈指数级增长,这些趋势将在未来几十年保持积极(欧玛,2016);郭氏,2018 )。开放 EO 数据对于自然保护和土地恢复项目尤为重要( Turner 等人,2014 年;吉布斯&三文鱼,2015 。近 20 年来,NASA 和 USGS 一直在维护和共享从他们的 MODIS 图像中获得的土地产品的时间序列; 哥白尼全球地勤(CGLS;由 VITO NV 主持)提供了类似的土地管理指标列表,包括植被指数、吸收的光合有效辐射(FAPAR)和干物质生产率。在最近发射了欧盟资助的哥白尼哨兵和日本宇宙航空研究开发机构(JAXA)的先进陆地观测卫星 ALOS 之后,基于 EO 的环境监测项目蓬勃发展。除了多光谱图像,德国航空航天中心(DLR) TANDEM-x 项目现在已经产生了可能是最精确的全球地表模型(包括全球森林冠层高度地图),空间分辨率为 12 米,垂直精度前所未有( Martone et al. 2018 )。该数据集的 100 m 分辨率版本最近已免费发布,供研究和教育使用。德国航天中心的下一代地形/高程测绘将专注于更精细的分辨率(5 米)和更快的重访时间(< 1 个月),以便我们能够越来越多地跟踪地表高程或体积位移的所有细微变化。以下三个趋势现在普遍适用于所有 EO 项目(欧玛,2016;赫罗德等人 2016 ):
- 空间分辨率不断提高,重访时间越来越快。
- 降低单位面积的收购、储存和加工成本。
- 更先进的技术允许穿透云层和植被(主动传感器)并提高检测材料和组织的准确性。
现在越来越难以掩盖糟糕的土地管理或空气或水污染。公开(或廉价)获得的图像的空间分辨率现在正朝着亚米级精度快速发展。在 2019 年 行星实验室 已经创建了一个图像融合系统,支持在 3 m 空间分辨率 ( Houborg 和 McCabe,2018 )下推导每日归一化差异植被指数(NDVI)和叶面积指数(LAI)。同样,one sol 公司已经从 Sentinel-2 和 LandSat7/8 图像中自动提取了农场边界和作物状态(目前仅在欧洲和美国),因此,即使是较小规模的农场及其植被指数也可以逐块进行跟踪。这些系统正从只有原始图像转变为按土地管理单位(如田地)对土地管理指标进行预处理的估计。我们预计,在未来几年,掩盖任何森林砍伐(甚至是一些树木的损失)将变得越来越困难?)、生物量损失(Landsat 7/8 和 Sentinel 2)、土壤损失、二氧化碳排放(Sentinel 5),甚至是地球上任何地方的更小规模的废物堆(行星实验室)。我们认为这些都是好的趋势,也认为这种意识跨越国界无缝延续是好的,也就是说,它使我们有能力不分国界地识别糟糕的土地管理者或环境污染者。人们有权了解过去、现在和未来全球土地的状况。这种全球环境意识很可能是全球化最积极的方面之一。
可重复的研究是建立对地图信任的基础
在前面的章节中,我们讨论了遥感影像如何直接和客观地测量环境状况,它现在如何变得越来越容易获取,以及因此遥感数据的应用数量和整体市场如何可能呈指数增长。但大多数国家和企业都没有能力处理如此庞大的数据量,更不用说利用它们将传递的新型信息了。例如,要归档所有 LandSat 场景,你需要数 Pb 的存储空间,更不用说处理这些数据的大型基础设施了。举例来说,行星实验室声称每天获得 50 万亿像素的新数据。为了应对如此大规模的数据挑战,谷歌开发了一种云解决方案,用于处理美国宇航局、欧空局和 JAXA 的所有图像以及所有其他公开可用的图像: 谷歌地球引擎 (GEE) ( 戈雷利等人 2017 年)。几个研究小组已经使用 GEE 基础设施推导出全球森林砍伐/森林覆盖变化地图( Hansen 等人,2013 )、地表水动力学( Pekel 等人,2016 )、土地覆盖( Song 等人,2018 )和农田分布 ( Xiong 等人,2017 ),仅举几个最著名的例子。最近在遥感杂志上关于 GEE 的特刊列出了更多 GEE 的应用。
GEE 真的让本科生能够在没有任何研究预算的情况下以 30 米的分辨率绘制世界地图。GEE 是否应该成为获取、存储和分发土地管理指标的通用解决方案?听起来是个完美的选择。拥有同一原始遥感数据的多个副本肯定会效率低下。谷歌还考虑周到地支付处理成本,这(相对而言)考虑到他们的基础设施规模可能很小。但是 GEE 是有代价的。首先,向 GEE 上传和下载较大的数据集包括一个期望,即用户将需要增加他们的 Google Drive 或 Google 云存储的容量。第二个更严重的限制是谷歌的使用条款指出:
5.服务的贬值。Google 可以在任何时候因任何原因停止任何服务或任何部分或功能,而不对客户承担任何责任。
换句话说,像谷歌这样的公司可以在任何时候停止 GEE,并且在法律上不承担任何后果,因为这些是所有 GEE 用户在开始服务时已经接受的使用条款。另一个问题是:我们能信任谷歌吗?如果谷歌开发人员在他们的代码中犯了一个错误怎么办?虽然 GEE 中使用的许多算法都是基于开源软件的,但是理解在生成地球图像之前 Google 服务器上发生的事情并不容易。一个由欧盟资助的项目 OpenEO (开放地球观测)现在着眼于确保 【跨云后端再现性】 。它开发了一种语言(API),可以用来向不同的云后端提出问题,包括 GEE。通过这种方式,它旨在使比较和验证他们的结果变得相对简单,但也找到例如进行特定类型计算的最便宜的选项。 O2R 项目 有许多关于如何备份和共享代码和数据以及以相对较低的成本实现计算再现性的实用技巧。
EO 是客观监测土地动态的基础,但并不是所有的土地管理指标都可以单独使用遥感技术直接制图。一些土地管理指标需要通过在点位置插入取样(即观察/测量)值或使用预测制图方法来估算。有些变量更复杂,不能仅使用光谱反射率来绘制。例如,还没有 EO 系统可以用来直接估算土壤有机碳(SOC)密度。这样做的技术尚不存在,因此,我们需要使用点样本和预测映射来尝试估计每个像素的 SOC。幸运的是,现在有越来越多的带有环境变量的点数据通过开放数据许可和国际倡议跨境提供。已建立的野外观测汇编包括: 全球生物多样性信息设施 观测、 全球历史气候网 站数据、 WoSIS 土壤剖面数据库 【点】、 sPlot 全球植物数据库 、 鸟类 ,仅举几个最广为人知的例子。如今,越来越多的点数据测量和观测也是通过公民科学和众包项目贡献的,如in naturalist(图 4)Geo-wiki、 公民气象观测计划 和类似项目( Irwin,2018 )。甚至商业公司现在也开放共享他们的专有数据,并将其用于全球数据挖掘项目(当然前提是他们的用户同意)。例如,温度、压力、噪音水平等的连续测量。来自 Netatmo 气象站(估计全球售出超过 15 万台设备)。许多用户也乐于分享他们手机设备上的天气测量数据。Plantix app 目前正在制作一个植物病害和生长异常照片的全球数据库。我们在此仅提及几个主要的全球或大陆数据存储库和计划。当然,还有更多的本地语言版本的存储库。
随着地面观测和测量的全球汇编变得更大和更一致,越来越需要从中提取增值的全球地图。现在,人们越来越有兴趣使用亿亿级高性能计算来处理新兴的新型原位观测网络,以提高高分辨率天气预报、农业管理和地球系统建模的质量和成本效益。未来几年一个特别令人兴奋的发展可能是一种混合的基于过程的建模+机器学习方法,它结合了最好的数据和我们最好的地球物理/地球化学知识(赖希斯坦等人 2019 )。
Fig. 4: iNaturalist.org: a Citizen Science system. Screenshot showing geographical density and type of data (usually field photographs with description and interpretation of species names etc) contributed.
总而言之,建立数据信任的最有希望的途径似乎是实现计算的可再现性(记录所有处理步骤,并提供再现完全相同的结果所需的所有相关元数据)。现在有越来越多的健壮的方法来实现可重复性,即使对于计算量相对较大的项目也是如此。由于与新的地球观测卫星发射相关的免费遥感数据的提供越来越多,似乎主流数据分析将从本地网络转移到(虚拟)云和大地球数据立方体,即通过基于网络的工作流进行数据分析( Sudmanns et al. 2019 )。在这种情况下,地球观测站仍将是一个有价值的(希望)越来越值得信赖的地方,用来处理全球公共遥感数据,并制作新的有价值的环境状况地图。但社会也需要更开放的非营利基础设施,如 OpenStreetMap,以确保长寿。无论如何,全球实地观测资料库、公民科学和机器学习将在生成更全面的土地管理指标的更可靠地图方面发挥越来越大的作用。
OpenLandMap.org:我们对全球土地共享的贡献
我们(OpenGeoHub 基金会)最近开始提供托管和数据科学服务,通过一个我们称为“土地地理信息系统”的系统,帮助制作和共享关于多种环境措施的实际和潜在状态的最新、完整记录(可能达到完全可再现的水平)的数据集,该系统可通过https://openlandmap.org获得(图 5)。最初, LandGIS 通过一个允许交互式查询和叠加的简单网络制图界面,提供关于土壤特性/类别、地形、地质、土地覆盖/使用/退化、气候、当前和潜在植被的新数据和现有数据。这是一个真正的开放土地数据和服务系统,任何人都可以贡献和共享全球地图,并使成千上万的研究人员和企业能够访问它们。
LandGIS in action: a 6-minutes video tutorial on how to access, use and download data.
土地地理信息系统基于以下六个主要支柱:
- 开放数据许可证(开放数据共享开放数据库许可证和/或知识共享署名共享)将数据副本放在zenodo.org,
- 通过 github 库可获得大部分代码的完整记录的、可复制的程序,
- 基于使用开源软件实现的最新总体机器学习技术的预测,
- 基于使用开放地理空间联盟 (OGC)标准的数据分发:GDAL、WMS、WCS 等。
- 针对高流量使用优化的网络服务的多样性(云优化的地理 IFFs),
- 管理、开放的用户和开发人员社区。
我们为我们自己的数据挖掘和空间预测过程的 LandGIS 结果做出了贡献,包括潜在自然植被的制图(例如 Hengl 等人 2018 )和土壤属性和类别的 3D 制图。但是,我们也托管其他人提供的地图,特别是如果数据已经过同行审查并有完整记录的话。
Fig. 5: LandGIS interface showing predicted global distribution of USDA great groups (soil types) based on a global compilation of soil profiles. Data available for download at doi: 10.5281/zenodo.1476844*.*
为了说明我们产生有用信息以改善全球土地管理的一般方法,考虑土壤类型制图的例子。美国农业部和美国地质勘探局已经投入了数十年,甚至可能是数十亿美元,主要通过土壤分类系统 【美国农业部土壤分类学】 来收集土壤数据,并生成和维护关于土壤的知识。经过几十年的实地工作和对数千份土壤样本的实验室分析,美国农业部和美国地质调查局产生了一个包含超过 350,000 份土壤类型实地观察结果的储存库(在这种情况下,我们重点关注土壤大类群)。我们将这些点数据与其他国家和国际汇编相结合,产生了世界上最一致和最完整的美国农业部土壤大群体训练数据集。然后,我们将这些点覆盖在代表土壤形成因素的约 300 个全球协变量层上,然后使用随机森林拟合空间预测模型( Hengl 等人,2017 )。尽管我们在美国以外(大多数训练点位于美国)仅实现了有限的分类准确性,但拥有足够大的训练数据集使我们能够为基本上没有训练点的国家制作土壤类型的初始地图(分辨率相对较高,为 250 m )(图 6)。因为我们有完全自动化的叠加、建模和空间预测,一旦我们获得更多关于土壤类型的观测结果,我们就可以更新这些初始预测,并逐渐制作更好、更可用/有用的地图。
Fig. 6: Example of a general workflow of how LandGIS can be used to recommend optimal soil use practices at a farm scale based on accurately predicting the soil type (in this case: USDA soil great groups*). Note we run a circular process where with each new contribution (training points) we can produce increasingly more detailed / more accurate soil maps.*
正在开发的其他 LandGIS 功能包括:
- 多用户:为环境活动的各种参与者提供相关和有用的功能,包括土地所有者、社区领袖、科学咨询机构、商业承包商、捐助者和投资者。
- 多模块:整合环境管理中的各种活动,包括项目发现、农场尽职调查、筹资、实施、自动土地管理 KPI(关键绩效指标)跟踪。
- 与企业 IT 和社交媒体的集成:实现增强的安全性、数据保护和互操作性特性。
- 基于上下文的定制和丰富:空间自动填充的用户数据(节省手动设置工作)、基于对等活动的功能、针对特定条件的基于位置的警报(例如霜冻警告、温度阈值等)。
- 集成“区块链”功能,支持环境令牌交易。****
因此,总的来说,仍然需要一个 OpenStreetMap 类型的系统,以允许存档和共享环境变量和土地管理指标。有了 LandGIS 和 OpenLandMap.org,我们已经证明了使用“旧的遗留数据”可以立即产生新的、增值的信息。我们展示了技术和知识转移的机会(从数据丰富的国家到数据贫乏的国家),我们认为这是一个双赢的局面。我们将用于生成 LandGIS 图层的所有代码作为开源代码发布,允许任何人完全复制最先进的空间分析,包括作为商业服务的基础。我们已经将所有数据作为开放数据发布,允许任何人,包括企业,在这些土壤和其他环境数据的基础上进行构建——希望以我们甚至无法想象的方式。
请引用为:
托米斯拉夫·亨格尔,汤姆·柯林斯,伊奇萨尼·惠勒,罗伯特·麦克米伦。(2019 年 3 月 27 日)。每个人都有权利知道地球正在发生什么:走向全球公域。中等(走向数据科学),http://doi.org/10.5281/zenodo.2611127
参考资料:
- 吉布斯,H. K .,&萨蒙,J. M. (2015)。绘制世界退化土地图。应用地理,57,12–21。https://doi.org/10.1016/j.apgeog.2014.11.024
- Gorelick,m . Han cher,m . Dixon,m . Ilyushchenko,s .,Thau,d .,& Moore,R. (2017)。谷歌地球引擎:面向所有人的全球地理空间分析。环境遥感,202,18–27。https://doi.org/10.1016/j.rse.2017.06.031
- Hansen,M. C .、Potapov,P. V .、Moore,r .、Hancher,m .、Turubanova,S. A. A .、Tyukavina,a .、… & Kommareddy,A. (2013 年)。21 世纪森林覆盖变化的高分辨率全球地图。科学,342(6160),850–853。https://dx.doi.org/10.1126/science.1244693
- Hengl、de Jesus、J. M .、Heuvelink、G. B .、Gonzalez、M. R .、Kilibarda、m .、Blagoti、a .、…、Guevara、M. A. (2017 年)。SoilGrids250m:基于机器学习的全球网格土壤信息。PLoS one,12(2),e0169748。【https://doi.org/10.1371/journal.pone.0169748 号
- ****Hengl,Walsh,M. G .,Sanderman,j .,Wheeler,I .,Harrison,S. P .,& Prentice,I. C. (2018)。潜在自然植被的全球制图:对估计土地潜力的机器学习算法的评估。PeerJ,6,e5457。【https://doi.org/10.7717/peerj.5457 ****
- t .亨格尔,麦克米伦,r . a .(2019 年)。荷兰瓦赫宁根 R. OpenGeoHub 基金会预测土壤制图,370 页,ISBN:978–0–359–30635–0。http://soilmapper.org
- Herold,m .,See,l .,Tsendbazar,n .,& Fritz,S. (2016 年)。走向一体化的全球土地覆盖监测和绘图系统。遥感,8(12)。http://dx.doi.org/10.3390/rs8121036
- Houborg 和 m . McCabe(2018 年)。通过 CubeSat,Landsat 和 MODIS 数据的融合在 3 m 分辨率下每日反演 NDVI 和 LAI。遥感,10(6),890。https://doi.org/10.3390/rs10060890
- 欧文(2018)。不需要博士:公民科学如何改变研究?自然,562,480–482。https://doi.org/10.1038/d41586-018-07106-5
- Klein Goldewijk、A. Beusen、M. de Vos 和 G. van Drecht (2011 年)。过去 12,000 年人类引起的土地利用变化的 HYDE 3.1 空间显示数据库,全球生态学和生物地理学 20(1):73–86。https://dx.doi.org/10.1111/j.1466-8238.2010.00587.x
- 郭(2018 年)。生态学的遥感革命。自然 556,137。https://doi.org/10.1038/d41586-018-03924-9
- Marcott,S. A .,Shakun,J. D .,Clark,P. U .,& Mix,A. C. (2013)。过去 11300 年区域和全球温度的重建。科学,339(6124),1198–1201。https://dx.doi.org/10.1126/science.1228026
- Martone,m .,Rizzoli,p .,Wecklich,c .,González,c .,Bueso-Bello,J. L .,Valdo,p .,… & Moreira,A. (2018 年)。来自串联 X 干涉 SAR 数据的全球森林/非森林地图。环境遥感,205,352–373。https://doi.org/10.1016/j.rse.2017.12.002
- 奥利维耶、j . g . j &彼得斯、J.A.H.W. (2018)。全球二氧化碳和温室气体排放总量趋势:2018 年报告。第 3125 号报告。PBL 荷兰环境评估机构,海牙。
- ****纽约州欧玛市(2016 年)。用于地表成像的中高分辨率地球观测的进展:演变、未来趋势和对可持续发展的贡献。空间研究进展,57(1),110–126。【https://doi.org/10.1016/j.asr.2015.10.038 ****
- Pekel,J. F .,Cottam,a .,Gorelick,n .,& Belward,A. S. (2016)。全球地表水及其长期变化的高分辨率制图。自然,540(7633),418。https://doi.org/10.1038/nature20584
- 赖希斯坦,m .,坎普斯-瓦尔斯,g .,史蒂文斯,b .,荣格,m .,登茨勒,j .,&卡瓦尔海斯,N. (2019)。数据驱动的地球系统科学的深度学习和过程理解。自然,566(7743),195。https://doi.org/10.1038/s41586-019-0912-1
- 里克,k .,德鲁埃,l .,卡尔代拉,k .,塔沃尼,M. (2018)。国家层面的碳社会成本。自然气候变化,8(10),895。https://doi.org/10.1038/s41558-018-0282-y
- Song,X. P .,Hansen,M. C .,Stehman,S. V .,Potapov,P. V .,Tyukavina,a .,Vermote,E. F .,& Townshend,J. R. (2018)。1982-2016 年全球土地变化。自然,560(7720),639。https://doi.org/10.1038/s41586-018-0411-9
- Sudmanns,m .,Tiede,d .,Lang,s .,Bergstedt,h .,Trost,g .,Augustin,h .,…,T. (2019)。大地球数据:地球观测数据管理和分析的颠覆性变化?。国际数字地球杂志,1–19。https://doi.org/10.1080/17538947.2019.1585976
- Turner,w .,Rondinini,c .,Pettorelli,n .,Mora,b .,Leidner,A. K .,Szantoi,z .,… & Koh,L. P. (2015 年)。免费和开放的卫星数据是保护生物多样性的关键。生物保护,182,173–176。https://doi.org/10.1016/j.biocon.2014.11.048
- 熊,j .,Thenkabail,P. S .,Gumma,M. K .,Teluguntla,p .,Poehnelt,j .,Congalton,R. G .,… & Thau,D. (2017)。使用谷歌地球引擎云计算的非洲大陆自动农田制图。摄影测量与遥感杂志,126,225–244。https://doi.org/10.1016/j.isprsjprs.2017.01.019
- ****Zhu,z .,Wulder,M. A .,Roy,D. P .,C. E .,Hansen,M. C .,Radeloff,V. C .,… & Pekel,J. F. (2019)。免费和开放的陆地卫星数据政策的好处。环境遥感,224,382–385。【https://doi.org/10.1016/j.rse.2019.02.016 ****
每个人都想成为一只猫
fast.ai《程序员实用深度学习》第六课
我正在学习 fast.ai 的杰瑞米·霍华德和雷切尔·托马斯的“程序员实用深度学习”课程,并在博客上记录我的经历。由于非常慷慨的 fast.ai 社区已经为每一课做了详细的笔记(参见第六课的笔记这里),我只是写下讲座的部分内容,并附上我需要停下来思考几次的 Jupyter 笔记本。
我需要回顾的第一个主题出现在关于数据扩充的仿射变换的讨论中。“仿射”又是什么意思?与线性有关。我咨询了谷歌,找到了很多解释,都非常清晰,但是数学堆栈交换的这个对我来说很有用:线性函数只是缩放,但是仿射函数缩放并移位。
第六课剩下的大部分时间,我都在理解卷积。杰里米说,文件中的所有图片都是关于猫的,因为西尔万·古格喜欢猫,而且他写了大部分文件(尽管西尔万说他不喜欢猫,事实上,只是把它们放在文件中以吸引人们阅读文件,这很有趣)。
因此,让我们探索回旋,并保持与暴躁猫(RIP)猫的主题。
Jeremy 使用 Bret Victor 的图像内核动画来说明卷积运算是如何工作的。给定一个矩阵,其元素表示图像的像素,卷积采用该矩阵的一个元素,并使用如下所示的 3 x 3 矩阵(通常为正方形)对所选元素/像素周围的元素值进行逐元素矩阵乘法,该像素位于矩阵的中心。如果像素靠近图像的边缘,我们可能需要“填充”矩阵,如 Francesco Visin 的动画所示。最后,我们将所有的乘积相加得到一个值(所以用线性代数术语来说,我们只是在做点积)。
使用下面显示的带有“锐化”内核的 Grumpy Cat 图像,我们看到内核将通过将其乘以 5 来强烈强调它“正在看”的像素(中心的像素),同时通过将其乘以 0 或-1 来削弱其周围的像素,从而增加它们之间的对比度。
类似地,使用“模糊”内核,我们看到该内核将相关像素的值降低到 0.25,但将周围像素的值降低得更多,这降低了整体对比度。
有时候,当学习一些东西时,可能会觉得“是的,所有这些都很有道理,我完全明白了,”然后你试图解释它,并意识到你实际上对你刚才听到的几乎一无所知。停下来向别人解释你刚学到的一个概念,即使那个人是虚构的(或者一个博客;) ),是一种高效确定自己是否真正理解的方法!
这一刻对我来说是其中之一:我们正在通过一系列卷积运行张量,每个卷积都减少了高度和宽度,但增加了输出通道的数量,当我们完成时,我们得到了下图所示的张量。
https://www.youtube.com/watch?v=U7c-nYXrKD4&feature=youtu.be&t=5630
512 感觉有点正常,是 2 的幂,但是为什么我们在 11 停下来,特别是对于其他两个维度?
我几乎没有写出来,因为为了弄清楚,我只是看了视频,看了几十遍笔记,最后,我觉得我没有什么要补充的。但为了理解它,我不得不按照与视频/笔记中显示的不同的顺序为自己写下它,所以这里是那篇文章,以防它对其他人有所帮助。
所以让我们后退。我们从表示图像的张量开始,该张量有 3 个通道(红色、蓝色和绿色),高度为 352 像素,宽度为 352 像素。这是张量的形状:
我们有很多图像,这么多这样的张量,但是 PyTorch 希望我们使用每个图像的小批量,所以正如 Jeremy 所说的,我们可以用特殊值None
索引到数组中,这创建了一个新的单位轴,给我们一个形状为[1, 3, 352, 352]
的秩为 4 的张量。这是一个小批量的 1 图像,它有 3 个通道,高 352 像素,宽 352 像素。我必须不断检查的一件事是,shape 函数在高度和宽度之前返回通道,但当我们将张量视为多维矩阵时,我们将维度列为高度 x 宽度 x 通道数。所以在矩阵术语中,上面的张量的维数是 352 x 352 x 3(记住 1 不是矩阵的维数;就是小批量的大小)。
然后我们通过一系列的激活来运行张量,从一个 2 维卷积Conv2d
开始,使用大小为 2 的步幅。这意味着它不是“看”矩阵的每个元素,而是“看”所有其他元素,“跳过”其中的一半。这就是导致高度和宽度减半,输出通道数量翻倍的原因。
因此,当我们通过第一个卷积层运行张量时,我们获得一个 352 x 352 x 3 的维度矩阵,并通过 64 个步长为 2 的卷积(或内核)运行它,我们得到一个(352 / 2) x (352 / 2) x 64 的维度矩阵;也就是说,它是 176 x 176 x 64,或者用 PyTorch 形状来表示,如下所示:
然后,我们运行张量通过两个以上的层:BatchNorm2d
和ReLU
,它们不会改变形状,然后池层MaxPool2d
,它会改变形状为 88 x 88 x 64。我发现杰森·布朗利的对卷积神经网络池层的温和介绍对理解池层如何工作非常有帮助。
我们不断地对这些层进行多次检查,时不时地,我们将高度和宽度各除以 2,并将内核的数量加倍。因此,在某一点上,我们有 44 x 44 x 256,然后是 22 x 22 x 512,最后是我们想知道的 11 x 11 x 512 矩阵。
所以我认为我们在高度和宽度上停留在 11,仅仅是因为 11 是一个奇数!如果我们将 11 除以 2,我们会得到 5.5,这对于矩阵来说不是一个合适的维数。感觉上我花在追逐张量上的时间和答案的简单性不成比例。尽管如此,我对立体体操的理解肯定比以前好得多,所以我想这很了不起!
在 GitHub 上的 pets 笔记本中查看完整代码,下周第 7 课再见!
关于此主题的其他帖子:
第一课:fast . ai 入门
第 2 课:对妊娠试验结果进行分类
第二课(续):深度学习能比鸽子表现更好吗?
第三课:一万种行不通的方法
第四课:预测服务员的小费
第五课:但是泡菜去哪里了?
我是加州大学东湾分校的数学讲师,也是一名有抱负的数据科学家。在 LinkedIn 上和我联系,或者在 Twitter 上和我打招呼。
日常生活和微观预测
Photo by @chengfengrecord
具有人工智能的 B2C 预测和安全工具
作为个体,我们有权利使用人工智能来尝试预测日常生活中的行为吗?举个例子,你应该能够预测雇佣特定保姆的风险吗?2018 年,Predictim 发布了一项服务,承诺通过扫描他们在网络、社交媒体和在线犯罪数据库上的存在来审查可能的保姆。可以说是个人使用的 AI 安全。
Predictim 提供了一种新的创新方法,使用人工智能和替代数据来即时审查人们。
可以说,Predictim 没有获得任何形式的巨额投资(种子期 10 万美元)。然后在 2018 年末,推特和脸书宣布 Predictim 已经被禁止。乔尔·西蒙诺夫和萨尔·帕萨似乎没有采取进一步的行动来创办一家新公司。事实上,在社交媒体跟踪的好名字或坏名字中,我现在看到 Joel Simonoff 是 NASA 的机器学习研究员。
什么是好的,什么是不好的?
然而,初创公司的兴衰提出了一个有趣的问题,即我们如何使用技术来预测并根据这些预测采取行动。在 Predictim 中,有一个明显的内在种族主义的例子。人工智能对尊重和态度的扫描,对家庭领域的伦理如此缺乏理解,似乎是一种明显的侵犯。什么是好的,什么是不好的?
我们似乎仍然认为,公司收集我们在家里的行为的预测信息是没问题的,只要他们用雄辩的声音说话,或者如果你在网上找到了你想要的答案。我们的 fitbit(测量健康信息)、手机(情境感知、位置信息)和社交媒体(心理特征、偏好)也是如此。
这些具有更大框架的预测工具肯定会有与保姆应用一样糟糕或更糟糕的偏差,但我们也许可以在另一个时间讨论这个问题。
微观预测
你可能听说过微观管理:这是一种管理风格,管理者通过这种方式密切观察和/或控制和/或提醒他/她的下属或员工的工作。然而,它可以在工作环境之外的关系中引用。
大声说出微观预测,我或多或少把它作为一个的讨论点。预测并不是什么新鲜事,在某种程度上,你可以说它是让我们与众不同的一部分:
“象征性抽象思维 : 很简单,这是我们思考不在物理上存在的物体、原理、观念的能力。它赋予我们复杂语言的能力。这是由较低的喉头(比所有其他动物允许更广泛的声音)和复杂语言的大脑结构支持的
多么美妙的象征性抽象思维,然而它回避了这样一个问题,即预测什么或不预测什么是否有一个限度。甚至可能会有关于如何预测的问题,或者更有可能是法律,因为伦理考虑会转化为监管。事实上,预言在各种科学中的支配地位可以追溯到很久以前,许多提到的王子被尼可罗·马基亚维利作为早期的例子估计早在1513 年就已经被分发。使用定量信息并收集这些信息以更好地做出决策的想法。
在这种预测背景下保护权利的最近例子是欧盟通用数据保护条例 (GDPR)和 FDA 考虑监管医疗保健中的机器学习。
机器学习 (ML)是对算法和统计模型的科学研究,计算机系统使用这些算法和统计模型来有效地执行特定任务,而不使用明确的指令,而是依靠模式和推理。
没有明确的指导方针,似乎对什么可以做什么不可以做有一个模糊的认识。人类学家 Marilyn Strathern 写了一篇更早的文章,名为《T2:未来的亲属关系和文化研究》(1995 年)。其中她谈到了我们对什么是人工或非人工的概念,提到了它是如何随着时间的推移而变化的。这种人工或技巧并不是一成不变的,被认为是自然的变化。
为什么要做微预测?
微观管理通常被认为有负面的含义,主要是因为它显示了工作场所缺乏自由。微预测作为一个话题可能需要进一步讨论,我还没有定义它,因为我还不知道如何以一种好的方式使用它。然而,为了激发更多的兴趣,我想用 Predictim 关于伦理学的评论来结束我的文章:
“我们非常重视道德和偏见,”Predictim 的首席执行官萨尔·帕萨(Sal Parsa)在电话中小心翼翼地告诉我。“事实上,在过去的 18 个月里,我们训练了我们的产品、我们的机器、我们的算法,以确保它是合乎道德的,没有偏见。我们把敏感的属性,受保护的职业,性别,种族,从我们的训练集中去掉。我们持续审计我们的模型。除此之外,我们还增加了人工审核流程。”
这听起来耳熟吗?如果是,谁有权侵犯或使用用户数据?
我不确定我是否会支持根据这一标准对保姆进行扫描,但我会支持保险公司或信用评分吗?
基于狭义的人工智能技术结合社交媒体或其他来源等非传统数据的信用评分可能是一个有趣的领域,可以继续监测,因为新公司正在涌现,并以可能令人不安的新方式应用机器学习。
偏见:对一个人或一群人的倾向或偏见,尤其是以一种被认为不公平的方式。在人类学领域,我们讨论种族中心主义:根据源于自身文化标准和习俗的先入之见来评价其他文化。
我们如何使用技术或谴责技术的使用是令人着迷的。
我一定会进一步探讨这个问题。
这是#500daysofAI 的第 22 天,希望你喜欢。
–
什么是#500daysofAI?
我在挑战自己,用#500daysofAI 写下并思考未来 500 天的人工智能话题。这是我发明的一个挑战,让自己一直思考这个话题,分享我的想法。
这是受电影《夏日 500 天》的启发,主角试图找出爱情失败的原因,并在此过程中重新发现他生活中真正的激情。
数据科学领域的每个人都有冒名顶替综合症,不管怎样,做一个领导者吧
作为一名领导者,我如何利用我的冒名顶替综合症来提升自己。
Photo by Jessica Rockowitz on Unsplash
“永远不要拿自己和别人比较。只拿今天的你和前一天的你做比较。”
― 未知作者
我和一位前雇员就她目前的职位进行了一次随意的交谈。我们拐弯抹角地谈到了领导力。当她告诉我,我是我们组织中最好的领导者时,她说有一些好的领导者,但我是她所知道的唯一一个“伟大的领导者”,这几乎是漫画家的双重转折。
我立刻想到了两个想法。首先,这是令人难以置信的谦逊和善良。第二,她错了——或者至少,她不可能是诚实的。
正是这种第二种想法经常在我们的脑海中出现。我们给它起了个名字叫“冒名顶替综合症”,因为它让我们觉得好像我们只是在假装别人对我们的期望,或者在我们身上看到的东西。我们相信任何时候我们都会被发现我们的欺诈行为。
这篇文章不是关于冒名顶替综合症的背景,它来自哪里,是什么原因造成的,如何治愈它——因为已经有太多关于这方面的文章了。
我想说的是,作为领导者,我们需要如何做好自己的工作,而不让冒名顶替综合症破坏我们的工作。根据我的经验,这不一定会使人虚弱,实际上可以积极地引导。
我的经历和其他人的经历很相似。如果我花些时间想想我在哪里,我经常觉得我随时都会被“发现”,每个人都会意识到我不适合我的工作或职位。在某些时候,我开始怀疑自己的想法。
最近尤其如此,因为我发现自己在领导一个数据科学团队,同时学习编码和机器学习的基础知识。然而,我自己的情况是一个很好的提醒,因为我看到了许多新的(和经验丰富的)数据科学家的自我怀疑和非理性的内疚,他们将自己比作神话中的独角兽。悄悄感叹他们不懂足够的编码,或者不够高级的统计,或者他们的数据可视化不都是四维的,交互的!
“我有什么资格做这些决定?!"“当我没有正确的答案,或者更有可能的是,当我给出错误的答案时,那些指望我的人会怎么样?”或者“他们意识到错误地把这件事托付给我只是时间问题。”
随着这些疑虑的蔓延,它们会导致焦虑,有时甚至是恐惧,这取决于情况的严重性。如果你对此耿耿于怀,它会给你的生活带来巨大的破坏,扼杀你成为一名有效领导者的能力。
两个回答
为什么?因为如果你屈服于对能力不足的恐惧,它会有两种结果。第一个反应是,你变得越来越关心自己的名声,变得“足够聪明”,有“正确的答案”,并且需要被咨询或负责做每一个决定。
这对一个团队和一个组织来说可能是毒药。我最不喜欢的表现方式是我所说的“信息囤积”。在信息囤积中,人们认为他们的权力与他们所知道的或他们对组织中重要信息的控制紧密相关。这可能看起来像人们不愿意分享他们的代码(或为他们为什么做出某些决定辩护),在其他领域,他们似乎不合理地捍卫他们的分析结论,而没有充分解释他们的方法。
他们最终试图控制谁知道什么,这可能是非常有害的。作为一名领导者,他们不会培训或授权员工,因为他们担心员工知道的会比他们多。作为同事,他们不值得信任,因为他们没有准确地告诉你他们在组织中的位置。
在这两种情况下,他们对组织的损害都超过了他们的信息所增加的价值。通常,他们认为他们的有用性和声誉的关键是依赖于这些信息。这种洞察力清楚地表明了真正发生了什么:自我怀疑和不安全感。
**第二个回答显然更加积极。同样对知识差距的恐惧会让你发现你需要在团队中学习更多的领域。它可以促使你花更多的时间与团队交谈,在你试图更多地了解他们的工作时,问一些关于他们工作的深刻问题。**或者你可以寻求外部学习,这必然会给团队带来外部视角和价值。
这种反应来自相同的情绪冲动,但是你决定以不同的方式采取行动是将它引向积极方向的关键。
决策
冒名顶替综合症的另一个方面是,你可能对做出一些你需要做出的决定没有信心。很好。一旦你身居要职,你应该感受到某些决定的分量。你应该反思自己对它们的直觉反应。随着你越来越远离组织的一线工作,这一点变得越来越真实。
再次强调,认识到这一点,但要克服这种不适。这就是为什么你在这个位置上…不是因为你知道所有的答案,而是因为别人不需要代替你做决定。
你的冒名顶替综合症也可以成为你的盟友。不要假装知道正确答案,而是依靠那些知道的人。这些人通常就是给你带来决策的人。
针对选择提出针对性的后续问题。询问选择的利弊。问问他们有什么推荐。问他们还有谁会有相反的意见。答案通常就在这段对话的某个地方。
以此为基础,从你的角度来看组织。然后做决定。你不会总是对的。但在许多情况下,一个最终错误的答案也比一个从未给出的答案要好。(另外,你从这些错误中学到了很多!)
恐惧不一定会让人瘫痪。关于冒名顶替综合症的文章、书籍和社交媒体帖子层出不穷,好的一面是,似乎每个人都不时会经历这种情况。
用它来加强你的自我意识
我喜欢冒名顶替综合症的另一个原因是,它驱使我每天都表现出最好的一面。当我担心自己不够好时,我会决定每天都努力变得更好。
为此,我为自己设定了具体的目标。它们看起来很小,但即使是朝着它们努力的行为,也能让你的态度从冒名顶替综合症的负面后果中恢复过来。我的清单很简单:
- 每天向我的团队学习一件事。
- 努力认识到自己的错误并从中吸取教训。
- 到处寻找我如何成为更好的领导者的正面和负面例子。
帮助我实现这些目标的一个策略是每天睡前写日记,检查我做得不够好的地方,或者遇到做了我想做的事情的人。如果我没有时间写日记,即使花十分钟向自己讲述一天的经历并强调一些重要的方面也会有所帮助。
在这些情况下,如果你试着从别人的角度而不是从你自己的角度来思考这些情况,这将有助于你打破自己只顾自己的叙述,尝试更客观地看待你的行为如何影响他人。
此外,每天我都会在我需要学习的数据科学技能清单上增加一个小项目。然后,我要么在业余时间找一个项目来做,要么在午休时间找一个小的练习会,在那里我可以把它分解成简单的步骤来帮助我更好地理解我的团队在做什么。
是对被发现的恐惧促使我变得更好。因为不是我的家人,社交媒体上的陌生人,或者我的故事的读者导致了我不够好的焦虑。是我团队中的人,那些指望我做好我的工作并在他们工作时给他们目的、方向、机会和感激的人。
我认为这是关键…引导你的冒名顶替综合症,让你变得比昨天更好。接受冒名顶替综合症强加的谦逊这一课,随时向团队中的任何人开放学习。
因为任何人都不可能开始学习他认为自己已经知道的东西——爱比克泰德《论文集》第二卷
每个人都需要自己的聊天机器人
个人聊天机器人将成为“第二个你”,当你不能或不愿意在线时,可以方便地管理你的在线状态
Friends Helping GIF By Pyx Health
聊天机器人自 1964 年就已经出现了,但直到 2016 年,当脸书向它们开放其 Messenger 平台时,聊天机器人才成为我们生活的数字世界中无处不在的一部分。
聊天机器人有几个名字,包括“数字对话”、“虚拟助手”和“互动人物”,但它们的功能是模拟计算机程序和人类用户之间的真实对话。它们的交互性、“真实”感和动态响应性使它们非常受欢迎。目前,据估计,仅在 Facebook Messenger 上就有超过 30 万个聊天机器人,仅在 2018 年就与约 14 亿人互动。
与只驻留在一个给定 URL(互联网地址)的网站不同,聊天机器人被设计为“生活”在多个平台上。例如,同一个聊天机器人可以同时存在于一个专用的 Facebook Messenger 频道和一个网站的弹出窗口中。在脸书于 2016 年向聊天机器人开放其 Messenger 平台后,几乎所有其他受欢迎的消息应用程序也这样做了,包括 Skype、Whatsapp、Kik、Twitter、Viber 和微信。
聊天机器人及其近亲语音助手也可以通过亚马逊广受欢迎的“智能扬声器”系列以及谷歌的家用设备和安卓手机和平板电脑访问。大多数人都熟悉语音助手,如 Siri、Alexa 和 Cortana,但这些都依赖于数十亿美元的人工智能引擎来执行功能。大多数语音助手“聊天机器人”在范围上要简单得多,例如猎犬,它允许你呼叫优步或访问你在 NPR 上的个性化新闻提要;莱拉,它允许你免提访问你的日历或你的音乐播放列表之一;以及 Butleroy ,它可以帮助你智能地响应会议和日程安排请求。
脸书——聊天机器人的栖息地
凭借早期的领先优势,脸书仍然是聊天机器人最受欢迎的“家”,包括“基于按钮的”和语音激活的聊天机器人。目前,大多数聊天机器人都服务于商业目的,据估计,到 2020 年,80%的企业将使用聊天机器人。即使是传统上最慢采用新技术的银行,也有望在 2020 年通过聊天机器人提供服务。然而,目前聊天机器人的主要业务用例是用于营销目的,如线索生成、线索资格和销售渠道,或者用于提供客户服务,特别是回答常见问题和提供基本信息,如您企业的地址、电话号码和营业时间。
脸书强烈鼓励使用聊天机器人。脸书的广告部门允许你购买直接点击聊天机器人的广告。考虑到聊天机器人的转换率明显高于电子邮件或直接营销等传统媒体,难怪如此多的企业采用聊天机器人。聊天机器人也可以用于电子商务目的,允许用户直接从聊天机器人内部购买物品。在美国等国家,至少有三分之一的成年人表示愿意直接从聊天机器人那里购买商品,而且这个数字预计还会增长。
除了直接在脸书的 Messenger 应用上运行,脸书还允许聊天机器人直接在脸书页面上“直播”。这使得企业无论在哪里都能联系到他们的客户,无论是通过 Messenger 应用程序直接一对一,还是在企业的脸书页面上留下评论。在过去的两年里,脸书已经显著升级了聊天机器人提供这种多通道响应的能力,赋予聊天机器人更大的权力和范围。由于聊天机器人一年 365 天,一天 24 小时工作,它们“永远在线”,无论何时何地在线,都能联系到客户。
但是,虽然聊天机器人被设计成可以在脸书上无缝运行,但底层代码实际上并不存在于脸书的平台上。要让一个聊天机器人在脸书上运行,你要么需要主持并自己编写代码,要么使用流行的聊天机器人框架,提供诸如 Chatfuel 或 Manychat 之类的服务。这些平台专为不知道如何编码或只是想避免编写代码所需的费用和时间的聊天机器人构建者设计,每个人都可以快速轻松地创建聊天机器人。
Chat Conversation GIF By Madebydot
运行聊天机器人
Chatfuel 成立于 2015 年,最初设计用于 Telegram(当时唯一允许聊天机器人的消息应用程序),现在只为脸书聊天机器人提供支持。通过一个直观的拖放式构建系统,任何人都可以创建一个聊天机器人,并在几分钟内将其安装并运行在脸书上。Chatfuel 提供了一个免费层,允许您的 chatbot 与多达 5,000 名用户进行交互,在需要升级到付费订阅计划之前,可以充分发挥其所有功能。Chatfuel、Manychat、Mobile Monkey 和他们的数百个竞争对手提供免费模板,你可以很容易地修改这些模板以满足你的需求。
对于懂一点编码的聊天机器人创建者来说,更强大的聊天机器人框架存在,其中最受欢迎的是谷歌的 DialogFlow ,IBM 的 Watson ,以及微软的 Bot 框架。虽然缺点是它们需要更多的技术知识来启动和运行聊天机器人,但这些框架通常允许更多的集成或能够将同一个聊天机器人插入许多渠道,包括社交消息应用程序、网站、移动应用程序内部,甚至通过 Twilio 等手机短信服务。
无论是像 Chatfuel 这样的拖放界面,还是像 DialogFlow 这样的动手编码框架,聊天机器人都依赖于一种叫做 API 的东西,以便提供更丰富、更动态的体验。API 是一种允许在不同网站或互联网服务之间交换信息的协议。例如,一个推荐附近餐馆的聊天机器人可能会使用谷歌地图的 API 来查找您当前位置附近的餐馆,并与 Yelp 的 API 进行交叉索引,以找到该地区排名最高的餐馆。由于 API 请求必须精确编码才能工作,这使得大多数高级聊天机器人对于大多数人来说过于复杂。
聊天机器人不仅用于商业
但是聊天机器人不仅仅是简单的商业应用。一些最受欢迎的聊天机器人提供服务,如提供定制的天气预报或玩游戏,如问答游戏。聊天机器人最有趣的新兴用途之一是充当个人化身。聊天机器人的未来不是作为企业的“代言人”或可以玩游戏或提供信息的匿名服务,而是作为个人的替身。
一家利用这一新趋势的公司是 AIBRO。虽然目前只有测试版,但 AIBRO 计划为个人用户提供创建无代码聊天机器人的能力,以作为他们的个人化身。想象一下,有一个聊天机器人知道你的朋友、家人和同事之间的区别,并且能够根据你自己独特的输入同时与他们进行智能对话。
Introducing AIBRO, personal chatbot creation system
与手机拥有量激增同时出现的是一种被称为或“害怕错过”的现象因为总有一些有趣的事情在某个地方发生,不可能有一个人能够跟上,导致 FOMO 对某些事情的焦虑。现在,无论人们在哪里,都可以一天 24 小时联系到 T4,同样,许多人也希望总是得到回应。此外,人们被期望回复来自任何人的所有信息,不管它们的优先级如何。
AIBRO 的使命是让个人能够不必担心 FOMO,同时也能够在最方便的时候回复消息。此外,由于并非所有消息都具有相同的优先级,即一些消息可能被视为垃圾邮件、低优先级消息或来自您现在不想回复的人的消息,因此 AIBRO 的聊天机器人将允许个人自动回复这些消息,同时过滤掉需要单独处理的优先级较高的消息。换句话说,AIBRO 的聊天机器人将允许你自动回复你讨厌的叔叔或垃圾邮件业务,敦促你注册他们的服务,同时让你手动回复更高优先级的事情,如来自你母亲的消息或当前的爱情兴趣。
个人聊天机器人:下一步是什么?
在不久的将来,很可能每个人都将拥有一个可以智能回复信息的个人聊天机器人。对于潜在的雇主来说,个人聊天机器人可以回复用户的简历(CV),并回答有关用户经验和技能水平的问题。对于家庭成员和亲密朋友,个人聊天机器人将能够回复状态更新。个人聊天机器人将能够过滤掉垃圾短信或任何被认为是令人讨厌的东西,这些东西还没有达到完全屏蔽或静音的水平。个人聊天机器人将成为“第二个你”,当你不能或不愿意在线时,它可以让你高效方便地管理你的在线状态。
尽管聊天机器人在各种网络媒体上越来越受欢迎,但它的未来才刚刚开始。人们可以想象这样一个世界,你自己的个人聊天机器人不仅可以与商业聊天机器人互动,还可以与其他人的个人聊天机器人互动。聊天机器人将有助于了解你的个人偏好,为你带来精确定制的新闻和信息,并让你更容易与其他人交流。简而言之,聊天机器人将很快帮助你减少总是在线的需求,给你带来你想要的准确信息(包括个人信息)——以及你想要的时间。在短短的几年内,问题将不再是你是否有一个私人聊天机器人,而是你如何在没有聊天机器人的情况下生活。
数据科学家应该了解的关于数据管理的一切*
(*但不敢问)
NIST Big Data Taxonomy (Source: WikiCommons)
要成为一名真正的“”数据科学家,或者许多博客作者和雇主所说的“独角兽”,你必须掌握数据科学过程的每一步——从存储数据到将成品(通常是预测模型)投入生产。但大部分数据科学培训侧重于机器/深度学习技术;数据管理知识通常被认为是事后的想法。数据科学学生通常通过存储在笔记本电脑上的文本文件中经过处理和清理的数据来学习建模技能,而忽略了数据香肠是如何制作的。学生们通常没有意识到,在行业环境中,从各种来源获取原始数据为建模做准备通常是 80%的工作。由于企业项目通常涉及大量数据,而他们的本地机器无法处理这些数据,因此整个建模过程通常发生在云中,大部分应用程序和数据库托管在其他地方数据中心的服务器上。即使学生找到了一份数据科学家的工作,数据管理也常常成为一个独立的数据工程团队负责的事情。因此,太多的数据科学家对数据存储和基础设施知之甚少,这往往会损害他们在工作中做出正确决策的能力。本文的目标是提供一个路线图,说明 2019 年的数据科学家应该了解的数据管理知识——从数据库类型、数据存储和处理的位置和方式,到当前的商业选项——以便有抱负的“独角兽”可以自己更深入地探索,或者至少学到足够的知识,以便在面试和鸡尾酒会上听起来像一个独角兽。
非结构化数据和大数据工具的兴起
IBM 305 RAMAC (Source: WikiCommons)
数据科学的故事实际上是数据存储的故事。在前数字时代,数据存储在我们的头脑中、泥板上或纸上,这使得汇总和分析数据极其耗时。1956 年,IBM 推出了第一台带磁性硬盘的商用计算机, 305 RAMAC 。整个装置需要 30 英尺 x 50 英尺的物理空间,重量超过 1 吨,公司可以以每月 3200 美元的价格租赁该装置,存储高达 5 MB 的数据。自那以来的 60 年里,DRAM的每千兆字节价格从 1965 年的 26.4 亿美元降至 2017 年的 4.9 美元。除了价格大幅降低之外,数据存储也变得更密集/更小。305 RAMAC 中的磁盘每平方英寸存储 100 位,相比之下,今天典型的磁盘每平方英寸存储超过 1 万亿位。
数据存储成本和规模的大幅降低使当今的大数据分析成为可能。凭借超低的存储成本,构建数据科学基础架构以从海量数据中收集和提取见解成为企业的一种有利可图的方法。随着不断生成和传输用户数据的物联网设备的大量出现,企业正在收集越来越多的活动数据,从而创造出大量高容量、高速度和高多样性的信息资产(或大数据的“三个 v”)。这些活动中的大多数(例如,电子邮件、视频、音频、聊天消息、社交媒体帖子)都会产生非结构化数据,这些数据几乎占当今企业数据总量的 80%,并且在过去十年中其增长速度是结构化数据的两倍。
125 Exabytes of enterprise data was stored in 2017; 80% was unstructured data. (Source: Credit Suisse)
这种大规模数据增长极大地改变了数据存储和分析的方式,因为传统的工具和方法无法应对“大数据的三个 v”新技术的发展能够以更快的速度和更低的成本处理不断增长的数据量和数据种类。这些新工具还对数据科学家的工作方式产生了深远的影响,使他们能够通过执行分析和构建以前不可能实现的新应用程序来利用海量数据。以下是我们认为每个数据科学家都应该了解的主要大数据管理创新。
关系数据库& NoSQL
关系数据库管理系统 (RDBMS)出现于 20 世纪 70 年代,将数据存储为具有行和列的表格,使用结构化查询语言(SQL)语句来查询和维护数据库。关系数据库基本上是表的集合,每个表都有一个严格定义它们存储的数据的属性和类型的模式,以及标识特定列或行以便于访问的键。RDBMS 曾经被甲骨文和 IBM 统治,但是今天许多开源选项,像 MySQL 、 SQLite 和 PostgreSQL 一样流行。
RDBMS ranked by popularity (Source: DB-Engines)
由于一些非常吸引人的特性,关系数据库在商业世界中找到了一个家。数据完整性在关系数据库中是绝对重要的。RDBMS 满足了原子性、一致性、隔离性和持久性(或 ACID 兼容)的要求,它通过施加许多约束来确保存储的数据是可靠和准确的,这使它们成为跟踪和存储诸如帐号、订单和支付等事物的理想选择。但是这些限制伴随着代价高昂的权衡。由于模式和类型的限制,RDBMS 在存储非结构化或半结构化数据方面非常糟糕。僵化的模式也使得 RDBMS 的建立、维护和发展更加昂贵。建立一个 RDBMS 需要用户事先有具体的用例;对模式的任何改变通常都是困难且耗时的。此外,传统的 RDBMS 被设计成在单个计算机节点上运行,这意味着当处理大量数据时,它们的速度要慢得多。分割 RDBMS 以便在保持 ACID 合规性的同时进行水平扩展也极具挑战性。所有这些属性使得传统的 RDBMS 不适合处理现代大数据。
到 2000 年代中期,现有的 RDBMS 不再能够处理一些非常成功的在线业务的不断变化的需求和指数级增长,因此开发了许多非关系型(或 NoSQL)数据库(下面是一个关于脸书在数据量开始增长时如何处理 MySQL 的局限性的故事)。当时没有任何已知的解决方案,这些在线企业发明了新的方法和工具来处理他们收集的大量非结构化数据:谷歌创建了 GFS 、 MapReduce 和BigTable;亚马逊创造了dynamo db;雅虎创造了Hadoop;脸书创造了卡珊德拉和蜂巢;LinkedIn 创造了卡夫卡。这些企业中的一些开源他们的工作;一些发表了研究论文,详细介绍了他们的设计,导致了数据库与新技术的扩散,NoSQL 数据库成为行业中的主要参与者。
An explosion of database options since the 2000’s. Source: Korflatis et. al (2016)
NoSQL 数据库与模式无关,并提供存储和操作大量非结构化和半结构化数据所需的灵活性。用户不需要知道在设置期间将存储什么类型的数据,并且系统可以适应数据类型和模式的变化。NoSQL 数据库旨在将数据分布在不同的节点上,通常具有更好的水平伸缩性和容错性。然而,这些性能优势也是有代价的——NoSQL 数据库不符合 ACID 标准,并且不能保证数据的一致性。相反,它们提供“最终一致性”:当旧数据被覆盖时,它们会返回暂时有点错误的结果。例如,谷歌的搜索引擎索引不能在人们同时搜索给定术语时覆盖其数据,因此当我们搜索时,它不会给我们最新的结果,但它会给我们最新的、最好的答案。虽然这种设置在数据一致性绝对必要的情况下(比如金融交易)是行不通的;对于需要速度而不是精确的任务来说,这很好。
现在有几种不同种类的 NoSQL,每一种都有特定的用途。键值存储,如 Redis 、 DynamoDB 和 Cosmos DB ,只存储键值对,并提供检索与已知键相关的值的基本功能。当速度很重要时,它们最适合简单的数据库模式。宽列存储,如 Cassandra 、 Scylla 和 HBase ,将数据存储在列族或表中,用于管理大型分布式系统中数 Pb 的数据。文档存储,如 MongoDB 和 Couchbase ,以 XML 或 JSON 格式存储数据,以文档名为键,以文档内容为值。这些文档可以包含许多不同的值类型,并且可以嵌套,这使得它们特别适合跨分布式系统管理半结构化数据。图形数据库,如 Neo4J 和 Amazon Neptune ,将数据表示为相关节点或对象的网络,以便于数据可视化和图形分析。图形数据库对于分析异构数据点之间的关系特别有用,比如在欺诈预防或脸书的朋友图中。
MongoDB 是目前最受欢迎的 NoSQL 数据库,它为那些一直在努力用传统 RDBMS 方法处理非结构化数据的企业带来了巨大的价值。下面是的两个行业例子:大都会人寿花费数年试图在 RDBMS 上建立一个可以处理其所有保险产品的中央客户数据库后,内部黑客马拉松的某人在几小时内用 MongoDB 建立了一个,并在 90 天内投入生产。市场研究公司 YouGov 每小时收集 5g 数据,通过从 RDBMS 迁移到 MongoDB,节省了 70%的存储容量。
数据仓库,数据湖,&数据沼泽
随着数据源的不断增长,使用多个数据库执行数据分析变得效率低下且成本高昂。20 世纪 80 年代的出现了一种叫做数据仓库的解决方案,它将企业所有数据库中的数据集中起来。数据仓库通过创建来自不同来源(内部和外部)的单一数据存储库,支持数据从运营系统流向分析/决策系统。在大多数情况下,数据仓库是一种关系数据库,它存储经过处理的数据,这些数据是为收集业务洞察力而优化的。它收集来自事务系统和业务应用程序的具有预定结构和模式的数据,这些数据通常用于运营报告和分析。
但是,由于进入数据仓库的数据需要在存储之前进行处理,对于今天的大量非结构化数据,这可能需要大量的时间和资源。作为回应,企业开始在维护数据湖2010 年的,这些数据湖存储了企业任何规模的所有结构化和非结构化数据。数据湖存储原始数据,无需首先定义数据结构和模式就可以建立数据湖。数据湖允许用户运行分析,而不必将数据移动到单独的分析系统,使企业能够从以前无法进行分析的新数据源中获得洞察力,例如通过使用来自日志文件、点击流、社交媒体和物联网设备的数据构建机器学习模型。通过使所有企业数据随时可供分析,数据科学家可以回答一系列新的业务问题,或者用新数据解决旧问题。
Data Warehouse and Data Lake Comparisons (Source: AWS)
数据湖体系结构的一个常见挑战是,如果没有适当的数据质量和治理框架,当数 TB 的结构化和非结构化数据流入数据湖时,对其内容进行分类通常会变得极其困难。数据湖可能会变成数据沼泽,因为存储的数据变得太乱而无法使用。许多组织现在呼吁更多的数据治理和元数据管理实践,以防止数据沼泽的形成。
分布式&并行处理:Hadoop、Spark、& MPP
虽然存储和计算需求在过去几十年中飞速增长,但传统硬件并没有跟上发展的步伐。企业数据不再适合标准存储,处理大多数大数据分析任务所需的计算能力可能需要几周、几个月,或者根本不可能在标准计算机上完成。为了克服这一缺陷,许多新技术发展到包括多台计算机协同工作,将数据库分布到数千台商用服务器上。当一个计算机网络被连接并一起工作来完成相同的任务时,这些计算机就形成了一个集群。一个集群可以被认为是一台单独的计算机,但是它可以显著地提高性能、可用性和可伸缩性,而不是一台更强大的机器,并且通过使用商用硬件来降低成本。 Apache Hadoop 是分布式数据基础设施的一个例子,它利用集群来存储和处理大量数据,并支持数据湖架构。
Evolution of database technologies (Source: Business Analytic 3.0)
当你想到 Hadoop 时,想想“分发”Hadoop 由三个主要组件组成:Hadoop 分布式文件系统(HDFS),一种跨多个(分布式)物理硬盘存储和跟踪你的数据的方式;MapReduce,一个跨分布式处理器处理数据的框架;还有另一个资源协商器(YARN),它是一个集群管理框架,协调诸如 CPU 使用、内存和网络带宽在分布式计算机之间的分配。Hadoop 的处理层是一项特别值得注意的创新: MapReduce 是一种两步计算方法,用于以可靠、容错的方式处理分布在大型商用硬件集群中的大型(多 TB 或更大)数据集。第一步是将您的数据分布在多台计算机上(Map ),每台计算机对其数据片并行执行一次计算。下一步是以成对的方式组合这些结果(Reduce)。谷歌在 2004 年发表了一篇关于 MapReduce 的论文,这篇论文被雅虎程序员采用,他们于 2006 年在开源的 Apache 环境中实现了这篇论文,为每个企业提供了使用商用硬件存储前所未有的海量数据的能力。尽管这一想法有许多开源实现,但谷歌品牌名称 MapReduce 仍然存在,有点像 Jacuzzi 或 Kleenex。
Hadoop 是为迭代计算而构建的,在单次操作中从磁盘扫描大量数据,将处理分布在多个节点上,并将结果存储回磁盘。在传统数据仓库环境中需要 4 个小时运行的查询 zettabytes 的索引数据,使用 Hadoop 和 HBase 可以在 10-12 秒内完成。Hadoop 通常用于生成复杂的分析模型或大容量数据存储应用,如回顾性和预测性分析;机器学习和模式匹配;客户细分和流失分析;和活动档案。
但是 MapReduce 批量处理数据,因此不适合处理实时数据。阿帕奇 Spark 于 2012 年建造,以填补这一空白。Spark 是一个并行数据处理工具,它通过处理内存中的数据来优化速度和效率。它在相同的 MapReduce 原理下运行,但通过在内存中完成大部分计算,并且仅在内存满或计算完成时写入磁盘,运行速度要快得多。这种内存计算允许 Spark“在内存中运行程序的速度比 Hadoop MapReduce 快 100 倍,在磁盘上快 10 倍。”然而,当数据集如此之大以至于RAM 不足成为一个问题(通常数百 GB 或更多)时,Hadoop MapReduce 可能会优于 Spark。Spark 还拥有一套广泛的数据分析库,涵盖了广泛的功能: Spark SQL 用于 SQL 和结构化数据; MLib 用于机器学习, Spark Streaming 用于流处理, GraphX 用于图形分析。由于 Spark 的重点是计算,它没有自带存储系统,而是运行在各种存储系统上,如亚马逊 S3、Azure 存储、Hadoop 的 HDFS 和 T21。
In an MPP system, all the nodes are interconnected and data could be exchanged across the network (Source: IBM)
Hadoop 和 Spark 并不是唯一利用集群处理大量数据的技术。另一种流行的分布式查询处理计算方法叫做大规模并行处理(MPP) 。与 MapReduce 类似,MPP 将数据处理分布在多个节点上,这些节点并行处理数据以获得更快的速度。但与 Hadoop 不同,MPP 用于 RDBMS,并利用了一种“无共享”架构 —每个节点都用多核处理器处理自己的数据片,这使得它们比传统的 RDBMS 快很多倍。一些 MPP 数据库,如 Pivotal Greenplum ,有成熟的机器学习库,允许数据库内分析。然而,与传统的 RDBMS 一样,大多数 MPP 数据库不支持非结构化数据,即使是结构化数据也需要一些处理来适应 MPP 基础设施;因此,为 MPP 数据库建立数据管道需要额外的时间和资源。由于 MPP 数据库符合 ACID 标准,并且速度比传统 RDBMS 快得多,因此它们通常用于高端企业数据仓库解决方案,如 Amazon Redshift、Pivotal Greenplum 和 Snowflake 。举一个行业例子,纽约证券交易所每天接收 4 到 5tb 的数据,并进行复杂的分析、市场监控、容量规划和监控。该公司一直在使用无法处理工作负载的传统数据库,加载该数据库需要数小时,并且查询速度很慢。迁移到 MPP 数据库后,他们的日常分析运行时间减少了 8 个小时。
云服务
另一项彻底改变企业大数据分析能力的创新是云服务的兴起。在云服务出现之前的糟糕日子里,企业必须从软件和硬件供应商那里购买内部数据存储和分析解决方案,通常需要支付前期永久软件许可费以及每年的硬件维护和服务费。除此之外,还有用于构建和维护内部基础架构的电力、冷却、安全、灾难保护、IT 员工等成本。即使存储和处理大数据在技术上是可能的,但大多数企业发现大规模存储和处理大数据的成本过高。使用内部基础架构进行扩展还需要大量的设计和采购流程,这需要很长的实施时间,并且需要大量的前期资金。因此,许多潜在的有价值的数据收集和分析的可能性被忽略了。
“As a Service” providers: e.g. Infrastructure as a Service (IaaS) and Storage as a Service (STaaS) (Source: IMELGRAT.ME)
当云服务在 2000 年代末推出时,内部部署模式开始迅速失去市场份额——在过去十年中,全球云服务市场每年增长 15%。云服务平台提供对各种服务(从虚拟计算到存储基础设施再到数据库)的订阅,通过互联网以现收现付的方式交付,为客户提供对灵活、低成本存储和虚拟计算资源的快速访问。云服务提供商负责所有硬件和软件的购买和维护,通常拥有庞大的服务器和支持人员网络来提供可靠的服务。许多企业发现,他们可以利用云服务显著降低成本和提高运营效率,并且能够利用现成的云资源及其内置的可扩展性更快地开发和生产产品。通过消除构建内部基础设施的前期成本和时间投入,云服务还降低了采用大数据工具的门槛,并有效地为中小型企业普及了大数据分析。
有几种云服务模式,公共云是最常见的。在公共云中,所有硬件、软件和其他支持基础设施都归云服务提供商所有和管理。客户与其他“云租户”共享云基础设施,并通过 web 浏览器访问他们的服务。一个私有云通常由具有特殊安全需求的组织使用,如政府机构和金融机构。在私有云中,服务和基础架构仅由一个组织专用,并在私有网络上维护。私有云可以是内部的,也可以由其他地方的第三方服务提供商托管。混合云将私有云与公共云结合起来,让组织能够获得两者的优势。在混合云中,数据和应用程序可以在私有云和公共云之间移动,以获得更大的灵活性:例如,公共云可以用于高容量、低安全性的数据,而私有云可以用于敏感的关键业务数据,如财务报告。多云模式涉及多个云平台,每个平台提供一个特定的应用服务。为了实现组织的目标,多云可以是公共云、私有云和混合云的组合。组织通常选择云计算来满足其特定的业务、位置和时间需求,并避免供应商锁定。
案例研究:为推荐应用初创公司构建端到端数据科学基础设施
Machine learning packages for different types of data environment (Source: Kosyakov (2016))
构建一个可行的数据科学产品不仅仅是用 scikit-learn 构建一个机器学习模型,酸洗它,并将其加载到服务器上。它需要了解企业生态系统的所有部分如何协同工作,首先是数据从哪里/如何流入数据团队,数据处理/转换的环境,企业可视化/呈现数据的约定,以及模型输出如何转换为其他一些企业应用程序的输入。主要目标包括建立一个易于维护的过程;其中模型可以被迭代并且性能是可再现的;模型的输出可以很容易地被其他涉众理解和可视化,以便他们可以做出更明智的商业决策。实现这些目标需要选择正确的工具,以及了解业内其他人在做什么和最佳实践。
让我们用一个场景来说明:假设你刚刚被一家度假推荐应用初创公司聘为首席数据科学家,该公司预计每天从用户那里收集数百千兆字节的结构化(客户资料、温度、价格和交易记录)和非结构化(客户的帖子/评论和图像文件)数据。您的预测模型将需要每周用新数据重新训练,并根据需要即时提出建议。既然你希望你的应用能大获成功,那么你的数据收集、存储和分析能力就必须是高度可扩展的。你将如何设计你的数据科学过程和生产你的模型?完成工作需要哪些工具?因为这是一家初创公司,而你是首席——也许是唯一的——数据科学家,所以这些决策就由你来做。
首先,您必须弄清楚如何建立数据管道,从数据源接收原始数据,处理数据,并将处理后的数据提供给数据库。理想的数据管道具有较低的事件延迟(能够在收集数据后立即查询数据);可扩展性(能够随着产品的扩展处理大量数据);交互式查询(支持批处理查询和较小的交互式查询,允许数据科学家探索表和模式);版本控制(在不关闭管道和丢失数据的情况下对管道进行更改的能力);监控(当数据停止进入时,管道应该生成警报);和测试(不间断地测试管道的能力)。也许最重要的是,它最好不要干扰日常业务运营——例如,如果您正在测试的新模型导致您的运营数据库陷入停顿,就会有人被解雇。构建和维护数据管道通常是数据工程师的责任(有关更多详细信息,本文对为初创公司构建数据管道进行了出色的概述),但数据科学家至少应该熟悉该过程、其局限性以及访问已处理数据进行分析所需的工具。
接下来,您必须决定是建立内部基础设施还是使用云服务。对于初创公司来说,当务之急是在不增加运营资源的情况下扩展数据收集。如前所述,内部基础设施需要巨大的前期和维护成本,因此云服务往往是初创公司的更好选择。云服务允许根据需求进行扩展,并且只需要最少的维护工作,因此您的小型员工团队可以专注于产品和分析,而不是基础架构管理。
Examples of vendors that provide Hadoop-based solutions (Source: WikiCommons)
为了选择云服务提供商,您必须首先建立分析所需的数据,以及最适合这些数据类型的数据库和分析基础架构。由于在您的分析管道中既有结构化数据又有非结构化数据,您可能希望建立一个数据仓库和一个数据湖。数据科学家需要考虑的一件重要事情是,存储层是否支持构建模型所需的大数据工具,以及数据库是否提供有效的数据库内分析。例如,一些 ML 库(如 Spark 的 MLlib)不能有效地与作为数据主要接口的数据库一起使用——数据必须在操作之前从数据库中卸载,随着数据量的增长,这可能会非常耗时,并且当您必须定期重新训练您的模型时,这可能会成为一个瓶颈(从而导致另一个“头重脚轻”的情况)。
对于云中的数据科学,大多数云提供商都在努力开发自己的本机机器学习能力,使数据科学家能够利用存储在自己平台上的数据轻松构建和部署机器学习模型(亚马逊有 SageMaker ,谷歌有 BigQuery ML ,微软有 Azure Machine Learning )。但是这些工具集仍在开发中,并且经常不完整:例如, BigQuery ML 目前只支持线性回归、二元和多类逻辑回归、K-means 聚类和 TensorFlow 模型导入。如果您决定使用这些工具,您必须彻底测试它们的能力,以确保它们做您需要它们做的事情。
选择云提供商时要考虑的另一个主要问题是供应商锁定。如果您选择专有的云数据库解决方案,您很可能无法访问本地环境中的软件或数据,并且转换供应商需要迁移到不同的数据库,这可能成本高昂。解决这个问题的一个方法是选择支持开源技术的厂商(这里是网飞解释他们为什么使用开源软件)。使用开源技术的另一个优势是,它们往往会吸引更大的用户群体,这意味着您可以更容易地雇佣有经验和技能的人在您的基础设施中工作。解决这个问题的另一种方法是选择第三方供应商(如 Pivotal Greenplum 和 Snowflake ),它们使用其他主要的云提供商作为存储后端来提供云数据库解决方案,这也允许您在多个云中存储数据,如果这符合您的创业公司的需求。
最后,既然你希望公司发展壮大,你就必须实施一个强大的云管理实践来保护你的云并防止数据丢失和泄露——比如管理数据访问和保护接口和 API。您还需要实施数据治理最佳实践来维护数据质量,并确保您的数据湖不会变成数据沼泽。
如您所见,企业数据科学项目中有比调整机器学习模型中的超参数更多的东西!我们希望这种高层次的概述已经让您兴奋地学习更多关于数据管理的知识,并可能学到一些东西来打动饮水机旁的数据工程师。
免责声明:本文表达的观点是我们自己的观点,不代表我们过去或现在雇主的观点。
关于 Javascript 对象的一切
Object in Javascript
近JavaScript 中的一切都是除了之外的对象六个是不是对象是——***null***
、***undefined***
、、字符串、、数字、、布尔、、符号、。这些被称为原始值或原始类型。****
任何不是原始值的东西都是一个对象。这包括数组、函数、构造函数和对象本身。
是啊!函数和数组也是对象,我们将在本文后面看到。
目标
从概念上讲,对象在所有编程语言中都是一样的,也就是说,它们代表了我们希望在程序中用特征/属性和方法来表示的真实世界的事物。
例如,如果你的对象是一个学生,那么它将拥有姓名、年龄、地址、id 等属性和updateAddress
、updateName
等方法。
在 JavaScript 中,把一个对象想象成一个包含条目的列表,列表中的每个条目(一个属性或一个方法)都由一个键值对存储在内存中作为引用。
让我们看一个对象示例。
const firstObj = {
1: "deepak",
"age": 28
}
firstObj
是一个有 2 个属性 1,年龄和值为deepak
和28
的对象。
JavaScript 对象在创建方式上有些不同。对class
本身没有要求,可以使用文字符号来声明。
对象创建
在 javascript 中,我们可以用多种方式创建对象,让我们来看看每一种方式。
Object literal
(D \直接方式)。对象文字是用大括号括起来的逗号分隔的键值对列表。对象文字属性值可以是任何数据类型,包括数组文字、函数、嵌套对象文字或原始数据类型。
var student = {
id: 1,
name: "deepak",
age: "27",
updateAddress: () => {
// logic to update address
},
grade: ['A', 'A+', 'A']
}
注意:上面的学生对象键可以通过点符号访问,即
student.id
、student.name
或通过方括号符号访问,即student[‘id’]
、student[‘name’]
等
2.Object.create()
。方法使用旧对象的指定原型和属性创建新对象。
注意:每个 JavaScript 函数默认都有一个
prototype
对象属性(默认为空)。方法或属性可以附加到此属性。
// syntax - Object.create(prototype[, propertiesObject])
var newStudent = Object.create(student);
// this create a new object with old object added in its prototype // chain
下面是对象__proto__
的输出
Object in Javascript
我们现在可以使用我们在这里学习的方法向newStudent
对象添加新的属性和数据。
注意:
newStudent
将可以访问父student
对象的键和值,因为它已经被添加到了newStudent
原型链中,这是我们在 javascript 中进行继承的一种方式。也就是说,*newStudent*
会存储一个到*student*
对象的链接。当读取一个属性时,这个父对象也被参考。父级可以有父级,依此类推。重复这一过程,直到我们到达一个没有任何父对象的对象,即父对象是
null
。
3.Object Instance
。结合使用Object
构造函数和"new
"关键字允许我们初始化新的对象。
让我们看一个例子
const newObj = new Object();
newObj.name = ‘Deepak’;
newObj.location = ‘Delhi, India’;
然而,上述使用new Object()
的方法不太适合需要创建多个同类对象的程序,因为这将涉及为每个此类对象重复编写上述代码行。
为了处理这个问题,我们可以使用下一种方法
4.Object construtor
。当我们需要一种方法来创建一个可以多次使用的对象“类型”而不必每次都重新定义对象时,构造函数会很有用,这可以通过使用对象构造函数来实现。
让我们看一个例子
function Vehicle(name, model) {
this.name = name;
this.model = model;
}
let car1 = new Vehicle('Fiesta', '2019');
let car2 = new Vehicle('DC avanti', '2018');
我们创建了两个属性相同但值不同的对象。
5。 Object.assign()
。这是从其他对象创建新对象的另一种方法。
注意:我们将在下一部分讨论可枚举/所有权,所以请原谅我。
它将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。让我们通过一个例子来理解:
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
Object.assign()
有很多用例,比如对象克隆、合并对象等。
6。 Object.fromEntries()
。M 方法将一个键值对列表转换成一个对象。让我们看一个例子
const entries = new Map([
['foo', 'bar'],
['baz', 42]
]);const obj = Object.fromEntries(entries);console.log(obj);
// expected output: Object { foo: "bar", baz: 42 }
注意:创建对象的最好方法是通过文字符号,因为它在源代码中占用较少的空间。对于正在发生的事情,这是显而易见的,所以使用
new Object()
,您实际上只是输入了更多内容,并且(理论上,如果没有被 JavaScript 引擎优化)执行了一个不必要的函数调用。此外,文字符号在同一行代码中创建对象并分配属性,这与其他符号不同。
如何添加/更新和删除对象的属性
如前所述,对象的属性可通过点或括号符号添加。让我们看一个例子
const a = {};
a.name = 'deepak';
a['city'] = 'delhi';
a[1] = 'dope';
这里,name
和city
是对象属性。
一个对象只能包含一个具有一个值的键。我们不能让一个键有两个不同的值。
属性名可以是字符串、数字、特殊字符或动态属性,但如果属性名不是字符串,则必须用括号符号来访问。因此,如果我们需要访问上面例子中的属性*1*
,我们可以执行*a[1]*
,但是*a.1*
将返回一个语法错误。然而,属性情况,即*a.name*
或*a["name"]*
将会起作用。
a.first name = 'deepak' // will return syntax error
a['first name'] = 'deepak' // will work
要更新一个属性,我们可以再次使用上述两种符号类型。如果我们向已经创建的属性添加值,那么该值将被更新或创建。
a.city = 'new york';
上面将城市值从delhi
更新为new york
。
我们也可以通过像**Object.defineProperties()**
或 **Object.defineProperty()**
这样的Object
函数方法来创建和更新对象的属性
Object.defineProperties(a, {
pincode: {
value: 10012,
writable: true
},
property2: {}
});console.log(a.pincode); // 10012
要删除一个对象的属性,我们可以使用delete
关键字,我们可以同时使用这两种符号。
delete a['city'];
delete a.city;
如果成功删除属性,返回值delete
为true
。要不然就是false
。
你知道不允许属性更新或删除的方法吗?如果是,请在下面评论。如果不是,请不要担心,我会带着更多的问题深入下一篇文章。
如何迭代对象属性?
实际编码时会有这样的情况,我们想要访问所有的对象键值对。
使用循环——for in 和 for of 循环
对于中的 for,它遍历一个对象并逐个返回属性。
for (const key in a) {
console.log(key, a[key]);
}
Key 将一个接一个地拥有所有属性,a[key]
将返回值。For in 循环也迭代原型链,并且也将返回父键,所以如果您看到更多的键,请不要感到惊讶。为了避免看到更多的键,我们可以做一个hasOwnProperty
检查,只获取当前对象的键。
在的 for 的情况下,在可迭代对象上迭代。更多阅读请点击这里。
对象函数中有各种方法帮助访问对象属性和值,而不是原型链。
**Object.keys()**
或**Object.getOwnPropertyNames()**
。返回一个字符串键数组。
const keys = Object.keys(a)
// return ["name", "first name", "city", "1"];const newKeys = Object.getOwnPropertyNames(a);
// return ["name", "first name", "city", "1"];keys.map(key => console.log(a[key]));
// return ["deepak", "deepak", "new york", "dope"];
2。 **Object.values()**
。返回一个数值数组。
const keys = Object.values(a);// return ["deepak", "deepak", "new york", "dope"]
3。 **Object.entries()**
**。**返回一个由[key, value]
对组成的数组。
const data = Object.entries(a);// returns
[ ["1", "dope"], ["name", "deepak"], ["first name", "deepak"], ["city", "new york"]]
从上面我们可以看出,一个物体的属性出现的顺序并不是固定的。
如何检查对象中的属性存在
有三种方法可以检查对象中是否存在该属性。
- 使用
**hasOwnProperty**
。此方法返回一个布尔值,该值指示对象是否将指定的属性作为自己的属性,而不是父/继承属性。
console.log(a.hasOwnProperty(1)); // return true;
console.log(a.hasOwnProperty('1')); // return false;const b = Object.create(a); // this will add a as parent of b
console.log(b.hasOwnProperty(1)); // return false
注意:
*hasOwnProperty*
返回 true,即使属性的值是*null*
或*undefined*
。
如果我们在一个对象中使用
hasOwnProperty
作为属性名会怎么样?在下面评论你的想法。
2。在操作符中使用—****in**
操作符返回true
如果指定的属性在指定的对象或其原型链中,即在其父对象中。
console.log(1 in a); // return true;
console.log('1' in a); // return false;const b = Object.create(a); // this will add a as parent of b
console.log(b.hasOwnProperty(1)); // return true
注意:
*hasOwnProperty*
只检查当前对象属性,而*in*
运算符检查当前+父属性
3.使用定制的功能
通过自定义方法检查属性是否存在有多种方法。其中一个是通过Object.keys
获得的 eg。
Object.keys(a).indexOf(1) !== -1 // return true
在你的自定义方法下面写下注释来做同样的事情😃。
什么是按引用复制/共享和按值复制,它如何应用于对象?
不同之处在于,通过值,我们的意思是每次创建新的内存分配,而在引用的情况下,我们指向已经创建的内存空间。
在 javascript 的上下文中,所有的原始数据类型都是通过值方法分配内存的,对于一个对象来说,根据实现的不同,它可以通过值或引用进行复制。
// pass by value
let a = 5;
let b = a;a = 6;
console.log(b) // return 5 as each time a new memory is allocated// pass by reference
const a = {x: 1};
const b = a; a.x = 3;
console.log(b.x) // it returns 3 as its a shared memory between a and b
什么是对象的浅层和深层复制/克隆?
浅层拷贝和深层拷贝的核心区别在于如何将属性复制到新对象中。
在浅拷贝中,新对象与旧对象共享数据,即在上述示例中,使用=
创建a
对象的浅拷贝b
。所以按引用传递在大多数情况下是浅层拷贝。
此外,浅层副本将复制顶级属性,但嵌套对象在原始对象(源)和副本对象(目标)之间共享。
浅层复制的另一种方法是使用Object.assign()
,这将在开始部分讨论。让我们看看这个例子
let obj = {
a: 1,
b: {
c: 2,
},
}let newObj = Object.assign({}, obj);
console.log(newObj); // { a: 1, b: { c: 2} }
obj.a = 10;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 1, b: { c: 2} }newObj.b.c = 30;
console.log(obj); // { a: 10, b: { c: 30} }
console.log(newObj); // { a: 20, b: { c: 30} }
正如我们在上面的obj.b.c = 30
中看到的,这是Object.assign()
的一个缺陷。Object.assign
只做浅仿。newObj.b
和obj.b
共享对该对象的相同引用,因为没有制作单独的副本,而是复制了对该对象的引用。
在**深度复制中,**新对象将拥有自己的一组键-值对(与原始对象具有相同的值),而不是共享。
让我们来看看做深度复制的一些方法
JSON.parse(JSON.stringify(object))
let obj = {
a: 1,
b: {
c: 2,
},
}
let newObj = JSON.parse(JSON.stringify(obj));
obj.b.c = 20;
console.log(obj); // { a: 1, b: { c: 20 } }
console.log(newObj); // { a: 1, b: { c: 2 } } (New Object!)
上面的问题是我们不能复制值为undefined
或Symbol
的用户定义的对象函数或键。
let obj = {
a: 1,
b: {
c: 2,
},
d: () => {}
}
let newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj); // { a: 1, b: { c: 2 } } (New Object!)
此外,这种方法不适用于圆形对象。
注意:圆形对象是具有引用自身的属性的对象。
let obj = {
a: 'a',
b: {
c: 'c',
d: 'd',
},
}
obj.c = obj.b;
obj.e = obj.a;
obj.b.c = obj.c;
obj.b.d = obj.b;
obj.b.e = obj.b.c;
let newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj);
上面会抛出一个错误说converting circular structure to JSON.
2。使用 ES6 扩展运算符—
let obj = {
one: 1,
two: 2,
nested: {
three: 3
},
}
let newObj = { ...obj };
console.log(newObj); // { one:1, two:2, nested: {three: 3}}
(New Object!)
不过nested
还是被浅浅的抄了*。*
如何比较两个物体?
对象的相等操作符==
和严格相等操作符===
的工作方式完全相同,即只有当两个对象共享相同的内存引用时,它们才相等。
例如,如果两个变量引用同一个对象,则它们相等:
*const a = {};
const b = a;console.log(b == a); // return trueconst c = {};
console.log(c == a); //return false*
如果您想加入我的电子邮件列表,请考虑在这里输入您的电子邮件地址 和关注我的medium阅读更多关于 javascript 和Github的文章,查看我的疯狂代码。如果有什么不清楚或者你想指出什么,请在下面评论。
- Javascript 执行上下文和提升
- Javascript —生成器-产出/下一个&异步-等待🤔
- 理解 Javascript‘this’关键字(上下文)。
- Javascript 数据结构与映射、归约、过滤
- Javascript- Currying VS 部分应用
- Javascript ES6 —可迭代程序和迭代器
- Javascript —代理
- Javascript —作用域
如果你喜欢这篇文章,请随意分享,以帮助他人找到它!
谢谢!
把你的深度学习模型训练到一个 web app 之后的一切。
使用流行的 web 框架 Flask + Heroku 是一个云平台,可以帮助您轻松部署。
Frameworks For Deploying Any Model.
数据科学项目的一个常规生命周期是从一个用例开始,从我们想要解决的问题类型所需的所有来源中提取数据,分析数据并执行一些功能工程,构建一个统计模型以对未来数据进行良好的概括,并部署到生产和监控中,通常用于执行措施,并在需要时使用新数据重新训练模型**。**
但是,大多数时候,人们最终会停留在建立统计模型的阶段,他们不会将他们的模型放到互联网上进行真实世界的测试,因为 像前端和后端开发 这样的新技术技能需要学习将模型部署到网络中。
当然,有一些简单的方法可以做到这一点,这将使我们的工作变得更简单,即使你应该知道一些基本知识,甚至不到你第一次部署的 20%。在这篇文章中,您将学习如何做一个部署部分表单基础。
在开始这篇文章之前,让我用我用 flask 和 Heroku 构建的项目激励你们,欢迎你们来演示。
想知道你的植物感染了什么类型的疾病,然后上传一张(番茄、土豆)植物的图片并进入…
cropify.herokuapp.com](https://cropify.herokuapp.com/)
你将从这篇文章中学到什么。
- 训练后将模型权重保存到磁盘。
- 部署需要哪些技能?
- 设置和安装烧瓶。
- 下载一个不错的 html5 前端模板。
- 写代码上传到 Github。
- 部署到赫罗库。
1.保存模型权重。
大多数人都知道这一步,通常称之为序列化。在训练了一些问题解决用例的模型之后。每个人通常保存他们的整个模型(架构+权重+优化器状态),或者只保存他们选择的 python 或 API 库(Pickle,Keras)的权重,以防止再次训练模型。有一件事你应该知道,如果你想只保存重量,你需要在加载前将它的架构作为一个 JSON 或 YAML 文件,否则它会显示一个错误“只读模式”。
假设您已经完成了训练,并希望在几天后预测某个对象的省时模型将是一个好主意,因为无需再次训练,您可以简单地加载重量并进行预测。
2.部署所需的技能类型。
2.1 Web 框架。
你应该知道 web 框架的一些基础知识互联网上有很多可供选择的框架,如 Angular.js、Node.js 和 ASP.net,PHP 许多框架,但数据科学家也喜欢 python 和 R(经常用于统计分析),我们也可以使用最流行的 web 框架如 Django 和 Flask 用 python 编写 web 应用程序。
Flask 和 Django 是构建 web 应用的两个选择。
Flask vs Django.
当然,Flask 是一个轻量级的、完全灵活的 WSGI,易于学习和实现,但只用于小型和大型项目,但经常用于小型项目,每个人都喜欢它的简化版本。您只需 5 行代码就可以启动您的 web 应用程序。
Django 是一个每个人都喜欢的全栈框架,通常用于开发大型应用程序。几乎你可以做很多事情,但当你习惯它时,需要时间。它涉及一些相互关联的概念。所以,你需要在写代码之前学习这些。
结论: Flask 和 Django 有一些相似的概念。从 flask 开始它涵盖了基础知识,并且熟悉了一些概念,比如(模板和渲染)。通过 flask 开发了一些应用程序之后,你可以向 Django 过渡了。
2.2 HTML+CSS+Java Script 的一些基础知识。
是啊,前端和后端开发但是我们不会为 UI 部分和后台操作写太多代码。如果你不想让你的 web 应用程序有好的用户界面,这是完全可选的,在这种情况下,你不会太多地处理这种标记和样式,对于一个具有完全响应和异常处理的好看的网站,你需要学习一些概念。但是,相信我,会很简单的。我们只是从 bootstrap 网站或 html5 网站下载一个好看的模板。
只要对代码做一些修改,你就可以用你所有的东西创建并运行一个漂亮的网站。在几节之后,我们将在下面看到这一部分。
3.设置和安装烧瓶。
要安装 Flask,您需要 pip 或 conda(如果您已经安装)。在安装 flask 之前,你需要为你的 flask 项目创建一个虚拟环境,因为不会与库冲突。我们只使用我们的项目所需的任何库及其首选版本。因此,创建一个虚拟 env 将非常有用。
Pip install Flask
安装完成后,通过在终端中导入 jupyter notebook(或)中的 flask 库来检查它是否安装正确。
4.为你的项目获得一个好的 UI 模板。
您可能希望在 UI 中展示您的专业项目。然后你需要做一个前端的部分。幸运的是,我们在互联网上可以获得所有现成的代码下面列出的一些代码是完全免费的。
由@ajlkn 设计并在 Creative Commons 许可下发布的响应式 HTML5 和 CSS3 站点模板。
html5up.net](https://html5up.net/) [## 由引导团队构建和策划的引导主题。
Bootstrap Themes 是由 Bootstrap 的创建者策划的最好的模板和主题的集合。我们收集的…
themes.getbootstrap.com](https://themes.getbootstrap.com/)
Twitter Bootstrap 是一个使用 CSS 和 Javascript / jQuery 的工具包。这是一个前端框架,所有内置的 CSS 类,你只需要导入一个,它会为你的网站做所有的样式。您可以在没有太多 CSS 知识的情况下开始工作。**它还创建了一个响应迅速的网站。**当然你得懂 HTML(建站基础)。
选择一个最适合你的项目 UI 的模板,删除模板中你觉得没用的部分。
5.开始写代码。
首先,我将解释我正在部署的一个 web 应用程序的使用案例,该应用程序将有助于检测植物的疾病(仅针对番茄和马铃薯两个类别),分析并提供生物和化学补救措施,以克服损失并进一步控制受影响的植物。如果你对补救措施中的农业内容感到困惑,我收集了一些视频,通过位于结果附近的视频按钮,帮助你在实践中进行解释。
你可以在我下面的 Github 链接中找到上面项目的代码。我将一步一步地详细解释代码。
[## mani kanta-mun nangi/Keras-Custom-Model-Deployment-Using-Flask-And-Heroku
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/Manikanta-Munnangi/Keras-Custom-Model-Deployment-Using-Flask-And-Heroku)
首先,您应该知道 flask 项目中文件的结构。它将看起来像下面一个。
Flask files structure.
不用担心模特文件夹里的文件。你可以理解模型文件夹中的文件无非是模型权重(h5)、架构(JSON)和数据库(db。这些是我的项目文件,但开始时,你需要有文件夹。不要改变文件夹的名称,因为它们是 flask 想要的格式。
首先,两个文件夹是 pycache 和。vscode 用于 visual studio 代码(vs code)配置文件,它将在您在 visual studio 中编码时生成。所以,不用担心。
文件夹:
- Models == >模型权重、JSON 和任何数据库文件。
2.Static == >这是 CSS、javascript 文件以及 flask 中使用的图像将存储在该文件夹中的位置。
3.模板== >有 index.html(名字不用改)等 HTML 文件。
4.Uploads == >在进行预测之前,图像文件应该存储在某个文件夹中,就是这个。
文件:
app.py == >运行 flask 并在 web 服务器上工作的主要代码。
Procfile == >您使用 Procfile 来告诉 Heroku 如何运行您的应用程序的各种文件。
requirements.txt == >列出您的项目所使用的包,以便 Heroku 在上面安装 dynos(容器)。
。要忽略的 GitHub 文件。
。gitattributes == >大文件存储路径(Git LFS)当你想上传超过 100mb 的文件时,Git LFS 就派上了用场。
5.2 烧瓶脚本。
5 行代码就能让你的网络应用启动并运行。
烧瓶样板代码。
在 Index.html写 hello world 或任何要显示的文本。
<!doctype html>
<html>
<body>
<h1> Hello world</h1>
</body>
</html>
***@ app . route(‘/’)***其中@ decorator 用来包装另一个函数,扩展其他函数的行为。
渲染 _ 模板 渲染 Html 文件。 app.run()启动 webserver 并提供一个本地主机 URL。打开 http://127.0.0.1:5000/ 查看您的 web app,
烧瓶基础完成。编写模型预测函数。
在 app.py 文件中创建一个预测函数,该函数通过 flask 中的请求模块获取我们的图像,并用 model 对其进行处理,并将结果返回给 result.html 进行显示。
== >使用请求功能从 flask 模块获取图像文件。
== >将用户上传的图像保存到名为“上传”的文件夹中。在预测之前,它应该在内存中。
==> leaf_predict 是一个函数,返回用户上传的图片是否有叶子。这是使用卷积自动编码器完成的,我将在下一篇文章中讨论。如果返回变量是 leaf,那么我们的模型将开始预测,除非它不会。
==> Model_predict 函数用于对上传的图像进行预处理,我们接受了调整大小、图像到数组、标准化和扩展维度,然后编译和预测等方面的培训。
==> Info() 功能是从数据库文件中获取疾病信息(。sqlite)。它将在 model_predict 返回疾病名称后检索疾病信息。为了检索,我们编写代码来检查疾病名称和 SQLite 数据库疾病名称是否相同,如果相同,我们将疾病信息返回到结果页面。
==> 最后返回无…为什么??在’ POST ’ 方法之后,request.files 设置缺省为 None。
如果你想得到一个清晰的图片和更多的代码,你可以通过我的 Github 查看。
检查它将是超级简单的。这是一个大项目,所以我离开你审查剩余的代码和理解,所以你可以得到工作流。
5.3 输入表单的 Html 脚本。
用 Vs 代码或者你选择的任何 IDE 获取你下载的引导或者 Html 文件。
但是的主要部分是通过 Html 按钮获取图像数据,所以我们在提交表单数据后,应该调用 app.py 中的预测函数
表单数据 Html。
- < form action = “/predict” 功能用 POST 方法提交后进行唤起。
- “file”制作一个上传文件的按钮 **accept=" image/"** 只获取所有格式的图像,如(jpg,jpeg,png…)*
- 必需的变量在最后使得用户提交表单时必须输入图像。
- 最后,
5.4 Returning Results with Html.
After prediction, we want to display results it can be done with Html again. first, we need to pass the result through the “predict” function in the app.py to result.html file.
Results through Html.
result.html disease info code.
After Building entire model with flask .Now, it’s time to upload your work to Github.
- Uploading all code to Github for Heroku cloud 从 GitHub 获取代码,而不是使用 Heroku CLI 进行部署。
在把你的项目推给 Heroku 之前,你需要有两个 Heroku 需要的关于如何运行应用程序的文件。Procfile 和 requirements.txt
Procfile:
*web: gunicorn app:app --bind 0.0.0.0:$PORT*
- Gunicorn 是 Python 的开源 web 服务器。它允许 Heroku 部署我们的应用程序。你需要用 pip 安装它以防你没有安装。
- 我们让我们的服务器启动 app.py,使用 app name,Flask 的实例是第二个参数,第一个参数是 app 的名称。[app:app]= = >[app 的名称:它的 Flask 实例(name)]
**from* flask *import* Flaskapp = Flask(__name__)*
- 港口和主机将由 Heroku 负责。
Requirements.txt:
将项目中使用的所有包放入一个文件中。您可能知道这个命令
*pip freeze > requirements.txt*
冻结命令显示所有软件包及其当前版本。我们使用“>”操作符将冻结命令的结果复制到名为 requirements.txt 的文件
6.部署到赫罗库。
Heroku with Github.
有了 Heroku,工作变得更简单,因为它负责一切,因为它是一个平台即服务(PAAS)* 这意味着它确实设置了基础架构、预安装的操作系统和冗余服务器、运行时环境。除了一些您应该手动执行的步骤。***
要遵循的步骤:
- 通过 Heroku 官方网站创建一个 Heroku 账户。
- 登录后,创建应用程序。
Create a new app in Heroku.
3.将您的项目命名为 name.herokuapp.com,并将部署方法设置为 Github。****
Connect to Github.
4.这里,我们将我们的 GitHub 帐户与选择我们的项目存储库联系起来。****
***5.手动部署验证 procfile 并安装 requirements.txt 文件中的所有库压缩到 slug 编译器,负责将应用程序缩放到 dyno 以供执行。如果压缩到 *slug 后整个项目超过 300MB,您的应用程序停止处理您的应用程序。因为他们在有限的时间内限制了免费访问帐户的 slug 大小。
Look for Slug, buildpacks, and config settings.
6.我的 slug 大小低于 300MB,框架使用了 python 和 git LFS,链接到大型文件系统(LFS)的文件在 Heroku 中不受支持。****
- 所以我们需要将 configs 作为 key“HEROKU _ build pack _ GIT _ LFS _ REPO”添加到 value“https://@ github . com/username/repository . GIT”令牌是唯一的个人访问令牌。
- 你需要在 GitHub >设置> Heroku 的开发者设置中注册,才能访问你的 LFS 文件,还需要链接到 buildpacks 来安装 https://github.com/raxod502/heroku-buildpack-git-lfs.git 的 LFS。
7.最后,点击 deploy 部分的 deploy 按钮,您就完成了您的项目,人们可以通过互联网访问。****
Finally, Deploy.
如果你有任何错误,很好地解决日志和调试你的错误,谷歌它,你一定会得到解决方案。
需要记住的要点:
- 如果你是一个学习基础知识的初学者,使用 flask 框架。
- 使用来自 bootstrap 或 html5.net 网站的模板,它们是免费的。根据您的项目对模板进行更改。
- 开始和 Heroku 一起工作,这看起来很容易,因为你经常工作。
- 最后,试着做一些能提升你技能的项目,从小项目中获得核心基础知识,然后再去做大项目。
这是一篇很长的文章,我希望你们喜欢它,并从这篇文章中学到了一些基础知识。尝试使用我的 GitHub 中的代码。我很快又想出了另一篇文章。
快乐学习:)
一切都是数据
为什么我们需要数据来改善世界?
坐在我的客厅里,我和我的朋友们争论哪些专业可以保证一个人拿到最好的薪水。我争辩说任何工程相关的专业都提供最好的薪水,而我的朋友说是商业。
我们决定在谷歌上搜索哪个专业工资最高,但谷歌搜索提供了模糊的结果,因为不同的文章选择了任何一方。因此,我们对“哪个专业薪水更高”这个问题感到困惑。商科还是工科?”
因此,我在 Kaggle 上寻找数据集,希望找到一个数据集来探索并找到问题的答案。幸运的是,我找到了两个数据集,而不是一个。第一个是基于专业的薪资数据集,而第二个是基于学院区域的薪资数据集。
结合这两个数据集并对其进行分析,我们发现在加州拥有一个工程专业可能会提供最好的起薪。人们还发现,在美国东北部地区,工程专业的学生可能提供最好的职业中期工资。
回顾我的这个迷你项目,我看到了如何利用数据来回答我们每天都感兴趣的问题的力量。数据科学是一个可以用来教人们如何分析数据的领域,以便对如何改善我们周围的世界有更好的想法。
为什么是数据科学?
数据以多种格式存在,可以通过不同的方法收集。一旦它们被收集起来,人们可以分析和探索它们,以找出如何改善生活的不同方面,从体育到创新。
通过找出他们无能背后的原因,公司可以使用树形分类器来找出他们做错了什么。公司还可以利用销售和业绩的结果来预测他们能从某一特定受众身上赚多少钱。
利用数据科学来改善我们生活的世界是深不可测的。作为人类,我们发现数据科学可以用来回答以前没有答案的问题。为了回答这些问题,近年来越来越多的人涌入数据科学领域。
尽管大量的人正在成为数据科学家,但数据科学领域仍然有大量的职位空缺。《哈佛商业评论》在一篇文章中将数据科学命名为 21 世纪最性感的工作之一,这是因为它令人困惑的氛围和解决问题的能力。文章可以在这里找到。
什么是数据科学?
数据科学是能够使用数据并应用数据科学技术(如数据收集、数据可视化、机器学习等)来解决问题的能力。它是独一无二的,因为它既不需要密集的演算来建立一个机械装置,也不需要有争议的技巧来赢得法庭案件。
与医学、法律和工程等职业非常不同,它更像是一种现代技能,不仅可以用来回答令人困惑的问题,还可以应用于医疗保健、体育和商业等所有其他领域,提供突破性的启示。
数据科学是一个结合了数学、统计、计算和演示技能的领域。大量使用 R 和 python 等编码语言可以让人们有能力运行适当的代码来获得结果。有了扎实的数学和统计学知识,一个人可以很容易地弄清楚如何进行计算和解释数字。
通过书面文字或公开演讲有效展示您的发现的能力,使得最终与每个人分享数据分析的结果变得更加容易。
数据科学的魅力
人们拍照,购物,在他们最喜欢的餐馆吃饭,去充满异国情调的地方旅游。在一个约有 75 亿人口的世界里,从所有这些活动中可以获得数万亿千兆字节的数据,用于增强人类的能力。关于这些数据的疯狂事实是,它正以指数速度增长。
我们所做的可以被记录为原始数据,并被处理成有用的信息,这些信息可以用于治疗疾病,发明更好的社交媒体应用程序和高效地运送包裹。我相信数据科学才刚刚起步,我们人类还有很长的路要走。总之,一切都是数据;数据就是一切。
你想知道的关于计算机视觉的一切。
下面来看看为什么这么牛逼。
Computer Vision in Action🤖📹 Photo by the author
最强大和最引人注目的人工智能类型之一是计算机视觉,你几乎肯定已经在许多方面体验过,甚至不知道。让我们来看看它是什么,它是如何工作的,为什么它这么棒(而且只会变得更好)。
计算机视觉是计算机科学的一个领域,它专注于复制人类视觉系统的部分复杂性,并使计算机能够像人类一样识别和处理图像和视频中的对象。直到最近,计算机视觉只能在有限的能力下工作。
由于人工智能的进步以及深度学习和神经网络的创新,该领域近年来能够实现巨大飞跃,并能够在一些与检测和标记物体相关的任务中超过人类。
计算机视觉发展背后的驱动因素之一是我们今天生成的数据量,这些数据随后被用来训练和改善计算机视觉。
YOLO Multi-Object Detection And Classification. Photo by the author
随着大量的视觉数据(每天有超过 30 亿张图片在网上被分享),分析这些数据所需的计算能力现在已经可以使用了。随着计算机视觉领域随着新的硬件和算法的发展,物体识别的准确率也在提高。在不到十年的时间里,今天的系统已经从 50%的准确率达到了 99%,这使得它们在对视觉输入做出快速反应方面比人更准确。
计算机视觉的早期实验始于 20 世纪 50 年代,到 20 世纪 70 年代,它首次被用于商业用途,以区分打字和手写文本,今天,计算机视觉的应用已经呈指数增长。
到 2022 年,计算机视觉和硬件市场预计将达到 486 亿美元
计算机视觉是如何工作的?
神经科学和机器学习中的一个主要公开问题是:我们的大脑到底是如何工作的,我们如何用自己的算法来近似它?现实是,大脑计算的工作和综合理论非常少;因此,尽管神经网络应该“模仿大脑的工作方式”,但没有人能确定这是否是真的。
同样的悖论也适用于计算机视觉——因为我们无法决定大脑和眼睛如何处理图像,所以很难说生产中使用的算法有多接近我们自己的内部心理过程。
在某种程度上,计算机视觉就是模式识别。因此,训练计算机如何理解视觉数据的一种方法是给它输入图像,大量的图像数以千计,如果可能的话,数以百万计的已被标记的图像,然后对这些图像进行各种软件技术或算法的处理,使计算机能够在与这些标记相关的所有元素中寻找模式。
例如,如果你给电脑输入一百万张猫的图片(我们都喜欢它们😄😹),它会让它们接受算法,让它们分析照片中的颜色、形状、形状之间的距离、物体彼此的边界等等,以便识别“猫”的含义。当它完成时,如果输入其他未标记的图像,计算机将(理论上)能够利用它的经验找到猫的图像。
让我们暂时把我们毛茸茸的猫朋友放在一边,让我们更专业一点🤔😹。下面是存储亚伯拉罕·林肯图像的灰度图像缓冲区的简单说明。每个像素的亮度由一个 8 位数字表示,范围从 0(黑色)到 255(白色):
Pixel data diagram. At left, our image of Lincoln; at center, the pixels labeled with numbers from 0–255, representing their brightness; and at right, these numbers by themselves. Photo by Nguyen Dang Hoang Nhu on Unsplash
{157, 153, 174, 168, 150, 152, 129, 151, 172, 161, 155, 156,
155, 182, 163, 74, 75, 62, 33, 17, 110, 210, 180, 154,
180, 180, 50, 14, 34, 6, 10, 33, 48, 106, 159, 181,
206, 109, 5, 124, 131, 111, 120, 204, 166, 15, 56, 180,
194, 68, 137, 251, 237, 239, 239, 228, 227, 87, 71, 201,
172, 105, 207, 233, 233, 214, 220, 239, 228, 98, 74, 206,
188, 88, 179, 209, 185, 215, 211, 158, 139, 75, 20, 169,
189, 97, 165, 84, 10, 168, 134, 11, 31, 62, 22, 148,
199, 168, 191, 193, 158, 227, 178, 143, 182, 106, 36, 190,
205, 174, 155, 252, 236, 231, 149, 178, 228, 43, 95, 234,
190, 216, 116, 149, 236, 187, 86, 150, 79, 38, 218, 241,
190, 224, 147, 108, 227, 210, 127, 102, 36, 101, 255, 224,
190, 214, 173, 66, 103, 143, 96, 50, 2, 109, 249, 215,
187, 196, 235, 75, 1, 81, 47, 0, 6, 217, 255, 211,
183, 202, 237, 145, 0, 0, 12, 108, 200, 138, 243, 236,
195, 206, 123, 207, 177, 121, 123, 200, 175, 13, 96, 218};
这种存储图像数据的方式可能与你的期望背道而驰,因为数据在显示时当然看起来是二维的。然而,事实就是如此,因为计算机内存只是由一个不断增长的线性地址空间列表组成。
How pixels are stored in memory. Photo by the author
我们再回到第一张图,想象一下加一个彩色的。现在事情开始变得更加复杂。计算机通常将颜色解读为一系列 3 个数值——红、绿、蓝(RGB)——在相同的 0-255 范围内。现在,除了它的位置,每个像素实际上有 3 个值供计算机存储。如果我们给林肯总统着色,那将导致 12×16×3 个值,或 576 个数字。
Photo by the author
一幅图像需要大量的内存,一个算法需要迭代大量的像素。但是,为了训练一个具有有意义的准确性的模型,特别是当你谈论深度学习时,你通常需要成千上万的图像,越多越好。
计算机视觉的演变
在深度学习出现之前,计算机视觉可以执行的任务非常有限,需要开发人员和人类操作员进行大量的手动编码和努力。例如,如果您想要执行面部识别,您必须执行以下步骤:
- 创建一个数据库:你必须以特定的格式捕捉所有你想追踪的对象的个人图像。
- 给图像加注释:然后,对于每一张单独的图像,你必须输入几个关键数据点,比如两眼之间的距离、鼻梁的宽度、上唇和鼻子之间的距离,以及其他几十个定义每个人独特特征的测量数据。
- 捕捉新图像:接下来,你必须捕捉新图像,无论是照片还是视频内容。然后你必须再次经历测量过程,在图像上标记关键点。你还必须考虑图像拍摄的角度。
在所有这些手动工作之后,应用程序最终能够将新图像中的测量值与存储在其数据库中的测量值进行比较,并告诉您它是否与它正在跟踪的任何配置文件相符。事实上,几乎没有自动化,大部分工作都是手动完成的。误差幅度仍然很大。
机器学习为解决计算机视觉问题提供了一种不同的方法。有了机器学习,开发人员不再需要手动将每个规则编码到他们的视觉应用程序中。相反,他们编写了“特征”程序,即可以检测图像中特定模式的小型应用程序。然后,他们使用统计学习算法,如线性回归、逻辑回归、决策树或支持向量机(SVM)来检测模式和分类图像,并检测其中的对象。
机器学习帮助解决了许多传统软件开发工具和方法面临的历史性挑战。例如,几年前,机器学习工程师能够创建一个软件,它可以比人类专家更好地预测乳腺癌的生存窗口。然而,构建该软件的功能需要数十名工程师和乳腺癌专家的努力,并花费了大量时间进行开发。
深度学习提供了一种完全不同的方法来进行机器学习。深度学习依赖于神经网络,这是一种通用功能,可以解决任何通过示例表示的问题。当你为神经网络提供许多特定类型数据的标记示例时,它将能够提取这些示例之间的共同模式,并将其转换为数学方程,这将有助于对未来的信息进行分类。
例如,创建一个具有深度学习的面部识别应用程序只需要你开发或选择一个预构建的算法,并用它必须检测的人的面部样本来训练它。给定足够多的例子(大量的例子),神经网络将能够检测人脸,而无需进一步的特征或测量指令。
深度学习是做计算机视觉非常有效的方法。在大多数情况下,创建一个好的深度学习算法可以归结为收集大量的标记训练数据,并调整参数,如神经网络的类型和层数以及训练时期。与以前的机器学习类型相比,深度学习的开发和部署更加容易和快速。
目前大多数计算机视觉应用,如癌症检测、自动驾驶汽车和面部识别,都利用了深度学习。由于硬件和云计算资源的可用性和进步,深度学习和深度神经网络已经从概念领域进入实际应用。
破译一幅图像需要多长时间
总之不多。这就是为什么计算机视觉如此令人兴奋的关键:尽管在过去,即使是超级计算机也可能需要几天或几周甚至几个月才能完成所有需要的计算,但今天的超高速芯片和相关硬件,以及快速可靠的互联网和云网络,使这一过程变得快如闪电。曾经至关重要的因素是许多从事人工智能研究的大公司愿意分享他们的工作脸书、谷歌、IBM 和微软,特别是通过开源他们的一些机器学习工作。
这允许其他人在他们的工作基础上进行,而不是从零开始。因此,人工智能行业正在发展,不久前需要几周才能完成的实验今天可能只需要 15 分钟。对于计算机视觉的许多现实应用来说,这个过程都是在几微秒内连续发生的,所以今天的计算机能够做到科学家所说的“情境感知”
计算机视觉的应用
计算机视觉是机器学习中的一个领域,其中的核心概念已经被集成到我们每天使用的主要产品中。
自动驾驶汽车中的 CV
但不仅仅是科技公司在利用机器学习进行图像应用。
计算机视觉使自动驾驶汽车能够了解周围的环境。摄像机从汽车周围的不同角度捕捉视频,并将其输入计算机视觉软件,然后实时处理图像,以找到道路的尽头,阅读交通标志,检测其他汽车,物体和行人。然后,无人驾驶汽车可以在街道和高速公路上行驶,避免撞到障碍物,并(希望)安全地将乘客送到目的地。
人脸识别中的 CV
计算机视觉在面部识别应用中也发挥着重要作用,这种技术使计算机能够将人的面部图像与他们的身份进行匹配。计算机视觉算法检测图像中的面部特征,并将它们与面部轮廓数据库进行比较。消费设备使用面部识别来验证其所有者的身份。社交媒体应用使用面部识别来检测和标记用户。执法机构也依靠面部识别技术来识别视频中的罪犯。
增强现实和混合现实中的 CV
计算机视觉在增强和混合现实中也发挥着重要作用,这种技术使智能手机、平板电脑和智能眼镜等计算设备能够在现实世界的图像上覆盖和嵌入虚拟物体。AR gear 使用计算机视觉来检测现实世界中的物体,以便确定设备显示屏上放置虚拟物体的位置。例如,计算机视觉算法可以帮助 AR 应用程序检测桌面、墙壁和地板等平面,这是建立深度和维度以及在物理世界中放置虚拟对象的一个非常重要的部分。
医疗保健中的简历
计算机视觉也是医疗技术进步的重要组成部分。计算机视觉算法可以帮助自动化任务,如检测皮肤图像中的癌性痣,或在 x 射线和 MRI 扫描中发现症状。
计算机视觉的挑战
帮助电脑看东西是非常困难的。
发明一台像我们一样看东西的机器看起来是一项艰巨的任务,不仅因为很难让计算机做到这一点,还因为我们不完全确定人类的视觉最初是如何工作的。
研究生物视觉需要了解像眼睛这样的感知器官,以及对大脑内感知的解释。尽管像任何涉及大脑的研究一样,还有很长的路要走,但在绘制过程图表和发现系统使用的技巧和捷径方面,已经取得了很大进展。
Credit For The Image Goes To: Mike Tamir
许多流行的计算机视觉应用包括尝试识别照片中的事物;例如:
- 物体分类:这张照片中的物体属于哪一大类?
- 物体识别:这张照片中给定的物体是哪种类型?
- 实物验证:实物在照片里吗?
- 物体检测:照片中的物体在哪里?
- 物体地标检测:照片中物体的关键点是什么?
- 物体分割:图像中有哪些像素属于物体?
- 物体识别:这张照片里有什么物体,它们在哪里?
除了识别之外,其他分析方法包括:
- 视频运动分析利用计算机视觉来估计视频中物体的速度,或者摄像机本身的速度。
- 在图像分割中,算法将图像分割成多组视图。
- 场景重建创建通过图像或视频输入的场景的 3D 模型。
- 在图像恢复中,使用基于机器学习的过滤器从照片中去除模糊等噪声。
任何其他涉及通过软件理解像素的应用都可以安全地称为计算机视觉。
结论
尽管最近取得了令人印象深刻的进展,但我们仍然没有接近解决计算机视觉问题。然而,已经有多个医疗机构和企业找到了将由 CNN 支持的 CV 系统应用于现实世界问题的方法。而且这种趋势不太可能很快停止。
如果你想联系我,顺便说一句,你知道一个好笑话,你可以在 Twitter 或 LinkedIn 上联系我。
感谢阅读!😄 🙌