在学机器学习和深度学习,为什么感觉越学越不会,怎么解决这个问题?

Posted 深度学习冲鸭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在学机器学习和深度学习,为什么感觉越学越不会,怎么解决这个问题?相关的知识,希望对你有一定的参考价值。

来源:知乎
https://www.zhihu.com/question/371622741
编辑:深度学习冲鸭公众号
本文来自知乎问答,仅供学习参考,著作权归作者所有
如有侵权,请联系删除

回答一
作者: AlphaBetaQuant
北京大学
https://www.zhihu.com/question/371622741/answer/1181909538


以PRML来入门,就是找虐。PRML虽然被广泛推荐为教材,但是我个人极其不喜欢这本书。许多细节表述很不清楚、过于强调贝叶斯角度,以及对新手极其不友好。
个人推荐Introduction to Statistical Learning, 作者是Gareth James, Daniela Witten, Trevor Hastie, Robert Tibshirani,经典中经典之作。作为第一本机器学习书尤为合适。它的加难版Elements of Statistical Learning写得远远不如这本ISL,只能当做工具书来看。电子版地址:
http://faculty.marshall.usc.edu/gareth-james/ISL/


此外,这本All of Statistics: A Concise Course in Statistical Inference -- by Larry Wasserman也很不错,主要讲授统计的基础知识和基本统计推断模型,对于新手友好很多。电子版地址:
https://www.ic.unicamp.br/~wainer/cursos/1s2013/ml/livro.pdf

在学机器学习和深度学习,为什么感觉越学越不会,怎么解决这个问题?


Statistical Learning with Sparsity -- by Hastie, Tibshirani, Wainweight,主要讲授正则化方法(如LASSO, Ridge regression等),以及压缩感知等内容。作者是LASSO算法的发明人,也公开了这本书的电子版,地址如下:
https://web.stanford.edu/~hastie/StatLearnSparsity_files/SLS_corrected_1.4.16.pdf

在学机器学习和深度学习,为什么感觉越学越不会,怎么解决这个问题?


最后,推荐这本Understanding Machine Learning -- by Shalev-Shwartz and Ben-David,它对于机器学习的理论讲授的比较深入。题外话,我对书名中有“understanding”一词的书常有无限好感,这类书经常绞尽脑汁的让你明白原理。地址版地址:
https://www.cs.huji.ac.il/~shais/UnderstandingMachineLearning/understanding-machine-learning-theory-algorithms.pdf

在学机器学习和深度学习,为什么感觉越学越不会,怎么解决这个问题?

(PS:为方便阅读并且感兴趣的小伙伴们,以上四本pdf已打包,可在 文末获取 )


回答二
作者:曲終人不散丶
https://www.zhihu.com/question/371622741/answer/1205423480

我的研一我记得是先找了一本比较薄的,通俗易懂的深度学习书,内容浅尝辄止,但很基础,主要介绍全连接层,反向传播机制,然后过渡到CNN,池化,批量梯度下降,就这些了。

之后我又看了一本Tensorflow深度学习,代码不看,只看内容。里面也大同小异,不过介绍更细了些,比如AlexNet, GoogleNet, ResNet等等,还有具体的一些任务。

之后我就不看了,我就去看我最感兴趣的方向(CV的一个子领域)的最SOTA的算法的由来,CSDN上文章很多,多看几个。刚接触一个领域,起码要知道这个领域目前最有影响力的算法的历史及其发展吧?然后逐渐拓宽文献面,个人比较喜欢看一些偏理论推广的东西,特殊推广至一般是常用的创新套路。举几个典型的例子,比如目标检测的Soft-NMS是传统NMS的推广,SENet也是一种推广,Group Normalization是BN和IN的结合,还有二阶池化策略是比之一阶池化更好的池化。

研一下我就看了少说七十篇文献,都是CVPR, ECCV, ICCV的文章。然后创新点就很自然地出来了。看多了,多思考,自然就会发现目前尚未解决的问题,以及前人方法的次优性。这里提一句,不同领域的专家,哪怕同为CV但却是不同子领域的人,二者最大的差别不是别的,就是文献量。

然后我就想解决方法啊(其实中国的学生解决问题的能力都很强,就看你能不能想到问题),特别是985研究生,不管大家承认与否,也是中国最优秀的一批人了。

其实最开始我也就抓住了一篇CVPR的一个小问题,随后想了解决方案,利用本科学的数学分析这样的思维(要不怎么说考研要考数学一呢?)进行深入的打磨和推敲,其实问题都不难,这些问题不过都是有限维函数,及其导数(梯度),极限等知识有关。

