【DL筆記1】Logistic Regression:最基礎的神經網絡

從【DL筆記1】到【DL筆記N】,是我學習深度學習一路上的點點滴滴的記錄,是從Coursera網課、各大博客、論文的學習以及自己的實踐中總結而來。從基本的概念、原理、公式,到用生動形象的例子去理解,到動手做實驗去感知,到著名案例的學習,到用所學來實現自己的小而有趣的想法......我相信,一路看下來,我們可以感受到深度學習的無窮的樂趣,並有興趣和激情繼續鑽研學習。 正所謂 Learning by teaching,寫下一篇篇筆記的同時,我也收穫了更多深刻的體會,希望大家可以和我一同進步,共同享受AI無窮的樂趣。


個人認爲理解並掌握這個logistic regression是學習神經網絡和深度學習最重要的部分,也是最基礎的部分,學完這個再去看淺層神經網絡、深層神經網絡,會發現後者就是logistic重複了若干次(當然一些細節會有不同,但是原理上一模一樣)。

一、什麼是logictic regression

下面的圖是Andrew Ng提供的一個用logistic regression來識別主子的圖片的算法結構示意圖:

左邊x0到x12287是輸入(input),我們稱之爲特徵(feather),常常用列向量x(i)來表示(這裏的i代表第i個訓練樣本,下面在只討論一個樣本的時候,就暫時省略這個標記,免得看暈了-_-|||),在圖片識別中,特徵通常是圖片的像素值,把所有的像素值排成一個序列就是輸入特徵,每一個特徵都有自己的一個權重(weight),就是圖中連線上的w0到w12287,通常我們也把左右的權重組合成一個列向量W

中間的圓圈,我們可以叫它一個神經元,它接收來自左邊的輸入並乘以相應的權重,再加上一個偏置項b(一個實數),所以最終接收的總輸入爲:

x0w0+x1w1+…+x12287w12287+b=WTx+b

但是這個並不是最後的輸出,就跟神經元一樣,會有一個激活函數(activation function)來對輸入進行處理,來決定是否輸出或者輸出多少。Logistic Regression的激活函數是sigmoid函數,介於0和1之間,中間的斜率比較大,兩邊的斜率很小並在遠處趨於零。長這樣(記住函數表達式):

我們用y’來表示該神經元的輸出,σ()函數代表sigmoid,則可知:

y’ = σ(WTx+b)

這個y’可以看做是我們這個小模型根據輸入做出的一個預測,在最開始的圖對應的案例中,就是根據圖片的像素在預測圖片是不是貓。 與y’對應的,每一個樣本x都有自己的一個真實標籤y,y=1代表圖片是貓,y=0代表不是貓。我們希望模型輸出的y’可以儘可能的接近真實標籤y,這樣,這個模型就可以用來預測一個新圖片是不是貓了。所以,我們的任務就是要找出一組W,b,使得我們的模型y’ = σ(WTx+b)可以根據給定的x,正確地預測y。在此處,我們可以認爲,只要算出的y’大於0.5,那麼y’就更接近1,於是可以預測爲“是貓”,反之則“不是貓”。

以上就是Logistic Regression的基本結構說明。

二、怎麼學習W和b

前面其實提到過了,我們需要學習到的W和b可以讓模型的預測值y’與真實標籤y儘可能地接近,也就是y’和y的差距儘量地縮小。因此,我們可以定義一個損失函數(Loss function),來衡量y’和y的差距:

L(y’,y) = -[y·log(y’)+(1-y)·log(1-y’)]

可以暫時忽略後面這個看似複雜其實不復雜的表達式,只記住損失函數是L(y’,y)就行了。 如何說明這個式子適合當損失函數呢?且看:

  • 當y=1時,L(y’,y)=-log(y’),要使L最小,則y’要最大,則y’=1;
  • 當y=0時,L(y’,y)=-log(1-y’),要使L最小,則y’要最小,則y’=0.

如此,便知L(y’,y)符合我們對損失函數的期望,因此適合作爲損失函數。

我們知道,x代表一組輸入,相當於是一個樣本的特徵。但是我們訓練一個模型會有很多很多的訓練樣本,也就是有很多很多的x,就是會有x(1),x(2),…,x(m) 共m個樣本,它們可以寫成一個大X 行向量X = (x(1),x(2),…,x(m) ) 對應的樣本的真實標籤Y(也是行向量): Y = (y(1),y(2),…,y(m) ) 通過我們的模型計算出的y’們也可以組成一個行向量: Y’ = (y’(1),y’(2),…,y’(m) )

前面講的損失函數L,對每個x都有,因此在學習模型的時候,我們需要看所有x的平均損失,因此定義一個代價函數(Cost function)J(W,b) = 1/m·Σmi=1L(y’(i),y(i)) 代表所有訓練樣本的平均損失。

因此,我們的學習任務就可以用一句話來表述:

Find W,b that minimize J(W,b)

Minimize。。。說起來簡單做起來難,好在我們有計算機,可以幫我們進行大量重複地運算,於是在神經網絡中,我們一般使用梯度下降法(Gradient Decent)

這個方法通俗一點就是,先隨機在曲線上找一個點,然後求出該點的斜率,也稱爲梯度,然後順着這個梯度的方向往下走一步,到達一個新的點之後,重複以上步驟,直到到達最低點(或達到我們滿足的某個條件)。 如,對w進行梯度下降,則就是重複一下步驟(重複一次稱爲一個迭代):

w := w - α(dJ/dw)

其中:=代表“用後面的值更新”,α代表“學習率(learning rate)”,dJ/dw就是J對w求偏導。

回到我們的Logistic Regression問題,就是要初始化(initializing)一組W和b,並給定一個學習率,指定要迭代的次數(就是你想讓點往下面走多少步),然後每次迭代中求出w和b的梯度,並更新w和b。最終的W和b就是我們學習到的W和b,把W和b放進我們的模型y’ = σ(WTx+b)中,就是我們學習到的模型,就可以用來進行預測了!

總結一下:

  • Logistic Regression模型:y’ = σ(WTx+b),記住使用的激活函數是sigmoid函數。
  • 損失函數:L(y’,y) = -[y·log(y’)+(1-y)·log(1-y’)]衡量預測值y’與真實值y的差距,越小越好。
  • 代價函數:損失均值,J(W,b) = 1/m·Σmi=1L(y’(i),y(i)),是W和b的函數,學習的過程就是尋找W和b使得J(W,b)最小化的過程。求最小值的方法是用梯度下降法。
  • 訓練模型的步驟
    1. 初始化W和b
    2. 指定learning rate和迭代次數
    3. 每次迭代,根據當前W和b計算對應的梯度(J對W,b的偏導數),然後更新W和b
    4. 迭代結束,學得W和b,帶入模型進行預測,分別測試在訓練集合測試集上的準確率,從而評價模型

就這麼明明白白<(▰˘◡˘▰)

理解Logistic regression的基本思想,對學習神經網絡以及深度學習至關重要,尤其是怎麼通過損失函數來更新參數,從而得到預測模型這個過程。後面我們會親自動手用代碼實現一個Logistic regression。 有任何疑問,歡迎留言交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章