python - 理解 Keras 中的正则化
问题描述
我试图理解为什么 Keras 中的正则化语法看起来是这样的。
粗略地说,正则化是通过向与模型权重的某些函数成比例的损失函数添加惩罚项来减少过度拟合的方法。因此,我希望将正则化定义为模型损失函数规范的一部分。
然而,在 Keras 中,正则化是在每层的基础上定义的。例如,考虑这个正则化 DNN 模型:
input = Input(name='the_input', shape=(None, input_shape))
x = Dense(units = 250, activation='tanh', name='dense_1', kernel_regularizer=l2, bias_regularizer=l2, activity_regularizer=l2)(x)
x = Dense(units = 28, name='dense_2',kernel_regularizer=l2, bias_regularizer=l2, activity_regularizer=l2)(x)
y_pred = Activation('softmax', name='softmax')(x)
mymodel= Model(inputs=input, outputs=y_pred)
mymodel.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
我原以为不需要密集层中的正则化参数,我可以把最后一行写得更像:
mymodel.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'], regularization='l2')
这显然是错误的语法,但我希望有人能为我详细说明为什么以这种方式定义正则化以及当我使用层级正则化时实际发生了什么。
我不明白的另一件事是在什么情况下我会使用三个正则化选项中的每一个或全部:(kernel_regularizer, activity_regularizer, bias_regularizer)
?
解决方案
让我们分解您问题的组成部分:
您对正则化的期望可能与前馈网络一致,是的,惩罚项应用于整个网络的权重。但是,当您将 RNN 与 CNN 等混合使用时,情况不一定如此,因此 Keras 选择提供细粒度控制。也许为了便于设置,可以将模型级别的正则化添加到所有权重的 API。
当您使用层正则化时,基
Layer
类实际上将正则化项添加到损失中,这在训练时会惩罚相应层的权重等。现在在 Keras 中,您通常可以将正则化应用于 3 种不同的事物,就像在Dense层中一样。每个层都有不同的内核,例如循环等,所以对于这个问题,让我们看看您感兴趣的那些,但大致相同的内容适用于所有层:
- kernel:这适用于层的实际权重,在 Dense 中它是Wx +b的W。
- 偏差:这是权重的偏差向量,因此您可以为其应用不同的正则化器,即Wx+b中的b 。
- activity:应用于输出向量,y in y = f(Wx + b)。
推荐阅读
- scala - 在同一应用程序中使用 akka 的 spark 1.6
- python - Python 3.x 初学者:TypeError:dog() 不接受任何参数
- javascript - 在不刷新页面的情况下更新 thymeleaf 中的表
- javascript - APP_INITIALIZER 失败的测试用例
- sql - SQL Server:根据每个条件生成一个序号
- python - 从局域网访问 RethinkDB 数据库
- python - 子进程未完成但脚本运行正确
- git - gitlab 公钥在 git clone 请求中被拒绝
- sql-server - 在数据库中保存阿拉伯字符串列表
- azure - 为虚拟机确定 IP 地址时出错;获取网卡出错;发送请求失败