然后我就得想办法编程了啊,我之前也只会matlab。没试过python,连环境都不会装。

最后磨蹭了一段时间,终于装好了环境,跑通了一遍baseline。开始找别人代码上我应该要改的地方在哪里。

接着就照着别人的代码改,遇到不会就终端输出啊,看一看tensor的size啊,具体的tensor运算啊,这些东西不超过高等代数的范畴(或线性代数)。也得亏是我这个解决方法不涉及大的改动,比如修改网络之类的,于是就做实验吧。

边做实验的同时,也与一起合作的同学交流想法,于是就酝酿出来更好的方法,更进了一步。PS: 论文的层次感也是挺重要的。比起那种CVPR上见到过的一个算法一篇文章,或者一个公式写一篇文章,如果你的文章能有2~3个创新点,无疑是好事。

可能是我个人追求完美的原因吧,加之我做科研具备严谨素养,我会仔细推敲,对别人的repo我训出什么结果就是什么结果,训的高我论文就用训的高的,低了那就是低了。

于是研二就中了一篇一作A会。

总结来说,
首先,不要着急练代码,于我而言就是盲人摸象。

第二,基础知识仅了解那些能助于你理解论文的部分就好了,难道你还指着把周志华的机器学习都看完才做研究吗?书只是一种工具,一份参考,一本字典,不会带给你任何的创新启发。

第三,先从你领域内的最经典的论文开始(可能有好几种不同的经典模型),统统了解来龙去脉。

第四,最经典了解完后,就开始开枝散叶式地了解模型中的每一个细节,因为每一个细节可能都有至少一篇的顶会论文在其中。

第五,不要死磕英语。CSDN,公众号,知乎,有道划线翻译,都会加快你提炼论文核心的速度。

第六,量变产生质变。当你论文阅读量达到五十篇后,基本对这个领域有个不错的认识了,多个改进的算法有何特点,有何区别,你的心中也有了框架,此时产生idea也不奇怪。我目前总阅读量也就180篇左右

第七,不要畏惧编程。你只有去适应它,习惯了之后,编程都是小意思。

第八,严谨性,不得意于眼前的成功。只有认真打磨,深入挖掘一项工作,才有可能做出真正solid的工作。

第九,能吃苦。现在的AI方向更新速度太快,你必须与别人拼速度,包括合作者,硬件设备。你知道何恺明为何能在2017的ICCV上大展手脚吗?因为他与他的好朋友Ross Girshick两个人加起来正好能工作满24小时。其实我有时也是非常羡慕,如果能有一个人也与我工作满24小时该多好。我醒了,他去睡了,我睡了他接着干了。当然这个也只能在大厂或者知名高校这样的地方可能见到了,那么你未来如何进这样的地方?只有取决于你的现在。设备不多,自然就要充分利用好每一秒,我的实验由于不是恰好24小时的整数倍能做完的,所以经常需要半夜爬起来去测试,去开下一个实验。又或者我一个实验凌晨一点出结果,我也要熬到那时候做完才回寝室。时间都是挤出来的。当然也不用太累,做实验期间,你该上课上课,该打球打球,该看电影看电影,该约火锅约火锅,生活要丰富起来,精神才能丰富,锻炼身体我也是没有落下,羽毛球乒乓球三天不打就手痒。

第十,真心的热爱。只有你热爱了,你才会乐此不疲,甚至以此为一生的职业追求。迈克尔杰克逊老时可以说自己一生热爱的是音乐与舞蹈,赵忠祥老时也可以说自己一生热爱的是主持与播音事业,我不希望我老时谈及自己热爱什么的时候,发现自己说不出来云云。可见一个人能一辈子从事自己所热爱的事业将是多么不容易也是多么幸福的一件事,年轻人就该把握好,把力往最擅长的点上使。

当然了,最关键的是你要有拼劲。多少次我在实验室看到美轮美奂的日出,多少次我大半夜顶着寒风骑电动车回寝室我就不说了。可能这对于身处大牛组的人来说感受会低一些,但对于我这种孤军奋战的人来说,所拥有的资源就是双GPU显卡,感触会非常深,但同时对我个人能力的锤炼也无疑会更好,无论是科研能力,科研精神,还是工程代码能力。

说了这么多突然感慨万千,其实当你看到CMT上“Accept”这个词时,一切的苦痛也都全然消失了,转而来临的是无尽的欢笑与成功的泪水……
——————————————————
感觉看的人挺多的,那就再更新一波,有关论文写作。

