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