一张图读完全球顶级互联网大佬们的一生:扎克伯格、乔布斯、比尔盖茨、马斯克…

本文转载自公众号董老师在硅谷(ID:donglaoshi-123)

感慨大洋彼岸互联网公司发展这么多年,诞生了Tesla,超级高铁,无人驾驶汽车等,中国互联网公司做大了之后推出的却是各种圈地圈钱的玩意。
虽然这话有些以偏概全,虽然美国也只出了一个马斯克,但是我们能不能回想一下自己的初心和曾经的梦想,曾几何时,我们想要的是星辰大海,诗歌和远方,结果做出来的却是无论搜索什么关键词还是看什么视频出来的都是low 逼的广告!

不吐槽了,这种画图纪录人生的方式有趣也容易传播,笔者就多收集几个,包括乔布斯,比尔盖茨,马斯克,贝索斯,扎克伯格,马文形成这一个系列,由笔者的朋友们杨志芳,余杰丰,沈依灵@厚势翻译,之后还会做一张图读懂创业公司, 一张图读懂创业心得等。

一张图读懂乔布斯

一张图读懂比尔盖茨

一张图看懂埃隆马斯克

一张图读懂杰夫贝索斯

一张图读懂扎克伯格

一张图读懂马文明斯基

纯粹数学的雪崩效应:庞加莱猜想何以造福了精准医疗?

2016-04-12 顾险峰 赛先生


图1 庞加莱猜想电脑三维模型

顾险峰 (纽约州立大学石溪分校终身教授,清华大学丘成桐数学科学中心访问教授,计算共形几何创始人)

最近英国上议院议员马特瑞德利(Matt Ridley)在《华尔街日报》上撰文《基础科学的迷思》(The Myth of Basic Science)。他认为“科学驱动创新,创新驱动商业”这一说法基本上是错误的,反而是商业驱动了创新,创新驱动了科学,正如科学家被实际需求所驱动,而不是科学家驱动实际需求一样。总之,他认为“科学突破是技术进步的结果,而不是原因”。

瑞德利先生的言论反映了许多人对基础科学的严重误解,会给年轻学子们带来思想混乱和价值观念上的困扰,有必要加以澄清。诚然,商业需求和工程实践会为基础科学提供研究的素材,比如历史上最优传输理论(OptimalMass Transportation Theory)和蒙日-安培方程(Monge-Ampere)起源于土石方的运输,最后猜想被康塔洛维奇解决,康塔洛维奇为此获得了诺贝尔经济学奖。数年前,为了解决医学图像的压缩问题,陶哲轩提出了压缩感知(Compressive Sensing)理论。但是,从根本上而言,基础科学的源动力来自于科学家对于自然真理的好奇和对美学价值的追求。基础科学上的突破,因为揭示了自然界的客观真理,往往会引发应用科学的革命。纯粹数学的研究因为其晦涩抽象,实用价值并不明显直观,普罗大众一直倾向于认为其“无用”。但实际上,纯粹数学对应用科学的指导作用是无可替代的。

计算机科学和技术发展的一个侧面就在于将人类数千年积累的知识转换成算法,使得没有经历过职业训练的人也可以直接使用最为艰深的数学理论。在拓扑和几何领域,往往很多具有数百年历史的定理仅仅在最近才被转换成算法。但是,依随计算机技术的迅猛发展,从定理到算法的过程日益加速。很多新近发展的数学理论被迅速转换成强有力的算法,并在工程和医疗领域被广泛应用。

历史一再表明,以满足人类好奇心为出发点的基础理论研究,其本质突破往往不能引起当时人类社会的重视,宛若冰川旷谷中一声微弱的呐喊,转瞬间随风消逝,但是这一声往往会引发令天空变色,大地颤抖的雪崩。庞加莱猜想的证明就是一个鲜明的实例,虽然雪崩效应还没有被大众所察觉,但是雪崩已经不可逆转地开始了!

1  庞加莱猜想

法国数学家庞加莱(Jules Henri Poincaré)是现代拓扑学的奠基人。拓扑学研究几何体,例如流形,在连续形变下的不变性质。我们可以想象曲面由橡皮膜制成,我们对橡皮膜拉伸压缩,扭转蜷曲,但是不会撕破或粘联,那么这些形变都是连续形变,或被称之为拓扑形变,在这些形变下保持不变的量就是拓扑不变量。如果一张橡皮膜曲面经由拓扑形变得到另外一张橡皮膜曲面,则这两张曲面具有相同的拓扑不变量,它们彼此拓扑等价。如图2 所示,假设兔子曲面由橡皮膜做成,我们象吹气球一样将其膨胀成标准单位球面,因此兔子曲面和单位球面拓扑等价。

图2. 兔子曲面可以连续形变成单位球面,因此兔子曲面和球面拓扑等价。

兔子曲面无法连续形变成轮胎的形状,或者图3中的任何曲面。直观上,图5中小猫曲面有一个“洞”,或称“环柄”;图3中的曲面则有两个环柄。拓扑上,环柄被称为亏格。亏格是最为重要的拓扑不变量。所有可定向封闭曲面依照亏格被完全分类。


图3. 亏格为2的封闭曲面。亏格是曲面最重要的拓扑不变量。

庞加莱思考了如下深刻的问题:封闭曲面上的“洞”是曲面自身的内蕴性质,还是曲面及其嵌入的背景空间之间的相对关系?这个问题本身就是费解深奥的,我们力图给出直观浅近的解释。我们人类能够看到环柄形成的“洞”,是因为曲面是嵌入在三维欧式空间中的,因此这些“洞”反应了曲面在背景空间的嵌入方式,我们有理由猜测亏格反映了曲面和背景空间之间的关系。

图4. 曲面上生活的蚂蚁如何检测曲面的拓扑?

但是另一方面,假设有一只蚂蚁自幼生活在一张曲面上,从未跳离过曲面,因此从未看到过曲面的整体情形。蚂蚁只有二维概念,没有三维概念。假设这只蚂蚁具有高度发达的智力,那么这只蚂蚁能否判断它所生活的曲面是个亏格为0的拓扑球面,还是高亏格曲面?

图5. 亏格为1的曲面上,无法缩成点的闭圈。

庞加莱最终悟到一个简单而又深刻的方法来判断曲面是否是亏格为0的拓扑球面:如果曲面上所有的封闭曲线都能在曲面上逐渐缩成一个点,那么曲面必为拓扑球面。比如,我们考虑图5中小猫的曲面,围绕脖子的一条封闭曲线,在曲面上无论怎样变形,都无法缩成一个点。换言之,只要曲面亏格非零,就存在不可收缩成点的闭圈。如果流形内所有的封闭圈都能缩成点,则流形被称为是单连通的。庞加莱将这一结果向高维推广,提出了著名的庞加莱猜想:假设M是一个封闭的单连通三维流形,则M和三维球面拓扑等价。

图6. 带边界的三流形,用三角剖分表示。

在现实世界中,无法看到封闭的三维流形:正如二维封闭曲面无法在二维平面上实现,三维封闭流形无法在三维欧式空间中实现。图6显示了带有边界的三维流形,例如实心的兔子和实心的球体拓扑等价。这些三维流形用三角剖分来表示,就是用许多四面体粘合而成。如图所示,体的三角剖分诱导了其二维边界曲面的三角剖分。实心球实际上是三维拓扑圆盘,我们可以将两个三维拓扑圆盘沿着边界粘合,就得到三维球面,恰如我们可以将两个二维拓扑圆盘沿着边界粘合而得到二维球面一样。当然,这已经超出人们的日常生活经验。

2  曲面单值化定理

近百年来,庞加莱猜想一直是拓扑学最为基本的问题,无数拓扑学家和几何学家为证明庞加莱猜想而鞠躬尽瘁死而后已。相比那些最后成功的幸运儿,众多默默无闻,潦倒终生的失败者更加令人肃然起敬。老顾曾经访问过吉林大学数学学院,听闻了有关何伯和教授的生平事迹。何教授终生痴迷于庞加莱猜想的证明,苦心孤诣,废寝忘食,愈挫愈奋,九死不悔,直至生命终结,对于庞加莱猜想依然念念不忘。何教授绝对不是为了任何实用价值或者商业利益而奋斗终生的,而是为了对于自然界奥秘的好奇,对于美学价值的热切追求,这种纯粹和崇高,是人类进步的真正动力!


图7. 人脸曲面上连接两点的测地线。

作为拓扑学最为基本的问题,庞加莱猜想的本质突破却来自于几何。给定一个拓扑流形,如给定图6中四面体网格的组合结构,我们可以为每条边指定一个长度,使得每个四面体都是一个欧式的四面体,这样我们就给出了一个黎曼度量。所谓黎曼度量,就是定义在流形上的一种数据结构,使得我们可以确定任意两点间的最短测地线。图7显示了人脸曲面上的两条测地线。黎曼度量自然诱导了流形的曲率。曲率是表征空间弯曲的一种精确描述。给定曲面上三个点,我们用测地线连接它们成一个测地三角形。如果曲面为欧几里德平面,那么测地三角形内角和为180度。球面测地三角形的内角和大于180度,马鞍面的测地三角形的内角和小于180度。测地三角形内角和与180度的差别就是三角形的总曲率。那么,给定一个拓扑流形,我们能否选择一个最为简单的黎曼度量,使得曲率为常数呢?

图8. 曲面单值化定理,所有封闭曲面都可以保角地形变成常曲率曲面。

这一问题的答案是肯定的,这就是曲面微分几何中最为根本的单值化定理。单值化定理是说大千世界,各种几何形状千变万化,但是无论它们如何变化,都是万变不离其宗:所有的曲面都可以共形地变换成三种标准曲面中的一种,单位球面,欧几里德平面和双曲平面。标准空间对应着常数值曲率,+1,0和-1,如图8所示。所谓共形变换,就是保持局部形状的变换,局部上看就是相似变换。相似变换保持角度不变,因此共形变换也被称为是保角变换。图9显示了从曲面到平面的一个共形变换。单值化定理断言了所有封闭曲面可以配有三种几何中的一种:球面几何,欧氏几何和双曲几何。曲面微分几何中几乎所有的重要定理都绕不过单值化定理。


图9. 共形变换保持局部形状。

3  瑟斯顿几何化猜想

