【问题标题】:Keras ML library: how to do weight clipping after gradient updates? TensorFlow backendKeras ML 库:梯度更新后如何进行权重裁剪? TensorFlow 后端
【发布时间】:2017-02-16 03:50:47
【问题描述】:

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

作为背景,这与 WGANs 算法有关:

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

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

我已经强调了我试图在 Keras 中实现的行:在计算用于更新网络中权重的梯度之后,我想确保所有权重都被裁剪在某些值之间 [-c , c] 我可以设置。

我怎么能在 Keras 中做到这一点?

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

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    在创建优化器对象时设置参数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)
    

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

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

    更多参考检查:here

    另外,我更喜欢使用clipnorm 而不是clipvalue,因为clipnorm 的优化保持稳定。例如,假设您有 2 个参数,渐变结果为 [0.1, 3]。通过使用clipvalue,梯度将变为[0.1, 0.5],即最陡的方向有可能会发生巨大变化。而clipnorm 没有类似的问题,因为所有的梯度都将被适当地缩放,方向将被保留,同时确保对梯度大小的约束。

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

    权重的梯度裁剪不是 keras 代码的一部分。但是maxnorm 的权重约束是。检查here

    话虽如此,它可以很容易地实现。这是一个非常小的例子:

    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)
    

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

    注意:约束并未添加到所有模型权重.. 而是仅添加到其使用的特定层的权重中,W_constraint 还将约束添加到 W 参数和 b_constraintb(偏差) 参数

    【讨论】:

    • 谢谢,但是这说 -- # 所有参数梯度将被剪裁到 # 最大值 0.5 和 # 最小值 -0.5。 -- 这是否意味着被剪裁的是渐变,而不是权重值本身?
    • 对不起,我回复得太快了,没有检查剪裁是否在重量上。将相应地更新答案。
    • 好的,没问题,您的更新答案看起来很棒!谢谢朋友
    • 我认为对于newest versions of keras,kwarg 是kernel_constraint
    猜你喜欢
    • 1970-01-01
    • 2018-09-23
    • 2021-05-22
    • 1970-01-01
    • 2020-02-02
    • 2018-12-10
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多