1. 程式人生 > >使用matlab的fminunc函式自動設定學習率α

使用matlab的fminunc函式自動設定學習率α

個人部落格文章連結: http://www.huqj.top/article?id=164

應用梯度下降法中最為關鍵的一個步驟就是學習率α的選擇,根據梯度下降的數學原理可知:如果學習率過大,可能導致梯度下降發無法收斂甚至發散,而學習率過小又會導致迭代次數過多,影響學習效率。所以通常我們會選擇各種學習率測試,最終選擇一個比較合適的值作為最終學習率。

    但是在一些高階的引數調優演算法中,不需要我們手動設定學習率,而是在演算法中通過一個內迴圈自動選擇學習率,這也稱為“自適應演算法”,使用這種方法,我們需要提供一個計算代價函式值和每次梯度下降值的函式,自適應演算法根據這個函式為我們自動進行梯度下降學習率的嘗試和設定。matlab中的fminunc函式就是這樣一種方法。下面介紹如何使用該函式進行邏輯迴歸。

    ①編寫代價函式,返回某個θ引數下對應的代價值和下一步下降的值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

function [cost, gradient] = CostFunction2(theta, X, y)

    %邏輯迴歸的代價函式

     

    m = size(X, 1);

    gradient = zeros(size(theta));

     

    cost = sum(-y' * log(sigmoid(theta' * X'))' - (1 - y)' * log(1 - sigmoid(theta' * X'))') / m;

    for i = 1 : size(theta, 1)

       gradient(i) = 0;

       for j = 1 : m

          gradient(i) = gradient(i) + (sigmoid(X(j, :) * theta) - y(j)) * X(j, i); 

       end

       gradient(i) = gradient(i) / m;

    end

end

    ②在主程式中將代價函式的函式控制代碼作為引數傳給fminunc函式自動進行訓練,最終返回θ值和代價函式值

1

2

3

4

5

6

7

8

m = size(data, 1);

init_theta = zeros(3, 1);

X = data(:,[1, 2]);

X = [ones(m, 1), X];

y = data(:, 3);

%% 使用 fminunc 訓練

options = optimset('GradObj', 'on', 'MaxIter', 800);

[theta, cost] = fminunc(@(t)(CostFunction2(t, X, y)), init_theta, options);

    資料集和最終學習演算法計算出的決策邊界如下:

    image.png

 

    關於fminunc函式的引數options:

1

options = optimset('GradObj', 'on', 'MaxIter', 800);

    第一個引數'GradObj'設定為'on'表示使用自定義的梯度下降函式,也就是我們編寫的代價函式,而'MaxIter'設定了最大迭代次數。