Week2 Peer Session


1. tensor가 벡터형태 일 때 Backward를 진행하면 왜 아래와 같이 표기해야하나?

1
2
3
4
a = tensor([3, 2])
b = tensor([4, 1])
Q = a*2 + b**2
Q.backward(gradient = tensor([1, 1]))
  • Pytorch에서는 scalar 값이 아닌 tensor에서는 backward의 시작점으로 보지 않기 때문에 벡터에 따로 gradient를 지정해 줘야한다.

2. optimizer.zero_grad()

  • Gradient를 초기화 해주는 함수를 말한다
  • 만약 초기화 해주지 않는다면 tensor가 backward 연산될때마다 grad에 더해져서 제대로 학습되지 않게 될 것이다

3. GIL

Week1 Peer Session


Peer Session 정리

  • 일주일동안 피어세션에서 주고받았던 질문에 대해서 추려서 정리한 글이다

1. python 메모리 관리는 어떤 방식으로 이루어지나?

2. list 구조체의 메모리는 어떤방식으로 할당 될까

  • python의 list는 다른 언어의 array와 다르게 list 내부에 여러가지 데이터 형식이 들어가는 것이 가능하다
    • linked list 형태로 data가 추가 될 때마다 그 형식에 맞는 메모리를 할당해서 연결하기 때문에 가능하다

3. python float의 할당 방식은 어떻게 이루어 질까? + int 형과의 비교

  • python의 float 형은 64bit의 부동소수점으로 표현을 한다
  • 기억 범위 : $4.9×10^{-324}\sim1.8×10^{308}$
  • 부동소수점 표현
    • 부호, 지수비트, 가수비트로 나눠서 수를 표현하는 방식을 말한다
    • 자세한 설명은 따로 포스팅 할 예정이다

3.1 python에서 int형의 범위는 어떻게 될까

  • python3 버전으로 넘어오면서 int형의 overflow가 사라졌다
  • 그래서 int형으로 표현할 수 있는 범위는 메모리가 허용하는 한도내에서 무제한이다
  • 조금더 자세하게 설명하자면 python2 버전에서는 int와 long 타입을 같이 사용하는 구조였는데 int의 범위가 넘어가면 자동으로 long 타입으로 넘어가는 형식이었다.
  • python3에서는 아에 long 타입이 int와 결합해서 수의 크기에 따라 탄력적으로 가용메모리를 추가적으로 할당하는 Arbitrary presicion을 사용한다