前饋神經(jīng)網(wǎng)絡基本原理及兩層ReLU網(wǎng)絡的Pytorch實現(xiàn)

1 神經(jīng)元

神經(jīng)元是構成神經(jīng)網(wǎng)絡的基本單元,接受一組輸入信號并產(chǎn)生輸出

1.1 基本機制

接收一個列向量輸入X=[x_1, x_2,\cdot\cdot\cdot, x_d]^T嘁扼,通過下列表達式產(chǎn)生凈輸出z

z =W^TX + b

  • 行向量\omega = [\omega_1,\omega_2, \cdot\cdot\cdot,\omega_d]為權重向量
  • b為偏置

凈輸入z通過激活函數(shù)f(\cdot)杉适,得到輸入為X時該神經(jīng)元的活性值a

a = f(z)
圖示

神經(jīng)元的基本結構圖示

1.2 激活函數(shù)

1.2.1 為什么需要激活函數(shù)蕊玷?

神經(jīng)網(wǎng)絡屬于非線性分類氓英。當輸入X與權重W及偏置b經(jīng)過線性組合之后得到凈輸出z馋吗,如果沒有激活函數(shù)對凈輸出z的處理镊折,那么不管有多少神經(jīng)元最后得到的輸出仍然是線性輸出胯府,這也就是為什么感知機無法處理XOR(異或)問題的原因。而經(jīng)非線性的激活函數(shù)的處理之后恨胚,神經(jīng)網(wǎng)絡得以解決這一問題骂因。

1.2.2 激活函數(shù)的特征
  • 連續(xù)并可導的非線性函數(shù),連續(xù):每一個凈輸入則產(chǎn)生對應的活性值赃泡;可導:只有有限個點不可導寒波,則可以使用數(shù)值優(yōu)化的方法(如梯度下降)訓練網(wǎng)絡。
  • 激活函數(shù)的導數(shù)的值域要處于一個合適的區(qū)間升熊,因為這將影響訓練的效率及穩(wěn)定性俄烁。
1.2.3 兩種典型的激活函數(shù)

Logistic函數(shù)

\sigma(x) = \frac{1}{1+e^{(-x)}}

  • 輸入越小,越接近于0级野;輸入越大页屠,越接近1
  • 輸出值直接可以視作概率分布

ReLU函數(shù)

ReLU(x)=\left\{\begin{array}{l}{x,x \geqslant 0} \\ {0蓖柔,else}\end{array}\right.

  • x \geqslant 0時辰企,導數(shù)為1,有利于加速梯度下降的收斂
  • 一定程度上緩解了神經(jīng)網(wǎng)絡的梯度消失問題

2 網(wǎng)絡結構

網(wǎng)絡中各個神經(jīng)元根據(jù)接受信息的先后分為不同的組別况鸣,每一組視為一個神經(jīng)層牢贸。每一層的神經(jīng)元接受前一層神經(jīng)元的輸出,并輸出到下一層神經(jīng)元镐捧。整個網(wǎng)絡的信息從輸入端朝輸出端傳播潜索,不存在反向的信息傳播臭增。網(wǎng)絡結構可使用一個有向無環(huán)圖表示,整個網(wǎng)絡可以視作一個非線性函數(shù)帮辟,實現(xiàn)從輸入到輸出的復雜映射。

2.1 結構組成

共分為三大層玩焰,第0層:輸入層由驹;最后一層:輸出層;其他中間層:隱藏層

一個三層的前饋神經(jīng)網(wǎng)絡
  • L:神經(jīng)網(wǎng)絡的層數(shù)
  • m^{(l)}:第l層神經(jīng)元的個數(shù)
  • f_{l}(\cdot):第l層神經(jīng)元的激活函數(shù)
  • W^{(l)} \in \mathbb{R}^{m^{(l)} \times m^{l-1}}l ? 1 層到第 l 層的權重矩陣
  • \mathbf昔园^{(l)} \in \mathbb{R}^{m^{l}}l 層神經(jīng)元的凈輸入
  • \mathbf{a}^{(l)} \in \mathbb{R}^{m^{l}}:表示 l 層神經(jīng)元的輸出(活性值)

3 反向傳播算法

為了訓練參數(shù)蔓榄,最小化損失函數(shù)\mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})∧眨可采用梯度下降(通過計算損失函數(shù)\mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})對參數(shù)的偏導數(shù)甥郑,不斷迭代使得損失函數(shù)最小化)等算法。而梯度下降需要對每一個參數(shù)求解偏導荤西,效率低下澜搅。故誕生了反向傳播算法

