-
자바스크립트로 간단한 신경망(Neural Network) 만들기 Synaptic.js컴퓨터/HTML & JS & TS 2017. 8. 26. 21:36728x90반응형
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)
자바스크립트로 만들어 볼 간단한 신경망은 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을 해줍니다.
이 backpropagation은 propagate 함수를 이용합니다.
사용 방법은 learningRate(매 번 얼만큼 weight를 조정 해야 하는 지)와 [0]과 [1] 처럼
입력 받은 값의 올바른 결과를 알려줍니다. (예를 들어 [0,1] = [1])
이제 테스트 해보는 방법은 아래와 같습니다.
console.log(myNetwork.activate([1,1]));
위 코드를 입력하면 약 0에 가까운 수가 나오고 [0,1]을 보내면 약 1에 가까운 수가 나옵니다.
첨부 파일은 코드입니다. 실행은 node *.js 로 하세요.
728x90'컴퓨터 > HTML & JS & TS' 카테고리의 다른 글
소스 하이라이터 (syntaxhighlighter, highlight.js) (0) 2018.02.19 CSS 3D glitch 글씨 효과 (shadow) (0) 2017.06.28 HTML 자바스크립트 키 조작 (0) 2017.06.28