:::: MENU ::::

TalkingData's Blog

现在开始,用数据说话。

Posts Categorized / Tech

cialis erfaring cialis i norge hva er kamagra cialis efeitos secundarios cialis bula viagra effekt viagra norge viagra på nett viagra nettbutikk viagra infarmed levitra comprimidos cialis uten resept cialis pris levitra eller cialis kamagra gel comprar viagra farmacia
  • May 23 / 2018
  • 0
Tech

技术专栏丨10大机器学习算法速览,带你开启AI之旅

原文作者:Sunil Ray
译者:TalkingData 张永超
原文链接:https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/

简介

从广义上讲,机器学习算法有三种类型:

监督学习

该算法是由一个目标/结果变量(也成为因变量)组成,该变量可以从一组给定的预测变量中预测出来。使用这些变量的组合,我们可以生成一个由输入映射到所需输出的的函数。该算法的训练过程会尝试将模型的预测准确度提高到训练数据所需的程度。具体的算法有:回归、决策树、随机森林、kNN、Logistic回归等等。

无监督学习

该算法中,没有任何的目标/结果变量以用来预测/估计。基本上用于不同的群体间的聚类,通常该算法用于对不同的群体进行分组。具体的算法有:Apriori算法,K-means等。

强化学习

该算法是比较新的一个机器学习算法分类,使用该算法,机器会被训练来做出一些特定的决策。此时机器会被暴露在一个特定的环境中,通过反复试验不断的训练自己,知道最终得到一个比较好的决策结果。该算法会从过去的经验中学习,并尝试捕捉最佳的结果知识以做出更加准确的决策。典型的算法有:马尔可夫决策过程等。

通用机器学习算法列表

下面是一些通用的机器学习算法,这些算法基本上能够解决大部分的数据相关问题:

1.    线性回归(Linear Regression)

2.    逻辑回归(Logistic Regression)

3.    决策树(Decision Tree)

4.    支持向量机(SVM)

5.    朴素贝叶斯(Naive Bayes)

6.    k近邻(kNN)

7.    k均值(K-Means)

8.    随机森林(Random Forest)

9.    降维算法(Dimensionality Reduction Algorithms)

10.  梯度增强算法(Gradient Boosting algorithms)

  • GBM
  • XGBoost
  • LightGBM
  • CatBoost

1线性回归

线性回归主要用于根据连续的变量来估计实际值(例如:房屋成本,通话次数,总销售额等)。在该算法中,我们通过拟合最佳的分界线来建立独立变量和因变量之间的关系。该最佳的拟合线称为回归线,并可以由线性方程Y = a * X + b表示。例如:我们要求一个五年级的孩子根据班上同学的体重来排序,而不告诉他同学们的具体体重。他会怎么做呢?他可能会根据同学们的身高和体型来判断某个同学的体重,然后进行排序。我们并没有告诉他身高和体型与体重之间的关系,而他已经可以通过眼睛的观察来得到身高和体型与体重之间的关系了,而这个关系是符合上述线性回归的方程的。

在上述方程中:

  • Y — 因变量
  • a — 倾斜量
  • X — 自变量
  • b — 截距

系数a和b是基于最小化数据点与回归线之间的距离的平方差的总和而得出的。

假设我们有一些人员的身体和体重的数据,将其绘制在图表中。如下图所示:

image.png

这里我们已经找到了最佳的拟合线,其方程表示为y = 0.2811*x + 13.9,为图中黑色线。那么我们就可以使用这个方程来根据某人的身高,得到其体重了。

线性回归主要有两种类型:单一线性回归和多元线性回归。单一线性回归顾名思义,就是仅由一个独立的自变量表征,而多元线性回归由多于一个自变量来表征。在寻找最佳拟合线时,可以拟合多项式或曲线回归。

本文中的代码大部分为演示所用,在实际应用中需要替换甚至重写部分代码,请慎重复制粘贴!

Python code

1# Import Library
2# Import other necessary libraries like pandas, numpy…
3from sklearn import linear_model
4# Load Train and Test datasets
5# Identify feature and response variable(s) and values must be numeric and numpy arrays
6x_train=input_variables_values_training_datasets
7y_train=target_variables_values_training_datasets
8x_test=input_variables_values_test_datasets
9# Create linear regression object
10linear = linear_model.LinearRegression()
11# Train the model using the training sets and check score
12linear.fit(x_train, y_train)
13linear.score(x_train, y_train)
14# Equation coefficient and Intercept
15print(‘Coefficient: \n’, linear.coef_)
16print(‘Intercept: \n’, linear.intercept_)
17# Predict Output
18predicted= linear.predict(x_test)

2逻辑回归

不要被这个名字所糊弄了! 其实逻辑回归并不是回归算法。它基于给定的一组自变量来估计离散值(二进制值,如0/1,是/否,真/假)。简单的说,它通过将数据拟合到logit函数来预测事件发生的可能性。因此,它通常也被称为logit回归。因为它预测了可能性,即概率,因此其输出值在0和1之间。例如:你的朋友给你出了一道难题,并且他并不知道你的知识范围,而你能给出的结果只有能解决或者不能解决。假如这道题是高级物理学科的题目,你可能只有大学本科的经历,你给出能解决的概率可能只有20%,而如何你恰好是一个物理学博士,你给出解决的概率可能就有80%了,这就是逻辑回归。

从数学的含义上讲,逻辑回归就是结果的对数几率被建模为预测变量的线性组合。如下:

1odds = p / (1 - p) = probability of event occurrence / probability of not event occurrence
2ln(odds) = ln(p / (1 - p))
3logit(p) = ln(p / (1 - p)) = b0+b1X1+b2X2+b3X3....+bkXk

上述公式中,p是存在感兴趣特征的概率。它选择最大化观察样本值的可能性的参数,而不是最小化平方误差的总和(如在普通回归中那样)。

image.png

Python code

1# Import Library
2from sklearn.linear_model import LogisticRegression
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create logistic regression object
5model = LogisticRegression()
6# Train the model using the training sets and check score
7model.fit(X, y)
8model.score(X, y)
9# Equation coefficient and Intercept
10print(‘Coefficient: \n’, model.coef_)
11print(‘Intercept: \n’, model.intercept_)
12# Predict Output
13predicted= model.predict(x_test)

3决策树

决策树是一种主要用于分类问题的监督学习算法。该算法不仅仅支持分类问题,还支持连续因变量问题。在这个算法中,我们将人口分成两个或更多的齐次集合。这是基于最重要的属性/独立变量来完成的,以尽可能地形成不同的组。

image.png

如上图所示,可以看到该算法根据多个属性将一个群体分为了四个不同的群体,以识别“他们是否会参加比赛”。为了分组,它使用各种技术,如基尼,信息增益,卡方,熵等。

另一种理解决策树的绝佳方式是玩一个微软上经典的游戏 — Jezzball。基本上,你有一个有活动墙壁的房间,你需要创造墙壁,这样最大的区域就会被清理掉。

image.png

因此,每一次你使用墙壁来划分房间,你都将试图将一个房间划分为两部分。决策树也非常类似这种方式。

Python code

 1# Import Library
 2# Import other necessary libraries like pandas, numpy...
 3from sklearn import tree
 4# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
 5# Create tree object 
 6model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
 7# model = tree.DecisionTreeRegressor() for regression
 8# Train the model using the training sets and check score
 9model.fit(X, y)
10model.score(X, y)
11# Predict Output
12predicted= model.predict(x_test)

4SVM(支持向量机)

SVM是一个分类方法。在该算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是您拥有的要素数),每个要素的值都是特定坐标的值。

例如,如果我们只有个人的身高和头发长度两个特征,我们首先在二维空间中绘制这两个变量,其中每个点有两个坐标(这些坐标被称为支持向量)。

image.png

现在,我们将找到一些分割两个不同分类数据组之间线。而这条线将使得两组数据中最近点的距离最远。

image.png

在上面所示的例子中,将数据分成两个不同分类组的线是黑线,因为两个最近点离线最远。这条线就是我们的分类器。然后,根据测试数据在线两侧的位置,就可以区分测试数据属于哪个类了。

Python code

 1# Import Library
 2from sklearn import svm
 3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
 4# Create SVM classification object 
 5model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
 6# Train the model using the training sets and check score
 7model.fit(X, y)
 8model.score(X, y)
 9# Predict Output
10predicted= model.predict(x_test)

5朴素贝叶斯

朴素贝叶斯是一种基于贝叶斯定理的分类技术,假设预测变量之间具有独立性。简而言之,朴素贝叶斯分类器假定类中特定特征的存在与任何其他特征的存在无关。例如,如果果实呈红色,圆形,直径约3英寸,则可认为其为苹果。即使这些特征依赖于彼此或者依赖于其他特征的存在,朴素贝叶斯分类器也会考虑所有这些特性来独立地贡献该水果是苹果的可能性。

朴素贝叶斯模型很容易构建,对于非常大的数据集特别有用。贝叶斯定理提供了一种从P(c),P(x)和P(x | c)计算后验概率P(c | x)的方法。看下面的公式:

image.png

这里:

  • Pc | x是给定预测器(属性)的类(目标)的后验概率。
  • Pc是类的先验概率。
  • Px | c是预测器给定类的概率的可能性。
  • Px是预测变量的先验概率。

例子:让我们用一个例子来理解它。下面我有一个天气和相应的目标变量“是否参加比赛”的训练数据集。现在,我们需要根据天气情况来分类球员是否参加比赛。让我们按照以下步骤来执行它。

  • 将数据集转换为频率表
  • 通过查找像Overcast probability = 0.29和播放概率为0.64的概率来创建Likelihood表。
  • 现在,使用朴素贝叶斯方程来计算每个类别的后验概率。具有最高后验概率的类别是预测的结果。

Python code

1# Import Library
2from sklearn.naive_bayes import GaussianNB
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
5# Train the model using the training sets and check score
6model.fit(X, y)
7# Predict Output
8predicted= model.predict(x_test)

6kNN (k-最近邻)

kNN可以用于分类和回归问题。然而,它在业内的分类问题中被更广泛地使用。 K最近邻算法是一个简单的算法,它存储所有可用的案例,并通过其k个邻居的多数投票来分类新案例。被分配给类的情况在距离函数测量的k近邻中最为常见。

这些距离函数可以是欧几里得,曼哈顿,闵可夫斯基和海明距离。前三个函数用于连续函数,第四个函数(Hamming)用于分类变量。如果K = 1,那么该情况被简单地分配给其最近邻居的类别。有时,在执行kNN建模时选择K是一项挑战。

image.png

kNN可以很容易地映射到我们的真实生活中。如果你想了解一个你没有信息的人,你可能想知道他的亲密朋友和他进入的圈子并获得他/她的信息!

选择kNN之前需要考虑的事项: * KNN在计算上很耗时 * 在使用kNN时,变量应该被标准化,否则更高的范围变量会偏向它 * 在进入kNN之前要更多地进行数据预处理,如异常值,噪音消除等。

Python code

1# Import Library
2from sklearn.neighbors import KNeighborsClassifier
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create KNeighbors classifier object model 
5KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
6# Train the model using the training sets and check score
7model.fit(X, y)
8# Predict Output
9predicted= model.predict(x_test)

7K-均值(K-Means)

K-均值是一种解决聚类问题的无监督算法。其过程遵循一个简单的方法,通过一定数量的聚类(假设k个聚类)对给定的数据集进行分类。群集内的数据点与同级群组是同质且异质的。

例如在白纸上随机撒上的墨水, K-均值有点类似这个活动,每一块墨水水渍可以理解为一个群组。

image.png

  • K-means如何形成群集:
  • K-means为每个簇选取k个点,称为质心。
  • 每个数据点形成具有最接近质心的群集,即k个群集。
  • 根据现有集群成员查找每个集群的质心。这里我们有新的质心。
  • 由于我们有新的质心,请重复步骤2和3.从新质心找到每个数据点的最近距离,并与新的k-簇进行关联。重复这个过程直到收敛发生,即质心不变。

如何确定K的值:

在K-means中,我们有簇,每个簇都有自己的质心。质心与聚类内的数据点之间的差的平方和构成该聚类的平方值的和。另外,当所有群集的平方值总和相加时,群集解决方案的平方和总和为总和。

我们知道,随着群集数量的增加,这个值会持续下降,但是如果您绘制结果,您可能会看到平方距离的总和急剧下降到某个k值,然后再慢得多。在这里,我们可以找到聚类的最佳数量。

image.png

Python code

1# Import Library
2from sklearn.cluster import KMeans
3# Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
4# Create KNeighbors classifier object model 
5k_means = KMeans(n_clusters=3, random_state=0)
6# Train the model using the training sets and check score
7model.fit(X)
8# Predict Output
9predicted= model.predict(x_test)

8

随机森林

随机森林是一个决策树集合的术语。在随机森林中,集成了多个决策树(所谓的“森林”)。要根据属性对新对象进行分类,每棵树都会给出一个分类,并且该树会为该分类“投票”。森林选择票数最多的分类,即为最终的分类。

每株树种植和生长如下:

  • 如果训练集中的病例数为N,则随机抽取N个病例的样本,但需要更换。这个样本将成为培育树的培训集。
  • 如果有M个输入变量,则指定一个数m << M,以便在每个节点处从M中随机选择m个变量,并且使用这些m上的最佳分割来分割节点。在森林生长期间,m的值保持不变。
  • 每棵树都尽可能地生长。没有修剪。

Python code

1# Import Library
2from sklearn.ensemble import RandomForestClassifier
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create Random Forest object
5model= RandomForestClassifier()
6# Train the model using the training sets and check score
7model.fit(X, y)
8# Predict Output
9predicted= model.predict(x_test)

9

维度降低算法

在过去的4-5年里,在每个可能的阶段数据采集呈指数级增长。企业/政府机构/研究机构不仅拥有新的资源,而且还在详细捕获数据。

