Shared posts

06 Nov 06:48

维基百科过时了吗?

by nonmarking

维基百科是全球访问量第六大的网站。图片来源:shutterstock

维基百科建立之初曾立下“汇集人类所有知识”的豪言,但现在它似乎遇到了一些挑战。自2007年以来,为英文版维基百科服务的志愿者人数已经缩减了三分之一还要多,并且还在持续缩减,而剩下的那些人似乎无力解决阻碍其成为高质量百科全书的种种问题,其中包括内容覆盖面的均匀与否以及质量等问题。

维基百科的运营方式是如此与众不同。首先,运营它的不是一家部门分明的公司,而是一批“群龙无首”的志愿者,这些志愿者在工作中往往还会选择匿名;其次,这家网站也很少为吸引访客而尝试新花样,实际上它在过去十年间几无变化。

这使得维基百科的诸多问题的源头并不难搞清楚:运营网站的志愿者队伍如今更显松散,并且据估计有90%都是男性,运营操作中的官僚文化和社区氛围则将有望扩大维基百科参与度和知识覆盖面的新人们排斥在外。

铁打的营盘,流地飞快的新人

维基百科网站的内容控制权始终掌握在被称作维基人的社区手上,他们并没有传统的权力结构,但为条目的生成和维护开发了精细的工作流程和指导方针。他们唯一与等级制度沾边的是选举“管理员”小组,这些人被赋予了删除文章或暂时封禁其他编辑的特权。(英文版维基百科上现有635名活跃的管理员。)

2005年底,光是英文版维基百科就有约75万个条目,媒体报道和参与度的增加也使得该网站逐渐成为了人们日常生活中的一部分。随着人们贡献的新条目不断增加,编辑们发现监管所有条目质量的任务变得困难起来。而由于维基百科逐渐升高的公众形象和允许任何人匿名编辑的承诺,出现了很多属于蓄意破坏行为的条目更新,一些诽谤内容的不断出现也引发了对众筹模式的百科全书是否可行的严重质疑。

之后维基人做出了回应。最活跃的志愿者们联手推出了一系列全新的编辑工具和极具官僚作风的审批程序来打击恶意编辑行为。他们新开发的软件可以让编辑迅速查阅条目最近的变化,并且可以一键将其驳回或者向作者提出警告。他们还启用了自动化“机器人”来推翻格式不当或很有可能是故意搞破坏的条目变化,同时向违规编辑发出警告。

严厉的新措施的确起了作用,搞破坏的行为得到了控制,恶作剧和诋毁事件也变得更少,维基百科重新稳定下来,内容覆盖范围和质量也持续上升。但那些更严厉的规则和随之而来的多疑氛围也造成了意想不到的后果:它们不知不觉地降低了社区参与度,给维基百科带来了一直持续到今天的麻烦。

刚加入维基百科的新人们难免会在刚开始的编辑中发生错误,但是只求高效不求人情味的编辑机器压垮了他们,剥夺了最起码的乐趣,这让新人留下的概率大大降低。英文版维基百科的活跃编辑数量在2007年一度达到5.1万以上的峰值,之后由于新人供应遭切断,该数字一路下滑。在今年夏天,该网站的活跃编辑只有3.1万。

曾供职于维基媒体基金会(负责支持维基百科的非营利组织)的明尼苏达大学研究生亚伦•哈尔法克(Aaron Halfaker)与其他大学的研究人员共同分析了维基百科的公共活动记录,研究结果描绘出了一个受官僚主义统治的社区。自2007年新管控措施开始实施以来,新人编辑的内容被迅速删除的概率稳步上升,同期,被自动化工具删除的编辑条目比例也呈现增长。不出所料,数据还显示新人在初次编辑条目两个月后仍在为维基百科作贡献的可能性也远远低于以前。

由于未能补充新鲜血液,维基百科偏重技术、西方、男权主题的问题依旧存在。2011年牛津大学的一项研究就显示维基百科上84%有地点标签的条目都是关于欧洲或北美洲的;有关南极洲的条目数量甚至超过了非洲或者南美洲的任何一个国家。图片来源:rnw

亡了羊,却不让补牢

2012年,维基媒体基金会执行理事苏•加德纳(Sue Gardner)希望可以通过改变维基百科的网站来扭转编辑数量的下滑。他们的一个想法是引入“感谢”按钮——效仿Facebook的“赞”按钮。从5月开始,编辑们可以点击该“感谢”按钮来表达对其他人所做的良好贡献的认可。

致力于为新人简化编辑工作的产品经理史蒂芬•沃林(Steven Walling)指出,这是他们第一次获得一个专门用于为个人编辑活动提供积极反馈的工具。沃林现在正在测试的一个想法是,为新人提供有关该做什么的建议并引导他们完成诸如修改文章的简单任务,该举是为了在新人违反规则之后给予他们时间去积累信心。

这些举措看起来也许只是小变化,但维基媒体基金会要推动社区支持更大的调整几乎是不可能的事情,他们曾经在改变文本编辑方式上所做的努力就是最好的例子。

自维基百科创立以来,编辑工作就一直需要使用“维基文本”——一种复杂的、会让新手十分头疼的标记语言。例如,维基百科有关美国的条目的第一句话是下面这个样子的:

经过多年的筹划之后,维基媒体基金会终于推出了可视化编辑器(Visual Editor)——一个隐藏维基文本、提供“所见即所得”编辑功能的界面,基金会本来设想它能很快成为永久的编辑工具。

但在维基人社区里,认为简化编辑流程是浪费时间的人不在少数。很多可视化编辑器的反对者并不认为它会给维基百科带来帮助。“我并不觉得这是基金会要寻找的良方,”网站的高级管理员奥利弗•莫兰(Oliver Moran)指出。跟一部分其他提出反对的维基人一样,他也认为引入可视化编辑器等同于傲慢地放言维基文本将特定的人拒之门外。“看看像Twitter这样的网站,”他说,“人们马上就能熟练使用#、@这样的符号。”他们对可视化编辑器的不满很大程度上还因为它让人感觉基金会热衷于单方面改变这样一个协作性质的项目。

维基媒体基金会将可视化编辑器设为默认条目编辑方式的决定引起了维基人的反感,后者也抱怨该工具存在着漏洞。9月,编辑社区的一项调查总结道,新的编辑界面应当默认隐藏。基金会一开始不同意,但一名由社区选出来的管理员对维基百科的代码进行了更改,从而隐藏了可视化编辑器。基金会不得不作出让步,这意味着该旨在帮助新人的旗舰级产品实际上对新人不可见,除非他们能找到相关账号设置启用该新界面。

被问到维基百科真正的问题是什么时,莫兰称是围绕编著规则和指导方针形成的官僚文化,这些规则和指引多年来已经变得非常复杂,光是解释中立观点(维基百科的五大基本原则之一)方针的页面就含有近五千字,而且有些规则明明已经显得太严厉、太不人性化,却依然没能及时改变。不过无论官僚主义在维基百科的这场阵痛中扮演了什么样的角色,任何想要整顿它的努力都是需要付出巨大代价的,而且这样的整顿必须要由维基人自己来发起,而最活跃的那些志愿者已变得依赖于它们。

维基百科创始人吉米•威尔斯(Jimmy Wales)对于维基百科将陷入颓势的说法嗤之以鼻。但他也认为,要是不能涌入更多兴趣广泛、侧重点各自不同的新编辑,维基百科就无法取得显著的改善。该网站在技术类内容上相当丰富,但在人文类内容上则不尽如人意。他希望可视化编辑器能够帮助实现志愿者社区的多样化,吸引与现有编辑相似但又拥有技术以外兴趣的人群——他称之为“不是计算机极客的极客”。不过他也承认自己担心简化维基百科的编辑工作会等同于承认该项目对非计算机极客没有吸引力。

依旧是最好的百科全书

如今的互联网被社交网络所主导,然而这些网站的参与式文化却与维基百科有着很大不同,也许人们会慢慢不再信奉为更大的福祉而展开在线协作的理念——可正是这一理想推动着早期的维基百科不断发展。图片来源:shutterstock

实际上,大的文化趋势很可能会加大维基百科吸引广大公众参与的难度。纽约大学互动电子传播研究所教授、维基媒体基金会顾问克雷•舍基(Clay Shirky)指出,商业网站已经走上了中央舞台,网络生活已经迁离维基百科这种开放自治的众筹社区。

舍基非常支持过去十年颇受欢迎的一个理念:互联网鼓励陌生人联合起来完成传统组织无法完成的事情。维基百科就是这一理念的有力例证。但是如今的互联网为Facebook、Twitter这样的网站所主导,这些网站上的人们专注于维护个人的、以自我为中心的信息流。除了在大型多人线上游戏等特定场景之外,能共享虚拟空间的机会少之又少。在舍基看来,人们会越来越难以理解要如何为维基百科或者类似的项目做贡献以及为什么要做出贡献。“Facebook是当下最大的参与式文化,但它们的参与模式截然不同。它是基于聚合的而非基于协作的。”舍基说。

加德纳赞同当今的网络不利于自我组织的集体努力,她将其比作失去了公园的城市。“我们将越来越多地时间花在了越来越少的不断壮大的商业网站上。”她说,“我们在网上需要更多的公共空间。”她认为即便存在各种各样的问题,维基百科依旧会是网络上不会消失的少数“公园”之一。

她说的对,维基百科不会消失。维基媒体基金会每年为它筹集的运营资金已经从400万美元增至4500万美元。由于维基百科并没有什么竞争对手,开发者们将继续开发将其内容视作权威事实的服务,普通人也将继续依赖维基百科获取信息。

不过它也许无法逼近其汇集人类所有知识的崇高目标。维基百科的社区创造出了人类文明史上独有的系统和资源,它证明了它可以媲美甚至摧毁百科全书的传统编撰方式,但这个社区也制造出了障碍,让新人难以顺利完成工作,也许我们不应该奢望一群互联网上的陌生人会真正地将知识大众化。今天的维基百科,纵然存在着质量问题,也无力展现世界的多样性,但仍可能是我们能获得的最好的百科全书。

相关的果壳网小组

 

参考文献:MIT TechnologyReview, The Decline of Wikipedia
文章题图:foroconsultivo.org

你可能感兴趣

  1. 维基百科不自由
  2. 吉米·威尔士,维基百科和它的创始人,你绝对不知道的纠结故事
  3. 维基百科上,真相的权重有多少?
  4. 半数用户不知维基百科是非营利的
  5. 游戏《史记》,了解那个年代
  6. 经济学人:维基百科十周年
  7. 平台结合出新招
  8. 维基解密的死亡开关
  9. GNU创始人炮轰Facebook
  10. 志愿者总动员?
  11. “小专精”社交网络,前景如何?
  12. 谷歌知识图谱功能带来的是什么?
28 Oct 05:28

为什么中国伪科学横行?

by 贾鹤鹏

中国在世界上的影响力的确是越来越大了。

这不,中国政府对伪气功大师王林的调查也开始进入国际媒体的视野。这并非绝无仅有。实际上,早几年的“养生大师”张悟本,以及让马云等人大肆推崇的李一道长,都被国际主流媒体报道过。只不过,报道的时机往往是这些大师涉嫌犯罪被捕,或是在主流媒体批判下颜面扫地之时。

层出不穷的“大师”不由得让我们思考,究竟是什么样的土壤能让他们如此活力无穷?何以当中国已经发展为举世瞩目的世界第二大经济体时,还有那么多盲从盲信者对“大师”顶礼膜拜?

国民科学素质欠佳,不是主要原因

有人将这些伪科学大师在中国的出现,归咎为中国国民科学素质欠佳。的确,中国国民整体科学素质确实欠佳,但将此作为伪科学现象横流的唯一或主要原因却有失妥当。

据中国科学技术协会依据国际可比标准设计并组织的第八次中国公民科学素质素养调查结果显示,2010年,中国公民中具有基本科学素养的比例仍然只有3.27%。但对比一下历史上的其他国家,目前中国的公民科学素养与日本(1991年3%)、加拿大(1989年4%)和欧盟(1992年5%)等主要发达国家在1980年代末、1990年代初时水平相当。而即便在1980年代末、1990年代初,我们在西方国家也没有看到这么多层出不穷的“伪科学大师”。

另一方面,中国不光“大师”多,伪科学流言也层出不穷,诸如香蕉致癌、微波炉辐射致病、转基因食品让人绝育等,不一而足。这些流言并不仅仅被老百姓拿来聊聊天或者在微博上耸人听闻一把,还登上正规媒体的版面,包括某些发行量极大、隶属于权威党报的媒体。

仅仅用科学素质低这一点很难解释这些精英媒体也被蒙蔽的现象。因为虽然记者可以犯一些科学常识方面的错误,但新闻信息、特别是主流媒体的信息,在传播过程中本来应该存在多重纠错机制。这么多层纠错机制同时失灵,让那些“香蕉致癌”、“绿豆治病”等错误信息招摇过市,这里面就不仅仅是国民科学素质的问题了。

实际上,科学素质缺失,只是中国社会在科技相关信息流通中所体现出来的劣币驱逐良币机制的一个环节。

信息良币是如何发布的

那么,是什么原因导致在当代中国伪科学的流言四起、大师遍地呢?信息劣币又是如何驱逐良币的呢?

在回答这个问题前,我们先来看看重要的科学、健康信息在西方国家是如何传播的。

在信息发布的源头,主流科学界基本上遵循着“nopaper, no news”的原则,也就是说,值得引起公众关注的科学信息,如果不首先在主流科学期刊上以论文形式发表,是不会拿来与媒体交流的。之所以如此,是因为科学论文在主流期刊上的发表往往要经过同行评议。论文的发表往往代表着其研究内容被同行所认可。

而在论文发表后,有种种政策和机制鼓励西方科学家将成果与公众交流或者向媒体发布。例如美国国家科学基金(NSF)就规定,1%—5%的科研项目经费需要用于包括媒体报道在内的科学传播活动。在这些制度的支持下,西方科学家会将有价值的科研成果写成相对通俗易懂的新闻稿供媒体使用。而这样的新闻稿到了媒体那里,也并非万事大吉。媒体记者不仅仅要对科学新闻的语言表述进行再次编辑,还要请同领域的其他科学家对研究内容做出评价,确保准确性。

但媒体要求发稿时效性该怎么办?西方科学界与科学传播界在多年磨合后,建立了限时禁发制度来解决这一问题。限时禁发(Embargo)指的是学界会事先发布重要研究成果给注册记者以供学习和请同行评议,但媒体不能在论文发表前报道。这一制度解决了新闻时效性与科学知识生产周期之间的矛盾。

在媒体记者按照上述程序完成稿件后,往往还会有非常资深的科学编辑负责把关。如果碰到像“香蕉致癌”这种“重大”问题,媒体通常会请教经常联系的科学家,确保刊登出来的内容的正确性。

上述的科学信息传播机制并不仅限于主动信息发布。当一些并非来自主流科学界的科学性内容确实事关重大、吸引眼球,让媒体不得不报道时,媒体往往要寻求主流科学界的看法,同时在报道中也会明确强调,这些信息并未经过同行评议研究的检验。

2011年美国发生过的一起事件为此提供了鲜明的写照。当时,美国普渡大学一位知名的农业科学家Jon Huber给美国农业部长写信,指出抗除草剂转基因作物与一些植物菌病有关。美国经济作物中的绝大多数都是抗除草剂转基因作物,因此美联社等媒体在报道此事时,引述了多位科学家要求Huber拿出证据的呼吁,但是Huber始终无法提供证据。对此,肯塔基大学作物病原学家Paul Vincelli评论说:“不论Huber说得是对是错,我们都是在谈论极端的论断,最起码也得拿出像样的证据来支持这些论断才行。”

在媒体对这一事件的报道中,没有因为这个消息充满眼球效应而仅仅做单方报道,而是力求采访涉事者的多名同行,反应科学共同体在这方面的主流意见。

另外一个案例也值得一提。2011年11月,美国非常有影响力的消费者保护组织消费者联盟指出,多个品牌的苹果汁砷含量超过了饮用水的健康标准。对此,美国主流媒体普遍进行了报道,但首先没有媒体像中国国内媒体遇到此类事件后使用“苹果汁砷含量超标”这样的醒目标题,大部分都使用“某机构发现苹果汁砷含量如何”这样的表述方式,或在“砷含量”超标这样的标题上打上问号。主流媒体的报道都会引述大学中的第三方专家、果汁协会以及美国食品药品监督管理局(FDA)的观点,后者认为,“超过饮用水标准不等于果汁有问题,因为并没有果汁砷含量的标准”。

在这些事件中,我们可以看到,政府、媒体、科学界以及行业协会,都按照证据支持、同行评议和声音多元化的原则,在向公众发布重要信息的同时,也避免这些信息引起不必要的社会恐慌。

劣币信息驱逐良币

相比之下,中国缺乏的并不仅仅是这些确保信息合理、准确但同时又能反应多元声音的信息流动机制。恰恰相反,我们的整套体系都在促使着恶劣信息驱逐有价值信息。在此过程中,国民科学素质虽然也发挥了一定作用,但并不是决定性的。

检讨西方信息传播机制,我们发现,政府、科学界、媒体、以行业协会为代表的产业界,每一个环节都构成了一个独立的信息生产者,按照基于证据、言责自负、同行评议和观点多元化的游戏规则传播信息。对于积极的信息,这一体制会形成层层背书,不断强化传播效力和信息的权威性;而对于劣质信息,虽然不能杜绝其产生——我们在电影《蜘蛛侠》中看到的邪恶科学家,现实中也有可能会存在——但在这一体制下,劣质信息或不确切的信息可能被层层过滤,其在社会上的流传也会被多重“设防”。

经过这等过滤,一些流言还能对政策的改进起到一定的推动作用,比如上面说的“苹果汁砷含量超过了饮用水标准”,既督促了FDA会同有关科研机构商谈是否需要制定苹果汁砷含量标准,也能提醒公众消费苹果汁时多一个心眼儿,而且还没有造成举国“谈苹果汁色变”的局面。

再看看我们自己的情况,我们就会发现,首先,在信息发布的起点,作为信息生产、供给者的科学界,既缺乏面向公众和媒体沟通的动力与激励,也缺少足够的独立性。媒体抽样研究表明,中国科技类新闻信息的供给者,多年来一直是政府一支独大,科学界自主发布信息少之又少。

中国科学界不仅缺乏始发信息的动力,在应对重大科技、健康与环境事件时,绝大多数时候还都给人以附和政府的形象。中国的政府部门固然社会动员力量极为强大,但以来长期缺乏信息透明的传统和对信息封闭的约束,政府官员又并非全知全能,难以在第一时间意识到需要动员各界力量扼杀信息劣币,再来宣传官员们要把有限的时间、精力投入到确保政治方向的宣传运动上,哪有闲工夫去搭理不过是让升斗小民们多吃点绿豆的养生谬见?

而在中国缺乏信息发布的透明机制,整个社会都充满了官民情绪严重对抗的情况下,科学家往往被形容成政府的附庸,其本来具有的基于科学证据的独立性,以及这种独立性所蕴含的社会中立性往往丧失殆尽。看看在争议问题上载有科学家声音的报道后面动辄数百篇愤怒的网友评论就可见一斑。不要以为这些网民评论多是一些愤青发泄,其所代表的整个社会心态难免不会影响到对记者对不同信源的采用。

而信息劣币——不论是气功大师们的“神迹”还是绿豆保健的“奇效”——则有充分的能量克服中国信息流动机制的种种缺陷。首先,在其发布源头,始作俑者们既有信息发布的动力,又有商业利益的支持,也不会遇到媒体界“无论文,无科研成果”的既定规则的阻击,因为中国媒体压根儿就没有形成这一套基本的规则体系。

这些信息的劣币既然得以发布,往往不需要担心科学家或者权威专家对此“挑三拣四”,因为他们即便知道这类劣质信息很有可能招摇撞骗、贻害民生,但既缺乏动力,也缺乏渠道来仗义执言。

毋庸置疑,缺乏科学素质的大众对此类养生奇迹的拥戴也让它们拥有了市场。但此处不必高估科学素质欠佳的作用,因为公众并不决定这些信息的生产和流动。

那么作为另一个环节的媒体表现如何呢?在基于(论文)证据、多方评议原则的缺失让媒体确保信息准确的能力严重受限的同时,中国官民对立的分化也同样影响了媒体的传播效果。党报媒体虽然在报道信息劣币时往往不会“乱来”,但其在市场上的声音已经非常弱小,它们受命驳斥不良信息时也往往会受困于公众的抵触情绪。

另一方面,很多市场化媒体在把握和消费官民对立情绪的同时,也在恣意挥霍着这种情绪,把一些体现政府管理失误的案例放大数倍,把源于制度惰性的透明度低解读为官员和专家串通一气故意隐瞒。如果说,在一些政治路线或者社会敏感事件上,媒体尚不能尽情消费官民对立的情绪,在事关科技、环境、健康等“边缘”领域,驳斥政府和专家们“真实的谎言”,则往往会带来一片叫好声。

构建良性循环的信息传播体制

这种劣币驱逐良币的信息发布体制,其形成并非一日之功,要改造也并非一日可就。改造的核心,还在于形成畅通的正面信息发布机制,通过信息生产各环节的自律,形成劣质信息的审核机制。

首先,当政者需要在态度上认识到,科学传播是从事科研者义不容辞的责任,这是政府甚至是整个社会信息透明性的重要环节,而并非是处于宣传成绩的需要,也不是为了绥靖民意。在此基础上,应该设立各种奖惩制度来鼓励科技界人士积极投身传播工作者。

其次,尽管传播工作需要借助政府的力量,但这并不意味着着传播科技信息的科研机构仅为当政者的附庸。基于证据、基于科学界基本规则的独立性,是科学机构和科技类信息获得权威性和公正性的基本前提。

第三,媒体机构也应当通过培训以实践磨练,引进和确立已经在西方科学新闻领域确立起来的诸多信息生产规则。这些规则并非仅仅适用于来自科学界的科研成果,也同样可以应用在确保公共利益的调查报道上。同时,消费官民对立情绪决不能以牺牲专业性和新闻操守为代价。

第四,在互联网和社交媒体时代,包括微博民意、网络民意在内的公众对科学和科学争议事件的诉求,背后体现了民众真实的关切和对垄断性权力的抵制,具有相当程度的合法性。它们应该超越于官民对立的现实,为奠定理性的科学与公众的对话奠定基础。

在这些制度安排能得以逐渐确立的同时,既定的公民科学素质培育当然必不可少。但这一过程并非静态的公民学习的过程。公民科学素质恰恰应该伴随着科技类信息发布体制上良币驱逐劣币机制的逐渐建立,而得以逐步的提升。

