브레인 스토리
torchlars가 탄생하기까지
2019/12/23 by 이수경, 박천명

지난 10월 중순 카카오브레인 AutoLearn 연구팀은 파이토치(PyTorch)[1] LARS(Layer-wise Adaptive Rate Scaling) 라이브러리인 ‘torchlars’를 대중에 공개했습니다. torchlars는 파이토치에서 제공하는 확장 기능을 활용해 GPU 동작에 최적화된 LARS를 제공합니다.

이 라이브러리 개발을 주도한 박천명 연구원을 만나 어떤 시행착오를 거쳐 torchlars가 탄생했는지 그 뒷이야기를 들어봤습니다. 이번 글에서는 배치(batch) 크기에 따른 모델의 훈련 시간과 학습 곡선(learning curve)[2]의 상관관계, LARS의 특징, torchlars 개발 프로젝트에서 AutoLearn 연구팀이 주력한 부분에 대해 다루고자 합니다.

*박천명 연구원은 지난 7월부터 2개월간 카카오브레인의 인턴십 프로그램을 통해 이 연구를 진행했습니다. 현재는 KAIST 동시성 및 병렬성(Concurrency & Parallelism) 연구실에서 석사 과정을 밟고 있습니다.


딥러닝 모델 훈련과 배치의 관계

[ 그림 1 ] 딥러닝 모델의 훈련 과정을 도식화한 그림이다. 딥러닝 모델은 순전파와 역전파를 통해 정답과 실제 출력값의 차이(오차)를 최소화하는 방향으로 가중치 업데이트를 한다. 

딥러닝 모델의 훈련(가중치 업데이트) 과정은 다음과 같습니다([그림 1]). 먼저 순전파 과정에서 데이터를 입력받은 모델은 초기화된 가중치를 이용해 예측값을 출력합니다. 그다음, (손실 함수는) 앞서 구한 예측값과 정답 사이의 오차(loss)[3]를 알아내죠. 마지막으로 출력층에서 입력층으로 거슬러 올라가는 역전파 과정에서 (최적화 함수는) 얻은 기울기 값을 이용해 앞서 구한 오차를 최소화하는 방향으로 가중치 값을 수정합니다.

최적화 함수가 어떤 방식으로 오차를 최소화하는지를 보다 자세히 살펴보겠습니다. 여기에 주로 쓰이는 경사 하강법(gradient descent)은 오차를 가중치로 미분해서 구해지는 기울기(gradient)와 학습률(learning rate)[4]을 활용합니다. 목적지(최소 오차)로 가는 방향(기울기)으로 정해진 보폭(학습률)만큼 가중치 값을 수정하며 오차를 줄여나갑니다.

일반적으로 모델이 전체 학습 데이터를 한 번씩 본 것을 두고 ‘1 에폭(epoch)[5]을 돌았다’고 표현합니다([그림 2]). 여기서 핵심은 한차례의 훈련, 즉 가중치를 한 번 업데이트하는 데 한 개 이상의 훈련 데이터를 사용하는 부분입니다. 이 데이터 집합을 바로 배치(batch)라고 합니다. 그리고 이 집합에 포함하는 데이터의 양을 배치 크기라고 부릅니다. 배치 크기는 모델 훈련에서 개발자가 직접 조정해야 하는 중요한 값 중 하나로 잘 알려져 있습니다. 이에 지금부터 배치 크기가 모델 훈련에 어떤 영향을 미치는지 살펴보고자 합니다.

[ 그림 2 ] 에폭은 주어진 훈련 데이터를 모두 소진하는 구간을 의미하며, 배치 크기는 훈련 한 번에 사용하는 데이터의 수를 가리킨다. 배치 크기에 따라 에폭 당 훈련 횟수가 달라질 수 있다.

먼저 배치 크기와 모델 훈련 시간의 관계부터 살펴보겠습니다. GPU로 데이터를 병렬 처리한 덕분에 배치 크기와 관계없이 모델을 한 번 훈련하는 데 걸리는 시간이 늘 같다고 가정한다면, 훈련 횟수를 줄여야 모델의 훈련 시간을 단축할 수 있습니다.

예시를 들어보죠. 100개의 데이터가 있을 때 배치 크기가 1이면 모델은 1 에폭당 100번 훈련합니다. 배치 크기가 10이면 10번의 훈련, 배치 크기가 100이면 1번 훈련합니다. 80 에폭을 기준으로 한다면 배치 크기가 1이면 총 훈련 횟수는 8,000번, 배치 크기가 100이면 총 훈련 횟수는 80번이죠. 앞서 말한 가정을 전제로 한다면, 배치 크기를 키운 만큼 훈련 시간을 줄일 수 있다는 점을 충분히 추론해볼 수 있습니다.

배치 크기가 안정적인 학습에 미치는 영향(학습 곡선)에 대해서도 알아보겠습니다. 학습 곡선은 오차를 최소화하는 경로 탐색과 관계가 있습니다. 딥러닝에서는 입력 데이터[6]가 전체 훈련 데이터의 성질을 대표한다고 가정합니다. 이 관점에서 보자면, 한 배치에 포함되는 데이터가 전체 훈련 데이터를 얼마나 잘 표현하느냐, 즉 오차를 제대로 된 방향으로 최소화(기울기)하는지에 따라 학습 안정성이 결정된다고 할 수 있겠습니다. 기울기가 실제 최적화 탐색 경로에서 크게 벗어나면 모델은 불안정적으로 데이터를 학습합니다. 반대로 기울기가 실제 최적화 탐색 경로와 비슷하면 모델은 안정적으로 데이터를 학습합니다. 따라서 이 글에서는 배치 크기에 따른 탐색 경로를 설명하고자 합니다.

데이터셋 크기가 N, 배치 크기가 1이라는 극단적인 예시를 들어보겠습니다. 이 방식에서 최적화 함수는 하나의 학습 데이터마다 오차를 계산하며 모델의 가중치를 1 에폭당 N번 갱신합니다(stochastic gradient descent, SGD). 각각의 데이터를 상대로 학습이 매우 꼼꼼하게 이뤄집니다. 하지만 그 반대급부로 전체 훈련 데이터의 분포에서 비정상적으로 떨어진 특이값(outlier)에 따라 가중치 업데이트에 큰 편차가 발생할 수도 있습니다. 특이값에 의해 구해지는 기울기가 실제 최적화 탐색 경로를 크게 벗어나기 때문입니다.

[ 그림 3 ] 1 에폭을 기준으로 했을 때, 배치가 클수록 기울기 방향이 더 안정적으로 작은 손실을 내는 가중치 조합을 찾아감을 확인해볼 수 있다.

앞 사례와는 반대로 배치 크기를 최대로 키우면 어떻게 될까요? 주어진 데이터 수만큼 배치 크기를 늘려볼 수 있을 것입니다. 이 방식에서 최적화 함수는 N개의 데이터를 상대로 오차를 계산하며 모델 가중치를 1 에폭당 1번 갱신합니다(batch gradient descent, BGD).[그림 3]에서 보듯이, 주어진 모든 훈련 데이터의 평균 특성을 파악함으로써 한번의 훈련만으로 최적의 가중치 조합을 제대로 찾아간다고 추론해 볼 수 있습니다.

정리하자면, SGD는 에폭당 여러 번 가중치 업데이트를 진행하며, 그로 인해 최적화 탐색 경로가 불안정할 수 있습니다. 반면 BGD는 에폭당 가중치를 한 번 업데이트하며 이 덕분에 최적화 탐색 경로가 안정적입니다. 결과적으로 두 방식 다 같은 지점으로 최적화가 이루어집니다([그림 3]). 여기에 GPU 병렬 연산을 가정한다면, 배치 크기가 클수록 최종 성능에 도달하는데 걸리는 총 훈련 시간은 줄어듭니다. 따라서 보다 빠르게 최적의 성능에 도달할 수 있다는 이유로 배치 크기는 클수록 좋다는 결론을 도출할 수 있습니다.

배치 크기의 딜레마

하지만 현실은 다릅니다. 배치 크기가 큰 상황에서는 모델 최적화(optimization)와 일반화(generalization)가 어렵기 때문입니다. 

서두에서 최적화 함수의 역할은 손실 함수 그래프에서 오차를 최소화하는 가중치 탐색이라고 설명했습니다. 따라서 오차를 최소화하는 가중치를 찾기가 쉽지 않은 상황을 최적화가 어렵다는 의미로 보시면 됩니다. 좀 더 구체적으로 설명하면 다음과 같습니다.

