back to index

ML Lecture 7: Backpropagation


link |
00:00.000
好,各位同學大家好,那我們今天來,我們開始上課吧,那我們今天要講的是backpropagation,也就是實際上,如果你要用gradient descent的方法來train一個neural network的時候呢,你應該要怎麼做?
link |
00:23.500
好,那我們上次其實已經講過了neural network的基本架構,然後我就發現說在作業二裡面,好多人都已經implement了這個neural network based approach這樣,那或許你已經對這個方法非常的清楚了,那我不知道說你,但是我不知道說你是不是清楚說,到底實際上在train neural network的時候,backpropagation這個algorithm是怎麼運作的?
link |
00:50.000
好,我們就來講一下這個backpropagation這個algorithm是怎麼讓neural network的training變得比較有效率的,好,那在gradient descent裡面,我們知道說gradient descent的方法就是假設呢,你的network有一大堆的參數,一堆w一堆b,那你先選一個初始的參數,然後計算呢,你先選一個初始的參數θ0,然後計算這個θ0呢,對你的loss function的gradient,
link |
01:18.000
也就是計算每一個network裡面的參數,w1,w2,b1,b2等等,對你的lossθ的偏微分,而計算出這個東西以後,這個gradient呢,其實是一個vector,而計算出這個vector以後呢,你就可以去更新你的參數,你就把θ0減掉learning rate乘上這個gradient,然後得到θ1,那這個process呢,就持續繼續下去,
link |
01:47.000
你再算一遍,再θ1的gradient,然後呢,再把θ1減掉gradient,update成θ2,而這個process就一直持續下去,所以在neural network裡面呢,當你用gradient descent的方法的時候,跟我們在做logistic regression,還有linear regression等等,是沒有什麼太多的差別的,但是最大的差別就是,最大的問題是,在neural network裡面,我們有非常非常多的參數,那現在如果你要做語音辨識系統的話呢,
link |
02:16.000
你的neural network通常會有,比如說七八成,那每成呢,有一千個neural,那它有上百萬個參數,那所以這個vector呢,它是非常非常長的,這是一個上百萬維的vector,所以現在最大的困難就是,你要如何有效的呢,去把這個有百萬維的vector,有效的把它計算出來,那這個就是backpropagation在做的事情,
link |
02:41.000
所以backpropagation並不是一個和gradient descent不同的training的方法,它就是gradient descent,它只是一個比較有效率的演算法,讓你在計算這個gradient這個vector的時候,是可以比較有效率的把這個vector計算出來的,
link |
02:59.000
那其實backpropagation呢,它裡面沒有特別高深的數學,你唯一需要記得的就只有channel,那我們用一張投影片,迅速的幫大家複習一下什麼是channel,那假設你現在有兩個function,h跟g,然後g input x就得到y,這個h input y就得到z,
link |
03:23.000
所以如果你今天給x一個小小的變化的話,它會影響到它的output y,所以y會跟著有變化,然後y有變化以後又會影響到z,所以z會跟著有變化,
link |
03:37.000
那如果我們今天要計算這個底x分之底z的話,我們要計算x對z的微分的話,那怎麼算呢,你可以把它拆成兩項,x對z的微分,它就等於這個y對z的微分乘上x對y的微分,
link |
03:58.000
那這個怎麼來的,你就問一下微積分老師,你可以把這個y就消掉,所以左邊給你右邊,但是不要讓微積分老師知道這件事情。
link |
04:08.000
好,那第二個case,假設現在有三個function,g,h跟k,那g input x就得到x,h input x就得到y,k input x跟y就得到z,
link |
04:28.000
所以今天假如你改變了s,你會透過g和h這兩個function改變了x跟y,改變了s就改變了x跟y,那改變了x跟y以後,
link |
04:44.000
透過k這個function,k這個function input是x跟y,output是z,改變了x跟y以後,你就改變了z,所以你今天如果要計算s對z的微分的話,
link |
04:59.000
那這個s是透過兩條路徑去影響z,它可以透過x去影響z,也可以透過y去影響z,所以s對z的微分就可以寫成,就拆成兩項,根據這兩條path拆成兩項,
link |
05:17.000
這個s對z的微分就可以寫成x對z的微分乘上s對x的微分,上面這條路徑,加上y對z的微分乘上s對y的微分,也就是下面這條路徑。
link |
05:33.000
所以如果大一微積分有好好學的話,這個就是我們都學過的chain rule,那我們等一下會需要用到這個東西。
link |
05:41.000
好,那再來回到這個neural network的training,那我們知道說我們會定一個loss function,那這個loss function是什麼呢?
link |
05:52.000
這個loss function是summation over所有training data的某一個loss值c上標n,我們說假設給定我們一組neural network的參數set,
link |
06:06.000
我們把一個training data xn帶到這個neural network裡面,它會output一個yn,那同時我們會有一個我們希望這個neural network output的target yn hat,
link |
06:18.000
就是它希望如果它output yn hat的話,就是最正確的,那我們會定義一個這個yn和yn hat之間的距離的function,這邊寫做cn,
link |
06:30.000
cn代表yn和yn hat的距離,而如果cn大的話,代表yn和yn hat的距離很遠,所以這個neural network的parameter loss是比較大的,它是比較不好的。
link |
06:41.000
而如果他們這個cn很小的話,代表這組parameter是好的,那我們summation over所有training data的cn,
link |
06:49.000
而summation over所有training data根據這個參數set它的output跟它的目標,它的output yn跟它的目標yn hat之間的距離,就是得到我們的total loss L。
link |
07:02.000
那你把這個式子左右兩邊都對某一個參數w做偏為分的話,你就得到右邊這個式子,你就得到partial w分之partial L,
link |
07:12.000
等於summation over所有training datan等於1到N partial w分之partial cn,這個應該是沒有什麼問題。
link |
07:21.000
而之所以寫這個式子只是要講說,接下來我們就不用想說我們要計算partial w分之partial L,
link |
07:28.000
我們就只考慮我們如何去計算對某一筆data的partial w分之partial cn,
link |
07:35.000
你只要能夠把一筆data的partial w分之partial cn算出來,再summation over所有training data,
link |
07:44.000
你就可以把total loss對某一個參數的偏為分算出來了,
link |
07:50.000
所以等一下我們就只focus在怎麼計算對某一筆data它的cost cn對w的偏為分,我們只focus在怎麼計算這一項上面。
link |
08:00.000
那怎麼做呢?我們先考慮某一個neuron,我們先從底下這個neuron network裡面,
link |
08:10.000
哪一個neuron出來考慮它,那這個neuron它是在第一個layer的neuron,
link |
08:19.000
所以它前面的input就是外界給它的input x1 x2,
link |
08:23.000
那x1跟x2分別,就假設它只有兩個input,x1跟x2分別乘上weight w1 w2再加上b會得到z,
link |
08:34.000
我想這個大家應該都非常熟悉,這個z就是x1w1加x2w2加上b,
link |
08:41.000
那得到這個z以後,通過activation function在經過了非常非常多的事情以後,你會得到最終的output y1y2。
link |
08:48.000
那現在的問題是這樣,假設我們從這邊拿一個w出來,等一下我們就拿w當作例子,
link |
08:56.000
但是b也是一樣的,我們就拿weight當作例子來看怎麼計算某一個weight對某一個example的cost的偏為分,
link |
09:05.000
那b的話呢,想必你可以以此類推就把它算出來。
link |
09:09.000
好,那partial w分之partial c怎麼算?這個partial w分之partial c就按照chain rule就可以把它拆成兩項,
link |
09:20.000
partial w分之partial z,partial z分之partial c,這個z可以把它消掉所以沒有問題。
link |
09:26.000
所以partial w分之partial c可以根據chain rule拆成兩項,那這兩項我們就分別去把它計算出來,
link |
09:35.000
那前面這一項是很簡單的,後面這一項是比較複雜的。
link |
09:41.000
那計算前面這一項,計算partial w分之partial z的這個process,我們稱之為forward pass,
link |
09:49.000
那等一下我們會知道為什麼叫forward pass。
link |
09:52.000
那計算後面這一項partial z分之partial c的process,我們稱之為backward pass,
link |
09:59.000
那我們等一下會講說為什麼它叫做backward pass。
link |
10:03.000
那我們就先看一下怎麼來計算這個partial w分之partial z,怎麼來計算partial w分之partial z。
link |
10:10.000
那我們先看這個w1,你怎麼計算partial w1分之partial z呢?
link |
10:15.000
是不是秒算,就是秒算,因為z就長這個樣子嘛,然後w1在這邊,所以一眼就知道說它是x1。
link |
10:25.000
那partial w2分之partial z呢?所以一眼就可以看出說它就是x2,這個都是秒算。
link |
10:33.000
那它的規律是這樣,它的規律就是這個partial w分之partial z啊,
link |
10:39.000
就是看這個w前面接的東西是什麼,那微分以後就是什麼。
link |
10:45.000
這個w1前面,它的input是接x1,它的input是x1,所以微分以後就是x1。
link |
10:52.000
那partial w2呢?它前面的input是x2,所以微分以後就是x2,它的規律就是這個樣子。
link |
11:00.000
所以今天呢,假如給你一個neural network,那它裡面有一大堆的參數,一大堆的參數。
link |
11:09.000
但是你要計算這裡面每一個參數對z的偏微分,你要計算這裡面每一個參數的partial w分之partial z。
link |
11:19.000
這件事情呢,非常非常的容易,因為我們剛才知道它的規律就是partial w分之partial z,就是看你那個w的input是什麼,它就是什麼。
link |
11:28.000
所以如果有人問你說,現在input是1跟-1,那這個1它對它的activation function的input z的偏微分是什麼呢?
link |
11:37.000
你就可以瞬間回答告訴他說就是-1,因為這個1前面接-1,所以這個參數對z的偏微分就是-1。
link |
11:49.000
同理呢,比如說這個-1,它對z的偏微分就是1,這個-2,它對z的偏微分就是-1,這個1,它對z的偏微分就是1,以此類推。
link |
11:59.000
那接下來呢,接下來假如有人問你說,這個w對它的activation function的input z的偏微分是什麼呢?
link |
12:08.000
你其實也可以瞬間就回答他,你只要知道說,這個w前面接的input是什麼。
link |
12:16.000
那這個w前面接的input是某一個neuron的output,對不對?
link |
12:21.000
這個w前面接的input是第一個hidden layer的neuron的output。
link |
12:25.000
那這個hidden layer的neuron的output怎麼算呢?這個大家應該都知道,對不對?
link |
12:30.000
就是把1跟-1丟進去,然後根據我們熟悉的neuron的運算,然後看看它的output是什麼就是什麼。
link |
12:37.000
在這個例子裡面呢,假如這個function是這個simoy function,算出來就是0.98跟0.12。
link |
12:44.000
那如果你可以算出這兩個neuron的output是0.98跟0.12的話,那這個w,它做完偏微分以後,
link |
12:53.000
這個w對它的activation function的input z做完偏微分以後,顯然就是0.12,因為它接到前面接的w是0.12。
link |
13:01.000
這個-1也是0.12,這個-2是0.98,這個-2是0.98,這個也很直覺。
link |
13:07.000
所以常常的process你就反覆的在做,你可以得到這兩個紅色neuron的output是0.86跟0.11,
link |
13:15.000
那你就可以瞄反應說,它對z的偏微分就是0.11。
link |
13:23.000
所以你要算出這個neuron network裡面的每一個w對它的activation function的input z的偏微分,
link |
13:31.000
你就把那個input丟進去,然後計算每一個neuron的output就結束了。
link |
13:40.000
所以這個步驟叫做forward pass,它是非常容易理解的。
link |
13:45.000
再來我們要講的是backward pass,也就是怎麼算partial z分之partial c。
link |
13:53.000
這個你就會覺得很困難了,因為這個z它要通過activation function以後得到output,
link |
14:01.000
然後後面還有非常非常複雜的process,它才得到這個c,根據非常複雜的process才能夠得到c。
link |
14:09.000
所以這個partial z分之partial c顯然是很複雜的。
link |
14:14.000
不過我們可以用chain rule再把這一項做一下拆解。
link |
14:19.000
假設這個activation function是sigmoid function,我這邊就寫一個sigma of z,
link |
14:25.000
而z通過sigmoid function得到a,這個neuron的output是a。
link |
14:29.000
那接下來會發生什麼事呢?
link |
14:32.000
這個a會通過某一個weight,會乘上某一個weight,再加其他一大堆的value得到z'.
link |
14:39.000
它是下一個neuron的activation function的input。
link |
14:43.000
這個a會乘上另外一個weight,這邊寫成w4,再加上其他一堆東西得到z''。
link |
14:52.000
後面這個z''跟z''之後可能還會發生很多很多的事情,
link |
14:57.000
不過我們就先只考慮下一步會發生什麼事情。
link |
15:01.000
所以呢,我們知道說這個partial z分之partial c,
link |
15:07.000
你可以寫成partial z分之partial a,partial a分之partial c,
link |
15:12.000
那這個沒有什麼問題,partial a可以消掉。
link |
15:15.000
那partial z分之partial a是什麼呢?
link |
15:18.000
我們知道說a就是等於sigmoid of z,
link |
15:22.000
那這個partial z分之partial a其實就是這個sigmoid function的微分。
link |
15:28.000
那sigmoid function長這個樣子,綠色這一條線,
link |
15:33.000
那它的微分你就算一下,它長這個樣子,
link |
15:38.000
我們之前已經看過很多次了。
link |
15:41.000
所以partial z分之partial a也沒有問題。
link |
15:44.000
接下來的問題就是partial a分之partial c應該長什麼樣子呢?
link |
15:51.000
它應該長什麼樣子呢?
link |
15:55.000
那我們就接下來再看說這個partial a跟c的關係是怎樣。
link |
16:02.000
a它會影響z',然後z'會影響c,
link |
16:08.000
a會影響z'',z''會影響c。
link |
16:12.000
所以a透過z'跟z''去影響c,
link |
16:16.000
所以partial a分之partial c,
link |
16:18.000
你可以寫成partial a分之partial z'乘以partial z'分之partial c,
link |
16:24.000
加上partial a分之partial z''除以partial z''分之partial c。
link |
16:29.000
我們假設說a後面,
link |
16:31.000
就這個藍色的neuron的下一個layer,
link |
16:34.000
這個紅色的neuron只有兩個,
link |
16:36.000
所以這邊就只有兩項,
link |
16:38.000
就這個a只會影響z'跟z''。
link |
16:41.000
如果這邊有一千個neuron的話,
link |
16:43.000
那這邊這個圈如果你的summation就是summation over一千項。
link |
16:49.000
這樣大家了解我的意思嗎?
link |
16:52.000
前面我們就是簡化這個上課的說明,
link |
16:58.000
假設只有兩個neuron,
link |
16:59.000
所以這邊只有兩項,
link |
17:01.000
a只會影響z'跟z''。
link |
17:04.000
接下來partial a分之partial z'
link |
17:09.000
這個會算嗎?
link |
17:11.000
這個是秒算,
link |
17:13.000
這個是w3,
link |
17:15.000
這z'等於a,z'等於a乘上w3再加上一些有的沒的東西。
link |
17:22.000
所以這個z'對a做偏為分,
link |
17:24.000
z'對a做偏為分,
link |
17:26.000
根據這個式子顯然就是w3。
link |
17:29.000
所以同理,
link |
17:31.000
這個z''對a做偏為分,
link |
17:33.000
得到的結果顯然就是w4,
link |
17:36.000
所以這兩項算起來也不是個問題。
link |
17:40.000
最後的問題就是,這個z'對c的偏為分怎麼算?
link |
17:45.000
這個z'對c的偏為分怎麼算?
link |
17:49.000
因為我們不知道z'對c有什麼關係,
link |
17:53.000
我們不知道z''對c有什麼關係,
link |
17:55.000
這後面還有發生很多很多的事情,
link |
17:58.000
是很複雜的,
link |
17:59.000
所以我們搞不清楚後面會發生什麼事情,
link |
18:01.000
所以我們一下子不知道這兩項要怎麼算。
link |
18:04.000
不過沒關係,
link |
18:05.000
我們就假設我們知道,
link |
18:07.000
假設這兩項的值,
link |
18:10.000
我們已經商號透過某種方法把它算出來,
link |
18:14.000
我們透過一個等一下會簡單一點,
link |
18:16.000
還不知道怎麼做的方法,
link |
18:18.000
我們就已經把這兩項算出來了。
link |
18:20.000
那把這兩項算出來以後呢,
link |
18:23.000
把這兩項算出來以後呢,
link |
18:26.000
我們就可以把這個z'c輕易的算出來,
link |
18:32.000
把這兩項算出來以後,
link |
18:37.000
我們就可以算 partial z分之partial c,
link |
18:40.000
所以算 partial z'分之partial c,
link |
18:42.000
跟partial zw'分之partial c,
link |
18:44.000
就會算 partial z分之partial c,
link |
18:47.000
然後再把這些值帶到我們剛才看到的
link |
18:51.000
partial z分之partial c的式子裡面,
link |
18:53.000
就得到這樣一個式子,
link |
18:55.000
sigma' of z乘上w3 partial z'分之partial c,
link |
18:59.000
加上w4 partial z'分之partial c,
link |
19:02.000
就算出這樣一個式子。
link |
19:03.000
那這個式子還蠻簡單的,
link |
19:06.000
但我們可以從另外一個觀點來看待這個式子,
link |
19:09.000
你可以想像說現在有另外一個neuron,
link |
19:17.000
這個neuron並不在我們原來的network裡面,
link |
19:21.000
有另外一個neuron,
link |
19:23.000
我把它畫成三角形,
link |
19:27.000
那這個neuron的input就是partial z'分之partial c,
link |
19:32.000
跟partial zw'分之partial c,
link |
19:35.000
那第一個input partial z'分之partial c,
link |
19:38.000
它就乘上w3,
link |
19:39.000
partial zw'分之partial c,
link |
19:41.000
它就乘上w4,
link |
19:42.000
再乘上activation function sigma' of z,
link |
19:46.000
得到output就是partial z分之partial c,
link |
19:50.000
就上面這個neuron所做的運算,
link |
19:54.000
跟下面這個式子是一模一樣,
link |
19:57.000
我們只是把下面這個式子,
link |
19:59.000
這個表式讓它寫成,
link |
20:02.000
畫出來看起來像是一個neuron一樣,
link |
20:07.000
那這個z'分之z,
link |
20:11.000
這個z'分之z其實是一個常數,
link |
20:15.000
它不是一個function,
link |
20:17.000
它是一個constant,
link |
20:20.000
因為z其實已經在計算forward pass的時候,
link |
20:25.000
就被決定好了,
link |
20:27.000
z是一個已經固定的值,
link |
20:31.000
z我們已經知道它是多少,
link |
20:33.000
所以在給定z的情況下,
link |
20:36.000
這個sigma' of z它就是一個常數,
link |
20:40.000
所以這個neuron其實跟我們之前看到,
link |
20:43.000
sigmoid function是不一樣,
link |
20:45.000
它並不是把input通過一個long linear的轉換,
link |
20:49.000
而是把input直接乘上一個constant,
link |
20:52.000
sigma' of z就得到一個output,
link |
20:55.000
所以我把這個neuron畫成三角形的,
link |
20:58.000
代表它跟之前我們看到,
link |
21:00.000
圓形的neuron的運作方式是不一樣的,
link |
21:02.000
它是直接乘上一個constant,
link |
21:04.000
有人問說為什麼是三角形呢?
link |
21:06.000
因為我是電機系的,
link |
21:08.000
我覺得這是一個op amp,
link |
21:10.000
它就乘上一個op amp,
link |
21:13.000
乘上一個constant,
link |
21:15.000
它是一個放大器,
link |
21:17.000
這種就算了,這不太重要,
link |
21:19.000
好,
link |
21:21.000
然後,
link |
21:23.000
這樣問題都解決了對不對,
link |
21:27.000
我們現在最後的問題就只有,
link |
21:29.000
怎麼算這兩項而已,
link |
21:32.000
假設能夠算這兩項,問題就都解決了,
link |
21:35.000
那現在怎麼算這兩項呢?
link |
21:39.000
我們現在假設兩個不同的case,
link |
21:42.000
第一個case是,
link |
21:44.000
我們假設現在紅色的這兩個neuron,
link |
21:47.000
就已經是output layer,
link |
21:50.000
就這兩個紅色的neuron是在output layer裡面,
link |
21:53.000
他們的output就已經是整個network的output,
link |
21:56.000
這邊寫成y1跟y2,
link |
21:58.000
它的output就已經是整個network的output了,
link |
22:01.000
所以今天你要算partial z'分之partial c,
link |
22:05.000
那很簡單就根據chain rule,
link |
22:07.000
算partial z' partial y1,
link |
22:09.000
partial y1分之partial c,
link |
22:11.000
partial z'分之partial y1,
link |
22:13.000
這個沒什麼問題,
link |
22:14.000
只要知道這個activation function的長什麼樣子,
link |
22:17.000
這項就輕而易舉的算出來,
link |
22:19.000
partial y1分之partial c,
link |
22:21.000
y1對cost c有什麼影響,
link |
22:23.000
就depend on你的這個cost function是怎麼定義的,
link |
22:28.000
你output跟它的target間是怎麼做evaluate的,
link |
22:32.000
你可以用cross entropy,
link |
22:33.000
可以用mean square error,
link |
22:34.000
你用不同的定義,
link |
22:36.000
這邊這項就不一樣,
link |
22:37.000
但總之它是一個比較簡單的東西,
link |
22:40.000
你可以把它算出來,
link |
22:42.000
那partial z'
link |
22:44.000
partial z''分之partial c,
link |
22:46.000
partial z''分之partial c,
link |
22:48.000
這你也可以算,
link |
22:49.000
沒有什麼問題,
link |
22:50.000
就是partial z''分之partial y2,
link |
22:51.000
partial y2分之partial c,
link |
22:53.000
這兩項一樣都是可以秒算,
link |
22:56.000
所以今天假設這個藍色的neuron後面,
link |
23:03.000
它的下一個layer就已經是output layer了,
link |
23:07.000
這個藍色的neuron,
link |
23:12.000
它在最後一個hidden layer裡面,
link |
23:14.000
它後面就已經是output layer了,
link |
23:16.000
那根據我們剛才所學的東西,
link |
23:19.000
你就結束了,
link |
23:20.000
你就已經可以把這個w1跟w2的對c的偏為分算出來,
link |
23:26.000
所以這個沒有什麼問題,
link |
23:28.000
那我們真正煩惱的問題是case 2,
link |
23:31.000
假設現在紅色的neuron,
link |
23:33.000
它並不是整個network的output,
link |
23:35.000
那它後面還有其他的東西的話,
link |
23:39.000
怎麼辦呢?
link |
23:41.000
那它後面的其他東西可能長什麼樣子呢?
link |
23:45.000
它可能長這樣,
link |
23:46.000
就是z'再通過activation function得到a'再乘上另外一個weight w5,
link |
23:53.000
再加上一些其他的東西得到za,
link |
23:56.000
然後你再把a'乘上w6再加上其他一大堆東西得到zb,
link |
24:03.000
丟進另外兩個activation function裡面,
link |
24:08.000
那現在的問題是這樣,
link |
24:12.000
我們想要求partial z'分之partial c,
link |
24:16.000
如果我們知道partial za分之partial c,
link |
24:20.000
跟partial zb分之partial c,
link |
24:24.000
我們就可以計算partial z'分之partial c,
link |
24:30.000
我們剛才已經有講過說,
link |
24:34.000
假設我們知道partial z'分之partial c,
link |
24:38.000
跟partial z'分之partial c,
link |
24:40.000
我們就可以算前面一個layer的partial z分之partial c,
link |
24:44.000
所以按照一模一樣的式子,
link |
24:46.000
如果我知道partial za分之partial c,
link |
24:48.000
跟partial zb分之partial c,
link |
24:50.000
我們就可以算partial z'分之partial c,
link |
24:53.000
按照一模一樣的式子,
link |
24:55.000
就我們剛才看到的op amp的式子,
link |
24:58.000
所以你就把partial za乘上w,
link |
25:02.000
partial zb分之partial c乘上w6,
link |
25:05.000
加起來再通過op amp,
link |
25:07.000
乘上sigma z',
link |
25:11.000
再乘上op amp就得到partial z'分之partial c的output,
link |
25:17.000
那現在這個問題就反覆的繼續下去,
link |
25:21.000
我們剛才說知道z'跟z''的偏微分就可以算z,
link |
25:25.000
現在知道za跟zb的偏微分就可以算z',
link |
25:30.000
但是我們又不知道za跟zb的偏微分怎麼算,
link |
25:36.000
你不知道這兩項怎麼算,
link |
25:38.000
如果你會這兩項的話,
link |
25:40.000
你就把這一項算出來,
link |
25:41.000
但問題就是你不知道,
link |
25:43.000
那怎麼辦呢,
link |
25:46.000
我們就再往下一層去看,
link |
25:49.000
這個綠色的neuron如果它是output layer的話,
link |
25:59.000
要計算這兩個東西,
link |
26:01.000
就一次秒算就不成問題,
link |
26:03.000
假設它不是output layer的話,
link |
26:06.000
你就繼續走下去,
link |
26:09.000
再看下一個layer,
link |
26:11.000
它的activation function的input對c的偏微分,
link |
26:14.000
那你就可以把這一項算出來,
link |
26:16.000
你就可以把這兩項算出來,
link |
26:19.000
你就可以再把這一項算出來,
link |
26:21.000
你如果沒有辦法算這兩項,
link |
26:24.000
它們不是output layer的話,
link |
26:25.000
你就再去推下一個layer的偏微分是什麼樣子,
link |
26:29.000
把這兩個東西推出來,
link |
26:31.000
然後再往前再把這兩個東西推出來,
link |
26:33.000
那你可能就會講說,
link |
26:35.000
這個方法聽起來還頗崩潰,
link |
26:38.000
就是你每次要算一個微分的值,
link |
26:42.000
你要一路往後走,一直走到network的output,
link |
26:47.000
而如果network有10層,
link |
26:49.000
那你從第一層開始往後展開,
link |
26:52.000
感覺應該是一個很可怕的事,
link |
26:55.000
但是實際上並不是這個樣子做的,
link |
26:58.000
實際上你只要換一個方向,
link |
27:01.000
從output layer的partial z分之partial c開始算,
link |
27:07.000
你就會發現說,
link |
27:08.000
它的運算量跟原來的neural network,
link |
27:12.000
其實是一樣的,
link |
27:15.000
假設我們現在有六個neural,
link |
27:18.000
每一個neural,
link |
27:20.000
它的acclimation function,
link |
27:22.000
input分別是z1,z2,z3,一直到z6,
link |
27:25.000
我們現在要計算這些z對c的偏微分,
link |
27:31.000
本來我們應該是想要知道z1的偏微分,
link |
27:36.000
你就要算z2,z3,z4的偏微分,
link |
27:39.000
想要知道z3的偏微分,
link |
27:41.000
你就要算z5,z6的偏微分,
link |
27:43.000
想要知道z4的偏微分,
link |
27:45.000
你就要算z5,z6的偏微分,
link |
27:47.000
那你要先算z5,z6的偏微分,
link |
27:49.000
你才算出z3的偏微分,z4的偏微分,
link |
27:52.000
你才能算出z1的偏微分,跟z2的偏微分,
link |
27:56.000
如果我們今天是從z1,z2的偏微分開始算,
link |
28:00.000
那就沒有效率,
link |
28:02.000
但是如果你反過來你先算z5,z6的偏微分的話,
link |
28:06.000
這個process就突然之間變得有效率起來了,
link |
28:10.000
我們就先算z5,z6對c的偏微分,
link |
28:15.000
然後算出這兩項以後,
link |
28:17.000
你就可以算得出z3,z4對c的偏微分,
link |
28:21.000
然後你就可以算出z1,z2對c的偏微分,
link |
28:26.000
這樣大家懂嗎?
link |
28:27.000
這樣大家有問題嗎?
link |
28:30.000
沒有吼?
link |
28:32.000
其實這整件事情,
link |
28:34.000
這兩個東西怎麼得到他的偏微分,
link |
28:36.000
這兩個東西怎麼得到他的偏微分呢?
link |
28:38.000
我們剛才已經看過了,
link |
28:40.000
就是用一個OPAMP來算,
link |
28:42.000
每一個OPAMP放大的倍率,
link |
28:49.000
就是σ'z1,σ'z2,σ'z3,σ'z4,
link |
28:53.000
所以你算出了,
link |
28:55.000
你就先很快的計算,
link |
28:57.000
σ'z5分之σ'c,σ'z6分之σ'c,
link |
29:00.000
然後再把這個偏微分值跟這個偏微分的值,
link |
29:06.000
乘上一些位特,乘上一些位特,
link |
29:09.000
再通過OPAMP你就得到這兩個偏微分的值,
link |
29:13.000
再乘上一些位特,再乘上一些位特,
link |
29:17.000
再通過一個OPAMP就得到一些偏微分的值,
link |
29:20.000
就這樣,就計算完了,就計算完了,
link |
29:25.000
所以你在算back propagation的時候,
link |
29:28.000
這個步驟叫做backward path,
link |
29:32.000
你在做這個backward path的時候,
link |
29:34.000
你實際上的做法就是,
link |
29:36.000
建另外一個neural network,
link |
29:40.000
我們本來有一個正向的neural network,
link |
29:42.000
裡面的activation function可能是sigmoid function,
link |
29:46.000
那現在你在算backward path的時候,
link |
29:49.000
你就是建一個反向的neural network,
link |
29:52.000
但是從右邊到左邊反向的neural network,
link |
29:56.000
這個反向的neural network,
link |
29:57.000
它的activation function你要先算完forward path以後,
link |
30:01.000
你才算得出來,
link |
30:02.000
接下來這個反向的neural network,
link |
30:05.000
它的input就是這兩項,
link |
30:07.000
然後其他部分就跟一般neural network的運算一樣,
link |
30:10.000
你就做一個backward path,
link |
30:13.000
但是其實就是做一個neural network的運算,
link |
30:15.000
你就可以把每一個z對c的偏微分就都算出來了,
link |
30:21.000
這個就是backward path,
link |
30:23.000
所以我們就summarize一下backward path是怎麼做的,
link |
30:27.000
首先你做一個forward path,
link |
30:31.000
在做forward path的時候,
link |
30:33.000
你可以算出,
link |
30:35.000
只要你知道每一個activation function的output,
link |
30:38.000
那activation function的output,
link |
30:40.000
就是它所連接的weight的partial w跟partial z,
link |
30:44.000
那在backward path裡面,
link |
30:47.000
你要把原來的neural network的方向倒過來,
link |
30:52.000
你把原來的neural network的方向倒過來,
link |
30:55.000
那在這個倒過來的neural network,
link |
30:59.000
它的每一個三角形的output,
link |
31:01.000
就是z分之partial c,
link |
31:04.000
然後把它們乘起來,
link |
31:07.000
你就知道某一個weight對w的偏微分是什麼了,
link |
31:12.000
就結束這樣,
link |
31:14.000
想要問大家有沒有什麼問題呢?
link |
31:17.000
就算你沒有聽懂這個東西,
link |
31:19.000
其實也沒有什麼關係啦,
link |
31:22.000
因為我相信應該有百分之七十五以上的好奇,