吴恩达深度学习课程-第三周

本文详细介绍了神经网络的结构,包括双层神经网络的表示方法,以及输入和输出的计算过程。讨论了激活函数的作用,如sigmoid、tanh、ReLU和Leaky ReLU,解释了为何使用非线性激活函数的原因。同时,阐述了反向传播在神经网络训练中的应用。此外,还强调了权重的随机初始化对于避免梯度消失的重要性。
部署运行你感兴趣的模型镜像

1.神经网络概述和表示

在下图中,上标 [ 1 ] 、 [ 2 ] [1]、[2] [1][2]表示当前神经网络的层数,并不是前面提到的样本个数。 a [ 1 ] a^{[1]} a[1]表示第一层的激活值,图中可以表示为 a [ 1 ] = [ a 1 [ 1 ] 、 a 2 [ 1 ] 、 a 3 [ 1 ] ] T a^{[1]}=[a^{[1]}_1、a^{[1]}_2、a^{[1]}_3]^T a[1]=[a1[1]a2[1]a3[1]]T,以此类推。该网络被称为双层神经网络(因为一般不把输入层视为其中一层):

在这里插入图片描述

部分细节可以参考吴恩达机器学习课程-第四周中第2

2.神经网络的输出计算

2.1 单个样本的输出

对于上述的双层神经网络,输入层到第一层的前向计算过程如下:

在这里插入图片描述

如果采用for循环去计算明显效率低下,此时需要将等式向量化。此时将 w w w堆积为 4 ∗ 3 4*3 43的矩阵(每一行可以视为一个神经元的向量表示), b b b则为 4 ∗ 1 4*1 41的向量:

在这里插入图片描述

最终整个神经网络可以全部表示为向量运算,其中输入 x x x可以表示为 a [ 0 ] a^{[0]} a[0]

在这里插入图片描述

2.2 多个样本的输出

首先明确符号 a [ 2 ] ( i ) a^{{[2]}(i)} a[2](i)中的 ( i ) (i) (i)表示第 i i i个样本, [ 2 ] [2] [2]表示该单元处于神经网络的层数。如果使用for循环去计算训练集所有样本在神经网络中的输出:

在这里插入图片描述

进行向量化的话就可以不需要写 ( i ) (i) (i),而是直接将输入 x x x和输出 z 、 a z、a za从向量拼接为矩阵:

在这里插入图片描述

3.激活函数

3.1 激活函数种类

在前面使用到的激活函数全是 s i g m o i d sigmoid sigmoid函数,即 σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+ez1,值域在 ( 0 , 1 ) (0,1) (0,1)之间。但有时其他的激活函数效果会更好:

  • t a n h ( z ) = e z − e − z e z + e − z tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} tanh(z)=ez+ezezez,该函数的值域在 ( − 1 , 1 ) (-1,1) (1,1)之间。该函数均值是更接近零(因为值域介于 ( − 1 , 1 ) (-1,1) (1,1)),所以使用该函数总要优于 s i g m o i d sigmoid sigmoid

  • R e L u ( z ) = m a x ( 0 , z ) ReLu(z)=max(0,z) ReLu(z)=max(0,z)。上述两个函数当 z z z较大或较小时,梯度会接近于0进而导致梯度下降速度变得很慢,而 R e L u ReLu ReLu函数在 z z z为正值时导数恒为1,负值时恒为0(尽管在 z = 0 z=0 z=0时导数没有定义,但是实际 z = 0 z=0 z=0这样情况几乎不存在)

  • L e a k y R e L u ( z ) = m a x ( 0.01 z , z ) LeakyReLu(z)=max(0.01z,z) LeakyReLu(z)=max(0.01z,z)。该函数相较于 R e L u ReLu ReLu函数就是将 z < 0 z \lt 0 z<0时的直线进行了一定的倾斜,它通常比** R e L u ReLu ReLu**函数效果要好,但在实际中使用的不多(0.01并不是固定的,可以设置为学习参数)

在这里插入图片描述

