TensorFlow深度學(xué)習(xí)-第六章

Char6-神經(jīng)網(wǎng)絡(luò)neural networks

本章中主要講解的內(nèi)容包含:

  • 神經(jīng)模型的簡介

  • 感知機(jī)模型

  • 全連接網(wǎng)絡(luò)

  • 神經(jīng)網(wǎng)絡(luò)介紹

  • 常見的激活函數(shù)

  • 輸出層設(shè)計方案

  • 誤差類型

  • 神經(jīng)網(wǎng)絡(luò)類型

image

機(jī)器學(xué)習(xí)的目的是找到一組良好的參數(shù)?,使得其表示的數(shù)學(xué)模型能夠很好地從訓(xùn)練數(shù)據(jù)集中學(xué)到映射關(guān)系?

神經(jīng)元模型

MP-神經(jīng)模型

神經(jīng)網(wǎng)絡(luò)是由具有自適應(yīng)性的簡單單元組成的并行互連的網(wǎng)絡(luò)徊都。下圖是經(jīng)典的MP-神經(jīng)元模型关筒。

  • 當(dāng)前神經(jīng)元接收來自n個其他的神經(jīng)元傳遞過來的輸入信號x_i
  • 這些信號帶著自己的連接權(quán)重w_i一起過來
  • 當(dāng)前神經(jīng)元的總輸入:\sum^n_{i=1}x_iw_i
  • 將神經(jīng)元的總輸入和閾值\theta進(jìn)行比較杠园,再通過激活函數(shù)進(jìn)行處理并輸出

y = f(\sum^n_{i=1}w_ix_i-\theta)

image

神經(jīng)網(wǎng)絡(luò)就是包含了多個參數(shù)的數(shù)學(xué)模型,這個模型就是若干個參數(shù)彤恶。

y_i = f(\sum_{i=1}w_ix_i-\theta _i)

感知機(jī)

感知機(jī)簡介

簡單的兩層神經(jīng)網(wǎng)絡(luò)卸耘,感知機(jī)是線性分類判別模型。

  • 輸入層接收來自外界的出入信號x=[x_1,…,x_n]越驻,傳遞給輸出層
  • 輸入信號有自己的權(quán)值[w_1,…,w_n]
  • 輸出層是MP-神經(jīng)元模型(也叫閾值邏輯單元)
  • 感知機(jī)還有自己的偏置b

z=w_1x_1+w_2x_2+...+w_nx_n+b

image

上式的向量形式為

z=w^T \cdot x+b
上面的z表示感知機(jī)的凈活性值,加上激活函數(shù)之后變成活性值:
a=\sigma(z)=\sigma(w^T \cdot x+b)
激活函數(shù)可以是階躍函數(shù)道偷,也可以是符號函數(shù)缀旁;一般選用的符號函數(shù)sign(x)

image

感知機(jī)模型

感知機(jī)模型就是上文中的

sign(w^Tx+b)=0

image

為了方便,直接將模型改成:
sign(w\cdot x+b)=0
wx+b是一個n維空間中的超平面S勺鸦,其中w是超平面的法向量并巍,b是超平面的截距,這個超平面將特征空間劃分成兩部分祝旷,位于兩部分的點(diǎn)分別被分為正負(fù)兩類履澳,所以超平面S稱為分離超平面嘶窄。

對于二分類的正確分類有:

  • 正例輸出y_i = +1怀跛, w\cdot x_i+b>0
  • 負(fù)例輸出y_i = -1, w\cdot x_i+b<0

那么柄冲,輸入空間的某個點(diǎn)x_0S的距離為
\frac{1}{||w||}|w\cdot x_0+b|
|wx+b|叫函數(shù)間隔吻谋,除模長之后叫幾何間隔,幾何間隔可以認(rèn)為是物理意義上的實際長度现横。

