읽기일기

패턴 인식 (4) 신경망


패턴인식, 오일석 지음/교보문고

4. 신경망

4.1 소개

기존의 폰 노이만 컴퓨터 주고를 뛰어 넘기 위해 뇌의 정보 처리를 모방하는 새로운 계산 모형을 개발하자는 발상에서 시작되엇다. 사람의 뇌는 뇌의 정보처리 단위로 단순한 연산이 가능한 뉴런을 가진다. 이러한 뉴런이 엄청난 양으로 서로 연결된 구조를 가지기 때문에 뇌는 고도의 병렬처리가 가능하다. 이러한 구조를 본따 인공적으로 개발된 신경망을 생물학적 신경망(biological neural network, BNN)과 구분하여 인공 신경망(artificial neural network, ANN)이라고 부른다.

신경망의 기본적인 원리는 연결주의(connectionism)으로 요약할 수 있다. 단순한 연산을 수행하는 많은 연산기와 그들 간의 아주 많은 연결을 통해 지능적인 일을 달성하려는 의도의 계산모형이다. 이러한 방식을 추구하는 사람들을 연결주의자(connectionist)라고 부른다.

신경망은 정보 처리를 위한 수학적 모델로 생각할 수 있는데, 다음고 같은 장점을 갖는다.

  1. 학습이 가능하다. 훈련 집합을 주면 신경망이 자동으로 만들어지기 때문에 블랙박스로도 볼 수 있다.
  2. 일반화 능력이 뛰어나다.
  3. 병렬 처리가 가능하다.
  4. 현실적인 문제에서 우수한 인식 성능을 보장한다.
  5. 다양한 문제의 해결 도구로 사용된다.

신경망의 정보 처리 과정은 $ y = f(x) $로 표현할 수 있는데, 입력 x를 받아 f라는 정보 처리 과정을 거쳐 y를 출력한다고 생각할 수 있다. 패턴 인식에서는 x가 샘플의 특징 벡터이고, y는 부류를 나타낸다.

4.2 퍼셉트론

4.2.1 구조와 원리

Rosenblatt가 제안한 퍼셉트론은 선형 분류의 한계를 가졌지만 다층 퍼셉트론의 토대가 되므로 여전히 중요하다.

퍼셉트론은 두개의 층을 가지고 있다. 입력을 받는 입력 층(input layer)와 출력을 내보내는 출력 층(output layer)이다. 입력 층은 d+1개의 노드를 가지며, d는 특징 벡터 x의 크기와 같다. 나머지 한 개의 노드는 바이어스(bias)에 해당하는데 이 노드는 항상 1 값을 갖는다고 생각하면 된다.

출력 층은 하나의 노드를 갖는다. 출력은 이진 분류로 생각하여, -1 / 1 또는 0 / 1 쌍의 출력 값에 따라 $w_1, w_2 $의 부류가 결정된다. 입력 노드와 출력 노드는 에지로 연결되어있고 에지는 가중치를 갖는다. 가중치는 연결 강도(connectin strength)라고도 한다.

입력 층의 노드는 단순히 받은 값을 전달하는 역할만 하지만, 출력 층의 노드는 합 계산과 활성 함수 계산을 순차적으로 수행한다

$$y = \tau(\sum_{i=1}^d w_i x_i + b) = \tau(w^x + b)$$

$$\tau(s) = +1, s \geq 0 \text{ or } -1, s \lt 0$$

이 식은 앞으로도 자주 등장할 텐데, 결국 선형 분류기(linear classifier)와 같다.

$$d(x) = w^x + b \gt 0, \text{then } x \in w_1$$

$$d(x) = w^x + b \lt 0, \text{then } x \in w_2$$

4.2.2 학습과 인식

이제 퍼셉트론을 어떻게 학습시킬 것인가에 대한 문제를 생각하여보자. 훈련 집합 $ X = \{ ( x_1, t_1), (x_2, t_2), \dots, (x_N, t_N) \} $이 주어지고 이 샘플들은 선형분리가 가능하다고 가정할 때 이를 모두 옳게 분류하는 퍼셉트론($w, b$)를 찾는 문제이다. 일반적으로 패턴 인식의 학습 알고리즘은 다음 세 단계를 거친다.

  1. 분류기 구조를 정의하고 분류 과정을 수식으로 표현한다. 이 식은 매개 변수의 집합 $ \Theta $로 정의된다.
  2. 분류기의 품질을 측정할 수 있는 비용 함수(cost function) $ J(\Theta)$ 를 정의한다.
  3. $J (\Theta )$를 최대 또는 최소로 하는 매개 변수를 찾기 위한 알고리즘을 설계한다.

첫번째 단계는 앞에서 정의하였고, 두번째 단계를 살펴보자. 직관적으로 이해가 쉽고 가장 널리 사용되는 함수는 아래와 같다.

$$J(\Theta) = \sum_{x_k \in Y} (-t_k) (w^T x_k + b)$$

