데이터 로드와 미니 배치 경사 하강법
이번에는 경사하강법(gradient descent)를 미니 배치로 실행하는 방법과 데이터 로드에 대해 알아보도록 하겠습니다.
우리가 이때까지 배운 경사 하강법은 전체 데이터에 대해서 경사하강법을 실행하는 경사하강법입니다.
하지만 여러분이 프로젝트를 하시거나 기업과제나 현업을 가시게 된다면 적게는 몇 만개~몇 십만개의 데이터를 다루고 해당 데이터에 대해 경사하강법을 사용하여 weight를 최적화 시키시게 될 겁니다.
근데 만약 몇 만개~몇 십만개의 데이터 전체에 대해 경사하강법을 하게 된다면 경사하강법 한번을 실시하는데 있어서 굉장히 오랜 시간이 걸리게 될 것이고 엄청난 연산량과 메모리가 필요해서 결국에는 진행이 불가능하게 될 것 입니다.
이러한 단점을 보완하고자 나온 것이 바로 미니 배치 경사 하강법입니다.
그럼 미니 배치 경사하강법을 다루기 전 epoch,batch size ,iteration에 대해 다루고 가보도록 하겠습니다.
Epoch, batch size, iteration
위의 그림을 참고해서 설명을 하도록 하겠습니다.
정말 쉬우니 여러분들도 이해가 쉽게 되실 겁니다. 그리고 batch size에 대해서는 초반에 자세하게 다루었으니 더 쉬울 것 입니다.
위의 그림은 총 데이터가 700개인 데이터를 100개 단위로 쪼개어 7개로 나누어진 데이터 그림입니다.
- Epoch이란?
위의 그림을 예시로 설명을 하겠습니다.
위의 그림에서는 총 데이터가 700개라고 하였습니다.
그럼 1 Epoch은 전체 데이터 700개에 대해 1번 학습을 다 완료 하였을 때 1 Epoch이라고 합니다.
더 쉽게 말하자면 우리가 고등학교에 다닐 때 학교 선생님들께서는 수능을 잘보기 위해서는 수능 특강을 뺑뺑이 돌리라고 말씀하십니다.
이 때 이 수능 특강을 1번 전체 돌리는 것이 1 Epoch이 되는 겁니다.
그럼 수능 특강 5번을 돌리면 5 Epoch이 되는거구요.
이렇게 데이터 전체를 학습하는 것을 Epoch이라고 합니다.
- Batch size
이 부분은 앞에서 자세하게 다루었기 때문에 간단하게 넘어 가도록 하겠습니다.
위의 그림에서는 총 700개의 데이터를 100개 단위로 잘라 놓았습니다. 여기서 100개 단위가 바로 Batch size입니다.
데이터가 너무나도 크기 때문에 데이터를 나누기 위해서 나누는 단위(기준)을 세우는 것을 Batch size입니다.
위의 그림에서는 100개 단위로 데이터를 잘라 놓았기 때문에 Batch size=100이 되겠네요.
- Iteration
우리가 총 700개의 데이터를 100개 단위로 잘라 놓았습니다.
그럼 여기서 100개 단위의 데이터는 몇개가 생성이 될까요?
바로 7개입니다. 이게 바로 iteration인데요
전체 데이터를 batch size로 나눈 뒤 나온 개수가 바로 iteration입니다.
총 정리를 하자면 위의 예시에선 총 700개의 데이터를 한번 학습하는 것을 1Epoch, 총 700개의 데이터를 100개 단위로 나눌때 batch size=100으로 표현이 가능하며, 총 700개의 데이터를 100개 단위로 나누었을 때 7 iteration이 나오겠네요.
그럼 본격적으로 미니 배치 경사 하강법에 대해 알아보도록 합시다.
아래는 다중 선형 회귀때 우리가 예시로 사용했던 예제 코드입니다.
해당 코드의 독립 변수 x에 대해 보면 3x5 크기의 feature가 3이고 샘플이 5인 훈련용 데이터 x입니다.
x_train=torch.FloatTensor([[73,80,75],
[93,88,93],
[89,91,90],
[96,98,100],
[73,66,70]])
y_train=torch.FloatTensor([[152],[185],[180],[196],[142]])
그럼 샘플이 총 5개의 샘플이 있기 때문에 우리는 샘플을 1개 단위로 나누어서 총 5개의 미니 배치로 아래의 그림과 같이 나눌 수 있습니다.
미니 배치 경사 하강법에서는 3x5크기의 전체 데이터에 대해 경사 하강법을 진행하는 것이 아닌 미니 배치 한개를 꺼내가서 3x1크기의 미니 배치 한개에 대해 경사 하강법을 진행하여 loss를 계산하고 weight를 수정한 뒤 다음 미니 배치를 꺼내가서 해당 미니 배치에 대해 경사 하강법을 진행하는 방식입니다.
위의 예제 데이터로 미니 배치 경사하강법을 진행하게 된다면 미니 배치가 5개이기 때문에 총 5번의 미니 배치 경사하강법을 진행합니다.
커스텀 데이터셋을 이용해보기
이번에는 파이토치에서 제공하는 torch.utils.data.Dataset과 torch.utils.data.DataLoader를 사용하여 미니 배치 경사하강법, 데이터 셔플, 병렬처리를 해보도록 합시다.
커스텀 데이터셋을 활용하는 방법입니다.
먼저 Dataset을 상속받는 커스텀데이터셋 클래스를 선언해주도록 합시다.
init함수 부분은 데이터 셋을 전처리 해주는 부분입니다.
len함수는 데이터셋을 받아와 데이터셋의 길이와 샘플의 수를 리턴을 해줍니다.
getitem함수는 특정 index를 받아 해당 index의 데이터를 Tensor화 시켜 x,y변수에 저장 시킨 뒤 x,y를 리턴해주는 함수입니다.
그 외에는 똑같지만 여기서 자세히 여겨 봐야하는 코드는 바로
for batch_idx, samples in enumerate(dataloader)
이 부분입니다.
해당 코드를 통해서 데이터 로더를 통해 미니배치 단위로 데이터를 가져와 미니 배치 경사하강법을 할 수 있기 때문입니다.
여기서 batch_idx는 현재의 미니배치의 인덱스를 나타내고 samples는 입력 데이터 x와 정답 데이터 y의 쌍을 의미입니다.
여기까지해서 선형 회귀와 선형 회귀를 이용한 실습 부분을 마치겠습니다.
댓글남기기