神经网络之反向传播
2019-01-18 21:16
639 查看
Backpropagation ~ 反向传播
一旦知道计算图,就可以用反向传播技术–递归调用链式法则来计算计算图中的每个变量的梯度~~
工作机制~
分为:
- 一维
- 高维
先讲一维
对任意一个点,有
根据这些结点展开到所有的结点
例题
先求解函数f()的值
然后从后往前走计算所有的梯度:(反向传播)
虽然该方法正向直接由微积分就能求解出,但在实际问题中,函数非常的复杂,用微积分直接计算非常困难。而是使用该方法将复杂的表达式分解成一些计算节点,只需要一个非常简单的计算就能计算出梯度。
复杂~
求解了的函数值f():
然后从后往前走计算所有的梯度:(反向传播)
此时再用微积分显然太麻烦~~~
对于不同的门(节点):
- add gate:梯度传递器(分支都等于门上的梯度)
- max gate:梯度路由器(将门上的梯度全给大的,其他分支都为0)
- mul gate:梯度转换器(进行尺度的放缩–分支等于门上的乘以乘法器的乘的参数)
再叙高维
对任意一个点,实际上是
由矩阵输出矩阵~~
根据这些结点展开到所有的结点
例题
先求解函数f()的值
计算反向传播
优化思想
实际计算过程中,由于图像的矩阵之大,造成其雅可比矩阵非常大。对于求其雅可比矩阵非常困难。但实际上我们不用将雅可比矩阵计算出来~~对角矩阵
实现代码▼
# 在计算图中~ # 一个正向计算和反向计算的过程 # 针对gate实现的不同API~ class ComputationalGraph(object): def forward(inputs): # 依次传值给各输入门 # 依据拓扑排序实现优先性 # 使得计算图逐渐前进 for gate in self.graph.nodes_topologivally_sorted(): gate.forward() return loss def backward(): for gate in reversed(self.graph.nodes_topologically_sorted()): gate.backward() return inputs_gradients
示例某一种门的实现~
对于x,y,z都是标量时
乘法门▼
# 乘法门 # 调用相应的API class MultiplyGate(object): def forward(x,y): z=x*y self.x=x # 对x值进行缓存,以为计算反向传播中调用多次 self.y=y # 对y值进行缓存,以为计算反向传播中调用多次 return z def backward(dz): #dz表示函数f对z的偏导 dx = self.y * dz # [dL/dz * dz/dx] dy = self.x * dz # [dL/dz * dz/dy] return [dx, dy]
相关文章推荐
- 基于反向传播的多层神经网络训练原理(翻译)
- 深层神经网络和卷积神经网络的反向传播过程推导
- 神经网络2-反向传播
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- 神经网络笔记 - 反向传播(BackPropagation)
- 深度卷积神经网络学习笔记2:步长不为1的卷积前向传播和反向传播
- Java Back Propagation Neural Network(JAVA反向传播神经网络)
- 神经网络反向传播的数学原理
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- Java Back Propagation Neural Network(JAVA反向传播神经网络)
- 神经网络反向传播(相关公式)
- CS231n学习记录Lec5 Backpropagation and Neural Networks反向传播与神经网络
- 神经网络之梯度下降与反向传播(上)
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- 反向传播(BPTT)与循环神经网络(RNN)文本预测
- 基于反向传播的多层神经网络训练原理
- 神经网络快速入门:什么是多层感知器和反向传播?
- 双层神经网络与逻辑回归正反向传播数学公式简要推导
- 神经网络之梯度下降与反向传播(下)
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络