對于誤分類點(diǎn)有:

  • 輸出y_i = -1漓拾, w\cdot x_i+b>0
  • 輸出y_i = +1, w\cdot x_i+b<0

那么總有:
-y_i(w\cdot x_i+b) > 0

因此誤分類點(diǎn)x_i到超平面的距離總是:
-\frac{1}{||w||}y_i(w\cdot x_i+b) > 0
全部的誤分類點(diǎn)到超平面的距離是
-\frac{1}{||w||}\sum_{x_i\in M}y_i(w\cdot x_i+b) > 0
不考慮前面的系數(shù)戒祠,得到感知機(jī)sign(w\cdot x)的損失函數(shù)
L(w,b)=-\sum_{x_i \in M}y_i(w \cdot x_i+b)

感知機(jī)算法

1. 初始化參數(shù)w_0,b_0
2. 循環(huán)過程:
    3. 在訓(xùn)練集中選取數(shù)據(jù)(x_i,y_i)
    4. 計算感知機(jī)的輸出a=sign(w^Tx_i+b)
    5. 如果輸出a和真實值y_i不等:
            6. 更新w
            7. 更新b
   8.轉(zhuǎn)至步驟2骇两,直至訓(xùn)練集中沒有誤分類點(diǎn)
9. 輸出w,b

過程解釋:如果一個誤分類點(diǎn)在超平面的一側(cè),調(diào)整兩個參數(shù)姜盈,使得超平面向著該誤分類點(diǎn)移動低千,以此來減少誤分類點(diǎn)的和分離超平面的距離,直至超平面將該點(diǎn)正確分類馏颂。

全連接層

感知機(jī)模型的不可導(dǎo)限制了它的潛力示血,全連接層將不連續(xù)的階躍函數(shù)換成了平滑連續(xù)的激活函數(shù)棋傍,通過堆疊多層網(wǎng)絡(luò)實現(xiàn)。

每個輸出節(jié)點(diǎn)和全部的輸出相連接的網(wǎng)絡(luò)層稱之為全連接層

下圖中3個輸出难审,2個神經(jīng)元瘫拣,2個輸出節(jié)點(diǎn)。

image

通過矩陣表示上述網(wǎng)絡(luò)層的運(yùn)算:
O=X@W+b

image

  • 輸入xshape[b,d_{in}]告喊,b是樣本數(shù)量麸拄,d_{in}是輸入節(jié)點(diǎn)數(shù)
  • 權(quán)值矩陣W,其shape[d_{in}, d_{out}]葱绒,其中d_{out}是輸出節(jié)點(diǎn)數(shù)
  • 偏置b的shaped_{out}

如果是2個樣本參與運(yùn)算感帅,??^1 = [??^1_1, ??^1_2, ??^1_3],??^2 = [??_1^2, ??^2_2, ??^2_3]

image

輸出矩陣O的為

張量實現(xiàn)

