스탠포드 강의를 듣고 정리한 내용입니다.
지난 포스팅에서는 그래프 신경망이 뭔지, 이전과 뭐가 다른지 간단하게 훑어보았습니다.
이번 포스팅에서는 그래프 신경망에 본격적으로 들어가기 전 딥러닝 개념에 대해서 빠르게 훑어보겠습니다.
여기서는 정말 간단하게 훑을 예정이니 더 딥하게 보고 싶으신 분들은 아래 포스팅을 참고해주세요.
Machine Learning
supervised learning은 입력 x를 넣어주었을 때, 라벨 y를 예측하는 것을 목표로 합니다.
입력 x는 실제 숫자 벡터, 시퀀스(자연어), 행렬(이미지), 그래프가 될 수 있습니다.
여기서 머신 러닝은 우리가 x로부터 y를 얻기 위해 "최적화를 하는 문제"라고 정의할 수 있습니다.
그럼 무엇을 최적화 할까요?
위의 수식을 한번 봅시다. 여기서 y는 라벨, f(x)는 x를 예측한 값, L은 손실함수, Θ는 파라미터를 뜻합니다.
손실 함수는 실제 라벨 y와 모델이 예측한 y의 차이이고, 이 값을 최소화하는 파라미터 Θ를 최적화해야합니다.
Θ는 하나 이상의 스칼라, 벡터, 매트릭스가 될 수 있습니다.
예를 들어 Shallow encoding에서 Θ라고 하면 Z matrix가 될 수 있겠네요!
Loss Function
그렇다면 Loss는 어떻게 구하냐!
여기 두 가지 배열이 있습니다. 위의 배열 y는 라벨이고, f(x)는 모델이 예측한 값입니다. y는 one-hot인코딩으로 표현되어있고, 총 5개의 클래스를 가집니다. 그 중 3번째 라벨을 가지고 있음을 표현하고있습니다.
모델의 f(x)는 모델의 예측값 분포를 나타내고 있는데요. 각 값의 인덱스가 각 클래스일 확률을 뜻합니다. 따라서 세 번째 클래스가 0.4의 확률로 가장 높게 예측되고 있음을 알 수 있죠.
일반적으로 loss값은 위의 실제 값과 예측한 값의 빼서 얼마나 오차가 있는지 확인하고, 그 오차를 모두 더하여 모델 전체의 오차를 계산합니다. 이후 모델이 그 값을 최소화 하는 방향으로 학습을 진행하죠.
예를 들어 Cross entropy라는 함수로 Loss를 계산한 수식입니다. 모든 데이터에 대한 오차를 더해주죠!
좀더 자세히 알고 싶으시다면 위에 포스팅을 참고해주세요.
Optimizer
오차를 구했으면 이제 오차로부터 모델을 업데이트 해야겠죠?
그러기 위해서는 Optimizer를 이용하여 어느 방향으로 얼마나 갈지 가중치를 조정해줄지 결정합니다.
파라미터의 오차 그래프를 그린 뒤, 오차가 감소하는 방향으로 가중치 값을 계속 갱신해 주는 과정입니다.
따라서 미분을 이용하는데요. 기울기가 음수일때는 오른쪽으로 갈 수록 하강하는 그래프가 완성되고, 기울기가 양수일때는 왼쪽으로 갈 수록 하강하는 그래프가 완성됩니다. 따라서 기울기가 음수일때는 오른쪽으로 이동하고, 기울기가 양수일때는 왼쪽으로 이동해야하죠.
xi+1은 다음 단계의 파라미터, xi를 현재 파라미터가 있는 위치라고 할때, 수식은 위와 같이 정의됩니다.(Gradient Descent의 예입니다)
실제 수식으로 나타내면 아래와 같이 나타낼 수 있는데요. 여기서 𝜂은 learning rate를 뜻합니다.
즉, 내가 이 값을 얼마나 반영할건지에 대한 비율입니다. 이 값이 클수록 가라는 방향대로 더 빨리 이동하고, 작을수록 조심스레 이동한다고 보시면 됩니다.
위처럼 Gradient Descent를 한다면 전체 데이터셋을 모두 훑어본 후에야 파라미터를 갱신할 수 있을 것입니다. 따라서 배치 단위로 이를 갱신할 수 있도록 Stochastic Gradient Descent(SGD)를 이용할 수 있습니다. 자세한 내용은 관련 포스팅을 참고해주세요.
전체 과정은 다음과 같습니다.
Backpropagation
위에서 얼마나 업데이트 시켜야하는지 알아냈죠. 이제 역전파를 통해서 각 가중치를 업데이트 시켜주면 됩니다!
가중치를 업데이트 하는 방법은 미분의 chain rule를 이용합니다.
미분 연쇄 법칙에 의해 다음과 같이 풀어쓸 수 있는데요.
이것을 이용해서 각 파라미터들을 업데이트 시켜줍니다.
자세한 과정은 역전파 포스팅을 참고해주세요!