StyleRoom Tech · Vol.03

벌룬핏이
벌룬핏으로 안 나옵니다

이 한 문장에서 LoRA 프로젝트가 시작됐습니다

스타일룸이 셀러에게 파는 것은 "이 옷을 입은 사진"입니다. 옷 사진을 올리면 모델이 입은 착장샷이 나옵니다.

상세페이지에 올라가는 사진이므로 기준이 하나 있습니다. 사진 속 옷이 실물과 같아야 합니다.

그런데 어떤 옷들에서 계속 같은 일이 일어났습니다.

01 · The Balloon

벌룬핏이 일자 통으로 나옵니다
실제 상품생성 결과미세 수정으로 되살린 것
왼쪽이 실제 상품입니다. 허벅지에서 크게 부풀고 밑단이 안으로 좁아지는 곡선 — 벌룬(항아리) 실루엣입니다. 가운데가 그 옷으로 만든 착장샷인데, 곡선이 사라지고 평범한 일자 통이 됐습니다.

색은 맞습니다. 소재감도 맞습니다. 기장도 발목까지 내려와 맞습니다. 실루엣만 틀렸습니다.

그리고 틀린 방향이 아무렇게나가 아닙니다. 흔한 바지 쪽으로 갔습니다. 같은 일이 코쿤 실루엣에서도, 극와이드에서도, 무릎 아래 크롭에서도 반복됐습니다. 하나같이 극단적인 형태가 적당한 형태로 수렴했습니다.

셀러는 이 차이를 한눈에 알아봅니다. 그리고 형태는 다른 것으로 상쇄되지 않습니다 — 색과 소재가 아무리 좋아도 실루엣이 다르면 그 컷은 안 쓰입니다.

02 · Never Seen

본 적 없는 옷은 그리지 못합니다

왜 형태만 어긋나는가. 답은 모델이 무엇을 보고 자랐는지에 있습니다.

거대 모델은 인터넷의 평균 옷을 배웠습니다. 대부분의 바지는 옆선이 직선이고, 통이 적당하고, 실루엣이 몸을 따라갑니다. 벌룬·코쿤·극와이드는 그 안에 거의 없습니다. 소수 디자이너 브랜드에만 있는 형태이기 때문입니다.

못 그리는 게 아니라 모르는 것입니다. 사전에 없는 단어를 발음하라고 시키는 것과 같습니다. 그리고 이 하나로 나머지가 설명됩니다.

색·소재는 왜 되는가

평균 안에 있기 때문입니다. 검은 스웨트 원단도, 밴딩 허리도 인터넷에 널려 있습니다. 모델이 이미 아는 것이라 부르면 나옵니다.

🔴 극단으로 갈수록 나빠지는 이유

극단일수록 표본이 없습니다. 그래서 결과가 아는 것 중 가장 가까운 곳으로 끌려갑니다. 벌룬을 시키면 일자 통이 나오고, 극와이드를 시키면 "적당히 넓게"가 나옵니다. 위 사진의 가운데가 그렇게 나온 결과입니다.

03 · The Words Were There

단어가 없어서가 아니었습니다

결과가 안 맞으면 먼저 설명을 의심하게 됩니다. 그래서 그 옷의 설명문을 열어 봤습니다. 첫 문장이 이랬습니다.

허벅지부터 밑단까지 곡선 형태로 풍성하게 떨어지는 벌룬(항아리) 핏으로, 입체적이고 감각적인 아방가르드 스타일을 연출합니다.

벌룬, 항아리, 곡선, 풍성 — 필요한 단어가 전부 있습니다. 이 문장은 이미지 분석이 자동으로 쓴 초안인데, 셀러가 검수하면서 한 글자도 고치지 않았습니다. 사람이 봐도 맞는 설명이었다는 뜻입니다.

그 설명을 그대로 넣고 만든 결과가 위의 일자 통입니다.

단어는 이미 있는 것을 불러올 뿐 없는 것을 만들지 않습니다. 벌룬이 가리킬 시각적 원형이 모델 안에 거의 없으면, 그 단어는 스무 개 남짓한 설명 토큰 중 하나로 묻힙니다. 그리고 그 자리를 익숙한 형태가 채웁니다.

