[Day 11] Boostcamp AI-Tech

donggunseo·2021년 8월 17일
0

Boostcamp AI-Tech

목록 보기
11/34

2021년 8월 17일
3주차 pytorch
강의 수강 : 1강 ~ 3강

1. 학습 내용 정리

파이토치의 기초에 대해서 배웠는데 사실 내용이 많진 않다. 몇 가지 배운 함수들에 대해서만 간단히 정리해보겠다.

tensor_ex = torch.rand(size=(2,3,2))
tensor_ex.view([-1,6]) #reshape와 같은 역할

tensor_ex = torch.rand(size=(2,1,2))
tensor_ex.squeeze().shape # dimension이 1인 차원을 제거
->torch.Size([2,2])
tensor_ex.unsqueeze(1).shape # input의 dimension의 차원을 확장
->torch.Size([2,1,2])

reshape와 view의 기능 자체는 같다. 다만 contiguity의 보장 차이가 있는데, view의 경우 새로운 tensor를 view를 통해 기존의 tensor에서 사이즈가 바뀐채로 선언된 후 기존의 tensor에 원소 값 변경 등의 작업을 한다면 새 tensor에도 그 변경이 적용된다. squeeze와 unsqueeze는 해당 차원을 축소하냐 확장하냐의 함수로 추후 model과 input간의 dimension을 맞추기 위해 사용할 수 있다.

tensor를 선언할 때, requires_grad를 True로 설정해 줘야 추후 역전파 식이 가능해진다. 하지만 우리가 쓰는 nn.Linear 등의 함수에서는 이런 기능이 선언없이 자동으로 설정되어 있다.

2. 과제

필수과제가 매우 양이 많았다. pytorch에 대해 기본적인 함수들을 알아보면서 동시에 python의 몇가지 중요한 함수들을 통해 우리가 신경망 학습과정에서 중간중간에 기능을 추가하거나 성능을 검사하는 등의 역할을 하는 함수들에 배웠다.

torch에서 matrix multiplication을 지원하는 함수가 많다. 대표적으로 torch.mm, torch.matmul이 있고 sparse matrix에서 사용하는 torch.smm도 있다. 또 빠른 연산을 위해 행렬의 덧셈연산도 같이 지원하는 torch.addmm도 있다. einsum 라이브러리를 활용하면 'ij, jk->ik' 등의 지정으로 원하는 계산 형태를 문자열로 전달하여 계산할 수도 있다. 또한 벡터나 행렬의 norm을 계산하는 함수에는 torch.linalg.norm을 쓰는 것이 제일 좋다. torch.norm은 deprecated 되었기 때문에 앞으로는 안쓰는게 좋다. torch.linalg.norm은 입력값이 벡터인지 행렬인지 읽는 사람은 알 수 없기 때문에 torch.linalg.vector_norm 이나 torch.linalg.matrix_norm을 통해 명확하게 드러낼 수도 있다.

torch.Tensor와 torch.tensor가 많이 헷갈리는 부분인데, 각각 다음과 같은 차이가 있다.

  1. "torch.Tensor"
  • 클래스 (Class)
  • int 입력시 float로 변환
  • torch 데이터 입력시 입력 받은 데이터의 메모리 공간을 사용
  • list, numpy 데이터 입력 시 입력 받은 데이터를 복사하여 새롭게 torch.Tensor를 만든 후 사용
  1. "torch.tensor"
  • 함수 (Function)
  • int 입력시 int 그대로 입력
  • 입력 받은 데이터를 새로운 메모리 공간으로 복사 후 사용

단적으로 Tensor로 선언한 데이터에 대해 처음 원본데이터 값을 수정하면 Tensor로 수정한 데이터도 바뀌게 되는 것을 확인할 수 있다.

torch의 linear transformation에는 우리가 잘아는 nn.Linear도 있지만 nn.LazyLinear도 있다. LazyLinear는 입력값에 따라 in_feature값을 자동으로 인식하고 out_feature만 지정해주면 되서 매우 편하다고 할 수 있다. 단 파라미터를 nn.parameter가 아닌 nn.UninitializedParameter를 사용한다. 추후 언젠가 쓸 일이 있을 것이다.

모델안에 크게 세 가지 종류의 변수가 있다고 할 수 있다. Tensor, Parameter, Buffer인데 그 차이는 다음과 같다.

  1. "Tensor"
    • ❌ gradient 계산
    • ❌ 값 업데이트
    • ❌ 모델 저장시 값 저장
  2. "Parameter"
    • ✅ gradient 계산
    • ✅ 값 업데이트
    • ✅ 모델 저장시 값 저장
  3. "Buffer"
    • ❌ gradient 계산
    • ❌ 값 업데이트
    • ✅ 모델 저장시 값 저장

이중 Buffer라는 개념은 gradient를 계산하지는 않지만 모델에 값을 저장해야 할 때 사용한다.

hook은 우리가 쓰는 모든 Package에 self.hooks로 지정되어 있는데 이를 통해 모델 안의 값을 확인한다던가 값을 변경하는 등의 역할을 할 수가 있다. model.hooks.append() 를 통해 모델 밖에서 hook을 추가하는 것도 가능하다. tensor에는 tensor._ backward_hooks만 있다. 우리가 Model을 구성하기 위해 상속하는 Module에는 register_forward_pre_hook, register_forward_hook, register_full_backward_hook 을 통해 여러 위치에 hook을 등록할 수 있다.

apply는 모델에 어떤 custom한 함수를 모델 전체에 적용하고 싶을 때 사용한다. module을 입력으로 받고, 적용하기 위해서 model.apply(함수이름)으로 사용한다.

3. 피어세션

아무래도 강의 내용이 기초적인 부분이었다 보니 질문이 없었다. 통계학 스터디를 진행하였고 목요일에 문제풀이를 위해 각자 정해진 만큼 문제들을 나눴다. 과제를 해결하고 오면 아마 질문이 많을 듯 하다.

4. 마무리

과제가 너무 힘들었다. 과제땜에 밥도 늦게 먹었다. 내일도 과제가 이정도양이면.... 난 죽는다.

0개의 댓글