博客园北京才有吗赛个车代数求积公式的代数精度算法怎样才能知道庄的资金流向?

机器学习距离公式总结 - Bin的专栏 - 博客园
作者:daniel-D 出处:http://www.cnblogs.com/daniel-D/
在机器学习和数据挖掘中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如 K 最近邻(KNN)和 K 均值(K-Means)等等。根据数据特性的不同,可以采用不同的度量方法。一般而言,定义一个距离函数 d(x,y), 需要满足下面几个准则:
1) d(x,x) = 0 & & & & & & & & & &// 到自己的距离为02) d(x,y) &= 0 & & & & & & & & &// 距离非负3) d(x,y) = d(y,x) & & & & & & & & & // 对称性: 如果 A 到 B 距离是 a,那么 B 到 A 的距离也应该是 a4) d(x,k)+ d(k,y) &= d(x,y) & &// 三角形法则: (两边之和大于第三边)
这篇博客主要介绍机器学习和数据挖掘中一些常见的距离公式,包括:
闵可夫斯基距离
欧几里得距离
曼哈顿距离
切比雪夫距离
余弦相似度
皮尔逊相关系数
杰卡德相似系数
1. 闵可夫斯基距离
闵可夫斯基距离(Minkowski distance)是衡量数值点之间距离的一种非常常见的方法,假设数值点 P 和 Q 坐标如下:
那么,闵可夫斯基距离定义为:
该距离最常用的 p 是 2 和 1, 前者是欧几里得距离(Euclidean distance),后者是曼哈顿距离(Manhattan distance)。假设在曼哈顿街区乘坐出租车从 P 点到 Q 点,白色表示高楼大厦,灰色表示街道:
绿色的斜线表示欧几里得距离,在现实中是不可能的。其他三条折线表示了曼哈顿距离,这三条折线的长度是相等的。
当 p 趋近于无穷大时,闵可夫斯基距离转化成切比雪夫距离(Chebyshev distance):
我们知道平面上到原点欧几里得距离(p = 2)为 1 的点所组成的形状是一个圆,当 p 取其他数值的时候呢?
注意,当 p&&&1 时,闵可夫斯基距离不再符合三角形法则,举个例子:当 p&&&1, (0,0) 到 (1,1) 的距离等于 (1+1)^{1/p}&&&2, 而 (0,1) 到这两个点的距离都是 1。
闵可夫斯基距离比较直观,但是它与数据的分布无关,具有一定的局限性,如果 x 方向的幅值远远大于 y 方向的值,这个距离公式就会过度放大 x 维度的作用。所以,在计算距离之前,我们可能还需要对数据进行&z-transform&处理,即减去均值,除以标准差:
&: 该维度上的均值&: 该维度上的标准差
可以看到,上述处理开始体现数据的统计特性了。这种方法在假设数据各个维度不相关的情况下利用数据分布的特性计算出不同的距离。如果维度相互之间数据相关(例如:身高较高的信息很有可能会带来体重较重的信息,因为两者是有关联的),这时候就要用到马氏距离(Mahalanobis distance)了。
2. 马氏距离
考虑下面这张图,椭圆表示等高线,从欧几里得的距离来算,绿黑距离大于红黑距离,但是从马氏距离,结果恰好相反:
马氏距离实际上是利用 Cholesky transformation 来消除不同维度之间的相关性和尺度不同的性质。假设样本点(列向量)之间的协方差对称矩阵是&&, 通过 Cholesky Decomposition(实际上是对称矩阵 LU 分解的一种特殊形式,可参考之前的)可以转化为下三角矩阵和上三角矩阵的乘积:&&。消除不同维度之间的相关性和尺度不同,只需要对样本点 x 做如下处理:&。处理之后的欧几里得距离就是原样本的马氏距离:为了书写方便,这里求马氏距离的平方):
下图蓝色表示原样本点的分布,两颗红星坐标分别是(3, 3),(2, -2):
由于 x, y 方向的尺度不同,不能单纯用欧几里得的方法测量它们到原点的距离。并且,由于 x 和 y 是相关的(大致可以看出斜向右上),也不能简单地在 x 和 y 方向上分别减去均值,除以标准差。最恰当的方法是对原始数据进行 Cholesky 变换,即求马氏距离(可以看到,右边的红星离原点较近):
将上面两个图的绘制代码和求马氏距离的代码贴在这里,以备以后查阅:
# -*- coding=utf-8 -*-
# code related at: http://www.cnblogs.com/daniel-D/
import numpy as np
import pylab as pl
import scipy.spatial.distance as dist
def plotSamples(x, y, z=None):
stars = np.matrix([[3., -2., 0.], [3., 2., 0.]])
if z is not None:
x, y = z * np.matrix([x, y])
stars = z * stars
pl.scatter(x, y, s=10)
# 画 gaussian 随机点
pl.scatter(np.array(stars[0]), np.array(stars[1]), s=200, marker='*', color='r')
# 画三个指定点
pl.axhline(linewidth=2, color='g') # 画 x 轴
pl.axvline(linewidth=2, color='g')
pl.axis('equal')
pl.axis([-5, 5, -5, 5])
# 产生高斯分布的随机点
mean = [0, 0]
cov = [[2, 1], [1, 2]]
x, y = np.random.multivariate_normal(mean, cov, 1000).T
plotSamples(x, y)
covMat = np.matrix(np.cov(x, y))
# 求 x 与 y 的协方差矩阵
Z = np.linalg.cholesky(covMat).I
# 仿射矩阵
plotSamples(x, y, Z)
# 求马氏距离
print '\n到原点的马氏距离分别是:'
print dist.mahalanobis([0,0], [3,3], covMat.I), dist.mahalanobis([0,0], [-2,2], covMat.I)
# 求变换后的欧几里得距离
dots = (Z * np.matrix([[3, -2, 0], [3, 2, 0]])).T
print '\n变换后到原点的欧几里得距离分别是:'
print dist.minkowski([0, 0], np.array(dots[0]), 2), dist.minkowski([0, 0], np.array(dots[1]), 2)
马氏距离的变换和 PCA 分解的颇有异曲同工之妙,不同之处在于:就二维来看,PCA 是将数据主成分旋转到 x 轴(正交矩阵的酉变换),再在尺度上缩放(对角矩阵),实现尺度相同。而马氏距离的 L逆矩阵是一个下三角,先在 x 和 y 方向进行缩放,再在 y 方向进行错切(想象矩形变平行四边形),总体来说是一个没有旋转的仿射变换。
3. 向量内积
向量内积是线性代数里最为常见的计算,实际上它还是一种有效并且直观的相似性测量手段。向量内积的定义如下:
直观的解释是:如果 x 高的地方 y 也比较高, x 低的地方 y 也比较低,那么整体的内积是偏大的,也就是说 x 和 y 是相似的。举个例子,在一段长的序列信号 A 中寻找哪一段与短序列信号 a 最匹配,只需要将 a 从 A 信号开头逐个向后平移,每次平移做一次内积,内积最大的相似度最大。信号处理中 DFT 和 DCT 也是基于这种内积运算计算出不同频域内的信号组分(DFT 和 DCT 是正交标准基,也可以看做投影)。向量和信号都是离散值,如果是连续的函数值,比如求区间[-1, 1]&两个函数之间的相似度,同样也可以得到(系数)组分,这种方法可以应用于多项式逼近连续函数,也可以用到连续函数逼近离散样本点(最小二乘问题,)中,扯得有点远了- -!。
向量内积的结果是没有界限的,一种解决办法是除以长度之后再求内积,这就是应用十分广泛的余弦相似度(Cosine similarity):
余弦相似度与向量的幅值无关,只与向量的方向相关,在文档相似度()和图片相似性()计算上都有它的身影。需要注意一点的是,余弦相似度受到向量的平移影响,上式如果将 x 平移到 x+1, 余弦值就会改变。怎样才能实现平移不变性?这就是下面要说的皮尔逊相关系数(Pearson correlation),有时候也直接叫相关系数:
皮尔逊相关系数具有平移不变性和尺度不变性,计算出了两个向量(维度)的相关性。不过,一般我们在谈论相关系数的时候,将 x 与 y 对应位置的两个数值看作一个样本点,皮尔逊系数用来表示这些样本点分布的相关性。
由于皮尔逊系数具有的良好性质,在各个领域都应用广泛,例如,在推荐系统根据为某一用户查找喜好相似的用户,进而,优点是可以不受每个用户评分标准不同和观看影片数量不一样的影响。
4. 分类数据点间的距离
汉明距离(Hamming distance)是指,两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。举个维基百科上的例子:
还可以用简单的匹配系数来表示两点之间的相似度&&匹配字符数/总字符数。
在一些情况下,某些特定的值相等并不能代表什么。举个例子,用 1 表示用户看过该电影,用 0 表示用户没有看过,那么用户看电影的的信息就可用 0,1 表示成一个序列。考虑到电影基数非常庞大,用户看过的电影只占其中非常小的一部分,如果两个用户都没有看过某一部电影(两个都是 0),并不能说明两者相似。反而言之,如果两个用户都看过某一部电影(序列中都是 1),则说明用户有很大的相似度。在这个例子中,序列中等于 1 所占的权重应该远远大于 0 的权重,这就引出下面要说的杰卡德相似系数(Jaccard similarity)。
在上面的例子中,用 M11 表示两个用户都看过的电影数目,M10 表示用户 A 看过,用户 B 没看过的电影数目,M01 表示用户 A 没看过,用户 B 看过的电影数目,M00 表示两个用户都没有看过的电影数目。Jaccard 相似性系数可以表示为:
Jaccard similarity 还可以用集合的公式来表达,这里就不多说了。
如果分类数值点是用树形结构来表示的,它们的相似性可以用相同路径的长度来表示,比如,&/product/spot/ballgame/basketball& 离&product/spot/ballgame/soccer/shoes& 的距离小于到 "/product/luxury/handbags" 的距离,以为前者相同父节点路径更长。
5. 序列之间的距离
上一小节我们知道,汉明距离可以度量两个长度相同的字符串之间的相似度,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离(Edit distance, Levenshtein distance)等算法。编辑距离是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离求的是最少编辑次数,这是一个动态规划的问题,有兴趣的同学可以自己研究研究。
时间序列是序列之间距离的另外一个例子。DTW 距离(Dynamic Time Warp)是序列信号在时间或者速度上不匹配的时候一种衡量相似度的方法。神马意思?举个例子,两份原本一样声音样本A、B都说了&你好&,A在时间上发生了扭曲,&你&这个音延长了几秒。最后A:&你~~~好&,B:&你好&。DTW正是这样一种可以用来匹配A、B之间的最短距离的算法。
DTW 距离在保持信号先后顺序的限制下对时间信号进行&膨胀&或者&收缩&,找到最优的匹配,与编辑距离相似,这其实也是一个动态规划的问题:
实现代码(转自&&):
#!/usr/bin/python2
# -*- coding:UTF-8 -*-
# code related at: http://blog.mckelv.in/articles/1453.html
import sys
distance = lambda a,b : 0 if a==b else 1
def dtw(sa,sb):
&&&dtw(u"干啦今今今今今天天气气气气气好好好好啊啊啊", u"今天天气好好啊")
MAX_COST = 1&&32
#初始化一个len(sb) 行(i),len(sa)列(j)的二维矩阵
len_sa = len(sa)
len_sb = len(sb)
# BUG:这样是错误的(浅拷贝): dtw_array = [[MAX_COST]*len(sa)]*len(sb)
dtw_array = [[MAX_COST for i in range(len_sa)] for j in range(len_sb)]
dtw_array[0][0] = distance(sa[0],sb[0])
for i in xrange(0, len_sb):
for j in xrange(0, len_sa):
if i+j==0:
if i & 0: nb.append(dtw_array[i-1][j])
if j & 0: nb.append(dtw_array[i][j-1])
if i & 0 and j & 0: nb.append(dtw_array[i-1][j-1])
min_route = min(nb)
cost = distance(sa[j],sb[i])
dtw_array[i][j] = cost + min_route
return dtw_array[len_sb-1][len_sa-1]
def main(argv):
s1 = u'干啦今今今今今天天气气气气气好好好好啊啊啊'
s2 = u'今天天气好好啊'
d = dtw(s1, s2)
if __name__ == '__main__':
sys.exit(main(sys.argv))
6. 概率分布之间的距离
前面我们谈论的都是两个数值点之间的距离,实际上两个概率分布之间的距离是可以测量的。在统计学里面经常需要测量两组样本分布之间的距离,进而判断出它们是否出自同一个 population,常见的方法有卡方检验(Chi-Square)和&KL 散度( KL-Divergence),下面说一说 KL 散度吧。
先从信息熵说起,假设一篇文章的标题叫做&黑洞到底吃什么&,包含词语分别是 {黑洞, 到底, 吃什么}, 我们现在要根据一个词语推测这篇文章的类别。哪个词语给予我们的信息最多?很容易就知道是&黑洞&,因为&黑洞&这个词语在所有的文档中出现的概率太低啦,一旦出现,就表明这篇文章很可能是在讲科普知识。而其他两个词语&到底&和&吃什么&出现的概率很高,给予我们的信息反而越少。如何用一个函数 h(x) 表示词语给予的信息量呢?第一,肯定是与 p(x) 相关,并且是负相关。第二,假设 x 和 y 是独立的(黑洞和宇宙不相互独立,谈到黑洞必然会说宇宙),即 p(x,y) = p(x)p(y), 那么获得的信息也是叠加的,即 h(x, y) = h(x) + h(y)。满足这两个条件的函数肯定是负对数形式:
对假设一个发送者要将随机变量 X 产生的一长串随机值传送给接收者, 接受者获得的平均信息量就是求它的数学期望:
这就是熵的概念。另外一个重要特点是,熵的大小与字符平均最短编码长度是一样的(shannon)。设有一个未知的分布 p(x), 而 q(x) 是我们所获得的一个对 p(x) 的近似,按照 q(x) 对该随机变量的各个值进行编码,平均长度比按照真实分布的 p(x) 进行编码要额外长一些,多出来的长度这就是 KL 散度(之所以不说距离,是因为不满足对称性和三角形法则),即:
KL 散度又叫相对熵(relative entropy)。了解机器学习的童鞋应该都知道,在 Softmax 回归(或者 Logistic 回归),最后的输出节点上的值表示这个样本分到该类的概率,这就是一个概率分布。对于一个带有标签的样本,我们期望的概率分布是:分到标签类的概率是 1,&其他类概率是 0。但是理想很丰满,现实很骨感,我们不可能得到完美的概率输出,能做的就是尽量减小总样本的 KL 散度之和(目标函数)。这就是 Softmax 回归或者 Logistic 回归中 Cost function 的优化过程啦。(PS:因为概率和为 1,一般的 logistic 二分类的图只画了一个输出节点,隐藏了另外一个)
待补充的方法:
卡方检验 Chi-Square
衡量 categorical attributes 相关性的 mutual information
Spearman's rank coefficient
Earth Mover's Distance
SimRank 迭代算法等。
参考资料:  作者赵京雷,阅面科技 CEO,上海交通大学人工智能博士,前阿里巴巴北京算法研究中心负责人,专注人工智能算法研究超过 15 年。本文系雷锋网(搜索&雷锋网&公众号关注)独家文章。
  2016 年是人工智能发展的第 60 周年,人工智能已经走了很长一段路,随着 AlphaGo 的辉煌战绩的出现,又再次引爆了人工智能在各个领域的发展。回顾计算机视觉发展之路,才能让我们踩着历史的积淀,顺应发展的大潮,去探索未来。
  一、计算机视觉的认知依据
  人类对世界的认知非常简单,我们可以一眼看出一个水果是苹果还是橘子。但是对于机器来说,我们怎么写个程序让机器来分辨苹果和橘子呢。