만약 오차가 극소값(local minimum)[7]에 해당한다면 더는 학습이 일어나지 않게 됩니다. 어느 방향에서는 극대값(local maximum)[8]이나 다른 방향에서는 극소값이 되는 지점인 안장점(saddle point)에서도 마찬가지입니다. 하지만 경사 하강법을 사용할 때는 이 극소값과 안장점이 최소값이 아니라는 사실을 분간할 수 없고, 실제로는 오차를 더 줄일 수 있는 여지가 있음에도 불구 학습이 중단되게 됩니다.

[ 그림 4 ] 최소값임을 보장할 수 없는 극소값 또는 안장점 근처에서 학습이 진행된다고 가정해보자. 배치 크기가 큰 상황에서는 이 구간을 빠져나오기가 어렵다. 반면, 배치 크기가 작을 때는 이 구간에서 빠져나오기가 훨씬 수월하다.

실제 학습이 극소값 또는 안장점 근처에서 진행되고 있다면 그래프상 점의 방향은 본래 구간을 벗어나 최소값이 존재하는 구간으로 옮겨져야 합니다. 하지만 앞서 설명한 대로 배치 크기가 큰 상황에서는 오차가 최소값이 아닌 극점에 빠져버린 상황을 벗어나기가 어렵습니다. 오차를 최소화하는 방향이 이미 정해졌을 확률이 크기 때문입니다. 이런 상황에서는 [그림 4]에서처럼 배치 크기가 작을수록 좋습니다. 특이값 데이터로 인해 실제와는 다른 방향의 기울기가 구해지면 가중치 값이 급격하게 변할 가능성이 커지기 때문이죠.

일반화가 어렵다는 건 학습 데이터와 조금이라도 다른 성격의 데이터를 입력받으면 모델이 제대로 동작하지 않을 가능성이 높은 상황을 가리킵니다. 한 연구 논문은 큰 배치 크기로 훈련한 모델을 입력받은 손실 함수의 값(오차)이 그래프 내 경사가 상대적으로 급격하게 변하는 구간의 최소값(sharp minimum)으로 수렴한다는 사실을 실험적으로 확인했습니다([그림 5]). 이렇게 되면 테스트 시 오차는 입력 데이터에 따라 매우 큰 폭으로 변하게 됩니다.

[ 그림 5 ] 큰 배치로 훈련한 모델을 입력받은 손실 함수의 값(오차)이 곡선의 경사가 상대적으로 가파르게 변하는 구간으로 수렴하는 경향이 있다.

따라서 적절한 배치 크기 탐색은 모델 훈련에서 매우 중요한 과업 중 하나라고 볼 수 있습니다(mini-batch gradient descent, MGD). 보통 연구 초반에는 기준 모델(baseline model)이나 해당 연구 도메인에서 자주 사용하는 배치 크기를 기준으로 다양한 실험을 통해 최적의 값을 탐색합니다. 이미지 인식에 사용되는 CNN(convolutional neural networks)을 응용한 대표 알고리즘인 VGG, ResNet, DenseNet 등을 소개하는 논문에서 배치 크기를 256으로 사용하는 건 바로 이런 이유에서입니다.

[ 그림 6 ] 배치 크기에 따라 오차를 최소화하는 방향을 그려낸 이미지다. SGD에서는 학습이 불안정하게 이뤄짐을 확인할 수 있다. 반면, GBD에서는 보다 학습이 안정된 형태로 이뤄짐을 볼 수 있다. © deeplearning.ai


LARS의 핵심 ‘어댑티브 학습률’

수많은 GPU를 가지고 대규모 데이터셋을 빠르게 훈련해 그 결과를 확인하기 위해서는 큰 배치 크기에서의 학습이 작은 배치 때와 유사한 학습 곡선을 그릴 수 있음을 확인할 수 있어야 합니다.

이와 관련된 많은 연구에서는 적절한 학습률을 적용하는 방식으로 배치 크기가 큰 상황에서 발생하는 문제를 해결하는 데 집중하고 있습니다. 딥러닝 모델 훈련에서는 적절한 배치 크기를 설정하는 것만큼 학습률 탐색도 중요하기 때문입니다. [그림 7]에서처럼 학습률을 지나치게 작게 잡으면 최종 성능에 이르는 데 걸리는 학습 시간이 굉장히 오래 걸릴 뿐만 아니라 최소값이 아닌 극소값에 빠지는 문제가 발생합니다. 반면, 학습률이 지나치게 크면 입력층으로 갈수록 전파되는 오차가 되려 폭증하는 현상으로 인해 최소값을 지나칠 수 있죠.

