机器学习+深度学习巡洋舰特训课铁哥总结长文
为期三个月的(点击查看相关推送)已经结束。如果要和大家分享什么的话,我觉得有很多点值得记录, 为了多给大家一些干货, 我还是从学科学习的经验开始给大家分享。
要说这AI算法最近很热, 算法工程师也很热, 不过我敢说, 巡洋舰的特训课其实是没有蹭热点之嫌,而更像一个大家精雕细刻的小小艺术品。就在去年寒冷的一月, 二十来个学员凑在五道口附近小小的教室里开启了此次特训课之旅。
课程开始时的合照
这门特训课分为三个重要的部分, python, 机器学习和深度学习。
其实对于我们课程的设计者, 这课程早在去年9月就开始了, 因为那时候我们开始做课件。而很多酸甜苦辣也在这个做课件的过程里。
我来谈谈设计这门课程的心得, 首先, 对于深度学习到底难不难, 真是众说纷纭。 而这门课到底难不难,其实真的很难说清, 因为深度学习背后的知识真的太交叉了。 能够同时体现理论的深度和实战性, 兼顾不同背景的人 ,算是这个课程设计的第一个挑战。
首先说说来上课的同学的背景, 这些同学各自来自不同的环境, 一个很显著的特色是, 大家一半来自中科院的科学院所, 一半来自偏向工程的学科, 如计算机编程, 航空航天。 也有基础差别较远的同学。 对于那些理工科的博士,大家的欠缺其实主要在编程, 而一些偏向实践派的同学, 则多为数学困难。
这样的多元性, 就决定了课程需要让不同的人, 可以从不同的角度重构整个深度学习体系, 最终都要通过非常合理精巧的设计课件解决。 我们在这门课的很多功夫, 也体现在这个课件上,而我们对每一个课件的认真程度, 也达到一种死磕的极别,团队相信, 每个课件不仅要是一个好的程序, 一个好的练习题,而且是一个好的故事。我们当时可以说找遍了所有网上能够找的材料, 再结合自己的研究背景做成。
真正要学好深度学习, 一定的机器学习基础也是必须的,所以我们制定一个最简的机器学习路径,直接从什么是线性回归入手让大家了解什么是机器学习, 然后直入机器学习需要下最大功夫的点 – 特征。 因为在机器学习问题里, 寻找到好的特征, 做好特征工程, 比好的模型还要重要。
事实上很多机器学习模型的扩展也可以理解为如何更好的认识和挖掘特征。在机器学习的课件上, 我们就体现了先让大家在例如kaggle房价预测这样的数据集上建立一些简单的机器学习模型取得一点小成就, 接下来, 就围绕特征工程这个主线, 让大家通过不停的改进模型,增加特征,来体会各类特征工程技法的重要性。
围绕模型,特征这个主线,我们才真正开始建立机器学习背后的数学体系,如果你开始给学生建立这个数学体系, 无疑会带来的问题是学生根本无法理解, 而这样经历了简单模型的洗礼, 再去如何用条件熵拣选特征,交叉熵来检验模型, 就变得没有那么脱离实际。 沿着什么是好特征,什么是好模型的主线,我们从线性模型达到非线性模型, 并且沿着模型复杂度进化的主线来延展我们的故事。
首先, 一切机器学习模型的根基基本可以规划到线性模型(严格说还有树模型和简单贝叶斯), 然而线性模型良好的解释性和解析性背后, 也带来由于本身过于简单假设带来的无能,然后我们通过大量的加入特征和相匹配的正则化算法Lasso来挽救这个局面, 并且用交叉熵这类比较高级的损失函数来解决分类问题得到逻辑斯蒂回归, 但还不行, 于是各类非线性分类器上马。
要通过一个课件打通学生的任督二脉,最重要的是让学生在做的时候体会整个知识形成的过程, 为什么要在线性分类器里引入概率,为什么要在线性回归里引入lasso,我们先引导学生发现一个问题,然后在寻找解决方法的时候,自然的引入这个知识,这样学生不仅可以学习知识还可以体会科学家思考的功力。 还拿逻辑斯蒂回归来说, 我们把最早iris花分类数据100%准确率的感知机放到泰坦尼克的数据集上, 模型一下子崩了 ,然后我们开始引导大家发现隐藏在目标函数里的问题, 加入概率,得到交叉熵, 模型准确率就上去了。
关于深度学习部分课程的设计,事实上很多人会发掘这个课程的难度更大很多, 理论更抽象, 而程序更复杂, 需要的算法动辄需要几块GPU一起转动。
我一开始觉得可能深度学习最大的困难来自大家手里没有算力, 还特别配置了几台多个牛逼显卡并行的机器, 然而后来发现这个担心其实大可不必。
因为事实上在初手刚开始学习这些概念的时候, 最缺少的不是这些东西, 而是如何从最简单的一些例子明白CNN, RNN这些黑箱为什么work, 和之前的模型有什么区别。 如果你一开始就上比较大的数据如imagenet, 然后掉个包弄上去。 看上去高大上准确率也不低, 但学生看到了无非是你打开一个开关, 然后微波炉把东西煮熟的效果。 这样的东西其实教了意义也不大。
这和一个算法工程师要达到的真正能力要求还是相差比较远的。 围绕这一点, 我们的模型一开始就把所有不必要的细节踢掉,而从最简单的数据入手,然后让大家用最简单的工具得到新的模型。
比如RNN的教学, 我就让大家一开始去用正弦函数预测一个余弦函数, 这个问题看似简单, 你用多少层的前向网络都解决不了, 然后我让大家用最简单的方法加入一个循环连接, 问题就解决了。用的数据很简单,但是却击中了RNN的死穴。 你通过它就理解为什么更复杂的情况下RNN可以做人机对话甚至谱曲, 股价预测, 自然语言预测。 不经过这个过程, 其实学生很容易被一些表面的东西弄迷糊。
由于这些我们自己精心设计的例子恰恰不太需要算力,算是我们用我们的脑子给大家节省了算力, 让大家无需去配置深度学习机也可以掌握深度学习算法的核心 ,发明了一种穷人的深度学习教学法。 当然, 真实的数据也还是要上的, 在进阶的学习里是免不了的啊。
在这里不能不提出的就是,我们使用了pytorch框架作为教学的基础而没有直接采用tensorflow, 是因为pytorch的内在逻辑和深度学习的理论本身有一种惊人的一致性, 你的网络构建就如同是在思考的过程(前向传播反向传播), 而且无需编译直接运行。用pytorch我们可以让学生非常轻松的改变网络的结构, 从而让学生很容易实践他们对深度学习的一个想法。 有了pytorch, 我们的深度学习从零开始“穷人教学法” 就更得心应手了。
这里面一个很好的例子就是我们写了一个7日神经网络pytorch教程, 几乎把pytorch的学习和神经网络的所有重要技巧给窜起来了。 如初始化,dropout,不同的优化技术, 神经网络结构进化都融合进去了。