(人类的识别)&
  如果让大家思考,我们会给出各种答案,比如是不是可以让机器通过水果的颜色来区分,或者通过形状和纹理来区分等等。&&&&&&&&&&&&&&&&&&&&&&
(基于颜色、形状、纹理的识别)
  在深度学习出现之前,这种基于寻找合适的特征去让机器辨识物品的状态,基本上代表了计算机视觉的全部。
  以颜色特征为例,它是一种在现在依然被广泛应用的特征,我们称之为颜色直方图特征。它是一种最简单、最直观,对实际图片的颜色进行数字化表达的方式。机器识别图片只能用二维的向量来表示。我们都知道颜色的值可以用 RGB 三原色来表示,颜色直方图的横轴代表颜色的 RGB 数值,表示一个物品所有颜色的可能性,纵轴则代表了整个图像具有某个颜色值的像素数量,其实,通过这样一种非常直观的方法,机器就可以对看到的图片进行颜色表征。在过去的二三十年里,关于颜色特征的表示有很多探索和研究,比如:各种各样颜色直方图的变种,使得计算机能够通过二维数字串的形式,更好地表示图像的颜色特征,使得其能够区分看到的不同物品。
左:(颜色直方图 striker 1995) &右:(颜色距 striker 1995)
  以纹理特征为例,桔子会有坑坑洼洼的纹理,而苹果的纹理则非常光滑。这种局部的纹理刻画,如何通过数字串的形式抽象表示出来,和颜色特征一样,这是过去很多年计算机视觉一直在探求和优化的问题。下图是计算机视觉中在各个领域使用较多的纹理特征表示方法示例。
