Krea-2를 조각내어 분석하기
요약
본 글은 Krea-2와 같은 AI 이미지 생성 모델의 내부 구조를 분석하기 위해 단일 블록 가중치 조정 실험을 수행한 내용을 다룹니다. 특히 텍스트 인코더(text encoder) 편집이 이미지 품질 저하 없이 스타일이나 캐릭터 자체를 변경할 수 있음을 발견했습니다. 이는 모델의 작동 원리를 이해하는 데 중요한 통찰력을 제공합니다.
핵심 포인트
- 모델 내부 구조 분석을 통해 잠재적인 '다이얼' 같은 조절 장치를 탐색함.
- 텍스트 인코더 편집은 이미지 품질 저하 없이 스타일이나 캐릭터를 변경할 수 있음.
- 이러한 접근 방식은 LoRA보다 훨씬 작고 효율적인 파인튜닝 프리셋 제작 가능성을 제시함.
r/StableDiffusion의 동료 AI 생성 고블린 여러분께. 몇 주 동안 제 도구인 Arthemy Krea-2 Tuner: https://github.com/aledelpho/comfyui-arthemy-krea2-tuner를 스트레스 테스트 해왔습니다. 저는 Krea-2의 단일 블록 가중치(weights)를 조정하는 것이 그 내부 구조에 대해 무언가를 알려줄 수 있는지 조사하고 싶었습니다. https://preview.redd.it/ouhfy67e1gvh1.png?width=1600&format=png&auto=webp&s=d96358fb07c9b2d6e81145d79cf93d5aa8c1bb61 저는 두 부분, 즉 모델과 텍스트 인코더(text encoder)에 대해 작업했습니다. (후자에 대해서는 최근에 시작했지만 이전 것보다 훨씬 흥미로운 것 같습니다.) 근본적인 질문은 모델이 아무것도 학습시키지 않고도 스타일, 모양, 색상 또는 이미지의 다른 모든 것을 변경하는 '다이얼(knobs)'을 이미 가지고 있는지 여부였습니다. 몇 주간의 작업과 수천 번에 달하는 렌더링 끝에 저는 총… 단 하나를 발견했습니다! (실망스러울지 모르지만, 아무것도 없는 것보다는 낫습니다.) 이 방법에서 멋진 것이 나온다면 장점은 다음과 같습니다. 아직 공상 과학(sci-fi) 단계이지만, 만약 우리가 이런 방식으로 모델 내부를 매핑하는 데 성공한다면, 학습된 내용 없이도 작은 파인튜닝(fine-tune) 역할을 하는 프리셋을 만들 수 있을지도 모릅니다. 제가 현재 사용하는 프리셋은 34개의 숫자, 몇 백 바이트에 불과하며, 일반적인 LoRA의 수십 또는 수백 MB와 비교할 때 매우 작습니다. 저는 이 접근 방식이 조잡하다는 것을 알고 있습니다. 마치 사냥총(shotgun)으로 차를 쏘아 작동 방식을 이해하려는 것과 같습니다. 하지만 여전히 창문이 어디에 있는지(특정 소리를 내기 때문에) 그리고 어떤 부분이 필수적인지 알려줄 수 있습니다. 부품을 부수고 무엇이 작동하지 않는지 지켜보는 것은 해석 가능성(interpretability) 분야의 오래된 기술이며, 무언가가 '어디서' 발생하는지는 알려주지만 '어떻게' 발생하는지는 알려주지 않습니다. 제가 말씀드리자면: 이 모델들에 대해 우리가 아는 것이 너무 적기 때문에, 저는 이것이 쓸모없다고 생각하지 않습니다. 물론 데이터(data)를 보기 전에 테스트 규칙을 수정했고, 가장 중요한 블라인드 테스트를 위해 여자친구(AI나 제가 무엇을 하려는지 아무것도 모르는 사람)를 불러와야 했습니다. 한계점: 하나의 모델, 거의 항상 한 명의 관찰자(바로 저), 작은 샘플입니다.
결론이 데이터 범위를 벗어날 때는 '🔎'로 표시하는데, 이는 증거가 아니라 단서입니다. TEXT ENCODER 1. Text-encoder 편집은 그려지는 것(장르, 스타일, 캐릭터)을 변경하며, 드로잉 모델에 대한 편집보다 이미지 품질 저하가 훨씬 적습니다. 각 행은 동일한 시드와 프롬프트를 가진 하나의 캐릭터를 나타냅니다. 왼쪽은 원본이고, 오른쪽은 텍스트 인코더 레이어 하나를 두 배(DOUBLING) 적용한 후의 결과입니다. 아무것도 노이즈가 끼거나 망가지지 않지만, 스타일과 심지어 사람까지도 바뀌며, 동일한 레이어가 두 캐릭터를 서로 다른 방향으로 밀어냅니다. 이 부분은 제가 측정했습니다: 표준 품질 지표로 볼 때, 텍스트 인코더 편집은 이미지를 나쁘게 만들지 않는 반면, 드로잉 모델에 대한 프리셋(preset)은 그렇습니다. 최대 강도(x2.0)에서도 어떤 그림도 무너지지 않았습니다. 대신, 일관성이 떨어집니다: 동일한 편집이 서로 다른 캐릭터를 서로 다른 방향으로 밀어냅니다. 20개의 편집 중 단 4개만이 모든 것을 같은 방식으로 움직였습니다. 🔎 제 느낌은 이 편집들이 그림 자체를 손상시키기보다는 프롬프트의 단어들 사이의 연결 고리를 끊는다는 것입니다. 테스트해 보려고 했지만, 제가 가진 이미지로는 일관되게 정의할 수 없었기 때문에, 목적으로 제작된 렌더링이 필요합니다. 2. 애니메이션(Anime)만이 일러스트레이션의 유일한 대체재는 아닙니다. https://preview.redd.it/rr88gxsmvfvh1.png?width=1600&format=png&auto=webp&s=2cb02f9546af6ed1ca194d5d779ac5b5b82d50d3 사람들은 종종 '애니메이션'이 거의 모든 모델의 기본 일러스트레이션 대체재라고 말합니다. Krea-2에서는 그렇지 않습니다. (🔎 저는 Anima와 Illustrious에서 애니메이션이 더 강력한 '기본값(default)' 대체재인 것처럼 보였기 때문에 놀랐습니다.) 프롬프트에서 스타일 단어를 제거했을 때, 한 캐릭터는 매번 애니메이션으로 변했지만, 나머지 일곱 개는 회화나 사진으로 바뀌었습니다. 각각 고유의 기본값이 있습니다. 반면, 가중치 편집(Weight edits)은 캐릭터의 기본값으로 이어지지 않습니다. 각 편집은 그 자체의 목적지(하나는 리얼리즘 쪽, 하나는 카툰 쪽)를 가지고 그려지는 대상에 따라 다릅니다. 🔎 저의 가설: 모든 개념은 모델이 가장 자주 본 스타일과 특성에 기반하여 대체됩니다.
텍스트 인코더 편집은 하나의 기본값으로 밀어내리기보다는, 개념이 이미 근접해 있는 몇 가지 스타일 방향으로 이동하는 것 같습니다. 이것이 캐릭터가 매우 큰 폭으로 스타일을 변화시킬 수 있지만, 오직 작은 범위 내에서만 가능한 이유를 설명합니다: 제 '엘프' 프롬프트는 만화, 애니메이션 또는 카툰으로 변했지만, 사진으로는 절대 변하지 않았고, 같은 편집은 대부분의 다른 캐릭터들을 사실적으로 만들었습니다. 제가 발견한 것은 그 방향을 가리키지만, 그것을 증명하지는 못합니다. 저는 Krea-2의 학습 데이터에 접근할 수 없으며, 동일한 효과는 미학적 파인튜닝(aesthetic fine-tuning) 단계나 텍스트 인코더 자체의 연관성에서 나올 수도 있습니다. 몇 가지 단서가 있습니다: 단일 단어들은 스스로 생성될 때 선입견을 가지고 있습니다: '여성 드워프'는 네 번 중 네 번 모두 수염이 생기고 (짐히를 만족시킴); '제복(uniform)'은 애니메이션 여고생이 되고; '서부(western)'는 카우보이를 그립니다. 정말 놀랍지 않나요? 텍스트 인코더를 변경하면 캐릭터들은 먼저 특정한 특징들을 잃어버리고 나중에 더 '평균적인' 버전으로 표류합니다. 제 하프 오크가 평범한 인간 여성으로 변하고, 여전히 만화 스타일로 그려졌다가, 그리고 나서 그 스타일마저도 잃습니다. 같은 강도의 무작위한 밀어내림은 이런 현상을 일으키지 않습니다: 이는 편집이 어디에 초점을 맞추는지에 달려있지, 얼마나 강한지에 달려있는 것이 아닙니다. https://preview.redd.it/qcsmi2l42gvh1.png?width=1600&format=png&auto=webp&s=debb17fb96f0d7f172800b123468b5224d99776a 3. 쉼표(Comma)는 경계처럼 작용하는 것 같습니다 https://preview.redd.it/yhfsnolzvfvh1.png?width=1600&format=png&auto=webp&s=9936729238e8c722726b2e39cc74e94cc121c374 제가 텍스트 인코더를 편집할 때, 모델이 각 단어에 부여하는 의미가 약간씩 바뀝니다. 이 변화는 두 부분으로 나뉩니다. 하나는 전체 프롬프트에 걸쳐 적용되는 필터와 같은 것입니다. 다른 하나는 국소적입니다: 이웃한 단어들이 2~4개 단위의 패킷으로 함께 움직이며, 이 패킷들은 정확히 쉼표가 있는 곳에서 끊기는 경향이 있습니다. 예를 들어, 'dark green hooded cowl, brass buckles'에서는 'dark green hooded cowl'이 하나의 블록처럼 움직이고 'brass buckles'가 또 다른 블록처럼 움직입니다. 🔎 이는 텍스트 인코더가 쉼표를 사용하여 어떤 단어들이 함께 속하는지 결정한다는 것을 시사할 수 있습니다.
프롬프트 작성자에게 중요한 단서가 될 수 있습니다: 사물과 그 색상을 같은 쉼표 구 안에 넣으면 결합된 상태를 유지하는 데 도움이 되는 것 같습니다. 하지만 저는 이것을 텍스트 인코더가 이미지 모델에 전달하는 숫자를 기준으로 측정했으며, 그림 자체를 기반으로 한 것은 아닙니다. 쉼표의 위치 이동이 실제로 결과물을 바꾸는지, 또는 얼마나 많이 바꾸는지는 아직 확인하지 못했습니다. 4. 무작위화된 프롬프트 (아직 연구 중). 🔎 드로잉 모델을 편집하는 것은 프롬프트 구문이 무작위로 배열되어도 거의 같은 모양을 만들어내는 것 같지만, 그 테스트 결과는 결론을 내릴 수 없었습니다. 텍스트 인코더의 경우 편집 내용에 따라 다릅니다: 어떤 것은 모든 구문의 순서를 같은 결과물로 보내고, 다른 것은 그것들을 다양한 장르에 걸쳐 분산시킵니다. 아직 왜 그런지는 모르겠고, 연구하고 있습니다. 각 열은 문구 배열이 재배열된 동일한 프롬프트를 보여줍니다. 첫 번째 행은 기준선(baseline)을 보여주며 제가 얻으려 했던 것이 어떤 것인지 아이디어를 줍니다. 이제 마지막 행을 보세요... 대체 무슨 일이 일어나고 있는 건가요? 같은 편집인데도 말이죠! 5. 텍스트 인코더의 첫 번째 레이어를 꺼버리자, 모델이 그림을 그리는 대신 프롬프트를 작성합니다. https://preview.redd.it/dint6566kgvh1.png?width=1600&format=png&auto=webp&s=ee191728324fa575da5402e445b19aea89e3e072 레이어 0의 어텐션(attention)을 꺼버리자, Krea-2는 4개의 프롬프트에서 4페이지 분량의 텍스트를 그렸으며, 읽을 수 있는 프롬프트 조각(
중간 블록들은 콘텐츠를 변경하며, 시각적 결함이 적어 더 강하게 밀어붙일 수 있습니다: 경우의 19%에서 표면 손상이 발생하여 마지막 블록들의 79%와 비교됩니다. 물론 무료는 아닙니다. 2. Block 23만으로도 포화(saturation) 조절기 역할을 합니다. 프롬프트에 “colorful” 또는 “high saturation”을 작성하면 콘텐츠가 훨씬 더 많이 변경됩니다. 그렇다고 해도, 후반 작업(post-production)에서의 수정만큼은 효과적이지 않습니다 (어쨌든 이것들은 진정한 노브가 아니라 노브의 근사치일 뿐입니다). 하지만 만약 당신의 병합(merges)이 평균적으로 너무 생생하거나 너무 탁한 색상으로 기울어지는 경향이 있다면, 여전히 조정하는 것이 유용할 수 있습니다. https://preview.redd.it/aqdfpmh5wfvh1.png?width=1600&format=png&auto=webp&s=332042b7652ea03c3c3e1e3d84f70d2f4ad2e059 3. 특정 가중치(weights) 보정은 이전에 본 적 없는 캐릭터에서도 그 모습을 유지합니다. 저는 네 명의 초상화에 눈으로 가중치 이동값(weight shifts) 세트를 보정하여 (사전 설정, preset), 이를 세 명의 새로운 캐릭터에 적용했습니다. 어떤 사람이 어느 이미지가 사전 설정을 가지고 있는지 모른 채 선택했을 때, 제가 설명한 모습과 가장 가깝다고 고른 비율은 56/56이었습니다. 얼굴은 시드(seed) 변경보다 조금 더 많이 변합니다. 이 사전 설정(The Preset): 애니메이션에 대한 매우 가벼운 터치로 의도되었습니다: 평평한 색상, 단순한 선과 모양. 사전 등록된 테스트를 통해 확인했습니다. 렌더링 결과는 날짜가 다른 경우에도 픽셀 단위로 동일하게 재현되며, 튜너(tuner)를 0으로 설정해도 아무것도 추가되지 않습니다. 사소하게 들리지만, 모든 것이 여기에 달려 있습니다: 차이점은 파이프라인에서 오는 것이 아니라 편집에서 옵니다. 이것 없이는 전체 연구가 무의미했을 것입니다. 텍스트 인코더의 출력이 얼마나 멀리 이동하는지 측정함으로써 이미지가 얼마나 많이 변경될지 예측할 수 있습니다 (상관관계 0.71 및 0.80). 이는 주로 서로 다른 종류의 편집을 구별하는 데 효과적입니다. 품질 지표(Quality metrics)가 모든 것을 볼 수는 없습니다. DINOv2, BRISQUE 등은 중간 블록들이 만든 콘텐츠 변경 사항을 정확히 놓쳤는데, 이는 육안으로 명확했습니다. 게다가, 저는 아직 신뢰할 수 있는 자동적인 “공정한 심사위원”을 찾지 못했습니다: LLM을 사용한 시도에서 판단이 신뢰할 만하지 않았습니다.
그래서 지금은 원시적인 방식으로 많은 이미지를 손으로 살펴봅니다. 다음 단계는 무엇일까요? 이것이 다른 모델에도 적용될지는 모르겠지만, 아직 다른 아키텍처로 실험할 시기는 아닙니다. 먼저 이러한 이동(shifts)들의 많은 속성들을 수집해서 단단한 기반을 마련하고 (그리고 그것들이 실제로 무엇을 하는지 이해하기 위해) 싶습니다. 그런 다음에는 다양한 아키텍처를 가진 모델에서 이것들이 유지되는지 확인할 것입니다. 만약 그렇다면, 이는 확산 모델(diffusion models) 전반의 속성이 될 것입니다. Claude나 Gemini에게 도움을 요청하는 데 관심 있는 분들을 위한 마지막 팁이 있습니다. 제가 LLM을 사용하여 데이터 생성에 도움을 받는 것을 두려워하지 않는다고 말할 수 있으며, 이미 몇 가지 문제를 목격했습니다: 기억에서 인용한 숫자들(그것이 가져오는 모든 오류와 함께)과 성급한 결론입니다. Claude Code나 Antigravity로 실험을 실행하고 싶다면, AI에게 스크립트만 작성하도록 하세요. 그런 식으로 숫자가 AI의 '생성적' 측면을 거치지 않고, 오직 사용자가 외부 환경에서 직접 실행하는 선형 과정만을 거치게 할 수 있습니다. 모든 이미지와 잘못된 것으로 판명된 것들을 포함한 전체 보고서는 https://aledelpho.github.io/diffusion-models-weight-steering-report/results/index.html 에 있습니다. 흥미로운 것이 나오면 알려드리겠습니다. 건승을 빕니다! /u/ItalianArtProfessor 제출 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/StableDiffusion의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기