【深度学习】1.4深层神经网络

深层神经网络

在这里插入图片描述
logistic回归是一个浅层模型(shallow model),浅层或是深层是一个程度的问题,从技术层面上说logistic回归是单层神经网络。当我们数神经网络有几层的时候,不能把输入层数进去,只算上隐层的数量和输出层,所以右上角是一个双层神经网络。

在这里插入图片描述
符号约定如下
这是一个四层的有三个隐层的神经网络。隐层中的单元数目是5,5,3。有一个输出单元。
用L来表示神经网络的层数,此处L=4;
用n[l]表示节点的数量,或者l层上的单元数量,输入层标为第0层,此处n[1]=5,n[2]=5,n[3]=3,n[4]=n[L]=1,n[0]=nx=3。对于每个l层,用a[l]=g[l](z[l])来表示l层中的激活函数。w[l]表示a[l]中z[l]值的权重。
输入特征用x表示,而x也是第0层的激活函数,因此x=a[0];最后一层的激活函数a[L]=y hat,即预测输出。

深层网络中的前向传播

在这里插入图片描述
假设这个有一个训练样本x,这里x=a[0],因为输入特征向量x也是第0层的激活单元。
在第一层里需要计算z[1] = w[1]x + b[1] = w[1]a[0] + b[1] ,那么 w[1]和b[1]就是会影响第一层的激活单元的参数,这就是神经网络的第一层。
然后要计算这一层的激活函数。a[1]=g[1](z[1]),激活函数g的指标取决于所在的层数,因此在第一层的情况下g的上标就是1。
接下来就要计算第二层的z[2] = w[2] a[1]+ b[2],然后计算第二层的激活函数,就是权重矩阵乘以第一层的输出值,a[2]=g[2](z[2])。第二层就算好了。
后面几层以此类推。直到算到第四层,也就是输出层。这里z[4] = w[4] a[3]+ b[4],a[4]=g[4](z[4])=y hat。

基本规律就是:
z[l] = w[l] a[l-1]+ b[l]
a[l]=g[l](z[l])

以上就是所有正向传播的公式。

接下来介绍用向量化的方法训练整个训练集。
X = A[0]
Z[1] = W[1]X + b[1] = W[1]A[0] + b[1]
A[1] = g[1](Z[1])
Z[2] = W[2]A[1] + b[2]
A[2] = g[2](Z[2])

其中,Z[2] = [Z[2](1), Z[2](2),…, Z[2](m)],Z[2](1)是第一个训练样本,将1到m个训练样本写成列向量叠起来即可。矩阵A也是把所有的训练样本写成列向量,从左到右叠起来。
向量化之后,就可以得到y hat = g(Z[4]) = A[4],就是把所有的训练样本的预测值水平地叠在一起。
基本规律就是:
Z[l] = w[l] A[l-1]+ b[l]
A[l] = g[l](Z[l])
A[0] = X

在这里,使用显式for循环去计算是可以的。

核对矩阵的维数

在这里插入图片描述
z[1]是第一个隐层的激活函数向量,这里z[1]维度是(n[1], 1) = (3,1)。x在这里有两个输入特征,所以x的维度是(n[0], 1) = (2,1)。而z[1] = w[1]x + b[1],所以w[1]的维度应该是(3,2),也就是一个(n[1], n[0])维度的矩阵。事实上,w[l]的维度必须是(n[l], n[l-1])。b[1]是一个 (3,1)向量,实际上,b[l]的维度和z[l]的维度必须一致,均为(n[l], 1)
在实现反向传播时,dw[l]的维度应和w的维度相同。
向量化后,Z[1] = W[1]X + b[1],其中Z[1]是从每一个单独的z[1]的值叠加得到的,也就是z[1](1)、z[1](2)、…、z[1](m)叠在一起的结果,所以Z[1]的维度为(n[1], m),其中m是训练集大小。W[l]还是(n[l], n[l-1])。X是(n[0], m)。b[l]的维度仍是(n[l], 1),但!!python的broadcasting会将其复制成一个(n[l], m)的矩阵,然后逐个元素相加。
维度总结如下:
dW[l]、W[l]:(n[l], n[l-1])
db[l]、b[l]:(n[l], 1)
dZ[l]、dA[l]、Z[l]、A[l]:(n[l], m)
X:(n[0], m)
dz[l]、da[l]、z[l]、a[l]:(n[l], 1)
x:(n[0], 1)

