浅层神经网络和深层神经网络介绍

1 浅层神经网络表示

假设我们有如下结构的网络

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GclVDo1-1660280902939)(.\images\浅层神经网络.png)]

对于这个网络我们建立一个简单的图示?我们对第一个隐藏层记为[1],输出层为[2]。如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBSLMfSu-1660280902940)(.\images\浅层网络的标记.png)]

计算图如下

在这里插入图片描述

  • 每个神经元的计算分解步骤如下
  • 在这里插入图片描述
  • 第一层中的第一个神经元

z 1 [ 1 ] = ( W 1 [ 1 ] ) T x + b 1 [ 1 ] z _1^{[1]} = (W _1^{[1]})^Tx+b _1^{[1]} z1[1]=(W1[1])Tx+b1[1]

a 1 [ 1 ] = σ ( z 1 [ 1 ] ) a _1^{[1]} = \sigma(z _1^{[1]}) a1[1]=σ(z1[1])

  • 第一层中的第一个神经元

z 2 [ 1 ] = ( W 2 [ 1 ] ) T x + b 2 [ 1 ] z _2^{[1]} = (W _2^{[1]})^Tx+b _2^{[1]} z2[1]=(W2[1])Tx+b2[1]

a 2 [ 1 ] = σ ( z 2 [ 1 ] ) a _2^{[1]} = \sigma(z _2^{[1]}) a2[1]=σ(z2[1])

得出第一层的计算:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HHvE7LxI-1660280902941)(.\images\浅层神经网络完整计算.png)]

1.2 单个样本的向量化表示

那么现在把上面的第一层的计算过程过程用更简单的形式表现出来就是这样的计算

( ⋯ ( W 1 [ 1 ] ) T ⋯ ⋯ ( W 2 [ 1 ] ) T ⋯ ⋯ ( W 3 [ 1 ] ) T ⋯ ⋯ ( W 4 [ 1 ] ) T ⋯ ) ∗ ( x 1 x 2 x 3 ) + ( b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] b 4 [ 1 ] ) \left(\begin{array}{cccc}\cdots & (W _1^{[1]})^T & \cdots \\ \cdots & (W _2^{[1]})^T & \cdots \\ \cdots & (W _3^{[1]})^T & \cdots \\ \cdots & (W _4^{[1]})^T & \cdots \end{array}\right) * \left( \begin{array}{c}x_{1} \\ x_{2} \\ x_{3}\end{array}\right) + \left( \begin{array}{c}b_{1}^{[1]} \\ b_{2}^{[1]} \\ b_{3}^{[1]} \\ b_{4}^{[1]} \end{array}\right) (W1[1])T(W2[1])T(W3[1])T(W4[1])T x1x2x3 + b1[1]b2[1]b3[1]b4[1]

那么对于刚才我们所举的例子,将所有层通过向量把整个前向过程表示出来,并且确定每一个组成部分的形状

前向过程计算:

z [ 1 ] = W [ 1 ] x + b [ 1 ] 形状: ( 4 , 1 ) = ( 4 , 3 ) ∗ ( 3 , 1 ) + ( 4 , 1 ) z^{[1]} = W^{[1]}x+b^{[1]} 形状:(4,1) = (4,3) * (3,1) + (4,1) z[1]=W[1]x+b[1]形状:(4,1)=(4,3)(3,1)+(4,1)

a [ 1 ] = σ ( z [ 1 ] ) a^{[1]}=\sigma(z^{[1]}) a[1]=σ(z[1])形状:(4,1)

z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] z^{[2]} = W^{[2]}a^{[1]}+b^{[2]} z[2]=W[2]a[1]+b[2] 形状:(1,1) = (1,4) * (4,1)+(1,1)

a [ 2 ] = σ ( z [ 2 ] ) a^{[2]}=\sigma(z^{[2]}) a[2]=σ(z[2])形状:(1,1)

那么如果有多个样本,需要这样去做

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMkg4Jex-1660280902942)(.\images\m个样本的循环浅层.png)]

  • 多个样本的向量化表示

假设一样含有M个样本,那么上述过程变成

Z [ 1 ] = W [ 1 ] X + b [ 1 ] Z^{[1]} = W^{[1]}X+b^{[1]} Z[1]=W[1]X+b[1] 形状:(4,m) = (4,3) * (3,m) + (4,1)

A [ 1 ] = σ ( Z [ 1 ] ) {A}^{[1]}=\sigma(Z^{[1]}) A[1]=σ(Z[1])形状:(4,m)

Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] Z^{[2]} = W^{[2]}A^{[1]}+b^{[2]} Z[2]=W[2]A[1]+b[2]形状:(1,m) = (1,4) * (4,m)+(1,1)

