作者:jacky yang
链接:https://www.zhihu.com/question/26006703/answer/129209540
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
链接:https://www.zhihu.com/question/26006703/answer/129209540
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
关于深度学习,网上的资料很多,不过貌似大部分都不太适合初学者。
这里有几个原因:
1.深度学习确实需要一定的数学基础。如果不用深入浅出地方法讲,有些读者就会有畏难的情绪,因而容易过早地放弃。
2.中国人或美国人写的书籍或文章,普遍比较难一些。我不太清楚为什么,不过确实是这样子的。
深度学习,确实需要一定的数学基础,但真的那么难么?这个,还真没有。不信?听我来给你侃侃。看完,你也会觉得没那么难了。
本文是针对初学者,高手可以无视,有不对的地方,还请多多批评指正。
这里,先推荐一篇非常不错的文章:
《1天搞懂深度学习》,300多页的ppt,台湾李宏毅教授写的,非常棒。
不夸张地说,是我看过最系统,也最通俗易懂的,关于深度学习的文章。
这是slideshare的链接:
http://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bc&v=&b=&from_search=3
没梯子的同学,可以从我的网盘下:
链接: http://pan.baidu.com/s/1nv54p9R 密码:3mty
要说先准备什么,私以为,其实只需要知道导数和相关的函数概念就可以了。高等数学也没学过?很好,我就是想让文科生也能看懂,您只需要学过初中数学就可以了。
其实不必有畏难的情绪,个人很推崇李书福的精神,在一次电视采访中,李书福说:谁说中国人不能造汽车?造汽车有啥难的,不就是四个轮子加两排沙发嘛。当然,他这个结论有失偏颇,不过精神可嘉。
导数是什么,无非就是变化率呗,王小二今年卖了100头猪,去年卖了90头,前年卖了80头。。。变化率或者增长率是什么?每年增长10头猪,多简单。这里需要注意有个时间变量---年。王小二卖猪的增长率是10头/年,也就是说,导数是10.
函数y=f(x)=10x+30,这里我们假设王小二第一年卖了30头,以后每年增长10头,x代表时间(年),y代表猪的头数。
当然,这是增长率固定的情形,现实生活中,很多时候,变化量也不是固定的,也就是说增长率也不是恒定的。比如,函数可能是这样: y=f(x)=5x²+30,这里x和y依然代表的是时间和头数,不过增长率变了,怎么算这个增长率,我们回头再讲。或者你干脆记住几个求导的公式也可以。
深度学习还有一个重要的数学概念:偏导数,偏导数的偏怎么理解?偏头疼的偏,还是我不让你导,你偏要导?都不是,我们还以王小二卖猪为例,刚才我们讲到,x变量是时间(年),可是卖出去的猪,不光跟时间有关啊,随着业务的增长,王小二不仅扩大了养猪场,还雇了很多员工一起养猪。所以方程式又变了:y=f(x)=5x₁²+8x₂ + 35x₃ +30
这里x₂代表面积,x₃代表员工数,当然x₁还是时间。
上面我们讲了,导数其实就是变化率,那么偏导数是什么?偏导数无非就是多个变量的时候,针对某个变量的变化率呗。在上面的公式里,如果针对x₃求偏导数,也就是说,员工对于猪的增长率贡献有多大,或者说,随着(每个)员工的增长,猪增加了多少,这里等于35---每增加一个员工,就多卖出去35头猪. 计算偏导数的时候,其他变量都可以看成常量,这点很重要,常量的变化率为0,所以导数为0,所以就剩对35x₃ 求导数,等于35. 对于x₂求偏导,也是类似的。
求偏导我们用一个符号 表示:比如 y/ x₃ 就表示y对 x₃求偏导。
废话半天,这些跟深度学习到底有啥关系?有关系,我们知道,深度学习是采用神经网络,用于解决线性不可分的问题。关于这一点,我们回头再讨论,大家也可以网上搜一下相关的文章。我这里主要讲讲数学与深度学习的关系。先给大家看几张图:
<img src="https://i-blog.csdnimg.cn/blog_migrate/ed252c3786988ded0ebf2540379df5e1.png" data-rawwidth="631" data-rawheight="488" class="origin_image zh-lightbox-thumb" width="631" data-original="https://pic3.zhimg.com/v2-91704850c698cbe0cdfd0af76d328ebe_r.png"> 图1. 所谓深度学习,就是具有很多个隐层的神经网络。
图1. 所谓深度学习,就是具有很多个隐层的神经网络。
<img src="https://i-blog.csdnimg.cn/blog_migrate/68bdd151ff8b150b3f3481db3bf7083d.jpeg" data-rawwidth="432" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="432" data-original="https://pic4.zhimg.com/v2-7875411304340d5accd6d800be9f933b_r.jpg">
图2.单输出的时候,怎么求偏导数
<img src="https://i-blog.csdnimg.cn/blog_migrate/e130541d07cd9de7ecb5103deafed95e.jpeg" data-rawwidth="432" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="432" data-original="https://pic2.zhimg.com/v2-c52b1fcdd42c3ac413120b56e40a8619_r.jpg">图3.多输出的时候,怎么求偏导数。后面两张图是日语的,这是日本人写的关于深度学习的书。感觉写的不错,把图盗来用一下。所谓入力层,出力层,中间层,分别对应于中文的:输入层,输出层,和隐层。
图3.多输出的时候,怎么求偏导数。后面两张图是日语的,这是日本人写的关于深度学习的书。感觉写的不错,把图盗来用一下。所谓入力层,出力层,中间层,分别对应于中文的:输入层,输出层,和隐层。
大家不要被这几张图吓着,其实很简单的。干脆再举一个例子,就以撩妹为例。男女恋爱我们大致可以分为三个阶段:
1.初恋期。相当于深度学习的输入层。别人吸引你,肯定是有很多因素,比如:身高,身材,脸蛋,学历,性格等等,这些都是输入层的参数,对每个人来说权重可能都不一样。
2.热恋期。我们就让它对应于隐层吧。这个期间,双方各种磨合,柴米油盐酱醋茶。
3.稳定期。对应于输出层,是否合适,就看磨合得咋样了。
大家都知道,磨合很重要,怎么磨合呢?就是不断学习训练和修正的过程嘛!比如女朋友喜欢草莓蛋糕,你买了蓝莓的,她的反馈是negative,你下次就别买了蓝莓,改草莓了。
深度学习也是一个不断磨合的过程,刚开始定义一个标准参数(这些是经验值。就好比情人节和生日必须送花一样),然后不断地修正,得出图1每个节点间的权重。为什么要这样磨合?试想一下,我们假设深度学习是一个小孩,我们怎么教他看图识字?肯定得先把图片给他看,并且告诉他正确的答案,需要很多图片,不断地教他,训练他,这个训练的过程,其实就类似于求解神经网络权重的过程。以后测试的时候,你只要给他图片,他就知道图里面有什么了。
所以训练集,其实就是给小孩看的,带有正确答案的图片,对于深度学习而言,训练集就是用来求解神经网络的权重的,最后形成模型;而测试集,就是用来验证模型的准确度的。
对于已经训练好的模型,如下图所示,权重(w1,w2...)都已知。
<img src="https://i-blog.csdnimg.cn/blog_migrate/7453cdf4769a2eeef07cf55ebad39476.png" data-rawwidth="940" data-rawheight="736" class="origin_image zh-lightbox-thumb" width="940" data-original="https://pic1.zhimg.com/v2-8521e1fa289e08dbbab5aa63b6527bd4_r.png"> 图4
图4
<img src="https://i-blog.csdnimg.cn/blog_migrate/2ca1405eba12f4aae27800960e9dd48c.png" data-rawwidth="776" data-rawheight="174" class="origin_image zh-lightbox-thumb" width="776" data-original="https://pic4.zhimg.com/v2-ef5ad0d06a316f762f0625b2468e2f43_r.png"> 图5
图5
我们知道,像上面这样,从左至右容易算出来。但反过来呢,我们上面讲到,测试集有图片,也有预期的正确答案,要反过来求w1,w2......,怎么办?
绕了半天,终于该求偏导出场了。目前的情况是:
1.我们假定一个神经网络已经定义好,比如有多少层,每层有多少个节点,也有默认的权重和激活函数(后面讲)等。这个没办法,刚开始得有一个初始值。你喜欢一个美女,她也不是刚从娘胎里出来的,也是带有各种默认参数的。至于怎么调教,那就得求偏导。
2.我们已知正确答案,比如图2和3里的r,训练的时候,是从左至右计算,得出的结果为y,r与y一般来说是不一样的。那么他们之间的差距,就是图2和3里的E。这个差距怎么算?当然,直接相减是一个办法,尤其是对于只有一个输出的情况,比如图2; 但很多时候,其实像图3里的那样,那么这个差距,一般可以这样算,当然,还可以有其他的评估办法,只是函数不同而已,作用是类似的:
<img src="https://i-blog.csdnimg.cn/blog_migrate/3d157a870d35cbec70eb514a5815bf1a.png" data-rawwidth="484" data-rawheight="102" class="origin_image zh-lightbox-thumb" width="484" data-original="https://pic4.zhimg.com/v2-e5ddd26d65aa04ed82f2a51fc8212427_r.png">不得不说,理想跟现实还是有差距的,我们当然是希望差距越小越好,怎么才能让差距越来越小呢?得调整参数呗,因为输入(图像)确定的情况下,只有调整参数才能改变输出的值。怎么调整,怎么磨合?刚才我们讲到,每个参数都有一个默认值,我们就对每个参数加上一定的数值∆,然后看看结果如何?如果参数调大,差距也变大,你懂的,那就得减小∆,因为我们的目标是要让差距变小;反之亦然。所以为了把参数调整到最佳,我们需要了解误差对每个参数的变化率,这不就是求误差对于该参数的偏导数嘛。
不得不说,理想跟现实还是有差距的,我们当然是希望差距越小越好,怎么才能让差距越来越小呢?得调整参数呗,因为输入(图像)确定的情况下,只有调整参数才能改变输出的值。怎么调整,怎么磨合?刚才我们讲到,每个参数都有一个默认值,我们就对每个参数加上一定的数值∆,然后看看结果如何?如果参数调大,差距也变大,你懂的,那就得减小∆,因为我们的目标是要让差距变小;反之亦然。所以为了把参数调整到最佳,我们需要了解误差对每个参数的变化率,这不就是求误差对于该参数的偏导数嘛。
关键是怎么求偏导。图2和图3分别给了推导的方法,其实很简单,从右至左挨个求偏导就可以。相邻层的求偏导其实很简单,因为是线性的,所以偏导数其实就是参数本身嘛,就跟求解x₃的偏导类似。然后把各个偏导相乘就可以了。
这里有两个点:
一个是激活函数,其实激活函数也没啥,就是为了让每个节点的输出都在0到1的区间,这样好算账嘛,所以在结果上面再做了一层映射,反正都是一对一的。由于激活函数的存在,所以在求偏导的时候,也要把它算进去,激活函数,一般用sigmoid,也可以用Relu等。激活函数的求导其实也非常简单:
<img src="https://i-blog.csdnimg.cn/blog_migrate/7ef99a58b5f524c7e3304776ddf60f88.jpeg" data-rawwidth="257" data-rawheight="159" class="content_image" width="257">求导: f'(x)=f(x)*[1-f(x)]
求导: f'(x)=f(x)*[1-f(x)]
这个方面,有时间可以翻看一下高数,没时间,直接记住就行了。
至于Relu,那就更简单了,就是f(x) 当x<0的时候y等于0,其他时候,y等于x。
当然,你也可以定义你自己的Relu函数,比如x大于等于0的时候,y等于0.01x,也可以。
另一个是学习系数,为什么叫学习系数?刚才我们上面讲到∆增量,到底每次增加多少合适?是不是等同于偏导数(变化率)?经验告诉我们,需要乘以一个百分比,这个就是学习系数,而且,随着训练的深入,这个系数是可以变的。
当然,还有一些很重要的基本知识,比如SGD(随机梯度下降),mini batch 和 epoch(用于训练集的选择),限于篇幅,以后再侃吧。其实参考李宏毅的那篇文章就可以了。
这篇拙文,算是对我另一个回答的补充吧:
深度学习入门必看的书和论文?有哪些必备的技能需学习? - jacky yang 的回答
其实上面描述的,主要是关于怎么调整参数,属于初级阶段。上面其实也提到,在调参之前,都有默认的网络模型和参数,如何定义最初始的模型和参数?就需要进一步深入了解。
不过对于一般做工程而言,只需要在默认的网络上调参就可以了,相当于用算法;
对于学者和科学家而言,他们会发明算法,难度还是不小的。向他们致敬!
写得很辛苦,觉得好就给我点个赞吧:)
这里有几个原因:
1.深度学习确实需要一定的数学基础。如果不用深入浅出地方法讲,有些读者就会有畏难的情绪,因而容易过早地放弃。
2.中国人或美国人写的书籍或文章,普遍比较难一些。我不太清楚为什么,不过确实是这样子的。
深度学习,确实需要一定的数学基础,但真的那么难么?这个,还真没有。不信?听我来给你侃侃。看完,你也会觉得没那么难了。
本文是针对初学者,高手可以无视,有不对的地方,还请多多批评指正。
这里,先推荐一篇非常不错的文章:
《1天搞懂深度学习》,300多页的ppt,台湾李宏毅教授写的,非常棒。
不夸张地说,是我看过最系统,也最通俗易懂的,关于深度学习的文章。
这是slideshare的链接:
http://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bc&v=&b=&from_search=3
没梯子的同学,可以从我的网盘下:
链接: http://pan.baidu.com/s/1nv54p9R 密码:3mty
要说先准备什么,私以为,其实只需要知道导数和相关的函数概念就可以了。高等数学也没学过?很好,我就是想让文科生也能看懂,您只需要学过初中数学就可以了。
其实不必有畏难的情绪,个人很推崇李书福的精神,在一次电视采访中,李书福说:谁说中国人不能造汽车?造汽车有啥难的,不就是四个轮子加两排沙发嘛。当然,他这个结论有失偏颇,不过精神可嘉。
导数是什么,无非就是变化率呗,王小二今年卖了100头猪,去年卖了90头,前年卖了80头。。。变化率或者增长率是什么?每年增长10头猪,多简单。这里需要注意有个时间变量---年。王小二卖猪的增长率是10头/年,也就是说,导数是10.
函数y=f(x)=10x+30,这里我们假设王小二第一年卖了30头,以后每年增长10头,x代表时间(年),y代表猪的头数。
当然,这是增长率固定的情形,现实生活中,很多时候,变化量也不是固定的,也就是说增长率也不是恒定的。比如,函数可能是这样: y=f(x)=5x²+30,这里x和y依然代表的是时间和头数,不过增长率变了,怎么算这个增长率,我们回头再讲。或者你干脆记住几个求导的公式也可以。
深度学习还有一个重要的数学概念:偏导数,偏导数的偏怎么理解?偏头疼的偏,还是我不让你导,你偏要导?都不是,我们还以王小二卖猪为例,刚才我们讲到,x变量是时间(年),可是卖出去的猪,不光跟时间有关啊,随着业务的增长,王小二不仅扩大了养猪场,还雇了很多员工一起养猪。所以方程式又变了:y=f(x)=5x₁²+8x₂ + 35x₃ +30
这里x₂代表面积,x₃代表员工数,当然x₁还是时间。
上面我们讲了,导数其实就是变化率,那么偏导数是什么?偏导数无非就是多个变量的时候,针对某个变量的变化率呗。在上面的公式里,如果针对x₃求偏导数,也就是说,员工对于猪的增长率贡献有多大,或者说,随着(每个)员工的增长,猪增加了多少,这里等于35---每增加一个员工,就多卖出去35头猪. 计算偏导数的时候,其他变量都可以看成常量,这点很重要,常量的变化率为0,所以导数为0,所以就剩对35x₃ 求导数,等于35. 对于x₂求偏导,也是类似的。
求偏导我们用一个符号 表示:比如 y/ x₃ 就表示y对 x₃求偏导。
废话半天,这些跟深度学习到底有啥关系?有关系,我们知道,深度学习是采用神经网络,用于解决线性不可分的问题。关于这一点,我们回头再讨论,大家也可以网上搜一下相关的文章。我这里主要讲讲数学与深度学习的关系。先给大家看几张图:
&lt;img src="https://i-blog.csdnimg.cn/blog_migrate/ed252c3786988ded0ebf2540379df5e1.png" data-rawwidth="631" data-rawheight="488" class="origin_image zh-lightbox-thumb" width="631" data-original="https://pic3.zhimg.com/v2-91704850c698cbe0cdfd0af76d328ebe_r.png"&gt; 图1. 所谓深度学习,就是具有很多个隐层的神经网络。
![](https://i-blog.csdnimg.cn/blog_migrate/ed252c3786988ded0ebf2540379df5e1.png)
&lt;img src="https://i-blog.csdnimg.cn/blog_migrate/68bdd151ff8b150b3f3481db3bf7083d.jpeg" data-rawwidth="432" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="432" data-original="https://pic4.zhimg.com/v2-7875411304340d5accd6d800be9f933b_r.jpg"&gt;
![](https://i-blog.csdnimg.cn/blog_migrate/68bdd151ff8b150b3f3481db3bf7083d.jpeg)
图2.单输出的时候,怎么求偏导数
&lt;img src="https://i-blog.csdnimg.cn/blog_migrate/e130541d07cd9de7ecb5103deafed95e.jpeg" data-rawwidth="432" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="432" data-original="https://pic2.zhimg.com/v2-c52b1fcdd42c3ac413120b56e40a8619_r.jpg"&gt;图3.多输出的时候,怎么求偏导数。后面两张图是日语的,这是日本人写的关于深度学习的书。感觉写的不错,把图盗来用一下。所谓入力层,出力层,中间层,分别对应于中文的:输入层,输出层,和隐层。
![](https://i-blog.csdnimg.cn/blog_migrate/e130541d07cd9de7ecb5103deafed95e.jpeg)
大家不要被这几张图吓着,其实很简单的。干脆再举一个例子,就以撩妹为例。男女恋爱我们大致可以分为三个阶段:
1.初恋期。相当于深度学习的输入层。别人吸引你,肯定是有很多因素,比如:身高,身材,脸蛋,学历,性格等等,这些都是输入层的参数,对每个人来说权重可能都不一样。
2.热恋期。我们就让它对应于隐层吧。这个期间,双方各种磨合,柴米油盐酱醋茶。
3.稳定期。对应于输出层,是否合适,就看磨合得咋样了。
大家都知道,磨合很重要,怎么磨合呢?就是不断学习训练和修正的过程嘛!比如女朋友喜欢草莓蛋糕,你买了蓝莓的,她的反馈是negative,你下次就别买了蓝莓,改草莓了。
深度学习也是一个不断磨合的过程,刚开始定义一个标准参数(这些是经验值。就好比情人节和生日必须送花一样),然后不断地修正,得出图1每个节点间的权重。为什么要这样磨合?试想一下,我们假设深度学习是一个小孩,我们怎么教他看图识字?肯定得先把图片给他看,并且告诉他正确的答案,需要很多图片,不断地教他,训练他,这个训练的过程,其实就类似于求解神经网络权重的过程。以后测试的时候,你只要给他图片,他就知道图里面有什么了。
所以训练集,其实就是给小孩看的,带有正确答案的图片,对于深度学习而言,训练集就是用来求解神经网络的权重的,最后形成模型;而测试集,就是用来验证模型的准确度的。
对于已经训练好的模型,如下图所示,权重(w1,w2...)都已知。
&lt;img src="https://i-blog.csdnimg.cn/blog_migrate/7453cdf4769a2eeef07cf55ebad39476.png" data-rawwidth="940" data-rawheight="736" class="origin_image zh-lightbox-thumb" width="940" data-original="https://pic1.zhimg.com/v2-8521e1fa289e08dbbab5aa63b6527bd4_r.png"&gt; 图4
![](https://i-blog.csdnimg.cn/blog_migrate/7453cdf4769a2eeef07cf55ebad39476.png)
&lt;img src="https://i-blog.csdnimg.cn/blog_migrate/2ca1405eba12f4aae27800960e9dd48c.png" data-rawwidth="776" data-rawheight="174" class="origin_image zh-lightbox-thumb" width="776" data-original="https://pic4.zhimg.com/v2-ef5ad0d06a316f762f0625b2468e2f43_r.png"&gt; 图5
![](https://i-blog.csdnimg.cn/blog_migrate/2ca1405eba12f4aae27800960e9dd48c.png)
我们知道,像上面这样,从左至右容易算出来。但反过来呢,我们上面讲到,测试集有图片,也有预期的正确答案,要反过来求w1,w2......,怎么办?
绕了半天,终于该求偏导出场了。目前的情况是:
1.我们假定一个神经网络已经定义好,比如有多少层,每层有多少个节点,也有默认的权重和激活函数(后面讲)等。这个没办法,刚开始得有一个初始值。你喜欢一个美女,她也不是刚从娘胎里出来的,也是带有各种默认参数的。至于怎么调教,那就得求偏导。
2.我们已知正确答案,比如图2和3里的r,训练的时候,是从左至右计算,得出的结果为y,r与y一般来说是不一样的。那么他们之间的差距,就是图2和3里的E。这个差距怎么算?当然,直接相减是一个办法,尤其是对于只有一个输出的情况,比如图2; 但很多时候,其实像图3里的那样,那么这个差距,一般可以这样算,当然,还可以有其他的评估办法,只是函数不同而已,作用是类似的:
&lt;img src="https://i-blog.csdnimg.cn/blog_migrate/3d157a870d35cbec70eb514a5815bf1a.png" data-rawwidth="484" data-rawheight="102" class="origin_image zh-lightbox-thumb" width="484" data-original="https://pic4.zhimg.com/v2-e5ddd26d65aa04ed82f2a51fc8212427_r.png"&gt;不得不说,理想跟现实还是有差距的,我们当然是希望差距越小越好,怎么才能让差距越来越小呢?得调整参数呗,因为输入(图像)确定的情况下,只有调整参数才能改变输出的值。怎么调整,怎么磨合?刚才我们讲到,每个参数都有一个默认值,我们就对每个参数加上一定的数值∆,然后看看结果如何?如果参数调大,差距也变大,你懂的,那就得减小∆,因为我们的目标是要让差距变小;反之亦然。所以为了把参数调整到最佳,我们需要了解误差对每个参数的变化率,这不就是求误差对于该参数的偏导数嘛。
![](https://i-blog.csdnimg.cn/blog_migrate/3d157a870d35cbec70eb514a5815bf1a.png)
关键是怎么求偏导。图2和图3分别给了推导的方法,其实很简单,从右至左挨个求偏导就可以。相邻层的求偏导其实很简单,因为是线性的,所以偏导数其实就是参数本身嘛,就跟求解x₃的偏导类似。然后把各个偏导相乘就可以了。
这里有两个点:
一个是激活函数,其实激活函数也没啥,就是为了让每个节点的输出都在0到1的区间,这样好算账嘛,所以在结果上面再做了一层映射,反正都是一对一的。由于激活函数的存在,所以在求偏导的时候,也要把它算进去,激活函数,一般用sigmoid,也可以用Relu等。激活函数的求导其实也非常简单:
&lt;img src="https://i-blog.csdnimg.cn/blog_migrate/7ef99a58b5f524c7e3304776ddf60f88.jpeg" data-rawwidth="257" data-rawheight="159" class="content_image" width="257"&gt;求导: f'(x)=f(x)*[1-f(x)]
![](https://i-blog.csdnimg.cn/blog_migrate/7ef99a58b5f524c7e3304776ddf60f88.jpeg)
这个方面,有时间可以翻看一下高数,没时间,直接记住就行了。
至于Relu,那就更简单了,就是f(x) 当x<0的时候y等于0,其他时候,y等于x。
当然,你也可以定义你自己的Relu函数,比如x大于等于0的时候,y等于0.01x,也可以。
另一个是学习系数,为什么叫学习系数?刚才我们上面讲到∆增量,到底每次增加多少合适?是不是等同于偏导数(变化率)?经验告诉我们,需要乘以一个百分比,这个就是学习系数,而且,随着训练的深入,这个系数是可以变的。
当然,还有一些很重要的基本知识,比如SGD(随机梯度下降),mini batch 和 epoch(用于训练集的选择),限于篇幅,以后再侃吧。其实参考李宏毅的那篇文章就可以了。
这篇拙文,算是对我另一个回答的补充吧:
深度学习入门必看的书和论文?有哪些必备的技能需学习? - jacky yang 的回答
其实上面描述的,主要是关于怎么调整参数,属于初级阶段。上面其实也提到,在调参之前,都有默认的网络模型和参数,如何定义最初始的模型和参数?就需要进一步深入了解。
不过对于一般做工程而言,只需要在默认的网络上调参就可以了,相当于用算法;
对于学者和科学家而言,他们会发明算法,难度还是不小的。向他们致敬!
写得很辛苦,觉得好就给我点个赞吧:)