0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

神經(jīng)元和函數(shù)算法之間的關(guān)系(干貨)

電子工程師 ? 2018-06-17 22:31 ? 次閱讀

▌一. 前言:

作為AI入門小白,參考了一些文章,想記點(diǎn)筆記加深印象,發(fā)出來是給有需求的童鞋學(xué)習(xí)共勉,大神輕拍!

【毒雞湯】:算法這東西,讀完之后的狀態(tài)多半是 -->“我是誰,我在哪?”沒事的,吭哧吭哧學(xué)總能學(xué)會(huì),畢竟還有千千萬萬個(gè)算法等著你。

本文貨很干,堪比沙哈拉大沙漠,自己挑的文章,含著淚也要讀完!

▌二. 科普

生物上的神經(jīng)元就是接收四面八方的刺激(輸入),然后做出反應(yīng)(輸出),給它一點(diǎn)??就燦爛。

仿生嘛,于是喜歡放飛自我的某些人就提出了人工神經(jīng)網(wǎng)絡(luò)。一切的基礎(chǔ)-->人工神經(jīng)單元,看圖:

▌三. 通往沙漠的入口: 神經(jīng)元是什么,有什么用:

開始前,需要搞清楚一個(gè)很重要的問題:人工神經(jīng)網(wǎng)絡(luò)里的神經(jīng)元是什么,有什么用。只有弄清楚這個(gè)問題,你才知道你在哪里,在做什么,要往哪里去。

首先,回顧一下神經(jīng)元的結(jié)構(gòu),看下圖, 我們先忽略激活函數(shù)不管:

沒錯(cuò),開始曬公式了!我們的數(shù)據(jù)都是離散的,為了看得更清楚點(diǎn),所以換個(gè)表達(dá)方式,把離散的數(shù)據(jù)寫成向量。該不會(huì)忘了向量是啥吧?回頭致電問候一下當(dāng)年的體育老師!

現(xiàn)在回答問題剛才的問題:

一個(gè)神經(jīng)元是什么:參照式(1.6),從函數(shù)圖像角度看,這就是一根直線。

一個(gè)神經(jīng)元有什么用:要說明用途就要給出一個(gè)應(yīng)用場景:分類。一個(gè)神經(jīng)元就是一條直線,相當(dāng)于楚河漢界,可以把紅棋綠棋分隔開,此時(shí)它就是個(gè)分類器。所以,在線性場景下,單個(gè)神經(jīng)元能達(dá)到分類的作用,它總能學(xué)習(xí)到一條合適的直線,將兩類元素區(qū)分出來。

先睹為快,看效果圖,自己可以去玩:傳送門

http://t.cn/RBCoWof

對上面的圖簡單說明一下:

(x1,x2) 對于神經(jīng)元的輸入都是 x, 而對我們而言,這數(shù)據(jù)就是意義上的點(diǎn)的坐標(biāo),我們習(xí)慣寫成 (x,y)。

又要?jiǎng)澲攸c(diǎn)了:

我們需要對神經(jīng)元的輸出做判定,那么就需要有判定規(guī)則,通過判定規(guī)則后我們才能拿到我們想要的結(jié)果,這個(gè)規(guī)則就是:

假設(shè),0代表紅點(diǎn),1代表藍(lán)點(diǎn)(這些數(shù)據(jù)都是事先標(biāo)定好的,在監(jiān)督學(xué)習(xí)下,神經(jīng)元會(huì)知道點(diǎn)是什么顏色并以這個(gè)已知結(jié)果作為標(biāo)桿進(jìn)行學(xué)習(xí))

當(dāng)神經(jīng)元輸出小于等于 0 時(shí),最終結(jié)果輸出為 0,這是個(gè)紅點(diǎn)

當(dāng)神經(jīng)元輸出大于 1 時(shí),最終結(jié)果輸出為 1,這是個(gè)藍(lán)點(diǎn)

上面提到的規(guī)則讓我聞到了激活函數(shù)的味道?。ㄟ@里只是線性場景,雖然不合適,但是簡單起見,使用了單位階躍函數(shù)來描述激活函數(shù)的功能)當(dāng) x<=0 時(shí),y = 0; 當(dāng) x > 0 時(shí),y = 1

這是階躍函數(shù)的長相:

此時(shí)神經(jīng)元的長相:

▌四. 茫茫大漠第一步: 激活函數(shù)是什么,有什么用

從上面的例子,其實(shí)已經(jīng)說明了激活函數(shù)的作用;但是,我們通常面臨的問題,不是簡單的線性問題,不能用單位階躍函數(shù)作為激活函數(shù),原因是:

階躍函數(shù)在x=0時(shí)不連續(xù),即不可導(dǎo),在非0處導(dǎo)數(shù)為0。用人話說就是它具備輸出限定在[0-1],但是它不具備絲滑的特性,這個(gè)特性很重要。并且在非0處導(dǎo)數(shù)為0,也就是硬飽和,壓根兒就沒梯度可言,梯度也很重要,梯度意味著在神經(jīng)元傳播間是有反應(yīng)的,而不是“死”了的。

接下來說明下,激活函數(shù)所具備的特性有什么,只挑重要的幾點(diǎn)特性講:

非線性:即導(dǎo)數(shù)不是常數(shù),不然就退化成直線。對于一些畫一條直線仍然無法分開的問題,非線性可以把直線掰彎,自從變彎以后,就能包羅萬象了。

幾乎處處可導(dǎo):也就是具備“絲滑的特性”,不要應(yīng)激過度,要做正常人。數(shù)學(xué)上,處處可導(dǎo)為后面降到的后向傳播算法(BP算法)提供了核心條件

輸出范圍有限:一般是限定在[0,1],有限的輸出范圍使得神經(jīng)元對于一些比較大的輸入也會(huì)比較穩(wěn)定。

