
PyTorch와 Lightning AI를 활용한 신경망(Neural Networks) Part 4: 수동 학습에서 자동 학습으로
요약
PyTorch Lightning을 사용하여 신경망 학습 과정을 자동화하는 방법을 설명합니다. 최적의 학습률을 찾는 lr_find() 기능과 모델 학습을 자동화하는 fit() 메서드의 작동 원리를 다룹니다.
핵심 포인트
- Lightning Trainer를 통한 에포크 설정 및 학습 재개 가능
- lr_find()를 활용한 최적의 학습률(Learning Rate) 자동 탐색
- fit() 메서드를 통한 옵티마이저 설정 및 그래디언트 계산 자동화
이 글에서는 Lightning을 사용하여 신경망 (Neural Network)을 최적화하는 과정을 계속 진행하겠습니다.
모델 및 트레이너(Trainer) 생성
먼저, 모델과 트레이너를 생성합니다.
model = BasicLightningTrain()
trainer = L.Trainer(max_epochs=34)
여기서 최대 에포크(epochs) 수를 34로 설정했습니다.
이전 실험을 통해 34 에포크가 학습 데이터에 적합(fitting)하기에 충분하다는 것을 알았기 때문에 34를 선택했습니다.
설령 에포크 수가 불충분한 것으로 판명되더라도, 처음부터 다시 학습을 시작할 필요는 없습니다.
Lightning을 사용하면 에포크 수를 늘리고 중단된 지점부터 재개함으로써 나중에 학습을 계속할 수 있습니다.
더 나은 학습률(Learning Rate) 찾기
이제 트레이너가 준비되었으므로, 이를 사용하여 개선된 학습률 (Learning Rate)을 찾을 수 있습니다.
lr_find_results = trainer.tuner.lr_find(
model,
train_dataloaders=dataloader,
...
여기서 다음 항목들을 전달합니다:
- 모델 (Model)
- 학습 데이터로더 (Training DataLoader)
- 최소 학습률
0.001 - 최대 학습률
1.0 early_stop_threshold=None: 이는 Lightning이 검색을 조기에 중단하지 않도록 지시합니다.
lr_find()의 작동 방식
lr_find() 함수는 최소값과 최대값 사이의 후보 학습률 범위를 테스트합니다.
early_stop_threshold=None으로 설정함으로써, Lightning이 조기에 중단하는 대신 전체 범위를 평가할 수 있도록 합니다.
결과는 다음 항목에 저장됩니다:
lr_find_results
제안된 학습률 가져오기
suggestion() 메서드를 사용하여 Lightning이 제안하는 학습률을 가져올 수 있습니다.
new_lr = lr_find_results.suggestion()
print(
...
그 후, 제안된 값을 모델의 learning_rate 변수에 할당할 수 있습니다.
이제 기존의 임시 값보다 더 잘 작동할 가능성이 높은 학습률을 확보했습니다.
모델 학습하기
개선된 학습률이 준비되었으므로, 신경망 (Neural Network)을 학습할 준비가 되었습니다.
trainer.fit(
model,
train_dataloaders=dataloader
...
fit() 함수에는 다음이 필요합니다:
- 모델 (The model)
- 학습용 데이터로더 (The training DataLoader)
fit() 내부에서는 어떤 일이 일어날까요?
fit()을 호출하면, Lightning은 이전에 우리가 직접 작성해야 했던 많은 단계들을 자동으로 수행합니다.
먼저, Lightning은 다음을 호출합니다:
configure_optimizers()
이는 우리가 지정한 학습률 (learning rate)을 사용하여 SGD 옵티마이저 (optimizer)를 생성하고 설정합니다.
그 다음, Lightning은 각 배치 (batch)에 대한 손실 (loss)을 계산하기 위해 다음을 반복적으로 호출합니다:
training_step()
내부적으로 Lightning은 다음과 같은 작업들도 자동으로 수행합니다:
optimizer.zero_grad()
이는 다음 최적화 (optimization) 단계 전에 그래디언트 (gradients)를 초기화합니다.
loss.backward()
이는 그래디언트 (gradients)를 계산합니다.
optimizer.step()
이는 더 나은 값을 향해 단계를 밟음으로써 파라미터 (parameters)를 업데이트합니다.
그 후 Lightning은 우리가 요청한 모든 에포크 (epoch)에 대해 이 과정을 반복합니다.
이를 순수 PyTorch와 비교하기
이전의 PyTorch 구현에서는 다음과 같은 것들을 수동으로 작성해야 했습니다:
- 학습 루프 (training loops)
- 그래디언트 계산 (Gradient calculations)
- 그래디언트 초기화 (Gradient resets)
- 파라미터 업데이트 (Parameter updates)
Lightning을 사용하면 이러한 로직의 대부분이 자동으로 처리됩니다.
그 결과, 학습 코드가 훨씬 짧아지고 읽기 쉬워집니다.
이제 모델 학습이 완료되었으므로, 다음 단계는 final_bias가 올바르게 최적화되었는지 확인하는 것입니다.
다음 글에서 몇 가지 추가적인 Lightning 기능과 함께 이 내용을 살펴보겠습니다.
AI 에이전트는 코드를 빠르게 작성합니다. 하지만 사용자에게 알리지 않고 조용히 로직을 제거하거나, 동작을 변경하고, 버그를 유발하기도 합니다. 종종 프로덕션 환경에서 이를 발견하게 됩니다.
git-lrc가 이를 해결합니다. git 커밋에 후킹하여 모든 diff가 반영되기 전에 리뷰합니다. 60초면 설정이 완료됩니다. 완전히 무료입니다.
피드백이나 기여자를 환영합니다! 온라인에서 소스 코드를 확인할 수 있으며 누구나 사용할 준비가 되어 있습니다.
GitHub에서 ⭐ star를 눌러주세요
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기