神经网络权重为什么不能初始化为0,而线性回归和LR可以?

线性回归基本可以是LR的简化版(论证思路上),因此本文将主要探讨两个问题:1. 为什么LR可以将权重初始化为0?2. 为什么神经网络不能将权重初始化为0?

本文参考资料:https://zhuanlan.zhihu.com/p/75879624

为什么LR可以将权重初始化为0?

在这里插入图片描述

为什么神经网络不能将参数初始化为0?

以下图为例:
在这里插入图片描述

情况1:w和b都初始化为0

在这里插入图片描述
那么由于反向传播的公式,从上图一个简单反向传播可以看出,每一轮参数更新只能从后往前更新一层的参数。这且不管,而且由于初始化参数完全相同,那么上上图中的 a 1 a_1 a1 a 2 a_2 a2的值相同,因此更新的参数值也相同,而之后的迭代也是这样,即同一层的每个节点的参数值会完全相同!这个叫做隐藏神经元的对称性。而倘若同一层每个神经元输出相同,那么这样的神经网络就没有意义了。

情况2:模型所有w初始化为0,b随机初始化

从上图可以看出,这种情况下模型同样在刚开始时每轮只能从后往前更新一层的参数,但由于b的不同,在经过足够多的轮数后所有参数还是能得到更新的。但是这种方式更新较慢,且存在梯度消失、梯度爆炸等问题,通常不会这么干。

模型所有w随机初始化,b初始化为0

从上图看得出,每一层的参数的更新与其后一层的b并没有关系,因此b的初始值不会影响BP算法的效果,所有权值和b都能得到更新。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用反向传播算法的多层神经网络BP神经网络)进行多元回归任务,并使用ReLU激活函数的Python代码示例: ```python import numpy as np class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.weights1 = np.random.randn(self.input_size, self.hidden_size) self.weights2 = np.random.randn(self.hidden_size, self.output_size) self.bias1 = np.zeros((1, self.hidden_size)) self.bias2 = np.zeros((1, self.output_size)) def relu(self, x): return np.maximum(0, x) def relu_derivative(self, x): x[x<=0] = 0 x[x>0] = 1 return x def forward(self, X): self.z1 = np.dot(X, self.weights1) + self.bias1 self.a1 = self.relu(self.z1) self.z2 = np.dot(self.a1, self.weights2) + self.bias2 self.y_hat = self.z2 return self.y_hat def backward(self, X, y, lr): delta3 = self.y_hat - y delta2 = np.dot(delta3, self.weights2.T) * self.relu_derivative(self.a1) d_weights2 = np.dot(self.a1.T, delta3) d_weights1 = np.dot(X.T, delta2) d_bias2 = np.sum(delta3, axis=0) d_bias1 = np.sum(delta2, axis=0) self.weights2 -= lr * d_weights2 self.weights1 -= lr * d_weights1 self.bias2 -= lr * d_bias2 self.bias1 -= lr * d_bias1 def train(self, X, y, epochs=1000, lr=0.1): for i in range(epochs): y_hat = self.forward(X) self.backward(X, y, lr) if i % 100 == 0: loss = np.mean(np.square(y_hat - y)) print(f'Epoch {i}, loss: {loss:.4f}') ``` 在这个示例中,我们使用了NumPy库来处理矩阵和向量运算,并实现了ReLU激活函数及其导数。在神经网络初始化中,我们随机初始化权重和偏差。在前向传播中,我们计算了隐藏层的输出,然后使用ReLU激活函数对其进行非线性变换,并计算输出层的预测值。在反向传播中,我们计算了误差并使用梯度下降更新了权重和偏差。最后,我们使用train函数对整个神经网络进行训练,并在每个epoch中输出损失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值