:::: MENU ::::

TalkingData's Blog

现在开始,用数据说话。

Monthly Archives / 十一月 2017

  • 十一 30 / 2017
  • 0
Enterprise

锐眼洞察 | 为何需要数据来优化客户旅程(翻译)

作者:James Ovenden

原文:Why You Need Data To Optimize Customer Journey

译者:TalkingData解决方案架构师 张雪倩

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

 

译者注:客户旅程( customer journey),是客户与公司或品牌交互体验的集合。客户旅程记录了客户的完整体验,而不仅仅是着眼于一次交易或部分体验。 

随着顾客的选择范围越来越广,客户旅程(Customer Journey)前所未有的重要。确实,在Salesforce最近的一项调查中,88%的顶尖营销团队说他们认为客户旅程对他们整体营销策略的成功至关重要。顾客与组织互动的渠道如今极为多样,追踪全部渠道本身就是一项工作。然而,更重要的是让顾客参与其中,并且每一步都驱使顾客购买并建立持久的关系。

要做这件事,组织就必须深度理解顾客的行为和各个渠道有何不同——例如他们在哪里离开、又通过哪条路径实现购买。他们还需要保持高度个性化来保证顾客一直参与。在最近Econsultancy与IBM联合开展的一项调查中,76%的调查对象说他们希望企业理解他们的需求,80%的说品牌并不把他们当做个体来看,只有35%的人说他们喜爱的品牌推送的信息与自己有关。

为此,多年来企业总是着眼于数据,检查历史数据以寻找相关模式,作为依据来划分受众并针对性使用营销素材来触达他们。通过像Google Analytics这样简单易懂的免费软件来分析和监控跨渠道路径,企业可以洞察行为模式相似的人群,还可以识别出曾经不被察觉就流失的机会。

预测分析再上新台阶。使用预测分析可以帮助预测顾客的下一步、流失的可能性和对特定产品或提议的兴趣。这本质上使得顾客旅程对实时事件的反馈个性化了,这样可以采取针对性措施,无论是通过发送某些促销邮件还是保证它们在实时聊天中被推送到队列前端。

在顾客旅程中成功地使用了预测分析的一家公司就是在线拍卖商eBay。比如,如果有顾客在购买之前放弃了购物车内物品,eBay就会发一封邮件委婉地提醒顾客商品还在那里。他们还用数据来发现有趣事件,既在网站上又在社交媒体上显示顾客可能会关心什么、个性化搜索结果和交易。这甚至根本就不需要产品在他们的搜索记录中出现过就能做到。如果这些人的浏览历史与其他购买过某一产品的人的相似,eBay就会知道这些用户很有可能也对它感兴趣,并依此对他们进行营销。他们还能从这一产品上明白他们想要什么。如果算法判定你是可能在寻找比如说鞋子的那类人,它还会根据家庭收入和购买历史等标准,判断出你可能想要的风格、品牌和愿意花多少钱。

然而,这还是存在隐患的,市场人需要保证不要做的太过分。当从一个渠道到另一个渠道,每次看到的都是同样的鞋品广告,感觉上就像被一双Nike鞋跟踪了。PayPal顾客体验与电子分析师Kuntal Goradia最近和我们说道:“顾客分析行业因丰富的信息而强大,不光是他们的浏览记录,还有他们的习惯,包括去了何地,喜欢在哪吃饭,在哪购物,每天走路、跑步多少,每天睡多少个小时,和谁出去玩……我们中如此多的人都用Yelp、Open table、Uber、Lyft、Amazon、Fitbit、Apple Watch和Facebook,我们难以想象没有智能手机的生活。这些公司大部分都在使用数据来创造和优化已成为我们生活中必不可少一部分的产品。但与权力相伴随的还有义务,十分遗憾的是,有些企业利用其为自己谋利。我们的监管法律跟不上创新的速度。作为一名消费者,我们必须对分享在网上的东西采取预防措施;作为商业领军者,我们需要不断推动保护消费者的法规。”

Capital One的数据科学高级经理Douglas Daly也赞同并表示:“只要数据是用来服务消费者的,深度分析是好事。然而,必须十分小心保证这些深度分析的安全性和与消费者之间的沟通,以防产生尴尬甚至更糟糕的结果。”这都没错,但并不应成为放弃使用数据来优化客户旅程的担忧,而是需要注意的事情。没有数据,客户旅程将会一团糟。

  • 十一 30 / 2017
  • 0
Tech

锐眼发现 | 有没有必要把机器学习算法自己实现一遍?

作者:紫衫

原文:本文整理自作者在知乎的回答

转载于:雷锋网

本文转自雷锋网,如需转载请至雷锋网官网申请授权。

作者按:哈哈哈哈,我觉得很多人都有这个疑问吧。机器学习好高大上,多么牛逼的东西,光是看公式就已经眼花缭乱了,总觉得自己该全部去实现一遍,有的时候太懒,有的时候觉得能力不够。道理虽然明白——任何事情自己亲手做一做还是更好的,但机器学习已经有了大量的库了,SVM-Light,R里面的glm()方程,自己实现一遍,最后又不敢用(因为不知道算法究竟是否正确),或者不能用(一是速度赶不上大神写的库那么快,二是精度没有专业库那么高),耗时耗力的写了一堆后究竟有什么用?

这里很多答案都提供了一些解释,但我想从另一个角度来聊聊这个问题。

我在1年半前(本科阶段)就开始接触计算心理学和机器学习方面的研究,在NAACL(自然语言处理排名第三的论坛)上发表了一篇文章,用的计算机教授写的算法库,跑的是经过AdaGrad优化的向量支持机(SVM)算法。在这种论坛发文章,你是必须去做海报展示的,站在自己的大幅海报面前傻傻的待4个小时,我的两位教授(一位是认知语言学教授,一位是计算机教授)都在那里。我的位置不太好,在最边缘的角落里,本来以为就可以赢得一份清净,Philip Resnik走了过来。直到那一刹那之前,我一直不知道他是谁。但经过教授介绍后,他是马里兰大学的机器学习和自然语言处理教授,在这个领域混了多年,在Google Schoar上的论文引用数高达12,853。

有没有必要把机器学习算法自己实现一遍?

他走过来的第一句话是:“假设我一点也不懂数学,告诉我你这篇论文做的是什么。”我解释后,看到我的计算机教授走了过来和Resnik聊天,Resnik问我的教授:“你用的是不是hinge loss(辛基损失函数)?”我的教授说:“是。但不是全局优化,所以我没有叫这玩意SVM……”(我凭回忆打出来的,可能不完全精确)。当时我站在一旁觉得这他们能这样大聊特聊数学,甚至是向量支持机(我当时认为这是最厉害的算法——除神经网络以外),简直是太厉害了,我一点也听不懂他们在讲什么。

直到现在,我才明白所谓的“辛基损失函数(Hinge loss)”其实就是Max(a,b)函数,就是比较 a 和 b 谁大谁小,然后选大的那个。这玩意究竟有什么难理解的?为什么要那么高大上?你让一个五岁的小孩,问他:“有一堆红球,一堆绿球,哪一堆的球更多啊?”这个小孩都能告诉你正确答案。

当然这说的有点偏题了。后来我非常幸运的考上了研究生,才终于开始了对“高档”算法的学习。第一个学期被Christopher Manning(克里斯多夫·曼宁)的CS224N自然语言处理虐了一番,这个学期开始上Andrej Karpathy(安杰·卡帕西)的神经网络(CS231N),该君是李菲菲教授(音译,Fei-Fei Li)的爱徒,在推特上有14.9K关注者,我越看他那张方块脸,越觉得他长得像贾斯丁·汀布莱克(Justin Timberlake)。

有没有必要把机器学习算法自己实现一遍?

我其实也是自控能力很差的人,在上安杰·卡帕西的课之前,也从没有萌生过自己去写机器学习算法的想法。原因在文章开头有提过:1. 我的代码运行速度肯定赶不上经过多次迭代的专业库的运行速度;2. 我咋知道我的代码写的就是对的呢?

我直到现在都这样认为:不考虑对方的环境和条件,知识与技能,就一味要求对方把机器学习算法都实现一遍,估计是最无理取闹的行为了吧。前天晚上,我跟另一个研究生Jason Freeman(杰森·弗里曼)聊天,他在微软的西雅图总部工作了4年,在目前越来越有名的TypeScript团队工作了3年(TypeScript是静态的JavaScript语言,正在国内和国外开始流行)——他告诉我他和安德斯·海尔斯伯格(Anders Hejlsberg)一起工作,他还经常顶撞安德斯。我的第一反应是:“他是谁……”(安德斯·海尔斯伯格是Delphi和C#之父,但我不熟悉这两门语言,所以不会崇拜他——小广告:Scala是我目前最喜欢的语言)。

我和杰森讨论的是3月份开始究竟要不要选吴恩达(Andrew Ng)的机器学习课(CS229)。我持的立场是我可能不打算上那门课,因为我已经看过大部分他的视频了,还读了他讲义的一部分(这里是讲义链接: CS 229: Machine Learning (Course handouts))。因为我已经确定以后要做神经网络方面的研究,所以觉得他课上的一些其他内容比如特征降维(PCA),对我而言用处不大,我只需要会用就行了。我不仅用过特征降维,还用过更好的降维可视化(tSNE算法)。这玩意和我的领域不搭,为什么我要浪费时间去学?

杰森的论点是,如果我学了它们的理论(甚至把它们实现一遍),就能更好的应用它们。我说:你把直觉(intuition)当什么了?在我看来,对算法进行“直观”上的了解,就已经很足够了。什么是向量支持机?就是拿一个平面去分隔一堆点。更术语一点的解释不外乎是拿一个超平面(Hyperplane)在高维空间里去分割。什么是特征降维?就是看如何把高维度的点阵降到两三个维度。什么是alpha值?就是看这个算法学得有多快。什么是正则化(regularization)?就是别让你的算法过度拟合数据(当然L1,L2等等都有区别,但这些区别都很简单,L1让你关注某个值,L2让你利用所有的值)。

为什么我谈这么多关于理论的问题?在我看来,学习机器学习的算法的进度是这样的:应用 -》理论 -》实现。就跟教小孩折射一样,你先让他看看筷子在水中如何弯折(应用),再告诉他光的折射原因(理论),再让他自己用其他物体来试试(实现)。实现,是这个漫长学习过程的最后一步。一开始就来谈实现,实在是很神奇的事情。

让我准确论述一下我的观点:如果你是学界精英,那么去学习那些你将要使用的算法的理论,最后再自己尝试着实现他们,是很有必要的,除非你是只做应用(比如社会科学,心理学,商学等等)。如果是普通的程序员/工程师,不需要强迫自己去实现这些算法。没人会给你一个小奖章,大公司招这类员工的时候,也是更看重学历,而不是看“哦,我把‘所有’的机器学习算法都实现了一遍”。

最后送上一点我觉得实现机器学习算法最好的路径:

最好用Python和Numpy库。这两样宝具会让你非常轻松。安杰·卡帕西(Andrej)推荐用ipython notebook(现在改名叫Jupyter了),来可视化数据,以及实验算法。昨天有一个下午茶会,我们系举办的,也邀请了安杰,我跑去凑热闹,跟安杰谈到了这个问题,他说就算是大公司做研究,也是这种路径,先从ipython notebook开始(这点让我很惊讶)。

机器学习算法最难的部分其实不是写出来,而是高效率的实现,让你的算法跑快一点。其中一个技巧叫做“矢量化”(Vectorization)。矢量化就是说,能做矩阵操作就矩阵操作,最好连一个外循环都不写。

这是我写的Softmax算法的测评:(在500个样本上跑的)

naive loss: 2.384533e+00 computed in 0.255952s
vectorized loss: 2.384533e+00 computed in 0.004148s

第一个是用普通的Python和循环写出来的,第二个是用矢量化操作写出来的,可以看到64倍速度的提升——侧面也可以看到Python有多垃圾(慢)。

这个是SVM(支持向量机)算法的测评:(同样500个样本)

Naive loss: 9.102322e+00 computed in 0.136226s
Vectorized loss: 9.102322e+00 computed in 0.005909s

这次的速度提升没有那么明显,但也是26倍的提速。

但我只想说:矢量化真是很难的事情。数学家随便就写公式,也不考虑考虑可怜的计算机科学孩子们。原初的公式几十分钟就搞定,矢量化要一两个小时的冥思苦想。

最后,对于那些读懂了理论,实在是闲得无聊,或者想要进军更高级的学术界的同志们,这里是安杰·卡帕西课代码的链接:CS231n Convolutional Neural Networks for Visual Recognition。如果你不属于这个类别,就不要瞎掺合啦,用用别人的库又怎么了?骇客精神(Hacker Code)中一条就是:“不要重复劳动,有库就要用库,不然就是对库写作者的不尊重。”

这篇文章有点接近“反智”文章的边缘,大意是实用主义至上,自己实现的必要性不大。这个观点还是有很多争议的,比如目前有一个答案就“实名”反对这个答案。机器学习是一个交叉学科,作为学生而言,从不同的部门学到的机器学习,必然是不一样的。在统计学部门学到的机器学习,和在计算机部门学的机器学习,肯定是两个样。我秋天的时候跟一位概率教授上了一节课,当我告诉他斯坦福计算机入门概率课要介绍MLE(最大拟然估值)和蒙特拉罗模拟(Monte Carlo Simulation)的时候,他沉重的摇摇头,说这么早就介绍这样深刻的概念,是很不应该的,在他的部门,要第三年的学生才接触这样的知识,因为直到那时,学生才有足够的知识框架去理解这些知识。

我写这篇文章是有一定的原因的。我认识一些国内的大学同学,都异常优秀,他们努力的程度是我一辈子都比不上的,他们中一部分人因为运气不好(高考),不幸去了一些相对不是那么优异的大学,但是他们用努力弥补这个缺陷,对数学和各种学科展开攻克,很多人的阅读量和数学解题技巧也是我不能企及的。还有一部分人,是处于业界转型边缘,本来已是成熟的程序员,或者数据分析师,但是想要进一步提升自己,亦或是转型。我把这两类人定做这篇回答的目标受众。我希望为他们写一篇回答,不让他们走我走过的弯路,不受太多的误导。

开复先生(李开复)最近说深度学习急缺人才。我非常的不赞同。深度学习领域是处于半饱和状态的,实际上就业情况就是一堆熠熠生辉(Scintillating)的博士们在学术界待腻了,想要去赚点钱玩玩,就跑去业界晃一圈的状况。这和大部分人的就业状况根本是不搭边的。深度学习,以及理论机器学习,除非是平台很高,起点很高,是很难得到广泛认可的。

我最近刚买了一本书:

有没有必要把机器学习算法自己实现一遍?

这本书很详细的在讲Lasso Loss(L1),写SVM的部分也非常不错,很神奇的是,三位作者,两位是斯坦福统计学系的,一位是伯克利的。如果我能读完这本书,会上来改进一下这个答案的。

最近我想提一提答案末尾写的,关于“实现”的问题。我过去几周一直在写我自己的Theano库(是的,放着牛逼的Lasagne不用,非要自己手写),终于把CNN写完后,现在在写RNN的部分。当我已经花费这么多的时间,然后意识到,我的代码暂时还只能在CPU上跑,因为我暂时还没有用Theano的CUDA库,又意识到,仅仅几周后,我的两门春季课已经开始教TensorFlow了,于是觉得自己是个傻子。

所以我自己都陷入了我回答中所写的那个陷阱:实现之后却不能使用,但又不愿意放弃自己的代码,于是只有投入更多的时间去改代码,而不是去理解数学。愿与各位共勉。

  • 十一 28 / 2017
  • 0
Enterprise

锐眼洞察 | 西班牙电信如何利用IoT和大数据建设智慧城市?(翻译)

作者:Bernard Marr 

原文:How Telefonica Is Using IoT And Big Data To Build Smart Cities

译者:TalkingData副总裁 高铎

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

译者摘要:

智慧城市实施的关键

  1. 选择城市治理的关键维度(如交通还是环保);
  2. 研究清楚这个行业里面如何收集和共享数据;
  3. 规划相对好的交互平台(分析和可视化)来提供服务(如市政当局可能需要很好的可视化管理平台,而个体需要类似App这样便捷的体验)。

随着社会上各领域IoT的不断推出,我们个人和商业生活中在线设备日益增加,数据互联和共享的能力越来越强,“智慧城市”的概念正在迅速变为现实。

“智慧城市”一词,可以理解为IoT的一部分,涉及公民和市政基础设施,从公路运输到垃圾收集或配电系统。智能化技术和开放数据可以改善公民决策、优化民主选举等。

西班牙电信在这个概念上投入了大量资金,并推出了一些试点项目,许多项目正在西班牙本土城市发挥作用。

他们的智慧城市全球产品经理Sergio Garcia Gomez, 解释了如何在智慧城市中识别六个关键维度:停车位、路灯、垃圾箱、环境、交通和旅游。

这些都是城市管理的领域,通过现有或易于部署的基础设施,结合IoT方案,快速提高效率。

“我们创建了一个基于开源标准的智慧城市平台,汇集了城市众多服务的来源,将个体和公共数据混合在一起。”

“重要的是,这显示了一个城市如何从一个高效的城市,转变为一个真正智慧的城市,这些都是智慧城市在西班牙以及欧洲开始发展的典范。”

“在废物管理中,所有垃圾箱上的传感器都会实时报告垃圾箱被填满的进度,从而更有效地分配资源来清空他们。这也意味着,核心指标(PKI)与时间的影响会更紧密地联系在一起——有多少箱子接近溢出,在接下来多长时间内会被清空。而不是先前可以监控的形式化变量,譬如道路上的垃圾清理车数量。”

Garcia Gomez 认为这“改变了城市服务的方式,服务提供商可能会有若干关键指标要求(KPI),他们必须满足才能拿到相应奖金。”

智慧城市的另一个优势,是“可以创建不同应用程序,让不同的人群使用可用的工具和数据。这种情况下,公民可以使用应用程序标注邻居溢出的垃圾箱,或墙上的涂鸦。可以设定目标,来评估承包商以多快的速度纠正,并以此评估结果付费。”

传感器数据还可以和开源的人口数据结合,“譬如可以评估60岁以上的人因为垃圾箱溢出受到的影响?80岁以上的人是否会多走一公里?这些给了城市管理更好的信息,以便更好的为公民服务。”

如通过使用监控停车位的传感器,来监控智慧城市的停车场。这意味着,可以实时获得城市的停车密度信息,有助于灵活设置停车费,从而实现更均匀的停车分配,减少拥堵和污染。

空气质量和污染水平也可以通过旨在帮助管理环境的平台进行实时监测。来自这些监测站的数据以及天气数据,可以用于决定何时应该实施高速公路限速措施,以阻止某个区域的污染水平恶化。

交通领域的数据也在进入西班牙电信的智慧城市项目。交通运动传感器实时报告车辆通过的速度,并实现灵活的停车费率和智能标识,帮助市民规划一天的行程。这一方案正在通过与英格兰高速公路的合作扩大到英国。

智慧城市基础设施不应该只帮助本地居民,也应该帮助到游客。可以借助西班牙电信在马拉加和巴萨罗那的部署,监测景点的游客数量水平以及人群和个体的移动。这样可以了解哪个国家的人最可能参观哪些景点。有了这个数据,就可以制定计划,为游客游览城市提供更顺畅的旅游体验。

“某些国家的游客会前往城市的不同地方,当Sagrada Familia排起长队的时候,如果你希望让游客有更好的体验,可以知道何时何地推广其它没那么受欢迎的景点。”

西班牙电信使用CARTO平台,根据收集的开放和个体的位置数据,提供分析和可视化服务,成为智慧城市的重大举措。

智慧城市讨论了很久,西班牙电信通过上述方案表明,它们正在迅速变为现实。开发新的数据模型去测量和提升效率的关键,是学习垂直行业之间如何共享数据。正如在行业里发生的那样,一个开放和协作的数据集,以及对应的分析方法,能够帮助组织提升效率,对于依赖基本服务的市政当局来说,情况也是如此。

  • 十一 28 / 2017
  • 0
Data

锐眼发现 | 做数据分析不得不看的书有哪些?

作者:Han Hsiao

转载于:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、数据分析入门:

电子工业出版社的经典书目系列,从数据分析基本步骤开始、实验方法、最优化方法、假设检验方法、贝叶斯统计方法、主观概率法、启发法、直方图法、回归法、误差处理、相关数据库、数据整理技巧一一讲到。图比较多,适合入门。

推荐理由同上,适合入门者的经典教材。

R是属于GNU系统的一个自由、免费、源代码开放的软件,用于统计计算和统计制图。这本书从实用的统计研究角度逐例分析R在数据处理、模型构建、以及图形操作上的由浅入深的结合,堪称经典。

作者是华盛顿大学理论物理学博士。这本书是数据分析的经典一,包含大量的R语言模拟过程及结果展示,例举了很多数据分析实例和代码。

作者是Data Miners的创办人,有二十多年的营销和客户关系管理结合数据挖掘的经验。详细介绍了作为一个数据挖掘团队需要的知识体系,包括数据库、SAS使用、统计学、机器学习、数据可视化、如何访问用户收集需求、如何写论文与沟通等等。有条件的建议看英文原版。

入门五星推荐。里面很多图表实例,手把手教你如何EXCEL画图,对各种知识点(平均值,模式,中值,方差,标准偏差)的讲解相当的到位,比起大学里的各种课本靠谱。

先把这些花时间啃啃,数据分析的理论部分就基本入门了,根据实际情况还需要结合你的业务需求来进行系统的学习。

二、数据分析进阶:

作者Cathy O’Neil是哈佛大学的博士,MIT的数据博士后,曾今作为一名Quant在对冲基金D.E. Shaw 工作,目前是一家纽约初创公司的Data scientist 。这本书需要有一定的编程和理论基础,作为入门教材来说有点难,虽然只有400来页,但是涉及的知识点很全面。每一章节的核心内容都附有编程案例,R/Python/Shell三种语言任君挑选。

Python数据分析必看,适合入行不久的数据分析师。作者有多年的Python数据分析工作经验,对各种Pyhon包iPython,NumPy,pandas,matpotlib等有着很深的理解。看完这本,敲完代码,Python数据分析就算入行了。

很多牛人为之作序,数据科学如何与商业结合,相信这本书会给你一些启发。

2016年6月出版的,500页保质保量,作者(Jake VanderPlas)是华盛顿大学电子科学研究所的高级数据科学研究员,研究领域包括天文统计学、机器学习和可扩展计算。书的前半部分介绍了用于数据分析和一般的科学计算的基本Python库,后面从实际应用的角度使用Python库scikit-learn开始机器学习实践。适合有一定Python基础人(或者R基础),并且想学习如何使用Python进行数据分析的人。

作者Cole Nussbaumer Knaflic,私募分析师,前Google人力分析团队总监。本书展示了如何高效率展示量化资讯,如何用丰富的资料讲故事。Google内部的数据可视化课程讲师,之前也在Maryland Institute College of Art兼职讲师。如果你想知道如何以图叙事,这边好书不容错过。

OK,这几本够看一阵了,有时间再更新。

  • 十一 27 / 2017
  • 0
Data, Tech

锐眼洞察 | 利用你自己的数据资产库进行数字化转型(翻译)

作者:Gary Orenstein 

原文:Using Your Data Corpus to Further Digital Transformation

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

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

译者注:
这篇文章整体解读了数据资产库对于业务的重要性,尤其是支持实时操作的数据资产库。MemSQL本身是基于内存的数据库,因此其性能非常适合做实时的数据科学和建模。

简介

我们每天都会看到新产生的数据流,从新的移动应用到新连接的设施和汽车以及新的从全世界各个角落获取信息的业务应用。我们的世界已经充满了数据。

世界最具价值公司的估值飞涨和驱动他们业务增长的数据,是这一显著趋势的最好证明。我们见识了Apple与AppStore、Google与其搜索的历史、Facebook与其社交图谱以及Amazon和其每个客户的丰富购买历史。这几家公司都找到了产生和变现他们数据资产的有效的方法。

 

在更广泛的行业领域,如何获取数据、决定哪些数据有用以及哪些数据是杂质并且使之具备可操作性,仍旧是我们这个时代典型的技术和业务挑战。

在不同的行业领域有很多公司已经具备数据收集和分析模型,但现在是时候去评估这些手段能够如何有效的影响业务。

开发一个数据资产库

一个企业的数据资产库可能来自于不同的来源:

  • 现存的内部数据资产: 可能是企业内部已经存储的数据,这些数据可能开放给全公司访问,可能仅限一些个人或者团队访问。今天很多公司寻求将历史数据放入到数据湖中,尤其是将历史数据放入到低成本的存储中,使得这些数据可以被公司内部更多的人访问。
  • 现存的外部数据资产:并不是每个数据资产库都仅有内部数据构成。比如Google最早是通过扫描web网站来建设自己的数据资产库。在金融领域的另外一个选择是购买相关的历史数据集。
  • 新的数据流:未实现和未开发的数据流比较容易获取。可以通过收集新的数据或者加速数据收集来得到。例如,一个大零售商把现存的web统计从隔夜批量处理改为实时流式处理,这使得商品经理可以即刻看到相关信息并且做出决策而不需要等一个晚上。

评估数据资产库的价值

保留数据并不是免费的,并且具有固定和边际成本。然而,保留数据的成本通常远远小于数据带来的业务价值。例如,在Amazon S3上存储用于日常访问的前50T数据每个月花费1150美元,对于不常访问的放在Glacier存储上的花费仅仅200美元。当然,上传和下载也有成本,并且会放大存储花销,但是一般认为存储是相对便宜的。

更大的问题是对数据的利用。在公司内进行一个数据用户与组成的快速调研可以帮助我们回答这个问题。 大部分大公司有几十个甚至几百个商业智能分析师。 他们能从更多数据、新的数据流以及更新鲜的数据中获益吗?答案通常都是肯定的。

从数据资产库产生价值

数据资产库的价值是通过新的洞察和应用来产生的。一个简单的例子是Google利用搜索给出的建议。当Google吸引了大量的web搜索用户时,便可以对最频繁的请求构建一个数据库,当你在Google进行搜索时,它可以自动的利用这些数据进行补全。

clipboard-4.png

图1:Google的“自动补全”功能

金融领域案例

每个大型的金融机构都需要追踪财产从而确保其操作遵循公司或者政府的合规要求。尤其关键的是,如果银行发现其在合规范围内,就可以做更具野心的投资,从而获取更高收益。如果它已经接近或者触碰合规底线时,银行则必须进行相对保守的投资,而获得较低的收益。

如果没有一个数据资产库能够产生这些报告,银行无疑是在闭着眼睛飞行。通过将不同的系统中的数据放到一个大的实时数据仓库,银行得到了能够实时观察所有操作的一组透镜,确保信息是当日最新的而不是隔夜的。

利用实时反馈来达到数字化转型

最成功的公司采用数据资产库,并且结合数据科学和机器学习来驱动对数据资产库的洞察,如图2:

clipboard-3.png

图2:将应用与数据科学结合用于实时机器学习。来源:MemSQL

 

将应用和数据科学结合在一起进行实时机器学习

最初从数据资产库获益的是应用——技术领域的“执行者”。这些应用会产生一定量数据,并且在数据和应用程序之间有固定的交互。

随着应用和设备产生更加大量的数据,我们让“操作者”将数据科学应用在从企业软件到移动应用的一切地方以提高体验。当操作者和执行者结合在一起时,可以利用实时机器学习去驱动新的知识回流到业务。但也只有在反馈闭环被开发出来用于丰富体验时才能起效。

clipboard-2.png

图3:为数据资产库构建一个反馈闭环来驱动数字化转型。来源:MemSQL

用数据资产库做更多的事情

毫无疑问数据是商业的新燃料。企业现在需要通过可以提供数据变现能力的解决方案来应对数据的挑战。考虑到这一点,企业架构师应该考察:

可以存储大量的历史数据和实时数据的数据库和数据仓库

可以提供实时数据注入以及数据查询的数据存储

可以结合实时机器学习评分和嵌入机器学习功能到数据存储的解决方案

具备捕捉事件的事务处理能力和实时洞察的分析能力的数据存储。这样可以用更少的系统来提供完整的解决方案。

我们会看到在未来一段时间数据资产库会备受关注。正如一位杰出数据科学家同时也是一家AI创业公司CEO指出的:“我们将需要一个更大的资产库。”

 

clipboard.png
  • 十一 27 / 2017
  • 0
Ideas

锐眼洞察 | 2018年的5大数字营销趋势(翻译)

作者:Charlie Sammonds

原文:Top 5 Digital Marketing Trends For 2018

译者:TalkingData解决方案架构师 韩铭扬

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

随着2017年逐步步入尾声,我们可以就此回顾一下这一年。虽然它可能不如2016年那样动荡和难以预测,但对于数字化营销来说,它仍是令人激动的一年。对UX的重视已经改善了不同渠道的用户体验,本土广告已经从其笨重的开端走了很远,直播内容也在不断增加和改进,更好的数据使用意味着定向广告的进一步提升。

展望2018,我们应该考虑那些一段时间以来一直在形成势头的趋势,以便更好地了解2018年将带来什么。评论家们有一些共识:例如,在前几年奠定的基础之上,意见领袖营销在未来12个月将迎来巨大增长。视频仍将会是营销人员的最爱,聊天机器人可能会发展到真正有用的阶段,AR也将最终在营销活动中得到应用。随着2018年的临近,我们对每个数字化营销人员需要密切关注的趋势做了观察。

意见领袖将会变得更加重要

智能洞察(Smart Insights)的数据显示,在2017年,84%的市场营销人员至少策划过一次意见领袖营销活动(influencer marketing campaign),而这一数字在2018年还会有所上升,因为这一技术将越来越多地成为应对程序化广告和横幅广告减少的解药。意见领袖为品牌提供了一种与目标受众进行大规模沟通的方式,这源自于受众早已建立起联系的“真实可信”的声音。即为数字时代的名人(和小明星)代言。正如内容营销已经成为品牌在比展示型广告更深的层次上与受众沟通的一种方式一样,意见领袖营销也将走上类似的轨道。

然而,随着意见领袖营销的普及,出现了许多需要克服的问题。这些问题中最重要的在于它威胁到了意见领袖营销的关键利益——只有当意见领袖本人是真实可信的时候,他们所发出的声音才有分量。越来越多买粉丝的“假”意见领袖正从不那么正规的机构获得代言交易,这是一些品牌必须警惕的事情。此外,联邦贸易委员会(FTC)正在打击社交频道上没有公开披露的品牌内容,这也是品牌在未来的选择中需要更加谨慎的另一个原因。

注重质量而非数量

随着数字营销的发展以及内容营销在其中的主导地位,世界上很不幸的充斥着二流的内容。如今,任何一个精通数字技术的品牌都知道,它应该发布内容,让其受众参与进来。但许多人忘记了,这些内容同时也应该为观看者提供正当合理的价值。任何人都可以不停地发表500字的文章来重复其竞争对手所说的一切,仅仅是为了参与到这场对话中。如果问任何一名营销人员,他们是否计划在来年生产更多的内容,答案很可能是肯定的。

在2018年,内容营销人员的心态将会发生改变。的确,品牌应该创造吸引并激励受众的内容,但“多即是好”的观念需要改变。相反,组织应该把重点放在发布优质、相关的内容上,即使这是以牺牲数量为代价。这可能是评论者过于理想主义的呼喊,以试图减缓无用内容的大潮。但是,由于糟糕的内容无疑会带来糟糕的表现,2018年应该是品牌认识到“少即是多”力量的一年。

视频将持续占领主导地位

有时,某些因素能否在一年中占据主导地位并不一定需要其有激进的改变。市场对于视频营销内容的需求并没有减缓的迹象,而它也将在2018年继续作为营销人员最喜爱的媒介占据主导地位。有52%的营销专业人士认为视频是投资回报率最高的媒介,而43%的消费者表示希望看到更多来自营销人员的视频内容。

今年,Facebook推出了“6秒广告”,鼓励品牌在极短的时间内讲故事,以便更快地向用户传达信息。移动视频消费的增长意味着,当用户浏览一条推送时,他们的注意力范围较小。YouTube一直在推广自己的“6秒故事”,以展示可在这6秒内取得的成果,并期待在2018年看到品牌尝试有趣的讲故事的方式。视频的无处不在正如它所带来的效果一样——2018年应该会看到品牌努力在杂音中脱颖而出。

聊天机器人将最终变得有用

一段时间以来,聊天机器人一直被吹捧为规则改变者,但对于他们的潜在影响,人们意见不一。一些人认为:在不久的将来,我们将主要通过聊天机器人来与品牌沟通以及执行任务,而另一些人则质疑消费者与因缺乏灵活性而常常使人抓狂的机器交流时是否会感到舒适。这就是先进的人工智能正在改变对话的地方。2018年,聊天机器人将发展成为对品牌和消费者都非常有用的地步。事实上,到2025年,全球聊天机器人的市场预计将达到12.3亿美元。

聊天机器人的兴起是利用“黑暗”社交平台的一部分努力,在这个平台上,你的互动及信息是不公开的。人们在即时通讯应用(Facebook Messenger、iMessage、WhatsApp等)上花费的时间越来越多,实际上超过了在社交媒体应用上花费的时间,这使得通讯应用成为品牌试图参与进来的一个巨大领域。“追随你的用户”(“go where your customers are”)这句陈词滥调也延伸到了数字领域,如果用户在通讯平台上,那么聊天机器人可能是触达他们的最佳方式。2018年期间,聊天机器人领域内的人工智能技术将会发展到真正可以使用的节点。到2020年,80%的企业将已应用(或计划使用)聊天机器人,而明年,我们将朝着这一方向迈出一大步。

增强现实技术(AR)

经过多年对AR营销效果的思索及推测,AR的潜力将在2018年真正成形。虽然大多数人仍将只通过Pokemon Go或者Snapchat上的跳舞热狗(dancing hot dogs)等游戏才能适当的使用AR,但它的应用将变得更加普遍和多样化。

AR的应用案例可能会是惊人的。用户可以在购买之前将虚拟家具放置在家中,看它是否适合实际空间(宜家已经在这么做了)。当逛超市时,增强型眼镜将可以为顾客突出标记无麸质的食品,从而节省人们挑选合适产品的时间。并且,更广泛的来说,当顾客在实体店中走动或在公共场所查看商品时,覆盖以更多有关产品的信息可能会被证实为一种强大的转换工具。AR未来对普通品牌的影响有多大还有待观察,但到2018年年底,我们应该会有一个更好的答案。

 

  • 十一 27 / 2017
  • 0
Tech

锐眼发现 | 十分钟看懂图像语义分割技术

作者:沈MM,微信公众号「沈MM的小喇叭」(ID:VoiceOfShenMM)

            本文参考了知乎专栏,部分图片来自

转载自:雷锋网

 

大多数人接触 “语义” 都是在和文字相关的领域,或语音识别,期望机器能够识别你发出去的消息或简短的语音,然后给予你适当的反馈和回复。嗯,看到这里你应该已经猜到了,图像领域也是存在 “语义” 的。

今天是 AI 大热年,很多人都关注与机器人的语音交互,可是有没有想过,将来的机器人如果不能通过图像来识别主人,家里的物品、宠物,那该多没意思。说近一些,假如扫地机器人能够机智地绕开你丢在地上的臭袜子而扫走旁边的纸屑,一定能为你的生活解决不少麻烦。

没错,图像语义分割是 AI 领域中一个重要的分支,是机器视觉技术中关于图像理解的重要一环,是不是听上去即重要又牛 X 闪闪的。

近年的自动驾驶技术中,也需要用到这种技术。车载摄像头探查到图像,后台计算机可以自动将图像分割归类,以避让行人和车辆等障碍。

十分钟看懂图像语义分割技术

十分钟看懂图像语义分割技术

图像语义分割

图像语义分割的意思就是机器自动分割并识别出图像中的内容,比如给出一个人骑摩托车的照片,机器判断后应当能够生成右侧图,红色标注为人,绿色是车(黑色表示 back ground)。

十分钟看懂图像语义分割技术

所以图像分割对图像理解的意义,就好比读古书首先要断句一样

在 Deeplearning 技术快速发展之前,就已经有了很多做图像分割的技术,其中比较著名的是一种叫做 “Normalized cut” 的图划分方法,简称 “N-cut”。

N-cut 的计算有一些连接权重的公式,这里就不提了,它的思想主要是通过像素和像素之间的关系权重来综合考虑,根据给出的阈值,将图像一分为二

下图是将像素间的关系信息简单描述成为距离,根据距离差距来划分图像的示例:

十分钟看懂图像语义分割技术

在实际运用中,每运行一次 N-cut,只能切割一次图片,为了分割出图像上的多个物体,需要多次运行,下图示例了对原图 a 进行 7 次 N-cut 后,每次分割出的结果。

十分钟看懂图像语义分割技术

但是可以很明显的看到这种简单粗暴的分割方式并不准确,趴在地上的运动员肢体在 b 图中分割出来,而他的手臂则在 h 图中被分割,显然是错误的。

N-cut 技术的缺陷很明显,于是有了一种更新的优化方式,这种优化方式为了避免机器不能很好的分割类似上面例子中 “衣服和肢体颜色反查太大导致分割错误” 的情况,增加了人机交互,在分割过程中,需要人工干预参与完成。

这种需要人机交互的技术叫 Grab Cut

[敲黑板]~~ 注意,PS 里就使用了这种技术。

这种技术其实是这样的,给定一张图片,然后人工在想要抠图(也就是我们说的分割)的区域画一个红框,然后机器会对略小于这个框的内容进行 “主体计算”,嗯,这个 “主体计算” 是我起的名字,为了你们更好的理解背后复杂的设计和公式,因为机器会默认红框中部是用户期望得到的结果,所以将中部作为主体参考,然后剔除和主体差异较大的部分,留下结果。

十分钟看懂图像语义分割技术

此技术中,抠出来的部分叫 “前景”,剔除的部分叫 “背景”。

有时候还挺好用的,但是稍微复杂一点的时候问题就来了:比如要抠下面这个戴头盔的大兵,头盔颜色和背后岩石颜色很相近,结果机器就会把头盔部分剔除,同样脖子附近的山岩也被当做了前景而保留了进来。

十分钟看懂图像语义分割技术

此时又需要进行人工干预了,需要手动在图像上进行标注,画白色线表示是希望保留的前景,红色表示背景,指导辅助机器进行判断,再次运算后,得到了较好的期望结果。

虽然看上去 Grab Cut 给出的结果还不错,但缺点也很明显,首先,它同 N-cut 一样也只能做二类语义分割,说人话就是一次只能分割一类,非黑即白,多个目标图像就要多次运算。其次,它需要人工干预,这个弱点在将来批量化处理和智能时代简直就是死穴

OK,人类的智慧是无止境的,DeepLearning(深度学习)终于开始大行其道了。

深度学习

深度学习是机器学习的一个分支,主要指深度神经网络算法,深度神经网络比普通神经网络层次更多,能够更好地捕捉数据中的深层次关系,得到的模型较为准确,主要用来进行特征学习。

先别急着晕,我们先来看看神经网络是怎么工作的。

神经网络是模仿人的神经元而建立的人工神经元系统,多输入单输出,同时输出又作为下一个神经元的输入……(请自行脑补那张牙舞爪妖孽的神经元细胞~ 什么?没见过?文科生,拖出去~~)

下图表示的是一个单个神经元:

十分钟看懂图像语义分割技术

把这些单个神经元组织在一起,便形成了神经网络。下图便是一个三层神经网络结构:

十分钟看懂图像语义分割技术

上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层

深度神经网络系统中的层数比较多,达到 8-10 层(普通神经网络的层数通常 3-4 层)。

在此前使用的图像识别算法中,主流的技术是卷积神经网络算法(Convolutional Neural Networks),简称 CNN卷积神经网络就是一种深度神经网络

但是在 2015 年的 CVPR 上发表了一篇很牛 X 的论文(路人甲:请问 CVPR 是神马?答:CVPR 可以简单理解为这个领域的最重量级的会议:国际计算机视觉与模式识别会议),提出了 FCN 即 全卷积神经网络(Fully Convolutional Networks)。

为什么说这个 FCN 论文很牛叉呢?看起来只是多了一个字而已呀,有什么不得了的呢?

嗯,不得不说,真是 “差之毫厘,谬以千里” 啊。

我还是先来帮大家复习一下卷积。

我查了很多书,卷积有各种各样的公式,还有各种各样的推导算法,但是为了降低本文的难读指数,所以我直接跳到卷积的物理意义,不要太 care 那些公式,其实卷积的物理意义,就是 “加权叠加”。

在对图像处理进行卷积时,根据卷积核的大小,输入和输出之间也会有规模上的差异。

来看一张动图(仅做示例)

十分钟看懂图像语义分割技术

上图左边 5*5 的方块视为图像输入,黄色移动的 3*3 以及里面的数字(*1/*0)是卷积核,该卷积核按照步长为 1 的顺序依次从原始输入的左上角一直移动计算叠加到右下角,卷积核一共移动 9 次。

九次的位置对应到右侧的 3*3 的相应格内,格中的数字便是卷积值,(此处是卷积核所覆盖的面积内元素相乘再累加的结果)。

9 次移动计算完毕后,右侧 3*3 的新矩阵为此次卷积层的计算结果。

如果这么说还是不太好理解,没关系,我有更直观的办法 ^_^。

在实际计算过程中,输入是一张原始图片和滤波器 filter(一组固定的权重,也就是上面我们说的卷积核对应的实际意义)做内积后得到新的二维数据。

不同的滤波器 filter 会得到不同的输出数据,比如轮廓、颜色深浅,如果想提取图像的不同特征,需要用不同的滤波器 filter 提取想要的关于图像的特定信息。

十分钟看懂图像语义分割技术

上图为一个卷积层中的卷积处理过程,注意上下两次卷积核内容是不同的,所以得到两种处理结果。

等号右边的新的二维信息在 CNN 网络中,会作为下一个卷积层的输入,即在下一个卷积层计算时,右边的图像会作为输入的原始图像。

在 CNN 网络中,一共会进行 5 次卷积层计算。

路人甲:那最后会得到一个什么鬼?

沈 MM:咳咳,在连续的 5 个卷积层计算后,紧跟这的是 3 个全连接层。

路人甲:什么是全连接层?

沈 MM:全连接层,并不是一个二维图像,而是—— 一个一维向量

路人甲已哭晕在厕所。

这三个一维向量的前两个向量长度是 4096,最后一个向量长度是 1000.

为什么是 1000?

因为在 CNN 网络中,有 1000 个分类,最后的这个向量中的 1000 个元素表达的信息是:这张原始输入图片中的东西可能是这 1000 个分类中的物体的概率。

是的,一张图,算了半天,最后给出的是,这张图是个什么玩意的答案。

十分钟看懂图像语义分割技术

右侧绿色箭头指向的表示最后一个全连接层的向量中,表示各种物体的概率,上图被识别为一辆车。

好了,上面说的是卷积神经网络 CNN 的处理过程(相信我我已经很简化了)。

那么全卷积神经网络呢?

大家应该注意到,CNN 的输入是图像,输出是一个结果,或者说是一个值,一个概率值。

FCN 提出所追求的是,输入是一张图片是,输出也是一张图片,学习像素到像素的映射

十分钟看懂图像语义分割技术

上图上半部分是 CNN 网络,下半部分是 CN 网络

那么 “全卷积” 又体现在哪里呢?

CNN 网络中的后三层,都是一维的向量,计算方式不再采用卷积,所以丢失了二维信息,而 FCN 网络中,将这三层全部转化为 1*1 的卷积核所对应等同向量长度的多通道卷积层,使后三层也全部采用卷积计算,整个模型中,全部都是卷积层,没有向量,所以称为 “全卷积”。

FCN 将第 6 层和 7 层分别从 4096 长度的向量转化为 4096 通道的卷积层,第 8 层则是 21 通道的卷积层。之所以第 8 层从 1000 缩减到 21,是因为 FCN 使用的识别库是 PASCAL VOC,在 PASCAL VOC 中有 20 种物体分类,另外一个 background 分类。(关于 PASCAL VOC 参见附录

再多说一句,以下(甚至全文)所用到的分割图片中不同的颜色就表示不同的物体类别,一共有 21 种颜色:

十分钟看懂图像语义分割技术

CNN 的识别是图像级的识别,也就是从图像到结果,而 FCN 的识别是像素级的识别,对输入图像的每一个像素在输出上都有对应的判断标注,标明这个像素最可能是属于一个什么物体 / 类别。

在此处特别要指出的是,在实际的图像语义分割测试时,输入是一个 H*W*3 的三通道彩色图像,而输出是一个 H*W 的矩阵。

这就可以简单看做每一个像素所携带的信息是多维的,比如颜色,就分为 3 层,分别对应 R、G、B 三个值。(不知道什么是 RGB 的,鉴定为文科生,请迅速撤离,谢谢)

所以在进行卷积的时候,每一个通道都是要独立计算的,计算完之后再叠加,得到最终卷积层结果。

如果卷积核移动的步长为 1,那么卷积是按照像素排列去挨个计算的,计算量可想而知会有多么庞大。但是在实际中,相邻的像素往往都是一类,按照像素依次计算就显得冗余,所以在卷积之后会对输出进行一次池化(pooling)处理

那么什么又是池化呢?

来,我们再来看一张动图:

十分钟看懂图像语义分割技术

池化简单来说就是将输入图像切块,大部分时候我们选择不重叠的区域,假如池化的分割块大小为 h*h,分割的步长为 j,那么一般 h=j,就像上图,如果需要重叠,只需要 h>j 即可。

对完整图像切分,再取切分区域中所有值的均值或最大值作为代表该区域的新值,放入池化后的二维信息图中。得到的新图就是池化结果。

在 CNN 和 FCN 的网络模型中,每一个卷积层,都包含了 [卷积 + 池化] 处理,这就是传说中的 “下采样”,但这样处理之后的结果是:图像的像素信息变小了,每一层的像素信息都是前一层的 1/2 大小,到第五层的时候,图像大小为原始图像的 1/32

在 CNN 算法里,这并没有什么要紧的,因为 CNN 最终只输出一个结果:“这个图上是个啥”,但是 FCN 不同,FCN 是像素级别的识别,也就是输入有多少像素,输出就要多少像素,像素之间完全映射,并且在输出图像上有信息标注,指明每一个像素可能是什么物体 / 类别。

所以就必须对这 1/32 的图像进行还原

这里用到个纯数学技术,叫 “反卷积”,对第 5 层进行反卷积,可以将图像扩充至原来的大小(严格说是近似原始大小,一般会大一点,但是会裁剪掉,为什么会大的原理略复杂,这里先不提,以后写进阶版再放进来)。

——这个 “反卷积” 称为 “上采样”。(和下采样对应)

十分钟看懂图像语义分割技术

在技术上,我们可以对任一层卷积层做反卷积处理,得到最后的图像,比如用第三层 (8s-8 倍放大),第四层 (16s-16 倍放大),第五层 (32s-32 倍放大) 得到的分割结果。

十分钟看懂图像语义分割技术

来看一张各层还原后的对比图,分别是:

十分钟看懂图像语义分割技术

通过对比可以很明显看到:在 16 倍还原和 8 倍还原时,能够看到更好的细节,32 倍还原出来的图,在边缘分割和识别上,虽然大致的意思都出来了,但细节部分(边缘)真的很粗糙,甚至无法看出物体形状。

为什么会这样呢?

这里就涉及到一个感受域(receptive field)的概念。较浅的卷积层(靠前的)的感受域比较小,学习感知细节部分的能力强,较深的隐藏层 (靠后的),感受域相对较大,适合学习较为整体的、相对更宏观一些的特征

所以在较深的卷积层上进行反卷积还原,自然会丢失很多细节特征。

于是我们会在反卷积步骤时,考虑采用一部分较浅层的反卷积信息辅助叠加,更好的优化分割结果的精度:

十分钟看懂图像语义分割技术

尽管 FCN 的提出是一条很牛叉的路,但还是无法避免有很多问题,比如,精度问题,对细节不敏感,以及像素与像素之间的关系,忽略空间的一致性等问题。

于是更牛的大牛就出现了。

有牛人提出一种新的卷积计算方式,开始称为 “带 hole” 的卷积,也就是使用一种 “疏松的卷积核” 来计算,以此来取代池化的处理。

上面已经讲过,池化操作能够减少计算量,同时也能防止计算结果过拟合,那么单纯取消池化操作又会使单层网络的感受域缩小,但如果使用 “疏松的卷积核” 来处理卷积,可以达到在不增加计算量的情况下增加感受域,弥补不进行池化处理后的精度问题。

括弧:这种带洞的卷积方式后来起了一个高雅的名字叫做:“Dilated Convolutions”。

这种方式人为加大了卷积核内部元素之间的距离,可参考下图:

十分钟看懂图像语义分割技术

红点表示卷积核的元素,绿色表示感受域,黑线框表示输入图像。

a 为原始卷积核计算时覆盖的感受域,b 为当卷积核覆盖的元素间距离增大的情况,不再在连续的空间内去做卷积,跳着做,当这个距离增加的越大时,单次计算覆盖的感受域面积越大。

上图不太好理解的话再来看一张图:(个人觉得下面这个图非常好理解)

十分钟看懂图像语义分割技术

上层绿色点表示输入层像素点,下层黄色是输出层(单次计算时的层级关系),当卷积核元素间距为 0 时(相邻),123 对应输出 A,234 对应输出 B,345 对应输出 C,那么输出 ABC 三个元素结果的感受域只覆盖了 12345 这几个原始像素点。

如果采用稀疏的卷积核,假设间距为 1(相当于卷积计算时跳一个像素再取值计算),如图示,那么结果 A 对应的输入是 135,结果 B 对应的输入是 246,结果 C 对应的输入是 357,同样输出 ABC 三个结果,在原始图像上取的像素点的长度就多了。

这是水平 X 轴方向上的扩展,在 Y 轴上也会有同样的扩展,感受域在没有增加计算(相对于池化操作后)的情况下增大了,并且保留了足够多的细节信息,对图像还原后的精度有明显的提升。

看一下对比图:

十分钟看懂图像语义分割技术

第一列是原始图像,最后一列是手工标注的训练输入图像,第二列为 FCN 在 1/8 倍数下的还原,第三列则是采用了新的卷积算法的还原图像,可以很明显看到,第三列对细节的分割明显优于第二列 FCN 8 倍的图像。

刚才还提到了第二个问题,即像素与像素之间的逻辑关系的问题,毕竟前面再牛叉的算法也只是单纯的计算没有根据物理意义进行判断在输出的标注里这些结果是否合法(符合现实逻辑)。

很多以深度学习为框架的图像语义分割系统都使用了一种叫做 “条件随机场”( Conditional Random Field,简称 CRF)的技术作为输出结果的优化后处理手段。其实类似技术种类较多,比如还有马尔科夫随机场 (MRF) 和高斯条件随机场 (G-CRF) 用的也比较多,但原理都较为类似。

简单来介绍一下 “条件随机场” 的概念。

FCN 是像素到像素的影射,所以最终输出的图片上每一个像素都是标注了分类的,将这些分类简单地看成是不同的变量,每个像素都和其他像素之间建立一种连接,连接就是相互间的关系。

于是就会得到一个 “完全图”:

十分钟看懂图像语义分割技术

上图是以 4*6 大小的图像像素阵列表示的简易版。

那么在全链接的 CRF 模型中,有一个对应的能量函数:

十分钟看懂图像语义分割技术

嗯,不要问我这个公式里各种符号是啥,我看不懂。但是我知道这个公式是干嘛滴:

其中等号右边第一个一元项,表示像素对应的语义类别,其类别可以由 FCN 或者其他语义分割模型的预测结果得到;而第二项为二元项,二元项可将像素之间的语义联系 / 关系考虑进去。

这么说太抽象,举个简单的例子,“天空”和 “鸟” 这样的像素在物理空间是相邻的概率,应该要比 “天空” 和 “鱼” 这样像素相邻的概率大,那么天空的边缘就更应该判断为鸟而不是鱼(从概率的角度)。

通过对这个能量函数优化求解,把明显不符合事实识别判断剔除,替换成合理的解释,得到对 FCN 的图像语义预测结果的优化,生成最终的语义分割结果。

优化后的对比图:

十分钟看懂图像语义分割技术

上图第二列是 FCN 网络 8 倍还原分割结果,第三列是将 CRF 植入 FCN 处理后的结果。

可以很明显的看到,第三列的物体识别无论是轮廓细节分割还是物体识别,都优于第二列,特别是第二行的沙发中有奇怪的红色东西的识别,在进行 CRF 优化之后,还原成了绿色的沙发。

OK,说了这么多,终于快要讲完了(好累)。

以上就是目前较为前沿的图像语义分割技术。

目前的这种机器学习方式还属于监督性学习,牛叉闪闪的科学家们还是希望将来可以实现半监督或弱监督式学习,这样更类似人类的学习认知方式。

在这条道路上,还有很多有趣的东西,比如示例级别(instance level)的图像语义分割问题也同样热门。

该类问题不仅需要对不同语义物体进行图像分割,同时还要求对同一语义的不同个体进行分割(例如需要对图中出现的九把椅子的像素用不同颜色分别标示出来)。

十分钟看懂图像语义分割技术

另外,在目前的计算技术水平下(硬件软件),使用 FCN 训练建模的时间大约需要三周,这也说明在这个领域里还有很多值得探索和需要解决的问题。

对此有兴趣的同学们自己去继续研究吧,哈哈。

曾有一个业界大牛说过这样一段话,送给大家:

“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”

AI 的浪潮即将席卷而来,你,准备好了么?

—— 附录的分割线 —–

PASCAL VOC(patternanalysis,statistical modelling and computational learning visual objectclasses) 模式分析,统计建模,计算学习,视觉物体分类。

PASCAL VOC 挑战赛是视觉对象的分类识别和检测的一个基准测试,提供了检测算法和学习性能的标准图像注释数据集和标准的评估系统。从 2005 年至今,该组织每年都会提供一系列类别的、带标签的图片,挑战者通过设计各种精妙的算法,仅根据分析图片内容来将其分类,最终通过准确率、召回率、效率来一决高下。如今,挑战赛和其所使用的数据集已经成为了对象检测领域普遍接受的一种标准。

委员会所提供的图片集包括 20 个目录:人类;动物(鸟、猫、牛、狗、马、羊);交通工具(飞机、自行车、船、公共汽车、小轿车、摩托车、火车);室内(瓶子、椅子、餐桌、盆栽植物、沙发、电视)。都是一些日常中最常见的物体,为的就是能更好的体现算法的实用性。

后记 

很多人跟我说过,不要写那么长的文章,因为现在没人会看长文。

可是我却 “变本加厉” 写这么长的技术文章。

为了写这文章,中秋三天都在家里查资料,码字。除了图片在网上能找到现成的,其他没有从哪里照搬过原话,6 千 6 百多字全是基于自己的理解然后尽量浅显易懂滴写出来~

但还是太技术了,因为这本身就是技术。

18 号我做了一个关于此项技术非学术性非正式的小范围交流,会上大家也觉得偏技术流,于是我又根据交流过程中一些没有阐述清楚的点补全了这篇文章,即便不会有多少人看,却也还是要写,要发的。

因为什么呢? 执着吧。

其实我也想写诸如 “一张图看懂全卷积神经网络” 这样粗浅易读的东西,但是我对信息的精炼程度还达不到一张图就能讲清楚的水平,能力有限。

嗯,就酱。

 

  • 十一 24 / 2017
  • 0
Tech

锐眼洞察 | flink关系型API:Table API与SQL

作者:TalkingData Java数据工程师  王剑

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

 

本篇文章主要介绍flink的关系型API,整个文章主要分为下面几个部分来介绍:

  1. 什么是flink关系型API
  2. flink关系型API的各版本演进
  3. flink关系型API执行原理
  4. flink关系型API目前适用场景
  5. Table & SQL API介绍
  6. Table & SQL API举例
  7. 动态表
  8. 总结

一、什么是flink关系型API

当我们在使用flink做流式和批式任务计算的时候,往往会想到几个问题:

  1. 需要熟悉两套API : DataStream/DataSetAPI,API有一定难度,开发人员无法focus on business
  2. 需要有Java或Scala的开发经验
  3. flink同时支持批任务与流任务,如何做到API层的统一

flink已经拥有了强大的DataStream/DataSetAPI,满足流计算和批计算中的各种场景需求,但是关于以上几个问题,我们还需要提供一种关系型的API来实现flink API层的流与批的统一,那么这就是flink的Table & SQL API。

首先Table & SQL API是一种关系型API,用户可以像操作MySQL数据库表一样的操作数据,而不需要写Java代码完成flink function,更不需要手工的优化Java代码调优。另外,SQL作为一个非程序员可操作的语言,学习成本很低,如果一个系统提供SQL支持,将很容易被用户接受。

总结来说,关系型API的好处:

  1. 关系型API是声明式的
  2. 查询能够被有效的优化
  3. 查询可以高效的执行
  4. “Everybody” knows SQL

Table & SQL API是流处理和批处理统一的API层,如下图。flink在runtime层是统一的,因为flink将批任务看做流的一种特例来执行,然而在API层,flink为批和流提供了两套API(DataSet和DataStream)。所以Table & SQL API就统一了flink的API层,批数据上的查询会随着输入数据的结束而结束并生成DataSet,流数据的查询会一直运行并生成结果流。Table & SQL API做到了批与流上的查询具有同样的语法语义,因此不用改代码就能同时在批和流上执行。

图片 20

关于DataSet API和DataStream API对应的Table如下图:

图片 16

图片 17

二、flink关系型API的各版本演进

关于Table & SQL API,flink在0.9版本的时候,引进了Table API,支持Java和Scala两种语言,是一个类似于LINQ模式的API。用于对关系型数据进行处理。这系列 Table API的操作对象就是能够进行简单的关系型操作的结构化数据流。结构如下图。然而0.9版本的Table & SQL API有着很大的局限性,0.9版本Table API不能单独使用,必须嵌入到DataSet或者DataStream的程序中,对于批处理表的查询并不支持outer join、order by等操作。在流处理Table中只支持filters、union,不支持aggregations以及joins。并且,这个转化处理过程没有查询优化。整体来说0.9版本的flink Table API还不是十分好用。

图片 18

在后续的版本中,1.1.0引入了 SQL,因此在1.1.0 版本以后,flink 提供了两个语义的关系型API:语言内嵌的 Table API(用于 Java 和 Scala)以及标准 SQL。这两种 API 被设计用于在流和批的任务中处理数据在API层的统一,这意味着无论输入是批处理数据还是流数据,查询产生完全相同的结果。

在1.20版本之后逐渐增加SQL的功能,并对Table API做了大量的enhancement了。在1.2.0 版本中,flink的关系API在数据流中,支持关系操作包括投影、过滤和窗口聚合。

在1.30版本中开始支持各种流上SQL操作,例如SELECT、FROM、WHERE、UNION、aggregation和UDF能力。在2017年3月2日进行的flink meetup与2017年5月24日Strata会议,flink都有相应的topic讨论,未来在flink SQL方面会支持更细粒度的join操作和对dynamic table的支持。

三、flink关系型API执行原理

flink使用基于Apache Calcite这个SQL解析器做SQL语义解析。利用Calcite的查询优化框架与SQL解释器来进行SQL的解析、查询优化、逻辑树生成,得到Calcite的RelRoot类的一颗逻辑执行计划树,并最终生成flink的Table。Table里的执行计划会转化成DataSet或DataStream的计算,经历物理执行计划优化等步骤。但是,Table API和 SQL最终还是基于flink的已有的DataStream API和DataSet API,任何对于DataStream API和DataSet API的性能调优提升都能够自动地提升Table API或者SQL查询的效率。这两种API的查询都会用包含注册过的Table的catalog进行验证,然后转换成统一Calcite的logical plan。再利用 Calcite的优化器优化转换规则和logical plan。根据数据源的性质(流和批)使用不同的规则进行优化。最终优化后的plan转传成常规的flink DataSet或 DataStream程序。结构如下图: 

图片 19

3.1 Translation to Logical Plan

每次调用Table&SQL API,就会生成Flink 逻辑计划的节点。比如对groupBy和select的调用会生成节点Project、Aggregate、Project,而filter的调用会生成节点Filter。这些节点的逻辑关系,就会组成下图的一个Flink 自身数据结构表达的一颗逻辑树; 根据这个已经生成的Flink的 logical Plan,将它转换成calcite的logical Plan,这样我们才能用到calcite强大的优化规则。Flink由上往下依次调用各个节点的construct方法,将Flink节点转换成calcite的RelNode节点。

图片 21

3.2 Translation to DataStream Plan

优化逻辑计划并转换成Flink的物理计划,Flink的这部分实现统一封装在optimize方法里头。这部分涉及到多个阶段,每个阶段都是用Rule对逻辑计划进行优化和改进。声明定义于派生RelOptRule的一个类,然后再构造函数中要求传入RelOptRuleOperand对象,该对象需要传入这个Rule将要匹配的节点类型。如果这个自定义的Rule只用于LogicalTableScan节点,那么这个operand对象应该是operand(LogicalTableScan.class, any())。通过以上代码对逻辑计划进行了优化和转换,最后会将逻辑计划的每个节点转换成Flink Node,既可物理计划。

图片 22

 

3.3 Translation to Flink Program

图片 23

四、flink关系型API目前适用场景

4.1 目前支持范围

Batch SQL & Table API 支持:

  • Selection, Projection, Sort, Inner & Outer Joins, Set operations
  • Windows for Slide, Tumble, Session

Streaming Table API 支持:

  • Selection, Projection, Union
  • Windows for Slide, Tumble, Session

Streaming SQL:

  • Selection, Projection, Union, Tumble

4.2 目前使用场景

图片 24

五、 Table & SQL API介绍

Table API一般与DataSet或者DataStream紧密关联,可以通过一个DataSet或DataStream创建出一个Table,再用类似于filter, join, 或者 select关系型转化操作来转化为一个新的Table对象。最后将一个Table对象转回一个DataSet或DataStream。从内部实现上来说,所有应用于Table的转化操作都变成一棵逻辑表操作树,在Table对象被转化回DataSet或者DataStream之后,转化器会将逻辑表操作树转化为对等的DataSet或者DataStream操作符。

5.1 Table & SQL API的简单介绍

① Create a TableEnvironment

TableEnvironment对象是Table API和SQL集成的一个核心,支持以下场景:

  • 注册一个Table
  • 注册一个外部的catalog
  • 执行SQL查询
  • 注册一个用户自定义的function
  • 将DataStream或DataSet转成Table

一个查询中只能绑定一个指定的TableEnvironment,TableEnvironment可以通过来配置TableConfig来配置,通过TableConfig可以自定义查询优化以及translation的进程。

TableEnvironment执行过程如下:

  1. TableEnvironment.sql()为调用入口
  2. flink实现了个FlinkPlannerImpl,执行parse(sql),validate(sqlNode),rel(sqlNode)操作
  3. 生成Table

其中,LogicalRelNode是flink执行计算树里的叶子节点。

源码如下图:

图片 1

图片 2

② Register a Table

  1. 将一个Table注册给TableEnvironment图片 3
  2. 将一个TableSource注册给TableEnvironment,这里的TableSource指的是将数据存储系统的作为Table,例如MySQL, hbase, CSV, Kakfa, RabbitMQ等等
  3. 将一个外部的Catalog注册给TableEnvironment,访问外部系统的数据或文件
  4. 将DataStream或DataSet注册为Table图片 4

③ Query a Table

  • Table API
    Table API是一个Scala和Java的集成查询序言。与SQL不同的是,Table API的查询不是一个指定的sql字符串,而是调用指定的API方法。Table API中的每一个方法输入都是一个Table,输出也是一个新的Table。

通过table API来提交任务的话,也会经过calcite优化等阶段,基本流程和直接运行SQL类似:

  1. table API parser: flink会把table API表达的计算逻辑也表示成逻辑树,用treeNode表示;
  2. 在这棵树上的每个节点的计算逻辑用Expression来表示。
  3. Validate: 会结合catalog将树的每个节点的Unresolved Expression进行绑定,生成Resolved Expression;
  4. 生成Logical Plan: 依次遍历数的每个节点,调用construct方法将原先用treeNode表达的节点转成成用calcite 内部的数据结构relNode 来表达。即生成了LogicalPlan, 用relNode表示;
  5. 生成 optimized Logical Plan: 先基于calcite rules 去优化logical Plan,
  6. 再基于flink定制的一些优化rules去优化logical Plan;
  7. 生成Flink Physical Plan: 这里也是基于flink里头的rules将,将optimized LogicalPlan转成成Flink的物理执行计划;
  8. 将物理执行计划转成Flink Execution Plan: 就是调用相应的tanslateToPlan方法转换。图片 5
  • SQL

Flink SQL是基于Apache Calcite的实现的,Calcite实现了SQL标准解析。SQL查询是一个完整的sql字符串来查询。一条stream sql从提交到calcite解析、优化最后到flink引擎执行,一般分为以下几个阶段:

  1. Sql Parser: 将sql语句解析成一个逻辑树,在calcite中用SqlNode表示逻辑树;
  2. Sql Validator: 结合catalog去验证sql语法;
  3. 生成Logical Plan: 将sqlNode表示的逻辑树转换成Logical Plan, 用relNode表示;
  4. 生成 optimized Logical Plan: 先基于calcite rules 去优化logical Plan;
  5. 再基于flink定制的一些优化rules去优化logical Plan;
  6. 生成Flink Physical Plan: 这里也是基于flink里头的rules将,将optimized Logical Plan转成成Flink的物理执行计划;
  7. 将物理执行计划转成Flink Execution Plan: 就是调用相应的tanslateToPlan方法转换。

图片 6

③ Table&SQL API混合使用

Table API和SQL查询可以很容易的混合使用,因为它们的返回结果都是Table对象。一个基于Table API的查询可以基于一个SQL查询的结果。同样地,一个SQL查询可以被定义一个Table API注册TableEnvironment作为Table的查询结果。

④ 输出Table

为了将Table进行输出,我们可以使用TableSink。TableSink是一个通用的接口,支持各种各样的文件格式(e.g. CSV, Apache Parquet, Apache Avro),也支持各种各样的外部系统(e.g., JDBC, Apache HBase, Apache Cassandra, Elasticsearch),同样支持各种各样的MQ(e.g., Apache Kafka, RabbitMQ)。

批数据的导出Table使用BatchTableSink,流数据的导出Table使用的是AppendStreamTableSink、RetractStreamTableSink和 UpsertStreamTableSink.

图片 7

⑤ 解析Query并执行

Table&SQL API查询被解析成DataStreamDataSet程序。一次查询就是一个 logical query plan,解析这个logical query plan分为两步:

  1. 优化logical plan,
  2. 将logical plan转为DataStream或DataSet

一旦Table & SQL API解析完毕, Table & SQL API的查询就会被当做普通DataStream或DataSet被执行。

5.2 Table转为DataStream或DataSet

图片 8

5.3 Convert a Table into a DataSet

图片 9

5.4 Table & SQL API与Window

Window种类

  • tumbling window (GROUP BY)
  • sliding window (window functions)

① Tumbling Window

WX20171124-115353

② Sliding Window

WX20171124-115353

5.5 Table&SQL API与Stream Join

Joining streams to streams:

WX20171124-115758

六、 Table&SQL API举例

首先需要引入flink关系型api和scala的相关jar包:

WX20171124-115924

6.1 批数据的相关代码

WX20171124-120116WX20171124-120425

6.2 流数据的相关代码

WX20171124-120640 WX20171124-120705 WX20171124-120729

七、动态表

flink 1.3以后,在flink SQL上支持动态表查询,也就是说动态表是持续更新,并且能够像常规的静态表一样查询的表。但是,与批处理表查询终止后返回一个静态表作为结果不同的是,动态表中的查询会持续运行,并根据输入表的修改产生一个持续更新的表。因此,结果表也是动态的。在动态表中运行查询并产生一个新的动态表,这是因为流和动态表是可以相互转换的。

流被转换为动态表,动态表使用一个持续查询进行查询,产生一个新的动态表。最后,结果表被转换成流。上面所说的只是逻辑模型,并不意味着实际执行的查询查询也是这个步骤。实际上,持续查询在内部被转换成传统的 DataStream 程序去执行。

动态表查询步骤如下:

  1. 在流中定义动态表
  2. 查询动态表
  3. 生成动态表

7.1 在流中定义动态表

动态表上的 SQL 查询的第一步是在流中定义一个动态表。这意味着我们必须指定流中的记录如何修改现有的动态表。流携带的记录必须具有映射到表的关系模式。在流中定义动态表有两种模式:append模式和update模式。

在append模式中,流中的每条记录是对动态表的插入修改。因此,流中的所有记录都append到动态表中,使得它的大小不断增长并且无限大。下图说明了append模式。append模式如下图。

图片 10

在update模式中,流中的记录可以作为动态表的插入、更新或者删除修改(append模式实际上是一种特殊的update模式)。当在流中通过update模式定义一个动态表时,我们可以在表中指定一个唯一的键属性。在这种情况下,更新和删除操作会带着键属性一起执行。更新模式如下图所示。

图片 11

 

7.2 查询动态表

一旦我们定义了动态表,我们可以在上面执行查询。由于动态表随着时间进行改变,我们必须定义查询动态表的意义。假定我们有一个特定时间的动态表的snapshot,这个snapshot可以作为一个标准的静态批处理表。我们将动态表 A 在点 t 的snapshot表示为 A[t],可以使用 SQL 查询来查询snapshot,该查询产生了一个标准的静态表作为结果,我们把在时间 t 对动态表 A 做的查询 q 的结果表示为 q(A[t])。如果我们反复在动态表的snapshot上计算查询结果,以获取进度时间点,我们将获得许多静态结果表,它们随着时间的推移而改变,并且有效的构成了一个动态表。我们在动态表的查询中定义如下语义。

查询 q 在动态表 A 上产生了一个动态表 R,它在每个时间点 t 等价于在 A[t] 上执行 q 的结果,即 R[t]=q(A[t])。该定义意味着在批处理表和流表上执行相同的查询 q 会产生相同的结果。

在下面的例子中,我们给出了两个例子来说明动态表查询的语义。在下图中,我们看到左侧的动态输入表 A,定义成append模式。在时间 t=8 时,A 由 6 行(标记成蓝色)组成。在时间 t=9 和 t=12 时,有一行追加到 A(分别用绿色和橙色标记)。我们在表 A 上运行一个如图中间所示的简单查询,这个查询根据属性 k 分组,并统计每组的记录数。在右侧我们看到了 t=8(蓝色),t=9(绿色)和 t=12(橙色)时查询 q 的结果。在每个时间点 t,结果表等价于在时间 t 时再动态表 A 上执行批查询。

图片 12

这个例子中的查询是一个简单的分组(但是没有窗口)聚合查询。因此,结果表的大小依赖于输入表的分组键的数量。此外,这个查询会持续更新之前产生的结果行,而不只是添加新行。

第二个例子展示了一个类似的查询,但是有一个很重要的差异。除了对属性 k 分组以外,查询还将记录每 5 秒钟分组为一个滚动窗口,这意味着它每 5 秒钟计算一次 k 的总数。 我们使用 Calcite 的分组窗口函数来指定这个查询。在图的左侧,我们看到输入表 A ,以及它在append模式下随着时间而改变。在右侧,我们看到结果表,以及它随着时间演变。

图片 13

与第一个例子的结果不同的是,这个结果表随着时间而增长,例如每 5 秒钟计算出新的结果行。虽然非窗口查询更新结果表的行,但是窗口聚合查询只追加新行到结果表中。

无论输入表什么时候更新,都不可能计算查询的完整结果。相反,查询编译成流应用,根据输入的变化持续更新它的结果。这意味着不是所有的有效 SQL 都支持,只有那些持续性的、递增的和高效计算的被支持。

7.3 生成动态表

查询动态表生成的动态表,其相当于查询结果。根据查询和它的输入表,结果表会通过插入、更新和删除持续更改,就像普通的mysql数据表一样。它可能是一个不断被更新的单行表,或是一个只插入不更新的表。

传统的mysql数据库在故障和复制的时候,通过日志重建表。比如 UNDO、REDO 和 UNDO/REDO 日志。UNDO 日志记录被修改元素之前的值来回滚不完整的事务,REDO 日志记录元素修改的新值来重做已完成事务丢失的改变,UNDO/REDO 日志同时记录了被修改元素的旧值和新值来撤销未完成的事务,并重做已完成事务丢失的改变。基于这些日志,动态表可以转换成两类更改日志流:REDO 流和 REDO+UNDO 流。

通过将表中的修改转换为流消息,动态表被转换为 redo+undo 流。插入修改生成一条新行的插入消息,删除修改生成一条旧行的删除消息,更新修改生成一条旧行的删除消息以及一条新行的插入消息。行为如下图所示。

图片 14

左侧显示了一个维护在append模式下的动态表,作为中间查询的输入。查询的结果转换为显示在底部的 redo+undo 流。输入表的第一条记录 (1,A) 作为结果表的一条新纪录,因此插入了一条消息 +(A,1) 到流中。第二条输入记录 k=‘A’(4,A) 导致了结果表中 (A,1) 记录的更新,从而产生了一条删除消息 -(A,1) 和一条插入消息 +(A,2)。所有的下游操作或数据汇总都需要能够正确处理这两种类型的消息。

在两种情况下,动态表会转换成 redo 流:要么它只是一个append表(即只有插入修改),要么它有一个唯一的键属性。动态表上的每一个插入修改会产生一条新行的插入消息到 redo 流。由于 redo 流的限制,只有带有唯一键的表能够进行更新和删除修改。如果一个键从动态表中删除,要么是因为行被删除,要么是因为行的键属性值被修改了,所以一条带有被移除键的删除消息发送到 redo 流。更新修改生成带有更新的更新消息,比如新行。由于删除和更新修改根据唯一键来定义,下游操作需要能够根据键来访问之前的值。下图描述如何将上述相同查询的结果表转换为 redo 流。

图片 15

插入到动态表的 (1,A) 产生了 +(A,1) 插入消息。产生更新的 (4,A) 生成了 *(A,2) 的更新消息。

Redo 流的通常做法是将查询结果写到仅append的存储系统,比如滚动文件或者 Kafka topic ,或者是基于key访问的数据存储,比如 Cassandra、关系型 MySQL。

切换到动态表发生的改变

在 1.2 版本中,flink 关系 API 的所有流操作,例如过滤和分组窗口聚合,只会产生新行,并且不能更新先前发布的结果。 相比之下,动态表能够处理更新和删除修改。

1.2 版本中的处理模型是动态表模型的一个子集, 通过附加模式将流转换为动态表,即一个无限增长的表。 由于所有操作仅接受插入更改并在其结果表上生成插入更改(即,产生新行),因此所有在动态append表上已经支持的查询,将使用重做模型转换回 DataStreams,仅用于append表。

最后,值得注意的是在开发代码中,我们无论是使用Table API还是SQL,优化和转换程序并不知道查询是通过 Table API还是 SQL来定义的。由于 Table API 和 SQL 在语义方面等同,只是在样式上有些区别而已。

八、总结

本篇文章整理了flink关系型API的相关知识,整体上来说,flink关系型API还是很好用的,其原理与实现结构清晰,存在很多可借鉴的地方。

 

Reference:

  1. http://flink.apache.org/
  2. Flink社区
  3. 2017 Strata Meeting
  4. 2017 Flink Forward Meeting
  • 十一 24 / 2017
  • 0
Ideas

锐眼发现 | Andrej Karpathy发文谈神经网络后,引发的对硬件、软件和学件的思考

作者:Uri Yerushalmi

编译:雷锋网

本文转自雷锋网,如需转载请至雷锋网官网申请授权。

雷锋网按:近日,Tesla AI总监Andrej Karpathy发表了一篇关于“Software 2.0”的文章,该文章引发了对未来神经网络的编程方式的更深入探讨,本文就是其中之一。在Software 2.0的基础上,本文作者Uri Yerushalmi还借用了南京大学周志华教授在2016年提出的“学件”(Learnware)的概念,并更详细地讲述了他眼中的“学件”和软件的区别。他山之石,可以攻玉,本着传递更多信息的想法,雷锋网特此编译该文章,供读者讨论。

本文作者Uri Yerushalmi为AI社区Dopamind的创始人, 2008年于以色列Bar-llan University获得计算机和神经科学博士学位。以下是雷锋网编译的文章全文:

本周,我阅读了Andrej Karpathy的“Software 2.0”,他分析了新软件“Software 2.0”与旧软件“Software 1.0”之间的区别。 我和Karpathy有一个非常类似的结论,我们来看看这种新型软件的兴起如何影响软件行业和市场。

软件vs学件

以下是旧软件和Karpathy的帖子中描述的新的适应性软件之间的一些主要区别,我将其称为“学件”(雷锋网注:“学件”(Learnware)的概念最早由南京大学教授周志华2016年提出,是一种包含模型和模型描述模型规约的机器学习应用模型,这些模型可以以共享或定价的方式放在某一个地方,当有新的用户想做自己的应用的时候,可以先去市场上看看有没有可以使用的模型,从而可以部分重用别人的结果而不需要重新开始)。 

软件与学件的差异

“学件”将给软件市场带来什么变化?

您可能已经注意到软件市场开始发生变化,尽管这些变化并不明显。

协作处理和服务导向

在软件中,我们习惯通过库和API(应用程序编程接口)进行相互协作。每个接口的任务都需要定义好,用户通常很清楚在调用接口时做了什么、以及如何做。

举个例子,想象两个没有菜单、按顾客指示烹饪的餐馆:

第一家餐厅叫“旧软件类型”:客人需要准确地给予指示他们想要的餐点该如何烹饪。他们必须出示详细的食谱,以确保他们获得正确的食物。

第二家餐厅叫“学件”,客人会提出更多的抽象要求,比如“我很伤心,给我一些能让我开心的东西”,厨师能够当场创造出最佳的餐点。

很显然,第一家餐厅的一些顾客宁愿避免编写食谱的麻烦而改为在家做饭,对不对?但在第二家餐厅,顾客就算想自己编食谱,臣妾也做不到啊啊啊。

这样的底线通常会导致API用户采取“我最了解我所需要的,所以我会自己编程”的方法(这通常是错误的事情,但这又是另一个故事了)。在学件中,“我会自己做”的方法更加不合理,因为通过简单地定义用户需要什么(例如“在图片中找到一只猫”),开发人员仍然没有接近最终的解决方案。

由于这种巨大差异的客观存在,我认为在不久的将来会有越来越多的协作处理工具和平台出现。

主要影响因素见上表中的F、G、H项

“学件”的应用领域

我们可以将大多数使用软件2.0的方法的商业应用归入“学件”的范畴。这些新应用包括基于视觉和语音识别,视觉生成,语音合成,机器人技术,游戏,翻译,决策等。

主要影响因素见上表中的A项

人才市场

显然,“学件”将大大改变就业的市场格局。无论企业如何设计将知识或数据“喂”给“学件”的工作岗位(如程序员,数据科学家,定量分析),“学件”的培训会越来越普遍和越来越简单,使用这一新软件所需的技能将会发生进化。我预计未来对于开发人员角色的需求将与旧软件程序员完全不同。

主要影响因素见上表中的B、C、D项

“喂知识/数据”的技巧

作为一名软件开发人员,您可以使用C ++、Java或Python等语言将知识编程到软件中。目前,编写和训练“学件”使用相同的技术,然而,常规的软件编程语言视为了能够最好地描述,管理和维护各种指令集而设计的,但在“学件”中,编程知识的关键在于准确地描述最佳的数据流图。因此,我不确定使用旧的编程语言是开发“学件”的最佳方法。

主要影响因素见上表中的C、D项

用于构建学习软件的软件库

近几年来,我们已经看到了这些新的软件库:Tensorflow,Pytorch,Keras,Theano,MXNet …

主要影响因素见上表中的B、C、D项

专用硬件

在具有大型指令集的旧式软件中,引入新硬件需要对编译和代码级别进行调整。相反,在“学件”中,新硬件的使用更加透明。 对“学件”适用的专用硬件的竞赛已经打响,目前NVidia处于领先地位。

主要影响因素见上表中的B、E项

查看黑盒的工具

为了更好地进行开发,我们需要用于查看“学件”的黑盒的工具。如果我们了解每个“学件”如何做出决策,我们可能会更好地训练它。此外,从社会的角度看也更容易获得认可(例如,欧盟成员国预计通过新的立法,规定如果AI的决定出现不公平或随意性,AI的决定可能会被推翻,而在“通用数据保护条例”(GDPR)的早期草案也从法律上规定了所谓的“解释权”)。

主要影响因素见上表中的H项

Dopamine.ai正在对这方面的协作处理解决方案进行努力。如果您有兴趣阅读更多内容或接收我们项目的更新,请点击此处进行订阅

  • 十一 23 / 2017
  • 0
Ideas

锐眼洞察 | iOS的未来是AI(翻译)

作者:Svilen Kostadinov

原文:Why Artificial Intelligence Is the Future of iPhone’s iOS

译者:TalkingData首席架构师 黄洋成(YC)

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

 

自十年前首次亮相以来,iPhone已经发生了翻天覆地的变化:运行速度有了指数级的提升,屏幕和相机在各种指标上都有了很大的提升(初代iPhone甚至无法录制视频),而外形也已经完善, 还不断增加新的传感器。 虽然苹果的工业设计在制造业不断开创新领域,但其软件多年来一直处于低谷。

智能手机,傻操作系统

当然,功能和美学都有了明显的改善,但除了(被史蒂夫·乔布斯强烈反对的)App Store之外,iOS 1和iOS 11之间的体验差异并不是很大:

无论是白天还是夜晚,在家或在国外使用iPhone,你每天收到哪些朋友的信息,你在午休时玩的是什么游戏,或者你家中有什么智能设备 – 只要你解锁手机,就会被置于相同的静态多屏应用图标网格中。

更过分的是,应用程序的管理和分组的负担也要留给用户,让他们依靠肌肉记忆来找到App的位置。

 

“数字化体验应该动态适应用户需求”的想法其实并不新鲜:

  1. Netflix推荐你可能感兴趣的电影、你会继续观看的节目、最新播出的节目、节目的流派/分类等
  2. 亚马逊向你推荐你最近搜索的商品、搭配购买的商品、打折促销的商品等
  3. Spotify根据你的口味组织个性化的播放列表

对于苹果来说,他们也已经开始在往这个方向走,比如Siri的联系人和应用程序建议,在锁屏上基于地理位置的应用程序建议(不知道它是否仍然存在于iOS 11):

但哪怕只是在正确的地点和时间推荐正确的应用程序的能力现在似乎都还没有。 根据帕累托原则,80%的时间里我们只使用应用程序20%的功能。

Facebook就是一个很好的例子:它包含了从信息流和视频,到故事、市场、群组、趋势新闻、天气、游戏和城市指南等所有内容。 但是,所有这些功能中,我敢打赌,超过80%的时间用户只是使用信息流。

所以,相对于推荐Facebook这个App,为什么不直接推荐信息流?你可能在想,单个功能如何模块化? 其实苹果也有一个潜在的解决方案——部件化。

   

 

不幸的是,组件化屏幕与主屏幕出现相同的问题:它只是一个静态库存列表。

具有讽刺意味是,新的iPhone有一个专用的A.I.处理器,但iOS的使用体验并没有从你的使用模式或偏好中学到什么。 但如果iPhone做到了呢?

如果你的手机了解你在何时何地、出于何种原因、使用何种功能,会怎样?

在2015年初,我在几个常见的场景中探索了一个以部件化为中心的iOS概念:

机器学习有可能使iPhone真正智能化、能够学习我们使用手机的上下文和环境。 更进一步,通过将地理位置、邻近的朋友、环境光线、噪音水平和Apple Watch采集的生命体征等因素关联起来,将带来全新的体验和服务。

下一代移动操作系统

Google似乎验证了这种动态交互的范式。在2017年,Google披露了他们实验性移动操作系统FUCHSIA的一瞥; 虽然迄今为止我们仍对它知之甚少,但它主要的前提似乎是围绕类似于部件化的模块,围绕用户的需求进行智能化安排:https://youtu.be/dziInGrVHac

无论部件化是否是正确的解决方案,有一点是明确的:随着世界动态性不断增强,我们需要更流畅、更无缝的手机和智能手表体验。 是时候重新思考我们与设备互动的基本方式了,因为静态应用范例的可用性已经在不断增长的苹果生态系统中达到了极限。

页面:12345
随时欢迎您 联系我们