Activation function


  • update Feb.28.2:エラーを修正します.Problems of sigmoid - Not 0 centered
  • Prologue


    生物が持つニューロンは人工ニューラルネットワークよりずっと複雑である.「アクティブ化」についてお話しします.

    生物の授業で学んだように、神経細胞が成長しています.Dendritesから送られてきた電気信号をSomaに収集し,一定の強度に達するとAxonを介して他の神経細胞に電気信号を送信する.これを神経細胞の興奮作用と呼ぶ.
    このアイデアを人工神経ネットワークに導入した.人工ニューラルネットワークは、入力信号の合計を出力するか否かを決定するアクティブ関数(Activation function)と呼ばれる.
    g=xW+bg=xW+bg=xW+b
    h=f(g)h=f(g)h=f(g)
    上記式では、入力値、重み付け、オフセットの合計を計算するggg関数をfff関数に入れ、hhhを出力する.このとき関数fffはアクティブ化関数である.関数をアクティブにする条件は大きく2つあります.
  • まで微分できます.
    後で最適化テクニックに使うには、微分関数を使います.
  • の非線形関数であるべきです.
    私たちが解決しなければならない問題の大部分は線形関数に帰せない問題である.f(x)=axf(x)=axf(x)
  • では、点火式を実施しながら、一緒に知りましょう.

    1. Step function


    形状が階段に似ているため、階段関数と呼ばれています.入力値が一定の強度以上になると、出力信号が無条件に送信される.前述したように、神経細胞はこのような特性を有する.
    f(x)={1,for x<00,for x>0f(x)=\begin{cases}1,\quad\text{for }x<0\\0,\quad\text{for }x>0\end{cases}f(x)={1,for x<00,for x>0​
    def step(x):
        return np.array(x > 0, dtype = np.int)

    2. Sigmoid function


    「S型」の意味を持つ関数.S字型の関数としては,Logistic,Sofmax,Hyperbolic Tangentなどがある.前述の2つの条件を満たす.最近では、ニューラルネットワークが深ければ深いほど学習が遅くなったり、起きなくなったりすることを理由に、100以上の層を蓄積することはあまり見られない.しかし,パーセプトロンから人工ニューラルネットワークに一歩進んだ関数であることは明らかである.
    σ(x)=11+e−x\sigma(x)=\cfrac{1}{1+e^{-x}}σ(x)=1+e−x1​
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))
    グラフを描く前に、3種類程度考えられます.
  • lim⁡x→+∞σ(x)=0\lim_{x\to +\infty}\sigma(x)=0limx→+∞​σ(x)=0
  • lim⁡x→0σ(x)=12\lim_{x\to0}\sigma(x)=\cfrac{1}{2}limx→0​σ(x)=21​
  • lim⁡x→−∞σ(x)=1\lim_{x\to-\infty}\sigma(x)=1limx→−∞​σ(x)=1

  • Step and Sigmoid



    2つの関数の出力値に注意してください.ステップ関数では、出力値が0または1を除いて他の値を持つことはできません.神経細胞も階段関数のように活動する以上,活性化関数として「ニューラル」ネットワークモデルとして利用できると感じたが,事実はそうではなかった.まず、出力値は特定の値を境界とするため、入力レイヤが伝達する値を次のレイヤに正しく伝達することはできません.f(x)=1 f(x)=1 f(x)=1 f(x)=1 f(x)=1などの平行線の微分値は0であり,ニューラルネットワークは学習できない.
    一方、信号関数はステップ関数とは異なり、0〜1の実数を出力関数とする.境界付近の値だけでなく、重み値を与えるように正解や誤った答えに近づくことができます.図形も曲線なので,各区間の傾きを微分で求めることもできるし,ニューラルネットワークに学ぶこともできる.

    Problems of sigmoid



    1. Gradient vanishing


    Sigmoid関数を微分するとσ(1−σ)\sigma(1-\sigma)σ(1−σ) ありました.先に求めた最大値,最小値,中間値をこの式に代入すると,両端が0に近づき,中間値が14frac{1}{4}41の図形が得られる.ニューラルネットワークが大きい方を見ると…σ(σ(σ(σ(x))))...\sigma(\sigma(\sigma (\sigma(x))))...σ(σ(σ(σ(x))が持つ構造は,微分値の最大値を上位層に伝達しても,入力層が異なるとlim89 n→k 14 nlim n\tok}frac{1}{4}^nlimn→k 41 nに紛失するという問題がある.

    2. Not 000 centered


    3番目のweightを更新する場合を公式で見てみましょう.
    f=xiWi+b∂L∂Wi=∂L∂fi∂fi∂Wi=∂L∂fixi\begin{array}{lc} f= x_i W_i+b\\\\\frac{\partial L}{\partial W_i} =\frac{\partial L}{\partial f_i}\frac{\partial f_i}{\partial W_i}=\frac{\partial L}{\partial f_i}x_i\end{array}f=xi​Wi​+b∂Wi​∂L​=∂fi​∂L​∂Wi​∂fi​​=∂fi​∂L​xi​​
    ∂L∂Wifrac部分Wi∂WiL∂fi frac\部分L\部分f i∂fiLの符号は∂Lに依存する.xix ixiはσ\sigmaσこれは結果値なので、常に正の値です.∂L∂fifrac{partial L}partial f i∂Lを正時とし、更新方向も正時とし、負の方向で更新し、直接目標点に到達できないことが、字形の原因となっている.実際、∂L∂fifrac{partial f i∂Lはmatrixであり、要素の記号は1つではない.そのため、問題は1番ほど深刻ではありません.とにかく勉強は起こります

    3. Computing eee


    Convolutionやdot productに比べて演算量は多くないが,四則演算よりも演算量が多い.

    3. Hyperbolic Tangent


    既存のSigmoid関数をさらに改良した.
    f(x)=21+e−2x−1f(x)=\cfrac{2}{1+e^{-2x}}-1f(x)=1+e−2x2​−1
    def tanh(x):
        return 2 / (1 + np.exp(-2*x)) - 1
    点火方式からSigmoid関数をアップグレードしました.上図に示すように、描画前に最大値、最小値、f(0)f(0)f(0)f(0)f(0)f(0)を考慮すると、最大値と最小値はそれぞれ1と-1に近づき、f(0)=0 f(0)=0 f(0)=0となる.

    Tanh and Sigmoid


    パターン中心を0にアライメントし,Sigmoidで発生する鋸歯現象を解決したが,勾配消失現象は依然として発生した.

    4.ReLU


    入力値が0より小さい場合は0を出力し、0より大きい場合は入力値を出力する非線形関数.演算効率は前の2つの関数よりも高く,学習速度が6倍速いため,最近ニューラルネットワークモデルに広く用いられている.
    f(x)=max(0, x)f(x)=\text{max}(0,\x)\\f(x)=max(0, x)
    max(0, x)={0,for x≤0x,for x>0\text{max}(0,\x)=\begin{cases}0,\quad\text{for }x\le0\\x,\quad\text{for }x\gt0\end{cases}max(0, x)={0,for x≤0x,for x>0​
    def relu(x):
        return (x > 0) * x
    表に示すように、x>0 x>0 x>0の場合、傾きは1の直線であり、x<0 x<0 x<0の場合、出力値は常に0である.

    Problems of ReLU


    1. Dying ReLU


    入力値が負の場合、微分値は0のため更新できません.これはDying Reluと呼ばれ、その名の通りニューロンには「死」の現象がある.したがってbiasを0.01にリセットする場合があります.

    2. Gradient exploding


    初期重量が大きすぎるか、学習率が高すぎると起こります.

    3. Non zero centered


    Sigmoidのような問題があります.

    5. Leaky ReLU


    f(x)=max(0.01x, x)f(x)=\text{max}(0.01x,\x)\\f(x)=max(0.01x, x)
    max(0.01x, x)={0.01x,for x<0x,for x≥0\text{max}(0.01x,\x)=\begin{cases}0.01x,\quad\text{for }x<0\\x,\quad\text{for }x\ge 0\end{cases}max(0.01x, x)={0.01x,for x<0x,for x≥0​
    def leaky_relu(x):
        return np.maximum(0.01*x, x)
    x<0 x<0 x<0 x<0の場合、微分値は0ではなく、死亡reluを解決した点を除いて、性質はReluと同じである.

    Epilogue


    これ以外にもアクティブ化関数がたくさんあります.
  • SigmoidとTanhをできるだけ避ける.
  • まず
  • ReLUを試してみます.
  • の各関数の微分最大値と最小値を求めることで,どのような問題があるかを考える.
  • この文章を書いて、もう一度数学をたくさん勉強しなければならないと感じました.数式を幾何学的に接続する感覚も必要らしい.