end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

Sigmoid活性化関数の計算グラフと、微分

「ゼロから作るDeep Learning ① (Pythonで学ぶディープラーニングの理論と実装)」 p.143~146の写経です。

github.com

Sigmoid層のpython実装

# coding: utf-8
import numpy as np

def main():
    sigmoid = Sigmoid()
    x = np.array( [[1.0, -0.5],
                   [-2.0, 3.0]] )
    # 準伝播
    fwd = sigmoid.forward(x)
    print(fwd)
    
    # 逆伝播
    back = sigmoid.backward(x)
    print(back)
    
class Sigmoid:
    def __init__(self):
        self.out = None

    # https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/common/layers.py
    # にある Sigmoid は、未定義のsigmoid(x)を使用しており
    # 誤っている気がします。
    # def forward(self, x):
    #     out = sigmoid(x)
    #     self.out = out
    #     return out
    
    def forward(self, x):
        out = 1 / (1 + np.exp(-x))
        self.out = out
        return out

    # forward()で算出したoutを保持し、再利用しています
    def backward(self, dout):
        dx = dout * (1.0 - self.out) * self.out
        return dx
    
if __name__ == '__main__':
    main()

計算グラフ

<sodipodi:namedview id="namedview7" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:showpageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" showgrid="false" inkscape:zoom="1.9776936" inkscape:cx="336.50309" inkscape:cy="131.46627" inkscape:window-width="2191" inkscape:window-height="1333" inkscape:window-x="2725" inkscape:window-y="171" inkscape:window-maximized="0" inkscape:current-layer="layer1" />y==1x÷yx==1x-2yx==2y∵1y==eyx==∵2xexey==11+e-xx×Lyy÷Ly-11e1=-y2e-x1+e-x1+e-xLy-y2Ly-y2e-xyy2e-xL(∵1)-x(∵2)yy2e-xL=yy(1-y)L(∵3)=yL1(1+e-x)2e-xyL11+e-xe-x1+e-x==yLy(1-y)∵3y==1x÷yx==1x-2yx==2y∵1y==eyx==∵2xexeyxy(1-y)∵3