[ 그림 7 ] 딥러닝 모델에서 적절한 배치 크기를 선택하는 일만큼 학습률 탐색도 중요하다.

구글(Google)은 배치 크기를 키운 만큼 학습률도 키워야 기존과 비슷한 정확도와 학습 곡선을 얻을 수 있다고 주장합니다. 이는 큰 배치 크기에서 구하는 기울기 방향을 신뢰할 수 있다는 가정에 기반을 둡니다. 그런데 학습 초반에는 랜덤값으로 가중치를 초기화한 상태에서는 가중치가 매우 큰 폭으로 바뀝니다. 이로 인해 기울기 방향을 신뢰할 수 없는 학습 초반에는 구글의 방식이 유효하지 않게 됩니다.

이런 이유로 페이스북(Facebook)은 큰 배치를 이용한 학습 초반에는 학습에 큰 영향을 주지 않을 정도로 작은 학습률을 사용했습니다. 그리고 기울기 방향을 신뢰할 수준에 이를 때까지 학습률을 서서히 키웠습니다. 이 수준에 이른 이후에는 배치 크기를 키운 만큼 학습률을 키웠습니다. 그 결과, 큰 배치 크기에서도 모델의 일반화 성능을 유지하는 데 성공했습니다. 하지만 이 방식에도 한계는 있습니다. 이미지넷을 기준으로 배치 크기가 16K 이상 커지면 잘 동작하지 않았기 때문입니다.

지난 2017년 엔비디아(NVIDIA)가 발표한 LARS의 특징은 층별로 학습률을 조정하는 데 있습니다. 층마다 가중치와 기울기의 비율이 제각기 다른 상황에서 같은 학습률 변화량을 전체 층에 일괄적으로 적용하는 부분에 문제가 있을 거라 판단하고 연구에 착수했습니다.

엔비디아 연구진은 구글이 제안한 방식대로 배치 크기를 키운 만큼 학습률을 키워서 훈련을 진행할 때 각 층의 가중치 노름(norm)[9]/기울기 노름의 비율인 R을 측정했습니다. 그 결과, 이 비율이 1보다 작은 층에서는 학습이 불안정한 현상이 일어남을 발견했습니다. 이는 가중치 갱신량이 본래 가중치 크기에 비교했을 때 비정상적으로 커서 발생한 문제라 추론해볼 수 있습니다. 반대로, 이 비율이 1보다 큰 층에서는 훈련이 잘 이뤄지지 않는 현상이 일어났습니다. 앞선 현상과는 달리 가중치 갱신량이 본래 가중치 크기에 비교했을 때 비정상적으로 작기 때문이죠.

이런 측정 결과를 토대로 엔비디아는 가중치를 업데이트하기 전 R을 계산하는 최적화 함수를 구성했습니다. 비율 R이 1보다 큰지, 작은지를 보고 학습률을 그만큼 키우거나 줄이는 식인 거죠. 결과적으로 최적화 함수는 층별 가중치 크기에 따른 적합한 갱신량을 고려하게 됩니다.

엔비디아 연구진은 기존 연구에서 사용된 것(256)보다 훨씬 큰 배치 크기를 가지고 ResNet-50 모델로 이미지넷을 훈련할 때 LARS를 활용했습니다. 그 결과, [그림 8]에서처럼 배치 크기가 16K[10]일 때(초록색)와 32K일 때(파란색)의 학습 곡선은 배치가 256인 크기일 때(하늘색)와 유사한 학습 양상을 확인할 수 있었습니다.

박 연구원은 “페이스북은 논문에서 배치 크기를 최대 8K로 키웠을 때 성능 저하가 거의 없었으나, 배치 크기가 16K보다 커지면 학습이 잘 이뤄지지 않는다고 언급한 바 있다”며 “이보다 4배나 더 큰 배치 크기로도 유효한 결과를 냈다는 점에서 엔비디아의 연구는 의미가 있다고 볼 수 있다”고 설명했습니다.

[ 그림 8 ] LARS를 이용해 큰 배치 크기(32K)를 설정하고 ResNet-50 모델로 이미지넷 학습을 진행해본 결과, 기존 연구에서 사용된 것(256)과 유사한 학습 양상을 보이면서도 더 빠른 훈련이 가능했다. © 엔비디아

