BP反向传播详细推导

BP神经网络是反向传播算法,他是一个非线性的前馈神经网络。由于网络参数需要更新,反向指的是参数梯度的反向传播,输入向前传播。非线性是因为神经元的激活函数是一个非线性可导的sigmoid函数。先来看看神经元的激活函数,即sigmoid函数:


                                                                    {\rm{f(x) = sigmoid}}(x) = \frac{1}{​{1 + {e^{ - x}}}}

该函数的特点是:

其图像为:

    Sigmoid函数把可能在较大范围内变化的输入值挤压到(0,1)的范围内,并且该函数是可导的。当然,sigmoid函数只是神经元激活函数的一种,但却是最常用的一种激活函数。 

   首先,我们来看看BP算法的真面目。给定一个训练集(含有m个样本)。

    D = \{ ({x_1},{y_x}),({x_2},{y_2}),...,({x_m},{y_m})\},其中{x_i} \in {​{\rm{R}}^d}表示输入由 d 个属性描述(特征维度为d),{y_i} \in {R^l}表示输出为 l 维实值向量(l 个类别)。为了便于讨论,下图给出了一个拥有 d 个输入神经元,l 个输出神经元和 q 个隐藏神经元的多层前馈神经网络。该网络包含一个输出层,一个隐藏层,一个输出层。其中隐藏层的阈值是 \gamma ,输出层的阈值是 \theta

 现在设定符号标准:

{\nu _{ih}}:输入层第i个神经元和隐藏层第h个神经元之间连接的权值

{\omega _{hj}}:隐藏层第h个神经元和输出层第j个神经元之间连接的权值

{\alpha _h} = \sum\limits_{i = 1}^d {​{\nu _{ih}}{x_{\rm{i}}}}:隐藏层第h个神经元的输入,{x_{\rm{i}}} 是输入层的第i个输入

{\beta _j} = \sum\limits_{h = 1}^{\rm{q}} {​{\omega _{hj}}{b_h}}:输出层第j个神经元的输入,{b_h} 是输出层的输入,也就是隐藏层的输出

{b_h} = f({\alpha _h} - {\gamma _h}):隐藏层第h个神经元的输出,即输出层的第h个输入,{\gamma _h} 是隐藏层第h个神经元的阈值(偏置)

\mathop {y_j^k}\limits^\^ = f({\beta _j} - {\theta _j}):第k个输入神经元的网络输出\mathop {​{y_k}}\limits^\^ = (\mathop {y_1^k}\limits^\^ ,\mathop {y_2^k}\limits^\^ ,...,\mathop {y_l^k}\limits^\^ ){\theta _j}是输出层的阈值(偏置)

