본문 바로가기

딥러닝 & 머신러닝/딥러닝 지식

신경망(Neural Net), 퍼셉트론(Perceptron), 소프트맥스(Softmax) 레이어, 크로스 엔트로피(Cross-entropy) 함수, 신경망의 학습과정

신경세포의 동작 과정

 

신경세포의 수학적 모델링

 

신경세포(뉴런) 하나는 다른 것들과 연결되어있고, 다른 신경세포들로부터 전기 신호를 입력으로 받음.

다른 신경세포들로부터 받은 전기 신호를 신경세포 하나에서는 특정한 값을 곱해서 나름의 변환된 전기 신호를 또 만들어냄.

그래서 만들어진 전기 신호를 해당 뉴런 혹은 신경세포가 연결되어있는 다른 신경세포들에게 전달해주는 방식으로 동작함.

 

그러한 과정을 수학적으로 잘 모델링하면, 입력 신호를 제공해주는 신경세포로부터 받은 입력값을 x1~xn까지의 여러 값으로 정의하게 되고, 여기에 해당 신경세포는 특정 가중치를 곱해서 그걸 다 더하고, 여기에 특정 상수까지 더한 1차 선형결합식으로 새로운 신호 만들어냄. 거기에다가 최종 활성함수까지 통과해서 최종 아웃풋 만듦.

 

그렇게 만들어진 신호는 다른 뉴런들에게 새로운 입력 신호가 됨. 그런 하나하나의 뉴런들이 모여서 신경망이 됨.

신경망에는 다양한 계층들이 존재하고, 하나의 계층 안에 존재하는 다양한 뉴런들은 동일한 입력 정보를 받아서 각기 나름으로 정보를 처리하게 되고, 그렇게 각기 나름의 방식으로 처리된 정보들을 다시 또 한 세트에 입력으로 받아서 그다음 계층 혹은 다음 단계에 있는 뉴런들이 정보를 좀 더 우리가 원하는 유의미한 정보들로 처리 및 변환하는 과정을 거침.

 

즉, 우리 시신경 내에 있는 정보들이 이러한 방식으로 입력 신호로 주어지게 되면 뉴런들을 통해 순차적으로 처리하는 과정을 거치면서 지금 눈에 보이는 사물이 무엇인지 알 수 있게 됨. 현대 신경망은 단순 몇 단계로만 신호 정보를 처리하는 게 아니라, 매우 여러 단계에 걸쳐서 더욱 고수준의 인공지능 task를 수행할 수 있도록 함.

 

퍼셉트론

 

뉴런의 동작 과정을 수학적으로 본따서 만든 알고리즘이 퍼셉트론. 퍼셉트론이 다른 두 개의 뉴런으로부터 입력 신호를 받고 있다면 그것을 각각 x1, x2라고 정의. 뉴런은 정보를 처리해서 출력 신호 y를 제공. 내부적으로는 가중치에 해당하는 w0, w1, w2를 가지고 있음.

 

그러면 이 특정 퍼셉트론은 입력 신호를 가중치와 곱해서 가중합을 만드는 과정을 거치고, 활성 함수도 거쳐서 최종 출력 신호를 만들게 됨. 그러면 출력 신호는 뉴런이 실제 입력 신호를 제공하게 되는, 그 다음 계층에 있는 뉴런들에게 해당 출력을 전달함.

 

즉, 입력 신호는 뉴런 내부적으로 특정한 가중치와 곱해지고, 가중치와 곱해진 값들이 다 합산된 형태로 계산됨. 활성화 함수로 hard thersholding function일 때, 그렇게 합산된 값이 최종적으로 0보다 큰 경우엔 그 특정 퍼셉트론의 최종 아웃풋은 1이 되고, 가중합의 값이 0보다 작은 경우엔 최종 뉴런의 아웃풋은 0이 됨.

 

이러한 퍼셉트론의 가중치를 잘 조정하면 AND, OR 등의 논리연산 게이트를 만들 수 있음. 이때 아웃풋이 1 또는 0이 되는 경계 조건을 decision boundary라고 함. 그리고 그러한 입력 신호들을 feature라고 하고, 그러한 feature들이 존재하는 공간을 (input) feature space라고 함.

 

