我的深度学习入门之路 (CS231n Spring 2017)

2017/12/23

前言

Stanford University 的 CS231n: Convolutional Neural Networks for Visual Recognition 是大多数深度学习的入门者都会参观膜拜的课程。本学期我大约花费九周的闲暇时间,粗略看过 Spring 2017 版本的 CS231n,受益匪浅。仅以此文作为学习过程的简单回顾和对这门课程的致谢。

声明

本文的图片大多撷取自 CS231n 课程网站、Slides 或本文所提及的论文之中,版权归属原作者所有,如需使用请向原作者获取授权。

课程介绍

如课程名称所述,此课程讲述当前大火的 Neural Network 在 Computer Vision 领域的应用,教师团队由 Fei-Fei Li 女神和她的两位 Phd Justin Johnson 和 Serena Yeung 组成(然而 Fei-Fei 只在第一节课出现过)。课程的所有资料包括 lecture videos 均可在课程主页YouTube 上获取。除课堂讲授外,设计良好的 Programming Assignements 也迫使我亲手实现一些看起来容易、实则需要处处留意的功能(比如看似 trivial 的 Backpropgation)。课程的 Slides 和 Notes 及其中提及的论文,亦是 Computer Vision 各个细分领域良好的入门读物。

Instructors And TAs (图片改编自 CS231n 课程网站)

按照课程的 Syllabus 和三个 Assignment 的安排,我把这门课程分为三个部分,Lecture 1 - 3 介绍了简单的背景知识,Lecture 4 - 9 为对 Convolutional Neural Network 的详细说明,Lecture 10 - 16 则是 CNN 更广泛的应用。

我的 Assignment 使用 GPL v3 协议开源在我的 GitHub 上,欢迎参考交流。

Part 1 Lecture 1 - 3

第一部分为 Deep Learning 背景知识的简单介绍,除了课程信息外,介绍了 softmax 和 svm 两种 loss function、SGD 等 Optimization 方法,以及 K-Nearest Neighbor 和 Linear Classifier 两种简单的 Image Classifier。这部分内容如果有 Andrew Ng 的 CS229: Machine Learning 作为先修课程的话,应当相当熟悉,仅仅是个回顾而已。

Part 1 (图片撷取自 CS231n 课程网站)

Assignment 1 要求实现 KNN、Softmax、SVM 和一个 Two-layer 的 Neural Network,难度不大,可以用来熟悉一下 Python/Numpy + Jupyter 的编程环境。

Part 2 Lecture 4 - 9

第二部分详细介绍了本课程的主角 —— Convolutional Neural Network,包括每个 layer 的作用(Conv layer, Pooling layer, FC layer 等)、Backpropagation 的计算、优化的训练方法(如 Adam, Momentum, Dropout, Batch-Normalization 等)、训练 CNN 的注意事项(如 paramters 的 initialization, tune hyperparameters 的方法等),内容相当详尽。在每个 Lecture 之后都提供了相应的 Notes,基本涵盖了 Lecture 里提到的所有内容并加以补充。Lecture 8 介绍了常见的 Deep Learning Framework(如 TensorFlow, Caffe, Pytorch等), Lecture 9 介绍了几个著名的 CNN Architecture(AlexNet, VGGNet, GoogLeNet, ResNet),大多为历年 ILSVRC 竞赛的获胜者。

Part 2 (图片撷取自 CS231n 课程网站)

本部分阅读了如下几篇论文(这部分的 Notes 相当详尽,因此这部分仅读了很少的几篇文章):

其他文章诸如 Adam 方法、ResNet 等只是粗略扫过,没有认真细读,故不在此列举。

Assignment 2 要求实现 Fully-Connected Network, Convolutional Neural Network, Batch-Normalization Layer, Dropout 等。作业中使用 Numpy 写每一种 layer (affine, fc, conv, max_pool, dropout, bn 等等) 的 forward 和 backward 过程,然后组合成常见的 layer_utils 再组合成简单的 CNN,并且体验一番玄学的调参。

