在深度学习的路上,从头开始了解一下各项技术。本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流。
本文参考:本文参考吴恩达老师的Coursera深度学习课程,很棒的课,推荐
本文默认你已经大致了解深度学习的简单概念,如果需要更简单的例子,可以参考吴恩达老师的入门课程:
http://study.163.com/courses-search?keyword=%E5%90%B4%E6%81%A9%E8%BE%BE#/?ot=5
转载请注明出处,其他的随你便咯
一、前言
在上篇文章中,我们介绍了神经网络的一些基础知识,但是并不能让你真正的做点什么。我们如何训练神经网络?具体该怎么计算?隐层可以添加吗,多少层合适?这些问题,会在本篇文章中给出。
二、神经网络前向计算
首先,我们在上文中已经初步了解到神经网络的结构,由于我们有很多的全连接,如果用单一的乘法计算,会导致训练一个深层的神经网络,需要上百万次的计算。这时候,我们可以用向量化的方式,将所有的参数叠加成矩阵,通过矩阵来计算。我们将上文中的神经网络复制到上图。
在上图中,我们可以发现,每个隐层的神经元结点的计算分为两个部分,计算z和计算a。
要注意的是层与层之间参数矩阵的形状:
输入层和隐层之间
w[1].shape = (4, 3):4为隐层神经元的个数,3为输入层神经元的个数;
b[1].shape = (4, 1):4为隐层神经元的个数,1不用担心,python的广播机制,会让b复制成适合的形状去进行矩阵加法;
隐层和输出层之间
w[2].shape = (1, 4):1为输出层神经元的个数,4个隐层神经元的个数;
b[2].shape = (1, 1):1为输出层神经元的个数,1可以被广播机制所扩展。
通过上述描述,我们可以看出w矩阵的规则,我们以相邻两层来说,前面一层作为输入层,后层为输出。两层之间的w参数矩阵大小为(n_out,n_in),b参数矩阵为(n_out,1)。其中n为该层的神经元个数。
那么我们现在用向量化的方式来计算我们的输出值:
在对应的图中,使用矩阵的方法,实际上只用实现右边的四个公式,即可得到a[2],也就是我们的输出值yhat。
三、向量化神经网络
通过向量化参数,我们可以简化我们的单次训练计算。同样在m个训练样本的计算过程中,我们发现,每个样本的计算过程实际上是相同的,如果按照之前的思路,我们可以用for循环来计算m个样本。
for i in m:
单次训练
但是这种for循环在python中实际上会占用大量的资源,同样我们也可以用向量化的方式,一次性计算所有m个样本,提高我们的计算速度。
下面是实现向量化的解释:
在上面,我们用 [ l ] 表示第几层,用 ( i ) 表示第几个样本,我们先假设b = 0。
在m个训练样本中,其实都是在重复相同的过程,那么我们可以将m个样本,叠加在一个X矩阵中,其形状为(xn,m)。其中xn表示单个样本的特征数,m为训练样本的个数。
四、反向传播算法
在实现了前向计算之后,我们可以通过计算损失函数和代价函数来得到我们这个神经网络的效果。同时我们也可以开始我们的反向传播(Backward Prop),以此来更新参数,让我们的模型更能得到我们想要的预测值。梯度下降法即使一种优化w和b的方法。
简单理解梯度下降
首先我们使用一个简单的例子来讲解什么是梯度下降:
我们先给出一个简单的神经网络(可能叫神经元更合适),损失函数的计算公式为:
我们将上述公式化为一个计算图如下:
现在我们要优化w1、w2和b,来使得L(a,y)的值最小化,那么我们需要对求偏导数,用偏导数来更新我们的w1、w2和b。因为L(a,y)是一个凸函数,我们在逐步更新的过程中,一点点的达到全局最优解。
计算过程如下:
首先我们对da、dz求导: