[ERROR] 훈련할 때나 개발집에서loss가 변하지 않는 이유

2048 단어 ERROR
부주의로 인한 BUG 기록
 
사건의 원인:
최신 종목 코드, 모든 것이 잘 되어 있었는데, 내가 갑자기 새로운 모델을 추가하고 싶을 때까지 모든 것이 이상해졌다...
코드 논리는 훈련 라운드마다 개발집에서 세 번 측정한 다음에 log는 매번 측정된loss와 PRF 지표를 인쇄한다. 모델을 바꾼 후에 매번 인쇄된 log의 모든 수치는 조금도 변하지 않는다.
 
문제 발생:
훈련 시 및 개발집에서loss 변하지 않음
이는 모델이 매 라운드마다 훈련을 하고 있지만 모델에서 학습을 기다리는 파라미터가 조금도 업데이트되지 않았다는 것을 보여준다.
 
디버그 프로세스:
            print(probs.grad)
            print(targets.grad)
            print("probs:{}".format(probs.requires_grad))
            print("targets:{}".format(targets.requires_grad))
            
            loss = criterion(probs, targets) 
            print("loss:{}".format(loss.requires_grad))

훈련시:
None None probs:True targets:False loss:True
테스트 시:
None None probs:False targets:False loss:False
모든 것이 정상이다.grad는loss에만 있습니다.backward () 이후에 자신의 사다리를 계산하고 그 다음에 사다리를 누적하기 때문에 기본 출력 None은 정상입니다
따라서 모델 내부에서 문제가 발생할 가능성을 배제할 수 있다
 
지금 함수를 배열하는 것 외에 우선 최적화기 함수가 잘못 썼는지 의심하고 몇 번 시도한 후에도 문제가 여전히 여기에 없다는 것을 발견했다...
 
갑자기 코드를 발견했는데 그 전에 모델이 비교적 커서 out of memory가 나타났기 때문에 파라미터를 CPU에 배치하여 최적화시킨 적이 있다. 정의는 파라미터 코드를 다음과 같다.
    if args.optimize_on_cpu:
        param_optimizer = [(n, param.clone().detach().to('cpu').requires_grad_()) for n, param in net.named_parameters()]
    else:
        param_optimizer = net.named_parameters()

이렇게 하면 최적화기 업데이트 매개 변수, 즉optimizer를 사용합니다.step()일 경우 다음 세 단계를 수행합니다.
1) 모델의 매개 변수에 대해 이 매개 변수에 사다리가 있으면 이 매개 변수의 사다리 값(para model.grad.data)을 대응하는 최적화기의 매개 변수에 copy(대응하는 최적화기 매개 변수의 사다리가 None이면 사다리를 부여한다).모델의 매개 변수의 사다리가 None이면 해당 최적화기의 매개 변수에 대한 grad도 None으로 복사됩니다.
2) 계단식 회전 후 모델 매개 변수의 업데이트를 진행한다.
3) 최적화된 최적화기의 매개 변수 값을copy모델의 매개 변수에 적용한다.
if args.optimize_on_cpu:
    is_nan = set_optimizer_params_grad(param_optimizer, net.named_parameters(), test_nan=True)
    optimizer.step()
    copy_optimizer_params_to_model(net.named_parameters(), param_optimizer)
else:
    optimizer.step()

좋은 웹페이지 즐겨찾기