虽然这部分内容看 Lecture 和 Notes 大都不算难,但是实现起来还是有不少坑要趟。比如 Backpropagation 过程,对于数学系的学生,求个导数应用链式法则当是小菜一碟,但是真正代码实现的时候却很容易出现各式各样的问题;有些内容搞懂原理,进行数学推导都不难,但是要用 vectorized 的方法实现又要花费很多脑筋。

个人强烈建议 PA2 要花些时间认真完成,对于透彻理解 CNN 的细节大有裨益。每个小部分 TA 都设置了 Numerical check,帮助检查代码实现是否正确。

另外,PA2 的最后一部分需要选择 TensorFlow 或 Pytorch 完成。个人选择的是 TensorFlow,初学阶段对于 tf 这种先构造 Computaion Graph 再执行的方式很不习惯,不过熟悉之后相比用 Numpy 手写简直太幸福了。

Part 3 Lecture 10 - 16

第三部分为 CNN 的应用,不少内容是当前研究的前沿领域,这部分在 Spring 2017 版本的 CS231n 中得到了幅度不小的更新。到此为止不再像之前一样有详尽的 Notes 提供,有疑问只能自己啃论文了。这部分花费了我相当多的时间(其中被一个长达五周的期中考试阻隔),值得进行一个相对详尽的总结。

Lecture 10 Recurrent Neural Networks

本讲介绍 RNN 及其变种 LSTM,并介绍它们在 Image Captioning 中的应用。RNN 相比普通的 CNN 引入了时间序列,每一个 time step 的输入既有来自外界的输入,又有来自上一个 time step 的输出。RNN 可以用来处理 sequence data,被应用于 Natural Language Translation, Image Captioning, Video Captioning 等领域。而 LSTM 则在 RNN 的基础上,改进了 RNN 的 Gradient Vanishing/Exploding 问题。 在 Assignment 3 中有使用 RNN/LSTM 进行 Image Captioning 的任务。

本部分读论文一篇:

Lecture 11 Detection and Segmentation

本讲介绍 Object Detection, Localization, Segamentation 等,讲述了 Transpose Convolution、R-CNN、Fast/Faster R-CNN 等架构。因为在 PA3 中没有要求,故暂时没有深入钻研。

Lecture 12 Visualizing and Understanding

本讲介绍 Feature Visualization(包括 Saliency maps, Class Visualization 等)、Adversarial Examples 和 Style Transfer,内容量很大,且这三个部分在 PA3 中都有相应的代码需要完成。

Feature Visualization 部分读论文三篇:

这部分似乎更加偏重于 intuition 而不是严格证明,可能是我学力有限的缘故,总觉得读过论文后不少地方将信将疑。但无论如何,Feature Visualization 为研究被称为 black-box 的神经网络提供了一个思路。

Adversarial Examples 部分读论文一篇:

  • Christian Szegedy, Wojciech Zaremba, Ilya Sutskever: Intriguing properties of neural networks

    在本文中作者提出了存在让 CNN misclassify 的 adversarial examples,即对于一张 predicted correctly 的图像,加上一个精心构造的微小”noise”(变化常常是肉眼不可见的),就能使 CNN 给它一个错误的 label,甚至给出较高的 confidence。作者提出这种现象对于不同 Training set 和不同架构的 CNN 都普遍存在,可能 CNN 的一个 flaw。PA3 中有一个作业通过 Gradient Ascent 的方法构造这样的样本。 Adversarial Examples (图片撷取自本论文)

Style Transfer 部分读论文两篇:

PA3 中有实现 Style Transfer 的任务。另外上文中提出的 Style Transfer 方法需要相当大的计算量,无法用于 interactive application,而 Justin Johnson (本课程的讲师之一)等提出了基于 Perceptual Loss 的方法,可以极大地提升计算效率。

Lecture 13 Generative Models

本讲介绍 Generative Models,属于 Unsupervised Learning,根据是否显式地求出 Model Density,又有如下分类: Generative Models (图片撷取自课程 Slides,原始出处见右下角)

本讲主要介绍 PixelRNN/PixelCNN, Variational Autoencoder 和 GANs(Generative Adversarial Nets)。由于目前个人只学习过基本的概率论课程,数理统计、随机过程、高等概率论等都没有修习,加上最近时间有限,这部分仅以完成 PA3 的 GAN 部分为目标,没有细究。

