导语
手痒,想从零开始用numpy实现一个简单的深度学习框架(中间会穿插讲解一些数学原理),当然最终功能肯定不会和pytorch或者tensorflow这些一样强大,但是我希望至少达到"麻雀虽小五脏俱全"的效果,同时希望通过这个系列文章可以让大家从更深层次的角度认识和了解深度学习,而不是上来就只会用pytorch或者tensorflow搞个分类检测模型。废话不多说,让我们愉快地开始吧~
打好基础篇
这里,我们先以最简单的方式来理解一下深度学习是干什么的,其实很简单,给定一个函数:
其中
是一系列的函数输入,
是一系列的函数输出,
是构成函数的参数(例如一次函数
,则
),深度学习的目的就是在已知一组
和
的前提下,先用神经网络来建模出一个
并用反向传播算法让
中的参数
拟合到尽可能满足给定已知的
就可以得到对应的
的状态。举个例子,例如给定一组数据:
深度学习要做的,就是先建模(这个一般靠经验,类似于高中数学里的感觉?总有人能想出很多逆天的解题思路?这个比方可能不太恰当。),比如我们这个例子,我们就可以建模成一次函数:
接下来要做的,就是通过反向传播算法来求解
和
,目标是让这个一次函数给定已知的输入
时,可以输出正确的
。(不要太纠结于为什么这么简单的东西也要用反向传播算法来求解,这里只是打个比方,现实中的
一般都是十分复杂的。另外
一般也是矩阵,比如图像矩阵或者声音序列,而不是单个数值。)
那么什么是反向传播算法呢?说白了核心就是高数里的链式法则。为了方便大家理解,我们这里还是通过举例来说明,假设我们的网络如下:
写成表达式就是:
正如前面所说的,我们一开始只知道一组
和对应的
值,然后通过建模得到了上图所示的神经网络,接下来要做的就是利用反向传播算法对网络中的参数进行求解了。具体而言,我们的目标是找到一组
,使得其满足:
即让
的输出与
尽可能接近,注意,这里的目标函数也可以是其他的例如
距离等等,这里只是一个简单的例子而已。那么如何找到这组
呢?一个比较经典的求解算法就是梯度下降法(注意,梯度下降法是一种通用的优化算法,换句话说,虽然深度学习中经常用到这个算法,但它的使用并不局限于深度学习,而反向传播算法则是梯度下降法在深度网络上的具体实现方式)。
梯度下降算法的核心思想是沿着目标函数梯度的方向更新参数值以希望达到目标函数最小(或最大),具体而言,这个算法一开始会先随机生成一组
,然后利用以下公式不断更新
的值:
其中
为当前误差
关于
的梯度,
为学习率。尝试直观理解一下这个公式,就是如果
随着
的增加而增加(此时
对
求偏导为正),则通过减小
的值来降低误差
,反之亦然。
回到我们举的例子,我们可以假设在给定
时,对应的
为4,同时
初始化如下:
则我们有如下前向传播过程:
这里求
的时候加个
是为了方便求导的时候可以消掉指数项,为了方便区分,我们用
代表预测值,
代表目标值。接下来就是用反向传播算法来更新所有
,具体而言,根据链式法则,我们有:
带入数值进行计算得到:
假设学习率
为0.1,则我们有:
同理,我们有:
类似地,对于第一层的
,我们有:
带入数值进行计算得到:
同理,我们有:
OK,大功告成,我们利用反向传播算法将原始的网络权重:
更新成了:
再次前向传播,我们可以得到
,相比之前的误差
,其结果是下降的,这显然说明了梯度下降算法的有效性,接下来只需要不断重复上述步骤,就可以最终获得一个较为准确的模型了~
讲的太多怕大家消化不了,今天就先到这吧,下一期内容主要是实战,利用numpy来实现卷积、全连接层以及今天讲的最基础的网络优化算法:梯度下降法。
最后,本系列文章更新效率与文章点赞和阅读量成正比。
参考文献:
[1].
转载请注明:http://www.0431gb208.com/sjszlfa/1033.html