덧붙이면, 이런 컷이 나왔을 때 되살릴 방법은 스타일룸 안에 이미 있습니다. 스타일룸의 미세 수정 기능으로 바지 영역만 지정해 같은 문장을 다시 넣으면 곡선이 돌아옵니다(위 사진 오른쪽). 좁은 영역에서는 그 단어가 묻히지 않기 때문입니다.

다만 이 경로는 셀러가 어긋난 것을 알아보고, 영역을 고르고, 지시를 다시 넣어야 시작됩니다. 결과물 한 장마다 그 왕복이 붙습니다.

04 · Show, Don't Tell

모르는 것은 보여줘야 합니다

말로 안 되면 예시로 가르치는 수밖에 없습니다. 이 브랜드의 옷 사진과 그 옷을 입은 착장샷을 짝지어 여러 벌 보여주고, 그 사이의 규칙을 모델이 스스로 잡게 하는 것입니다.

그리고 학습이어야만 하는 이유가 하나 더 있습니다. 브랜드마다 다른 답이 필요하다는 것입니다. "루즈핏"은 브랜드마다 다른 옷을 가리킵니다. 어떤 곳에서는 어깨가 떨어지고 소매통이 넓은 옷이고, 다른 곳에서는 몸판만 넉넉하고 어깨선은 제자리인 옷입니다. 어휘를 아무리 쪼개도 — 오버핏, 세미오버핏, 릴랙스핏, 벌룬핏, 코쿤핏 — 브랜드가 하나 늘면 그 브랜드의 "루즈핏"이 또 하나 늘어납니다.

필요한 것은 더 좋은 설명이 아니라 브랜드마다 따로 있는 무언가입니다.

05 · But We Can't Build Models

그런데 우리는 거대 모델을 만들 수 없습니다

학습이 답이라고 해서 아무 학습이나 되는 게 아닙니다. 먼저 인정하고 갈 것이 있습니다. 우리는 이미지 생성 모델 자체를 만들 수 없습니다.

지금 이 판에 있는 것들입니다.

만든 곳모델가중치
OpenAIGPT Image · DALL·E비공개
GoogleImagen · Gemini 이미지비공개
MidjourneyMidjourney비공개
AdobeFirefly비공개
ByteDanceSeedream비공개
Black Forest LabsFLUX일부 공개
Stability AIStable Diffusion공개
AlibabaQwen-Image공개

이들은 인터넷 규모의 이미지로, 수천 장 단위의 GPU를 몇 주씩 돌려 만들어졌습니다. 우리 쪽에는 그만한 데이터도, GPU도, 그걸 감당할 자본도 없습니다. 따라잡을 수도 없습니다 — 우리가 1년을 달리는 동안 그쪽도 달립니다.

다만 표의 아래쪽 셋은 가중치가 공개돼 있습니다. 만들 수는 없어도 가져다 쓸 수는 있다는 뜻이고, 여기서 방법이 생깁니다.

그래서 질문이 이렇게 바뀝니다. 공개된 모델을 가져다, 그 위에 우리 것을 어떻게 얹을 것인가. 방법이 셋인데 앞의 둘은 안 됩니다.

1 · 프롬프트로 계속 설명한다

앞에서 본 그 방식입니다. 이번 요청에서부터 안 먹힙니다 — 벌룬이라고 적어 넣은 바로 그 요청에서 일자 통이 나왔습니다. 모델이 모르는 형태를 단어가 불러오지 못하기 때문입니다.

게다가 쌓이지도 않습니다. 백 번을 설명해도 백한 번째에 처음부터 다시 설명해야 합니다. 매번 안 먹히는 것을 매번 다시 하는 셈입니다.

2 · 모델을 통째로 다시 학습한다

공개된 모델을 가져왔으니 그걸 통째로 다시 가르치면 되지 않느냐. 그것도 안 됩니다.

현실적인 벽부터 있습니다. 모델 전체를 다시 가르치려면 그만한 GPU가 필요하고, 브랜드마다 수십 GB짜리 모델이 한 벌씩 생기고, 새로 배우면서 원래 알던 것을 잊습니다. 벌룬핏은 배웠는데 셔츠를 못 그리게 되는 식입니다.

그런데 더 큰 문제는 가르치는 방식에 있습니다.

수십 벌짜리 브랜드 데이터로 모델 전체를 열어 놓고 가르치면, 모델은 굳이 규칙을 찾지 않습니다. 그 수십 장을 그대로 외워 버리는 쪽이 훨씬 쉽기 때문입니다.

시험 범위가 100문제인데 답을 다 외울 수 있으면 아무도 원리를 공부하지 않는 것과 같습니다. 학습셋에 있던 옷은 완벽하게 재현하는데, 처음 보는 옷에서는 아무것도 못 합니다. 우리가 원한 건 "이 브랜드는 이런 곡선을 쓴다"는 규칙인데, 얻은 건 "그 바지 사진"입니다.

🔴 3 · 그림은 그대로 두고 핏만 바꾼다

여기서 질문을 뒤집어 봅니다. 거대 모델이 뽑아주는 그림은 사실 대체로 좋습니다. 색도 소재도 조명도 배경도 포즈도 우리가 만들 수 있는 수준이 아닙니다. 어긋나는 건 딱 한 군데, 실루엣입니다.

그러면 모델을 다시 만들 이유가 없습니다. 필요한 건 이것 하나입니다.

잘 그려주는 건 그대로 두고, 핏만 이 브랜드 걸로 바꿀 수 없을까?

모델 전체를 건드리지 않고 "이 브랜드는 이런 곡선을 쓴다"는 것만 따로 적어 두었다가, 그림을 그릴 때 그것만 얹는 방법입니다. 그게 LoRA(Low-Rank Adaptation)이고, 셋 중 유일하게 되는 방법입니다. 다음 절에서 어떻게 그게 가능한지 봅니다.

06 · What It Is

원본은 그대로 두고, 옆에 수정 메모를 붙입니다

"그림은 그대로, 핏만"을 실제로 어떻게 하는가. 비유로 먼저 봅니다.

아주 두꺼운 설명서 한 권

모델은 그림 그리는 법이 적힌 아주 두꺼운 설명서라고 보면 됩니다. 옷은 이렇게, 주름은 이렇게, 빛은 이렇게 — 그런 지시가 수십억 줄 적혀 있습니다. 이걸 다 고쳐 쓰는 것이 앞 절의 "통째로 다시 가르치기"였고, 그건 안 됩니다.

그래서 설명서는 한 글자도 안 고칩니다. 대신 옆에 얇은 수정 메모를 한 장 붙입니다. "이 브랜드 바지는 여기서 이만큼 더 부풀린다" 같은 차이만 적힌 종이입니다.

그림을 그릴 때는 설명서와 메모를 같이 봅니다. 설명서 그대로 그리되, 메모에 적힌 만큼만 다르게 그립니다.

이게 LoRA입니다. 설명서가 W, 메모가 A·B 두 장이고, 학습은 메모에만 적습니다.

W 원본 설명서 수십억 줄 · 안 고침 한 글자도 안 건드림 + s 반영 정도 × B A 이 메모에만 적는다 설명서에 비하면 아주 얇다 파일 하나 450MB W + s·BA 설명서 + 메모 = 이 브랜드를 아는 모델 그릴 때만 합쳐 씀
왼쪽 설명서는 손대지 않습니다. 가운데 메모 두 장에만 적고, 그림을 그릴 때 s만큼 반영해 합쳐 씁니다. s = 0이면 메모를 안 보는 것이라 원본과 같습니다.

메모에는 중요한 성질이 셋 있습니다.

1 · 처음엔 백지입니다

학습 전 메모는 아무것도 안 적힌 상태입니다. 그래서 처음에는 원본과 결과가 똑같습니다. 학습이 진행되면서 한 줄씩 채워지고, 얼마나 채워졌는지가 곧 얼마나 배웠는지입니다. 나중에 학습이 잘 되고 있는지 볼 때 이 값을 씁니다.

2 · 얼마나 반영할지 정할 수 있습니다

그림을 그릴 때 메모를 얼마나 세게 반영할지를 숫자 하나로 정합니다. 이걸 s(LoRA scale)라고 합니다.

s = 0이면 메모를 아예 안 봅니다 — 원본 그대로입니다. s = 1이면 적힌 그대로, s = 1.3이면 적힌 것보다 1.3배 세게 반영합니다.

🔴 3 · 메모는 작아야 합니다

여기서 앞 절의 문제가 뒤집힙니다. 메모가 설명서만큼 두꺼우면 학습에 쓴 옷 사진을 통째로 베껴 적을 수 있습니다. 그러면 다시 암기가 됩니다.

메모가 얇으면 그럴 자리가 없습니다. 수십 벌을 다 적을 수 없으니 그 옷들에 공통으로 나타나는 것만 골라 적게 됩니다. 그게 우리가 원한 "이 브랜드의 곡선"입니다.

적어서 싼 게 아니라, 적어야 배웁니다.

450MB브랜드 하나의
메모 크기
20학습 하나가 남기는
중간 저장 지점
5시간브랜드 하나를
학습하는 데 걸리는 시간

07 · Ownership

같은 방법도 두 갈래입니다

메모를 만드는 방법이 두 가지입니다. 그리고 이 선택이 사업의 성격을 바꿉니다.

방법 A · 남의 튜닝 서비스에 맡긴다

구글 Vertex AI의 튜닝 기능 같은 것들입니다. 우리 데이터를 올려 주면 그쪽이 자기 모델을 우리에게 맞게 조정해 줍니다. 편하고 결과도 좋습니다.

다만 조정된 결과가 그쪽 서버에 남습니다. 우리는 그 모델을 호출해 쓸 수 있을 뿐, 가져올 수는 없습니다.

🔴 방법 B · 공개 모델을 받아 우리가 학습한다

앞 표의 아래쪽 셋처럼 가중치가 공개된 모델을 받아, 우리 GPU에서 메모를 만듭니다. 손이 더 갑니다.

대신 만들어진 메모 파일이 우리 저장소에 남습니다. 우리가 고르고, 우리가 쌓고, 우리가 씁니다.

A · 튜닝 서비스B · 공개 모델 + LoRA
학습은된다된다
결과 가중치🔴 그쪽에 남는다우리 저장소에 남는다
우리 데이터는🔴 그들의 모델을 좋게 만든다우리 자산으로 쌓인다
결과🔴 우리 무기를 상대에게 학습시킨다격차가 우리 쪽에 축적된다

여기서 "우리 무기"가 무엇인지가 중요합니다. 거대 모델은 이미 세상에 쌓인 것으로 학습합니다. 옷이 팔려야, 사진이 쌓여야, 학습 데이터가 되어야, 학습이 돌아야 압니다.

6~12개월거대 모델이
새 흐름을 아는 데 걸리는 시간
2~3개월셀러가 시장보다
먼저 옷을 들고 오는 시간
8~15개월그 사이
우리에게만 있는 구간

셀러는 팔리기 전에 옷을 들고 옵니다. 샘플을 찍고, 설명을 고치고, 어떤 컷을 쓸지 고릅니다. 그 행동 하나하나가 "이 옷이 이렇게 보여야 팔린다"는 판단입니다.

거대 모델이 반년 뒤에 알게 될 것을 우리는 지금 셀러의 손에서 받습니다. 우리가 가진 것은 더 큰 모델이 아니라 더 이른 데이터입니다. 그 데이터로 상대 모델을 개선해 주는 구조라면 우위가 사라집니다.

08 · Fit

우리가 쌓으려는 두 가지에 다 맞습니다

우리가 쌓으려는 것은 성격이 다른 두 가지입니다. LoRA는 그 둘 다에 맞는 형태입니다.

브랜드 DNA — 불변하고 누적된다

브랜드의 핏과 실루엣은 잘 안 바뀝니다. 그래서 브랜드별 어댑터가 쌓입니다. 옷이 늘수록 그 브랜드의 어댑터가 좋아지고, 좋아질수록 옮겨 가기 어려워집니다. 파일 하나가 브랜드 하나이므로 브랜드가 100곳이 되어도 모델은 하나입니다.

선행 트렌드 — 휘발하고 갱신된다

지금 뜨는 것은 반년 뒤에 안 뜹니다. 그래서 새로 학습해 갈아끼워야 합니다. LoRA는 학습이 몇 시간이고 파일이 작아 갈아끼우는 게 현실적입니다. 통째로 재학습하는 구조였다면 이 축은 아예 불가능합니다.

그리고 이 축은 뒤늦게 따라올 수 없습니다. 지난 6개월간 셀러가 무엇을 들고 왔는지는 지금부터 모아도 안 생깁니다. 시간이 만든 데이터라 돈으로 앞당길 수 없습니다.

09 · Operationally

이 방식이라 할 수 있는 일 둘

전략과 별개로, 메모 방식이라서 실무에서 가능해지는 게 둘 있습니다. 둘 다 없으면 실험 자체가 안 됩니다.

1 · 메모를 뗐다 붙였다 할 수 있습니다

메모를 안 보고 그리면(s = 0) 학습을 안 한 원본 그대로 나옵니다. 메모를 보고 그리면 학습한 결과가 나옵니다.

그러니까 같은 옷·같은 배경·같은 포즈로 "배우기 전"과 "배운 뒤"를 나란히 뽑아 볼 수 있습니다. 조건이 하나만 다르니 차이가 생겼다면 그건 학습 때문입니다.

이게 없으면 결과가 좋아 보여도 학습이 잘된 건지 그냥 그 옷이 쉬웠던 건지 알 수 없습니다.

2 · 학습 도중을 여러 개 남겨 둘 수 있습니다

메모 파일이 작아서, 학습하는 동안 중간 상태를 스무 번 복사해 둡니다. 조금 배운 메모, 절반쯤 배운 메모, 끝까지 배운 메모가 스무 장 남습니다.

끝난 뒤 스무 장을 다 써 보고 제일 나은 것을 고릅니다. 마지막까지 배운 것이 제일 낫다는 보장이 없기 때문입니다 — 실제로 중간 것이 더 나은 경우가 있었습니다.

모델을 통째로 다시 가르치는 방식이었다면 수십 GB짜리를 스무 벌 저장해야 해서 이렇게 못 합니다.

10 · The Handles

우리가 정할 수 있는 값은 다섯 개입니다

학습을 걸 때 사람이 정하는 값들입니다. 하나씩 무슨 뜻인지 봅니다.

max_pixels — 사진을 얼마나 크게 보고 배울지

학습할 때 사진 한 장을 몇 픽셀까지 보고 배울지를 정합니다. 이 값보다 큰 사진은 줄여서 봅니다. 작게 보면 빨리 배우지만 원단 짜임 같은 잔 정보가 뭉개지고, 크게 보면 느린 대신 그런 것까지 배웁니다.

step — 몇 번이나 고쳐 쓸지

메모를 몇 번 고쳐 쓸지입니다. 학습의 총량이라고 보면 됩니다. 적으면 덜 배우고, 많으면 더 배우는데 어느 지점을 넘으면 오히려 나빠집니다(외우기 시작합니다).

s (scale) — 메모를 얼마나 세게 반영할지

다 만든 메모를 그림 그릴 때 얼마나 세게 반영할지입니다. 학습이 끝난 뒤 정하는 값이라 다시 학습하지 않고 바꿔 볼 수 있습니다.

r (rank) — 메모를 몇 줄짜리로 만들지

메모의 두께입니다. 줄 수가 많으면 더 많은 걸 적을 수 있지만, 너무 많으면 학습에 쓴 옷을 통째로 베껴 적을 수 있어 외우기 쉬워집니다. 적당히 얇아야 공통점만 적게 됩니다.

lr — 한 번에 얼마나 크게 고칠지

메모를 한 번 고칠 때 얼마나 크게 고칠지입니다. 크게 고치면 빨리 배우지만 지나쳐 버리고, 작게 고치면 안정적이지만 오래 걸립니다.

지금까지 우리 실험에서 이 다섯이 어떻게 움직였는지는 이렇습니다.

우리 실험에서
max_pixels결과를 가장 크게 바꿨습니다
step가장 좋은 구간이 있고, 넘기면 나빠집니다
s바꿔도 결과가 안 바뀌었습니다
r32로 고정. 64도 돌려 봤으나 비교를 안 남겼습니다
lr지정한 적이 없습니다. 기본값으로 돌고 있습니다

