07:17 谈运气 » Bo’s Blog 邵博客

运气在创业、投资的时候重不重要?我觉得很重要。

先来讲个故事。易趣在2000年的时候没钱了,需要融资。现在我跟我投资的公司的创业者说融资一定要赶早,至少在没钱之前6个月就要开始,因为与VC接触,让他们熟悉你个人、你的模式、你的团队,进行投资意向书(term sheet)谈判,VC做尽职调查,最后做文件,这个过程至少需要6个月。而且VC在谈判的时候大多都是狼,看你没钱了,一定会跟你拖,让你急得上吊,最后把估值降下来。在我2000年时,没有人跟我说这些话,结果3月份钱差不多用完了,这才醒悟过来,急着去找钱。还好2000年3月正是互联网泡沫的最高峰,NASDAQ在5000点左右,而且易趣还做得不错(当时差不多已经是中国最大的C2C电子商务网站了),有很多VC感兴趣。

记得当时有一个法国公司叫做LVMH——对,就是那个做手袋和洋酒的——下面有个投资公司特别积极,见了一次面就开价2亿多美元,要投资5000万美金。可惜好景不长,3月份NASDAQ在5000点开始跳水,短短2个月内就跌到了3000多点。这个投资公司的投资意向就从5000万降到2000万美元,估值也降到了1亿多美金,但至少他们还在往前推进。

到了7月份的时候,有一天我在华尔街日报上读到这家投资公司取消了他们自己的上市计划,那时我还是第一次听说他们自己也有计划要上市。当我读到这个消息,就觉得有点大事不好:会不会是他们的母公司不看好互联网了?是不是这家投资公司自己也没钱投资别人了?于是我开始准备,万一他们不投资我们了,该怎么办?我打了一个草稿,仔细准备了一通说辞。果然,1天后,我接到一个电话,我记得那时正在北京香格里拉酒店的大堂,我的手机响了。虽然说这个电话只打了几分钟,但我至今都记忆犹新。这家投资公司的人告诉我,他们决定不投了。我开始先告诉他我已经拒绝了其他的投资者,现在如果要我重新开始和别人谈的话,恐怕时间上来不及,我们的生存会有问题。接着,我给他一个可行的建议,问他能不能出500万美元,我去凑剩下的1500万美元。为什么说500万,而不是200万或者1000万?这是因为当时易趣的投资者占20%多的股份,如果这一轮融资2000万美元的话,如果已有的股东要维持股份比例不变,那么他们至少要投资500万美元。如果这家法国投资公司的投资金额少于500万美元的话,那么相当于他们不能成为这一轮的领投者(单次融资中投资金额最大的投资者),这样不但别的可能的新投资者不会跟投,已有的投资者也有可能失去信心不再放钱进来。反过来,如果我跟这家投资公司要太多钱的话,能拿到当然好,但我怕他们没钱。最后,我没有当场要这个人答应,因为我知道他不是最终的决策者,在这个节骨眼上,决定要从上面
下来。我想过,这个电话的目的是要他说“我回去考虑一下,回头给你答复”。我的目的达到了。

挂电话之后,我马上拼命发动所有的关系,通过一个朋友找到了这家法国投资公司的母公司的大老板(也是法国的首富),最后拿到了这500万美元,加上已有的投资者和其他的新投资者,凑足了2000万美元。这是2000年中国互联网最大的一笔融资。

回想起来,没有运气是万万不行的。当初如果没有看到那篇华尔街日报的文章,就不会有充分的准备,很有可能接到电话会大吃一惊,然后要么是无奈地接受,要么是大吵一架,这都与事无补。如果不认识我的好朋友,也不可能联系到那个法国首富并让他在互联网泡沫破灭的时候慷慨解囊。

但是,只依靠运气也是万万不够的。看了报道,没有去详细思考策略,没有做充分的准备,易趣也可能没有几年前的成功。

