文章目录

  • 1 浅层神经网络表示
    • 1.2 单个样本的向量化表示
    • 1.3 激活函数的选择
      • 1.3.1 为什么需要非线性的激活函数
      • 1.3.2 修改激活函数的前向传播和反向传播
  • 2 为什么使用深层网络
  • 3 深层神经网络表示
    • 3.1 什么是深层网络?
    • 3.2 四层网络的前向传播与反向传播
      • 3.2.1 前向传播
      • 3.2.2 反向传播
    • 3.3 参数与超参数
      • 3.3.1 参数
      • 3.3.2 超参数
      • 3.3.3 参数初始化

1 浅层神经网络表示

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

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

计算图如下

  • 每个神经元的计算分解步骤如下
  • 第一层中的第一个神经元

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

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

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

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

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

得出第一层的计算:

1.2 单个样本的向量化表示

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

(⋯(W1[1])T⋯⋯(W2[1])T⋯⋯(W3[1])T⋯⋯(W4[1])T⋯)∗(x1x2x3)+(b1[1]b2[1]b3[1]b4[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​⋯⋯⋯⋯​⎠⎞​∗⎝⎛​x1​x2​x3​​⎠⎞​+⎝⎛​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)

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

  • 多个样本的向量化表示

假设一样含有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,双曲正切函数):

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

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

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

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

  • Leaky ReLU(带泄漏的 ReLU):

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])=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+ba[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]=tanh(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])

  • 反向梯度下降

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

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

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

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

dW[2]=1mdZ[2]A[1]TdW^{[2]}=\frac{1}{m}dZ^{[2]}{A^{[1]}}^{T}dW[2]=m1​dZ[2]A[1]T

db[2]=1mnp.sum(dZ[2],axis=1)db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]}, axis=1)db[2]=m1​np.sum(dZ[2],axis=1)

隐藏层的导数计算:

dZ[1]=W[2]TdZ[2]∗(1−g(Z[1])2=W[2]TdZ[2]∗(1−A[1])2dZ^{[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]∗(1−g(Z[1])2=W[2]TdZ[2]∗(1−A[1])2

dW[1]=1mdZ[1]XTdW^{[1]}=\frac{1}{m}dZ^{[1]}X^{T}dW[1]=m1​dZ[1]XT

db[1]=1mnp.sum(dZ[1],axis=1)db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]}, axis=1)db[1]=m1​np.sum(dZ[1],axis=1)

2 为什么使用深层网络

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

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

3 深层神经网络表示

3.1 什么是深层网络?

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

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

在这里首先对每层的符号进行一个确定,我们设置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]), 输入xxx,输出, 输出,输出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[L−1]+b[L],a[L]=g[L](z[L]), 输入a[L−1]a^{[L-1]}a[L−1], 输出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[L−1]+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[L−1], 输出a[L]a^{[L]}a[L]

3.2.2 反向传播

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

  • 反向传播的结果

单个样本的反向传播:

dZ[l]=dJda[l]da[l]dZ[l]=da[l]dZ^{[l]}=\frac{dJ}{da^{[l]}}\frac{da^{[l]}}{dZ^{[l]}}=da^{[l]}dZ[l]=da[l]dJ​dZ[l]da[l]​=da[l]

dW[l]=dJdZ[l]dZ[l]dW[l]=dZ[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]dJ​dW[l]dZ[l]​=dZ[l]⋅a[l−1]

db[l]=dJdZ[l]dZ[l]db[l]=dZ[l]db^{[l]}=\frac{dJ}{dZ^{[l]}}\frac{dZ^{[l]}}{db^{[l]}}=dZ^{[l]}db[l]=dZ[l]dJ​db[l]dZ[l]​=dZ[l]

da[l−1]=W[l]T⋅dZ[l]da^{[l-1]}=W^{[l]T}\cdot dZ^{[l]}da[l−1]=W[l]T⋅dZ[l]

多个样本的反向传播

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

dW[l]=1mdZ[l]⋅A[l−1]TdW^{[l]}=\frac{1}{m}dZ^{[l]}\cdot {A^{[l-1]}}^{T}dW[l]=m1​dZ[l]⋅A[l−1]T

db[l]=1mnp.sum(dZ[l],axis=1)db^{[l]}=\frac{1}{m}np.sum(dZ^{[l]},axis=1)db[l]=m1​np.sum(dZ[l],axis=1)