非飽和性:飽和就是指,當(dāng)輸入比較大的時(shí)候,輸出幾乎沒變化了,那么會(huì)導(dǎo)致梯度消失!什么是梯度消失:就是你天天給女生送花,一開始妹紙還驚喜,到后來直接麻木沒反應(yīng)了。梯度消失帶來的負(fù)面影響就是會(huì)限制了神經(jīng)網(wǎng)絡(luò)表達(dá)能力,詞窮的感覺你有過么。sigmod,tanh函數(shù)都是軟飽和的,階躍函數(shù)是硬飽和。軟是指輸入趨于無窮大的時(shí)候輸出無限接近上線,硬是指像階躍函數(shù)那樣,輸入非0輸出就已經(jīng)始終都是上限值。數(shù)學(xué)表示我就懶得寫了,傳送門在此(https://www.cnblogs.com/rgvb178/p/6055213.html),里面有寫到。如果激活函數(shù)是飽和的,帶來的缺陷就是系統(tǒng)迭代更新變慢,系統(tǒng)收斂就慢,當(dāng)然這是可以有辦法彌補(bǔ)的,一種方法是使用交叉熵函數(shù)作為損失函數(shù),這里不多說。ReLU是非飽和的,親測效果挺不錯(cuò),所以這貨最近挺火的。

單調(diào)性:即導(dǎo)數(shù)符號(hào)不變。導(dǎo)出要么一直大于0,要么一直小于0,不要上躥下跳。導(dǎo)數(shù)符號(hào)不變,讓神經(jīng)網(wǎng)絡(luò)訓(xùn)練容易收斂。

這里只說我們用到的激活函數(shù):

求一下它的導(dǎo)數(shù)把,因?yàn)楹竺嬷vbp算法會(huì)直接套用它:

先祭出大殺器,高中數(shù)學(xué)之復(fù)合函數(shù)求導(dǎo)法則:

它的導(dǎo)數(shù)圖像:

▌五. 沙漠中心的風(fēng)暴:BP(Back Propagation)算法

1. 神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)

經(jīng)過上面的介紹,單個(gè)神經(jīng)元不足以讓人心動(dòng),唯有組成網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)是一種分層結(jié)構(gòu),一般由輸入曾,隱藏層,輸出層組成。所以神經(jīng)網(wǎng)絡(luò)至少有3層,隱藏層多于1,總層數(shù)大于3的就是我們所說的深度學(xué)習(xí)了。

輸入層:就是接收原始數(shù)據(jù),然后往隱層送

輸出層:神經(jīng)網(wǎng)絡(luò)的決策輸出

隱藏層:該層可以說是神經(jīng)網(wǎng)絡(luò)的關(guān)鍵,相當(dāng)于對數(shù)據(jù)做一次特征提取。隱藏層的意義,是把前一層的向量變成新的向量。就是坐標(biāo)變換,說人話就是把數(shù)據(jù)做平移,旋轉(zhuǎn),伸縮,扭曲,讓數(shù)據(jù)變得線性可分??赡苓@個(gè)不那么好理解,舉個(gè)栗子:

下面的圖左側(cè)是原始數(shù)據(jù),中間很多綠點(diǎn),外圍是很多紅點(diǎn),如果你是神經(jīng)網(wǎng)絡(luò),你會(huì)怎么做呢?

一種做法:把左圖的平面看成一塊布,把它縫合成一個(gè)閉合的包包(相當(dāng)于數(shù)據(jù)變換到了一個(gè)3維坐標(biāo)空間),然后把有綠色點(diǎn)的部分?jǐn)]到頂部(伸縮和扭曲),然后外圍的紅色點(diǎn)自然在另一端了,要是姿勢還不夠帥,就挪挪位置(平移)。這時(shí)候干脆利落的砍一刀,綠點(diǎn)紅點(diǎn)就徹底區(qū)分開了。

重要的東西再說一遍:神經(jīng)網(wǎng)絡(luò)換著坐標(biāo)空間玩數(shù)據(jù),根據(jù)需要,可降維,可升維,可大,可小,可圓可扁,就是這么“無敵”

這個(gè)也可以自己去玩玩,直觀的感受一下:傳送門

2.正反向傳播過程

看圖,這是一個(gè)典型的三層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),第一層是輸入層,第二層是隱藏層,第三層是輸出層。PS:不同的應(yīng)用場景,神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)要有針對性的設(shè)計(jì),這里僅僅是為了推導(dǎo)算法和計(jì)算方便才采用這個(gè)簡單的結(jié)構(gòu)

我們以戰(zhàn)士打靶,目標(biāo)是訓(xùn)練戰(zhàn)士能命中靶心成為神槍手作為場景:

那么我們手里有這樣一些數(shù)據(jù):一堆槍擺放的位置(x,y),以及射擊結(jié)果,命中靶心和不命中靶心。

我們的目標(biāo)是:訓(xùn)練出一個(gè)神經(jīng)網(wǎng)絡(luò)模型,輸入一個(gè)點(diǎn)的坐標(biāo)(射擊姿勢),它就告訴你這個(gè)點(diǎn)是什么結(jié)果(是否命中)。

我們的方法是:訓(xùn)練一個(gè)能根據(jù)誤差不斷自我調(diào)整的模型,訓(xùn)練模型的步驟是:

正向傳播:把點(diǎn)的坐標(biāo)數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò),然后開始一層一層的傳播下去,直到輸出層輸出結(jié)果。

反向傳播(BP):就好比戰(zhàn)士去靶場打靶,槍的擺放位置(輸入),和靶心(期望的輸出)是已知。戰(zhàn)士(神經(jīng)網(wǎng)絡(luò))一開始的時(shí)候是這樣做的,隨便開一槍(w,b參數(shù)初始化稱隨機(jī)值),觀察結(jié)果(這時(shí)候相當(dāng)于進(jìn)行了一次正向傳播)。然后發(fā)現(xiàn),偏離靶心左邊,應(yīng)該往右點(diǎn)兒打。所以戰(zhàn)士開始根據(jù)偏離靶心的距離(誤差,也稱損失)調(diào)整了射擊方向往右一點(diǎn)(這時(shí),完成了一次反向傳播)

當(dāng)完成了一次正反向傳播,也就完成了一次神經(jīng)網(wǎng)絡(luò)的訓(xùn)練迭代,反復(fù)調(diào)整射擊角度(反復(fù)迭代),誤差越來越小,戰(zhàn)士打得越來越準(zhǔn),神槍手模型也就誕生了。

3.BP算法推導(dǎo)和計(jì)算

參數(shù)初始化:

正向傳播:

2.隱層-->輸出層:

