[단단한 머신러닝] 5장 신경망

환공지능·2022년 3월 24일
0

5장 신경망

5.1 뉴런 모델

💡 신경망이란?
"적응성이 있는 단순 단위로 구성된 광범위하고 서로 연결된 네트워크다. 이 조직은 현실 세계 사물에 대한 생물 신경계통의 상호작용을 모방할 수 있다.[Kohonen, 1988]"

신경망에서 가장 기초가 되는 성분은 뉴런(Neuron) 모델입니다. 위 정의에서 언급한 '단순 단위'가 뉴런이며 생물 신경망에서 각 뉴런은 기타 뉴런과 서로 연결되어 있습니다. 만약 뉴런이 흥분한다면 연결된 뉴런으로 화학 물질을 전송하며 이렇게 뉴런 내의 전압을 바꾸게 됩니다. 만약 어떤 뉴런의 전압이 임계값(Threshold)를 넘으면 해당 뉴런이 활성화됩니다.

뉴런의 입력 신호는 가중치를 가진 연결을 거쳐 전달됩니다. 뉴런이 받은 총 입력값은 뉴런의 임계값과 비교하고, 활성화함수를 통해 뉴런의 출력을 처리합니다.

🦠 생물학적 뉴런 -> 인공적으로 모델화
1. 뉴런을 여러 계층(Layer)에 걸쳐 위치시킵니다.

  • 각각의 인공 뉴런은 노드라고 부른다.
  • 계층이 많아질수록 신경망은 깊어지게 됩니다.
  • 각 노드는 직전 계층과 직후 계츠에 존재하는 다른 모든 노드와 연결되어 있습니다.
    2. 각각의 연결에 적용할 가중치(Weight)를 함께 표기합니다.
    3. 노드 내에서 입력 값에 가중치를 곱하고 편향(Bias)을 더한 후 활성화함수를 거쳐 결과 값을 만드는 것
    4. 이후, 가중치와 편향의 값을 변경해가면서 적절한 값을 찾아내는 최적화 과정을 학습 또는 훈련이라 합니다.

활성화 함수(Activation Function)


앞서 말했듯이 뉴런은 상호 연결되어 있습니다. 이들은 전기 입력을 받아 또 다른 전기 신호를 발생시킵니다. 그러나 입력을 받았을 때 즉시 반응하는 것이 아니라 입력 값이 임계값(Threshold)에 도달해야 출력을 발생합니다.

아래와 같은 수식으로 나타낼 수 있습니다.

y=f(i=1nwixiθ)y = f(\sum_{i=1}^{n}w_ix_i - \theta)

수식에서 ff 함수는 뉴런에서 활성화 함수(Activation Function)이라고 부릅니다. 활성화 함수는 입력 신호를 받아 임계값을 넘어서는 경우에 출력 신호를 생성해주는 함수입니다. 활성화 함수에 종류는 다양하나 그 중 가장 일반적인 활성화 함수로는 계단 함수, 시그모이드 함수, 부호 함수가 있습니다.

  • 계단(Step), 부호(Sign) 함수는 Hard Limit Function이라고 하며, 분류와 패턴인식 작업에서 결정을 내리는 뉴런에 주로 쓰입니다.
  • 시그모이드(Sigmoid) 함수는 양과 음의 무한대 사이에 있는 입력값을 0과 1 사이에 있는 실수 값으로 바꿉니다. 주로 역전파 신경망에 쓰입니다.
  • 선형(Linear) 함수는 뉴런의 입력에 가중치가 적용된 것과 같은 값을 출력으로 내놓습니다. 선형 근사에 주로 쓰입니다.

5.2 퍼셉트론과 다층 네트워크

퍼셉트론(Perceptron)은 다수의 신호를 입력으로 받아 하나의 신호를 출력합니다. 쉽게 말하면 입출력을 갖춘 알고리즘이며 입력을 주면 정해진 규칙에 따른 값을 출력하는 것입니다.

일반적으로 훈련 데이터 세트를 정한 상태에서 가중치 wi(i=1,2,...,n)w_i(i=1,2,...,n)와 임계값 θ\theta는 학습을 통해 얻습니다. 입계값 θ\theta는 하나의 입력이 -0.1로 고정된 더미 노드가 대응하는 연결 가중치 wn+1w_{n+1}이라고도 볼 수 있습니다. 이렇게 하면 가중치와 임계값의 학습은 하나의 가중치 학습으로 통일할 수 있습니다.

퍼셉트론의 학습 규칙은 매우 간단합니다. 훈련 샘플 (x,y)(x,y)에 대해 만약 퍼셉트론의 출력이 y^\hat y라면 퍼셉트론의 가중치는 다음과 같이 조정합니다.

wiwi+Δwi,w_i \leftarrow w_i + \Delta w_i,
Δwi=α(yy^)xi,\Delta w_i = \alpha(y-\hat y)x_i,

여기서 α\alpha는 학습률입니다. 위의 식에서 알 수 있는 것은 만약 퍼셉트론이 훈련 샘플에 대해 정확히 예측했다면, 즉 y=y^y=\hat y라면 퍼셉트론에는 아무런 변화가 일어나지 않습니다. 그러나 그렇지 않은 경우 틀린 정도에 따라 가중치를 조절합니다.

💡 학습률(Learning Rate)이란?
임의의 수로 시작하여 '오차'를 통해 기울기를 변화시키는 과정입니다. 그러나 오차만을 기준으로 업데이트한다면 최종적으로는 그저 마지막 학습 데이터에 맞춰진 업데이트 결과만을 얻게 될 것입니다. 이를 해결하기 위해 업데이트의 정도를 조금씩 조정할 수 있게 해주는 '학습률(Learning Rate)'의 개념이 나오게 됩니다. 바로 새로운 가중치로 점프하는 것이 아니라 일부씩만 업데이트 하는 것입니다. 즉 기존 여러번의 학습에 기초해 업데이트된 값을 유지하면서, 학습 데이터가 제시하는 방향으로 조금씩만 움직이는 것입니다.

5.3 오차 역전파(Back Propagation) 알고리즘

역전파 알고리즘은 Input과 Output을 알고 있는 상태에서 신경망을 학습시키는 방법입니다. 역전파 알고리즘을 적용하기 이전에 MLP에 대해 다음과 같이 정의합니다.

  • 초기 가중치 값은 랜덤으로 주어짐
  • 각각의 노드는 하나의 퍼셉트론으로 생각함. 즉 노드를 지나칠 때마다 활성 함수를 적용하며, 활성화 함수를 적용하기 이전을 net, 이후를 out이라 함.
  • 다음 레이어의 계산에는 out값을 사용하며, 마지막 out이 output이 됨.
  • 활성화 함수로 시그모이드 함수를 사용함.

우리가 결과값으로 얻기를 바라는 값을 Target, 실제로 얻은 결과값을 Output이라하면 오차 EE는 다음과 같습니다.

Etotal=Eo1+Eo2+...=12(targetoutput)2E_total = E_o1 + E_o2 + ... = \sum \frac{1}{2}(target - output)^2
=12(targeto1outputo1)2+12(targeto2outputo2)2+...= \frac{1}{2}(target_{o1} - output_{o1})^2 + \frac{1}{2}(target_{o2} - output_{o2})^2 + ...

(12\frac{1}{2}로 나누는 이유는 계산의 편의를 위해서임)

여기서 합의 의미는 모든 Output에서 발생한 오차를 모두 더해주는 것입니다. 최종 목적은 이 오차에 관한 함수 EE의 함수값을 0에 근사시키는 것이기에 오차가 0에 가까워진다면 신경망은 학습에 사용된 Input들과 그에 유사한 Input에 대해서 우리가 원하는 정답 Output 값을 산출할 것입니다.

각각 가중치가 2개일때 (w1,w2w_1, w_2), 오차 EE를 도식화하면 위와 같은데, y=0,w1=0,w2=0y=0, w_1 =0, w_2 = 0일 때 EE가 최소화됩니다.

따라서 오차 EE를 모든 가중치들에 대한 방정식으로 본다면, 우리가 해야할 것은 가중치 ww를 수정해 EE가 최소가 되도록 만드는 것이며, 이를 위해 경사하강법(Graident Descent)라는 최적화 알고리즘을 사용합니다. 그 기본 원리는 기울기가 낮은 쪽으로 연속적으로 이속시켜 값이 최소가 되는 점인 극값에 다다르게 하는 것이라고 볼 수 있습니다.

이를 위해 오차 EE를 미분하는 과정이 필요한데, 모든 가중치가 오차에 영향을 미치고 있으므로 EE를 각각의 가중치로 편미분해야 합니다. 다층 신경망은 각 계층이 연결되어 있어 Output에 가까운 미분 과정에서 사용되는 값이 Output에서 먼쪽의 미분과정에 사용됩니다. 따라서 Output과 가까운 쪽의 미분을 먼저 진행하게 되며 그렇기 때문에 Back Propagation이라고 불립니다.


알고리즘

알고리즘 자체는 굉장히 단순합니다. 크게 4단계로 이루어져 있는데 사실상 1 Epoch는 3번까지의 단계입니다. 한번의 Epoch으로는 오차가 많이 줄어들지 않으나 여러번 반복해서 실행하면 오차가 0에 가까워집니다.

