对于第一条 pipeline,专注搞定你的系统基础设施。如果你不能完全信任你的 pipeline,那么那些天马行空的机器学习算法,就会如空中楼阁。
Eric:意思是说,后续你再尝试、迭代模型的时候,如果基础不打牢靠,你出了问题就会很担心会不会是基础设施出了问题(比如抽样、数据处理等等),这样你没法专心迭代上层了。
第一个模型给你的产品提供很大的推力,所以呢,他不需要很花哨。但是你会遇到很多意想不到的基础建设问题。在别人使用你酷炫的机器学习模型之前,你需要决定几个事情:
- 如何获取样本.
- 初步决定在系统中什么是"好"的,什么是"坏"的.
Eric: 这里应该是指样本的"正", "负".
- 如何将你的模型融合到你的程序中。你可以在线 predict,或者离线算好,把结果存到表格里。比如,你可能想离线计算网页结果存到表里,而对于聊天消息则必须在线计算.
选择比较简单的特征,这样更容易保证:
-
这些特征正确到达你的算法.
按:無法正確到達的情況,指的就是特徵生錯了,或是特徵更新失敗等情況。至於什麼叫做「簡單」的特徵?則是你不需要將特徵做複雜的轉換,或是經過很多不同的系統、也不需要仰賴額外的系統 input,以致於在中間增加出差錯的可能。
-
模型学到合理的权重.
-
在服务器上,这些特征也能正确得到.
按:特別強調這點,表示作者很清楚 production 環境有太多變因:機器資源(CPU、記憶體、硬碟)、網路連線、環境設定不一致、不可抗力等因素,都會是問題,簡單來說上線就是戰場,任何事情都會發生。
Eric: 扎心了老铁,实际情况是离线很好的特征,在线因为经过环节变化,往往质量和分布都变化了...
一旦你有了一个可以可靠做到以上3点的系统,那么工作已经完成了大半了。简单模型可以提供基本的数据和表现,你可以用来测试更复杂的模型。有些团队第一次希望保持"中立":也就是第一次推出的时候,特别不将机器学习的效果摆在第一位,以免分心。
确保基础设施是可以测试的,并且系统的学习部分是被封装好了的,这样你就可以测试周边的所有环境,尤其:
- 测试将数据喂进算法的部分。检查该被填的特征被填好了。如果隐私政策允许,手动检查模型的输入。如果可能的话,检查 pipeline 中的统计值,并和其他地方做比较,像是 RASTA。
Eric: RASTA 是 google 的 A/B Test 环境,就是线上部分流量用来对比实验的。这里作者的意思应该是查看自己离线 pipeline 的样本、特征分布情况是否和线上一致.
- 测试模型在训练环境之外的表现。确保模型在训练环境和线上环境能给出同样的 score。
Eric: 这个要求似乎有些理想化,因为有的时候因为系统和环境限制,离线和在线环境的模型效果是没有办法保持一致的。(见 #Rule 37)
机器学习有不可预测性,故确保你有针对训练和测试环境的样本产出测试,确保你能在线上环境加载固定的模型。同时,理解自己的数据也特别和重要:见Practical Advice for Analysis of Large, Complex Data Sets.
通常,我们会从别处复制一个 pipeline (i.e. cargo cult programming), 但是老的 pipeline 丢弃的数据,可许正是我们需要的。比如,Google Plus热点资讯的 pipeline 会丢弃老帖子,(因为热点资讯只关注新帖子的 排序)。这个 pipeline被用在Google Plus Stream 上就必须把老帖子留下,因为在这个业务场景下老帖子是有意义的。 另一个比较常见的模式是只把用户可见的信息 log 起来。那如果我们想建模分析为啥某些帖子没有展现,这份数据就会不够用,因为所有负样本都找不到了。在 Google Play 里也发生过同样的悲剧,几个游戏主页的数据混在一起,没法区分来源。
Eric: 这里需要一些背景知识,因为天朝访问不了 Google Play,所以这里不太知道咋翻译,就简略写了。
通常,机器学习试图解决的问题都不是全新的。排序、分类等问题,可能都已经有解决方案了。也就是说已经有了一些人工规则或者先验办法存在在那里了。如果你能在机器学习里用到这些已有的东西, 则可祝你一臂之力。 你应该尽量挖掘先验办法中的价值,这样做有俩原因。首先,这会使得机器学习的引入过程更加平滑。其次,这些既有规则往往包含了很多对系统的 直觉理解,而这些理解往往是很有价值的。要想用到先验办法,有四种途径:
-
用先验规则来做预处理。 如果老特征(指先验规则)特别的 nb,那么就可以用这招。比如对于一个垃圾过滤器,如果已经有一个发送者黑名单了,那就直接用,别试图再去把这个工作用机器学习方法重新搞一遍。这个办法在二分类问题中尤其好用。
-
新增特征。 把先验规则直接当做特征来用也不错。比如做query 的相关性评分,直接把先验规则的打分当做一路特征。以后你可能会用机器学习技术去 massage 这个值(比如把这个值离散化到一个有限集合,或者和其他特征进行组合),但是在开始的时候,就裸用先验特征吧。
-
挖掘经验法则的输入。 如果有一个apps经验法则是把安装量、摘要字数、星期几结合在一起作用的,就把这些特征拆开了喂给你的机器学习模型。可以参考组合当中的一些 Rules。(见 Rule 40)
-
修改样本标签。 当样本原始标签不能完全表达经验法想达到的目的时候,这会是一个选择。比如你的任务是最大化下载量的同时,也想兼顾内容质量,那么也许你可以把下载量和星级相乘,得到最终想要的目标。这里可操作的自由度很高,可以参考"你的第一个目标"。
千万注意引入经验法则给你机器学习模型带来的复杂度的提升。也许这样做会让你切换更加平滑,但是也想想有没有更简单的办法能够达到同样效果。