2

問題は非常に簡単で、わずか5サンプルしかありません。単純なロジスティック回帰は何百万回の反復を収束させる必要があるのですか?

しかし、Gradient Descentは数千万の反復のように非常に遅く収束します。

なぜ、私のアルゴリズムに間違いがありますか?

P.S.以下のJuliaコード:

X = [ 
1.0 34.6237 78.0247; 
1.0 30.2867 43.895; 
1.0 35.8474 72.9022; 
1.0 60.1826 86.3086; 
1.0 79.0327 75.3444 
] 

Y = [0 0 0 1 1]' 

sigmoid(z) = 1/(1 + e^-z) 

# Cost function. 
function costJ(Theta, X, Y) 
    m = length(Y) 
    H = map(z -> sigmoid(z), (Theta' * X')')  
    sum((-Y)'*log(H) - (1-Y)'*log(1 - H))/m 
end 

# Gradient. 
function gradient(Theta, X, Y) 
    m = length(Y) 
    H = map(z -> sigmoid(z), (Theta' * X')')  
    (((X'*H - X'*Y)')/m)' 
end 

# Gradient Descent. 
function gradientDescent(X, Y, Theta, alpha, nIterations)  
    m = length(Y) 
    jHistory = Array(Float64, nIterations) 
    for i = 1:nIterations 
     jHistory[i] = costJ(Theta, X, Y)   
     Theta = Theta - alpha * gradient(Theta, X, Y)   
    end 
    Theta, jHistory 
end 

gradientDescent(X, Y, [0 0 0]', 0.0001, 1000) 
+4

「コンバージェンス」はどのように定義しますか?すべてのサンプルの正しい分類?勾配の小さなL2ノルム? – lejlot

+1

ええと、それは良い質問です、私は何を意味するのだろう - 反復の合理的な量の後にコスト関数の最小値を見つける:)。このような理由から、妥当な金額は数百万ではなく、数千から数千になるはずです。 –

+2

勾配降下の実装では、ブレークはありません。コスト関数の削減を比較し、それがループを終了して戻るよりも十分小さい場合は、比較する必要があります。 – niczky12

答えて

4

@ colinefangのコメントは正しい診断であると思います。プロットしてみてくださいjHistory - それは常に減少しますか?

あなたがすることができるもう一つは、コストが常に減少を確認するために、各反復でsimple linesearchを追加するようなものである:各反復にアルファを検索するために、わずかに傾斜降下機能を変更すると

function linesearch(g, X, Y, Theta; alpha=1.0) 
    init_cost = costJ(Theta, X, Y) 

    while costJ(Theta - alpha*g, X, Y) > init_cost 
     alpha = alpha/2.0 # or divide by some other constant >1 
    end 

    return alpha 
end 

for i = 1:nIterations 
    g = gradient(Theta, X, Y) 
    alpha = linesearch(g,X,Y,Theta) 
    Theta = Theta - alpha * g 
end 

上記のコードには、さまざまなパフォーマンス拡張機能があります。私はちょうどあなたに味を見せたいと思っていました。

関連する問題