또한 LARS는 작은 배치를 활용한 학습과 비교했을 때 훈련 시간을 대폭 축소하는 데 성공했습니다. 256 크기의 배치를 사용할 때는 학습을 5,000번 반복해야 1 에폭을 달성할 수 있었다면, 32K 크기의 배치에서는 40번 정도만 학습을 반복해도 1 에폭에 도달합니다. GPU의 성능과 메모리가 큰 배치를 수용할 정도로 충분하며 분산 학습에 따르는 비용이 없다고 가정했을 때, 배치 크기를 키우는 것만으로도 수십 배까지 더 빠르게 최종 성능에 도달하는 거죠. 다만 물리적 제약이 따르는 실제 계산 환경에서는 60시간에서 14시간으로 약 4.2배 정도 훈련 시간이 단축됨을 확인할 수 있었습니다.

다시 정리하자면, 실험을 통해 LARS를 이용해 배치 크기를 키우면 최고의 성능을 내는 모델을 더 빠르게, 안정적으로 만들 수 있음을 알 수 있습니다.


torchlars 코드 구현의 핵심은

CNN 모델 평가에 주로 쓰이는 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)[11] 2012의 데이터 수는 128만 장에 이릅니다. AutoLearn 연구팀은 이처럼 방대한 학습 데이터를 활용하는 딥러닝 태스크를 수행하면서 자연스럽게 큰 배치를 활용한 효율적인 태스크를 진행하면서 자연스럽게 대규모 학습에 관심을 두게 됐습니다. 이에 AutoLearn 연구팀은 LARS를 활용한 대규모 학습을 위해 파이토치용 라이브러리를 제작하기로 했습니다.

박천명 연구원은 프로젝트 착수에 앞서 LARS를 구현한 기존 코드의 문제 파악에 힘썼습니다. 가장 먼저 프로파일링 도구(NVIDIA Nsight Systems)[12]를 이용해 GPU 병목 현상의 발생 여부를 파악하고, 그 원인을 분석하는 작업을 진행했습니다.

앞에서 LARS는 층별 가중치와 기울기의 노름 비율인 R을 참조해 해당 층에 적절한 학습률을 계산한다고 설명했습니다. 문제는 가중치 노름이 0이면 해당 층의 학습률도 0이 되어 가중치 업데이트가 이뤄지지 않는 데 있습니다. 기울기 노름이 0이면 ‘0으로 나누기’가 되어 학습에 오류가 발생하는 것도 문제입니다.

가장 많이 알려진 오픈소스 코드 ‘pytorch-lars’에서는 SGD 이외의 최적화 함수에는 LARS를 적용할 수가 없습니다. 엔비디아 논문에서처럼 SGD와 일체형의 LARS를 구현했기 때문입니다. 아울러 앞에서 언급한 벡터 크기가 0인지를 확인하는 예외 케이스 구문이 구현하지 않았죠.

다행히 엔비디아에서 내놓은 LARC에는 해당 코드에서는 두 벡터가 모두 0이 아닌 상황에서만 층별 학습률을 구할 수 있도록 하는 코드([그림 8])를 추가됐습니다. 그런데 해당 코드 부분이 CPU에서 연산됨에 따라 CPU와 GPU의 데이터를 불필요하게 동기화하는 현상이 발생했습니다. 좀 더 자세히 설명하자면 다음과 같습니다.

[ 그림 9 ] LARC은 가중치 노름과 기울기 노름이 모두 0이 아닐 때만 층별 적절한 학습률 값을 구하는 조건부를 추가했다.

‘if norm != 0’이라는 코드 실행을 위해 CPU는 메인메모리에 저장된 노름이 가리키는 주소값을 확인하고, 그 주소에 저장된 값을 가져옵니다. 그 후 CPU는 노름값이 0인지 아닌지 확인하고 나서 다음 코드를 실행하죠. 문제는 코드가 GPU에서 동작하며, 노름의 실제 데이터는 GPU 메모리에 존재한다는 데 있습니다. 그래서 GPU에 저장된 데이터를 메인메모리로 복사하는 동기화 작업이 발생했던 거죠.

또한, LARC에 구현된 최적화 함수는 오류를 유발할 가능성이 큽니다. 파이토치에 정의된 최적화 함수 클래스를 상속받지 않아 가중치 갱신에 필요한 모든 작업이 구현되지 못했기 때문이죠.