(本文转自作者科学网博客: 为什么中国伪科学流行?

作者简介

贾鹤鹏,中国科学院《科学新闻》杂志原总编辑、美国康耐尔大学传播学在读博士,长期从事科学新闻的发展和在中国具有开创性的科学传播工作。

 

更多专栏文章

 

相关的果壳网小组

你可能感兴趣

  1. 当科学遭遇网络民主
  2. 当科学遇上传播……
  3. 科学:既偏颇又英明
  4. 传统文化阻碍了中国的科学研究?
  5. 开源科学,该怎么走?
  6. 卫报:年度盘点,2010年的伪科学
  7. 卫报:媒体报道科研进展时很不靠谱
  8. 如果果壳网关闭了评论功能
  9. 学术研究,不偏不倚不容易
  10. 了解科学,就会支持科学了吗?
  11. 怎样做出好的科学研究?
  12. 科学新闻没告诉你的那些事儿
22 Oct 13:12

隐私,信息以及信息安全

by virushuo

这几天网上流传一份号称某个经济酒店开房记录的数据,其原始格式是sql server的backup文件。Leaskh转换了一个csv版本,分享到了网盘上,但遭到了很多人的痛骂。我开始比较惊讶为什么有人会这么激动,后来明白了,就像医生认为生死是自然规律,而普通人则觉得要避讳。人们对于自己越不了解的事情,越喜欢表现出来天然正义的样子。

隐私确实是一个值得讨论的话题,它和每个人密切相关,可惜在信息化如此彻底的时代,多数人除了直觉之外,对此一无所知,甚至连基本的准备都没有。现实世界和科技脱节如此之大的状况并不常见,这让这个话题显得更加有意义。在这篇blog里面我想分享一下我对这个问题的看法,我所知道的现实状况,以及可行的解决方案。

一 信息化改变了什么

在信息化之前,数据的泄漏和传播比今天难的多。传统的纸质文档很难被复制和传播,对比一下早年的"手抄本",很容易就能理解,在信息可以被数字化之前,就算要刻意传播一份信息,也需要巨大的成本和时间, 那时候生产信息和传播的权利基本是被垄断的。

到了现在,一份存储在联网设备中的数据,可以瞬间被复制到世界各处。这从根本改变了传播的方式,也使得保密变得无比困难。这种低成本、速度极快的传播特性,造成了"不可撤回"的特性,即一份数据,一旦流传进公共领域,则无法被撤回或销毁,(这个观点我在几年前写Google的blog中也提到过)进入公共领域之后的数据,就相当于永远存在在互联网上了。

这样就很容易明白,用任何现实世界的东西来比喻信息传播,都是不恰当的类比。现实世界的物体,无法被复制,我拿走你的东西你就没有了。信息可以被无限复制,被复制者并不会失去原有的信息,甚至很多时候被复制者并不知道自己的信息已经被复制过了。

在这种状况下,应该默认凡是以数字化形式存在的数据,都早晚会进入公共领域,即泄密。唯一的区别只在于泄密的时间早晚。所以,正确的心态是默认凡是被数字化的数据都已经是公开的。这样你就可以提前做好准备,当泄密真的出现的时候,可以不那么慌乱。

从非公共领域到公共领域这个界限一旦突破,后面的事情就是不可阻挡的了。所以指责某一个传播者是毫无意义的,这就和政府要立法追究传播超过500次的微博一样荒唐。禁止别人传播一份从公共领域获得的数据,这本质上就是信息管制。这种行为和政府以行政命令要求删贴是一样的,两者的区别只在于是否使用公权力完成,以及如何定义"不良信息"而已。注意,这里所说数据特指已经进入公共领域的,如果是从非公共领域传播到公共领域,那是应该被谴责的,这种行为不仅不道德,而且违法。

好玩的是,反对传播这些数据的人,他们的反对本身也在加速这份数据的传播,并不只是传播全部数据才叫传播,传播关于有这份数据存在的消息同样是传播方式。由于他们的反对,更多人关注了这个事件,并且找到了下载方式。如果真想避免传播,那么看到这种情况最好在心里骂一下,而不要写出来。

二 隐私的进化以及本质

人们对隐私的容忍一直随着时代和开放程度的推移而进化,20年前,刚刚有互联网的时候,照片就算隐私。如果有人把你的照片放到BBS上,人们竟然看到了你真实形象,你会觉得隐私被严重侵犯了。而到了2006年,flickr给照片加了一个People in Photos功能,用户可以方便的在一张照片中标记出现的人的名字。被标记的人往往并不觉得被侵犯了隐私。

现在,照片对于大多数人已经不是那么难以容忍的隐私了。有了Facebook之后,贴照片简直是理所应当的,有了Instagram之后,你随时可能被别人拍下来,贴到一个任何人都可以看到的地方。可见关于隐私的定义是一直在变化的。

到底什么才是最重要的隐私呢?我认为是关联到一个物理的人的办法。比如我获取了一堆网站访问数据,如果我只知道创建这些数据的ip地址,这不算得到了他人的隐私,而一旦我知道了当时使用这个ip的物理的人,用这种办法把访问数据和这个人连接起来,这时候这些数据就变得非常敏感了,这时候这些数据和链接关系就成为了隐私。

我非常能理解人们对于身份证号泄漏的担心,但号码本身其实并没有任何意义,真正的危害在于现实社会有很多资源是关联在身份证号上的。这也就是为什么人们不再担心照片这种隐私,而担心身份证号,因为后者关联了更多的重要信息。

在恐惧身份证号被泄漏的同时,很少有人会考虑一下,为什么我们需要把这么多信息关联到一个号码上。比如说,为什么办一个手机卡需要身份证?为什么住个酒店也需要?为什么买张火车票也需要?为什么去网吧上网也需要?为什么买把菜刀也需要?

使用带有照片的官方身份证明时,主要目的是证明物理的人到底是谁。比如用来登机和安检的时候,这时候需要确认身份是正常的,但为什么上个网,住个店也需要呢?这两种只是普通的商业活动,付钱就可以完成交易,为什么关心人的真实身份呢?在商业活动中,多数情况下都可以使用间接的验证方式,比如利用事先约定的预订号,或者电话号码,或者信用卡号码完成,但现实中,至少在中国,往往必须非身份证不可。这到底是为什么?

答案是政府对身份信息的极度渴求。这不仅仅是中国的问题,而是个世界性的普遍问题。

如果不是这种渴求,那么能把信息链接到物理的人的机会就会少的多。如果住酒店不需要提供身份证号,只需要验证一下订房所用的信用卡或者订单号,那么也就不会有这次的泄漏事件。

三 更危险的数据

现实中被收集的数据远远多于基本的身份信息,比这更危险的数据多的是。我一直觉得如同定时炸弹一样的信息包括:

  1. 电子商务网站的购物历史记录
  2. google的搜索历史
  3. 网站的浏览记录
  4. 手机的基站漫游历史数据
  5. 铺天盖地的摄像头记录
这些数据可不是这次泄漏的身份证号、住址这种静态信息,而是关系到人的行为记录。得到这些数据,经过一些计算,往往能挖掘出来你自己都不知道的东西。相比之下,这次泄漏的东西简直算不上隐私,一点都不值得担心。

我相信这些信息除了有关部门掌握之外,至少还有一部分同样在某些地下渠道流传,某一天他们就会突然曝光在所有人面前。每个人都应该认真想想这一天到来的时候怎么办。

最可怕的事情是你在不同地方的数据被汇总到一起,并且用于计算。这将计算出整个人的生活轨迹,到这种状况才是毫无隐私可言。现在连买个预付费手机卡都需要身份证,将来出现这种情况我也毫不惊奇。

donttrackus这个网站非常形象的解释了在现在的网络条件下,网络广告商是如何定位一个人的。对这类数据的收集时刻都在发生,这些数据可比身份证号码重要多了,关心的人反而不多。

四 对策和希望

很诡异的,这次对leaskh骂的最狠的那些人,恰好是最不注重隐私保护的那个群体,他们不仅仅是不注重,而且在这方面缺乏基本知识。因为只要对这种状况略有所知,也不会认为身份证号和地址是多大的事,他们举出的那些仇家利用这些信息报复之类的例子更是可笑,如果真想知道一个人的身份证信息和电话,一般花几十块钱就能轻松买到。

前面说过,事情的根本在于身份信息的滥用和过分的存储,在这种情况下,信息必然会泄漏。我们当然希望没有任何信息被泄漏,但在现实中,这是无法保证的。所以指责传播已经泄漏信息的人是没有意义的,更算不得解决方案,除非有办法让全世界所有人都不这样做,这也同样不可能,就算有严格的法律,仍然会有人愿意冒险,何况现在根本没有像样的法律规范这种行为。所以,更好的办法是理解,并且接受这个事实。听起来很残酷,但这就跟北京的空气状况一样,已经是无法更改的现实了。

为了避免我前面所说的最可怕的状况出现,有一些对策可用。其中最根本的解决问题方式我们没法直接做到,只能间接推动的,另外一部分是自己就可以做到的。列在这里:

  1. 目前基于单个号码的身份验证体系不适合信息社会,应该尽早改用公私密钥方式。这不是我们能决定的,就算是美国也没能到这一步,只能尽量呼吁。
  2. 商业机构应该尽量避免直接关联身份证号码,至少做到验证了人的身份之后不存储或尽量短时间存储。这也不是我们能改变的,只能尽量呼吁。
  3. 充分理解社会规则,并灵活应用。比如有人认为 不登记身份证就没办法住酒店,其实用户口本也可以。买火车票机票,护照、港澳通行证都可以用。当然这些也属于相对敏感的信息,但关联不同证件的能力目前应该还只有少数人能做到。灵活组合这些证件的应用模式,能在数据大规模泄漏时有效降低危害。
  4. 准备不同手机号码应用于不同场景,使用voip工具做到这一点成本更低,也更方便。
  5. 仔细阅读 http://donttrack.us/ 理解网络广告是如何收集你的隐私和定位你的。并且按照里面的建议处理你的浏览器。
  6. 扔垃圾的时候把快递单和信封上的信息用刀刮掉。
  7. 面对无处不在的摄像头,和识别率已经极高的面部识别系统,学会cvdazzle化妆方法
如果你真的关心这个领域发生的事情,仔细去思考应该能想到更多要注意的事情。不过我想多数人只是骂骂人发泄一下而已。

五 泄漏的信息与权利平衡

我支持传播已经泄漏的信息。因为信息的价值在于独享,秘密只有被少数人知道才成为秘密。一旦人人皆知,就不再是秘密,也不再有价值。所以加速传播被泄漏的信息,反而会降低对当事人的伤害,并且有益于整个社会群体。

对于个人来说,每个人都需要尽早知道自己的信息是否已经泄漏,并作出对应的解决方案。如果你不知道自己信息已经泄漏,而其他人知道,那么危害就很大,比如可以用来敲诈,也可以用来对你的亲属行骗。用更方便查看的格式,更快的传播,有利于人们确认自己的信息泄漏状态。

当所有数据人手一份的时候,每个人之间会形成权利平衡,即,你可以查阅我的信息,我也可以查阅你的。这比只有单方面拥有权利更加可靠,也可以降低危害。

这当然不是最好的办法,但这是现实条件下瑕疵最少的办法。

毫无保留的传播这些信息的人是友好的,因为他们本可以保持私有,用来获利。比如去做个查询信息是否泄漏的网站,这还能通过流量赚到广告费。(这次已经出现了好多个这种网站了)。直接毫无保留的放出全部数据的意义在于避免了进一步诈骗发生的可能性,这就是信息平等之后的好处。

举个例子说明吧。如果获得这次泄漏的身份信息的人,不直接提供全文下载,而是做一个网站,让你输入你的身份证号和电话查询是否泄漏,这就能成为一个新的骗局,大量本来不在泄漏范围内的人会主动提供自己的身份信息用来查询,最终被记录下来,造成新的泄漏。

甚至在没有发生真正的信息泄漏之前,都可以利用这种方式获得敏感信息。比如故意传播出某类信息被泄漏的消息,然后提供一个查询网站,把所有来查询的人的数据都记录下来。所以,在拿到你自己可以查询的全部数据之前,不要相信任何传说或者任何人。

除此之外,全部数据的流传也对于追查事情的起源有帮助。不同的人根据自己的知识,可以通过数据格式、范围、特征等等猜测泄漏的方式,这些碎片的线索组合在一起,就有可能拼凑出泄漏的方式和起源,以及系统的漏洞等。如果没有大规模的全部数据的泄漏,相信没有厂商会承认泄漏的原因是自己的平台吧。

很难相信特定的人或者组织可以完成以上这些工作,把全部数据放出来,通过群体的智慧来保护群体更可靠。这次泄漏的数据由最早风传的开房记录,到最后可以被确认是酒店内wifi认证的信息,正好可以说明这一点。

更有意思的是,正是因为这份数据被传播开,人们才有机会证明其中的数据是真实的。这又形成了另外一个驳论,即:对于二次传播者,如果不传播它,就无法证明其中真实数据的比例,也无法知道传播的是否是带有隐私性质的数据。

六 总结

信息安全和隐私是这个时代不可避免的威胁。解决这个威胁,不是靠情绪化的谩骂和煽动,而是需要确实可行的解决方案。涉及现实世界、政府、立法等诸多层面,这个问题的完美解决如此的复杂,并且需要漫长的时间。更有效的个人保护方式是先调整好心态,清楚的知道什么状况下信息有可能被泄漏。

当你每一次提供个人信息的时候,都应该先考虑这些信息泄漏之后会对你造成什么危害,并且想好处理办法。如果会造成不可避免的危害,而且你又想不出办法避免提供这些信息,那么这件事最好干脆不要做。

就和前一段突然冒出一些平时对版权毫不关心的人开始关心抄袭和临摹一样,这次也同样冒出来很多对隐私和信息安全毫不关心的人指责一个只不过转换了一下数据格式的程序员侵犯了他们的隐私。这是多么荒唐的事,对照我前面提出的解决方案,如果大部分事情都没做到,那么在信息时代你实际上是在裸奔的。

如果一个人不敢指责过分收集信息的政府,不去指责存储这些本来不需要长期存储信息的商家,又没法找到真正盗取这些信息的人,只去指责一个转换了一下数据格式,以利于人们查询和研究的程序员,这种行为显得懦弱又无知。在我看来,这就像一个裸奔的人,拼命保护着身上仅有的一条的领带,并且认为自己衣着整齐。

ps: 两年前密码泄漏的时候,我也写过一篇主题相近的blog: 《密码泄漏和黑天鹅事件》,其中也提到了"与其说是安全问题,不如说是出乎多数人的意料造成的恐慌"。

ps1: 想起来 @mathena 提起了比美国更严格的,加拿大的 Personal Information Protection and Electronic Documents Act 把链接补充在这里,有兴趣可以看看。

我读过之后,认为这份文档主要规范了信息采集的行为,交互规范,和保护规范。试图采集个人信息的机构需要依法进行,并且依法保护采集到的数据安全,如果泄漏要承担责任。但根据这份法规,就算这事情发生在加拿大,二次传播行为也没法被认为违法,因为采集,泄漏,交换的都不是他,他只是得到了泄漏的结果,重新再发布而已。 我很同意这份法规的主旨,即,任何机构不应该过分收集个人信息,如果非要收集,必须依照一个可行的规范进行和加以保护。虽然这并没能从根本解决问题,但至少让采集数据的行为变得更少和更慎重,也算解决了一部分基础问题,是有意义的。

我不得不再重复一次,改变认证体系/减少收集的数据/减少存储量和时间,这才是解决这问题的办法,加拿大的法案做到了后两件事。而去攻击那些传播已经泄漏的信息的人,对事情没有任何帮助,立法惩罚传播已经泄漏信息的人,同样没有任何帮助。

18 Oct 13:22

[小红猪]真理也衰变——常识的半衰期

by 小红猪小分队

本文作者:小红猪小分队

本文为第96期小红猪抢稿译文

合作翻译:山寨盲流、Rachel

【在图书馆里,物理学方面的书籍比心理学方面的书籍在书架上待得更久】

其实我们深信不疑的事情中很大部分是会过期的,不过好在我们能够预测到事实的保质期。

我的祖父在牙科学校的时候,学习了人类细胞染色体数目的知识。不过这项知识有点问题。

1912年,生物学家们观测到了人体细胞核,并数出48条染色体(实际上是46条,不要怀疑你对自己初中所学的记忆),这项成果很快被写进我祖父所学习的教科书中。1953年,著名细胞生物学家利奥·萨克斯(Leo Sachs)甚至说:“人类有48条二倍体染色体,这现在已经可以视为一个既定的事实了”。

到了1956年,蒋有兴(Joe Hin Tjio)和阿尔伯特·莱文(Albert Levan)正在试验一种观察细胞的新技术。他们数了一遍又一遍,直到完全确定自己没有错。当他们宣布自己的结论时,其他研究人员都表示自己也曾得到同样的数字,却以为是自己错了,蒋和莱文只观察到46条染色体,而他们的结论是正确的。

科学就是不断接近真理的过程,所有理解这一点的人都明白在发展过程中不断更新知识才是科学进步的正道。然而,这个过程有时会令人困惑和不安。吸烟就从曾被医生推崇转变为被认为危害健康。吃肉曾被认为是有益的,后来又被说成是有害的,后来又变成有益的;现在又变成一个个人观点问题。女性应该接受乳房X光检查的年龄也提高了。我们曾以为地球是宇宙的中心,后来又发现不过是宇宙边缘的一颗行星。我现在已经搞不清楚到底红酒对我有没有好处了。

事实证明,在纷繁杂乱之中还是隐藏着秩序的。从我自己的专业科学计量学——也就是对科学的定量研究——领域中传来了喜讯,从统计之中能够找到变化的规律,我们甚至能确定事实随着时间推移衰变得有多快。这意味着,在知识不断变化的世界中,我们无需手足无措。有些我们曾经以为正确的事终将被颠覆,不过了解这其中存在规律,有助于确定那些现在看起来合情合理,未来却终将失效的真理。

显然,随着坚持不懈的研究工作和不断涌现的新发现,科学知识将不断更新,不过直到近年才开始有人关注这种变化发生的速度有多快。尤其是很少有人尝试去计算,我们的认知由对变错的时间有多长,或是这一认知被更接近真理的认知所取代的时间有多长。

最早研究这种知识巨变的组织中,有法国巴黎萨伯特慈善(Pitié-Salpêtrière)医院的一组研究人员。蒂埃里·波拉德(Thierry Poynard)和他的同事从自己专业的医学领域着手:主要是肝硬化和肝炎这两种肝脏疾病。他们搜集了五十多年来这两方面的500篇论文,交给专家小组检查。每名专家负责指出该论文是真实的、过时的还是已被推翻的(《内科医学年鉴》,第136卷,第888页)。

通过这样的方法,波拉德(Poynard)和他的同事们能够创建简单的图形来显示在过去几十年里保持正确的论文数量(见图)。他们发现了惊人的现象:保持正确的论文数量明显在衰减。而且,查看图形中的曲线跌破百分之五十的位置,就有可能得到这一领域的事实的“半衰期”的明确数字:45年。

这方面的信息从本质上而言可以比拟为一种放射性物质。肝硬化或肝炎的医学知识每过45年就有一半过期或被推翻。

当然这个半衰期的比喻,与放射性物质的属性并不完全相同。首先,目前检验的时间跨度还不足以确定衰变是否真的按指数速率发生。同时,在一个领域的不同发展成熟阶段,半衰期也不是恒定的。实际上,随着医学从一门手艺发展到一门科学,知识衰变的速度必然改变了。尽管如此,半衰期仍然可以看作思考知识衰变问题的一个有用的工具。

当然,就如同无法预测具体是哪一个放射性原子将要衰变一样,我们也无法预测具体是哪一篇论文将被推翻,不过我们可以观察总体的变化,找到整个学科随时间变化的规律。上述关于肝硬化和肝炎的研究结果与早先一个外科手术信息多久会被推翻的研究结果极其相似。两位澳大利亚外科医生发现在这一学科领域,每45年也有一半的知识被推翻。(《柳叶刀》,第350卷,第1752页)

不幸的是,召集一个专家小组来梳理所有过去的科学结论是不现实的。因此我们必须牺牲精度,以便相对较快地检查很多学科。一个简单一些的方法是检验论文引用的生命周期,这是科学王国的硬通货,也是论文影响力的度量衡。

要了解论文中事实的衰变,我们可以通过该领域中平均每篇论文要过多久才没有人再引用来衡量。无论(不再被引用)是因为一篇论文不再令人感兴趣,不再有用或者是被新的研究驳倒,总之它不再是一篇有生命力的科学文献。某一领域一半的论文不再被其他文献引用,所经过的时间也算是一种半衰期。

通过这种方法,我们就可以开始粗略地估算许多领域的(知识的)半衰期。例如,对于《物理学评论》这一系列物理学领域最重要的期刊的一项研究发现,物理学(知识)的半衰期大约是10年(arxiv.org/abs/physics/0407137)。

不同的出版物形式也会拥有不同的半衰期。2008年,波士顿西蒙斯学院(Simmons College in Boston)的唐蓉(Rong Tang)研究了不同学科的学术书籍,发现物理学的半衰期(13.7年)大于经济学(9.4年),而后者又大于数学,哲学和历史学(《大学与研究机构图书馆》第69卷,第356页College & Research Libraries, vol 69, p 356)。

而期刊上刊登的论文又与书籍中的情况相反,期刊上自然科学的前沿理论淘汰起来比社会科学更快。这大概是因为自然科学的重复性实验得出来的数据更直接,而社会学的数据比较乱。

所以对于不同领域计算出来的(知识)半衰期而言,要想下一个明确的结论,还需要谨慎为之,因为所考虑的影响因素和计算(知识的)寿命的算法都不相同。但毋庸置疑的是,不同知识的有效期是不同的。这令人不禁怀疑,是否所有那些我们曾用以探索世界的常识都需要从这个角度加以重新认识。毕竟认识到某些知识将比其他知识更新得慢,这对我们处理信息的方式将具有重大影响——尤其是要了解哪些知识更需要留意。

理论频谱

我们试着将理论按照其变化的快慢排序。最左端是变化最快的,比如昨天股市以多少点收盘或是全球天气预报,这些都是不断变化的。可以说,由于变化太快,这些领域的半衰期极短。

最右端则是变化极慢的理论,实际上这些理论几乎不变。要单独举例子的话,“地球上有多少块大陆”就属于这一类;而古希腊人就几何学所撰写的诸多文献可以看作是一个群体的例子。

中间部分的理论在变化,但变得不那么迅速。这些理论可能以十几年、几十年甚至人一生的时间跨度改变,我把这些理论称为“中理论”。由于变化较慢,很多人可能无法预见到它们也有“老”的那一天。

营养方面的知识就是一种“中理论”。比如在美国,我们原本把食物分为四类——肉类、乳制品、谷物/面包以及水果/蔬菜。但现在我们把食物分为五类。不仅如此,原本的食物金字塔也经过了好几次“翻修”。类似于我们该不该吃脂肪含量高的食物、该不该吃碳水化合物等问题的答案也经历了长期的变化。

另外一种“中理论”要属我们该如何照顾婴儿这一问题。婴儿该仰睡还是趴着睡,孕妇抽烟喝酒是否安全,这些问题的答案一代和一代都不同。

“中理论”无处不在,意识到这些理论的存在对我们意义重大。研究显示,对于自然界的渐变,我们往往浑然不觉。

当然,也不是说我们见到什么都要推翻。比如政府注资的研究建议人们从事某种利于健康的活动,我们不该因为这种理论也有可能终将过时,就直接否定了这一活动。将精华与糟粕一概摒弃的做法是愚蠢的。只不过我们要有心理准备,如果以后这一建议真的过时了,也不该震惊。

幸运的是,我们渐渐接纳了理论变化这一事实:很多医学院校的老师都会告诉学生,五年之内他们所学的知识里有一半都会不适用,而且老师也不知道到底是哪一半会不适用。

幸好理论不会无缘无故“过期”。尽管总在变化,但不可思议的是,这些变化是有规律可循的。如果我们认识到这一点,就能更好地适应周围快速变化的环境。

“微不可见的变化”

有人问英国经济学家约翰﹒梅纳德﹒凯恩斯(John Maynard Keynes)在货币政策上为何转变立场,他自编了一句流传至今的名言:“识时务者为俊杰,换做是你又如何?”通常我们没法像凯恩斯一样改变想法,尤其是变化很慢的时候。

人类认知有一种缺陷叫做改变基线综合征。这个词源自加拿大温哥华英属哥伦比亚大学的海洋生物学家丹尼尔·波利(Daniel Pauly),他用这个词来形容人们对鱼群数量的观念变化。17世纪,欧洲人开始在纽芬兰及科德角沿海海域捕鱼,那个时候鱼类资源极为丰富。但不到200年,很多鱼种就灭绝了。人类怎么能容忍这样的悲剧发生呢?波利解释道,这是因为每一代渔业学家设定的基线都是当时的鱼类数量以及种类组成,然后再用这一基线去估测变化。结果就是一代又一代人的基线在慢慢改变,鱼也随之慢慢灭绝。

之后,改变基线综合征从跨越代际发展成了在一代人之内就会发生。多年之间周围环境慢慢地变化,而人往往视而不见。2009年,有研究者调查英格兰北部居民对于近二十年当地鸟群数量的认识,发现三分之一以上的人都没发觉这一当地最常见物种的变化(《环保通讯》(Conservation Letters),第2卷,第93页)。

这说明我们一生中可能在不断地设定新基线,因此很难察觉渐变。这无疑是生态学以及其他领域的灾难。

“转瞬即逝”

人们总是错误地认为头脑中的某些知识是绝对正确的,尤其是小时候在书本中学到的(见正文)。我小时候喜欢研究恐龙,那时候一直以为“雷龙”这个名字是正确无误的。但后来才发现根本没有雷龙。

这个四只脚、脖子长长、脑袋小小的蜥臀目恐龙很具代表性。它真正的名字是迷惑龙。这是为什么呢?1978年,两名古生物学家发现一直被认定为雷龙的骨架,它的头部属于另一种食草恐龙。而身体却属于迷惑龙。雷龙从未存在。

在此之后,科学家开始宣传这一新名字,这个名字也渐渐流传开来。尽管如此,雷龙这一叫法在科普及畅销书中还继续存留着。毫无疑问,编写书籍的人一定忘记了这一事实已经过了“适用期”。

10 Oct 16:20

“适量饮酒”真的有益健康吗

by 云无心

本文作者:云无心

Simple wine wallpaper

“适量饮酒有益健康”这个说法不仅仅在酒类营销中经常强调,许多医学、营养和科普界人士也经常提到——而且,他们还真能摆出许多科学研究文献来支持这种说法。有着许多“科学研究表明”,这种说法真的靠谱吗?

这个说法大致起源于1991年。在美国的一个电视节目中,有人提出了一个“法国悖论”——法国人的饮食、运动等生活方式并没有多健康,他们的心血管发病率却不高。节目中给了一个解释:法国人喝葡萄酒多,葡萄酒可能有利于心血管健康。

这个猜想很有“养生大师范”,不过推理不靠谱只能说明它的理由不充分,却并不能否定它。为了解释“法国悖论”,各国科学家们进行了大量研究,总共调查过的人数加起来超过百万,时间长的可达一二十年。在流行病学调查领域,这可以算得上数据最丰富的研究之一。

结果显示这种猜想还真不离谱。在这些研究中,科学家们把心血管疾病发生率以及它导致的死亡率与喝酒的量对比,发现“适量饮酒”的人群中二者都比完全不喝酒的人群要低。当然,喝酒比较多的人群中,这二者又升高了。而且,不仅仅是葡萄酒,啤酒和白酒也有类似的结果。

当然,作为流行病学调查,往往会受到其他“混杂因素”的影响。比如,经常喝葡萄酒的人,收入往往比较高,因而医疗条件等也要好一些。而是否喝酒可能还伴随着其他的生活方式,比如蔬菜、水果、锻炼身体等等。在大型调查中,可以用统计工具剔除这些因素的影响,而尽可能得到“适量饮酒”对心血管健康的影响。

一般的结论是,在剔除了科学家们能够想到的混杂因素之后,“适量饮酒”对心血管健康的积极作用减小了,但并没有完全消失。也就是说,比起不喝酒的人,每天喝一点酒的人心血管疾病的发生率以及它导致的死亡率依然要低一些。

为了解释这一现象,有学者提出了一些假说。比较有名的一个是葡萄酒中的抗氧化剂比如白藜芦醇。不过,动物试验又发现,要通过喝葡萄酒来达到白藜芦醇起作用的剂量,人会先被撑死。另一种著名的假说是酒精有助于增加血液中的“好胆固醇”,而好胆固醇的增加有助于降低心血管疾病的风险。有一些试验证据似乎支持这种假说,“适量饮酒有益心血管健康”也就得到了比较多的认同。

但是,心血管疾病并非危害健康的唯一因素,“适量饮酒”会不会对于其他的健康因素也有影响呢?

对其他方面的影响也有过许多研究。虽然不象对心血管疾病的影响那么深入,但汇总起来也不少。2004年,意大利学者发表了一项荟萃分析,汇总了过去三十多年中发表的喝酒与肿瘤等14种疾病以及受伤情况的流行病学调查。

这项荟萃分析在科学文献数据中找到了几百项研究,其中有156项质量较高,被汇总起来进行统计分析,涉及到的总人数超过了11.6万人。

在这些研究中,饮酒量与心血管疾病的关系与通常的结果很一致:与不喝酒的人相比,每天喝20克酒精的人冠心病的发生率低大约20%。

但这是“适当饮酒”唯一降低的疾病发生率。在其他疾病中,即使是每天喝25克酒精这个“适量”,也会导致多种疾病的风险明显增加,比如口腔癌和咽癌的风险增加82%,食道癌增加39%,喉癌增加43%,乳腺癌增加25%,原发性高血压增加43%,肝硬化增加1.9倍,慢性胰腺炎增加34%。其他的结肠癌、直肠癌、肝癌也有小幅增加。

如果饮酒更多的话,那么这些疾病的风险就大大增加。比如,如果每天喝50克酒精(大致相当于2两50度的白酒),那么口腔癌和咽癌的风险将增加2.1倍,食道癌、喉癌和原发性高血压的风险都会增加一倍左右,乳腺癌增加55%,肝硬化增加6.1倍,慢性胰腺炎增加78%,出血性中风增加82%,而肝癌的增加也有40%。

与饮酒与心血管疾病风险的研究相比,饮酒与其他疾病风险的研究还比较有限。虽然这项荟萃分析中涉及到的人数超过了11万,但具体到许多疾病上,研究数与涉及的人数也都不算多。这就使得结论的代表性比较有限,有很多调查甚至可能只对具体的地区与人群有效。

但是,这项荟萃研究给了我们两点很重要的信息:第一,饮酒对健康的影响是多方面的,不应该仅仅考虑对心血管疾病的影响——虽然酒类营销很喜欢这样宣传;第二,饮酒对癌症风险的影响,没有发现“安全阈值”的存在——也就是说,只要喝了,就会增加风险。

关于本文

本文已发表于《瞭望东方周刊》

题图出处:http://img.wallpapergang.com/

02 Oct 12:03

Double-Checked Locking is Fixed In C++11

The double-checked locking pattern (DCLP) is a bit of a notorious case study in lock-free programming. Up until 2004, there was no safe way to implement it in Java. Before C++11, there was no safe way to implement it in portable C++.

The pattern gained attention for the shortcomings it exposed in those languages, and people began to write about it. In 2000, a group of high-profile Java developers got together and signed a declaration entitled “Double-Checked Locking Is Broken”. In 2004, Scott Meyers and Andrei Alexandrescu published an article entitled “C++ and the Perils of Double-Checked Locking”. Both papers are great primers on what DCLP is, and why, at the time, those languages were inadequate for implementing it.

All of that’s in the past. Java now has a revised memory model, with new semantics for the volatile keyword, which makes it possible to implement DCLP safely. Likewise, C++11 has a shiny new memory model and atomic library that enable a wide variety of portable DCLP implementations. C++11, in turn, inspired Mintomic, a small library I released earlier this year which makes it possible to implement DCLP on some older C/C++ compilers as well.

In this post, I’ll focus on the C++ implementations of DCLP.

What Is Double-Checked Locking?

Suppose you have a class that implements the well-known Singleton pattern, and you want to make it thread-safe. The obvious approach is to ensure mutual exclusivity by adding a lock. That way, if two threads call Singleton::getInstance simultaneously, only one of them will create the singleton.

Singleton* Singleton::getInstance() {
    Lock lock;      // scope-based lock, released automatically when the function returns
    if (m_instance == NULL) {
        m_instance = new Singleton;
    }
    return m_instance;
}

It’s a totally valid approach, but once the singleton is created, there isn’t really any need for the lock anymore. Locks aren’t necessarily slow, but they don’t scale well under heavy contention.

The double-checked locking pattern avoids this lock when the singleton already exists. However, it’s not so simple, as the Meyers-Alexandrescu paper shows. In that paper, the authors describe several flawed attempts to implement DCLP in C++, dissecting each attempt to explain why it’s unsafe. Finally, on page 12, they show an implementation that is safe, but that depends on unspecified, platform-specific memory barriers.

Singleton* Singleton::getInstance() {
    Singleton* tmp = m_instance;
    ...                     // insert memory barrier
    if (tmp == NULL) {
        Lock lock;
        tmp = m_instance;
        if (tmp == NULL) {
            tmp = new Singleton;
            ...             // insert memory barrier
            m_instance = tmp;
        }
    }
    return tmp;
}

Here, we see where the double-checked locking pattern gets its name: We only take a lock when the singleton pointer m_instance is NULL, which serializes the first group of threads that happen to see that value. Once inside the lock, m_instance is checked a second time, so that only the first thread will create the singleton.

This is very close to a working implementation. It’s just missing some kind of memory barrier on the highlighted lines. At the time when the authors wrote the paper, there was no portable C/C++ function that could fill in the blanks. Now, with C++11, there is.

Using C++11 Acquire and Release Fences

You can safely complete the above implementation using acquire and release fences, a subject I explained at length in my previous post. However, to make this code truly portable, you must also wrap m_instance in a C++11 atomic type and manipulate it using relaxed atomic operations. Here’s the resulting code, with the acquire and release fences highlighted.

std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;

Singleton* Singleton::getInstance() {
    Singleton* tmp = m_instance.load(std::memory_order_relaxed);
    std::atomic_thread_fence(std::memory_order_acquire);
    if (tmp == nullptr) {
        std::lock_guard<std::mutex> lock(m_mutex);
        tmp = m_instance.load(std::memory_order_relaxed);
        if (tmp == nullptr) {
            tmp = new Singleton;
            std::atomic_thread_fence(std::memory_order_release);
            m_instance.store(tmp, std::memory_order_relaxed);
        }
    }
    return tmp;
}

This works reliably, even on multicore systems, because the memory fences establish a synchronizes-with relationship between the thread that creates the singleton and any subsequent thread that skips the lock. Singleton::m_instance acts as the guard variable, and the contents of the singleton itself are the payload.

That’s what all those flawed DCLP implementations were missing: Without any synchronizes-with relationship, there was no guarantee that all the writes performed by the first thread – in particular, those performed in the Singleton constructor – were visible to the second thread, even if the m_instance pointer itself was visible! The lock held by the first thread didn’t help, either, since the second thread doesn’t acquire any lock, and can therefore run concurrently.

If you’re looking for a deeper understanding of how and why these fences make DCLP work reliably, there’s some background information in my previous post as well as in earlier posts on this blog.

Using Mintomic Fences

Mintomic is a small C library that provides a subset of functionality from C++11’s atomic library, including acquire and release fences, and which works on older compilers. Mintomic relies on the assumptions of the C++11 memory model – specifically, the absence of out-of-thin-air stores – which is technically not guaranteed by older compilers, but it’s the best we can do without C++11. Keep in mind that these are the circumstances in which we’ve written multithreaded C++ code for years. Out-of-thin-air stores have proven unpopular over time, and good compilers tend not to do it.

Here’s a DCLP implementation using Mintomic’s acquire and release fences. It’s basically equivalent to the previous example using C++11’s acquire and release fences.

mint_atomicPtr_t Singleton::m_instance = { 0 };
mint_mutex_t Singleton::m_mutex;

Singleton* Singleton::getInstance() {
    Singleton* tmp = (Singleton*) mint_load_ptr_relaxed(&m_instance);
    mint_thread_fence_acquire();
    if (tmp == NULL) {
        mint_mutex_lock(&m_mutex);
        tmp = (Singleton*) mint_load_ptr_relaxed(&m_instance);
        if (tmp == NULL) {
            tmp = new Singleton;
            mint_thread_fence_release();
            mint_store_ptr_relaxed(&m_instance, tmp);
        }
        mint_mutex_unlock(&m_mutex);
    }
    return tmp;
}

To implement acquire and release fences, Mintomic tries to generate the most efficient machine code possible on every platform it supports. For example, here’s the resulting machine code on Xbox 360, which is based on PowerPC. On this platform, an inline lwsync is the leanest instruction that can serve as both an acquire and release fence.

The previous C++11-based example could (and ideally, would) generate the exact same machine code for PowerPC when optimizations are enabled. Unfortunately, I don’t have access to a C++11-compliant PowerPC compiler to verify this.

Using C++11 Low-Level Ordering Constraints

C++11’s acquire and release fences can implement DCLP correctly, and should be able to generate optimal machine code on the majority of today’s multicore devices (as Mintomic does), but they’re not considered very fashionable. The preferred way to achieve the same effect in C++11 is to use atomic operations with low-level ordering constraints. As I’ve shown previously, a write-release can synchronize-with a read-acquire.

std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;

Singleton* Singleton::getInstance() {
    Singleton* tmp = m_instance.load(std::memory_order_acquire);
    if (tmp == nullptr) {
        std::lock_guard<std::mutex> lock(m_mutex);
        tmp = m_instance.load(std::memory_order_relaxed);
        if (tmp == nullptr) {
            tmp = new Singleton;
            m_instance.store(tmp, std::memory_order_release);
        }
    }
    return tmp;
}

Technically, this form of lock-free synchronization is less strict than the form using standalone fences; the above operations are only meant to prevent memory reordering around themselves, as opposed to standalone fences, which are meant to prevent certain kinds of memory reordering around neighboring operations. Nonetheless, on the x86/64, ARMv6/v7, and PowerPC architectures, the best possible machine code is the same for both forms. For example, in an older post, I showed how C++11 low-level ordering constraints emit dmb instructions on an ARMv7 compiler, which is the same thing you’d expect using standalone fences.

One platform on which the two forms are likely to generate different machine code is Itanium. Itanium can implement C++11’s load(memory_order_acquire) using a single CPU instruction, ld.acq, and store(tmp, memory_order_release) using st.rel. I’d love to investigate the performance difference of these instructions versus standalone fences, but have no access to an Itanium machine.

Another such platform is the recently introduced ARMv8 architecture. ARMv8 offers ldar and stlr instructions, which are similar to Itanium’s ld.acq and st.rel instructions, except that they also enforce the heavier StoreLoad ordering between the stlr instruction and any subsequent ldar. In fact, ARMv8’s new instructions are intended to implement C++11’s SC atomics, described next.

Using C++11 Sequentially Consistent Atomics

C++11 offers an entirely different way to write lock-free code. (We can consider DCLP “lock-free” in certain codepaths, since not all threads take the lock.) If you omit the optional std::memory_order argument on all atomic library functions, the default value is std::memory_order_seq_cst, which turns all atomic variables into sequentially consistent (SC) atomics. With SC atomics, the whole algorithm is guaranteed to appear sequentially consistent as long as there are no data races. SC atomics are really similar to volatile variables in Java 5+.

Here’s a DCLP implementation that uses SC atomics. As in all previous examples, the second highlighted line will synchronize-with the first once the singleton is created.

std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;

Singleton* Singleton::getInstance() {
    Singleton* tmp = m_instance.load();
    if (tmp == nullptr) {
        std::lock_guard<std::mutex> lock(m_mutex);
        tmp = m_instance.load();
        if (tmp == nullptr) {
            tmp = new Singleton;
            m_instance.store(tmp);
        }
    }
    return tmp;
}

SC atomics are considered easier for programmers to reason about. The tradeoff is that the generated machine code tends to be less efficient than that of the previous examples. For example, here’s some x64 machine code for the above code listing, as generated by Clang 3.3 with optimizations enabled:

Because we’ve used SC atomics, the store to m_instance has been implemented using an xchg instruction, which acts as a full memory fence on x64. That’s heavier instruction than DCLP really needs on x64. A plain mov instruction would have done the job. It doesn’t matter too much, though, since the xchg instruction is only issued once, in the codepath where the singleton is first created.

On the other hand, if you compile SC atomics for PowerPC or ARMv6/v7, you’re pretty much guaranteed lousy machine code. For the gory details, see 00:44:25 - 00:49:16 of Herb Sutter’s atomic<> Weapons talk, part 2.

Using C++11 Data-Dependency Ordering

In all of the above examples I’ve shown here, there’s a synchronizes-with relationship between the thread that creates the singleton and any subsequent thread that avoids the lock. The guard variable is the singleton pointer, and the payload is the contents of the singleton itself. In this case, the payload is considered a data dependency of the guard pointer.

It turns out that when working with data dependencies, a read-acquire operation, which all of the above examples use, is actually overkill! It’s sufficient to perform a consume operation instead. Consume operations are meant to eliminate one of the lwsync instructions on PowerPC, and one of the dmb instructions on ARMv7. I’ll write more about data dependencies and consume operations in a future post.

Using a C++11 Static Initializer

Some readers already know the punch line to this post: C++11 doesn’t require you to jump through any of the above hoops to get a thread-safe singleton. You can simply use a static initializer.

[Update: Beware! As Rober Baker points out in the comments, this example doesn’t work in Visual Studio 2012 SP4. It only works in compilers that fully comply with this part of the C++11 standard.]

Singleton& Singleton::getInstance() {
    static Singleton instance;
    return instance;
}

The C++11 standard’s got our back in §6.7.4:

If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.

It’s up to the compiler to fill in the implementation details, and DCLP is the obvious choice. There’s no guarantee that the compiler will use DCLP, but it just so happens that some (perhaps most) C++11 compilers do. Here’s some machine code generated by GCC 4.6 when compiling for ARM with the -std=c++0x option:

Since the Singleton is constructed at a fixed address, the compiler has introduced a separate guard variable for synchronization purposes. Note in particular that there’s no dmb instruction to act as an acquire fence after the initial read of this guard variable. The guard variable is a pointer to the singleton, and therefore the compiler can take advantage of the data dependency to omit the dmb instruction. __cxa_guard_release performs a write-release on the guard, is therefore dependency-ordered-before the read-consume once the guard has been set, making the whole thing resilient against memory reordering, just like all the previous examples.

As you can see, we’ve come a long way with C++11. Double-checked locking is fixed, and then some!

Personally, I’ve always thought that if you want to initialize a singleton, best to do it at program startup. But DCLP can certainly help you out of a jam. And as it happens, you can also use DCLP to store arbitrary value types in a lock-free hash table. More about that in a future post as well.

30 Sep 16:01

机器执法,铁面无私,是福是祸?

by 秦鹏

我们正在创造一个新世界:眼观六路耳听八方的算法,让所有犯错的人都逃不脱惩罚。然而,这是我们想要的世界吗?图片来源:robocopmovie.net

(文/ Katia Moskvitch)约翰·加斯(John Gass)确信自己没有做错事情,然而白纸黑字写得清清楚楚:美国马萨诸塞州车辆管理局吊销了他的驾驶执照。

他花了接近两个星期,给车辆管理局打了好多次电话,参加了一次法院听证会,才把事情搞明白。对41岁的他来说,这是一场噩梦,因为这位职业驾驶员的生计遭到了威胁。在车辆管理局看来,问题一清二楚:加斯因为申请多张驾驶执照而犯下了诈骗罪——多亏一种面部识别算法才把他揪了出来。

在马萨诸塞以及美国的大多数州,成千上万张驾驶证上的证件照都要定期接受扫描,以便寻找逃犯、年龄不足的驾驶者、使用假名者,以及被禁驾车者。然而据《波士顿邮报》最初的报道,计算机在加斯的案子里犯了错误。这是一次算法警务出的问题。

算法警员

过去几年里,执法机构开始用无所不察的高效算法代替人类警员。它们利用无所不在的传感器、摄像头、面部识别软件和智能计算机分析来留意犯罪的迹象。从交通违章到偷窃,算法监控发挥着越来越大的作用:通知警方,甚至在根本没有人类监管的情况下实施惩罚。

支持者主张,自动警务节约开支和资源,保证了违法者逃脱不了制裁。然而很多律师和计算机科学家警告称,我们也许并不希望生活在一个我们如今正在逐渐步入的、由算法来执法的世界里。它不仅违背了文明社会的一些基本原则——比如自由裁量权,还迫使我们以不情愿的方式改变自己的行为。

尽管自动警务的问题在最近几年才日显复杂,但是它的发端可以追溯到几十年的交通警务领域。最早的自动号牌识别摄像头于上世纪70年代出现在英国。到1979年,测试系统已经在英国里程最长的A1公路和伦敦达特福德隧道内运行。两年之后,英国警方实施了第一例依靠自动号牌识别摄像头定位被窃车辆的逮捕。

随后,世界各国都出现了监控交通信号灯、公交车线路之类的摄像头。最终它们都通过互联网连接到了处理中心,这些中心与警方和车辆注册数据库之间有着便捷的互通。例如,荷兰阿姆斯特丹史基浦机场从2008年开始,常规性地通过摄像头检查所有驶入车辆,使得当局能够在已知违法者打算逃离荷兰时及时注意到。

然而近几年最为显著的变化,是摄像头背后算法智能的提升。比如说,现在很多测速摄像头能够辨别出该地区的外来者。英国利兹都市大学的警务技术专家斯蒂夫·莱特(Steve Wright)说,外来者如果只是轻微超速,往往能够逃脱罚款。而超速程度相同的本地驾驶员如果被发现,则要面临更严厉的惩罚。

处理中心也已经变得高度自动化,每天处理数千起违章。荷兰国家公共检察官办公室交通执法组发言人恩斯特·寇尔曼(Ernst Koelman)说,欧洲的一些当局干脆已经取消了人类监控。寇尔曼说,如果荷兰某路边摄像头认为它抓取到了某违章司机的号牌,这一数据通常会被自动传送到司法部下属的荷兰中央罚款收缴局。那里的算法利用号牌搜索车主姓名和地址,然后计算罚款并准备通知单。“如果系统没有疑问,没有人能够看到通知单发送出去,”他说。

如今算法的应用已经不限于交通违章。算法越来越能够理解监控系统前的人类行为。在英国的一些停车场,安保系统内置的算法监视着偷车贼。它们推断,如果你径直走向一辆车开走,你便是车主。但如果某人躲在阴影中或者车位间的夹道里端详各个车辆,定是有些可疑的勾当。在人群中实时定位具有特定容貌、步态或者携带可疑包裹的人的算法,也正在接受测试。

“一个人或许能够同时监控4至5个监控系统摄像头,然而大概20至30分钟之后,他的注意力就会开始溜号,”IBM的罗恩·费洛斯(Ron Fellows)说。IBM是数家正在开发警务及反恐智能软件的公司之一。“我们的监控技术采用的程序,被设计为观察某一特定区域的人和事物在做什么事情,不仅能够发现某人正在经过那个区域,还能觉察到他们有没有扔下一个包裹便走开了。”

如今部署在美国和英国很多座城市的IBM软件,还能够预测犯罪地点。IBM以及位于美国加利福尼亚州圣塔克鲁兹的PredPol等公司开发的“预测警务”系统,过滤大量过去的犯罪纪录、天气、社交媒体和其他相关事件,然后预测哪里可能发生违法行为并显示在地图上,提议警方在特定时间增大巡逻力度。

随着执法者能够获得的数据流越来越多,以及算法智能的增长,自动警务的应用范围可能会扩展到更多类型的违法行为。

从一定程度上来说,所需的技术都已经具备了。想一想最近曝光的美国国家安全局棱镜计划吧。该计划利用算法,在所有电子交互中追踪可疑行为。

尽管很多支持者主张说,减少犯罪终归是好事,这种趋势却令其他一些人忧心忡忡。当智能城市和“物联网” 成为现实,无数感应器和追踪设备随之上线,算法将能够以前所未有的程度,监控和惩罚人类行为。纽约西点网络研究中心主任、军事情报官格力高里·孔提(Gregory Conti)说,这带来了很多可怕的可能性。

路旁、建筑内、车载及个人等各种设备上的传感器,将使哪怕最轻微的违法行为受到严厉的制裁。设想在美国某一个如下行为都属非法的州驾驶汽车。“超过限速一两英里要吃一张罚单;打开雨刷后过了一分钟才打开头灯再吃一张罚单;在一个荒废的路口越过停车线又是一张罚单。几个小时之内,甚至可能在几分钟之内,我们大家就都没有驾照了”孔提说。

摄像头和它们背后的算法已经无处不在,无时无刻不在监视人们的一举一动。图片来源:《新科学家》

无可隐瞒?

当然,自动警务的维护者说,如果你无可隐瞒,你便无所畏惧。可是,代码总会出错。

比如,令约翰·加斯蒙冤的驾驶执照错误——这样的疏漏绝非个例。据报道,2012年美国堪萨斯城居民斯蒂夫·米尔斯(Steve Mills)收到了一张逮捕令。这是因为一套自动红灯执法系统将一份罚款通知单送错了地址,而他没有缴纳,便引来了逮捕令。将无辜的人列入禁飞名单——甚至包括参议员和学步小童——的计算机错误,也已经是不胜枚举。

伦敦城市警察监控系统部门的米克·奈维尔(Mick Neville)说,基于这个原因,人类必须能够干预自动警务,“计算机应该是仆从,而不是主人”。微不足道的交通罚款大概还可以接受,“你或许会说,没人真正受到了伤害,但是我们不该按照机器的吩咐,开始把人抓起来投进监狱”。不过这样的事情还是发生了:2000年刚过,英国一位名叫德雷克·邦德(Derek Bond)的退休人员在南非度假时,因为名字被护照控制系统标记出来而被扣押了3个星期——这次错误是国际通缉犯数据库内部出了点乱子。

对很多人来说,值得关切的不止是错误。这些算法往往是专属的,其决策过程不可能被拆解,这一事实对法律的基本原则构成了挑战。“民主的宗旨之一便是,公民对其受到犯罪调查或者被阻止的原因了解得一清二楚,”右翼团体隐私国际的执行总裁格斯·侯赛因(Gus Hosain)说,“然而,算法的内在工作机理——做出决策的分析过程——是不大可能为众人所知的,因为执法机构不会希望泄露他们使用的数据点或者推理逻辑。”

在预测犯罪方面,推理逻辑不透明的问题可能格外突出。作为一种可能的先行者,如今在美国帮助做出很多假释决定的机器学习算法便是一个例子。通过对一名囚犯的个性和犯罪史进行统计分析,这些算法就一个人是否有可能再次违法,向假释委员会提出建议——但并不揭示原因。轻率地扩大这种不透明算法的使用范围,会把这个世界变得像是卡夫卡(Franz Kafka)的小说《审判》(The Trial)中描绘的那样,遭受指控的人没有为自己辩护的机会。

另一种顾虑在于,法律书籍在写就时并未考虑不知疲倦、全知全能的安全系统提供的“完美”执法。许多个世纪以来,法律受到了人类警官、陪审团成员和法官的折中与节制。社会的根基中各处存在着少许的悔罪和自由裁量。“尽管人类的判断可能带来随意及临时性的解释和不公正的判决,它也能用来应对未必能够事先得到预期的例外案例,”日本东京明治大学的安德鲁·亚当斯(Andrew Adams)说。作为例子,可以设想一位为了急着送重伤员去医院而超速的司机。对算法来说,一切都黑白分明,亚当斯说。

自由裁量权还允许执法者能够让最值得法官和陪审团关注的违法行为优先得到处理。“一名警官可以把更多的资源用于调查一台重大医疗设备的偷盗,而不是一台iPod的失窃,”美国斯坦福大学坎伯兰法学院的伍德罗·哈佐格(Woodrow Hartzog)说,“要把这样复杂的决策过程转变成代码,我们似乎还有很长的一条路要走。”

因此,当大量轻微违法,以及类似约翰·加斯身上发生的误报事件被输入司法系统,并由此造成法庭申诉量的相应增加,算法执法可能会给司法系统带来不曾预料的压力。哈佐格说:“正如被告经常质疑在犯罪证据的收集过程中雷达枪、速度计和其他技术的使用一样,检察官同样可以预料到,自动执法系统中其他技术也将遭到质疑。”比如在2010年,美国俄亥俄州的一个人在法庭上展示他手机上可以构成反面证据的GPS定位数据,试图以此对一张超速罚单提出质疑。孔提警告说,这样的法律争辩多起来之后,法庭有可能会“不堪重负,阻塞法院系统…… 诉讼程序的质量将不可避免地恶化”。

不过,算法执法必将带来的变化当中,最为显著的或许还是它会改变我们的日常行为。我们对“完美”执法的后果做好准备了吗?哈佐格解释说,当我们得知自己每时每刻都处于数字惩罚者的监视之下,随时会因为任何疏漏遭到它们的罚款甚至逮捕,我们的日常决定必然会发生变化。

“当人们得知他们可能正在受到监视,他们的自主性会减弱,采取人类发展所必须的重要行为的可能性会降低,”哈佐格说,“比如说,受监视者更不愿发出与政府意见相悖的声音,也不愿支持小众观点。”让一些人逃脱惩罚的风险,能否平衡对亿万公民自由的威胁?

自动警务肯定会抓住先前未被注意到的犯罪和不端行为。我们的技术也足以将它的作用范围扩展到更多类型的行为。然而,若要拥抱这样一个算法执法的世界,我们必然会付出代价。

 

编译自:《新科学家》,Penal code: The coming world of trial by algorithm

相关的果壳网小组

扩展阅读

无心之失

从未触犯过法律?那可能是因为你还未曾留意便逃脱了。很多人每天都不经意地轻度违法或者民事不端。在一个超级高效的算法警务世界里,惩罚他们会变得更加容易。

比如在一些国家,在公共场合或者去娱乐场所的路上醉酒是违法行为。在美国的很多州,你甚至不必喝得烂醉如泥,仅仅在街上拿着一瓶开盖的酒便足够了。现在警察对此要么视而不见,要么抓不到人。但是,如果利用无所不在的自动化监控系统,监视公共场合的醉酒行为变得容易了,情况又当如何?算法会因为你从酒馆里蹒跚着回家而给你寄罚单吗?金钱方面的动机引诱着当局走向肆无忌惮,技术条件也已然成熟:希腊的计算机科学家已经开发出一种算法,能够通过分析面部温度和血流的特定模式甄别醉酒的证据。

与此类似,未来道路上的传感器和面部识别算法,能帮助执法者向轻微违法者课以罚款,数量会比今天更多。比如在英国,夜间骑自行车的行为若要合法,骑车者需装有车灯,脚踏板上需装有琥珀色反光镜——很多人并不知晓这种民事不端,但是他们都没有受到惩罚,因为执行上述规定过于耗时。而会让很多英国行人吃惊的是,尽管在英国乱穿马路合法,到了美国、欧洲或者澳大利亚,算法却会因为不走人行横道而很快将他们抓住——在那些地方这样做是违法的。

还有如今发生在网络上的无数意外违法:在英国,庭审期间将被指称的性侵犯受害者的名字发到推特上,属于藐视法庭的行为,而近几年利用社交媒体违反英国禁令的人也已经受到了法律制裁。

今年人们都已经知晓了,像美国国家安全局这样的组织,可以利用算法监控我们在网络上的每一个行为。尽管今天这样的系统被用于对付恐怖主义,但也说不定未来的执政者会利用同样的信息,追踪并惩罚你昨天有意无意间做出的违法行为。

你可能感兴趣

  1. 自动驾驶汽车:能否驶过法律这道坎?
  2. 【六一特稿】保护未成年人,美国法律给了我们怎样的启示?
  3. 断锁怒潮:44名“黑奴”的自由之路
  4. 物理宅的法庭“历险记”
  5. 网聊记录可以作为犯罪证据吗?
  6. 嫌犯为什么有权保持沉默?
  7. 留学生强奸案,证人用钱“搞不定”
  8. 新技术破案?政客们说了:没钱!
  9. 让人帮你顶罪有多难?
  10. 自由诚可贵,保释价更高
  11. 证人保护计划帮你人间蒸发
  12. 美国加州装上“智能”红绿灯
22 Sep 18:23

越微博,越寂寞?

by Simbelmyne

(文/Maria Konnikova)注册Facebook的人都不想变得可悲又孤独,但密歇根大学的心理学家伊桑•克罗斯(Ethan Kross)最近的新研究提出,Facebook正让我们有这种感受。克罗斯和同事在两周内每天给82名安娜堡市居民发5条短信,调查研究对象的整体情绪、他们有多担忧和孤独、他们使用Facebook的程度,还有从收到上一条短信起,他们和别人面对面交流的次数。克罗斯发现,研究对象在两条短信之间用Facebook越多就越不开心,从研究开始到结束的总体满足感也有所下降。克罗斯根据数据提出,Facebook让使用者不开心。

对互联网(尤其是Facebook)让人更加疏远的研究支持克罗斯的结论。1998年,卡内基•梅隆大学的研究者罗伯特•克劳特(Robert Kraut)发现,人们上网越多,就越感到孤单沮丧。在第一次上网之后的一至两年内,他们上网频率越高,幸福感和与周围人的联系就越低。

更孤独的人也并不是更容易上网,最近,一篇回顾了75个研究的文献综述得出结论,“使用Facebook的人和不用Facebook的人性格特点并没有太大的不同”。但不知为何,互联网让用户感到和别人更加疏远。一篇写于2010年的综述分析了40个研究课题,也证实了该趋势:使用互联网对人的整体健康状况有微小的、但在统计上显著的不良影响。一个实验得出的结论是,Facebook会激发醋意而导致感情问题。

另一个研究团队提出,使用Facebook也会增强嫉妒心:用户花越多时间浏览Facebook(而不是发原创信息或者和Facebook上的内容互动),他们的嫉妒感就越强。汉娜•克拉斯诺夫(Hanna Krasnova)和同事认为,这是由社会心理学中“社会对比效应”造成的结果。由于人们多和自己大致相似的人交往,这种对比效应就愈发凸显:正因为比较的对象是思维方式类似的同龄人,所以得知他们的成就会造成更大的打击。最近,心理学家贝丝•安德森(Beth Anderson)和同事在评估Facebook的影响后认为,使用Facebook会让人很快上瘾,也同样会产生令人烦躁的负能量,让用户讨厌社交网络,有些讨厌的因由和当初让人注册Facebook的原因一样。我们想知道别人的情况,也希望别人了解我们——但就是在这种彼此了解的过程中,我们可能开始怨恨彼此的生活,也开始怨恨保持我们觉得自己需要不断保持的形象。专门研究社交媒体的使用和社交网络分享动机的心理学家塞缪尔•戈斯林(Samuel Gosling)说:“很可能,正是那些一开始很吸引人的东西,到最后反而让人避之不及。”

不过,和关于Facebook的其他发现一样,其反面论点同样成立 。2009年,塞巴斯蒂安•巴伦苏埃拉(Sebastián Valenzuela)和同事得出了与克罗斯相反的结论:Facebook让我们更开心。他们还发现Facebook能够提高社会信任度、增进社交往来,甚至鼓励人们参与政治活动。巴伦苏埃拉的发现非常符合社会心理学家对社交长久以来的认识。马修•利伯曼(Matthew Lieberman)在自己的书“Social: Why Our Brains are Wired to Connect”中提出,社交网络是我们和他人分享的一种方式。成功分享后,心理和生理上的满足感常常会起到自我激励作用。社交媒体的普及已经从根本上改变了我们阅读和看东西的方式:我们在消费信息的时候会考虑用什么方式、和什么人分享这些信息。甚至在分享信息之前,光想到成功分享就能激活我们的奖赏处理中枢。

虚拟的社交联系甚至可以缓冲压力和痛苦:马修•利伯曼(Matthew Lieberman)和同事于2009年的研究证明,当女性受到疼痛的刺激时,握住男友的手或者看男友照片可以减轻痛感,而且照片麻痹疼痛的效果要比身体接触强一倍。“强制想象”就是真实事物的精神体现,心理学家文迪•加德纳(Wendi Gardner)和辛迪•皮克特(Cindy Pickett)将其称为“社交零食”。出于某种不知名的原因,距离的因素和强制想象有麻醉效果,我们或可期望这种效果也能推广到社交网络上所有朋友的照片。


虚拟的社交联系可以缓冲压力和痛苦,看男友的照片能减轻女性疼痛的感觉,我们或可期望强制想象的麻痹效果也能推广到社交网络上所有朋友的照片。图片来源:AIMEE LEE BALL,nytimes.com

上面说的都是值得信赖的研究,但在探索“Facebook 如何影响人的情绪状态”这个问题上却得出了不同乃至相悖的结论。为了理解这个现象,我们可以着眼于人们上Facebook时究竟在做什么。

研究社交媒体的使用和社交网络分享动机的心理学家塞缪尔•戈斯林说:“这问题之所以这么复杂,是因为Facebook可以做很多事,而且不同人都在用Facebook做这一系列不同的事。不仅如此,他们还造成改变,因为人们自己就在改变。”2010年,一项卡内基•梅隆大学的课题发现,如果人们直接和他人互动(给彼此留言、发私信或者“喜欢”某消息),他们的社会联系感和社会资本都有所提高,孤独感下降。不过,如果试验参与者只是被动地消化了新闻内容,Facebook则造成相反的效果,即降低与他人的联系感而增强孤独感。

密苏里大学的心理学家做的实验还测量到了这种效果的生理表现。实验中,被试眉毛上端和眼睛下部粘了4个电极以记录面部表情,此研究法称为面部肌动电流描记法。当被和Facebook积极互动时,从他们的生理反应测量到幸福感显著升高;而在被动浏览时,这个效应就消失了。

约克大学的约翰•伊斯特伍德(John Eastwood)和同事今年上半年的研究结果与以上发现相符,他们写了一篇关于“无聊”的统合分析。是什么让我们觉得无聊,因而不开心?答案是注意力。我们在集中注意力的时候不感到无聊,而不专注时无聊的感觉就出现了。伊斯特伍德的研究和最近关于媒体多任务处理的研究证明,我们把注意力分散在越多的任务上,就越是难以对每件事都保持专注,因而变得越来越心烦意乱。

换句话说,Facebook所代表的那种持续在线和媒体世界,是社交网络的宿敌。将Facebook的使用情况分为主动和被动两种来研究的所有课题都发现:平均下来,用户被动浏览新鲜事所用的时间,要远远多于主动产生内容和与其他用户发生互动的时间。这或许能够解释为什么研究Facebook总体使用情况的课题,总会得出“Facebook对情绪有负面影响”的结论,例如克罗斯对安娜堡居民的研究。因为需要将注意力分配在其他事情上,我们更容易被动而不是主动地用Facebook。无论什么媒介,被动的经历都会转化成脱节和无聊感。

心理学家蒂莫西•威尔逊(Timothy Wilson)告诉我,他研究发现大学生如果没了手机或电脑,只要呆在房间里几分钟就开始“发疯”。威尔逊说:“可能你会觉得我们可以用这时间精神自娱,可是我们做不到。我们已经忘了该怎么做。”只要我们有闲,互联网就是一个极诱人又可迅速填补空隙的解决办法。我们无聊,刷一下Facebook或者Twitter,然后变得更无聊。摒弃Facebook并不能改变的事实是,我们在越来越多的时候忘记了该如何正确而有意义地集中注意力。从这点来看,Facebook并不是问题。症状才是。

 

相关的果壳网小组

 

编译来源:《纽约客》,HOW FACEBOOK MAKES US UNHAPPY
文章图片:ffffound.com 

你可能感兴趣

  1. 多样化的社交网络,将如何共存?
  2. 下一个浪潮,视觉化社交媒体
  3. “反Facebook”社交网站开始内测
  4. Facebook里的数字
  5. Facebook 凭什么拿下了日本?
  6. Facebook疲劳症蔓延,但社交媒体仍在崛起
  7. Facebook和Instagram:当你最爱的软件被收购
  8. 老年人保健新方法:上社交媒体
  9. 离不开社交媒体?因为你害怕"Out"
  10. 哪些朋友邀请时,你会加入社交网络?
  11. 你的未来雇主在社交媒体上看着你
  12. 社交媒体还缺什么?你的“敌人”
13 Sep 13:27

这液体能替代食物吗?

by 花栗鼠习作

本文作者:花栗鼠习作

文/Caleb Hannan

译/孙亚飞

Rob Rhinehart所尝试的自助式调配“液体食品”,并长期食用的做法,对于普通人来讲,却属于“危险动作”,必须要向读者强调“请勿模仿”。而且,据某松鼠透露,实验室的同事试着尝试了类似的营养液,七天后——差点儿没把自己恶心死。

Rob Rhinehart已经尝试将自己的独家配方商品化,并已经募集了超过六十万美元的启动资金,这位先行者的故事就发生在当下,我们的未来饮食会受到他的影响吗?

b6c9996e86fd1e82d4c4dc22c1081b21 自打一月中旬起,Rob Rhinehart就开始只吃很少的一点点那些大多人眼中的正常食品,有时,他差不多隔上一个月才吃一顿饭。这个25岁来自旧金山的电子工程师在他的厨房里自己调制了一种营养饮料,所以他现在基本就指着这个活着。对于Rhinehart还有他那数量上日益增长的追随者而言,这种浑浊的白色液体是改变人们如何吃的关键一步,或者是让人们不用再吃的关键一步。

我们生理上对食物的依赖已经发展成了一种神圣的附属物,并且衍生出无数文化、商业和美学方面的亚种。但食物仅仅是燃料而已,而且这燃料既费钱又费力。去年夏天在旧金山,Rhinehart发现自己破产了。他从乔治亚理工大学毕业之后就来到这里创立了一家无线通讯公司,不过失败了,所以他只能依赖最便宜的一些食品度日,诸如泡面还有Costco的玉米热狗之类。他说他和室友已经开始用补剂来预防坏血病了,“我当时很不健康,讨厌做饭、买东西和刷碗,而且我的主要支出就是食品”,Rhinehart说道。受够了做饭、吃饭和刷碗这每天三次的负担,他决定将他的食物摄入简单化。

Rhinehart用了三个月的时间,钻研了各种复印教科书,尽其所能地学习了生物化学和营养学方面的知识。他列出了一份成分清单,包括了那些他生存所需的所有要素,主要都是些化学成分:分离乳清蛋白作为蛋白质;麦芽糊精作为碳水化合物;还有一些微量营养素如锌和铬。随后他便开始从亚马逊和eBay上的食品添加剂和化学品供应商那里订购上述物质。不久之后,他拥有了一个充满着各种粉末的厨房,可以准备混合了。

可以替代正常食物的产品有很多种,但是这些饮品并不能作为完全的食品替代品;长远来看,它们有些贵,还不够健康。当然如果做得足够好,液体食品也是可行的。1965年,国立卫生研究院对加州的囚犯进行了一次长达19周的试验,以测试宇航员是否可以依赖液体食品。这些犯人最后变得更开心也更健康(不过传闻说,宇航员们因为没有滋味儿拒绝了这玩意)。

1月12号,Rhinehart在一个天平上称量了各种他需要的那些物质,把它们装到一个罐子里,加入水。“我看到我的一生在眼前闪过,”他说,“然后我喝了它。”他很快意识到他忘记了加入可以调节吸收的膳食纤维;尽管代谢掉800卡路里之后感觉不错,但他很快就感觉消耗一空地趴下了。在一系列的调整以及一次轻微的钾中毒之后(给Rhinehart带来了心悸),他确定了一个可用的配方。他开始持续一个月什么也不吃而只吃Soylent,随后是两个月,然后是三个月,而Soylent这个名字是为了向上世纪70年代的科幻电影《超世纪谍杀案(Soylent Green)》致敬。他差不多每天消耗三到四瓶液体食品,每次大约只要花上一分钟来准备、喝掉,并且洗干净。为了确保健康,他定期进行血样检测,并且用博客“基本无害”来记录他的进程。他也记录了配方的变化,比如用燕麦粉替代三分之一的麦芽糊精,以获得更多的膳食纤维和更低的血糖指数。同时,他也开始记录他生活的变化。

不购买食品也不做饭节省了他大量的时间和金钱。他喝的这些原料每天提供2692卡路里的热量,每个月却只需要消费154.82美元,与此对应的是,他说他之前需要花费500美元用于固体食物上。Rhinehart还证实Soylent在能量、皮肤洁净和减少头皮屑方面有着明显的改善。当他记录他的过程时,他也获得了追随者。

Soylent引起了复杂的反响,很大程度上是因为它引起了人们对食物本质以及人们与食物关系的深深思考,这也导致一些人攻击Rhinehart。“祝你快乐地死于癌症,”其中一个人说道。营养学家们也是持怀疑态度,Joy Dubost是营养与膳食学会的营养学家兼发言人,而他的意见是:“我们吃的所有东西都是化学物质,从这个角度来说,我没有意见。我有意见的是用这种“一招万灵”的方式来获取营养。而且也没有什么科学证据显示他的这种做法可行。”同时,Dubost说:“我试过这玩意,太难喝了!”

然而,每一个反对Soylent的声音背后都有一个Rhinehart的支持者,这些粉丝称呼他们自己为“反食品仔”(reverse foodies),他们都对食物的约束感到沮丧。比如一名27岁来自印第安纳州中部的化学与数学老师Daniel Dow,在Rhinehart把配方发到网上之后,他就立即高高兴兴地开发了Soylent的山寨品作为食品,并且这几个月都没再怎么吃其他东西。

像Dow这样的“反食品仔”依靠自己去调试的日子不会持续太久。五月,Rhinehart和三个朋友进行了在线融资,以获得100,000美元用于Soylent的规模化生产。他们本以为需要一个月的时间,实际上两个小时就完成了。截止本文发表之时,总数已经达到600,000美元,而捐款者还在络绎不绝。

Rhinehart说,在理想的世界里,他将生产足够的Soylent非卖品,以支援那些海外的贫穷和饥荒地区。同时他还打算供应一些大客户,尽管他不肯指明是哪个部门,但他表示美国部队对于将Soylent提供给士兵很感兴趣。然而,他最想做的是改变什么能构成食物而什么不能构成食物的概念——每次他坐下来开吃,这其中的界限就更模糊些。

* 本文作者Caleb Hannan截至目前没有试过Soylent。

关于本文

* 原文载于2013年8月期《Popular Science》55页。

07 Sep 03:59

AI,我们创造出来的异类智能

by 秦鹏

我们已经创造了一种全新的智能形式,尽管没有人能够看透它如何思考、如何推理。图片来源:extrahype.com

(文/ Douglas Heaven)瑞克·拉希德(Rick Rashid)这么紧张是有原因的。他在中国的天津迈上讲台,面对2000名研究者和学生,要发表演讲。问题在于,他不会讲中文,而他的翻译以前糟糕的水平,似乎注定了这次的尴尬。

“我们希望,几年之内,我们能够打破人们之间的语言障碍,”这位微软研究院的高级副总裁对听众们说。令人紧张的两秒钟停顿之后,翻译的声音从扩音器里传了出来。拉希德继续说:“我个人相信,这会让世界变得更加美好。”停顿,然后又是中文翻译。

他笑了。听众对他的每一句话都报以掌声。有些人甚至流下了眼泪。

这种看上去似乎过于热情的反应是可以理解的:拉希德的翻译太不容易了。每句话都被理解,并被翻译得天衣无缝。令人印象最深的一点在于,这位翻译并非人类。

曾几何时,执行这样的任务远超最复杂的人工智能的能力,而且并不是因为人们没有为此付出努力。多年以来,人工智能领域被那些旨在复制人类意识功能的宏大计划统治着。我们梦想着拥有一台机器,能够理解我们、识别我们,帮助我们做出决定。近几年来,我们已经实现了这些目标,然而实现的方式,是先行者不曾想象的。

如此说来,我们已经研究出了复制人类思想的方法了吗?还差得远呢。相反,实现这些目标的方法,与我们最初的愿望大相径庭。人工智能在你周围无处不在,它的成功可以归因于大数据和统计学,也就是利用海量信息执行复杂计算。我们已经创造出了意识,只不过它们与我们的意识相去甚远。它们的推理过程,对人类来说深不可测——这一进展所预示的前景,正在引起人们的关注。既然我们正在愈加依赖这种新型智能,我们或许需要改变自己的思维方式去适应它。

复制思维

半个多世纪以前,研究者列出了一系列目标,是我们向具备类人智能的机器挺进时必需要达成的。英国布里斯托尔大学的尼洛·克里斯蒂亚尼尼(Nello Cristianini)说:“从上个世纪50年代开始,我们就有了一张待办事宜的清单。”他曾写过人工智能研究历史和演化方面的著作。

清单上的很多项目可以追溯到1958年在英国特丁顿召开的思想过程机械化会议。参与那次会议的,不仅有计算机科学家,还有物理学家、生理学家和心理学家。按照我们的样子建造思考机器的前景,令这些人全都激动万分。他们一致认为,智能的特征应该包括对理解话语、翻译语言、识别图像,以及模仿人类决策的能力。

然而时间在流逝,那张清单却丝毫没有变短。很多研究者试图以逻辑公理为根基,使用程序化的规则来模拟人类思考。他们以为,只要创建足够多的规则就能成功。但事实证明,这太难了。几十年过去了,人工智能研究成果寥寥,资金告罄。

那么,究竟是什么发生了改变呢?“我们并没有找到智能的解决方案,”克里斯蒂亚尼尼说,“我们算是放弃了。”然而,这便是突破。“一旦我们放弃制造精神和心理特性的尝试,成功之道便开始出现在眼前了。”

说白了,他们放弃了预编程的规则,而是投向了机器学习的怀抱。利用这种技术,计算机教会自己从数据中建立模式。有了足够大的信息量,你就能让机器学会做看上去有智能的事情,别管是理解话语、翻译语言,还是识别人脸。英国剑桥微软研究院的克里斯·毕肖普(Chris Bishop)打了个比方:“你堆积足够多的砖块,然后退上几步,就能看到一座房子。”

这种方法的原理大概是这样的。很多最成功的机器学习系统,依据的都是贝叶斯统计,这种数学框架能让我们测算可能性。根据给定情境以及先前在类似情境中观察到的关联数据,贝叶斯统计能够给出出现某个结果的可能性数值。

比如,我们想让人工智能回答与一个简单问题:猫吃什么。基于规则的方法要从零开始,采取有逻辑的步骤,建立一个关于猫及其饮食习惯的数据库。采用机器学习技术,你只需要不加选择地输入数据——互联网搜索、社交网络、食谱书籍等等。通过计算特定词汇出现的频率,以及概念之间如何彼此关联,系统便建立了一个统计模型,能够估计猫喜欢某些食物的可能性。

在人工智能的发展道路上,人们采取过两种截然不同的途径。图片来源:《新科学家》

当然,机器学习所依赖的算法已经出现多年。新鲜之处在于,现在我们有了足够的数据,让这种技术大显神威。

就以翻译语言为例。20世纪末,IBM将加拿大国会生成的英法双语文档输入计算机,利用机器学习技术教它在这两种语言之间互译。那些文档就像罗塞塔石碑一样,包含了几百万被写成两种语言版本的例句。

IBM的系统辨别出两种语言单词和短语之间的关联,并将这种关联应用于新的翻译任务。结果却满是错误。他们需要更多的数据。“这时谷歌跟了上来,差不多输入了整个互联网,”英国牛津大学互联网学院的维克托·迈尔-舍恩伯格(Viktor Mayer-Schönberger)说道。

和IBM一样,谷歌在翻译领域所作的努力,一开始也是发展算法,在多语言文献之间交互参考。然而,研究者开始意识到,如果翻译器学习了说俄语、法语和韩语的人们实际的讲话方式,翻译质量将有很大提高。

谷歌转向了被它索引过的庞大网络。这张网络正在朝豪尔赫·路易斯·博尔赫斯(Jorge Luis Borges)1941年的短篇小说《巴别图书馆》中那座假想的图书馆迅速演进。小说中的图书馆收藏的书籍,囊括了所有可能的词语组合。假设谷歌翻译器正试图将英语翻译成法语,它便可以将它最初的尝试与互联网上用法语写就的每一个句子作比较。迈尔-舍恩伯格用翻译“light”一词来举例:表示光照时,要翻译成法语词“lumière”,表示重量时,则要翻译成“léger”。谷歌翻译器自己学会了如何做出与法国人一致的选择。

除了大量词序的相对频率,谷歌翻译器,以及拉希德使用的微软翻译器,对语言可谓一无所知。这些人工智能无非是一个词接一个词地计算接下来出现什么词的可能性。对它们而言,这只是个概率问题而已。

这些基本原理多少显得有些直来直去。当巨量数据中产生海量关联时,事情就复杂了。比如,谷歌的自动驾驶汽车,为了对周围环境作出预测,每秒钟要收集差不多1GB的数据。亚马逊这么善于诱导人们购买更多的商品,是因为它做出推荐所依据的基础,乃是几百万其他购买行为中的几十亿关联关系。

大者为王

翻译拉希德的演讲,展现了统计人工智能可以有多么强大——不仅要猜测他说了什么,思考该怎么翻译,还要判断这句中文由他说出来是什么效果。“这些系统的表现并非神迹,”毕肖普说,“但仅仅是探究一下巨量数据的统计信息,就能取得这么大的成就,我们常常为此感到惊讶。”

这些智能算法正开始影响生活的每一个方面。就在拉希德演讲一个月之后,荷兰国家法证科学研究所就雇了一套名叫波拿巴(Bonaparte)的机器学习系统,辅助他们寻找一名已经潜逃了13年的谋杀犯罪嫌疑人。波拿巴能够分析和比对大量DNA样本,这个工作由人工来做的话将非常耗时。保险和信用行业也在拥抱机器学习,部署这种算法为个人建立风险评估简况。医学界也在利用统计人工智能,筛选大得令人类无法分析的基因数据库。IBM公司的沃森(Watson)甚至能够诊断疾病。

“大数据分析能够发现被我们遗漏的事情,”迈尔-舍恩伯格说,“它对我们的了解,比我们自己还要深刻。但它也需要一种迥然不同的思考方式。”

在人工智能发展早期,“可解释性”被赋予了很高的价值。当机器做出选择时,人类能够追查到原因。然而,如今,那些由数据驱动的人工意识所做的推理,是对巨量数据点进行高度复杂的统计分析。换句话说,为了得到“是什么”,我们放弃了“为什么”。

就算一位高超的技师能够搞懂其中的数学过程,可能也没有什么意义。毕肖普说,那并不会揭示为什么系统会做出某个决定,因为这个决定并不是经由人类能够解读的一系列规则而得出的。他认为,为了得到有用的系统,这是个可以接受的取舍。早期的人工意识或许是透明的,但它们都失败了。“你可以得到一个解释,但那是对错误预测的解释。”一些人对这种转变提出了批评,但毕肖普和其他一些人主张,是时候放弃对人类解释的期待了。

“可解释性是一种社会契约,”克里斯蒂亚尼尼说,“过去我们认为它很重要,现在我们认为它不重要。”

英国布里斯托尔大学的彼得·弗拉赫(Peter Flach)试图向他计算机科学专业的学生,讲授这种从根本上不同的思维方式。编程讲究绝对,机器学习分析的却是不确定程度。他认为,我们应当更习惯怀疑。比如,亚马逊的人工智能推荐了一本书,这究竟是机器学习的结果,还是亚马逊有一些书不好卖?再比如,亚马逊可能会告诉你,和你差不多的人购买了它所展示的书,它所说的“和你差不多的人”以及“与此差不多的书”究竟是什么意思?

“也许,在某种程度上,我们终将不得不信任机器,即便我们无法完全理解它,”弗拉赫说。

危险在于,我们不再提出问题。我们会习惯于在不经意间由机器替我们做出决定吗?由于智能机器已经开始针对抵押申请、医疗诊断,甚至你是否有罪,做出神秘莫测的决断,我们押在人工智能上的赌注更大了。

比如在医疗方面,如果一套机器学习系统认为,你在未来几年中将开始酗酒,会怎么样?医生可以据此拒绝给你施行器官移植手术吗?如果没人了解结论从何而来,便很难讨论你的病情。一些人可能会信任人工智能甚于其他。“人们太愿意接受算法发现的事情,”弗拉赫说,“连计算机都说‘不’了。而这正是问题所在。”

此时此刻,某个地方,可能有一部智能系统正在判断你是什么样的人——以及将成为什么样的人。看看发生在美国哈佛大学拉坦娅·司维尼(Latanya Sweeney)身上的事情吧。有一天,她惊讶地发现,她的谷歌搜索结果附带的广告问道“你被逮捕过吗?”白人同学的搜索结果中却没有这条广告。这件事促成了一项研究,表明谷歌搜索背后的机器学习系统,无意中成了种族主义者。在深不可测、浩若烟海的关联当中,跟犯罪纪录相关的广告与黑人更常使用的名字被联系了起来。

“人工智能会遇到很多伦理困境,”迈尔-舍恩伯格说。很多人已经对大数据时代的隐私问题表达了关切。 “说实话,相对于隐私,我更担心统计预测遭到滥用。”

​​我们已经建造的标志性智能系统,不像先驱者当年设想的那样,是一个能够思考的机器。图片来源:raymazza.com

为了探索人工智能的世界,我们有必要改变自己对于人工智能是什么的想法。我们已经建造的标志性智能系统,既不下象棋,也不谋求推翻人类的统治。克里斯蒂亚尼尼说,“它们跟HAL 9000不一样。”它们已经不再仅仅在线上陪我们打发时间,或者怂恿我们去买更多的东西,而是能够在我们自己意识到之前预测出我们的行为。我们避不开它们。因此,相处的诀窍在于,承认我们没有办法知道这些选择因何作出,而是要正确看待人工智能给出的这些选择:它们是建议,是数学上的可能性。这些选择的背后,不存在什么神谕。

当人们梦想着以自己为蓝本建造人工智能时,他们向往的或许是,有朝一日能够以平等的身份,与这些会思考的机器相遇。然而,我们最终得到的人工智能却是异类,是一种我们之前不曾遭遇过的智能形式。

 

编译自:《新科学家》,Not like us: Artificial minds we can't understand

相关的果壳网小组

 

扩展阅读

人工智能之争

我们需要理解自己创造的人工智能吗?在来自截然不同领域的两位智力大鳄之间,这个问题挑起了一场看似不大可能发生的争端。

在美国麻省理工学院150周年校庆聚会上,有人请现代语言学之父诺姆·乔姆斯基(Noam Chomsky)对实现人工智能的统计方法的成功作一番点评。结果,乔姆斯基对这种方法颇不以为然。

乔姆斯基在语言学领域的工作影响了很多研究人类智能的人。他的理论的核心思想是,我们的大脑内置了与生俱来的规则。这或许可以解释一部分原因:为什么他不赞成现代人工智能实现方法,因为这种方法抛却了规则,代之以统计学关联。本质上来讲,这意味着我们不知道这些人工智能为什么会有智能,只知道它们确实有智能。

在乔姆斯基看来,统计技术的支持者就如同这样一种科学家:他们研究蜜蜂的舞蹈,精确地模拟出了蜜蜂的运动,却不追问蜜蜂为什么这样运动。乔姆斯基的观点是,统计技术做出了预测,却没有提供理解。他说:“这是一种非常新颖的成功概念。在科学史上,我没听说过类似的先例。”

谷歌公司研究总监彼得·诺米格(Peter Norvig)在他的网站上以一篇论文回击了乔姆斯基。对于乔姆斯基的统计方法只获得了“有限成功”的评论,他表示愤慨。恰恰相反,诺米格写道,这一方法如今成了占据主导地位的范式,每年产生几万亿美元的收入。作为一种学术上的羞辱,他把乔姆斯基的观点比作神秘主义,比作福克斯新闻主持人比尔·欧莱利(Bill O’Reilly)式的论断——后者曾经荒谬地批评,科学无法解释地球上潮汐的存在。

不过诺米格的主要反对意见更加基本。简单地说,他认为,像乔姆斯基这种寻求建立不断简化而且更加优雅的模型来解释世界的科学家,已经跟不上时代了。他说:“自然的黑盒子未必能用简单模型来描述。”诺米格的观点是,乔姆斯基的方法提供了一种理解的错觉,但这种方法并非植根于现实。

于是,在这场最初围绕人工智能的争辩中,知识本身的性质似乎倒成了更重要的议题。

你可能感兴趣

  1. 人工智能?有什么好怕的!
  2. 剑桥大学成立研究中心应对“天网危机”
  3. 连线:人工智能的革命
  4. 小说:奥莉姆传说
  5. 超级电脑“沃森”找到了第一份工作
  6. 纽约时报:赢得未来,人脑还是电脑?
  7. 人工智能下一步,通过图灵测试
  8. 计算机真的可以产生智慧吗?
  9. 2013年,我们应该担心什么?
  10. 环境杂志:智能电网——超级绿色网络
  11. 嫌电脑不够智能?给它看看游戏指南吧
  12. “终身幼儿园”:学习是一个创造的过程
30 Aug 17:29

[原]最近的一些思路,有精力了展开

by noslopforever

最近很少上来了,因为在新公司挖了个大坑把自己埋进去了……

真心决定游戏系统的往往不在于VT、GI这些细枝末节,而是整体的构架、思路、想法、意识……Now, we have a long way to go.

个人觉得,做游戏项目的时候注重下面几个事情,基本就能少很多麻烦,已经有很成熟技术和方案的情况下,或者前人已经各种坑的地方,千万不要再去发明轮子,重新跳坑……

 

Graphics

-Animation Tree、Animation Graph配合Animation Set已经非常成熟了,全世界的动画系统现在都在向这个方向靠,这玩意儿能发挥好,整个动画乃至状态机部分程序基本就解放了。

-不要迷信LPV神马的,在核芯卡、笔记本卡变得越来越普遍的今天,端游你不见得用的起来……不恰当地使用GI不如恰当地不用GI。

-IK这东西别傻调,好的东西一定是经过良好的设计和Arrangement的,傻乎乎地,不加任何假设地去做IK,累死累活,效果还不见得会好。

-“通用型引擎impossible”,即便这是个真理,也不能抱着这种态度去维护引擎,引擎虽然不为了放之四海皆准,至少是为了让自己不要随风而动。引擎中有很多技术现在都是基本通用的,比如Animation Tree。不合理的需求和组织方式,抗争到底,也不要丢掉自己最为精华的东西。

-程序算出来的路径,绝不可能比美术调出来的更具美感。

 

Programmer

-物件状态千万别想当然地觉得一定要用状态机去做物件状态,就算是用状态机做状态,也别傻乎乎一个角色就一套状态机,多来几个“移动同时攻击”就足够让你上吐下泻了。

(都13年了居然还有用行列过百的单一状态机来做角色状态的,就算自己不去学老外的,身为一个程序,从自己的专业上就不觉得这玩意儿怪吗?)

-技能伤害?技能学习?仇恨?阵营?任务?AI?这种东西程序不需要一行编码,如果你作为程序为此付出了太多的精力,那你的程序已经接近有问题了。

-可能的情况下,可以考虑为你的UI引入Data binding……不要小看UI的设计,好的设计能让你解脱大量的人力。

-不要用数据去描述流程,流程要用专业的流程工具去完成。

-让策划去负责流程的工作,否则他们永远也不可能明白自己该干什么。说服他们,实在说服不了,也要说服自己把流程脚本和程序分开,你会发现你接下来的工作将变得异常轻松。

-不要寄希望于策划能在一开始把所有的事情都想明白,然后给你一个后面绝对不会改的文档,身为一个程序,这种想法本身就是绝对错误的。

-端游策划不能在一开始就把所有事情想明白,这不是策划的问题,策划简直本身就应该这样,如果端游策划一开始把东西都想明白了,那除非是在山寨。

-尽快、尽早地引入Reflection,它能极大地节约你的开发和维护成本。而且,千万不要自断经脉地把Reflection就用在那么几个地方,看长远些,它能为你带来极大的方便。

-服务器最好尽早引入Monitor和各种监测机制,它最大的作用是帮你把很多东西给理顺……

-Memory分配的策略再多,也不是把它交给具体功能维护者的理由。

-如果你拿到了CE、UE这样的引擎,先不要以“这是FPS引擎做不了MMO”这样的借口急于把他们的游戏层全盘抛弃,对于CE,您会给自己找一个足在整个项目期间对抗的对手,而对于UE,除了上面那个之外,您还丢掉了一枚通往未来的钥匙。

-与其拼命地优化服务器Collision的性能,不妨想些办法少做几次Check,更不妨跟美术和策划把场景的制作给规范好,乱石、碎木带来的美感未必能有几何,带来的麻烦却足以毁掉很多。

 

Project

-如果你还没明白项目到底要做到哪个方向,就不要让太多的策划和美术介入,更多的人只会把事情搞得更糟。十人左右的团队,端游足够了,再多只会添乱。

-培养起一支专业的关卡设计师队伍,在中国这将为你带来一个巨大的优势。

-资源的工作流相当地重要,牵扯到资源的工作,千万要慎之又慎地想明白每一个相关的角色。前面的一点疏漏后面搞不好就是一个巨大的问题。

-制作人一定要注意自己手下的工作,A+B不见得等于A+B,谁都知道英雄联盟的游戏系统配上魔兽世界的装备数值体系那就是来搞笑的,但不知道为什么,总有那么几个项目会来一次或者来几次这样的搞笑。

-尽早培养一支工具维护队伍,工具并不像想象那么简单,需求改得天翻地覆,工具却一点不需要动这样的人全中国你不见得能招来几个。

 

Misc

-并不是端游在没落,而是社交型游戏的选择变得更多,人们没必要必须去弄一台PC来跟别人社交,甚至没必要在手机上下载一个游戏来跟别人社交。搞明白人们的隐藏需求,永远比分析现状和过去要更重要。

-前30分钟就把自己的游戏核心打出去,别以为人们会像之前那样傻乎乎地玩到满级,人家现在有微信,不再像之前那么无聊。

-策划出身的制作人,前期请腾出给程序做工具的时间。程序出身的制作人,注意自己的程序是不是经常会对策划说“这个做不了”。美术出身的制作人,前期千万别要管住自己别把太多精力放到美轮美奂的场景上。

作者:noslopforever 发表于2013-8-30 0:27:43 原文链接
阅读:597 评论:2 查看评论
18 Aug 17:00

如何设计一门语言(九)——类型

by 陈梓瀚(vczh)

类型是了解编程语言的重要一环。就算是你喜欢动态类型语言,为了想实现一个靠谱的东西,那也必须了解类型。举个简单的例子,我们都知道+和-是对称的——当然这只是我们的愿望了,在javascript里面,"1"+2和"1"-2就不是一回事。这就是由于不了解类型的操作而犯下的一些滑稽的错误。什么,你觉得因为"1"的类型是string所以"1"+2就应该是"12"?啐!"1"的类型是(string | number),这才是正确的做法。

了解编程语言的基本原理并不意味着你一定要成为一名编译器的前端,正如同学习Haskell可以让你的C++写得更好一样,如果你知道怎么设计一门语言,那遇到语言里面的坑,你十有八九可以当场看到,不会跳进去。当然了,了解编程语言的前提是你是一个优秀的程序员,至少要写程序,对吧。于是我这里推荐几门语言是在此之前要熟悉的。编程语言有好多种,每一种都有其代表作,为了开开眼界,知道编程语言可以设计成什么样子,你至少应该学会:

  1. C++
  2. C#
  3. F#
  4. Haskell
  5. Ruby
  6. Prolog

其实这一点也不多,因为只是学会而已,知道那些概念就好了,并不需要你成为一个精通xx语言的人。那为了了解类型你应该学会什么呢?没错——就是C++了!很多人可能不明白,为什么长得这么难看的C++竟然有这么重要的作用呢?其实如果详细了解了程序设计语言的基本原理之后,你会发现,C++在除了兼容那个可怜的C语言之外的那些东西,是设计的非常科学的。当然现在讲这些还太早,今天的重点是类型。

如果你们去看相关的书籍或者论文的话,你们会发现类型这个领域里面有相当多的莫名其妙的类型系统,或者说名词。对于第一次了解这个方面的人来说,熟练掌握Haskell和C++是很有用的,因为Haskell可以让你真正明白类型在程序里面的重要做哟的同时。几乎所有流行的东西都可以在C++里面找到,譬如说:

  1. 面向对象→class
  2. polymorphic type→template
  3. intersection type→union / 函数重载
  4. dependent type→带数字的模板类型
  5. System F→在泛型的lambda表达式里面使用decltype(看下面的例子)
  6. sub typing的规则→泛型lambda表达式到函数指针的隐式类型转换

等等等等,因有尽有,取之不尽,用之不竭。你先别批判C++,觉得他东西多所以糟糕。事实是,只要编译器不用你写,那一门语言是不可能通过拿掉feature来使它对你来说变得更牛逼的。不知道为什么有那么多人不了解这件事情,需要重新去念一念《形式逻辑》,早日争取做一个靠谱的人。

泛型lambda表达式是C++14(没错,是14,已经基本敲定了)的内容,应该会有很多人不知道,我在这里简单地讲一下。譬如说要写一个lambda表达式来计算一个容器里所有东西的和,但是你却不知道容器和容器里面装的东西是什么。当然这种情况也不多,但是有可能你需要把这个lambda表达使用在很多地方,对吧,特别是你#include <algorithm>用了里面超好用的函数之后,这种情况就变得常见了。于是这个东西可以这么写:

auto lambda = [](const auto& xs)
{
    decltype(*xs.begin()) sum = 0;
    for(auto x : xs)
    {
        sum += x;
    }
    return sum;
};

于是你就可以这么用了:

vector<int> a = { ... };
list<float> b = { ... };
deque<double> c = { ... };

int sumA = lambda(a);
float sumB = lambda(b);
double sumC = lambda(c);

然后还可以应用sub typing的规则把这个lambda表达式转成一个函数指针。C++里面所有中括号不写东西的lambda表达式都可以被转成一个函数指针的,因为他本来就可以当成一个普通函数,只是你为了让业务逻辑更紧凑,选择把这个东西写在了你的代码里面而已:

doube(*summer)(const vector<double>&);
summer = lambda;

只要搞明白了C++之后,那些花里胡俏的类型系统的论文的概念并不难理解。他们深入研究了各种类型系统的主要原因是要做系统验证,证明这个证明那个。其实编译器的类型检查部分也可以当成是一个系统验证的程序,他要检查你的程序是不是有问题,于是首先检查系统。不过可惜的是,除了Haskell以外的其他程序语言,就算你过了类型系统检查,也不见得你的程序就是对的。当然了,对于像javascript这种动态类型就罢了还那么多坑(ruby在这里就做得很好)的语言,得通过大量的自动化测试来保证。没有类型的帮助,要写出同等质量的程序,需要花的时间要更多。什么?你不关心质量?你不要当程序员了!是因为老板催得太紧?我们Microsoft最近有招聘了,快来吧,可以慢慢写程序!

不过正因为编译器会检查类型,所以我们其实可以把一个程序用类型武装起来,使得错误的写法会变成错误的语法被检查出来了。这种事情在C++里面做尤为方便,因为它支持dependent type——好吧,就是可以在模板类型里面放一些不是类型的东西。我来举一个正常人都熟练掌握的例子——单位。

一、类型检查(type rich programming)

我们都知道物理的三大基本单位是米、秒和千克,其它东西都可以从这些单位拼出来(大概是吧,我忘记了)。譬如说我们通过F=ma可以知道力的单位,通过W=FS可以知道功的单位,等等。然后我们发现,单位之间的关系都是乘法的关系,每个单位还带有自己的幂。只要弄清楚了这一点,那事情就很好做了。现在让我们来用C++定义单位:

template<int m, int s, int kg>
struct unit
{
    double value;

    unit():value(0){}
    unit(double _value):value(_value){}
};

好了,现在我们要通过类型系统来实现几个操作的约束。对于乘除法我们要自动计算出单位的同时,加减法必须在相同的单位上才能做。其实这样做还不够完备,因为对于任何的单位x来讲,他们的差单位Δx还有一些额外的规则,就像C#的DateTime和TimeSpan一样。不过这里先不管了,我们来做出加减乘除几个操作:

template<int m, int s, int kg>
unit<m, s, kg> operator+(unit<m, s, kg> a, unit<m, s, kg> b)
{
    return a.value + b.value;
}

template<int m, int s, int kg>
unit<m, s, kg> operator-(unit<m, s, kg> a, unit<m, s, kg> b)
{
    return a.value - b.value;
}

template<int m, int s, int kg>
unit<m, s, kg> operator+(unit<m, s, kg> a)
{
    return a.value;
}

template<int m, int s, int kg>
unit<m, s, kg> operator-(unit<m, s, kg> a)
{
    return -a.value;
}

template<int m1, int s1, int kg1, int m2, int s2, int kg2>
unit<m1+m2, s1+s2, kg1+kg2>operator*(unit<m1, s1, kg1> a, unit<m2, s2, kg2> b)
{
    return a.value * b.value;
}

template<int m1, int s1, int kg1, int m2, int s2, int kg2>
unit<m1-m2, s1-s2, kg1-kg2>operator/(unit<m1, s1, kg1> a, unit<m2, s2, kg2> b)
{
    return a.value / b.value;
}

但是这个其实还不够,我们还需要带单位的值乘以或除以一个系数的代码。为什么不能加减呢?因为不同单位的东西本来就不能加减。系数其实是可以描写成unit<0, 0, 0>的,但是为了让代码更紧凑,于是多定义了下面的四个函数:

template<int m, int s, int kg>
unit<m, s, kg> operator*(double v, unit<m, s, kg> a)
{
    return v * a.value;
}

template<int m, int s, int kg>
unit<m, s, kg> operator*(unit<m, s, kg> a, double v)
{
    return a.value * v;
}

template<int m, int s, int kg>
unit<m, s, kg> operator/(double v, unit<m, s, kg> a)
{
    return v / a.value;
}

template<int m, int s, int kg>
unit<m, s, kg> operator/(unit<m, s, kg> a, double v)
{
    return a.value / v;
}

我们已经用dependent type之间的变化来描述了带单位的量的加减乘除的规则。这看起来好像很复杂,但是一旦我们加入了下面的新的函数,一切将变得简单明了:

constexpr unit<1, 0, 0> operator""_meter(double value)
{
    return value;
}

constexpr unit<0, 1, 0> operator""_second(double value)
{
    return value;
}

constexpr unit<0, 0, 1> operator""_kilogram(double value)
{
    return value;
}

constexpr unit<1, -2,1> operator""_N(double value) // 牛不知道怎么写-_-
{
    return value;
}

constexpr unit<2, -2,1> operator""_J(double value) // 焦耳也不知道怎么写-_-
{
    return value;
}

然后我们就可以用来写一些神奇的代码了:

auto m = 16_kilogram; // unit<0, 0, 1>(16)
auto s = 3_meter; // unit<1, 0, 0>(3)
auto t = 2_second; // unit<0, 1, 0>(2)
auto a = s / (t*t); // unit<1, -2, 0>(3/4)
auto F = m * a; // unit<1, -2, 1>(12)

下面的代码虽然也神奇,但因为违反了物理定律,所以C++编译器决定不让他编译通过:

auto W = F * s; // unit<2, -2, 1>(36)
auto x = F + W; // bang!

这样你还怕你在物理引擎里面东西倒腾来倒腾去然后公式手抖写错了吗?类似的错误是不可能发生的!除非系数被你弄错了……如果没有unit,要用原始的方法写出来:

double m = 16;
double s = 3;
double t = 2;
double a = s / (t*t);
double F = m * a;
double W = F * s;
double x = F + W; //????

时间过得久了以后,根本不知道是什么意思了。所以为了解决这个问题,我们得用应用匈牙利命名法(这个不是那个臭名昭著的你们熟悉的傻逼(系统)匈牙利命名法)。我举个例子:

string dogName = "kula";
Person person;
person.name = dogName;

这个代码大家一看就知道不对对吧,这就是应用匈牙利命名法了。我们通过给名字一个单位——狗的——来让person.name = dogName;这句话显得很滑稽,从而避免低级错误的发生。上面的unit就更进一步了,把这个东西带进了类型系统里面,就算写出来不滑稽,编译器都会告诉你,错误的东西就是错误的。

然后大家可能会问,用unit这么写程序的性能会不会大打折扣呀?如今已经是2013年了,靠谱的C++编译器编译出来的代码,跟你直接用几个double倒腾来倒腾去的代码其实是一样的。C++比起其他语言的抽象的好处就是,就算你要用来做高性能的程序,也不怕因为抽象而丧失性能。当然如果你使用了面向对象的技术,那就另当别论了。

注,上面这段话我写完之后贴到了粉丝群里面,然后九姑娘跟我讲了很多量纲分析的故事,然后升级到航空领域的check list,最后讲到了医院把这一技术引进了之后有效地阻止了手术弄错人等严重事故。那些特别靠谱的程序还得用C++来写,譬如说洛克希德马丁的战斗机,NASA的卫星什么的。

人的精力是有限的,需要一些错误规避来防止引进低级的错误或者负担,保留精力解决最核心的问题。很多软件都是这样的。譬如说超容易配置的MSBuild、用起来巨爽无比的Visual Studio,出了问题反正用正版安装程序点一下repair就可以恢复的windows,给我们带来的好处就是——保留精力解决最核心的问题。编程语言也是如此,类型系统也是如此,人类发明出的所有东西,都是为了让你可以把更多的精力放在更加核心的问题上,更少的精力放在周边的问题上。

但是类型到处都出现其实也会让我们程序写起来很烦的,所以现代的语言都有第二个功能,就是类型推导了。

二、类型推导

这里讲的类型推导可不是Go语言那个半吊子的:=赋值操作符。真正的类型推导,就要跟C++的泛型lambda表达式、C#的linq语法糖,或者Haskell的函数一样,要可以自己计算出模板的类型参数的位置或者内容,才能全方位的实现什么类型都不写,都还能使用强类型和type rich programming带来的好处。C++的lambda表达式上面已经看到了,所以还是从Haskell一个老掉牙的demo开始讲起吧。

今天,我们用Haskell来写一个merge sort:

merge [] [] = []
merge [] xs = xs
merge xs [] = xs
merge (x:xs) (y:ys) = if x<y then x:(merge xs (y:ys)) else y:(merge (x:xs) ys)

mergeSort [] = []
mergeSort xs = merge (mergeSort a) (mergeSort b)
    where
        len = length xs
        a = take $ len `div` 2 $ xs
        b = drop $ len - len `div` 2 $ xs

我们可以很清楚的看出来,merge的类型是[a] –> [a] –> [a],mergeSort的类型是[a] –> [a]。到底编译器是怎么计算出类型的呢?

  1. 首先,[]告诉我们,这是一个空列表,但是类型是什么不知道,所以他是forall a –> [a]。所以merge [] [] = []告诉我们,merge的类型至少是[a] –> [b] –> [c]。
  2. 其次,merge []  xs = xs告诉我们,merge的类型至少是[d] –> e –> e。这个类型跟[a]->[b]->[c]求一个交集就会得到merge的更准确的类型:[a] –> [b] –> [b]。
  3. 然后,merge xs [] = []告诉我们,merge的类型至少是f –> [g] –> f。这个类型跟[a] –> [b] –> [b]求一个交集就会得到merge的更准确的类型:[a] –> [a] –> [a]。
  4. 最后看到那个长长的式子,根据一番推导之后,会发现[a]->[a]->[a]就是我们要的最终类型了。
  5. 只要把相同的技术放在mergeSort上面,就可以得到mergeSort的类型是[a]->[a]了。

当然对于Haskell这种Hindley-Milner类型系统来说,只要我们在代码里面计算出所有类型的方程,然后一个一个去解,最后就可以收敛到一个最准确的类型上面了。倘若我们在迭代的时候发现收敛之后无解了,那这个程序就是错的。这种简单粗暴的方法很容易构造出一些只要人够蛋定就很容易使用的语言,譬如说Haskell。

Haskell看完就可以来看C#了。C#的linq真是个好东西啊,只要不把它看成SQL,那很多事情都可以表达的。譬如说是个人都知道的linq to object啦,后面还有linq to xmllinq to sqlreactive programming,甚至是parser combinator等等。一个典型的linq的程序是长这个样子的:

var w = 
    from x in xs
    from y in ys
    from z in zs
    select f(x, y, z);

 

光看这个程序可能看不出什么来,因为xs、ys、zs和f这几个单词都是没有意义的。但是linq的魅力正在这里。如果from和select就已经强行规定了xs、ys、zs和f的意思的话。那可扩展性就全没有了。因此当我们看到一个这样的程序的时候,其实可以是下面这几种意思:

W f(X x, Y y, Z z);

var /*IEnumerable<W>*/w = 
    from /*X*/x in /*IEnumerable<X>*/xs
    from /*Y*/y in /*IEnumerable<Y>*/ys
    from /*Z*/z in /*IEnumerable<Z>*/zs
    select f(x, y, z);

var /*IObservable<W>*/w = 
    from /*X*/x in /*IObservable<X>*/xs
    from /*Y*/y in /*IObservable<Y>*/ys
    from /*Z*/z in /*IObservable<Z>*/zs
    select f(x, y, z);

var /*IParser<W>*/w = 
    from /*X*/x in /*IParser<X>*/xs
    from /*Y*/y in /*IParser<Y>*/ys
    from /*Z*/z in /*IParser<Z>*/zs
    select f(x, y, z);
var /*IQueryable<W>*/w =
from /*X*/x in /*IQueryable<X>*/xs
from /*Y*/y in /*IQueryable<Y>*/ys
from /*Z*/z in /*IQueryable<Z>*/zs
select f(x, y, z);
var /*?<W>*/w = 
    from /*X*/x in /*?<X>*/xs
    from /*Y*/y in /*?<Y>*/ys
    from /*Z*/z in /*?<Z>*/zs
    select f(x, y, z);

 

相信大家已经看到了里面的pattern了。只要你有一个?<T>类型,而它又支持linq provider的话,你就可以把代码写成这样了。

不过我们知道,把程序写成这样并不是我们编程的目的,我们的目的是要让程序写得让具有同样知识背景的人可以很快就看懂。为什么要看懂?因为总有一天你会不维护这个程序的,这样就可以让另一个合格的人来继续维护了。一个软件是要做几十年的,那些只有一两年甚至只有半年生命周期的,只能叫垃圾了。

那现在让我们看一组有意义的linq代码。首先是linq to object的,求一个数组里面出现最多的数字是哪个:

var theNumber = (
    from n in numbers
    group by n into g
    select g.ToArray() into gs
    order by gs.Length descending
    select gs[0]
    ).First()

 

其次是一个parser,这个parser用来得到一个函数调用表达式:

IParser<FunctionCallExpression> Call()
{
    return
        from name in PrimitiveExpression()
        from _1 in Text("(")
        from arguments in
            many(
                Expression().
                Text(",")
            )
        from _2 in Text(")")
        select new FunctionCallExpression
        {
            Name = name,
            Arguments = arguments.ToArray(),
        };
}

 

我们可以看到,一旦linq表达式里面的元素都有了自己的名字,就不会跟上面的xyz的例子一样莫名其妙了。那这两个例子到底为什么要用linq呢?

第一个例子很简单,因为linq to object就是设计来解决这种问题的。

第二个例子就比较复杂一点了,为什么好好地parser要写成这样呢?我们知道,parser时可能会parse失败的。一个大的parser,里面的一些小部件失败了,那么大parser就要回滚,token stream的当前光标也要回滚,等等需要类似的一系列的操作。如果我们始终都让这些逻辑都贯穿在整个parser里面,那代码根本不能看。于是我们可以写一个linq provider,让SelectMany函数来处理所有的回滚操作,然后把parser写成上面这个样子。上面这个parser的所有的in左边是临时变量,所有的in右边刚好组成了一个EBNF文法:

PrimitiveExpression "(" [Expression {"," Expression}] ")"

 

最后的select语句告诉我们在所有小parser都parse成功之后,如何用parse得到的临时变量来返回一颗语法树。整个parsing的代码就会非常的容易看懂。当然,前提是你必须要懂的EBNF。不过一个不懂EBNF的人,又如何能写语法分析器呢。

那这跟类型推导有什么关系呢?我们会发现上面的所有linq的例子里面,除了函数签名以外,根本没有出现任何类型的声明。而且更重要的是,这些类型尽管没有写出来,但是每一个中间变量的类型都是自明的。当然这有一部分归功于好的命名方法——也就是应用匈牙利命名法了。剩下的部分是跟业务逻辑相关的。譬如说,一个FunctionCallExpression所调用的函数当然也是一个Expression了。如果这是唯一的选择,那为什么要写出来呢?

我们可以看到,正是因为有了类型推导,我们可以在写出清晰的代码的同时,还不需要花费那么多废话来指定各种类型。程序员都是怕麻烦的,无论复杂的方法有多好,他总是会选择简单的(废话,用复杂的那个不仅要加班修bug,还没有涨工资。用简单的那个,先让他过了,bug留给下一任程序员去头疼就好了——某web程序员如是说)。类型推导让type rich programming的程序写起来简单了许多。所以我们一旦有了类型推导,就可以放心大胆的使用type rich programming了。

三、大道理

有了type rich programming,就可以让编译器帮我们检查一些模式化的手都会犯的错误。让我们重温一下这篇文章前面的一段话:

人的精力是有限的,需要一些错误规避来防止引进低级的错误或者负担,保留精力解决最核心的问题。很多软件都是这样的。譬如说超容易配置的MSBuild、用起来巨爽无比的Visual Studio,出了问题反正用正版安装程序点一下repair就可以恢复的windows,给我们带来的好处就是——保留精力解决最核心的问题。编程语言也是如此,类型系统也是如此,人类发明出的所有东西,都是为了让你可以把更多的精力放在更加核心的问题上,更少的精力放在周边的问题上。

这让我想起了一个在微博上看到的故事:NASA的员工在推一辆装了卫星的小车的时候,因为忘记看check list,没有固定号卫星,结果卫星一推倒在了地上摔坏了,一下子没了两个亿的美元。

写程序也一样。一个代表力的变量,只能跟另一个代表力的变量相加,这就是check list。但是我们知道,每一个程序都相当复杂,check list需要检查的地方遍布所有文件。那难道我们在code review的时候可以一行一行仔细看吗?这是不可能的。正因为如此,我们要把程序写成“让编译器可以检查很多我们可能会手抖犯的错误”的形式,让我们从这些琐碎的事情里面解放出来。

银弹这种东西是不存在的,所以type rich programming能解决的事情就是防止手抖而犯错误。有一些错误不是手抖可以抖出来的,譬如说错误的设计,这并不是type rich programming能很好地处理的范围。为了解决这些事情,我们就需要更多可以遵守的best practice了。

当然,其中的一个将是DSL——domain specific language,领域特定语言了。敬请关注下一篇,《如何设计一门语言(十)——DSL与建模》。



陈梓瀚(vczh) 2013-08-17 16:26 发表评论
13 Aug 13:03

[饭文]汽车时代的终结?

by 辉格

汽车时代的终结?
辉格
2013年5月27日

四月下旬,美国一家私人咨询机构的研究员道格·肖特发表了一份对美国人驾车行为的数据分析,显示美国人均年驾驶里程从2005年以来已连续下降92个月,累计降幅达8.75%,无论持续时间还是幅度,都远远超出70年代两次石油危机后的水平。

这种程度的长期连续下降,显然已很难仅仅用油价高涨和经济萧条等传统理由解释了,这更像是消费偏好的分布发生了改变,具体而言,新一代美国人不再像他们父辈那样热衷于汽车,而随着代际更替持续,他们作为主力消费群的影响不断提高,最终表现为统计上的逆转。

其它来源的证据似乎支持了这一判断,许多数据表明,上述下降大部分是年轻人贡献的:21到34岁人口购买汽车的份额,从1985年的38%降至27%;从1998年到2008年,年轻人持有驾照的比例降低了27%;2001年到2009年,16至34岁人口的总驾驶里程,更以惊人的每年23%的速度下降;与此同时,这代年轻人偏好和经常使用公共交通和自行车的比例,都上升了。

实际上,类似趋势在另一个汽车大国日本也能观察到,而且可能比美国来得更早也更迅猛,日本一度全球最繁荣的汽车用品市场从90年代后期开始迅速萎缩,加油站的数量甚至从六万多家减少到不足三万家;这可能是因为日本的老龄化来的更快更突然,年轻人口比例下降更快,而人口的都市聚集度也更高。

那么,为何新生代突然对汽车失去了热情?或许更恰当的问题是:为何他们父辈(即战后一代)如此热衷于汽车?假如这种热情是特定时期的特殊现象,那么新生代的冷淡就只是在向更“常规”的状态回归而已。

确实,汽车曾是非常特殊的商品,它突然扩大了个人的活动范围,让他们能够随时轻易越出其所在社区的边界,摆脱那张无处不在的人际关系网络的注视和它施加于个人的伦理束缚,获得前所未有的轻松与“自由”,这让正处于叛逆期的年轻人极为兴奋,给他们一种掌握自己命运的极好感觉,不难理解,那时候汽车一词总是和自由联系在一起,实际上,它确实和洗衣机一起推动了后来的性解放运动。

首先发现和利用这一妙处的人,很快成为时代先锋,被视为很“酷”并受人羡慕和追随,最终引领了一轮价值观潮流和社会变迁;由于汽车曾起了这样的作用,它便成了一种新价值观乃至新时代文化的象征,一种表现个性的工具和寻求认同的符号。

后来当这代人步入壮年成家立业时,他们整个生活方式中的很大一块,都是围绕着汽车而建立的,这样汽车就获得了类似于住宅的地位;以前,当你要向别人展示你是什么样的人,有着何种背景和经历,处境地位如何,就请他到家里做客,看看你的家是什么样子,当然,也可以请他吃饭,看你吃什么、穿什么,现在多了一个选择:开车带他去兜风。

一件商品一旦获得这种地位,它的消费模式就完全不同了,这一点老练的商家都心知肚明。然而现在,这种地位似乎正在丧失,至少不再像以前那么重要了;对于新生代,汽车曾带来的那些自由早已成了理所当然,既不需要努力争取,也不会带来多少革命式的兴奋感;而且随着都市化的继续深入和社会流动性提高,个人独立空间已很少需要汽车的帮助。

尤其是在电子商务和社交网兴起之后,虚拟身份和虚拟社区越来越不“虚拟”了,个人形象越来越多的在网上塑造和展现,关系网络越来越多通过网络构建,个人消费模式与结构越来越摆脱实体商业,而所有这些过程,私人汽车都很少参与,相反,上一代的社交和消费边界,很大程度上是由汽车来划定的。

对于今天的许多且越来越多年轻人来说,“你是什么样的人?”这个问题,很大且越来越大程度上可以用诸如“你上豆瓣还是QQ?你整天在谈论些什么话题?你看韩剧还是英剧?”而不是“你开什么车?”这样的问题来代替。

当然,如同饮食和服装一样,汽车仍将是构建生活方式的几大支柱之一,仍将是个性、身份和地位的重要候选符号,但它过去曾拥有的压倒性地位,看来正在丧失;果真如此,新一代消费者不仅会更少买车,更少追捧时髦新款,在挑选车型时会更注重实用和实惠,即便买了车也可能开更少。

相关文章

10 Aug 07:50

如何科学地看透Ta?

by 0.618

脾气秉性对于一个人如此重要,以至于当我们掌握了一个人的脾气秉性时会用“看透”这个词来炫耀对方在自己眼中的状态。一切可能的方式都可能被我们利用来分析一个人(包括自己):看相、星座、行为动作、为人处事、传记、聊天记录……甚至网易新闻还用网友的新闻态度来分析来了解一个人的思维方式。

你可能在某个新闻态度上被测出是像乔布斯一样的偏执狂。乔布斯的这个特点让人很难让人联想到他的星座——双鱼座——据说特点是多愁善感。但如果你用“多愁善感”和“星座”作为关键词,会发现每个星座都说自己是多愁善感的。

怎样将人以群分?

没有概括出一个人最核心的特点,却忽视了另一些人也可能具备的特点,这就是按照出生日期硬生生将人分成若干类的坏处。星座、生肖都是如此。将人的性格分成若干类别的做法自古有之,从古希腊的体液说将人分成4种类型,中国的五行说把人分成5种类型,一直到现在4种血型和12种星座都是一脉相承。但心理学家很难从中发现这些分类方式有任何显著的统计差异可言,也就是说这么分类和随机分类没有区别,并不能区分人们的人格特点。(心理学上的人格约等于日常中所说的性格,跟一个人的道德品行没有关系。但日常生活中我们会认为性格有好坏之分,而人格是没有好坏之分的。)

心理学家发现人类人格之复杂,不是分类可以概括的。同为外向性格,外向的程度可能并不相同。人们有很多词来形容这些人,随和、热情、开朗、活泼、爱交际、人来疯……外向更像是一个维度,每个人在这个维度上都有自己对应的一个位置。当知道一个人在所有维度上的位置时,便可以精确定位这个人的人格了。这在心理学上被称为“人格特质理论”。

空间定位需要长宽高三个维度,那么人格定位呢?

多年以来不断有人格心理学家提出自己的划分方式,有的分成16种,有的分成3种。但现在最被广泛使用的是“大五人格特质”(Big Five Personality Traits): 外向性(内向性)、宜人性(敌对性)、责任心(随意性)、神经质(情绪稳定性)和开放性(封闭性)。心理学家发现这五个维度是可以最精确定位人格的最少维度。

科学很有效,但也很枯燥

当然,这五个维度并不像“五行说”那样几乎是凭直觉想出来的,而是经过统计筛选的来的。心理学家先在词典中选出所有形容人格的词汇,然后用统计的方法将相关的词汇合并,因为相关说明他们具有相同的维度。最后合并除了这五个维度,它们之间不存在任何关系,就像长宽高三个维度不能融合。最终,心理学家确立了“大五人格特质”。

所以你只要知道了一个人在这五个方面的程度,就对这个人的人格有了比较精确的了解。这样,乔布斯就会被形容成一个宜人性很低,责任心很高的人。Sheldon这种几乎没什么情感波动的宅男,神经质水平就比较低。

现在你也许明白为什么大五人格特质这种分析人的方式不能流传在民间了,这样硬邦邦干巴巴的词汇描述出来的人简直毫无人情味可言。还不如用“偏执狂”或Nerd来得形象。

知道了你的思维方式,却不知道你在想什么

如果可以洞察人的思想,预测行为,那么即使枯燥一点又有什么关系,一定还是会被纳入到必修课中。可心理学家不但不会夸下海口,而且还会承认,人格很难决定具体行为。即使是一个高外向性的人也会有沉默寡言的时候。婚礼和葬礼这两种截然不同的场合对人行为的塑造力远远强过人们自身的性格。究竟情境和人格哪个更能影响人的行为,这也是社会心理学家和人格心理学家较量的问题。

所以根据一个人做的事情或者对某件事的态度反推这个人的性格和思维方式就更困难了,你没办法确定究竟是什么情境造成的影响。甚至长期的情境也会影响一个人的态度。从小接受中国传统教育的老人可能会觉得30岁还不结婚是大逆不道,这就是受到文化的影响,在脑中形成了自己的对婚姻的图示。现在接受了不同教育的年轻人就形成了与他不同的图示。

了解一个人的性格也不是不可能,但这需要在不同情境下长期地观察,而且即便如此你也很难根据过去的经验预测他的行为。通过几分钟的单方面介绍很难了解一个人,从24个人中一眼看到自己的心上人就更不准了。可令人绝望的是,即便以后相亲节目加入网易新闻DNA测试,你们的答案完全相同,但思维方式可能截然相反。

不过谁要管思维方式啊?你们一致的态度就足够突破一切障碍,让你们更亲近了。

编者的话:“网易思考DNA活动”据说能测出你的思维方式,要不要点击这里试一下?

相关小组

心事鉴定组
情感夜夜话

供图:ShutterStock

03 Aug 11:29

再谈电子阅读

by Yurii

今天图灵社区正式发布了《翻译漫谈》(感谢图灵的各位老师为此书付出的辛勤劳动。这本书已经发布到豆瓣阅读多看),经过这本电子书的写作、制作、发布,深入参与到电子书的“幕后”流程,不再限于普通的读者,我对电子阅读又有了新的理解。

这个封面是我自己做的,正式版并没有采纳

最深的感慨是,电子书的制作流程极大地方便了作者和出版方的沟通,尤其是减轻了修订的工作量,真正解放了作者。在传统的出版流程中,作者需要将文档以拷贝方式提交给出版方。只要涉及到拷贝,就必然要解决变化的统一问题。为了保证文稿的统一,限制变化的粒度,一般作者和出版方会约定,每一章或者一节存储为一个文件,这样如果有变化,修改的文件会尽可能的少。即便如此,涉及多处的修改(比如统一替换)还是很麻烦,而且单个文件多次修改也很难管理(只有极少数出版机构会用到版本管理系统,其它很多还习惯于在文件名上加注日期的方式标识版本),更麻烦的是多个文件之间的关联,比如“第1章的3月11日之后的版本引用的是第3章的2月28日之后的版本”。加上很多出版社更偏爱Word格式,而Word并不是印刷格式,无法保证最终印刷出来是作者想要的效果,格式转换也是相当恼人的问题。

而转向电子书之后,出版社一般会提供专门的电子书写作出版平台(这里要夸一下图灵的写作平台,支持Markdown语法,操作也比较方便),相当于出版方和作者之间确立了统一、开放的接口。无论是哪一方修改了文档,双方都可以立刻在系统中看到,并且有历史记录可以追溯,这样就不再需要分割多个文件并分别手工管理版本,彻底解决了同步的问题。此外,不同于Word的封闭格式,电子书写作出版平台上的文档数据是开放的,可以直接用其它程序批量读取、处理。即便要生成PDF、Mobi等格式,只需要运行生成程序即可,不必手工参与,既提高了速度,又减少了随意性。这确实解决了很大问题,比如勘误,纸书的勘误非常麻烦,不但不能立刻生效,还必须记录某处勘误针对的是哪次印刷的版本,而电子书的勘误修改好之后就可以马上发布。

在我看来,电子出版之所以会有这样的便利,很大程度上是因为它是在电子平台上“另起炉灶”,所以摆脱了很多传统工具的限制。纸书的成书过程中,用电子邮件作为传递媒介、Word文档作为承载媒介,虽然看起来也是“电子化”了,但是电子邮件相当于传统的书信,Word文档相当于传统的稿纸,其实不过是新瓶装旧酒,走的还是传统时代“互递拷贝,分别修改”的路子(当然,这是受工具限制的不得已)。只有到了真正的电子出版时代,传递媒介和承载媒介的重要性都极大弱化,读编双方工作的核心才真正聚集到(平台上的)文档本身上来,工具的转变造成了工作模式的转变,结果就是沟通成本的极大下降,和作者负担的减轻。

如果以上推理没有错,那么顺着这种思路,电子阅读也应该有大的革新。

传统的观点总是让电子阅读贴近纸书阅读,似乎越像纸书,电子阅读就越成功。这种观点认为,“阅读”的核心外面,紧紧包裹它的就是“纸书阅读”,所以电子阅读要做好,就必须仅仅包裹住“纸书阅读”。但是我认为事实并非如此。人们真正需要的是“阅读”,而不是“纸书阅读”,纸书阅读只不过是阅读在传统工具上的表现形式而已。因为必须使用纸书,阅读时才有分页,才有页面底部的脚注,才有做笔记的留白,才有“请翻到第xx页查找答案”……

但是仔细想想,如果书的材质是超轻超薄而且方便定位的,那么不用分页也可以阅读;如果注释可以很方便地查找,又不干扰正常的阅读,那么以弹出方式来实现也是可以的;如果有灵活变化的做笔记的空间,那么也不需要统一的留白;如果测验本身是可以互动的,那么读者也不需要“翻到第xx页”才能核对答案了。

所以在我看来,电子阅读真正要做的,不是去模拟(继而超越)“纸书阅读”,而是扣住“阅读”这个核心。没错,纸书阅读确实形成了不少传统,但电子阅读要做的不是去生硬对接这些传统的形式,而是应当仔细想想这些形式背后的实质。如同前文所说,电子阅读如果能方便地显示和隐藏注释,就可以不保留脚注,如果能提供灵活变化的做笔记的空间,就可以不保留做笔记的留白……

如果继续展开思考,纸书并不方便在书中大段引用其它文本,超链接却非常适合完成这种功能,这正是电子书的优势所在;而且纸书只能表现静态内容,但阅读有时是需要获得动态内容的,所以有些纸书的做法是使用一系列图片,但是电子书完全可以在书里嵌套视频。这样制作出来的电子书,可能形式上与传统的纸书有较大差别,却能更好地服务于“阅读”的核心,所以这种变化应当是会得到肯定的。

再进一步,就可以说到电子书的盗版问题。纸书因为是静态的,其价值凝固在成型的文字中,盗版无非就是将这些文字拷贝一遍而已,其手段就是“翻印”或者“盗印”。如果延续这种模式,防范盗版就只有“增加复制成本”一条路。不幸的是,电子信息的拷贝代价异常低廉,效率又异常高,所以“增加复制成本”这条路走起来相当艰难。

要防止电子书的盗版,不妨从它和纸书的差别着手考虑。传统的纸书,作者和读者是隔离的,作者不能直接接触到读者,甚至出版社都不能直接接触到读者,更重要的是,对作者和出版社来说,读者没有可以识别的身份,你只能知道书被人买走了,谁买的,他还买过什么书,有过什么反馈,全都是不知道的。电子书则不一样,电子书的购买必然要求读者有识别身份。有了读者的身份,作者和出版社就可以方便地与读者沟通,甚至根据读者的购买行为和反馈,量身提供推荐等等服务。只要盗版没有攻破身份系统,正版读者就可以一直保持这种便利和特权。想想多少人曾经因为提交《计算机程序设计艺术》的勘误,收到高德纳的支票而欣喜若狂,如果带有身份的勘误信息能大方存在于正文里(电子版可以做到不干扰正常阅读),他们的幸福感估计会倍增吧。

这样比较电子书和纸书的正版策略,有点类似网络游戏和单机游戏的关系。网络游戏更像是不断更新的服务,值得持续投入,才大大降低了盗版的威胁。好的电子书应该也可以走这条路,毕竟阅读的目的是为了获取信息,掌握知识,而优质的信息和知识必然是需要不断更新、精益求精的。

28 Jul 15:24

[饭文]机器会将人挤出劳动市场吗?

by 辉格

机器会将人挤出劳动市场吗?
辉格
2013年3月4日

近年来,随着信息技术变得日益强劲,它正在向产业链的各个角落迅速渗透,从设计、加工、物流,到办公、管理、供应链组织、市场交易、娱乐、社交,乃至研究部门,无孔不入,计算能力和自动化设施正在越来越多的工种和岗位上取代人力。

有人甚至认为,金融危机后的复苏过程中,就业率的回升明显滞后于消费、投资、资产价值和企业盈利等各大指标,原因之一便是企业在危机后的新一轮扩张中,更多的投资于自动化设施而非劳动力,包括制造业向美国的局部回归,也将是一次基于深度自动化的回归。

那么,机器真的会将大批劳动力挤出就业市场吗?对此,常见的乐观说法是,机器在一些岗位上取代人时,因为提高了生产率,将抬高总产出,从而在别处创造出新的就业机会;这没错,问题是,上述过程所创造的新就业机会是否足以弥补它所消灭的呢?

没有任何经济学原理能够保证这一点,具体效果将视所在产业和整个经济体的要素结构而定,假如机器渗透发生在一个劳动密集型产业,而由其产出提高所带动的、以及因总收入提高而拉动的其他产业,若劳动密集程度远低于前者,那么总的效果便可能是降低了劳动需求,从而压低工资率或抬高失业率。

也就是说,伴随着结构变动的收入增长,未必惠及每个人,在新的生产函数所对应的要素结构中,某些要素的地位可能下降了,因而将得到更少的报酬;对此有人可能会说,这种情况下工人会降低工资要价,从而在较低的均衡位置上重新实现充分就业。

问题是,当机器变得足够廉价,乃至雇佣某人的交易和管理费用超出雇佣同等能力机器的成本时,即便工资降到零也没有雇主会雇佣他,这是完全可能的,比如今天的可乐罐装厂大概不会雇佣任何搬运工去替代自动传送带,即便工资为零。

或许有人会说,假如机器果真会让大批工人失业,那么这些失去劳动报酬的人很快就会饿死,于是就业市场又会在一个较低水平上实现均衡,但实际上当代社会不大会出现这种局面,首先,失业者未必是无产者,可能拥有其他要素,而这些要素在新的生产结构中仍得到了雇佣,其次,即便他们得不到任何要素报酬,也可能得到政府或慈善组织的援助而继续生存下去,并处于毫无指望的长期失业状态。

说明机器排挤效果的最有力案例,是马的命运,历史上,马曾被大量雇佣于农业和交通运输业,但在蒸汽机和铁路发明后,它们很快被排挤出内河与陆地干线运输,内燃机出现后,更被全面排挤出支线与城市运输、农耕和军事领域;这一过程生产率和总收入都有巨大提高,但并未为马创造出多少就业机会,休闲、竞技和博彩业雇佣的马匹或许增加了一些,但与消失的岗位相比,只是九牛一毛。(见Gregory Clark: A Farewell To Alms, p.12)

当然,马被排挤后并未抬高长期失业率,因为马的数量很快减少了,但被机器排挤的人类却更可能继续生存下去并生育同样多、甚至更多的后代,结果,人口中越来越大的部分将处于长期失业状态,这个比例将随机器能力提高和成本下降而扩大,并且没有什么原理显示它存在一个上限。

乐观者最后一根稻草是诉诸经验:工业革命以来机器渗透已持续了两百多年,每轮浪潮会造成阶段性失业,但此后更繁荣的经济总是创造了更多就业机会和更高的工资率,在机器化最为深入的美国,失业率并不高,而且多半都能用其他因素来解释。

迄今为止确实如此,但那可能只是因为我们尚未越过临界点,当生产模式所对应的要素结构中劳动还占很高比例,人所能完成的任务大部分还未能被机器有效率的替代,机器因推动增长而带来的岗位就可能弥补它所挤掉的,但假如这一比例翻转过来,当生产结构中的大部分岗位,人对机器都已丧失比较优势,情况就不同了。

临界点的位置,取决于人类与机器的能力对比,由于我们不能指望人类禀赋在可见未来会有所改变,而机器则在迅猛进步,因而只能相信:临界点迟早会被越过;或许我们正在逼近它,或者全球经济作为整体已经越过了它,只是大规模失业并未均匀分配,而更多的被留在了南欧和非洲?

 

相关文章

28 Jul 11:07

[旧文]人口的未来

by 辉格

人口的未来
辉格
2012年12月19日

【谈论人口首先要明确时间尺度】

观察人口问题的一个困难是时间尺度,人口趋势需要经历多个代际周期、在数百年或更大的跨度上,才能看出些可把握的特征,进而才可能谈论某些规律性,决定人口走向的各种因素,其变化反映到人口总量上,也存在很长的滞后期,而个人的生活经历只是这些变动周期中的很短一段,因而个体经验在这里没有多大用处。

这一困难在议论中更变成了混乱,因为貌似都在谈论同一个人口问题的人们,其实关心的是完全不同的方面,当你考虑人口趋势对就业、劳动力、医疗、养老、保险、生态压力,或者特定产业发展前景的影响,需要关心的是未来五年十年按年龄、性别、城乡、和社会状况等维度细分的某一群组的人口变动,而当你评价一项人口政策的长期影响,或试图从过去经验中得出某些普遍性结论,那五年十年就显得太短了。

【短期逆转已成定局,长期又会如何?】

对于前一类专注现实问题、并将眼光限于中国社会的观察者,事情其实已经很简单:只要看分年龄人口表就行了,由于各年龄段死亡率很稳定(尽管还会缓慢下降),而移民规模对中国这样的庞大人口可以忽略,高比例城市化的后果也已注定(留在农村的大都是老人孩子,只须按死亡率和就业年龄推算即可);当然像收入结构和文化背景等维度上的细分还有待考察,但主要的数据都已摆在那里。

所以根本的争议只会发生在更大的时间跨度上,当我们从经验得出某些理论判断,并运用于比三十年更遥远的未来,或比个别国家更普遍的人类社会时,就需要重新检查我们的理论基础和逻辑链条,而不能仅凭已有的数据了。

许多人以过去几十年发达国家的低生育率为依据,断言这将成为未来各国普遍趋势,因而乐观的认为全球人口增长将在一百亿附近得到遏制,这种看法尽管十分流行,但并没有坚实的理论基础,也缺乏适当时间尺度上的历史经验支持,因为目前的低生育现象最多只持续了两代人。

【马尔萨斯的人口图景】

让我们暂且忘记种种复杂因素,先回到马尔萨斯和达尔文的起点吧;人类首先是一种生物,而生物之成为生物的根本在于,它们会尽可能多的繁衍后代,所以正确的问题不是为何人要生育、人口会增长,相反,只有生育率下降和人口停止增长才是需要解释的,那么,为何有些国家的人口趋势发生了逆转,当代低生育文化又从何而来?

在马尔萨斯看来,限制人口增长的唯一因素是可获取的生存资料(主要是食物)数量,该数量由可利用的资源和技术条件决定,它规定了人口增长的极限,在达到极限之前,人口会一直增长;每当人口接近极限时,就会以各种方式受到抑制,饥荒、瘟疫、战争等被动方式,或独身、晚婚、出家、溺婴等主动方式,这方面的现代改变是有了可靠避孕法,因而温和而人道的主动抑制可更多的代替痛苦惨烈的被动抑制。

当人类直接从环境获取食物时,极限水平直接由可获取的自然资源决定,当然技术进步可以扩大资源获取范围,比如弓箭让人类能够猎取大型动物,船舶让人类发现新大陆;在发明了农业和工业之后,人类通过生产过程间接获取食物,从而引入了生产率这个新变量;历史上,每次栖息地扩张和技术进步都将人口极限拉上一个台阶,导致一个持续增长期,然后又在新的极限上达到均衡并停滞下来。

影响人口极限的第三个因素是社会结构,假如少数权贵占有大量资源,并将其投入于非食物生产,那么同样的资源和技术条件所能供养的人口便低于其最大潜力,所以,同等条件下,资源分配更均匀的社会人口极限更高,马尔萨斯观察到,结构更为扁平的中国社会,比西欧封建社会拥有更密集的人口。

社会结构还以另一种方式影响人口水平,拥有更多资源的富贵阶层为维持一种区别于普通人的生活方式,会将自己的生育率限制在远低于其供养能力的水平,而且通过示范和模仿,他们的奢侈生活方式会瀑布式的逐级向下渗透,改变整个社会的消费习惯,从而拉低总的生育率。

不过这里需要区分两种情况,有些奢侈消费品的生产只是利用了富余劳动力和无关食物生产的资源,而在人口接近极限时,劳动生产率也已降至极限,存在大量富余劳动力,所以仅当奢侈品生产挤压食物生产,或用食物出口从其他社会换取奢侈品时,社会结构才会影响人口极限。

【告别了马尔萨斯,但问题仍在】

直到工业革命之前,这幅图景还大致适用,但工业化和城市化带来了极大改变,以至于许多人宣称,马尔萨斯理论早已破产,至少过时了,经济学家如此宣称,主要理由是马尔萨斯的边际产出递减律是错误的,确实,边际产出并非总是递减,正如工业革命历史所展示的那样,当创新和技术进步快速接连发生时,边际产出完全可能持续递增,从而让社会在很长一段时间内远离马尔萨斯极限。

然而,简单的拒斥马尔萨斯解决不了真正的困难,因为我们面临着十分现实的约束,假如技术进步果真放任人口按极限速率增长,即便不考虑生态均衡,不出五百年,地球的全部碳元素就都用于制造人体和食物了,就算届时人类已突破太空移民障碍,也终究会耗尽宇宙全部物质,所以无论如何人口必定会受到遏制,而事实上发达社会的人口也已经发生了逆转。

所以真正的问题是,究竟哪些因素、以何种机制导致了人口逆转,这一机制是会长期持续,抑或只是局部或阶段性的?

【城市化改变了什么?】

最显著的事实是,生育率总是随城市化而迅速下降,都市化程度越高,降得越厉害;但这很难算得上一种解释,它没有告诉我们人口转变的微观机制,为何人们一进入城市就不愿早生和多生孩子了?

或许我们可以像加里·贝克尔那样用成本收益结构来分析生育决定,生育的代价首先是父母特别是母亲放弃自己的闲暇、消费、职业收入和事业追求,其次,假如已经有了孩子,再生一个就需要将有限资源(包括金钱、照顾和关爱)分摊到更多孩子身上,因而降低每个的养育质量。

现代城市在两方面都有大幅改变,它为妇女提供了更多职业机会,因而提高了其时间和劳动的机会成本,而且这些职业大多需要离家连续工作,相反,在传统社会的家庭农业中,农活可自行灵活安排,容易与育儿任务协调在一起,富裕家庭的妇女更完全脱离生产,专心育儿,甚至雇佣保姆和奶妈来提高育儿能力。

农村妇女常被严格局限在家庭生活中,而城市妇女更加独立自主,拥有更多个人空间,更多兴趣爱好和事业追求,因而更难以忍受被育儿责任束缚在家务之中;同时,城市父母对孩子未来发展状况的期望也更高,因而给自己施加了更高的育儿标准:更精心的照顾,更好的奶粉、衣服和玩具,更多的教育,这些都提高了每个孩子的抚养成本,使他们很难负担得起传统家庭那么多的孩子。

【缘何舍生育而求生活质量?】

经济学家或许可以满足于这样的解释,因为经济学将偏好视为给定的,然而从我们最初设定的生物学视角看,问题仍未得到回答:为何城市妇女更偏爱个人空间和生活质量?也偏爱更高的抚养标准?为何同样一群人,从农村来到城市之后,他们的偏好、价值观和对生活的期望,都会发生如此巨大的变化?特别是,若这些行为模式并不能为他们带来遗传收益,其存在基础又是什么?

有人或许会说,追求更高的生活质量是人的本能,直觉上这似乎可以接受,但生物学上却难以成立,假如一种本能带不来遗传收益,反而会降低遗传收益(即让拥有它的个人比没有它时留下更少的后代),那这种本能就很奇怪,需要一个特别的解释,要么它曾经具有遗传价值,要么是另一种具有遗传价值的特征的副产品,要么是某种特定文化机制的产物。

前面对社会结构的分析或许可以带来些提示,富贵阶层为保持其社会地位,将大量资源投入于维持一种奢侈昂贵的生活方式,这么做虽拉低了其婚内生育率,但可以在其他方面获得补偿:更高的子女存活率,儿子们更早也更容易娶到妻子,以及更多的私生子;这些补偿优势一两代内或许不明显,但重要的是它能长期维持家族地位,从而让小幅优势积累放大。

这一点可以对照西欧封建社会和阿拉伯游牧社会来看,西欧贵族生的少,但贵族地位和财产权可靠,且延续时间长,许多家族可追溯数百上千年而香火不绝,而阿拉伯游牧部落酋长生育率极高,但游牧社会缺乏契约和产权制度,势力更替频繁,家族地位很难长期延续,因而以低生育换取长期积累性优势不是好策略。

【性选择驱动下的地位竞赛?】

那么,难道现代城市人都把自己当贵族了吗?在价值起源上或许可以这么说,市场经济打破了传统社会相对固化封闭的社会结构,极大提升了社会流动性,如今,沿着身份和地位等级往上爬升的机会似乎向每个人开放了,只要有机会和能力,人们总是选择他能够负担得起的尽可能高阶体面的社会身份,和与之相称的生活方式,特别是当他们为孩子们谋划和争取未来条件时,更是如此,即便他们自己已习惯并安于既有的地位身份,但只要可能,总是希望子女能进入更高的阶层。

这种向上爬的倾向或许已深植于人类的本性(无论是生物的或文化的),性选择在其中扮演了核心角色,经验证据表明,财富和地位总是能帮助男性找到更好的配偶和更多的性机会(尽管在现代这未必能为他带来更多后代),它是女性选择长期配偶的头号指标,即便在选择短期配偶时,也是重要指标。

女性偏爱富贵者、努力“往上嫁”的策略,激励了男性对财富与权力展开永无休止的追逐竞赛,而一旦这样的竞赛习性养成,他们会不断开辟新战场并在其中决一胜负,分出高下,从权力争夺、战争、商场职场竞争,到体育竞技、学术、游戏,每个竞技场上,参赛者内心深处总是假定了一群女性观众和评价者,尽管他们未必意识到。

追求更高端体面的生活方式只是其中一个竞技场,现代人也只是延续了这场竞赛,但问题是,这场竞赛已丧失了遗传意义;在古代,由于1)缺乏避孕手段,2)女性被高度束缚在生儿育女的道德责任之中,3)社会流动性低,因而地位能被可靠的传给后代,4)溺婴等手段违背道德且与富贵者的身份不符,因而财富身份地位上的优势会自动转变为遗传优势。