🔎 알고리즘
1. 기존에 설정되어 있는 가중치를 사용해 net, out을 계산.(forward pass)
2. 전체 오차를 각 가중치로 편미분한 값을 기존의 가중치에서 빼줌.(오차를 줄이는 과정)
3. 모든 가중치에 대해 2를 실행함.(Output에 가까운 쪽에서부터 먼쪽으로)
4. 1-3을 학습 횟수(Epoch 수)만큼 반복


🔎 자세히 알아보면 아래와 같습니다.
1. 단순히 Input에 가주치를 곱한 값들을 더하고 활성화함수를 이용해 out을 만드는 과정을 반복합니다.
2-1. W5W_5를 기준으로 잡아보면, 전체 오차 EEW5W_5로 편미분한 값을 기존의 W5W_5에서 빼주면 1회 갱신이 완료된 것입니다.

W5(t+1)=W5(t)EtotalW5W_5(t+1) = W_5(t) - \frac{\partial E_total}{\partial W_5}

오차 EEW5W_5로 편미분하면 chain rule을 적용해 다음과 같이 풀어낼 수 있고 각각을 계산하는 방법은 다음과 같습니다.

EtotalW5=Etotalouto1outo1neto1neto1W5\frac{\partial E_total}{\partial W_5} = \frac{\partial E_total}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}}* \frac{\partial net_{o1}}{\partial W_5}

최종 Output인 o1o_1은 다른 오차에 영향을 미치지 않으므로, 오차 Eo1E_{o1}을 미분한 값이 (1)과 같아집니다.

(1)Etotalouto1=Eo1outo1=outo1targeto1(1) \frac{\partial E_total}{\partial out_{o1}} = \frac{\partial E_{o1}}{\partial out_{o1}} = out_{o1} - target_{o1}

out과 net의 관계는 활성화 함수이므로 이 경우에 시그모이드 함수를 미분한 것과 같은 값이 됩니다. 이때 f(x)=f(x)(1f(x))f'(x) = f(x)(1-f(x))라는 시그모이드 함수의 수학적인 특징을 사용합니다.

(2)outo1neto1=outo1(1outo1),  outo1=11+eneto1(2)\frac{\partial out_{o1}}{\partial net_{o1}} = out_{o1}(1-out_{o1}),~~ out_{o1} = \frac{1}{1+e^{-net_{o1}}}

net은 각각의 가중치와 이전 노드의 곱의 합으로 이루어져있으므로, (3)은 이전 노드의 out값이 됩니다.

neto1=outh1W5+outh2W7+...net_{o1} = out_{h1}W_5 + out_{h2}W_7+...
(3)neto1W5=outh1(3) \frac{\partial net_{o1}}{\partial W_5} = out_{h1}

특히, (1)과 (2)를 곱한 값은 노드 o1o_1의 delta값이라 하고 이후 과정에서 사용하므로, 알고리즘의 속도 향상을 위해 실제 코드에서는 이를 저장해 놓는 과정이 필요합니다.

δo1=(1)(2)=Etotalouto1outo1neto1=Etotalneto1\delta_{o1} = (1)*(2) = \frac{\partial E_total}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} = \frac{\partial E_total}{\partial net_{o1}}

따라서 최종적으로 W5W_5는 다음과 같이 갱신됩니다.

W5(t+1)=W5(t)Etotalouto1=W5(t)δo1outh1W_5(t+1) = W_5(t) - \frac{\partial E_total}{\partial out_{o1}} = W_5(t) - \delta_{o1}out_{h1}

이는 Hidden Layer와 Output Layer 사이에 존재하는 가중치 값들(W5,...,W8W_5,..., W_8)에 대해 모두 성립합니다. 따라서

W6(t+1)=W6(t)δo2outh1W_6(t+1) = W_6(t) - \delta_{o2}out_{h1}
W7(t+1)=W7(t)δo1outh2W_7(t+1) = W_7(t) - \delta_{o1}out_{h2}
W8(t+1)=W8(t)δo2outh2W_8(t+1) = W_8(t) - \delta_{o2}out_{h2}

2-2. 다음으로 W1W_1을 기준으로 잡으면, 다음과 같은 형태로 가중치를 갱신할 수 있습니다.

W1(t+1)=W1(t)EtotalW1W_1(t+1) = W_1(t) - \frac{\partial E_total}{\partial W_1}

다만, W1W_1은 Output에서 머리 떨어져있기 때문에 편미분의 결과값이 조금 다릅니다. W5W_5과 마찬가지로 풀어서 쓰면,

