ABOUT ME

-

Total
-
  • 자바스크립트로 간단한 신경망(Neural Network) 만들기 Synaptic.js
    컴퓨터/HTML & JS & TS 2017. 8. 26. 21:36
    728x90
    반응형

     

     

    Medium freecodecamp의 Per Harald Borgen의 글을 바탕으로 합니다.

    (링크: How to create a Neural Network in JavaScript in only 30 lines of code)

     

     

    ※ 필요한 것 (클릭 시 링크)

    Synaptic.js (The javascript architecture-free neural network library for node.js and the browser)

    Node.js

     

    자바스크립트로 만들어 볼 간단한 신경망은 XOR 식을 푸는 신경망입니다.

    예를 들어, (0, 1), (1,0) 을 입력하면 1, 나머지 (0, 0), (1, 1)을 입력하면 0

     

    먼저, 아래 그림은 시그모이드(sigmoid) 뉴런을 표현합니다. (앞으로 만들 네트워크는 시그모이드 뉴런 이용 ReLU를 쓰고 싶지만)

    (입력 받은 모든 값을 0과 1 사이 값으로 squash)

     

     

    (입력 = 5, 출력 = 1, 화살표 = 시냅스, 갈색 -2 = bias, .파랑 7, 3 = weights

    왜 5가 되냐면 두 개의 입력 0, 1을 자신의 weights와 곱해서 bias(-2)와 더하기 때문)

    1 * 7 + 0 * 3 + (-2) = 5

     

    코드

     

    첫 번째로 해야 할 일은 레이어(layer)를 만드는 작업입니다. 이것은 synaptic.js를 이용하면 new Layer()로 만들 수 있습니다.

    이 함수에 입력하는 수는 각 레이어가 얼만큼의 뉴런을 가질 지를 결정합니다.

     

    먼저 synaptic.js를 사용할 준비를 하고

    // init
    var synaptic = require('synaptic');
    var Neuron = synaptic.Neuron,
    	Layer = synaptic.Layer,
    	Network = synaptic.Network,
    	Trainer = synaptic.Trainer,
    	Architect = synaptic.Architect;

     

    아래와 같이 레이어를 만들어 줍니다. (입력 뉴런 2개, 히든 뉴런 3개, 결과 뉴런 1개)

    // layers
    var inputLayer = new Layer(2);
    var hiddenLayer = new Layer(3);
    var outputLayer = new Layer(1);

     

    그 다음, 이 레이어들을 연결하고 새 네트워크를 instantiate 하는 방법은 아래와 같습니다.

    inputLayer.project(hiddenLayer);
    hiddenLayer.project(outputLayer);
    
    var myNetwork = new Network({
    	input: inputLayer,
    	hidden: [hiddenLayer],
    	output: outputLayer
    });

     

    이제 아래와 같은 코드로 네트워크를 2만 번 훈련 시킬 수 있습니다.

    // train the network - learn XOR
    var learningRate = 0.001;
    for (var epoch = 0; epoch < 20000; epoch++) {
      // 0,0 => 0
      myNetwork.activate([0,0]);
      myNetwork.propagate(learningRate, [0]);
      // 0,1 => 1
      myNetwork.activate([0,1]);
      myNetwork.propagate(learningRate, [1]);
      // 1,0 => 1
      myNetwork.activate([1,0]);
      myNetwork.propagate(learningRate, [1]);
      // 1,1 => 0
      myNetwork.activate([1,1]);
      myNetwork.propagate(learningRate, [0]);
    }

     

    activate 함수는 forward propagation, 즉 값을 네트워크에 보내 활성화 시킵니다.

    forward propagation을 할 때마다 weight와 bias를 업데이트해야 하는 데 즉, backpropagation을 해줍니다.

     

    backpropagationpropagate 함수를 이용합니다.

    사용 방법은 learningRate(매 번 얼만큼 weight를 조정 해야 하는 지)와 [0]과 [1] 처럼

    입력 받은 값의 올바른 결과를 알려줍니다. (예를 들어 [0,1] = [1])

     

    이제 테스트 해보는 방법은 아래와 같습니다.

    console.log(myNetwork.activate([1,1]));

     

    위 코드를 입력하면 약 0에 가까운 수가 나오고 [0,1]을 보내면 약 1에 가까운 수가 나옵니다.

     

    첨부 파일은 코드입니다. 실행은 node *.js 로 하세요.

    XOR_equation.js
    다운로드

     

     

     

     

     

    728x90

    댓글