dA[l]=W[l+1]T⋅dZ[l+1]dA^{[l]}=W^{[l+1]T}\cdot dZ^{[l+1]}dA[l]=W[l+1]T⋅dZ[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。

浅层神经网络和深层神经网络介绍相关推荐

  1. python中复制、浅层拷贝、深层拷贝的区别

    python中复制.浅层拷贝.深层拷贝的区别 一.学习要点: 1.python中的复制与拷贝的区别 2.python中浅层拷贝与深层拷贝的区别 二.代码: import copy a=[1,2,3,4 ...

  2. 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们

    浅层学习与深层学习 by Payal Gupta 通过Payal Gupta 深层副本与浅层副本-以及如何在Swift中使用它们 (Deep copy vs. shallow copy - and h ...

  3. 深度学习与神经网络关系(BP网络【浅层】与深层网络)

    文章目录 Deep Learning的基本思想 浅层学习(Shallow Learning)和深度学习(Deep Learning) 浅层学习是机器学习的第一次浪潮. 深度学习是机器学习的第二次浪潮. ...

  4. java中浅层克隆和深层克隆

    1.浅复制与深复制概念  浅复制(浅克隆)      被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的 ...

  5. 吴恩达《神经网络与深度学习》精炼笔记(4)-- 浅层神经网络

    上节课我们主要介绍了向量化.矩阵计算的方法和python编程的相关技巧.并以逻辑回归为例,将其算法流程包括梯度下降转换为向量化的形式,从而大大提高了程序运算速度.本节课我们将从浅层神经网络入手,开始真 ...

  6. Coursera吴恩达《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了向量化.矩阵计算的方法和python编程的相关技巧.并以逻辑回归为例,将其算法流程包括梯度下降转换为向量化的形式,从而大大提高 ...

  7. 第三周:浅层神经网络

    1. 神经网络综述 首先,我们从整体结构上来大致看一下神经网络模型. 前面的课程中,我们已经使用计算图的方式介绍了逻辑回归梯度下降算法的正向传播和反向传播两个过程.如下图所示.神经网络的结构与逻辑回归 ...

  8. 1.4 浅层神经网络

    文章目录 1.4.1 神经网络概览(Neural Networks Overview) 1.4.2 神经网络表示(Neural Network Representation) 1.4.3 计算神经网络 ...

  9. 深度学习笔记(5) 深层神经网络

    深度学习笔记(5) 深层神经网络 1. 深层神经网络 2. 前向传播和反向传播 3. 核对矩阵的维数 4. 参数和超参数 5. 深度学习和大脑的关联性 1. 深层神经网络 当算神经网络的层数时,不算输 ...

  10. 深度学习入门笔记(七):深层神经网络

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

最新文章

  1. 【算法导论】冒泡排序 选择排序
  2. CSDN公众号新功能上线,居然还能搜出小姐姐???
  3. 进击的java(2)
  4. MATLAB从入门到精通-MATLAB零矩阵eye()函数的几种应用场景
  5. FFmpg音视频入门教程
  6. Tinux 3.0 内存对齐算法
  7. 四种代码洁癖类型,程序员看了直呼内行(文末经典书送)
  8. tomat(16)关闭钩子
  9. 【Pytorch神经网络实战案例】02 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-方法②
  10. jquery-待办事列表-待整理
  11. ESXI 6.7安装并部署主机
  12. 对刚iPad!华为最强Pad发布,独揽四项全球第一,3299元起!
  13. 局域网内搭建Android SDK更新源
  14. html展示值 vue_vue在html使用
  15. L1- 009——016
  16. Django 、 uWSGI 和 nginx 搭建服务器python应用环境
  17. jinja2说明文档
  18. html 数字大小写转换,数字大小写转化
  19. 360浏览器html文件无图标,360浏览器在网页的右键里不显示审查元素怎么了
  20. jfinal 官网不能访问了

热门文章

  1. 浅谈各大搜索引擎蜘蛛
  2. VBA(7)字典及常用应用
  3. git 解决授权失败的方法
  4. java从菜鸟到巨佬的学习目标
  5. linux virbr0是什么意思
  6. 浏览器中点击链接,跳转qq添加好友的实现方式
  7. big类型和double类型
  8. 证件照的背景颜色转换
  9. JAVA命令符找不到符号_java: 找不到符号 符号: 方法 setLatestEventInfoentInfo
  10. 【A阶段A+2】-vinc- =-vict- 胜,征服,扩展的单词学会了?