(纹理直方图)
  形状特征也是一样,以下两图可以直观的示例计算机视觉通过形状特征来进行识别。
&(Hog:Dalal,2005)
  通过这些例子可以看出,计算机视觉在过去很多年,处理问题的方法很简单,就是找到一种合适的特征抽象方法,对一个待识别或者待分类问题进行特征表达,然后进行计算的过程。
  如果要做人脸识别,需要寻找到底是颜色特征还是纹理特征或者形状特征更适于表达,怎么样能把目标问题区分开来。对人脸来说,颜色的作用不会很大,因为人脸的颜色长得都差不多。但是人脸的褶皱、纹理,两眼之间的距离等可能代表了不同人之间的区别,可能纹理和结构特征相比更加有效。而如果我们要检测识别人体,可能纹理特征就不是那么重要,因为人会穿各种各样的衣服,但形状特征就会很重要。所以,过去的计算机视觉是针对不同的问题,选择不同的特征表征方法。
  二、计算机视觉的发展过程
  从 2006 年开始,在将近 10 年的时间里,计算机视觉的方法发生了一个比较本质的变化,就是深度学习的出现,在某种程度上改变了我们前面对计算机视觉的定义。我们先了解一下计算机视觉发展的历程,看看是基于什么契机和积累,让计算机视觉发生了这样的变化。
  计算机视觉的发展史可以追溯到 1966 年,著名的人工智能学家马文&明斯基给他的本科学生布置了一道非常有趣的暑假作业,就是让学生在电脑前面连一个摄像头,然后写一个程序,让计算机告诉我们摄像头看到了什么。大师就是大师,这道题实在是太有挑战了,在某种意义上它代表了全部计算机视觉要做的事情,因此我们认为这是一个起点。
  上世纪 70 年代,研究者开始去试图解决让计算机告知他到底看到了什么东西这个问题。研究者认为要让计算机认知到底看到了什么,可能首先要了解人是怎样去理解这个世界的。因为那时有一种普遍的认知,认为人之所以理解这个世界,是因为人是有两只眼睛,他看到的世界是立体的,他能够从这个立体的形状里面理解这个世界。在这种认知情况下,研究者希望先把三维结构从图像里面恢复出来,在此基础上再去做理解和判断。
