模型选择的典型方法是正则化(Regularization),正则化是结构风险最小化策略的视线,是在经验风险上加一个正则化项(regularizer)或罚项(penalty term),正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。 —————《统计学习方法》李航
L0正则化
L0范数是指向量中非0的元素的个数,很难优化求解(NP难问题)
L1正则化
L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。
L1正则化根据权重的绝对值的总和来惩罚权重。在依赖稀疏特征的模型中,L1 正则化有助于使不相关或几乎不相关的特征的权重正好为 0,从而将这些特征从模型中移除,有助于减小模型。但如果正则化率过高,该模型便不能收敛,损失也会很高。
L2正则化
L2正则化根据权重的平方和来惩罚权重。L2 正则化有助于使离群值(具有较大正值或较小负值)权重接近于 0,但又不正好为 0。在线性模型中,L2 正则化始终可以改进泛化,有助于防止过拟合。
工程化
正则化代码
正则化会降低训练速度
# FtrlOptimizer 是一种使用L1正则化的方法,能比标准梯度下降法得到更好结果
my_optimizer = tf.train.FtrlOptimizer(learning_rate=learning_rate, **l1_regularization_strength=regularization_strength**)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
计算模型大小
#该函数深入使用了 Estimator API
def model_size(estimator):
variables = estimator.get_variable_names()
size = 0
for variable in variables:
if not any(x in variable
for x in ['global_step',
'centered_bias_weight',
'bias_weight',
'Ftrl']
):
size += np.count_nonzero(estimator.get_variable_value(variable))
return size