---
# System prepended metadata

title: 210819 멘토링

---

# 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 과제