이 함수는 항상 양수이며, 오분류된 샘플이 많아질 수록 값이 커진다. 오분류가된 샘플이 없다면 이 값은 0이 된다.

세번째 단계에서는 내리막 경사법(gradient descent method)를 사용한다. 이 방법은 미분 벡터 $ \partial / \partial \Theta $의 반대 방향에 최적 점이 있으므로 현재 해를 미분 벡터의 반대 방향으로 이동시킨다. 단 정확한 이동량은 알 수 없으므로 작은 값을 갖는 학습률(learning rate)를 곱하여 조금씩 이동시키다가 비용 함수의 값이 0이 될 때까지 이 과정을 반복한다. 학습률은 $ \rho(h) $로 표현하며 시간 h가 달라짐에 따라 그 값이 달라지도록 할 수도 있다.

미분 벡터를 이용하여 식을 나타내면,

$$\Theta(h + 1) = \Theta(h) - \rho(h) \frac{\partial J(\Theta)}{\partial \Theta}$$

와 같으며, 각 매개변수에 대하여 편미분 식을 대입하여 풀어낸 식을 델타 규칙(delta rule)이라고 한다. 이 방법은 반드시 수렴한다는 것이 증명되어있다.

4.2.3 구현

구현에 대한 팁을 언급하자면,

  1. w와 b는 -0.5 ~ 0.5 사이의 난수를 생성하여 초기화한다.
  2. 고정된 학습률 대신, h에 따라 선형적으로 줄이는 방법을 사용할 수 있다. $ \rho(h) = \rho_s - (\rho_s - \rho_c) h / H $. H : 최대 세대 수, h : 현재 세대 수, $ \rho_s $ : 시작 학습률, $\rho_c $ 끝 학습률
  3. 패턴 모드와 배치 모드 : 오분류된 모든 샘플을 모은 다음 한꺼번에 가중치를 갱신하는 배치모드와 샘플 하나의 결과를 이용하여 곧바로 가중치를 갱신하는 패턴 모드 중 하나를 선택할 수 있다.

선형 분리가 불가능한 경우, 새로 계산된 w가 이전 것보다 좋은 경우에만 이를 갱신하는 포켓 알고리즘(pocket algorithm)을 사용할 수 있다.

알고리즘을 멈추는 stop-condition은 반복이 최대 세대 수에 도달하거나 품질이 더 이상 좋아지지 않는 경우 등을 사용할 수 있다.

4.3 다층 퍼셉트론

선형 분리가 불가능한 경우에는 포켓 알고리즘을 사용하더라도 많은 오류를 보일 것이다. 퍼셉트론을 여러 층으로 이어 붙인 다층 퍼셉트론을 통하여 이러한 문제를 풀어보자.

4.3.1 구조와 원리

간단한 예를 들어 두개의 결정직선을 사용한다면, 즉 두개의 퍼셉트론을 사용한다면 특징 벡터 x를 새로운 공간으로 매핑하는 것으로 생각할 수 있다. 즉 선형 분리 불가능한 상황을 분리 가능한 상황으로 만들어 주었다.

다층 퍼셉트론은 입력 층, 은닉 층, 출력 층 세개의 층을 가지며 각 층은 고유한 기능을 가져 수행하는 연산이 서로 다르다. 특히 입력 층은 특별한 연산이 없이 받은 값을 전달하는 기능만 한다. 이런 이유로 3개의 층으로 이루어진 신경망을 3층이 아닌 2층 퍼셉트론이라고 한다. 입력 층은 특징 벡터 $ x= (x_1, x_2, \dots, x_d)^T $의 d개의 노드에 바이어스를 위한 한개의 노드를 받아야 하므로 d+1개의 노드를 가지며, 출력 층은 부류의 수만큼 m개의 노드를 갖는다. 은닉 층 노드 수 p는 사용자가 지정하여야 한다. 은닉 층에도 바이어스 노드가 있어 p+1개의 노드를 갖는다. 따라서 입력 층과 은닉 층 사이에는 총 (d+1) * p 개의 가중치가 잇다. 편의상 i 번째 입력에서 j번째 은닉 노드로 가는 에지의 가중치를 $u_{ij}$라고 하고 비슷하게 j번재 은닉 노드에서 k번째 출력 노드로 가는 가중치를 $v_{jk}$라고 한다.

결국 다층 퍼셉트론은 x를 입력으로 받아 출력 벡터 $o = (o_1, o_2, \dots, o_m)^T $를 출력하는 함수로 간주할 수 있다.

$$o = f(x)$$

입력 층에서 은닉 층으로의 매핑을 $p $, 은닉 층에서 출력 층으로의 매핑을 $ q $로 나타내면 이는 $ o = f(x) = q(p(x))$ 으로 나타낼 수 있다.

