1. 程式人生 > >《Python 深度學習》——第二章 神經網路的數學基礎

《Python 深度學習》——第二章 神經網路的數學基礎

內容:

  1. 第一個神經網路示例
  2. 張量與張量運算
  3. 神經網路如何通過反向傳播與梯度下降進行學習

張量,張量運算,微分,梯度下降


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'])

 

三個引數:

  1. 損失函式(loss function)
  2. 優化器(optimizer)
  3. 在訓練和測試過程中需要監控的指標(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  關鍵屬性

  1. 軸的個數(階):ndim
  2. 形狀:shape
  3. 資料型別:dtype

2.2.6  在Numpy中操作張量

張量切片(tensor  slicing)

2.2.7  資料批量的概念

第一個軸:樣本軸(samples axis,樣本維度)

深度學習模型將資料拆分成小批量

批量軸(batch axis)或批量維度(batch dimension)

2.2.8  現實世界中的資料張量

  1. 向量資料:2D張量,形狀(samples,feature)
  2. 時間序列資料或序列資料:3D張量,形狀(sample,timesteps,feature)
  3. 影象:4D張量,形狀(samples,height,width,channels)或(samples,channels,height,width)
  4. 視訊: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)

  1. 抽取訓練樣本x和對應目標y組成的資料批量
  2. 在x上執行網路(前向傳播(forward pass)),得到預測值y_pred
  3. 計算網路在這批資料上的損失,用於衡量y_pred和y之間的距離
  4. 計算損失相對於網路的梯度(反向傳播(back pass))
  5. 沿梯度反方向移動,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  回顧第一個例子


本章小結

學習:找到一組引數,使損失函式最小化

學習的過程:每一個批量,更新一次梯度。在乘以學習率

可微,才可使用求導的鏈式法則

損失:需要最小化的量

優化器:使用梯度更新的具體方式