admin管理员组文章数量:1579086
文章目录
- 一、神经网络表示
- 二、计算神经网络的输出
- 三、激活函数(Activation functions)
- 1. sigmoid函数
- 2. tanh函数
- 3. ReLu函数(修正线性单元)
- 4. Leaky ReLu函数
- 5. 激活函数总结
- 6. Why need a nonlinear activation function?
- 四、神经网络的梯度下降法
- 1. 正向传播
- 2. 反向传播
- 五、随机初始化
一、神经网络表示
竖向堆叠起来的输入特征被称作神经网络的输入层(the input layer)。
神经网络的隐藏层(a hidden layer)。“隐藏”的含义是在训练集中,这些中间节点的真正数值是无法看到的。
输出层(the output layer)负责输出预测值。
如图是一个双层神经网络,也称作单隐层神经网络(a single hidden layer neural network)。当我们计算网络的层数时,通常不考虑输入层,因此图中隐藏层是第一层,输出层是第二层。
约定俗称的符号表示:
二、计算神经网络的输出
其中,
x
x
x表示输入特征,
a
a
a表示每个神经元的输出,
W
W
W表示特征的权重。上标表示神经网络的层数(隐藏层为1),下标表示该层的第几个神经元。
实际上,神经网络只不过是将Logistic 回归的计算步骤重复很多次。对于隐藏层的第一个节点,有
隐藏层的第二个神经元以及后面的神经元计算过程一样,只是符号表示不同,最终得到a。详细过程如下:
如果你执行神经网络的程序,用for循环来做这些看起来真的很低效。所以,我们可以将四个等式向量化。向量化的过程是将神经网络中的一层神经元参数纵向堆积起来,例如隐藏层中的
W
W
W纵向堆积起来变成一个维度(4,3)的矩阵,用符号 W [1] 表示。
类推可得,对于第一个隐藏层有下列公式:
展开来看,如下图所示:
同理,对于输出层有:
在这里,需要特别注意的是层与层之间参数矩阵的维度。
多样本向量化
逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值。这种计算式所有的训练样本同时进行的。
对于 m 个训练样本,在书写标记上用 (i) 表示第 i 个样本。对于每个样本 i ,可以使用for循环来求解其正向输出:
若不用for循环,而是利用矩阵运算的思想:
其中,行表示神经元个数n,列表示样本数目m。
从水平上看,矩阵A代表了各个训练样本。从竖直上看,矩阵A的不同索引对应于不同的隐藏层单元。
三、激活函数(Activation functions)
使用一个神经网络时,需要决定使用哪种激活函数用在隐藏层上,哪种用在输出层上。之前我们都是选用 sigmoid 函数,但有时其他函数的效果会好得多。
1. sigmoid函数
其导数为:
【注意】在讨论优化算法时,一般情况下是不再使用sigmoid函数的,因为tanh在所有场合都由优于sigmoid函数。但是有一个例外,在二分类问题中,对于输出层,因为y的值是0或1,我们想让y_hat的值介于0、1之间,而不是-1和+1之间,此时用sigmoid函数会更好。
2. tanh函数
其导数为:
【补充】tanh的效果总是优于sigmoid函数。因为函数值域在-1和+1的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用tanh函数代替sigmoid函数中心化数据,能够使得数据的平均值更接近0而不是0.5。
sigmoid函数和tanh函数两者有一个共同的缺点:在 z z z特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于0,导致梯度下降的速度减缓。
3. ReLu函数(修正线性单元)
只要
z
z
z为正值,导数恒等于1。当
z
z
z为负值时,导数恒等于0。从实际上来说,当使用
z
z
z的导数时,
z
=
0
z=0
z=0的导数是没有定义的。但是在编程实现的时候,
z
z
z的取值刚好等于0.0000001,这个值相当小。所以,在实践中,不需要担心这个值,
z
=
0
z=0
z=0时,假设导数为1或0都是可以的。
选择激活函数的经验法则:
如果输出的值是0和1(二分类问题),则输出层选择sigmoid函数,然后其他的所有单元都选择ReLu函数。
这是很多激活函数的默认选择,如果隐藏层上不确定使用哪个激活函数,那么通常会使用ReLu激活函数。有时,也会使用tanh函数,但ReLuctant的一个优点是:当
z
z
z是负值时。导数等于0。
4. Leaky ReLu函数
该函数当
z
z
z是负值时,函数的值不为0,而是轻微的倾斜。这个函数通常比ReLu激活函数效果好,尽管在实际中使用的不多。
5. 激活函数总结
- 在实践中,使用ReLu激活函数的神经网络通常会比使用sigmoid或者tanh激活函数学习的更快。
- sigmoid函数和tanh函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散。而ReLu和Leaky ReLu函数大于0的部分都为常数,不会产生梯度弥散现象。
- ReLu进入负区域时,梯度为0,神经元此时不会训练,产生所谓的稀疏性,但是Leaky ReLu不会有这个问题。
Tip:如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者发展集上进行评价。然后看哪一种表现得更好,就去使用它。
6. Why need a nonlinear activation function?
使用线性激活函数和不使用激活函数、直接使用 Logistic 回归没有区别,那么无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,就成了最原始的感知器了。
如果我们使用的是线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出。
【总结】不能在隐藏层用线性激活函数,唯一可以使用线性激活函数的通常就是输出层。
四、神经网络的梯度下降法
1. 正向传播
正向传播是从输入到输出,由神经网络计算得到预测输出的过程。
正向传播的4个公式如下:
2. 反向传播
反向传播是从输出到输入,对参数w和b计算梯度的过程。
在这个例子中,反向传播就是对a、b、c三个输入求偏导:
神经网络反向梯度下降公式(左)和其代码向量化(右),见下图:
上述的步骤都是针对所有样本进行过向量化,
Y
Y
Y是
1
×
m
1×m
1×m的矩阵。这里的np.sum
是Python的numpy命令,axis=1表示水平相加求和,keepdims是防止python输出那些古怪的秩数
(
n
,
)
(n,)
(n,),加上这些就可以确保矩阵向量输出的维度为
(
n
,
1
)
(n,1)
(n,1)这样的标准形式。
五、随机初始化
如果在初始时将两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。
在初始化的时候, w w w 参数 要进行随机初始化,不可以设置为 0。 而 b b b 因为不存在对称性的问题,可以设置为 0。
以 2 个输入,2 个隐藏神经元为例:
W = np.random.randn(2,2) * 0.01
b = np.zeros((2,1))
这里将 W W W 的值乘以 0.01(或者其他的常数值)的原因是为了使得权重 W W W 初始化为较小的值,这是因为使用 sigmoid 函数或者 tanh 函数作为激活函数时, W W W 比较小,则 z = W x + b z=Wx+b z=Wx+b 所得的值趋近于 0,梯度较大,能够提高算法的更新速度。而如果 W W W 设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。
ReLU 和 Leaky ReLU 作为激活函数时不存在这种问题,因为在大于 0 的时候,梯度均为 1。
版权声明:本文标题:吴恩达【深度学习】笔记02——浅层神经网络(Shallow neural networks) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727847230a1133232.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论