티스토리 뷰


Introduction to A.I. (3/5)

  • 인공지능을 공부할 때 알아두면 좋을 기초적인 내용을 정리한 자료입니다
    • 정확히는 딥러닝을 기반으로 하는 인공지능 에 대해서입니다
  • 추후 시간이 된다면 동영상으로도 제작해볼 생각입니다
  • 포스팅마다 50개까지의 이미지만 업로드할 수 있어, 이왕 나누는 김에 5부작으로 나누었습니다
    • (1/5) ... (5/5) 로 구분됩니다

(3/5)


  • 3장 Perceptron 에서는 인공신경망을 구성하는 퍼셉트론에 대해 알아봅니다
  • 이번 장의 내용은 2장 내용을 이해한 것을 전제하고 있습니다
  • 따라서 2장 내용이 이해되지않는 경우 가볍게 보고 넘어가세요



  • 퍼셉트론은 가중치 변수와 일련의 연산들로 구성되는 노드입니다
  • 인공신경망을 그래프로 표현했을 때, 노드 하나하나를 지칭하는 용어이기도 합니다
  • 출력값을 제어하기 위한 활성화함수를 가집니다
    • 자신에게 연결된 다른 퍼셉트론에게 어떤 값을 전달해줄지 결정합니다



  • 단일 퍼셉트론은 최대 2가지 종류의 데이터를 분류할 수 있습니다
    • 다시 말하면, 2개 초과의 데이터는 다중 퍼셉트론으로 분류할 수 있습니다
  • 분류에도 여러 종류가 있는데
    • 1가지 종류의 데이터를 분류하는 것을 Linear Regression 이라 하고
    • 2가지 종류의 데이터를 분류하는 것을 Binary Classification 이라 합니다