正向傳播結(jié)束,我們看看輸出層的輸出結(jié)果:[0.7987314002, 0.8374488853],但是我們希望它能輸出[0.01, 0.99],所以明顯的差太遠(yuǎn)了,這個(gè)時(shí)候我們就需要利用反向傳播,更新權(quán)值w,然后重新計(jì)算輸出.

反向傳播:

1.計(jì)算輸出誤差:

PS: 這里我要說的是,用這個(gè)作為誤差的計(jì)算,因?yàn)樗唵?,?shí)際上用的時(shí)候效果不咋滴。如果激活函數(shù)是飽和的,帶來的缺陷就是系統(tǒng)迭代更新變慢,系統(tǒng)收斂就慢,當(dāng)然這是可以有辦法彌補(bǔ)的,一種方法是使用交叉熵函數(shù)作為損失函數(shù)。

交叉熵做為代價(jià)函數(shù)能達(dá)到上面說的優(yōu)化系統(tǒng)收斂下歐工,是因?yàn)樗谟?jì)算誤差對輸入的梯度時(shí),抵消掉了激活函數(shù)的導(dǎo)數(shù)項(xiàng),從而避免了因?yàn)榧せ詈瘮?shù)的“飽和性”給系統(tǒng)帶來的負(fù)面影響。如果項(xiàng)了解更詳細(xì)的證明可以點(diǎn) -->傳送門(https://blog.csdn.net/lanchunhui/article/details/50086025)

對輸出的偏導(dǎo)數(shù):

2.隱層-->輸出層的權(quán)值及偏置b的更新:

先放出鏈?zhǔn)角髮?dǎo)法則:

以更新w5舉例:

我們知道,權(quán)重w的大小能直接影響輸出,w不合適那么會(huì)使得輸出誤差。要想直到某一個(gè)w值對誤差影響的程度,可以用誤差對該w的變化率來表達(dá)。如果w的一點(diǎn)點(diǎn)變動(dòng),就會(huì)導(dǎo)致誤差增大很多,說明這個(gè)w對誤差影響的程度就更大,也就是說,誤差對該w的變化率越高。而誤差對w的變化率就是誤差對w的偏導(dǎo)。

所以,看下圖,總誤差的大小首先受輸出層神經(jīng)元O1的輸出影響,繼續(xù)反推,O1的輸出受它自己的輸入的影響,而它自己的輸入會(huì)受到w5的影響。這就是連鎖反應(yīng),從結(jié)果找根因。

那么,根據(jù)鏈?zhǔn)椒▌t則有:

現(xiàn)在挨個(gè)計(jì)算:

有個(gè)學(xué)習(xí)率的東西,學(xué)習(xí)率取個(gè)0.5。關(guān)于學(xué)習(xí)率,不能過高也不能過低。因?yàn)橛?xùn)練神經(jīng)網(wǎng)絡(luò)系統(tǒng)的過程,就是通過不斷的迭代,找到讓系統(tǒng)輸出誤差最小的參數(shù)的過程。每一次迭代都經(jīng)過反向傳播進(jìn)行梯度下降,然而誤差空間不是一個(gè)滑梯,一降到底,常規(guī)情況下就像坑洼的山地。學(xué)習(xí)率太小,那就很容易陷入局部最優(yōu),就是你認(rèn)為的最低點(diǎn)并不是整個(gè)空間的最低點(diǎn)。如果學(xué)習(xí)率太高,那系統(tǒng)可能難以收斂,會(huì)在一個(gè)地方上串下跳,無法對準(zhǔn)目標(biāo)(目標(biāo)是指誤差空間的最低點(diǎn)),可以看圖:

xy軸是權(quán)值w平面,z軸是輸出總誤差。整個(gè)誤差曲面可以看到兩個(gè)明顯的低點(diǎn),顯然右邊最低,屬于全局最優(yōu)。而左邊的是次低,從局部范圍看,屬于局部最優(yōu)。而圖中,在給定初始點(diǎn)的情況下,標(biāo)出的兩條抵達(dá)低點(diǎn)的路線,已經(jīng)是很理想情況的梯度下降路徑。

3.輸入層-->隱層的權(quán)值及偏置b更新:

以更新w1為例:仔細(xì)觀察,我們在求w5的更新,誤差反向傳遞路徑輸出層-->隱層,即out(O1)-->in(O1)-->w5,總誤差只有一根線能傳回來。但是求w1時(shí),誤差反向傳遞路徑是隱藏層-->輸入層,但是隱藏層的神經(jīng)元是有2根線的,所以總誤差沿著2個(gè)路徑回來,也就是說,計(jì)算偏導(dǎo)時(shí),要分開來算??磮D:

那么,現(xiàn)在開始算總誤差對w1的偏導(dǎo):

4.結(jié)論:

我們通過親力親為的計(jì)算,走過了正向傳播,也體會(huì)了反向傳播,完成了一次訓(xùn)練(迭代)。隨著迭代加深,輸出層的誤差會(huì)越來越小,專業(yè)點(diǎn)說就是系統(tǒng)趨于收斂。來一張系統(tǒng)誤差隨迭代次數(shù)變化的圖來表明我剛才說描述:

▌六. 沙漠的綠洲:代碼實(shí)現(xiàn)

1. 代碼代碼!

其實(shí)已經(jīng)有很多機(jī)器學(xué)習(xí)的框架可以很簡單的實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)。但是我們的目標(biāo)是:在看懂算法之后,我們是否能照著算法的整個(gè)過程,去實(shí)現(xiàn)一遍,可以加深對算法原理的理解,以及對算法實(shí)現(xiàn)思路的的理解。順便說打個(gè)call,numpy這個(gè)庫,你值得擁有!

代碼實(shí)現(xiàn)如下。代碼里已經(jīng)做了盡量啰嗦的注釋,關(guān)鍵實(shí)現(xiàn)的地方對標(biāo)了公式的編號(hào),如果看的不明白的地方多回來啃一下算法推導(dǎo)。對應(yīng)代碼也傳到了github上。

代碼能自己定義神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),支持深度網(wǎng)絡(luò)。代碼實(shí)現(xiàn)了對紅藍(lán)顏色的點(diǎn)做分類的模型訓(xùn)練,通過3層網(wǎng)絡(luò)結(jié)構(gòu),改變隱藏層的神經(jīng)元個(gè)數(shù),通過圖形顯示隱藏層神經(jīng)元數(shù)量對問題的解釋能力。

