您的位置:首页 > 理论基础 > 计算机网络

Coursera deeplearning.ai 深度学习笔记1-4-Deep Neural Networks-深度神经网络原理推导与代码实现

2017-12-12 19:52 1096 查看
在掌握了浅层神经网络算法后,对深度神经网络进行学习。

1. 原理推导

1.1 深度神经网络表示

定义:L表示神经网络总层数,上标[l]代表第l层网络,n[l]代表第l层的节点数,a[l]代表第l层的激活,W[l]和b[l]为第l层的参数。输入层为第0层a[0] = x,输出层为第L层a[L]。



1.2 正向传播(Forward Propagation)

类似浅层神经网络的推导可以得到,对于第l层,针对单个样本,正向传播可以表示为:

z[l]=W[l]a[l−1]+b[l],a[l]=g[l](z[l])(1)

式中,g[l](z[l])为第l层的激活函数,且a[0] = x。针对m个样本,以上标(m)表示第m个样本,将上式改写为:

Z[l]=W[l]A[l−1]+b[l],A[l]=g[l](Z[l])(2)

式中,A[0] = X,

Z[l]=⎡⎣⎢|z[l](1)||z[l](2)||⋯||z[l](m)|⎤⎦⎥,A[l]=⎡⎣⎢|a[l](1)||a[l](2)||⋯||a[l](m)|⎤⎦⎥(3)

因此,对于以上L层深度神经网络,给定A[0] = X,正向传播计算流程如下:

A[0]=Xforiinrange(1,L+1):Z[l]=W[l]A[l−1]+b[l]A[l]=g[l](Z[l])(4)

正向传播,实际就是输入A[l-1]得到A[l]的过程,同时需要将Z[l]保存以便于反向传播的计算。

各矩阵维度如下表:

矩阵A[0] = XA[l]W[l]b[l]Z[l]
维度(n[0], m)(n[l], m)(n[l], n[l-1])(n[l], 1)(n[l], m)

1.3 反向传播(Backward Propagation)

类似浅层神经网络的推导可以得到,对于第l层,针对单个样本,反向传播可以表示为:

dz[l]=da[l]∗g[l]′(z[l])dW[l]=dz[l]a[l−1]Tdb[l]=dz[l]da[l−1]=W[l]Tdz[l](5)

式中,“*”表示元素点乘。拓展到m个样本得到:

dZ[l]=dA[l]∗g[l]′(Z[l])dW[l]=1mdZ[l]A[l−1]Tdb[l]=1mnp.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]TdZ[l](6)

通过上式便可求出梯度dW和db。

反向传播,实际就是输入dA[l]得到dA[l-1]以及梯度dW[l]和db[l]的过程,同时需要将dZ[l]保存以方便计算。

反向传播的初始化如下。由于损失函数表示为:

L(a,y)=−[yloga+(1−y)log(1−a)](7)

则可以求出:

da[L]=dda[L]{−[yloga[L]+(1−y)log(1−a[L])]}=−ya[L]+1−y1−a[L]dA[L]=⎡⎣⎢⎢|−y(1)a[L](1)+1−y(1)1−a[L](1)||−y(2)a[L](2)+1−y(2)1−a[L](2)||⋯||−y(m)a[L](m)+1−y(m)1−a[L](m)|⎤⎦⎥⎥(8)

在反向传播过程中,同样可以求出代价函数如下:

J(w,b)=1m∑i=1mL(a(i),y(i))=−1m∑i=1m[y(i)loga(i)+(1−y(i))log(1−a(i))](9)

1.4 梯度下降(Gradient Descent)

通过反向传播求出了梯度dW和db后,即可用梯度下降法对参数进行更新:

W[l]=W[l]−αdW[l]b[l]=b[l]−αdb[l](10)

1.5 超参数(Hyperparameters)

深度神经网络中主要有以下几个超参数需要调整:

(1) 学习因子α;

(2) 迭代次数iterations;

(3) 隐含层数量L;

(4) 隐含层单元数量n[1], n[2], … , n[L];

(5) 激活函数的选择。

其他超参数:momentum、mini batch size、regularization parameters等。

2. 代码实现

案例:采用L层深度神经网络,实现猫咪图片的二分类。



各个模块如下:



2.1 初始化initialize

对W随机初始化,并将b初始化为0,核心代码如下:



2.2 正向传播

2.2.1 线性部分linear_forward

采用下式,实现每个节点的线性部分:

Z[l]=W[l]A[l−1]+b[l](11)

核心代码如下:



2.2.2 线性激活部分linear_activation_forward

采用下式,实现sigmoid和ReLU函数的线性激活部分:

A[l]=g[l](Z[l])(12)

核心代码如下:



2.2.3 正向传播forward

利用以上两个函数,实现[Linear -> ReLU](*L - 1) -> [Linear -> Sigmoid]的正向传播过程,核心代码如下:



2.3 计算代价函数compute_cost

核心代码如下:



2.4 反向传播

2.4.1 线性部分linear_backward

采用下式,实现每个节点的线性部分:

dW[l]=1mdZ[l]A[l−1]Tdb[l]=1mnp.sum(dZ[l],axis=1,keepdims=True)dA[l−1]=W[l]TdZ[l](13)

核心代码如下:



2.4.2 线性激活部分linear_activation_backward

采用下式实现sigmoid和ReLU函数的线性激活部分,

dZ[l]=dA[l]∗g[l]′(Z[l])(14)

核心代码如下:







2.4.3 正向传播backward

利用以上两个函数,实现[Linear -> ReLU](*L - 1) -> [Linear -> Sigmoid]的正向传播过程,核心代码如下:



2.5 参数更新update_parameters

利用梯度下降法对参数进行更新,核心代码如下:



2.6 模型构建dnn_model

将上述几个模块组合起来,得到最优参数W和b,核心代码如下:



2.7 样本预测predict

输入样本,利用模型预测样本并计算预测准确率,核心代码如下:



2.8 样本测试

核心代码如下:



得到如下结果。可以看出,代价函数随着迭代次数的增加不断下降,训练样本准确率98.56%,测试样本的准确率80%。



以下代码输出预测错误的图片。



结果如下:



可以看出,该模型对于具备以下特征的图片的分类较为困难:

(1) 猫咪身体位置较偏;

(2) 猫咪与背景颜色相似;

(3) 品种少见的猫咪;

(4) 相机角度特殊;

(5) 图片亮度较差;

(6) 猫咪在图片中太大或者太小。

代码下载地址:https://gitee.com/tuzhen301/Coursera-deeplearning.ai1-4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