BLOG main image
FunnyPR (32)
OpenGL (20)
PatternRecognition (7)
Tips (2)
XML (1)
DataMining (1)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2014. 4. 23. 17:24

 The Basic Artificial Neuron: Bias neuron(Backpropagation)


역전파 알고리즘 - 바이어스 노드 


역전파 알고리즘은 각 뉴런의 출력 신호를 결정하기 위해서 입력(입력 신호와 연결 무게를 곱하고 나서 모두 합한값)에 활성화 함수(Activation Function)를 적용한다. 

- 활성화 함수의 임계값 변동을 흡수하기 위한 가중치를 바이어스(편견)이라고 하며, 항상 1의 값을 가진다. 



여러 활성화 함수 그림이다. 


여기서 질문이 생긴다. 활성화 함수의 임계값 변동을 흡수(?-책에서 이렇게 씀)하기 위한 가중치 바이어스 노드를 항상 1로 설정한다라고 되어 있는데 왜 1인가 그리고 구체적인 이유가 무엇인가?


우선 구글링 한 정보를 정리하면 다음과 같다. 


http://stackoverflow.com/questions/2480650/role-of-bias-in-neural-networks

http://stackoverflow.com/questions/8039313/why-is-a-bias-neuron-necessary-for-a-backpropagating-neural-network-that-recogni



답변에 보면 바이어스 값(bias value)는 성공적인 학습을 위해 활성화 함수를 좌우로 움직일 수 있게 해준다라고 한다. 단순한 예제를 보면 다음과 같다. 


Case 1 : 바이어스 없이 하나의 입력과 출력의 구성

simple network

출력은 입력 x와 가중치 w0의 곱을 활성화 함수에 넣어 계산할 수 있다. 

network output, given different w0 weights

위 그림은 활성화 함수를 sigmoid로 하고 가중치 w0의 값이 0.5, 1.0, 2.0으로 변화 할때 입력과 출력에 관한 결과 그래프 이다. 위 그래프에서 보면 가중치 값이 변화함에 따라 sigmoid 의 가파름(steepness) 정도가 변화는 것을 확인할 수 있다. 이 결과는 유용하지만 만약 입력이 2개이고 출력이 하나인 네트워크를 구성할때 변화하는 시그모이드 함수의 steepness는 동작하지 않는다고 한다. (먼 예기야?)


위 커브들을 오른쪽으로 모두 옴기길 원하면 바이어스를 사용해야 한다.


다음 case를 보고 차이점을 보자 

Case2: Case1 + Bias Neuron

simple network with a bias

그림에 보면 입력층에 Bias Neuron을 추가된 것을 확인할 수 있다. 그럼 출력은 sig(w0*x+w1*1.0)으로 계산될 수 있다. 아래 그림은 w1의 변화에 따른 네트워크 출력에 대한 그래프이다. (w0 = 1.0)

network output, given different w1 weights

그림에 보면 바이어스 뉴런을 하나 추가하여 가중치 w1의 변화에 따라 출력이 좌우로 움직이(shift)되는 것을 확인할 수 있다. 아하!!!(센스 있는 사람은 눈치 챘을 것이다.) 


@user1621769: The main function of a bias is to provide every node with a trainable constant value (in addition to the normal inputs that the node recieves). You can achieve that with a single bias node with connections to N nodes, or with N bias nodes each with a single connection; the result should be the same. –  Nate Kohl Mar 24 '13 at 13:24


위 빨간색을 보면 중요한 얘기를 하고 있다. 

바이어스의 중요한 기능은 훈련 가능한 상수 값을 가지는 모든 노드를 제공하는 것이다. 

즉 바이어스 노드 없이 훈련 가능한 것들도 있지만 아마 다른 경우에 sigmoid 임계 범위에 있지 않은 값들의 출력은 의미가 없어져 훈련이 되지 않을 수도 있다.

http://www.nnwj.de/backpropagation.html

위 사이트에서 보면 보다 이해하기 쉬울 것이다. 

http://www.mathworks.co.kr/kr/help/nnet/ug/perceptron-neural-networks.html

여기 사이트에서도 bias 의 역할을 설명하고 있다. 바이어스의 또 다른 역할은 기본 영역에서 항상 시프트하여 경계를 결정하게 해 줌 아래와 같이 점선에서 실선으로 바이어스를 적용하여 경계를 옴김



그럼 실제 뉴럴 계층에 bias neuron을 어떻게 적용시켜야 하나 문제다. 다음 그림을 보자.


http://ufldl.stanford.edu/wiki/index.php/Neural_Networks


Network331.png


왼쪽 부터 입력 레이어(L1), 히든 레이어(L2), 출력 레이어(L3)로 나타난다. 보면 bias neuron이 입력과 히든레이어에 존재한다. 

바이어스 뉴런은 다음 계층에 연결되지만 이전 계층에는 연결되지 않는 특징을 가진다. 


입력층: 입력 노드(d) + 바이어스 노드(1)

은닉층: 은닉 노드(p) + 바이어스 노드(1)

  은닉층의 노드 개수를 p라고 할때 하나의 바이어스 노드를 더해 은닉층의 총 노드 개수는 p+1개가 된다. 

출력층: 원하는 출력 노드 수(m)


그럼 입력층과 은닉층 사이 가중치는 몇개?

입력층: d+1

은닉층: p

입력층과 은닉층의 가중치: (d+1)*p 개


그럼 은닉층과 출력층의 가중치는 몇개?

은닉층: p+1

출력층: m

은닉층과 출력층의 가중치: (p+1)*m 




위 그림은 Basic Structure of an artificial neuron 그림이다. 맘에 들어서 가져 왔다. 자세한 설명은 

http://engineeronadisk.com/book_modeling/neural.html

에 있다.