1. 程式人生 > >大白話5分鐘帶你走進人工智慧-第34節神經網路之多神經網路概念(2)

大白話5分鐘帶你走進人工智慧-第34節神經網路之多神經網路概念(2)

目錄

1、回顧:

2、常見的啟用函式都有哪些?

3、多層神經網路裡面故事:

4、如何訓練神經網路?


1、回顧:

回顧下之前學習的內容。人工神經網路裡面有重要的三條內容,一個是加和,加function,把前面的輸入所對應模型的權重相乘相加,第二經過一個非線性變化,第三signal out輸出。如果把function設定為Sigmoid函式,它相當於是一個邏輯迴歸。

2、常見的啟用函式都有哪些?

第一個叫01函式,它要麼就是0,要麼就是1;

第二個叫Sigmoid函式;

可以是linear;也可以是saturated linearcs飽和的線性;也可以用gaussian啟用函式。也可以是Tangent,它是一種比較常見的啟用函式,通常寫Tanh,它其實也是一個S曲線,跟Sigmoid函式S曲線有一點區別在於它的y軸是從-1到+1之間的,Sigmoid函式y軸是從0到+1之間的。如果是Sigmoid函式的話,它的輸出一定是大於0的,有些時候我們不希望看到輸出大於0的,希望它給一個負反饋,這樣的話就會用Tanh,因為它有負的區間段;

哪一個方式都行,常用的就三種,第一種是ReLU,第二種是Sigmoid函式, 第三種是Tanh。一般的框架都會把這三種的公式給它進行封裝,我們只需要傳不同的引數就可以去使用不同的啟用函式。

再看下拓撲結構:

這就是一個單層的網路拓樸,比方我們有一個Data資料x1……xn有n個維度和相對應的y,中間的X1,X2,X3相當於Data資料裡的每一列,對應著每個維度。往後去輸入資料的時候,是一行行的獲取樣本資料,進行一個正向傳播(從輸入到輸出的計算),以此類推,把所有資料都拿出來進行正向傳播。第一行樣本和權重相乘相加,再經過function函式計算,得到ŷ1,然後依次類推,得到ŷ1,ŷ2……ŷm樣本的預測結果,再根據真實結果,算一下Loss損失。

如果把這裡的y寫成∑f,f是Sigmoid函式的話,就是一個邏輯迴歸。前面的輸入層是不需要任何加和和啟用的,直接把資料結構往下游去傳遞,在輸出層會有加和以及function函式輸出。單層網路,只有一個輸入層,輸出層,它並不能體現出神經網路的優點。

如果function函式是Sigmoid函式,這樣一個邏輯迴歸是做二分類的,還是來做多分類的?二分類,因為它給了一個P概率,如果概率跟0.5進行比較,>0.5就是1這個類別,<0.5就是0這個類別。

邏輯迴歸也可以做多分類,它本質上是把多分類變成多個二分類來做,那麼能不能用神經網路圖來表達邏輯迴歸做多分類?

現在畫框的圖就是一個二分類,再來幾個就是多分類,在輸出層再加一個神經元,把前面的x1,x2,x3傳給它,下面再畫一個神經元,把前面的x1,x2,x3傳給它。現在是一個全連線,因為兩點之間全部都連線到一起。

每個結果y都會對應一個輸出概率P,假如做的是個三分類的問題,第一個節點是來分第一個類別的,以此類推P1,P2,P3,最後邏輯迴歸看P1、P2、P3誰的輸出最大,它就是屬於哪個類別。

邏輯迴歸來做多分類,它本質上相當於是把第一層的輸入和第一個輸出的節點做一個二分類;然後接著它再把前面輸入跟第二個做一個二分類;然後把前三個輸入跟第三個輸出節點再來作一個二分類,它相當於迴歸做了三個二分類模型。那麼邏輯迴歸把多分類的問題當做二分類的問題來做,它們每一個分類器的w引數之間互相影響嗎?

它們之間互相不影響,比如X1發出的第一根綠線,它不會把這根綠色線的結果傳給w1,w2,w3,另外一個綠色線也不會傳給其它的二分類模型,所以邏輯迴歸做多分類轉為二分類問題時,每個模型之間是互相不影響的,是獨立算的。

