深度学习---之bias

reference:https://www.zhihu.com/question/68247574
 

 

实际上,bias相当于多了一个参数。在增加网络少量拟合能力的情况下,bias和其它普通权值相比无论前向还是后向,计算上都要简单,因为只需要一次加法。同时,bias与其它权值的区别在于,其对于输出的影响与输入无关,能够使网络的输出进行整体地调整,算是另一维自由度吧。放在二维上,权值相当于直线的斜率,而bias相当于截距,这二者都是直线参数的一部分,并没有必要区别对待。

因此,通常网络都会使用bias,但并不是必须,对于网络性能的影响并不是很显著(除非网络太小导致拟合能力太差)。同时,在有些场合里,bias的使用也没有意义,比如在batch normalization层之前的层就没必要加,因为会被归一化抵消掉。

简单考虑一个只有一输入一输出的简单网络:

假设用Sigmoid 激活函数,如果没有bias,则 Y_{out}= \sigma(X_{in}\cdot W) 

先看一下在不同W下的情况:

 

假如输入 X_{in} 的输入分布如图中蓝点(A集合)和红点(B集合)所示(在x轴上的分布),要通过 Y_{out}(>0.5, or <0.5) 来判断输入时在A内还是B内,很显然,要提高准确性,sigmoid函数中的W系数需要学的很大,才能保证尽可能的判断准确。

但是如果一个测试样本在图中绿点所在的位置呢,很明显我们可以将绿点判为红点所在的B集合,但是通过训练学到的W是不能正确判断的。这个时候似乎让sigmoid函数变得更陡没法解决了。

但是如果加一个bias呢。


像这样,w(sigmoid中x的系数)不用学的很大就可以提高学习的准确率,网络就能够非常灵活的fit A,B 的分布,可以准确的判断绿点所属的集合。

简单点说,就是加上bias能更灵活的fit输入的分布。

转载:https://blog.youkuaiyun.com/zxrttcsdn/article/details/79845706

### BP算法的详细原理 反向传播(Backpropagation, BP)算法是一种用于训练人工神经网络的核心方法。该算法通过计算每网络的误差,并将这些误差反向传播至前一,从而调整权重和偏置项,使网络的预测更加接近目标值[^1]。 #### 错误函数的选择 为了衡量模型输出与实际标签之间的差异,BP算法依赖于错误函数(Loss Function),常见的选择包括均方误差(Mean Squared Error, MSE)、交叉熵损失(Cross-Entropy Loss)等。错误函数的选择直接影响梯度下降的效果,因此需根据具体任务选取合适的损失函数[^2]。 #### 正向传播过程 在正向传播阶段,输入数据依次经过各隐藏直至到达输出,在此期间每一都会执行加权求和操作并应用激活函数完成非线性转换: ```python def forward_propagation(X, weights, biases, activation_func): layers_output = [] current_input = X for w, b in zip(weights, biases): z = np.dot(current_input, w) + b a = activation_func(z) layers_output.append(a) current_input = a return layers_output[-1], layers_output[:-1] ``` 此处 `activation_func` 是指代任意选定之激活功能比如 Sigmoid 或者 ReLU 函数[^4]。 #### 反向传播机制 当得到最终输出后,依据所选损失函数计算总误差 E 。接着利用链式法则沿着先前构建好的路径回溯更新每一个参数直到达到全局最小点或者满足停止条件为止: 设第 l 的 权重矩阵 W(l), 偏差矢量 B(l), 输入 A(l−1), 输出 Y^(l)=A(l), 则 对应 的 梯度 计算 如下 所述 : ∂E/∂W(l)=(∂E/∂Y^(l))*(∂Y^(l)/∂Z(l))*(∂Z(l)/∂W(l))=δ(l)*A(l−1)^T 其中 δ(l):=(∂E/∂Y^(l))*(∂Y^(l)/∂Z(l)) 同理可得 ∂E/∂B(l) 最后按照预先设定的学习速率 η 更新 参数 : W_new=W_old −η * (∂E / ∂W ) 同样适用于偏差项 B 。 以上即为标准形式下的单步梯度下降更新规则 [^3]. ### Python 实现示例 以下是一个简单的两全连接神经网络及其对应的BP算法实现: ```python import numpy as np class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.weights_1 = np.random.randn(input_size, hidden_size) self.bias_1 = np.zeros((1, hidden_size)) self.weights_2 = np.random.randn(hidden_size, output_size) self.bias_2 = np.zeros((1, output_size)) @staticmethod def sigmoid(x): return 1/(1+np.exp(-x)) @staticmethod def derivative_sigmoid(x): sigm = NeuralNetwork.sigmoid(x) return sigm*(1-sigm) def feedforward(self, inputs): self.z_hidden = np.dot(inputs, self.weights_1)+self.bias_1 self.a_hidden = NeuralNetwork.sigmoid(self.z_hidden) self.z_out = np.dot(self.a_hidden, self.weights_2)+self.bias_2 out = NeuralNetwork.sigmoid(self.z_out) return out def backpropagate(self, x_train, y_train, learning_rate): out = self.feedforward(x_train) error_out = (out-y_train)*NeuralNetwork.derivative_sigmoid(self.z_out) delta_w_out = np.dot(self.a_hidden.T,error_out) delta_b_out = np.sum(error_out,axis=0,keepdims=True) error_hidden = np.dot(error_out,self.weights_2.T)*NeuralNetwork.derivative_sigmoid(self.z_hidden) delta_w_hidden = np.dot(x_train.T,error_hidden) delta_b_hidden = np.sum(error_hidden,axis=0,keepdims=True) # Update Weights and Biases self.weights_2 -=learning_rate*delta_w_out self.bias_2 -=learning_rate*delta_b_out self.weights_1 -=learning_rate*delta_w_hidden self.bias_1 -=learning_rate*delta_b_hidden ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值