正则化
这篇博客主要说下机器学习中的正则化技术,以及在tensoflow框架下设计正则化操作的说明,下面直入主题。
正则化主要解决过拟合问题,设假设函数为:
也就是说x的次数越高,网络的拟合程度越好,但相应的预测能力可能变差。如果发生拟合问题,解决方法1、PCA:丢弃一些不能帮助我们正确预测的特征。2、正则化:保留所有特征,但是减小参数的大小。
假设损失函数为
i为每个样本的标记,m为样本个数。我们要做的是在一定程度上减少参数θ的值,这就是正则化操作。因此便要修改损失函数为:
但是在一些网络,如CNN,RNN中有非常多的特征,我们并不知道要惩罚哪些参数,所以我们会惩罚所有的参数,公式变为:
下面我们把正则化推广到逻辑回归中,公式为:
下面用代码表示这个函数以及正则化操作:
// An highlighted block
import numpy as np
def LossReg(theta,x,y,L)
theta=np.matrix(theta)
x=np.matrix(x)
y=np.matrix(y)
one=np.multiply(-y,np.log(sigmiod(x*theta.T)))
two=np.multiply((1-y),np.log(1-sigmiod(x*theta.T)))
reg=L/(2*len(x))*np.sum(np.power(theta[:,1:theta.shape[1]],2))
return np.sum(one-two)/len(x)+reg
在深度学习中,使用tensorflow的正则化表示也设计的也非常友好,使用2-3行代码就可以实现:
为了方便起见使用tflearn库设计一个卷积层如下:
x=tflearn.layers.conv.conv_2d(input,16,(3,3),strides=1,activation='relu',weight_decay=1e-5,regularizer='L2')
说明:weight_decay为权重衰减,对应公式中的λ、程序中的L。regularize='L2'表示使用的L2正则。
loss_zong=loss+tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))*0.1
说明:loss为神经网络本身需要的函数。
tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES),把需要惩罚的参数(REGULARIZATION_LOSSES),
通过tf.get_collection()函数放到一个集合当中,再使用tf.add_n函数累加起来。计算时自然会通过
weight_decay权重衰减系数去计算。