而在现代社会,这一自动关系被切断了,人们仍在为财富、地位和权力而拼搏,并利用这些方面的优势寻求更多的性伴侣和性机会,而且由于社会的开放,他们比历史上任何时候都更有机会这么做,但这些已不再自动为他们带来更多后代了,相反,由于他们在这些原本只是手段而非目标的环节上投入了过多资源,能够负担的生育率反而更低了。

【背离遗传价值的文化何以维系?】

一种原本具有遗传优势的行为模式,在丧失该优势、甚至转变为劣势之后,仍可能持续相当长一段时间,因为该模式的遗传基础(如果有的话)需要多个世代才被清除出基因库,时间长短取决于其遗传劣势的大小(假如它导致绝育,就只须一个世代)。

假如该行为模式没有遗传基础而仅由观念所造就,经由文化而传播,那么它可能永远不会被清除,因为观念可以横向传播,一个不留下后代的人也可以把观念传给他人,并影响其行为,所以我们看到,许多包含了禁欲独身主义的观念体系和僧侣组织可以长期存在,因为通过观念传播,尽管僧侣都没有后代,但僧侣组织却可以从其他群体中不断吸纳新成员。

但是,以牺牲其载体的遗传收益为代价而传播的观念体系,尽管可以长期存在,却极少可能长期占据主流地位,并构成大部分人口的行为基础,这是因为,虽然观念是后天获得的,但影响个体是否接受特定观念的“易感性”可能具有遗传基础,并存在个体间差异,假如一种观念总是倾向于让对它易感的那些载体留下更少后代,长此以往,对它易感的人就会越来越少,其传播过程便成了一个不断消灭自身传播基础的过程。