为了证明庞加莱猜想,菲尔兹奖得主瑟斯顿推广了单值化定理到三维流形情形。任何三维流形,都可以经历一套标准手续分解成一系列的最为简单的三维流形,即所谓的素流形。素流形本身无法被进一步分解,同时这种分解本质上是唯一的。瑟斯顿提出了石破天惊的几何化猜想:所有的素三维流形可以配有标准黎曼度量,从而具有8种几何中的一种。特别地,单连通的三维流形可被配有正的常值曲率度量,配有正的常值曲率的3维流形必为3维球面。因此庞加莱猜想是瑟斯顿几何化猜想的一个特例。

图10. 瑟斯顿的苹果,几何化猜想。

图10显示了瑟斯顿几何化的一个实例。假设我们有一个苹果,三只蛀虫蛀蚀了三条管道,如左帧所示,这样我们得到了一个带边界的三维流形。根据几何化纲领,这个被蛀蚀的苹果内部容许一个双曲黎曼度量,使得其边界曲面的曲率处处为-1。我们将配有双曲度量的苹果周期性地嵌在三维双曲空间之中,得到右帧所示图形。

4  哈密尔顿的里奇曲率

本质的突破来自于哈密尔顿的里奇曲率流(Hamilton’s Ricci Flow)。哈密尔顿的想法来自经典的热力学扩散现象。假设我们有一只铁皮兔子,初始时刻兔子表面的温度分布并不均匀,依随时间流逝,温度渐趋一致,最后在热平衡状态,温度为常数。哈密尔顿设想:如果黎曼度量依随时间变化,度量的变化率和曲率成正比,那么曲率就像温度一样扩散,逐渐变得均匀,直至变成常数。如图11所示,初始的哑铃曲面经由曲率流,曲率变得越来越均匀,最后变成常数,曲面变成了球面。

图11. 曲率流使得曲率越来越均匀,直至变成常数,曲面变成球面。

在二维曲面情形,哈密尔顿和Ben Chow证明了曲率流的确将任何一个黎曼度量形变成常值曲率度量,从而给出了曲面单值化定理的一个构造性证明。但是在三维流形情形,里奇曲率流遇到了巨大的挑战。在二维曲面情形,在曲率流过程中,在任意时刻,曲面上任意一点的曲率都是有限的;在三维流形情形,在有限时间内,流形的某一点处,曲率有可能趋向于无穷,这种情况被称为是曲率爆破(blowup),爆破点被称为是奇异点(singularity)。

如果发生曲率爆破,我们可以将流形沿着爆破点一切两半,然后将每一半接着实施曲率流。如果我们能够证明在曲率流的过程中,曲率爆破发生的次数有限,那么流形被分割成有限个子流形,每个子流形最终变成了三维球面。如果这样,原来流形由有限个球粘合而成,因而是三维球面,这样就证明了庞加莱猜想。由此可见,对于奇异点的精细分析成为问题的关键。哈密尔顿厘清了大多数种类奇异点的情况,佩雷尔曼解决了剩余的奇异点种类。同时,佩雷尔曼敏锐地洞察到哈密尔顿的里奇流是所谓熵能量的梯度流,从而将里奇流纳入了变分的框架。佩雷尔曼给出了证明的关键思想和主要梗概,证明的细节被众多数学家进一步补充完成。至此,瑟斯顿几何化猜想被完全证明,庞加莱猜想历经百年探索,终于被彻底解决。

5 庞加莱猜想带来的计算技术

庞加莱猜想本身异常抽象而枯燥:单连通的闭3-流形是三维球面,似乎没有任何实用价值。但是为了证明庞加莱猜想,人类发展了瑟斯顿几何化纲领,发明了哈密尔顿的里奇曲率流,深刻地理解了三维流形的拓扑和几何,将奇异点的形成过程纳入了数学的视野。这些基础数学上的进展,必将引起工程科学和实用技术领域的“雪崩”。比如,里奇曲率流技术实际上给出了一种强有力的方法,使得我们可以用曲率来构造黎曼度量

里奇曲率流属于非线性几何偏微分方程,里奇流的方法实际上是典型的几何分析方法,即用偏微分方程的技术来证明几何问题。几何分析由丘成桐先生创立,庞加莱猜想的证明是几何分析的又一巨大胜利。当年瑟斯顿提倡用相对传统的拓扑和几何方法,例如泰西米勒理论和双曲几何理论来证明,也有数学家主张用相对组合的方法来证明,最终还是几何分析的方法拔得头筹。

哈密尔顿的里奇流是定义在光滑流形上的,在计算机的表示中,所有的流形都被离散化。因此,我们需要建立一套离散里奇流理论来发展相应的计算方法。历经多年的努力,笔者和合作者们建立了离散曲面的里奇曲率流理论,证明了离散解的存在性和唯一性。因为几乎所有曲面微分几何的重要问题,都无法绕过单值化定理。我们相信离散曲率流的计算方法必将在工程实践中发挥越来越重要的作用 [1]


图12. 离散里奇流计算的带边曲面单值化。

图8和图12显示了离散里奇流算出的封闭曲面和带边界曲面的单值化。本质上,这两幅图统摄了现实生活中所有可能的曲面,它们都被共形地映到了三种标准曲面上,球面、欧氏平面和双曲平面。这意味着,如果我们发明了一种新的几何算法,适用于这三种标准曲面,那么这一算法也适用于所有曲面。因此,离散曲率流的技术极大地简化了几何算法设计。

6 精准医疗

庞加莱猜想所诱发的离散曲率流方法被广泛应用于精准医疗领域。人体的各种器官本质上都是二维曲面或三维流形,曲率流方法对于这些器官几何特征的分析和比较起到了不可替代的作用。


图13. 虚拟肠镜技术。

虚拟肠镜 

直肠癌是男子的第四号杀手,仅在心脑血管疾病之后。中年之后,每个人都会自然长出直肠息肉,息肉会逐年增长,如果息肉直径达到一定尺寸,由于摩擦息肉会发生溃疡,长期溃疡会导致癌变。但是直肠息肉的生长非常缓慢, 一般从息肉出现直到临界尺寸需要七八年,因此对息肉的监控对于预防直肠癌起着至关重要的作用。中年人应该每两年做一次肠镜检查。传统的肠镜检查方法需要对受检者全身麻醉,将光学内窥镜探入直肠。老年人肠壁比较薄弱,容易产生并发症。同时,肠壁上有很多皱褶,如果息肉隐藏在皱褶中,医生会无法看到而产生漏检。

近些年来,北美和日本采用了虚拟肠镜技术。受检者的直肠图像由断层扫描技术来获取,直肠曲面可以从图像重建出来,如图14所示。我们需要将直肠展开摊平,从而使所有皱褶暴露出来,以便于寻找息肉和测量它们的尺寸。同时,如图13所示,在检查中同一受检者的直肠被扫描两次,每次扫描都是采用不同的姿态。直肠曲面柔软而富有弹性,不同的扫描得到的曲面之间相差很大的弹性形变。我们需要在两张曲面间建立光滑双射。在两张三维曲面间建立映射相对困难,当我们将曲面摊开展平成平面长方形后,在平面区域间计算映射会简单很多。将直肠曲面摊开展平等价于为曲面赋上一个曲率处处为0的黎曼度量,我们可以直接应用里奇曲率流的算法加以实现,如图14所示。

图14. 用里奇曲率流将直肠曲面摊开展平。

目前,虚拟肠镜技术在北美和日本被广泛采用,(但在中国还没有普及),主要是因为这种方法可以提高安全性,降低漏检率,降低人力成本。虚拟肠镜技术的普及极大地提高了早期直肠癌的发现几率,降低了直肠癌的死亡率,为人类的健康事业做出了巨大贡献。


图15. 虚拟膀胱镜。

同样的方法可以用于膀胱等其他器官,如图15所示。膀胱癌的最主要特征是膀胱壁变厚,同时内壁不再光滑,出现菜花状的几何纹理。这些症状可以用虚拟膀胱镜的方法定量得到。传统膀胱镜的方法病人需要忍受很大的痛苦,虚拟膀胱镜的方法极大地减轻了病患的疼痛,因而具有很大的优势。


图16. 用里奇曲率流将大脑皮层曲面共形映到单位球面,以便于对照比较。

脑神经疾病的预防诊断

脑退化症(Alzheimer’s disease,俗称老年痴呆症),癫痫,儿童自闭症等脑神经疾病严重地威胁着人类的健康安全。对于这些疾病的预防和诊断具有重要的现实意义。通过核磁共振成像技术,我们能够获取人类的大脑皮层曲面,如图16所示。大脑皮层曲面的几何非常复杂,有大量的皱褶沟回结构,并且这些几何结构因人而异,依随年龄变化而变化。例如老年痴呆症往往伴随大脑皮层一部分区域的萎缩。为了监控病情的发展,我们需要每隔几个月就扫描一下病人的大脑,然后将不同时期得到的大脑皮层曲面进行精确地对比。在三维空间中直接对比难度很高,我们非常容易将不同的沟回错误地对齐,算法落入在局部最优陷阱中。如图16所示,我们将大脑皮层曲面共形地映到球面上,然后在球面之间建立光滑映射,这种方法更加简单而精确。将大脑皮层映到球面等价于为大脑皮层曲面赋以曲率为+1的黎曼度量,我们可以用里奇曲率流的方法得到。


图17. 大脑海马体的几何分析。

如果说大脑皮层是数据库,那么海马体就是数据库的索引,如图17所示。如果海马体发生病变,长期记忆就无法形成,同时大脑中的长期记忆也无法被取出。很多神经疾病都能够引起海马体的变形,例如癫痫、吸毒、脑退化症等等。对海马体的几何形状进行定量比较分类是非常重要的。一种精确的方法是将海马体共形映到单位球面上,则面积的变化率给出了初始黎曼度量的全部信息,再加上平均曲率,那么海马体的所有几何信息被完美保留。换言之,我们将海马体曲面转换为球面上的两个函数(面积变化率,平均曲率)。在球面上比较不同的海马体曲面,从而精确衡量曲面之间的相似程度,进行分类诊断。相比于传统方法,这种基于几何的诊断方法更加定量而精确。

图18. 人脸曲面的精确匹配。

美容技术

