2017-02-16 19 views
1

私はケラスを使用して、ウェイトクリッピングが必要なアルゴリズムの一部を実装しようとしています。つまり、グラジェントアップデート後にウェイト値を制限しています。これまでのWeb検索では解決策が見つかりませんでした。背景についてはKeras MLライブラリ:勾配の更新後にウェイトクリッピングを行う方法は? TensorFlowバックエンド

、これはWGANsアルゴリズムに関係しています:

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

あなたは8ページのアルゴリズム1を見れば、あなたは次のように表示されます:

enter image description here

私はKerasで実装しようとしている行を強調しました。ネットワークの重みを更新するために使用するグラデーションを計算した後、すべての重みがいくつかの値の間でクリップされていることを確認します[-c、 c]を設定することができます。

Kerasでこれを行うにはどうすればいいですか?

私はTensorFlowバックエンドを使用しています。私は物事を掘り下げて、今は面倒なクイックフィックスを追加しても構いません。

ありがとうございます!

答えて

2

オプティマイザオブジェクトを作成するときに、パラメータclipvalueを設定します。 それはあなたが望むものを正確に行います。 here

# 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) 

をコンパイルモデルのこのオブジェクトを使用します。

clipnormclipvalueよりも使用することをお勧めします。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_constraintWのparamとbからb_constraint(バイアス)のparam

+0

おかげに制約追加しますが、これは言う - #は、すべてのパラメータの勾配が #最大値にクリップされます0.5と #最小値は-0.5です。 - これは、それが勾配であり、重み値自体ではなく、切り取られていることを意味するのではありませんか? – JDS

+0

申し訳ありませんが、私は返信するのが速すぎて、重量がクリッピングであることを確認していませんでした。それに応じて回答が更新されます。 – indraforyou

+0

問題ありませんあなたの更新された答えは素晴らしいようです!ありがとうございました – JDS

関連する問題