很明显,这样的过程是不可能长期持续的,此类观念系统只能处于非主流的边缘地位,而其所基于的易感性只是一些随机变异或其他具有遗传优势的特性的副产品,才能得以维持,正如独身禁欲主义在僧侣中的存在那样。

于是剩下的问题就是:当前城市低生育文化的主流地位能维持多久?我想这主要取决于与之竞争的替代文化的生育率优势,伊斯兰世界、印度教徒、儒家传统主义者、摩门教徒、新教再洗礼派,都拥有很高的生育率,其中许多还拥有很庞大的人口基数,他们将在未来几个世代成为全球人口增长的主要动力,短则两三代,长则五六代,将最终在文化上取得主流地位,假如当前西方世界的主流生育文化不发生逆转的话。

【人口压力是坏事吗?】

除了时间尺度,人口争议中另一个带来混乱的地方是,许多人总是将马尔萨斯和人口控制、计划生育、生态主义,甚至生态末世论等等联系在一起,你一提马尔萨斯和人口压力,人们就当然的以为你在暗示赞成计划生育,或在兜售生态悲观主义论调,这是极大的误解,而这一误解很大程度上是60年代兴起的新马尔萨斯主义所造成的。

实际上,马尔萨斯并不将人口压力视为负面因素,更不是悲观主义的来源,相反,他将其视为推动人类文明繁荣进步的基本动力,这一点放到马尔萨斯的思想继承者达尔文的进化论视角中,就更加显明了:人口压力只是自然选择压力的一个特例,而选择压力当然是进化的基本动力,其持续作用也是个体复杂性和物种多样性的存在基础。

诚然,人口压力会造成各种苦难和悲剧,但正是这些苦难在激励人们不断设法克服它们,而正是这一过程推动了文明进步,正如痛苦让人们回避危险和伤害,饥饿感驱使人们寻找食物,性焦虑促使人们寻找配偶,并为此而谋求种种能给自己带来择偶优势的条件,同样,自卑和屈辱感激发人们力争出人头地,改善自己的地位处境,所有这些指引人们行为的心理机制,若追根溯源,都可找到生存繁衍的需要这一基础动力。

当然,在富裕社会或富裕阶层,生存压力会相对松弛,价值观和行为模式因而也会更多样化、更难以预料,但这种松弛和漂变只是局部的、暂时的和有限的,人口压力就像拉住风筝的那根线,最终会将其拉回进化的主轨道,若非如此,社会与文明的有序结构将随漂变而瓦解于混沌。

【以计划生育应对人口压力?】

由于受新马尔萨斯主义的误导,许多人将人口压力与资源耗竭、环境退化和生态灾难联系在一起,实际上这种关系远非必然,人口增长会提高对资源的需求,但同时也让资源变得更稀缺,因而更宝贵,可是,一样东西怎么会因为它变得更宝贵而耗竭或退化呢?依常识,这不是会激励人们更加珍惜它、保护它、并努力寻找替代它的东西吗?

区别在于相应的财产权是否得到建立,假如资源的财产权明确并得到法律的可靠保障,那么稀缺性只会让它更受珍惜,相反,若没有财产权,它就可能在一阵哄抢中被破坏殆尽,这就是常说的公地悲剧,所以,应对人口压力的关键在于,如何在某些资源日益表现出其稀缺性的同时,建立起相应的财产权制度。

应对人口压力和资源稀缺性的另一条道路是由一个中央权威集中分配资源,并对需求和供给作出统一的计划规定,计划生育只是这种计划体制的一部分,这种体制需要赋予国家以空前的暴力和社会控制手段,放任其对个人实施极为严酷的强制,完全违背了人类社会最古老最基本的道德规范,是任何对个体价值和自由尚有一丝珍惜的人都无法容忍的做法。

正如哈耶克所论证的,试图借助集中计划来解决稀缺资源的分配问题,无法处理分散信息的表达、获取、传递和计算问题,注定会失败,而历史经验也早已表明,计划体制将带来极大的无效率和社会灾难,相反,财产权和价格机制已经在其漫长历史上向人们展示了其处理稀缺性问题的能力。

只要相应的财产权能够建立,人口增长带来的资源与生态压力便会经价格信号而传递到正在做生育决定的个体,让他们对生育的后果——自身的抚养负担、孩子的幸福和未来处境——作出恰当的权衡,只要他们不去偷抢别人拥有的资源,抚养负担是否太重,又何须旁人替他操心?

 