이에 AutoLearn 연구팀은 올해 7월부터 약 두 달간 CPU와 GPU 동기화 문제를 해결하는 한편, 다른 최적화 함수에도 LARS를 쉽게 적용할 방안을 탐색했습니다.

[ 그림 10] torchlars는 기존의 최적화 함수를 감싸는 형태를 지닌다. 가장 먼저 최적화 함수가 보유한 가중치, 기울기 정보를 이용해 층별 학습률을 계산한다. 그런 뒤 층별 학습률과 함께 최적화 함수를 동작시킨다. © 박천명 연구원

AutoLearn 연구팀은 가장 먼저 CPU와 GPU 메모리 동기화 문제를 해결하고자 가중치와 기울기의 벡터 크기가 0인지 확인하는 부분을 GPU에서 동작할 수 있도록 했습니다. 그 결과, 노름의 데이터가 GPU에 있는 메모리에 존재하면 메인메모리로 복사하는 작업을 생략하고 GPU에서 바로 비교작업을 진행한 후에 다음 코드를 진행할 수 있게 됐습니다.

CPU와 GPU의 동기화 이슈를 해결한 이후에는 C++[13]/CUDA[14] 확장 기능을 활용한 개발을 통해 불필요한 연산을 줄였습니다. 층에 적합한 학습률은 [그림 9]의 세번째 줄에서처럼 덧셈(+), 곱셈(×), 나눗셈(÷)의 연산을 이용해 계산합니다. 노름 값은 GPU 메모리에 텐서(tensor)[15] 형태로 존재합니다. 이에 층에 적합한 학습률을 계산하기 위해서는 각 연산을 정의한 커널(kernel)[16] 함수를 매번 호출해야 합니다. 스칼라(scalar)[17]에 해당하는 노름을 활용해 층별 학습률을 계산하고자 다중 차원 행렬 간의 병렬 연산을 준비하는 과정[18]을 배보다 배꼽이 더 큰 상황에 비유해볼 수 있습니다. 이에 AutoLearn 연구팀은 하나의 커널 함수에서 스칼라 연산을 한꺼번에 진행할 수 있도록 torchlars를 구현했습니다.

아울러 AutoLearn 연구팀은 [그림 11]에서처럼 다른 최적화 함수를 매개변수로 받아 가중치 갱신 작업이 진행될 수 있도록 했습니다. LARC에서 제안한 방식대로 사용자가 자신이 만든 기존 모델에 LARS를 손쉽게 적용할 수 있도록 했죠.

[ 그림 11 ] torchlars 코드 일부

그 결과, AutoLearn 연구팀은 LARS의 재현이 성공적으로 이뤄졌는지 확인하고자 논문에서의 실험과 동일하게 SGD만을 사용해 모델 학습의 성능을 측정했습니다. 그 결과, 훨씬 큰 배치 크기에서 ResNet-50 모델로 이미지넷을 학습할 때 torchlars를 적용하면 LARS처럼 안정적이면서도 빠르게 최고 성능에 도달함을 확인해볼 수 있었습니다.

AutoLearn 연구팀은 추가 실험을 통해 ResNet-50 모델로 CIFAR-10을 학습할 때도 torchlars를 사용하면 기존 LARS 구현 코드와 비교해 에폭당 학습 속도가 46%로 감소한 사실을 확인했습니다. 이는 CPU와 GPU의 데이터 동기화로 인한 병목 현상을 해소하고자 GPU에서 동작하는 코드를 추가하고, 층별 학습률 계산 과정을 하나의 스칼라 연산으로 압축한 게 주효했던 것으로 분석됩니다. 이 결과는 깃허브에서 확인할 수 있습니다.

[ 그림 12 ] AutoLearn 연구팀이 고안한 torchlars는 엔비디아가 논문에서 제시한 실험과 동일하게 최적화 함수로 SGD만을 활용해 모델을 훈련했다. 그 결과 LARS와 비슷한 성능과 학습 곡선을 달성했다.

박천명 연구원은 “배치 크기를 키운 대규모 학습에서는 계산 요소의 최적화 여부가 전체 시스템 동작에 큰 영향을 미친다는 점에서 torchlars는 비교적 LARS를 최적화한 코드라고 볼 수 있다”며 “torchlars가 LARS를 이용해 대규모 학습을 진행하는 연구와 프로젝트에 도움이 되길 바라며, 더 나아가 이번 프로젝트가 딥러닝 시스템 최적화 이슈에 많은 관심을 불러일으키는 좋은 사례가 될 수 있으면 좋겠다”고 밝혔습니다.