dW[l]、W[l]、db[l]、b[l]的维度总是一致的,但Z[l]、A[l]、X的维度会在向量化后改变。

搭建深层神经网络块

在这里插入图片描述
讨论其中的一层l。
在第l层有参数w[l]和b[l]
正向传播里有输入的激活函数a[l-1],输出的是a[l]
z[l] = w[l]a[l-1] + b[l],a[l] = g[l](z[l]),这就可以实现从输入a[l-1]到输出a[l],之后就可以将z[l]的值缓存起来,因为z[l]对之后的正向反向传播的步骤都非常有用。
然后是反向步骤,或者说是反向传播步骤,同样也是第l层的计算。需要一个反向函数来实现输入为da[l]和所缓存的z[l]值,输出为da[l-1]和需要的梯度dw[l]、db[l]的过程。
在这里插入图片描述
通过正向函数和反向函数的作用,神经网络的计算过程会如下:

把输入特征a[0]放入第一层并计算第一层的激活函数a[1],在这个过程中需要用w[1]和b[1]来计算,之后也缓存z[1]值。
之后a[1]输入第二层,在计算中需要用到w[2]和b[2]去计算第二层的激活函数a[2]。后面基层以此类推。
直到最后算出了a[l],即第l层的最终输出值y hat。
在这个过程中我们缓存了所有的z值,这就是正向传播的步骤。

反向传播的步骤中,需要计算一系列的反向迭代,即反向计算梯度。需要将da[l]的值当作输入,然后会得到da[l-1]的值,以此类推,直到得到da[2]和da[1]。在这个过程中,还可以多计算一个输出值da[0],但其实它是输入特征的导数,是一个对于训练学习的权重并不是很重要的参数。
反向传播中也会输出dw[l]和db[l]
在这里插入图片描述
神经网络的一步训练,包含了从a[0]= x开始,经过一系列正向传播得到y hat,之后再用输出值计算,实现反向传播。这样就有了所有的导数项。w也会在每一层被更新为w-α×dw,b也一样。

前向和反向传播

反向传播中,实现反向函数的方法为:
dz[l] = da[l] × g[l]’(z[l]),
dw[l] = dz[l] × a[l-1],
db[l] = dz[l]
da[l-1] = w[l]T × dz[l]

向量化形式为:
dZ[l] = dA[l] × g[l]’(Z[l]),
dW[l] = dZ[l] × A[l-1]T / m,
db[l] = np.sum(dz[l], aixs=1, keepdims=True) / m,
dA[l-1] = W[l]T × dZ[l]

前向递归用输入数据x来初始化,而反向递归为:
当使用logistic回归做二分分类的时候,da[L] = -y/a + (1-y)/(1-a),这个式子适用于最后一层,也就是L层上。若向量化的化, 需要使用式子dA[L] = -y(1)/a(1) + (1-y(1))/(1-a(1))+…-y(m)/a(m) + (1-y(m))/(1-a(m))

参数VS超参数

在学习算法中还有其他参数需要输入到学习算法中,比如学习率α(因为我们需要设置α学习率来决定参数如何进化)、梯度下降法循环的数量、隐层数L、隐藏单元数(n[1]、n[2]、…)、激活函数(在隐层中用修正线性单元还有tanh还是σ函数)。算法中的这些参数都需要我们去设置,这些数字实际上控制了最后参数W和b的值,所以我们称这些为超参数,因为这些超参数都可以控制W和b,这些超参数某种程度上决定了最终得到的W和b。实际上深度学习有很多不同的超参数,比如momentum、mini batch的大小、几种不同的正则化参数等等。
对于这些超参数,可以选择的数很多,预先无法直到它的最优值是多少。可以先试一个常用的值,去看J的大小变化,再改变它的值,再去比较J是否下降的很快,或者收敛到在更高的位置。当找到一个值可以加快学习过程,并且收敛在更低的损失函数值上,就使用这个值。

这和大脑有什么关系?

在这里插入图片描述
在这里插入图片描述

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页