神经网络的正则

目录

一、深度学习的正则项是什么

二、为什么叫正则呢

三、权重的L1或L2范数是什么样子的

四、为什么L1范数使得权重向量趋向于更稀疏(即更多的零)

五、与L2范数的对比

六、为什么可以把dropout当作一个正则项


一、深度学习的正则项是什么

深度学习中的正则项是一种技术,用于防止模型过拟合训练数据。过拟合发生时,模型在训练数据上表现出色,但在未见过的数据上表现不佳。正则化通过添加一个额外的项(正则项)到损失函数中,来限制模型的复杂度。这样做可以提高模型的泛化能力,即对新数据的预测能力。常见的正则化方法包括:

  1. L1正则化(Lasso正则化):在损失函数中加入权重的绝对值之和。它倾向于创建一个稀疏的权重矩阵,即很多权重值为零。这可以用于特征选择,因为模型只会使用重要的特征。

  2. L2正则化(Ridge正则化):在损失函数中加入权重的平方和。这通常会导致权重较小但不为零。L2正则化有助于处理那些权重参数过大导致的过拟合问题。

  3. 弹性网(Elastic Net)正则化:结合了L1和L2正则化,是两者的折中方案。它在损失函数中同时加入权重的绝对值和平方和。

这些正则项通常与主要的损失函数(如均方误差或交叉熵)结合使用。例如,如果你的主要损失函数是均方误差,加入L2正则化后的新损失函数会是:

总损失 = 均方误差 + \gamma × (权重的平方和)

其中,\gamma 是正则化参数,用于平衡主要损失和正则项之间的关系。调整 \gamma 可以控制正则化的强度。较大的 \gamma 值强化正则化效果,有助于减少过拟合,但也可能导致模型欠拟合。欠拟合是指模型过于简单,不能捕捉到数据中的所有模式和关系。
 

二、为什么叫正则呢
 

"正则化"(Regularization)这个术语在深度学习和统计学中的使用源于其在数学上的意义。在数学和计算领域中,"正则"(Regular)这个词经常用来描述符合一定规则或标准的事物。在深度学习的上下文中,正则化的目的是为了使模型符合某种“规则”或“标准”,以避免过拟合,增强模型的泛化能力。

  1. 遵循简洁性原则:在深度学习中,正则化通常通过对模型的复杂度施加限制来实现。这种方法遵循了奥卡姆剃刀原则,即在所有可能的解释中,最简单的解释往往是正确的。通过限制模型的复杂性,正则化确保模型不会过度适应训练数据中的噪声或细节,而是学习到更一般、更简单的模式。

  2. 引入规则性约束:正则化通过添加正则项(比如权重的L1或L2范数)到损失函数中,实际上是给模型的学习过程引入了额外的规则或约束。这些规则鼓励模型找到满足这些额外条件的解,比如更小或更稀疏的权重,这有助于提高模型对新数据的预测能力。

  3. 保持结果的规律性:正则化帮助模型维持对数据的一般性理解,而不是过分依赖特定的数据点或特征,从而使模型在面对新数据时能够更好地泛化。这可以被看作是在模型的预测中保持一定的“规律性”。

三、权重的L1或L2范数是什么样子的

四、为什么L1范数使得权重向量趋向于更稀疏(即更多的零)

在优化过程中应用L1正则化时,通过在损失函数中添加L1范数惩罚,优化算法会尽量使模型的权重向量中的一些元素变为零。这是因为L1正则化项是权重向量中各个权重的绝对值之和,最小化这个正则化项的过程中,优化算法会倾向于让不太重要的权重趋于零。

有以下关键的两点:

  • 对不太重要的特征权重进行压缩由于L1正则化项中的绝对值操作,当某个权重 wi​ 对整体损失函数影响较小时,优化算法倾向于将其变为零,以最小化正则化项。

  • 稀疏性的产生:在优化过程中,一些权重会被压缩为零,导致最终的权重向量具有稀疏性,即包含很多零元素。

五、与L2范数的对比

与L1范数不同,L2范数(也称为Ridge正则化或欧几里得范数)对权重的平方进行惩罚。这种方式倾向于使所有权重都较小,但并不将它们压缩到零。这是因为,对于较小的权重值,其平方(L2惩罚)比绝对值(L1惩罚)小得多,因此L2范数对小权重的压缩效果较弱。

六、为什么可以把dropout当作一个正则项

将Dropout视为一种正则化技术的原因在于其对模型训练过程中的影响,特别是它如何帮助防止过拟合。虽然Dropout不是通过修改损失函数(像传统的L1或L2正则化那样)来实现其效果的,但它通过随机地“关闭”网络中的神经元来间接实现类似的目标。

以下是Dropout作为正则化技术的几个关键方面:

  1. 减少神经元的共适应性:在训练过程中,Dropout随机地丢弃(即暂时性地使其不活跃)网络中的一些神经元。这迫使网络在每次前向传播时都依赖于不同的神经元子集,减少了神经元之间的共适应性。共适应性是指当神经元过度依赖于其他特定神经元的输出时的情况。通过减少这种依赖,Dropout鼓励网络学习更加鲁棒的特征,这些特征不过分依赖于特定的神经元路径。

  2. 模拟大量的网络结构:每次应用Dropout时,实际上都相当于从原始网络中采样出一个新的“较小”的网络。由于每个训练实例都可能使用不同的神经元子集,这就相当于在训练过程中探索了大量不同的网络结构。这种方法与传统的集成学习方法类似,在集成学习中,多个模型的预测被组合起来以提高性能和泛化能力。

  3. 防止过度依赖单个特征:通过随机地关闭某些神经元,Dropout迫使网络不能依赖于任何单个特征(即输入到神经元的单个连接),因为这个特征在任何时刻都可能被关闭。这迫使网络学习到更加分散和冗余的特征表示,从而提高其泛化能力。

  4. 平衡网络的活性:在训练期间,Dropout会减少网络某些部分的活性。在测试时,为了补偿这种减少,通常会通过调整剩余活跃神经元的输出来进行缩放。这种调整有助于平衡整个网络的活性,防止过拟合。

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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方法中,迭代训练神经网络并打印出每一次迭代后的损失值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值