back propagation

  • 一个浅层的神经网络
  • 参数和中间变量解释
  • 前向传播
  • 反向传播
  • 代码示例
  • 参考

一个浅层的神经网络


上图是一个,3层的神经网络,2个隐藏层+1个输出层;输入层 特征维度为3。

上图时一个神经元的结构,有一个线性函数 和 一个非线性的激活函数组成。
z=wTx+bz=w^Tx+b z=wTx+b
a=σ(z)=1/(1+e−z)a=\sigma(z)= 1/(1+e^{-z}) a=σ(z)=1/(1+e−z)
式中的激活函数采用的时 sigmoid 函数,可以使用其他函数进行代替。

参数和中间变量解释

若使用, nxn_xnx​ 表示输入数据的特征维度,如上图nx=3n_x=3nx​=3, 使用 m表示单次输入的的样本个数。 则:
XXX: 表示输入数据矩阵 , shape 为(nx,m)(n_x, m)(nx​,m)
W[1]W^{[1]}W[1]: 表示第一层的 权重参数, shape 为 (4,nx)(4, n_x)(4,nx​)
Z[1]Z^{[1]}Z[1]、A[1]A^{[1]}A[1]: 表示第一层 的线性函数 和 激活函数的输出结果, shape 为(4,m)

W[2]W^{[2]}W[2]: shape 为 (3, 4)
Z[2]Z^{[2]}Z[2]、A[2]A^{[2]}A[2]: shape 为(3, m)

W[3]W^{[3]}W[3]: shape 为 (1, 3)
Z[3]Z^{[3]}Z[3]、A[3]A^{[3]}A[3]: shape 为(1, m)

一般的,如果L[i]L^{[i]}L[i] 表示i 层的神经元个数,则:
W[i]W^{[i]}W[i]: shape 为 (L[i],L[i−1])(L^{[i]} , L^{[i-1]})(L[i],L[i−1])
b[i]b^{[i]}b[i]: shape 为 (L[i],1)(L^{[i]}, 1)(L[i],1)
Z[i]Z^{[i]}Z[i]、A[i]A^{[i]}A[i]: shape 为(L[i],m)(L^{[i]},m)(L[i],m)

前向传播

Z[1]=W[1]XZ^{[1]}= W^{[1]}XZ[1]=W[1]X
A[1]=σ(Z[1])A^{[1]}=\sigma(Z^{[1]})A[1]=σ(Z[1])

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

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

一般的:
Z[i]=W[i]A[i−1]Z^{[i]}= W^{[i]}A^{[i-1]}Z[i]=W[i]A[i−1]
A[i]=σ(Z[i])A^{[i]}=\sigma(Z^{[i]})A[i]=σ(Z[i])

反向传播

假设,上图中3层的神经网络用于 二分类,则 我们在最后一层,activation function可以使用sigmoid 函数,σ3(z)=g(x)\sigma^3(z)=g(x)σ3(z)=g(x)
反向传播的目的,就是通过链式法则,求得各层的参数梯度,进行优化求解。
为简化表示,使用dvar 对变量 var 的偏导。
cost function:
J=−1m∑i=1mylogy^+(1−y)log(1−y^)J=-\frac 1m\sum_{i=1}^{m}ylog\hat{y}+(1-y)log(1-\hat{y})J=−m1​i=1∑m​ylogy^​+(1−y)log(1−y^​)
y^=a[3]\hat{y}=a^{[3]}y^​=a[3] 第三层的激励函数 输出。

dA[3]=1−Y1−A[3]−YA[3]dA^{[3]} = \frac{1-Y}{1-A^{[3]}}-\frac{Y}{A^{[3]}}dA[3]=1−A[3]1−Y​−A[3]Y​ … 此处的一个数字减一个矩阵,是对矩阵中的每一个元素都和该常数操作