在易趣历史上,还有很多类似的例子,包括在易趣刚刚诞生的时候,我老婆提醒我可以找哈佛同学谭海音回国帮忙。有好老婆和好同学是运气,但我能够说服海音放弃刚找到的投行工作是本事。

讲了一个故事,道理是什么?第一,创业成功的人不要太招摇,运气很重要,要谦虚。要知道有很多一样有本事的人,运气不好,所以没有成功。第二,现在还没有成功的人,不要气馁,也不要怪运气不好,最重要的是,抓住运气给予的每一个机遇。我们这个时代的中国人,在中国奋斗的时候,一定迟早有大的机会出现,就看你能不能抓住。
第三,投资要投人,投资者要谦虚,不要在董事会上指手画脚、觉得自己很聪明。要知道,在一个创业公司里面,每天都有很多挑战和机遇,好的创业者和CEO会抓住这些机遇,就像2000年7月那天我看到了华尔街日报的那篇文章。同样的公司,同样的模式,好的创业者抓住命运每天给的大大小小的机会,就会成功;不好的创业者,抓不住这些机会,就会失败。投资者不在公司工作,根本看不到这些机遇,更不要说指导创业者去抓住它们了。

漫谈 Language Model (1): 原理篇Free Mind » 车东's shared items in Google Reader

lang-model本文是“漫谈 Language Model 系列”中的第 1 篇,参见本系列的其他文章原本只是想简单地谈一下 Lanugage Model ,而且之前的漫谈 Clustering 系列还没有写完,似乎又起一个系列不太好,但是在脑子里构思了一下,要说的东西好像也不少,放到一起似乎真的有点长了,而且一时半会估计也写不完,所以还是觉得做成一个系列吧。

Language Model 中文就叫做“语言模型”吧,这实际上是一个概率分布模型 P ,对于语言里的每一个字符串 S 给出一个概率 P(S) 。稍微正式一点的定义可以这样说:假设有一个符号的集合 \{w\} ,我们不妨把每一个 w_i 称作一个“单词”,由零个或多个单词连接起来就组成了一个字符串 S = w_1w_2\cdots w_n ,字符串可长可短,例如实际语言中的句子、段落或者文档都可以看作一个字符串。所有合法(例如,通过一些语法约束)的字符串的集合称作一个语言,而一个语言模型就是这个语言里的字符串的概率分布模型。

在上面的非正式的定义中,我使用了“单词”、“字符串”这样的字眼,然而 Language Model 实际上非常通用,任何由一些基础单元组成的序列都可以使用 Language Model 的方法来分析,例如 Speech Recognition 里的音频信号,Bioinformatics 里的基因序列等。其实文本分析的那一套词汇“单词”、“字符串”之类的也是可以代表更通用的意义的。

那么 Language Model 有什么用呢?给出一个字符串的概率,可以用来干什么呢?随便举一些例子:

  1. 一篇文档,也许是通过扫描 OCR 识别得到的,或者是部分破译的密文,以及部分损坏了的文档等等,总之有一些地方字词缺失,有一些不同的可能,这个时候就可以用 Language Model 来计算并选择概率最大的那一种。
  2. 专门建立特定的 Language Model 也是很常见的,比如,如果把程序看成是一个指令的序列的话,那么可以分别构建两个 Language Model :\mathcal{M}_1\mathcal{M}_2 ,分别代表正常程序和病毒的模型,给定一个程序,只要分别用两个模型计算出对应的概率,比较一下谁大谁小,就可以判断出该程序是不是病毒了。
  3. 也有像搜索引擎那样建立很多个 Language Model 的情况,通常搜索引擎在检索时会先通过倒排表等非常高效的手段从海量的数据里找出相关的内容,然后会使用相对复杂但是更精确一些的算法来为这些结果排序(毕竟大部分用户都只会关心第一页甚至只是前几项搜索结果),抛开著名的 PageRank 不说,使用 Language Model 也是一种比较常见的手段。具体做法是每个文档会有一个对应的 Language Model ,在 rank 的时候使用这些 Language Model 来计算 query 的概率,最后按照概率值由大到小排序即可。

