본문 바로가기
Deep Learning 개념정리

Learning rate & batch size best 조합 찾기 (feat.논문리뷰와 실험결과)

by inhovation97 2021. 3. 31.

 * 2022-08-29 수정함.

이번 포스팅은 저의 지난 포스팅의 배경 지식이 요구되므로 읽고 오시기를 추천드립니다 :)

저는 모델링 경험이 엄청 많지는 않기 때문에 고수분들에게는 해당 포스팅이 당연한 인사이트일 수 있습니다...

 

inhovation97.tistory.com/31

 

Transfer learning & fine tuning의 다양하고 섬세한 기법

우리가 어떤 문제에 직면했을 때 해당 문제와 비슷한 결과들이 있다면 훨씬 수월하고 빠르게 문제를 해결해 나갈 수 있을 겁니다. 이번에는 바로 그 개념인 *Transfer learning과 **fine tunning에 대한

inhovation97.tistory.com

 

아래 두 관점으로 실험을 진행했습니다.

 

1. pretrained model로 fine tuning을 할 때, 통상적인 시선과는 달리 Adam으로 SGD보다 좋은 성능이 나올까?

2. batch size와 learning rate의 상관 관계가 있으며, 성능에 큰 영향을 미치는가?

 

cifar10 데이터로 vgg16, resnet 50 모델을 돌렸습니다.

(resnet 50 모델도 같은 결과가 적용됐으며, acc 98% 이상까지 성능을 상향시킨 결과를 이 글 하단에 공유합니다.)

1. 포스팅 배경

2. 간단한 논문 리뷰

3. 실험 전 내용 정리 & 논문과 자가 실험 비교(dataset, task 등등...)

4. 논문을 적용한 실험 결과 & 인사이트

 

1. 포스팅 배경

최근 저는 PyTorch vgg16, resnet50으로 finetuning을 공부하던 중에 의문이 생겼습니다. 

SGD로는 잘만 학습하는 pretrained model이 정말 adam으로는 loss가 줄지 않더군요. 

learning rate를 줄여봐도 마찬가지였습니다. 

 

열심히 구글링을 했고, 정말로 대부분의 fine tuning 관련 코드는 당연하게 SGD를 쓰더군요.

Adam이 더 상위의 optimizer인 것은 분명하므로, 정말 안정적인 optimizer인 SGD만 사용해야 하나? Adam을 쓰면 안되나? 하는 의문이 들었습니다.

 

오기가 생겨서 더 찾기 시작했고, 한 논문을 발견했습니다.

20년 12월에 나온 비교적 최근 논문입니다.

www.sciencedirect.com/science/article/pii/S2405959519303455#fig2

 

The effect of batch size on the generalizability of the convolutional neural networks on a histopathology dataset

Many hyperparameters have to be tuned to have a robust convolutional neural network that will be able to accurately classify images. One of the most i…

www.sciencedirect.com

위 논문은 저와 관점과 목적이 조금 달랐지만, vgg16을 fine tuning하여 SGD보다 Adam으로 조금 더 좋은 결과를 냈습니다. 

 

 

2. 간단한 논문 리뷰

우선 논문을 간단히 리뷰하겠습니다.

논문의 관점은 batch size와 learning rate와의 상관 관계였습니다. (optimizer를 서칭했지만, 뜻밖에도 이 부분의 지식도 얻게 됐습니다 )

논문 배경

논문에서는 learning rate와 batch size의 하이퍼 파라미터를 굉장히 중요히 여겼고, 많은 문헌을 검토했습니다. 

많은 문헌들에서는 learning rate와 batch size의 크기에 관련하여 굉장히 여러 관점이 있었습니다. 

( lr과 batch size의 관계는 음의 관계다. 상관 없이 batch size는 크게 두는 것이 좋다. default로 32 사이즈가 적당하다 등등... )

따라서 논문에서는  learning rate와 batch size의 관계에 대해 실험합니다. 

실험

dataset : train - 22만개 대용량 의료 이미지 / test - 57,458 개 (이진 분류)

model : 선행 학습된 vgg16, resnet 50을 이용

fine tuning : 자세히 나와있지 않습니다.

 

실험 결과

실험 결과는 위와 같습니다.

learning rate와 배치 크기가 양의 관계를 띄었고, fine tuning으로 SGD보다 높은 성능을 내었습니다. 

 

3. 실험 전 내용 정리 & 논문과 자가 실험 비교 ( dataset, task 등등... )

배치 사이즈는 그저 모든 데이터를 한 번에 하기에는 학습량이 너무 많기 때문에 속도 측면으로 데이터를 쪼개어 학습한다고만 생각했었는데, loss 수렴 측면에서도 이렇게 중요한 역할을 하는 결과가 있네요.

적어도 fine tuning에 있어서는 제가 알던 이 learning rate의 수렴 그래프가 사실은 batch size도 굉장히 중요한 역할을 하게 된다는 겁니다. 

그래서 learning rate와 batch size의 의미를 다시 정리해봅니다.

 

내용 정리

 

           learning rate가 클 때

learning rate가 크면, 한 번의 step에서 파라미터 학습이 크게 진행되기 때문에 보폭이 커집니다. 

 

보폭이 크기 때문에 좀 더 빨리 수렴이 가능하며,

그 만큼 local minima로 빠질 위험은 적다는 장점도 있습니다.

 

하지만 너무 크면 오버슛이 심하게 일어나 loss가 전혀 줄지 않을 수 있습니다. 수렴하지 않는 것이죠.

 

 

          learning rate가 작을 때

 

 

learning rate가 작으면, step 보폭이 작아 조금씩 학습합니다.

 

보폭이 작기 때문에 오버슛이 생기지 않습니다.

 

하지만 작은 보폭 때문에 local minima에 빠질 위험이 있습니다.

 

 

 

 

              batch size가 클 때

 

batch size가 크면, 한 번 학습할 때 많은 데이터로 학습을 하게 됩니다.

 

학습이 빠르며 어느정도 수준까지 수렴이 매우 빠릅니다.

(local optima에 빠질 확률이 작음.)

 

작은 배치보다 과적합의 위험이 있습니다.

(batch가 크면 계산되는 loss값의 편차가 작으므로)

 

 

 

 

             batch size가 작을 때

 

1 epoch 당 iteration이 크기 때문에 step이 많아집니다.

 

작은 배치는 작은 데이터로 학습하므로 loss의 분산이 커서( 한 번에 계산하는 데이터 양이 작음) regularize 효과가 있습니다. 

-> 조금 더 다양하고 예리하게(?) 학습이 된다.

 

step이 많아 local minima로 빠질 수 있습니다.

학습 시간이 오래걸린다.

 

 

 

 

내용을 이렇게 정리한 뒤에, 직접 모델링하여 실험을 진행했습니다.

 

실험 비교

1) 데이터셋 비교

논문 : train - 22만개 대용량 의료 이미지 / test - 57,458 개 (이진 분류)

        본래 vgg16에서 선행 학습했던 이미지와는 많이 다른 이미지 특성

 

자가 실험 데이터셋 : cifar10으로 대용량 이미지 (class 10개)

        본래 vgg16에서 선행 학습했던 이미지와 비슷한 특성

 

2) 모델 비교

둘 다 pretrained vgg16을 fine tuning 합니다.

 

논문에서는 fine tuning에 대해서 자세히 언급하지는 않았지만, 대용량 데이터이기 때문에 아마 이 방식으로 fine tuning 했을 가능성이 높습니다.

저도 이 방식으로 cifar10을 fine tuning 했습니다. 

데이터의 특성이 변수가 될 수 있지만, 실험 조건이 크게 다르지는 않습니다.

 

실험 관점

1. pretrained model로 fine tuning을 할 때, 통상적인 시선과는 달리 논문처럼 Adam으로 SGD보다 좋은 성능이 나올까?

 

2. batch size와 learning rate의 양의 상관 관계가 정말 성능에 좋은 영향을 미치는가?

 

4. 논문을 적용한 실험 결과 & 인사이트

 

1. pretrained model로 fine tuning을 할 때, 통상적인 시선과는 달리 논문처럼 Adam으로 SGD보다 좋은 성능이 나올까?

 

colab으로 여시면, 텐서보드의 결과 까지 보실 수 있습니다 :)

모델은 vgg16이며 이 글 최하단에는 acc 98%의 resnet 50 코드 공유합니다.

github.com/inhovation97/PyTorch_Study/blob/main/week_8_%EC%8B%A4%EC%8A%B5/PyTorch_Lab_10_VGG_cifar10_tensorboard.ipynb

 

inhovation97/PyTorch_Study

📖 가짜연구소에서 PyTorch를 공부. Contribute to inhovation97/PyTorch_Study development by creating an account on GitHub.

github.com

 

논문에서 나온 아담과 SGD의 베스트 하이퍼 파라미터 조합 & epoch 20으로 실험을 진행했습니다.

testset accuracy

 

train & test loss

모두 epoch는 똑같고, 그래프의 길이는 batch size로 인한 step의 수 차이입니다.

 

논문의 결과대로 fine tuning에서 Adam으로 SGD의 결과를 10%이상 큰 차이로 앞질렀습니다.

 

사실 SGD는 512 batch & 0.005 learning rate로 더 좋은 결과가 나왔었는데, 그래도 위의 Adam의 결과를 이기진 못했습니다.

 

많은 양을 한 번 학습 하는 시간보다 조금씩 여러번 학습하는 시간이 더 오래 걸렸습니다.

(배치사이즈)

 

 

 

2. batch size와 learning rate의 양의 상관 관계가 정말 성능에 좋은 영향을 미치는가?

 

두 하이퍼 파라미터 간의 상관관계를 실험하기 위해 이렇게 그룹을 나누고, 가설을 세웠습니다.

 

best 조합 1 : 작은 batch & 낮은 lr

한 번에 적은 데이터로 조금씩 학습하기 때문에 그 만큼 step, 학습 수가 많아지므로 local minima에 빠져 optimal minima에 도달하긴 힘들지만, 초기 방향은 쉽게 잡히고 수렴은 잘 될 것이다.

 

best 조합 2 : 큰 batch & 높은 lr

한 번에 많은 데이터로 많이 학습하기 때문에 초기 방향을 잡기 힘들어 lr을 잘 조절해야 할 것이다. 과적합의 문제도 존재한다. local minima에 걸릴 확률이 적고, optimal minima에 수렴할 수 있다.

 

 

worst 조합 1 : 작은 batch & 높은 lr

적은 데이터로 많은 학습을 바라기 때문에 잘 수렴하기 힘들 것이다. 

 

worst 조합 2 : 큰 batch & 낮은 lr

많은 데이터로 조금씩 학습해나가기 때문에 과적합이 쉽게 될 것이다.

 

 

위 4가지 조합 & 20 epoch로 진행했습니다.

testset accuracy
train & test loss

best 조합 1  > best 조합 2 > worst 조합 2  > worst 조합 1

순으로 결과가 나왔습니다.

가설이 거의 들어 맞는 결과가 나온 것 같아요.

best 1과 2는 step 수로 인해서 학습 시간이 많이 차이나기 때문에 best 2 조합을 best 1 학습 시간 만큼 epoch를 늘리면 더 나을 수도 있을 것 같습니다.

 

worst 2 조합은 정말로 과적합이 걸렸는지, best의 조합들보다 accuray가 2~5% 정도로 크게 차이 났고,

가장 놀라운 건 worst 1입니다.

 

처음에 같은 스터디원도 그냥 fine tuning에서 Adam이 수렴하지 않는 이유는 그저 lr이 높다는 문제로 생각했고, 저도 동의했는데 best 2와 같은 lr 임에도 배치 사이즈만 줄였을 뿐인데, 아예 수렴하지 않았습니다.

유명한 위의 이미지에서 batch size도 굉장히 중요한 역할이 있는 것이죠.

 

마찬가지로 실험 2에서도 작은 batch에서 더욱 학습 시간이 오래걸렸습니다.

 

 

최종 인사이트

1. fine tuning에서 Adam으로도 SGD보다 더 좋은 성능을 낼 수 있다. 

 

2. fine tuning에서 Adam을 이용하려면, 낮은 lr도 중요하지만, batch size도 굉장히 중요하다. (수렴이 안되는 결과도 초래)

 

3. Learning rate와 Batch size는 양의 상관 관계가 있다. 

 

4. batch size를 낮게 설정하면 시간이 오래걸린다. (한 번에 많은 데이터 학습 시간< 조금씩 자주 학습 시간)

 

5. 공유한 코드에 있던 lr scheduler를 제거했더니 acc가 95% 이상 나왔다. (transfer learning의 작은 학습율을 더 작게 조절하는게 학습에 크게 영향을 미침)

 

 

사실 위 실험은 데이터셋, 모델, 학습 환경에 따라 전부 다르기 때문에 일반적으로 이렇구나 하고 세팅하고 학습하는 것이지 정답은 아닙니다!

optimizer도 Adam보다 모멘텀 SGD가 더욱 잘 될 수도 있습니다!

 

 

아래 링크의 lr scheduler를 제거한 resnet50 모델은 acc가 98%이상 나왔습니다.

https://github.com/inhovation97/PyTorch_Study/blob/main/week_8_%EC%8B%A4%EC%8A%B5/resnet50_acc_98.ipynb

 

inhovation97/PyTorch_Study

📖 가짜연구소에서 PyTorch를 공부. Contribute to inhovation97/PyTorch_Study development by creating an account on GitHub.

github.com

 

 

댓글