小言_互联网的博客

01.神经网络和深度学习 W3.浅层神经网络

487人阅读  评论(0)

参考:
吴恩达视频课
深度学习笔记

1. 神经网络概览


x W [ 1 ] b [ 1 ] } z [ 1 ] = W [ 1 ] x + b [ 1 ] a [ 1 ] = σ ( z [ 1 ] ) \left.\begin{array}{c}x \\ W^{[1]} \\ b^{[1]}\end{array}\right\} \Longrightarrow z^{[1]}=W^{[1]} x+b^{[1]} \Longrightarrow a^{[1]}=\sigma\left(z^{[1]}\right)

第一层根据输入计算 z [ 1 ] z^{[1]} ,然后计算第一层的输出 a [ 1 ] a^{[1]}

a [ 1 ] = σ ( z [ 1 ] ) W [ 2 ] b [ 2 ] } z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] a [ 2 ] = σ ( z [ 2 ] ) L ( a [ 2 ] , y ) \left.\begin{array}{r}a^{[1]}=\sigma\left(z^{[1]}\right) \\ W^{[2]} \\ b^{[2]}\end{array}\right\} \Longrightarrow z^{[2]}=W^{[2]} a^{[1]}+b^{[2]} \Longrightarrow a^{[2]}=\sigma\left(z^{[2]}\right)\\\Longrightarrow L(a^{[2]}, y)

把第一层的输出 a [ 1 ] a^{[1]} 作为第二层的输入,计算 z [ 2 ] z^{[2]} ,代入 sigmoid 函数,得到输出 a [ 2 ] a^{[2]} ,进而计算损失函数

d a [ 1 ] = d σ ( z [ 1 ] ) d W [ 2 ] d b [ 2 ] } d z [ 2 ] = d ( W [ 2 ] a [ 1 ] + b [ 2 ] ) d a [ 2 ] = d σ ( z [ 2 ] ) d L ( a [ 2 ] , y ) \left.\begin{array}{rl}d a^{[1]}=d \sigma\left(z^{[1]}\right) & \\ d W^{[2]} \\ d b^{[2]}\end{array}\right\} \Longleftarrow d z^{[2]}=d\left(W^{[2]} a^{[1]}+b^{[2]}\right) \Longleftarrow d a^{[2]}=d \sigma\left(z^{[2]}\right)\\\Longleftarrow dL(a^{[2]}, y)

还有反向的求导过程

2. 神经网络的表示

3. 神经网络的输出


每个神经网络单元的工作包括两部分:计算 z z ,然后根据激活函数(sigmoid)计算 σ ( z ) \sigma(z)

z 1 [ 1 ] = w 1 [ 1 ] T x + b 1 [ 1 ] , a 1 [ 1 ] = σ ( z 1 [ 1 ] ) z 2 [ 1 ] = w 2 [ 1 ] T x + b 2 [ 1 ] , a 2 [ 1 ] = σ ( z 2 [ 1 ] ) z 3 [ 1 ] = w 3 [ 1 ] T x + b 3 [ 1 ] , a 3 [ 1 ] = σ ( z 3 [ 1 ] ) z 4 [ 1 ] = w 4 [ 1 ] T x + b 4 [ 1 ] , a 4 [ 1 ] = σ ( z 4 [ 1 ] ) \begin{aligned} z_{1}^{[1]} &=w_{1}^{[1] T} x+b_{1}^{[1]}, \quad a_{1}^{[1]}=\sigma\left(z_{1}^{[1]}\right) \\z_{2}^{[1]} &=w_{2}^{[1] T} x+b_{2}^{[1]}, \quad a_{2}^{[1]}=\sigma\left(z_{2}^{[1]}\right) \\ z_{3}^{[1]} &=w_{3}^{[1] T} x+b_{3}^{[1]}, \quad a_{3}^{[1]}=\sigma\left(z_{3}^{[1]}\right) \\ z_{4}^{[1]} &=w_{4}^{[1] T} x+b_{4}^{[1]}, \quad a_{4}^{[1]}=\sigma\left(z_{4}^{[1]}\right) \end{aligned}

[layer] 上标表示第几层,下标表示该层的第几个节点