(David Marr,1970s)
  上世纪 80 年代,是人工智能发展的一个非常重要的阶段。人工智能界的逻辑学和知识库推理大行其道,研究者开始做很多专家推理系统,计算机视觉的方法论也开始在这个阶段产生一些改变。人们发现要让计算机理解图像,不一定先要恢复物体的三维结构。例如:让计算机识别一个苹果,假设计算机事先知道苹果的形状或其他特征,并且建立了这样一个先验知识库,那么计算机就可以将这样的先验知识和看到物体表征进行匹配。如果能够匹配,计算机就算识别或者理解了看到的物体。所以,80 年代出现了很多方法,包括几何以及代数的方法,将我们已知的物品转化成一些先验表征,然后和计算机看到的物品图像进行匹配。
(David Lowe, 1987)
  上世纪 90 年代,人工智能界又出现了一次比较大的变革,也就是统计方法的出现和流行。在这个阶段,经历了一些比较大的发展点,比如现在还广泛使用的局部特征。前面介绍的形状、颜色、纹理这些表征,其实会受到视角的影响,一个人从不同的角度去看物品,它的形状、颜色、纹理可能都不太一样。随着 90 年代统计方法的流行,研究者找到了一种统计手段,能够刻画物品最本质的一些局部特征,比如:要识别一辆卡车,通过形状、颜色、纹理,可能并不稳定,如果通过局部特征,即使视角变化了,也会准确对其进行辨识。局部特征的发展,其实也导致了后来很多应用的出现。比如:图像搜索技术真正的实用,也是由于局部特征的出现。研究者可以对物品建立一个局部特征索引,通过局部特征可以找到相似的物品。其实,通过这样一些局部点,可以让匹配更加精准。