本部分读论文四篇:

到目前为止 GANs 还是一个大火的研究领域,每年都有大量新的模型结构、训练方法等提出,时间有限,只能浅尝辄止了,下面两个 GitHub Repository 整理了 GANs 的模型和论文,有兴趣的可以一看: the-gan-zoo,AdversarialNetsPapers.

Lecture 14 Deep Reinforcement Learning

本讲介绍 Deep Reinforcement Learning,部分内容同 Andrew Ng 的 CS229 中的 Reinforcement Learning 相仿。基于前面介绍的原因,暂时只看过 lecture,有个大概印象,没有深入钻研。

Lecture 15 Efficient Methods and Hardware for Deep Learning

本讲是 Invited Talk,讲者是 Song Han 老师,本科毕业于北京清华大学(非 native speaker 还是很容易听出来的),在 Stanford University 获得 MS 和 Phd 学位,Lecture 中提到的 Deep Compression 方法、EIE 处理器等都由他提出。

本讲主要介绍如何高效地设计、训练神经网络,从算法上的减少参数、减少浮点数位数等,到硬件上 GPU 和专用处理器的改进设计等,都做了简要的介绍,对于 Nvidia 从 kepler 到 Maxwell 到 Pascal 到 Volta 历代 GPU 介绍、Google TPU v1 和 Cloud TPU 的讲解尤其让人兴奋(呼唤我攒钱买丹炉)。

本部分读论文一篇:

Lecture 16 Adversarial Examples and Adversarial Training

本讲依旧是 Invited Talk,讲者是 Ian Goodfellow 大牛。讲 Adversarial Examples 的成因, Adversarial Attack 等,可参考他的 Explaining and Harnessing Adversarial Examples 这篇论文。

后记

Assigments

作为一门面向本科生的深度学习的入门课程,CS231n 确实不负盛名,从 Lecture 到 Notes 到 Assignment 都做了精心地准备,除了基本的 CNN 外,CNN 的众多应用也做了简要的介绍,有兴趣的人完全可以寻找其中一个方向深入钻研下去。虽然花了我将近一个学期的时间学习(有这学期课业太忙的缘故),但绝对物有所值。

作为数学专业的本科生,专业课所学的内容大多在十八十九世纪就已定型,遇到问题的第一反应是找一本更好的教科书,但是这一轮的深度学习热潮从2013年才爆发,大多数领域的研究还在如火如荼地进行,除了 Goodfellow 的 Deep Learning 等少数几本外,还没有得到大家认可的教科书,因此有疑问只能依靠自己啃论文来解决。同样由于这个领域的年轻,许多学界、业界的最新成果,在原理上并没有超出课程所讲的内容太多,完全可以自己找来开开眼界,这在数学领域是很难想象的。

相比在 Stanford University 现场聆听这门课程,我的学习过程中缺少了 Midterm 和 Final Exam,也没有机会做 Course Project。写这篇博客的过程中,把大多数的 Slides,Notes 和论文都做了简要的回顾,权当一次复习。

由于个人学力有限,许多论文中的细节不能非常精准地掌握,待我修习过大多数的统计学课程后再来回顾此课程,应当会有不同的感受。

致谢

写此文的另一目的,是要表达对 Stanford University 和 CS231n 课程团队(Instructor, TAs, Invited Speakers, Students) 的感谢,他们将课程资料完整免费地在互联网上公开,让广大深度学习的学习者包括我这个地处中国东南小岛上的学生也可以领略到优秀的课程。

在完成作业的过程中,部分地方参考了互联网上他人的解法,在我的作业中的相应位置都有注明;在本文中提及或未能提及的论文、博客、回答等都对我的学习产生有利的影响,在此一并表示感谢。

在修习 CS231n 的同时,我同时学校修习厦门大学邱明老师开设的 Python 与深度学习校选课,做了不少 TensorFlow 的练习,与 CS231n 互为补充,共同构成了我入门深度学习的基石,在此也要表达感谢。

Post Directory