引言
前段时间 Andrew Ng(吴恩达)在 Coursera 开设了深度学习的课程,正如 Andrew 在 Coursera 上的机器学习课程一样,Andrew 总是面向零基础的工程师来授课,而不是有专业背景的人员。所以课程总是会力求直观且应用性强,但是往往对专业从事机器学习的人员来看略显简单,但是大牛对事物的理解还是值得参考的,所以我把课程中自己学到的要点记录如下。
第一课:神经网络和深度学习
第一周:深度学习引言
- 结构化数据与非结构化数据?
- 机器学习中的结构数据可以理解为意义明确的特征,这样我们可以像数据库一样构建一个表每一行代表一个样本,每一列代表一个特定的特征或者属性值。
- 机器学习中的非结构数据就像图像、语音和文本一样,不是特别容易存成表的形式。
- 深度学习为什么会流行?
- 本质上讲是因为深度学习的算法在大数据量上的表现远胜其他算法,尤其在非结构化数据上。
- 客观上讲流行的原因是受到:1)数据量的增加;2)计算速度的提高;3)算法的改进;的三方面的影响。
第二周:神经网络基础
- 讲解了 logistic 回归以及如何如何通过最大似然估计导出其代价函数。
- 讲解了基于链式法则的反向传导算法的直观理解,比较容易理解,但是还是不如严格的证明来的舒服,严格推导可参考吴恩达在斯坦福大学UFLDL的材料的汉译版(具有更加详细的推导)
- 讲解了向量化的代码实现,相信习惯了写 MATLAB 代码的人都习惯了向量化的实现,提高并行化、高效
- 讲解了Python包numpy的广播机制以及numpy容易出错的地方,这个细节我也没有注意过。就是大家要注意 np.random.randn(5)、np.random.randn(5,1)、np.random.randn(1,5)的区别,最后两种比较好理解,可以理解为5*1的向量和1*5的向量,而第一种的方式最好不要使用,会比较凌乱,大家可以做一些矩阵和向量的运算测试一下。
- 总的来说,这一课的内容基本没有特别的营养,都是一些基本的机器学习知识和python的代码常识,大家有基础的可以直接略过,不会遗漏什么知识点。
第三周:浅层神经网络
- 讲解了一个单个隐藏层的神经网络的例子以及**函数选择和随机初始化的问题,都是基础内容,没有学到新的知识点
第四周:深层神经网络
- 这周课主要讲解了如何构建一个多层的全连接神经网络,包括前向传导和反向传导。如果你曾经手写过此过程这节课基本可以略过。
- Andrew在此课程中介绍了对 deep learning 一词的看法,本质就是多隐层的神经网络,deep learning其实就是一个噱头,高大上吸引人们的目光。第一次听到这个词的时候我也觉得好厉害好像算法会做thinking一样,其实本质上跟其他的机器学习方法没什么不一样。至于神经网络和大脑关系,Andrew也强调了大脑怎么运作,我们根本不知道,神经网络只是简单想象大脑的运行方式,也许根本没有半毛钱关系。非常认同Andrew这样务实的态度。
大师采访
- Geoffrey Hinton
- 不用多说,Hinton可以说是深度学习的教父级别人物,其在推动深度学习的发展上起了巨大的作用,其贡献太多不再详述,但是第一次了解到Hinton原来最早学的心理学、哲学等专业,辗转几许最后来到了机器学习,还是很厉害的。
- Hinton的第一个建议就是读论文但是不要太多,这可能是在强调思考吧,学而不思则罔,读的文章太多思想可能被束缚。
- 第二个建议是坚持自己的看法,“当别人都以为不对的时候,你就快成功了。”感觉有点假啊,但是,对他本人起码是适用的。
- Pieter Abbeel
- Abbeel是深度强化学习的先驱之一,采访视频也多次叙述了他对深度学习、强化学习以及深度强化学习的看法。
- Abbeel给出的建议是“try things yourself”,就是要自己动手做的意思,非常认同,估计这个建议大家都会非常认可吧。deep learning的trick太多,所以纸上得来终觉浅啊
- Ian Goodfellow
- Goodfellow是GAN的提出者,生成对抗网络从提出就变得非常火爆,是生成模型的经典。Yann LeCun对此更是高度评价,认为其实当今深度学习中最令人兴奋的突破。
- 另外,其和Yoshua Bengio等人合作的《deep learning》一书已有汉译版,大家有兴趣可以看看,是比较好的综述涉及很多知识。但是具体在某一方面比如RNN上,总是感觉讲的东西很多但是又不是特别细致,难以有效把握重点。
- 其在采访中表示,自己在头疼感觉快要死的时候,想到的第一件事竟然是自己的研究想法会不会有人继续下去。不知是真是假,感觉这才是真的爱研究,还以为人之将死,想到都会是感情。
第二课:改善深层神经网络:超参数调试、正则化以及优化
第一周:深度学习的实用层面
- 讲解了过拟合以及偏差和方差的平衡关系,这是经典机器学习的必学内容,第一次见到时还是感觉很惊喜。
- 讲解了dropout的正则化方法,以及其缺点:也就是用了dropout后很难再画出一个Loss Function(平滑后)随着迭代次数而逐渐下降的过程,这使得程序的运行过程更加难以观察。
- 讲解了数据增广和提前停止(early stopping)的正则化方法,其中early stopping 可以减少正则化超参数的搜索空间
- 讲解了梯度消失和梯度爆炸的情形,以及可以减轻其影响的参数初始化方法-让参数的方差和上一层的神经元的个数的平方根成反比。
- 讲解了梯度检验的方法没有具体实践过,但是实现不难,只需要两次前向传导的过程,即可计算近似的数值梯度进行检验。以下是Andrew给出的梯度检验的建议:
- 其中再次提到dropout的复杂性,不能与梯度检验共存。
第二周:优化算法
- 讲了Mini-batch的算法思路,和指数加权平均的算法和作用。
- 讲了动量和RMSprop以及Adam的梯度下降加速算法,是我见过最直观的理解,讲得非常的好。
- 讲了学习率衰减问题,这个也是大家常用的手段。
- 最后这个讲解局部最优的这一小节让我感觉收获颇丰,也是第一次看到对deep learning目标函数的理解,感觉非常好。
- 如上图所示,很多人当然包括我都以为我们使用梯度下降经常会陷入局部最优如左图所示,但是deep deeplearning由于参数很多,所以很多导数为零的点是鞍点如右图所示,所以较差的局部最小点较少。而deep learning可能的主要如下图所示,在鞍点可能会下降很慢,才会走出困境。
- 如上图所示,很多人当然包括我都以为我们使用梯度下降经常会陷入局部最优如左图所示,但是deep deeplearning由于参数很多,所以很多导数为零的点是鞍点如右图所示,所以较差的局部最小点较少。而deep learning可能的主要如下图所示,在鞍点可能会下降很慢,才会走出困境。
第三周:超参数调试、Batch Normalization、深度学习框架
- 讲解了调参技巧、Batch Normalization、softmax回归等深度学习中的实用框架。
- 讲解了深度学习框架主要是tensorflow。关于框架来讲我简单试用过的有caffe、tensorflow、keras、paddlepaddle,这些工具有些基于计算图、有些基于layer来设计模型,但是这些都有一些编译语言的感觉,你要你把机构定义好,然后才能跑模型。而我喜欢的方式是像torch这样一种脚本语言的感觉,可以实时显示中间结果,查看变量的维数和值,非常有利于观察模型是否正确运行,但是torch使用lua语言编写,实在不想为了使用torch再学一门不常用的语言,而最近使用python写的pytorch越来越趋于成熟,有时间一定会进行首选学习,并以此作为首先的研究deep learning的框架,据说kaggle上很多top的选手已经大量使用pytorch。
大师采访
- Yoshua Bengio
- Bengio是深度学习的三驾马车之一,还是Ian Goodfellow的导师一个,大神人物。采访谈及其对现在deep learning研究的看法,其表示失望,因为现在的研究已经偏离了原来希望机器具有认知的那种高层次的想法,而是如何设计更好的网络架构和更好的优化算法让deep learning work。
- Bengio给出的建议是,做deep learning的研究和利用deep learning做产品需要努力和具备的知识是不一样的,但有一点共识就是try things yourself,可见大家都十分认同基础的重要性。
- 林元庆
- 林元庆不用说了,原来我厂深度实验室的主任,可以说是国内deep learning的先驱,给出了一些工业界的看法。
- 给出的建议是学习一些机器学习的基础,可以使用一些开源框架。我相信所有研究deep learning一定会机器学习的机器,一定也会使用开源框架的。
第三课:结构化机器学习项目
个人认为这周的课是这门课的精华,也是在其他地方(公开课、书籍等)很难了解到的一些工程的方法论的东西。
第一周:机器学习策略
- 讲了正交化的策略,其实类似于我们熟知的控制变量法,便于找到问题的所在。
- 讲解了如何设置评价指标,和划分训练集、验证集、测试集。这是我们首先要做的事情,相当于我们设立好了目标,就像射箭的靶子一样。接下来我们所做的优化都是为了提搞验证集上的评价指标。如果我们没有设好目标,那么所做的努力很大概率无意义。现实中太多这样的案例!!!
- 讲解了算法如何与人的表现对比同时进步,其实这个问题主要集中在人擅长的领域,比如图像识别、语音识别,想超过人的水平不是特别容易,所以存在对比和进步。然而对于一些结构的数据人往往是做不过机器的,这是机器擅长做的,记住大量的数据并拟合。
第二周:机器学习策略
- 误差分析,这是模型后期调整非常重要的手段,指明我们调整的方向。
- 讲解了如何应对训练数据和最终的测试数据分布不一样的情况,首先要定位分布不一带来的误差是多少,提高的主要策略是人工合成数据。
- 讲解了迁移学习、多任务学习、端到端学习,这些都是在深度学习领域会比较经常遇到的问题。
大师采访
- 采访了两位大牛,一位是斯坦福CS231课程的老师,一位是苹果公司的技术总监。给出的建议比较一致,希望大家不仅仅会调用深度学习的框架,还要能够亲自写出神经网络的前向传导和后向传导的全部过程。我也是觉得自己手写完神经网络之后就会特别有自信,对其中的每一个过程做什么都详细的了解。以后再遇到什么高大上的方法都不惧。PS:曾经在matlab上手写全连接神经网络和CNN卷积神经网络。