DEEP.I - Lab

오프라인 공간의 지능화를 꿈꾸는 딥아이 연구실입니다.

Matlab

[Matlab] 매트랩을 이용한 다층신경망 (Multi-Layer Perceptron: MLP) 구현하기 (XOR 문제)

Jongwon Kim 2020. 11. 1. 14:02
반응형

1986년 역전파 알고리즘 (Backpropagation)의 개념이 도입되면서 Machine Learning이 다시 주목받게 되었습니다. 기존 단층 신경망으로는 해결할 수 없었던 비선형 문제 해결이 가능한 다층 신경망은 현재 응용되고 있는 CNN(Convolutional Neural Networks)의 기반이 되고 있습니다. 이번 포스팅에서는 매트랩을 이용한 다층신경망에서 해결가능한 XOR 문제를 구현해보록 하겠습니다. 

 

그림 1. 다층 신경망 블록다이어그램

 

XOR Gate vs MNIST Dataset

 

개인적인 생각이지만, 처음 머신 러닝에 입문하신다면 MINIST 데이터셋과 텐서플로우, 파이토치 등의 라이브러리를 통한 분류문제 구현으로 시작하기 보다는 파이썬이나 매트랩을 통해 직접 알고리즘을 작성하며  XOR 문제와 같은 선형회귀 문제부터 구현하는것을 추천드립니다. 학습률이나 초기 가중치, 데이터 정규화, 노드의 개수 등에 따른 학습 성능과 알고리즘의 메커니즘 이해가 보다 직관적으로 되기 때문입니다.

 

그림 2와 처럼 OR 게이트는 Y값이 0이냐 1이냐의 기준을 임의의 값으로 나눌수 있지만 XOR은 입력이 [0,1] , [1,0]일때 0이 출력되는 비상식?적인 출력으로 인해 단순한 직선으로 구분점을 나눌 수 없습니다. 다층 신경망으로 이 기준값을 학습하여 예측하는 선형회귀문제를 간단히 구현해보도록 하겠습니다.

 

 

 

그림 2. 논리 게이트 문제

 

 

 

 

파이썬을 이용한 다층신경망 구현 포스팅과 동일한 구조입니다. 파이썬에서 구현을 원하시는 분들은 링크를 참조하시길 바랍니다.

 

deep-eye.tistory.com/28

 

[Python] 파이썬을 이용한 다층신경망 (Multi-Layer Perceptron: MLP) 구현하기 (XOR 문제)

1986년 역전파 알고리즘 (Backpropagation)의 개념이 도입되면서 Machine Learning이 다시 주목받게 되었습니다. 기존 단층 신경망으로는 해결할 수 없었던 비선형 문제 해결이 가능한 다층 신경망은 현재

deep-eye.tistory.com

 

0. 샘플 코드 다운로드

 

git clone https://github.com/DEEPI-LAB/Multi-Layer-Perceptron.git

 

github.com/DEEPI-LAB/Multi-Layer-Perceptron.git

 

DEEPI-LAB/Multi-Layer-Perceptron

An example of a matlab multi layer perceptron. Contribute to DEEPI-LAB/Multi-Layer-Perceptron development by creating an account on GitHub.

github.com

 

 

1. 학습 데이터 생성 및 가중치 초기화

 

# 학습 데이터 생성 (XOR Problem)
x = [0 0 ; 0 1 ; 1 0 ; 1 1];
y = [0.0000 1.0000 1.0000 0.0000];

# 입력 - 은닉층 가중치 초기화
w1 = zeros(2,2);
b1 = zeros(1,2);

# 은닉 - 출력층 가중치 초기화
w2 = zeros(2,1);
b2 = zeros;

# 학습횟수
epoch = 20000;
# 학습률
deltha = 1;

 

2. 신경망 순전파 출력 단계

 

# Neural Networks 2-2-1 
for i=1:epoch

    for j=1:length(x)

        # feedforward
        # 입력 - 은닉층 출력
        Z =  1 ./ (1 + exp(- (x(j,:)*w1+b1))); 
        % 은닉 - 출력층 출력
        Y =  1 ./ (1 + exp(- (Z*w2+b2)));        

        # error
        E(j) = y(j) - Y;

 

3. 신경망 역전파 학습 단계

 

        # backpropagation
        # 출력 - 은닉층 역전파
        alpha2 = E(j)*(Y)*(1-Y);
        # 은닉 - 입력층 역전파
        alpha1 = alpha2*((Z).*(1-Z)).*w2';
        
        # update
        # 출력 - 은닉층 가중치 업데이트
        w2 = w2 + (deltha*alpha2*Z)';
        b2 = b2 + deltha*alpha2;
	    # 은닉 - 입력층 가중치 업데이트
        w1 = w1 + deltha*alpha1'*x(j,:);
        b1 = b1 + deltha*alpha1;

        # 오차값 저장
        result(j) = Y;

    end 

 

4. 최종 코드

 

% *********************************************
% Multi-Layer-Perceptron - Nueral Networks
% Jongwon Kim
% Deep.I Inc.
% activation function = sigmoid
% *********************************************

clear all
%% Training Set (XOR Problem)
x = [0 0 ; 0 1 ; 1 0 ; 1 1];
y = [0.0000 1.0000 1.0000 0.0000];

b1 = zeros(1,2);
b2 = zeros;
w1 = zeros(2,2);
w2 = zeros(2,1);

epoch = 50000;
deltha = 1;

%% Neural Networks 2-2-1 
for i=1:epoch

    for j=1:length(x)

        %feedforward
        Z =  1 ./ (1 + exp(- (x(j,:)*w1+b1))); 
        Y =  1 ./ (1 + exp(- (Z*w2+b2)));        

        %error
        E(j) = y(j) - Y;

        %backpropagation
        alpha2 = E(j)*(Y)*(1-Y) ;
        alpha1 = alpha2*((Z).*(1-Z)).*w2';

        % update
        w2 = w2 + (deltha*alpha2*Z)' ;
        b2 = b2 + deltha*alpha2 ;

        w1 = w1 + deltha*alpha1'*x(j,:);
        b1 = b1 + deltha*alpha1;

        result(j) = Y;

    end  
    %mean square error
    mse(i) = mean(E.^2);

   txt1 = ['Target Value             ' sprintf('%.4f   ',y)];
   txt2= ['Predicted Value        ' sprintf('%.4f   ',result)];
   txt3= ['Epochs   ' sprintf('%d',i)];
   disp(txt1);
   disp(txt2);
   disp(txt3);
   clc
end
%mean square error
plot(mse);

 

 

 

# 머신러닝 프로젝트 제작, 상담 및 컨설팅  / 머신러닝 접목 졸업작품 컨설팅

# 데이터 가공, 수집, 라벨링 작업 / C, 파이썬 프로그램 제작

# email : deepi.contact.us@gmail.com

# site : www.deep-i.net

반응형