If it’s interpretable it’s pretty much useless.

做机器学习的时候要想清楚自己的目标是什么。是获得模型,还是获得预测能力。
前者是统计学家,后者是数据科学家。

If your model doesn’t have the same performances on the training set and in the live environment is not a matter of trust, but a problem either in your dataset or in your testing framework. Trust is built on performances and performances on metrics: design the ones that work for your problem and stick to them. If you’re looking for trust in interpretability you’re just asking to the model questions you already know the answers, and you want them to be provided in the exact way you are expecting them. Do you need machine learning for building such a system? The need of ML arises when you know questions and answers but you don’t know an easy way to get from one to the others. We need a technique to fake the process, and it might be that an easy explanation for it doesn’t even exist.

(略)

I’m not a fanboy, and the more I know about machine learning, trying to build some real products out of it, the most I loose interest in this kind of discussions. Probably, the only useful thing about ML is in its ability to replicate processes that aren’t easy to describe explicitly: you just need questions and answers, the learning algorithms will do the rest. Asking for interpretability as a condition for real world usages is undermining the foundations of the whole field. If the trained model has good performances and it’s not interpretable we are probably on the right track; if it’s interpretable (and the explanation is understandable and replicable) why loosing weeks and GPU power? Just write some if-else clauses.

Source: If it’s interpretable it’s pretty much useless. – Massimo Belloni – Medium

机器学习项目检查清单

Aurélien Géron 所著《Scikit-Learn与TensorFlow机器学习实用指南》附录有份机器学习项目的检查清单,非常实用。
故翻译如下。

描述问题并观察大局(the big picture)

  1. 用商业术语描述目标。
  2. 你的解决方案要如何运用?
  3. 目前的解决方案或变通方法是什么?
  4. 你要如何表述这个问题(监督/非监督学习,在线/离线学习等)?
  5. 怎样衡量性能?
  6. 性能指标与商业目标一致吗?
  7. 达到商业目标的最低性能是什么?
  8. 有没有类似的问题?你有可重复使用的经验或工具吗?
  9. 是否有专业人士的支持?
  10. 你如何手工解决这个问题?
  11. 列出你(或其他人)到目前为止的假设。
  12. 尽量核实假设。
Continue reading “机器学习项目检查清单”

精准镇压:新科技将让独裁者如虎添翼

毫无疑问,1984所描述的社会正在到来。

多年来,中国政府一直在花钱雇佣所谓的“五毛党”(成千上万名假装回贴的水军)在网上发布支持政府的讯息,转移网上批评者的注意力。未来,机器人将替代这些“政府雇佣军”的工作。

这些越来越狡猾的机器人将与其他新工具一起工作,方便独裁政权传播虚假信息。这些新工具包括“deep fakes”——无法与真实音频、视频或图像区分开来的伪造音像。音频伪造品目前已经非常完善,可以骗过很多听众: Lyrebird公司称自己可以做出“世界上最逼真的人造声音”。Lyrebird等多家公司的语音合成系统,仅需一分钟的原声录音就能生成听上去与讲话者无差别的音频。

很快,视频技术也能发展到这个程度。在YouTube上,我们已经看到了男演员史蒂夫·布什密(Steve Buscemi)和女演员珍妮弗·劳伦斯(Jennifer Lawrence)令人不太舒服的合成脸,也看到了中国公司科大讯飞(iFlytek)发布的一段不甚完美的视频,视频中特朗普(Donald Trump)和奥巴马(Barack Obama)都在讲着流利的普通话。这样的伪造视频将很快逼真到令人不寒而栗的程度。达特茅斯大学(Dartmouth)的计算机科学教授Hany Farid认为,防守者在这种形势下将“处于劣势”。“开发技术来操纵内容的人数可能是监测虚假内容的人数的100到1,000倍。”今年1月,他对皮尤研究中心(Pew)表示:“突然之间,我们就能说什么都是假的。那我们还能去相信什么吗?”

Source: 精准镇压:新科技将让独裁者如虎添翼 – 华尔街日报

统计建模:两种文化

标题其实是 Leo Breiman 于2001年在统计科学杂志发表的一篇论文,而我今天才在机器学习课程的阅读清单里看到它。

我一看到这篇文章就非常喜欢,接下来让我跟你介绍一下这篇文章的主要内容和我的一些感想。

哪两种文化?

