정말 똑같은 모델링에 똑같이 normalized된 데이터셋
(직접 preprocessing을 함. [0, 1]로 scaling을 하던 평균, 분산을 구해 normalization을 하던)
똑같은 compile 똑같은 training loop
다른 점이라곤 딱 레이어마다(Dense, Conv1D, Conv2D, Conv3D 포함, RNN은 제외. 아 근데 Conv3D는 Custom이긴 함..)
레이어 뒤에 BatchNormalization()을 쓰느냐 안 쓰느냐 그 차이
그래서 쓰면, 레이어 -> BN레이어 -> ReLU레이어를 통과하게 되고
안 쓰면, 레이어 -> ReLU레이어를 통과하게 되는데
서로 완전히 다른 결과가 나와버리네..
이렇게까지 다른 결과가 나와버리나? 싶음 BatchNormalization 레이어 썼다고...
근데 둘 다 말이 안 되진 않아서...더 혼란스러움...
0 1 2 중에 하나로 분류하는 모델인데
2인 case는 사실 너무 명료한 case여서 눈으로도 파악이 가능한 수준이고, 중요한건 0/1을 0/1로 분류하느냐가 중요해서...
그렇기에 2로 분류하는건 좀 의미 없는 일이라 SparseCategoricalCrossEntropy를 Custom으로 건드려서
1. y_true가 0/1인데 2로 분류하는 case는 weights(=0.5 디폴트)를 주고(정 0/1 어디로 분류해야할지 모르겠으면 2로 넣어두라 그런거지)
2. y_true가 2인 case는 어디로 분류하든 weights (=0.5 디폴트)를 주도록(2인 case는 어디로 분류하시든 크게 내 관심이 아니다 그런 의미)
Custom으로 loss를 수정했음
이제 validation set에 대해,
BN 레이어를 쓰지 않는 경우에는, 2를 2로 분류를 거의 100퍼센트 잘하고, 0/1의 case를 2로 분류하는 경우도 정말 찾아보기 힘든데
BN 레이어를 쓰는 경우에는, 갑자기 custom loss를 잘 알아들은 것마냥 2를 0, 1, 2로 제각각 분류도 해버리고,
0/1의 case도 영 모르겠는건 2로 많이 분류를 해버림 (근데 너무 많이 해버린다는게 문제임...모델을 만드는 이유가 없어질 정도)
이건 이제 weights를 바꿔가면서 좀 더 알아볼 예정인데
아니 BN 레이어를 쓰는게 이렇게 다이나믹하게 결과가 바꾸어질 일인가? 싶어서
데이터셋이 normalized되지 않았으면 몰라 참나
아 batch_size=1이고 stateful한 RNN도 포함이 되어 있어서 BN을 쓴다는게 결과적으로는 InstanceNormalization과 비슷한 효과
(https://stackoverflow.com/a/69286469/7820717 참고)를 내긴하는데...
다시 한 번 BN 레이어 빼고도 돌려봐야겠네 그리고 train_loss를 좀 확인해봐야겠다
쩝..혹시나 코멘트 남겨주실 분들은 남겨주십셔ㅠ
BN=1 말고 InstanceNorm으로도 해서 돌려보셈
ㅇㅇ이것도 해봐야할듯 아 근데 이번 프로젝트는 tf로 해야돼서 instancenorm 쓰려면 좀 알아봐야겠네 ㅅㅂ
InstanceNorm 쓰니깐 BN 안 썼을 때처럼 0/1을 2로 분류한다거나, 2를 0/1로 분류한다거나 하는 일은 없는데 (2인 case는 모델의 도움 없이도 쉽게 분류가 가능한 case) BN 아예 안 썼을 때보다 성능이 낮네... 참 씨바 다양하다 다양해
입력이 normalization 되었다해도 레이어 통과하면서는 그게 깨지니까 ㅇㅅㅇ
그냥 layer norm이나 rmsnorm 쓰는게 속편함. weight랑 gradient를 decoupling <- 이게 용어가 있었던거 같은데 Normalization이 없을땐 괜히 드랍 아웃이니 맥스아웃이니 그런 방법들이 생겼던 이유가 있음 ㅋㅋ