神经网络正则化

正则化是防止过拟合的重要手段,包括L1和L2正则化,通过添加惩罚项限制权重大小。L1正则化产生稀疏矩阵,有助于特征选择;L2正则化则避免权重过大,保持模型稳定。此外,EarlyStopping通过在验证集损失不再下降时停止训练,Dropout随机关闭神经元以减少依赖,数据增强则通过各种变换增加数据多样性,都是有效的正则化策略。
摘要由CSDN通过智能技术生成

参考链接:https://blog.csdn.net/weixin_46006304/article/details/107445060

1.正则化概念

正则化是一种防过拟合的有效手段。

网络的输出是由权重和偏执这样的参数决定的,过拟合也发生在权重和偏执这样的参数的形态上面。权重分布意味着特征经过计算层后的分布情况。假定权重比较接近,那么被激活后数据之间依然能保持平滑分布,但是如果有的权重过大,激活后就变得非常高低起伏,引起这种过渡弯曲的分布,就会造成过拟合。因此我们要让权重尽量满足某种分布,这种分布能使输出不太卷曲。

我们通过引入一种防止过拟合的权重分布,让权重在调整减小LOSS的同时尽量的接近这种分布,这就是正则化。

2.正则化方法

1.L1 L2正则化 (参数惩罚)

在机器学习中,使用L1正则化的模型叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归),具体使用方法就是直接将L1、L2作为惩罚项添加在损失函数后,限制权重的输出,同时也可以降低模型的复杂度,使得模型在复杂度和性能之间达到平衡。具体公式如下:

 

 L1正则:表达式为α乘以权值向量w各元素绝对值和,它会将对模型特征表达影响较小的权值变为0,产生一个稀疏矩阵,实现了降维(筛选特征的目的)。

L2正则:表达式为α乘以权值向量w各元素的平方和开根,它会对网络一些大数值的参数进行惩罚,即L2正则就是使网络更倾向于使用所有输入特征,而不是严重依赖输入特征中某些小部分特征。

2. Early Stopping

提前终止可能是深度学习中最常用的正则化形式。通常不断训练之后,损失越来越小。但是到了一定之后,模型学到的过于复杂(过拟合)造成测试集开始损失较小,后来又变大。模型的w参数会越来越大,那么可以在测试集损失减小一定程度之后停止训练。

3.Dropout

在每次训练的时候,让神经元以一定的概率失活,打破神经元之间的相互依赖性,使这个神经元学习到的特征不再与固定的输入有关,而是随机的,迫使网络学习到一些更加鲁棒的特征。一般来说,选择的Dropout率为0.5,因为这样随机性最强。

4.数据增强

图像数据增强主要通过算法对图像进行转变,引入噪声等方法来增加数据的多样性。

增强的方法如下:旋转(Rotation)、翻转(Flip)、缩放(Zoom In/Out)、平移(Shift)、 随机噪声(Noise)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BP神经网络正则化是为了避免过拟合现象而进行的一种处理方法,主要有L1正则化和L2正则化两种方式。其中L1正则化的处理方法是将权重矩阵中的每个元素都乘以一个小于1的缩小因子,而L2正则化的处理方法是将权重矩阵中的每个元素都乘以一个小于1的缩小因子的平方。 以下是一个使用L2正则化的BP神经网络代码示例: ``` import numpy as np class NeuralNetwork: def __init__(self, input_dim, hidden_dim, output_dim, lambda_val): self.input_dim = input_dim self.hidden_dim = hidden_dim self.output_dim = output_dim self.lambda_val = lambda_val self.W1 = np.random.randn(self.input_dim, self.hidden_dim) / np.sqrt(self.input_dim) self.b1 = np.zeros((1, self.hidden_dim)) self.W2 = np.random.randn(self.hidden_dim, self.output_dim) / np.sqrt(self.hidden_dim) self.b2 = np.zeros((1, self.output_dim)) def sigmoid(self, x): return 1.0 / (1.0 + np.exp(-x)) def sigmoid_prime(self, x): return self.sigmoid(x) * (1 - self.sigmoid(x)) def feedforward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 exp_scores = np.exp(self.z2) probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) return probs def calculate_loss(self, X, y): num_examples = len(X) probs = self.feedforward(X) logprobs = -np.log(probs[range(num_examples), y]) data_loss = np.sum(logprobs) data_loss += self.lambda_val/2 * (np.sum(np.square(self.W1)) + np.sum(np.square(self.W2))) return 1./num_examples * data_loss def predict(self, X): probs = self.feedforward(X) return np.argmax(probs, axis=1) def backpropagation(self, X, y): num_examples = len(X) delta3 = self.feedforward(X) delta3[range(num_examples), y] -= 1 dW2 = (self.a1.T).dot(delta3) db2 = np.sum(delta3, axis=0, keepdims=True) delta2 = delta3.dot(self.W2.T) * self.sigmoid_prime(self.z1) dW1 = np.dot(X.T, delta2) db1 = np.sum(delta2, axis=0) dW2 += self.lambda_val * self.W2 dW1 += self.lambda_val * self.W1 return dW1, db1, dW2, db2 def train(self, X, y, num_passes=20000, learning_rate=0.01): for i in range(num_passes): dW1, db1, dW2, db2 = self.backpropagation(X,y) self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 if i % 1000 == 0: print("Loss after iteration %i: %f" %(i, self.calculate_loss(X,y))) ``` 以上代码中,NeuralNetwork类的构造函数中输入参数依次为输入层维度、隐藏层维度、输出层维度和正则化因子。其中,初始化权重矩阵时使用的是随机高斯分布,并且通过除以根号下输入层或隐藏层维度来缩放权重矩阵。在feedforward方法中,首先计算z值和激活函数值,然后通过softmax函数计算输出概率。在calculate_loss方法中,计算交叉熵损失和L2正则化损失之和。在backpropagation方法中,首先计算输出层误差,然后反向传播计算隐藏层误差,最后计算梯度并添加L2正则化项。在train方法中,迭代训练神经网络并打印出每一次迭代后的损失值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值