그냥 개발자 블로그

[인공지능] 자바스크립트로 머신러닝 학습하기 - 역방향 본문

프로그래밍팁/javascript

[인공지능] 자바스크립트로 머신러닝 학습하기 - 역방향

마음이파파 2017. 8. 3. 08:30

x:입력, y:출력, w:가중치, b:바이어스


인공지능의 구성요소인 뉴런은 정방향과 역방향 이 합쳐져 만들어 집니다. 이전 시간에 2017/08/01 - [LAB] - [인공지능] 자바스크립트로 머신러닝 학습하기 - 정방향 를 통해서 정방향을 개발했다면 이제는 학습 능력을 부여하기 위한 역방향을 개발해야할 차례 입니다. 인공지능에 대한 기본 원리가 궁금하시다면 2017/07/31 - [LAB] - [인공지능] 자바스크립트로 머신러닝 학습하기 - 원리 를 먼저 보고 와주세요.



역방향은 정방향에서 만들어진 결과를 바탕으로 만들어진 오류(시행착오)를 점진적으로 수정해가는 동작을 수행 합니다.



<script>

function _print(txt){

    document.write(txt+'<br>');

}


function ai(){

    this.w = 0; //가중치

    this.b = 0; //바이어스

    this.input = 0;

    this.output = 0;

    this.forward = function(x){


this.input = x;


        y = x * this.w + this.b;


this. output = y;

        

        return y;

    };

}


</script>

 

우선 입력된 값과 출력된 값을 가지고 계산을 해야 함으로 이 둘을 저장 할수 있는 변수와 코드를 추가해줬습니다.




<script>

function _print(txt){

    document.write(txt+'<br>');

}


function ai(){

    this.w = 0; //가중치

    this.b = 0; //바이어스

    this.input = 0;

    this.output = 0;

    this.forward = function(x){


this.input = x;


        y = x * this.w + this.b;


       this.output = y;

        

        return y;

    };

    this.backward = function(target){


        grad = (target - this. output) * this.grad(this.output); //기울기


        this.w += grad * this.input;

        this.b += grad * 1.0;

        

    };


}


</script>


그리고 backward 라는 함수를 만들어 줬습니다. target은 원하는 목표 값(정답)을 뜻합니다. 언뜻 보면 어떤 계산을 한 후 w(가중치)와 b(바이어스)를 수정해준다는것을 인식하실 수 있으실 겁니다. 


그런데 중간에 grad(기울기)라는 낯선 존재가 보일 겁니다. grad는 기울기를 뜻하는데 여기서 기울기란 forward를 통해서 구한 결과와 출력된 y의 관계를 의미 합니다. 좀 더 자세히 설명 드리면 w(가중치)나 b(바이어스)값을 수정하여 오류인 (target - this.y)가 줄어 들수 있는 값을 말 합니다.

더 자세한 내용이 궁금하시다면 Gradient Descendent Method for AI 로 구글에서 검색해보시면 되겠습니다.



 

<script>

function _print(txt){

    document.write(txt+'<br>');

}


function ai(){

    this.w = 0; //가중치

    this.b = 0; //바이어스

    this.input = 0;

    this.output = 0;

    this.forward = function(x){


this.input = x;


        y = x * this.w + this.b;


       this.output = y;

        

        return y;

    };

    this.backward = function(target){


        grad = (target - this.output) * this.grad(this.output); //기울기


        this.w += grad * this.input;

        this.b += grad * 1.0;

        

    };

    this.grad = function(y){

        return 1.0;

    };

}


</script>

 

grad 함수를 추가해줬습니다. 이 부분은 오류를 줄일 수 있는 여러 기법이 들어가는 함수입니다. 어떤 문제인지 어떤 결과가 필요한지에 따라서 다양하게 변할 수 있으며, 인공지능 성능에도 영향을 미치게 됩니다. 하지만 우리는 forward의 결과를 y로 미분하기 때문에 1.0으로 고정하였습니다. (1을 1로 미분하는 결과 임으로 1 )



이제 학습률을 추가해줘야 합니다.



<script>

function _print(txt){

    document.write(txt+'<br>');

}


function ai(){

    this.w = 0; //가중치

    this.b = 0; //바이어스

    this.input = 0;

    this.output = 0;

    this.a = 0.1; //학습률

    this.forward = function(x){


this.input = x;


        y = x * this.w + this.b;


       this.output = y;

        

        return y;

    };

    this.backward = function(target){


        grad = (target - this.output) * this.grad(this.output); //기울기


        this.w += this.a * grad * this.input;

        this.b += this.a * grad * 1.0;

        

    };

    this.grad = function(y){

        return 1.0;

    };

}


</script>

 

학습률의 경우는 추후에 값을 바꿔 주면서 결과를 확인해보시는 것이 이해 하는데 도움이 됩니다.



이제 실제로 인공지능이 학습을 하는지 테스트를 해보겠습니다. 문제는 "1킬로미터를 0.62마일로 바꾸려면 어떻게 해야 할까?" 로 했습니다.



ai = new ai;

ai.w = 2.0;

ai.b = 1.0;



for(i=0; i<100; i++){

    _print(ai.forward(1.0)); 

    ai.backward(0.62); //훈련

    _print("w:"+ai.w+" , b:"+ai.b);

    _print("======================");

}

 

w와 b는 2.0과 1.0을 임의로 주었습니다. 실제 인공지능에서는 랜덤한 숫자가 들어감으로 어떠한 수가 들어가도 무관 합니다. 위 코드는 100번을 계산하고 오차에 대해서 훈련하고를 반복하게 됩니다. 더불어 w(가중치)와 b(바이버스)가 변하는 모습도 볼수 있도록 해줬습니다.


결과가 나왔습니다.




처음에는 3을 출력했지만 w와 b를 인공지능이 스스로 변경해가며 2.5, 2.1, 1.8 ..... 이런 식으로 점점 답에 근접하게 변하는것을 볼 수 있습니다.







대략 30번쯤 훈련이 되었을 때는 0.62 라는 정답에 가까운 값을 내놓기 시작 합니다.






마지막 100번째 훈련을 마쳤습니다. 0.62에 더욱 근접한 결과를 보여주고 있는 것을 볼 수 있습니다. 훈련의 횟수가 많아질수록 더 0.62에 가까운 값을 보여 줄것 입니다.





이제 우리는 "1킬로미터를 0.62마일로 바꾸려면 어떻게 해야 할까?" 의 문제를 넘어서서  "14킬로미터는 몇 마일일까?" 라는 문제도 풀수 있습니다. w(가중치)와 b(바이어스)를 알기 때문에 x, w, b를 대입하여 어떤 y가 나올지 알수 있기 때문 입니다. 


y = 14 * 0.8100000002424073 + -0.18999999975759277 



그러나 실제로 계산해보면 8.69가 아닌 11.15가 나옵니다. 입력값이 바뀌었을때 오차가 발생하는 이유는 1과 0.62 관계 하나만 가지고 학습을 시켰기 때문 입니다. 만약 무수히 많은 데이터를 여러번 반복해서 학습 시킨다면 오차범위는 점점 줄어들게 됩니다. 인공지능 기업들은 "오차를 어떻게 더욱 빨리 정확하게 없앨까?"를 가지고 연구하는 것 입니다.






마치며...


인공지능 기술은 분명 수학과 함께하기 때문에 어렵습니다. 실제로 인공지능의 원천기술을 개발할때 수학자가 참여 합니다. 하지만 기술의 발전이 거듭되고 사용하기 편하도록 라이브러리로 만들어지면서 우리가 접근할수 있는 기술의 장벽은 그만큼 낮아 졌습니다. 어쩌면 이 장벽이 더욱 낮아져 남녀노소가 사용할 수 있도록 변할수도 있습니다. 그래도 우리가 적절히 사용하려면 어렴풋이라도 동작의 원리나 기초 지식은 알고 있어야 한다고 생각하며, 미래를 맞이하는 올바른 방법이라고 생각합니다.



부족한 지식으로 작성한 글을 여기까지 읽어주신 모든 분들께 감사드립니다. 끝.






copyright ⓒ 2017. 워크식스