안녕하세요. 휴먼스케이프 june입니다.
3편에서 연재할 word2vec을 이해하는데에 신경망(Neural network)에 대한 지식이 필요해 2.6편을 따로 제작하게 되었습니다.
퍼셉트론(Perceptron)
가장 간단한 인공 신경망을 만들어봅시다.
수식이 들어가 어렵게 느껴질 수 있지만, 사실 매우 간단한 개념입니다.
예를들어 사용자가 별점을 매겨 해당 음식점의 점수를 내는 프로그램을 개발한다고 생각해봅시다.
총 5명의 사용자가 A라는 음식점을 평가했으며, 점수는 각각 [20, 50, 30, 100, 0] 점을 책정했습니다.
이때 음식점의 점수는 20+50+30+100+0=200점으로 산정하면 될까요?
사실 1번, 3번 사용자는 굉장한 미식가, 4번 사용자는 뭐든 맛있게 잘먹는 사람, 5번 사용자는상습적으로 0점을 주는 사용자입니다.
이제 다시 최종 점수를 산정해볼까요?
우리는 신뢰할 수 있는 사용자인 1, 3번 사용자에게 추가 가중치를 부여하고, 4, 5번 사용자의 가중치를 줄여 최종 점수를 산정하기로 했습니다.
각 사용자에게 [1.5, 0.9, 1.8, 0.5, 0.3]의 가중치를 할당했습니다.
음식점의 최종 점수는 179점이 되겠네요.
위 그림에 대입해보면 사용자들의 점수는 x가 되고, 가중치는 w(weight)가 됩니다.
Neural Network
우리는 이미 하나의 간단한 퍼셉트론을 제작하였으며, 이를 여러개 만들어 붙이면 그럴싸한 뉴럴 네트워크(neural network)가 나오게 됩니다.
input layer는 말 그대로 input, 특정 음식점에 대한 사람들의 평점을 받습니다.
hidden layer는 input layer를 통해 연산하는 과정에서 사용되는 layer입니다.
위에서 설명한 가중치만 가지고 예측을 하면 선형적 데이터에 대한 예측만 할 수 있습니다.
hidden layer에는 비선형적 데이터도 예측을 하기위한 활성화 함수(activation function)가 들어갑니다.
각 unit에서 가중치를 곱한 뒤 아래 그림중 하나의 활성화 함수를 이용해 한번 더 꺾어서 다음 레이어로 보내주게 됩니다.
output layer는 최종 음식점 평점을 나타내는 layer입니다.
중간에 hidden layer가 많이 들어갈 수록 더 많은 경우의 수를 연산하게 됩니다.(1번째 레이어에서 input layer의 1, 2, 3번 unit의 합을 가지고 연산, 2번째 레이어에선 1번째 hidden layer의 2, 3, 5번째 unit의 합을 가지고 연산)
결국 hidden layer가 많을수록 연산의 결과는 정확해지지만, 연산 속도가 느려지게 됩니다.
Loss function
우리는 전문가 자문단을 고용해 유저가 낸 평점과 전문가단의 평점을 비교해보기로 했습니다.
이번에 조사한 A음식점의 경우 사용자 평점은 179점이 나왔지만, 전문가단의 평점은 279점으로 100점의 차이가 나게 되었습니다.
이제 우리는 손실함수(loss function)을 이용해 오차를 구하고, 이를 이용해 가중치를 조금씩 수정할 것입니다.
음식점 A, B, C의 평점을 모두 구해보니 아래와 같은 결과가 나왔습니다.
+------+-----+-----+-----+
| / | A | B | C |
+------+-----+-----+-----+
| 사용자 | 179 | 250 | 300 |
| 전문가 | 279 | 100 | 350 |
+------+-----+-----+-----+
이제 우리는 사용자 평점
— 전문가 평점
을 구하고, 모든 값을 양수로 만들기 위해 제곱을 취한 뒤, 모든 제곱오차 값의 평균을 구합니다. (11666
)
이를 평균제곱오차(MSE)
라 부릅니다.
경사 하강법(Gradient Descent)
우리는 위에서 구한 평균제곱오차와 가중치(w)를 이용해 경사의 기울기를 구하고, 가장 낮은곳(가장 오차가 적은 곳)에 도달할때까지 가중치를 이동시킵니다.
경사하강법도 시간이 지남에 따라 여러 방법이 나오게 되었는데, 간단하게 살펴보고 넘어가도록 하겠습니다.
BGD(Batch Gradient Descent)
가장 기본이 되는 경사하강법으로, 전체 학습 데이터를 기반으로 계산합니다.
모든 데이터셋을 계산하다보니 연산도 오래걸리고, 메모리도 많이 사용하게 됩니다.
SGD(Stochastic Gradient Descent)
랜덤으로 하나의 학습 데이터를 가져와 계산합니다.
BGD에 비해 조금 더 좋은 결과값을 낼 수 있지만, 충분한 반복이 필요하고, 노이즈가 많습니다.
Mini-batch GD(Mini-Batch Gradient Descent)
학습데이터를 하나씩 가져와서 계산하기엔 너무 오래걸리고, 전부를 가져오기엔 컴퓨팅 파워가 많이 필요합니다.
위의 이유로 지정한 값만큼 가져와 학습하는 중간 방식이 생겨났습니다. 현재는 대부분의 딥러닝 라이브러리에서 해당 방식을 채택하고 있습니다. batch_size
를 1로 잡으면 SGD
, 전체 학습 데이터 크기로 잡으면 BGD
가 됩니다.
아래 그림을 보면 BGD, SGD, Mini-batch GD의 차이를 이해할 수 있습니다.
BGD는 모든 데이터를 고려하기 때문에 길을 한번에 잘 찾는 반면, SGD는 중간중간 해메는 모습을 볼 수 있습니다.
그렇게 가장 낮은곳을 찾다보면 아래 그림과 같은 문제가 발생하게 됩니다.
이를 Local Minimum 문제
라 하는데, 현재 위치한 웅덩이에서 가장 낮은곳을 찾으면 바로 옆에 더 큰 웅덩이 Global minimum
이 있음에도 현재 있는곳이 가장 낮은 곳이라 판단하게 되는 문제를 말합니다.
또, 고차원의 벡터공간에서는 위의 Local Minimum 문제
보다 Saddle Point
문제가 자주 일어나게 됩니다.
Saddle Point 문제
는 기울기가 0이지만 극값이 아닌 지점(안장점
)에서 가중치를 업데이트 하지 못하고, 벗어나지 못하는 문제를 말합니다.
위의 문제들을 해결하기 위해 경사하강방식을 조금씩 수정하는 Optimizer들이 등장하게 됩니다.
Momentum
관성이라는 물리학의 법칙을 응용한 방법입니다.
기울기 변화가 심한 방향으로는 값을 추가하고, 기울기 변화가 완만한 방향으로는 값을 감소시킵니다.
언덕에서 공이 내려올 때, 중간에 작은 웅덩이에 빠지더라도 관성의 힘으로 넘어서는 효과를 줄 수 있습니다.
Adagrad
파라미터마다 다른 학습률을 적용시킵니다.
자주 등장하는 파라미터는 낮은 학습률을, 가끔 등장하는 파라미터에는 높은 학습률을 적용합니다.(자주 가던 방향으로는 학습률을 줄여 새로운 방향으로 학습하게 합니다.)
해당 방식은 학습이 오래될수록 학습률이 0에 가까워져, 더이상 학습이 진행되지 않는다는 단점이 존재합니다.
RMSprop
Adagrad의 단점을 보안해서 나온 방식입니다.
수식을 조금 수정하여 이전의 기울기들을 그대로 누적하지 않고, 시간에 따라 오래된 time step들의 영향력을 줄이게 됩니다.
Adam
Momentum + RMSprop = Adam
RMSprop의 적응적 학습률
과 Momentum의 관성
개념을 모두 도입했습니다.
역전파(BackPropagation)
모델이 데이터를 받아 예측값을 내놓는 것을 순전파(forward propagation)라고 합니다.
반대로, 위에서 설명한 과정처럼 예측값과 정답을 비교해 가중치들을 업데이트하는 과정을 역전파(backpropagation)라고 합니다.
이때 연쇄 법칙(chain rule)을 활용해 여러개의 노드를 한번에 조정하게 됩니다.