在美容手术领域中,术后效果评估是重要的一个环节,这需要将术前和术后的人脸曲面进行精确的匹配。如图18所示,我们扫描了同一个人的带有不同表情的两张人脸曲面,然后在人脸曲面之间建立了精确的双射。平静表情的人脸上每一个小圆映到微笑表情的人脸上对应的小椭圆,由此我们可以测量对应点的几何变化。因此,三维人脸曲面间精确映射是美容领域中至关重要的技术。


图19. 三维人脸曲面被共形地映到二维平面上,所用方法就是里奇曲率流。

如图19所示,我们用里奇曲率流方法,将人脸曲面的黎曼度量变成曲率为0的平直度量,将三维人脸曲面平铺到二维平面上面,然后在二维平面区域之间建立光滑双射,从而诱导三维人脸曲面间的双射。当然,这种方法也可以用于三维人脸识别,但是人脸识别对于映射的精确度要求没有如此之高。

在精准医疗的其他领域,例如牙齿整形、人造心脏瓣膜、人造骨骼、放射治疗实时监控、肝脏手术计划等等,都需要对各种人体器官进行影像获取、几何重建、特征分析等,里奇流方法都会起到重要的作用。

7 总结和展望

庞加莱猜想本身纯粹而抽象:单连通的闭三维流形是三维球面,这一猜想本身似乎并没有任何实用价值。其结论的简单直观,往往给非数学专业人员无病呻吟之感。但是纯粹数学所追求的严密性迫使无数拓扑和几何学家们前仆后继,奉献终身,终于在众多数学家的共同努力下完成了证明。二维曲面的几何化定理——单值化定理从理论证明到算法提出,历经了百年;三维流形的瑟斯顿几何化纲领从理论证明到算法提出,几乎是同时。三维流形的拓扑理论和计算理论一开始就深刻地纠缠在一起。这表明,在现代,依随计算机技术的发展,纯粹理论到应用算法的开发周期越来越短。

同时,我们看到,在证明庞加莱猜想的过程中,瑟斯顿的几何化纲领将三维流形的风景一览无遗,哈密尔顿的里奇流给出从曲率来构造黎曼度量的强有力的工具,哈密尔顿和佩雷尔曼的奇点演化理论使得原来理论的禁区被彻底打破。笔者和许多数学家发展了离散里奇流的理论和算法,并且系统性地将曲率流应用到许多工程和医疗领域。在实践中,我们深深体会到,在许多关键的应用中,曲率流的方法无法被其它任何方法所取代。目前在社会实践中,里奇流在二维曲面上的应用已经开始逐步展开。但是里奇流在三维流形上的应用更为深邃奥妙,强悍有力,目前还没有任何实际应用。一方面因为三维流形远远超越日常生活经验,另一方面也是因为和曲面微分几何相比,三维流形的拓扑和几何知识远未普及。但是作为自然真理的忠实刻画,迟早三维流形的拓扑和几何会在社会实践中大行其道。庞加莱猜想所引发的雪崩效应终究会改写历史进程。

当庞加莱提出他的拓扑猜想,瑟斯顿洞察三维流形的基本几何结构,哈密尔顿悟出里奇曲率流,佩雷尔曼看出哈密尔顿的曲率流本质上是所谓熵能量的梯度流,他们所追求的是体悟几何结构的壮美,和自然真理的深邃。他们绝不会将实用价值作为其终极目的。实用技术的积累往往只能带来进化(Evolutio),好奇心的满足却能真正带来革命(Revolution)。愿更多的年轻人在万丈红尘中,在浮躁喧嚣中,能够保持诚挚纯真,保持强烈好奇,保持对自然界美丽的敏感,保持对科学真理的激情!

(如果读者对于离散曲面里奇流的理论、算法和应用有兴趣,可以进一步查阅专著【1】)

参考文献

[1] W. Zeng and X. Gu, Ricci Flow for Shape Analysis and Surface Registration Theories, Algorithms and Applications, Springer 2013

延伸阅读

  如果没有基础科学,我们将会失去什么?②  视频 | 拓扑为何?

③  纯粹数学走出象牙塔:丘成桐和三维科技有何关系?

机器学习算法一览(附python和R代码)

2016-04-19 大数据文摘
编译:@酒酒
校正:寒小阳 && 龙心尘

摘自:http://www.analyticsvidhya.com

谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更聪明,更人性化的技术,机器学习。 ”
—— 埃里克 施密特(谷歌首席执行官)

◆ ◆ ◆

当计算从大型计算机转移至个人电脑再转移到云的今天,我们可能正处于人类历史上最关键的时期。之所以关键,并不是因为已经取得的成就,而是未来几年里我们即将要获得的进步和成就。

对我来说,如今最令我激动的就是计算技术和工具的普及,从而带来了计算的春天。作为一名数据科学家,我可以建造一个数据处理系统来进行复杂的算法运算,这样每小时能赚几美金。可是学习这些算法却花了我无数个日日夜夜。

那么谁能从这篇文章里收益最多呢?

这篇文章有可能是我写的所有文章里最有价值的一篇。

写这篇文章的目的,就是希望它可以让有志于从事数据科学和机器学习的诸位在学习算法的路上少走些路。我会在文章中举例一些机器学习的问题,你们也可以在思考解决这些问题的过程中得到启发。我也会写下对于各种机器学习算法的一些个人理解,并且提供R和Python的执行代码。读完这篇文章,读者们至少可以行动起来亲手试试写一个机器学习的程序。

不过,这篇文章并没有阐述这些算法背后的统计学原理,有时候从实践入手也是很好的学习路径。如果你希望了解的是这些统计学原理,那么这篇文章的内容可能并不适合你。

一般说来,机器学习有三种算法:

1. 监督式学习

监督式学习算法包括一个目标变量(因变量)和用来预测目标变量的预测变量(自变量)。通过这些变量我们可以搭建一个模型,从而对于一个已知的预测变量值,我们可以得到对应的目标变量值。重复训练这个模型,直到它能在训练数据集上达到预定的准确度。
属于监督式学习的算法有:回归模型,决策树随机森林,K邻近算法,逻辑回归等。

2. 无监督式学习

与监督式学习不同的是,无监督学习中我们没有需要预测或估计的目标变量。无监督式学习是用来对总体对象进行分类的。它在根据某一指标将客户分类上有广泛应用。
属于无监督式学习的算法有:关联规则,K-means聚类算法等。

3. 强化学习

这个算法可以训练程序做出某一决定。程序在某一情况下尝试所有的可能行动,记录不同行动的结果并试着找出最好的一次尝试来做决定。
属于这一类算法的有马尔可夫决策过程。

常见的机器学习算法

以下是最常用的机器学习算法,大部分数据问题都可以通过它们解决:

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 Boost和Adaboost算法

1.线性回归 (Linear Regression)

线性回归是利用连续性变量来估计实际数值(例如房价,呼叫次数和总销售额等)。我们通过线性回归算法找出自变量和因变量间的最佳线性关系,图形上可以确定一条最佳直线。这条最佳直线就是回归线。这个回归关系可以用Y=aX+b 表示。

我们可以假想一个场景来理解线性回归。比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。

在Y=aX+b这个公式里:

  • Y- 因变量
  • a- 斜率
  • X- 自变量
  • b- 截距

a和b可以通过最小化因变量误差的平方和得到(最小二乘法)。

下图中我们得到的线性回归方程是 y=0.2811X+13.9。通过这个方程,我们可以根据一个人的身高得到他的体重信息。

线性回归主要有两种:一元线性回归和多元线性回归。一元线性回归只有一个自变量,而多元线性回归有多个自变量。拟合多元线性回归的时候,可以利用多项式回归(Polynomial Regression)或曲线回归 (Curvilinear Regression)。

Python 代码

  1. #Import Library
  2. #Import other necessary libraries like pandas, numpy...
  3. from 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
  6. x_train=input_variables_values_training_datasets
  7. y_train=target_variables_values_training_datasets
  8. x_test=input_variables_values_test_datasets
  9. # Create linear regression object
  10. linear = linear_model.LinearRegression()
  11. # Train the model using the training sets and check score
  12. linear.fit(x_train, y_train)
  13. linear.score(x_train, y_train)
  14. #Equation coefficient and Intercept
  15. print('Coefficient: \n', linear.coef_)
  16. print('Intercept: \n', linear.intercept_)
  17. #Predict Output
  18. predicted= linear.predict(x_test)

R 代码

  1. #Load Train and Test datasets
  2. #Identify feature and response variable(s) and values must be numeric and numpy arrays
  3. x_train <- input_variables_values_training_datasets
  4. y_train <- target_variables_values_training_datasets
  5. x_test <- input_variables_values_test_datasets
  6. x <- cbind(x_train,y_train)
  7. # Train the model using the training sets and check score
  8. linear <- lm(y_train ~ ., data = x)
  9. summary(linear)
  10. #Predict Output
  11. predicted= predict(linear,x_test)

2.逻辑回归

别被它的名字迷惑了,逻辑回归其实是一个分类算法而不是回归算法。通常是利用已知的自变量来预测一个离散型因变量的值(像二进制值0/1,是/否,真/假)。简单来说,它就是通过拟合一个逻辑函数(logit fuction)来预测一个事件发生的概率。所以它预测的是一个概率值,自然,它的输出值应该在0到1之间。

同样,我们可以用一个例子来理解这个算法。

假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。

回到数学上,事件结果的胜算对数(log odds)可以用预测变量的线性组合来描述:

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

在这里,p 是我们感兴趣的事件出现的概率。它通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和。

你可能会问为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法。因本篇文章旨不在此,这方面就不做详细介绍了。

Python 代码

  1. #Import Library
  2. from 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
  5. model = LogisticRegression()
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. model.score(X, y)
  9. #Equation coefficient and Intercept
  10. print('Coefficient: \n', model.coef_)
  11. print('Intercept: \n', model.intercept_)
  12. #Predict Output
  13. predicted= model.predict(x_test)

R 代码

  1. x <- cbind(x_train,y_train)
  2. # Train the model using the training sets and check score
  3. logistic <- glm(y_train ~ ., data = x,family='binomial')
  4. summary(logistic)
  5. #Predict Output
  6. predicted= predict(logistic,x_test)

