training 시 l1 norm을 직접 구현하려고 하는데 정확한 구현 방법이 맞는 지 궁금합니다

loss에 l1 regularization을 하는 코드를 구현하려고 하는데 정확하게 맞는 방법이 무엇인지 궁금해서요.

모델에서 parameter의 shape를 프린트하면 다음과 같습니다.
화면 캡처 2022-11-20 163937

  1. 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이 불가능합니다.

  1. torch.tensor.norm 사용
    running_cost += lambda * sum(p.norm(1) for p in model.parameters())
    → dimension 수와 상관없이 코드가 다 돌아가나 숫자가 매우 큽니다.

두 방법으로 다 구현하고 싶은데 잘 모르겠어서 여쭤봅니다ㅠ

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번 방법과 똑같은 값으로 계산되어 말씀하신 방법이나 제가 쓴 방법으로 하면 될 거 같습니다ㅎㅎ 감사합니다!

이 글은 마지막 댓글이 달린지 오래(7일)되어 자동으로 닫혔습니다. 댓글 대신 새로운 글을 작성해주세요! :slight_smile: