PReLUレイヤー(パラメトリックReLU活性化関数)
説明
ReLUはxが0以下の入力に対して常に0を出力するのに対し、PReLUはxが0以下の入力に対しても一定値をかけて出力するようにしたものです。
0以下の勾配であるaの値は学習により獲得されます。
PReLUは、Leaky ReLUの負の部分の傾きを、データによって学習させていく方法で、PReLUはは計算コストの増加をほぼゼロに抑えつつ、モデルのフィッティングと過学習のリスクを改善する効果が見込めます。
活性化関数の位置づけ
活性化関数は単純パーセプトロンによる線形近似を非線形近似に変換します。
活性化関数の用途は大きくは2つあります。
- 中間層(隠れ層)の表現範囲を広げること
- 出力層の結果を求める答えににあった形式に変換すること
詳しくは以下の記事を参照ください。
数式
o=max(0, x) + a×min(0, x)
※ aの値は学習により獲得されます。
max(0, i)は0かxの大きい方をyとする意味で、 min(0, i)は0かxの小さい方をyとする意味です。
上記の式は以下の様に書き表すこともできます。
プロパティ
Alpha
負の勾配aの値を指定します。
デフォルト値 = 0.1
BaseAxis
Inputのうち、個別のaを学習する軸のIndex(0から開始)を指定します。
例えばInputが4,3,5である入力に対し、最初の次元(要素4)に対しそれぞれ個別のaを学習するには、BaseAxisを0とします
デフォルト値 = 0
ParameterScope
このレイヤーで用いるパラメータの名前を指定します。
同じParameterScopeの指定されたレイヤーの間ではパラメータが共有されます。
デフォルト値 = *Name
slope.File
プリトレーニングされた勾配 aを用いる場合に、aの書かれたファイルを絶対パスで指定します。
Fileが指定されており重みslopeをファイルから読み込む場合、Initializerによる初期化は無効になります。
デフォルト値 = 空白
slope.Initializer
勾配 aの初期化方法を指定します。
- Uniform:-1.0~1.0の一様乱数で初期化します
- Normal:平均0.0、分散1.0であるガウス乱数で初期化します
- Constant:全ての要素を一定値(1.0)で初期化します
デフォルト値 = Constant
slope.InitializerMultiplier
Initializerにより生成した値に対して掛ける係数を指定します。
デフォルト値 = 0.25
slope.LRateMultiplier
コンフィグタブで指定したLearning Rateに対し、勾配 aの更新に用いるLearning Rateの倍率を指定します。
例えばコンフィグタブで指定したLearning Rateが0.01の状態でslope.LRateMultiplierを2とした場合、勾配 aはLearning Rate0.02で更新されます。
デフォルト値 = 1
利用用途
PReLU関数は中間層の活性化関数として現在最も多く用いられる関数の一つです。
理由はPReLU関数は微分値が常に1であるため勾配消失の心配が無いためです。
ReLUに合ったxが0以下の場合に微分係数が常に0となり誤差が逆伝播しない問題をPReLUは改善しており、現在最も多く用いられる関数の一つです。
ReLU、PReLU及びその他の活性化関数の効果の比較結果
出典: [https://www.procrasist.com/entry/2017/01/12/200000]
出力サイズ
入力サイズと同様
サンプル構成
多層パーセプトロン
誤差関数の使い分けについて
中間層
PReLuなどのReLu系の関数を使うのが一般的です。
Sigmoid関数、Tanh関数は勾配消失問題があり、層が深くなると重みの調整が巧くいかなくなります。
出力層
回帰問題の場合
- 恒等関数(=出力層に関数を挟まない)が一般的です。
- 出力値を0~1の範囲に納めたい場合はシグモイド関数も使われる。
分類問題の場合
- 二値分類問題を解く場合はSigmoid関数が使われることが多い。
- 多値分類問題を解く場合はSoftmax関数が使われることが多い。
こちらのサイトが参考になりましたので、リンクを掲載いたします。
https://thinkit.co.jp/article/14103
![]() |
【送料無料】 ソニー開発のNeural Network Console入門 増補改訂・クラウド対応版--数式なし、コーディングなしのディープラーニング / 足立悠 【本】 価格:2,592円 |