延伸
以下是一些可以尝试的优化模型的方法:

  • 加入交互项(interaction)
  • 减少特征变量
  • 正则化(regularization
  • 使用非线性模型

3.决策树

这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。更详细的内容可以阅读这篇文章Decision Tree Simplified

从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。

理解决策树原理的最好的办法就是玩Jezzball游戏。这是微软的一款经典游戏(见下图)。这个游戏的最终任务是在一个有移动墙壁的房间里,通过建造墙壁来尽可能地将房间分成尽量大的,没有小球的空间。

每一次你用建墙来分割房间,其实就是在将一个总体分成两部分。决策树也是用类似方法将总体分成尽量多的不同组别。

延伸阅读:Simplified Version of Decision Tree Algorithms

Python 代码

  1. #Import Library
  2. #Import other necessary libraries like pandas, numpy...
  3. from 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
  6. model = 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
  9. model.fit(X, y)
  10. model.score(X, y)
  11. #Predict Output
  12. predicted= model.predict(x_test)

R 代码

  1. library(rpart)
  2. x <- cbind(x_train,y_train)
  3. # grow tree
  4. fit <- rpart(y_train ~ ., data = x,method="class")
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

4. 支持向量机(SVM)

这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。

现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。

在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。

更多阅读:Simplified Version of Support Vector Machine

我们可以把这个算法想成n维空间里的JezzBall游戏,不过有一些变动:

  • 你可以以任何角度画分割线/分割面(经典游戏中只有垂直和水平方向)。
  • 现在这个游戏的目的是把不同颜色的小球分到不同空间里。
  • 小球是不动的。

Python 代码

  1. #Import Library
  2. from 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
  5. model = 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
  7. model.fit(X, y)
  8. model.score(X, y)
  9. #Predict Output
  10. predicted= model.predict(x_test)

R 代码

  1. library(e1071)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <-svm(y_train ~ ., data = x)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

5. 朴素贝叶斯

这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。

朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。

贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:

  • P(c|x)是已知特征x而分类为c的后验概率。
  • P(c)是种类c的先验概率。
  • P(x|c)是种类c具有特征x的可能性。
  • P(x)是特征x的先验概率。

例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:

步骤1:根据已知数据做频率表

步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.

步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。

提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?

我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。

那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。

当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。

Python 代码

  1. #Import Library
  2. from 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
  6. model.fit(X, y)
  7. #Predict Output
  8. predicted= model.predict(x_test)

R 代码

  1. library(e1071)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <-naiveBayes(y_train ~ ., data = x)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

6.KNN(K-邻近算法)

这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。

距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。

KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。

在用KNN前你需要考虑到:

  • KNN的计算成本很高
  • 所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
  • 在进行KNN前预处理数据,例如去除异常值,噪音等。

Python 代码

  1. #Import Library
  2. from 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
  5. KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(knn)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <-knn(y_train ~ ., data = x,k=5)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

7. K均值算法(K-Means)

这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。

还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!

K均值算法如何划分集群:

  1. 从每个集群中选取K个数据点作为质心(centroids)。
  2. 将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
  3. 找出新集群的质心,这样就有了新的质心。
  4. 重复2和3,直到结果收敛,即不再有新的质心出现。

怎样确定K的值:

如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。

我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。

Python 代码

  1. #Import Library
  2. from 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
  5. k_means = KMeans(n_clusters=3, random_state=0)
  6. # Train the model using the training sets and check score
  7. model.fit(X)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(cluster)
  2. fit <- kmeans(X, 3) # 5 cluster solution

8.随机森林

随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。

怎样生成决策树:

  1. 如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
  2. 如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
  3. 每个决策树都最大程度上进行分割,没有剪枝。

比较决策树和调节模型参数可以获取更多该算法细节。我建议读者阅读这些文章:

  1. Introduction to Random forest – Simplified
  2. Comparing a CART model to Random Forest (Part 1)
  3. Comparing a Random Forest to a CART model (Part 2)
  4. Tuning the parameters of your Random Forest model

Python 代码

  1. #Import Library
  2. from 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
  5. model= RandomForestClassifier()
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(randomForest)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <- randomForest(Species ~ ., x,ntree=500)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

9.降维算法(Dimensionality Reduction Algorithms)

在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。

例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。

作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。

进一步的了解可以阅读Beginners Guide To Learn Dimension Reduction Techniques。

Python 代码

更多信息在这里

  1. #Import Library
  2. from 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
  8. train_reduced = pca.fit_transform(train)
  9. #Reduced the dimension of test dataset
  10. test_reduced = pca.transform(test)

R 代码

  1. library(stats)
  2. pca <- princomp(train, cor = TRUE)
  3. train_reduced  <- predict(pca,train)
  4. test_reduced  <- predict(pca,test)

10.Gradient Boosing 和 AdaBoost

GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。

更多阅读: Know about Gradient and AdaBoost in detail

Python 代码

  1. #Import Library
  2. from 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
  5. model= 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
  7. model.fit(X, y)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(caret)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4)
  5. fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE)
  6. predicted= predict(fit,x_test,type= "prob")[,2]

GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问这两个算法有什么不同。

10 Drupal Fundamentals

Partly due to how robust and powerful it is, Drupal has a learning curve.  Like other content management systems, it has some of its own lingo.  Understanding the fundamental terms below will help anyone (technically inclined or not) better grasp the system.  These terms are applicable to the three versions of Drupal (5, 6, and 7) that I have used.

1. Node – a single piece of content.  When my clients refer to a web page on their Drupal site, they are referring to a node.  It is important to note that nodes do not have to be a web page, in many cases they are, but they can be other things like an item listed in a view (mentioned below) among other things.

2. Content Type – a standard configuration of a node.  When constructing a site, many pages have the same type of information laid out in the same fashion.  For instance, all of the bio pages on a site likely have a person’s name, picture, brief biographical text, and contact information.  Instead of creating these fields and laying out each page one at a time, Drupal content types allow one to set a standard set of data fields and layout of them.

3. Views – an organized list of nodes.  Through views sites can display a set of nodes in an organized fashion.  Sorting options include – but are not limited to: alphabetical order, publication date, most viewed, random, and taxonomy groupings.  The display format is customizable, and I’ve seen straight text, tables, and images all used in various ways.

4. Taxonomy – a list of related terms used to tag content.  Through Drupal, taxonomy terms allow for classifying nodes in a way other than content types.  For instance, a site can have a taxonomy term for each of the continents of the world.  Once that is done, one of the terms (say “North America”) can be applied to some bio pages, blog posts, and vendor pages even though they are nodes of different content types. Then they can be organized by this term to be displayed in a view.

5. Block – an area on a page that can contain content and then can be placed in a certain area of the site as defined by the site’s template.  A common use of blocks is to place items in a sidebar.  Such items can include images, sub menus, and views.  The great thing about blocks is that they can be restricted to only appear on certain pages of a site.  Further, configuration options also allow them to be only displayed to certain user roles (perhaps premium members or site administrators).

6. Webform – a content type that enables site administrators to create forms to gather information from site visitors.  A very common webform application is to create contact forms through which site administrators can create fields such as sender’s name, sender’s e-mail/phone number, type of inquiry (like general inquiry, price quote request, and media contact), and message.  Upon submission, the form can send an e-mail with the provided information to predefined recipients.  The data is also stored and can be exported into a spreadsheet.

7. User Role – a set of permissions granted to a user account.  Through roles site administrators can carefully grant specific abilities to certain users.  For instance, users with access to a premium member area of the site not intended for the public shouldn’t also have the ability to change the site’s menus, for instance.  However, through roles, users can be allowed to create, edit, and delete nodes of certain content types without necessarily granting them the ability to manage the site in other ways.

8. Module – a program specifically designed for Drupal that adds functionality to it.  One of the greatest features of Drupal is its modular design that allows for site administrators to tact on functionality to the CMS.  Modules do a variety of things ranging from controlling a node’s slug (the “…” part of sample.com/… to a specific format) to logging in users to an account based upon their IP address to connecting with third-party systems like Google Analytics, Eventbrite, and Salesforce.  There is a wide variety of modules that the Drupal open source community develops and maintains free of charge.

9. Themes – more or less a template for the site.  Drupal supports multi-themed sites.  One major use of this is creating a desktop theme and a mobile theme.  For sites that we create a mobile version using Drupal, we have created a mobile theme and then make sure that the theme that is displayed is based upon the device a site visitor is using.

10. Input Formats – modes that control the type of content entered into a field.  Most nodes have body fields where one can input the text and images for the node.  One does not need to know much about HTML or PHP to use Drupal, and this input formats will find ways to add line breaks and link urls and e-mail addresses for people without the need for the coding.  Used in concert with a WYSIWYG editor, a person can still present styled text and images using the Filtered or Full HTML formats.  Further, when judiciously granting rights to use formats through user roles (particularly to the Full HTML and PHP code formats), it can help secure the site since using HTML and PHP can be used by external users to hack the site.

一些鲜为人知的编程真相

2016-04-08 Python开发者

英文:Rational Mind

译文:外刊IT评论

链接:http://www.aqee.net/2010/09/05/some-lesser-known-truths-about-programming/

做程序员的经历让我知道了一些关于软件编程的事情。下面的这些事情可能会让朋友们对软件开发感到惊讶:

1. 一个程序员用在写程序上的时间大概占他的工作时间的10-20%,大部分的程序员每天大约能写出10-12行的能进入最终的产品的代码 — —不管他的技术水平有多高。 好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行。“一个卓越的车床工可以要求比一个一般的车床工多拿数倍高的工资,但一个卓越的软件写手的价值会10000倍于一个普通的写手。”——比尔 盖茨

2. 一个优秀的程序员的效率会是一个普通的程序员的十倍之上。一个卓越的程序员的效率会是一个普通程序员的20-100倍。这不是夸张 — — 1960年以来的无数研究都一致的证明了这一点。一个差的程序员不仅仅是没效率 — — 他不仅不能完成任务,写出的大量代码也让别人头痛的没法维护。

3. 卓越的程序员只花很少的时间去写代码——至少指那些最终形成产品的代码。那些要花掉大量时间写代码的程序员都是太懒惰,太自大,太傲慢,不屑用现有的方案去解决老问题。卓越的程序员的精明之处在于懂得欣赏和重复利用通用模式。好的程序员并不害怕经常的重构(重写)他们的代码以求达到最好效果。差的程序员写的代码缺乏整体概念,冗余,没有层次,没 有模式,导致很难重构。把这些代码扔掉重做也比修改起来容易。

