2013-12-18 15 views
5

Được rồi, vì vậy tôi đang ở giữa Andrew Ng's machine learning course on coursera và muốn thích nghi với các mạng thần kinh được hoàn thành như là một phần của nhiệm vụ 4.Neural Networks: sigmoid Kích hoạt chức năng cho biến đầu ra liên tục

Đặc biệt, mạng lưới thần kinh mà tôi đã hoàn thành một cách chính xác như là một phần của công việc là như sau:

  • chức năng kích hoạt sigmoid: g(z) = 1/(1+e^(-z))
  • 10 đơn vị đầu ra, mỗi mà có thể mất 0 hoặc 1
  • 1 hi lớp dden
  • phương pháp Back-tuyên truyền sử dụng để giảm thiểu hàm chi phí
  • chức năng
  • Chi phí:

-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}

nơi L=number of layers, s_l = number of units in layer l, m = number of training examples, K = number of output units

Bây giờ tôi muốn điều chỉnh việc thực hiện để có một đơn vị đầu ra liên tục nhận bất kỳ giá trị nào giữa [0,1] và tôi đang cố gắng tìm ra những gì cần thay đổi, vì vậy f ar Tôi đã

  • thay thế dữ liệu với riêng tôi, tức là, như vậy mà đầu ra có thể thay đổi liên tục giữa 0 và 1
  • tài liệu tham khảo cập nhật đến số lượng đơn vị sản lượng
  • Cập nhật các chức năng chi phí ở phía sau thuật toán -propagation tới: 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} trong đó a_3 là giá trị của đơn vị đầu ra được xác định từ quá trình truyền thuận.

Tôi chắc chắn rằng điều gì đó khác phải thay đổi khi phương pháp kiểm tra độ dốc cho thấy độ dốc được xác định bằng cách truyền lại và bằng xấp xỉ bằng số không còn khớp nữa. Tôi không thay đổi gradient sigmoid; nó được để ở số f(z)*(1-f(z)) trong đó f(z) là hàm sigmoid 1/(1+e^(-z))) cũng như tôi không cập nhật số xấp xỉ của công thức phái sinh; chỉ đơn giản là (J(theta+e) - J(theta-e))/(2e).

Có ai có thể tư vấn về các bước khác sẽ được yêu cầu không?

Coded trong Matlab như sau:

% 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))); 

Tôi có kể từ khi nhận ra rằng câu hỏi này là tương tự như hỏi bởi @Mikhail Erofeev on StackOverflow, tuy nhiên trong trường hợp này tôi muốn biến liên tục được giữa 0 và 1 và do đó sử dụng một hàm sigmoid.

+0

Bạn đã làm cho nó hoạt động, cho một kết quả liên tục? Tôi đã chạy nó nhưng nó dừng lại xung quanh lần lặp thứ 40 và không tạo ra kết quả tốt. Sẽ là tuyệt vời nếu bạn có thể chia sẻ những gì bạn đã kết thúc với? –

Trả lời

1

Thứ nhất, hàm chi phí của bạn nên là:

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

Tôi nghĩ bạn Theta2_grad = (delta3'*a2)/m; dự kiến ​​để phù hợp với xấp xỉ bằng số sau khi thay đổi để delta3 = 1/2 * (a3 - y);).

Kiểm tra điều này slide để biết thêm chi tiết.

EDIT: Trong trường hợp có một số khác biệt nhỏ giữa các mã của chúng tôi, tôi đã dán mã của tôi bên dưới để bạn tham khảo. Mã này đã được so sánh với số chức năng xấp xỉ checkNNGradients(lambda);, sự khác biệt tương đối là ít hơn 1e-4 (không đáp ứng yêu cầu 1e-11 bởi Dr.Andrew Ng dù)

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

Cảm ơn bạn đã đề xuất; Tôi đã thử cả hai cập nhật delta3 và delta2 như bạn đề nghị, nhưng vẫn gradient không phù hợp. – user1420372

+0

@ user1420372 chức năng chi phí của bạn phải là a3-y thay vì sigmoid (a3) ​​-y, hãy xem cập nhật của tôi trong câu trả lời. – lennon310

+0

Cảm ơn! Tôi đã thực sự chỉ nhận thấy rằng - tuy nhiên gradient vẫn không chính xác - sẽ chỉnh sửa mã được đề cập để khắc phục. – user1420372

0

Nếu bạn muốn có đầu ra liên tục cố gắng không sử dụng kích hoạt sigmoid khi tính toán giá trị đích.

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

Bình thường hóa đầu vào trước khi sử dụng trong nnCostFunction. Mọi thứ khác vẫn giữ nguyên.

Các vấn đề liên quan