2013-12-18 29 views
5

Tamam sürekli çıkış değişkeni için Sigmoid Aktivasyon Fonksiyonu, bu yüzden Andrew Ng's machine learning course on coursera ortasındayım ve atama Özellikle 4.Sinir Ağları:

, sinir ağı kapsamında tamamlanan sinir ağı adapte etmek istiyorum

  • sigmoid aktivasyon fonksiyonu: atama bir parçası olarak aşağıdaki gibi doğru bir şekilde tamamlayan olan g(z) = 1/(1+e^(-z))
  • 10 çıkış birimleri, her biri, 0 veya 1
  • 1 hi sürebilir dden tabaka
  • Geri yayılma yöntemi maliyet fonksiyonunu minimize etmek için kullanılan
  • Maliyet fonksiyonu: L=number of layers, s_l = number of units in layer l, m = number of training examples, K = number of output units

    Şimdi egzersiz ayarlamak istediğiniz

-1/m sum^m_{i=1} sum^K_{k=1} (y_k_{(i)}) log((h_theta(x^{(i)}_k) + (1-y_k^{(i)}) log(1-h_theta(x^{(i)}_k) + lambda/(2*m)(sum_{l=1}^{L-1}sum_{i=1}^{s_l} sum_{j=1}^{s_{l=1}} (Theta_{ji}^{(l)})^{2}

böylece [0,1] ile arasında bir değer alan bir sürekli çıkış ünitesi var ve neyin değişmesi gerektiğini öğrenmek için çalışıyorum, yani f ar ı

  • çıkış çıkış birimlerinin sayısını
  • 0 ile 1 Güncellendi referanslar
  • arka maliyet fonksiyonu Güncelleme sürekli değişken olacak şekilde, yani kendi veri Değiştirilen var -propagasyon algoritması: a_3, J=1/(2m) * sum^m_{i=1} (g(a_3)-y)^2 + lambda/(2*m)(sum_{l=1}^{L-1}sum_{i=1}^{s_l} sum_{j=1}^{s_{l=1}} (Theta_{ji}^{(l)})^{2} Burada, ileri yayılmadan belirlenen çıkış biriminin değeridir.

Degrade kontrol yönteminin geri yayılım tarafından belirlenen ve sayısal yaklaşımla artık eşleşmeyen gradyanı gösterdiği için başka bir şeyin değişmesi gerektiğinden eminim. Sigmoid gradyanı değiştirmedim; f(z)*(1-f(z))'da, f(z)'un sigmoid işlevi 1/(1+e^(-z))) olduğu ve türev formülünün sayısal yaklaşımını güncellemediğim; sadece (J(theta+e) - J(theta-e))/(2e).

Başka hangi adımların atılması gerektiği konusunda tavsiyede bulunabilir mi?

Matlab Kodlu şöyle:

Bu soru ancak bu durumda kullandığım 0 ile 1 ve bu nedenle sürekli değişken olmak isteyen, @Mikhail Erofeev on StackOverflow tarafından sorulan benzer olduğunu fark etti beri var
% FORWARD PROPAGATION 
% input layer 
a1 = [ones(m,1),X]; 
% hidden layer 
z2 = a1*Theta1'; 
a2 = sigmoid(z2); 
a2 = [ones(m,1),a2]; 
% output layer 
z3 = a2*Theta2'; 
a3 = sigmoid(z3); 

% BACKWARD PROPAGATION 
delta3 = a3 - y; 
delta2 = delta3*Theta2(:,2:end).*sigmoidGradient(z2); 
Theta1_grad = (delta2'*a1)/m; 
Theta2_grad = (delta3'*a2)/m; 

% COST FUNCTION 
J = 1/(2 * m) * sum((a3-y).^2); 

% Implement regularization with the cost function and gradients. 
Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + Theta1(:,2:end)*lambda/m; 
Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + Theta2(:,2:end)*lambda/m; 
J = J + lambda/(2*m)*(sum(sum(Theta1(:,2:end).^2)) + sum(sum(Theta2(:,2:end).^2))); 

sigmoid işlevi.

+0

Sürekli bir sonuç için çalıştınız mı? Koşturdum ama 40'ıncı iterasyon durur ve iyi bir sonuç vermez. Sonunda neler olduğunu paylaşırsan harika olur mu? –

cevap

1

İlk olarak, maliyet işlevi olmalıdır:

J = 1/m * sum((a3-y).^2); 

Ben senin Theta2_grad = (delta3'*a2)/m; delta3 = 1/2 * (a3 - y); olarak değiştirilmiştir sonra) sayısal tahminini eşleşecek bekleniyor düşünüyorum.

Daha fazla ayrıntı için bu slide numaralı telefonu kontrol edin.

DÜZENLEME: Bizim kodları arasında bazı küçük farkın nedeni nedir durumda , ben referans için aşağıda kodumu yapıştırılan. kod zaten sayısal yaklaşım fonksiyonu checkNNGradients(lambda); ile karşılaştırılmış olup, Bağıl Fark sen kullanmamaya çalışın sürekli bir çıkışa sahip olmak istiyorsanız az 1e-4

function [J grad] = nnCostFunctionRegression(nn_params, ... 
            input_layer_size, ... 
            hidden_layer_size, ... 
            num_labels, ... 
            X, y, lambda) 

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ... 
       hidden_layer_size, (input_layer_size + 1)); 

Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ... 
       num_labels, (hidden_layer_size + 1)); 

m = size(X, 1); 
J = 0; 
Theta1_grad = zeros(size(Theta1)); 
Theta2_grad = zeros(size(Theta2)); 


X = [ones(m, 1) X]; 
z1 = sigmoid(X * Theta1'); 
zs = z1; 
z1 = [ones(m, 1) z1]; 
z2 = z1 * Theta2'; 
ht = sigmoid(z2); 


y_recode = zeros(length(y),num_labels); 
for i=1:length(y) 
    y_recode(i,y(i))=1; 
end  
y = y_recode; 


regularization=lambda/2/m*(sum(sum(Theta1(:,2:end).^2))+sum(sum(Theta2(:,2:end).^2))); 
J=1/(m)*sum(sum((ht - y).^2))+regularization; 
delta_3 = 1/2*(ht - y); 
delta_2 = delta_3 * Theta2(:,2:end) .* sigmoidGradient(X * Theta1'); 

delta_cap2 = delta_3' * z1; 
delta_cap1 = delta_2' * X; 

Theta1_grad = ((1/m) * delta_cap1)+ ((lambda/m) * (Theta1)); 
Theta2_grad = ((1/m) * delta_cap2)+ ((lambda/m) * (Theta2)); 

Theta1_grad(:,1) = Theta1_grad(:,1)-((lambda/m) * (Theta1(:,1))); 
Theta2_grad(:,1) = Theta2_grad(:,1)-((lambda/m) * (Theta2(:,1))); 


grad = [Theta1_grad(:) ; Theta2_grad(:)]; 

end 
+0

Önerileriniz için teşekkür ederiz; Önerdiğiniz gibi delta3 ve delta2'yi güncellemeyi denedim, ancak yine de degradeler uyuşmuyor. – user1420372

+0

@ user1420372 maliyet fonksiyonunuz sigmoid (a3) ​​-y yerine a3-y olmalı, cevabımda güncellemeye bakın. – lennon310

+0

Teşekkürler! Aslında bunu fark ettim - ancak degrade hala yanlış - düzeltmek için söz konusu kodu düzeltecek. – user1420372

0

(olmasa da Dr.Andrew Ng 1e-11 gereksinimi karşılayan) 'dir hedef değeri hesaplarken sigmoid aktivasyonu.

a1 = [ones(m, 1) X]; 
a2 = sigmoid(X * Theta1'); 
a2 = [ones(m, 1) z1]; 
a3 = z1 * Theta2'; 
ht = a3; 

nnCostFunction içinde kullanmadan önce girişi normalleştirin. Her şey aynı kalır.

İlgili konular