机器学习策略篇:快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)

快速搭建的第一个系统,并进行迭代

如果正在考虑建立一个新的语音识别系统,其实可以走很多方向,可以优先考虑很多事情。

比如,有一些特定的技术,可以让语音识别系统对嘈杂的背景更加健壮,嘈杂的背景可能是说咖啡店的噪音,背景里有很多人在聊天,或者车辆的噪音,高速上汽车的噪音或者其他类型的噪音。有一些方法可以让语音识别系统在处理带口音时更健壮,还有特定的问题和麦克风与说话人距离很远有关,就是所谓的远场语音识别。儿童的语音识别带来特殊的挑战,挑战来自单词发音方面,还有他们选择的词汇,他们倾向于使用的词汇。还有比如说,说话人口吃,或者说了很多无意义的短语,比如"哦","啊"之类的。可以选择很多不同的技术,让听写下来的文本可读性更强,所以可以做很多事情来改进语音识别系统。

一般来说,对于几乎所有的机器学习程序可能会有50个不同的方向可以前进,并且每个方向都是相对合理的可以改善的系统。但挑战在于,如何选择一个方向集中精力处理。即使已经在语音识别领域工作多年了,如果要为一个新应用程序域构建新系统,还是觉得很难不花时间去思考这个问题就直接选择方向。所以建议,如果想搭建全新的机器学习程序,就是快速搭好的第一个系统,然后开始迭代。的意思是建议快速设立开发集和测试集还有指标,这样就决定了的目标所在,如果的目标定错了,之后改也是可以的。但一定要设立某个目标,然后建议马上搭好一个机器学习系统原型,然后找到训练集,训练一下,看看效果,开始理解的算法表现如何,在开发集测试集,的评估指标上表现如何。当建立第一个系统后,就可以马上用到之前说的偏差方差分析,来确定下一步优先做什么。特别是如果错误分析让了解到大部分的错误的来源是说话人远离麦克风,这对语音识别构成特殊挑战,那么就有很好的理由去集中精力研究这些技术,所谓远场语音识别的技术,这基本上就是处理说话人离麦克风很远的情况。

建立这个初始系统的所有意义在于,它可以是一个快速和粗糙的实现(quick and dirty implementation),知道的,别想太多。初始系统的全部意义在于,有一个学习过的系统,有一个训练过的系统,让确定偏差方差的范围,就可以知道下一步应该优先做什么,让能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向。

所以回顾一下,建议快速建立的第一个系统,然后迭代。不过如果在这个应用程序领域有很多经验,这个建议适用程度要低一些。还有一种情况适应程度更低,当这个领域有很多可以借鉴的学术文献,处理的问题和要解决的几乎完全相同,所以,比如说,人脸识别就有很多学术文献,如果尝试搭建一个人脸识别设备,那么可以从现有大量学术文献为基础出发,一开始就搭建比较复杂的系统。但如果第一次处理某个新问题,那真的不鼓励想太多,或者把第一个系统弄得太复杂。建议构建一些快速而粗糙的实现,然后用来帮找到改善系统要优先处理的方向。见过很多机器学习项目,觉得有些团队的解决方案想太多了,他们造出了过于复杂的系统。也见过有限团队想的不够,然后造出过于简单的系统。平均来说,见到更多的团队想太多,构建太复杂的系统。

希望这些策略有帮助,如果将机器学习算法应用到新的应用程序里,的主要目标是弄出能用的系统,的主要目标并不是发明全新的机器学习算法,这是完全不同的目标,那时的目标应该是想出某种效果非常好的算法。所以鼓励搭建快速而粗糙的实现,然后用它做偏差/方差分析,用它做错误分析,然后用分析结果确定下一步优先要做的方向。