zoukankan      html  css  js  c++  java
  • 神经网络入门——15反向传播

    反向传播

    如何让多层神经网络学习呢?我们已了解了使用梯度下降来更新权重,反向传播算法则是它的一个延伸。以一个两层神经网络为例,可以使用链式法则计算输入层-隐藏层间权重的误差。

    要使用梯度下降法更新隐藏层的权重,你需要知道各隐藏层节点的误差对最终输出的影响。每层的输出是由两层间的权重决定的,两层之间产生的误差,按权重缩放后在网络中向前传播。既然我们知道输出误差,便可以用权重来反向传播到隐藏层。

    例如,输出层每个输出节点 kk 的误差是 delta^o_kδko ,隐藏节点 jj 的误差即为输出误差乘以输出层-隐藏层间的权重矩阵(以及梯度)。

     
     

    然后,梯度下降与之前相同,只是用新的误差:

     
     

    其中 w_{ij} 是输入和隐藏层之间的权重, x_i 是输入值。这个形式可以表示任意层数。权重更新步长等于步长乘以层输出误差再乘以该层的输入值。

     
     

    现在,你有了输出误差,delta_{output},便可以反向传播这些误差了。V_{in} 是该层的输入,比如经过隐藏层激活函数的输出值。

     

    范例

    以一个简单的两层神经网络为例,计算其权重的更新过程。假设该神经网络包含两个输入值,一个隐藏节点和一个输出节点,隐藏层和输出层的激活函数都是 sigmoid,如下图所示。(注意:图底部的节点为输入值,图顶部的 hat yy^为输出值。输入层不计入层数,所以该结构被称为两层神经网络。)

     
     

    反向传播练习

    接下来你将用代码来实现一次两个权重的反向传播更新。我们提供了正向传播的代码,你来实现反向传播的部分。

    要做的事

    • 计算网络输出误差
    • 计算输出层误差项
    • 用反向传播计算隐藏层误差项
    • 计算反向传播误差的权重更新步长
    def sigmoid(x):
        """
        Calculate sigmoid
        """
        return 1 / (1 + np.exp(-x))
    
    
    x = np.array([0.5, 0.1, -0.2])
    target = 0.6
    learnrate = 0.5
    
    weights_input_hidden = np.array([[0.5, -0.6],
                                     [0.1, -0.2],
                                     [0.1, 0.7]])
    
    weights_hidden_output = np.array([0.1, -0.3])
    
    ## Forward pass
    hidden_layer_input = np.dot(x, weights_input_hidden)
    hidden_layer_output = sigmoid(hidden_layer_input)
    
    output_layer_in = np.dot(hidden_layer_output, weights_hidden_output)
    output = sigmoid(output_layer_in)
    
    ## Backwards pass
    ## TODO: Calculate output error
    error = target - output
    
    # TODO: Calculate error term for output layer
    output_error_term = error * output * (1 - output)
    
    # TODO: Calculate error term for hidden layer
    hidden_error_term = np.dot(output_error_term, weights_hidden_output) * 
                        hidden_layer_output * (1 - hidden_layer_output)
    
    # TODO: Calculate change in weights for hidden layer to output layer
    delta_w_h_o = learnrate * output_error_term * hidden_layer_output
    
    # TODO: Calculate change in weights for input layer to hidden layer
    delta_w_i_h = learnrate * hidden_error_term * x[:, None]
    
    print('Change in weights for hidden layer to output layer:')
    print(delta_w_h_o)
    print('Change in weights for input layer to hidden layer:')
    print(delta_w_i_h)
  • 相关阅读:
    nginxWebUI
    c#通过串口及CAN模块实现上位及下位机通讯
    使用IDEA创建SpringBoot项目出现intellij idea No active profile set, falling back to default profiles: default
    linux服务器创建python环境
    在Linux服务器上安装anaconda
    牛客-小w的魔术扑克【并查集】
    bzoj#4161-Shlw loves matrixI【常系数线性齐次递推】
    CF903G-Yet Another Maxflow Problem【线段树,最大流】
    P4700-[CEOI2011]Traffic【tarjan,dp】
    CF1039D-You Are Given a Tree【根号分治,贪心】
  • 原文地址:https://www.cnblogs.com/fuhang/p/8963375.html
Copyright © 2011-2022 走看看