ゼロから作るDeep Learning(16日目)

こんにちは、筋肉めがねです。

 

12月11日に予定されていた、UKのEU離脱に関する協定案の採決は、Theresa May首相により延期されましたね。今の状況では、過半数により否決される恐れがあるため、投票を延期した、という事。機は熟していないと判断したようです。

そして、翌日、12月12日には、May首相に対して与党である保守党から不信任投票が行われる事が発表されました。そして、イギリス時間の12日夜、投票が実施され、結果過半数の票を得て、May首相の続投が決まりました。

3月29日まで、4ヶ月もないこのタイミングで、首相が変わるという最悪の事態は免れたわけですね。Hard Brexitとはならない事を願うばかりです。 

 

f:id:KinnikuMegane:20181219083158j:plain

 

それでは、本日も「ゼロから作るDeep Learning」を進めていきましょう。

前回はReLU関数とSigmoid関数を実装しましたね。本日は、Affineレイヤを実装していきましょう。

 

第3章で書きましたが、ニューラルネットワークでは、行列をノードからノードへと渡していきます。そして、ニューラルネットワークの順伝播において、ある層におけるノードでは、前の層から渡されてくる複数の行列の積が生じます。この行列の積の事をAffine変換と呼びます。そしてAffine変換を行う層をAffineレイヤと呼ぶんですね。ちなみに、第3章ではニューラルネットワークの推論フェーズに焦点を当てていました。

そして、本章ではニューラルネットワークの推論フェーズではなく、学習フェーズに焦点を当てています。学習フェーズとはつまり「合ってなさ加減」を最小化する事、そして「合ってなさ加減」を最小化する一つの方法が誤差逆伝播法でした。

それでは、順伝播及び逆伝播、どちらも含むAffineレイヤを実装しましょう。

class Affine:
      def __init__(self, W, b):
            self.W = W
            self.b - b
            self.x = None
            self.dw = None
            self.db = None

      def forward(self, x):
            self.x = x
            out = np.dot(x, self.W) + self.b

            return out

      def backward(self, dout):
            dx = np.dot(dout, self.W.T)
            self.dW = np.dot(self.x.T, dout)
            self.db = np.sum(dout, axis = 0)

            return dx

 

大事な事は、「dot」ノードから例えばW行列のインプット側への微分は、「+」ノードから渡ってくるoutの微分doutとX行列の転置である、という事ですね。

 

それでは、本日は以上でございます。


にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング