hyeonzzz's Tech Blog

[딥러닝 파이토치 교과서] 2장. 실습 환경 설정과 파이토치 기초 본문

Deep Learning/Pytorch

[딥러닝 파이토치 교과서] 2장. 실습 환경 설정과 파이토치 기초

hyeonzzz 2024. 3. 14. 16:19

2.1 파이토치 개요

PyTroch

파이토치 : 파이썬 기반의 딥러닝 프레임워크

 

파이토치 특징 및 장점

GPU에서 텐서 조작 및 동적 신경망 구축이 가능한 프레임워크

 

- GPU : 연산 속도를 빠르게 하는 역할

  • GPU를 사용하면 빠른 기울기 계산(미분)이 가능하다
  • CUDA, cuDNN이라는 API를 통해 GPU를 연산에 사용할 수 있다
  • GPU 사용은 딥러닝 학습에서 필수적이다

 

- Tensor : 파이토치의 데이터 형태

  • 텐서는 단일 데이터 형식으로 된 자료들의 다차원 행렬이다
  • 텐서는 .cuda()를 사용해서 GPU로 연산을 수행하게 할 수 있다

 

- 동적 신경망 : 훈련을 반복할 때마다 네트워크 변경이 가능한 신경망

  • 학습 중에 은닉층을 추가하거나 제거할 수 있다
  • Define by Run : 연산 그래프를 정의하는 것과 동시에 값도 초기화
  • 따라서 연산 그래프와 연산을 분리해서 생각할 필요가 없다

* 연산 그래프

: 방향성이 있으며 텐서를 의미하는 노드와 연산을 담당하는 엣지로 구성된다.

신경망은 연산 그래프를 이용하여 계산을 수행한다.

 

벡터, 행렬, 텐서

벡터 : 1차원 배열 형태. 숫자들의 리스트

행렬 : 행과 열로 표현되는 2차원 배열 형태

텐서 : 3차원 이상의 배열 형태

 

파이토치의 아키텍처

- 파이토치 API : 사용자가 사용하는 라이브러리

- 파이토치 엔진 : 다차원 텐서 및 자동 미분 처리

- 연산 처리 : 텐서에 대한 연산

 

파이토치 API

  • 사용자 인터페이스를 제공하지만 실제 계산은 수행하지 않는다
  • 파이토치 엔진으로 작업을 전달한다

 

패키지 종류

- torch : GPU를 지원하는 텐서 패키지

- torch.autograd : 자동 미분 패키지

- torch.nn : 신경망 구축 및 훈련 패키지

- torch.multiprocessing : 파이썬 멀티프로세싱 패키지

- torch.utils : DataLoader 및 기타 유틸리티 제공

 

파이토치 엔진

- Autograd C++

- Aten C++

- JIT C++

- Python API

 

연산 처리

상위의 API에서 할당된 거의 모든 계산을 수행한다

 

텐서

텐서는 1차원이든 n차원이든 메모리에 저장할 때는 1차원 배열 형태가 된다. 변환된 1차원 배열은 스토리지(storage)라고 한다.

  • offset : 텐서에서 첫 번째 요소가 스토리지에 저장된 인덱스
  • stride : 다음 요소를 얻기 위해 건너뛰기가 필요한 스토리지의 요소 개수

* 3차원 텐서를 1차원으로 변환

 

다른 형태를 갖지만 스토리지의 값들은 서로 같다. 따라서 행렬/텐서를 구분하는 용도로 오프셋과 스트라이드를 사용한다.

 

* A를 1차원으로 변환

 

offset = 1

stride = (3,1)

 

* A의 전치 행렬을 1차원으로 변환

 

offset = 1

stride = (2,1)

 

2.2 파이토치 기초 문법

모델 정의

- 계층 : 모듈 또는 모듈을 구성하는 한 개의 계층

- 모듈 : 한 개 이상의 계층이 모여서 구성된 것

- 모델 : 최종적으로 원하는 네트워크

 

모델의 파라미터 정의

- 손실 함수 : 출력과 실제 값 사이의 오차 측정

  • BCELoss : 이진 분류를 위해 사용
  • CrossEntropyLoss : 다중 클래스 분류를 위해 사용
  • MSELoss : 회귀 모델에서 사용

 

- 옵티마이저 : 데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정한다

  • step() 메서드를 통해 전달받은 파라미터를 업데이트한다
  • 모델의 파라미터별로 다른 기준(학습률)을 적용시킬 수 있다
  • zero_grad() : 옵티마이저에 사용된 파라미터들의 기울기를 0으로 만든다
  • torch.optim.lr_scheduler : 에포크에 따라 학습률을 조절할 수 있다

 

- 학습률 스케줄러 : 에포크를 지날 때마다 학습률을 감소시켜 준다. 학습 초기에는 빠른 학습을 진행하다가 전역 최소점 근처에 다다르면 학습률을 줄여서 최적점을 찾아갈 수 있도록 한다.

 

* 전역 최소점과 최적점

전역 최소점 : 오차가 가장 작을 때의 값

지역 최소점 : 전역 최소점을 찾아가는 과정에서 만나는 홀

 

모델 훈련

학습 시킨다 : y = wx + b라는 함수에서 w 와 b의 적절한 값을 찾는다

 

  1. 모델, 손실 함수, 옵티마이저 정의
  2. output = model(input) : 출력 계산
  3. loss = loss_fn(output, target) : 오차 계산
  4. optimizer.zero_grad( ) : 기울기 초기화
  5. loss.backward( ) : 역전파 학습
  6. optimizer.step( ) : 기울기 업데이트

 

훈련 과정 모니터링

텐서보드를 이용해 파라미터 값이 어떻게 변화하는지 시각화하여 살펴본다

 

model.train( ) & model.eval( )

model.train( ) : 훈련 데이터셋에 사용하며 모델 훈련이 진행될 것임을 알린다. 드롭아웃이 활성화 된다

model.eval( ) : 모델을 평가할 때는 모든 노드를 사용하겠다는 의미. 검증과 테스트 데이터셋에 사용한다.

  • model.train( ), model.eval( )을 선언해야 모델의 정확도를 높일 수 있다
  • model.eval( )에서 with torch.no_grad( ) 를 사용하는 이유 : 검증, 테스트 과정에서는 역전파가 필요하지 않기 때문에 기울기 값을 저장하지 않도록 한다.