다층 퍼셉트론에서 입력 층으로부터 출력층까지 앞으로 전진하는 계산을 전방 계산(forward computation)이라고 부른다. 이 때 쓰이는 활성 함수 $ \tau $가 있다. 다층 퍼셉트론에서는 앞에서 사용한 계단 함수를 사용하지 않고, 주로 시그모이드(sigmoid)라는 비선형 함수를 사용한다. 이는 0 ~ 1 사이의 값을 가지거나 -1 ~ 1 사이의 값을 가지는 두 종류가 있으며, 각각을 이진 모드(binary mode), 양극 모드(bipolar mode)라고 부른다.

두 함수는 전 구간에서 미분이 가능하고, 미분 값 또한 자기 자신을 포함하여 계산이 간단하다는 장점이 있다. 또한 계단 함수를 근사하는 특징이 있다.

다층 퍼셉트론의 구조를 아키텍처(architecture)라 부르기도 하는데, 구조를 설계할 때는 다음을 고려해야 한다.

  1. 몇 개의 층을 둘 것인가?
  2. 층간의 연결은 어떻게 할 것인가? 이웃하지 않은 층간에도 에지를 가질 수 있다. 또한 피드백 에지 또한 가질 수 있다. 책에서 처럼 이웃한 층간에만 에지를 가지고 피드백 에지도 가지지 않는 구조의 다층 퍼셉트론을 전방 다층 퍼셉트론(feed-forward MLP, FFMLP)라고 한다.
  3. 각 층의 노드를 몇 개로 할 것인가?
  4. 어떤 활성 함수를 사용할 것인가?

4.3.2 학습

다층 퍼셉트론의 학습 또한 퍼셉트론과 마찬가지로 세 단계에 따라 설계할 수 있다.

다층 퍼셉트론의 매개 변수 집합은 $ \Theta = \{ u, v \} $이다.

비용 함수는 다음과 같이 정의된다.

$$E = \frac{1}{2} \sum_{k=1}^m (t_k - o_k)^2$$

이제 학습을 위해서 내리막 경사법을 이용하고자 한다.

$$v(h+1) = v(h) + \delta v = v(h) - \rho \frac{\partial E}{\partial v}$$

$$u(h+1) = u(h) + \delta u = u(h) - \rho \frac{\partial E}{\partial u}$$

수식 유도는 책을 참고하도록 하자. 이 규칙을 일반 델타 규칙(generalized delta rule)이라고 부른다. 또한 출력층에서 시작하여 반대 방향으로 전진하며 오류를 전파하므로 오류 역전파 알고리즘(error back-propagation algorithm)이라고 부른다.

4.3.3 인식

인식 과정은 전방 계산 한번으로 끝난다. 전방 계산을 하여 얻은 출력 벡터 o 를 조사하여 가장 큰 값을 갖는 요소를 인덱스로 하여 결과로 삼는다. 이를 수식으로 표현하면 아래와 같다.

$$x \in w_q, q = \arg \max_j o_j, 1 \leq j \leq m$$

4.3.4 구현과 몇 가지 부연 설명

  1. 아키텍처 : 같은 성능을 갖는다면 가급적 단순한 것을 선택하자. 특별한 경우를 제외하고는 하나의 은닉 층을 사용하면 된다. 흔닉 노드의 수는 중요한데, 샘플의 수보다 매개변수의 수가 많아지면 정보가 부족하여 학습이 제대로 되지 않는다.

  2. 가중치 초기화 : 가중치의 초기값에 따라 전역 최적점으로 갈 것인지 지역 최적점으로 갈 것인지가 결정되며 수렴 속도에도 영향을 미친다. 보편적으로는 -0.5 ~ 0.5 사이의 작은 난수로 설정한다. 보장된 방법은 알려지지 않았다.

  3. 종료 시점 : 조건에 다라 종료시점을 결정하자. 세대 수를 정해놓거나, 세대가 끝난 후 평균 제곱 오차(mean squared error, MSE)를 계산하여 임계값보다 작은지를 비교 하는 방법, MSE 값의 변화 추이를 관찰하여 변화가 작은 경우를 발견하는 방법, 검증 집합의 인식률을 사용하는 방법들을 선택할 수 있다.

  4. 목적 벡터의 표현과 활성 함수 : 이진 모드와 양극 모드에 따라 활성 함수를 다르게 사용하여야 한다.

  5. 패턴 모드와 배치 모드 : 배치 모드는 잡음을 둔감하게 하는 효과가 있다. 보통은 패턴 모드가 더 좋은 성능을 보인다.

  6. 샘플 처리 순서 : 특정 부류가 뭉쳐서 나오는 경우가 있기 때문에 샘플들의 순서를 섞어서 하는 것이 좋은 성능을 얻을 가능성이 있다.

  7. 학습률 : 하나 값을 쓰지 않고 전체 과정에서 적응적으로 변화시킬 수도 있다.

  8. 지역 최적 점 탈출 : 여러 초기값으로 신경망을 훈련하고 그 중 가장 좋은 성능을 보이는 것을 선택하는 다중 시작(multi-start) 방ㅂ버을 사용하기도 한다.

적절히 설정해야할 부분들이 많으나 보편적인 설정법이 없다.


Add a Comment Trackback