dZ[3]=dA[3]g′=(1−Y1−A[3]−YA[3])(A[3](1−A[3]))=A[3]−YdZ^{[3]}=dA^{[3]}g^{'}=( \frac{1-Y}{1-A^{[3]}}-\frac{Y}{A^{[3]}})(A^{[3]}(1-A^{[3]}))=A^{[3]}-YdZ[3]=dA[3]g′=(1−A[3]1−Y​−A[3]Y​)(A[3](1−A[3]))=A[3]−Y
dW[3]=1mdZ[3]A[2]TdW^{[3]}=\frac{1}{m}dZ^{[3]}A^{[2]^T}dW[3]=m1​dZ[3]A[2]T
db[3]=1mnp.sum(dZ[3],axis=1)db^{[3]}=\frac{1}{m}np.sum(dZ^{[3]},axis=1)db[3]=m1​np.sum(dZ[3],axis=1)

dZ[2]=W[3]TdZ[3]∗σ[2]′Z[2]dZ^{[2]}=W^{{[3]}^T}dZ^{[3]}*\sigma^{[2]^{'}}Z^{[2]}dZ[2]=W[3]TdZ[3]∗σ[2]′Z[2]
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]′Z[1]dZ^{[1]}=W^{{[2]^T}}{dZ^{[2]}}*\sigma^{[1]^{'}}Z^{[1]}dZ[1]=W[2]TdZ[2]∗σ[1]′Z[1]
dW[1]=1mdZ[1]XTdW^{[1]}=\frac{1}{m}dZ^{[1]}X^TdW[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)

一般的对于第i层:
dZ[i]=W[i+1]TdZ[i+1]∗σ[i]′Z[i]dZ^{[i]}=W^{{[i+1]^T}}{dZ^{[i+1]}}*\sigma^{[i]^{'}}Z^{[i]}dZ[i]=W[i+1]TdZ[i+1]∗σ[i]′Z[i]
dW[i]=1mdZ[i]XTdW^{[i]}=\frac{1}{m}dZ^{[i]}X^TdW[i]=m1​dZ[i]XT
db[i]=1mnp.sum(dZ[i],axis=1)db^{[i]}=\frac{1}{m}np.sum(dZ^{[i]},axis=1)db[i]=m1​np.sum(dZ[i],axis=1)

代码示例

本代码将以上图的3层神经网络为例,进行说明反向传播和链式法则。

```python
# 在这里插入代码片
import numpy as npnp.random.seed(1)
# 定义层级大小,并初始化参数
def layer_sizes(X,Y):'''X: input dataset ,shape (n_x, number of examples m)Y: labels , shape (output size 1 , m number of examples)return:  the struct of Neural Network n_L:   a list ,n_L[i]: the size of ith layer i =0 is the  input layer '''n_L=[3,4,3,1]  # n_l[0] = n_x  特征维度assert(n_l[0]==X.shape[0] and n_L[-1]==Y.shape[0])# 初始化参数parameters={}for i in range(1,4):Wi = np.random.randn(n_L[i],n_L[i-1])*0.01bi = np.random.randn(n_L[i],1)*0.01str = "layer%d"%(i)parameters[str]={"W%d"%(i): wi, "W%d"%(i): bi}return n_L,parameters# 前向传播函数,中间层tanh作为激活函数,输出层使用 sigmoid ,也可以尝试其他
def forward_propagation(X,parameters):'''parameters: '''# 需要缓存的中间变量, 用于反向传播cache = {}Alast =[]for i in range(1,4):L = "layer%d"%(i)W = parameters[L]["W%d"%(i)]b = parameters[L]["b%d"%(i)]Z = np.dot(W,b)A = np.tanh(Z)if i==3:A= 1/(1+np.exp(-Z))Alast = Aassert(A.shape == (1,X.shape[1]))cache[L] = {"Z%d"%(i):Z, "A%d"%(i):A}return Alast,cache# compute_cost 计算代价
def compute_cost(Alast , Y, parameters):'''Alast: 输出层 激活函数的输出'''m = Y.shape[1]   # the number of example# Comput the cost loss = Y*np.log(Alast)+(1-Y)*np.log(1-Alast)cost = -np.sum(loss)cost = np.squeeze(cost)assert(isinstance(cost,float))return cost# 反向传播函数
def backward_propagation(parameters, cache ,X, Y):"""cache :  缓存的中间变量"""m = X.shape[1]W1 = parameters["layer1"]["W1"]W2 = parameters["layer2"]["W2"]W3 = parameters["layer3"]["W3"]A1 = cache["layer1"]["A1"]A2 = cache["layer2"]["A2"]A3 = cache["layer3"]["A3"]dZ3 = A3-YdW3 = np.dot(dZ3,A2.T)/mdb3 = np.sum(dZ3,axis=1,keepdims=True)/mdZ2 = np.dot(W2.T,dZ3)*(1-np.power(A2,2))dW2 = np.dot(dZ2,X.T)/mdb2 = np.sum(dZ2,axis=1,keepdims=True)/mdZ1 = np.dot(W2.T,dZ2)*(1-np.power(A1,2))dW1 = np.dot(dZ1,X.T)/mdb1 = np.sum(dZ1,axis=1,keepdims=True)/mreturn {"dW1":dW1,"db1":db1,"dW2":dW2,"db2":db2,"dW3":dW3,"db3":db3}

一个简单的浅层神经网络 所需的函数 已经完成,应当关注 在计算过程中需要缓存的 数据有哪些,因为在大型深度神经网络中需要分析,中间变量的所占内存的情况。

参考

Backpropagation wikipedia

back propagation反向传播(浅层神经网络分析示例)相关推荐

  1. 斯坦福CS231n项目实战(四):浅层神经网络

    我的网站:红色石头的机器学习之路 我的CSDN:红色石头的专栏 我的知乎:红色石头 我的微博:RedstoneWill的微博 我的GitHub:RedstoneWill的GitHub 我的微信公众号: ...

  2. 独家 | 数据科学家指南:梯度下降与反向传播算法

    作者:Richmond Alake 翻译:陈之炎 校对:zrx本文约3300字,建议阅读5分钟 本文旨在为数据科学家提供一些基础知识,以理解在训练神经网络时所需调用的底层函数和方法. 标签:神经网络, ...

  3. 使用浅层神经网络识别图片中的英文字母

    一.实验介绍 1.1 实验内容 本次实验我们正式开始我们的项目:使用神经网络识别图片中的英文字母. 激动人心的时刻到了,我们将运用神经网络的魔力,解决一个无法使用手工编程解决的问题.如果你(自认为)是 ...

  4. 机器学习 反向传播_机器学习中的神秘化反向传播:您想了解的隐藏数学

    机器学习 反向传播 By Ibrahima "Prof" Traore, ML expert at Wildcard / w6d.io 作者:Wildcard / w6d.io的 ...

  5. 深度学习中反向传播算法简单推导笔记

    反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)=W(1)x+b(1)z^{(1)} = W^{(1)}x+b^{(1)}z(1)=W(1)x+b(1) a(1)=σ ...

  6. 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图

    转载:https://zhuanlan.zhihu.com/p/145353262 前言 本文的主要目标: 一遍搞懂反向传播的底层原理,以及其在深度学习框架pytorch中的实现机制.当然一遍搞不定两 ...

  7. 深度学习笔记--pytorch从梯度下降到反向传播BP到线性回归实现,以及API调用和手写数据集的实现

    梯度下降和反向传播 目标 知道什么是梯度下降 知道什么是反向传播 1. 梯度是什么? 梯度:是一个向量,导数+变化最快的方向(学习的前进方向) 回顾机器学习 收集数据 x x x ,构建机器学习模型 ...

  8. (一)反向传播算法理解 (Back-Propagation)

    本文参考deeplearningbook.org一书第六章  6.5 Back-Propagation and Other Differentiation Algorithms 反向传播算法分为两篇来讲 ...

  9. 神经网络反向传播BP算法举例说明

    0. 前言 上篇博客对BP算法的大致步骤进行了总结,本篇博客将通过一个具体的例子来模拟一下这个算法的实现过程 ! 1. BP算法例子说明 1.1 网络结构 1.2 权重及偏移 w = ( 0.1 , ...

最新文章

  1. (C++)1027 打印沙漏
  2. Hadoop何以快速成为最佳网络安全工具?
  3. VTK:vtkCubeAxesActor用法实战
  4. 自己动手 CentOS-6.5 安装Oracle11g R2
  5. mfc多线程编程实例_多线程技术的PLC与PC的通讯方式
  6. mysql数据库双机备份_MySQL数据库本地备份和双机相互备份
  7. 学习web前端前景怎么样?
  8. python 列表和字段的相关函数
  9. 怎么切麻花槽_水电怎么安装?这几点需牢记!
  10. linux培训课程第一天:ppt以及笔记
  11. 格力机器人图解_你所不知道的格力机器人战略
  12. ECharts折线图自定义横坐标显示或隐藏
  13. [iOS]苹果开发证书 一个证书多人开发 注意项
  14. 计算机word窗口的组成,推计算机等级考试题库:一级MS Office第三章“Word窗口及其组成”(一)...
  15. ●「.|貓」erPhotoshop滤镜巧制超级美女插画效果
  16. 你如何理解目前市面上流行的贷款软件?
  17. ps人物磨皮美容插件:Pro Retouch Panel(支持ps2021)
  18. 4位数码管显示模块TM1637芯片C语言驱动程序
  19. ThinkPHP高仿蓝奏云网盘系统程序
  20. U3D_Shader编程(第二篇:基础夯实篇)

热门文章

  1. [paper reading] CenterNet (Triplets)
  2. xilinx sdk文本编辑器显示行数
  3. BIOS和DOS中断例程的安装过程
  4. linux 线程异常退出_Linux 进程必知必会
  5. 普元云计算-云计算平台项目团队组织架构与缘起
  6. KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
  7. html 5 video
  8. [LeetCode] Merge Sorted Array
  9. excel批量导入数据
  10. [转载] numpy.exp,numpy.sqrt,np.power等函数的详细理解