0

다른 데이터 세트에서 작동하는 것으로 보이는 3 계층 인공 신경망을 분류했습니다. 필자가 만든 인공 데이터 세트를 가지고 놀면서 하나의 피쳐 또는 다른 피쳐에서 하나의 클래스가 양수 일 때 두 클래스 사이를 정확하게 예측할 수 없었습니다.ANN/MLP로 이종 클래스 인식

분명히 class1은 feature 1 또는 feature 2가 1과 같은지를 묻는 것으로 식별 할 수 있지만 데이터 세트를 정확하게 예측하는 알고리즘을 얻을 수 없습니다 (데이터 세트에이 패턴을 따르는 20 개의 예가 있음).

ANN/MLP는이 유형의 패턴을 인식 할 수 있습니까? 그렇다면 무엇을 놓치고 있습니까? 그렇지 않은 경우, 이런 유형의 패턴 (아마도 SVM)을 예측할 수있는 다른 방법이 있습니까?

나는 coursera에서 제공되는 온라인 과정에서 사용 된 옥타브를 사용했습니다. 비록 내가 그것을 실행할 때 약간 다르게 구성되어 있지만 여기에 대부분의 코드를 나열했습니다. 보시다시피, 첫 번째와 두 번째 레이어에서 바이어스 유닛을 사용하고 두 번째 레이어의 숨겨진 유닛 수를 임의로 추측하는 것보다 개선하지 않고 1-5에서 변경했습니다.

% Load dataset 
y = [1; 1; 2; 2] 
X = [1, 0; 0, 1; 0, 0; 0, 0] 
m = size(X, 1);  
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)); 

% Randomly initialize weight parameters 
initial_Theta1 = randInitializeWeights(input_layer_size, hidden_layer_size); 
initial_Theta2 = randInitializeWeights(hidden_layer_size, num_labels); 
initial_nn_params = [initial_Theta1(:) ; initial_Theta2(:)]; 

% Add bias units to layers and feedforward 
Xbias = [ones(m,1), X]; 
L2bias = [ones(m,1), sigmoid(Xbias*Theta1')]; 
L3 = sigmoid(L2bias * Theta2'); 

% Create class matrix Y 
Y = zeros(m, num_labels); 
for r = 1:m; 
    Y(r, y(r)) = 1; 
end 

% Set cost function 
J = (sum(sum(Y.*log(L3) + (1-Y).*log(1-L3))))/-m + lambda*(sum(sum((Theta1(:,2:columns(Theta1))).^2)) + sum(sum((Theta2(:,2:columns(Theta2))).^2)))/2/m; 
% Initialize weight gradient matrices 
D2 = zeros(rows(Theta2),columns(Theta2)); 
D1 = zeros(rows(Theta1),columns(Theta1)); 

% Calculate gradient with backpropagation 
for t = 1:m; 
    a1 = [1 X(t,:)]'; 
    z2 = Theta1*a1; 
    a2 = [1; sigmoid(z2)]; 
    z3 = Theta2*a2; 
    a3 = sigmoid(z3); 
    d3 = a3 - Y(t,:)'; 
    d2 = (Theta2'*d3)(2:end).*sigmoidGradient(z2); 
    D2 = D2 + d3*a2'; 
    D1 = D1 + d2*a1'; 
end 

Theta2_grad = D2/m; 
Theta1_grad = D1/m; 

Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + lambda*Theta2(:,2:end)/m; 
Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + lambda*Theta1(:,2:end)/m; 

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

% Compute cost (Feed forward) 
[J,grad] = nnCostFunction(initial_nn_params, input_layer_size, hidden_layer_size, num_labels, X, y, lambda); 

% Create "short hand" for the cost function to be minimized using fmincg 
costFunction = @(p) nnCostFunction(p, input_layer_size, hidden_layer_size, num_labels, X, y, lambda); 

% Train the neural network using fmincg 
options = optimset('MaxIter', 1000); 
[nn_params, cost] = fmincg(costFunction, initial_nn_params, options); 

% Obtain Theta1 and Theta2 back from nn_params 
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)); 

답변

0

NN은 어떤 패턴을 인식 할 수 있습니다. 유니버설 근사 정리 (Universal Approximation Theorem)는 (많은 다른 것들과 마찬가지로) 그것을 증명한다.

제가 생각할 수있는 가장 분명한 이유는 바이어스 뉴런이 부족합니다. Althouh 더 귀중한 답변을 에 코드가 포함되어 있습니다.

+0

응답 해 주셔서 감사합니다. 크게 감사드립니다. NN은 이와 같은 복잡한 패턴을 인식 할 수 있어야한다고 생각했지만 비슷한 인공적인 데이터 세트에 대한 실패는 내가 올바르게 구현하고 있는지 또는 고유 한 한계인지 궁금하게 생각하게 만듭니다. 나는 처음 두 레이어에서 바이어스 유닛을 사용했고 알고리즘은 다른 데이터 세트에서도 잘 작동합니다 (예 : [와인을 화학적으로 분류] (http://archive.ics.uci.edu/ml/machine-learning-databases/ 와인/와인. 데이터)). 그런 패턴이 3 개 이상의 레이어를 필요로 할 수 있습니까? – user2368936

+0

아니요, ** 데이터 없음 **은 3 개 이상의 레이를 필요로합니다. – lejlot

+0

내가 설명했던 경우를 위해 작동하게했다. 문제는 주로 두 가지 요인으로 인해 발생했다고 생각합니다. 교육 사례가 충분하지 않고 비용 최적화 과정에서 정규화 계수가 너무 높습니다. 나는 체중의 크기가 지나치게 제한되면 Sigmoid 함수가이 분류에 필요한 것처럼 보이는 이진 논리를 작성하지 못하게되어 이것이 의미가 있다고 생각합니다. – user2368936

관련 문제