其实很多公众号如SCI,上面都会有详细的论文写作教程,都可以看看,但我当时写论文却没有依赖这些教程。

写论文的关键在于如何组织结构,如何写好一个故事。哪些是不得不说的废话,哪些才是真正的核心论点。初高中时我们都一直锻炼过如何写好一篇议论文,这时候就有用武之地了。大致可总结为自圆其说四个字。

首先,你得有相当量的文献阅读量,这样你在写论文时,下笔将非常有一种统领千军的感觉。前人的工作,目前研究的现状,别人都是如何解决问题的,却又留下了哪些问题,这些东西不通过看文献你是不会有足够深的理解和意识的。

如果你缺乏这方面意识,比如你只看了10篇文献,然后你相当天才也想出了绝佳的idea,并付出行动后成功了,此时你再面对文章,你将非常痛苦。这仅仅10篇的知识面,甚至只能让你写一章Proposed Method。这时你该怎么办?基本上只能照搬别人论文里的句子,各个地方都借用一点,凑出一篇文章。

可是如果你有相当的文献储备量,写起来将轻松多了。首先你根本无需照搬别人的论文,你就像个音乐指挥家,用自己的话把这个故事写了出来。

我举个例子。
比如你解决的是目标检测领域某篇CVPR 2020的一个尚未解决的问题,你想了改进方案,成功在ResNet50下提高了性能1.5个百分点。

这时你无比兴奋地向导师汇报了成果,毕竟1.5个百分点可不是一个小数字了。

你要知道1.5个绝对百分点的提升,换做大牛组来做,可以必中A会,甚至oral。

那么你一个小白,该如何给这个小小的苗子一个适合它的家?

让我来告诉你大牛组的人会怎么做。首先,已知你在A模型的ResNet50上比baseline提高1.5个点,接着马上做ResNet101看看情况。如果你的提升是有理论依据,并且不太可能是偶然因素的话(1.5的提升基本不可能是偶然),那么R101多半也是提升1.5±0.8。

这下基本确定这个idea是有效可行了之后,开始尝试把改进方法移植到B模型,C模型(三个就够了)。让我们看看最终的实验表格,以提升最多的那个模型为主要的结果。ABC三个表,Ablation study包括探究主干网络是否影响,超参数的敏感性实验,涉及改动网络的还需要考虑bflops,探究是不是增加网络层数带来的提升。涉及降低推理速度的,还得探究这种牺牲大不大。

以上这些都是常见的Ablation。最好你在实验过程中能酝酿出第二个更好的改进方案。这样你在纵向上也能列出表格,这就是所谓的论文层次感。更有甚者,有人甚至可以一开始觉得想出的改进太成功了,却又想不出更好的方法,可以在baseline和你的方法之间找一个中间状态的方法,然后以这个中间状态方法为第一个创新点,接着针对这个创新的不足,提出第二个创新点(实际就是你最开始想的那个),自己改进自己,自己革新自己,说不定还能从中找出事物背后的深刻道理,无疑都会为你的文章增添色彩。

回到论文写作上来,假设你已经有了所有的主要实验和Ablation(当然实际上肯定是一边写一边做)。abstract,Introduction,related work,这三大部分就是写故事的关键了。

套路一般是,先说大环境下本领域的发展,分类,极其对其他领域的作用。进而转到其中某某模块(你针对的模块)对整体的性能至关重要。该模块已被多个其他领域应用,如U,V,W(列出参考文献)。针对该模块,大家都使用的方法是Z,近十年来一直如此。后续针对传统方法Z的不足,近几年有学者提出了D方法(ECCV2017),用以改善XXXX。接着针对D方法的不足,又有人提出了E,解决了D的问题,比如提高D的速度,或者D的稳定性,或者是D的推广版本。E是相当经典的,这么多年以来成为了主导,可谓人尽皆知。最新的研究进展中,有学者还提出了F, H等变体,分别考虑了XXXX,有的还应用在其他领域中。但是(关键来了),上述这些方法,都仅仅考虑了XXXX层面,因素。However, we observed that......,they may suffer from……,they face the problem of……这个地方最好需要你用一句神来之笔的观点说出这些方法的问题,从而让人眼前一亮,让人恍悟好像这些方法确实是这么一回事,甚至让人恍悟原来E方法能有提升是出于背后这么个原因。总之你若能总结到类似于这样的深刻道理,那基本上审稿人对你论文的看法就是very novel。加之你的提升有1.5个点这么多,那么审稿人对你实验结果的看法也将是significant或very convincing。

上述这些东西挑最关键的部分放在abstract,占1/3到1/2左右。然后全部内容放在Introduction,作为引入你的观点的背景故事。Introduction剩下两段,一段用来说明你的改进方法的大致流程,最后一段用以总结本文的贡献。还是那句话,只要你有足够的文献储备量,这些东西写起来信手拈来,几乎是畅所欲言,写的爽死。当然还需注意语言表达要客观,要尊重,还要犀利。

related work,分两种,一种是针对你改进点的相关工作,比如刚刚的传统方法以及D, E, F, H方法。还有一种没的写了就写大框架的工作,比如机器阅读理解方法,目标检测方法,图像去噪方法,3D重建方法(根据你的领域),算是一个汇总性的介绍。


回答三
作者:机器学习入坑者
专注人工智能领域研究
https://www.zhihu.com/question/371622741/answer/1076715668

推荐一下讯飞的免费AI学习课程,涵盖Python和ml和dl等:
https://mp.weixin.qq.com/s/517kwfC5yIlnVp3WkLI0kw

研一刚入学,一定要“小步慢跑”,学一个算法就一定要学透(公式推导+代码编写),不要今天看一下SVM、明天瞅一眼MLP。

写代码能够学到东西,跑代码是学不到任何东西的。

从基本的算法开始,比如KNN,花上一周时间按照类似下面的流程进行实验:
(0)公式推理
(1)筛选数据
(2)模型搭建(编写代码)
(3)指标计算
(4)调参分析(不断优化)
(5)重新理解公式推理

按照上述步骤学完第一个算法以后,再以相同的过程学习第二个算法。对不同算法重复相同的实验流程,能让自己对模式识别那本书理解更深刻。

我认为从事深度学习最忌讳的就是“急”,python还没学好,就去学pytorch;pytorch还没学好,就去跑开源项目。编程基础和理论基础还没打好,就去看论文跑开源代码,时间都浪费在环境配置和版本兼容调试上面了。

美其名曰项目驱动学习,实际上就是浮土筑高台。研一基础不牢靠,研二很难静下心来弥补缺失的知识。然后就有趣了,研一整年没能学到扎实的技能,导致二年级做实验的时候举步维艰。在这种焦虑的情况下只能继续听从“项目驱动学习”这种策略,害怕组会、害怕导师催你。(我并非反对项目驱动学习,我反对的是没有ML或DL基础的情况下就搞项目)。

相反的,如果研一的基础非常扎实,天天写代码夯实实践基础,天天推导公式夯实理论基础。研二的时候就能水到渠成,自然就能把论文实验做的很好,磨刀不误砍柴工。

一步急,步步急,最后就只会跑别人代码调调参数,关掉github以后连一个基本的CNN分类pipeline都写不出来(数据清洗+数据读取+网络设计+损失选择+模型训练+指标计算+调优)。

粗略的读一读理论证明,然后找个开源代码跑一下,我认为这种方式真的学不好模式识别那门课。

补充:关于学习经历
https://www.zhihu.com/question/305745486/answer/557055667

补充:关于pytorch
曾经写过一些pytorch的日志,包含数据采样、增强、模型搭建等等:
https://zhuanlan.zhihu.com/c_1176057805353766912

补充:关于书籍选择
 
   
   
 
if(good_at_math){
choose("西瓜书");
}
else{
choose("机器学习实战");
}


补充:关于视频学习资料
吴恩达老师有两个视频课程,建议选择早期版本(好像是零几年),那个版本的数学论证比较完整。


获得方式(答一的4pdf):
1. 关注深度学习冲鸭】公众号
在学机器学习和深度学习,为什么感觉越学越不会,怎么解决这个问题?
2. 在深度学习冲鸭】公众号后台回复 723 即可。



欢迎关注【深度学习冲鸭】公众号,我会在这里记录自己在路上的一点一滴!
再小的人也有自己的品牌!期待和你一起进步!

以上是关于在学机器学习和深度学习,为什么感觉越学越不会,怎么解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

深度学习,才是2019的正确打开方式

越学越有趣:『手把手带你学NLP』系列项目07 ——机器翻译的那些事儿

怎么才能做好一个软件销售

基础班学习总结

OpenGL理解一些基本问题

学编程太枯燥,整理11个边玩游戏边学编程网站,越学越上瘾