1. 程式人生 > >演算法工程師修仙之路:吳恩達機器學習(五)

演算法工程師修仙之路:吳恩達機器學習(五)

吳恩達機器學習筆記及作業程式碼實現中文版

第四章 Logistic迴歸


簡化代價函式與梯度下降

  • 邏輯迴歸的代價函式: C o s t ( h

    θ ( x ( i ) )
    , y ( i ) ) =
    y ( i ) l o g ( h θ ( x ( i ) ) ) ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) = 1 m i = 1 m [ y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) ] Cost(h_\theta(x^{(i)}), y^{(i)})=−y^{(i)}log(h_\theta(x^{(i)})) − (1 − y^{(i)}) log(1-h_\theta(x^{(i)}))=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log(h_\theta(x^{(i)})) + (1−y^{(i)}) log(1-h_\theta(x^{(i)}))]

  • 我們要試圖找儘量讓 J ( θ ) J(\theta) 取得最小值的引數 θ \theta ,所以我們想要儘量減小這一項。

  • 如果我們給出一個新的樣本,假如某個特徵為x,我們可以用擬合訓練樣本的引數 θ \theta ,來輸出對假設的預測。另外,我們假設的輸出,實際上就是這個概率值: p ( y = 1 x ; θ ) p(y=1|x;\theta) ,就是關於x以 θ \theta 為引數, y = 1 y= 1 的概率,你可以認為我們的假設就是估計 y = 1 y=1 的概率。

  • 最小化代價函式的方法,是使用梯度下降法(gradient descent)。

  • 如果你有n個特徵,也就是說引數向量 θ \theta 包括 θ 0 , θ 1 , θ 2 \theta_0, \theta_1, \theta_2 一直到 θ n \theta_n ,那麼你就需要用這個式子: θ j = θ j α J ( θ ) θ j = θ j α 1 m i = 1 m [ h θ ( x ( i ) ) y ( i ) ] x j ( i ) \theta_j=\theta_j-\alpha*\frac{\partial J(\theta)}{\partial \theta_j}=\theta_j-\alpha*{\frac{1}{m}\sum_{i=1}^m}[h_\theta({x^{(i)}})-y^{(i)}]x_j^{(i)} 來同時更新所有 θ \theta 的值。

  • 即使更新引數的規則看起來基本相同,但由於假設的定義發生了變化,所以邏輯函式的梯度下降,跟線性迴歸的梯度下降實際上是兩個完全不同的東西。

  • 如果你的特徵範圍差距很大的話,那麼應用特徵縮放的方法,同樣也可以讓邏輯迴歸中,梯度下降收斂更快。

高階優化

  • 我們有個代價函式 J ( θ ) J(\theta) ,而我們想要使其最小化,那麼我們需要做的是編寫程式碼,當輸入引數 θ \theta 時,它們會計算出兩樣東西: J ( θ ) J(\theta) 以及 θ \theta 等於 0、1直到n時的偏導數項。假設我們已經完成了可以實現這兩件事的程式碼,那麼梯度下降所做的就是反覆執行這些更新。

  • 另一種考慮梯度下降的思路是:我們需要寫出程式碼來計算 J ( θ ) J(\theta) 和這些偏導數,然後把這些插入到梯度下降中,然後它就可以為我們最小化這個函式。

  • 對於梯度下降來說,從技術上講,你實際並不需要編寫程式碼來計算代價函式 J ( θ ) J(\theta) 。你只需要編寫程式碼來計算導數項,但是,如果你希望程式碼還要能夠監控這些 J ( θ ) J(\theta) 的收斂性,那麼我們就需要自己編寫程式碼來計算代價函式 J ( θ ) J(\theta) 和偏導數項。所以,在寫完能夠計算這兩者的程式碼之後,我們就可以使用梯度下降。

  • 三種高階優化演算法

    • 梯度下降並不是我們可以使用的唯一演算法,還有其他一些演算法,更高階、更復雜。
    • 如果我們能用這些方法來計算代價函式 J ( θ ) J(\theta) 和偏導數項 J ( θ ) θ j \frac{\partial J(\theta)}{\partial \theta_j} 兩個項的話,那麼這些演算法就是為我們優化代價函式的不同方法。
    • 共軛梯度法,BFGS (變尺度法) 和 L-BFGS (限制變尺度法) 就是其中一些更高階的優化演算法,它們需要有一種方法來計算 J ( θ ) J(\theta) ,以及需要一種方法計算導數項,然後使用比梯度下降更復雜的演算法來最小化代價函式。
  • 三種演算法的優點和缺點:

    • 使用這其中任何一個演算法,你通常不需要手動選擇學習率 α \alpha ,你可以認為演算法有一個智慧的內部迴圈,而且,事實上,他們確實有一個智慧的內部迴圈,稱為線性搜尋(line search)演算法,它可以自動嘗試不同的學習速率 α \alpha ,並自動選擇一個好的學習速率 α \alpha ,因此它甚至可以為每次迭代選擇不同的學習速率,那麼你就不需要自己選擇。
    • 這些演算法實際上在做更復雜的事情,而不僅僅是選擇一個好的學習率,所以它們往往最終收斂得遠遠快於梯度下降。
    • 我們實際上完全有可能成功使用這些演算法,並應用於許多不同的學習問題,而不需要真正理解這些演算法的內環間在做什麼,如果說這些演算法有缺點的話,那麼主要缺點是它們比梯度下降法複雜多了,特別是你最好不要使用 L-BGFS、BFGS 這些演算法,除非你是數值計算方面的專家。

多元分類:一對多

  • 對於一個二元分類問題,我們的資料看起來可能是像這樣:
    在這裡插入圖片描述
  • 對於一個多類分類問題,我們的資料集或許看起來像這樣:
    在這裡插入圖片描述
  • 我們現在已經知道如何進行二元分類,可以使用邏輯迴歸,對於直線或許你也知道,可以將資料集一分為二為正類和負類。用一對多的分類思想,我們可以將其用在多類分類問題上。
    在這裡插入圖片描述
    • 現在我們有一個訓練集,好比上圖表示的有 3 個類別,我們用三角形表示 y = 1 y=1 ,方框表示 y = 2 y=2 ,叉叉表示 y = 3 y=3 。我們下面要做的就是使用一個訓練集,將其分成 3 個二元分類問題。
    • 我們先從用三角形代表的類別 1 開始,實際上我們可以建立一個,新的"偽"訓練集,型別 2 和型別 3 定為負類,型別 1 設定為正類,我們建立一個新的訓練集, 如下圖所示的那樣,我們要擬合出一個合適的分類器。
      在這裡插入圖片描述
    • 這裡的三角形是正樣本,而圓形代表負樣本。可以這樣想,設定三角形的值為 1,圓形的值為 0,下面我們來訓練一個標準的邏輯迴歸分類器,這樣我們就得到一個正邊界。
    • 為了能實現這樣的轉變,我們將多個類中的一個類標記為正向類( y = 1 y=1 ),然後將其他所有類都標記為負向類,這個模型記作 h θ ( 1 ) ( x ) ℎ_\theta^{(1)}(x)