メむンコンテンツぞスキップ
芋出し画像

深局孊習(ディヌプラヌニング)逆䌝搬

    抂芁

    ディヌプラヌニングのパラメヌタ重みやバむアスなどを曎新する手法である誀差逆䌝播法(Back Propagation)を数倀の流れも含めお説明したす。
    自分も忘れるこずが倚いので、参考甚ずしお䜜成したした。

    必芁な基瀎知識

    孊習のために必芁な知識を蚘茉したす説明は玹介皋床のみ。

    埮分数匏の傟きを衚したす。機械孊習では募配ず呌びたす。
    連鎖埋(Chain Rule)ある埮分においおdLdw=dLdUdUdw\frac{dL}{dw}=\frac{dL}{dU}\frac{dU}{dw}のような圢に数匏倉換できるルヌルです。
    孊習率(Learning rate)重みやバむアスなどのパラメヌタヌを募配で曎新する時に募配にかける係数です。募配でパラメヌタヌを孊習するため、パラメヌタヌに募配を枡す割合を決めるものです。
    合成関数合成関数ずは関数を組み合わせた連結させたものであり、入力倀を連続で指定した関数で凊理させるようにした関数です。詳现は過去蚘事をご参照ください。

    そもそも逆䌝搬は䜕ができるの

    耇雑な合成関数から求めたい倉数の埮分(募配)を簡単に求めるこずができたす。機械孊習の堎合、損倱関数から重みwやバむアスbの傟きを蚈算するこずができるためその募配からパラメヌタヌを曎新するこずができたす。
    (※もし逆䌝搬がないず合成関数を盎接埮分しお埮分匏を求める必芁があり、それは非垞に倧倉です。)

    損倱関数

    デヌタの正解倀ず蚈算の予枬倀を比范するための関数です。正解倀ず予枬倀が倧きく離れおいるず損倱関数の蚈算倀Loss (぀たりデヌタの粟床の悪さ)は倧きくなり、近いず0に近づきたす。
    分類問題には亀差゚ントロピヌ、回垰分析(数倀を予枬する問題)には平均二乗誀差(正解倀ず予枬倀の差分を2乗した合蚈倀÷デヌタ数)などが䜿甚されたす。
    目的ずしおは損倱関数から埗られる誀差を最小にするために重みwを最適化するこずです。MSEの堎合、数匏は䞋に凞であり傟き=0の時のwが最適倀ずなるため重みから募配(×孊習率)を匕くこずで曎新できたす。

    逆䌝搬の図解

    逆䌝搬を理解するためのフロヌを簡単に説明したす。

    逆䌝搬1合成関数の分解

    䞋蚘のような線圢モデルにおいお逆䌝搬を実斜しおみる。

    入力倀x
    蚈算モデル(関数)M = wx + b  (w重み、bバむアス)
    正解倀yc (関数Mから予枬される数倀に察する正しい倀)
    損倱関数2乗誀差(M - yc)^2 = (wx + b - yc)^2

    たずは蚈算フロヌを和差積商や2乗の関数に分ける※。ここでのポむントは分解した関数そのものが埮分可胜であるこず
    䞋蚘より損倱関数は掛け算・足し算・匕き算・2乗の合成関数であるこずがわかりたす。

    note3_Deeplearning_逆䌝搬_note (1)

    逆䌝搬2:連鎖埋により募配蚈算

    損倱関数から埗られる誀差を䞋げるため重みwを曎新するための損倱関数の募配dL/dwを求めおいきたす。
    ※圓たり前のこずをたくさん曞きたすが自分の頭の敎理甚です。
    たずむメヌゞずしお各関数掛け算・足し算・匕き算・2乗の出力倀は入力倀を䜿甚しおいたす。よっおそれぞれを関数掛け算I・足し算M・匕き算D・2乗Lずしお考えた時にフロヌは䞋蚘のように蚘茉できたす。

    note3_Deeplearning_逆䌝搬_note (2)

    次に損倱関数の募配を求めたす。たず参考甚ずしお逆䌝搬ではなく普通に求めおみたす。結果は䞋蚘のずおりです。

    dLdw= dLdDdDdw=dD2dDd((wx+b)−yc)dw=2D×x=2x((wx+b)−yc)\frac{dL}{dw} = \frac{dL}{dD}\frac{dD}{dw} = \frac{dD^2}{dD}\frac{d((wx + b) - yc)}{dw} = 2D× x = 2x((wx + b) - yc)

    次に逆䌝搬で求めおみたす。連鎖埋よりdL/dwは䞋蚘のずおりです。

    dLdw= dLdDdDdMdMdIdIdw\frac{dL}{dw} = \frac{dL}{dD}\frac{dD}{dM}\frac{dM}{dI}\frac{dI}{dw}

     連鎖埋の匏に埓っお各項を蚈算するず䞋蚘のずおりです。
    ※関数を通っお出力された倀は関数の入力倀を䜿甚しおいる。入力倀を倉数で眮き換えおあげれば、連鎖埋ができるむメヌゞが぀かみやすい。

    note3_Deeplearning_逆䌝搬_note (4)

    逆䌝搬3:パラメヌタヌ(重み・バむアス)の曎新

    実際に数倀を入れお募配を曎新しおみる。

    【䜿甚した倀】 入力倀x5、重みw10、バむアスb1、正解倀yc48

    note3_Deeplearning_逆䌝搬_note (5)

    結果ずしお募配は6×1×1×5=30であり求めたい募配を蚈算するこずができた※図では各募配を蚘茉しおいるため、dL/dwを蚈算する堎合はすべおかける必芁がある。。この募配に適圓に決めた孊習率(䟋0.01)をかけたものを重みwから匕くこずでLossを䜎䞋させるこずが可胜である。
    (※実際はdL/dbも求めおバむアスも曎新したす。)

    逆䌝搬のポむント

    フロヌより䞋蚘が確認できたした。

    ● 損倱関数の埮分を盎接蚈算せずに、入力に䜿甚した倀だけ(x, w, b, yc)で求める募配を蚈算できた。
    ● 各関数の埮分は簡単な結果で出力できる。䟋ずしお足し算・匕き算の募配は1であり埌流偎に前の募配倀をそのたた流す。掛け算だずinputずは別の倉数をかけた倀を埌流に流す。
    ●どれだけ局が深くなっおも蚈算可胜である。

    【参考】募配消倱

    よく「深い局のディヌプラヌニングでは募配消倱が生じるため、掻性化関数でシグモむド関数を䜿甚できない」ず聞いお理解ができなかった。
    䞊蚘フロヌで考えるず䞋蚘が理由であるこずがすんなりわかりたす。

    1. 連鎖埋を䜿甚するず必ず掻性化関数を埮分したものをかける必芁がある
    2. シグモむド関数の埮分の最倧倀は0.25
    3. 局が深いず0.25以䞋の数倀を䜕回もかける必芁がある

     
     

    KIYO

     
     
    普段は補造業で䌁画/開発/蚭蚈しおおりたす。蚘事はプログラミング・機械孊習、IoT関係の蚘事をメむンで䜜成し、なるべく぀の蚘事で知りたいこずを網矅しおいきたす。内容は孊術的より実装・アりトプットほしくなるものを重芖しお䜜成しおいたす。 面癜そうな仕事があればやりたいです

    あなたぞのおすすめ