A [ 2 ] = σ ( Z [ 2 ] ) A^{[2]}=\sigma(Z^{[2]}) A[2]=σ(Z[2])形状:(1,m)

1.3 激活函数的选择

涉及到网络的优化时候,会有不同的激活函数选择有一个问题是神经网络的隐藏层和输出单元用什么激活函数。之前我们都是选用 sigmoid 函数,但有时其他函数的效果会好得多,大多数通过实践得来,没有很好的解释性。

sigmoid 一般做为分类任务最后一层(即输出层的激活函数), 一般不做隐层的激活函数, 因为容易梯度消失或梯度爆炸.

可供选用的激活函数有:

  • tanh 函数(the hyperbolic tangent function,双曲正切函数):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LB0QJfG8-1660280902943)(.\images\tanh.png)]

效果比 sigmoid 函数好,因为函数输出介于 -1 和 1 之间。

注 :tanh 函数存在和 sigmoid 函数一样的缺点:当 z 趋紧无穷大(或无穷小),导数的梯度(即函数的斜率)就趋紧于 0,这使得梯度算法的速度会减慢。

  • ReLU 函数(the rectified linear unit,修正线性单元) 用的最多

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETf2DyUs-1660280902944)(.\images\relu.png)]

当 z > 0 时,梯度始终为 1,从而提高神经网络基于梯度算法的运算速度,收敛速度远大于 sigmoid 和 tanh。然而当 z < 0 时,梯度一直为 0,但是实际的运用中,该缺陷的影响不是很大。

  • Leaky ReLU(带泄漏的 ReLU):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4mBHM5d-1660280902945)(.\images\leakyrelu.png)]

Leaky ReLU 保证在 z < 0 的时候,梯度仍然不为 0。理论上来说,Leaky ReLU 有 ReLU 的所有优点,但在实际操作中没有证明总是好于 ReLU,因此不常用。

1.3.1 为什么需要非线性的激活函数

使用线性激活函数和不使用激活函数、直接使用 Logistic 回归没有区别,那么无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,就成了最原始的感知器了。

a [ 1 ] = z [ 1 ] = W [ 1 ] x + b [ 1 ] a^{[1]} = z^{[1]} = W^{[1]}x+b^{[1]} 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]}a^{[1]}+b^{[2]} a[2]=z[2]=W[2]a[1]+b[2]

那么这样的话相当于

a [ 2 ] = z [ 2 ] = W [ 2 ] ( W [ 1 ] x + b [ 1 ] ) + b [ 2 ] = ( W [ 2 ] W [ 1 ] ) x + ( W [ 2 ] b [ 1 ] + b [ 2 ] ) = w x + b {a}^{[2]}=z^{[2]} = W^{[2]}(W^{[1]}x+b^{[1]})+b^{[2]}=(W^{[2]}W^{[1]})x+(W^{[2]}b^{[1]}+b^{[2]})=wx+b a[2]=z[2]=W[2](W[1]x+b[1])+b[2]=(W[2]W[1])x+(W[2]b[1]+b[2])=wx+b

1.3.2 修改激活函数的前向传播和反向传播

将上述网络的隐层激活函数修改为tanh,最后一层同样还是二分类,所以激活函数选择依然是sigmoid函数

  • 前向传播

Z [ 1 ] = W [ 1 ] X + b [ 1 ] Z^{[1]} = W^{[1]}X+b^{[1]} Z[1]=W[1]X+b[1]

A [ 1 ] = t a n h ( Z [ 1 ] ) {A}^{[1]}=tanh(Z^{[1]}) A[1]=tanh(Z[1])

Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] Z^{[2]} = W^{[2]}A^{[1]}+b^{[2]} Z[2]=W[2]A[1]+b[2]

A [ 2 ] = σ ( Z [ 2 ] ) A^{[2]}=\sigma(Z^{[2]}) A[2]=σ(Z[2])

  • 反向梯度下降

那么通过这个计算图来理解这个过程,单个样本的导数推导过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lNiUxsFg-1660280902947)(.\images\浅层神经网络计算图.png)]

由于网络已经存在两层,所以我们需要从后往前得到导数结果,并且多个样本的情况下改写成:

最后一个输出层的参数的导数:

d Z [ 2 ] = A [ 2 ] − Y dZ^{[2]} = A^{[2]} - Y dZ[2]=A[2]Y

d W [ 2 ] = 1 m d Z [ 2 ] A [ 1 ] T dW^{[2]}=\frac{1}{m}dZ^{[2]}{A^{[1]}}^{T} dW[2]=m1dZ[2]A[1]T

d b [ 2 ] = 1 m n p . s u m ( d Z [ 2 ] , a x i s = 1 ) db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]}, axis=1) db[2]=m1np.sum(dZ[2],axis=1)

隐藏层的导数计算:

d Z [ 1 ] = W [ 2 ] T d Z [ 2 ] ∗ ( 1 − g ( Z [ 1 ] ) 2 = W [ 2 ] T d Z [ 2 ] ∗ ( 1 − A [ 1 ] ) 2 dZ^{[1]} = {W^{[2]}}^{T}dZ^{[2]}*{(1-g(Z^{[1]})}^{2}={W^{[2]}}^{T}dZ^{[2]}*{(1-A^{[1]})}^{2} dZ[1]=W[2]TdZ[2](1g(Z[1])2=W[2]TdZ[2](1A[1])2

d W [ 1 ] = 1 m d Z [ 1 ] X T dW^{[1]}=\frac{1}{m}dZ^{[1]}X^{T} dW[1]=m1dZ[1]XT

d b [ 1 ] = 1 m n p . s u m ( d Z [ 1 ] , a x i s = 1 ) db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]}, axis=1) db[1]=m1np.sum(dZ[1],axis=1)

2 为什么使用深层网络

对于人脸识别等应用,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息;网络的第二层将第一层学得的边缘信息组合起来,形成人脸的一些局部的特征,例如眼睛、嘴巴等;后面的几层逐步将上一层的特征组合起来,形成人脸的模样。随着神经网络层数的增加,特征也从原来的边缘逐步扩展为人脸的整体,由整体到局部,由简单到复杂。层数越多,那么模型学习的效果也就越精确。

随着神经网络的深度加深,模型能学习到更加复杂的问题,功能也更加强大。

3 深层神经网络表示

3.1 什么是深层网络?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jXk4yRR-1660281261396)(.\images\深层网络.png)]

使用浅层网络的时候很多分类等问题得不到很好的解决,所以需要深层的网络。

3.2 四层网络的前向传播与反向传播

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0k7xk6jJ-1660281261397)(.\images\4层网络.png)]

在这里首先对每层的符号进行一个确定,我们设置L为第几层,n为每一层的个数,L=[L1,L2,L3,L4],n=[5,5,3,1]

3.2.1 前向传播

首先还是以单个样本来进行表示,每层经过线性计算和激活函数两步计算

z [ 1 ] = W [ 1 ] x + b [ 1 ] , a [ 1 ] = g [ 1 ] ( z [ 1 ] ) z^{[1]} = W^{[1]}x+b^{[1]}, a^{[1]}=g^{[1]}(z^{[1]}) z[1]=W[1]x+b[1],a[1]=g[1](z[1]), 输入 x x x , 输出 , 输出 ,输出 a [ 1 ] a^{[1]} a[1]

z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] , a [ 2 ] = g [ 2 ] ( z [ 2 ] ) z^{[2]} = W^{[2]}a^{[1]}+b^{[2]}, a^{[2]}=g^{[2]}(z^{[2]}) z[2]=W[2]a[1]+b[2],a[2]=g[2](z[2]),输入 a [ 1 ] a^{[1]} a[1], 输出 a [ 2 ] a^{[2]} a[2]

z [ 3 ] = W [ 3 ] a [ 2 ] + b [ 3 ] , a [ 3 ] = g [ 3 ] ( z [ 3 ] ) z^{[3]} = W^{[3]}a^{[2]}+b^{[3]},a^{[3]}=g^{[3]}(z^{[3]}) z[3]=W[3]a[2]+b[3],a[3]=g[3](z[3]), 输入 a [ 2 ] a^{[2]} a[2], 输出 a [ 3 ] a^{[3]} a[3]

z [ 4 ] = W [ 4 ] a [ 3 ] + b [ 4 ] , a [ 4 ] = σ ( z [ 4 ] ) z^{[4]} = W^{[4]}a^{[3]}+b^{[4]},a^{[4]}=\sigma(z^{[4]}) z[4]=W[4]a[3]+b[4],a[4]=σ(z[4]), 输入 a [ 3 ] a^{[3]} a[3], 输出 a [ 4 ] a^{[4]} a[4]

我们将上式简单的用通用公式表达出来, x = a [ 0 ] x = a^{[0]} x=a[0]

z [ L ] = W [ L ] a [ L − 1 ] + b [ L ] , a [ L ] = g [ L ] ( z [ L ] ) z^{[L]} = W^{[L]}a^{[L-1]}+b^{[L]}, a^{[L]}=g^{[L]}(z^{[L]}) z[L]=W[L]a[L1]+b[L],a[L]=g[L](z[L]), 输入 a [ L − 1 ] a^{[L-1]} a[L1], 输出 a [ L ] a^{[L]} a[L]

  • m个样本的向量表示

