MLP组成结构,计算过程,为何要使用激活函数,以及权重过大/过小导致的极端梯度

 

反向传播的一般推导过程:

假设我们有一个网络的输出为 y,真实标签为 t,损失函数为 L(y, t)。我们希望计算损失函数对于网络中某个参数 W 的梯度 ∂L/∂W。

使用链式法则,我们可以将梯度 ∂L/∂W 分解为多个小步骤的梯度相乘:

∂L/∂W = ∂L/∂y * ∂y/∂z * ∂z/∂W

其中,z 是连接到参数 W 的输入,y 是经过激活函数后的输出。

依次计算上述三个项的梯度:

  • ∂L/∂y:根据损失函数的形式计算损失相对于预测输出 y 的梯度。
  • ∂y/∂z:根据激活函数的导数计算输出 y 相对于输入 z 的梯度。
  • ∂z/∂W:根据网络结构计算输入 z 相对于参数 W 的梯度。

将这些项相乘,就可以得到参数 W 相对于损失函数的梯度 ∂L/∂W。

反向传播会沿着网络层层传递,计算每个参数的梯度。这些梯度将用于更新参数,以便最小化损失函数。

需要注意的是,不同的激活函数、损失函数和网络结构会导致不同的梯度计算方法。上述是一个简化的示例,实际中会更加复杂,但基本思想是通过链式法则将梯度从输出层向输入层传播,计算参数的梯度以进行优化。

     1.梯度爆炸: 当权重值过大时,反向传播计算梯度时会涉及连乘操作,导致梯度值变得            非常大。这会导致权重更新的步幅过大,从而导致模型在训练中发散,无法收敛到合              适的解。梯度爆炸可能导致数值不稳定的情况,甚至使模型的权重变得无限大,从而失          去可用性。

      2.梯度消失: 当权重值过小时,反向传播计算梯度时会涉及连乘操作,导致梯度值变得             非常小。这会使梯度在网络的较早层中逐渐减小,从而导致较早层的权重更新变得微             不足道,甚至趋近于零。这会导致模型在训练过程中无法对较早层进行有效的更新,             影响模型的训练效果,甚至导致模型无法学习到复杂的特征。

这些问题都会对模型的训练和性能产生严重影响。为了解决这些问题,常见的方法包括:

  • 使用权重初始化方法,如 Xavier 初始化或 He 初始化,以确保权重在适当的范围内。
  • 使用梯度裁剪技术,限制梯度的范围,防止梯度爆炸。
  • 使用合适的激活函数,例如 ReLU 激活函数可以一定程度上缓解梯度消失问题。
  • 使用批归一化等正则化技术,帮助稳定模型训练过程。

这些方法有助于防止梯度爆炸和梯度消失,从而使神经网络的训练过程更加稳定和可靠。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是numpy实现mlp的反向传播代码: ``` import numpy as np def relu(x): return np.maximum(x, 0) def softmax(x): exp_x = np.exp(x - np.max(x, axis=1, keepdims=True)) return exp_x / np.sum(exp_x, axis=1, keepdims=True) def cross_entropy(y_pred, y_true): return -np.sum(y_true * np.log(y_pred)) / len(y_pred) def l2_regularization(lmbda, w1, w2): return lmbda / 2 * (np.sum(np.square(w1)) + np.sum(np.square(w2))) def mlp_backward(X, y, w1, b1, w2, b2, learning_rate, lmbda): # forward pass z1 = np.dot(X, w1) + b1 a1 = relu(z1) z2 = np.dot(a1, w2) + b2 a2 = softmax(z2) # compute gradients delta2 = a2 - y delta1 = np.dot(delta2, w2.T) * (z1 > 0) dw2 = np.dot(a1.T, delta2) db2 = np.sum(delta2, axis=0, keepdims=True) dw1 = np.dot(X.T, delta1) db1 = np.sum(delta1, axis=0) # add L2 regularization dw2 += lmbda * w2 dw1 += lmbda * w1 # update weights and biases w2 -= learning_rate * dw2 b2 -= learning_rate * db2 w1 -= learning_rate * dw1 b1 -= learning_rate * db1 # compute loss loss = cross_entropy(a2, y) + l2_regularization(lmbda, w1, w2) return w1, b1, w2, b2, loss ``` 其中,X为输入数据,y为标签,w1和w2为权重矩阵,b1和b2为偏置向量,learning_rate为学习率,lmbda为L2正则化系数。在forward pass中,首先计算第一层的加权和z1和激活函数a1,然后计算第二层的加权和z2和激活函数a2。在backward pass中,首先计算输出层的误差项delta2和隐藏层的误差项delta1,然后根据误差项计算梯度dw2、db2、dw1和db1。最后,加上L2正则化项,更新权重矩阵和偏置向量,并计算损失函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值