Вопрос по regression, gradient, machine-learning, neural-network – Градиент в непрерывной регрессии с использованием нейронной сети

6

Я пытаюсь реализовать регрессию NN, которая имеет 3 слоя (1 входной, 1 скрытый и 1 выходной слой с непрерывным результатом). За основу я взял классификацию NN изcoursera.org класс, но изменил функцию стоимости и вычисление градиента, чтобы соответствовать задаче регрессии (а не классификации):

Моя nnCostFunction сейчас:

function [J grad] = nnCostFunctionLinear(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);

a1 = X;
a1 = [ones(m, 1) a1];
a2 = a1 * Theta1';
a2 = [ones(m, 1) a2];
a3 = a2 * Theta2';
Y = y;

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

th1 = Theta1;
th1(:,1) = 0; %set bias = 0 in reg. formula
th2 = Theta2;
th2(:,1) = 0;

t1 = th1.^2;
t2 = th2.^2;
th = sum(sum(t1)) + sum(sum(t2));
th = lambda * th / (2*m);
J = J + th; %regularization


del_3 = a3 - Y;
t1 = del_3'*a2;
Theta2_grad = 2*(t1)/m + lambda*th2/m;

t1 = del_3 * Theta2;
del_2 = t1 .*  a2;
del_2 = del_2(:,2:end);
t1 = del_2'*a1;
Theta1_grad = 2*(t1)/m + lambda*th1/m;

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

Затем я использую эту функцию вfmincg алгоритм, но в первых итерациях fmincg завершить его 'с работой. Я думаю, что мой градиент не так, но я могуне могу найти ошибку.

Кто-нибудь может помочь?

@javadba, это 'октава mishka
Привет Михаил, это был вопрос более 1 года назад, но мне было интересно, ты уже решил эту проблему? На самом деле другой парень спросил тот же самый, и я предоставил свой код там, по сравнению с Эндрю Нгs checkNNGradients (лямбда) и полученная относительная разница 1e-4:stackoverflow.com/questions/20648422/...   Если вы уже решили эту проблему и получили еще меньшую относительную разницу, пожалуйста, уточните, ответив на свой вопрос; в противном случае, надеюсь, мой код полезен. Спасибо lennon310
что это за язык?? этоне октава / матлаб (именно этому учил профессор Нг ..) javadba

Ваш Ответ

3   ответа
1

Михай, ямы также играли с NN для непрерывной регрессии, и в какой-то момент у нее были похожие проблемы. Лучшее, что можно сделать здесь, - это проверить вычисление градиента на численном расчете перед запуском модели. Если этоне правильно, fmincg выигралне сможет тренировать модель. (Кстати, я не рекомендую вам использовать числовой градиент, так как время, затрачиваемое на это, намного больше).

Принимая во внимание, что вы взяли эту идею от Ng´с курсом, яЯ реализую возможное решение для вас, чтобы попытаться использовать ту же запись для Octave.

    % Cost function without regularization.
    J = 1/2/m^2*sum((a3-Y).^2); 

    % In case it´s needed, regularization term is added (i.e. for Training).
    if (reg==true);
 J=J+lambda/2/m*(sum(sum(Theta1(:,2:end).^2))+sum(sum(Theta2(:,2:end).^2)));
    endif;

    % Derivatives are computed for layer 2 and 3.
    d3=(a3.-Y);
    d2=d3*Theta2(:,2:end);

    % Theta grad is computed without regularization.
    Theta1_grad=(d2'*a1)./m;
    Theta2_grad=(d3'*a2)./m;

    % Regularization is added to grad computation.
    Theta1_grad(:,2:end)=Theta1_grad(:,2:end)+(lambda/m).*Theta1(:,2:end);
    Theta2_grad(:,2:end)=Theta2_grad(:,2:end)+(lambda/m).*Theta2(:,2:end);

    % Unroll gradients.
    grad = [Theta1_grad(:) ; Theta2_grad(:)];

Обратите внимание, что, поскольку вы сняли всю активацию сигмоида, расчет производной довольно прост и приводит к упрощению исходного кода.

Следующие шаги: 1. Проверьте этот код, чтобы понять, имеет ли он смысл для вашей проблемы. 2. Используйте проверку градиента для проверки расчета градиента. 3. Наконец, используйте fmincg и проверьте, что вы получите разные результаты.

1

Если я правильно понимаю, ваш первый блок кода (показан ниже) -

m = size(X, 1);

a1 = X;
a1 = [ones(m, 1) a1];
a2 = a1 * Theta1';
a2 = [ones(m, 1) a2];
a3 = a2 * Theta2';
Y = y;

чтобы получить выход(3) на выходном слое.

Ng»S слайды о NN имеет следующую конфигурацию для расчета(3), Это'отличается от того, что представляет ваш код.

в среднем / выходном слое вы не выполняете функцию активацииgнапример,sigmoid функция.

С точки зрения функции стоимостиJ без условий регуляризации, нгS Slides имеет следующую формулу:

Я нене понимаю, почему вы можете вычислить это с помощью:

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

потому что вы не в том числеlog функционировать на всех.

log () и sigmoid () - подход логической регрессии NN. В примерах это 'обнаружение рака, но я хочу прогноз стоимости дома mishka
0

Попытайтесь включить функцию сигмоида для вычисления значений второго слоя (скрытого слоя) и избегайте сигмоида при вычислении целевого (выходного) значения.

function [J grad] = nnCostFunction1(nnParams, ...
                                   inputLayerSize, ...
                                   hiddenLayerSize, ...
                                   numLabels, ...
                                   X, y, lambda)

Theta1 = reshape(nnParams(1:hiddenLayerSize * (inputLayerSize + 1)), ...
                 hiddenLayerSize, (inputLayerSize + 1));

Theta2 = reshape(nnParams((1 + (hiddenLayerSize * (inputLayerSize + 1))):end), ...
                 numLabels, (hiddenLayerSize + 1));

Theta1Grad = zeros(size(Theta1));
Theta2Grad = zeros(size(Theta2));

m = size(X,1);

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

Y = y';

r1 = lambda / (2 * m) * sum(sum(Theta1(:, 2:end) .* Theta1(:, 2:end)));
r2 = lambda / (2 * m) * sum(sum(Theta2(:, 2:end) .* Theta2(:, 2:end)));

J = 1 / ( 2 * m ) * (a3 - Y) * (a3 - Y)' + r1 + r2;

delta3 = a3 - Y;
delta2 = (Theta2' * delta3) .* sigmoidGradient([ones(1, m); z2]);
delta2 = delta2(2:end, :);

Theta2Grad = 1 / m * (delta3 * a2');
Theta2Grad(:, 2:end) = Theta2Grad(:, 2:end) + lambda / m * Theta2(:, 2:end);
Theta1Grad = 1 / m * (delta2 * a1');
Theta1Grad(:, 2:end) = Theta1Grad(:, 2:end) + lambda / m * Theta1(:, 2:end);

grad = [Theta1Grad(:) ; Theta2Grad(:)];

end

Нормализуйте входные данные, прежде чем передать их в nnCostFunction.

Похожие вопросы