4. 软件遵循熵的定律,跟其它所有东西一样。持续的变更会导致软件腐烂,腐蚀掉对原始设计的完整性概念。软件的腐烂是不可避免的,但程序员在开发软件时 没有考虑完整性,将会使软件腐烂的如此之快,以至于软件在还没有完成之前就已经毫无价值了。软件完整性上的熵变可能是软件项目失败最常见的原因。(第二大 常见失败原因是做出的不是客户想要的东西。)软件腐烂使开发进度呈指数级速度放缓,大量的软件在失败之前都是面对着突增的时间要求和资金预算。

5. 2004年的一项研究表明大多数的软件项目(51%)会在关键功能上失败,其中15%是完全的失败。这比1994年前有很大的改进,当时是31%。

6. 尽管大多数软件都是团体开发的,但这并不是一项民/主的活动。通常,一个人负责设计,其他人负责实现细节。

7. 编程是个很难的工作。是一种剧烈的脑力劳动。好的程序员7×24小时的思考他们的工作。他们最重要的程序都是在淋浴时、睡梦中写成的。因为这最重要的工作都是在远离键盘的情况下完成的,所以软件工程不可能通过增加在办公室的工作时间或增加人手来加快进度。

前端工程师是怎样一种职业

2016-03-20 吕大豹 前端开发

来自:医小生与程序猿(微信号:doctor_programmer)

链接:http://www.cnblogs.com/lvdabao/p/5229640.html

前端工程师已经是大家不再陌生的一个软件行业的工种了,尽管这一工种诞生也没几年。作为一名从业三年的前端工程师,我尝试结合业界标准与我的理解,来尽可能诠释一下前端工程师这个职业。这篇文章的适读人群为:非web方向的软件开发者、产品经理以及与产品挂钩的相关人士、正在纠结需不需要招聘一个前端的老板们、刚刚走上工作岗位的前端新手们、以及所有对前端感兴趣的父老乡亲们。

前端工程师的英文名为front-end engineer,简称FE,下文将用FE来代称。国内最早开始招聘FE应该是2011年左右的事情吧,在此之前,FE的工作基本都是由服务端工程师包办的,或者是由设计师来产出HTML页面。那么,是什么样的原因催生出了FE这一职位呢?本文将从FE的工作内容、专业FE应具备的技能和品质来聊聊这个职业。

用户体验的操刀者

前端工程师的首要工作就是开发用户界面,在web系统中,就是指网页了。为什么网页需要专门的FE来写呢?答案就是「用户体验」。随着web2.0概念的普及以及web3.0的提出,用户成为互联网的主要生产者,网页所承载的功能越来越多。

一方面,企业的「用户体验」诉求很强烈。这个很容易就能理解,如果你的产品看上去就像个钓鱼网站而且还特别难用,就会有一部分用户离你而去。非互联网企业呢?也会面临这样的情况,你花了很大的功夫优化数据库,优化服务器负载,你的客户却很难感知到你的努力。你的系统界面还是八九十年代的风格,客户的第一感觉就是这系统不行,不买你的帐。相反,如果你花一点时间做一套崭新风格的界面出来,客户的第一感觉就是这个系统好炫酷,技术含量很高。不要小看这个第一感觉,对于外行人来说,第一感觉往往起到了决定作用。好多企业都意识到了这一点,所以对用户体验的诉求就上去了。

另一方面,现在的用户也都很挑剔。毕竟他们使用的产品一个比一个炫,都被惯坏了,你的产品稍有点不爽的地方,就上微博去给你宣传。

前端工程师是用户体验的把控者,在产品经理构想出交互原型,设计师设计出交互细节后,FE就用他的双手一行行敲出这些代码。他敲出的每一个按钮,每一张图片,都被成千上万的用户点击着,FE与用户可以说是“零距离接触”。作为产品交互的实现者,除了HTML、CSS这两门语言要精通外,对前端要求更高的其实是非技术因素。

FE需要对用户体验有较深的理解。比如页面上有一个超链接,字体比较小的情况下,用户可能会一下点不中,因为链接的可点击区域是紧贴着文字边缘的。前端可以通过很简单的方法来扩大这个链接的可点击区域,使得用户更容易点中。这就是用户体验,正如《瞬间之美》中提到的那样,touch到用户的内心只需要一瞬间。对用户体验的理解,还体现在对一些交互常识的把握上。比如用户操作某个软件的界面,会感觉它很灵巧,却具体说不出到底是哪里。那么很可能是这个界面上的按钮有着设计良好的四态(正常、鼠标移上、鼠标按下、不可用),它会随时对你的操作给出反馈。

懂用户体验的前端工程师,会让他的作品与用户沟通,能够touch到用户心中那一块柔软的区域。

FE需要有一点强迫症。这体现在对任何瑕疵的不容忍。比如采用技术手段让页面的滚动更平滑些,减少页面的视觉抖动,像素级别的定位校准。当用户触碰的内容是一串非电话号码的数字时,不要让手机自动调出拨号功能,等等。很多细节是产品经理无法感知的,因为这些都是很零散的技术手段,只有靠FE来点滴积累。再有极致者,追求让页面的响应时间再减少几个毫秒,让你的手机少耗几KB流量,少耗一些电量。这些甚至连用户都无法感知,但是当你的用户有百万级别或者千万级别,这样做的价值就显现出来了。

前端工程师需要是一个心思细腻之人,需要对美有所领悟,需要执着地追求完美,需要有品味,有思想,有大局观,最好还能懂点心理学。

用户端业务逻辑

做出优雅的界面只是前端工程师的第一步,编程也是必备技能,FE承担着处理用户端业务逻辑的任务。放在以前,用户端就是个IE浏览器,没有什么业务逻辑可言。但现在不同了,用户使用浏览器发表文章、进行社交活动,更复杂的能使用在线工具完成工作。

javascript就是FE需要掌握的编程语言,他应该通晓这门语言的优势和缺点,掌握各种编程思想、开发模式。利用各种技巧实现交互越来越丰富的界面,同时还要与服务端的工程师沟通,调试接口,完成:页面展示——响应用户操作——提交用户数据——反馈操作结果这一系列流程。

从这一点上,要求前端工程师要有软件开发的基础,了解计算机的基本原理,网络通信的基本原理,所以计算机相关专业出身的前端会更有优势一些。

前端也需要架构

写写网页也要架构?有什么好架的?回答这个问题首先得明确一点,FE的工作内容已不再是「写写页面」这么简单。随着前端代码的规模越来越大,逐渐涌现出了模块化开发、MVC、MVVM等开发模式。团队规模也从原来的单兵作战演变为团队开发。

所以,一个高级前端工程师,要有架构能力。这个架构能力包括不限于:

  • 对现有优秀框架的了解与整合使用
  • 根据项目的业务特点构建出合适的开发模式
  • 设计前端测试方案保证代码质量
  • 用工程化方案组织起团队的开发流程。

向前延伸、向后延伸

物联网的市场越来越热了,手机是物联网体系中的一个关键节点。前端工程师的战场已不再是单纯的浏览器,将来会覆盖到各种「端设备」上。得益于javascript语言的灵活性,现在用javascript已经可以开发windows应用、ios应用、android应用,可以编写智能电视上的应用。将来,或许是VR、可穿戴设备、智能家电。这是前端可以向前延伸的方向。

另一方面,由于nodejs的横空出世,javascript这门语言竟然神奇的有了服务端的能力。之前用java、PHP做的事情,js同样可以实现了。本来前端阵营中就有一批人是从后端转过来的,有服务端开发的基础,得了nodejs这一利器,再加上现在市场的需求,快出产品,敏捷开发,前端工程师向后延伸的路线宽广而明亮。事实上,全栈工程师的概念在前年就被提出,BAT这样的业界领头羊早已用nodejs做一些基础设施的建设,而很多小而快的创业公司,也在用nodejs进行快速迭代开发。

持续学习

前端领域的技术更新相对于其他领域要快很多,原因大概也是因为这个领域离用户最近吧。有一些新的技术甚至是颠覆性的,前端工程师必须要跟上时代的步伐,否则你开发出的产品在体验上就落后别人一截了。

有一些市场人员提出的需求,产品经理根据多年的经验评估后觉得无法实现,就被打回了。而事实上,随着新技术的出现,有些你认为无法实现的功能已经可以在前端实现了。随着HTML5的支持度越来越高,前端拥有的能力也会越强。比如利用canvas能够获取到图片上的每一个像素点,这样前端就拥有了图像处理能力。有了FileReader API,前端拥有了本地文件的读取能力,还有地理位置获取等等。

而这些新东西,就需要前端工程师来不断学习。所以,一个称职的前端必须能够保持持续学习能力,能够对新技术有敏锐的嗅觉。活到老,学到老,说的就是前端工程师。

高情商的程序猿

大多数人对程序猿的印象就是情商低、不善言谈。但前端工程师应该是个例外,这是由工作性质决定的。

从工作流程来看,FE处于设计师的下游,他要接设计稿,转化为网页。同时又是后端工程师的上游,需要把用户产生的数据提交到服务端。横向来看,他又与产品经理有着密切接触,因为他可能随时和产品经理探讨交互的细节。这样一个连接着团队中的其他成员的角色,需要他既是一个粘合剂,又是一个润滑剂。

前端工程师需要有较高的沟通能力和理解能力。我们经常开玩笑说“设计师活在童话故事里”,因为有时候他们设计的页面根本不符合常规,无法实现。这个时候你就需要耐心的给设计MM讲原理、讲原因,并且告诉她设计需要遵循哪些基本规范。对于产品经理的思想,你要能把握到位,你得理解他比划了半天到底是想要做什么。与后端工程师打交道的时候,你又得马上化身编程达人,跟他们聊数据类型,聊面向对象,聊设计模式。

你需要能随时切换角色,切换你的表达方式和谈话内容。所以,你得是一只高情商的程序员。