代碼中還實(shí)現(xiàn)了不同激活函數(shù)。隱藏層可以根據(jù)需要換著激活函數(shù)玩,輸出層一般就用sigmoid,當(dāng)然想換也隨你喜歡~

#coding:utf-8importh5pyimportsklearn.datasetsimportsklearn.linear_modelimportmatplotlibimportmatplotlib.font_managerasfmimportmatplotlib.pyplotaspltimportnumpyasnpnp.random.seed(1)font=fm.FontProperties(fname='/System/Library/Fonts/STHeitiLight.ttc')matplotlib.rcParams['figure.figsize']=(10.0,8.0)defsigmoid(input_sum):"""函數(shù):激活函數(shù)Sigmoid輸入:input_sum:輸入,即神經(jīng)元的加權(quán)和返回:output:激活后的輸出input_sum:把輸入緩存起來返回"""output=1.0/(1+np.exp(-input_sum))returnoutput,input_sumdefsigmoid_back_propagation(derror_wrt_output,input_sum):"""函數(shù):誤差關(guān)于神經(jīng)元輸入的偏導(dǎo):dE/dIn=dE/dOut*dOut/dIn參照式(5.6)其中:dOut/dIn就是激活函數(shù)的導(dǎo)數(shù)dy=y(1-y),見式(5.9)dE/dOut誤差對神經(jīng)元輸出的偏導(dǎo),見式(5.8)輸入:derror_wrt_output:誤差關(guān)于神經(jīng)元輸出的偏導(dǎo):dE/dy?=1/2(d(expect_to_output-output)**2/doutput)=-(expect_to_output-output)input_sum:輸入加權(quán)和返回:derror_wrt_dinputs:誤差關(guān)于輸入的偏導(dǎo),見式(5.13)"""output=1.0/(1+np.exp(-input_sum))doutput_wrt_dinput=output*(1-output)derror_wrt_dinput=derror_wrt_output*doutput_wrt_dinputreturnderror_wrt_dinputdefrelu(input_sum):"""函數(shù):激活函數(shù)ReLU輸入:input_sum:輸入,即神經(jīng)元的加權(quán)和返回:outputs:激活后的輸出input_sum:把輸入緩存起來返回"""output=np.maximum(0,input_sum)returnoutput,input_sumdefrelu_back_propagation(derror_wrt_output,input_sum):"""函數(shù):誤差關(guān)于神經(jīng)元輸入的偏導(dǎo):dE/dIn=dE/dOut*dOut/dIn其中:dOut/dIn就是激活函數(shù)的導(dǎo)數(shù)dE/dOut誤差對神經(jīng)元輸出的偏導(dǎo)輸入:derror_wrt_output:誤差關(guān)于神經(jīng)元輸出的偏導(dǎo)input_sum:輸入加權(quán)和返回:derror_wrt_dinputs:誤差關(guān)于輸入的偏導(dǎo)"""derror_wrt_dinputs=np.array(derror_wrt_output,copy=True)derror_wrt_dinputs[input_sum<=?0]?=?0????return?derror_wrt_dinputsdef?tanh(input_sum):????"""????函數(shù):????????激活函數(shù)?tanh????輸入:????????input_sum:?輸入,即神經(jīng)元的加權(quán)和????返回:????????output:?激活后的輸出????????input_sum:?把輸入緩存起來返回????"""????output?=?np.tanh(input_sum)????return?output,?input_sumdef?tanh_back_propagation(derror_wrt_output,?input_sum):????"""????函數(shù):????????誤差關(guān)于神經(jīng)元輸入的偏導(dǎo):?dE/dIn?=?dE/dOut?*?dOut/dIn????????其中:?dOut/dIn?就是激活函數(shù)的導(dǎo)數(shù)?tanh'(x)?=?1?-?x2??????????????dE/dOut?誤差對神經(jīng)元輸出的偏導(dǎo)????輸入:????????derror_wrt_output:誤差關(guān)于神經(jīng)元輸出的偏導(dǎo):?dE/dy??=?1/2(d(expect_to_output?-?output)**2/doutput)?=?-(expect_to_output?-?output)????????input_sum:?輸入加權(quán)和????返回:????????derror_wrt_dinputs:?誤差關(guān)于輸入的偏導(dǎo)????"""????output?=?np.tanh(input_sum)????doutput_wrt_dinput?=?1?-?np.power(output,?2)????derror_wrt_dinput?=??derror_wrt_output?*?doutput_wrt_dinput????return?derror_wrt_dinputdef?activated(activation_choose,?input):????"""把正向激活包裝一下"""????if?activation_choose?==?"sigmoid":????????return?sigmoid(input)????elif?activation_choose?==?"relu":????????return?relu(input)????elif?activation_choose?==?"tanh":????????return?tanh(input)????return?sigmoid(input)def?activated_back_propagation(activation_choose,?derror_wrt_output,?output):????"""包裝反向激活傳播"""????if?activation_choose?==?"sigmoid":????????return?sigmoid_back_propagation(derror_wrt_output,?output)????elif?activation_choose?==?"relu":????????return?relu_back_propagation(derror_wrt_output,?output)????elif?activation_choose?==?"tanh":????????return?tanh_back_propagation(derror_wrt_output,?output)????return?sigmoid_back_propagation(derror_wrt_output,?output)class?NeuralNetwork:????def?__init__(self,?layers_strcuture,?print_cost?=?False):????????self.layers_strcuture?=?layers_strcuture????????self.layers_num?=?len(layers_strcuture)????????#?除掉輸入層的網(wǎng)絡(luò)層數(shù),因?yàn)槠渌麑硬攀钦嬲纳窠?jīng)元層????????self.param_layers_num?=?self.layers_num?-?1????????self.learning_rate?=?0.0618????????self.num_iterations?=?2000????????self.x?=?None????????self.y?=?None????????self.w?=?dict()????????self.b?=?dict()????????self.costs?=?[]????????self.print_cost?=?print_cost????????self.init_w_and_b()????def?set_learning_rate(self,?learning_rate):????????"""設(shè)置學(xué)習(xí)率"""????????self.learning_rate?=?learning_rate????def?set_num_iterations(self,?num_iterations):????????"""設(shè)置迭代次數(shù)"""????????self.num_iterations?=?num_iterations????def?set_xy(self,?input,?expected_output):????????"""設(shè)置神經(jīng)網(wǎng)絡(luò)的輸入和期望的輸出"""????????self.x?=?input????????self.y?=?expected_output????def?init_w_and_b(self):????????"""????????函數(shù):????????????初始化神經(jīng)網(wǎng)絡(luò)所有參數(shù)????????輸入:????????????layers_strcuture:?神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),例如[2,4,3,1],4層結(jié)構(gòu):????????????????第0層輸入層接收2個(gè)數(shù)據(jù),第1層隱藏層4個(gè)神經(jīng)元,第2層隱藏層3個(gè)神經(jīng)元,第3層輸出層1個(gè)神經(jīng)元????????返回:?神經(jīng)網(wǎng)絡(luò)各層參數(shù)的索引表,用來定位權(quán)值?w???和偏置?b?,i為網(wǎng)絡(luò)層編號(hào)????????"""????????np.random.seed(3)????????#?當(dāng)前神經(jīng)元層的權(quán)值為?n_i?x?n_(i-1)的矩陣,i為網(wǎng)絡(luò)層編號(hào),n為下標(biāo)i代表的網(wǎng)絡(luò)層的節(jié)點(diǎn)個(gè)數(shù)????????#?例如[2,4,3,1],4層結(jié)構(gòu):第0層輸入層為2,那么第1層隱藏層神經(jīng)元個(gè)數(shù)為4????????#?那么第1層的權(quán)值w是一個(gè)?4x2?的矩陣,如:????????#????w1?=?array([?[-0.96927756,?-0.59273074],????????#?????????????????[?0.58227367,??0.45993021],????????#?????????????????[-0.02270222,??0.13577601],????????#?????????????????[-0.07912066,?-1.49802751]?])????????#?當(dāng)前層的偏置一般給0就行,偏置是個(gè)1xn?的矩陣,n?為第i層的節(jié)點(diǎn)個(gè)數(shù),例如第1層為4個(gè)節(jié)點(diǎn),那么:????????#????b1?=?array([?0.,??0.,??0.,??0.])????????for?l?in?range(1,?self.layers_num):????????????self.w["w"?+?str(l)]?=?np.random.randn(self.layers_strcuture[l],?self.layers_strcuture[l-1])/np.sqrt(self.layers_strcuture[l-1])????????????self.b["b"?+?str(l)]?=?np.zeros((self.layers_strcuture[l],?1))????????return?self.w,?self.b????def?layer_activation_forward(self,?x,?w,?b,?activation_choose):????????"""????????函數(shù):????????????網(wǎng)絡(luò)層的正向傳播????????輸入:????????????x:?當(dāng)前網(wǎng)絡(luò)層輸入(即上一層的輸出),一般是所有訓(xùn)練數(shù)據(jù),即輸入矩陣????????????w:?當(dāng)前網(wǎng)絡(luò)層的權(quán)值矩陣????????????b:?當(dāng)前網(wǎng)絡(luò)層的偏置矩陣????????????activation_choose:?選擇激活函數(shù)?"sigmoid",?"relu",?"tanh"????????返回:????????????output:?網(wǎng)絡(luò)層的激活輸出????????????cache:?緩存該網(wǎng)絡(luò)層的信息,供后續(xù)使用:?(x,?w,?b,?input_sum)?->cache"""#對輸入求加權(quán)和,見式(5.1)input_sum=np.dot(w,x)+b#對輸入加權(quán)和進(jìn)行激活輸出output,_=activated(activation_choose,input_sum)returnoutput,(x,w,b,input_sum)defforward_propagation(self,x):"""函數(shù):神經(jīng)網(wǎng)絡(luò)的正向傳播輸入:返回:output:正向傳播完成后的輸出層的輸出caches:正向傳播過程中緩存每一個(gè)網(wǎng)絡(luò)層的信息:(x,w,b,input_sum),...->caches"""caches=[]#作為輸入層,輸出=輸入output_prev=x#第0層為輸入層,只負(fù)責(zé)觀察到輸入的數(shù)據(jù),并不需要處理,正向傳播從第1層開始,一直到輸出層輸出為止#range(1,n)=>[1,2,...,n-1]L=self.param_layers_numforlinrange(1,L):#當(dāng)前網(wǎng)絡(luò)層的輸入來自前一層的輸出input_cur=output_prevoutput_prev,cache=self.layer_activation_forward(input_cur,self.w["w"+str(l)],self.b["b"+str(l)],"tanh")caches.append(cache)output,cache=self.layer_activation_forward(output_prev,self.w["w"+str(L)],self.b["b"+str(L)],"sigmoid")caches.append(cache)returnoutput,cachesdefshow_caches(self,caches):"""顯示網(wǎng)絡(luò)層的緩存參數(shù)信息"""i=1forcacheincaches:print("%dtdLayer"%i)print("input:%s"%cache[0])print("w:%s"%cache[1])print("b:%s"%cache[2])print("input_sum:%s"%cache[3])print("----------")i+=1defcompute_error(self,output):"""函數(shù):計(jì)算檔次迭代的輸出總誤差輸入:返回:"""m=self.y.shape[1]#計(jì)算誤差,見式(5.5):E=Σ1/2(期望輸出-實(shí)際輸出)2#error=np.sum(0.5*(self.y-output)**2)/m#交叉熵作為誤差函數(shù)error=-np.sum(np.multiply(np.log(output),self.y)+np.multiply(np.log(1-output),1-self.y))/merror=np.squeeze(error)returnerrordeflayer_activation_backward(self,derror_wrt_output,cache,activation_choose):"""函數(shù):網(wǎng)絡(luò)層的反向傳播輸入:derror_wrt_output:誤差關(guān)于輸出的偏導(dǎo)cache:網(wǎng)絡(luò)層的緩存信息(x,w,b,input_sum)activation_choose:選擇激活函數(shù)"sigmoid","relu","tanh"返回:梯度信息,即derror_wrt_output_prev:反向傳播到上一層的誤差關(guān)于輸出的梯度derror_wrt_dw:誤差關(guān)于權(quán)值的梯度derror_wrt_db:誤差關(guān)于偏置的梯度"""input,w,b,input_sum=cacheoutput_prev=input#上一層的輸出=當(dāng)前層的輸入;注意是'輸入'不是輸入的加權(quán)和(input_sum)m=output_prev.shape[1]#m是輸入的樣本數(shù)量,我們要取均值,所以下面的求值要除以m#實(shí)現(xiàn)式(5.13)->誤差關(guān)于權(quán)值w的偏導(dǎo)數(shù)derror_wrt_dinput=activated_back_propagation(activation_choose,derror_wrt_output,input_sum)derror_wrt_dw=np.dot(derror_wrt_dinput,output_prev.T)/m#實(shí)現(xiàn)式(5.32)->誤差關(guān)于偏置b的偏導(dǎo)數(shù)derror_wrt_db=np.sum(derror_wrt_dinput,axis=1,keepdims=True)/m#為反向傳播到上一層提供誤差傳遞,見式(5.28)的(Σδ·w)部分derror_wrt_output_prev=np.dot(w.T,derror_wrt_dinput)returnderror_wrt_output_prev,derror_wrt_dw,derror_wrt_dbdefback_propagation(self,output,caches):"""函數(shù):神經(jīng)網(wǎng)絡(luò)的反向傳播輸入:output:神經(jīng)網(wǎng)絡(luò)輸caches:所有網(wǎng)絡(luò)層(輸入層不算)的緩存參數(shù)信息[(x,w,b,input_sum),...]返回:grads:返回當(dāng)前迭代的梯度信息"""grads={}L=self.param_layers_num#output=output.reshape(output.shape)#把輸出層輸出輸出重構(gòu)成和期望輸出一樣的結(jié)構(gòu)expected_output=self.y#見式(5.8)#derror_wrt_output=-(expected_output-output)#交叉熵作為誤差函數(shù)derror_wrt_output=-(np.divide(expected_output,output)-np.divide(1-expected_output,1-output))#反向傳播:輸出層->隱藏層,得到梯度:見式(5.8),(5.13),(5.15)current_cache=caches[L-1]#取最后一層,即輸出層的參數(shù)信息grads["derror_wrt_output"+str(L)],grads["derror_wrt_dw"+str(L)],grads["derror_wrt_db"+str(L)]=self.layer_activation_backward(derror_wrt_output,current_cache,"sigmoid")#反向傳播:隱藏層->隱藏層,得到梯度:見式(5.28)的(Σδ·w),(5.28),(5.32)forlinreversed(range(L-1)):current_cache=caches[l]derror_wrt_output_prev_temp,derror_wrt_dw_temp,derror_wrt_db_temp=self.layer_activation_backward(grads["derror_wrt_output"+str(l+2)],current_cache,"tanh")grads["derror_wrt_output"+str(l+1)]=derror_wrt_output_prev_tempgrads["derror_wrt_dw"+str(l+1)]=derror_wrt_dw_tempgrads["derror_wrt_db"+str(l+1)]=derror_wrt_db_tempreturngradsdefupdate_w_and_b(self,grads):"""函數(shù):根據(jù)梯度信息更新w,b輸入:grads:當(dāng)前迭代的梯度信息返回:"""#權(quán)值w和偏置b的更新,見式:(5.16),(5.18)forlinrange(self.param_layers_num):self.w["w"+str(l+1)]=self.w["w"+str(l+1)]-self.learning_rate*grads["derror_wrt_dw"+str(l+1)]self.b["b"+str(l+1)]=self.b["b"+str(l+1)]-self.learning_rate*grads["derror_wrt_db"+str(l+1)]deftraining_modle(self):"""訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型"""np.random.seed(5)foriinrange(0,self.num_iterations):#正向傳播,得到網(wǎng)絡(luò)輸出,以及每一層的參數(shù)信息output,caches=self.forward_propagation(self.x)#計(jì)算網(wǎng)絡(luò)輸出誤差cost=self.compute_error(output)#反向傳播,得到梯度信息grads=self.back_propagation(output,caches)#根據(jù)梯度信息,更新權(quán)值w和偏置bself.update_w_and_b(grads)#當(dāng)次迭代結(jié)束,打印誤差信息ifself.print_costandi%1000==0:print("Costafteriteration%i:%f"%(i,cost))ifself.print_costandi%1000==0:self.costs.append(cost)#模型訓(xùn)練完后顯示誤差曲線ifFalse:plt.plot(np.squeeze(self.costs))plt.ylabel(u'神經(jīng)網(wǎng)絡(luò)誤差',fontproperties=font)plt.xlabel(u'迭代次數(shù)(*100)',fontproperties=font)plt.title(u"學(xué)習(xí)率="+str(self.learning_rate),fontproperties=font)plt.show()returnself.w,self.bdefpredict_by_modle(self,x):"""使用訓(xùn)練好的模型(即最后求得w,b參數(shù))來決策輸入的樣本的結(jié)果"""output,_=self.forward_propagation(x.T)output=output.Tresult=output/np.sum(output,axis=1,keepdims=True)returnnp.argmax(result,axis=1)defplot_decision_boundary(xy,colors,pred_func):#xy是坐標(biāo)點(diǎn)的集合,把集合的范圍算出來#加減0.5相當(dāng)于擴(kuò)大畫布的范圍,不然畫出來的圖坐標(biāo)點(diǎn)會(huì)落在圖的邊緣,逼死強(qiáng)迫癥患者x_min,x_max=xy[:,0].min()-0.5,xy[:,0].max()+0.5y_min,y_max=xy[:,1].min()-0.5,xy[:,1].max()+0.5#以h為分辨率,生成采樣點(diǎn)的網(wǎng)格,就像一張網(wǎng)覆蓋所有顏色點(diǎn)h=.01xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))#把網(wǎng)格點(diǎn)集合作為輸入到模型,也就是預(yù)測這個(gè)采樣點(diǎn)是什么顏色的點(diǎn),從而得到一個(gè)決策面Z=pred_func(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)#利用等高線,把預(yù)測的結(jié)果畫出來,效果上就是畫出紅藍(lán)點(diǎn)的分界線plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)#訓(xùn)練用的紅藍(lán)點(diǎn)點(diǎn)也畫出來plt.scatter(xy[:,0],xy[:,1],c=colors,marker='o',cmap=plt.cm.Spectral,edgecolors='black')if__name__=="__main__":plt.figure(figsize=(16,32))#用sklearn的數(shù)據(jù)樣本集,產(chǎn)生2種顏色的坐標(biāo)點(diǎn),noise是噪聲系數(shù),噪聲越大,2種顏色的點(diǎn)分布越凌亂xy,colors=sklearn.datasets.make_moons(60,noise=1.0)#因?yàn)辄c(diǎn)的顏色是1bit,我們設(shè)計(jì)一個(gè)神經(jīng)網(wǎng)絡(luò),輸出層有2個(gè)神經(jīng)元。#標(biāo)定輸出[1,0]為紅色點(diǎn),輸出[0,1]為藍(lán)色點(diǎn)expect_output=[]forcincolors:ifc==1:expect_output.append([0,1])else:expect_output.append([1,0])expect_output=np.array(expect_output).T#設(shè)計(jì)3層網(wǎng)絡(luò),改變隱藏層神經(jīng)元的個(gè)數(shù),觀察神經(jīng)網(wǎng)絡(luò)分類紅藍(lán)點(diǎn)的效果hidden_layer_neuron_num_list=[1,2,4,10,20,50]fori,hidden_layer_neuron_numinenumerate(hidden_layer_neuron_num_list):plt.subplot(5,2,i+1)plt.title(u'隱藏層神經(jīng)元數(shù)量:%d'%hidden_layer_neuron_num,fontproperties=font)nn=NeuralNetwork([2,hidden_layer_neuron_num,2],True)#輸出和輸入層都是2個(gè)節(jié)點(diǎn),所以輸入和輸出的數(shù)據(jù)集合都要是nx2的矩陣nn.set_xy(xy.T,expect_output)nn.set_num_iterations(30000)nn.set_learning_rate(0.1)w,b=nn.training_modle()plot_decision_boundary(xy,colors,nn.predict_by_modle)plt.show()

