日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

神经网络-全连接层(1)

發(fā)布時(shí)間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神经网络-全连接层(1) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


寫在前面:感謝@夏龍對(duì)本文的審閱并提出了寶貴的意見。

接下來(lái)聊一聊現(xiàn)在大熱的神經(jīng)網(wǎng)絡(luò)。最近這幾年深度學(xué)習(xí)發(fā)展十分迅速,感覺(jué)已經(jīng)占據(jù)了整個(gè)機(jī)器學(xué)習(xí)的“半壁江山”。各大會(huì)議也是被深度學(xué)習(xí)占據(jù),引領(lǐng)了一波潮流。深度學(xué)習(xí)中目前最火熱的兩大類是卷積神經(jīng)網(wǎng)絡(luò)(CNN)和遞歸神經(jīng)網(wǎng)絡(luò)(RNN),就從這兩個(gè)模型開始聊起。

當(dāng)然,這兩個(gè)模型所涉及到概念內(nèi)容實(shí)在太多,要寫的東西也比較多,所以為了能把事情講得更清楚,這里從一些基本概念聊起,大神們不要覺(jué)得無(wú)聊啊……

今天扯的是全連接層,也是神經(jīng)網(wǎng)絡(luò)中的重要組成部分。關(guān)于神經(jīng)網(wǎng)絡(luò)是怎么發(fā)明出來(lái)的這里就不說(shuō)了。全連接層一般由兩個(gè)部分組成,為了后面的公式能夠更加清楚的表述,以下的變量名中上標(biāo)表示所在的層,下標(biāo)表示一個(gè)向量或矩陣內(nèi)的行列號(hào)

  • 線性部分:主要做線性轉(zhuǎn)換,輸入用X表示,輸出用Z表示
  • 非線性部分:那當(dāng)然是做非線性變換了,輸入用線性部分的輸出Z表示,輸出用X表示。

線性部分

線性部分的運(yùn)算方法基本上就是線性加權(quán)求和的感覺(jué),如果對(duì)于一個(gè)輸入向量,線性部分的輸出向量是,那么線性部分的參數(shù)就可以想象一個(gè)m*n的矩陣W,再加上一個(gè)偏置項(xiàng),于是有:


線性部分做了什么事情呢?簡(jiǎn)單來(lái)說(shuō)就是對(duì)輸入數(shù)據(jù)做不同角度的分析,得出該角度下對(duì)整體輸入數(shù)據(jù)的判斷。

這么說(shuō)有點(diǎn)抽象,舉一個(gè)實(shí)際點(diǎn)的例子,就拿CNN的入門case——MNIST舉例。MNIST的例子在此不多說(shuō)了,它是一個(gè)手寫數(shù)字的識(shí)別項(xiàng)目,輸入是一張28*28的二值圖,輸出是0-9這是個(gè)數(shù)字,這里假設(shè)我們采用完全全連接的模型,那么我們的輸入就是28*28=784個(gè)像素點(diǎn)。數(shù)據(jù)顯示到屏幕上大概是這個(gè)樣子:


對(duì)于我們來(lái)說(shuō),這個(gè)像素點(diǎn)都太過(guò)于抽象了,我們無(wú)法判斷這些像素點(diǎn)的取值和最終識(shí)別的關(guān)系:

他們是正相關(guān)還是負(fù)相關(guān)?

很顯然,像素點(diǎn)之間是存在相關(guān)關(guān)系的,這個(gè)關(guān)系具體是什么我們后面再說(shuō),但存在關(guān)系這件事是板上釘釘?shù)摹K灾唤o每一個(gè)像素點(diǎn)一個(gè)權(quán)重是解決不了問(wèn)題的,我們需要多組權(quán)重。

我們可以

1)在第一組權(quán)重中給第一個(gè)像素一個(gè)正數(shù),第二個(gè)也是正數(shù),

2)在第二組權(quán)重中給第一個(gè)像素負(fù)數(shù),而第二個(gè)還是正數(shù)……

這樣,我們相當(dāng)于從多個(gè)角度對(duì)輸入數(shù)據(jù)進(jìn)行分析匯總,得到了多個(gè)輸出結(jié)果,也就是對(duì)數(shù)據(jù)的多種評(píng)價(jià)。

非線性部分