(David Lowe, 1999)
  到 2000 年左右,机器学习方法开始盛行。以前需要通过一些规则、知识或者统计模型去识别图像所代表的物品是什么,但是机器学习的方法和以前完全不一样。机器学习能够从海量数据里面去自动归纳物品的特征,然后去识别它。在这样一个时间点,计算机视觉界有几个非常有代表性的工作,比如:人脸识别。
  要识别一个人脸,第一步需要从图片里面把待识别的人脸区域给提取出来,这叫人脸检测。像在拍照的时候,会看到相机上有个小方框在闪,那其实是人脸识别必要的第一步工作,也就是人脸框的检测。在以前,这是非常困难的工作,但是在 2000 年左右,出现了一种非常好的算法,它能够基于机器学习,非常快速的去检测人脸,称之为 Viola&Jones 人脸检测器,这奠定了当代计算机视觉的一个基础。
(Viola&Jones, 2001)
  机器学习的盛行其实是伴随着一个必要条件出现的,就是在 2000 年左右,整个互联网的出现和爆发,产生了海量的数据,大规模数据集也相伴而生,这为通过机器学习的方法来做计算机视觉提供了很好的土壤。在这期间,出现了大量学术官方的,针对不同领域评测的数据集。人脸检测最具有代表性是一个叫 FDDB 的数据集。这个数据集包含了超过 5000 多张人脸数据,每一张人脸,都人为的用框给框出来,机器就可以从这些框好的数据里面,通过一些机器学习的手段去学习从任何一张图片中找到人脸区域。
