吴恩达deeplearning.ai课程系列笔记03

来源:互联网 发布:淘宝明星同款违规吗 编辑:程序博客网 时间:2024/06/05 05:42
#写在最前,deeplearning.ai系列课程相较于之前的Andrew Ng在coursea上2014发布的机器学习课程内容更加丰富。
重要的是此次课程示例代码都是用python来实现,不需要去熟悉octave,对大部分需要用python来学习机器学习的同学来说是个福音!
原课程视频请移步网易云课堂或者coursera上学习。
#本文内容部分来自网络,只为分享供更多的人学习使用微笑
1、关于激活函数

几种不同的激活函数g(x)

还在路上,稍等...
其中:
  • sigmoid:a=11+ez 
    • 导数:a=a(1a)
  • tanh:a=ezezez+ez 
    • 导数:a=1a2
  • ReLU(修正线性单元):a=max(0,z)
  • Leaky ReLU:a=max(0.01z,z)

常见激活函数比较:
对于sigmoid函数,一般只用在二元分类的输出层,因为二元分类一般要求输出结果y0,1y∈0,1,而σ函数刚好其阈值就在0,1之间。而其它层更加建议用其他的激活函数。所以一个神经网络可以使用多种激活函数(用g[i]表示第i层的激活函数),一般来说,在输出层我们选用sigmoid函数。
对于tanh(z)函数,相比于σ(z)表现更好的原因是因为它的均值在0附近,有数据中心化的效果,所以下一层在学习的时候要更加方便和快速。但是σ(z)tanh(z)有一个共同的缺点,就是当z很大或很小的时候,它们的斜率就会趋向于0,这会使得梯度下降的学习速率降低。
对于ReLu函数,可以极大地加快收敛速度,相比tanh函数,收敛速度可以加快6倍。它表现效果很好,所以在不确定使用何种激活函数的时候可以选择这个函数。
相比sigmoid和tanh函数,Relu激活函数的优点在于:
梯度不饱和。梯度计算公式为:1{x>0}。因此在反向传播过程中,减轻了梯度弥散的问题,神经网络前几层的参数也可以很快的更新。
计算速度快。正向传播过程中,sigmoid和tanh函数计算激活值时需要计算指数,而Relu函数仅需要设置阈值。如果x<0,f(x)=0,如果x>0,f(x)=x。加快了正向传播的计算速度。

对于Leaky ReLu函数,其实就是在ReLu函数的基础上改进了一点。即当x值小于0的时候,其值不为0,而是一个很小的正数。
综上,对于选择哪个激活函数,也没有固定的答案,具体问题具体分析。
对于激活函数,为什么要用非线性函数呢?因为当激活函数是线性函数的时候,每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与只有一个隐藏层效果相当,这种情况就是多层感知机(MLP)了。

2、梯度下降法

以浅层神经网络为例,我们给出神经网络的梯度下降法的公式。

  • 参数:W[1],b[1],W[2],b[2]
  • 输入层特征向量个数:nx=n[0]
  • 隐藏层神经元个数:n[1]
  • 输出层神经元个数:n[2]=1
  • W[1]的维度为(n[1],n[0])b[1]的维度为(n[1],1)
  • W[2]的维度为(n[2],n[1])b[2]的维度为(n[2],1)

下面为该例子的神经网络反向梯度下降公式(左)和其代码向量化(右):


在编程过程中,我们要尽量避免使用for循环语句,而采用向量化的方法,效率会高很多。
3、关于随机初始化
在初始化的时候,如果两个神经元的参数设置相同,则会引起对称的权重问题,即两个神经元对输出的单元的影响完全一样。
如果是这样,则通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。
因此在初始化的时候,W参数要进行随机初始化,b则不存在对称性的问题它可以设置为0。
阅读全文
0 0
原创粉丝点击