※ Binary Classification = Linear Classification



  • L.R. 은 비용을 최소화하는 선을 그리는 알고리듬입니다
    • 비용이라 함은 종종 선과 데이터간 거리로 정의됩니다
  • (선형회귀로) 학습한 뒤에는 예측값을 구하는 모델을 얻게 됩니다
    • 여기서의 모델이라 함은 인공신경망을 부르는 다른 말입니다
  • L.C. 을 살펴보기 이전에 이곳에서 Gradient Descent 를 적용해볼 것입니다



  • 매우 간단한 데이터를 가지고 L.R. 을 구현해보겠습니다
    • x 를 입력으로 하고 y 를 출력으로 하는 퍼셉트론을 설계합니다
    • 즉, y=x 꼴의 함수에 가까워진다면 성공하는 것입니다
  • 데이터셋의 크기는 3 이고 각 데이터의 크기는 1 입니다
    • 따라서 퍼셉트론이 가져야할 가중치는 1 개입니다
    • 하지만 바이어스가 존재하는 것이 더 효과적이라는 게 학계의 정설입니다
    • 그러므로 우리도 바이어스를 위한 가중치도 준비해줍시다
  • 결과적으로는 가중치 변수가 총 2개 필요합니다
    • 그리고 활성화함수는 사용하지않겠습니다
    • 즉, 활성화함수 이전까지의 연산결과를 그대로 흘려보냅니다



  • 퍼셉트론의 설계를 끝냈으니, 이제 이를 어떻게 학습시킬지 결정합니다
    • 당연히 G.D. 알고리듬을 적용할 것입니다
    • 이 알고리듬은 입력값을 조정해 출력값을 바꾸는 특징을 가집니다
    • 그리고 퍼셉트론의 입력값은 데이터와 가중치 두 종류입니다
    • 여기에서, 데이터 자체가 변경되면 안 되므로 우리는 가중치만 조정하게 될 것입니다
  • 가중치 변수들의 초기값을 모두 1 로 설정합니다
  • 원하는 결과값과의 차이가 얼마나 나는지 알기 위한 연산도 필요합니다
    • 학습을 위해 (가중치 변수의 조정을 위해) 필요하기 때문입니다
  • 삽화는 각 연산들을 간소화하고, 퍼셉트론을 블럭으로 다시 표현한 것입니다



  • 위의 과정만으로는 G.D. 알고리듬을 제대로 적용할 수 없습니다
    • G.D. 알고리듬은 최종 출력값을 늘리거나 줄일 수 있습니다
    • 그러므로 원하는 값과의 차이를 줄이는 데에 사용해야할 것입니다
  • 우리는 원하는 값과의 차이를 0 에 가깝게 만들고 싶습니다
    • 퍼셉트론의 출력값을 0 으로 만드는 것이 아니죠
    • 만약 퍼셉트론의 출력값에 곧바로 G.D. 를 적용한다면
    • 어떤 데이터가 들어와도 출력이 0 이 되는 가중치값들로 학습이 될 것입니다
  • 따라서 우리는 퍼셉트론의 출력값을 기반으로 원하는 값과의 차이를 계산하는 별도의 함수가 필요합니다
    • 이 함수는 일반적으로 Error Function 이라 불립니다
    • 학습시키는 동안에만 우리의 모델에 붙어있게 됩니다 (학습 이후 제거)



  • 제일 간단한 오류함수는 좌상단 빨간 사각형의 내용과 같습니다
    • 모든 데이터를 고려하기 위해 sum (\sum) 을 사용합니다
    • 미분시 나오는 2 를 상쇄하기 위해 N 이 아닌 2N 으로 나눕니다
    • 원하는 값과 출력값이 차이가 클수록, 더 많이 조정하기 위해 제곱을 사용합니다
  • 확률과 통계 를 공부했다면 눈치챘겠지만, 위의 식은 분산 공식 과 유사합니다
    • 그리고 수식의 의미도 그와 동일합니다
    • 따라서, 분산 자체를 공부하는 것도 위의 수식을 이해하는 데에 도움이 될 것입니다
  • 오류함수가 이와 같은 구조이기 때문에
    • 데이터셋의 모든 데이터를 순회할 때가 되어서야 학습이 수행됩니다
  • 오류함수가 이런 방식으로 구현되어, 가중치 조정의 방향이 일정합니다
    • 단순히 빼기만 하면 됩니다 (이후에 설명)
  • 오류함수의 원형은 좌상단 빨간 사각형과 같지만
    • G.D. 알고리듬을 적용하려면 이에 대한 편미분을 구해야합니다
    • 저는 이를 GD_x 라는 이름으로 부르겠습니다
    • x 에는 가중치 변수의 이름이 들어갑니다



  • 앞서 말했던 것처럼, G.D. 알고리듬을 사용해 오류함수값을 0 에 가깝게 줄일 수 있을 것입니다
  • 오류함수는 제곱꼴이기 때문에 항상 양수값이 나올 것이고요
    • 즉, 음수값이 나올 일이 없으므로 항상 빼주기만 하면 됩니다
  • 또한 제곱꼴이기 때문에 삽화와 같은 성질또한 갖게 됩니다



  •  공식을 사용하려면, 오류함수 이전까지의 편미분을 구해야합니다
    • chain rule 을 사용해 편미분값을 구할 수 있습니다
  • 자 그럼 제가 언급했던 GD_x 공식에 두 가중치 변수를 적용합니다
    • 각 가중치 변수에 대한 GD 값을 구했다면, 오프셋도 구할 수 있습니다
    • 여기서의 오프셋은 기존의 가중치 변수에서 얼마나 변화시킬지를 결정하는 값입니다
    • 오프셋을 결정할 때 stepSize 도 고려하도록 합시다 (0.1 로 합니다)
  • 이제 (수작업으로...) 학습을 시켜봅시다
    • 첫번째 학습결과는 각 가중치 변수를 0.2, 0.1 만큼 변화시킵니다

