상세 컨텐츠

본문 제목

[Deep Learning-딥러닝]Backpropagation (역전파) 및 Delta Rule을 이용한 가중치 조정 방법 소스 구현 - XOR 연산

Artificial Intelligence

by [성운] 2019. 8. 7. 21:26

본문

이번 포스팅은 MLP 구조를 이용하여 XOR 연산법을 구현하는 방법에 대해서 알아보겠습니다

요새 좋은 라이브러리도 많아서 굳이 이런 걸 만들 필요가 있을까도 생각이 들겠지만, Tensorflow에서 제공하는 방법으로 구현은 당연하고, 학습 알고리즘을 더욱 잘 이해하려면 직접 구현이 꼭 필요하다고 생각이 들어서 직접 구현해 봤습니다.

파이썬을 다루어 본 적이 없어 Doc 사이트 및 많은 구글링을 하였습니다. 또한 국내 많은 개발자는 대부분 DB를 이용하여 데이터를 처리하는 업무를 많이 합니다. 저 역시 이런 일을 많이 했습니다. 행렬 계산이 머릿속에 잘 그려지지 않아 많은 시행착오가 있었습니다.

소스 구성은 델타룰 알고리즘 및 제곱합을  Python으로 구현한 소스와 두 번째는 Tensorflow를 이용한 구현 두 가지입니다.

선행 학습으로 경사하강법”, “Solving XOR Problem with MLP” “Back propagation” 이론이 필요하므로 https://ynebula.tistory.com/14”, “https://ynebula.tistory.com/22”, “https://ynebula.tistory.com/24 포스팅 참고 바랍니다.

학습 내용 및 신경망 구성

XOR 연산을 제곱합 비용함수와 델타룰 학습 알고리즘으로 구현합니다. 신경망 구성은 다음과 같습니다.

Network

직접 구현에서는 구현 편의상 편차는 0으로 가정하고 구현하였습니다

제곱합 및 델타룰 알고리즘 구현

소스 구성은 “Sigmoid 함수”, “제곱합 학습 알고리즘”, “가중치 초기화 및 학습 훈련”, “학습 테스트 부분으로 구성되어 있습니다. 학습 방법은 SGD 방식으로 구현했습니다. 또한 행렬곱 연산과 행렬합 연산 방법을 이해해야 소스 원리를 알 수 있습니다.

1.     Sigmoid 구현

Source-1

Sigmoid 함수를 구현하기 위해 numpy 라이브러리를 import 합니다. 개인적으로 학습률은 너무 높지 않은 수로 설정하는 것이 좋다고 생각됩니다. 과거에 학습률을 0.9로 했을 때 결과가 잘 나오지 않았던 기억이 있습니다. N은 데이터가 4개로 되어 있으므로 4로 설정합니다.

2.     제곱합 학습 알고리즘

Source-2

backpropagationXOR 함수는 인공신경망의 가중치를 조정해서 반환하는 기능을 합니다. 인자로 가중치와 학습 데이터를 넘겨받아 새로 갱신된 가중치를 반환합니다. 인자의 역할은 다음과 같습니다.

- W1: 입력층-은닉층 가중치 행렬을 보관하는 변수

- W2: 은닉층-출력층 가중치 행렬을 보관하는 변수

- X: 학습 데이터의 입력 데이터

- D: 학습 데이터의 정답 데이터

Feed forward 부분은 가중 합 및 활성함수를 적용하였습니다. 오차 부분에서 주의할 점은 은닉층의 오차를 구할 때 W(가중치)를 전치(transpose) 했다는 점입니다. 이 오차를 사용해 은닉층의 델타를 구합니다. SGD 방식을 사용했으므로 데이터를 학습할 때마다 가중치를 갱신합니다.

Source-3

학습이 완료되면 최종 W1, W2을 이용해서 훈련 같은 방법으로 출력 값을 구하면 됩니다.

Source-4

텐서플로

은닉층, 출력층의 가중 합을 구하기 위해 행렬 곱을 연산하는 tf.matmul 함수를 사용합니다. 행렬 연산이 끝나면 편차 더해줍니다. 그리고 활성함수 tf.sigmoid를 적용하여 출력값을 계산합니다.

reduce_mean 함수는 텐서의 차원을 1차원으로 줄이고 elements의 평균을 계산합니다. 즉 정답과 출력값의 차이인 오차의 평균을 반환합니다. GradientDescentOptimizer 함수는 경사하강법 알고리즘을 구현한 함수입니다. 이 함수는 Cost가 최소가 되도록 합니다. GradientDescentOptimizer 함수는 compute_gradientapply_gradients 함수를 결합한 형태입니다.

텐서플로는 Session() 함수를 통해 세션을 생성하고 프로그램을 Tensorflow 라이브러리와 연결이 됩니다. , 텐서플로가 알고리즘을 실행하기 위해서는 Session을 생성하고 run 메서드에 train 매개변수를 넣어 호출해야 합니다. 또한 앞에서 선언한 변수를 initialize_all_variable() 메서드를 사용해서 먼저 초기화해야 합니다. 텐서의 자료형구조 및 이름을 매개변수로 설정합니다. feed_dict() 의 매개변수로 전달합니다.

 Source

다음 git URL에서 전체 소스를 다운받을 수 있습니다.

https://github.com/ynebula/First-Contact-with-Books/blob/master/Deep_Learning/Backpropagation.ipynb

 

ynebula/First-Contact-with-Books

첫걸음 시리즈 예제 소스입니다. Contribute to ynebula/First-Contact-with-Books development by creating an account on GitHub.

github.com

 

감사합니다.

 

[Reference]

딥러닝 첫걸음

www.tensorflow.org

 

관련글 더보기

댓글 영역