定義好權(quán)值張量和偏置張量地淀,利用批量矩陣相乘函數(shù)`tf.matmul()``

"""
輸入X矩陣為??=2個樣本(2行失球,2個樣本)
每個樣本的輸入特征長度為?????? = 784(784個屬性特征)
輸出節(jié)點(diǎn)數(shù)為???????? = 256
定義權(quán)值矩陣W的shape為[784,256],并采用正態(tài)分布初始化W;
偏置向量b的shape定義為[256]
在計算完X@W后相加即可帮毁,最終全連接層的輸出O的shape為[2,256]实苞,即2個樣本的特征,每個特征長度為 256烈疚。
"""

x = tf.random.normal([2,784])
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
o1 = tf.matmul(x, w1) + b1
o1 = tf.nn.relu(o1)

層方式

通過layers.Dense(units, activation)

import tensorflow as tf
x = tf.random.normal([4, 28*28])
from tf.keras import layers
# 創(chuàng)建全連接層黔牵,指定輸出節(jié)點(diǎn)數(shù)和激活函數(shù)
fc = layers.Denss(512, activation=tf.nn.relu)  # 激活函數(shù)也可以不指定
h1 = fc(x)  # 通過fc完成一次全連接的計算
fc.kernal   # 獲取權(quán)值矩陣
fc.bias   # 獲取Dense類的偏置
fc.trainable_variables   # 返回的是待優(yōu)化參數(shù)的列表
fc.variables  # 返回所有的參數(shù)列表

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

保證前一層的輸出節(jié)點(diǎn)數(shù)與當(dāng)前層的輸入節(jié)點(diǎn)數(shù)匹配,即可堆疊出任意層數(shù)的網(wǎng)絡(luò)爷肝。

image

張量實現(xiàn)

# 定義隱藏層1的張量
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))

# 定義隱藏層2的張量
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
b2 = tf.Variable(tf.zeros([128]))

# 定義隱藏層3的張量
w3 = tf.Variable(tf.random.truncated_normal([128猾浦,64], stddev=0.1))
b3 = tf.Variable(tf.zeros([64]))

# 輸出層張量
w4 = tf.Variable(tf.random.truncated_normal([64,10], stddev=0.1))
b4 = tf.Variable(tf.zeros([10]))

"""
計算時,只需要按照網(wǎng)絡(luò)層的順序灯抛,將上一層的輸出送入當(dāng)前層的輸入即可金赦,重復(fù)直至 最后一層,將輸出層的輸出作為網(wǎng)絡(luò)的輸出:
"""

with tf.GradienTape() as tape:   # 必須將前向計算過程放入tf.GradienTape()環(huán)境中对嚼,利用 GradientTape 對象的 gradient()方法自動求解參數(shù)的梯 度夹抗,并利用 optimizers 對象更新參數(shù)
  # x: [b, 28*28]
  # 隱藏層 1 前向計算,[b, 28*28] => [b, 256]
  h1 = x@w1 + tf.broadcast_to(b1, [x.shape[0],256])
  h1 = tf.nn.relu(h1)
  
  h2 = h1@w2 + b2
  h2 = tf.nn.relu(h2)
  
  h3 = h2@w3 + b3
  h3 = tf.nn.relu(h3)
  
  # 輸出層前向計算纵竖,[b, 64] => [b, 10]
  h4 = h3@w4 + b4

層方式

通過layer.Dense類來實現(xiàn)

# 方式1:將每個網(wǎng)絡(luò)分別建立出來漠烧,并且指定激活函數(shù)
x = tf.random.normal([4,28*28])
fc1 = layers.Dense(256, activation=tf.nn.relu)
fc2 = layers.Dense(128, activation=tf.nn.relu)
fc3 = layers.Dense(64, activation=tf.nn.relu)
fc4 = layers.Dense(10, activation=None)

# 依次通過各個層
x = tf.random.normal([4,28*28])
h1 = fc1(x)
h2 = fc2(h1)
h3 = fc3(h2)
h4 = fc4(h3)  # 通過輸出層得到網(wǎng)絡(luò)輸出

# 通過Sequential容器來進(jìn)行封裝
x = tf.random.normal([4,28*28])
model = layers.Sequential({
  layers.Dense(256, activation=tf.nn.relu),   # 創(chuàng)建隱藏層 1
  layers.Dense(128, activation=tf.nn.relu) , # 創(chuàng)建隱藏層 2
  layers.Dense(64, activation=tf.nn.relu) , # 創(chuàng)建隱藏層 3
  layers.Dense(10, activation=None) , # 創(chuàng)建輸出層
})

out = model(x)

激活函數(shù)

Sigmoid

Sigmoid 函數(shù)也叫Logistic 函數(shù),tf.nn.sigmoid(x)實現(xiàn)
Sigmoid := \frac{1}{1+e^{-x}}
在輸入值較大或者較小的時候都是很容易出現(xiàn)梯度彌散現(xiàn)象靡砌。

image

ReLU

  • 單邊抑制
  • 相對寬松的邊界
  • 通過tf.nn.relu實現(xiàn)
image
image

LeakyReLU

ReLU 函數(shù)在?? < 0時梯度值恒為 0已脓,也可能會造成梯度彌散現(xiàn)象,為了克服這個問 題通殃,LeakyReLU函數(shù)被提出度液。通過tf.nn.leaky_relu來實現(xiàn)

image
  • ?,上述函數(shù)退化為?

  • ? ,當(dāng)?能夠獲得較小的梯度值?

    image

    Tanh

    Tanh函數(shù)能夠?qū)?的輸入壓縮到[-1,1]之間恨诱,定義為

    tanh 激活函數(shù)可通過 Sigmoid 函數(shù)縮放平移后實現(xiàn)媳瞪。通過tf.nn.tanh()實現(xiàn)

    image

輸出層設(shè)計

四種設(shè)計

根據(jù)輸出值的區(qū)間來進(jìn)行分類:

  • o \in R^d輸出屬于整個實數(shù)區(qū)間,如正弦函數(shù)曲線預(yù)測照宝、年齡的預(yù)測蛇受、股票的走勢預(yù)測等
  • o \in [0,1]輸出值落在[0,1]之間,如圖片的像素歸一化到[0,1]之間
  • o \in [0,1], \sum_io_i=1厕鹃,輸出值落在[0,1]之前兢仰,且所有的的輸出值之和為1。通過添加Softmax函數(shù)來實現(xiàn)功能
  • o \in [-1,1]輸出值在[-1,1]剂碴,使用tf.tanh(x)來實現(xiàn)
    image

softmax函數(shù)

Dense層類似把将,Softmax函數(shù)還可以作為網(wǎng)絡(luò)層來使用。通過類layers.Softmax(axis=-1)忆矛。

輸入值較大察蹲,會出現(xiàn)溢出現(xiàn)象。同時實現(xiàn)Softmax函數(shù)和交叉熵?fù)p失函數(shù)催训,接口為tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False)

  • y_true 代表了one-hot 編碼后的真實標(biāo)簽
  • y_pred 表示網(wǎng)絡(luò)的預(yù)測值
    • 當(dāng) from_logits = True 時洽议,y_pred 表示須為未經(jīng)過 Softmax函數(shù)的變量 z
    • 當(dāng)from_logits = False 時,y_pred 表示為經(jīng)過Softmax 函數(shù)的輸出漫拭。
z = tf.random.normao([2,10])
y_onehot = tf.constant([1,3])
y_onehot = tf.one_hot(y_onehot, depth=10)
# 輸出層未使用Softmax函數(shù)亚兄,設(shè)置成True
loss = keras.losses.categorical_crossentropy(y_onehot,z,from_logits=True)
loss = tf.reduce_mean(loss)

# 可以利用 losses.CategoricalCrossentropy(from_logits)類方式同時實現(xiàn) Softmax與交叉熵?fù)p失函數(shù)的計算
ctiteon = keras.losses.CategoricalCrossentropy(from_logits=True)
loss = criteon(y_onehot, z)

誤差類型

均方差

均方差MSE,mean squared error:將輸出向量和真實向量映射到笛卡爾坐標(biāo)系上的兩個點(diǎn)采驻,計算兩點(diǎn)之間的歐式距離(平方)
MSE=\frac{1}{d_{out}}\sum^{d_{out}}_{i=1}(y_i-o_i)^2

  • MSE的值總是大于等于0审胚;當(dāng)其為0表示輸出值等于真實標(biāo)簽
  • 主要用于回歸問題
o = tf.random.normal([2,10]) # 構(gòu)造網(wǎng)絡(luò)
y_onehot = tf.constant([1,3]) # 真實輸出
y_onehot = tf.one_hot(y_onehot, depth=10)
loss = keras.losses.MSE(y_onehot, o)  # 計算均方差,返回的是每個樣本的均方差
loss = tf.reduce_mean(loss)  # 計算batch均方差

# 通過類的方式實現(xiàn)
criteon = keras.losses.MeanSquaredError()
loss = criteon(y_onehot, o)

交叉熵

熵是用來衡量信息的不確定性礼旅。熵越大膳叨,代表不確定越大,信息量越大各淀。

假設(shè)數(shù)據(jù)集D中第k類樣本占的比例是p_k(k=1,2,…,K)懒鉴,則D信息熵定義為:
Ent(D)=-\sum^K_{k=1} p_klog_2{p_k}
比如:某個事件發(fā)生的結(jié)果有3中情形诡挂,出現(xiàn)的概率分別是:

結(jié)果1 結(jié)果2 結(jié)果3
\frac{1}{3} \frac{1}{2} \frac{1}{6}

信息熵的計算如下:

Ent=-(\frac{1}{3}log_2\frac{1}{3}+\frac{1}{2}log_2\frac{1}{2}+\frac{1}{6}log_2\frac{1}{6})
交叉熵 Cross Entropy 的定義為
H(p,q)= -\sum_{i=0}p(i)log_2q(i)
通過變換碎浇,交叉熵可以分解為 p 的熵??(??)與 p,q 的 KL 散度(Kullback-Leibler Divergence)的和
H(p,q)=H(p)+D_{KL}(p|q)
其中 KL 定義為
??_{????}(??|??) = ∑_{x\in X} ??(??)?????? \frac{??(??)}{q(x)}
KL散度是衡量連個分布之間距離的指標(biāo)歼捏。交叉熵和KL散度都是不對稱的声畏。
H(p,q) \neq H(q,p) \\D_{KL} (p|q) \neq D_{KL}(q|p)

神經(jīng)網(wǎng)絡(luò)類型

  • 卷積神經(jīng)網(wǎng)絡(luò)CNN
  • 循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
  • 注意力網(wǎng)絡(luò)Transformer
  • 圖神經(jīng)網(wǎng)絡(luò)GCN
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仅讽,一起剝皮案震驚了整個濱河市胞谭,隨后出現(xiàn)的幾起案子虹脯,更是在濱河造成了極大的恐慌吴旋,老刑警劉巖妓忍,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稿黄,死亡現(xiàn)場離奇詭異,居然都是意外死亡雳旅,警方通過查閱死者的電腦和手機(jī)跟磨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒盈,“玉大人抵拘,你說我怎么就攤上這事⌒突恚” “怎么了僵蛛?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迎变。 經(jīng)常有香客問我充尉,道長,這世上最難降的妖魔是什么衣形? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任驼侠,我火速辦了婚禮,結(jié)果婚禮上谆吴,老公的妹妹穿的比我還像新娘泪电。我一直安慰自己,他們只是感情好纪铺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布相速。 她就那樣靜靜地躺著,像睡著了一般鲜锚。 火紅的嫁衣襯著肌膚如雪突诬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天芜繁,我揣著相機(jī)與錄音旺隙,去河邊找鬼。 笑死骏令,一個胖子當(dāng)著我的面吹牛蔬捷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榔袋,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼周拐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凰兑?” 一聲冷哼從身側(cè)響起妥粟,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吏够,沒想到半個月后勾给,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滩报,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年播急,在試婚紗的時候發(fā)現(xiàn)自己被綠了脓钾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡桩警,死狀恐怖惭笑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情生真,我是刑警寧澤沉噩,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站柱蟀,受9級特大地震影響川蒙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜长已,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一畜眨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧术瓮,春花似錦康聂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辜伟,卻和暖如春氓侧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背导狡。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工约巷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旱捧。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓独郎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枚赡。 傳聞我的和親對象是個殘疾皇子氓癌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評論 2 350