L1, L2 正则化
2020-02-05 本文已影响0人
潘旭
Regularizer
原理解释,请参考 回归系列之L1和L2正则化
这里主要介绍,在pytorch中如何进行 正则化计算的。
原理 L2
- : 是参数
所以对于 regularizer 来说,主要是提取参数,然后计算.
搜寻参数
有些时候,我们并非想让所有的参数进行 Regularize, 那么,对特定参数的搜寻就是有必要的。在 pytorch中参数名字,就是 参数变量的名字。而在 Allen nlp中,regularize 的配置 example 如下:
"regularizer": [ [ ".*", { "type": "l2", "alpha": 0.00001 } ] ]
这个含义是说:
- regularizer 可以是多个
- 每一个 regularizer,包含两部分,分别是: 参数名字的正则表达式(这里是 ".*"),以及 regularizer 配置 (这里是 l2)。
pytorch的搜寻代码如下:
def __call__(self, module: torch.nn.Module) -> torch.Tensor:
"""
Parameters
----------
module : torch.nn.Module, required
The module to regularize.
"""
accumulator = 0.0
# For each parameter find the first matching regex.
for name, parameter in module.named_parameters():
# 便利所有的 regularizer
for regex, regularizer in self._regularizers:
if re.search(regex, name): # 正则匹配 参数名字
# 计算正则化结果regularizer 就是计算函数, 比如L2
penalty = regularizer(parameter)
accumulator = accumulator + penalty
break
return accumulator
allen nlp 处理方式
allen nlp在处理 L2 的时候,并非是直接在loss中加上的,而是 如果配置了 RegularizerApplicator
会自动在训练的时候,将 model.forward()
返回的 loss 自动加上 RegularizerApplicator 运算的 loss 结果。
而在预测的时候,这个动作是不生效的。