1. 程式人生 > >深度學習入門(上)-第一章 必備基礎知識點

深度學習入門(上)-第一章 必備基礎知識點

1.深度學習與人工智慧簡介
大資料時代造就了人工智慧的發展,人工智慧的時代已經來臨。資料規模越大,深度學習演算法越好。深度學習有諸多應用,如訴說圖片故事,自動駕駛等等。

2.CV面臨的挑戰與常規套路
影象分類是CV核心任務。圖片是由若干個畫素點組成的,一張圖片被表示成3維陣列的形式,每個畫素的值[0,255]。畫素點與亮度有關,畫素點值越大,亮度就越大。
挑戰:viewpoint variation, illumination conditions, scale variation, deformation, background clutter, occlusion, intra-class variation.
常規套路:資料驅動方法,即

  • 收集data並打label。(將data和label進行一一對應的操作)
  • train一個分類器。在deep learning 中,這個分類器就是神經網路。
  • test 和評估。
def train(train_images, train_labels):
    # build a model for images-labels..
    return model
def predict(model, test_images):
    # predict test_labels using the model..
    return test_labels

3.用K近鄰來進行影象分類


指定K值,看當前物體離誰比較近,離誰近的越多,我們就說等於誰。
KNN運作流程

  • 對於未知類別屬性資料集中的點與當前點的距離
  • 按照距離依次排序
  • 選取與當前點距離最小的K個點
  • 確定前K個點所在類別的出現概率
  • 返回前K個點出現頻率最高的類別作為當前點的預測分類

KNN特點:
簡單有效,lazy-learning
無訓練操作。分類器不需要使用training set進行training,訓練時間複雜度為0.
KNN分類的計算複雜度和traing set中的文件數目成正比,即若training set中文件總數為n,那麼KNN的分類時間複雜度為0(n).

KNN演算法的三個基本要素:K值的選擇,距離度量,分類決策規則。
KNN方法在分類時的主要不足:當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。
解決方法:不同的樣本給予不同的權重。
此外,KNN演算法雖然簡易,但需要儲存所有的training data,且在test時過於耗費計算能力。
為了用很小的時間代價,把分類任務完成,推薦使用CIFAR-10資料集,介紹:10類標籤(airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck),50000個training data,10000個test data,大小均為32*32.
如何用KNN進行影象分類呢?

  • 計算距離:
    這裡寫圖片描述
    用K近鄰演算法做影象分類的程式碼實現(k=1):
    Note:僅僅使用L1或者L2進行畫素比較是有問題的,影象更多的是按照背景和顏色被分類,而不是語義主體本身,所以不提倡使用這種方法完成影象分類的任務。
import numpy as np
class NearestNeighbor:
    def __init__(self):
        pass

    def train(self, X, y):
    # knn無須訓練,所以直接把資料和標籤存起來即可
        self.Xtr = X
        self.ytr = y

    def predict(self, X):
    # 對於每一個測試資料,在training data中找出與其L1距離最小的樣本的標籤,作為其標籤。
        num_test = X.shape[0]
        Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

        for i in xrange(num_test):
            distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
            min_index = np.argmin(distances)
            Ypred[i] = self.ytr[min_index]

        return Ypred

這裡,L1距離實際上是一種超引數

4.超引數與交叉驗證
距離是一種超引數。
距離超引數
現在有一些關於超引數的問題。

  1. 如何設定距離,使用L1還是L2?
  2. KNN中K如何選擇?
  3. 如果有其他超引數的話,如何設定其他超引數?

解決方法:
首先要明確的是:test set是非常寶貴的,不能用測試集調節引數,test set只能最後用。所以,往往採用交叉驗證的方式來找到合適的引數。推薦使用交叉驗證的方式來進行模型的建立。
交叉驗證

1.選取超引數的正確方法是:將原始training set分為training set 和 validation set,在驗證集上嘗試不同的超引數,隨後選取最優超引數。
2.若訓練資料不夠,可使用交叉驗證的方法,幫助在選取最優超引數時減少噪聲。
3.一旦找到最優超引數,就讓演算法以該引數在test set上跑,且只跑一次。然後,根據測試結果評價演算法。

