Module Swap Ablation?
: 두 개의 서로 다른 학습 결과(체크포인트)를 놓고, 신경망을 이루는 모듈 단위로 하나씩 바꿔가며,
그 모듈이 최종 성능에 얼마나 기여했는지 알아내는 방법
이를 적용시켜보면, 시도한 모델 학습 결과의 가중치를 비교하여 성능에 가장 큰 영향을 주는 모듈을 찾아볼 수 있다.
또한 모델을 통째로 다시 학습시키면, 어느 부품이 좋아져서 전체 성능이 좋아졌는지 알 수 없다.
예를 들어 Ego Status를 추가하고 재학습했더니 L2가 0.69 -> 0.28로 좋아졌는데,
이게 정말 Ego Status 영향인지, 아니면 재학습 과정에서 우연히 backbone이 이전보다 더 잘 학습돼서인지 구분이 안 된다.
학습 결과는 결국 숫자로 이루어진 가중치 파일(.pth)이기 때문에,
이를 뜯어보면 모듈마다 이름이 있고 이에 따른 가중치 결과가 저장되어 있다.
그 이름을 기준으로 다른 체크포인트로 갈아 끼웠을 때 성능이 얼마나 차이나는지 확인해보면 된다.
단점으로는 두 체크포인트에서 같은 이름의 파라미터가 shape이 다르면 그 부분은 바꿀 수 없다.
현재 상황에서 Ego Status를 적용하면서 입력 차원이 바뀐 부분이 있어, 이 모듈은 이전/이후 스왑이 불가능하다.
반면 img_backbone, img_neck, detection_head와 같은 다른 구조들은 안 바뀌었기 때문에 스왑 가능하다.
전체 모듈을 진행하려고 하면 시도해봐야 할 실험이 많아지기 때문에 Weight Delta로 미리 후보를 추려놓는게 좋다.
: 두 체크포인트의 같은 파라미터 값이 서로 얼마나 다른지 숫자로 측정
Weigth Delta는 L2 Norm 사용해서 차이 벡터를 계산하여 상대 변화량으로 나누면 된다.
(원래 크기 대비 몇 %나 바뀌었는지 비교)
이를 사전에 작업하여 후보를 추려놓고 실제 바꾼 모듈 하나씩 결과를 내보며 성능에 반영되는지 검증만 해보면 된다.
Test 1. full fine-tuning(A) / full fine-tuning + ego status(B)
ego status가 영향이 컸던 건지 확인해보기 위함이다.
1. weight delta
두 체크포인트 사이에서 어느 모듈이 재학습 과정에서 많이 바뀌었는지 사전 확인
이 결과만 놓고 보면, Ego Status와 직접 연결된 ego_map_decoder/ego_agent_decoder가 가장 크게 재학습되었고,
img_backbone은 거의 그대로 유지된 것으로 보인다. (0.0004)
Ego Status 때문에 해당 모듈은 크게 바뀌고, 이미지 인식 자체는 그대로일 것이라는 예상을 했다.
따라서 Weight Delta 상위 후보인 ego_map_decoder, ego_agent_decoder와,
대조군으로 변화가 거의 없었던 img_backbone을 각각 B에서 A로 되돌려 평가했다.
2. 모델 생성
B의 가중치(체크포인트)를 그대로 복사한 뒤, 특정 모듈에 해당하는 파라미터 이름만 골라,
A의 체크포인트의 값으로 덮어썼다. Shape이 일치하는 경우에만 교체가 이루어지고, 나머지 모듈은 B 그대로 유지된다.
3. 실험 결과
https://kind-slip-86b.notion.site/TEST-1-result-3d18a2c2bfdb8002ac7af1f4a0e6e857?source=copy_link
주요적으로 볼 것
| 지표 | ego_agent_decoder | ego_map_decoder | img_backbone |
| EPA_car (motion) | 0.4218 | 0.4218 | 0.3204 |
| ADE_car (motion) | 1.6160 | 1.6160 | 1.8900 |
| MR_car (motion) | 0.3023 | 0.3023 | 0.3517 |
| ADE_car (planning) | 4.872 | 4.872 | 5.186 |
| FDE_car (planning) | 7.411 | 7.411 | 8.038 |
| MR_car (planning) | 0.891 | 0.891 | 0.947 |
확인한 건 go_map_decoder/ego_agent_decoder는 Motion 지표에 전혀 영향을 주지 않는다는 점이다.
두 모듈을 되돌려도 EPA_car, ADE_car(Motion) 등이 동일하게 나왔다.
이는 Planning(자차 궤적) 경로에만 관여하고, Motion(주변 객체 예측) 경로와는 독립적으로 작동하고 있는 걸 확인했다..
img_backbone을 되돌리자 Motion/Planning 지표가 일관되게 저하되었다는 점이다.
Weight Delta상 사실상 변화가 없던(0.0004%) backbone을 이전 버전으로 되돌렸을 뿐인데,
EPA_car/ADE_car/MR_car(Motion)와 ADE_car/FDE_car/MR_car(Planning) 전부가 예외 없이 나빠졌다..
결과적으로 확인한 건 모델 구조가 선형이 아닌 비선형일 때는 현재 방식에 문제점이 많다는 점이다.
Weight Delta 크기와 성능 기여도는 비례하지 않는다.
변화량이 작은 모듈(backbone)은 freeze해도 무방할 것이라고 생각했는데 실제 검증 결과는 반대로 나왔다..
가중치 변화량만으로 freeze/unfreeze 대상을 결정하는 것이 위험할 수 있음을 알 수 있었다.
예상 밖으로 backbone의 미세한 변화 역시 성능에 기여했다는 사실이다.
별도의 검증 설계가 필요할 것 같다.
구조는 완전히 동일하고 학습을 얼마나 더 시켰는가에 따라 확인해볼 수 있다.
첫댓글 1. sparsedrive full finetuning 결과 확인 (validation 10epoch)
2. plan_dir loss 수렴하는지 확인
3. diffusiondirve full finetuning 결과 확인 (validation 10epoch)