https://github.com/aria1th/Hypernetwork-MonkeyPatch-Extension

도대체 저게 뭐임? 하는 사람들이 많아서 정리...


1. Extension에서 바꾸는 것들


Hypernetwork 작동 관련 함수들

여러 Hypernetwork를 순차적으로 처리하는 기능(단, 학습은 불가능, 이론상 가능은 하지만 구현하지 않음.)

Training 관련 코드



2. 버그 수정들

a) 학습 도중 .csv 파일을 외부적으로 열었을때 OSError가 뜨는 현상 수정

b) 학습시 Hypernetwork strength를 적용하거나 변경할 수 있는 현상 수정 (학습시 strength는 무조건 1로 적용됨)

c) 학습 도중 preview를 생성할 경우 torch.manual_seed를 불러서 RNG state가 고정되는 현상 수정


3. 향상된 기능

a) 가변 해상도 또는 이미지 크기, 학습시 crop을 하지 않더라도 이미지가 심각하게 왜곡되거나 하지 않음. (단, batch size는 1로 할것)

b) Optimizer를 이미지 생성시 언로드하여 OOM(메모리부족)에러가 발생하는 빈도 감소 (3070 8GB으로도 옵션없이 학습 가능)

c) 기타 메모리 관련 패치


4. 추가된 기능 1- Beta hypernetwork


1. 가변 Dropout rate

Dropout rate를 0.3이 아닌 다른 숫자와 구조로 사용 가능. 단, 사용시 layer structure와 같은 sequence 형태여야 함
(예를 들어 1, 2, 2, 2, 1 이라면 0, 0, 0.05, 0.08, 0 같은 식)


2. Weight initialization seed 고정, Normal 사용시 0.01이 아닌 다른 숫자의 standard deviation 사용 가능.

Reproducability, 재생산성을 위해 필요한 기능임.


3. 추가 정보 기록 가능


그러나 이러한 추가 정보나 드롭아웃 구조는 Extension이 존재할때만 로드 가능하고, 없을 경우 그냥 평범한 하이퍼네트워크로 로드됨.


5. Train Gamma 탭

이름에 별 의미는 없음



Gradient accumulation의 경우 main repo에도 적용된거로 알고있음.

여기서는 간단히 Cosine annealing learning rate scheduler와, 그 역할을 보여줄까 함.

(가변 해상도는 그냥 간단히 태그만 붙여서 학습한다 보면 됨)




여기서 위 그래프가 Learning rate, 아래 그래프가 Loss임.



참고로 이것도 12월 8일에 패치를 했는데, 메인에 있던 RNG 버그가 또 발생해서 다시 고침.


패치 전 - loss가 매우 주기적으로, 그러나 감소하는 경향을 볼 수 있었음. 이는 이미지 프리뷰 생성시 rng가 다시 초기화되어 일어난 일이었고, 고쳐졌음.



아무튼 cosine annealing을 위해 쓰이는게 이 옵션인데


스케쥴러가 최소 학습률에 도달했을때 모델 상태를 저장하거나 프리뷰를 생성하는 기능임.


왜 이런 짓을 할까? 는 아래 그림을 봐주면 됨




https://openreview.net/pdf?id=BJYwwY9ll



우리는 하이퍼네트워크를 훈련시킬때 여러 진척을 보고서 '가장 보기 좋아보이는' 후보를 흔히 선택하는데, 이는 위 논문에서 말하는 '후보군 추출'과 일치함.


즉 global minima는 아니더라도, pseudo-minima에서 이를 저장함으로써 후보군을 더욱 안정적인 상태에서 볼 수 있음.


흔히 지식의 drift과정이 이루어지는 단계를 회피한다고 생각할 수 있음.


(나아가서는 ensemble, 즉 여러 hypernetwork의 결과를 종합해서 결과로 사용하는 것도 물론 가능함!!)


이를 적용할때는 0, 0으로 기존 preview 생성을 끄는걸 추천함.





귀여운 하이바라나 보고 가시오

 




원래는 main repo에 pr를 많이 했는데, 지금 webui코드 상태가 정말 엄청나게 꼬여있어서 그냥 extension으로 유지하는게 낫다고 생각함.

물론 다들 잘 된다는 의견이 많기는 한데 그래도 training 자체를 분리하는게 좋다고 봄.