Sunday, August 9, 2015

大组织中的囚徒困境及破局所需的信任和信息对称的建立机制

    囚徒困境(Prisoner's Dilemma)是经济学中普遍的一类现象。与之相关的推广是外部性问题(Externality)。这些现象的产生,要么是信息不对称(囚徒之间无法串通协作),要么是成本方收益方不匹配(比如环境污染产生的外部损害不会被造成污染的企业承担的问题)。
    当一个组织很小的时候,完全可以形成每个人都认识所有人(Everybody knows everybody)的状况;这里信息不对称可以缩小到很小,这些人面对所有的任务,当现实产生收益和成本时,很容易在小团队内协调这些成本和收益。然而,能保持组织始终是一个小的规模是一件很不容易的事情,因为可能现实不允许,或者决策者的失误。
    随着组织的增大,每个个人和团队的成本和产出都会有很强的外部性,这些外部性时很难被评估的,比如你有个想法,但不知道怎么做,找到了一个更有经验的同事请教,找到了答案,后面实施会拿到效果,整个公司都会受益。这位被找到的同学就向你输出了正的外部性,使你受益,但他本身并没有直接受益。这些外部性会形成对“大锅饭”管理的压力,就是如何避免形成大锅饭。
    解决大锅饭问题仍然需要的是信息,而信息的获取是需要很大成本的。给每个人设置一个评价者,如果形成完全客观的评价,必然是成本很高的事情,甚至是对人要求很高的,甚至超过了这个被管理者总的产出能力。
    组织大了,能否将这种管理工作分摊呢?比如每个人都承担一部分管理工作。这实际上就形成了各种会,因为员工需要靠会来获取信息,去传达信息,去量化工作。另外还有周报,周报是个很有学问的东西,像所有的读物一样,它也是有受众的,这些受众往往决定了员工客观上的产出,或者主观上的对产出的评价。因此周报也是个现实扭曲立场元素,不完整报道是轻的,更有甚者夸大产出,或者转嫁矛盾。
    如果不考虑成本因素,增加人肯定会增加产出,至少不会降低,因为可以让新来的人歇着不添乱就是了。考虑了成本,就要考虑产出,新人必须有发挥的天地。新人也会变老,老人也会离职。事实上每个人都要求有产出,这些产出至少看起来是值哪些工资待遇的。每一个人都会倾向于在这个过程中成为一个麦克斯韦妖,即向外界吸收正的外部性,并输出负的外部性。通俗的讲就是把好活尽量自己或自己的团队干,把脏活累活不出明显成果的事情让其他人或其他团队干。
    此时不得不说“价值观”这个东西。价值观本身就是设计来解决这个问题的,就是尽可能吸收负的外部性,并输出正的外部性。既然提出来了,就要奖励,不然价值观好的员工必然会受到长期持续的损害而失去生存在组织里能力。价值观像工作成果一样,也是需要评价的,评价的成本像评价协作一样困难,因为价值观本身是关于协作的一个角度。在大的组织规模下,价值观是很难被评价的,事实上它也会成为衡量工作业绩的一部分。人们仍然会去抢镜头,去选美,去体现visibility,而不是正如价值观所说的增加正的外部性。
    小的团体和组织是实现突破和改变的必要条件,这和直觉是相反的,做一件需要突破的事情用大的团队是很难的,因为很难统一行动,而且大部分人时平凡的平庸的,不愿意做突破需要的改变习惯的事情。
     小的团体是机遇信任和信息对称建立的,在这里可以较好的消灭囚徒困境和外部性的问题,使团队能在一定的范围内的任务发挥最大的产出能力。随着团队规模的增加,信任和信息对称的成本越来越高,给定成本的情况下信任和信息对称的程度也是越来越低的,它们是一个团队最为昂贵的事务。
    在小的团体之外,应当基于逐渐递减的信任和信息对称程度来形成组织,减少不必要的协作而不是增加它们;从而可以把团队的精力集中在有产出的工作上,并在更少的协作上突破,并拿到结果,从而建立团队之外的信任和信息对称。
    永远不要期望在互相了解很少的,戴着和谐氛围面纱的人中间形成紧密的协作和高效的产出,了解是需要成本的,有成本就要考虑投入产出比(ROI)。
    按照通信的密度建立局部性(locality)是增加效果的关键,信任时昂贵的,我们只够买得起一个小的范围内的信任和信息对称,更大范围内的,需要集中在少数几件事情的成功协作上来建立信任和信息对称。

Friday, August 7, 2015

特征工程指南(3):多粒度交叠式特征离散化

  概率论中在实数上定义定义的事件就是Borel集。Borel集是从拓扑空间中的开集通过可数次交、并运算及补集运算得到的。至于为什么这样定义是个严密的数学系统设计的问题,不是本帖讨论的重点。
  本帖讨论的重点是,Borel集实际上定义了所有可能的实数上的事件,这里包括是某一个区间上的事件,也就是说,无论怎么切分,它是一个事件,当且仅当它是一个Borel集。
  特征离散化实际上就是切分Borel集,我们当然无法也不必要从工程上穷举所有Borel,然而我们却不必要求只列举那些无交(disjoint)的Borel集,这种无交的borel集构成了一个对当前特征空间的一个划分。
  我们可以想象一个划分,这个划分上的每一个Borel集在线性模型(如LR)中对应一个权重w。为了能拥有较好的非线性特性,我们往往需要对这些集合切得很细;但不能太细,太细了会导致训练样本不足从而被L1正则化因子压为0。
  怎么能实现既不必对Borel集切得太细,又能实现复杂的非线性呢?可以通过进行重叠切分来实现。重叠切分有两种做法,一种是滑动窗做法,比如窗口的大小为w,每次滑动d,w>d,最终这些窗口覆盖整个特征空间。
  另外一种做法是分层切割,就是按照2-3个层次,在每个层次上用一个粒度的Borel集覆盖整个特征空间。
  还有一种做法是模仿Random Forest,针对区间进行随机切分,这样信息会被这种随机切分表示得很完整。

Thursday, July 23, 2015

分享的本质-摆脱那些似是而非的口号

  分享并不简单,绝不是某些人的口头禅所说的那样,分享出来,放在一起,就是一个新的事物。能分享是一种能力,大部分东西其实是能分享的,如果不忽略下面的意义,那就是需要能为通过分享而诞生的新事物去做些什么,比如原有模块的打磨,鸿沟的填充等等。

  在一个大组织中,每一个小团队,或者个人,想生存下来,并不是看能否在现实中创造客户,正如公司的使命那样;而是能否得到组织的承认。组织的概念是抽象的,但是确实实实在在存在的。经常能看到所谓“圈地”现象,就是一个小团队会向组织申请出一块“地盘”,然后在这个地盘上进行工作。由于公司的业绩较弱的跟每个团队关联,因此具体是否干得好,并不存在严格意义上的评判标准,而是非常依赖老板(做决策者)的判断。这种判断很多时候并不准确,导致地虽然全下来了,可能只是被很潦草的耕耘过,或者根本没有有效的耕耘。

  评判的时候来了,团队大部分都没有有效的成果,因此就需要在原来的地盘上比,既然不能比产出,就要比谁的地盘大了。因此,抢地盘、抢成果,却没有见过抢耕耘的。非常有趣的现象,不乏很优秀的人,很多都是如此。

  为了扩大地盘的大小,某团队可能会提出要分享,所谓分享,就是把在某块地盘上“成功”的成果复制到其他的地盘上去。分享的关键在于廉价,也就是不需要太多额外的努力就能在新的地盘上拿到成果。但是,很多原因决定了分享并不容易,比如原先的成果就不是为分享设计的,而是为专门的场景(地盘)高度优化和定制的,因此在新的地盘上很可能不能适应,不能适应也就无法直接生存下来。

  接下来发生的事情就更有趣了,没有人愿意为分享的东西再做一些额外的工作。首先分享者不愿意,因为新的地盘并不是他的;接受分享的人也不愿意,因为一则他并不熟悉分享的事物,另一方面也不愿意付出巨大的努力,还让别人分去了成果。共同的原因是需要很多额外的努力才能使分享真正拿到结果。

  最坏的并不是不能分享,最坏的是“圈地”。被圈下来的地与自己关系不大,往往也就荒废了。这时候即使跟别的团队有关系,这块被圈下来的地也无法被耕耘,因为:当说的时候,通过含糊其辞圆滑措辞能够做到;当作的时候,要么偷工减料,要么严重延期,或者干脆不deliver东西。

  说是很贱的,贵在行动。如果一件事情跟你没什么关系,而你提供的分享只是似是而非的一个“部分”,那么至少要在分享的态度上柔和一些,即使对方相信你,你也要说清楚到底什么是不能做的,不要给别人设置了期望,却无法达成,最终放了别人鸽子。


Saturday, June 27, 2015

特征工程指南(2):离散化

在Logistic Regression模型中直接使用数量型特征是不明智的:比如我们有个数量特征代表广告历史上的浏览次数,另外有一个特征是平均点击率。直接使用这两个特征作为LR的输入特征是不行的,原因首先是这两个特征的幅度不同,其中一个的幅度是上万,而另一个特征是0-1之间,可以想见第一个特征对应的权重的幅度必然会远远小于第二个特征对应的权重,从而使第一个特征的权重逃脱正则化的惩罚,无论这种正则化是L1还是L2。因此第一个特征的重要性会高很多。

那么如果讲特征的幅度归一化到同一个范围,比如0-1之间是否就可以了呢?还是不行。原因是LR本身是个线性组合经过Logit变换得到的输出结果。怎么能保证你的特征恰好是可以线性组合的呢?在现实中很难实现这一点。Logistic模型源于最大熵状态下的分子能量分布,能量和概率之间是logit关系,怎么能保证历史点击率(特征)和预测的点击率是这种关系呢?很难。

为了避免线性的问题,可以将特征的取值从(0,1)之间变为{0,1}两个取值。由于{0,1}之间不存在其他取值,因此避免了线性组合假设的要求。

可以从另一个角度上来理解离散化特征,就是一个样本可以同时属于若干个子集,比如性别{男,女},年龄{1-6,7-11,12-22,23-30,31-}等等。这里的集合可以分为若干组,每一组具有相关或互斥的含义。互斥并不是必须的,可以并不互斥,比如集合本身是交叠的。LR本身是求取这些子集上的权重,比如男:0.1,女:0.3等等。

通过离散化之后的维度要高很多,典型的广告模型的维度可以达到百万到百亿数量级。这样数量级的特征几乎把空间划分得细致极了,以至于模型把历史上的事件几乎分门别类的“记住”了。

如何离散化特征呢?有两种基本的做法:

  1. 等宽离散化。就是按照范围等分成等长的区间进行离散话,比如年龄可以按照每5岁一个区间进行划分。
  2. 等频离散化。将样本按照某一待离散化的特征的大小从小到大排列起来,然后按照等分样本个数去划分区间。容易看到这样得到的特征离散化结果和#1中的情况会有所不同。在大部分情况下,这种离散化方法的效果会更好,因为它可以照顾到多数的样本,而不至于发生样本在特征上聚集的时候等宽离散化丢失了很多信息。
以上两种方法都是比较简单的特征离散化方法,在要求不高的情况下可以接受。如果希望智能一点,可以将等宽和等频离散化结合起来使用,这样既可以避免特征聚集,又可以避免划分的区间过大或过小。

一个比较高等的做法是通过决策树进行离散化。决策树在生成的过程中会对连续特征进行切分,这些切点可以作为离散化点使用。




Wednesday, May 13, 2015

特征工程指南(1):去伪存真

首先声明我在特征工程工作方面有着很少的经验,实际中看到很多同学做特征工程的时候做的一些反思,而不是第一手的资料。如有谬误,敬请原谅,如果能在留言中指出更是感激不尽。本文主要是针对初涉此道的同仁。

一个典型的特征工程问题是这样的,比如要做广告的CTR预估,这是广告相关的人工智能技术中的非常重要的工作。我们先做以下一些假设:
  1. 我们拥有用户的历史浏览(Page View)和点击(Click)操作数据。这里的浏览是指浏览的页面和投放的广告;点击则专指对投放的广告的点击。可能用户并没有看到投放的广告,这里并不做区分,也就是广告只要是投放,就认为用户看到了。
  2. 我们需要预测的是当前正在发生的PV中该投放哪些广告,以使得期望收益(RPM)最高。RPM=CTR*ECPM。其中ECPM是实际发生点击时广告主向广告商支付的费用。该价格有着非常复杂的生成过程,在广告中叫做竞价机制或者机制。
  3. 所用的模型是线性Logistic Regression(LR)。
上面就是最初始的假设。其中1和2的假设是原问题假设,而3则是模型的限制,现在模型选择已经很丰富了,不同的模型选择对于特征工程的做法是有一些区别的。这里选择的LR模型是业界广泛使用的模型。

接下来需要干什么?两件事:整理训练数据和制作特征。本系列文章主要讨论制作特征的问题。

制作特征需要原始特征,原始特征是指那些数据中可以直接提取的特征,但原始特征并不是直接可以用于训练模型的,原因是模型对特征都会有一些要求。

LR是一个线性模型,p(y|x,w)=1/(1+exp(y*(w'*x)),其中w是模型参数向量,x是特征向量,y表示二分类的标号,为了使模型表达更简洁,y的取值为{-1, +1}。

那是不是说只要x是实数向量,就可以直接扔到模型进行训练了呢?答案是否定的。这里对x的分布有着严格的要求。

首先x的各个维度之间的幅度的问题,比如一个x_1取值范围是(0,1),另一个x_2取值是(0, 1000),将这样的训练数据拿去训练是肯定得不到你想要的模型的。原因是x_1和x_2的幅度差异太大,参数再加正则化约束会使得x_2对应的参数w_2的幅度偏小从而逃掉正则化约束,从而使x_2的作用不合理的偏大。当然这或许是你想要的,但概率极其渺茫。

那是不是说将x_2除以个1000,就万事大吉了呢?答案仍然是否定的。原因稍微复杂一点,就是比如原始的x_2 有0.99的概率取(0,1)之间的均匀分布,有0.01的概率是999,后果可想而知不是你需要的。

这说明,需要对特征进行深度的加工。

在深度加工之前,我们先看看作为原料,可以选择哪些原始特征吧。

我们很容易想到,历史的广告的点击率是有用的。

但这个点击率对于充分展示的广告来说或许太粗了,我们还需要考虑个性化因素,因此当前用户对该广告的点击率是有用的。

但这样太细了,缺乏泛化能力,因此需要找到介于以上两个粗细之间的粒度的特征,来提高泛化能力。我们想到了一个用户对某一类型(类目)或者广告主的广告的点击率。

在用户这段也需要做一些泛化,我们可以提前对用户提取profile,然后建立profile和广告之间的关系作为特征。

在上面的思路的基础上,还可以将profile打到广告上面,也可以对广告建立profile,作为广告的受众profile。用profile之间的联系作为特征。这种联系可以是内积(计算出来的匹配度)或者外积(具体的匹配项笛卡尔积)。

广告都是有上下文的,如投放在哪个网站,什么页面,页面的内容是什么,都可以作为特征来考虑。考虑的方式可以与用户特征类似。

现代的广告引擎一般包括两个阶段:粗选(Match)阶段和精选(Rank)阶段。本文所讲的CTR预估模型一般用于Rank阶段。

Match阶段和Rank阶段也需要结合起来。在Match阶段通常也会有如下信息:该广告是如何被选中的。比如是通过用户及网页关键词检索到的,那么有相应的检索索引及检索到的分数。这些也可以作为特征。

因此,最原始的特征可以包括:广告特征(A)、用户特征(U)、上下文特征(X)、Match特征(M)。

进一步的,对这些特征进行组合也是有意义的,比如AxU,AxX,UxX等,甚至更高阶的组合。

这就是你进行工作的原始特征的大致范围。


Tuesday, May 12, 2015

什么样的工作是一份好工作?

工作不仅仅是一个养家糊口的工具,除了获取收入之外,工作还有很多钱之外的功能。从主观上,工作(应该)可以愉悦身心,陶冶情操;工作可以提升能力,锻炼心智;工作可以让人保持和社会的深度接触,保持“社会人”的属性。
具体的讲,如果工作能让你做到以下几点,就是好工作:

  1. 找到生命的意义,让人充实有成就感。一份好的工作能激励你每天从起床到休息,保持着良好的状态,长期带来健康的提升。而一份不好的工作会让你失去人生的热情,在恐惧和贪婪的折磨中度日。
  2. 学习到更多的技能。从硬技能(做业务需要的技能)到软技能(人际关系和组织管理的技能)都应该被重视起来。
  3. 为自己积累。一份工作默认情况下是为公司和组织积累的,但这和为自己积累并不矛盾。你在工作中是否为自己积累了经验、人脉、数据、资本、甚至做事的雄心?
  4. 找到组织。一份好的工作提供的不仅仅是那把椅子,而是伟大的组织,是伟大的组织造就了伟大的个人。
自勉。

Friday, June 14, 2013

工作中要“多管闲事”

每一份工作都有KPI(关键表现指数),没有KPI就无法明确目标,而过于KPI导向同样会引入歧途。任何一份工作,只要是从事这份工作的人还有一些自由度,也就是有一些选择做什么和不做什么的自由度,那么就必然有一些事情,是KPI中没有定义清楚的部分。一些刚毕业的同学会比较忽视这部分,认为事不关己,高高挂起,完成自己的事情为准。然而,这部分可能是从大的方面来说,对公司很重要;从小的方面来说,对保持和提高团队的战斗力必不可少。
我不想仅仅从功利主义的角度上来探讨这个问题,因为这个问题涉及的是规范,用功利主义无法证明其必然性。定义在KPI中的东西是人人都可以看到的,这部分会拉开人与人之间的差距,担不是根本性的;而定义在KPI之外的事情,则是很多人忽视的,或者不屑于做的。这部分工作日积月累,会拉开人与人之间的差距,而且是根本性的。
作为一个工程师,公共的开发机你添砖加瓦维护了吗?公共使用的开发框架你搞清楚了吗,还是每次向同事请教?那些可以你或者他做的事情,你主动要求自己承担了吗?
多承担一些,你会变得与众不同。