#編譯神經網路,指定優化器、損失函式,以及評估指標
ann.
compile
(optimizer =
'adam'
,# 優化器
loss =
'binary_crossentropy'
,# 損失函式
metrics =
['acc'])
# 評估指標
其中adam就是乙個優化器。優化器的引入和神經網路的特點有十分密切的關係。
在之前的學習中我們已經了解過了線性回歸和邏輯回歸,他們兩個在進行梯度優化的時候利用的是凸函式的性質。但是在神經網路中,由於區域性最低點、鞍點(形狀類似馬鞍)的存在,損失函式變得非常複雜,先前的方法已經不再適用。下面我們將介紹幾種基本方法。
在實際應用中,人們發現區域性最低點的出現是可以接受的。如果每次訓練網路都進行權重的初始化,隨機賦值,那麼只要訓練次數足夠多,我們總能找到乙個相對優秀的區域性最低點。
對應python原始碼,引數隨機初始化的任務在keras中已經打包完成,如下圖所示。
ann.add(dense(64,
kernel_initializer =
'random_uniform'
,# 預設權重隨機初始化
bias_initializer =
'zeros'))
# 預設偏置值為0
除了上述的引數初始化方法,人們還開發了一系列優化器,下面我們將列舉幾個介紹他們的特點。
批量梯度下降(batch gradient descent,bgd)將資料拆分成一組組的小批量,進而通過向量化的計算方式進行處理。這大大提高的運算速度。
以下面**為例,批量大小為128,也就是同時訓練128個樣本。
history = model.fit(x_train, y_train,
# 指定訓練集
epochs=30,
# 指定輪次
batch_size=
128,
# 指定批量大小
validation_data=
(x_test, y_test)
)# 指定驗證集
當然批量大小設定需要考慮計算機效能。若批量太大,會超出cpu和gpu的負荷,效率反而下降。
bgd提高了效率,但其實並沒有區域性最低點的問題。因此人們又提出了另乙個優化方案:隨機梯度下降(stochastic gradient descent,sgd)。此處的隨機與引數的隨機初始化不同,而是每次只隨機選擇乙個樣本更新模型引數。因此,這種方法學習速度更快,所需輪次也更多。
顯然隨機梯度下降中,引數的更新梯度方向遠不如批量梯度下降精準,每次也不一定向著最低點進行。但是考慮一下我們設計的出發點:解決區域性最低點問題。這也是說,隨機波動正是我們需要的,這將增大我們「跳出」區域性最低點的概率,最終收斂於乙個更好的點,甚至是最低點。
sgd是早起神經網路中的常用優化器。在編譯網路時,可以指定sgd優化器。
ann.
compile
(loss = keras.losses.categorical_crossentropy,
optimizer = keras.optimizer.sgd())
# 指定sgd優化器
當然這種隨機梯度下降的方法也不是完全可靠的方法。我們不能保證每次引數的更新都朝著正確的方向。 優化演算法1 隨機梯度下降法
梯度下降公式很簡單 import numpy as np import torch from torchvision.datasets import mnist from torch.utils.data import dataloader from torch import nn from tor...
梯度下降 隨機梯度下降 批梯度下降
下面的h x 是要擬合的函式,j 損失函式,theta是引數,要迭代求解的值,theta求解出來了那最終要擬合的函式h 就出來了。其中m是訓練集的記錄條數,j是引數的個數。梯度下降法流程 1 先對 隨機賦值,可以是乙個全零的向量。2 改變 的值,使j 按梯度下降的方向減少。以上式為例 1 對於我們的...
最優化 梯度下降法
最優化問題就是求解函式極值的問題,包括極大值和極小值,幾乎所有機器學習演算法歸根到底都是在求解最優化問題。在高等數學 微積分中有求極值統一的思路 找函式導數等於0的點,只要函式可導我們就可以用這種方法。在機器學習中我們一般求函式的極小值,若求極大值我們只需要整體加負號。有些時候我們會對優化變數x有約...