欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习课程--assign2--正规化

程序员文章站 2022-07-13 11:28:01
...

这篇文章将会简单的解释两个正则化-Dropout和Batch Normalization

Dropout

Dropout通常在forward函数中进行, 意思是按照一定的概率随机挑选 某些神经元作为0,也就是抛弃来一些参数,以提高效率。准确性也不怎么收到影响。概率P通常设为0.5
下面Dropout的具体例子

p=0.5

def train_step(x):
	#第一层layer h 
	h1 = np.maximum(0,np,dot(w1,x)+b1)
	#mask这里的意思是 随机产生h1形状的数值在0,1之间,<p的意思是小于0.5的为True,否则为False. 
	#mask就是由true和false组成的。后面跟h1相乘 false位置的数据将会全部变成0.
	mask = np.random(*h1.shape) < p   
	h1 = h1 * mask  #drop 

下面举个例子可以看到mask本质

import numpy as np 
p = 0.5 
x = np.random.randn(500, 500) + 10
mask = np.random.rand(*x.shape) < p 
mask 

深度学习课程--assign2--正规化

x*mask 

深度学习课程--assign2--正规化
所以dropout就是这样把一些神经元变成0,减少参数的训练。
值得注意的一点是:一般来说为了使得神经元的期望均值一致,我们需要做一个rescale。
方法一:在train set上做rescale。
因为使用了dropout,这一层就会有比例为p的但神经元drop掉,而每一个神经元是否被drop掉就是一次伯努利实验。这一层的dropout服从伯努利分布,而分布的期望是np, z = wx + b, 为了使得期望值不变,需要把x 除 p 使得 x变大,保证z的期望值不变。即通常,会在mask那里做上手脚,变成

mask = (np.random.rand(*x.shape) < p )/ p

方法二:
在test上乘上p值
即 x_test * p

在知乎看到一个很通俗易懂的例子,来表示rescale是怎么回事
10个人拉一个10顿车,第一次训练的时候,由于使用dropout p = 0.5,刷掉了一半的人。只剩5个人,所以每个人预期需要拉2顿。第二次预测时,由于预测是没有dropout,没有刷人,还是10个人,那么之前参数已经是变成预期每人拉两顿,那么如果不做处理的话,就会变成 10 ✖️ 2 = 20 顿 。那跟我们需要拉10顿车的有所违背。所以需要rescale预测值,把预测值 ✖️ p 变回 1 顿, 即 2 ✖️ 0.5 = 1, 所以 10个人✖️ 1 = 10 顿。

所以dropout的rescale 不是在训练时 除 p,就是在 测试时 乘 p,以达到期望值的一致。

Batch normalization-BN

之前在deep learning的训练中,对输入层中进行归一化处理,却没有对中间层的layers进行归一化处理
【那么什么叫做 归一化处理呢,就是把数据分布映射在一个确定的区间内。具体做法一般是 (X-X.mean)/np.sqrt(X.var+eps), 称为normalization】
要知道,虽然我们对输入的数据进行了归一化处理,但是输入数据经过 线性函数和**函数非线性函数的处理之后,其数据分布很可能发生改变了,而且经过多层的过滤,数据分布的变化越来越大。所以 如果我们在网络的中间也进行归一处理,是否会对网络训练有改进的作用。 答案是肯定的。

Data Augmentation

补充加上的一点 数据扩充的定义
Data Augmentation --数据扩充,是指用不同方法来增加数据的输入量。
比如旋转几度(rotate)/翻转变换(flip)/缩放(zoom)/平移(shift)/噪声扰动(add noise)
Data Augmentation是为了增加数据来训练,防止过度拟合的问题。