勾配爆発の解決方法:Gradient Clipping

1345 ワード

ニューラルネットワーク層数の増加に伴い,勾配消失や勾配爆発の問題が発生する.理由は前に書いた文章を参考にすることができます.
勾配爆発の問題に対して,解決策はGradient Clipping(勾配剪断)の導入である.Gradient Clippingにより、勾配を1つの範囲内に拘束し、勾配が大きすぎないようにします.
tensorflowドキュメントでは、Gradient Clippingプレートに5つの関数が表示されます.ここでは、tf.clip_by_norm(t,clip_norm,name=None)tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)の2つだけを紹介します.
  • tf.clip_by_norm(t,clip_norm,name=None)パラメータ説明:t:a tensor;clip_norm:しきい値、すなわちmaximum L 2-norm.tensorのL 2-normがclip_より大きい場合norm、t = t * clip_norm / l2norm(t)、そうでなければt = t
  • tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)パラメータ説明:t_list: multiple tensors; clip_norm: a clipping ratio; use_norm:globalを計算したらnorm、use_normで指定します.
  • t_list[i] = t_list[i] * clip_norm / max(global_norm,clip_norm)
    where 
    global_norm = sqrt(sum(l2norm(t)**2 for t in t_list))
    

    Any of the entries of t_list that are of type None are ignored. This is the correct way to perform gradient clipping (for example, see R. Pascanu, T. Mikolov, and Y. Bengio, “On the difficulty of training Recurrent Neural Networks”. http://arxiv.org/abs/1211.5063)
    この2つの関数を紹介することによって、tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)は、すべての勾配が求められるまで勾配遮断を行う必要があるため、より遅いことが認識される.