그러면 인풋이 두 개인 뉴런을 나타내는 선형결합식은 2차원 feature space에서 어떠한 직선을 나타냄. 그 직선에서 특정 영역은 아웃풋이 모두 1, 0이 나오도록 하게 됨. 따라서 그 직선이 바로 decision boundary이며, feature space는 decision boundary에 의해서 양분됨. 양분된 영역은 최종 아웃풋이 0 또는 1이 되게 하는 영역임.

 

XOR 게이트

 

x1, x2가 각각 0이거나 1일 때는 최종값 0, 그리고 x1, x2가 1, 0 혹은 0, 1이 나왔을 때는 최종값 1이 나오도록 하는 논리연산. 이러한 경우는 1차 선형결합식으론 2차원 feature space에서 두 데이터를 양분 불가능. 이때는 간단한 형태의 퍼셉트론을 여러 단계에 걸쳐 구성했을 때 분리 가능. (ex. AND, OR 게이트 같이 섞어 쓰는 방식으로)

 

뉴럴넷

 

1차 결합식만으로 정보를 처리하는 간단한 단위구조체였던 퍼셉트론(뉴런)을 가지고, 각각의 계층 혹은 단계에서 각기 나름대로의 서로 다른 역할을 해주도록 준비해두고, 그것들을 순차적으로 연결함으로써 여러 계층에 걸쳐서 정보를 처리하는 뉴럴넷을 구성할 수 있음.

 

그러한 뉴럴넷은 굉장히 복잡한 task도 문제없이 수행할 수 있도록 함. 즉, XOR 문제에 주어진 분포보다 더 복잡하게 데이터가 분포해있어도, 퍼셉트론을 여러 개 엮으면 decsion boundary를 보다 복잡하게 그릴 수 있어서 데이터를 잘 나눌 수 있게 된다. 즉, 퍼셉트론이 여러 개 있으면 비선형성을 증가시킬 수 있다.

 

또한, 한 계층 내에서 여러 개의 퍼셉트론이 준비되어 있으면, 그걸 여러 계층으로 쌓은 MLP(멀티 레이어 퍼셉트론)에서 forward propagation이라는 순차적인 계산 과정이 나타난다. 이때 가중치와 입력 신호 값을 각각 행벡터, 열벡터로 나타내게 되면 행렬의 내적 형태로 가중합을 쉽게 나타낼 수 있음. 그리고 뉴런들의 가중치는 묶어서 하나의 행렬 형태로 구성할 수 있음.

 

MLP (Multi Layer Perceptron)를 이용한 MNIST 분류

 

MNIST를 구성하는 28*28 이미지는 각각의 픽셀이 0~255 사이의 픽셀값들로 구성되어 있음. 그 픽셀값들을 0~1로 정규화해서 MLP 모델이 이해하기 쉬운 형태로 만들어줌. 28*28 형태의 행렬로 나타내어지는 이미지를 열 기준으로 쭉 하나씩 잘라서 이어 붙이게 되면 784*1 형태의 벡터로 나타남.

 

이제 해당 벡터의 각각의 벡터값을 입력 신호로 사용해서 MLP의 인풋 레이어에 넣어주면 됨. 그러면 인풋 노드의 수는 784개가 됨. 그러한 입력을 바탕으로 주어진 이미지가 어떤 숫자(digit)에 해당하는지 분류하는 task를 생각할 때, 최종 아웃풋 레이어에선 첫 번째 노드가 0, 마지막 노드가 9에 해당하는 확률값을 내어주는 MLP를 생각해볼 수 있음.

 

직관적으로 각각의 아웃풋 레이어의 노드들에 있는 sigmoid를 최종적으로 통과했을 때 나오는 값이 0~1 사이의 값으로써, 값이 클 때 해당 숫자가 될 확률이 크다는 식으로 해석 가능.

 

분류 문제에서 MSE (Mean Squared Error)의 문제점

 

MSE는 실제값(레이블)과 예측값 간의 차이를 제곱하고 전체 레이블 개수만큼으로 나눠주는 것.

 