相关文章

27 Jul 05:31

SIGGRAPH 2013 Links

Once again, I’m collecting links to SIGGRAPH content: courses, talks, posters, etc. I’ll continue to update the post as new stuff appears.

Courses

An Introduction to OpenGL Programming
Advances in Real-Time Rendering in 3D Graphics and Games
Combining GPU Data-Parallel Computing With OpenGL
Dynamic 2D/3D Registration for the Kinect
Efficient Real-Time Shadows
Lights! Speed! Action! Fundamentals of Physical Computing for Programmers
Geometry Processing With Discrete Exterior Calculus
Multithreading and VFX
Numerical Methods for Linear Complementarity Problems in Physics-Based Animation
Physically Based Shading in Theory and Practice
Ray Tracing is the Future and Ever Will Be
Recent Advances in Light-Transport Simulation: Theory & Practice
Rendering Massive Virtual Worlds (via @_Humus_)
Turbulent Fluids

Technical Papers

See Ke-Sen Huang’s excellent papers list.

Talks

BlockParty 2: Visual Procedural Rigging for Film, TV, and Games
BSSRDF Importance Sampling
Creating a Nimble New Curriculum for Digital Media Artists
Crafting the Vision Effect: An Interactive, Particle-Based Hologram for “Epic”
Coded Exposure HDR Light-Field Video Recording
Discrete Texture Design Using a Programmable Approach
Driving High-Resolution Facial Blendshapes with Video Performance
Hair Growth by Means of Sparse Modeling and Advection
Imperfect Voxelized Shadow Volumes
Incendiary Reflection: Evoking Emotion Through Deformed Facial Feedback
Interactive Indirect Lighting Computed in the Cloud
Jack’s Frost: Controllable Magic Frost Simulations for “Rise of the Guardians”
Lighting Technology of “The Last of Us”
Near-Eye Light Field Displays
Oz: The Great and Volumetric
Pencil-Tracing Mirage: Principle and its Evaluation
Rendering Fur for “Life of Pi”
Screen-Space Curvature for Production-Quality Rendering and Compositing
Sketch-based Pipeline for Mass Customization
Sub-Pixel Shadow Mapping
Survey and Evaluation of Tone Mapping Operators for HDR Video

Exhibitor Tech Talks

Intel
NVIDIA Visual Computing Theater
NVIDIA Tech Talks

Mobile Talks

Challenges With High-Quality Mobile Graphics
Graphics on the Go
Make Mobile Apps Quickly
Multi-channel Acoustic Data Transmission to Ad-hoc Mobile Phone Arrays
Unity: The Chase - Pushing the Limits of Modern Mobile GPU (video)

Posters