非線性部分有一些“套路”函數(shù),這里只說(shuō)下其中的一個(gè)經(jīng)典函數(shù)——sigmoid。它的函數(shù)形式如下所示:


圖像如下所示:


這個(gè)函數(shù)的輸入正是我們上一步線性部分的輸出z,此時(shí)z取值范圍在,經(jīng)過(guò)了這個(gè)函數(shù)就變成了。

那非線性部分為什么要做這個(gè)函數(shù)轉(zhuǎn)換呢?以我的粗淺理解,其中的一個(gè)作用就是作數(shù)據(jù)的歸一化。不管前面的線性部分做了怎樣的工作,到了非線性這里,所有的數(shù)值將被限制在一個(gè)范圍內(nèi),這樣后面的網(wǎng)絡(luò)層如果要基于前面層的數(shù)據(jù)繼續(xù)計(jì)算,這個(gè)數(shù)值就相對(duì)可控了。不然如果每一層的數(shù)值大小都不一樣,有的范圍在(0,1),有的在(0,10000),做優(yōu)化的時(shí)候優(yōu)化步長(zhǎng)的設(shè)定就會(huì)有麻煩。

另外一個(gè)作用,就是打破之前的線性映射關(guān)系。如果全連接層沒(méi)有非線性部分,只有線性部分,我們?cè)谀P椭携B加多層神經(jīng)網(wǎng)絡(luò)是沒(méi)有意義的,我們假設(shè)有一個(gè)2層全連接神經(jīng)網(wǎng)絡(luò),其中沒(méi)有非線性層,那么對(duì)于第一層有:


對(duì)于第二層有:


兩式合并,有



所以我們只要令?,?,就可以用一層神經(jīng)網(wǎng)絡(luò)表示之前的兩層神經(jīng)網(wǎng)絡(luò)了。所以非線性層的加入,使得多層神經(jīng)網(wǎng)絡(luò)的存在有了意義。

另外還有一個(gè)比較有名的非線性函數(shù),叫做雙曲正切函數(shù)。它的函數(shù)形式如下所示:


這個(gè)長(zhǎng)得很復(fù)雜的函數(shù)的范圍是(-1,1)。可以看出,它的函數(shù)范圍和前面的sigmoid不同,它是有正有負(fù)的,而sigmoid是全為正的。

神經(jīng)網(wǎng)絡(luò)的模樣

實(shí)際上對(duì)于只有一層且只有一個(gè)輸出的神經(jīng)網(wǎng)絡(luò),如果它的非線性部分還使用sigmoid函數(shù),那么它的形式和邏輯斯特回歸(logistic regression)是一樣的。所以可以想象神經(jīng)網(wǎng)絡(luò)模型從概念上來(lái)看比邏輯斯特回歸要復(fù)雜。那么它的復(fù)雜的樣子是什么樣呢?下面給出一段全連接層的代碼,開始做實(shí)驗(yàn):

class FC:def __init__(self, in_num, out_num, lr = 0.01):self._in_num = in_numself._out_num = out_numself.w = np.random.randn(out_num, in_num) * 10self.b = np.zeros(out_num)def _sigmoid(self, in_data):return 1 / (1 + np.exp(in_data))def forward(self, in_data):return self._sigmoid(np.dot(self.w, in_data) + self.b)

從代碼上看東西并不多嘛,注意到我們會(huì)對(duì)參數(shù)中的w進(jìn)行隨機(jī)初始化,有時(shí)我們會(huì)讓老天隨機(jī)一個(gè)神經(jīng)網(wǎng)絡(luò)給我們,我們也可以看看隨機(jī)大帝的旨意。

為了方便可視化,這里只做輸入為2,輸出為1的數(shù)據(jù)。好了,先來(lái)看1號(hào)選手:

x = np.linspace(-10,10,100) y = np.linspace(-10,10,100) X, Y = np.meshgrid(x,y) X_f = X.flatten() Y_f = Y.flatten() data = zip(X_f, Y_f)fc = FC(2, 1) Z1 = np.array([fc.forward(d) for d in data]) Z1 = Z1.reshape((100,100)) draw3D(X, Y, Z1)

定睛一看這其實(shí)就是一個(gè)標(biāo)準(zhǔn)的Logistic Regression。他的圖像如下所示:

經(jīng)過(guò)多次隨機(jī)測(cè)試,基本上它都是這個(gè)形狀,只不過(guò)隨著權(quán)重隨機(jī)的數(shù)值變化,這個(gè)“臺(tái)階”對(duì)旋轉(zhuǎn)到不同的方向,但歸根結(jié)底還是一個(gè)臺(tái)階。

這也說(shuō)明1層神經(jīng)網(wǎng)絡(luò)是沒(méi)有出路的,它本質(zhì)上還是個(gè)線性分類器的實(shí)力,那么小伙伴還給它加一層吧:

fc = FC(2, 3) fc.w = np.array([[0.4, 0.6],[0.3,0.7],[0.2,0.8]]) fc.b = np.array([0.5,0.5,0.5])fc2 = FC(3, 1) fc2.w = np.array([0.3, 0.2, 0.1]) fc2.b = np.array([0.5])Z1 = np.array([fc.forward(d) for d in data]) Z2 = np.array([fc2.forward(d) for d in Z1]) Z2 = Z2.reshape((100,100))draw3D(X, Y, Z2)

這次我們暫時(shí)不用隨機(jī)權(quán)重,而是自己設(shè)置了幾個(gè)數(shù)值,可以看出,參數(shù)設(shè)置得很用心。兩層全都是正數(shù)……,那么圖像呢?

看上去比之前的臺(tái)階“柔軟”了一些,但歸根結(jié)底還是很像一個(gè)臺(tái)階……好吧,那我們加點(diǎn)負(fù)權(quán)重,讓我們從兩個(gè)方面分析輸入數(shù)據(jù):

fc = FC(2, 3) fc.w = np.array([[-0.4, 1.6],[-0.3,0.7],[0.2,-0.8]]) fc.b = np.array([-0.5,0.5,0.5])fc2 = FC(3, 1) fc2.w = np.array([-3, 2, -1]) fc2.b = np.array([0.5])Z1 = np.array([fc.forward(d) for d in data]) Z2 = np.array([fc2.forward(d) for d in Z1]) Z2 = Z2.reshape((100,100))draw3D(X, Y, Z2)

趕緊上圖:

加了負(fù)權(quán)重后,看上去終于不那么像臺(tái)階了,這時(shí)候2層神經(jīng)網(wǎng)絡(luò)的非線性能力開始顯現(xiàn)出來(lái)了。下面把權(quán)重交給隨機(jī)大帝:

fc = FC(2, 100) fc2 = FC(100, 1)Z1 = np.array([fc.forward(d) for d in data]) Z2 = np.array([fc2.forward(d) for d in Z1]) Z2 = Z2.reshape((100,100)) draw3D(X, Y, Z2,(75,80))

上圖:

這時(shí)候的非線性已經(jīng)非常明顯了,不過(guò)似乎還有個(gè)小問(wèn)題,就是函數(shù)似乎是以原點(diǎn)做“中心對(duì)稱”劃分的?中心對(duì)稱的兩個(gè)點(diǎn)必然落入不同類別?非線性的不徹底啊……

既然如此那就繼續(xù)加層:

fc = FC(2, 10) fc2 = FC(10, 20) fc3 = FC(20, 40) fc4 = FC(40, 80) fc5 = FC(80, 1)Z1 = np.array([fc.forward(d) for d in data]) Z2 = np.array([fc2.forward(d) for d in Z1]) Z3 = np.array([fc3.forward(d) for d in Z2]) Z4 = np.array([fc4.forward(d) for d in Z3]) Z5 = np.array([fc5.forward(d) for d in Z4]) Z5 = Z5.reshape((100,100)) draw3D(X, Y, Z5,(75,80))

這個(gè)圖就有點(diǎn)……

從上面的實(shí)驗(yàn)中可以看出,層數(shù)越高,非線性的“能力”確實(shí)越強(qiáng),腦洞開得也越大。

知道了他的厲害,下回我們將詳細(xì)聊下它的求解方法——反向傳播(Back Propagation)。

文章代碼可以在github.com/hsmyy/zhihuz?找到


作者:馮超
鏈接:https://zhuanlan.zhihu.com/p/21525237
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

總結(jié)

以上是生活随笔為你收集整理的神经网络-全连接层(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。