몇 개의 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)
- view
contiguous를 유지한 채 사이즈를 원하는대로 바꿔준다.
- reshape
contiguous가 보장되지 않으면 copy를 해버리기 때문에, transpose등의 변환으로 contiguous가 보장되지 않는다면, fill_1과 같은 값의 변화가 일어날 때 같이 따라가지 못한다.
행렬 곱 연산
nn.functional 모듈을 통해 다양한 수식 변환을 지원함
AutoGrad
- backward 함수를 이용한 자동 미분이 지원된다
이 때, external_grad는, dQdQ=1 을 의미한다. 이것이 왜 필요한가? 싶기도 하지만, 그것은 파이토치가 계산하는 야코비안 행렬에 곱해질 벡터와 관련이 있다. (수리통계학에서, 두 개 이상의 확률변수로 이루어진 함수를 변환하는 Convolution 과정에서 등장하는 야코비안과 동일하다)
위의 예제에서는, 방금 언급한 곱해질 벡터가 이전 layer에서 넘어올 수 없기 때문에 (별도의 layer가 존재하지 않기 때문에) input size에 맞춰 [1,1]의 tensor를 지정해주면 된다.
위 포스팅은 부스트캠프 AI Tech의 교육자료를 참고하여 만들었습니다.