(4)反向传播(BP)

BP 这个algorithm(算法)是怎么运作的呢?怎么样让neural network的training变得比较有效率?

当用GD 方法的时候跟LR的做法是一样的都是选定参数,计算微分,更新参数按这样的步骤遗址进行下去,但是在neural network里面我们有非常多的参数,我们要做语音辨识系统的时候在neural network通常有7,8层,每层里有很多的神经元,所以上图中的向量当中有很多很多的元素,所以现在的事情就是如何有效的把这一个百万维的向量计算出来?(下面图中的这个向量)这个就是BP 所要做的东西

     (BP所要做的就是把这个向量有效的计算出来)

BP里面唯一知道的就是Chain Rule(链式法则)

 假设给x一个很小的变化,那么对应的y和z也会发生相应的变化

 假设对输入s做一个很小的变化,相应的x和y也会发生变化,那么z也会发生变化。

 回到neural network的training,会定图个loss function,但是这个loss function是什么呢?

 上面图中的C^{n}值得是y^{n}\widehat{y}^{n}之间的距离,C^{n}越大 ,说明y^{n}\widehat{y^{n}}(期望的是最正确的)之间的距离就大. 则Loss就不是很好。

对L做微分:

接下来的计算就是对某一组数据进行右边式子的计算即可,再把所有的训练数据加起来,

怎么做呢?只考虑其中的一个神经元

   

 经过上面的一系列操作步骤之后最终得到的输出是y1,y2.

现在的问题是这样,假设我们拿出一个w换成z(就是把weight当作z)来看怎么计算?某一个weight对cost的偏微分。

先看一下怎么计算:很简单

(图中的x1和x2是:如果w1前面接的是x1,后面的微分接的也是x1)

这个步骤叫做Forward pass

接来讲Backward pass:怎么计算

 

sigmoid的微分:

  (假设我们知道❓处的值)

所以整个的过程我们就可以直接算出来:

这个式子我们从里一个角度分析:现在有一个新的neural (就是把上面的式子用一个新的结构表示一下以便于了解)

 现在是一个常数,不是一个function,z已经是一个固定的值

最后的一个问题就是怎么计算:

现在进行两种假设:

假设一:是把图中红色的神经元当作是输出,也就是整个神经网络的输出y1,y2.

假设二:没有输出的情况下,后面还有其他的神经网络。

 黄色线的部分是已知的情况下,可以进行上面红色部分的运算,这样就可知道绿色圈里面的内容

 上面的这个算法当中,黄色圈里面的是我们假设知道的,但是实际上我们是不知道的,那如何计算呢?

如果后面的绿色神经元是知道的话,就是可以秒算前面的这个微分(假设一的算法),但是如果绿色的神经元不是输出的话,就做假设二的算法,这样周而复始下去。这种做法看上去很麻烦,但是是BP算法的核心:

从最后的神经元的微分开始计算

这个算法就是将前面讲的一个综合,最后的神经元的微分很好计算,在经过从后往前的一个算法逐层递进。

(这个步骤就叫做BP)

总结:

先做一个Forward Pass 只要知道每一个神经元的输出a,这个微分就是她所连接的weight的微分。

在BP当中将整个的神经网络反过来,知道神经元的微分。

将上面的两个步骤相乘最后得到的就是整个神经网络对weight的微分。

原创不易,转载请告知,随手笔记,内容有误,还请谅解~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
反向传播(backpropagation,简称BP)是一种用于训练神经网络的算法,其主要目的是通过计算误差并反向传播来更新每个神经元之间的权重。 以下是一个简单的反向传播算法的代码示例: ```python # 初始化网络参数 input_layer_size = 2 hidden_layer_size = 3 output_layer_size = 1 # 初始化权重和偏差 W1 = np.random.randn(input_layer_size, hidden_layer_size) b1 = np.zeros((1, hidden_layer_size)) W2 = np.random.randn(hidden_layer_size, output_layer_size) b2 = np.zeros((1, output_layer_size)) # 定义激活函数 def sigmoid(z): return 1 / (1 + np.exp(-z)) # 定义反向传播算法 def backpropagation(X, y, W1, b1, W2, b2, learning_rate): # 前向传播 z1 = np.dot(X, W1) + b1 a1 = sigmoid(z1) z2 = np.dot(a1, W2) + b2 y_pred = sigmoid(z2) # 计算误差 delta3 = y_pred - y # 反向传播 delta2 = np.dot(delta3, W2.T) * (a1 * (1 - a1)) # 更新权重和偏差 dW2 = np.dot(a1.T, delta3) db2 = np.sum(delta3, axis=0, keepdims=True) dW1 = np.dot(X.T, delta2) db1 = np.sum(delta2, axis=0) W2 -= learning_rate * dW2 b2 -= learning_rate * db2 W1 -= learning_rate * dW1 b1 -= learning_rate * db1 return W1, b1, W2, b2 # 训练模型 for i in range(1000): W1, b1, W2, b2 = backpropagation(X, y, W1, b1, W2, b2, 0.1) # 预测结果 z1 = np.dot(X, W1) + b1 a1 = sigmoid(z1) z2 = np.dot(a1, W2) + b2 y_pred = sigmoid(z2) ``` 这段代码假设我们要训练一个具有一个隐藏层、2个输入节点和1个输出节点的神经网络。我们首先随机初始化权重和偏差,然后定义了一个`sigmoid`激活函数。然后我们定义了一个`backpropagation`函数,该函数接收输入数据`X`和目标输出`y`,以及当前的权重和偏差,并使用反向传播算法来更新权重和偏差。在训练模型时,我们重复调用`backpropagation`函数,直到模型收敛。最后,我们使用训练好的模型来预测新的输入数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值