11 · Step

학습은 메모를 조금씩 고쳐 쓰는 일입니다

학습이 실제로 어떻게 진행되는지 봅니다.

모델에게 옷 사진 몇 장을 보여주고 그려 보게 합니다. 정답(실제 착장샷)과 비교해서 어긋난 만큼 메모를 조금 고칩니다. 이 한 번이 1 스텝입니다.

갖고 있는 옷 전부를 한 번씩 다 보여주면 1 에폭입니다. 같은 옷들을 여러 번 반복해서 보여주는데, 사람이 문제집을 여러 번 푸는 것과 같습니다.

실제로 얼마나 걸리나

옷 155벌을 16번씩 반복해서 보여주면 2,480 스텝이 됩니다. 한 스텝에 8초쯤 걸리니 전체 5시간입니다.

사진을 두 배 크게 보고 배우게 하면 한 스텝이 더 오래 걸립니다. 다 배운 뒤에 그림 한 장 뽑는 시간도 90초에서 140초로 늘어납니다.

🔴 여기서 한 번 속았습니다

처음에 작은 사진으로 학습했을 때 1,375 스텝쯤에서 결과가 가장 좋았습니다. 그래서 사진을 두 배 크게 해서 다시 학습할 때도 비슷한 지점을 보면 되겠다고 생각했습니다.

그런데 그 지점의 결과가 형편없었습니다. 사진이 커지면 한 번에 봐야 할 것이 많아져서 같은 스텝 수라도 훨씬 덜 배운 상태였던 것입니다.

계속 돌려 보니 2,000 스텝을 넘어서도 계속 좋아졌습니다. "스텝 수가 같으면 비슷하게 배웠겠지"가 틀렸습니다.

12 · How Far

얼마나 배웠는지 재는 법

그러면 지금 얼마나 배운 상태인지 어떻게 아는가. 앞에서 메모는 백지에서 시작한다고 했습니다. 그러니 메모에 적힌 양이 곧 배운 양입니다.

메모에 적힌 숫자들의 크기를 다 합쳐 하나의 값으로 만들면, 학습이 진행될수록 이 값이 커집니다. 그 값이 더 이상 안 오르고 꺾이는 지점이 대개 결과가 가장 좋은 지점이었습니다.

다만 이건 "얼마나 많이 적었나"이지 "잘 적었나"가 아닙니다. 많이 적었는데 엉뚱한 걸 적었을 수도 있습니다. 그래서 이 값은 "이쯤에서 결과를 봐야겠다"는 신호로만 쓰고, 좋고 나쁨은 뽑아낸 그림을 눈으로 보고 정합니다.

정리

한 줄로

벌룬핏이 벌룬핏으로 안 나옵니다. 설명이 부족해서가 아닙니다 — 필요한 단어는 이미 다 적혀 있었고 사람이 검수까지 마쳤습니다. 거대 모델이 그런 옷을 본 적이 거의 없어서, 아는 형태 중 가장 가까운 것으로 끌려간 것입니다.

모르는 것은 보여줘야 합니다. 그런데 우리는 거대 모델을 만들 수도 따라잡을 수도 없습니다. 그건 그대로 가져다 쓰고, 우리만 아는 것을 그 위에 얹어야 합니다.

LoRA는 거대 모델을 이길 방법이 아니라, 거대 모델을 쓰면서 우리 것을 남기는 방법입니다. 거대 모델이 모르는 옷을 우리는 매일 봅니다. 그 옷들을 메모로 바꿔 두면 우리 저장소에 쌓입니다.

스타일룸은 이 방향으로 가고 있습니다. 거대 모델은 앞으로도 계속 좋아질 것이고, 그건 우리에게 좋은 일입니다. 더 좋은 그림 위에 우리 메모를 얹으면 되기 때문입니다.

그 사이 우리는 브랜드마다 메모를 한 장씩 쌓아 갑니다. 셀러가 새 옷을 들고 올 때마다 그 메모가 두꺼워지고, 두꺼워질수록 다른 곳에서 흉내 내기 어려워집니다. 모델은 빌려 쓰지만, 그 위에 남는 것은 우리 것입니다.