那麼P1+P2+P3=1嗎?事實上等於1概率不大,因為它們之間互相不影響,比如P1=0.8,P2=0.9,P3=0.6,那0.9最大,就分到第二個類別裡面,它們互相之間不影響。

生成的另外兩個神經元是新構建另外的w1,w2,w3嗎?是,比如紅色的節點,它就會有三個w值,w4,w5,w6;綠色的節點,它還會有三個w值,比如w7,w8,w9,每個獨立的二分類模型,都會去算對應的w引數。

它分二分類的話,它都能跟什麼樣的那種型別區分加上裡面,就是說什麼樣的就是混合型別的話,什麼叫混合型別? 不夠。資格跟我講。這跟高速廣東模型沒關係。這跟高斯混合模型沒關係,這個就是來做一個多分類的問題,

如果是三分類,相當於如果邏輯迴歸來做三分類,現在力量有三個輸出節點。如果來說N分類上地方有N個輸出節點用來做分類,那一個輸入點就夠了。明白這意思嗎?那麼在這裡面換句話說,

如果邏輯迴歸來做多分類,如果沒有截距的話,它至少得要算9個引數;如果考慮截距的話,每一個節點會有一個w0,也就是有12個w要算。

這裡面的X直接輸入往後傳遞輸出,Y要先加和,在經過function變化,如果做多分類,function變化全部都是Sigmoid函式,我們稱為淺層的模型,只有一個輸入層,一個輸出層。

3、多層神經網路裡面故事:

真正的神經網路絕對不只有輸入輸出兩層,前面的輸入層的節點叫做輸入節點,輸出層上的節點叫做輸出節點,中間一層上的節點叫做隱藏景點,這一層叫做Hidden layer,它用了2個隱層節點。

除了輸入層,隱藏層一定是神經元,神經元就一定有加和和非線性變化,輸出層如果做分類,有加和和非線性變化;如果做迴歸,不一定。

我們先看下拓撲圖:

什麼是非線性變化?那什麼是線性變化?

如圖:

如果y隨著x成一個線性的變化,這個就稱為線性變化。

如果換一個曲線,那麼y隨x就不成一個線性的變化如圖:

就是非線性的變化。x可以任意的增加,只要不是直線的變化,就說它是非線性的。x的維度上升比如x2,x3都是非線性變化的。 如果是多維,比如y=x0*w0+x1*w1+x2*w2,其中x0*w0和y是成線性變化,x1*w1也是,x2*w2也是,x都是一次方,就一定是線性變化的;如果它是0.5次方,0.4次方或者1.5次方,都是非線性變化。

最終的結果是一個加和,就是∑xi*wi,x是一次方,加和之後的結果和x變化是線性變化。

最後的結果只有一個神經元來決定,∑|f,如果function是Sigmoid函式,如果它做分類,就是一個二分類問題的。

還是用邏輯迴歸來舉例:假如沒有隱藏層的話,最後給出P概率的結果會受到3個維度的影響。

如果加隱藏層,隱藏層裡面只有兩個隱藏節點,兩個神經元,它的概率輸出結果受到2個值的影響,一個H1的輸出,一個H2的輸出。

之前我們的y受到三個節點的影響,由於我們加了隱藏層,裡面有兩個隱層節點,y就受到了兩個維度的影響,它本質上做了一件降維。這個是神經網路裡面自帶的好處。

降維的好處是使得我們的計算複雜度變得更加簡單,還有防止過擬和。因為有些時候開始的維度可能有些重要有些不重要, 經過了降維之後,它把重要的維度,對結果影響比較大的保留下來。

所以神經網路裡,如果隱藏層的個數小於輸入層的個數,相當於做了降維。

所謂的升維,說的是計算複雜度,降維本身也會有計算,做降維主要是看最後的結果,取決於前面因素有幾個。H1,H2這兩個維度的結果,是前面x1,x2,x3算出來的,對於y來說它考慮因素少了,實際上就是降維了。最前面輸入的這一層可以叫預處理,相當於把原來這些維度資料進行了處理,給它變成了兩個維度,然後再讓y進行考慮。

總結下前面說的一堆廢話~~~

邏輯迴歸,對於深度學習來說,就是一個神經元,前面是加和,後面是Sigmoid函式。對於邏輯迴歸,它的輸入就是上一層的H1,H2兩個,不再是X1,X2,X3三個了。從三個變兩個的過程,相當於做了降維,把原來的資料進行了預處理,把它維度減少了。

