🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

Mini-batch GD와 역전파 시 Gradient 계산 횟수관계에 대한 질문입니다.

21.09.02 12:39 작성 조회수 328

0

안녕하세요 선생님! 이제 선생님 강의만 듣게 되네요 ㅎㅎ 이번에도 좋은 기초 강의 감사인사 드립니다!(최근에 Object Detection 강의 업데이트한 부분도 너무나 감사드려요! 강의를 이렇게 유지보수 해주시는 분은 처음 뵌 것 같네요 :) )

본론으로 들어가 질문 한 가지만 드릴게요! 강의 초반부에 (Batch) GD, SGD, Mini-batch GD 개념에 대해 소개하시면서 세 개의 구분하는 큰 특징이 Gradient를 한 번 계산할 때의 데이터 개수라고 알고 있습니다!(예를 들어, Gradient를 1번 계산할 때 데이터 1개를 이용하면 SGD, 모든 데이터를 이용하면 (Batch) GD 인 것 처럼요!) 

그렇다면 역전파를 수행할 때 Gradient를 계산하게 되는데, SGD 같은 경우는 데이터 1개 니까 1개를 학습시키고 1번의 역전파를 수행하는 것은 직관적으로 이해가 갑니다! 그런데 데이터를 한꺼번에 집어넣은 (Batch) GD 또는 특정 몇 개만 입력시키는 Mini-batch GD같은 경우는 Gradient가 어떻게 계산되서 업데이트 되는지 잘 체감이 안되더라구요! 

예를 한 가지 들어보겠습니다! SGD와 batch_size=32 인 GD를 사용할 때 3가지 케이스를 들어보겠습니다.

1. SGD를 사용한 경우, 데이터 1개의 순전파가 수행되고 역전파가 수행되면 w_old -> w_new 로 업데이트됩니다.

2. batch_size=32인 GD인 경우, 데이터 32개의 순전파 즉, 32번의 순전파가 모두 수행된 후 한 번의 역전파를 수행해서 w_old -> w_new로 한 번만 업데이트 되는 건가요? 아니면 데이터 32개 안에서도 하나씩 차례로 [1번째 데이터 순전파 수행 -> 1번째 역전파 수행 -> w_old 에서 w_new1로 업데이트]  그리고 [2번째 데이터 순전파 수행 -> 2번째 역전파 수행 -> w_new1 에서 w_new2로 업데이트] , ....(32번째까지 반복) ..... [32번째 데이터 순전파 수행 -> 32번째 역전파 수행 -> w_new31 에서 w_new32로 업데이트 후 batch_size=32 GD 수행 종료]  이런식으로 되나요? 결국, batch_size=32라고 해서 32개의 데이터가 동시에(한 번에) 학습되는 것이 아닌 어쨌건 32개 데이터라는 batch_size안에서도 차례차례로 32번의 순차적인 [순전파->역전파] 과정이 수행되는 것인가요?

혹여나 질문이 이해가 잘 안가신다면 답글 남겨주시면 제가 보충 질문설명 드리도록 하겠습니다!

답변 1

답변을 작성해보세요.

1

안녕하십니까, 

이렇게 좋은 칭찬을 해주셔서 몸들바를 모르겠습니다. 

먼저 Gradient는 Weight를 update하는 것입니다. 이 Weight가 update되면 전체 학습 데이터에 해당 weight를 적용하여 예측값을 생성하고, 전체 학습 데이터와 이 예측값의 차이를 기반으로 loss를 계산하게 됩니다. SGD의 경우 전체 데이터에서 한개의 샘플 데이터를 이용해서 Gradient를 계산하지만 이렇게 계산된 Gradient로 weight가 update되고 이 weight가 전체 데이터에 적용되어서 출력을 하게 됩니다. 

미니 배치 역시 마찬가지 입니다. 전체 학습데이터 중에 batch size만큼의 학습 데이터를 이용해서 Gradient를 계산하고, 이를 이용해서 weight를 update시킵니다. 그리고 이렇게 update된 weight를 전체 학습 데이터에 적용하여 예측 값을 생성하고, 다시 이를 전체 학습데이터와 비교해서 loss를 계산하게 됩니다. 

SGD든, 미니 배치든 Weight가 전체 데이터에 적용되어서 출력되는 것은 동일합니다. 다만 SGD의 경우는 Weight update 계산을 한개의 sample 데이터로, 미니 배치는 여러개의 sample 데이터로 계산하는 것이 다를 뿐입니다. 

혹 생각하신것과 다른 대답이면 다시 업데이트 부탁드립니다. 

감사합니다. 

답변 감사드립니다! 선생님께서 말씀하시는 바는 정확히 이해했습니다! 그런데 제가 궁금한 부분은 선생님이 답변 주신 것 중 마지막 문단이라고 할 수 있을 것 같습니다! 즉, Weight가 업데이트될 때 한 개의 데이터를 이용하는 것은 직관적으로 이해가 됩니다. 그런데 여러개의 데이터(mini-batch 사이즈 만큼)를 사용해서 Weight가 업데이트된다고 할 때, 여러개의 데이터를 한 번에(동시에) Weight를 업데이트하게 되는 게 아닌 실질적으로는 여러개의 데이터라도 그 안에서 한 개의 데이터를 기반으로 업데이트하고 또 한 개의 데이터 기반으로 업데이트하고, ...(반복)하는 과정인건가요? 

예를 들어, batch_size=10이라고하면 10개의 샘플 데이터 안에서 "10개 중 1번째 샘플 데이터로 업데이트 -> 10개 중 2번째 샘플 데이터로 업데이트 -> ... -> 10개 중 10번째 샘플 데이터로 최종 업데이트"  하는 과정으로 이루어지나요?

미니 배치만큼의 데이터로 update를 하는게 아니라 미니배치만큼의 데이터를 기반으로 전체 데이터에 적용할 weight의 update값을 계산합니다. weight는 전체 데이터(feature 데이터)에 적용합니다.

그리고 이 weight는 기존 weight에서 update를 하면서 계속 갱신이 되는데, 이때 갱신을 시키는 값을 계산할 때 미니 배치 만큼의 데이터만 샘플로 추출해서 실제값과 예측값의 차이를 기반으로 weight를 update 하게 됩니다. 이렇게 update된 weight를 전체 데이터에 적용하는 것입니다. 

아하.. 답변 감사합니다! "미니 배치만큼의 데이터로 update 하는 것" 으로 착각했다는 것을 깨닫게 됐습니다! 항상 자세한 답변 감사드립니다 ㅎㅎ

채널톡 아이콘