《Python 深度學習》——第二章 神經網路的數學基礎
內容:
- 第一個神經網路示例
- 張量與張量運算
- 神經網路如何通過反向傳播與梯度下降進行學習
張量,張量運算,微分,梯度下降
2.1 初識神經網路
類別(class),樣本(sample),標籤(label)
1.載入Keras中的MNIST資料集
from keras.datasets import mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
訓練集,測試集
2.網路框架
from keras import models
from keras import layers
network=models.Sequential()
network.add(layers.Dense(512,activation='relu',input_shape=(28*28,)))
network.add(layers.Dense(10,activation='softmax'))
Dense層:密集連線(全接連)
softmax層:返回概率值
3.編譯步驟
network.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
三個引數:
- 損失函式(loss function)
- 優化器(optimizer)
- 在訓練和測試過程中需要監控的指標(metric)
4.預處理
train_images=train_images.reshape((60000,28*28))
train_images=train_images.astype('float32')/255
test_images=test_images.reshape((10000,28*28))
test_images=test_images.astype('float32')/255
所有值在[0,1]區間
形狀變成:樣本數*特徵數
5.標籤處理
from keras.utils import to_categorical
train_labels=to_categorical(train_labels)
test_labels=to_categorical(test_labels)
6.擬合
network.fit(train_images,train_labels,epochs=5,batch_size=128)
batch_size指每個小批量有128樣本
epochs:迭代次數,所有資料迭代一次叫做一輪(epoch)
所以梯度要更新次數=60000/128*5=469*5=2345
訓練時顯示:損失(loss)和精度(acc)。
2.2 神經網路的資料表示
張量(tensor):基本資料結構
張量的維度(dimension)叫做軸(axis)
2.2.1 標量(0D張量)(scalar)
標量張量,零維張量,0D張量
x.ndim#檢視軸的個數,即階(rank)
2.2.2 向量(1D張量)(vector)
x=np.array([12,3,6,7,14,7])
5D向量≠5D張量=5階張量
維度(dimensionality):既表示沿某個軸的元素個數,也表示軸的個數。
2.2.3 矩陣(2D張量)(matrix)
軸1:行(row)
軸2:列(column)
2.2.4 3D張量與更高維張量
x=np.array([[[5,78,2,34,0],[6,2,4,5,1]],[[2,4,5,2,5],[3,4,5,,6,7]]]
2.2.5 關鍵屬性
- 軸的個數(階):ndim
- 形狀:shape
- 資料型別:dtype
2.2.6 在Numpy中操作張量
張量切片(tensor slicing)
2.2.7 資料批量的概念
第一個軸:樣本軸(samples axis,樣本維度)
深度學習模型將資料拆分成小批量
批量軸(batch axis)或批量維度(batch dimension)
2.2.8 現實世界中的資料張量
- 向量資料:2D張量,形狀(samples,feature)
- 時間序列資料或序列資料:3D張量,形狀(sample,timesteps,feature)
- 影象:4D張量,形狀(samples,height,width,channels)或(samples,channels,height,width)
- 視訊:5D張量,形狀(samples,frames,height,width,channels)或(samples,frames,channels,height,width)
2.2.9 向量資料
樣本軸,特徵軸
2.2.10 時間序列資料或序列資料
慣例:時間軸為第二個軸
2.2.11 影象資料
通道在後:(samples,height,width,channels):google
通道在前:(samples,channels,height,width):Theano
2.2.12 視訊資料
壓縮技術,例MPEG格式
2.3 神經網路的“齒輪”:張量運算(tensor operation)
keras.layers.Dense(512,activation='relu')
output=relu(dot(W,input)+b)
relu(x)=max(x,0)
2.3.1 逐元素運算
relu和加法是逐元素(element-wise)計算的
2.3.2 廣播(broadcast)
廣播軸
2.3.3 張量點積(tensor product)
np.dot(x,y)
2.3.4 張量變形
x.reshape((6,1))
np.transpose(x)#轉置(transposition)
2.3.5 張量運算的幾何解釋
加法幾何解釋
旋轉:與2*2矩陣R做點積,R=[u,v],u=[cos(theta),sin(theta)].T,v=[-sin(theta),cos(theta)].T
2.3.6 深度學習的幾何解釋
將兩張紙放在一起揉成一團,後分開。
2.4 神經網路的“引擎”:基於梯度的
output=relu(dot(W,input)+b)
w,b分別是kernel和bias
隨機初始化(random initialization)
迴圈訓練(training loop)
- 抽取訓練樣本x和對應目標y組成的資料批量
- 在x上執行網路(前向傳播(forward pass)),得到預測值y_pred
- 計算網路在這批資料上的損失,用於衡量y_pred和y之間的距離
- 計算損失相對於網路的梯度(反向傳播(back pass))
- 沿梯度反方向移動,W-=step*gradient
可微(differentiable),
梯度(gradient)
2.4.1 什麼是導數
2.4.2 張量運算的導數:梯度(grandien)
2.4.3 隨機梯度下降
直接通過解多個求偏導=0,來求最小值,因引數較多,不具有可行性
小批量隨機梯度下降(min-batch stochatic grandient descent)(小批量SGD)
低維表示中形成的直覺在實踐中不一定總是準確的。
SGD變體,例帶動量的SGD,Adagrad,RMSProp。
這些變體稱為優化方法(optimization method)或優化器(optimizer)
2.4.4 鏈式求導:反向傳播演算法
鏈式法則(chain rule):(f(g(x))'=f'(g(x))*g'(x)
反向傳播(backpropagation):將鏈式法則用於神經網路梯度值的計算。
2.5 回顧第一個例子
本章小結
學習:找到一組引數,使損失函式最小化
學習的過程:每一個批量,更新一次梯度。在乘以學習率
可微,才可使用求導的鏈式法則
損失:需要最小化的量
優化器:使用梯度更新的具體方式