作者认为当时统计学有两种文化,他称之为数据模型派(Data Modeling)和算法模型派(Algorithmic Modeling)。其中统计学家有98%是数据模型派的。

数据模型派的主要特点,就是论文先假设统计数据符合某种分布,一般来说是线性回归,然后建模,算显著性水平,得到结论。
数据模型派,更关心的是模型,和模型的可解释性。

而那2%的算法模型派,也假设统计数据符合某种分布,但并不直接对这种分布进行建模,而是通过SVM、分支树等办法(随机森林正是该论文作者发明的)获得模型,并用验证集/测试集确定该模型的预测能力。他们关心的是预测能力,而不是模型的可解释性。

数据模型派有什么问题?

因为数据模型派预设统计数据的分布模型,并且为了可解释性多用线性模型或逻辑回归,用R2作为显著性水平的衡量工具。

但问题在于,即使模型通过了显著性水平测试,对于增加了多项式的线性模型,统计数据也未必真的符合线性回归模型。
David Freedman 和 William Cleveland 等人已经发现了这个问题。

换句话讲,数据模型派的统计学家只是把一个模型套在了数据上,然后说这个模型的显著性水平测试已经通过了,blablabla。
如果增加多项式的话,同一组数据可以回归得到不同的模型,因此也可以得到完全不同的结论。
那么这些统计学家怎么确定哪个模型才是正确的呢?它们都通过了显著性水平测试啊。

对数据模型派更糟糕的是,在应用到复杂系统(例如未知的化学或生物过程)的数据上时,假设数据符合某个模型就更为可笑了。
这一派统计学家为此加上了贝叶斯、蒙特卡洛等方法,然而,如此一来数据模型派的可解释基础就不存在了。

该算法模型派出场了!

算法模型派并不去猜测统计数据的分布模型,因此对于复杂系统的应用没有数据模型派的那个问题。

更好的是,算法模型派支持模型的多样性,(想一想随机森林),并且,由于支持多种模型,在一些实际应用上,其预测的准确性显著高于数据模型派,并且这个效果是通过验证集/测试集证实的。

另一方面,数据模型派经常面对的维度爆炸的问题,算法模型派根本不在乎。数据模型派需要用PCA等方法降低维度,同时也丢弃了一些信息,但是算法模型派可以使用上这些被丢弃的信息。

算法模型就真的是个黑匣子吗?

作者举了三个例子说明,某些时候,因为特征的共线性,随机森林比逻辑回归更能找出关键特征,随机森林还能对特征进行聚类,以及对特征重要性给出更清晰的细节。

因此,作者在最后建议统计学家拥抱算法模型,他认为未来解决实际问题更多得依赖算法模型。(记住这可是2001年)

本人的感想

人工智能(AI)在近几年引起了很多人的关注,有些人认为只是又一个(短暂的)风口,有些人对它目前的能力有一些不切实际的幻想。

我觉得它在这两者之间,它会像互联网一样在相当长的一段时间持续的改变我们的生活,就像90年代互联网浪潮一样,那个时候也没多少人遇见到了目前的移动互联网时代。

而机器学习技术,AI的核心技术,这个源于统计学却又完全不同于传统统计学的东西,正是论文作者所说的算法模型。
作者在那个时候已经看到了机器学习技术的发展潜力,也为机器学习社区贡献了随机森林这种优秀的算法。
*据Kaggle统计,在传统数据分析领域,即非图像非自然语言等领域,随机森林是挑战者最喜欢用的算法之一。

但是我很遗憾的看到,即使在2018年,国内仍有一些学者戴着大数据/人工智能的花环,干着数据模型派的事情。

tweet_status/1074116611089387520

Mail to prof chen

我也很遗憾,现在才看到这篇论文。
但也许是因为我并没有认真的学过统计学,没有数据模型派的成见,我在学习机器学习的过程中已经形成了这样一种感觉。

就像作者试图告诉我们的,摒弃100%的可解释性,去拥抱未知

电脑生成的人脸

上图是机器学习课程中,我使用 DCGAN 生成的人脸。

电脑仅仅通过“观看”几万张名人照片,学习人面部特征,就可以生成类似图像。
机器学习的实力还未完全释放,然而,我相信这一天即将到来。

在Google Colab上完成Coursera的作业

