머신러닝

본문 바로가기

사이트 내 전체검색


3. neural network의 기초(1)

페이지 정보

작성자 관리자 댓글 0건 조회 2,260회 작성일 20-03-07 22:35

본문

다음과 같은 데이터셋이 주어졌고 우리는 어떠한 함수를 만들어서 데이터셋을 분류를 해야하는 작업을 한다고 치자



1.PNG


사람이 봤을때는 직관적으로 서로 다른 점 사이에 선을 긋기만 하면 된다
그렇다면 어떠한 선을 그어야 하는 문제인데 이는 다음과 같이 y = x+1 이라는 직선을 놓으면 해결된다



2.PNG


그렇다면 여기서는 분류를 해주는 함수는 f(x) = x +1 이 된다는것을 알 수 있다.
이러한 분류기(함수 f(x))에 (2,8)이라는 데이터가 들어오게 되면 어떻게 분류를 할 수 있을까?



3.PNG


우선 여기서는 분류를 할 수 있는 대상이 2가지이기 때문에 0과 1로 분류를 해보자


class C = {0,1}


0은 직선 아래에 있는 데이터들, 1은 직선 위에 있는 데이터들이라고 정의하면 (2,8)은 실제 값이 1이며 여기서는 x1을 x값인 2, x2를 y값인 8으로 칭한다


분류를 해주는 함수 f(x)에 넣었을때 1이라고 분류를 해줘야 한다.


그러기 위해서는 함수를 조금 수정해야하는데 다음과 같이 수정하면 분류가 가능하다
데이터 (x1,x2) 에 대하여 분류기인 직선의 방정식 y=ax+b 는 함수 f(x)에서 다음과 같이 정의하면 0과 1을 분류 할 수 있다



4.PNG


그럼 데이터 (2,8) 에 대한 분류를 해보면 위의 함수 f(x)에서 위의 그림에 그려져있는 직선의 방정식 y=x+1을 적용시키면 


5.PNG

으로 식을 실제 분류가 가능한 함수로 바꿀 수 있다.
그렇다면 데이터 (2,8)에 대한 분류를 해보면 2 + 1 < 8 이므로 데이터 (2,8)은 1으로 분류가 가능하다




퍼셉트론 구조, 연산과정

 


퍼셉트론은 동물의 신경계를 본따 만든 신경망의 기초중에 기초이다.
퍼셉트론은 다수의 신호들 1, x1, x2 .... xn 을 입력받아서 결과 Out을 출력한다.
여기서 어떤 신호가 들어오든 1을 x0라고 가정하고 w0는 곱한다는것을 규칙으로하고 퍼셉트론의 연산과정을 살펴보자



6.PNG



우리가 흔히 볼 수 있는 신경망의 기초라고 하는 퍼셉트론은 다음과 같은 연산을한다.


x0*w1 + x1*w1 + x2 * w2 ..... xn * wn -> Activation function f(sum) -> result


위에 그려진 그림을 수식을 통한 과정으로 표현하면 이렇게 표현 할 수 있다.


모든 x와 w값들을 곱하고 더한 뒤 Step function이라고 하는 Activation function을 통해서 임의로 정해진 값을 넘으면 1을 출력하고 넘지 못하면 0을 출력하는 과정을 거친다


이와 같은 연산과정은 처음에 본 직선의 방정식 분류와 비슷한점이 많은데 글에서 정의한 f(x)를 다시 보자



7.PNG


우리가 데이터에 대한 1과 0을 분류하기 위해 정의한 함수 f(x)는 데이터 (x1,x2)를 입력 받아서 직선의 방정식에 대입한 결과가 데이터의 x2보다 작으면 1, 크면 0을 뱉는 함수이다.


그렇다면 함수 f(x)를 이항을 하여 다음과 같이 재정의 해보자



8.PNG


아까와 같은 함수이며 여기에 c를 곱하면 


9.PNG


같은 함수이지만 모양이 달라진다.


그럼 여기서 모양을 다시한번 바꾸면 퍼셉트론의 동작 과정과 똑같아 지게 된다.


ac = w1, bc = w0 , -c = w2 로 바꾸게 되면


10.PNG


위처럼 퍼셉트론의 연산과정과 같은 식이 유도된다.
물론 퍼셉트론은 x1이 n개의 수까지 늘어날 수 있지만 x의 수가 이렇게 2개 뿐이면 그래프를 통해 쉽게 이해가 가능하다


자, 그렇다면 처음으로 돌아가 원래 알고있었던 직선의 방정식 y = x + 1이 없었을때는 어떻게 해야할까?


주어진 데이터셋만으로 우리가 직접 적절한 직선의 방정식을 그려야한다.


적절한 직선을 긋기 위한 직선의 방정식을 ax + by + c = 0 이라고 본다면 어떤 값들을 수정해야 할까?


x와 y는 새로운 데이터가 주어졌을때 대입을 하여 분류를 하여야 하는 값이므로 (x = x1, y = x2) 우리가 조정하는 값이 아니다.


그러므로 우리는 적절한 a와 b, c 를 찾아야지 데이터를 잘 분류하는 직선을 그을 수 있는것이다.


위의 전개되는 식을 보면  by = ax + c ----> ax + by + c ----> w1x + w2x2 + w0 와 같이 식이 바뀌었다고 생각하면 쉽게 우리가 w0, w1, w2 값을 수정해야 한다는 것을 알 수 있다.


그렇다면 어떻게 W를 수정하면 좋을까?



11.PNG

W를 수정하는 과정을 식으로 나타내보자


초기의 W값은 설계한 사람의 의도에 의해 0이라고 정의해보자
Wt = 기존의 값, Wt+1 = 수정된 값 이라고 보면 다음과 같다


12.PNG

그렇다면 이 ???를 어떻게 구해야 하는지 생각해보자


생각을 해보면 우리가 W를 어떤식으로 변환시키던지 나올 수 있는 값이 있다.
모든 데이터 셋을 미리 정해놓은 W값에 대입해보고 결과 값이 맞는지 틀린지를 알 수 있다.


그럼 모든 데이터셋에 관하여 틀린 값들을 모두 더하여 숫자로 나타내주는 함수 L을 정의해보자


그 전에 데이터셋 D와 weight 등을 재정의해보면


13.PNG


14.PNG


15.PNG

결과값이 Y는 결국 classification 문제이므로 0번째 class , 1번째 클래스, C번째 클래스이다.   물론 여기서는 0과 1 두개만 존재


16.PNG

우리가 구해야 할 값 W는  벡터이면서 Xi의 속성인 D의 수와 같다


17.PNG


18.PNG


19.PNG


함수 L의 경우에는 오차를 구하는 함수라고 생각하면 쉽다.  


현재 W값을 통한 Xi 에 관한 예측값인, 함수 f를 실제값 Y를 빼고 나면 0이나 1, -1 이 반환될것이다.


하지만 우리는 1과 -1이 같이 반환되면 데이터셋 전체를 시그마한 의미가 없어지므로 모든 값은 절대값으로 반환되어 수치가 계산된다.


여기서 주어진 문제가 뭔지 명확하게 정의를 해야 답을 찾을 수 있다


문제를 정의해보면 "L 함수 값인 오차를 0에 가까워질 수 있게 (0이 되면 좋고) W의 값을 찾기" 라고 정의할 수 있겠다


그렇다면 가장 적절한 W값을 찾게 해주는 함수를 정의하고 단순히 코드를 작성해 컴퓨터에게 시키기만 하면 되는 문제이다.


그러기 위해서는 함수 L의 반환값이 증감에 따라서 W값을 줄일지 키울지 정하면 된다.


자 그럼 좌표평면 위에 w1x1 + w2x2 + w0 = 0 (ax+by+c = 0) 이라는 직선을 그려보자


y=0 으로 x축 바닥에 붙어있는 직선이 생기고 데이터를 분류할 수 있는 구간이 위에있어서 위로 조금씩 움직인다고 생각해보자.


20.PNG


그래서 다음과같이 조금 움직였다


사실상 육안으로 보이게 그린거지만 실제로 L의 값이 줄어드는 W의 방향을 찾으려면 엄청나게 많은 반복 횟수를 거쳐가며 각 W의 음,양의 방향을 찾으면서 거의 무한대의 변화를 주어야 한다.


그래도 선을 위아래로 움직이고, 좋은 성능의 CPU면 찾을 법도 한데, Xi의 속성이 10개, 20개, 30개로 늘어나게되면 2차원 평면 그래프에 표현도 안될뿐더러 그만큼 계산의 양은 무한대로 증가하게되어 사실상 불가능한 연산이 되어간다


그렇다면 어디서 주워들은 Gradient Descent로 해결을 해보는건 어떨까 


W의 값에 따른 함수 L의 변화 그래프를 그려서 기울기를 구하면 최저점을 찾을 수 있지 않을까?


그래프를 그려보자 



21.PNG


그려보면... 기울기는 0과 1만 존재할 뿐이다.


이렇게되면 기울기를 통해 줄어드는 방향을 알 수 없다.


|f(x;w)-Y| 는 0과 1일 뿐이고 이를 더 해봤자 계속해서 1을 더하거나 빼는 계단함수를 만들어낼 뿐이다.


어떻게 하면 그래프를 곡선으로 만들어서 기울기를 구하는 Gradient Descent를 할 수 있을까?


답은 함수 0과 1만 뱉은 함수 f를 수정하는 것이다.


현재 함수 f는 계단 함수라고 불리운다.

 

22.PNG




이 전에 정의했던 함수 f를 그려보면 0을 넘으면 1을 반환하고 0을 넘지 못하면 0을 반환한다.


문제점은 0과 1만 출력하는 비연속적인 함수라는 것이고, 이 때문에 gradient를 구하여 최저점을 찾을 수 없다.


그렇다면 여기 새로운 Activation function인 Sigmoid function이 해결책이다.


23.PNG


우리가 처음에 정의했던 step function과 흡사하지만 연속적인 값을 반환하고, 1과 0 사이의 값만 반환한다.


이 sigmoid function에서 가장 높은값은 1에 수렴하는 값이며, 가장 작은 값은 0에 수렴하는 값이다.


함수 f 를 이러한 연속함수로 변환하면 당연히 W에 관한 함수 L의 그래프는 어떤모양인지는 몰라도 곡선이 형성되어 기울기를 구하여 최저점을 찾을 수 있다. 


24.PNG


다음과 같이 그래프가 변화할 것이고 이제 기울기 값만 구하면 된다.


그렇다면 수식을 만들어보자 d 번째 W는 다음과 같은 새로운 Wd+1로 수정한다  


25.PNG

댓글목록

등록된 댓글이 없습니다.



개인정보취급방침 서비스이용약관
Copyright © www.leelab.co.kr All rights reserved.
상단으로
TEL. 063-469-4551 FAX. 063-469-4560
전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과
PC 버전으로 보기