PyTorch 기본 정리

유상준·2022년 9월 26일
0

몇 개의 PyTorch를 이용한 딥러닝 프로젝트를 해왔었지만 기초에 대해서 많이 부족하다고 생각하였고,

PyTorch 기본

  • Numpy 구조를 가지는 Tensor 객체로 array 표현
  • 자동미분을 지원하여 DL 연산을 지원
  • 다양한 형태의 DL을 지원하는 함수와 모델을 지원함

Tensor란?

  • 다차원 Arrays를 표현하는 PyTorch 클래스

  • 사실상 numpy의 ndarray와 동일

    • Tensor를 생성하는 함수조차 거의 동일하다
  • view, squeeze, unsqueeze 등으로 tensor handling 가능

    • view : reshape과 동일하게 tensor의 shape을 변환
    • squeeze : 차원의 개수가 1인 차원을 삭제 (압축)
    • unsqueeze : 차원의 개수가 1인 차원을 추가

view와 reshape의 차이점 (view를 쓰는것을 권장한다)


위 사진만 보면, view와 reshape은 같은 기능을 하는 함수처럼 보인다.

하지만, 위 처럼 fill_ 메소드등을 활용하여 값을 바꿔준다면, 차이점이 나타나 보인다. 그렇다면, reshape함수를 쓰면 무조건 값이 바뀌지 않는 단점이 발생할까?

그렇지 않다. 이 차이를 설명하려면, contiguous의 개념이 필요하다
(contiguous에 대해서 알면, 이해하기 더 쉽다 : https://sanghyu.tistory.com/3)

  1. view
    contiguous를 유지한 채 사이즈를 원하는대로 바꿔준다.
  2. reshape
    contiguous가 보장되지 않으면 copy를 해버리기 때문에, transpose등의 변환으로 contiguous가 보장되지 않는다면, fill_1과 같은 값의 변화가 일어날 때 같이 따라가지 못한다.

행렬 곱 연산

  • 행렬곱연산은 mm(matmul)이용, dot은 1차원 이하 벡터일 때 사용 (1차원 벡터 or 스칼라)

  • dot 연산 예시

  • mm vs matmul (행렬의 차원을 맞춰주는지의 여부에 대한 차이)

    • mm은 broadcasting 지원 x
    • matmul은 broadcasting 지원 o

nn.functional 모듈을 통해 다양한 수식 변환을 지원함

AutoGrad

  • backward 함수를 이용한 자동 미분이 지원된다

    이 때, external_grad는, dQdQ=1\frac{dQ}{dQ} = 1 을 의미한다. 이것이 왜 필요한가? 싶기도 하지만, 그것은 파이토치가 계산하는 야코비안 행렬에 곱해질 벡터와 관련이 있다. (수리통계학에서, 두 개 이상의 확률변수로 이루어진 함수를 변환하는 Convolution 과정에서 등장하는 야코비안과 동일하다)

    위의 예제에서는, 방금 언급한 곱해질 벡터가 이전 layer에서 넘어올 수 없기 때문에 (별도의 layer가 존재하지 않기 때문에) input size에 맞춰 [1,1]의 tensor를 지정해주면 된다.

위 포스팅은 부스트캠프 AI Tech의 교육자료를 참고하여 만들었습니다.

profile
데이터 사이언티스트 지망생

0개의 댓글