※ 계산과정 (한 번만 보여드립니다)
GD_w = \frac{1}{3}\sum_{i=1}^3(output_i - data_i)\frac{\delta output_i}{\delta w} = \frac{1}{3}((2-1)\cdot 1 + (3-2)\cdot 2 + (4-3)\cdot 3) = 2
\therefore GD_w = 2



  • 위에서 보았던 계산과정을 반복합니다
  • 우리 모델의 출력값이 우리가 원하는 값에 근접해가는 모습이 보이나요 ?



  • 앞서 보았던 계산결과를 표로 정리하면 다음과 같습니다
  • 이러한 작업은 좌하단의 그래프를 의미합니다
    • 가중치 변수를 조정하여 차이를 줄이는 것이죠
    • 오류함수가 제곱꼴이기 때문에 그래프 또한 2차함수 모양이고요
  • G.D. 와 같은 알고리듬을 적절하게 사용하는 것도 중요하지만
    • 이런 인공신경망의 가중치 초기값과 stepSize 를 설정하는 것도 중요합니다
    • 그 값들이 적절하게 설정된다면 필요한 학습횟수가 줄어들 수 있고
    • 매우 부적절할 경우에는 원하는 모델을 만들지 못할 수도 있습니다
  • 우하단의 삽화는 stepSize 가 1 인 경우의 그래프입니다
    • 가중치 변수의 값과 차이값이 e^{11} 범위를 넘어섭니다



  • 앞서 말한 것을 그림으로 표현한 것입니다
  • over-shooting 은 오류함수값이 계속 발산하는 현상이며
  • local-minima 는 국지적인 최소값을 의미합니다
    • local-minima 를 만났을 때 stepSize 가 너무 작다면
    • 빠져나가지 못하고 그래프상에서 계속 진동하게 될 것입니다



  • 이번에는 퍼셉트론으로 L.C. 문제를 해결해봅시다
    • AND 논리게이트와 동일한 작동을 하는 퍼셉트론으로 학습시켜보겠습니다
  • 이번에는 데이터로부터 들어오는 입력값이 2 개입니다
    • 그러므로 가중치 변수도 2 개를 준비합니다
    • 추가적으로 바이어스를 위한 가중치 변수까지 고려한다면 총 3 개가 필요합니다
  • 활성화함수로 tanh() 를 사용합니다
    • 이 함수는 어떤 값이 들어와도 (-1, 1) 구간으로 수렴시키는 특징을 가집니다
    • 출력값이 -1 또는 1 이므로, 이보다 더 크거나 작은 값은 필요없기 때문에 제한하기 위해 사용합니다



  • 초기값은 이전과 동일하게 모두 1 로 설정합니다
  • L.R. 에서처럼 각 연산들을 간소화시킵니다



  • L.R. 에서처럼 퍼셉트론들을 블럭으로 표현합니다
  • 그리고 각 가중치 변수들의 편미분 공식을 구해줍니다
    • 이 편미분은 모델의 출력값에 대한 것이지, 오류함수에 대한 것이 아닙니다



  • 이전과 동일한 방법으로 가중치 변수들을 조정합니다



  • 경향성을 살펴보면 w_1 과 w_2 의 값은 증가하고 w_3(=b) 의 값은 감소합니다



  • 좌상단 사진은 위의 방식으로 1000 번 학습시킨 결과입니다
    • weight 이후의 값은 각각 w_1, w_2, w_3(=b) 입니다
  • 이를 각각 2D 3D 그래프로 그려보았을 때 오른쪽과 같습니다
    • x, y 의 값이 모두 1 일 경우에 z축상으로 양수값을 얻고
    • 그렇지않은 경우 z축상으로 음수값을 얻음을 알 수 있습니다
  • 단순히 데이터만 변경하고 이전 과정을 거치면 OR 논리게이트를 구현할 수 있습니다
  • 이제 XOR 논리게이트 구현에 도전해봅시다



  • AND 논리게이트 때와 동일한 구조로 진행합니다



  • 이 부분도 우려먹겠습니다



  • 학습을 시켜보니 뭔가 좀 이상합니다
  • 오프셋이 모두 동일하게 나오네요


  • 단순한 우연이 아니었던 것 같습니다
  • 오프셋이 모두 동일한 것은 GD 값이 모두 동일하기 때문인데, 이러한 일이 왜 발생하는 걸까요



  • 왼쪽의 사진은 위의 학습을 1000 번 수행한 뒤의 결과입니다
    • 오류함수값이 전혀 줄어들지않는 모습입니다
    • 또한 가중치값들은 증가만 하고 있습니다
  • 이러한 문제가 발생하는 이유는 XOR을 선형으로 구분할 수 없기 때문입니다
    • 즉, 비선형으로 구분할 수 있는 다중 퍼셉트론 구조를 사용해야합니다



  • 이번에는 퍼셉트론을 3 개로 늘려보겠습니다
  • 각 퍼셉트론의 구조에는 변함이 없습니다



  • 초기값은 모두 무작위값으로 설정했습니다
    • 변수 개수가 많아지기 시작할 때, 무작위값을 대입하는 것도 나쁜 선택은 아닙니다
    • 오히려 모두 동일한 값으로 대입하는 것이 더 나쁜 결과를 가져올 수 있습니다
    • 실제로 모두 1 로 설정한다면, 학습을 아무리 반복해도 원하는 결과를 절대 얻지 못하게 됩니다
  • 이전 방식과 동일하게 간소화 작업을 거칩니다



  • 가중치 변수가 9 개나 되다 보니 각 편미분 공식을 구하는 것도 일입니다
    • 퍼셉트론이 여러 개 붙어있는 경우, 편미분 계산이 복잡해지기 쉽습니다
  • 지금까지의 계산과정을 잘 관찰했다면, 최종연산에서 입력연산까지 연결하는 방식을 눈치챘을 것입니다
    • 최종연산에서 입력연산 방향으로 사다리를 타는 것처럼 이동하면서
    • 지나치는 연산들의 미분값들을 chain rule 에 적용하면 됩니다



  • 잊을 만하니 다시 복습해보죠
    • 오류함수에서 특정 가중치 변수에 대해 편미분을 한 것이 GD 입니다
    • 가중치 변수의 이름이 w 라면 GD_w 인 것이고요
  • 초기 가중치값은 오른쪽과 같습니다
    • 바이어스만 모두 1 로 설정해줬습니다
    • 일반적으로 바이어스의 경우 1 이 아닌 값을 잘 쓰지않기 때문입니다



  • 학습시켜봅시다
  • 모델의 규모가 커지면서 슬라이드에 모두 담기가 어렵습니다



  • 이에 따라 표로 정리하여 표기합니다
  • GD 값들도 생략하겠습니다



  • 학습 6 회차까지의 표입니다
  • 우리가 원하는 결과값은 (-1, 1, 1, -1) 이며, 이에 근접해가는지 확인해봅시다
    • 실제로 A=-1, B=-1 인 경우에 대해, 양수에서 음수로 변한 것을 볼 수 있습니다
    • A=-1, B=1 인 경우에 대해, 음수에서 양수로 변한 것을 볼 수 있습니다



  • 표는 학습 1800 회와 2000 회에 대한 결과입니다
    • 우리가 원하는 값과 매우 근접함을 알 수 있습니다
  • 하단은 2000 회 실시 후의 가중치값들입니다



  • 결과적으로 얻게 된 모델을 그래프로 시각화해봅니다
    • 선형이 아닌 비선형의 곡면이 나왔네요
    • x=-1, y=-1 과 x=1, y=1 의 경우에 z축상으로 음수값을 얻으며
    • 그 외 범위에서 z축상으로 양수값을 얻는 것을 볼 수 있습니다
  • AND 논리게이트 문제와는 다르게, 비선형 구분이 필요한 문제입니다
    • 즉, 분류해야할 데이터가 3 가지 종류였다는 것입니다 (3 개의 구역)
    • 종류 개수가 많은 경우의 분류문제는 이처럼 연산량이 많이 필요하고 복잡도도 높습니다
  • 여기까지가 퍼셉트론의 내용입니다

이후 내용은 (4/5) 에서 이어집니다
감사합니다


'Computer Science > Artificial Intelligence' 카테고리의 다른 글

Introduction to A.I. (5/5)  (0) 2018.11.01
Introduction to A.I. (4/5)  (0) 2018.10.26
Introduction to A.I. (2/5)  (0) 2018.10.13
Introduction to A.I. (1/5)  (0) 2018.10.07
Summary of Reinforcement Learning  (0) 2018.08.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함