这样看来 Lagnuage Model 倒是挺诱人的样子,好像干什么都可以。而这也正是典型的 Generative Model 的特点(Language Model 算是一种 Generative Model),Discrimitive Model 致力于解决一个特定的问题,而 Generative Model 则试图寻求数据的本质,一但成功构造出数据的实际模型,就可以用它来做(几乎)任何事情。不过,一切都建立在能够正确够找出 the true model 的前提下。且不谈在实际实现时会遇到的各种工程上的难题,就算是仅仅从理论上来讲,也是无法给出什么保证的,就现实中的问题,我们构建 Language Model 的方法通常都是提出一个模型假设,然后根据训练数据使用最优化的方法求得模型——一方面,训练数据是有限的;另一方面,模型的复杂度也必须要限制在可以处理的程度内。所以,通过在不同的地方“放水”,我们会得到各种近似的结果。

不过话也说回来,这并不是 Language Model 的错,几乎所有机器学习的算法都有这样的限制。只是想表明前面举的查毒或者 rank 的例子,虽然都是轻描淡写似的,但是其实真正做起来还是很复杂的;而 Language Model 也不是神话,只是解决问题的 yet another way 而已。 :p 幸运的是,许多看起来非常粗糙的近似方法,在某些特定的领域其实能得到不错的结果,最典型的一个例子也许应当属于垃圾邮件过滤领域的“朴素贝叶斯”方法了。

不过,在朴素贝叶斯之前,我们还是先来看看 Language Model 究竟如何来构建。前面说了,一个 Language Model 要给出一个字符串的概率:P(S) = P(w_1w_2\cdots w_n) ,了解一点概率论知识的人应该都知道这个式子可以像这样分解:

\displaystyle
\begin{aligned}
P(S) & = P(w_1w_2\cdots w_n) \\
       & = P(w_n|w_1w_2\cdots w_{n-1})P(w_1w_2\cdots w_{n-1}) \\
       & = P(w_n|w_1w_2\cdots w_{n-1})P(w_{n-1}|w_1w_2\cdots w_{n-2})P(w_1w_2\cdots w_{n-2}) \\
       & = P(w_1)\prod_{i=2}^n P(w_i|w_1\cdots w_{i-1})
\end{aligned}

例如,对于字符串 He eats apple ,我们有 P([He][eats][apple]) = P([He])P([eats]|[He])P([apple]|[He][eats]) ,其中 P([apple]|[He][eats]) 里 [He][eats] 是 [apple] 的上下文(也许称“上文”在这里更加形象一些),同一个单词,在不同的上下文中出现的概率实际上是不一样的,特别是在一个字符串中越靠后的词,它将有越“长”的上下文 。

在构造模型的时候,我们可以通过统计训练数据里各个单词(在各个 context 之下)出现的频率来近似逼近它的概率,问题在这里就会出现了,本身随着 context 长度的增长,可能的情况会爆炸性地增长,训练数据不可能覆盖所有可能的数据,更严重的是,要存储这些频率值所需的空间也是指数增长的。例如,一个语言里只有 10 个单词,如果要记录一个词的长度为 6 的 context ,如果不考虑语法规则之类的限制,允许单词的各种组合的话,那么就是 106 种情况,于是可以想想规模稍大的语言里会达到什么样的复杂度了。

为了避免这种爆炸性的复杂度增长,有人做了一个很大胆的近似方法:抛弃所有的上下文信息。现在一个单词在不同的地方出现,对于这个模型来说都是同等对待了,我们知道 apple 做主语的概率肯定比做宾语的概率要小(姑且认为是这样吧 ^_^bb),我们也知道 look 作为动词和作为名词的情况应该区别对待的,我们有许多许多的理由来否定这个模型,简直太 Naive 了!没错,就是 Naive ,这种方法的名字就是 Naive Bayes ,中文叫做朴素贝叶斯。