3.1 算法思路

  1. 前饋計算每一層的凈輸入與輸出(活性值)
  2. 反向傳播計算每一層的誤差項\frac{\partial \mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})}{\partial \mathbf{z}^{(l)}}(表示第l層的神經(jīng)元對損失函數(shù)的影響)
  3. 計算每一層關于參數(shù)的偏導數(shù),并更新參數(shù)

3.2 數(shù)學原理

根據(jù)鏈式求導法則邪锌,可令損失函數(shù)\mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})對權重及偏置的偏導數(shù)分別如下

\frac{\partial \mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})}{\partial W^{(l)}}=\frac{\partial \mathbf{z}^{(l)}}{\partial W^{(l)}} \delta^{(l)}
\frac{\partial \mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})}{\partial \mathbf勉躺^{(l)}}=\frac{\partial \mathbf{z}^{(l)}}{\partial \mathbf^{(l)}} \delta^{(l)}

  • 其中\frac{\partial \mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})}{\partial \mathbf觅丰^{(l)}}=\delta^{(l)}

由上列表達式可只饵溅,想要求損失函數(shù)對于第l層的神經(jīng)元的偏導可以通過求解\frac{\partial \mathbf{z}^{(l)}}{\partial W^{(l)}}, \frac{\partial \mathbf{z}^{(l)}}{\partial \mathbf^{(l)}}\delta^{(l)}可一次性求得妇萄。

  • \frac{\partial \mathbf{z}^{(l)}}{\partial W^{(l)}} = \left(\mathbf{a}^{(l-1)}\right)^{\mathrm{T}}
  • \frac{\partial \mathbf{z}^{(l)}}{\partial \mathbf蜕企^{(l)}}=\mathbf{I}_{m^{(l)}} \in \mathbb{R}^{m^{(l)} \times m^{(l)}}
  • \delta^{(l)}=f_{l}^{\prime}\left(\mathbf{z}^{(l)}\right) \odot\left(\left(W^{(l+1)}\right)^{\mathrm{T}} \delta^{(l+1)}\right)

\mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})關于第 l 層權重 W^{(l)}的梯度為
\frac{\partial \mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})}{\partial W^{(l)}}=\delta^{(l)}\left(\mathbf{a}^{(l-1)}\right)^{\mathrm{T}}
\mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})關于第 l 層權重 \mathbf^{(l)}的梯度為\frac{\partial \mathcal{L}(\mathbf{y}, \hat{\mathbf{y}})}{\partial \mathbf冠句^{(l)}}=\delta^{(l)}
其中\delta^{(l)}=f_{l}^{\prime}\left(\mathbf{z}^{(l)}\right) \odot\left(\left(W^{(l+1)}\right)^{\mathrm{T}} \delta^{(l+1)}\right)\odot代表點積)


4 自動微分

在以計算機中轻掩,一種求解導數(shù)的精確且方便的計算方式。通過鏈式法則將復雜的表達式拆分成更簡單而精確的形式懦底。

f(x;\omega,b) = \frac{1}{e^{-(\omega x+b)}+1}
求解過程:

  • h_{1}=x \times w
  • h_{2}=h_{1}+b
  • h_{3}=h_{2} \times-1
  • h_{4}=e^ \left(h_{3}\right)
  • h_{5}=h_{4}+1
  • h_{6}=1 / h_{5}
  1. 求得上述表達式偏導數(shù)
  • \frac{\partial h_{1}}{\partial w}=x \qquad \frac{\partial h_{1}}{\partial x}=w
  • \frac{\partial h_{2}}{\partial h_{1}}=1 \qquad \frac{\partial h_{2}}{\partial b}=1
  • \frac{\partial h_{3}}{\partial h_{2}}=-1
  • \frac{\partial h_{4}}{\partial h_{3}}=e^ \left(h_{3}\right)
  • \frac{\partial h_{5}}{\partial h_{4}}=1
  • \frac{\partial h_{6}}{\partial h_{5}}=-\frac{1}{h_{5}^{2}}

