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ò)類型
機(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)元接收來自個其他的神經(jīng)元傳遞過來的輸入信號
- 這些信號帶著自己的連接權(quán)重一起過來
- 當(dāng)前神經(jīng)元的總輸入:
- 將神經(jīng)元的總輸入和閾值進(jìn)行比較杠园,再通過激活函數(shù)進(jìn)行處理并輸出
神經(jīng)網(wǎng)絡(luò)就是包含了多個參數(shù)的數(shù)學(xué)模型,這個模型就是若干個參數(shù)彤恶。
感知機(jī)
感知機(jī)簡介
簡單的兩層神經(jīng)網(wǎng)絡(luò)卸耘,感知機(jī)是線性分類判別模型。
- 輸入層接收來自外界的出入信號越驻,傳遞給輸出層
- 輸入信號有自己的權(quán)值
- 輸出層是MP-神經(jīng)元模型(也叫閾值邏輯單元)
- 感知機(jī)還有自己的偏置
上式的向量形式為
上面的表示感知機(jī)的凈活性值,加上激活函數(shù)之后變成活性值:
激活函數(shù)可以是階躍函數(shù)道偷,也可以是符號函數(shù)缀旁;一般選用的符號函數(shù)
感知機(jī)模型
感知機(jī)模型就是上文中的
為了方便,直接將模型改成:
是一個n維空間中的超平面S勺鸦,其中w是超平面的法向量并巍,b是超平面的截距,這個超平面將特征空間劃分成兩部分祝旷,位于兩部分的點(diǎn)分別被分為正負(fù)兩類履澳,所以超平面S稱為分離超平面嘶窄。
對于二分類的正確分類有:
- 正例輸出
- 負(fù)例輸出
那么柄冲,輸入空間的某個點(diǎn)到的距離為
叫函數(shù)間隔吻谋,除模長之后叫幾何間隔,幾何間隔可以認(rèn)為是物理意義上的實際長度现横。
對于誤分類點(diǎn)有:
- 輸出
- 輸出
那么總有:
因此誤分類點(diǎn)到超平面的距離總是:
全部的誤分類點(diǎn)到超平面的距離是
不考慮前面的系數(shù)戒祠,得到感知機(jī)的損失函數(shù)
感知機(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)。
通過矩陣表示上述網(wǎng)絡(luò)層的運(yùn)算:
- 輸入的為告喊,b是樣本數(shù)量麸拄,是輸入節(jié)點(diǎn)數(shù)
- 權(quán)值矩陣W,其為葱绒,其中是輸出節(jié)點(diǎn)數(shù)
- 偏置b的是
如果是2個樣本參與運(yùn)算感帅,
輸出矩陣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ò)爷肝。
張量實現(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)
在輸入值較大或者較小的時候都是很容易出現(xiàn)梯度彌散現(xiàn)象靡砌。
ReLU
- 單邊抑制
- 相對寬松的邊界
- 通過
tf.nn.relu
實現(xiàn)
LeakyReLU
ReLU
函數(shù)在?? < 0時梯度值恒為 0已脓,也可能會造成梯度彌散現(xiàn)象,為了克服這個問 題通殃,LeakyReLU
函數(shù)被提出度液。通過tf.nn.leaky_relu
來實現(xiàn)
?,上述函數(shù)退化為?
-
? ,當(dāng)?能夠獲得較小的梯度值?
Tanh
Tanh
函數(shù)能夠?qū)?的輸入壓縮到[-1,1]之間恨诱,定義為tanh
激活函數(shù)可通過Sigmoid
函數(shù)縮放平移后實現(xiàn)媳瞪。通過tf.nn.tanh()
實現(xiàn)
輸出層設(shè)計
四種設(shè)計
根據(jù)輸出值的區(qū)間來進(jìn)行分類:
- 輸出屬于整個實數(shù)區(qū)間,如正弦函數(shù)曲線預(yù)測照宝、年齡的預(yù)測蛇受、股票的走勢預(yù)測等
- 輸出值落在[0,1]之間,如圖片的像素歸一化到[0,1]之間
- 厕鹃,輸出值落在[0,1]之前兢仰,且所有的的輸出值之和為1。通過添加Softmax函數(shù)來實現(xiàn)功能
-
輸出值在[-1,1]剂碴,使用
tf.tanh(x)
來實現(xiàn)
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ù)的輸出漫拭。
- 當(dāng)
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的值總是大于等于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ù)集中第類樣本占的比例是懒鉴,則的信息熵定義為:
比如:某個事件發(fā)生的結(jié)果有3中情形诡挂,出現(xiàn)的概率分別是:
結(jié)果1 | 結(jié)果2 | 結(jié)果3 |
---|---|---|
信息熵的計算如下:
交叉熵 Cross Entropy 的定義為
通過變換碎浇,交叉熵可以分解為 p 的熵??(??)與 p,q 的 KL 散度(Kullback-Leibler Divergence)的和
其中 KL 定義為
KL散度是衡量連個分布之間距離的指標(biāo)歼捏。交叉熵和KL散度都是不對稱的声畏。
神經(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