深度学习与神经网络

  1. 深度学习的优势
    深度学习与神经网络_第1张图片

在小规模数据集上,深度学习算法相对于其他手工精心设计的算法可能并不会表现出优势,有时甚至并不能比那些算法效果更好,但当数据集变大时进入大数据领域时 ,深度学习才能表现出稳定的优势。
同时,不同结构的深度学习对于非结构化的数据(例如图像,序列数据处理比其他的机器学习算法更有优势。
深度学习的兴起依赖于三点:大数据,计算资源,算法的提升(使得深度学习训练得更快,激活函数从sigmod函数变成ReLu函数)
2. logistic回归分类回顾
2.1 损失函数和代价函数定义
吴恩达这里把损失函数(loss function)和代价函数(cost function)做了区分。
损失函数表示在单个样本上的误差
代价函数表示的是在整个数据集上的损失
对于logistic回归而言,其单个样本的损失函数如下:
在这里插入图片描述
原因是sigmoid函数表示一种概率,而对于概率表示的分类而言,其损失函数一般表示为 ,其中 对其取对数就为上式。
通常情况下我们取代价函数最小的参数作为最终参数,代价函数是整个数据集上每个样本损失函数的和,如下:
在这里插入图片描述
2.2 逻辑回归特点及梯度下降求解
逻辑回归的代价函数是一个凸函数,因此无论初始时如何选择,最终都能够得到最优解。
深度学习与神经网络_第2张图片
接下来直接使用梯度下降发求解即可。
深度学习与神经网络_第3张图片

其中α 表示学习率(learning rate),用来控制步长(step)
偏导数的计算采用链式法则。

  1. 对于损失函数而言,其只计算一个样本的损失:
    对于下面的损失函数:
    深度学习与神经网络_第4张图片

计算其梯度表达式:
在这里插入图片描述

则参数更新如下:
深度学习与神经网络_第5张图片

其中a其实就是预测样本分类是1的概率。
2. 对于整体代价函数,则需要计算所有样本:
由于代价函数如下:
在这里插入图片描述

要对该函数求关于w的偏导。
每一项的偏导在上式已经表达出来,这里对J求偏导直接m项累加再除以m即可。
对于这种m项累加的,一次梯度更新用for循环实现,需要如下的工作:

J=0;dw1=0;dw2=0;db=0;
for i = 1 to m
    z(i) = wx(i)+b;
    a(i) = sigmoid(z(i));
    J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
    dz(i) = a(i)-y(i);
    dw1 += x1(i)dz(i);
    dw2 += x2(i)dz(i);
    db += dz(i);
J/= m;
dw1/= m;
dw2/= m;
db/= m;
w=w-alpha*dw
b=b-alpha*db

即每次要计算在每个样本上的损失,下一次更新操作还要再把这些工作做一遍。
利用for循环的操作实现梯度更新往往会需要较大的计算资源。
2.3 消除for循环的向量化
深度学习在数据量很大时才会体现其优势,因此需要对代码运行速度有着一定的要求。
这里将数据用向量表示加速是因为numpy在向量运算的时候会使用并行计算。所以尽量使用numpy的内置函数采取并行计算
用向量来消除上述的for循环:
深度学习与神经网络_第6张图片
这样,一次梯度下降的迭代就用向量来表示了,当然,由于梯度下降需要用多次,因此最外层还需要一个迭代次数的循环,这个循环无法被向量化。
3.神经网络概览
3.1 神经网络前向传播算法及其向量化表示
逻辑回归可以看成一个最简单的神经网络:
深度学习与神经网络_第7张图片
对于类似于下面的较为复杂的神经网络:
深度学习与神经网络_第8张图片
深度学习与神经网络_第9张图片

3.2 激活函数
之前的逻辑回归采用的激活函数为sigmoid函数,由于其具有输出值在0-1之间的特性,所以其用作输出层的激活函数比较合适,但是sigmoid函数有一些缺点,如下图:
深度学习与神经网络_第10张图片

其在z取值很大或者很小的时候斜率很低,这就使得在使用梯度下降算法的时候梯度调整得很慢,而对于有大于1层的神经网络,其中间的隐藏层不需要输出最终的结果,因此可用如下的函数代替sigmoid函数来使得激活函数在z值取值较大是仍然保持较大的梯度。
下面是常见的激活函数;
tanh函数:
深度学习与神经网络_第11张图片

实际上是将其梯度增加了一些,梯度下降是会更快。
ReLu函数:
深度学习与神经网络_第12张图片

大多数深度学习中使用的激活函数,在z取值很大的时候仍然保持稳定的斜率1。缺点在于z取值小于0时斜率为0。
ReLu的梯度一半都是0,但是,有足够的隐藏层使得z值大于0,所以对大多数的训练数据来说学习过程仍然可以很快。
Leaky ReLu函数:
深度学习与神经网络_第13张图片

Relu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而Leaky ReLu不会有这问题。
总结:
sigmoid激活函数:除了输出层是一个二分类问题基本不会用它。
tanh激活函数:tanh是非常优秀的,几乎适合所有场合。
ReLu激活函数:最常用的默认函数,,如果不确定用哪个激活函数,就使用ReLu或者Leaky ReLu。
3.3 多层神经网络的反向传播算法
之前讨论了只有输出层的逻辑回归的反向传播方法,在存在隐藏层的神经网络中,如何计算隐藏层的参数更新。
讨论存在一个隐藏层的二层神经网络:
首先再次确认如下符号表示:
在这里插入图片描述

由于输出层的激活函数是sigmoid函数,所以对于输出层的反向传播来说:
在这里插入图片描述

接下来计算隐藏层的反向传播:
深度学习与神经网络_第14张图片

3.4 随机初始化
一般来说,我们不将参数W初始化为0,因为一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。通过推导,两次、三次、无论多少次迭代,不管你训练网络多长时间,隐含单元仍然计算的是同样的函数。因此这种情况下超过1个隐含单元也没什么意义,因为他们计算同样的东西。
4.深层神经网络
4.1 深层神经网络的前向传播算法
根据3.1中的描述,可以容易得到前向传播的公式:
第i层的激活结果可以如下表示:
在这里插入图片描述
深度学习与神经网络_第15张图片

4.3 深层表示的原因
一般来说,深度神经网络能解决好多问题,其实并不需要很大的神经网络,但是得有深度,得有比较多的隐藏层。
简单来说,在深层的网络中,可以利用前几层来探测简单的函数,比如图像识别中,前几层可能会用于简单的边缘探测,之后的几层把简单的特征结合起来,去探测更加复杂的东西。到网络中的深层时,你实际上就能做很多复杂的事,比如探测面部或是探测单词、短语或是句子。
4.4 参数以及超参数
参数包括W和b,超参数则是那些人为设定的参数,例如学习率,网络层数,激活函数的选择,每层网络的节点数等等。
甚至是你已经用了很久的模型,可能你在做网络广告应用,在你开发途中,很有可能学习率的最优数值或是其他超参数的最优值是会变的,所以即使你每天都在用当前最优的参数调试你的系统,你还是会发现,最优值过一年就会变化,因为电脑的基础设施,CPU或是GPU可能会变化很大。所以有一条经验规律可能每几个月就会变。如果你所解决的问题需要很多年时间,只要经常试试不同的超参数,勤于检验结果,看看有没有更好的超参数数值,相信你慢慢会得到设定超参数的直觉,知道你的问题最好用什么数值。

你可能感兴趣的:(深度学习与神经网络,深度学习)