inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Bootcamp Deep Learning và PyTorch (Pytorch) cho người mới bắt đầu (Dễ hiểu! Từ cơ bản đến Transformer cốt lõi của ChatGPT) [Phân tích dữ liệu/Khoa học Phần 3]

Thêm Optimizer vào triển khai deep learning

질문 드립니다 - 딥러닝 구현에 optimizer 추가하기 부분 -> detach 메서드

416

daniel

58 câu hỏi đã được viết

1

threshold = 0.1
learning_rate = 0.1
iteration_num = 0

# loss를 이용해서 gradient descent update
# loss 가 threshold 밑으로 내려가면 loop 중지 
while loss > threshold:
    iteration_num += 1
    
    # 갱신된 미분값을 이용해서 W와 b 업데이트
    W = W - learning_rate * W.grad
    b = b - learning_rate * b.grad    
    print (iteration_num, loss, z, y)

    # detach_() : 텐서를 기존 방향성 비순환 그래프(DAG; Directed Acyclic Graph)로부터 끊음
    # .requires_grad_(True) : 연결된 Tensor 로부터의 계산된 자동미분 값을, 다시 현 텐서부터 시작하도록 만듬
    # 기존 그래프에서 끊어낸 후 기억한 자동 미분값을 이용해서 현 텐서부터 갱신할 수 있게 함 
    # 미분을 계산한 이후 DAG로 부터 왜 detach를 한 후 requires_grad를 다시 해야하는지..? 정확히 이해가 잘 안감
    W.detach_().requires_grad_(True)
    b.detach_().requires_grad_(True)
    
    # 갱신된 미분값을 이용해서 예측값과 loss 값 갱신 => 갱신된 loss를 이용해서 미분값 다시 계산 
    z = torch.matmul(x, W) + b
    loss = F.mse_loss(z, y)
    loss.backward()

print (iteration_num + 1, loss, z, y)

detach 메소드가 깊은 복사 시 신경망으로부터 텐서를 분리하는 것은 이해가 갑니다..!

    W.detach_().requires_grad_(True)

    b.detach_().requires_grad_(True)

미분을 계산한 이후 DAG로 부터 왜 detach를 한 후 requires_grad를 다시 해야하는지..?

처음에 require_grad가 되어 있으니

매번 미분 값 계산할 때마다 grad가 갱신되기 때문에

굳이 detach로 분리를 해야하는지

해당 부분이 이해가 잘 안갑니다.

 

 


 

-> 강사님의 다음 강의를 듣고 이해했는데

제가 이해한 것이 맞는지 확인받고 싶습니다

 

 

 

머신러닝 배워볼래요? 딥러닝 인공신경망 pytorch vision-transformer

Câu trả lời 2

1

funcoding

안녕하세요. 답변도우미입니다. 네 맞습니다.

detach() 의 역할은 기존 그래프에서 끊어내는 역할을 하는 것입니다. requires_grad 의 역할은 이제부터 모든 연산을 추적하기 시작한다 라는 것을 선언하는 역할인데요. (디폴트값이 False 인데, 이를 True 로 만들면, 그 때부터의 연산을 추적합니다.) 그래서, detach_().requires_grad_(True) 이면, 기존 그래프에서 끊어낸 후, 다시 시작하는 연산부터 그 연산을 추적합니다.

지금 보여주신 부분은 W, b 값 계산시에는 그 때까지의 연산을 추적하여 계산한 미분값을 사용하여 W, b 값을 계산하고, 이후에는 그때까지의 연산 그래프에서 끊어낸 후, 다시 다음 연산부터 추적하기 위해, detach_().requires_grad_(True) 을 수행한 것입니다. 그러지 않으면, matmul, mse_loss, loss.backward() 까지 연산이 다 추적되면서, 기존 미분값에 각 연산시의 미분값이 누적되어, 미분값이 잘못 계산되거든요. 이 부분은 이후 다시한번 미분값 계산에 어떻게 기존 연산이 영향을 주는지 설명을 드리고 있어서, 이후에 이 부분을 또 보실 수 있으실꺼예요.

감사합니다.

0

daniel

너무 친절한 설명 감사드립니다 강사님

02_TENSOR.md자료

0

44

1

pytorch 설치 업데이트좀요

0

65

2

강의 자료 열람 요청이 안되네요

0

42

1

import torch가 안되는 경우는 어떻게 하나요?

0

107

1

강의 필기는 어떻게 하나요?

1

125

1

섹션 5퀴즈 4번 문제 보기 오류로 보임

0

93

1

섹션17 81번이랑 82번 강의가 중복되는 것 같아서 질문드립니다.

0

131

2

강의교안이 안 옵니다

0

116

1

17-2강 Transfer learning 실습 관련 질문

0

173

2

13섹션 강의자료가 없네요^^

0

109

1

강의자료가 없네요.

0

128

2

LSTM 모델 학습 관련한 질문입니다.

0

166

1

MSE LOSS 관련

0

166

1

test시 minibatch 사용?

0

165

1

Average Test loss 계산식 문의

0

123

1

파이토치 설치

0

287

1

[Pytorch 기울기의 누적 곱? 누적 합?]

0

174

1

3d 텐서에서의 축 구분 질문

0

142

1

항상 tensor([0., 0., 0.]) 형식으로만 나오는 이유

0

134

1

강의자료 PDF 다운로드에 관하여

0

166

1

[실무에서 판다스 copy()메서드의 깊은복사 얕은복사 조정 소요가 생길까?]

0

142

1

섹션 다양한 Optimizer 정리하기 중 딥러닝으로 Regression 문제 적용해보기 (House Price Kaggle 문제) 강의에서 오류가 발생합니다.

0

176

1

마지막에 confusion matrix 작성할때

0

189

1

아나콘다를 사용하지 않고 파이토치 사용하는 방법

0

916

1