回答:
http://cs231n.github.io/neural-networks-2/#regから:
最大ノルム制約。正則化のもう1つの形式は、すべてのニューロンの重みベクトルの絶対値に絶対上限を適用し、射影勾配降下を使用して制約を適用することです。実際には、これは通常どおりパラメーターの更新を実行し、すべてのニューロンの重みベクトルをクランプしてを満たすように制約を適用することに相当します一般的な値は3または4のオーダーです。この形式の正則化を使用すると、改善が報告される人もいます。その魅力的な特性の1つは、更新が常に制限されているため、学習率が高すぎる場合でもネットワークが「爆発」できないことです。
私が見つかりました。McLawrenceによって答えで別の質問は非常に有用であることを。以下に再現:
重量制限は何をし
max_norm
ますか?
maxnorm(m)
は、重みのL2ノルムがを超えるm
場合、ノルムをに減らす係数で重み行列全体をスケーリングしますm
。あなたがkerasコードで見つけることができるようにclass MaxNorm(Constraint)
:def __call__(self, w): norms = K.sqrt(K.sum(K.square(w), axis=self.axis, keepdims=True)) desired = K.clip(norms, 0, self.max_value) w *= (desired / (K.epsilon() + norms)) return w
さらに、ノルムが計算さ
maxnorm
れるaxis
引数があります。この例では、軸を指定していないため、ノルムはウェイトマトリックス全体で計算されます。たとえば、tf
次元の順序付けを使用していると仮定して、すべての畳み込みフィルターのノルムを制約する場合、重み行列はの形状になり(rows, cols, input_depth, output_depth)
ます。ノルムオーバーaxis = [0, 1, 2]
を計算すると、各フィルターが指定されたノルムに制約されます。なぜそれをするのですか?
重み行列を直接制約することは、別の種類の正則化です。単純なL2正則化項を使用する場合、損失関数で高い重みにペナルティを課します。この制約により、直接正則化します。これも
keras
コードでリンクされているように、これはdropout
レイヤーと組み合わせると特にうまくいくようです。詳細については、このペーパーの 5.1章を参照してください。
axis=0
。