Keras ML库:渐变更新后如何进行重量削减?TensorFlow后端

JDS*_*JDS 8 keras tensorflow

我正在尝试使用Keras来实现需要权重削减的算法的一部分,即在梯度更新后限制权重值.到目前为止,我还没有通过网络搜索找到任何解决方案

对于后台,这与WGANs算法有关:

https://arxiv.org/pdf/1701.07875.pdf

如果您查看第8页的算法1,您将看到以下内容:

在此输入图像描述

我已经强调了我想在Keras中实现的线条:在计算用于更新网络权重的渐变之后,我想确保所有权重都在某些值之间被剪切[-c,c]我可以设置.

我怎么能在Keras这样做呢?

作为参考,我使用的是TensorFlow后端.我现在不介意深入研究并添加杂乱的快速修复程序.

谢谢!

ind*_*you 18

在创建优化器对象时设置参数clipvalue.它将完全符合您的要求.

# all parameter gradients will be clipped to
# a maximum value of 0.5 and
# a minimum value of -0.5.
rsmprop = RMSprop(clipvalue=0.5)
Run Code Online (Sandbox Code Playgroud)

然后使用此对象进行模型编译

model.compile(loss='mse', optimizer=rsmprop)
Run Code Online (Sandbox Code Playgroud)

有关更多参考检查:此处.

此外,我更喜欢使用clipnorm,clipvalue因为clipnorm优化保持稳定.例如,假设您有2个参数,并且渐变出来了[0.1, 3].通过使用clipvalue渐变将变为[0.1,0.5],即有可能最陡的方向可以大幅改变.虽然clipnorm没有类似的问题,因为所有的梯度都将被适当地缩放,并且方向将被保留并且同时确保对梯度的大小的约束.

编辑:问题要求权重裁剪而不是渐变裁剪:

权重上的渐变剪辑不是keras代码的一部分.但是maxnorm对权重的限制是.请点击这里.

说完之后就可以轻松实现了.这是一个非常小的例子:

from keras.constraints import Constraint
from keras import backend as K

class WeightClip(Constraint):
    '''Clips the weights incident to each hidden unit to be inside a range
    '''
    def __init__(self, c=2):
        self.c = c

    def __call__(self, p):
        return K.clip(p, -self.c, self.c)

    def get_config(self):
        return {'name': self.__class__.__name__,
                'c': self.c}

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(30, input_dim=100, W_constraint = WeightClip(2)))
model.add(Dense(1))

model.compile(loss='mse', optimizer='rmsprop')

X = np.random.random((1000,100))
Y = np.random.random((1000,1))

model.fit(X,Y)
Run Code Online (Sandbox Code Playgroud)

我已经测试了上面代码的运行,但没有测试约束的有效性.您可以通过在训练后使用model.get_weights()或获取模型权重model.layers[idx].get_weights()并检查其是否遵守约束来实现此目的.

注意:约束不添加到所有的模型权重..但只是其使用的特定层的重量,也W_constraint增加了约束,以WPARAM并b_constraintb(偏置)参数