例如:电子商务公司正在抓住更多有关客户的细节,例如他们的人口统计数据,网络爬行历史,他们喜欢或不喜欢的内容,购买历史记录,反馈信息等等,以便为他们提供比最近的杂货店老板更多的个性化关注。

作为一名数据科学家,我们提供的数据还包含许多功能,这对构建良好的健壮模型听起来不错,但是存在挑战。你如何确定1000或2000年以外的重要变量?在这种情况下,降维算法可以帮助我们连同各种其他算法,如决策树,随机森林,PCA,因子分析,基于相关矩阵的识别,缺失值比等。

Python code

 1# Import Library
 2from sklearn import decomposition
 3# Assumed you have training and test data set as train and test
 4# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
 5# For Factor analysis
 6# fa= decomposition.FactorAnalysis()
 7# Reduced the dimension of training dataset using PCA
 8train_reduced = pca.fit_transform(train)
 9# Reduced the dimension of test dataset
10test_reduced = pca.transform(test) 

10梯度下降算法

10.1. GBM

当我们处理大量数据以进行具有高预测能力的预测时,GBM是一种增强算法。 Boosting实际上是一种学习算法集合,它将几个基本估计量的预测结合起来,以提高单个估计量的鲁棒性。它将多个弱预测器或平均预测器组合成强大的预测器。这些提升算法在Kaggle,AV Hackathon,CrowdAnalytix等数据科学竞赛中始终运作良好。

Python code

1# Import Library
2from sklearn.ensemble import GradientBoostingClassifier
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create Gradient Boosting Classifier object
5model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
6# Train the model using the training sets and check score
7model.fit(X, y)
8# Predict Output
9predicted= model.predict(x_test)

10.2. XGBoost

XGBoost是另一个经典的渐变增强算法,被称为在一些Kaggle比赛中获胜的关键性算法。

XGBoost具有非常高的预测能力,使其成为事件精确度的最佳选择,因为它具有线性模型和树学习算法,使得该算法比现有梯度增强技术快近10倍。

支持包括各种目标函数,包括回归,分类和排名。

XGBoost最有趣的事情之一就是它也被称为正规化提升技术。这有助于减少过度装配建模,并且对Scala,Java,R,Python,Julia和C ++等一系列语言提供大量支持。

在许多包含GCE,AWS,Azure和Yarn群集的机器上支持分布式和广泛的培训。 XGBoost还可以与Spark,Flink和其他云数据流系统集成在一起,每次迭代过程中都有内置的交叉验证。

Python code

 1from xgboost import XGBClassifier
 2from sklearn.model_selection import train_test_split
 3from sklearn.metrics import accuracy_score
 4X = dataset[:,0:10]
 5Y = dataset[:,10:]
 6seed = 1
 7X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)
 8model = XGBClassifier()
 9model.fit(X_train, y_train)
10#Make predictions for test data
11y_pred = model.predict(X_test)

10.3. LightGBM

LightGBM是一种梯度提升框架,使用基于树的学习算法。它的设计是分布式和高效的,具有以下优点:

  • 更快的训练速度和更高的效率
  • 降低内存使用量
  • 更好的准确性
  • 支持并行和GPU学习
  • 能够处理大型数据

该框架是一种基于决策树算法的快速高性能梯度提升算法,用于排序、分类和许多其他机器学习任务。它是在Microsoft的分布式机器学习工具包项目下开发的。

由于LightGBM基于决策树算法,因此它将树叶以最佳拟合进行分割。因此,当在Light GBM中的同一片叶上生长时,叶式算法可以比平面式算法减少更多的损失,因此可以获得更好的精度,而现有的任何增强算法都很难达到这些精度。

Python code

 1data = np.random.rand(500, 10) # 500 entities, each contains 10 features
 2label = np.random.randint(2, size=500) # binary target
 3train_data = lgb.Dataset(data, label=label)
 4test_data = train_data.create_valid('test.svm')
 5param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'}
 6param['metric'] = 'auc'
 7num_round = 10
 8bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])
 9bst.save_model('model.txt')
10# 7 entities, each contains 10 features
11data = np.random.rand(7, 10)
12ypred = bst.predict(data)

10.4. Catboost

CatBoost是Yandex最近开源的机器学习算法。它可以轻松地与Google的TensorFlow和Apple的Core ML等深度学习框架相整合。

CatBoost最棒的部分是它不需要像其他ML模型那样的大量数据训练,并且可以处理各种数据格式;不会破坏它的可靠性。

在使用和执行Catboost算法之前,请确保数据中的缺失值已经被处理。

Catboost可以自动处理分类变量而不显示类型转换错误,这有助于您更专注于更好地调整模型。

Python code

1import pandas as pd
2import numpy as np
3from catboost import CatBoostRegressor
4#Read training and testing files
5train = pd.read_csv(“train.csv”)
6test = pd.read_csv(“test.csv”)
7#Imputing missing values for both train and test
8train.fillna(-999, inplace=True)
9test.fillna(-999,inplace=True)
10#Creating a training set for modeling and validation set to check model performance
11X = train.drop([‘Item_Outlet_Sales’], axis=1)
12y = train.Item_Outlet_Sales
13from sklearn.model_selection import train_test_split
14X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)
15categorical_features_indices = np.where(X.dtypes != np.float)[0]
16#importing library and building model
17from catboost import CatBoostRegressormodel=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function=‘RMSE’)
18model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True)
19submission = pd.DataFrame()
20submission[‘Item_Identifier’] = test[‘Item_Identifier’]
21submission[‘Outlet_Identifier’] = test[‘Outlet_Identifier’]
22submission[‘Item_Outlet_Sales’] = model.predict(test)

总结

至此,相信你对机器学习的各个主要算法有了一个大概的了解,文中给出了各个算法的逻辑代码,你可以从这里开始,尝试解决一些问题,并在过程中加深理解。关于数据,你可以在网络上找到很多,而且在一些所使用到的Python库中也常内置了各种数据集,你可以查看相应的官方文档查找并直接使用。

  • Mar 20 / 2018
  • 0
Data, Ideas, Tech

技术专栏 | 微服务架构初探

作者:TalkingData 徐蓓

本译文禁止商用,转载请注明来源!

什么是微服务 

首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统Web应用,来理解什么是微服务。

传统的Web应用核心分为业务逻辑、适配器以及API或通过UI访问的Web界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等。

一个打车软件的架构图如下:

尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用。例如Java应用程序会被打包成WAR,部署在Tomcat或者Jetty上。

这种单体应用比较适合于小项目,优点是:

  • 开发简单直接,集中式管理
  • 基本不会重复开发
  • 功能都在本地,没有分布式的管理开销和调用开销

当然它的缺点也十分明显,特别对于互联网公司来说:

  • 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断
  • 代码维护难:代码功能耦合在一起,新人不知道何从下手
  • 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长
  • 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉
  • 扩展性不够:无法满足高并发情况下的业务需求

所以,现在主流的设计一般会采用微服务架构。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互相连接的微服务。一个微服务完成某个特定功能,比如乘客管理和下单管理等。每个微服务都有自己的业务逻辑和适配器。一些微服务还会提供API接口给其他微服务和应用客户端使用。

比如,前面描述的系统可被分解为:

每个业务逻辑都被分解为一个微服务,微服务之间通过REST API通信。一些微服务也会向终端用户或客户端开发API接口。但通常情况下,这些客户端并不能直接访问后台微服务,而是通过API Gateway来传递请求。API Gateway一般负责服务路由、负载均衡、缓存、访问控制和鉴权等任务。

微服务架构的优点 

微服务架构有很多重要的优点。

首先,它解决了复杂性问题。它将单体应用分解为一组服务。虽然功能总量不变,但应用程序已被分解为可管理的模块或服务。这些服务定义了明确的RPC或消息驱动的API边界。微服务架构强化了应用模块化的水平,而这通过单体代码库很难实现。因此,微服务开发的速度要快很多,更容易理解和维护。

其次,这种体系结构使得每个服务都可以由专注于此服务的团队独立开发。只要符合服务API契约,开发人员可以自由选择开发技术。这就意味着开发人员可以采用新技术编写或重构服务,由于服务相对较小,所以这并不会对整体应用造成太大影响。

第三,微服务架构可以使每个微服务独立部署。开发人员无需协调对服务升级或更改的部署。这些更改可以在测试通过后立即部署。所以微服务架构也使得CI/CD成为可能。

最后,微服务架构使得每个服务都可独立扩展。我们只需定义满足服务部署要求的配置、容量、实例数量等约束条件即可。比如我们可以在EC2计算优化实例上部署CPU密集型服务,在EC2内存优化实例上部署内存数据库服务。

微服务架构的缺点和挑战 

实际上并不存在silver bullets,微服务架构也会给我们带来新的问题和挑战。其中一个就和它的名字类似,微服务强调了服务大小,但实际上这并没有一个统一的标准。业务逻辑应该按照什么规则划分为微服务,这本身就是一个经验工程。有些开发者主张10-100行代码就应该建立一个微服务。虽然建立小型服务是微服务架构崇尚的,但要记住,微服务是达到目的的手段,而不是目标。微服务的目标是充分分解应用程序,以促进敏捷开发和持续集成部署。

微服务的另一个主要缺点是微服务的分布式特点带来的复杂性。开发人员需要基于RPC或者消息实现微服务之间的调用和通信,而这就使得服务之间的发现、服务调用链的跟踪和质量问题变得的相当棘手。

微服务的另一个挑战是分区的数据库体系和分布式事务。更新多个业务实体的业务交易相当普遍。这些类型的事务在单体应用中实现非常简单,因为单体应用往往只存在一个数据库。但在微服务架构下,不同服务可能拥有不同的数据库。CAP原理的约束,使得我们不得不放弃传统的强一致性,而转而追求最终一致性,这个对开发人员来说是一个挑战。

微服务架构对测试也带来了很大的挑战。传统的单体WEB应用只需测试单一的REST API即可,而对微服务进行测试,需要启动它依赖的所有其他服务。这种复杂性不可低估。

微服务的另一大挑战是跨多个服务的更改。比如在传统单体应用中,若有A、B、C三个服务需要更改,A依赖B,B依赖C。我们只需更改相应的模块,然后一次性部署即可。但是在微服务架构中,我们需要仔细规划和协调每个服务的变更部署。我们需要先更新C,然后更新B,最后更新A。

部署基于微服务的应用也要复杂得多。单体应用可以简单的部署在一组相同的服务器上,然后前端使用负载均衡即可。每个应用都有相同的基础服务地址,例如数据库和消息队列。而微服务由不同的大量服务构成。每种服务可能拥有自己的配置、应用实例数量以及基础服务地址。这里就需要不同的配置、部署、扩展和监控组件。此外,我们还需要服务发现机制,以便服务可以发现与其通信的其他服务的地址。因此,成功部署微服务应用需要开发人员有更好地部署策略和高度自动化的水平。

以上问题和挑战可大体概括为:

  • API Gateway
  • 服务间调用
  • 服务发现
  • 服务容错
  • 服务部署
  • 数据调用

幸运的是,出现了很多微服务框架,可以解决以上问题。

第一代微服务框架 

Spring Cloud

Spring Cloud为开发者提供了快速构建分布式系统的通用模型的工具(包括配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等)。

主要项目包括:

  • spring cloud config:由git存储库支持的集中式外部配置管理。配置资源直接映射到Spring Environment,但是如果需要可以被非Spring应用程序使用。
  • spring cloud netflix:与各种Netflix OSS组件(Eureka,Hystrix,Zuul,Archaius等)集成。
  • spring cloud bus:用于将服务和服务实例与分布式消息传递联系起来的事件总线。用于在集群中传播状态更改(例如配置更改事件)
  • spring cloud for cloud foundry:将您的应用程序与Pivotal Cloudfoundry集成。提供服务发现实现,还可以轻松实现通过SSO和OAuth2保护资源,还可以创建Cloudfoundry服务代理。
  • spring cloud cloud foundry service broker:提供构建管理一个Cloud Foundry中服务的服务代理的起点。
  • spring cloud cluster:领导选举和通用状态模型(基于zookeeper,redis,hazelcast,Consul的抽象和实现)
  • spring cloud consul:结合Hashicorp Consul的服务发现和配置管理
  • spring cloud security:在Zuul代理中为负载平衡的OAuth2休眠客户端和认证头中继提供支持。
  • spring cloud sleuth:适用于Spring Cloud应用程序的分布式跟踪,与Zipkin,HTrace和基于日志(例如ELK)跟踪兼容。
  • spring cloud data flow:针对现代运行时的可组合微服务应用程序的云本地编排服务。易于使用的DSL,拖放式GUI和REST-API一起简化了基于微服务的数据管道的整体编排。
  • spring cloud     stream:轻量级事件驱动的微服务框架,可快速构建可连接到外部系统的应用程序。使用Apache Kafka或RabbitMQ在Spring Boot应用程序之间发送和接收消息的简单声明式模型。
  • spring cloud stream app starters:Spring Cloud任务应用程序启动器是Spring Boot应用程序,可能是任何进程,包括不会永远运行的Spring Batch作业,并且它们在有限时间的数据处理之后结束/停止。
  • spring cloud zookeeper:Zookeeper的服务发现和配置管理
  • spring cloud for amazon web services:轻松集成托管的Amazon的Web Services服务。它通过使用spring的idioms和APIs便捷集成AWS服务,例如缓存或消息API。开发人员可以围绕托管服务,不必关心基础架构来构建应用。
  • spring cloud connectors:使PaaS应用程序在各种平台上轻松连接到后端服务,如数据库和消息代理(以前称为”Spring Cloud”的项目)
  • spring cloud starters:作为基于spring boot的启动项目,降低依赖管理(在Angel.SR2后,不在作为独立项目)
  • spring cloud cli:插件支持基于Groovy预言快速创建spring cloud的组件应用