5.線性分類
還是做分類這件事,要得到屬於每個類別的概率值(得分值)。
得分函式
將原圖拉伸為3072個畫素點。32*32*3=3072。
例項
權重引數決定當前畫素點產生的是積極作用還是消極作用。得分值最高的就是分類結果,很明顯,本例分類結果出錯了。

6.損失函式
預測錯了,需要改正過來。知錯能改,離不開損失函式。
能夠用什麼樣的標準來評估當前的損失呢?
SVM損失函式
用什麼標準來評判當前的損失?
SVM損失函式:正確得分值與其他所有錯誤類別得分值的差異情況。1代表可容忍的程度。得分值相減的結果,比0大就意味著有損失,比0小就意味著沒有損失。用損失函式來衡量當前模型的效果如何。
Note:這裡使用是得分值。

損失函式公式
:

我們要算的是Model的效果,所以要把所有的樣本都算出來。隨後除以N,因為,一個模型的好壞是與拿多少樣本進行測試是沒有關係的。

7.正則化懲罰項
L2正則化
對W的懲罰力度小,說明認可。
損失函式終極版:Loss = data loss + 正則化懲罰項loss
loss function
至此,我們知道了應該怎樣來評判一個模型!

8.softmax分類器
SVM輸出的是一個得分值,Softmax輸出的是概率。得分值其實不太直觀,在進行多類別分類時,我們提倡使用Softmax分類器,所有類別的概率值加起來必定等於1。
Sigmoid函式:
Sigmoid function
因為Sigmoid函式y的取值範圍是(0,1),所以可以對於任意x的輸入,將結果對映為概率。可以用於經典的2分類問題。輸入x:得分函式。將得分函式對映到當前的Sigmoid中,就可以得到最終的概率值。再通過概率值(結合0.5)進行分類就OK。
Softmax分類器
Softmax分類器做了一個歸一化的操作
Softmax classifier
Softmax分類器要對wx+b得到的得分值進行指數對映exp(讓大的得分值更大,小的得分值更小),然後再進行歸一化操作normalize。這樣就得到了屬於類別的概率值。(用softmax分類器最終得到的是概率值)
關於當前loss,是對於正確類別的概率進行負對數操作。(用正確類別的概率值進行loss的計算)
soft max
兩種損失函式的對比
SVM和Softmax
loss
hinge loss(SVM)不常用,因為當正確類別的得分和錯誤類別的得分差異不大時,區分不是很精細,甚至可能出現loss=0,但分類效果不太好的情況。而Softmax分類器是一個永遠不知道滿足的分類器,總是會有Loss的。

9.最優化
最優化
有了loss之後,就可以進行最優化的操作了。
最優化是在神經網路的反向傳播中提出來的。

10.梯度下降演算法原理
前向傳播:from x to loss
用梯度下降的方法來求解神經網路。
Batchsize通常是2的整數倍(32,64,128),此值與計算機所能夠承受的負載量有關係。
Epoch:跑完一遍train set的所有資料,就叫做一個epoch。要跑完所有的資料。
iter:一次迭代是對一個batch中的資料進行前向傳播和反向傳播的過程。要跑完一個batch。
學習率:當進行反向傳播調節引數的時候,讓網路模型進行一個自我的學習,學習的時候用梯度下降來求解,那一次學多大呢?用學習率來定義。
通過小的學習率和大的迭代次數來完成神經網路的操作。

weights += -step_size * weights_grad

11.反向傳播
通常情況下,對權重w進行隨機初始化,然後再進行優化的操作。
反向傳播:在求出loss之後,通過反向傳播進行權重引數的優化,以使得loss最低。在反向傳播的過程中需要決定什麼樣的w該更新,更新力度如何。核心任務:更新權重引數。
傳播

反向傳播
要算x,y,z分別對f做了多大的貢獻。相當於權重引數對最終的loss值的影響。
-4的意思是,q上升1倍會使得f下降4倍。
反向傳播
上圖中每個操作是明確的,對每個操作都可以算個導數。以最後一個節點為例,把1.37傳進來,代入偏導式中,得到-0.53。
操作1
操作2
操作3
最終可以算出w0, w1, w2對loss產生了多大的貢獻,之後進行相應改變,更新權重引數。
將問題進一步簡化:
sigmoid gate
梯度分配:
加法門單元:均等分配
Max門單元:給最大的,被忽略掉的那個,反傳的梯度為0
乘法門單元:互換
門單元