(FDDB,5171 faces, 2845 images)
  另外,我们耳熟能详的一个数据集是人脸识别数据集 LFW。提到人脸识别,可能我们听过&计算机做人脸识别比人更准&。其实这句话是有一定问题,在很多实际场景里,计算机做人脸识别连人的 70% 可能都达不到。那么在什么情况下,它比人准呢。有一种情况就是在 LFW 上。LFW 数据集里面有 1 万多张人脸和 5000 多个人的数据,每个人都有在不同情况下拍摄的真实场景的多张人脸。基于这样的一个数据集,研究者可以在上面评估人脸识别的精度。人脸识别领域发展非常快,尤其是最近几年深度学习的兴起后,这个数据集变得非常火爆。人在 LFW 上面的识别正确率大概是 97.75%,而机器已经在 LFW 上可以做到 99.75% 甚至更要高。
(13233 faces, 5749 people)
  在这期间,还出现了其他非常有影响力的数据集,其中比较有代表性的就是由李飞飞教授发起的一个项目 IMAGEMET。他通过众包的方式,标注 1400 万张图片,分了大概 2 万多个类别,这些类别包罗万物,比如像动物,里边可能分为鸟类、鱼类等;植物,里面可能会分为树和花。她的理想很宏大,就是希望提供这样一个数据集,为计算机视觉算法提供一个数据土壤,让未来的机器能够认识世界上的一切物品。
  在 2000 年代,人工智能经历了一个快速发展期以后,整个人工智能在很多行业取得了非常好的应用,比如:视觉之外有搜索引擎排序和计算广告等等,视觉领域人脸检测器也被用在了各种各样的相机里面。
  到 2010 年代,人工智能进入了一个最激动人心的年代,它就是深度学习的年代。深度学习从本质上给整个人工智能带来了一次革命。在上世纪,有人做了一个猫的实验。在猫脑袋上开了一个洞,然后在猫的前面放各种各样的物品,观察猫在不同物品下的反应。通过实验发现,当我们放一些形状非常类似的物品时,猫的后脑皮层的相同区域会表现出同样的刺激反应,这一实验了说明人的视觉系统认知是分层的。在早期模拟人脑认知的多层神经网络模型经历 2000 年左右的一个低谷后,2006 年 Hinton 教授在《科学》发表了对于深层神经网络的训练方法,带来了深度学习的蓬勃发展。
