loss에 l1 regularization을 하는 코드를 구현하려고 하는데 정확하게 맞는 방법이 무엇인지 궁금해서요.
모델에서 parameter의 shape를 프린트하면 다음과 같습니다.
torch.linalg.norm 사용
running_cost += lambda * sum(torch.linalg.norm(p,ord=1) for p in model.parameters())
이렇게 했을 때 CNN을 사용하면 dimension을 지정하라고 오류가 나는데 dimension을 정확히 어떻게 지정해주어야 할 지 모르겠습니다. dimension을 지정해도 output이 matrix로 나와서 scalar 값으로 sum이 불가능합니다.
torch.tensor.norm 사용
running_cost += lambda * sum(p.norm(1) for p in model.parameters())
-> dimension 수와 상관없이 코드가 다 돌아가나 숫자가 매우 큽니다.
두 방법으로 다 구현하고 싶은데 잘 모르겠어서 여쭤봅니다ㅠ
bongmo
(Bong Mo Kim)
11월 21, 2022, 2:48오전
2
1번 방법은
running_cost += lambda * sum(torch.linalg.norm(p, dim=1, ord=1) for p in model.parameters())
2번 방법은
l1_lambda = 0.001
l1_norm = sum(p.abs().sum() for p in model.parameters())
l1_loss = l1_lambda * l1_norm
이런 식으로 구현해보시면 어떨까요?
1번 방법은 결국 또 matrix로 나오더라구요. 1번 방법에선 나온 matrix의 element를 다 더해주면 결국은 2번과 같은 값을 얻긴합니다. 그래서 결국 말씀해주신 2번 방식처럼 하면 될 거 같아 해보니 제가 언급했던 2번 방법과 똑같은 값으로 계산되어 말씀하신 방법이나 제가 쓴 방법으로 하면 될 거 같습니다ㅎㅎ 감사합니다!
system
(system)
에 닫힘
11월 28, 2022, 5:07오전
4
이 글은 마지막 댓글이 달린지 오래(7일)되어 자동으로 닫혔습니다. 댓글 대신 새로운 글을 작성해주세요!