안녕하세요
퍼셉트론은 인공지능의 시작 이론이라고 했습니다.
퍼셉트론의 한계는 XOR문제라고 했습니다. 저번 포스팅을 참고해주세요
https://ruminz.tistory.com/279 (인공지능의 시작 퍼셉트론 아달리안)
XOR 문제
이 XOR 문제를 해결하기 위해 다층퍼셉트론이랑 오차역전파가 나왔습니다.
먼저 다시한번 XOR 문제를 살펴보죠
XOR 문제는 저 도형에서 같은색끼리 한쪽으로 나눌수있는 선을 긋는 문제였습니다. 하지만 저 도형에서는 어떠한 선도 그을수 없습니다.
XOR 문제해결
해결방법은 종이를 접는것입니다. 즉 평면을 휘어주는것이죠 2차원에서 3차원으로 넘어가면 되는것입니다. 즉 종이를 휘어 준다음 선 두개를 동시에 긋는 방법입니다. 퍼셉트론에 의하면 두개를 각각 처리하는 은닉층을 만드는것입니다.
XOR 연산을 하기 위해서는 x1 x2의 값을 각각 NAND랑 OR 연산에 넣어줍니다. 그리고 그걸 AND연산처리하면 구하고자 하는 XOR연산을 수행할수있게 됩니다. 이를 그림으로 표현하면 다음과 같습니다.
가운데 은닉층이 추가 되었습니다. 입력값 x1 x2에 여기서 가중치 w를 곱하고 바이어스 b를 더해 은닉층으로 전송합니다. 은닉층에 도달한 값은 활성화 함수를 통해 그 다음으로 보내집니다. 여기서 시그모이드 함수를 사용한다음 식은
$$ n1 = \Sigma(x1w11 + x2w21 + b1) $$
$$ n2 = \Sigma(x2w12 + x2w22 + b2) $$
두식의 결괏값이 츨력층의 방향으로 보내지고 출력층으로 전달된 값은 활성화 함수를 사용해 y 예측값을 정하게 됩니다. 이를 식으로 표현하면
$ Y = \Simga(n1w31 + n2w32 + b3) $$
이제 가중치와 바이어스를 정합니다. 그림에서 보시는 바와 같이 XOR 문제를 해결하기 위해서는 6개의 가중치와 3개의 가중치가 필요합니다. 이를 행렬로 표현해봅시다.
$$ W1 = \begin{equation}
\begin{bmatrix}
w_{11} & w_{12} \\
w_{21} & w_{22} \\
\end{bmatrix}
\end{equation}
$$
$$ W2 = \begin{equation}
\begin{bmatrix}
w_{31} \\
w_{22} \\
\end{bmatrix}
\end{equation}
$$
$$ B1 = \begin{equation}
\begin{bmatrix}
b_{1} \\
b_{2} \\
\end{bmatrix}
\end{equation}
$$
$$ B2 = \begin{equation}
\begin{bmatrix}
b_{3} & \\
\end{bmatrix}
\end{equation}
$$
파이썬으로 구현하는 다층퍼셉트론
파이썬으로 다층퍼셉트론을 구현해봅시다.
먼저 관련 라이브러리를 임포트하고 가중치와 바이어스를 설정해줍니다.
import numpy as np
w11 = np.array([-2, -2])
w12 = np.array([2,2])
w2 = np.array([1,1])
b1 = 3
b2 = -1
b3 = -1
그다음 퍼셉트론을 구현해봅시다.
y가 0이하 이면 0을 반환하고 0을 초과하면 1을 반환합니다.
def MLP(x,w,b):
y = np.sum(w * x) + b
if y <= 0:
return 0
else :
return 1
그다음 NAND, OR, AND, XOR 게이트를 정의해줍니다.
마지막으로 값을 대입하여 출력을 해줍니다.
def NAND(x1,x2):
return MLP(np.array([x1,x2]),w11,b1)
def OR(x1,x2):
return MLP(np.array([x1,x2]),w12,b2)
def AND(x1,x2):
return MLP(np.array([x1,x2]),x2,b3)
def XOR(x1,x2):
return AND(NAND(x1,x2), OR(x1,x2))
for x in [(0,0),(1,0),(0,1),(1,1)]:
y = XOR(x[0],x[1])
print("입력 값: " + str(x) + "출력 깂: "+str(y))
확인을 해보면 다음과 같이 나오는걸 확인할수 있습니다.
입력 값: (0, 0)출력 깂: 0
입력 값: (1, 0)출력 깂: 1
입력 값: (0, 1)출력 깂: 1
입력 값: (1, 1)출력 깂: 0
'Coding > AI' 카테고리의 다른 글
이미지 딥러닝 기초 mnist 써보기 (0) | 2023.10.15 |
---|---|
오차역전파 딥러닝의 시작 (0) | 2023.10.15 |
인공지능의 시작 퍼셉트론 아달리안 (0) | 2023.10.10 |
로지스틱 회귀란 무엇인가 (0) | 2023.10.10 |
Tensorflow로 선형회귀를 구현해보자 (0) | 2023.10.08 |