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

神经网络之反向传播

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: