深度學習入門--損失函式
神經網路的學習是指從訓練資料中自動獲取最優權重引數的過程,損失函式就是用來衡量神經網路的學習的程度,學習的目的就是以該損失函式為基準,找出能使它的值達到最小的權重引數。
從資料中學習
神經網路的特徵就是可以從資料中學習。所謂“從資料中學習”,是指,可以由資料自動決定權重引數的值。
資料是機器學習的核心。對於一般的影象識別而言,先是從大量的影象中提取特徵量,這裡所說的“特徵量”是指從輸入資料中準確的提取本質資料的轉換器。影象的特徵量通常表現為向量的形式。在計算機視覺領域,常用的特徵量包括SIFT、SURF和HOG等。使用這些特徵量將影象資料轉換為向量,然後對轉換後的向量使用機器學習中的SVM、KNN等分類器進行學習。
在機器學習的方法中,將影象轉換為向量時使用的特徵量仍是由人設計的,而在神經網路中,連影象中包含的重要特徵量也都是由機器來學習的。
在機器學習中,一般將資料分為訓練資料和測試資料。首先使用訓練資料進行學習,尋找最優的引數;然後使用測試資料評價訓練得到的模型的實際能力。
泛化能力是指處理未被觀察過的資料的能力,獲得泛化能力是機器學習的最終目的。
過擬合是指可以順利處理某個資料集,但無法處理其他資料集的情況。
損失函式
神經網路的學習中所用的指標稱為損失函式,損失函式的值越小,則代表神經網路的學習的效果越好。
常用的損失函式有兩種:
- 均方誤差
- 交叉熵誤差
均方誤差
用Python實現均方誤差:
import numpy as np def mean_squared_error(y, t): return 0.5 * np.sum((y-t)**2)
這裡的引數y和t都是numpy陣列,現在再用這個均方誤差的公式來實際算一哈:
# 設"2"為正確解 t=[0,0,1,0,0,0,0,0,0,0] # "2"的概率最高的情況(0.6) y=[0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0] print(mean_squared_error(np.array(y), np.array(t))) # 設"2"為正確解 t=[0,0,1,0,0,0,0,0,0,0] # "5"的概率最高的情況(0.6) y=[0.1,0.05,0.05,0.0,0.6,0.1,0.0,0.1,0.0,0.0] print(mean_squared_error(np.array(y), np.array(t)))
輸出為:
0.09750000000000003 0.6475
這裡的輸出y是softmax函式的輸出(概率輸出);t是監督資料,採用one-hot表示
:即正確解標籤表示為1,其餘解標籤表示為0。
可以看出,第一個例子的損失函式的值更小,也就是說第一個例子的輸出結果和監督資料更加吻合。
交叉熵誤差
用Python實現交叉熵誤差:
import numpy as np def cross_entropy_error(y, t): delta=1e-7# 新增一個微小值防止溢位 return -np.sum(t*np.log(y+delta))
同樣,引數y和t都是numpy陣列。再用上面的例子計算一次:
# 設"2"為正確解 t=[0,0,1,0,0,0,0,0,0,0] # "2"的概率最高的情況(0.6) y=[0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0] print(cross_entropy_error(np.array(y), np.array(t))) # 設"2"為正確解 t=[0,0,1,0,0,0,0,0,0,0] # "5"的概率最高的情況(0.6) y=[0.1,0.05,0.05,0.0,0.6,0.1,0.0,0.1,0.0,0.0] print(cross_entropy_error(np.array(y), np.array(t)))
輸出為:
0.510825457099338 2.9957302735559908
可以看出。第一例輸出的損失函式的值更小,和前面的結論一致。
每天學習一點點,每天進步一點點。