참고
[1] 파이썬(Python) 기반 딥러닝 라이브러리
[2] 학습 진행과정에 따라 훈련 정확도 또는 오차를 그래프로 나타낸 곡선
[3] 모델 예측이 얼마나 잘못되었는를 나타내는 지표
[4] 학습 한 번에 가중치를 얼마나 갱신할지를 정하는 매개변수
[5] 주어진 훈련 데이터를 여러번 반복해서 보는 횟수를 가리킨다. 에폭을 늘리면 모델의 성능이 좋아진다. 하지만 특정 구간에 이르면 모델의 성능은 더 좋아지지 않는다. 반복학습을 거쳐 주어진 모델과 학습 전략에서 찾을 수 있는 가장 최소의 오차를 내는 것으로 예상되는 가중치 집합을 찾았기 때문이다.
[6] 이 문서에서는 전체 학습 데이터를 모집단으로 삼는 표준집단으로 한정하고 있다.
[7] 주위의 모든 점의 함수값 이하의 함수값
[8] 주위의 모든 점의 함수값 이상의 함수값
[9] 벡터의 크기를 나타내는 단위. 여기서는 L2 노름, 즉, 유클라리안 거리를 활용한다.
[10] 1,000을 나타내는 킬로(kilo)를 줄여서 표현한 것
[11] 대용량 영상을 분류하고 객체를 검출하는 연구를 활성화하려는 목적으로 2010년 시작된 워크샵이다. 2012년도 이후로 성적이 좋은 상위팀은 대부분 CNN 기반 기법을 이용했고, 2015년도 대회에서 우승한 마이크로소프트 리서치(Microsoft Research)의 ResNet은 1,000개의 클래스로 분류하는 문제의 top5 오차율을 3.54%까지 낮추었다.
[12] GPU가 언제 어떻게 일하는지를 측정해 이를 타임라임으로 시각화해주는 도구
[13] 대표적인 저수준 프로그래밍 언어로, 파이토치에서 성능 이슈가 있는 대부분의 라이브러리를 구현할 때 사용한다.
[14] 엔비디아가 제공하는 GPU 프로그램 작성용 C/C++ 라이브러리로, GPGPU(GPU에서의 범용 계산)를 위한 병렬처리 코드 작성에 사용한다.
[15] 파이토치에서 데이터를 표현하기 위해 제공하는 객체 타입. 스칼라부터 다중 차원 행렬까지 표현이 가능하다
[16] GPU에서 동작하는 함수
[17] 하나의 값. 여기서는 파이토치의 0차원 텐서를 말한다.
[18] 대부분의 파이토치 GPU 연산은 각 피연산자 텐서들의 차원 정보를 기반으로 연산이 진행될 수 있는지 확인하고, 적절한 쓰레드 개수와 블럭 개수를 결정하는 작업을 선행한다. 일반적으로 이 작업은 다중 차원 행렬 간의 연산을 고려한 과정으로 스칼라 연산에서는 불필요하다.
이 글을 쓴 사람들
samantha.lee
이수경 | 글,정리
지난 2016년 3월 알파고와 이세돌 9단이 펼치는 세기의 대결을 취재한 것을 계기로 인공지능 세계에 큰 매력을 느꼈습니다. 인공지능을 알고 싶어하는 사람들을 위한 콘텐츠를 쓰고자 카카오브레인에 합류했습니다. 현재는 분야별 인공지능 전문가와 함께 기술 콘텐츠를 생산하는 재미에 푹 빠져 있습니다. 인공지능을 만드는 사람들의 이야기와 인공지능이 바꿀 미래 사회에 대한 글은 누구보다 쉽고, 재미있게 쓰는 사람이 되고 싶습니다.
chuniee.park
박천명 | chunmyong.park@kaist.ac.kr
세상을 바꾸는 기술을 공부하고 싶다는 마음으로 인공지능을 공부하기 시작했습니다. 카카오브레인에서 인턴 프로그램을 통해 짧게나마 기업에서의 딥러닝 연구를 경험할 수 있었습니다. 좋은 세상을 만드는데 일조하는 연구자가 되고자 현재 대학원에서 열심히 공부하고 있습니다.