# 210819 멘토링
- 주식이야기로 시작
- 신한은행 NLP 채용공고
## 개선 점
- 과제의 퀄리티가 높으나 양이 너무 많았던거같다
- 아무래도 4일안에 하니 어쩔수 없이 많았던거 같다.
- 아에 선택과제를 첫날에 제시하는게 좋겠다.
## 질문
1. "optimizer.zero_grad()를 안하면 어떤 일이 일어날지 그리고 매 batch step마다 항상 필요한지 같이 논의해보세요" 라는 주제를 가지고 토의 하였고 다음과 같은 결론이 나왔습니다.
- Pytorch에서는 gradients값들을 추후에 backward를 해줄때 계속 더해준다. (https://algopoolja.tistory.com/55)
- 갱신을 시키면 값이 buffer에 덮어씌워지는 것이 아니라 누적이 된다.
- 역전파 단계 전에, optimizer 객체를 사용하여 (모델의 학습 가능한 가중치인) 갱신할 변수들에 대한 모든 변화도(gradient)를 0으로 만듭니다. 이렇게 하는 이유는 기본적으로 .backward()를 호출할 때마다 변화도가 버퍼(buffer)에 (덮어쓰지 않고) 누적되기 때문입니다. 더 자세한 내용은 torch.autograd.backward에 대한 문서를 참조하세요.
- 그렇다면 왜 zero_grad()를 자동으로 안해줄까? step()하고 알아서 해주면 편할거같은데. 값이 필요할때가 존재하는 경우가 있는건가??
### 멘토님 의견
- 왜 zero_grad()를 자동으로 안해줄까?
- gradient를 이용해서 커스터마이징 하는 경우가 존재한다.
- 같은 데이터로 여러번 loss를 계산하는 경우가 있다.
- 조금 정리하자면 step()을 사용하고 나서 그 값을 사용하는 경우가 존재한다.
- Gradient에 대한 엔지니어링이 필요한 경우가 있다.
- 파이토치가 버전업이 되면 step_and_zero_grad같은게 추가되지 않을까
- zero_grad()를 안하면 어떤일이 일어날까요?
- gradient값들을 추후에 backward를 해줄때 계속 더해준다.
- gradient가 계속 쌓이면 파라미터를 업데이트할 때 적용되는 optimizer gradient의 값이 계속 커져 파라미터의 변동값이 커지므로 파라미터가 제대로 업데이트되지 않을 가능성이 높다.
- zero_grad => dL/dw = 0, step => +=dL/dw 후 w 업데이트
2. "DataLoader에서 사용할 수 있는 각 sampler들을 언제 사용하면 좋을지 같이 논의해보세요"
- sampler에는 다음과 같은 종류가 있다.
- SequentialSampler : 항상 같은 순서
- RandomSampler : 랜덤, replacement 여부 선택 가능(복원추출 or 비복원추출), 개수 선택 가능
- SubsetRandomSampler : 랜덤 리스트, 위와 두 조건 불가능
- WeigthRandomSampler : 가중치에 따른 확률
- BatchSampler : batch단위로 sampling 가능
- DistributedSampler : 분산처리 (torch.nn.parallel.DistributedDataParallel과 함께 사용)
- 각각을 상황에 맞게 사용하는 경우가 어떤 것인지 잘 알지 못하겠다. 그리고 만약 RandomSampler를 사용하는 것은 shuffle을 사용하는 것과 어떻게 다른 것일까??
- 랜덤 샘플러는 일정한 양의 데이터를 추출하고, 그 데이터만 계속쓰는거 아닐까?
### 멘토님 의견
- RandomSampler를 사용하는 것은 shuffle을 사용하는 것과 어떻게 다른 것일까??
- 복원추출(true)과 비복원추출(false)을 지원하는 Replacement의 차이가 있다.
- shuffle은 비복원 추출과 같다. (replacement=false 와 같다)
- replacement = True로 할경우 복원추출을 하므로 shuffle과 다른 기능을 한다.
- 비슷한 기능을 하는 함수가 많다.
- DistributedSampler(분산처리) 강조하고 싶다고 하심
- ddp를 사용할 때 distrivutedsampler를 사용한다
## 추가사항
- apply optional 과제