C팀 : 김경태 남서아 김태현 백윤성 이상민
발표자 : 백윤성
모두의 딥러닝 강의에서 나온 Linear regression에서 사용된 함수에 대해 발표자가 개인적으로 궁금했던 부분에 대해 리뷰하고, 간단한 데이터 셋으로 하나의 input을 갖는 선형 회귀 모델을 만들어 보겠습니다.
1. optim.SGD()
강의에서 선형 회귀 모델을 만드는 optimizer로 확률적 경사하강법(이하 SGD)를 사용하였습니다. 이를 기본적인 경사하강법과의 차이에 대해 알아보았습니다.
GD는 각 step마다 전체 데이터를 이용하여 가중치를 update합니다. 반면 SGD는 데이터의 일부분을 추출하여 각 step마다 mini-batch만을 이용하여 update를 진행합니다.
이러한 방법은 최적값을 찾아나가는 과정이 노이즈가 발생합니다. 하지만 속도면에서는 GD에 비해 굉장히 빠릅니다. 따라서 충분히 학습이 된다고 가정한다면 더 빠른 시간 내에 가중치의 최적값을 찾을 수 있습니다.
하지만 SGD도 단점이 존재합니다. 최적값을 찾아가는 과정이 뒤죽박죽인 방향성 문제와 적절한 learning rate를 찾지 못한다면 학습이 너무 느리거나 최적값을 찾지 못할 수도 있다는 보폭의 문제입니다. 이러한 문제점들을 보완한 새로운 optimizer들이 있습니다. 방향성 문제를 보완하기 위한 Momentum은 관성으로 한 step을 진행한 후 이전에 진행된 방향으로 일부 진행하는 optimizer입니다. 즉, 이전의 학습 결과가 다음에 영향을 미치는 것입니다. 보폭 문제를 보완하기 위한 RMSProp은 지속적으로 변화하는 parameter는 최적에 가까워진 것으로 적은 변화를 주고 새로 변화하는 parameter는 큰 변화를 주는 방식입니다. 이 두 방식을 합친 Adam이라는 optimizer도 있습니다.
2. optimizer의 함수
강의에서는 optimizer.zero_grad()를 통해 정의된 parameter들의 gradient를 0으로 초기화한다고 하였습니다. 왜 초기화를 진행하는 것이며, 위의 3줄의 코드가 어떤 식으로 진행되는 것인지 알아보았습니다.
torch로 생성된 tensor들은 기본적으로 자신의 현재 gradient를 저장하고 있습니다. 이는 tensor.grad에 저장되어 있습니다. cost.backward()에서 cost의 식에 포함된 tensor들의 gradient를 역전파를 통해 계산하게 되고 optimizer.step()으로 해당 tensor들을 자신이 저장하고 있는 gradient를 이용하여 update하게 됩니다. 하지만 step()이후 이전의 gradient 값들은 초기화되지 않고 남아있어 zero_grad()를 해주지 않고 backward()함수를 사용하게 된다면 현재 gradient가 누적이 되어 학습이 올바르게 진행되지 않게 됩니다.
3. 간단한 선형 회귀모델 생성
인도의 중고차 거래 데이터를 이용하여 간단한 선형 회귀모델을 생성하였습니다. 1개 input, 1개 output으로 구성하기 위해 Kilometers_Driven에 따른 Price를 예측하도록 하였습니다.
optimizer로는 SGD를 사용하였고 learning rate를 0.1로 설정하였습니다. loss로 MSE(평균 제곱 오차)를 사용하여 실제값과 예측값의 차이를 계산하였습니다. Kilometers_Driven의 값들은 보통 만단위로 수가 매우 커서 학습하는 과정에서 W, b가 발산하여 학습이 제대로 이루어지지 않았습니다. 따라서 z-score 정규화를 이용하여 input값을 normalization한 후에 학습을 진행하였습니다.
학습 초반에는 cost를 줄이는 방향으로 빠르게 진행이 되다가 점차 보폭이 줄어들며 최적의 값으로 수렴하는 것을 볼 수 있었습니다. 최종적으로 W는 -0.129, b는 9.479로 수렴하였습니다.
마지막으로 새로운 인도 중고차 데이터를 이용하여 Price를 예측하도록 하였습니다. training set과 분포를 동일하게 하기 위해 training set의 평균과 표준편차를 이용하여 test set의 input들을 normalization을 한 후 예측을 진행하였습니다.
'5기(210102~) > C팀' 카테고리의 다른 글
VGGNet 논문 리뷰 (0) | 2021.02.27 |
---|---|
모두의 딥러닝 Lec 18 ~ Lec 21 리뷰 (0) | 2021.02.12 |
모두의 딥러닝 2 Lec 14 ~ 17 review (0) | 2021.02.02 |
모두의 딥러닝 2 Lec 10 ~ 13 review (0) | 2021.01.28 |
모두의 딥러닝 2 Lec 6 ~ Lec 9 review (1) | 2021.01.22 |