最近开始学国立高等经济学院的机器学习课程,和之前 Andrew Ng 的课程不同的是,这个课程大量用编程而不是视频来带动教学。而且这些程序用了行业通用的数据库,并且从零开始训练,而不是只训练一个epoch就加载由老师训练好的模型进行验证。

因此,这个课程的机器学习过程,在CPU上经常需要数小时完成,更别谈用Coursera自己在线的那个服务了(不太稳定)。

Google为数据分析及机器学习学生准备了一个平台:Colab。这个平台最棒的地方是完全免费的提供了一个GPU供使用,但限制在12个小时内。
但是这个平台并不能直接用来跑Coursera的课程。虽然两个平台用的都是Jupyter notebook格式的文件,但Goolge限制了对文件系统和目录的访问,最直接的表现就是,Colab一次只能运行一个notebook,运行下一个的时候,未必是同一个环境。

那么有没有hack的办法呢?我成功了。

TL;DR: 你需要把所有需要的Notebook合并成一个,并且用Google的API把一些依赖库上传到环境中。

以第一个专项课程第四周的第一个作业为例。

通过分析,完成这个作业需要用到两个notebook,其中一个用来下载测试数据,另一个才是课程代码。
课程还需要数个*.py的库,因此,我做了一个初始化环境的notebook
使用时,将这个初始化脚本下载资源作业本身的notebook用nbmerge命令合并成一个notebook并传到自己的Google Drive。(这个命令没有的话用pip安装)
然后,因为文件目录结构发生了变化,download_utils.py 里面的文件位置需要改变,简单来说就是去掉所有的“../“。(链接的这份我已经改好了)
用初始化脚本第一行代码上传requirements文件和所有依赖的py库。注意,这个requirements文件我在官方的基础上做了修改,删除了tensorflow的版本要求,因为直接用Colab环境的版本适配GPU最方便。
完成以上工作以后,顺着notebook安装依赖库,下载训练数据,然后就可以开始写作业了。

但这个方案还是有些不完美的地方:

  • notebook里面的图片会显示不出来,因为根本就没上传。你可以从官方Github手动下载过去,我则是直接在Coursera上面打印一份PDF对照看。
  • 下载和训练的进度会显示不出来。这个我不知道是什么问题,网上搜不到多少类似案例。我用PyCharm跑notebook也有这个问题,但直接在浏览器中则不会。我倒是不纠结这个问题,因为Google的网速和GPU的训练速度快啊。

比起用CPU训练几个小时,现在几分钟就可以出结果,实在是太棒了!

Keras 2.1.3+ 的一个改变带来的问题

今天被一个奇怪的事情折腾了一天:课程作业无法得到应有的结果,本应得到高于90%的准确率的模型,训练出来只有40%。
幸好在讨论区找到了答案:Keras在2.1.3版后,对BatchNormalization这个层的功能做了修改。但是这个修改并没有体现在Keras自己的文档中, 只在GitHub的问题区有零星的讨论。

不少人对这个改变有不同的看法,主要两种观点及其验证可以见以下三篇文章:1 2 3

总结来说,其实在2.1.2及之前,BN这个层是有bug的,这个bug就是:如果该层被设为trainable=False,实际在训练中,这个层还是会更新mean和variance的值,并且这些参数会更新到测试阶段使用。

到了2.1.3及以后,这个bug被消灭了,但是对很多做transfer learning的人来说,却有新的问题出现了。因为做transfer learning时,一般会导入Inception、ResNet等已经训练好的模型作为底层模型。这些底层模型的训练集和我们用来训练的数据肯定是有区别的,因此会导致BN这一层的mean和variance不正确。

如果是训练和测试的时候都一样错就罢了,起码模型的结果是一致的。Keras另一个参数trainning的默认值决定了模型在训练的时候,是以mini-batch的mean和variance数据来训练的,但并不会更新到模型中,因此测试用的mean和variance仍然是导入的模型的原始数据。

上面这种设计带来的结果就是,在某些情况下,同样的模型同样的数据,训练和测试的loss或者acc会差很远。因为是同样的数据,所以根本不是over-fitting的问题(虽然看起来很像)。这也正是我遇到的问题。

针对这个问题,解决办法有两个思路:

  1. 彻底锁死BN层的参数,即使训练阶段也不更新,可以通过设置training=False来实现。但是我初步测试了一下这个方法的训练效果不好。
  2. 把BN层设为可训练。我初步测试了一下跟2.1.2版的训练效果差不多。