正则化regularization

欠拟合与过拟合

欠拟合:在训练集上准确率较小
过拟合:表现为在训练集上准确率高,训练误差较小。而在测试集上准确率与训练集上的表现相差较远,测试误差较大。
在这里插入图片描述
Bias-Variance:

在这里插入图片描述

L2 正则化(L2 regularization)

损失函数中加L2正则化项后:
l ′ ( W ) = L ( W ) + α ∑ i w i 2 l^{'}(W)=L(W)+\alpha\sum_{i}{w_{i}^{2}} l(W)=L(W)+αiwi2
加入L2正则化惩罚项后,权重整体趋向于减小。

dropout

dropout是在深度学习中常用的一种正则化方法。简单的说就是在隐藏层以一定的概率使神经元失活,相等于特征得到随机组合,以此来减小模型复杂度,增强泛化能力。
在这里插入图片描述
注意:
1、前向传播中,在隐藏层以一定的概率使个别神经元失活
2、前向传播中,要对没有失活的数据进行scale
3、反向传播中,在前向阶段失活的神经元依然保持失活
4、test 和应用阶段,不需要进行 dropout

其他防止过拟合的方法
1、增加训练数据(如图像数据可以通过,旋转、裁剪缩放等方法扩充数据)
2、增加噪声
3、减小模型复杂度

代码示例

```python
# 以一个2层的神经网络为例
# 一个前向传播的函数
def forward_propagation_with_dropout(X, parameters, keep_prob =0.5):
	"""
	一个简单的 droupout 示例,前向传播
	1、在隐藏层,以一定的概率使某些神经元失活
	2、对其他,未失活的数字进行 scale
	"""
	# 获取参数
	W1 = parameters["W1"]
    b1 = parameters["b1"]
    W2 = parameters["W2"]
    b2 = parameters["b2"]
    W3 = parameters["W3"]
    b3 = parameters["b3"]
    
    # 前向计算
    Z1 = np.dot(W1, X) + b1
    A1 = relu(Z1)

	D1 = np.random.rand(A2.shape[0],A2.shape[1])                                       
    D1 = D2<keep_prob                                
    A1 = A2*D2      # 使某些神经元失活                                         
    A1 = A2/keep_prob # 对其余的值进行scale
    
	Z2 = np.dot(W2, A1) + b2
    A2 = relu(Z2)

    D2 = np.random.rand(A2.shape[0],A2.shape[1])                                       
    D2 = D2<keep_prob                                
    A2 = A2*D2      # 使某些神经元失活                                         
    A2 = A2/keep_prob # 对其余的值进行scale

	Z3 = np.dot(W3, A2) + b3
    A3 = sigmoid(Z3)

	cache = (Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3)
	return A3, cache

# 反向传播
# 对于,前向传播中 失活的神经元,在反向传播的过程中依然失活
def backward_propagation_with_dropout(X,Y,cache,keep_prob):
	"""
	反向传播,链式法则
	前向传播中 失活的神经元,在反向传播的过程中依然失活
	"""
	 m = X.shape[1]
    (Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3) = cache
    
    dZ3 = A3 - Y
    dW3 = 1./m * np.dot(dZ3, A2.T)
    db3 = 1./m * np.sum(dZ3, axis=1, keepdims = True)
    
    dA2 = np.dot(W3.T, dZ3)
    dA2 = dA2*D2              
    dA2 = dA2/keep_prob              
    dZ2 = np.multiply(dA2, np.int64(A2 > 0))
    dW2 = 1./m * np.dot(dZ2, A1.T)
    db2 = 1./m * np.sum(dZ2, axis=1, keepdims = True)
    
    dA1 = np.dot(W2.T, dZ2)
    dA1 = dA1*D1              
    dA1 = dA1/keep_prob             
    dZ1 = np.multiply(dA1, np.int64(A1 > 0))
    dW1 = 1./m * np.dot(dZ1, X.T)
    db1 = 1./m * np.sum(dZ1, axis=1, keepdims = True)
    
    gradients = {"dZ3": dZ3, "dW3": dW3, "db3": db3,"dA2": dA2,
                 "dZ2": dZ2, "dW2": dW2, "db2": db2, "dA1": dA1, 
                 "dZ1": dZ1, "dW1": dW1, "db1": db1}
    
    return gradients

参考

Dropout: A Simple Way to Prevent Neural Networks from Overfitting
dropout
youtube: Machine Learning Fundamentals: Bias and Variance
wikipedia: regularization

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值