XOR 진리표 해결방법 생각하기
다층 퍼셉트론에서 은닉층
퍼셉트론을 이용해서 XOR을 처리할때 2차원평면에서 처리하려고 하니 해결하지 못했습니다. 이제 이 2차원적인 것을 만약에 접는다고 생각하면? xor을 분리할 수 있게 되었습니다.
예시 그림
이런식으로 휘어지게 그려주면 분리할 수 있는데 퍼셉트론에서 이렇게 휘어지게 할수 있게 도와주는 것을 숨어있는 층 즉, **은닉층(hidden layer)**라고 합니다.
이런식으로 표현할 수 있습니다.
다층 퍼셉트론 설계
아까 위에 있는 그림에서 이것을 한번 도식화 시켜주겠습니다.
그러면 이런식으로 표현할 수 있습니다.
여기서 가운데 다층 퍼셉트론을 보면 은닉층에서 모인 값들이 한 번 더 시그모이드 함수를 이용해 최종값으로 결과를 보내는 것을 확인할 수 있습니다. 은닉층에 모이는 중간 지점을 N이라고 표현했는데 이것을 노드라고 합니다. 이제 N1, N2의 각각 단일 퍼셉트론 값을 확인하겠습니다.
- N1 = σ(X1W11 + X2W21 + B1)
- N2 = σ(X1W12 + X2W22 + B2)
이제 이 값들을 합쳐서 출력되면 다음과 같이 출력 됩니다.
- Y out = σ(N1W31 + N2W32 + B3)
이제 이것을 2차원 배열로 늘어놓으면 다음과 같이 표현할 수 있습니다.
W(1) = [ [ W11, W21 ],[ W12,W22 ] ]
B(1) = [ B1 , B2 ]
W(2) = [ W31, W32 ]
B(2) = [ B3 ]
XOR 예시 문제 해결
W(1) = [ [ -3 , -3 ],[ 3, 3 ] ]
B(1) = [ 5 , -2 ]
W(2) = [ 1, 1 ]
B(2) = [ -1 ]
이렇게 값이 주어지면 코딩을 통해 한번 해결해 보겠습니다.
import numpy as np
# 가중치와 바이어스
W11 = np.array([-3,-3])
W12 = np.array([3,3])
W2 = np.array([1,1])
B1 = 5
B2 = -2
B3 = -1
def check_percep(result):
return 1 if result > 0 else 0
# NAND 게이트
def NAND(x1, x2):
result = np.sum(np.array([x1,x2])*W11) + B1
return check_percep(result)
# OR 게이트
def OR(x1,x2):
result = np.sum(np.array([x1,x2])*W12) + B2
return check_percep(result)
# AND 게이트
def AND(x1,x2):
result = np.sum(np.array([x1,x2])*W2) + B3
return check_percep(result)
# XOR 게이트
def XOR(x1,x2):
return = AND(NAND(x1,x2),OR(x1,x2))
# 메인 함수
if __name__ == '__main__':
for x in [(0,0),(1,0),(0,1),(1,1)]:
y = XOR(x[0],x[1])
print(f"입력 값 : {x} 출력 값 : {y}")
출력 값 :
이렇게 결과 값이 잘 나온것을 확인할 수 있습니다. 이렇게 하나의 퍼셉트론으로 해결하지 못하는 문제를 은닉층을 여러개 쌓아서 복잡한 문제를 해결하려는 과정을 보면 사람의 신경망과 비슷하게 동작하는 것을 확인할 수 있습니다. 이것을 보고 인공 신경망 혹은 신경망으로 부르기 시작했습니다.
참고한 책 :
www.gilbut.co.kr/book/view?bookcode=BN001909
'Data·AI > 관련자료' 카테고리의 다른 글
Datagrip ssh tunnel 오류 해결 (1) | 2022.10.03 |
---|---|
오차 역전파(Backpropogation) (0) | 2021.04.29 |
퍼셉트론(Perceptron)이란 (0) | 2021.04.27 |
확률이란-1 (0) | 2021.03.30 |
머신러닝 개요 (0) | 2020.09.01 |
댓글