综上所述:

  • 输出层一般还是使用 s i g m o i d sigmoid sigmoid,因为结果要介于 ( 0 , 1 ) (0,1) (0,1),其他层就不使用了
  • R e L u ReLu ReLu L e a k y R e L u LeakyReLu LeakyReLu因为 z > 0 z \gt 0 z>0时梯度为固定值1,不会造成梯度弥散,都可以加快梯度下降速度。但是 R e L u ReLu ReLu在负半区时梯度为0,意味着神经网络不训练(但是有足够的隐藏层使得 z z z值大于0的情况下,学习过程仍然可以很快)

3.2 为什么使用非线性激活函数?

假设激活函数使用线性函数 g ( z ) = z g(z)=z g(z)=z,此时 a [ 1 ] = z [ 1 ] = W [ 1 ] x + b [ 1 ] , a [ 2 ] = z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] a^{[1]}=z^{[1]}=W^{[1]}x+b^{[1]},a^{[2]}=z^{[2]}=W^{[2]}a^{[1]}+b^{[2]} a[1]=z[1]=W[1]x+b[1],a[2]=z[2]=W[2]a[1]+b[2],将上面式子结合形成 a [ 2 ] = z [ 2 ] = W [ 2 ] W [ 1 ] x + W [ 2 ] b [ 1 ] + b [ 2 ] = W ′ x + b ′ a^{[2]}=z^{[2]}=W^{[2]}W^{[1]}x+W^{[2]}b^{[1]}+b^{[2]}=W'x+b' a[2]=z[2]=W[2]W[1]x+W[2]b[1]+b[2]=Wx+b,神经网络只是把输入线性组合再输出,这些隐藏层就失去作用

所以在输出层在某些情况可以使用线性激活函数(比如 y y y输出房价),但是在隐藏层则不行(除非涉及到压缩)

3.3 激活函数的导数

  • s i g m o i d sigmoid sigmoid函数: g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) g'(z)=g(z)(1-g(z)) g(z)=g(z)(1g(z)),其中 g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1
  • t a n h tanh tanh函数: g ′ ( z ) = 1 − ( g ( z ) ) 2 g'(z)=1-(g(z))^2 g(z)=1(g(z))2,其中 g ( z ) = e z − e − z e z + e − z g(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} g(z)=ez+ezezez
  • R e L u ReLu ReLu函数:在 z = 0 z=0 z=0时通常指定导数为1或0

在这里插入图片描述

  • L e a k y R e L u LeakyReLu LeakyReLu函数:在 z = 0 z=0 z=0时通常指定导数为1或0.01

在这里插入图片描述

4.神经网络的反向传播

对于单层神经网络中单样本的反向传播过程如下所示:

在这里插入图片描述

下图为双层神经网络中多个样本和多样本经过反向传播后的梯度:

在这里插入图片描述

5.随机初始化

逻辑回归把权重初始化为0是可以的(具体原因可参考博文为什么逻辑回归训练时参数可以初始化为0?),但是对于神经网络把参数都初始化为0,则梯度下降将不起作用。如下图所示,如果将 W [ 1 ] W^{[1]} W[1] b [ 1 ] b^{[1]} b[1]都初始化为0,则 a 1 [ 1 ] = a 2 [ 1 ] a^{[1]}_1=a^{[1]}_2 a1[1]=a2[1],意味着在反向传播时 d z 1 [ 1 ] = d z 2 [ 1 ] dz_1^{[1]}=dz_2^{[1]} dz1[1]=dz2[1],无论迭代多少次都是如此(隐藏单元再多计算的结果都是一样就毫无意义了):

在这里插入图片描述

对于上面的神经网络,一般会进行以下初始化,其中常数 0.01 0.01 0.01是为了避免当激活函数为 t a n h tanh tanh s i g m o i d sigmoid sigmoid时, W W W很大会导致 Z Z Z很大,意味着梯度值很小,学习速度就变得很慢:

在这里插入图片描述

6.参考

https://www.bilibili.com/video/BV1FT4y1E74V?p=25-35

http://www.ai-start.com/dl2017/html/lesson1-week3.html

https://blog.youkuaiyun.com/qq_41398418/article/details/125106291

https://zhuanlan.zhihu.com/p/149183964

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值