预处理流程

数据预处理的3种形式:

1) 除去均值法
即减去均值,既可以每一列特征去考虑,也可以全部数据放在一起考虑。或者说从RGB3个通道去考虑
即:
X=np.mean(X,axis=0)
X=np.mean(X)
2)归一化
X=np.std(X,axis=0)
或者将数值固定在-1到1之间。但由于图像数据已经位于0~255间,归一化不是必需的
3)PCA和白化
PCA的流程:
X=np.mean(X,axis=0)
cov=np.dot(XXT)
U,S,V=np.linalg.svd(cov)
Xrot=np.dot(X,U)
Xrot_reduced=np.dot(X,U[:,:100]) 维度:N*100
白化:
Xwhite=Xrot/np.sqrt(S+1e5)
白化的一个缺点是为了防止分母中出现0,人为增加了噪声。因为对每个不同维度,增加了同样的噪声数据(1e-5)这显然不合理,一个解决办法是将1e-5用更大的值去替代。

  • 但是PCA和白化在卷积神经网络中很少使用
  • 值得注意的是,特征预处理只在训练集上使用,测试集上应减去训练集的均值

权重的初始化:

1)权重不能全部初始化为0,全部初始化为0,那么每一个隐含单元的梯度都是一样的,失去了神经网络的优势
2)可以用 N(0,1) 的高斯分布随机初始化权重,但要乘以0.01,防止权重过大,这样会导致梯度爆炸。但是也不能过小,这样子梯度在网络中流动会很小
W1=np.random.randn(D,H)0.01
3)将权重的方差变小。方法2)的一个缺点是随着数据量的增加,方差也会随之增加,一种解决思路是将数据乘以 1/sqrt(n) 其中n是输入样本的数量
W1=np.random.randn(D,H)/sqrt(n) (Xavier initialization)
但有文献证明对于Relu激活函数 W1=np.random.randn(D,H)sqrt(2/n) 效果会更好(Xavier/2 initialization)
4)稀疏初始化。同样把权重全部初始化为0,但为了打破对称性,将一些神经元随机连接
5)对于bias的初始化,一种做法是全部设为0.01,但不能保证有提升,一般设置0就可以了,依赖权重来打破对称性。
6)在实际工程中 W1=np.random.randn(D,H)sqrt(2/n) 使用来初始化
7)Batch Normalization。使用在min-batch GD,对1个batch的数据进行操作:
这里写图片描述
值得注意的是,这个操作位于全连接层之后,进入非线性函数之前。而在测试集上BN层并不适用batch mean/std,而是给定一个经验上的固定数值(可以在训练时取平均值)
优势是:
a、改善了梯度在网络中的流动
b、允许有更大的学习速率
c、减少了对初始化较强的依赖
d、或许能够免去dropout的必要

regulation

1、L1、L2、elastic net
2、Max norm constraints,即将权重的2范数设定在一定的范围,这样即使学习速率很高也不会出现梯度爆炸的发生,
3、dropout。该方法比前两种有效地多。其思路也很简单,即假定一个神经元是否激活的概率P或者直接为0;之所以要除以P是为了保证训练阶段样本的均值和测试时的相同。运用dropout的期望P*X+(1-P)*0。所以除以P来保证期望仍是X。

 """ 
Inverted Dropout: Recommended implementation example.
We drop and scale at train time and don't do anything at test time.
"""

p = 0.5 # probability of keeping a unit active. higher = less dropout

def train_step(X):
  # forward pass for example 3-layer neural network
  H1 = np.maximum(0, np.dot(W1, X) + b1)
  U1 = (np.random.rand(*H1.shape) < p) / p # first dropout mask. Notice /p!
  H1 *= U1 # drop!
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  U2 = (np.random.rand(*H2.shape) < p) / p # second dropout mask. Notice /p!
  H2 *= U2 # drop!
  out = np.dot(W3, H2) + b3

  # backward pass: compute gradients... (not shown)
  # perform parameter update... (not shown)

def predict(X):
  # ensembled forward pass
  H1 = np.maximum(0, np.dot(W1, X) + b1) # no scaling necessary
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  out = np.dot(W3, H2) + b3

4、bias regulation。一般来说bias不用初始化,因为它与数据的交互很少。但现实中,对bias初始化并不会带来很差的效果,因为bias的数量相对权重来说还是很少的。所以对模型的影响有限。
* 实际工程中,利用L2 regulation,同时在每一个神经元上利用dropout,p的选取可以调参获得。
* regression的问题。regression通常使用的是平方误差。
问题是:
a、平方误差相比于softmax的损失函数更难优化,因为回归问题要求获得一个具体的精确数值。而对于softmax来说这个数值要求不是那么高。
b、平方误差并不健壮。尤其是对于异常值,因为异常值可能会带来很大的梯度。
c、当面对回归问题时,看转化成分类问题是否能够完成,如果可以转化为分类问题求解。当不能够转化时,用平方误差要很小心,因为平方误差很脆弱,使用dropout可能会是很差的选择。

总结

1、用去均值化去处理数据,并将数据固定在范围[-1,1]
2、利用 W=np.random.randn(D,H)(sqrt(2/n)) 来初始化权重
3、利用L2 Regulation和dropout来防止过拟合
4、使用batch nomalisation来归一化batch data
5、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值