朴素贝叶斯直接抛弃所有上下文信息,这样 P(w_n|w_1w_2\cdots w_{n-1})=P(w_n) ,因此:

\displaystyle
\begin{aligned}
P(S) & = P(w_1w_2\cdots w_n) \\
       & = P(w_1)\prod_{i=2}^n P(w_i|w_1\cdots w_{i-1}) \\
       & = \prod_{i=1}^nP(w_i)
\end{aligned}

这样,这个模型只需要提供所有单词的概率,那么任意复杂的字符串的概率都可以直接分解计算出来,并且单词的概率也更加容易求得,只需要用训练数据中每个单词出现的次数除以总的单词数目即可,并且不需要太多(相对于考虑上下文的情况)的文档就可以训练出比较精确的模型来。

不过,虽然连名字里都带了个 Naive ,然而这种方法在某些地方效果还是相当不错的,email例如垃圾邮件过滤。具体步骤是这样的:

  1. 我们会有一些训练数据,就是一些垃圾邮件和一些正常邮件。
  2. 分别用这两类邮件训练出两个 Language Model ,亦即统计出两类邮件中各个单词出现的频率,进而计算出它的(近似)概率。
  3. 对于待分类的文档 d ,根据贝叶斯公式,我们有 P(d)P(spam|d) = P(spam)P(d|spam) 以及 P(d)P(ham|d) = P(ham)P(d|ham) ,这样 P(spam|d) – P(ham|d) 正比于 P(spam)P(d|spam) – P(ham)P(d|ham) 。
    • 其中 P(spam) 和 P(ham) 是先验概率,是两个常量,通常根据 domain specific 的知识估计出来,或者直接设置为 0.5 。
    • 而 P(d|spam) 和 P(d|ham) 就分别是两个 language model 所给出的概率了。展开来就是文档 d 的字符串里的单词分别在两个 language model 里的概率值的乘积。
  4. 这样,差值大于零时就可以判断为垃圾邮件,否者则为正常邮件。还可以设置一个阈值,在差值的绝对值小于这个阈值的时候表示无法判断,以降低判断的错误率。

这就是完整的朴素贝叶斯方法。然而,在很多时候,这样的模型还是太简单了,造成了比较大的 bias ,效果并不好。因此有折衷的方法就是考虑一定长度以内的上下文,例如,仅考虑长度为 1 的上下文,亦即每个单词的前一个单词,那么

P(S) = P(w_1)P(w_2|w_1)P(w_3|w_2)\cdots P(w_n|w_{n-1})

另外还有长度为 2 的上下文,这些在 Speech Recognition 以及 Natural Language Processing 里面用得比较多,更长上下文的模型则不那么常见了。对于上下文长度为 2 的模型,我们总是考虑三个连续单词 w_1w_2w_3 组成的元组,称作 trigram ,类似的有 unigram 和 bigram ,以及通用的 n-gram

最后要提一下,虽然在英文里按照单词的界限是很明显的,但是对于中文来说,一个“词”的划分却要复杂许多,因此构建 n-gram 也有两种不同的方法,通常根据应用的需要可以直接在“字”的基础上构建 n-gram ;也可以先分词之后以“词”为基本元素构建 n-gram 。这里生成的 n-gram 用于构建 language model ,其实又可以反过来帮助完成分词的任务,在存在多种可能的划分里选择最佳的一种。对于这样一个句子“研究生命起源”,它可能是字符串“研究 生命 起源”或者“研究生 命 起源”,如果我们有一个 Language Model ,那么只需要计算两个字符串的概率,取概率最大的那一个就可以了。


^==Back Home: www.chedong.com

^==Back Digest Home: www.chedong.com/digest/

<== 2009-07-31
  八月 2009  
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
==> 2009-08-02