从对“机器学习”、“深度学习”一无所知,到现在能够自己制作样本训练网络,感觉已经算是入门了。这三个月时间先后学习了吴恩达的Deeplearning.ai课程、斯坦福李飞飞的CS231n课程、台湾大学李宏毅的MachineLearning课程和DeepLearning“花书”的一部分。后者在理论层面的阐述能够让人对机器学习有更深刻的认识,但是较为晦涩难懂,应该算是通往高水平的进阶之路吧。所以本文只针对初学阶段,对前三门课总结一点感受。

由于深度学习的火爆再加上Python语言的开放性,网络上的相关资源实在太多。这几门课的视频和课件、作业都很容易找到,不再赘述。Deeplearning.ai和CS231n我基本把作业过了一遍,MachineLearning的作业没碰(其实我还找到了一些比如强化学习的视频课程,但是感觉自己应该跳出基础课程走向下一步了)。前两门课的课堂讲解与课后作业比较独立,单独把作业拿出来也可以作为非常好的学习资料。但是课堂讲解偏重理论,课后作业偏重实践,不可偏废。

1.Deeplearning.ai

吴恩达老师搞这么个公开课的目的就是普及推广人工智能,内容做的非常用心,讲解清晰语气温柔,彩笔板书重点突出,对小白十分友好,堪称入门典范。对某一方面的技术,只讲state of the art的一两种方法,不讲太多避免增加学生负担,这与SC231n形成鲜明对比。很多方法用一个视频介绍完之后,下一个视频会紧跟着从直觉上解释为什么这个方法好使,“intuition”这个词成了这门课的高频词汇。这些解释与花书相比显得没那么系统,但是最重要的是让学生理解和接受。例如吴老师介绍优化算法的时候,用气温统计方法引出指数加权平均进而引出Momentum优化算法,令我印象深刻。他在介绍完CNN之后还进一步延伸出了三维的CNN,其他课程这点都没提到。

由于篇幅限制,作业内容没有完全展开,采用了“填空”的形式:在一套完整的YOLO程序中,只提出了threshold和non_max_suppression两段让学生完成,对于这个算法来说其他更重要、更基础的内容就都放在了引用文件里。

缺点是吴老师说话稍显啰嗦,很多时候一句话重复好几遍。用鼠标在电脑里写字作为板书,看的过程中还能够识别出他写的是什么,等事后再找出课件来复习的时候可能根本看不懂他写了神马……作业缺少对网络进行训练的内容。

2.CS231n

对很多方法以图表形式进行归纳总结,参考价值很高。

以文献综述的思维讲解一类方法,一堂课前边花了大量时间讲前人最先采用什么方法、后来又发现什么方法,最后才提到现在主流方法是BlaBlaBla,而前边那些都已经被淘汰了!以科研的组织方式提供作业代码,学生需要在引用文件里改代码,而不是像Deeplearning.ai那样只需要面对一个主文档。这也许会让初次接触Python的学生感到阻力,但是对于机器学习工作者,作业有利于和课程之后的工作项目无缝衔接。

对LSTM、DeepReinforced、GAN讲的过于粗糙,有片面追求课程内容覆盖面的嫌疑。

李飞飞教授领衔这门课的讲师名单,但2017年的课却只在最开始以一段录像的形式出现,其余课程全部留给两个研究生和两位嘉宾,简直挂羊头卖狗肉。李教授在机器学习科研领域做出了重大贡献,但是单从这门课来讲,她很不负责任。

这门课课堂录像包含大量斯坦福学生的随堂提问与讲师的解答,非常有助于看视频学习的人加深理解。两位主讲博士生中男生Justin表现较好,女生Serena水平不够担任这门课的老师。

3.MachineLearning

看完以上两门课,我本打算把台大李宏毅老师的课随便过一遍,并没抱过高期望。毕竟前边的都是美帝名校人工智能主流圈高端教授出身,台湾的一个老师又能怎样呢?但是看过几堂课之后我就完全被打脸了。

整个课程自始至终,李老师以数码宝贝作为例子引出各种机器学习的概念,课程中穿插各种动漫、金庸小说、古诗词、传统艺术等内容,举重若轻风趣幽默。比如用驾校开车技巧来比喻Over fitting,比如用“天下武功唯快不破”来解释Stochastic Gradient Descent,比如用“各怀鬼胎”来形容GAN……为了把很多概念解释得通俗易懂,李老师在PPT制作中下了大量功夫。

对我影响最大的是前边关于“回归”、“错误来源”等基本概念的几堂课:之前在别的课程那里大量接触又在作业中实际操作了一下,所以对这些概念“面熟”而似懂非懂;到了李老师这里一经点拨,我竟有一种“通透的快感”……

另外,现如今机器学习的几个前沿研究方向包括:深度网络,序列网络,强化学习和生成对抗网络。李老师设想了这样一个自然语言对话程序:两个Deep的RNN通过Reinforced Learning进行模拟对话并作为Generator,第三个NN 作为Discriminator判别上述对话是否为人类的讲话。

我概括成这个公式:GAN(Reinforced(DeepRNN1,DeepRNN2),DeepNN3)

他设想的这个东西不知道有没有高人在做,这简直是当今机器学习前沿技术的集大成。

对我而言这堂课的缺点是内容庞杂、相互关联不紧密,无监督学习那部分感觉用处不大也听不懂,有些就直接跳过了。另外讲课时李老师常发现ppt里的一些小错,但这些都瑕不掩瑜。

4.其他

如今深度学习编程语言几乎被Python垄断,对这门语言我一年前只看了一点廖雪峰的网页教程,基本等于不会。但是,我认为一个机器学习初学者如果有其他语言编程的工作背景,那么一边学机器学习内容消化作业代码,一边了解Python语言是可行的。Tensorflow等程序包同理。

课程学习阶段是在Windows系统下进行的,Python、Tensorflow的安装也给我带来了一些麻烦:Deeplearning.ai的作业要求Python3,所以我安装的是Python3.6版本的anaconda。如果要用Tensorflow的话,需要给anaconda单独创建一个Tensorflow的environment再安装。到了CS231n这里,CNN作业有一部分叫Fast layers,替代原始代码使用能够提高CNN运行速率,但它要用到一个程序包Cython进行C语言编译,这个又是基于Python2.7。我试图再创建一个Python2.7的environment运行但失败了,最后直接放弃了。

另外Deeplearning.ai作业里YOLO算法一节中yad2k程序与权重文件yolo.h的下载,CS231n作业CIFAR10数据集的下载,都需要花点时间在网上找。

看帖子的时候一位网友的话让我印象深刻,大意是:以前也会编程,但通过学习Python和Linux让他打开了一扇通往新世界的门,这个新世界的名字叫“开源”。Python语言的开放性,github源码分享的兴起,传统行业某项技术从论文发表到受到关注再到落地应用大概至少要十年时间,但是人工智能技术这几年的突破式发展甚至无法忍受传统文献出版流程而需要arxiv了,凡此种种都让我肤浅地领略到了互联网行业的威力。这种开放性也应该成为以后各种技术发展的趋势。