Adjusting the Disparity of Stereoscopic 3D Media in Post Production
Advanced Interfaces to Stem the Data Deluge in Mixed Reality…
Affective Music Recommendation System Using Input Images (video)
Celestia: A Vocal Interaction Music Game
Click & Draw Selection
Coded Exposure HDR Light-Field Video Recording
Conducting and Performing Virtual Orchestra
Cost-Based Workload Balancing for Ray Tracing on Multi-GPU Systems
Digital Ira: Creating a Real-Time Photoreal Digital Actor
Enchanted Scissors: A Scissor Interface for Support in Cutting and Interactive Fabrication
Fast and Accurate Distance, Penetration, and Collision Queries…
Fine Water on Coarse Grids
GPU Ray Tracing with Rayforce
Hierarchical Volumetric Object Representations for Digital Fabrication (thesis)
Humanlike Behavior Model With Probabilistic Intention
i-me TOUCH: Detecting Human Touch Interaction
Interactive Card Weaving Design and Construction
Learning-Based Compression for Real-Time Rendering of Surface Light Fields
LightCluster - Clustering Lights to Accelerate Shadow Computation
Musical Flocks
Near-Field Illumination for Mixed Reality With Delta Radiance Fields
Nutty Tracks - Symbolic Animation Pipeline for Expressive Robotics
Photorealistic Inner Mouth Expression in Speech Animation (video)
Pencil Tracing Mirage: Principle and its Evaluation
PhysPix: Instantaneous Rigid-Body Simulation of Rasters
Polka Dot – The Garden of Water Spirits
Perch on My Arm!: A Haptic Device That Presents Weight and a Sense of Being Grabbed
Practical 3D+2D TV Displays
Real-Time Dust Rendering by Parametric Shell Texture Synthesis (video)
Reflective, Deformable, Colloidal Display: A Waterfall-Based Colloidal Membrane…
Specular Lobe-Aware Up-Sampling Based on Spherical Gaussians
SplineGrip - An Eight-Degrees-of-Freedom Flexible Haptic Sculpting Tool
The Hand as a Shading Probe
Toward Accurate and Efficient Order-Independent Transparency
Tracking Magnetics Above Portable Displays
“Tworlds”: Twirled Worlds for Multimodal “Padiddle” Spinning
Unsupervised Cell Identification on Multidimensional X-Ray Fluorescence Datasets
Visualizing the Flow of Users on a Wireless Network
Visualizing Urban Mobility

Emerging Techologies

AGATHE: A Tool for Personalized Rehabilitation of Cognitive Functions
AIREAL: Tactile Gaming Experiences in Free Air
An Autostereoscopic Projector Array Optimized for 3D Facial Display
AquaTop Display: A True ”Immersive” Water Display System
EMY: Full-Body Exoskeleton
IllumiRoom: Peripheral Projected Illusions for Interactive Experiences
Incendiary Reflection: Evoking Emotion Through Deformed Facial Feedback
Light-in-Flight: Transient Imaging Using Photonic Mixer Devices
PAPILLON: Expressive Eyes for Interactive Characters
TransWall (second video)

Birds of a Feather

Camera
COLLADA
OpenCL
OpenGL
REST 3D
WebCL

Keynote

Marc Davis Lecture Series: Giants’ First Steps (via Eric Haines)

Photos

Official
Mauricio Vives

22 Jul 12:45

“反常识”思维

by 同人于野
???

所谓的进化脱节

(《东方早报·上海书评》,2013年7月21日)

芦山地震,有人批评我国电视台的报道过于煽情。记者们有意刻画了太多哭泣和死者的画面,他们竟试图采访一个还在被废墟压着的人,甚至还想直播帐篷里正在进行的手术。你这是报道灾情呢还是拍电视剧呢?

但煽情是文人的膝跳反应。日本NHK的灾难报道可以理性而专业,然而对绝大多数中国观众来说煽情是他们最能听懂的语言。不煽情就没有高收视率。也许更重要的是,煽情可以获得更多捐款。

2007年发表的一个研究中,几个美国研究者以做调查为名招募了若干受试者,并在调查结束的时候发给每个受试者5美元作为报酬。不过研究者的真正目的是搞一个决策实验。这个实验的机关在于,随着5美元一同发到受试者手里的还有一封呼吁给非洲儿童捐款的募捐信。而这封信有两个版本:

– 第一个版本列举了一些详实的统计数字:马拉维有三百万儿童面临食物短缺;安哥拉三分之二的人口,也就是四百万人,被迫远离家园,等等。

– 第二个版本说你的全部捐款会给一个叫Rokia的七岁女孩。她生活在马里,家里很穷,时常挨饿,你的钱会让她生活更好一点,也许能获得更好的教育和卫生条件。

研究者问受试者愿不愿意把一部分报酬捐给非洲。结果收到第一个版本募捐信的人平均捐了1.14美元,而收到第二个版本募捐信的人平均捐了2.38美元。

据说是斯大林说的,“杀死一个人是悲剧,杀死一万个人是统计数字”。这个捐款实验证明统计数字的力量远远比不上一个人,一个具体的人。受试者对远在天边的国家的抽象数字没有多大兴趣,而他们对一个具体人物 — 哪怕仅仅听说了她的名字和最简单的背景,都更乐于出手相助。

在石器时代的几十万年里,甚至对大多数中国人来说一直到进入现代社会之前,我们都生活在一个“具体的”世界中。我们的活动范围仅限于自己所属的小部落或者小村庄,很多人一生去过的地方也不会超过一天的路程。我们熟悉每一个有可能打交道的人,而这些人的总数加起来也不是很多。这种生活模式对大脑的演化有巨大的影响。据英国人类学家邓巴估计,我们至今能够维持紧密人际关系的人数上限,也只有150个而已。 当我们需要做决定的时候,我们考虑的是具体的事、具体的人、和他们具体的表情。在这些具体例子的训练下,我们的潜意识早就学会了快速判断人的真诚程度和事件的紧急程度:我们不会把钱借给一个嬉皮笑脸的名声不好的坏人,但是会借给一个窘迫不安的众所周知的好人。进化本能使我们毫不费力就可以通过人脸和情绪来作出判断。婴儿刚出生几天就能识别不同的面部表情六个月就能识别不同的人脸我们只需要四分之一秒的时间就能以相当高的准确度从两个政客的照片中找出更有能力的那个

这种“具体思维”做各种选择的首要标准,是道德。费孝通在《乡土中国》一书中提出,世代定居的传统中国社区本质上是熟人社会。在熟人社会中人们做事不是靠商业和法治,而是靠道德和礼治。在这个体系中出了案子,首先关乎的是名声和面子,而不是利益。乡绅会“先照例认为这是件全村的丑事”:“这简直是丢我们村子里脸的事!你们还不认了错,回家去。”费孝通说乡土中国的最高理想是“无讼”,就好像足球比赛中每个人都能自觉遵守双方的规则,而犯规的代价不单是被罚,更是整个球队和指导员的耻辱。

生活在这样的社会里,我们的首要技能的不是数学计算,而是分辨善恶美丑。也许这就是文人思维的起源:针对每个特定动作的美学评价。有时候他们管这种评价叫“价值观”,但所谓价值观无非就是给人和事贴或好或坏的标签。文人把弘扬真善美和鞭挞假恶丑当成自己义不容辞的责任。

低端文人研究道德,高端文人研究美感。他们的原始本能使他们热爱大自然,他们赞美花、赞美蓝天、赞美山水、赞美健康的动物和异性。这些赞美会演化成艺术。可是只有刚接触艺术的人才喜欢令人愉快的东西,审美观成熟到一定程度以后我们就觉得快乐是一种肤浅的感觉,改为欣赏愁苦了。人类历史上大多数人很难接触到什么艺术,而现代社会却能让艺术普及,也许这就是为什么统计表明过去几十年流行歌曲的趋势是感情越来越忧伤和含糊。所以美学是不可能客观的,每个人都在鄙视别人低端审美观和被别人鄙视,我们在审美观的鄙视链上不断移动。文人有时候研究病态美、悲壮美、失败美等等,也许更高境界则追求各种变态美。但本质上,他们研究美。

文人对事物的议论是感叹式的。有时候他们赞美,有时候他们唾弃;有时候他们悲愤,有时候他们呼吁。他们说来说去都是这个XXX怎么这么YYY啊!

他们有时候把自己的价值判断称为“常识”,因为这些判断本来就是从人的原始思维本能而来。

然而现代社会产生了另一种思维,却是“反常识”的。

现代社会与古代最大的不同,是人们的生活变得越来越复杂。除了工作和休息,我们还要娱乐和社交、学习和发展、以及随时对遥远的公众事务发表意见。我们的每一个决定都可能以一种不直截了当的方式影响他人,然后再影响自己。面对这种复杂局面,最基本的一个思想,就是好东西虽然多,你却不能都要。

你想用下班时间读书,就不能用同样的时间看电影。你不能又读书又看电影又加班又饭局,还有时间辅导孩子学习。距离工作地点近的房子通常更贵,你不能要求这个房子又大又便宜又方便。长得帅的未必挣钱多,挣钱多的很可能没那么多时间陪你。我们不得不在生活中做出各种取舍,而很多烦恼恰恰来自不愿意或者不知道取舍。古人很少有这样的烦恼,他们能有一个选择就已经高兴的不得了了。

取舍这种思维,英文有一个可能更形神兼备的词:tradeoff。两个好东西我不可能都要,那么我愿意牺牲(off)一点这个,来换取(trade)一点那个。Tradeoff是“理工科思维”的起源。讨价还价一番达成交易,这对文人来说是一个非常无语的情境!既不美也不丑,既不值得歌颂也不值得唾弃。斤斤计较地得到一个既谈不上实现了梦想也谈不上是悲剧的结果,完全不文艺。所以文人不研究这个。

Tradeoff要求我们知道每一个事物的利弊。世界上并没有多少事情是“在没有使任何人境况变坏的前提下使得至少一个人变得更好”的所谓“帕累托改进”,绝大多数情况下兴一利必生一弊,而利弊都不是无限大的。可是文人思维仍然停留在有点好东西就高兴的不得了的时代,习惯于无限夸大自己的情感,一边说金钱如粪土,一边说朋友值千金,一边说生命无价,一边说爱情价更高。做过利弊分析,理工科思维要求妥协,而文人总爱戏剧性的不管不顾,喜欢说不惜一切代价,喜欢看动不动就把全部筹码都押上的剧情。理工科思维要求随时根据新情况调整策略,而撒切尔夫人说她“从不转弯”—可能是因为选民爱听这个,不过她的确不爱转弯。

对自己的事物搞不好tradeoff,生活仍然可以对付着过下去。但现代社会要求我们必须在整个社会的尺度上进行tradeoff。从美学角度看计划生育制度不但不美简直还灭绝人性,但是从社会角度人口暴涨的确有可能成为灾难。历史上很多国家因为人口太多而发生生产和社会退化,十八世纪的日本甚至连牛马都不用了,什么都必须用人,甚至打仗都不用枪炮直接退回到原始状态。所以我们不能光考虑计划生育这个动作的美学,我们得计算这个动作的后果。而且这个计算必须随时修正,比如现在就很有必要考虑是否应该继续保留这个制度。但文人却喜欢用一个动作的“美感”来说服别人。万历皇帝想收商业税,东林党反对,而他们给出的反对理由不是收税这个动作的输出后果,而是“天子不与小民争利”!当然有人认为东林党其实代表利益集团,是故意拿道德作为借口,但这种不重知识重姿势的谈话氛围仍然令现代人震惊。

诺贝尔奖得主丹尼尔·卡尼曼的《思考,快与慢》一书,把人脑的两套思维系统称为“系统1”和“系统2”。前者自动起作用,能迅速对事物给出一个的很难被改变的第一印象;而后者费力而缓慢,需要我们集中注意力进行复杂计算,甚至我们在系统2工作的时候连瞳孔都放大了。系统2根本不是计算机的对手,没人能在百万分之一秒内计算111.61872的平方根。然而系统1却比计算机强大得多,直到2012年Google用了1.6万块处理器,才让计算机学会识别猫的脸 — 而且它肯定还不会识别表情。系统1这么快,显然是因为它在漫长的进化史中非常有用的缘故。我们可以想见一个不会算数,甚至不会清晰地逻辑推理的人只要知道谁对他好谁对他坏,靠本能也能在草原上生活的不错。只有到了现代社会,他才会有大麻烦。文人思维显然是系统1的集大成者,而理工科思维则是系统2的产物。

Tradeoff要求量化输入和预计输出,这也是理工科思维的最根本方法。但人脑天生不适应抽象数字。伦敦奥运会组织者给运动员准备了15万个避孕套,竟在开幕仅仅五天之内被用完腾讯请来梁文道、蒋方舟和阎连科三位文人对此事发表了意见。这三位都是高端文人,根本不计较道德,专门谈审美,甚至还要做一番技术分析。梁说他从来都是公开支持性产业和性工作者。蒋说拥有优秀基因就会花心。阎说中医认为以毒攻毒,性可能也是一个疏通渠道。三人说的都挺有意思,可他们怎么就不算算一万运动员五天用掉15万个,这是每天六次的水平!真正合理的解释是大部分套被运动员拿走当纪念品了据运动员说,奥运村还真没到性晚会的程度。

文人思维天生喜爱耸人听闻的消息,如果再加上不爱算数,就会对世界乱担心和瞎指挥。请问在以下死亡方式中,哪种是最值得担心的?在海滩游泳被鲨鱼攻击,恐怖袭击,还是被闪电击中?直到911事件让恐怖袭击的戏份突然变大,美国媒体上曾经充斥着鲨鱼攻击的报道。而事实上美国平均每年死于鲨鱼之口的还不到一人 — 从这个角度说鹿比鲨鱼危险得多,死于开车撞上鹿的人数是前者的三百倍!一个美国人在过去五年内死于恐怖袭击的概率只有两千万分之一,而根据《经济学人》最近提供的一个各种死法危险排名,其在一年内死于闪电击中的概率则是一千万分之一 — 闪电比恐怖分子厉害十倍!

这种担心会左右公共政策。文人可能从“是不是纯天然的”这个角度认为有机农业很美而核电很可怕,这不是一个好标准。可是他们总希望自己的声音大到能够调动很多人感情乃至于按照他说的“常识”采取行动的地步。他们号称是“民意”的代表,但他们代表的只是未经过tradeoff的原始民意。在大多数公共问题上,常识是不好使的。资源调配即使做不到完全依赖市场,也不应该谁声音大就听谁的。

听作文的不如听论文的。以下这四件事,每个文人都想要:(1)用纯天然方法种植的有机农业;(2)保护环境;(3)取消人口控制;(4)让每一个人都吃饱穿暖。可是这四件事不可能同时做到,你必须放弃一个。有机农产品上的农药残余的确更少,但是如果你考虑到有机农业的低产量,其生产一单位食物所消耗的水和地都比化肥农业高很多,综合起来的结果是有机农业更破坏环境。产量低是个致命缺点。事实上在没有化肥的时代,人类养活不了很多人口。在这种情况下文人再怎么大声疾呼有机农业也没用。

“好吧,”这时候有个文人说,“我有钱我自己吃有机食物,这总可以吧?”可以。但根据2012年斯坦福大学的研究者发表在《内医学年鉴》的一份针对过去几十年两百多项研究的总结报告,有机食物甚至并不比普通食物更健康。

现在到了用理工科思维取代文人思维的时候了。传统的的文人腔已经越来越少出现在主流媒体上,一篇正经讨论现实问题的文章总要做点计算才说的过去。

本文引用了几个最新的研究结果,但这其实是一篇一百年以前就能写出来的文章。从1915年陈独秀创办《青年杂志》至今我们喊了近百年赛先生却仍然没搞清楚赛先生是干什么的。赛先生远不止是“鬼火是磷火”之类的少儿科普。他是常常违反常识,甚至可能变来变去,可是你却不得不依靠他来做出决策的硬知识。他更是有时候简单到tradeoff的一种并不“自然”的思维方式。

 

20 Jul 02:44

读《PhD Grind》有感

by Yin Wang

记得一年前正在准备离开 IU 的时候,有人介绍给我斯坦福博士生 Philip Guo 的这本小书《PhD Grind》,讲述他自己的 PhD “奋斗故事”。当时我没有仔细看。前几天跟一个朋友谈起 Coverity,他再次的跟我提起这本书,我才发现 Philip 在斯坦福的导师正是 Coverity 的创始人之一 Dawson Engler 教授。Coverity 的主要技术就是由 Dawson 和他的学生 Andy Chou 的一篇 OSDI 论文发展而成的。而 Philip 在 Dawson 手下做的第一个项目就是 Klee,一个跟 Coverity 具有类似性质的东西。

在这种“渊源”的吸引之下,我把这本书从头看到了尾。不得不承认,这是一本非常难得的,真实的记录一位“名校博士”的研究生活细节的文献。我对 Philip 此举致以崇高的敬意。如果你正在考虑进入博士班,特别是计算机博士,我强烈建议你先看看这本书,因为你可以清楚的看到你将面临的生活。

虽然 Philip 读博士的动机和经历跟我很不一样,然而这里面提到的许多东西也发生在了我的身上。在某些观点上他比我看的更加透彻,更加乐观一些。然而在另外一些观点上,我觉得自己的认识更加深刻。现在我就其中的几个主题,谈谈自己的看法吧。

发表的游戏

整本书里都充满了对于“发表论文”这个游戏的各种术语,仿佛作者的头脑里每天想的都是这些事情。他在这上面用得最多的词汇,就是 “top-tier conference”, “second-tier conference”,“workshop”,“第一作者”,“第二作者”,“投稿接受率” 等用于对会议和论文进行“分级”的词汇。看到这些词汇,让我仿佛又回到了清华的年代,因为当时我耳边出现最多的也是这些词汇。出现第二多的,就是“deadline”。有人把计算机科学戏称为“deadline 驱动”的科学,也就是这个原因吧。

通过会议(而不是期刊)来发表论文,铺垫自己在学术界的道路,这是计算机科学特有的现象。其它的科学领域一般都更看重期刊的论文发表,而会议只是交流思想的场合。程序语言领域的一些顶尖学者,比如 Matthias Felleisen(《The Little Schemer》的第二作者),已经意识到了这个问题。他们觉得,计算机科学的很多会议,其实在起着降低研究氛围和研究质量的作用。这些会议之中,又以那些出版“会议文集”(proceedings)的会议更为有害,因为这些会议吸引了更多的为了凑论文“发表数”(而不是为了与人交流)而来的人。

虽然 Philip 声明自己并没有想改变学术界的现状,但我觉得他把这些事情如实的描述出来,对于计算机领域的未来是有相当的意义的,至少它能引起大家的反思。反思的人多了,自然就会有人想改变这种现状。比如,程序语言的领域最近开始出现一些专门用于交流思想,而不是发表论文的会议。我希望计算机科学能向其它领域学习,要么成长起来成为一门真正的科学,要么就勇敢的承认自己不是科学。

研究兴趣

从整本书来看,Philip 从一开头就有一个理想,他想提高人们编程的效率。然而进入斯坦福之后,他找了 Dawson 作为导师。而 Dawson 所专注的领域其实叫做“程序分析”(也就是 Coverity 的专长),它更接近于我的领域(程序语言,PL)。这两者的兴趣看似相关,却是很不一样的。读博士最麻烦的事情莫过于找了兴趣不一致的导师。所以读博士之前一定要先搞清楚自己在乎什么,要看准兴趣相投的导师,而不是学校的名气。对于这个问题,你可以参考 Matthias 的一篇文章。然而这个说起来容易做起来难,因为很多学生是自欺欺人,好像自己对什么都能感兴趣一样,只求能找到一个教授。

很显然 Dawson 不是很在乎 Philip 关心的大部分编程工具(除了 IncPy),他可能觉得那些东西太“轻量级”了。这种现象在程序语言的研究者里面较为常见,包括我之前的导师 Amr Sabry。当我兴致勃勃的给大家做演讲,介绍我的 ydiff 工具的时候,Amr 没有到场,并且没有回复我任何一封有关 ydiff 的 email。很显然,他觉得我做这些事情是浪费时间,降低自己的价值。然而我觉得这是很有意义,很好玩的事情,并且将来这种工具应该会被程序员广泛的采用。喜欢做一些好玩难度又不大的东西,并不说明这个人不能做高精尖的东西。我们应该关心的最重要的事情,其实是这个东西可以给人带来的好处。

所以在这种意义下,我不但赞成 Philip 的这种动机,而且是在同一条船上的。 Philip 后来所做的 IncPy,其实是比较地道的程序语言研究题目。在程序语言的研究里面,IncPy 对应的技术叫做“self-adjusting computation”,是 Umut Acar 首先提出来的。Umut 的系统是在 C 语言的基础上实现的,而 Philip 的 IncPy 系统是基于 Python。

让新手做脏活

Philip 在斯坦福第一年做 Klee 项目的遭遇,非常像我在 Coverity 的那几个月,虽然 Klee 的质量显然没法和 Coverity 相提并论。很显然,不管是大学教授的研究小组还是公司,新手进去都是“打下手”,“做脏活”的,以至于让人头脑麻木。

在程序分析工具里面,这种脏活就更多。要修复任何一个 bug 都极其困难。经常是费了好几天功夫,结果最后发现只修改了一两行代码就搞定。我在 Coverity 就做了好些这种事情,做得头痛。白天做,晚上做,睡觉了都还在想那东西到底出了什么问题!如果最后发现修复的那些 bug 是自己根本不会犯的错误,那就更加郁闷。遇到跑 benchmark 这种活就更惨,完全没有“智力”可言,一跑就是好几天。

公司对于我这种“不明底细”的“新手”有如此的待遇还情有可原。毕竟这些麻烦事是要有人来做的,不找新人来做找谁?可是像斯坦福这样的大牌牛校,对于优秀的新同学(Philip 可是拿了两个 fellowship 来的)也是同样的待遇,就有点丢脸了。这哪里叫“培养”啊?

Philip 也提到了他为什么不换导师。因为如果换一个研究组,进去又得从头开始做脏活。这就是我在 IU 的最后一个学期的遭遇。幸好,我其实啥都没干,走掉了。

恶性竞争

Philip 多次提到这样的事情,比如“当发现不是竞争对手之后,我们很快的成为了朋友。”我想,你已经感觉到了同领域的研究生之间是什么样的关系了吧?

不管是在 Cornell 还是在 IU,我都遇到类似的情况。同领域的学生之间很少成为朋友,不是怕自己的想法被人偷走了,就是怕自己“心仪”的教授,或者实习机会被人抢走。所以博士生之间经常处于一种猜忌的状态。相反,硕士生这种问题就少很多,大家都互相抄作业,“共同进步”。

在 IU 的 PL 学生里面,我是最惨最孤独的一个。因为基本上什么问题都逃不过我的“慧眼”,所以大家都回避我,害怕告诉我他们在干什么。要么就是怕我一下子就把问题给搞定,提前发论文了,要么就是怕我心直口快揭穿他们的小把戏。然而其实我根本不在乎这些东西。

据说 PL 领域的两个史前大牛 Matthias Felleisen 和 Olivier Danvy 也因此不受学术界人士欢迎,因为他们经常在别人做完演讲之后在下面大声说:“这个问题20年前就已经解决了。”当然我没他们那么直接,可是转弯抹角问个问题也能把台上人问得很囧,所以到后来我就干脆不问问题了,免得得罪人。

选择教授的窍门

Philip 提到,Dawson 的学生,除了一个人以外,三年都没能发表一篇论文,离开了这个小组,有好几个还直接离开了斯坦福。对此我也有类似的经验。

这是一个选择教授的经验教训。如果你真的想拿博士学位,而不是跟我一样只重视学习真本事的话,教授的名气有多大,他有多聪明,跟你一点关系都没有。最重要的,是看他制造博士生的速度和“毕业率”。毕业率太低的教授一般都有问题。

如果一个教授十年来只有两个博士生从他手里毕业,你觉得你会是下一个幸运儿吗?

反思计算机科学

看来不管是斯坦福,MIT,Cornell 还是 IU,计算机专业都一个样。你发三四篇 paper,然后东拉西扯把它们“串成”一篇博士论文,然后就可以毕业。论文都是发在会议,各个会议都有不同的 deadline,所以你基本上就是在被这些 deadline “驱赶”着做研究。会议的论文审评过程也有非常大的问题。

所以我比较幸运(或者说不幸)的是,Dan Friedman 和 Kent Dybvig 这样的教授,根本不在乎什么 deadline,他们也不在乎会议的“等级”。他们更看重的是论文的内容。所以我在 IU 的近四年里,从没感觉到这种问题。程序语言的一些顶级专家比如 Neil Jones,有时候也发表在一些 workshop 上。他们只是从兴趣出发,希望在会议上与人交流。你可别小看了这个 Jones 教授,在我的心目中他可是跟图灵一个级别的科学家。

在这种意义上,Philip 所在小组的风气其实远远比不上我在 IU 所在的小组。然而,IU 并不是每个组都这样,我只能说 Friedman 的“小组”是比较特殊的。实际上,这个“Friedman 小组”是根本就不存在的。我们这帮学生都是各自为政的,没有人管。