Dubbo

Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

其核心部分包含:

  • 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及”请求-响应”模式的信息交换方式。
  • 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

但是显而易见,无论是Dubbo还是Spring Cloud都只适用于特定的应用场景和开发环境,它们的设计目的并不是为了支持通用性和多语言性。并且它们只是Dev层的框架,缺少DevOps的整体解决方案(这正是微服务架构需要关注的)。而随之而来的便是Service Mesh的兴起。

下一代微服务:Service Mesh? 

Service Mesh

Service Mesh又译作”服务网格”,作为服务间通信的基础设施层。如果用一句话来解释什么是Service Mesh,可以将它比作是应用程序或者说微服务间的TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心TCP/IP这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用Service Mesh也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如Spring Cloud、OSS,现在只要交给Service Mesh就可以了。

Service Mesh有如下几个特点:

  • 应用程序间通讯的中间层
  • 轻量级网络代理
  • 应用程序无感知
  • 解耦应用程序的重试/超时、监控、追踪和服务发现

Service Mesh的架构如下图所示:

Service Mesh作为Sidebar运行,对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在Service Mesh中实现。

目前流行的Service Mesh开源软件有Linkerd、Envoy和Istio,而最近Buoyant(开源Linkerd的公司)又发布了基于Kubernetes的Service Mesh开源项目Conduit。

Linkerd

Linkerd是开源网络代理,设计为以服务网格部署:用于管理,控制和监控应用程序内的服务与服务间通讯的专用层。

Linkerd旨在解决Twitter,Yahoo,Google和Microsoft等公司运营大型生产系统时发现的问题。根据经验,最复杂,令人惊奇和紧急行为的来源通常不是服务本身,而是服务之间的通讯。Linkerd解决了这些问题,不仅仅是控制通讯机制,而是在其上提供一个抽象层。

它的主要特性有:

  • 负载平衡:linkerd提供了多种负载均衡算法,它们使用实时性能指标来分配负载并减少整个应用程序的尾部延迟。
  • 熔断:linkerd包含自动熔断,将停止将流量发送到被认为不健康的实例,从而使他们有机会恢复并避免连锁反应故障。
  • 服务发现:linkerd 与各种服务发现后端集成,通过删除特定的(ad-hoc)服务发现实现来帮助您降低代码的复杂性。
  • 动态请求路由:linkerd 启用动态请求路由和重新路由,允许您使用最少量的配置来设置分段服务(staging service),金丝雀(canaries),蓝绿部署(blue-green deploy),跨DC故障切换和黑暗流量(dark traffic)。
  • 重试次数和截止日期:linkerd可以在某些故障时自动重试请求,并且可以在指定的时间段之后让请求超时。
  • TLS:linkerd 可以配置为使用 TLS 发送和接收请求,您可以使用它来加密跨主机边界的通信,而不用修改现有的应用程序代码。
  • HTTP代理集成:linkerd 可以作为 HTTP 代理,几乎所有现代 HTTP 客户端都广泛支持,使其易于集成到现有应用程序中。
  • 透明代理:您可以在主机上使用 iptables 规则,设置通过 linkerd 的透明代理
  • gRPC:linkerd 支持 HTTP/2 和 TLS,允许它路由 gRPC 请求,支持高级 RPC 机制,如双向流,流程控制和结构化数据负载。
  • 分布式跟踪:linkerd 支持分布式跟踪和度量仪器,可以提供跨越所有服务的统一的可观察性。
  • 仪器仪表: linkerd 支持分布式跟踪和度量仪器,可以提供跨越所有服务的统一的可观察性。

Envoy

Envoy 是一个面向服务架构的L7代理和通信总线而设计的,这个项目诞生是出于以下目标:

对于应用程序而言,网络应该是透明的,当发生网络和应用程序故障时,能够很容易定位出问题的根源。

Envoy可提供以下特性:

  • 外置进程架构:可与任何语言开发的应用一起工作;可快速升级
  • 基于新C++11编码:能够提供高效的性能
  • L3/L4过滤器:核心是一个L3/L4网络代理,能够作为一个可编程过滤器实现不同TCP代理任务,插入到主服务当中。通过编写过滤器来支持各种任务,如原始TCP代理、HTTP代理、TLS客户端证书身份验证等。
  • HTTP L7过滤器:支持一个额外的HTTP L7过滤层。HTTP过滤器作为一个插件,插入到HTTP链接管理子系统中,从而执行不同的任务,如缓冲,速率限制,路由/转发,嗅探Amazon的DynamoDB等等。
  • 支持HTTP/2:在HTTP模式下,支持HTTP/1.1、HTTP/2,并且支持HTTP/1.1、HTTP/2双向代理。这意味着HTTP/1.1和HTTP/2,在客户机和目标服务器的任何组合都可以桥接
  • HTTP L7路由:在HTTP模式下运行时,支持根据content type、runtime values等,基于path的路由和重定向。可用于服务的前端/边缘代理
  • 支持gRPC:gRPC是一个来自谷歌的RPC框架,使用HTTP/2作为底层的多路传输。HTTP/2承载的gRPC请求和应答,都可以使用Envoy的路由和LB能力
  • 支持MongoDB L7:支持获取统计和连接记录等信息
  • 支持DynamoDB L7:支持获取统计和连接等信息
  • 服务发现:支持多种服务发现方法,包括异步DNS解析和通过REST请求服务发现服务
  • 健康检查:含有一个健康检查子系统,可以对上游服务集群进行主动的健康检查。也支持被动健康检查。
  • 高级LB:包括自动重试、断路器,全局限速,阻隔请求,异常检测。未来还计划支持请求速率控制
  • 前端代理:可作为前端代理,包括TLS、HTTP/1.1、HTTP/2,以及HTTP L7路由
  • 极好的可观察性:对所有子系统,提供了可靠的统计能力。目前支持statsd以及兼容的统计库。还可以通过管理端口查看统计信息,还支持第三方的分布式跟踪机制
  • 动态配置:提供分层的动态配置API,用户可以使用这些API构建复杂的集中管理部署

Istio

Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来建立已部署服务网络,具备负载均衡、服务间认证、监控等功能,而不需要改动任何服务代码。想要为服务增加对Istio的支持,您只需要在环境中部署一个特殊的边车(sidecar),使用Istio控制面板功能配置和管理代理,拦截微服务之间的所有网络通信。

Istio目前仅支持在Kubernetes上的服务部署,但未来版本中将支持其他环境。

Istio提供了一个完整的解决方案,通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。它在服务网络中统一提供了许多关键功能:

  • 流量管理:控制服务之间的流量和API调用的流向,使得调用更可靠,并使网络在恶劣情况下更加健壮
  • 可观察性:了解服务之间的依赖关系,以及它们之间流量的本质和流向,从而提供快速识别问题的能力
  • 策略执行:将组织策略应用于服务之间的互动,确保访问策略得以执行,资源在消费者之间良好分配。策略的更改是通过配置网格而不是修改应用程序代码
  • 服务身份和安全:为网格中的服务提供可验证身份,并提供保护服务流量的能力,使其可以在不同可信度的网络上流转

Istio服务网格逻辑上分为数据面板和控制面板:

  • 数据面板由一组智能代理(Envoy)组成,代理部署为边车,调解和控制微服务之间所有的网络通信
  • 控制面板负责管理和配置代理来路由流量,以及在运行时执行策略

下图显示了构成每个面板的不同组件:

Conduit

Conduit是为Kubernetes设计的一个超轻型服务网格服务,它可透明地管理在Kubernetes上运行的服务的运行时通信,使得它们更安全可靠。Conduit提供了可见性、可靠性和安全性的功能,而无需更改代码。

Conduit service mesh也是由数据面板和控制面板组成。数据面板承载应用实际的网络流量。控制面板驱动数据面板,并对外提供北向接口。

对比

Linkerd和Envoy比较相似,都是一种面向服务通信的网络代理,均可实现诸如服务发现、请求路由、负载均衡等功能。它们的设计目标就是为了解决服务之间的通信问题,使得应用对服务通信无感知,这也是Service Mesh的核心理念。Linkerd和Envoy像是分布式的Sidebar,多个类似Linkerd和Envoy的proxy互相连接,就组成了service mesh。

而Istio则是站在了一个更高的角度,它将Service Mesh分为了Data Plane和Control Plane。Data Plane负责微服务间的所有网络通信,而Control Plane负责管理Data Plane Proxy:

并且Istio天生的支持Kubernetes,这也弥合了应用调度框架与Service Mesh之间的空隙。

关于Conduit的资料较少,从官方介绍看它的定位和功能与Istio类似。

Kubernetes + Service Mesh 

= 完整的微服务框架 

Kubernets已经成为了容器调度编排的事实标准,而容器正好可以作为微服务的最小工作单元,从而发挥微服务架构的最大优势。所以我认为未来微服务架构会围绕Kubernetes展开。

而Istio和Conduit这类Service Mesh天生就是为了Kubernetes设计,它们的出现补足了Kubernetes在微服务间服务通讯上的短板。虽然Dubbo、Spring Cloud等都是成熟的微服务框架,但是它们或多或少都会和具体语言或应用场景绑定,并只解决了微服务Dev层面的问题。若想解决Ops问题,它们还需和诸如Cloud Foundry、Mesos、Docker Swarm或Kubernetes这类资源调度框架做结合:

但是这种结合又由于初始设计和生态,有很多适用性问题需要解决。

Kubernetes则不同,它本身就是一个和开发语言无关的、通用的容器管理平台,它可以支持运行云原生和传统的容器化应用。并且它覆盖了微服务的Dev和Ops阶段,结合Service Mesh,它可以为用户提供完整端到端的微服务体验。

所以我认为,未来的微服务架构和技术栈可能是如下形式

多云平台为微服务提供了资源能力(计算、存储和网络等),容器作为最小工作单元被Kubernetes调度和编排,Service Mesh管理微服务的服务通信,最后通过API Gateway向外暴露微服务的业务接口。

我相信未来随着以Kubernetes和Service Mesh为标准的微服务框架的盛行,将大大降低微服务实施的成本,最终为微服务落地以及大规模使用提供坚实的基础和保障。

参考资料:

  • Introduction to Microservices:https://www.nginx.com/blog/introduction-to-microservices
  • Pattern: Microservice Architecture:http://microservices.io/patterns/microservices.html
  • Spring Cloud for Microservices Compared to Kubernetes:https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes
  • Istio:https://istio.io
  • Envoy:https://www.envoyproxy.io
  • Linkerd:https://linkerd.io
  • 微服务(Microservice)那点事:https://yq.aliyun.com/articles/2764?spm=a2c4e.11153959.blogcont8611.3.7ea85f19HP1APU
  • Istio中文文档:http://istio.doczh.cn
  • Linkerd中文文档:http://linkerd.doczh.cn
  • Mar 19 / 2018
  • 0
Data, Tech

两个工具帮你实现酷炫的数据可视化

你想到的数据可视化

通常可能是这样的

但我们能实现的数据可视化

还可以是这样的

这样的

以及这样的

如此高端大气酷炫的数据可视化

是如何实现的?

秘诀在于两个工具

inMap & iView

inMap

inMap是TalkingData可视化团队开源的一款基于 Canvas 的大数据可视化库,专注于大数据方向的散点、热力图、网格、聚合等方式展示,致力于让大数据可视化变得简单易用。

它具有以下特性:

  • 高性能
  • 多线程
  • 多图层叠加
  • 友好的 AP
  • 可以自定义主题

inMap 采用更加智能的地理可视化框架,主要面向从事数据可视化应用相关的工程师和设计师。

底层绘图引擎:目前基于 canvas 2d 提供基础绘图能力,基于 WebGL 的版本正在规划中;

算法:内置了经纬度墨卡托转换、文字避让算法、最佳标记点算法、自动分组标记配色算法等。

inMap 的每个算法都是为了增强用户体验,追求极致效果,打造伟大的产品。

inMap 的接口设计非常友好,希望让开发者通过简单的配置,就能快速构建出优美的可视化效果。

官网:http://inmap.talkingdata.com

GitHub:https://github.com/TalkingData/inmap

iView

iView 是TalkingData可视化团队开源的一套基于 Vue.js 的 UI 组件库,主要服务于 PC 界面的中后台产品。

它具有以下特性:

  • 高质量、功能丰富
  • 友好的 API ,自由灵活地使用空间,面向任何技术水平的开发者
  • 细致、漂亮的 UI
  • 事无巨细的文档
  • 可自定义主题

同时 iView 也是一整套的前端解决方案,包括了设计规范、多语言(目前 iView 支持 15 国语言)、自定义主题、服务端渲染。

iView 支持 Vue.js 2.x、Vue.js 1.x、服务端渲染、Nuxt.js、Electron等。

iView 目前在 GitHub 上有 13,000 多 star,从 star 数量、口碑和功能性、UI / UE上,iView 都排在全球同类产品的 Top3。

官网:https://www.iviewui.com

GitHub:https://github.com/iView/iView

 iView 新版本发布

在过去的两个多月里,iView 陆续发布了 2.9.0 和 2.10.0 两个重要版本。这两个版本总共有 255 个 commit,超过 40 项更新。来看一下,iView 具体有哪些更新:

一、日期组件 DatePicker 的重构

首先是在 2.10.0 对日期组件 DatePicker 的重构。DatePicker 是 iView 48 个组件里最复杂的组件之一。复杂的功能使得代码逻辑非常重,在许多新特性的支持上,比如兼容不同国家的日历规范等都很难在此基础上迭代,不得不推倒重来。