\begin{aligned} \frac{\partial f(x ; w, b)}{\partial w} &=\frac{\partial f(x ; w, b)}{\partial h_{6}} \frac{\partial h_{6}}{\partial h_{5}} \frac{\partial h_{5}}{\partial h_{4}} \frac{\partial h_{4}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{2}} \frac{\partial h_{2}}{\partial h_{1}} \frac{\partial h_{1}}{\partial w} \\ \frac{\partial f(x ; w, b)}{\partial b} &=\frac{\partial f(x ; w, b)}{\partial h_{6}} \frac{\partial h_{6}}{\partial h_{5}} \frac{\partial h_{5}}{\partial h_{4}} \frac{\partial h_{4}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{2}} \frac{\partial h_{2}}{\partial b} \end{aligned}


5 優(yōu)化

在訓練神經(jīng)網(wǎng)絡時放典,有兩大問題難以解決:

  • 非凸優(yōu)化(容易陷入局部最優(yōu)解)
  • 梯度消失(參數(shù)學習停止)

6 兩層ReLU網(wǎng)絡的Pytorch實現(xiàn)

6.1 Code

導入Pytorch框架
import torch
import torch.nn as nn
import torch.nn.functional as F

from matplotlib import pyplot as plt
網(wǎng)絡實現(xiàn)
class Net(nn.Module):
    
    def __init__(self, n_input, n_hidden, n_output):
        super(Net, self).__init__()
        # 定義層的形式
        self.hidden = torch.nn.Linear(n_input, n_hidden)
        self.output = torch.nn.Linear(n_hidden, n_output)
    
    def forward(self, x):
        # 隱藏層輸出
        hidden = F.relu(self.hidden(x))
        # 輸出層
        y_predict = self.output(hidden)
        return y_predict
    
    def train(self, x, y, learning_rate, train_num):
        # 優(yōu)化器
        optimizer = torch.optim.SGD(self.parameters(), learning_rate)
        # 損失函數(shù),均方差
        loss_func = torch.nn.MSELoss()
        # 迭代訓練
        for i in range(train_num):
            # 預測
            y_predict = self(x)
            # 計算誤差
            loss = loss_func(y_predict, y)
            # 情況上一次參與更新值
            optimizer.zero_grad()
            # 計算反向傳播
            loss.backward()
            # 更新參數(shù)
            optimizer.step()
            print(str(i) + "----->" + "loss:" + str(loss.data.numpy()))

6.2 擬合曲線y=\sin x效果(學習率:0.1)

訓練數(shù)據(jù)擬合
測試數(shù)據(jù)擬合
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市基茵,隨后出現(xiàn)的幾起案子奋构,更是在濱河造成了極大的恐慌,老刑警劉巖拱层,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弥臼,死亡現(xiàn)場離奇詭異,居然都是意外死亡根灯,警方通過查閱死者的電腦和手機径缅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門掺栅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纳猪,你說我怎么就攤上這事氧卧。” “怎么了氏堤?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵沙绝,是天一觀的道長。 經(jīng)常有香客問我鼠锈,道長闪檬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任购笆,我火速辦了婚禮粗悯,結果婚禮上,老公的妹妹穿的比我還像新娘同欠。我一直安慰自己样傍,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布铺遂。 她就那樣靜靜地躺著铭乾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娃循。 梳的紋絲不亂的頭發(fā)上炕檩,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音捌斧,去河邊找鬼笛质。 笑死,一個胖子當著我的面吹牛捞蚂,可吹牛的內容都是我干的妇押。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼姓迅,長吁一口氣:“原來是場噩夢啊……” “哼敲霍!你這毒婦竟也來了?” 一聲冷哼從身側響起丁存,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肩杈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后解寝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扩然,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年聋伦,在試婚紗的時候發(fā)現(xiàn)自己被綠了夫偶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片界睁。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兵拢,靈堂內的尸體忽然破棺而出翻斟,到底是詐尸還是另有隱情,我是刑警寧澤说铃,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布访惜,位于F島的核電站,受9級特大地震影響截汪,放射性物質發(fā)生泄漏疾牲。R本人自食惡果不足惜植捎,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一衙解、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焰枢,春花似錦蚓峦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荐绝,卻和暖如春一汽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背低滩。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工召夹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恕沫。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓监憎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婶溯。 傳聞我的和親對象是個殘疾皇子鲸阔,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容