a [ 1 ] = [ a 1 [ 1 ] a 2 [ 1 ] a 3 [ 1 ] a 4 [ 1 ] ] = σ ( z [ 1 ] ) a^{[1]}=\left[\begin{array}{c}a_{1}^{[1]} \\ a_{2}^{[1]} \\ a_{3}^{[1]} \\ a_{4}^{[1]}\end{array}\right]=\sigma\left(z^{[1]}\right)

  • 输入一个样本的特征向量,四行代码计算出一个简单神经网络的输出,那么多个样本呢?往下看

4. 多样本向量化

对于 m 个样本,(i)表示第i个样本

z [ 1 ] ( i ) = W [ 1 ] ( i ) x ( i ) + b [ 1 ] ( i ) a [ 1 ] ( i ) = σ ( z [ 1 ] ( i ) ) z [ 2 ] ( i ) = W [ 2 ] ( i ) a [ 1 ] ( i ) + b [ 2 ] ( i ) a [ 2 ] ( i ) = σ ( z [ 2 ] ( i ) ) \begin{aligned} z^{[1](i)} &=W^{[1](i)} x^{(i)}+b^{[1](i)} \\ a^{[1](i)} &=\sigma\left(z^{[1](i)}\right) \\ z^{[2](i)} &=W^{[2](i)} a^{[1](i)}+b^{[2](i)} \\ a^{[2](i)} &=\sigma\left(z^{[2](i)}\right) \end{aligned}

  • 为了向量化计算,进行堆叠
    x = [ x ( 1 ) x ( 2 ) x ( m ) ] x=\left[\begin{array}{cccc}\vdots & \vdots & \vdots & \vdots \\ x^{(1)} & x^{(2)} & \cdots & x^{(m)} \\ \vdots & \vdots & \vdots & \vdots\end{array}\right]

Z [ 1 ] = [ z [ 1 ] ( 1 ) z [ 1 ] ( 2 ) z [ 1 ] ( m ) ] Z^{[1]}=\left[\begin{array}{cccc}\vdots & \vdots & \vdots & \vdots \\ z^{[1](1)} & z^{[1](2)} & \cdots & z^{[1](m)} \\ \vdots & \vdots & \vdots & \vdots\end{array}\right]

A [ 1 ] = [ α [ 1 ] ( 1 ) α [ 1 ] ( 2 ) α [ 1 ] ( m ) ] A^{[1]}=\left[\begin{array}{cccc}\vdots & \vdots & \vdots & \vdots \\ \alpha^{[1](1)} & \alpha^{[1](2)} & \cdots & \alpha^{[1](m)} \\ \vdots & \vdots & \vdots & \vdots\end{array}\right]

z [ 1 ] ( i ) = W [ 1 ] ( i ) x ( i ) + b [ 1 ] α [ 1 ] ( i ) = σ ( z [ 1 ] ( i ) ) z [ 2 ] ( i ) = W [ 2 ] ( i ) α [ 1 ] ( i ) + b [ 2 ] α [ 2 ] ( i ) = σ ( z [ 2 ] ( i ) ) } { A [ 1 ] = σ ( z [ 1 ] ) z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] A [ 2 ] = σ ( z [ 2 ] ) \left.\begin{array}{c}z^{[1](i)}=W^{[1](i)} x^{(i)}+b^{[1]} \\\alpha^{[1](i)}=\sigma\left(z^{[1](i)}\right) \\z^{[2](i)=W^{[2](i)} \alpha^{[1](i)}+b^{[2]}} \\ \alpha^{[2](i)}=\sigma\left(z^{[2](i)}\right)\end{array}\right\}\Longrightarrow \left\{ \begin{array}{c} A^{[1]}=\sigma\left(z^{[1]}\right) \\ z^{[2]}=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]}=\sigma\left(z^{[2]}\right)\end{array}\right.

列向看,对应于不同的特征,就是神经网络中的该层的各个节点
行向看,对应于不同的训练样本

5. 激活函数

  • tanh激活函数是 sigmoid的平移伸缩结果,其效果在所有场合都优于sigmoidtanh几乎适合所有场合
  • 例外是,二分类问题的输出层,想让结果介于 0,1之间,所以使用 sigmoid 激活函数