SergioCrisostomo 之前有开发过日期相关的 JS 库(https://github.com/SergioCrisostomo/js-calendar),所以对日期相关的功能点和 API 非常熟,iView 也是基于此库进行的重构。

新的日期组件主要增加了以下功能:

1. 范围选择支持从右往左选择。

之前在范围选择时,必须先选起点,再选终点,也就是从左往右选,但很多用户的习惯却刚好相反。该版本则同时支持两个方向的选择。

2. 新增 split-panels 属性,开启后,左右两面板可以不联动。

之前在范围选择时,左右两个面板是联动的,也就是右边永远比左边大一个月,任何一个面板切换月份或年份,另一个面板都会自动切换。该版本则可以设置为不联动,这样方便定位起始月份和结束月份。如图所示:

3. 新增 multiple 属性,开启后,可以选择多个日期。

虽然之前版本可以用其它 iView 组件组合出来一个多选的日期,但效果和交互多少会打折扣,该版本只要增加属性 multiple,就可以在一个日期面板上同时选择和呈现多个日期了。如图所示:

4. 新增属性 show-week-numbers,开启后,可以显示星期数。

增加这个属性,就可以在日历面板上显示当前是一年的第几周。如图所示:

还有其它很多项的更新,比如新增 start-date 属性,可以设置面板展开时默认显示的日期。新增属性 time-picker-options,可以在 type 为 datetime 和 datetimerange 下,配置 TimePicker 的属性,比如时间间隔 steps。完整的更新可以产看更新日志,这里不一一列举了。

二、键盘可访问性的支持

键盘的可访问性,主要是通过键盘的方向键、tab键、空格键等完成表单组件的切换和交互。在填写一个表单时(iView Form 组件),尤其有用,你可以离开鼠标,就完成一个复杂表单的填写与提交。

目前 iView 最新版本支持键盘可访问性的组件有:

Button、Input、Radio、Checkbox、Switch、AutoComplete、Slider、InputNumber。更多组件还在陆续支持中。

事实上,原生的表单控件,浏览器都是支持键盘的可访问性的,比如 <button>、<input type=”radio”> 等等。iView 对这些原生控件进行了重塑,不仅仅使得 UI 好看和统一,更重要的是功能的丰富和交互体验的提升。

目前上述的组件,都是可以通过键盘的 tab键 选中的,这是第一步,如图所示:

可以看到,组件在被选中时,外面多了一个高亮层,表明当前选中的控件,这时就可以通过键盘其它按键继续操作了,比如单选组件 Radio,在选中状态下,可以通过键盘的方向键直接切换选项;Checkbox 在被激活时,可以通过空格键选择和取消选择某小项,通过 tab 键激活下一个小项。

三、其他更新

还有一些更新,是无法直接看见和体会到的。

比如更新了大量的依赖:

  • babel 系列全部更新
  • 使用了 browserslist
  • 使用了 sourcemap

部分组件的重构,虽然功能无任何变化,但代码结构和逻辑都做了优化和可维护性设计。

还有部分组件的自动化测试、持续集成对 GitHub travis-ci 的兼容等等。

外表需要优化,内部同样也是,就像一个人,既要有外在美,也要有内在美。

这两个版本都需要感谢两位瑞典大神 SergioCrisostomo 和 Xotic750 的贡献,iView 才得以越来越完善。

完整的更新日志可以到 GitHub releases 查看:

2.9.0: https://github.com/iview/iview/releases/tag/v2.9.0

2.10.0: https://github.com/iview/iview/releases/tag/v2.10.0

数据可视化可以很简约也可以很酷炫

别让工具限制了你的想象力

  • Feb 09 / 2018
  • 0
Data, Tech

锐眼洞察 | 2018 关于数据的一些思考

作者:TalkingData 陈雷

本文为TalkingData原创,未经授权禁止转载。申请授权请在评论中留言联系!

掉过的那些数据坑

虽然过去的咨询、架构、软件工程管理工作中一直在分析数据、应用数据,一直在填各种坑,但真正跳进数据这个坑是始于 2015 年加入 TalkingData,真正把数据作为自己工作与研究的主体。 2015 年大数据公司的数据应用刚刚起步,我们就已经利用自己积累的数据,率先在行业内建立起一套数据标签体系,这套数据标签体系成为数据服务工作的起点,我们利用这批数据标签建立了移动互联网行业的覆盖和活跃排行榜,为移动用户人群的移动行为画像,起到了很好的示范效应。 随着数据应用逐步深入到深水区域,我们开始深度尝试数据标签在行业中进行精确营销、精细化客户运营、金融用户的风控识别,这时发现原有的标准化数据标签的应用效果参差不齐。 有些标签在特定人群使用中有效果,但换一个人群的效果差异就可能很大。举个例子,我们的标准标签建模后在金融风险客戶甄別上的 KS 值在 0.14 到 0.19 之间,基本属于不可用的范畴。 仔细分析标准标签的原始数据和信息加工场景后,我们对原始数据进行进一步发掘,针对行业需求深入探索数据中的信息含义,定制了一系列的行业标签。 针对金融用户的风控需求,我们从用户的稳定性、金融行为、消费行为、位置趋势、性格偏好等多个金融视角重新制定了一套风控标签,这些标签建模对金融贷款风险用户甄别的 KS 值提升到 029-0.39 之间,基本满足了金融客户对行为数据的期望值。但在金融数据应用金字塔上,行为数据依然处在金字塔的底端,难以撼动金融客户的数据应用习惯。 复盘过去几年做的事,我们总结了数据工程方法论,针对数据应用的层级归纳了数据、信息、知识、洞察、智慧等五个层次。   data_information_knowledge_insight_wisdom-1

图片来自:David Somerville

过去,数据分析师在做数据应用时,起点常常是数据标签,数据标签属于信息层面。只有当信息不足的时候我们才把数据分析的开始层次回退到数据层面,直接在数据中提取更加丰富的信息内容。 这样的经验与教训过程进一步促发了更多思考:

  • 采集和使用的原始数据是否真实?

  • 数据的丰富程度能否满足应用需求?

  • 数据工程过程中如何保证信息的传递?

这些问题触发我们重新去认识数据与信息,重新去理解数据的本质。

数据的本质

以下是百度百科上查到的数据与信息的定义:

数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。

信息与数据既有联系,又有区别。数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。而信息是数据的内涵,信息加载于数据之上,对数据作具有含义的解释。 数据和信息是不可分离的,信息依赖数据来表达,数据则生动具体表达出信息。数据是符号,是物理性的,信息是对数据进行加工处理之后所得到的并对决策产生影响的数据,是逻辑性和观念性的;数据是信息的表现心事,信息是数据有意义的表示。 数据是信息的表达、载体,信息是数据的内涵,是形与质的关系。数据本身没有意义,数据只有对实体行为产生影响时才成为信息。

可以看出,这里数据及信息的定义还是比较生硬,比较模糊, 而在实际应用中数据与信息有很深的联系,常常被混合用在一起。 我重新把信息与数据的关系拉开看,用下面的图来表述这个关系。 WX20180130-105719   有种说法是世界上几乎任何事物都可以用信息的方式量化。这里的事物就是信息的主体,信息主体的信息被采集并量化(比特化的过程),数据就是这个信息量化后的载体。作为载体,数据本身不带有任何目标,也不是目标,数据的应用才是数据价值所在和最终目标。 数据的应用过程的起点就是信息的还原,信息的表现往往也是以数据形式存在。 在 TalkingData 的数据中信息的主体就是人,但 TalkingData 并不是对人的信息直接采集,而是通过现代人的随身必备的介质——手机,来采集人的信息。 信息的釆集是通过 SDK 获取的信息主体所做的移动互联网行为数据。当然,从信息主体的人的角度来看,TalkingData 的数据采集能力只是很有限的能力,采集的数据也仅仅是人这个信息主体上的数据片段。 信息主体能够被数据化的能力取决于数据的釆集技术和能力的发展。过去,在小数据时代,人的信息釆集能力仅限于关键性信息,而且很多的数据分布在无数不同的场景中,很难收集、归拢,也无法真正还原信息主体上的信息。 随着各种全新的信息釆集手段出现,信息采集越来越丰富,才能越来越接近信息主体的真相。也就是车老师在《数据的本质》一书中谈及的完美数据。

完美数据

完美数据的提出来源于车品觉老师的书《数据的本质》,完美数据是基于一个假设:信息主体上的所有信息都是可以获取的。随着数据技术的发展,信息主体上的信息采集和数字化能力正在不断提升,完美信息正在趋近。 WX20180130-143250  

《数据的本质》TalkingData 定制版

完美数据的依据是数据采集能力变化,生活在现代社会,正常的人完全无法避开周边无孔不入的数据采集。 上个网浏览个网站,网站会记录你的浏览历史;网店买个商品,网店会记录你的所有浏览记录、交易记录;用着手机,手机上的各款应用都在记录你的移动互联网行为信息;线下逛个商场,流量摄像头、Wi-Fi 服务、Wi-Fi 探针在统计着客流量的同时,也在记录着客流轨迹;走在城市的街道上,周边的无数安保摄像头也在不停的记录着人群的图像; 在家里, 每个智能家电在提供生活便利的同时, 也在不断累积你的行为历史。 可能大家已经很恐慌了,我们的数据都在不停地被各种收集手段收集,是不是以后就没有隐私了。罗胖的跨年演讲也在用比特化脑洞的概念来强化这份焦虑。其实这些数据离完美数据的方向还很远。 举个例子,图像记录生活从远古就已经存在,图像的比特化也开始于电子图片产生,但是图片中蕴含的信息却极其复杂,现在的 AI 的图像识别能力在深度信息获取上依然有很大的局限。具体可以参考朱松纯教授在视觉求索微信公众号中的文章《浅谈人工智能:现状、任务、构架与统一》中的计算机视觉:从深到暗一节。 实现完美数据的障碍在一段时间内依然很大,体现在几个方面:信息主题的数据采集能力还不完善;采集后的数据可能分散在多个数据 DOMAIN 中,数据的整合成本与难度较大;数据的信息还原能力不足,导致大量数据无法应用,空耗着数据存储的巨大成本。 数据圈一直有个暗数据的概念,暗数据特指那些已经被采集的数据但还没有被发掘和理解的数据。 据统计,大部分企业暗数据的占比高达 90%。再拿宇宙来类比,据估算,宇宙中的暗物质、暗能量更是高达 96%。按照这样估算,我们当前能够采集的数据占完美数据的比重小得可怜。

big-data-dark-data

图片来自:KDnuggets

数据分析师们是否要开始焦虑了? 信息的作用是应用场景,既然没有绝对的完美数据,我们可否寻找业务中的最佳数据应用场景?这些场景能够在一个相对小的环境内,实现准完美数据的应用。

数据场景

场景这个词这几年很是流行,原来用于文化圈的一个词被重构用来展示人与商业的连接。伴随着新场景的创造,新体验、新流行、新洞察、新生活方式等新物种层出不穷。 数据场景展示的是数据与业务场景的连接,数据很早就已经被应用于各类业务场景中了,例如:零售中的精准营销、店铺管理、品类管理、库存管理;金融中的普惠金融、风控管理、智能投顾;物流中的线路优化、运营风控等。 但是过去由于数据采集和分析能力的局限,大部分数据场景仅仅局限于经营分析,对于整体的业务场景的支持作用有限。 每个数据场景都是对应着一个业务场景,业务场景往往可以演绎成一个系统,数据场景同样也可以演绎成一个系统的数据应用场景。 大多数的业务场景都是一个复杂的系统,这个复杂的系统往往是多个层次,每个层次又是由多个尺度组成了一个复杂的系统。我用现在极为火爆的零售场景来举个例子。 零售业态最常讲的尺度有人、货、场,我们来看看线下的大型购物中心,购物中心可能包括多家零售店、超市,组成一个较为复杂的系统。购物中心、零售商家是两个基本层次,每个层次的经营核心都是人、货、场。在这三个尺度上,购物中心与商家的数据采集和应用场景就会有很大差异。

线下购物中心对人的数据掌握一直是个难点,购物中心与商家都逐渐建立了会员体系,但是在用户与客户的转换上,线下商家一直处于被动的模式。 现在,随着 Wi-Fi 等技术的推广应用,建立了更多的数据采集点,但购物中心与商家在数据的维度与深度上依然有较大的差异。例如购物中心只能获取人的流量与轨迹, 获取不了消费关联。

购物中心的系统往往管理到的是商户,这些商户的整体销售数据购物中心可以获取,但到了每个商户的单品销售情况,往往是在单个商家的手上。

线下零售的覆盖范围有限,购物中心的选址与定位,购物中心中零售商家的选择,店铺分布都是需要大量数据来支撑。 可以看出购物中心与零售店两个层次上,零售企业都可以利用自己的人货场数据形成自己层次上的知识。在购物中心这个小的系统上建立一个知识体系来支持自己的运营工作。 购物中心并不是一个孤立的系统,周边的商业环境、配套、线上电商都是这个大系统的一部分,从系统分析的角度,需要更多层次的分析和更多尺度的分析。 我们团队开发了一套方法来系统的解剖和分析一个业务的层次和每个层次中的多个尺度,并识别出其中的关键数据场景,下图描述了这个方法的部分概况。

WX20180130-143444

数据场景的选择

在数据场景中,数据细分场景很多,但数据的采集、存储、应用能力都有很多的局限性,企业的数据负责人需要找到一种系统的分析方法来支持数据分析,让自己的数据应用更加合理。

从单一到复杂

AlphaGo 在围棋方面战胜了人类,这是数据及 AI 领域一次伟大的胜利。但是 AlphaGo 的胜利一直被认为是一次纯粹的干净的数据场景。 首先,围棋对局中的数据与信息的高度一致性,数据能够被完美还原成为信息;其次,信息是完全可以观测的,尽管对弈的人有很多其它因素,但 AlphaGo 完全忽略了人的其它因素;第三,数据中没有噪音,能够完美重现算法;最后,围棋对局中的反馈非常快,这是一个完美的数据、分析、应用、反馈的一个闭环。 大部分实际的系统相对比较复杂,在选择中要充分考虑数据和信息的这几个考虑尺度,把复杂系统分解成为多个相对简单的子系统,并逐步实现数据的价值。

从封闭到开放

在对比零售的线上与线下的用户行为分析时,我们发现,线上的电商特别是大的电商平台例如淘宝、京东,数据场景的封闭性远高于线下的场景,电商平台可以从用户的登录、商品浏览、营销参与、购物意向、订单生成、物流收件、售后服务形成了一个完整的相对封闭的数据场景闭环。 用户的业务数据、行为数据、商品关系相对完整,可以非常客观地评估用户的消费偏好、服务偏好。而线下的零售数据场景则比较开放,销售流程中的开放点太多,增大了数据采集、数据整合和数据分析应用的难度。

从粗放到细化

对于人的描述,生老病死是状态,喜怒哀乐是情绪,衣食住行是消费,爱恨情仇是关系,按照国外文献上的分类方式,这里的每个尺度都被细化成为 64 个不同细分分级。 正是因为人类的复杂程度,对于单个人的精准化营销非常困难。我们通常是把聚焦从单个个体身上拉长到一个人群分类上,通过对人的分群,实现群体特征的聚像,再通过对于特定人群的营销实现精准营销的目标。 那么对于个人的营销是否可以做到精准呢?从人类的实际案例来看,一个线下的营销人员完全可以通过精密设计的营销步骤和多次沟通不断采集信息及反馈, 同时实施带有影响力的信息反馈,最终实现精准营销。 下图描述了通过系统风险方法论定位到数据应用场景的选择样例。 WX20180130-143352

数据引擎

数据场景的选择是在企业中识别出关键的可落地的业务场景,利用采集和积累的数据,产生知识与洞察,而数据应用闭环的最后一个环节是执行。通过一个数据引擎实现数据分析的闭环反馈,实现信息采集及分析的持续优化。 2017 年,我们团队设计了这样的数据引擎的原型,这个原型参考了人的神经系统。 引擎前方是一个实时业务事件引擎,接受外界数据信息并提供数据行动决策反馈; 事件信息经过预处理后由特征选择器根据相应的知识领域,从数据源选择相应的信息特征。 数据的决策由两套系统来支持, 系统 1 由规则引擎来支撑,模拟人的直觉反应,即处于自主控制状态,快速、无意识地做出决策;系统 2 由机器学习模型支撑, 模拟更复杂的行为选择经过深度复杂思考后的决策。 下图展示了这样的一个数据引擎的结构图。 WX20180130-143408

这个系统最早被应用在金融风控中,提供营销反欺诈,交易反欺诈的检测与控制。我们也针对金融反欺诈的需求组织了 8 大类智能决策策略作为数据引擎的策略纲领。 当然这样的系统需要添加更多的能力,包括控制论因素、经济学因素、博弈论等更多复杂的自适应系统能力,才能让这个数据引擎更加健壮。 通过数据、信息、知识、执行的数据能力闭环,后续就是在事上练,不断从大量数据中通过知行合一的方法,修炼数据应用的内功。

数据治理

提起数据治理这个话题我其实比较犯怵。早在 2007 年还在 IBM 工作时,就已经开始接触数据治理的整体框架,在当时的理念当中,IT 是业务创新的增长引擎,而数据就是支持这个引擎运转的汽油。 但数据这个汽油不是我们在市场上已经看到的整理得很标准的 92 号、95 号、98 号汽油。在企业当中,无论是众多应用系统中的结构数据还是散落在各个系统中的大量非结构的数据都非常复杂。 如何找到一个方法把数据和业务需求规整到一起,再用相应的手段促进信息的低损流动,最终促进企业的业务创新,这个方法就是整个数据治理的核心。 在企业数据治理的框架之下,数据治理变成了一个非常复杂的体系,在这个体系中企业的数据成熟度被分成了 5 个级别, 而每个级别都需要基于 11 个类别来度量企业的数据治理能力。 这个数据治理框架较为完备,我们仔细评估这 11 个治理域都是针对数据的治理来定义的,完全实现这样的一套数据治理体系需要一个较为复杂的组织体系及大量的数据治理流程和工具来支撑,往往只有非常大的企业才能支撑一个比较完整的数据治理能力的构建与全面实施。

WX20180130-143646

图片来自:Data-Ed Online Webinar: Data Governance Strategies

仔细回顾过去的数据治理的落地与实践,数据治理体系的落地效果往往并不明显, 回顾总结的教训有几个:数据治理体系过于复杂,往往会被定位在一个 IT 的数据治理部门,部门把大量工作精力集中于治理,反而忘却了数据治理的核心是数据价值。 数据来源于业务,应用于业务,专注于企业级的数据治理往往要跨越多个数据应用业务部门,治理过程庞杂实际上影响了业务部门的效率。 数据驱动的业务,数据驱动的企业叫嚷了很多年,但绝大多数企业的数据应用能力还很低,很难被企业提升到一个战略层次去实施。 同样的道理,数据治理的主要操盘手 CDO(首席数据官),这个职位概念被业界提了很多年,但一个 CDO 上任以后,马上就面临着如何去平衡数据创新、部门协作、生产任务之间的平衡关系。需要一个很强的智商、情商与财商高度结合的高手才能很好处理一个大型企业的数据治理工作。 过去多年的数据实践中,也曾经看到过几个比较好的数据治理切入案例:

案例 1

某大型企业,CDO 上任一个月,就在企业最高管理层的支持下,快速砍出了三板斧:

  1. 收集了企业信息系统中 80% 的现有数据,实现了数据的集中化

  2. 快速梳理了企业数据目录,分发给各个业务部门,征求数据调用需求

  3. 分析了全部需求后,针对数据需求热度,开发了数据服务接口,开始实现对业务部门的数据服务能力。

初见成效以后,才逐渐开始了数据治理的框架建设工作。

案例 2

某大型国企,新 CDO 上任以后,系统调研了当前的企业数据状况及过去几年前任 CDO 在数据标准化、数据整合陷入的各种泥坑后,果断放弃了在当前数据上的各种整合与标准化治理工作。 继而把数据核心人才集中到外界渴求的数据内容上,针对外界需求,开发了一系列数据服务产品,迅速在政府、旅游、金融等领域建立了自己的数据应用能力, 形成数据收入。该 CDO 也成为企业业务创新的代表,成为业界的一个标杆。 这两个案例的共性是这两位 CDO 都把自己的工作中心从管理转移到价值实现上来,个人认为这是数据治理应该遵循的核心原则。下图的两种数据治理的框架图的绘制方式就基本体现了两类数据治理的理念差异。 WX20180130-143622

图片来自:West Monroe

WX20180130-143601图片来自:Data Streams

简化的数据治理

无论数据治理的复杂性如何,数据治理的核心依然是数据资产。围绕着数据资产,有两大类的数据治理方式,分别是垂直治理与水平治理。

垂直治理

垂直治理主要关注于数据产生、数据采集、数据存储、数据转换、数据应用、价值实现的数据垂直治理闭环。 下图描述的是一个企业数据的垂直治理情况。企业级数据治理的数据源来自企业应用系统, 这些数据可能会经过数据应用系统、ODS、数据仓库、数据集市、数据应用等多个数据工程节点。 节点之间的数据转换过程都需要产生大量的元数据,保证数据信息源到数据应用的信息价值过程是垂直治理的一个核心难点。 与此同时,垂直治理同样需要建立相应的治理组织,工作流程及策略标准来保障整个垂直治理的过程。垂直治理是数据治理的基础,如果一个企业对于垂直治理没能建立体系,其它的数据治理必然成为一个空中楼阁,难以发挥其应有的价值。 WX20180130-143544

水平治理

水平治理往往是在企业数据资产化或集中化以后,数据治理的重心逐渐转移到企业级数据资产的价值发掘和探索。从企业来看,数据的价值往往体现在三个主要层面:战略决策支持、管理决策支持和运营决策支持。决策支持的程度由可以定义为业务数据描述、据化诊断、数据预测、智能决策等几个层面。在水平数据治理之下,围绕着数据相关的资产,治理的过程主要有发现、规定、应用、度量等一系列过程。 WX20180130-143530

图片来自:Informatica Blog

在水平治理过程中,需要重点强调的是数据资产并不仅仅是数据本身,还需要考虑到数据相关的业务流程、支撑组织,具体应用当中需要细化到流程的节点,组织也要细化到执行个体上。只有把数据治理覆盖到企业战略、优先级、业务场景、业务策略、业务标准、架构等多个层面上,才能够真正体现数据的全面性与关联性。 第二个需要重点强调的是价值必须深入到这过程中的每一个环节,始终坚持价值为要,才能够更好的实现数据治理的目标。 数据是一个企业的重要资产之一,未来的数据治理可能像财务或人力资源部门一样会成为企业的一个业务功能部门。这个部门会逐渐建立自己的业务流程、管理流程、品质规范、信息生命周期管理过程等众多的管理过程和最佳管理实践。 这个部门会比以前企业业务和 IT 部门之间的关系更加紧密,建立起强大的协作关系来赋能业务部门的关键业务创新。从数据分析技术本身,我们也看到了众多新技术,例如机器学习技术已经被用在数据治理过程当中来数据化关键过程,并且量化管控效果及价值。 随着技术与工具的发展,更多的企业已经开始了数据治理能力的建设,相信数据治理将会从大型企业的样板工程逐步成为企业的标配,实现对数据驱动企业的全面支持。  

  • Jan 26 / 2018
  • 0
Tech

锐眼洞察 | 机器学习与行为生物识别:天作之合(翻译)

作者:Avi Turgeman

原文:Machine Learning And Behavioral Biometrics: A Match Made In Heaven

译者:TalkingData研发工程师 张永超

本译文禁止商用,转载请注明来源!

最近发布的市场研究报告显示,未来五年,机器学习市场规模将以44.1%的年复合增长率迅速增长,这一增长主要受金融服务业的驱动,而在金融服务业正是大数据可以产生关键和可行的业务洞察力的地方。

在行为生物识别技术的世界里,机器学习、深度学习和人工智能都是相辅相成的。行为生物识别技术通过他们如何与设备和在线应用进行交互来识别人们。行为生物识别技术是一种完全被动的,在后台工作的动态模式,使其不可能复制或窃取,而不是像某个设备、令牌或静态属性(如指纹或名称)。今天的行为生物识别技术可以从移动设备上捕获2000多个参数,包括人们持机、滚屏、屏幕间切换的方式,他们在输入时使用的压力以及他们如何响应在线应用程序中呈现的不同视图。行为生物识别技术主要用于防止在申请在线信用卡或者在线转账付款时使用被盗或合成身份,以及用户登录会话时防止账户被恶意接管等。 (注意:今天的大部分欺诈行为都发生在经过验证的会话中。)

数据科学家发现了一个有趣的事实:人们的工作方式是非常不可预测的,没有一套固定的行为参数可以用来区别个人,也没有一个通用的模型来衡量每个人以产生准确的结果,既在假阳性方面,关键这是防止欺诈和身份盗用,最重要的这是维护最佳的用户体验。这种方法被称为个别特征选择。它使得行为生物识别技术在长期以及不同的应用和使用情况下显着更加可塑,因为这意味着对于每个人来说哪个参数是好的,并没有事先做出假设,而是选择该用户的最佳设置。

静态 VS. 动态生物识别技术

物理生物识别技术(如脸部,手指和虹膜技术)主要基于静态图像中捕捉的测量点。如上所述,行为生物识别技术是由人工智能驱动的动态方法控制的。由于数据科学领域的进步,极大型数据集的合并和处理成为可能,这反过来又推动了机器学习,最近又推动了深度学习。

移动设备上的连续认证就是这种动态方法的一个很好的例子。使用四个主要设备传感器(触摸、加速度计、陀螺仪和方位),可以使用数百甚至数千行为模式来持续认证用户。这些参数包括点击持续时间、滑动速度、指纹区域、会话持续时间和设备加速度等。配置文件的建立是为了确定用户对整个人口集的行为,这些行为可能会随时间而改变。机器学习可以推动支持所分析的大量参数和数据集所需的决策过程。

机器学习被用于行为生物识别的所有方面。它能够从人类行为中学习,并不断改进可用于验证会话或事务的用户配置文件。以敲击键盘为例,行为生物识别技术以击键速度和手指的类型为基础,在10分钟内可以建立一个足够强大的配置文件来验证用户的银行转账。然而,随着时间的推移和一个人更多的使用这个设备,根据应用的定义,他们的行为会适应和变化。机器学习有助于突破各种信号的混乱,并随着时间的推移发现行为模式的一致性。

行为生物识别和人工智能的认证范式悬而未决

有关传统认证过程的缺点已经写了很多。今天的大部分欺诈来自于使用被盗或合成身份创建的初始账户,或者在经过认证的会话中,如通过恶意软件以合法用户登录、社交工程、机器人或其他类型的远程访问攻击,使得用户在登录后恶意接管等。

这时行为生物识别技术能够提供被动,无摩擦,持续认证的能力。事实上,根据墨卡托咨询集团的说法,“行为生物识别技术将在未来五到八年内重新构建认证领域”。

最初,人工智能驱动的行为生物识别技术主要用于金融服务行业的账户欺诈预防。最近,如上所述,该技术的应用已经扩展到身份验证,以提供用于根据海量数据泄露来检查在线应用的有效性的新维度,并且允许在支付应用中进行基于风险的验证。人工智能知识的进步将继续推动这项技术的更多功能,随着这种方法的不断采用和规模化,这将会进一步完善。

  • Jan 26 / 2018
  • 0
Tech

锐眼洞察 | 开源数据技术简史(翻译)

作者:Keith D. Foote 

原文:A Brief History of Open Source Data Technologies

译者:TalkingData数据工程师 孙强

本译文禁止商用,转载请注明来源!

自文明开始以来,公开分享信息一直是人类文化的一部分。 信息将与大众共享,实践对工具和机械的发展产生了强大的影响。 与这种做法相对应的是所有权和控制权的概念,也就是所谓的“知识产权”。例如,专利和版权是基于这样的信念:发明人应该在别人使用或模仿的时候得到报酬, 他们是原创。 尽管公开分享新的想法很难被滥用,但专利可以被滥用,并且有合理的计划。 例如,1879年,专利律师乔治•B•塞尔登(George B. Selden)申请了一项专利,声称对2冲程汽油发动机的“主意”拥有所有权,由于货币的原因,延迟了专利局的批准直到1895年。 在推迟专利审批的同时(但不是申请日期),汽车正在设计和建造之中。 1899年,电动汽车公司以每辆汽车15美元的价格购买了他的专利的专利权(按现在的通货膨胀标准,每辆汽车420美元),然后开始成功起诉汽油动力汽车制造商专利侵权。 到1904年,有30家汽车制造商向电动汽车公司支付了1.25%的汽车销售,其中五分之一用于塞尔登。 这一直持续到1911年,当时亨利•福特使用四缸“四循环”发动机,摆脱了专利的束缚,塞尔登的不道德专利突然变得毫无价值。 (拥有网站名称的人对使用权进行收费对网站拥有者也有类似的束缚)。 汽车贸易委员会(最终名为“汽车制造商协会”)于同年成立,并制定了美国所有汽车制造商共享的交叉使用许可协议。 每个公司都可以开发新的技术和申请专利,但是专利是公开分享的,制造商之间没有交换货币,也没有任何法律诉讼。 显然,汽车制造商不希望陷入类似的专利束缚。

自由软件运动

“自由软件”可以不需要付费,但就自由软件运动而言,这个词是指用户可以自由复制,更改,改进,运行和分发的软件。 自由软件运动更多的是行动自由,而不是价格。 自由软件的限制很少,没有“追求利润的意图”。为了达到这些目标,自由软件基金会于1985年成立。自由软件基金会的使命是:“保护,保护和促进使用,学习,复制,修改和重新分配计算机软件的自由,维护自由软件用户的权利”。

开源运动

虽然“自由软件”可以说是一个强调自由的社会运动,但是开源软件将被描述为通过以公众为资源来改善和开发软件的集体努力。 从某种意义上说,开源依靠人们的“善良天使”来开发软件和技术。 一般来说,开放源代码描述了源代码已经发布并公开的软件,允许任何人使用,复制,修改和重新发布,而无需支付使用费或费用。 这使得开源代码可以通过社区合作的方式进行有机的演变。 开放源代码计划作为一个官方组织,于1998年创建,作为开源活动的倡导者,教育者和管理者。 由多个独立程序员开发的开源软件(协同软件开发)提供比任何单个公司所希望提供的更“原始”设计。 对于一些商业软件供应商来说,这种情况被视为一种威胁。 2001年,微软前任高管吉姆•阿尔奇内(Jim Allchine)公开表示: “开源是一个知识产权驱逐舰。 我无法想象软件业务和知识产权业务可能会比这更糟糕。“微软此后已经扭转了在开源领域的地位,并且与谷歌,IBM,甲骨文一起,正在互联网上建立一个官方的开放源码存在。 不用说,这对资本主义模式转变的意义造成了重大混乱。 (知识产权的所有权和不道德使用可以被认为是极端的资本主义,而开放源代码倡议被认为是一种个人协同的形式)。

UNIX 共享代码 (IBM)

在现代计算的发展中扮演着重要的角色。 AT&T贝尔实验室于1969年开始开发一个名为UNIX的小型操作系统。 目标是设计一个便携式的多任务系统,为分时配置的多用户设计。 在1972年,UNIX被改写,使用程序语言C,它允许程序和数据从“原始硬件”传输,使数据变得可移植。 反托拉斯案阻止了AT&T进入电脑业务,并要求他们授权系统的源代码给所有的请求方。 这导致学术机构和企业很快利用UNIX程序。 加利福尼亚大学伯克利分校的程序员开发了他们自己的操作系统的进化版本,标题是伯克利软件分发,公众可以访问。 (整个故事要复杂得多)

Mozilla诞生于1998年的网景源代码

网景社区于1995年推出了第一款真正的商业网络浏览器Netscape Navigator,当时并没有真正的竞争。 然而,微软正在研究Internet Explorer,并于1996年推出了一款能够与Netscape竞争的浏览器。 新的竞争促使Netscape于1998年向公众发布源代码,目的是模仿UNIX并将公众作为开发资源。 不幸的是,这一步骤阻碍了他们最新的浏览器平台的发展,给微软带来了Internet Explorer成为“使用最多的浏览器”的必要优势。网景通讯从未恢复,并被AOL收购。 2008年3月1日,网景公司正式停产,终止了对所有网景客户(他们感到震惊和沮丧)产品和浏览器的支持。 但是,Netscape的开源版本的源代码促使Mozilla组织的创建。

Linux

Linux程序提供了计算历史上开源软件协作最典型的例子之一。 Linux是由Linus Torvalds于1991年发明的。他曾就读于赫尔辛基大学,曾在Minix这个类似Unix的系统工作,并开始设计自己的内核。 Torvalds从设计硬盘访问和设备驱动程序开始,展示了他所称的基本设计,即版本0.01。 内核,后来被称为Linux,后来与开源GNU系统(发音g’noo)结合起来,生产出一个完全免费的操作系统。 任何人都可以使用,修改和分发Linux源代码。 在Linux上完成的大部分工作由Linux社区执行,其中包括来自世界各地的数千名程序员,他们向维护人员发送改进建议。 公司也帮助开发了Linux内核,并开发了通常用于该程序的“额外”软件。 Apache软件基金会(ASF) Apache软件基金会的使命是为公共利益提供软件。 它成立于1999年,是一个慈善组织。 它从个人和企业赞助商那里获得资金,并使用全志愿董事会。 该组织监督350多个开源项目。

Apache Hadoop

Apache Hadoop最初被称为Nutch,由Doug Cutting和Mike Cafarella两个人设计。 他们正在设计一个能够索引10亿个页面的搜索引擎系统,后来他们与MapReduce相结合。 Hadoop的成本效益来自使用基于商用硬件构建的计算机集群。 大数据集被分解,然后存储在本地磁盘上。 任何故障都通过软件来纠正,而不是昂贵的服务器。 Hadoop的成功,因为它是: 免费

  • 非常可扩展性:它在数百台低成本服务器上存储大型数据集
  • 灵活:提供对新数据源的访问,并可以访问不同类型的数据
  • 非常快速:可以在几分钟内有效处理TB级数据,在几小时内可以高达PB级数据
  • 备份:将数据发送到单个节点,然后复制到其他节点作为备份

Apache Spark

Apache Spark自发布以来迅速普及。 它比Apache Hadoop更快,可扩展性更强。 雅虎,Netflix和eBay等企业已经开始大规模使用它。 Spark与Hadoop相结合,已经迅速成为使用大数据的最大的开源社区之一。 (Spark不带文件管理,但可以使用Hadoop的分布式文件系统管理文件。)

Apache Storm

Apache Storm免费,是一个开源的实时计算系统。 它可以基本上实时处理大量的大数据,具有可扩展性,易于操作。Storm可以用于:

  • 实时分析
  • 在线机器学习
  • 连续计算
  • 分布式远程过程调用(RPC)

Apache Hive

Apache Hive是一个开源系统,用于使用基于SQL的语言查询数据。 它将总结和分析数据,将其转化为有用的业务见解。 Hive与传统的数据集成和数据分析工具兼容。许多数据仓库应用程序与基于SQL的查询语言兼容,Hive支持基于SQL的数据向Hadoop的可移植性和传输。 虽然最初由Facebook开发,但Hive已经被金融业监管机构和Netflix等公司使用和开发。

Apache Pig

Apache Pig用于分析以高级语言编写的大型数据集,旨在表达数据分析程序,并结合基础设施来评估程序。 Apache Pig的重要特性是提供大量并行化的能力。 这使系统能够处理“非常”大的大数据集。

开源硬件

开放源代码硬件是一种硬件,其规格已经发布并可供公众访问,允许个人复制,修改和重新分配,而无需支付使用费或费用。 这个政策也适用于开源机器人。 开源硬件基于社区合作。 社区通常由业余爱好者,硬件/软件开发者和一些大型企业组成。  

  • Jan 25 / 2018
  • 0
Tech

锐眼洞察 | 详谈 GCD(Grand Central Dispatch)的基本使用

作者:TalkingData研发工程师 张永超

本文为TalkingData原创,未经授权禁止转载。申请授权请在评论中留言联系!

1. GCD(Grand Central Dispatch)介绍

Grand Central Dispatch (GCD) 是 Apple 开发的一种多核编程的解决方法。该方法在 Mac OS X 10.6 Lion 中首次推出,并随后被引入到了 iOS4.0 中。GCD 是一个替代诸如 NSThread, NSOperationQueue, NSInvocationOperation 等技术的更高效和强大的技术。

GCD 属于系统级的线程管理技术,在 Dispatch queue 中执行相关任务的性能非常高。GCD 的源代码已经开源,感兴趣的可以参考Grand Central Dispatch。 GCD 中的FIFO队列称为 dispatch queue,以用来保证先进入队列的任务先得到执行。

GCD 简述

  • 和Operation queue相同,都是基于队列的并发编程API,均是通过集中管理、协同使用的线程池。

GCD具有5个不同的队列:

  1. 运行在主线程中的 Main queue
  2. 三个不同优先级的队列(High Priority Queue,Default Priority Queue,Low Priority Queue)。
  3. 更低优先级的后台队列 Background Priority Queue,主要用于I/O。
  4. 用户可自定义创建队列:串行或并行队列
  5. 具体的操作时在多线程上还是单线程上,主要依据队列的类型和执行方法,并行队列异步执行在多线程,并行队列同步执行只会在单线程(主线程)执行。

GCD 基本的概念

标准队列

标准队列是指GCD预定义的队列,在iOS系统中主要有两个:

WX20180125-183854

自定义队列

用户可以自定构建队列,并设置队列是并行还是串行:

WX20180125-183941

同步\异步线程创建

用户也可以根据需要自行构建同步\异步线程:

WX20180125-184016

2. 队列(dispatch queue)

  • Serial(串行队列):又叫做 private dispatch queues,同时只执行一个任务(Task)。Serial queue 常用语同步访问特定的资源或数据,当创建了多个 Serial queue 时,虽然各自是同步的,但是 Serial queue 之间是并发执行的。
  • Main dispatch queue: 全局可用的 Serial queue,在应用程序的主线程上执行。
  • Concurrent(并行队列):又叫做 global dispatch queues,可以并发的执行多个任务,但是执行的顺序是随机的。iOS 系统提供了四个全局并发队列,这四个队列有着对应的优先级,用户是不能创建全局队列的,只能获取,如下:

WX20180125-184318

  • Custom(自定义队列):用户可以自定义队列,使用 dispatch_queue_create 函数,并附带队列名和队列类型参数,其中队列类型默认是NULL,代表DISPATCH_QUEUE_SERIAL串行队列,可以使用参数DISPATCH_QUEUE_CONCURRENT设置并行队列。

 

WX20180125-184351
  • 自定义队列的优先级:在自定义队列的时候,可以设置队列的优先级,使用dipatch_queue_attr_make_with_qos_class或者dispatch_set_target_queue方法来设置,如下:

 

WX20180125-184955
  • dispatch_set_target_queue:此方法不仅能够设置队列优先级,还可以设置队列的层级体系,比如让多个串行队列和并行队列在统一的一个串行队列里执行,如下:

WX20180125-185418

队列的类型

在iOS中,队列本身默认是串行的,只能执行一个单独的block,但是队列也可以是并行的,同一时间执行多个block。

在创建队列时,我们通常使用dispatch_queue_create函数:

WX20180125-185443

iOS中的公开5个队列:主队列(main queue)、四个通用调度队列以及用户定制的队列。对于四个通用调度队列,分别为:

  • QOS_CLASS_USER_INTERACTIVE:user interactive 等级表示任务需要被立即执行已提供最好的用户体验,更新UI或者相应事件等,这个等级最好越小规模越好。
  • QOS_CLASS_USER_INITIATED:user initiated等级表示任务由UI发起异步执行。适用场景是需要及时结果同时又可以继续交互的时候。
  • QOS_CLASS_UTILITY:utility等级表示需要长时间运行的任务,伴有用户可见进度指示器。经常会用来做计算,I/O,网络,持续的数据填充等任务。
  • QOS_CLASS_BACKGROUND:background等级表示用户不会察觉的任务,使用它来处理预加载,或者不需要用户交互和对时间不敏感的任务。

一个典型的实例就是在后台加载图片:

WX20180125-190159

队列类型的使用

那么具体在操作中,什么时候使用什么类型的队列呢?通常有如下的规则:

  • 主队列:主队列通常是其他队列中有任务完成,需要更新UI时,例如使用延后执行dispatch_after的场景。
  • 并发队列:并发队列通常用来执行和UI无关的后台任务,但是有时还需要保持数据或者读写的同步,会使用dispatch_sync或者dispatch_barrier_sync 同步。
  • 自定义顺序队列:顺序执行后台任务并追踪它时。这样做同时只有一个任务在执行可以防止资源竞争。通常会使用dipatch barriers解决读写锁问题,或者使用dispatch groups解决锁问题。

可以使用下面的方法简化QoS等级参数的写法:

WX20180125-190306

dispatch_once用法

dispatch_once_t要是全局或static变量,保证dispatch_once_t只有一份实例。

WX20180125-190343

dispatch_async

设计一个异步的API时调用dispatch_async(),这个调用放在API的方法或函数中做。让API的使用者有一个回调处理队列。

WX20180125-190406
可以避免界面会被一些耗时的操作卡死,比如读取网络数据,大数据IO,还有大量数据的数据库读写,这时需要在另一个线程中处理,然后通知主线程更新界面,GCD使用起来比NSThread和NSOperation方法要简单方便。

WX20180125-193828

dispatch_after延后执行

dispatch_after只是延时提交block,不是延时立刻执行。

WX20180125-190811

范例,实现一个推迟出现弹出框提示,比如说提示用户评价等功能。

WX20180125-190834

例子中的dispatch time的参数,可以先看看函数原型


WX20180125-190857
第一个参数为DISPATCH_TIME_NOW表示当前。第二个参数的delta表示纳秒,一秒对应的纳秒为1000000000,系统提供了一些宏来简化:

WX20180125-190923
如果要表示一秒就可以这样写:

WX20180125-190949
dispatch_barrier_async使用Barrier Task方法Dispatch Barrier解决多线程并发读写同一个资源发生死锁

Dispatch Barrier确保提交的闭包是指定队列中在特定时段唯一在执行的一个。在所有先于Dispatch Barrier的任务都完成的情况下这个闭包才开始执行。轮到这个闭包时barrier会执行这个闭包并且确保队列在此过程不会执行其它任务。闭包完成后队列恢复。需要注意dispatch_barrier_async只在自己创建的队列上有这种作用,在全局并发队列和串行队列上,效果和dispatch_sync一样。

WX20180125-191022WX20180125-191039

Swift示例:

WX20180125-191105

都用异步处理避免死锁,异步的缺点在于调试不方便,但是比起同步容易产生死锁这个副作用还算小的。

dispatch_apply进行快速迭代

类似for循环,但是在并发队列的情况下dispatch_apply会并发执行block任务。

WX20180125-191137

dispatch_apply能避免线程爆炸,因为GCD会管理并发。

WX20180125-191203
示例:

WX20180125-191228
Block组合Dispatch_groups

dispatch groups是专门用来监视多个异步任务。dispatch_group_t实例用来追踪不同队列中的不同任务。

当group里所有事件都完成GCD API有两种方式发送通知,第一种是dispatch_group_wait,会阻塞当前进程,等所有任务都完成或等待超时。第二种方法是使用dispatch_group_notify,异步执行闭包,不会阻塞。

第一种使用dispatch_group_wait的swift的例子:

WX20180125-191306WX20180125-191324
OC例子:

WX20180125-191355

第二种使用dispatch_group_notify的swift的例子:

WX20180125-191426

OC例子:

WX20180125-191524

如何对现有API使用dispatch_group_t:

WX20180125-191614

注意事项

  • dispatch_group_async等价于dispatch_group_enter() 和 dispatch_group_leave()的组合。
  • dispatch_group_enter() 必须运行在 dispatch_group_leave() 之前。
  • dispatch_group_enter() 和 dispatch_group_leave() 需要成对出现的

3. Dispatch Block

队列执行任务都是block的方式

创建block。

WX20180125-191921

dispatch_block_wait:可以根据dispatch block来设置等待时间,参数DISPATCH_TIME_FOREVER会一直等待block结束。

WX20180125-192121

dispatch_block_notify:可以监视指定dispatch block结束,然后再加入一个block到队列中。三个参数分别为,第一个是需要监视的block,第二个参数是需要提交执行的队列,第三个是待加入到队列中的block。

WX20180125-192344

dispatch_block_cancel:iOS8后GCD支持对dispatch block的取消​

WX20180125-192537

使用dispatch block object(调度块)在任务执行前进行取消

dispatch block object可以为队列中的对象设置。

示例,下载图片中途进行取消:

WX20180125-192612WX20180125-192632

Dispatch IO 文件操作

dispatch io读取文件的方式类似于下面的方式,多个线程去读取文件的切片数据,对于大的数据文件这样会比单线程要快很多。

WX20180125-192655
  • dispatch_io_create:创建dispatch io
  • dispatch_io_set_low_water:指定切割文件大小
  • dispatch_io_read:读取切割的文件然后合并。

苹果系统日志API里用到了这个技术,可以在这里查看。

WX20180125-192731WX20180125-192816

此内容就到这里了。其他的技术点将会陆续放出,GCD是个好东西,但是在使用的时候一定要理清楚其含义,否则很容易出现不可调试的问题等。

  • Jan 25 / 2018
  • 0
Tech

锐眼洞察 | 机器学习和统计模型的差异(翻译)

作者:Tavish Srivastava

原文:Difference between Machine Learning & Statistical Modeling

译者:TalkingData解决方案架构师 李堃

本译文禁止商用,转载请注明来源!

在各种各样的数据科学论坛上,有这样一个问题经常会被问到——机器学习和统计模型的差别是什么?

这确实是一个难以回答的问题。考虑到机器学习和统计模型所解决问题的相似性,两者的区别似乎仅仅在于数据量和模型建立者的不同。

在这篇文章中,我将尽最大的努力来展示机器学习和统计模型的区别,同时也欢迎业界有经验的朋友对本文进行补充。

在我开始之前,让我们先明确使用这些工具背后的目标。无论采用哪种工具去分析问题,最终的目标都是从数据获得知识。两种方法都旨在通过分析数据的产生机制挖掘 背后隐藏的信息。

两种方法的分析目标是相同的。现在让我们详细的探究一下其定义及差异。

定义

机器学习:一种不依赖于规则设计的数据学习算法。

统计模型:以数学方程形式表现变量之间关系的程式化表达。

对于喜欢从实际应用中了解概念的人,上述表达也许并不明确。让我们看一个商务的案例。

商业案例

让我们用麦肯锡发布的一个有趣案例来区分两个算法。

案例:分析理解电信公司一段时间内客户的流失水平。

可获得数据:两个驱动-A&B

麦肯锡接下来的展示足够让人兴奋。请从下图来理解一下统计模型和机器学习算法的差别。

Screen Shot 2015-06-30 at 11.32.20 PM

从图中你观察到了什么?统计模型在分类问题中得到一个简单的分类线。 一条非线性的边界线区分了高风险人群和低风险人群。 但当我们看到通过机器学习产生的等高线时, 我们发现统计模型似乎没有办法和机器学习算法进行比较。 机器学习的方法获得了任何边界都无法详细表征的信息。这就是机器学习可以为你做的。

更令人兴奋的是,机器学习还被应用在YouTube和Google的引擎推荐上,机器学习通过瞬间分析大量的观测样本给出近乎完美的推荐建议。 即使只采用一个16 G内存的笔记本,每天处理数十万行的数千个参数的模型也不会超过30分钟。然而一个统计模型需要在一台超级计算机跑一百万年来观察数千个参数。

机器学习和统计模型的差异:

在给出了两种模型在输出上的差异后,让我们更深入的了解两种范式的差异,虽然它们所做的工作类似。

  • 所属的学派
  • 产生时间
  • 基于的假设
  • 处理数据的类型
  • 操作和对象的术语
  • 使用的技术
  • 预测效果和人力投入

以上提到的这几方面都能从不同程度上区分机器学习和统计模型,但并不能给出机器学习和统计模型的明确界限。

分属不同的学派

机器学习:计算机科学和人工智能的一个分支,通过数据学习构建分析系统,不依赖明确的构建规则。

统计模型:数学的分支用,通过发现变量之间相关关系从而预测输出。

诞生年代不同

统计模型的历史已经有几个世纪之久。但是机器学习却是最近才发展起来的。二十世纪90年代,稳定的数字化和廉价的计算使得数据科学家停止建立完整的模型而使用计算机进行模型建立。这催生了机器学习的发展。随着数据规模和复杂程度的不断提升,机器学习不断展现出巨大的发展潜力。

假设程度差异

统计模型基于一系列的假设。例如线性回归模型假设:

  1. 自变量和因变量线性相关
  2. 同方差
  3. 波动均值为0
  4. 观测样本相互独立
  5. 波动服从正态分布

Logistics回归同样拥有很多的假设。即使是非线性回归也要遵守一个连续的分割边界的假设。然而机器学习却从这些假设中脱身出来。机器学习最大的好处在于没有连续性分割边界的限制。同样我们也并不需要假设自变量或因变量的分布。

数据区别

机器学习应用广泛。在线学习工具可以飞速处理数据。这些机器学习工具可学习数以亿计的观测样本,预测和学习同步进行。一些算法如随机森林和梯度助推在处理大数据时速度很快。机器学习处理数据的广度(来源更多)和深度(观察更大量)上做的非常好。但统计模型一般应用在较小的数据量和较窄的数据属性上。

命名公约

下面一些命名几乎指向相同的东西:

Screen Shot 2015-07-01 at 12.19.11 AM

公式:

虽然统计模型和机器学习的最终目标是相似的,但其公式化的结构却非常不同。

在统计模型中,我们在试图估计f函数时是通过:

因变量(Y)=f(自变量)+ 扰动 函数

机器学习放弃采用函数f的形式,简化为:

输出(Y)——> 输入(X)

它试图找到n维变量X的袋子,在袋子间Y的取值明显不同。

预测效果和人力投入

自然在事情发生前并不给出任何假设。一个预测模型中,假设越少、预测效率越高。机器学习名称的内涵就是减少人力投入。机器学习通过反复迭代学习发现隐藏在数据中的科学。由于机器学习作用在真实的数据上并不依赖于假设,预测效果是非常好的。统计模型是数学的加强,依赖于参数估计。它要求模型的建立者提前知道或了解变量之间的关系。

结束语

虽然机器学习和统计模型看起来为预测模型的不同分支,但它们非常相近。经过数十年的发展,两种模型间的差异性越来越小。模型之间相互渗透和相互学习,使得未来两种模型的界限更加模糊。

  • Jan 22 / 2018
  • 0
Data, Tech

锐眼洞察 | 数据质量六步法(翻译)

作者:Ramesh Dontha

原文:Data Quality – A Simple 6 Step Process

译者:TalkingData数据科学家 孙强

本译文禁止商用,转载请注明来源!

我们都听说过很多关于低数据质量的恐怖故事。很多公司拥有数百万条记录,包括客户联系号码“(000)000-0000”、购买日期“99/99/99”、12个不同的性别值、没有状态信息的送货地址等等。“脏数据”为企业和组织带来了实际的成本消耗。 例如,美国邮政总局估计,2013年在处理由于数据质量差而导致无法投递的邮件上花费了15亿美元。 质量差的数据来源可能很多,但可以大致分为数据输入、数据处理、数据集成、数据转换和过时数据(陈旧的数据)。

那么,您改如何确保数据始终保持高质量? 人们越来越意识到数据对于做出明智决策的重要性,数据不准确会导致灾难性的后果。 挑战在于确保企业为其业务收集/采购相关的数据,以有意义和可持续的方式管理/治理这些数据,以确保关键主数据的高质量记录,并通过分析高质量数据以实现预定的业务目标。 基于数据质量专家和从业者的最佳实践,我们制定了6个步骤的数据质量框架。

第1步 – 定义

明确改进数据质量所要实现的业务目标,数据所有者/利益相关方,受影响的业务流程和数据规则。

以客户数据为例:

  • 目标:确保所有客户记录都是唯一的、信息准确性(例如:地址、电话号码等)、跨多系统数据的一致性等。
  • 数据所有者:销售副总裁
  • 利益相关方:金融、营销和生产
  • 受影响的业务流程:订单输入、开票、履行等
  • 数据规则:规则1 – 客户名称和地址应该是唯一的;规则2 – 所有的地址都应根据经核准的地址参考数据库进行核实

第2步 – 评估

根据定义步骤中规定的规则评估现有数据。 从关键属性的准确性、所有必要属性的完整性、跨多个数据集的属性的一致性、数据的及时性等多维度,对数据进行评估。根据每个企业的数据量、数据种类和数据质量项目的范围, 我们可能会使用一些分析工具进行定性和/或定量评估。 这是评估现有政策(数据访问、数据安全性、遵守特定行业标准/指南等)的阶段。

举例:

  • 评估客户记录中唯一性记录(包括姓名和地址)的占比;评估关键属性中等非空值的占比。

第3步 – 分析

对评估结果进行多方面分析。其中一个需要分析的方面是DQ业务目标与当前数据之间的差距。另一个需要分析的方面是数据质量较差的根本原因(如果是这样的话)。

举例:

如果客户地址不准确,不符合业务定义的目标,那么根源是什么? 是否是订单输入应用程序数据验证问题? 或者参考地址数据不准确?如果订单输入系统中的客户名称与财务系统中的不一致,是什么造成了这种不一致?

第4步 – 改进

根据前期分析设计和制定改进计划。 计划应该包含所涉及的时间表、资源和成本。

举例:

所有应用程序对地址的修改必须经过选定地址参考数据库的验证;客户名称只能通过订单输入应用修改;对系统的调整将需要6个月的时间才能实现,并需要XYZ资源和$$$。

第5步 – 实施

实施在改进阶段确定的解决方案。掌握技术以及其他业务流程相关的变化。实施全面的“变革管理”计划,确保所有利益相关方得到适当培训。

第六步-控制

定期验证数据是否与定义步骤中规定的业务目标和数据规则保持一致。定期向所有利益相关方传达数据质量指标和当前状态,以确保整个组织持续保持数据质量规范。

数据质量不是一次性项目,而是一个持续的过程,要求整个组织都以数据为导向、以数据为中心。 从大局来看,数据质量管理可以为组织带来丰厚收益。

  • Jan 22 / 2018
  • 0
Ideas, Tech

锐眼洞察 | 2018年及未来的人工智能走向(翻译)

作者:Eugenio Culurciello

原文:Artificial Intelligence, AI in 2018 and beyond

译者:TalkingData研发副总裁 阎志涛

本译文禁止商用,转载请注明来源!

译者注: 很多对于未来的预测实际上经常是错误的,不过多看看不同的人对未来的想法无疑是有价值的。人工智能发展到现在已经在很多领域证明了自己。不过目前的人工智能还远远达不到我们期望中的那个状态。下一个目标无疑是人工智能有了更好的感知能力,能够利用记忆、迁移学习以及持续学习能力来处理复杂的情况,这样的人工智能可能才会逐渐的向通用智能方面发展。

以下是我关于深度神经网络以及机器学习在更广泛的人工智能领域如何发展的看法,以及我们如何能够获得越来越复杂的机器以帮助我们的日常生活。 需要注意的是这些并不是对于未来的预测,而是对这些领域的发展轨迹、趋势以及技术需求进行更详细的分析,从而让我们能够获得有用的人工智能。 并不是所有的机器学习都是针对人工智能的,还有一些比较容易获得的成果,这里也会一并进行介绍。

目标

这个领域的目标是实现达到或者超过人类的机器,从而能够在我们的日常生活中帮助我们。自动驾驶车辆、智能家居、智能助手以及安全摄像头是第一个目标。家庭烹饪和清洁机器人以及无人机和机器人是第二个目标。另外一个是移动设备上的智能助手。还有就是能够听到或者看到我们日常生活中经历的全职的智能陪伴助理。终极目标是一个完全自主的综合体,在执行人类的日常任务上能够达到或者超过人类。

软件

在这里,软件被定义为通过优化算法进行训练的能够解决一个特定任务的神经网络架构。 在今天,神经网络已经在事实上成为了学习解决任务的工具,这些任务涉及通过监督学习来对大规模数据集进行分类。但这并不是人工智能,因为在真实的世界中经常需要从没有经历过的经验中进行无监督的学习,这需要能够整合从不同环境中获得的知识去解决所面临的新问题。

神经网络架构 – 几年前,当这个领域蓬勃发展时,我们经常说它具备从数据中自动学习算法参数的能力,并且优于人手工进行的特征工程。但是我们有意识的忘掉了一个小细节:基于训练来解决任务的神经网络架构并不是从数据中学得的,实际上它仍旧是由人来设计的。基于经验进行手工设计仍旧是这个领域中最主要的局限之一。神经网络架构是学习算法基础的核心。尽管我们的学习算法能够掌握新的任务,如果神经网络不正确,它们仍旧不能正常的工作。从数据中学习神经网络架构的问题在于在一个大规模数据集上尝试多个架构花费的时间太长。一个人不得不从头到尾尝试训练多个架构去看看哪个能够表现的最好。这正是我们今天最为耗时的试错的过程。我们需要在这个问题上投入更多的人的脑力去解决这个重要的问题。

非监督学习 – 我们不能总是在那里指导神经网络如何去做,不能总是在帮助它们纠正每一个错误,对它们的性能提供反馈,我们有我们自己的生活要去过。但是这就是我们今天对于有监督的神经网络需要做的:对于每一个实例,我们都要去帮助它使得它能够正确的工作。相反,人类会从一些例子中去学习,然后能够以一种持续的方式自我修正和学习更复杂的数据。

预测神经网络 – 当前的神经网络的一个主要局限就是它不具备我们人类大脑的一个重要特性:预测能力。关于人类大脑是如何工作的一个主要理论是大脑在不断做出预测:预测编码。如果你仔细想一下,我们每天都会体验到它。当你提起一个你认为很轻但是实际上很重的物体时,你会感到吃惊。因为当你准备提起它时,你已经预测了它将会如何影响你和你的身体,以及以及如何影响周边环境。 预测不仅仅帮助理解世界,而且还能够帮助我们知道什么时候不需要、什么时候需要学习。实际上,我们保存关于我们不知道的或者让我们感到吃惊的事情的信息,这样下次遇到的时候我们就不会感到吃惊。认知能力显然与我们大脑中的注意力机制有关系:我们具备先天的能力能够去忘掉99.9%的感官输入,而仅仅聚焦于对于我们的生存至关重要的数据 – 威胁在那里以及我们跑到哪里您够避开它。或者,在当今的社会,当我们急着要出门时我们的手机在哪里。 构建预测神经网络是与真实世界交互以及在复杂的环境中能够进行运转的核心,因此这是任何强化学习网络的核心网络。我们已经广泛的讨论了预测神经网络这个话题,并且是研究和创建它们的先锋组织之一。

当前的神经网络的局限 – 我们前面已经讨论了今天的神经网络的局限,不能够预测、基于内容的推理以及不稳定性,因此我们需要一种新型的神经网络。 神经网络胶囊是解决当前的神经网络局限的一种方法。在这里我们认为胶囊需要扩充一些新的特性:

  • 对视频帧的操作:这非常的简单,我们需要做的是让胶囊路由查看最近播放过的多个数据点。这相当于对最近的重要数据点上的联想记忆。需要注意的是它不是最近的帧的最近的表达,而是最近的帧的最不同点的表达。不同内容的不同点表达可以通过仅仅保存与预定义值不同的表达来获得。这个重要的细节可以保存最近的历史的相关信息,而不是一系列相关的数据点的无用的信息。
  • 预测神经网络能力:这已经是动态路由的一部分,从而强迫每一层都去预测下一层的表达。这是一个非常强大的自学习技术,在我们看来,它比我们社区所开发的所有的其他类型的无监督学习都更有效果。胶囊现在需要能够预测长时间的时空关系,但是现在这个能力还没有被实现。

持续学习 – 这一点很重要,因为神经网络需要不断向学习新的数据点。目前的神经网络每一次都只能够重新训练才能够学习新的数据。神经网络需要能够自我评估哪些是它们已经知道的以及哪些需要重新的训练。这也是现实生活中的增强学习任务所需要的,这样我们就能教机器学习新的任务而不会忘记旧的任务。 迁移学习 – 或者我们如何能够让这些算法通过观看视频自己学习,就像我们想要学习如何做一道新菜一样。这个能力需要我们前面列出的所有的组件,并且对于增强学习非常的重要。现在你只需要给机器一个例子,就可以训练你的机器来做你想要它做的事情,就像我们人类一样。 增强学习 – 这是深度神经网络的研究的圣杯:教给机器如何在一个真实世界的环境中去 学会行动。这需要自我学习、持续学习、预测能力以及很多我们不知道的东西。在增强学习领域还有很多的工作要去做,但是对于作者来讲,他仅仅是了解了这个问题的皮毛,距离解决它还有很多的路要走。 强化学习通常被认为是“锦上添花”,这意味着它仅仅是一个塑料合成大脑上的小型训练。那我们如何能够得到一个能够轻松解决所有问题的“通用”大脑呢? 这是一个先有鸡还是先有蛋的问题。今天为了一个一个的解决增强学习的问题,我们使用标准的神经网络:

  • 一个深度神经网络,它接受大量的输入数据,例如视频或者音频,然后将它们压缩为表达
  • 一个序列学习神经网络(例如RNN),去学习任务

上面是解决这个问题的两个显而易见的解决方案,但明显是错误的。但这正是每个人现在都在使用的,因为它们是目前可用的组件。结果却是不令人满意:我们的确可以从头学会玩视频游戏,并且掌握象棋或者围棋这类完全可被观察的游戏。但是不用我说,这些远远不能够解决现实世界的复杂问题。想象一下,一个AI玩Horizon Zero Dawn可以比人玩的更好,我非常想看到这个发生。 这正是我们想要的,机器可以和我们人类一样的运行。 我们在这里详细介绍了增强学习的工作和建议。它使用一个可以连续操作的预测神经网络以及一个关联存储器去存储当前的体验。

不会再存在循环神经网络 – 循环神经网络(RNN)已经出现了有一段时日了。RNN在训练并行化方面表现的非常不好,即使在特殊定制的机器上运行的也非常慢,原因是它们需要非常高的内存带宽,由此它们更受限于内存带宽而不是受限于计算能力。基于注意力的神经网络训练和部署上更高效也更快速,并且他们不容易受到训练和部署伸缩性的影响。在神经网络中,注意力有可能改变很多架构,但是现在它还没有得到应有的认可。将关联记忆和注意力结合起来,将会是下一波神经网络发展浪潮中的核心。 注意力神经网络已经能够像RNN一样学习序列,并且能够减少100倍的计算量!谁能够忽略这个巨大的进步? 我们认识到基于注意力的神经网络将会慢慢的在语音识别领域替换RNN,并且会在增强学习架构和通用人工智能领域获得一席之地。

硬件

硬件是深度学习取得进步的核心,让我们忘掉深度学习在2008-2012年的快速扩张,近些年深度学习迅速发展主要是因为硬件:

  • 每个手机上的廉价的图像传感器使得我们可以收集大量的数据集
  • GPU可以加速深度神经网络的训练

我们之前曾频繁的讨论过硬件。但是现在需要进行更新了。在过去的1-2年,我们看到了机器学习硬件的爆发式发展,尤其是针对深度神经网络。 有多家公司在这个领域有所投入:NVIDIA、Intel、Nervana、Movidius、Bitmain、Cambricon、Cerebras、DeePhi、Google、Graphcore、Groq、Huawei、ARM、Wave Computing。它们都在开发能够训练和运行深度神经网络的定制化高性能芯片。 关键是,在提供最低功耗和最高性能的同时,运行最新、最有用的神经网络。但是这个领域里很少有人能够理解硬件如何真正的改变机器学习、神经网络以及人工智能。很少有人理解芯片的重要性以及如何去开发它们。

  • 训练还是推理? – 很多公司在打造能够进行神经网络训练的芯片,其目的是抢占NVIDIA的一部分市场,而NVIDIA是神经网络训练硬件的事实上的标准。但是训练仅仅是深度神经网络应用世界中的一小部分。对于任何一个训练步骤,在真实世界中都有实际应用的上百万次的部署。例如你可以在云上使用一个目标检测神经网络:它基于大量图片进行一次训练,但是一旦训练完成,它将会基于数十亿数据在上百万台计算机上运行。这里试图说明的是:就像与真正使用的次数相比,训练次数其实很少,同样训练硬件的重要性也不高。而且制造训练所需要的芯片组需要额外的硬件和技巧。这意味这对于相同的性能需要更高的功率,因此不适合进行当前的生产部署。训练硬件重要,也是对推理硬件的简单调整,它并没有你想的那么重要。
  • 应用 – 在这个领域,能够提供以更低能耗来进行更快训练的硬件非常重要,因为它能够帮助更快创建和测试新模型。但是,运行应用的硬件(大部分用于推理)才是真正的飞跃。目前,有很多应用由于没有硬件或硬件低效的问题还不能用或不实用。比如我们的手机可以是语音助手,但由于不能让它一直在线,目前还远不达理想状态。我们的家庭助手都需要连接到供电设备上,因此不能随时的跟随我们在家里随意移动,除非我们周边有多个麦克风和设备。可能最重要的应用是将手机屏幕从我们的生活中移走,然后嵌入到我们的视觉系统当中。没有超级有效的硬件,所有这些应用以及其他更多应用(小机器人)都将无法实现。
  • 赢家和输家 – 在硬件领域,赢家是单位能耗最低并且能够最快进入市场的那些企业。例如在手机中取代SoC。这每年都在发生。现在想象一下将神经网络加速器嵌入到内存中,这可能能够更快征服和明显渗透大部分市场。这就是我们所说的赢家。

前面我们简要讨论了应用,但是我们需要详细讨论一下AI和神经网络如何进入和影响我们的生活。如下:

  • 图像和视频分类 – 已经有存在于很多云服务中。下一步在很多智能相机做到这些(已经有很多厂商提供)。在未来,神经网络将会越来越减少对云的依赖而在本地处理越来越多的数据:因为保护隐私和节省带宽而成为赢家。
  • 语音助手 – 因为能在我们的“智能”家居中播放音乐和控制基本设备,语音助手正在成为我们生活中的一部分。但是对话是我们人类活动中如此基础的一个能力,我们太把它当成理所当然的事情了。能够与你对话的小型设备是一场正在发生的革命。语音助手在为我们的服务中变得越来越好。但是它们仍需要连接电源。我们真正需要的助手是能够跟随我们移动的。我们的手机合适吗?在这里硬件又一次获得了胜利,因为硬件的进步使之成为可能。Alexa、Cortona和Siri会一直在你的身边陪伴。手机将很快变为智能家居,这是智能手机的有一次胜利。我们还希望语音助手能在车里跟随我们在城市中移动。我们需要能够在本地处理声音,越来越少的依赖云,从而更好隐私保护并降低带宽成本。硬件的进步将在1-2年实现这些。
  • 真正人工助手 – 能够识别语音真的很棒,但是我们真正需要的是能够实时识别我们所看到的,在我们移动时对周围环境进行分析。这是真正会让我们喜爱的智能助手。神经网络硬件能够满足你的这个愿望,因为分析视频流非常耗费计算能力,而且已经达到了现有硅基硬件理论的极限。换句话说,实现这些要比语音助手困难的多。但是这并不是不可能的,许多智能初创公司(比如AiPoly)已经有了所需的相关软件,但是缺乏能够支撑在手机上运行的强大硬件。还要注意的是,利用可穿戴眼镜之类的设备替换手机屏幕,将会使得智能助手真正的成为我们生活的一部分。
  • 烹饪机器人 – 会做饭和清洁的机器人将会成为下一个伟大的设备,我们可能很快就会拥有相关硬件,但是我们缺乏对应的软件。我们需要迁移学习、持续学习以及增强学习。这些工作看起来都非常有魅力,因为你会看到:每一个配方都是不同的,每一个烹饪的原材料看起来都不一样,我们不可能硬编码这些选项,我们需要一个综合体来非常好的学习和总结,从而能够完成相关的工作。我们远没有达到这个地步,但是也不是非常的遥不可及。按照目前的发展速度,可能需要几年的时间。我过去几年就在做这些工作,未来也将继续做下去。
页面:12345678910
随时欢迎您 联系我们