{y_j}:输出层第j个神经元的理想输出

 

    根据神经网路结构图可以看出网络中要确定的变量个数是 (d + l + 1)q + l 个,其中输入层到隐藏层有d*q个权值变量,隐藏层到输出层有q*l个权值变量,还包括q个隐藏层神经元阈值和 l 个输出层神经元阈值。

    则网络在({x_k},{y_k})上的均方误差为:{E_k} = \frac{1}{2}\sum\limits_{j = 1}^l {​{​{(\mathop {y_j^k}\limits^\^ - y_j^k)}^2}}

    BP神经网络的思想是根据均方误差,来调整每条连接线的权值和阈值(偏置)。从而使均方误差达到一个可以接受的值。

    阈值是用来衡量是否可以结束神经网络算法的一个条件(当然还有其他的结束条件,达到一定的迭代次数,误差降低到某一程度。)

    下面进行神经网络算法的推倒过程:(采用随机梯度下降法)

    第k个输出样本在输出层的均方误差为:{E_k} = \frac{1}{2}\sum\limits_{j = 1}^l {​{​{(\mathop {y_j^k}\limits^\^ - y_j^k)}^2}}

    现在以隐藏层到输出层的权值和阈值(偏置)调整方案为例:

 

    定义:\Delta {\omega _{hj}} = - \eta \frac{​{\partial {E_k}}}{​{\partial {\omega _{hj}}}} ,即用梯度下降法来调整权值的变化,其中负号表示梯度下降的方向,\eta表示学习效率(或叫做调整步长),一般取(0,1)。

    因为:  {\omega _{hj}}对输出层的输入{\beta _{\rm{j}}}和输出层的输出\mathop {y_j^k}\limits^\^都有影响,

                                     所以:\frac{​{\partial {E_k}}}{​{\partial {\omega _{hj}}}} = \frac{​{\partial {E_k}}}{​{\partial \mathop {y_j^k}\limits^\^ }}.\frac{​{\partial \mathop {​{\rm{y}}_j^k}\limits^\^ }}{​{\partial {\beta _j}}}.\frac{​{\partial {\beta _j}}}{​{\partial {\omega _{hj}}}}

    而 \frac{​{\partial {\beta _j}}}{​{\partial {\omega _{hj}}}} = {b_h}\frac{​{\partial \mathop {​{\rm{y}}_j^k}\limits^\^ }}{​{\partial {\beta _j}}} = \mathop {​{\rm{y}}_j^k}\limits^\^ (1 - \mathop {​{\rm{y}}_j^k}\limits^\^ )。因为{\beta _j}是经过输出层神经元激活函数后得到输出\mathop {​{\rm{y}}_j^k}\limits^\^

    \frac{​{\partial {E_k}}}{​{\partial \mathop {y_j^k}\limits^\^ }} = \frac{​{\partial (\frac{1}{2}\sum\limits_{j = 1}^l {​{​{(\mathop {y_j^k}\limits^\^ - y_j^k)}^2}} )}}{​{\partial \mathop {y_j^k}\limits^\^ }} = (\mathop {y_j^k}\limits^\^ - y_j^k)带入上述公式得

                                                       \frac{​{\partial {E_k}}}{​{\partial {\omega _{hj}}}} = (\mathop {y_j^k}\limits^\^ - y_j^k)\mathop {​{\rm{y}}_j^k}\limits^\^ (1 - \mathop {​{\rm{y}}_j^k}\limits^\^ ){b_b}

    令:{g_j} = - \frac{​{\partial {E_k}}}{​{\partial \mathop {y_j^k}\limits^\^ }}.\frac{​{\partial \mathop {​{\rm{y}}_j^k}\limits^\^ }}{​{\partial {\beta _j}}} = - (\mathop {y_j^k}\limits^\^ - y_j^k)\mathop {​{\rm{y}}_j^k}\limits^\^ (1 - \mathop {​{\rm{y}}_j^k}\limits^\^ )

    则: \Delta \omega = \frac{​{\partial {E_k}}}{​{\partial {\omega _{hj}}}} = \eta {g_j}{b_n}     ——》这是 \omega 的调整方法:

    现在推倒  \theta  的调整方法:

    \Delta {\theta _j} = - \eta \frac{​{\partial {E_{\rm{k}}}}}{​{\partial {\theta _j}}} = - \eta \frac{​{\partial (\frac{1}{2}\sum\limits_{j = 1}^l {​{​{(\mathop {y_j^k}\limits^\^ - y_j^k)}^2}} )}}{​{\partial {\theta _j}}} = - \eta \frac{​{(\mathop {y_j^k}\limits^\^ - y_j^k)\partial f({\beta _l} - {\theta _j})}}{​{\partial {\theta _j}}} = - \eta ( - \mathop {y_j^k}\limits^\^ (\mathop {y_j^k}\limits^\^ - y_j^k)(1 - \mathop {y_j^k}\limits^\^ )) = - \eta {g_j}

    到此,权重和阈值的调整方法都已经知道了:  

    现在我们再来推倒一下\Delta {\nu _{ih}},因为\Delta {\nu _{ih}}的影响路径:\Delta {\nu _{ih}} \to {\alpha _h} \to {b_h}

    \Delta {\nu _{ih}} = - \eta \frac{​{\partial {E_k}}}{​{\partial {\nu _{ih}}}} = - \eta \frac{​{\partial {E_k}}}{​{\partial {b_h}}}.\frac{​{\partial {b_h}}}{​{\partial {\alpha _h}}}.\frac{​{\partial {\alpha _h}}}{​{\partial {\nu _{ih}}}}

    其中:\frac{​{\partial {\alpha _h}}}{​{\partial {\nu _{ih}}}} = {x_i}

    令:

 

    注意第二个等号的理解:即第k个样本在输出层的误差是输出层的 l 神经元的误差和,那么 {b_h}, 是隐藏层的第h个输出,即输出层的第h个输入(还没乘以权值),这个输入对输出层的每一个神经元都有影响,所以有一个求和的过程。 

    所以:\Delta {\nu _{ih}} = \eta {e_h}{x_i}

    同理可得:\Delta \gamma = - \eta {e_h}

    所谓误差的反向传播(我的理解):根据公式即可发现,每一层权值和偏置的调整,都跟其直接相连接的下一次输出值的误差有关。即,输出的结果,对于权值和偏置的调整是有影响的。这也是,BP模型权值和偏置调整公式的定义。

现在的几个问题:

1,梯度的几何意义?

2,\Delta \omega的变化,是正数?是负数?正数代表的含义?负数代表的含义?

3,随机梯度下降和标准梯度下降?

4,解决过拟合问题?

5, \eta  的大小怎么定?

问题1:

函数在某一点的梯度,垂直于该点的等值面,指向函数增大的方向。 

问题2:\Delta \omega就是梯度乘上一个因子