2. 曬圖曬圖!

關(guān)于誤差曲線(這里只舉其中一個(gè)栗子):

通過看誤差曲線,可以從一定程度上判定網(wǎng)絡(luò)的效果,模型訓(xùn)練是否能收斂,收斂程度如何,都可以從誤差曲線對梯度下降的過程能見一二。

3層網(wǎng)絡(luò)的結(jié)構(gòu)下,隱藏層只有一層,看圖說明一下隱藏層神經(jīng)元個(gè)數(shù)變化對神經(jīng)網(wǎng)絡(luò)表達(dá)能力的影響:

當(dāng)隱藏層只有1個(gè)神經(jīng)元:就像文章剛開始說的,一個(gè)神經(jīng)元,就是個(gè)線性分類器,表達(dá)能力就一條直線而已,見式(3.6)

2個(gè)神經(jīng)元:線開始有點(diǎn)彎曲了,但是這次結(jié)果一點(diǎn)都不明顯,尷尬。但從原理上神經(jīng)網(wǎng)絡(luò)開始具備了非線性表達(dá)能力

隨著隱藏層神經(jīng)元個(gè)數(shù)不斷增加,神經(jīng)網(wǎng)絡(luò)表達(dá)能力越來越強(qiáng),分類的效果越來越好。當(dāng)然也不是神經(jīng)元越多越好,可以開始考慮深度網(wǎng)絡(luò)是不是效果更好一些。