以上就是我对前端工程师的理解,前端的门槛低,但要成为一名专业的前端工程师,需要掌握的东西太多了。除了前端技术外,我认为前端更重要的是综合能力,包括我上面谈到的思维细腻、有品味、有思想、情商高等等。毕竟你要通过代码与用户产生接触,给用户带来愉悦感。从某种程度上来说,你得是一个好恋人。

“人工智能大脑”跳槽记:吴恩达所理解的智能,创新和失败

2016-04-17 董老师在硅谷

前两天公众号上发了吴恩达的Quora采访问答,而上周四“机器学习研究会”线上交流中,雷鸣对话吴恩达深度解析人工智能的发展现状与未来。让我印象深刻的是这么一段他谈到无人车和AI领域学习建议。吴恩达说:

在中国,每天都有500人死于车祸。我们的无人驾驶技术早实现一天,就相当于多拯救了500人的生命,这将会是接下来的十年中,人工智能得到的最重要的应用之一。

我想和在座的年轻人说几句话。我们处在一个独特的时期,这是一个人工智能将会改变世界的时期。如果你知道怎么运用人工智能,你今天的一个决策将有可能在接下来十年里改变世界。你的努力可能会拯救数以万计甚至百万计的生命。或许,你可以改变整个行业,帮助无数的人。也正因如此,我对人工智能如此兴奋!如果你还年轻,正在考虑未来的职业如何规划,我希望你能够考虑人工智能。

人工智能发展的如此迅猛,从事这一行业的我们应该不断的学习。再一次,我想跟在座的年轻人共勉:每个周六,你可以选择看美剧,也可以选择学习。如果你学习,两天后的周一,你不会很快的就在工作中出彩,你的老板也不会知道你花了整天的时间学习,更不会夸奖你什么。你几乎找不到任何东西可以证明你在努力学习。但是我想告诉大家:如果你每个周末都这样努力工作,持之以恒,你会发现你已经突飞猛进。我认为,学习是一件几乎没有短期回报的事,但是从长远来看,回报却是非常丰厚的。

下面这一篇是去年Huffington Post对他的采访,讲述科学家背后的成长,经历的失败和保持的信念。译文知乎专栏“董老师在硅谷”首发。转发请注明。

可以说最好的计算机科学的项目分布在卡内基美隆、麻省理工、加州大学伯克利分校和斯坦福大学等高校中,而吴恩达教授 (Andrew Ng)正是从这些地方分别取得了本科,硕士,博士学位,以及12年的任教经历。

吴恩达虽然不到40岁,但是已经是人工智能界的标志性人物。早在2011年,他建立了谷歌大脑(Google Brian),这是依托于谷歌强大的计算能力和丰富的数据建立起来的一个深度学习的研究项目。可喜的是,这个项目的重要成就之一是通过让计算机分析几十个YouTube的视频截图来识别猫(《纽约时报》标题:需要多少计算机才能正确的识别猫?16,000台)。正如吴恩达解释的那样,“最值得注意的是,我们的系统自己发现了‘猫’的概念,尽管没有人告诉过它‘猫’是什么。这可以说是机器学习的一个里程碑”。

吴恩达流露出喜悦但却非常冷静,他欣然地讨论着他职业生涯中犯过的错误和遇到的失败,以及他读不懂的论文。他每天穿着一样的牛津蓝的衬衫。他的妻子Carol Reiley从事外科手术机器人的研究,当同事们谈及他和妻子之前那张机器人主题的订婚照片时,他也会脸红,但又非常自豪。

尽管他作为讲师备受欢迎,但当和他一对一交谈时,他的声音显得非常柔和。2011年,他把自己在斯坦佛教授的机器学习课程录像上传到网上,随后超过100,000人在网上注册学习了这门课。在接下来的一年里,他和别人共同创立了迄今世界上最大的在线公开课程平台—Coursera。Coursera 的合作伙伴包括包括普林斯顿、耶鲁以及中国和欧洲的顶尖高校。尽管Coursera是一个盈利性的公司,但所有的课程都是免费开放,因为“对课程本身的内容收取费用将是一个悲剧”,吴恩达说到。

去年春天,吴恩达宣布了一条令人震惊的事情,他将离开谷歌、离开曾全身心投入的Coursera而加盟百度。当时,中国的科技巨头百度斥资3亿美金,在位于谷歌硅谷总部不远的地方,正建立一个专注于研究人工智能的实验室。吴恩达将会领导和管理这个实验室。

像之前一样,吴恩达在百度继续尝试让计算机以很高的准确率来实时识别音频和图像文件。吴恩达相信,高达99%准确率的语音识别技术会为人和计算机的交互方式、以及未来操作系统的设计带来革命性的改变。同时,面对百度的数以百万刚开始体验数字生活的用户,他要帮助百度为这些用户提供更好的服务。“在中国,你可能得到和美国的完全不一样的查询请求”,吴恩达解释道,“例如,我们得到的查询可能是‘百度你好,上周我在街角的那家店吃了碗面,味道很棒,你觉得这周末那家店会有促销活动吗?’”。“像这样的查询请求”,吴恩达补充道,“我想我们已经可以很好的回答它”。

尽管Elon Musk (SpaceX和特斯拉的CEO)和史蒂文霍金已经发出警告:高级人工智能技术可能会威胁到人类自身,吴恩达却不以为然,“我不会防止人工智能向邪恶的方向发展,就像我现在不会去解决火星上人口过剩问题一样。”根据吴恩达所说,距离人工智能达到可以自我感知的水平,还有相当长的一段时间。但与此同时,人工智能导致了更加棘手的问题的出现:这些基于机器学习的计算机,正在取代很多人工工作,而且这种趋势正在加速。吴恩达经常呼吁政策的制定者为因此产生的社会经济后果做好准备。

在位于加州Sunnyvale 的百度实验室,我们采访了吴恩达先生。我们谈到了一个名为‘索菲亚’(Sophia)的项目,这个项目诣在收集非常有趣的人的经历。他解释了为什么他认为“跟随着你的热情”是非常糟糕的职业发展建议,分享了他教授创造力的方法;他也讨论了他的失败经历以及他的一些不错的习惯,对他影响最大的书籍以及他关于人工智能前沿领域的一些看法。

问:您最近曾说过,“我发现人们正在学着更具有创造力了”,请您解释一下?

答:问题是,一个人如何才能创造新的想法?新的想法是某一个方面的天才(比如乔布斯)的不可预知的行为?还是可以通过系统的传授产生创新的想法?

我相信创新的能力是可以被教授的。人们可以通过很多方式来系统的发明创新。我在百度做的事情之一是组织一个关于培养创新思维的讨论班。我的想法是,创新不是那些天才所做的随机的、不可预知的事情,恰恰相反,人们可以非常系统的创造从未被创造的新事物。

对我而言,无论何时,当我觉得我不知道下一步应该如何做的时候,我将会尝试大量的学习和阅读,和某些领域的专家谈话。我不知道我们的大脑是如何工作的,但它非常的神奇:当你读了足够多的书,或者和足够多的专家谈话之后,换句话说,当你的大脑有了足够多的输入信息,新的想法就会随之产生。我知道的很多人都有这样的经历。

当你对某一个某技术领域足够的了解,你便停止随机地寻找新的想法。你会通过深思熟虑来选择想法,把这种想法组合到一起。你也会知道什么时候尝试创造尽量多的想法,什么时候裁剪、整合已有的想法。

好了,现在还有一个挑战,就是面对非常多的新想法,你如何去做?如何进一步用这些想法做一些非常有用的东西?当然,这是另外一回事了。

问:你可以谈一下你平时会学习什么,学习的方法是怎样的?

答:我阅读很多材料,也花很多时间和很多人交谈。我觉得两个最有效的学习、获取信息的方法是阅读和同专家交谈。所以我会花很多时间做这两件事情。在我的kindle上有不到一千本书,我大概已经阅读了其中的2/3。

在百度,我们有阅读小组,在那里,我们可以每星期读半本书。我试试上参加了两个这样的阅读小组,在每个小组里都会每星期读半本书。我想我是唯一一个参加了两个阅读小组的人。我每周六下午最喜欢的活动就是独自在家阅读。

问:我想了解一下早期教育对你的影响,你觉得父母做了什么独特的事情对你后来产生了持续的影响?

答:我记得在我六岁时,我父亲为我买了一台电脑,并帮助我学习编程。这本身并不是很特别,因为很多计算机科学家从很小的时候就开始学习编程了。但我仍然觉得从小就拥有计算机学习编程是件很幸运的事。

不像传统的亚洲家长,我的父母对我的要求非常宽松。当我在学校取得好的成绩时,他们就会夸张地表扬我,甚至让我觉得有些尴尬。所以我有时故意把取得的好成绩藏起来[笑]。我不喜欢把我的成绩单拿给父母看,不是因为我的成绩不好,而是因为他们的反应。

我有幸能在很多地方生活和工作过:我出生在英国,在香港和新加坡长大,来到美国读书。我在卡内基美隆,麻省理工,伯克利都拿到了学位,最后去了斯坦福任教。

我也有幸因为去了这些地方,从而见到了很多非常优秀的人。我在著名的前AT&T贝尔实验室做过实习,然后去了微软研究院。这些经历使我有机会从各个角度看待问题和接受观点。

问: 如果可以重新规划你的教育和早期的职业,你会做哪些不同的事情?你有哪些会让别人受益的教训,可不可以分享一下?

答: 我希望这个社会能给年轻人更好的职业发展建议。“跟着你的热情做事”不是什么好的建议,相反,是给年轻人非常糟糕的建议。

如果你酷爱驾车,并不一定要成为赛车车手。事实上,我们应该把“跟着你的热情做事”改成“跟着你的热情做事,但这些热情是对你在大学所学专业相关事物的热情”。

但通常,你先是掌握了一件事情,然后才会对它有热情。我相信大多数人都会很好的掌握大多数事情。所以关于选择我想要做的事情,有两个标准。第一,是否有学习的机会。就是说,做这件事情是否会让我学到新的、有趣的、实用的东西?第二,就是潜在的影响。这个世界有很多有趣的问题需要解决,但也有很多重要的问题。我希望大家把精力放在解决重要的问题上。

幸运的是,我不断地找到能够产生深远影响的事情去做,同时也有很多学习的机会。我想,年轻人如果能注重优化这两个标准,就会获得非常好的职业发展。

