이번 포스팅은 MLP 및 비용함수를 CrossEntropy를 이용하여 XOR 연산법을 구현하는 방법에 대해서 알아보겠습니다.
소스 구성은 델타룰 알고리즘 및 Cross Entropy를 Python으로 구현한 소스와 두 번째는 Tensorflow를 이용한 구현 두 가지입니다. Cross Entropy에 대한 이론은 “https://ynebula.tistory.com/28” 포스팅을 참고 바랍니다.
XOR 연산을 Cross Entropy 비용함수와 델타룰 학습 알고리즘으로 구현합니다. 신경망 구성은 다음과 같습니다.
직접 구현에서는 구현 편의상 편차는 0으로 가정하고 구현하였습니다.
소스 구성은 “Sigmoid 함수”, “Cross Entropy 학습 알고리즘”, “가중치 초기화 및 학습 훈련”, “학습 테스트” 부분으로 구성되어 있습니다. 학습 방법은 SGD 방식으로 구현했습니다. 또한 행렬곱 연산과 행렬합 연산 방법을 이해해야 소스 원리를 알 수 있습니다.
1. Sigmoid 구현
Sigmoid 함수를 구현하기 위해 numpy 라이브러리를 import 합니다. 개인적으로 학습률은 너무 높지 않은 수로 설정하는 것이 좋다고 생각됩니다. 과거에 학습률을 0.9로 했을 때 결과가 잘 나오지 않았던 기억이 있습니다. N은 데이터가 4개로 되어 있으므로 4로 설정합니다.
2. Cross Entropy 학습 알고리즘
가중합과, 활성함수 결과를 저장할 행렬 변수를 선언하였습니다. 신경망 연산은 행렬 연산을 수행하므로 꼭 행렬로 선언하셔야 합니다. 필자는 처음에 배열로 선언해서 많은 시행착오를 가졌습니다. 학습 부분은 어렵지 않으므로 넘어가겠습니다.
출력층에 비용함수로 Cross Entropy를 사용했으므로 출력층 델타는 출력층 오차와 같습니다. 따라서 output_delta에 output_err의 값을 저장합니다.
은닉층 오차를 구하기 위해 “은닉층-출력층” 가중치를 전치하여 행렬곱을 수행해야 합니다. “은닉층-출력층” 가중치를 전치했으므로 1행 2열에서 2행 1열이 되었으며 output_delta와 행렬곱을 수행하여 hidden_err은 2행 1열이 됩니다. 1행은 첫 번째 노드의 오차이고 2행은 두 번째 노드의 오차입니다.
은닉층에 두 개의 노드가 있습니다. 따라서 각 노드의 델타를 구합니다. 활성함수를 Sigmoid를 사용했으므로 도함수와 오차 값을 곱하여 은닉층 델타를 구합니다.
“은닉층-출력층”에서 output_delta는 1행 1열이고 hidden_y는 2행 1열로 되어있어 hidden_y를 전치시켜 행렬곱을 수행했으며, 결과가 1행 2열이 되어 W2와 같은 형태로 만들었습니다.
3. 가중치 초기화 및 학습 훈련
가중치 난수를 배열에 담아 행렬로 변화하여 W1, W2를 초기화하였습니다. 훈련은 1000번 수행했습니다.
4. 학습 테스트
훈련을 1000만 수행했는데 Sum of squared와 비슷한 결과를 냈습니다. Cross Entropy가 같은 오차라도 Cross Entropy 함수가 훨씬 더 민감하게 반응한다는 이론을 확인할 수 있습니다.
다른 부분은 앞 포스팅과 같아설명하지 않겠습니다. 다른 부분은 비용을 계산하는 부분이 변경되었습니다.
Source
[Sum of squared]
https://github.com/ynebula/First-Contact-with-Books/blob/master/Deep_Learning/Backpropagation.ipynb
[Cross entropy]
감사합니다.
[참고자료]
딥러닝 첫걸음
[Deep Learning-딥러닝]딥러닝 정의 및 출현 배경 - 그래디언트 소실, 과적합(Over fitting), 많은 연산량 (0) | 2019.08.24 |
---|---|
[Deep Learning-딥러닝]Multi Classification - 다범주분류 및 소스프맥스 소스 구현 (0) | 2019.08.19 |
[Deep Learning-딥러닝]비용함수 및 유사도-Sum of Squared Error, Cross Entropy, Cosine Similarity (5) | 2019.08.10 |
[Reinforce Learning]강화학습 정의 (0) | 2019.08.09 |
[Deep Learning-딥러닝]가중치 조정 - Momentum (0) | 2019.08.08 |
댓글 영역