Z [ L ] = W [ L ] A [ L − 1 ] + b [ L ] Z^{[L]} = W^{[L]}A^{[L-1]}+b^{[L]} Z[L]=W[L]A[L1]+b[L]

A [ L ] = g [ L ] ( Z [ L ] ) A^{[L]}=g^{[L]}(Z^{[L]}) A[L]=g[L](Z[L])

输入 a [ L − 1 ] a^{[L-1]} a[L1], 输出 a [ L ] a^{[L]} a[L]

3.2.2 反向传播

因为涉及到的层数较多,所以我们通过一个图来表示反向的过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yaS1BDso-1660281261398)(.\images\深层反向传播理解.png)]

  • 反向传播的结果

单个样本的反向传播:

d Z [ l ] = d J d a [ l ] d a [ l ] d Z [ l ] = d a [ l ] dZ^{[l]}=\frac{dJ}{da^{[l]}}\frac{da^{[l]}}{dZ^{[l]}}=da^{[l]} dZ[l]=da[l]dJdZ[l]da[l]=da[l]

d W [ l ] = d J d Z [ l ] d Z [ l ] d W [ l ] = d Z [ l ] ⋅ a [ l − 1 ] dW^{[l]}=\frac{dJ}{dZ^{[l]}}\frac{dZ^{[l]}}{dW^{[l]}}=dZ^{[l]}\cdot a^{[l-1]} dW[l]=dZ[l]dJdW[l]dZ[l]=dZ[l]a[l1]

d b [ l ] = d J d Z [ l ] d Z [ l ] d b [ l ] = d Z [ l ] db^{[l]}=\frac{dJ}{dZ^{[l]}}\frac{dZ^{[l]}}{db^{[l]}}=dZ^{[l]} db[l]=dZ[l]dJdb[l]dZ[l]=dZ[l]

d a [ l − 1 ] = W [ l ] T ⋅ d Z [ l ] da^{[l-1]}=W^{[l]T}\cdot dZ^{[l]} da[l1]=W[l]TdZ[l]

多个样本的反向传播

d Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) dZ^{[l]}=dA^{[l]}*g^{[l]}{'}(Z^{[l]}) dZ[l]=dA[l]g[l](Z[l])

d W [ l ] = 1 m d Z [ l ] ⋅ A [ l − 1 ] T dW^{[l]}=\frac{1}{m}dZ^{[l]}\cdot {A^{[l-1]}}^{T} dW[l]=m1dZ[l]A[l1]T

d b [ l ] = 1 m n p . s u m ( d Z [ l ] , a x i s = 1 ) db^{[l]}=\frac{1}{m}np.sum(dZ^{[l]},axis=1) db[l]=m1np.sum(dZ[l],axis=1)

d A [ l ] = W [ l + 1 ] T ⋅ d Z [ l + 1 ] dA^{[l]}=W^{[l+1]T}\cdot dZ^{[l+1]} dA[l]=W[l+1]TdZ[l+1]

3.3 参数与超参数

3.3.1 参数

参数即是我们在过程中想要模型学习到的信息(模型自己能计算出来的),例如 W[l]W[l],b[l]b[l]。而**超参数(hyper parameters)**即为控制参数的输出值的一些网络信息(需要人经验判断)。超参数的改变会导致最终得到的参数 W[l],b[l] 的改变。

3.3.2 超参数

典型的超参数有:

  • 学习速率:α
  • 迭代次数:N
  • 隐藏层的层数:L
  • 每一层的神经元个数:n[1],n[2],…
  • 激活函数 g(z) 的选择

当开发新应用时,预先很难准确知道超参数的最优值应该是什么。因此,通常需要尝试很多不同的值。应用深度学习领域是一个很大程度基于经验的过程。

3.3.3 参数初始化

  • 为什么要随机初始化权重

如果在初始时将两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。

在初始化的时候,W 参数要进行随机初始化,不可以设置为 0。b 因为不存在上述问题,可以设置为 0。

以 2 个输入,2 个隐藏神经元为例:

W = np.random.randn(2,2) * 0.01 # 正态分布
b = np.zeros((2,1))
  • 初始化权重的值选择

这里将 W 的值乘以 0.01(或者其他的常数值)的原因是为了使得权重 W 初始化为较小的值,这是因为使用 sigmoid 函数或者 tanh 函数作为激活函数时,W 比较小,则 Z=WX+b 所得的值趋近于 0,梯度较大,能够提高算法的更新速度。而如果 W 设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。

ReLU 和 Leaky ReLU 作为激活函数时不存在这种问题,因为在大于 0 的时候,梯度均为 1。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9maYbyfn-1660281261398)(.\images\tanh.png)]

猜你喜欢

转载自blog.csdn.net/weixin_56197703/article/details/126302004