上学期一共选了4门课,分别是:
- 18-652 Foundation of Software Engineering
- 18-601 Introduction to Machine Learning
- 18-781 Speech Recognition and Understanding
- 18-797 Machine Learning for Signal Process
其中,除了18-652是我的专业Software Engineering (SE) 必修课之外,其他都是ECE学院下的选修,并且是从匹兹堡主校区同步视频教学到硅谷校区的形式。视频同步教学对课程效果还是有影响的,比如说不能很好跟老师进行提问互动,偶尔会被老师忽略,同步的音画质量也会时常出现问题。总体来说,我认为远程教学的课堂效果要比现场教学差20%左右。下面具体说说每门课。
18-652 Foundation of Software Engineering
这门课是SE专业的必修基础课,课程介绍了软件工程的基本概念,主要包括Agile, Lean, 以及对应的Scrum和Kanban。课程核心的内容是围绕Scrum和Kanban的实践,团队合作开发一套在紧急情况下使用的通讯web应用,包括用户登录验证,即时通信,聊天墙,用户权限管理,查找功能等等。和真实的Scrum和Kanban开发一样,需要每两周进行一次Demo展示进度,在Trello上进行项目的可视化管理分配调度任务,每周有固定会议讨论,所有的代码需要提交至Github并且用branch的方式进行incremental delivery。每周有固定的feature需要实现并且上线,根据课程的进度不同,还需要进行额外的实践,比如pair programming, code review, unit test, continuous integration等等。
Project规定使用的语言是Javascript, 采用Express框架,其他的技术栈可以随意选择。我们组选择了Vue前端,MangoDB数据库,Mocha测试。采用了MVC框架来组织代码,前端和后端完全分开。还要求我们用Heroku部署,CircleCI进行Continuous Integration,BetterCode和CodeClimate监控代码质量。此外,项目还包括了REST API和SOCKET IO两种前后端通信方式,Postman和Selenium进行Integration Test。
这是我第一次参与到系统的、有指导的团队协作开发中,总体收获还是很大的。科学的管理协作方法在现代的大型软件开发中尤其重要,特别是在现阶段的软件开发项目中,通常都是几十人甚至上百人的团队一起进行协作,独立开发已经不具有经济规模效益。这跟我在此之前进行的几乎是独立的开发项目完全不同,在团队中工作时,会更多地考虑到代码的质量,必要时进行重构,使用更多的外部工具进行监测和管理更加保证了代码质量和可靠。而且我也非常清楚地认识到自己在团队协作中有什么地方需要改进,怎么样做可以给团队和自己带来更多的贡献。
18-601 Introduction to Machine Learning
这门课是由大名鼎鼎的Tom Mitchell主讲,据说他是非常难得才能讲一次课,能赶上实在是太幸运了。这门课程毫无疑问是我这学期上的最好的一门课。其实这门课的难度并不大,Tom把ML的概念和原理都用最简单易懂的方式讲了出来,作业的难度也还好,大部分是概念和计算题,有几次作业需要编程但难度都不大。期中和期末考试的卷子题目出得尤其好,题目灵活,涵盖知识面广,难度有区分度,需要思考的题目也很有趣,绝对不是死记硬背就能得高分,而是考察你是否真的理解透彻,对大神级别的老师实在是不服不行。
这门课从决策树开始讲起,同时引入信息熵/互信息的概念。接着过渡到Machine Learning的基本概念,包括过拟合欠拟合、方差偏差、什么叫概率学习(Probabilistic learning)。然后讲了在概率学习中非常重要的MLE和MAP,并且用这两种方法训练朴素贝叶斯,同时引入条件独立假设、模型评估的方法(测试集和验证集,N fold交叉验证)。再从朴素贝叶斯讲到高斯朴素贝叶斯,以及其和逻辑回归之间的数学关系。这里的推导简单又巧妙,把看起来截然不同的模型再数学意义上竟然联系了起来,这是我之前再怎么自学也掌握不了的。第一个编程的大作业是实现朴素贝叶斯进行文本分类。
课程然后进入了神经网络的部分,从向后传播算法开始讲,这里真的是Tom花了整整一节课的实际用了一个两层的网络手把手讲解梯度怎么算,怎么更新参数,不错过任何一个细节。并且作业里再次出了需要一步一步手算梯度更新的题目,非常麻烦,需要很大的耐心,一个数字算错了后面就全错。很多的作业都是这种复杂麻烦的手算题,其实这种题目可能当时觉得很讨厌,但其实在计算的每一步都加深了对算法的理解,不得不说作业的质量之高和老师的用心之深。神经网络还讲了卷积网络,这里有一个编程的作业是完善一份卷积网络的代码,代码大部分都写好了,只需要补几个中间层的实现,只是一些简单的矩阵操作。这个作业我感觉过于简单了,只是做了forward运算,backward propagation完全没有涉及。课上还涉及到了一些神经网络的内容,比如autoencoder, RNN, sequence model, batch normalization, gradient clipping, LSTM, GRU等等,但都不深入,只是提了一下原理。
接着是Graph model部分,主要讲了贝叶斯网络表示条件概率分布:如何通过贝叶斯网络计算给定的条件概率,涉及到了Markov Blanket;如何根据贝叶斯网络进行sampling,涉及到了Gibbs Sampling;如何用EM估计贝叶斯网络的参数,包括利用非完整的数据以及估计Graph本身的结构(Chow-Liu Algorithm)。
以上是前半学期的内容,后半学期主要讲了机器学习的理论基础,公式推导和证明偏多,也更加抽象难懂。首先是PAC Learning理论,这里的概念包括Version Space, $\epsilon$-exhausted, VC Dimension等等。接着是Kernel regression和SVM,引出了Kernel function。然后简单介绍了Reinforcement Learning, Semi-supervised Learning。再学习了ensemble的方法,着重讲了adaboost,还比较了SVM、LR、Adaboost的loss function之间的联系。最后还介绍了PCA,ICA,CCA等Representation Learning的方法。
因为这门课是作为ML的基础入门课,涉及的知识面广,但比较深入的话题特别是后半学期的内容,很多只是点到为止。作为自学了大多数机器学习内容的人来说,这门课很好地串起来了我对ML的理解,并且补漏了很多我以前忽略了和不太明白的地方。特别是实际动手完成作业的部分,不但加深了理解,更是让我明白什么样的学习方式才是正确的。
18-797 Machine Learning for Signal Process
这门课是我学起来最吃力的一门,特点是干货多、作业难、全是公式和数学推导。幸好这门课没有考试,只有三次大作业+每周quiz+course project。因为这门课是远程教学,经常出现老师不戴麦,完全听不见的情况,所以课堂效果大打折扣。而且这门课如果不跟着老师听,自己下来自学一遍的代价非常大。一开始每周的只有10道选择的quiz我都要花大半天的时间才能做完,到最后都是连猜带蒙糊弄。
也是由于这门课涉及的内容和另外两门课有不少重复的,所以对我来说难度又小了一些。一开始是从线性代数开始讲,补了一些基础知识,最重要的是Eigen Decomposition和SVD,贯穿了整个课程。然后讲了最优化的内容,梯度下降,有全局最优解的最优化方法,朗格朗日乘子等等。因为这门课主要是针对Signal,还包括了傅里叶变换,Signal representation。然后重点讲了Representation Learning的几个方法,恰好是18-601提到但没有深入的内容,包括PCA, ICA, NMF, CCA, LDA。对于Machine Learning的部分,涉及到了Adaboost, Image classification应用, SVM, Naive Bayes, Gaussian classifiers, HMM的三个问题, Kalman filters, Neural Network。和18-601不同的是,这里的每个内容都非常深入,具体到所以细节的公式和推导,老师对每个话题的理解都是从线性代数和矩阵运算的角度来讲的。
值得一提的是这门课的三次大作业,全部使用Matlab完成,几乎都是矩阵运算,需要费点脑筋才能写出比较高效的代码,而且往往给的数据集是实际的图片或者声音,跑完的结果一眼就能看出好坏,所以还比较有趣。其中我感觉最有趣的是用EM来训练一个提前建好的概率模型,数据集是有左右抖动的图片,最后用模型还原出非抖动的图片,其实也就是一个抖动图片还原的题目,最后看到用EM一次次迭代收敛图片一点点还原出来的也是很神奇。
这门课的course project我们组做了voice conversion,也就是把一个人的声音转换为另一个人的声音,采用的是比较传统的GMM方法,用了Full conversion,最后的效果还不错。
18-781 Speech Recognition and Understanding
这门语音识别和理解是抱着极大的兴趣听,但最后还挺失望的一门课。主要涉及到的内容有声音信号处理,声学知识,Acoustic model, Language model, End-to-end model, Adaption等等。内容不少,涵盖了关于语言识别的几乎所有话题,但是老师的讲课能力一般,PPT的质量不高,往往一节课听到一半就失去了兴趣。老师并且往往对于基础的知识点一带而过,导致作业全靠自己去琢磨理解。
这门课包括一个course project,我们组用Denoise Autoencoder的representation来作为输入训练End-to-end model,和传统的MFCC进行比较。但是最后的效果很差,被MFCC完虐,也是水水就过去了。
总体感受
和国内的研究生课程相比,外国的课程特点是作业多,LOAD大,注重培养实际编程能力,老师功底深厚。课堂老师讲课的效果可能有些层次不齐,但是所有课的作业都体现了课程的精华和老师的用心。CMU一学期4门课的Load还是非常大的,需要花大量时间,最忙的那几周甚至周末全天都在写作业。因为我选课的内容大部分是我还算比较熟悉的机器学习,课程之间也有部分的内容重合,所以相对还好,还没有到通宵赶作业的程度。
除了作业多,和国内的课程相比,国外的期末考试反而相对没有太痛苦,可能是平时的进度很紧凑不敢落下什么内容,到期末复习的时候反而很轻松。有些课考试允许带一张cheat sheet,可以把自认为重要的知识点写上去参考,这点还挺人性化的,也有助于复习整理知识脉络。
贴一张我的18601最后整理的cheat sheet:
这学期的课相对要轻松一点了,希望被虐地轻一点。