이때 뉴럴넷의 최종 아웃풋 값이 소프트맥스 레이어 (Softmax layer)를 통과하면 예측된 클래스가 얼만큼의 확률로 실제 클래스인지 나타나게 되는데, 이때 그 ‘얼만큼의 확률’, 즉 확률값이 뉴럴넷의 예측값이 되므로, 레이블의 확률값은 실제 정답 클래스만 1이고 나머지는 0이어야 됨.

 

이렇게 되면 특정 클래스에서의 예측값과 실제값의 차이가 최대 1이 될 수 있고, 거기서 발생하는, 학습에 사용할 gradient 값이 작게 되고, 그래서 학습이 느리게 될 수 있음.

 

Softmax layer (Softmax classifier)와 Cross-entropy loss

 

여러 개의 클래스 중 특정 하나의 클래스로 분류하고자 하는 문제에선 일반적으로 원하는 예측값, 즉 출력값의 형태는 예측된 클래스가 얼만큼의 확률로 실제 클래스인지를 나타낸 형태로 되어야 함.

 

이렇게 multi class classification을 목적으로 하여 output vector의 형태가 해당 벡터값들을 다 합쳤을 때 1이 나오도록 하는 확률 분포의 형태로 아웃풋을 내줄 수 있는 특정한 활성화 함수를 Softmax layer라고 함.

 

아웃풋의 개수가 m, 인풋의 개수가 n인 m*n 행렬의 형태로 가중치 행렬을 구성하고, 그것을 인풋값들로 이루어진 인풋 벡터(n*1)에 곱해주게 됨. 그 값은 W^T*X라고 할 수 있는데, 그것을 logit이라고도 부름. logit을 지수함수(e^x)에 통과시켜주면 그 값은 항상 양수가 됨. 그리고 그것들의 합을 분모로 넣고, 각각의 값을 분자에 넣음으로써 상대적인 비율을 계산함. 그러면 각각은 각 클래스일 확률을 나타낸다고 해석할 수 있음.

 

softmax layer에서 나온 확률값을 가지고 loss를 계산하기 위한 loss function으로 cross-entropy loss가 있음. 정답 클래스에 해당하는 확률 값이 최대한 1이 나오도록 하는 loss function임.

 

즉 GT 값은 해당하는 클래스만 1이고 나머지는 0의 값을 갖는 원핫 벡터 형태가 됨 (ex. [0 1 0]). 그러면 두 개의 확률값(GT값의 확률 & 예측값일 확률)을 곱해주는데, 이때 예측된 확률은 그것의 log 값을 계산해서 곱하게 됨.

 

그것들을 GT값의 확률 0, 1, 0과 곱해주면 결국 살아남는 항은 GT 클래스에 해당하는, 즉 GT값의 확률 y에서 1이라는 값을 가지는 항만 살아남게 됨. 그 값에 –를 붙인 값이 최종 loss이며, L = -log(p_hat_y_i) 형태로 loss를 다시 쓸 수 있음.

 

이러면 정답 클래스에 부여된 확률값이 작아질수록 loss 값이 +∞에 가까워지고, 확률값이 1에 가까워질수록 loss 값이 0에 가까워짐.

 

뉴럴넷의 학습과정

 

gradient descent 사용. 뉴럴넷에서 최적화하고자 하는 파라미터들이 있을 것이고, 그 파라미터들로 이루어진 뉴럴넷에 주어진 데이터를 인풋으로 넣고 GT 값과 비교함으로써 차이를 최소화하도록 하기 위해 loss function을 사용하는데, 그 loss 값이 최소화 되는 파라미터를 찾는 것.

 

이를 위해, 각각의 파라미터에 대한 미분값을 구하고, 미분 값을 사용해서 현재 주어진 파라미터 값을 가지고 미분 방향의 마이너스 방향으로, learning rate를 곱해서 해당 파라미터들을 업데이트 함. random initialization에서 시작해서, loss 함수의 높이가 점점 낮아지는 방향으로 해당 파라미터들이 점점 업데이트 (최적화) 됨.

 

이때, original gradient descent를 그대로 사용하면 수렴 속도가 상대적으로 매우 느린 경우가 존재함. 그것들을 다양한 형태로 변형 및 개선한 방법들이 존재함.