Weighted loss (이하 WL) 와 Custom Diffusion (이하 CD) 를 사용하여 비교 자료를 만들어봤습니다.
이거 만드는 내내 우여곡절이 많았는데...
어느정도 완성 단계에 도달했을 때 결과물에 오류가 발견되서 다 갈아엎는것만 다섯번 이상 됬던거 같습니다.
길어봐야 한 이틀정도면 끝나겠다 싶은게 일주일 넘게 걸렸네요
오류의 발견은 auto1111의 풀 리퀘스트에 올라온 Deterministic training를 적용하면서 알게 됬습니다.
이 기능을 사용하면 학습값과 데이터셋이 같으면 동일한 결과를 얻을 수가 있어 비교할 때 매우 유용합니다..만..
임베딩과 CD를 번갈아 가며 사용할 때 학습 결과가 누적되는 매우 치명적이 버그가 발견됬습니다.
결국 생성 된 자료는 다 날려버리고 검증하는 단계를 거치고 나서야 겨우겨우 완성했습니다
이게 Deterministic training이 문제인지 아니면 CD 문제인지 정확하지 않아서 (예상으론 CD같음)
현재 이것들을 권하기가 어렵습니다.
CD는 확장기능으로 만들어졌으므로 바로 사용해볼 수 있습니다.
그리고 WL은 공식으로 업데이트 된 것이 아니므로 지금 여기서 다루는 모든 것들은 직접 간단히 코드를 손본 것들입니다.
테스트는 임베딩과 CD에 WL을 각각 적용해서 한 종류의 데이터셋에 4번 이상 테스트 했고,
이 중에서 그나마 비교하기 좋은 데이터셋을 선정해서 작성했습니다
일단 시작하기에 앞서 임베딩과 CD에 동작에 대해 대강 이해하고 넘어가야 이해에 도움이 좀 됩니다.
임베딩은 사용하고 있는 모델이 훈련 하고자하는 이미지와 비슷하게 학습 된게 있다면 그쪽으로 최적화를 진행해서 손실률을 낮춥니다.
이렇다보니 당연히 모델의 특성(어떤 것을 주로 훈련했는가)을 많이 탄다는 장점같은 단점이 존재해서 새로운 개체를 학습시키는데 고초를 격을 수 있습니다.
CD는 cross-attention(자연어 처리(NLP) 모델에 사용되는 혼합 메커니즘) layer에 있는 키 및 값(KV) 프로젝션 매트릭스를 최적화 합니다.
훈련 중 가중치 변화의 5%정도 비교 분석해봤는데 그중에 cross-attention 이 다른 레이어보다 훨씬 높았습니다. 바로 이 부분을 최적화 한게 CD 입니다.
이 글의 목적은 적은 데이터셋과 낮은 학습단계로 CD를 사용하면 어떤 결과가 나오는지 확인하는 것이 목적입니다.
논문에서는 200개 정도의 정규화 이미지를 사용했다고 나오지만 저는 사용하지 않고 진행했습니다.
이 이미지를 얻는건 어렵지 않습니다.
CD 공식 저장소 에서 Single-Concept Fine-tuning 부터 따라서 진행하면 됩니다.
그러면 해당 쿼리에 맞는 정규화 이미지와 캡션을 자동으로 받아서 진행할 수 있습니다.
꼭 CD를 쓰지 않더라도 다른 훈련 방식에 매우 유용할겁니다.
일단 임베딩의 특성을 이해시키기 위해 모델에 이미 학습되 있는 것과 아닌것 이렇게 두개를 준비했습니다.
하나는 스타워즈의 R2-D2
또 하나는 애니메이션 검볼 입니다.
공식 사이트에서 제공되는 자료로 대상의 공통 된 이미지를 수집하는게 원할해서 선정했습니다.
각 이미지의 출처는 공식 사이트에서 제공하는 영상에서 캡처하였습니다.
https://www.starwars.com/video/r2-d2-captured-by-jawas
https://gumball.cartoonnetworkasia.com/video/gumball-exciting-elmore
1.R2-D2 임베딩
우선 R2-D2 먼저 보겠습니다.
제가 쓰는 모델에선 프롬프트 입력하면 바로 나옵니다.
임베딩 이름은 r2d2 프롬프트와 연관되지않는 이름으로 지었고, 벡터는 3개로 했습니다.
나머지는 기본 설정에 템플릿은 subject로 설정하고(캡션 사용 안함) 100스텝으로 학습시켰습니다.(1분30초 정도 걸림)
80스텝만에 바로 나오죠?
이게 임베딩입니다.
새로운걸 학습시키는 것 보다는 기존에 있던것을 더 좋게 보강하는쪽으로 써먹으면 효과가 매우 좋습니다.
물론 잘만 이용하면 완전 다른걸 만들어 내는게 다른 학습방법들 보다 좋을 수 있습니다.(90스텝 참고)
예를들어 돼지랑 개랑 말이랑 합쳐진 혼종을 만들어낸다던가 하는것들 말이죠 ㅋ
R2D2는 임베딩이 무엇인지 간단히 설명하기 위한 자료라 여기까지만 다룹니다.
그럼 바로 다음으로 넘어가겠습니다.
2. 검볼 학습하기
검볼은 제가 쓰는 모델에서는 아무리 프롬프트를 넣어봐도 안나오더라구요
논문에서 새로운 대상을 학습하는걸 강조하던데 여기서도 마찬가지로 모델에 학습되지 않은걸
학습시킬 땐 어떤 문제가 발생하고, 어떻게 해결해 나가면 되는지를 다루었습니다.
그래서 정상적인 결과를 얻은건 없다는걸 미리 말씀드립니다.
여기부터는 검볼(줄여서 GB로 씁니다) 입니다.
단순 캐릭터 같은 경우 벡터를 크게 잡지 않는게 좋습니다.
저는 3으로 적용했는데 이 이상으로는 오히려 뭉게지는 현상이 발생해서 수치를 낮춰보니 3이 가장 잘 나왔었습니다.
초반부터 뭉게지는 현상이 발생한다면 벡터를 줄이거나 높여보시기 바랍니다.
그리고 사진이 아니기 때문에 subject가 아닌 cartoon 이 들어가는 템플릿을 별도로 생성해 적용했습니다.
앞서 임베딩은 모델에 학습 된 데이터로 최적화를 진행한다는 것을 이해했다면
템플릿을 학습하고자 하는 이미지 스타일과 비슷한 형태로 만들도록 유도하는 것이 매우 중요하다는 것을 알게 됬을겁니다.
그렇다고 너무 지나치게 동일하게 만들게 되면 템플릿에 사용 된 프롬프트와 모델의 의존도가 높아져 오히려 유연성을 해칠 수 있습니다.
적당히 조절해주고 각 개별 변경점은 캡션으로 처리합니다.
먼저 검볼 캐릭터 하나만 바라보고 가장 비슷하게 나올만한 템플릿을 찾는 과정을 거치는게 좋습니다.
방법은 간단한데, t2i에서 webui의 처음 설정값(Euler a, steps 20, cfg 7)으로 템플릿에 사용할 프롬프트를 돌려보는 겁니다.
저는 두 개만 적용했습니다.
a cartoon character of [name]
a [name] in the style of cartoon network
이 두개는 각각 다음과 같은 이미지들이 나옵니다.
a cartoon character of blue cat |
a blue cat in the style of cartoon network |
많이 다르다고 생각될 수 있지만 만화같은 느낌만 나오면 됩니다.
저는 템플릿과 캡션이 얼마나 많은 차이를 가져오는지 보기 위해 처음에는 템플릿만으로 작업을 시작했습니다.
그리고 모델에 학습된 데이터가 없다보니 학습을 많이 해야 될거 같아 스텝을 1000으로 적용했습니다.
여기서부터는 벡터와 손실 그래프도 같이 올립니다.(클릭하면 크게 볼 수 있습니다)
2-1. GB1 / ED / 13:44
결과가 매우 안좋죠?이건 당연한데.. 임베딩에서 1 배치로 1000스텝은 낮은 수치입니다.
이보다 훨씬 높아야 되죠.그래도 선이나 색은 어느정도 찾아냈습니다.
아래 손실 그래프를 위와 비교하면서 보면 좋습니다.
벡터 그래프에 대해서는 좀 더 아래에서 다룹니다.
2-2. GB1 / CD / 14:36
기존것과 비교할수 있도록 양쪽으로 이미지를 나열했습니다.
왼쪽이 임베딩 결과, 오른쪽이 CD 결과입니다.
여기서 CD의 진가를 약간 엿볼수 있습니다.
ED에 비해 형체가 어느정도 나오기 시작하는게 보이죠
그렇다고 원하는 결과는 아닙니다
그래프 왼쪽에 파란색 곡선은 평균 손실률 입니다.
평균 최저와 최고의 간극이 낮아질수록 분홍색 실선과 평행 점선이 벌어지는 각도가 줄어듭니다.
이게 좁혀져야 안정적인 훈련이 되었다고 볼 수 있죠
그런데 손실 값을 위 이미지결과와 1:1 비교를 위해 25단계마다 기록되도록 했더니 정확한 수치 확인이 어렵더군요
더 정밀하게 조정하려면 1단계마다 기록되도록 했어야 했는데 저는 그냥 이대로 진행했습니다...
이제 WL를 적용해보겠습니다.
저는 https://github.com/thygate/stable-diffusion-webui-depthmap-script 확장기능을 이용해서 dpt_large_384 (midas 3.0) 모델을 사용해 뎁스맵을 출력하고, 파이썬으로 코드를 작성해 원본 이미지에 알파값으로 넣었습니다.
해당 확장기능에는 배경을 지우는(일명 누끼) Rembg 모델도 지원하나 정확하게 대상을 가려내지 못하므로 어쩔수 없이 뎁스맵을 이용해야 했습니다
배경이 완벽히 제거되지 않아서 문제가 생길겁니다.
2-3. GB1 / ED / WL / 10:48
아.. WL도 해결이 안되네요
캡션을 사용하면 과연 나아질까요?
2-4. GB1 / CD / WL / 10:55
반면에 CD는 약간 개선된게 보이지만 그래도 많이 부족하네요
아무래도 캡션을 사용해야 될거 같습니다.
3. 캡션 사용하기
학습이 단계별로 진행 될 때 템플릿에 작성 된 프롬프트를 라인별로 순차적으로 출력합니다.
사전에 만든 템플릿은 두 개만 작성했는데 캡션은 호출되지 않습니다.
캡션을 포함시키려면 [filewords]를 추가해주어야 됩니다.
a cartoon character of [name], [filewords]
a [name] in the style of cartoon network, [filewords]
이렇게 새로 텍스트 파일을 만들고 템플릿에 저장해 줬습니다.
그러면 [filewords] 대신에 이미지에 해당하는 캡션이 출력됩니다.
이제 캡션을 작성할 차례입니다.
캡션을 작성할 때 아주 유용한 확장기능이 하나 있습니다.
https://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor
이걸 이용하면 매우 편하게 캡션 작업을 할 수 있습니다.
Edit Caption of Selected Image > Interrogate Selected Image 로 이동하면 Interrogator를 이용할 수 있어서 먼저 돌리고
캐릭터를 집중적으로 학습할 수 있도록 방해가 되는 부분들을 수정 해주었습니다.
예를 들자면 아래 배경은 캐릭터를 부각하기 위해 피사계 심도(Depth of field)를 적용하여 배경을 뿌옇게 주고 있습니다.
이 상태로 학습을 진행하면 캐릭터 뿐만 아니라 배경에 있는 나무들과 집 그리고 이펙트까지 다 학습합니다.
데이터셋 태그 에디터를 이용해서 해당 이미지에 대한 프롬프트를 뽑습니다. 저는 DeepDanbooru 를 사용해서 뽑았습니다.
여기서 불필요하다고 생각되는것을 처냅니다.
이렇게 수정해서 이쪽으로 학습이 되는것을 최대한 방지하도록 합니다.
3-1. GB1 / ED / 10:45
나아진건가?
요놈은 손실률로 비교해 보는게 좋을거 같습니다.
개선된 부분이 안보이네요
CD 한번 보겠습니다.
3-2. GB1 / CD / 11:42
이것도 별로 나아진게 없어 보이네요 (머쓱)
다만 임베딩과 비교해서 뒷 배경과 캐릭터간의 분리는 잘됬습니다..
손실률도 보죠
손실률은 더 좋게 나왔는데 배경과 걸러지면서 배경에 대한 손실률만 줄어든걸로 판단됩니다...
의미있는 결과를 보여드리고 싶었으나 캡션 작업하는게 너무 지겹거든요..
WL이 있는데 이렇게 까지 해야 되나.. 싶어서 그냥 스킵합니다.
이젠 학습량을 늘려보겠습니다.
4. 학습량 늘리기
결과들 보면 실망이 클테지만.. 학습량이 매우 저조해서 그렇습니다
원래는 더 많이 해야되는데 CD 성능을 보려고 적게 잡은거죠
이제부터는 Batch size를 늘려서 더 많은 학습을 진행하도록 하겠습니다.
Batch size는 한번에 학습할 갯수를 나타냅니다.
아래 공식대로 데이터셋 갯수와 맞추면 됩니다.
Batch size * Gradient accumulation steps = 데이터셋 갯수
Gradient accumulation 는 메모리를 더 효율적으로 사용하고자 할 때 사용되기에 저는 배치 사이즈만 4로 올렸습니다.
대신 크기가 커질수록 VRAM을 더 많이 소비하므로 학습이 아예 안되거나 도중에 중지될 수도 있습니다.
이럴 땐 크기를 줄이거나 Gradient accumulation 를 적당히 조절해서 학습을 이어가는게 좋습니다.
현재 설정 된 상태로 학습을 진행하게 되면 같은 시간대비(10분기준) 두 배 더 많은 학습을 진행할 수 있습니다.
위에서는 1000스텝에 10분걸렸으니 같은 시간대로 2000스텝을 학습하게 되는 효과를 얻게 된다는거죠
배치크기 4로 1000 스텝을 학습하면 20분 정도 걸리므로 총 학습량은 4배정도 됩니다.
물로 이것은 4개의 데이터셋 기준이므로 하드웨어나 환경에 따라 달라질 수 있습니다.
4-1 GB1 / ED / B:4 / 11:42
캡션 사용, WL활성, 배치 1/ 캡션 사용, WL비활성, 배치 4
WL을 사용하지 않았는데도 학습량이 늘어나니 개선되는게 보입니다만 캡션을 더 잘 작성했더라면 훨씬더 나은 결과가 나왔을거 같습니다.
그래서 WL을 사용하지만 이를 쓰지 않고도 할 수 있는 방법으로 배경을 포토샵이나 김프같은 에디터 툴을 이용해서
지우는 방법을 사용할 수도 있습니다.
배경을 단순화 시킴으로써 캡션 정확도를 높이는거죠
캡션에 작업하는 것 보다 월등히 좋은 결과를 가져오므로 대안책으로 사용하기 좋습니다.
다음은 CD 입니다.
4-2 GB1 / CD / B:4 / 11:42
둘다 WL이 비활성화 된 것끼리 비교했습니다.
기존엔 색상정도만 학습되다가 학습량이 많아지니 형체가 들어나기 시작합니다.
손실률도 확인해보죠
1000스텝에 가까워지니 하늘을 뚫고 가네요
이렇게 되면 1000스텝 이상 학습의 의미가 없을 수 있습니다.
이제 캡션을 사용하고 WL도 활성한 것 끼리 비교해 보겠습니다.
4-3 GB1 / B:4 / ED / WL / 11:42
이것도 나아지긴 했는데 CD만큼은 아닙니다.
4-4 GB1 / B:4 / CD / WL / 11:42
조금 더 나아졌지만.. 생각보다 너무 저조한 성적입니다.
예상엔 이미지를 아예 누끼를 따서 이를 마스크로 이용해야 될거 같습니다.
4-5 GB2 / B:4 / ED / WL / 11:42
아예 배경을 날려버렸기 때문에 아마 캡션을 안쓴쪽이 더 잘나올걸로 판단해서 캡션 쓴것과 안쓴것 두개를 출력해 비교해봅니다.
캡션 미사용 / 캡션 사용
역시나 캡션 안쓴쪽이 약간 더 나은 결과를 가져왔네요
배경과 관련 된 캡션때문에 오히려 악영향을 미쳐 지금은 안쓰는게 더 좋습니다.
그리고 ED는 더 이상 좋아질 기미가 안보이므로 괜히 작업량이랑 스크롤만 길어지니깐 작업을 중단했습니다.
이제부터 CD로만 내용을 이어나갑니다.
4-6 GB2 / B:4 / CD / WL / 11:42
CD도 마찬가지로 기존 캡션 넣은것과 캡션 뺀것을 비교해봤습니다.
구 이미지 / 새 이미지
개선 된거 맞..죠?
확실히 캐릭터 위주로 나오기 시작하는데 형태가 썩 좋다고는 못하겠네요 ㅋ
암튼 이제부터는 캐릭터에 집중해서 작업을 진행하면 됩니다.
종종 사륜안이 튀어 나오거나 코가 안나오는 등 문제가 있는데 이유를 대강 예측해보자면
1. 잘 못 된 데이터셋 이미지
학습에 사용 된 이미지가 동일한 부분을 찾기 힘든게 있습니다.
눈 같은 경우 앞을 보는지 뒤를 보는지 ai는 구별이 힘들기 때문에 데이터셋을 변경하거나 더 많은 데이터셋이 필요할걸로 예상되네요
2. 캡션 누락
이전 캡션엔 배경이 들어가 있어 아예 캡션을 뺐는데
이를 좀 더 캐릭터 위주로 조절하여 캡션을 추가해야 될 걸로 판단 됩니다.
예를 들어 어느 방향으로 바라보고 서있는지, 어디를 처다보고 있는지 등등 학습의 범위를 조절하는거죠
저는 적은 수의 데이터셋으로 어느정도 퀄리티가 보장되는지 보는게 목적이므로 2번안으로 보강해보고자 합니다.
캡션을 위에서 했던 작업으로 진행하되 이번엔 좀 더 정교하게 캐릭터 위주로 뽑아서 수정합니다.
아까 누끼딴걸로 Interrogator를 돌리면 배경이 있을 때 보다 더 정확하게 프롬프트를 뽑아 낼수 있습니다.
입을 다물고 있는데 벌리고 있다고 하네요... 코 주변을 입으로 판단하는듯
이런것들 다 처내고 시선이나 자세같은걸 추가로 넣어줬습니다.
아래는 캡션을 사용하여 뽑았습니다.
4-7 GB2 / B:4 / CD / WL / 11:42
사륜안은 어느정도 잡혔는데 캐릭터는 더 망가졌습니다.. ㅋ
775스텝의 결과가 가장 이상적이지만 실제로 저렇게 나올 가능성은 매우 희박합니다.
캡션을 더 수정해보려 했으나 아마 결과가 크게 나아질 것 같지는 않아서 다음 단계인 학습률로 진행합니다.
5. 학습률 (Learning rate)
CD 확장기능에는 Embedding Learning rate 과 KV Learning rate 있는데 KV가 CD학습률을 조정하는데 쓰입니다.
우선 KV는 나중에 조절하고 임베딩 학습률을 조절하여 결과를 비교해보겠습니다.
간단하게 학습률과 학습단계는 다음 특성이 있습니다.
학습률은 벡터 가중치에 영향이 크고,
학습 단계는 학습률에 따라 손실률에 큰 영향을 줍니다.
학습률이 크면 가중치가 마구 튀어나가는 것을 볼 수 있습니다.
그러면 위 그림과 같이 점점 위아래로 벌어지기 시작하죠
반면에 작아지면 앞으로 뻗어나가기 시작합니다.
이 가중치들이 너무 벌어지거나 너무 많은 단계를 거치게 되면 다른 프롬프트들을 압도해버리는 상황이 생깁니다.
가중치가 학습 데이터셋에 지나치게 맞춰지면서 다른 프롬프트가 말을 안 듣게 되는거죠
반면에 너무 낮추면 미세하게 학습을 하기에 가중치 변화가 적어져 학습하는 시간이 너무 늘어나게 됩니다.
보통 학습률을 낮추면 한 스텝을 학습하는데 오래걸리는걸로 알고 있는데
그게 아니라 한 스텝 학습시간은 차이가 별로 없는데
변화가 미미하다보니 그 단계를 길게 잡아야 되서 시간이 늘어나게 됩니다.(이 부분에 대한 결과는 마지막 쯤에 있습니다.)
그래서 이 두 상황에 가장 적절한 값을 찾는게 중요합니다.
여기선 과정에 대해서만 설명합니다.
그럼 우선 임베딩 학습률 먼저 조절해보겠습니다.
5-1. GB2 / B:4 / CD / WL / lr 0.001
학습률을 0.005에서 0.001로 줄였습니다.
그러면 훨씬 정교하게 학습 됬을거라 생각하고 더 나은 결과가 나오겠지? 라고 생각하겠지만
앞서 말했다시피 학습률이 낮으면 낮을수록 스텝수를 증가시키지 않으면 결과는 엄청 나아지지는 않습니다.
하지만 저는 비교를 위해 계속 1000스텝으로 이어나갑니다 ㅋ
이제부터 벡터 그래프 위주로 봅니다.
앞서 보았던것들과 다를바 없어 보이지만 가중치가 기존 0.4에서 0.15로 확 줄은걸 볼 수 있습니다.
그래프 옆에 Average vector strength는 가중치가 어느정도의 세기(strength)로 변경됬는지 평균치를 나타내고,
Average vector magnitude는 어느정도의 크기(magnitude) 로 변화됬는지의 평균치 입니다.
쉽게 말해 strength는 스텝별 얼마나 꺽여졌는가
magnitude는 그 수치로 인해 얼마나 벌어졌는가 라고 보면 되겠습니다.
일단 두 그래프를 비교해 봤을 때 평균 0.1정도의 세기와 2정도의 크기는 문제가 많구나 생각하시면 됩니다.
근거가 되는 이유로 출력물을 올리고 싶었으나 지금 스크롤 너무 길거든요 ㅋ
그러니 직접 해보시면 되겠습니다.
이번엔 손실률 한번 보겠습니다.
뭐 이미 앞서 이미지 결과를 보면 알겠지만 크게 차이 없을거라고 예상할 수 있을겁니다.
차이 없죠?
그럼 조금 더 조절해 보겠습니다.
5-2 GB2 / B:4 / CD / WL / lr 1e-3:200,5e-4:300,1e-4
기존 학습률은 학습량이 늘어나면 엉뚱한 결과를 가져올 수 있습니다.
제 경험상 최대치는 ± 0.18 미만이 적절하다고 판단됩니다.
이 이상 넘어가면 너무 독단으로 가중치가 조절되서 써먹기 힘들어지더군요
이것을 앞으로 쭉 뻗어가도록 조절하기위해 3단계로 나누어 학습률이 조절되도록 했습니다.
그래프는 의도한대로 나왔습니다.
0.0005에서 조금씩 벌어지려 하던것을 0.0001로 값을 조절하여 앞으로 뻗어나가게 했습니다.
그런데 이게 중요한게 아니라 결과가 중요하죠
0.001은 처음에만 이상한게 껴있다가 나중엔 어느정도 형체를 갖추고 출력되고 있습니다
반면에 단계별로 조절 된 오른쪽 그림에선 이상한 것들이 껴있죠
그래프에서 300스텝부터 자세히 보면 가중치가 미세하게 조절되고 있는걸 볼 수 있습니다.
변화가 작다보니 처음 어지럽게 퍼져나가던 형태에서 그대로 앞으로 뻗어나가게 되면 그 학습 된 형태가 굳어지면서 조금씩 변화를 거치게 됩니다.
그래서 왼쪽보다 더 다양하게 튀어나오게 되는겁니다.
이렇게 되면 세 가지 선택 사항이 주어집니다.
첫번째는 더 높은 학습률을 적용하는 것이고
두번째는 단계별 학습률을 조절하거나
세번째는 더 길게 학습하는겁니다.(step을 높인다는 뜻)
여기서 두번째 방법인 단계별 학습률을 약간 더 조절해봤습니다.
우선 이 작업 전에 CD의 학습률을 조절해 어떤 결과를 보여주는지 보겠습니다.
5-2 GB2 / B:4 / CD / WL / lr 1e-3:200,5e-4:300,1e-4 / KV lr 5e-6
그래프에선 크기가 좀 더 증가한것 빼고는 크게 변화가 없는거 같습니다.
반면에 결과는 엄청 다릅니다.
이건 어느정도 예상이 됬던건데 KV 의 기본값은 1e-5 입니다.
여기서 0.000005를 더 줄인거라 아마 더 다양하게 출력될거다 라고 예상했었거든요
이 상태라면 학습률을 더 높여야 될 것으로 판단됩니다.
이번엔 KV를 고정하고 다시 임베딩 학습률을 조절해 보겠습니다.
5-2 GB2 / B:4 / CD / WL / lr 1e-3:300,5e-4:500,1e-4 / KV lr 5e-6
이번엔 수치는 그대로 두고 단계만 조절했습니다. 0.001과 0.0005는 더 크게 잡고 나머지를 줄이는 쪽으로 변경합니다.
벡터 세기는 0.02까지 크기는 0.4로 증가했네요
1e-3:200, 5e-4:300 / 1e-3:300, 5e-4:500
좀 더 개선됬지만 사륜안이 기승을 부리기 시작했네요
더 이상 진행하면 너무 길어지니 여기까지만 해야겠습니다.
마지막으로 2500 스텝까지 학습한 CD로 마무리 짓겠습니다.
1000 스텝까지는 벡터 그래프에서 어느정도 움직임이 보이더니 앞으로 쭉 뻗어나가고 손실률도 점점 안정세를 취하더니 결과물도 1000스텝부터는 다양성이 점점 죽어가기 시작하면서 학습 이미지로 굳어지는 모습이 보여집니다. 한마디로 개같이 실패했다 이말이죠
논문에서는 배치8 기준 싱글컨셉은 250 스텝, 멀티컨셉은 500스텝으로 결과가 나왔다고 적혀있는데 거기엔 정규화 이미지가 포함되어 있습니다.
아무래도 여러 여건상 여기에 시도한 데이터셋으론 논문만큼의 결과를 얻는건 힘들것 같고 CD 확장기능도 제대로 다 지원하는건 아니라서(멀티컨셉은 미지원 같음) 개선해야될 부분이 많은거 같습니다.
그래도 임베딩 보다 나은 결과는 확실하게 보여주고 있고, 특성을 잘만 이용한다면 빠른 학습을 통해서 다양하게 응용할 수 있을걸로 생각됩니다.
암튼 이쪽에 처음이신 분들도 알아들을 수 있도록 작성하려고 노력했는데 잘 전달됬는지 모르겠습니다.
그냥 참고용으로 보시면 될거 같고, 삽질 횟수를 줄이는것도 목적에 포함되어 작성 된 글이라 내용이 엄청 길어졌습니다.
요즘 기술들이 점점 발달하면서 데이터셋도 줄어들고 학습단계도 점점 줄어들면서 편의성이 점점 좋아지곤 있으나
뜻하는 결과를 얻는데 까진 아직 부족하다고 생각됩니다.
최소 2개의 이미지로 캡션 없이 더 낮은 학습단계로 학습 될 필요가 있어 보이거든요
로라가 나온 이후로 이걸 접목하려는 시도가 많은거 같은데 CD와 결합됬을 때 어떻게 될지 궁금하네요