EtotalW1=Etotalouth1outh1neth1neth1W1\frac{\partial E_total}{\partial W_1} = \frac{\partial E_total}{\partial out_{h1}} * \frac{\partial out_{h1}}{\partial net_{h1}}* \frac{\partial net_{h1}}{\partial W_1}

output1과 output2의 오차 모두에 영향을 주므로 각각의 오차를 편미분한 값의 합으로 나타낼 수 있으며, 이는 각 노드의 델타값과 그에 대응하는 가중치값의 곱들의 합으로 나타낼 수 있습니다.

(1)Etotalouth1=Eo1outh1+Eo2outh1(1) \frac{\partial E_total}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial out_{h1}} + \frac{\partial E_{o2}}{\partial out_{h1}}
Eo1neto1neto1outh1+Eo2neto2neto2outh1\frac{\partial E_{o1}}{\partial net_{o1}}* \frac{\partial net_{o1}}{\partial out_{h1}}+ \frac{\partial E_{o2}}{\partial net_{o2}}* \frac{\partial net_{o2}}{\partial out_{h1}}
=δo1W5+δo2W6= \delta_{o1}*W_5 + \delta_{o2}*W_6

W5W_5의 (2)와 동일하게 시그모이드 함수의 미분,

(2)outh1neth1=outh1(1outh1)(2)\frac{\partial out_{h1}}{\partial net_{h1}} = out_{h1}(1-out_{h1})

마찬가지로 이전의 (3)과 동일한 원리를 적용하면

(3)neth1W1=outi1(3) \frac{\partial net_{h1}}{\partial W_1} = out_{i1}

최종적으로 W1W_1은 아래와 같이 갱신됩니다.

W1(t+1)=W1(t)EtotalW1=W1(t)δh1outi1W_1(t+1) = W_1(t) - \frac{\partial E_total}{\partial W_1} = W_1(t) - \delta_{h1}out_{i1}

다른 가중치 역시 마찬가지입니다.

W2(t+1)=W2(t)δh2outi1W_2(t+1) = W_2(t) - \delta_{h2}out_{i1}
W3(t+1)=W3(t)δh1outi2W_3(t+1) = W_3(t) - \delta_{h1}out_{i2}
W4(t+1)=W4(t)δh2outi2W_4(t+1) = W_4(t) - \delta_{h2}out_{i2}

이렇게 레이어 3개 사이에 생긴 가중치를 갱신하면서 아래와 같이 일반화된 공식을 구할 수 있습니다.

W=(기존W)(역전파 출발노드의out)  (역전파 도착노드의δ)W = (기존 W) - (역전파~출발노드의 out)~*~(역전파~도착노드의 \delta)

Pseudo Code로 나타내면 아래와 같습니다.

for training_repeat
  for training_sets

		// 가중치로 net, out 계산 
		forward pass              

		//output 레이어에서 시작해 input + 1 레이어로
		for i = output layer -> i = input layer + 1     
			for all nodes in layer i
				set delta
			
			//layer i와 i-1 사이에 있는 가중치 갱신
		  	for all weights between layer i and layer i-1  
				update weight    

5.4 글로벌 미니멈과 로컬 미니멈


경사하강법은 임의의 시작점에서 시작하여 반복적으로 최적의 파라미터값을 찾아 나갑니다. 매번 반복할 때마다 우리는 먼저 오차 함수가 해당 점에서 갖는 기울기를 계산합니다. 만약 해당 점에서 오차 함수의 기울기가 0이라면 로컬 미니멈에 도달했다는 뜻입니다. 즉 파라미터의 반복 갱신이 그곳에서 멈출 것입니다.

만약 오차 함수가 하나의 로컬 미니멈만을 갖는다면, 찾은 로컬 미니멈이 바로 글로벌 미니멈이 됩니다. 그러나 오차 함수가 다수의 로컬 미니멈을 갖는다면 글로벌 미니멈을 찾을 수 있을 것으로 보장할 수 없습니다. 후자의 상황에서 우리는 '로컬 미니멈 함정에 빠졌다'고 표현하고 이는 우리가 원하는 결과가 아닙니다.

이를 해결하기 위한 전략은 다음과 같습니다.

  • Simulated Annealing : 각 스테이지에서 일정한 확률로 현재 해보다 나쁜 결과를 받는 방식
  • Stochastic Gradient Descent : 기울기 계산 시 랜덤 요소를 추가

5.5 기타 신경망

  • RBF(Radial Bias Function) 신경망
  • ART(Adaptive Resonance Theory) 신경망
  • SOM(Self-Organizing Map) 신경망

.
.
.

Reference

profile
데이터사이언티스트 대학원생

0개의 댓글