如果隱藏層不是兩個隱藏節點,五個隱藏節點,最後y進行判斷的時候,它考慮因素從原來的三個變成了五個。第一個輸入層和隱藏層中間的計算,相當於是升維。

神經網路裡面網路拓樸,本質上是可以做降維和升維的,取決於怎麼設定網路拓樸。

我們來看下如果拓撲結構表示實際中生活中的例子:

比如回家過年, 假設三個維度X1為玩火,X2為動刀,X3為上房,相當於是有一個表x1,x2,x3對應數值,現在的Y是來判斷父母會不會打你,打的話是1,不打就是0。

父母打你這件事情很茫然,因為最後結果,好像跟x關係不大,如果直接來判斷的話,肯定不準,那應該怎麼去做?

比如H1神經元它代表傷人,比如放鞭炮把別人炸了、動刀傷人,那麼結果父母就是打你。傷人這件事是推斷出來的,它是隱藏在玩火和動刀背後,推斷出來一個隱藏的情況,一個節點。上房也是一樣,上的是別人家的房頂,導致傷人了。

如果沒有隱藏層,直接拿玩火、動刀、上房推斷打你還是不打你,這件事情會難,因為它們沒有什麼直接聯絡。如果再往前再推一層,加一個隱藏節點H1,比如傷人,按照傷人來判斷父母是打你還是不打你,這件事就更簡單的來判斷。

H2比如是孝順,比如你玩火了十次,不是放鞭炮,而是開火生灶,開了10次;動刀是切菜;上房是上自己家房頂打掃,都可以。

所以隱藏層裡面隱藏節點,代表一些隱含在背後可能推斷出來的,可能演化出來的,演變出來一些中間的結果,然後根據這些中間的結果,再對最後的結果進行推測和預測,這種情況可以判斷的更準。

如果咱們只推出兩個結果的話,就是降維;神經網路裡面一層有多少神經元,是可以隨便設定的,如果神經元設定更多,相當於推斷出更多有可能發生的事件。如果隱藏層設定更多神經元,就可以做到升維。

它就是神經網路意義所在,它可以幫助我們推斷一些東西出來。

我們需要計算是什麼呢?對於機器學習模型來說,我們要算的是每根連線上面引數w值是多少。這個例子要算8個w,如圖:

那麼算w的個數比剛才要遠遠的多。 一層的神經網路只要算三個w,現在至少算八個。

這些w值有什麼用呢?做預測。比如下次一個人給我傳他的資料,x1到xn,我根據已經算好的w進行正向傳播,最後算出來y結果就會得到一個概率,根據概率我們再來預測,最後是正例還是負例。

神經網路它的意義是,在一定程度上可以進行推斷,或者叫演繹,可以把一些隱藏它背後的事件給它推導和演繹出來。

結合以前最火的AlphaGo,它用的是人工智慧,背後就是深度學習,深度學習的本質就是神經網路,為什麼要用神經網路來做下圍棋這件事情,因為能看到的輸入是現在棋盤上這些子所在的位置,也就是有x1到xn個輸入,就是每一個子所在的位置。直白一點,可以把它理解為一個棋盤有多少行多少列,n就是它多少行乘多少列的值。有子是幾,沒有子是幾,白顏色是幾,黑顏色是幾。

下一層是推斷,但是推斷出來是什麼咱們不用關心,知道已知和最後的結果,因為AlphaGo在訓練的過程當中,它一定是知道x和y的,然後它根據已知x和y來算x,y之間的隱藏層所對應的連線。

不管下圍棋還是象棋,什麼叫高手?你能想到3步,人家能想到後7步;你能想到後7步,人家能想到後20步。後一步相當於是你往前推斷和演繹了一步,就是一個隱藏層。如果你用一個隱藏層,相當於是推斷和演繹了另外一步。隱藏層越多,網路層次就越深,它就越是深度學習。

每往前推斷一步,推斷的情形越多,就意味著隱藏層上面的隱藏節點的數量就越多。

如果隱藏層層數多,每一層上的神經元個數又很多,就會導致整個網路的連線就越多,w值越多。如果計算機的話,它要需要反覆迭代來算它最優解。一旦有了網路拓樸,還是拿AlphaGo舉例,它其實就是一個模型,這種模型就是一個網路拓撲結構,網路拓撲結構裡面,點和點之間都有連線,都有w權重。 每當這個人輸入一個子的時候,相當於x1到xn的輸入就變了,走一次正向傳播,得到一個概率值。但是下棋落子的位置有很多種,比如說棋盤上面有很多個點,每下一步的時候,落子的位置不同,就會導致這一次的x1到xn的輸入就不一樣了。

AlphaGo就是把你這兩次落子的位置,轉變為x1到xn,兩次不同輸入,然後一路算下來會得到兩個概率值,哪個概率值越大,勝的概率就越大。

相當於每走一步之前,它都會把現在落子的可能性帶入這個模型,走一遍正向傳播,然後使得走哪一步棋的時候,概率最大,就是最終決定要走的。

深度學習,每次傳一個數據都是一個向量,每次傳入的向量大概是幾百個?輸入層輸入量多少都可以,根據需求來。比如剛才資料集裡面,x1是玩火,x2是動刀,x3是上房,只有三個維度,那麼輸入層就是這三個。可以是0到正無窮,也可以是0和1,看你的需求。在輸入層這地方也可以有很多特徵轉換的工作,比如x1是動刀,資料裡面就是0和1,1是動了,0就表示沒動,那麼x就是一個輸入;如果x是一個次數,比如說10次,20次,30次,40次,我們也可以通過一種手段,比如去做離散化,比如10到30的歸為0,40到60的歸為1,依次類推。這個就看去做預處理的時候怎麼思考這件事情,然後來決定輸入的形式。

神經網路就是未來的方向,換句話說,深度學習就是未來的方向,它會把很多事情整合到一起,比如輸入層到第一個隱藏層,不管升維還是降維,它都做了一下資料的預處理。如果再有隱藏層,它就對這個資料再進行預處理。

而之前講機器學習的時候,資料預處理和演算法訓練,其實是分開的。神經網路資料預處理和最後的模型訓練是一個整體。這就是神經網路的好處。

神經網路它是未來的一個趨勢,但是它其實是一個大招,就是真正在公司裡面去做這個模型的時候,不是上來就用深度學習大招了,往往都是先用機器學習的演算法,如果算模型滿足業務需求,比如說準確率達到了公司收入的90%,能用就這樣用了。未來如果說公司專業準確率不夠,還要提升準確率,其它的演算法都不行的情況下,然後再去用深度學習、神經網路。

為什麼公司不是直接就用神經網路呢?耗資源,如果網路層次多了,每層裡面神經元的個數多了,要去算的w會特別多,它不是一下能算出來,需要反覆的迭代。所以深度學習的模型一算可能就是一天,數量大的時候可能一算就是三天,所以深度學習的模型往往需要算很長的時間。

我們再欣賞下不同的網路拓撲層。

神經網路的網路拓撲,上面是一個隱藏層,下面是多個隱藏層。

4、如何訓練神經網路?

分為兩個階段,一個是正向傳播,一個是反向傳播。通常人們會用SGD隨機梯度下降,最重要的就是算梯度,根據梯度再來調整w。正向傳播就是一路算它的Loss損失,有了損失之後再進行反向傳播,反向傳播就是算每根線上面w所對應的梯度。

為什麼需要反向傳播?因為最終算的是每根線的w,所以w都要調整到最優解,所以反向傳播就是要反過頭來算每根線上所對應的梯度g1,g2……然後跟據梯度再去調整w。

之前講邏輯迴歸或者淺層模型的時候,為什麼沒有提過反向傳播呢?因為淺層的模型不用傳播。

如圖是淺層模型:

最後輸出節點是∑f,function是Sigmoid函式,也就是邏輯迴歸,對於邏輯迴歸來說,不需要傳播,這裡算出來Loss損失,以及w來求偏倒,可以得到梯度g1,g2,g3,因為它前面沒有更多的層,所以它不需要去傳播。

換句話說,就是淺層模型裡面也是反向傳播,只不過反向傳播只傳了一下,就從Loss經過中間一層,往前傳求梯度。

反向傳播最終會用到一個法則,數學上叫做鏈式法則求導,最終會一層層的把前面的梯度給它求出來。

&n