问题3:标准梯度下降和随机梯度下降的关键区别是:

    (1) 标准梯度下降是在权值更新前对所有样本汇总误差,而随机梯度下降的权值是通过考察每一个训练样本实例来更新。

    (2) 标准梯度下降因为要对所有样本汇总误差,计算量更大。这样,每一次权值更新比随机梯度下降所用的步长(\eta)更大

    (3) 如果误差E(\omega )有多个极小值,随机梯度下降可能避免陷入这些局部极小值。因为采用不同的\Delta {E_k}(\omega )而不是\Delta E(\omega )

    (4) 使用随机梯度下降,可以最小化均方误差。

问题4:迭代次数太少,误差过大,发生欠拟合。迭代次数过多,在训练样本上,误差很小。出现过拟合。权值衰减法。为算法提供一套验证数据集。

问题5:\eta 一般被设定为一个很小的数值,有时候会使其随着权调整次数的增加而衰减。(放慢学习速率,减小步长)。因为在迭代一定次数过后,\eta过大,可能会使梯度下降跳过全局最小值。

 

 

 

反向传播算法(Backpropagation)是一种用于训练神经网络的常见优化算法。它通过计算损失函数相对于每个参数的梯度,并使用梯度下降来更新参数。下面我将给出反向传播算法公式推导及示例代码。 1. 反向传播算法公式推导: 首先,定义神经网络的损失函数为L,该函数是由网络输出和真实标签之间的差异计算得出。假设神经网络有多个隐藏层,每个隐藏层的参数为W和b。 1.1 前向传播: 首先,我们通过前向传播计算每一层的输出值。假设输入为x,第l层的输出为a[l],则有: a = x z[l] = W[l] * a[l-1] + b[l] a[l] = g(z[l]) 其中,g()是激活函数。 1.2 反向传播: 接下来,我们需要计算损失函数相对于每个参数的梯度,然后使用梯度下降更新参数。假设我们有L层神经网络,则有以下公式: 输出层的梯度: dz[L] = dL / da[L] * g'(z[L]) 隐藏层的梯度: dz[l] = (W[l+1]的转置 * dz[l+1]) * g'(z[l]) 参数梯度: dW[l] = dz[l] * a[l-1的转置] db[l] = dz[l] 更新参数: W[l] = W[l] - learning_rate * dW[l] b[l] = b[l] - learning_rate * db[l] 其中,dL / da[L]是损失函数对输出层输出的导数,g'()是激活函数的导数。 2. 反向传播算法示例代码: 下面是一个使用反向传播算法进行训练的示例代码: ```python # 假设网络有三个隐藏层 hidden_layers = [10, 20, 30] output_size = 2 # 初始化参数 parameters = {} layers_dims = [input_size] + hidden_layers + [output_size] L = len(layers_dims) - 1 for l in range(1, L + 1): parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l-1]) * 0.01 parameters['b' + str(l)] = np.zeros((layers_dims[l], 1)) # 前向传播 def forward_propagation(X, parameters): caches = [] A = X for l in range(1, L): Z = np.dot(parameters['W' + str(l)], A) + parameters['b' + str(l)] A = sigmoid(Z) cache = (Z, A) caches.append(cache) Z = np.dot(parameters['W' + str(L)], A) + parameters['b' + str(L)] AL = softmax(Z) cache = (Z, AL) caches.append(cache) return AL, caches # 反向传播 def backward_propagation(AL, Y, caches): grads = {} dZ = AL - Y m = AL.shape[1] grads['dW' + str(L)] = 1/m * np.dot(dZ, caches[-1][1].T) grads['db' + str(L)] = 1/m * np.sum(dZ, axis=1, keepdims=True) for l in reversed(range(1, L)): dA_prev = np.dot(parameters['W' + str(l+1)].T, dZ) dZ = dA_prev * sigmoid_derivative(caches[l-1][0]) grads['dW' + str(l)] = 1/m * np.dot(dZ, caches[l-1][1].T) grads['db' + str(l)] = 1/m * np.sum(dZ, axis=1, keepdims=True) return grads # 参数更新 def update_parameters(parameters, grads, learning_rate): for l in range(1, L+1): parameters['W' + str(l)] -= learning_rate * grads['dW' + str(l)] parameters['b' + str(l)] -= learning_rate * grads['db' + str(l)] return parameters # 训练模型 def train_model(X, Y, learning_rate, num_iterations): for i in range(num_iterations): AL, caches = forward_propagation(X, parameters) cost = compute_cost(AL, Y) grads = backward_propagation(AL, Y, caches) parameters = update_parameters(parameters, grads, learning_rate) if i % 100 == 0: print("Cost after iteration {}: {}".format(i, cost)) return parameters # 使用示例 parameters = train_model(X_train, Y_train, learning_rate=0.01, num_iterations=1000) ``` 这是一个简单的反向传播算法示例代码,其中的sigmoid()、softmax()、sigmoid_derivative()和compute_cost()函数需要根据具体情况自行实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值