▌7. 沒有結(jié)局

記住一點(diǎn),bp神經(jīng)網(wǎng)絡(luò)是其他各種神經(jīng)網(wǎng)絡(luò)中最簡單的一種。只有學(xué)會(huì)了它,才能以此為基礎(chǔ)展開對其他更復(fù)雜的神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)。

雖然推導(dǎo)了并實(shí)現(xiàn)了算法,但是仍然是有很多疑問,這里就作為拋磚引玉吧:

神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),即幾層網(wǎng)絡(luò),輸入輸出怎么設(shè)計(jì)才最有效?

數(shù)學(xué)理論證明,三層的神經(jīng)網(wǎng)絡(luò)就能夠以任意精度逼近任何非線性連續(xù)函數(shù)。那么為什么還需要有深度網(wǎng)絡(luò)?

在不同應(yīng)用場合下,激活函數(shù)怎么選擇?

學(xué)習(xí)率怎么怎么選擇?

訓(xùn)練次數(shù)設(shè)定多少訓(xùn)練出的模型效果更好?

AI,從入門到放棄,首篇結(jié)束。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4332

    瀏覽量

    62666
  • 神經(jīng)元
    +關(guān)注

    關(guān)注

    1

    文章

    363

    瀏覽量

    18460

原文標(biāo)題:AI從入門到放棄:BP神經(jīng)網(wǎng)絡(luò)算法推導(dǎo)及代碼實(shí)現(xiàn)筆記

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    采用單神經(jīng)元自適應(yīng)控制高精度空調(diào)系統(tǒng)仿真

    具有自學(xué)習(xí)、自適應(yīng)功能的神經(jīng)元控制算法引入高精度空調(diào)控制領(lǐng)域,并通過MATLAB仿真,考察了系統(tǒng)的控制效果。仿真結(jié)果表明此控制方法具有超調(diào)小、抗干擾能力強(qiáng)、控溫精度高的優(yōu)點(diǎn),從而為空調(diào)系統(tǒng)的高精度控制提出了一個(gè)新的途徑。關(guān)鍵詞:單神經(jīng)元
    發(fā)表于 03-18 22:28

    【案例分享】基于BP算法的前饋神經(jīng)網(wǎng)絡(luò)

    期望的輸出。BP神經(jīng)網(wǎng)絡(luò)算法推導(dǎo)(更新權(quán)重和偏倚):從上面推導(dǎo)可以發(fā)現(xiàn):對于任意從神經(jīng)元i(輸出神經(jīng)元/隱層神經(jīng)元)至
    發(fā)表于 07-21 04:00

    徑向基函數(shù)神經(jīng)網(wǎng)絡(luò)芯片ZISC78電子資料

    概述:ZISC78是由IBM和Sillicon聯(lián)合研發(fā)的一種具有自學(xué)習(xí)功能的徑向基函數(shù)神經(jīng)網(wǎng)絡(luò)芯片,它內(nèi)含78個(gè)神經(jīng)元;并且采用并行結(jié)構(gòu),運(yùn)行速度與神經(jīng)元數(shù)量無關(guān);支持RBF/KNN
    發(fā)表于 04-07 06:48

    深度學(xué)習(xí)或者人工神經(jīng)網(wǎng)絡(luò)模擬了生物神經(jīng)元?

    深度學(xué)習(xí)里的神經(jīng)元實(shí)質(zhì)上是數(shù)學(xué)函數(shù),即相似度函數(shù)。在每個(gè)人工神經(jīng)元內(nèi),帶權(quán)重的輸入信號(hào)和神經(jīng)元的閾值進(jìn)行比較,匹配度越高,激活
    的頭像 發(fā)表于 04-17 14:53 ?5830次閱讀

    帶延遲調(diào)整的脈沖神經(jīng)元學(xué)習(xí)算法

    脈沖神經(jīng)元有監(jiān)督學(xué)習(xí)算法通過梯度下降法調(diào)整神經(jīng)元的突觸權(quán)值,但目標(biāo)學(xué)習(xí)序列長度的增加會(huì)降低其精度并延長學(xué)習(xí)周期。為此,提出一種帶延遲調(diào)整的梯度下降學(xué)習(xí)算法。將每個(gè)突觸的延遲作為學(xué)習(xí)參數(shù)
    發(fā)表于 06-11 16:37 ?12次下載

    神經(jīng)元 C 參考指南

    神經(jīng)元 C 參考指南
    發(fā)表于 03-13 19:30 ?0次下載
    <b class='flag-5'>神經(jīng)元</b> C 參考指南

    神經(jīng)元 C 參考指南

    神經(jīng)元 C 參考指南
    發(fā)表于 07-04 20:48 ?0次下載
    <b class='flag-5'>神經(jīng)元</b> C 參考指南

    神經(jīng)元的基本作用是什么信息

    神經(jīng)元神經(jīng)系統(tǒng)的基本功能單位,它們在大腦、脊髓和周圍神經(jīng)系統(tǒng)中發(fā)揮著至關(guān)重要的作用。神經(jīng)元的基本作用是接收、處理和傳遞信息。本文將詳細(xì)介紹神經(jīng)元
    的頭像 發(fā)表于 07-03 11:29 ?935次閱讀

    神經(jīng)元的結(jié)構(gòu)及功能是什么

    神經(jīng)元神經(jīng)系統(tǒng)的基本結(jié)構(gòu)和功能單位,它們通過電信號(hào)和化學(xué)信號(hào)進(jìn)行信息傳遞和處理。神經(jīng)元的結(jié)構(gòu)和功能非常復(fù)雜,涉及到許多不同的方面。 一、神經(jīng)元的形態(tài)結(jié)構(gòu)
    的頭像 發(fā)表于 07-03 11:33 ?1300次閱讀

    神經(jīng)元的分類包括哪些

    神經(jīng)元神經(jīng)系統(tǒng)的基本功能單位,它們通過電信號(hào)和化學(xué)信號(hào)進(jìn)行信息傳遞和處理。神經(jīng)元的分類非常復(fù)雜,可以根據(jù)不同的標(biāo)準(zhǔn)進(jìn)行分類。 一、神經(jīng)元的基本概念 1.1
    的頭像 發(fā)表于 07-03 11:36 ?1304次閱讀

    人工神經(jīng)元模型的三要素是什么

    人工神經(jīng)元模型是人工智能和機(jī)器學(xué)習(xí)領(lǐng)域中非常重要的概念之一。它模仿了生物神經(jīng)元的工作方式,通過數(shù)學(xué)和算法來實(shí)現(xiàn)對數(shù)據(jù)的處理和學(xué)習(xí)。 一、人工神經(jīng)元模型的基本概念 1.1 生物
    的頭像 發(fā)表于 07-11 11:13 ?941次閱讀

    人工神經(jīng)元模型中常見的轉(zhuǎn)移函數(shù)有哪些

    人工神經(jīng)元模型是神經(jīng)網(wǎng)絡(luò)的基礎(chǔ),它模擬了生物神經(jīng)元的工作原理。在人工神經(jīng)元模型中,轉(zhuǎn)移函數(shù)起著至關(guān)重要的作用,它決定了
    的頭像 發(fā)表于 07-11 11:22 ?1117次閱讀

    人工神經(jīng)元模型的基本構(gòu)成要素

    ,它能夠接收、處理和傳遞信息。在人工神經(jīng)元模型中,神經(jīng)元的基本結(jié)構(gòu)包括輸入、輸出和激活函數(shù)。 1.1 輸入 神經(jīng)元的輸入是一組數(shù)值,通常用向量表示。這些數(shù)值可以是特征值、像素值等,它們
    的頭像 發(fā)表于 07-11 11:28 ?1306次閱讀

    神經(jīng)元模型激活函數(shù)通常有哪幾類

    神經(jīng)元模型激活函數(shù)神經(jīng)網(wǎng)絡(luò)中的關(guān)鍵組成部分,它們負(fù)責(zé)在神經(jīng)元之間引入非線性,使得神經(jīng)網(wǎng)絡(luò)能夠?qū)W
    的頭像 發(fā)表于 07-11 11:33 ?1075次閱讀

    神經(jīng)元是什么?神經(jīng)元神經(jīng)系統(tǒng)中的作用

    神經(jīng)元,又稱神經(jīng)細(xì)胞,是神經(jīng)系統(tǒng)的基本結(jié)構(gòu)和功能單位。它們負(fù)責(zé)接收、整合、傳導(dǎo)和傳遞信息,從而參與和調(diào)控神經(jīng)系統(tǒng)的各種活動(dòng)。神經(jīng)元在形態(tài)上高
    的頭像 發(fā)表于 07-12 11:49 ?1297次閱讀
    <b class='flag-5'>神經(jīng)元</b>是什么?<b class='flag-5'>神經(jīng)元</b>在<b class='flag-5'>神經(jīng)</b>系統(tǒng)中的作用