我的团队的使命就是要做更难、更高级的人工智能技术,这些技术会影响数亿人们。这就是令我兴奋的使命。

问: 在你看来,重要性就是说可以影响很多人吗?

答:不是。受到影响的人的数量并不是衡量重要性的唯一标准。用显著的方式改变数亿人的生活,我想这是我们可以合理追求的境界。通过这种方式,可以确信,我们不仅仅是做有趣的事情,而且是做有影响的事情。

问:你之前谈到过你做过一些失败的项目,那你又是如何面对这些失败呢?

答:失败在所难免,说来话长了[笑]。几年前,我在 Evernote里面列了一起清单,试图记住我所有开始做,却由于各种原因最后不了了之,或者没有成功,亦或投入和产出完全不成比例的项目。有时,我通过运气而非技能,以出乎我意料的方式,把一些项目做出来了。但我还是列了上面提到的那个清单。然后把它们按照哪里出了问题分类,对他们进行彻底的分析,找出没有成功的原因。

其中的一个失败的案例发生在斯坦福。当时受到鹅群成V型飞行,我们曾尝试让飞机也以V字型飞行,从而节省燃料。关于这方面的空气动力学理论非常成熟,我们就花了一年时间让飞机可以被自动控制,然后以V字型飞行。

但一年之后,我们发现我们没有办法让飞机以足够的精度控制飞机从而实现节省燃料。如果重新开始这个项目,我们会意识到我们用小型飞机根本不可能实现那个目标。因为阵风很容易无法让飞机准确地以V字型飞行。

我以前很容易犯的一种错误,就是当我做一个项目时,一步,两步,三步之后,发现第四步根本不可能完成。希望这种错误现在会少很多。上面的那个飞机V字型飞行的例子,我在战略创新组会上也讲过,教训就是尽早的发现项目的风险。

现在,我学会尽量早的发现评估项目的风险。如果我现在说“我们应该尽早找到项目的风险”时,每个人都会赞同,因为这显然是正确的。但问题是,如果你自己面对一个新的项目时,很难把我说的应用到你的项目中去。

究其原因,这些科研项目是一种策略技能。在现行的教育系统中,我们非常善于教授已有的事实,比如食谱。如果你要做意大利番茄牛肉面,你只需要照着食谱做就好了。

但创新或者创造力是一种策略技能,每天你醒来,便会处在从没有经历过的环境中,你需要在你自己所处的独特环境中做决策。据我所知,教授策略技能的唯一途径是通过经历无数的案例。当你已经见过足够的案例后,大脑会内化这些定律和准则,从而更好的做出决策。

通常,我发现做科研的人们要花好多年才能见到足够多的案例,内化这些准则。所以在这里,为创新策略,我一直试验做飞行模拟器。在非常有限的时间内,飞行模拟器可以产生非常多的案例,人们不再需要花五年时间来看足够多的案例。

如果你学驾驶飞机,你需要费很多年,或者几十年才能遇到紧急情况。但在飞行模拟器中,我们可以在很短的时间里展示非常多的紧急情况。这会让你学习的更快。这些就是我们一直试验的东西。

问: 当试验室刚刚建立,你说你之前还没看到团队文化的重要性,但你已经看到它的价值。几个月过去了,你学会到如何建立正确的团队文化了吗?

答:很多机构有关于文化的文件,比如“我们要互助”等等。当你说这句话的时候,每个人都会点头,因为没有人不想帮助团队的其他成员。但当他们回去以后,过了五分钟,他们还会这么做吗?事实上人们很难把抽象和实际联系起来。

在百度,我们做了一件关于文化的事情,我认为这是很不寻常,因为我不知道有别的企业这么做过。我们做了一个小测验,向每个员工描述一个具体的情景,然后问他们,“如果你在这种情况下,你应该怎么做?选A, B, C还是D?”

没有人在第一次就能拿到测验的满分。我觉得通过在测验中让员工把具体的行动用到假设情景中,就是我们尝试帮助员工把抽象的文化和实际联系起来。当你的员工找到你,做了这些事情,你会怎么做呢?

问:你是否可以分享一些对你知识构建很有影响的书呢?

答:对于那些想要创新的人,我有一些书推荐。第一本是《从零到一》(Zero to One),这是一本非常好的书,给出了对创业和创新的概览。我们经常把创业分为B2B, B2C. 对B2B,我推荐《跨越鸿沟》(Crossing the Chasm)。对B2C,《精益创业》(The Lean Startup)是我非常喜欢的一本书。这本书从更窄的范围入手,但给出了具体的快速创新策略。这本书的范围有点窄,但在提及的那些领域,它讲的非常棒。

然后我们进一步把B2C细分,两本我非常喜欢的书是,首先是《与人沟通》(Talking to Humans),这是一本非常简短的书,教会你如何通过和你服务的用户交谈,来为他们设身处地的着想。另外一本是《妙手回春》(Rocket Surgery Made Easy),如果你想做一些重要的,人们关心的产品,这本书会告诉你一些不同的策略(通过用户学习或者是面谈)了解你的用户。

最后,我推荐《创业艰难》(The Hard Thing about Hard Things)。这本书有些深,但它涵盖了关于如何建立企业的方方面面。

对那些想做出职业发展决策的人,So Good They Can’t Ignore You是一本非常有趣的书,它给出了关于如何选择职业发展道路的非常有价值观点。

问:你有那些好的习惯呢?

答:我每天都穿蓝色牛津衬衫,我不知道你是否已经意识到了。[笑]是的,培养好的习惯的能力是你撬动你生命的最大杠之一。

当我和研究人员,或是想创业的人交谈时,我告诉他们如果你不断地阅读论文,每周认真研究六篇论文,坚持两年。然后,你会学到很多东西。这是对你长期发展一个极好的投资。

但这种投资,比如你花整个周六去学习而不是看电视,没有人会赞扬你。而且很可能你在周六所学的东西对你在接下来周一的工作没有什么帮助。我们很少会从这些投资中得到短期回报。但这却是很好的长期投资。确实,要想成为一个伟大的研究者,就要大量阅读。

人们通常用意志力做这些事情,但不起作用,因为意志力会耗尽。我觉得,人们喜欢创造习惯,比如每周都努力的学习工作,这是最重要的。这些人才是最可能成功的。

我有一个习惯,每天早晨花七分钟用手机应用锻炼。我发现更容易每天做同样的事情,因为我只有一个选择。同样的原因,我的衣柜里塞满了蓝色的衬衫。我以前有两种颜色的衬衫,蓝色和紫红色。我觉得我需要做的决定太多了[笑]。所以我现在只穿蓝色衬衫了。

问: 你主张政策制定者要花时间想一下未来,当计算机和机器人削减了大量个人工工作。对这个问题,你有什么解决方案呢?

答:这是个很难回答的问题。计算机擅长做重复性的工作。迄今为止,计算机主要擅长的事情就是把人们每天重复的劳动自动化。

让我们从工作的难易程度来具体的分析。工人们在流水线上工作,每个月都重复同样的动作。现在部分这样的工作已经可以有机器人来实现。中等难度的工作,拿驾驶开车举例子。卡车司机每天都是做同样的事情,所以计算机也试图做这件事。虽然这比大多数人想象的要难很多,但自动驾驶很可能在未来的十几年里成为现实。最后讲的是最有难度的工作,比如放射线学家每天都要分析同样类型的X光射线,同样,计算机可能涉足这些领域。

但是对于那些非重复性的社会工作,我想,在今后很长一段时间内,人类要比计算机更擅长这类工作。很多工作,我们需要每天做不同的事情,见不同的人,计划不同的事情,解决不同的问题。现在,这些事情对于计算机来说还是很难完成。

当美国从农业经济向制造和服务型经济转型,有很多的人转变了所从事的工作,比如,从在农场工作变为制造或在电话客服中心工作。很多的人经历了那种转变,所以他们找到了新的工作,他们的生活还不错,但他们从事的工作大多还是重复性。

我们现在面临的挑战是,如何大规模地教人们从事非重复性的工作。从历史来看,我们的教育系统并不擅长做这种大规模的培训。顶尖高校擅长为相对少的一部分人提供这种培训。但大部分的人最后做的确实重要但重复性很强的工作。这是我们教育系统面临的挑战。

我觉得这个问题可以被解决。这就是我为什么一直想教授创新策略。我们要让很多人能做不重复的工作。这些创新策略,这些创新的飞行模拟器可以实现这个目标。我不是说我们已经知道如何解决这些问题,但我很乐观的相信我们能够解决它。

问: 你曾说过,“总体上来看,在中国的工程师要比在硅谷的工程师工作努力。在硅谷的初创公司的工程师工作非常努力,在成熟的公司,我没有见过像你这种工作强度,无论在初创公司还是在百度。”你为什么这么说呢?

答:其实我也不是很清楚。我觉得在中国的工程师非常出色。在硅谷的工程师也很出色。我认为不同之处在于公司。百度的工程师团队动作非常快。

对中国互联网经济的现状评价很少,我更感觉,所有的假设可以受到挑战,任何事情都可以被随时利用。中国互联网生态非常有活力。每个人都能看到大的机遇,每个人也都能看到大量的竞争。变化无所不在。新的事物出现,很多公司就会在一天之内进入一个全新的商业领域。

举个例子,在美国,如果Facebook说要做一个新的搜索引擎,我们可能会觉得这么做有点怪。为什么Facebook要做搜索引擎呢?这非常困难。但在中国,这种事情却更可信些,因为这么做不仅仅是个假设,还可能会创造一种新的商业模式。

问:这看起来是一种不同的管理文化,因此你可以很快的做重要的决定,从而让这些决定更明智有效,而不是更混乱。百度是以一种独特的方式来运营吗?你觉得这种运营方式对百度的成长有帮助吗?

答:这是一个非常好的问题。我想一下这个问题如何入手。在百度,决策制定可以推行到公司的最底层。百度的员工有很大的自治权,他们显得非常重要。有一件事我很欣赏公司,特别是公司执行高层,就是对世界,对竞争,有着清晰的眼界。

在管理层会议上,我们对公司的说话方式,没有任何的虚张声势。在公司的内部陈述中,他们会说“我们在这件事上做的很好。我们对这些是不是很满意。这些做的不错。这些做的不是很好。这些事情我们应该强调一下。我们仔细分析一下我们犯的错误。”在这里,确实没有什么虚张声势,我想,这让公司有一个不错的环境从事创新以及专注。