tanhsigmoid两者的缺点:

  • 在特别大或者特别小 z z 的情况下,导数的梯度 或者 函数的斜率变得特别小,最后就会接近于0,导致降低梯度下降的速度

  • 修正线性单元的函数(ReLu

激活函数的选择经验

  • 如果输出是0、1值(二分类问题),输出层 选择sigmoid函数,其它所有单元都选择Relu函数

  • 隐藏层通常会使用Relu激活函数。有时,也会使用tanh激活函数,但Relu的一个缺点是:当是负值的时候,导数等于0

  • 另一个版本的Relu被称为Leaky Relu,当是负值时,这个函数的值不等于0,而是轻微的倾斜,这个函数通常比Relu激活函数效果要好,尽管在实际中Leaky ReLu使用的并不多

ReLuLeaky ReLu的优点:

  • sigmoid函数需要进行浮点四则运算,在实践中,使用ReLu激活函数学习的更快

  • sigmoidtanh函数的导数在正负饱和区的梯度接近于0,这会造成梯度弥散,而ReluLeaky ReLu函数大于0部分都为常数,不会产生梯度弥散现象。(Relu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而Leaky ReLu不会有这问题)

  • 虽然ReLu的梯度一半都是0,但是,有足够的隐藏层使得 z z 值大于0,所以对大多数的训练数据来说学习过程仍然可以很快

6. 为什么需要 非线性激活函数

线性隐藏层一点用也没有,因为线性函数的组合本身就是线性函数,所以除非你引入非线性,否则你无法计算出更有趣的函数,即使网络层数再多也不行

  • 不能在隐藏层用线性激活函数,可以用ReLUtanhleaky ReLU或者其他的非线性激活函数
  • 唯一可以用 线性激活函数的通常就是输出层;在隐藏层使用 线性激活函数非常少见

7. 激活函数的导数

  • sigmoid

    a = g ( z ) ; g ( z ) = d d z g ( z ) = a ( 1 a ) a=g(z) ;\quad g^{\prime}(z)=\frac{d}{d z} g(z)=a(1-a)
  • tanh

a = g ( z ) ; g ( z ) = d d z g ( z ) = 1 a 2 a=g(z) ; \quad g^{\prime}(z)=\frac{d}{d z} g(z)=1-a^2

  • ReLu Rectified Linear Unit

    g ( z ) = { 0  if  z < 0 1  if  z > 0 u n d e f i n e d  if  z = 0 g^{\prime}(z)=\left\{\begin{array}{ll}0 & \text { if } z<0 \\ 1 & \text { if } z>0 \\ u n d e f i n e d & \text { if } z=0\end{array}\right.
    z = 0 z=0 时,可以让导数为 0,或者 1

  • Leaky ReLU Leaky linear unit

    g ( z ) = { 0.01  if  z < 0 1  if  z > 0 u n d e f i n e d  if  z = 0 g^{\prime}(z)=\left\{\begin{array}{ll}0.01 & \text { if } z<0 \\ 1 & \text { if } z>0 \\ u n d e f i n e d & \text { if } z=0\end{array}\right.
    z = 0 z=0 时,可以让导数为 0.01,或者 1

8. 随机初始化

对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。

W [ 1 ] = n p . random.randn ( 2 , 2 ) 0.01 , b [ 1 ] = n p . z eros ( ( 2 , 1 ) ) W [ 2 ] = n p . random.randn ( 2 , 2 ) 0.01 , b [ 2 ] = 0 \begin{aligned} W^{[1]} &=n p . \text {random.randn}(2,2) * 0.01, \quad b^{[1]}=n p . z \operatorname{eros}((2,1)) \\ W^{[2]} &=n p . \text {random.randn}(2,2) * 0.01, \quad b^{[2]}=0 \end{aligned}
常数为什么是0.01,而不是100或者1000,sigmoid/tanh 激活函数在很平坦的地方,学习非常慢

当你训练一个非常非常的神经网络,你可能要试试0.01以外的常数

作业

01.神经网络和深度学习 W3.浅层神经网络(作业:带一个隐藏层的神经网络)


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!


转载:https://blog.csdn.net/qq_21201267/article/details/108229980
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场