深度学习半年学习心得(如何入门)

从一句代码都不会写,慢慢接触数据分析花了半年,然后学习机器学习、深度学习、自然语言处理又花了半年多,虽然标题写的是深度学习的学习心得,但其实更多是这一年多的时间里,关于编程、模型等等的学习的回顾和反思。

首先我本科学的是数学,不过说实话学得也不好,很多知识理论考完试就忘了,印象最深的只有实变函数,因为难得逆天,所以实际上,我的背景就是数学学得不好,编程也没怎么接触过(除了用过matlab做数学建模),这样的我却因为一些巧合去了一家企业实习做数据分析,开始正式学习编程。

当时的老板对我也是非常好的,他给我定下了一个半年计划(因为我就实习半年),首先从数据库开始学习数据的预处理,然后学习Java,通过Java连接数据库做一些复杂逻辑的数据处理,同时结合python做分析,这是主线。另一方面,因为当时公司想要做一个交通大数据平台,所以还涉及到前端方面的知识、数据接口之类的东西,这些也要学,不过这些就是其他同事的工作,我就是偷一下师。

这个计划现在看来是非常合理的,主要在于学习的顺序,我认为一个合理的学习顺序对于最终的效果有很大的影响,可以看到,首先学习mysql,语句十分简单,很适合作为一个变成零基础的人入门,然后是学习Java而不是python,我个人觉得python虽然写起来简单,但不够"规范",比如说用python输出一个语句只用一个print就足够了,Java却要写一大堆东西,但那些东西没有意义吗,恰恰相反,它们其实反映了面向对象编程的思想,只是python隐藏了这些东西。所以我觉得如果想要系统学习编程,python并不是一个好的选择(当然,做深度学习的话或许学习C++和python更好,不过那就是后话了)

另一方面,我觉得学习如果想要效率高,最主要的就是要有目的,少点纠结细节,少看书,多实践。这是老板给我的建议,比如说数据库,如果买一本书来看,几百页,看完都一个月过去了,而且对一个编程零基础的人来说,看完估计也是什么都不懂,所以最实际的方法就是在网上搜教程,最简单的sql教程,大概看一下,然后就直接上手,当时我以处理数据为目的,根据需求想办法写出sql语句,想不出来就谷歌,这样几天下来,很容易就熟悉了。

后来我也继续跟着老板做一些大规模数据挖掘和机器学习的内容,然后就进了机器学习的坑,关于机器学习,我个人觉得还是那两点心得,制定一个合理的学习顺序,以及少看书,多看博客。什么是合理的学习顺序,就是比如你不能跳过机器学习直接学深度学习的模型,只有深入理解了线性回归、逻辑回归,才能更好地理解神经网络,像这样一步一步踏实地学习,总是没错的。除此之外,我觉得学习一个模型,很重要的一点就是要自己推导一遍公式,用代码实现一次模型,然后写一篇文章记录下来,只有你能够向别人解释清楚这个模型是什么,这才算真正掌握了一个模型,所以虽然这个过程会耗费很多时间,但我也一直在坚持,一直写博客。

后来,我决定做自然语言处理,又找到了一些新的心得。首先,当你学习的内容慢慢变得前沿,你会发现书肯定是没用的了,因为特别是深度学习这个领域,每年都会出现一个甚至几个有很大突破的模型,即使你买了一本上年出的书,你也会发现它很多内容都是过时的,而且书本讲的都是差不多的内容,最重要的是根本就不够深入!然后就看博客吧,可是还是那个问题,当你学习的内容变得前沿,学的人就会慢慢变少,其中写博客的人就更少了,所以你会发现,比如你想搜一些ESIM模型的文章,好像全网都是同一篇文章相互引用。

这时候就需要看论文了,其实我们可以把论文看成更加严谨的博文,你看博客可能会有小错误,但是论文基本上是不存在的,而且其实论文也写得很详细的,每个细节都会讲解清楚,可能就是有时候不够博客通俗易懂而已,对英语的要求也更高一点。

除此之外,论文也能让你了解到目前学术界的发展进程,比如说,你想学习CNN,然后上网搜文章,感觉学了好多,但其实说的都是上个世纪提出的LeNet,后面已经提出了GoogLeNet、ResNet、DenseNet等等一大堆模型了,可是你不看论文你是不会知道的,或者说你会经常看到这些词,但你并不知道这些原来是CNN的改进版本,也不清楚它的发展历史。

最后,看论文还有一个好处,就是拓展思路,每篇论文其实都包含了这个研究方向的一个综述,也会写到研究团队的改进思路,这些都是很宝贵的东西,在阅读过程中,你就会慢慢发现原来之前觉得很厉害的LSTM其实还是会有短期记忆的问题,原来Transformer就是为了改进LSTM这个缺点用multi-head attention替换所有RNN、LSTM而提出的,诸如此类的,明白不同模型的优缺点,不同模型是如何改进的,这些都对研究有很大的帮助。

所以总的来说,如果现在给我一个新的知识点,我会怎么学习呢,首先就是看博客,看有没有写得比较好的博文,然后就是看相关的论文,再把自己的理解记录下来,写成文章,这样也能帮助到其他需要学习的人,最后,再用代码实现。

关于代码实现模型这一块,我也说一下自己的一些习惯,首先,虽然自己从头开始写一个模型可以深刻地理解它,但耗费的时间实在太多了,所以我往往会在github上下载代码,一般这样下载下来的代码是比较完整的,有很多功能的,然后我就会删减代码,简化代码的好处就在于能让你初步了解实现这个模型的核心模块,同时能理顺整个模型实现的思路,避免其他功能的干扰,比如说你想学习一个简单的全连接神经网络结构,下载了代码发现作者在神经网络的基础上又加入了dropout、残差连接等等,这些结构能让模型效果更好但却不是最核心的模块,所以你就可以删掉它们了,在分析哪些可以删除哪些不可以的时候,你自然就明白了整个模型的思路了。

之后,我会在代码上写注释,分析出每一步的作用,每一步是如何实现的。最后,如果想要更深刻的理解模型,我就会选择把这个模型应用到其他问题上,比如我现在有一个用于图像分类的CNN,那么我就会想办法把它改成用于文本分类的CNN,改动不大,但是实际改完你就会发现对模型的理解又更深了。

以上就是我这一年多时间学习编程、深度学习的一些小小经验,如果能够带给正在烦恼如何入门的你们一些小小的帮助就好。

最近本人在github写了一个自然语言处理的入门教程,包括模型的代码和模型的分析介绍,欢迎交流:NLPBeginner

想浏览更多关于数学、机器学习、深度学习的内容,可浏览本人博客

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值