24. XOR 문제 딥러닝으로 풀기 (lec 09-1)


여기서부터는 딥러닝(Deep Learning)이라 부르는 뉴럴 네트워크(Neural Network)의 세계. 앞에 있는 내용을 이해하면, 이번 내용을 이해하기에는 전혀 무리가 없을 거라고 생각한다. 놀랍게도 이전에 배운 multinomial regression을 확장해서 구현하고 있다.


각각은 logistic regression으로 두 개 중에서 하나만 선택할 수 있다. logistic regression 한 개만 사용해서는 XOR 문제를 해결할 수 없지만, 그림처럼 3개를 연결해서 사용한다면 가능하다고 설명하고 있다. 어떻게 보면 이 부분이 Neural Network의 핵심일 수 있다. 기존의 방식을 연결해서 사용하는 거.


Minsky 교수가 말했다. "XOR 문제를 풀 수는 있지만, W와 b를 학습시킬 수 있는 방법(a viable way to train)은 없어!"


두 개의 feature x1과 x2가 있고, 이들은 0 또는 1의 값을 갖는 boolean 데이터다. 이때 XOR 연산은 두 개의 값이 같은 경우에는 False, 다른 경우에는 True가 된다는 것을 보여준다. 그래프를 통해서도 볼 수 있다. 다만 여기서는 데이터를 한 개씩만 표시했는데, 앤드류 교수님은 4개의 영역에 대해 각각 10개 이상의 많은 데이터를 표시했다. 이 문제가 단순한 XOR의 문제만을 해결하려는 것이 아니라는 뜻이다.


3개의 logistic regression을 그렸다. 마지막에는 S로 표현되는 sigmoid가 자리하고 있다. 이 말은 hypothesis의 결과가 항상 0과 1 사이의 값으로 조정된다는 것을 뜻한다. 이 그림에서 중요한 것은 앞에 나온 2개의 결과가 마지막 logistic regression의 입력이 되는 부분이다. 앞에 나온 2개의 결과는 y1과 y2이고, 마지막의 입력은 y1과 y2이다.

그림 왼쪽은 x1과 x2가 갖는 값에 대해서 차례대로 계산한 결과를 나열하셨다. 여기서는 마지막 계산인 x1과 x2가 모두 1인 경우에 대해서만 캡쳐를 했다. 최종적으로 Ŷ(Y hat)열에 보면 올바른 값이 계산되는 것을 볼 수 있다.

x1과 x2는 (0, 0), (0, 1), (1, 0), (1, 1)

W = (5, 5),   b = -8
(0*5 + 0*5) + -8 =   0 - 8 = -8   ==>   sigmoid(-8) = 0
(0*5 + 1*5) + -8 =   5 - 8 = -3   ==>   sigmoid(-3) = 0
(1*5 + 0*5) + -8 =   5 - 8 = -3   ==>   sigmoid(-3) = 0
(1*5 + 1*5) + -8 = 10 - 8 =   2   ==>   sigmoid(  2) = 1

W = (-7, -7),   b = 3
(0*-7 + 0*-7) + 3 =     0 + 3 =     3   ==>   sigmoid(3) = 1
(0*-7 + 1*-7) + 3 =   -7 + 3 =   -4   ==>   sigmoid(3) = 0
(1*-7 + 0*-7) + 3 =   -7 + 3 =   -4   ==>   sigmoid(3) = 0
(1*-7 + 1*-7) + 3 = -14 + 3 = -11   ==>   sigmoid(3) = 0


마지막 logistic regression에 전달될 x1과 x2는 이전 결과의 조합이므로 (0, 1), (0, 0), (0, 0), (1, 0)

W = (-11, -11),   b = 6
(0*-11 + 1*-11) + 6 = -11 + 6 = -5   ==>   sigmoid(-5) = 0
(0*-11 + 0*-11) + 6 =     0 + 6 =   6   ==>   sigmoid(  6) = 1
(0*-11 + 0*-11) + 6 =     0 + 6 =   6   ==>   sigmoid(  6) = 1
(1*-11 + 0*-11) + 6 = -11 + 6 = -5   ==>   sigmoid(-5) = 0


이전 그림에 나온 그림을 정리하면, 이번 그림처럼 하나로 연결해서 정리할 수가 있다. 최초의 x1과 x2는 두 개의 logistic regression에 전달되고, 이들의 계산 결과를 마지막 logistic regression의 입력으로 전달한다.


# (  2,   5, -6), (  5,   5, -2), (-10,   5, -2)
# ( 2, 5, -6), (-10, -10, 2), (-10, -10, 2)
# ( 5, -10, -2), (-10, 5, -2), ( 5, 5, -2)
# ( 5, -10, -2), ( 2, -7, 6), ( 2, -7, 6)
# (-10, 5, -2), ( 5, -10, -2), ( 5, 5, -2)
# (-10, 5, -2), (-10, 5, 6), ( 2, -7, 6)
# ( 5, 5, -2), ( 2, 5, -6), ( 5, -10, -2)
# ( 5, 5, -2), ( -7, -7, 10), ( 2, 5, -6)
# ( -7, -7, 10), ( 5, 5, -2), ( 2, 5, -6)
# ( -7, -7, 10), (-10, -10, 2), ( 5, -10, -2)
# (-10, 5, 6), (-10, 5, -2), (-10, 5, 6)
# (-10, 5, 6), ( 2, -7, 6), ( -7, -7, 10)
# ( 2, -7, 6), ( 5, -10, -2), (-10, 5, 6)
# ( 2, -7, 6), (-10, 5, 6), ( -7, -7, 10)
# (-10, -10, 2), ( 2, 5, -6), (-10, -10, 2)
# (-10, -10, 2), ( -7, -7, 10), (-10, 5, -2)

XOR 조건을 만족시키는 또 다른 조합이 있는지 찾아보라고 말씀하셨다. 찾아봤다. 파이썬으로 만들어서 돌려보니까, 16개의 결과가 나왔다. 더욱 다양한 값들도 가능하겠지만, 이 정도만 해도 충분해 보인다. 맨 위의 하나를 계산했는데, 답이 맞았다. 코드는 다음 글에 올리도록 하겠다.


그림 왼쪽을 오른쪽처럼 처리할 수 있다. logistic regression을 multinomial classification으로 변환할 때, 행렬을 사용해서 처리했었다. 오른쪽은 왼쪽 그림에 있는 첫 번째 logistic regression들을 하나로 결합할 수 있다는 것을 보여준다. 뒤에 가면 여러 개의 logistic regression들을 묶어서 layer라고 부른다.


기억을 되살리기 위해 추가한 그림. 3가지 중에서 한 가지를 선택하기 위한 multinomial classification에 대한 내용이다.


Neural Network는 여러 개의 logistic regression을 순차적으로 연결하는 구조이기 때문에 코드에서도 동일한 방식으로 나타난다. 그림 오른쪽 아래에 있는 텐서플로우 코드에서 K는 첫 번째 logistic regression들의 결과이고 이것을 행렬 곱셈(matmul)에 다시 전달하고 있다.

그렇다면, 전달된 데이터로부터 W1, W2, b1, b2를 어떻게 학습시킬 수 있을까?