(LeNet-5, 1998)
  上图左侧是一个普通的三层神经网络算法,是一种浅层的学习方法。在这种浅层神经网络中,输入的数据依然是人工抽象出来的特征表达,比如颜色、形状、纹理或者局部特征等。而右边的则是现在最常使用的一种深度学习方法,卷积神经网络。从外面来看,最大的改变是其输入是原始图像的像素,不再用人工进行特征表达和抽象,而改用神经网络本身在浅层自动进行特征抽象。这是浅层机器学习模型和深度学习模型的根本区别之一。
(Hinton, 2006)
(Li, Tang etl, )
  自 2006 年开始,在接近 10 年的时间里,整个计算机视觉界产生了质的变化,深度学习的出现真正改变了计算机视觉之前的定义。
  三、计算机视觉的应用领域
  深度学习出现以后,对各种各样的视觉识别任务的精度都进行了大幅度的提升,拿人脸来说,在深度学习出现之前,一个普通的识别算法,比如使用颜色、纹理、形状或者局部特征,可以将各种特征糅合在一起,人脸识别率一般只能做到 94%~95%。在很多的实际系统,比如以前用的人脸考勤,可能当时的系统只能做到 90%~92% 的识别率。深度学习出现以后,直接将这个精度提高到了 99.5% 以上,将错误率降低了 10 倍。
  这种量级的错误率降低意义非凡。比如:把人体识别的精度用到汽车的辅助驾驶系统里边,如果出现了漏报或错包,这是非常头大的事。如果是 95% 的精度,有 100 个人经过,在一定距离范围内,他可能就有五次错报或者漏报,这肯定是无法接受的。但如果精度再提升 10 倍或者 100 倍,比如 1 万个人只有 5 次漏报的话,那这件事可能就是可行了。所以,深度学习的出现使得以前视觉方法不太实用的一些应用领域,基本上都可以通过深度学习的方法来获得一个良好的应用。
  目前计算机视觉的热点应用在目标检测、目标识别、目标跟踪、场景理解、立体视觉等一些领域,人脸识别用的比较多的领域是金融行业,像人脸识别身份验证等;图像搜索比较直观的应用,如拍一张鞋的照片,在淘宝进行搜索,就可以找到类似的鞋。再比如像安防,也是计算机视觉的一个典型应用领域;还有一个非常大的应用,就是在机器人领域,包括整个的智能设备领域,深度学习的出现,使得机器人在视觉能力或者语音能力上,去模仿人的能力成为可能。
  随着深度学习的发展,国内也出现了一些专注于深度学习的视觉企业,比如专注于金融和安防监控的 Face++、SenseTime,专注于图片审核的图普科技、专注于图像搜索的衣+,而我们阅面科技则专注于嵌入式视觉和机器视觉领域。
  四、我的探索
  回顾了计算机视觉的发展之路,很多公司在深度学习的大潮中顺势而生,包括我们阅面。
  深度学习的出现使得人工智能的应用上产生很多创业和创新机会。
  比如在和垂直行业结合方面,像金融、医疗行业,这方面应用的特点是计算发生在服务器端或者云端。
  另外一方面的机会来自于各种各样的硬件设备的智能化升级,这方面应用的特点是计算的前端化和实时化。我们都知道以前的智能硬件都很不智能,用户体验不好。人工智能算法的发展,会把一系列的硬件设备变得智能起来,成为真正的智能机器。
  嵌入式视觉,就是帮助各种各样的智能机器,通过嵌入视觉算法,让它拥有一双像人类一样的眼睛,能够去认知周边的人或者场景,该研究应用于包括机器人、智能家居、车载设备等领域,主要解决人机交互及场景的感知两大问题,这两方面的能力是未来的智能机器必须具备的核心能力。这也是我们在做的事情。
  以智能机器来举例,它需要理解人,知道这个人是谁,并且理解人的表情变化以及交互的手势和人体动作,这其实就是人机交互层。智能机器的场景感知层,就是将智能机器放在一个陌生环境里,能够让它知道处于什么样的环境,能够让它识别物品和场景,能够进行自主导航定位,自由行走。计算机视觉是整个人机交互和场景感知的未来。
  如何为智能机器提供软硬件一体的视觉认知解决方案?以我们为例&&
  首先在底层构建了核心的算法引擎,如人脸识别、手势识别、人体识别和场景识别等。其次在算法层上,我们做了两件事:一方面做硬件模组,另一方面做芯片。所有硬件层的努力,都是为了让底层的神经网络深度学习算法能够在嵌入式设备上能以快速度、低功耗跑起来。通过软硬件一体化的解决方案,希望能真正帮助未来的智能机器方便地接入视觉认知服务,去认知这个世界。
  五、由深度学习的发展看未来的挑战
  计算机视觉的发展当然不可能一帆风顺。
  对任何一个视觉识别任务而言,它的自然条件的变化,比如像姿态、遮挡,包括光照等各种条件的变化,都会极大的影响它的识别精度和正确率。怎样去解决这个问题,其实是整个计算机视觉面临的最大挑战。
  深度学习擅长的是分类问题,而对于上下文语义的理解,它是非常不擅长的。比如让它理解人类说的话,在这方面的应用这几年并没有太多实质性进展,这也是我专注做计算机视觉这件事的原因之一,如果去做自然语言理解,深度学习目前的帮助不大,但连续语义以及上下文的理解是近年深度学习模型研究的重点,相信未来会有所突破。
  深度学习确实带来了实质性的一个突破,但是针对很多任务,离我们真正想达到的精度还有不小差距,比如:人体检测、物品识别的的精度,在真实场景中比起我们人类,还远远不够。整个学术界对于新一代深度学习模式的研究还一直在继续。比如:人在认识世界的时候,它不仅仅把信息从大脑的初级皮层向深处的神经元传递。人在理解的时候,心理学家发现人脑深层的神经元可以反过来指导最开始输入层的认知。所以,我相信深度学习,在这些年还会从理论模型上带来比较大的突破,这种突破可能会使得这种模型越来越逼近我们人对信息的处理。
  计算机视觉之路,路漫漫,其修远,吾将上下而求索。
  雷锋网注:转载请联系我们授权,并保留出处和作者,不得删减内容。

我要回帖

更多关于 代数公式大全 的文章

 

随机推荐