问:比起其他的问题,你非常专注语音识别。你现在遇到那些困难,当你解决了这些困难后,会让语音识别的准确率有显著的提高?

答:我们现在在做基于机器学习的语音识别系统。我们正在使用的一些机器学习的技术已经存在几十年了。但正是过去的几年,这些技术才真正开始被使用。

为什么会这样呢?我经常拿建造火箭飞船作比喻。火箭飞船需要很大的发动机和非常多的燃料。发动机必须足够大,燃料必须足够多。如果燃料很多发动机很小,那无法飞离地面。如果发动机很大但燃料很少,飞船可以飞起来,但无法进入轨道。

现在机器学习才真的算得上起步,原因是我们有了建造巨大引擎的工具—大型计算机。燃料就是数据。现在我们终于拥有了所需要的数据。

社会的数字化创造了很多的数据,长期以来,我们已经产生了很多的数据。但就是最近几年我们才有能力建造大引擎来吸收燃料。所以处理语音识别的方法就是想办法建造大引擎,并得到更多的燃料。

举个我们做的一个例子,这个例子有点偏技术。从哪里获取语音识别的数据呢?我们做的其中一件事就是获取音频数据。其他的研究组可能只用几千小时的音频数据,但我们用的是十几万小时的数据。这比你在学术文献里使用的燃料要多很多。

然后我们把人们说话的音频剪切下来,加上背景噪音,听起来像人们在咖啡厅里面的录音。这就是人工合成像在咖啡厅录制的音频。通过把人们的声音和背景音合成,我们得到了更多的数据。我们正是通过类似的方法,把更多的数据放到机器里,填充火箭的发动机。

说到语音识别,有一件事要提一下:大多数人不理解95%和99%的准确度的区别。95%的准确度意味着20个词中有一个是错的。这非常烦人,因为在电话上退回去再去纠正它非常痛苦。

99%意味着一切都变了。99% 说明语音识别系统更可靠。你在任何时候使用它,它都会照常运转。所以这不是四个百分点的改进,这将会是人们几乎不使用跟一直使用的差别。

问: 你觉得现在达到99%准确率的困难是什么呢?

答:我们需要更大的火箭引擎和更多的燃料。现在这两方面都很有限,而且这两方面要同时增长。我们正在为推动这些方面的发展而努力。

------------------

欢迎大家报名翻译,转载请注明出处。

关注如下我的微信公众号“董老师在硅谷”,关注硅谷趋势,一起学习成长。

如何快速在一个陌生领域达到优秀水平?

2016-04-30 TalentGuide

优秀是投入20%精力得到80分;

顶尖是投入80%的精力去打磨那超越众人的20分。

来源:咪喵

ID:mimiao_mao

授权 TalentGuide 发布

许多事情无需做到顶尖,做到优秀已经足够。
下厨做菜,不用做到五星级饭店主厨水平,不用将洋葱切成0.1cm见方的均匀小块,只需会做几个拿手菜,可为心爱之人下厨,可招呼三五知己来家吃饭,已足够应付日常生活,若还会做几样甜点糖水,更是加分项。
做PPT,无需专业设计功底,能做到配色和谐、风格统一、排版整齐、图表清晰,已足够秒杀90%混乱驳杂、惨不忍睹的PPT。
日常服饰搭配,不必有时尚总监的品味,不必紧追每季潮流细节,能在各种场合着装都妥帖恰当,已足够让人心生敬意。

优秀和顶尖的区别,可以用80/20法则来解释:优秀是投入20%精力得到80分,顶尖是投入80%的精力去打磨那超越众人的20分。高手相争,看似只在毫厘之间,其实如果按边际效应计算,为获得那毫厘之差所投入的努力又何止数倍。

这篇文章不讨论如何做到顶尖,通往顶尖的路是没有捷径的,要靠天赋和时间堆积出来的。通向优秀的路则不同,短时间内有限的投入就能带来可见的有效产出。这篇文章只讨论如何才能快速在一个陌生领域到达优秀水平。

1
大量搜集资料

如果你在做一个紧急的任务,这个任务涉及的领域你很陌生。最快速上手一个新领域的方式,就是先穷尽你能找到的所有资料
如果你需要出一份专题报告,先搜罗这个专题的所有相关论文和书籍。你不一定需要把所有的付费资料都买回来,很多时候只需浏览目录,看看别人都是从哪些角度切入这个题目,再通过目录标题搜索相关的资料,并且顺藤摸瓜找到更多资料里提及的其他资料来源,已可找到足够丰富的素材。
如果你要装修房子,先大量浏览别人家的装修效果图,找到自己喜欢的风格;收集各种与自己家类似的户型图,看看别人如何利用空间;再看看别人的装修日记,看看装修都有哪些常见的坑。一番研究下来,不出三个月,你也能成为一个小小的行家。

2
寻找现成的最优解

许多人上手新东西的方法是自己先瞎捣鼓一通。当然这没什么不对,只是效率不太高。
比如你想学做一锅白粥,当然可以凭自己喜好随便扔点米和水进锅里,凭感觉爱煮多久煮多久,等烧成锅巴后再研究为什么这次煮得不成功。这符合人类长久以来进化的习惯——在实践中总结经验。
事实上,99%的情况,这个对你而言全新的领域,对别人而言早已是玩剩下的。完全没有必要自己重新实验一番再总结经验,你可以直接套用别人经验总结出来的最佳方案。


你可以在做白粥之前先研究各路大师总结的做粥秘诀,知道米和水的最佳比例是1:10,最适合做白粥的米是圆粒的珍珠米,熬一锅好粥的关键是熬透米心,为了熬透米心你需要提前一晚浸泡大米,在煮粥前用一勺油将米裹上,然后烧一壶滚烫的开水缓慢地冲入米中,这样裹在米周围的油就会将热量吸在米周围,慢火熬了两小时,最后半小时要用勺子不停搅拌,帮助米心融化。

于是,你虽然是第一次下厨熬粥,却能令人惊叹地熬出比做了一辈子饭的妈妈熬的更香更浓见米不见粒的标准粤式好粥。

有人说什么都用别人的最优方案岂不是特别没意思,我这人就喜欢不参考别人的自己创新。连牛顿这样的神级人物都要“站在巨人的肩上”,李白这样的诗仙都会借鉴《黄鹤楼》写“凤凰台上凤凰游”,我们又有什么不能借鉴别人的呢?

创新从来不是从石头里面蹦出来的,参考过现实中所有最佳方案仍感到不满意,在理解原方案的基础上创造出更好的东西,才算真正的创新。如果所谓的原创只是在低水平徘徊,那不叫创新,只能算自娱自乐。

3
依样画葫芦的练习

在你搜罗了大量的资料和最佳实践的案例后,就要开始练习之路了。足够量的练习是达到优秀的必经之路。
练习之初,不要急着发挥你的创造性,请一板一眼,完完全全按照你收集到的最佳方案进行练习。学烘焙,就完完全全按照方子的分量和步骤做;学画画,就完完全全按着样稿一笔一笔地画;学画原型,就完完全全地按照范例一步步地设置。
不要笑,太多人在这一步跌倒,以至于一辈子无缘优秀。老人家常笑孩子“还没学走,先想学跑”,看似浅显的道理许多人却从未明白,总是觉得自己特别聪明,幻想着能一步登天。

如果你真的很扎实地做了前两步功课,就该相信你学习的对象已是目前能找到的最佳方案,人家这么做一定有他的道理,即使你并不懂那道理是什么。只有一板一眼地依样画葫芦,成品出来不如人意时,你才能回溯出自己到底哪儿做的不够好。如果中途发挥各种创意做了稀奇古怪的改动,就很难找到成品不满意的原因了。
觉得自己特别聪明,不需要这样沉闷无聊的练习?弗罗基俄为何让达芬奇画了三年鸡蛋?自己的悟性能否超过这位文艺复兴时代的天才,请再思。

4
修正与总结

大量练习的过程中,如果你自问已经完全按照最佳方案实践,却始终无法达到满意的效果,就要多问几个为什么了。问的方式可以是搜索、找该领域的牛人,或者到相关的领域的论坛跟别人讨论。相信我,你不会是唯一一个遇到问题的,你踩过的坑,前人多半已踩了无数回。

列出练习中发现的问题,认真地研究每一个产生问题的可能性。这是提升水平的关键时期,只有你真正掌握了每一条迈过这些坑的方法,水平才会有质的提升,否则不管投入多少时间练习,都只能在低水平徘徊。

我曾经因为自己做的戚风蛋糕达不到理想的状态,搜罗了网上所有的戚风蛋糕失败原因,买了n本大师级的书看里面的教程,换模具换打蛋器换鸡蛋,每晚做一个戚风蛋糕,测试各种温度、各种转速的打发、各种混拌手势、各式各样的戚风蛋糕配方,终于达到了做戚风蛋糕信手拈来的程度。

在那之后,我的烘焙水平忽然突飞猛进,以前搞不定的各种高难度糕点如马卡龙、意式蛋白霜都变得很轻松。朋友们在烘焙上遇到问题来问我,我竟然每次也能将原因猜得八九不离十。虽然离真正的烘焙大师还十万八千里,可至少达到了“超过周围大部分人平均水平”的程度。

许多人做几次做不好,就将原因归结为“自己根本就不是这块料”。不客气地说一句,大部分时候,水平之低还够不着谈“是不是这块料”的程度,因为根本还没入门呢。

5
结语

所谓的实践出真知,没有理论的实践是瞎忙,没有实践的理论是纸上谈兵,只有学习了理论,用实践验证理论,再用实践修正理论,才会实现真正的“从量变到质变”。

如果足够专注与投入,用了合适的方法,用三个月甚至更短的时间,在一个领域做到比周围大部分人优秀是可能的。更有意思的是,随着这四步变成了习惯,接触一个陌生领域并迅速达到优秀水平的时间会越来越短。

老子说“一法通,万法通”,当获悉了一个领域的奥秘后,其他领域的奥秘之门也会变得轻轻一推就开,哪怕这些领域表面看起来似乎毫无关联。

一站式青年人才职业成长平台