· No.28
척추 이야기를 한 줄도 안 썼더니 전부 구부정하게 나왔다 — 프롬프트가 침묵한 축은 모델 기본값이 채운다
생성 영상의 감염체 자세가 전부 구부정하게 나왔다. 어휘가 모자란 줄 알고 동작 계열을 넷 더 넣었는데 화면이 그대로였다. 세어 보니 문제는 어휘가 아니었다 — 개체 206체 전부에 척추에 관한 지시가 한 줄도 없었고, 그 빈칸을 모델이 「앞으로 숙인 좀비」로 채우고 있었다. 침묵한 축이 있는 한 계열을 아무리 늘려도 그 자리는 계속 기본값이 이긴다. 그래서 어휘를 늘리는 쪽을 접고 몸을 일곱 축으로 나눠 축마다 값을 강제하는 쪽으로 갈아탔다. 다만 그 27개 값 중 렌더로 확인한 것은 아직 하나도 없다.
컷을 뽑아 놓고 나란히 보면 감염체가 전부 같은 자세로 서 있었다. 개체가 다르고 장면이 다르고 무리의 규모도 다른데 몸통 모양만은 하나였다. 반려는 한 줄이었다 — 「좀비의 자세가 구부정하게 나오는데 좀 다양하게」.
첫 진단은 어휘가 아니라 계열이었다
「다양하게」라는 지시를 받으면 대개 단어를 더 넣을 생각부터 한다. 표현이 모자라니 결과가 좁게 나온다는 설명이 자연스럽고 그 처방은 바로 실행할 수 있다는 점에서도 매력적이다. 우리도 그쪽으로 갈 뻔했는데, 프롬프트를 고치기 전에 한 가지를 먼저 셌다. 지금 쓰고 있는 동작 표현이 몇 종류인가.
두 종류였다.
감염체의 이동 방식을 정리해 둔 조사 문서에는 계열이 여섯 개 있다. 그중 프롬프트에 실제로 들어가 있는 건 두 계열뿐이었다. 나머지 넷은 문서 안에만 있고 화면으로는 한 번도 나간 적이 없었다. 조사는 끝나 있었고 옮기는 데서 끊긴 것이다.
더 나쁜 것이 그 두 계열 안에 있었다. 둘 중 하나가 「상체를 접고 달리는」 자세인데, 이건 참고 문서가 스스로 제한을 걸어 둔 항목이다. 문서에 적힌 조건이 「1회 관측 · 이동 컷에만」이다. 딱 한 번 관측된 것이고 이동 장면에서만 쓰라는 뜻이다. 그런데 실제 프롬프트에서는 22개 파일에 전 개체의 기본 자세로 박혀 있었다.
예외로 적어 둔 것이 기본값이 되어 있었다. 문서가 제 손으로 울타리를 쳐 놨는데 옮겨 적는 과정에서 울타리만 떨어져 나갔다. 이런 종류의 유실은 나중에 프롬프트만 읽어서는 안 보인다. 프롬프트에는 자세만 적혀 있지 그 자세가 어떤 조건에서 쓰라고 나온 것인지는 안 적혀 있기 때문이다. 문서에서 값을 옮길 때는 값만 옮기고 조건은 두고 온다 — 이 함정은 이날 3D 쪽에서도 똑같이 밟았다.
여기까지가 1차 진단이고 부분적으로는 맞았다. 계열이 안 갈려 있는 건 사실이었으니까. 그래서 개체 수 가중으로 배분표를 짰다. 완보 46% · 경직 13% · 질주 9% · 실조 7% · 경련 6% · 정지-폭발 4% · 지정 14%. 문서에만 있던 네 계열을 새로 프롬프트에 넣었다. 이제 여섯 계열이 전부 화면에 나갈 수 있는 상태가 됐고 편중돼 있던 질주형은 9%까지 내려갔다. 숫자만 보면 잘 고친 판이다.
계열을 넷 더 넣었는데 화면이 안 바뀌었다
1판을 반영하고 곧바로 다시 반려가 왔다.
「형이 아니어도 기본적인 자세가 하나로 통일되는 건 문제가 있어」
이 한 문장이 진단을 갈랐다. 대표가 지적한 건 「계열이 부족하다」가 아니었다. 계열이 다른데도 기본 자세는 하나라는 것이었다. 걸음이 다른 개체들끼리도 몸통은 같은 모양이다. 우리가 방금 고친 축과 지적받은 축이 애초에 다른 축이었다.
이 지점이 이번 건에서 가장 값이 나간 자리다. 표현을 두 배 넘게 늘렸는데 화면이 그대로라면 가능성은 둘이다. 늘린 표현이 안 먹히거나, 늘린 표현이 화면을 결정하는 자리에 애초에 없거나. 첫 번째라면 가중치나 문장 위치를 만지는 게 답이고 두 번째라면 그걸 아무리 만져도 결과가 안 움직인다. 우리는 둘을 구분하지 않고 「더 넣으면 되겠지」로 한 판을 태웠다.
1판이 완전히 헛일은 아니었다. 계열이 두 개뿐이었던 건 실제 결함이었고 제한 조건이 붙은 자세가 전 개체 기본값으로 박혀 있던 것도 고쳐야 할 것이었다. 다만 그건 대표가 본 문제와 다른 문제였다. 진단이 반쯤 맞으면 처방이 실행되고 산출물이 나오기 때문에, 틀린 절반은 반려가 한 번 더 오기 전까지 드러나지 않는다. 이번엔 반려가 1판 직후에 왔으니 싸게 끝난 편이다.
그리고 여기서 질문을 뒤집어야 했다. 몸통 모양을 우리가 안 정했는데 화면에는 몸통이 있다. 그러면 그건 누가 정했나.
척추에 관한 지시가 한 줄도 없었다
가장 큰 계열인 완보형 프롬프트를 전부 열어서 이번엔 「무엇이 쓰여 있나」가 아니라 「무엇이 안 쓰여 있나」를 봤다. 읽는 방향을 바꾼 것뿐인데 결과가 바로 나왔다.
완보형 206체에 척추에 관한 지시가 한 줄도 없었다.
굽었다는 말도 없고, 폈다는 말도 없고, 기울었다는 말도 없었다. 걸음걸이는 썼다. 팔의 처짐도 썼다. 피부와 조명과 카메라도 썼다. 그런데 몸통이 어떤 모양인지는 206체 어디에도 안 적혀 있었다. 그 빈칸을 모델이 자기 기본값으로 채우고 있었다 — 「앞으로 숙인 좀비」로. 학습 데이터에 좀비가 그렇게 그려져 있으니 아무 말도 안 하면 그게 나온다.
계열을 넷 더 넣어도 화면이 안 바뀐 이유가 정확히 이것이다. 우리가 늘린 건 걸음의 종류였고 대표가 본 건 몸통의 모양이었다. 척추 축이 침묵하는 한 경직으로 걷든 실조로 걷든 척추는 계속 같은 값으로 채워진다. 계열을 여섯이 아니라 스무 개로 늘려도 결과는 같았을 것이다. 개체마다 다리는 다르게 움직이는데 등은 똑같이 굽은 화면이 나왔을 뿐이다.
그래서 규칙을 이렇게 적었다.
프롬프트가 말하지 않은 축은 사라지지 않는다. 모델의 기본값으로 채워진다. 결과가 획일적이면 우리가 뭘 잘못 썼는지보다 뭘 안 썼는지를 먼저 센다.
이건 앞서 부정문에서 얻은 교훈과 짝이다. 그때는 쓴 것이 의도와 반대로 작동했고 — 금지문에 들어 있던 명사가 그대로 그려졌다 — 이번엔 안 쓴 것이 의도와 무관하게 채워졌다. 두 사고 모두 프롬프트를 「우리가 말한 것의 목록」으로 읽으면 안 보인다. 모델 쪽에서 프롬프트는 빈칸이 있는 양식이고 빈칸은 예외 없이 메워진다. 우리가 안 쓴 칸을 모델이 비워 두는 일은 없다.
그러면 침묵한 축이 척추 하나였을 리도 없다. 척추가 눈에 띈 건 그게 실루엣을 가장 크게 좌우해서지, 유일하게 비어 있어서가 아니었다. 눈에 덜 띄는 축들도 같은 방식으로 채워지고 있었을 것이고 그것들은 반려가 안 온다는 이유로 계속 안 보인다. 그래서 처방을 「척추 지시를 넣는다」로 좁히면 안 됐다. 그건 이번에 지적받은 칸 하나만 메우는 것이고 다음 반려는 다른 칸에서 온다.
어휘를 늘리는 대신 축을 나눠 값을 강제했다
방향을 바꿨다. 계열을 더 만드는 대신, 몸을 축으로 쪼개고 축마다 값을 반드시 지정하게 했다. 신설한 축은 일곱 개다.
| 축 | 무엇을 강제하나 | 값에 붙인 임상 근거 |
|---|---|---|
| 척추 · 머리목 · 어깨 · 팔 · 손 · 골반 · 턱 | 축마다 값을 하나 고른다 — 비워 두는 선택지가 없다 | 후궁반장 · 피사 증후군 · 캄토코르미아 · 제피질/제뇌 자세 · 트렌델렌부르크 징후 |
값은 전부 27개, 축을 조합하면 40,000가지가 나온다. 숫자가 크다는 게 요점은 아니다. 요점은 어느 축도 비워 둘 수 없다는 쪽이고 조합 수는 그 강제에서 따라 나온 부산물이다. 계열을 늘리는 것과 축을 강제하는 것의 차이가 여기 있다. 계열을 늘리면 말하는 항목의 개수가 늘어나고 축을 강제하면 침묵하는 항목의 개수가 0이 된다. 앞의 것은 몇 개를 늘리든 빈칸을 하나도 못 없앤다.
값마다 임상 근거를 하나씩 짝지었다. 뒤로 젖혀진 몸통에는 후궁반장, 좌우로 기운 몸통에는 피사 증후군, 앞으로 접힌 몸통에는 캄토코르미아, 팔의 굽힘과 폄에는 제피질·제뇌 자세, 골반이 한쪽으로 주저앉는 데는 트렌델렌부르크 징후. 근거를 붙인 이유는 그럴듯해 보이려는 게 아니다. 근거 없는 값은 다음 사람이 지운다. 왜 이 값이 목록에 있는지가 안 적혀 있으면 정리할 때 가장 먼저 없어지고 그렇게 없어진 값은 없어진 줄도 모른다. 이번 건의 출발점이 정확히 그 유실이었다.
그리고 조합 하나를 금지로 못 박았다. 전굴 × 턱떨굼 — 앞으로 숙인 몸통에 턱이 떨어진 조합이다. 이게 대표가 반려한 「구부정」 그 자체다. 축을 나눠 놓기만 하면 40,000가지 안에 원래의 그 자세도 당연히 들어 있고, 확률상 계속 다시 나온다. 가능한 값을 늘리는 것과 원래 값을 막는 것은 서로 다른 일이다. 늘리기만 하고 막지 않으면 기본값은 「유일한 값」에서 「자주 나오는 값」으로 자리를 옮겨 그대로 살아남는다. 대표 눈에는 그 차이가 안 보인다 — 화면에는 여전히 구부정한 개체가 있다.
같이 정리한 것이 하나 더 있다. 「허리까지 접혀 상체가 수평이 되는」 극단적인 자세는 특정 개체 하나의 전용 특징으로 예약했다. 일반 개체 프롬프트에 남아 있던 4건은 흉추 전굴로 낮췄다. 강한 표현이 아무 데나 흩어져 있으면 그 표현이 누구의 것도 아니게 되고 나중에 그 개체를 특별하게 보이려 할 때 쓸 카드가 없다.
작업은 프롬프트 21컷 수정, 백업 180개로 끝났다. 백업이 수정 컷보다 훨씬 많은 건 같은 날 두 판이 연속으로 지나갔기 때문이다. 1판에서 계열을 배분하며 한 벌, 2판에서 축을 넣으며 또 한 벌 떴다. 판을 두 번 태운 흔적이 그대로 파일 개수로 남아 있는 셈이다.
한 가지 확인을 붙였다. 계열을 창작해 배분하는 게 스토리 정본과 충돌하지 않는지 봐야 했다. 정본 2,010줄을 「계열·경직·경련·실조」로 훑었더니 0건이었다. 정본은 감염체의 자세를 규정한 적이 없다. 계열 배분은 그 위에 얹는 창작 레이어이고 정본에 저촉되지 않는다. 이걸 먼저 봤기 때문에 「정본에 없는 걸 만들어도 되나」로 다시 올라가는 왕복을 안 했다.
축 27값 중 렌더로 본 것은 하나도 없다
여기까지가 그날의 결과인데, 정직하게 남길 것이 있다.
27개 값 중 렌더로 확인된 것은 0개다. 스틸이 게이트인데 아직 안 구웠다. 지금 상태는 「자세가 다양해졌다」가 아니라 「다양해질 수 있게 써 놨다」까지다. 프롬프트에 쓴 것과 화면에 나온 것이 다르다는 사실 자체가 이 글의 주제였는데, 그 주제를 우리 결론에 그대로 적용하면 아직 아무것도 증명되지 않았다. 축을 일곱 개로 나눈 것도 지금은 문서상의 주장이다.
같은 날 다른 축에서 이 문제가 훨씬 노골적으로 나왔다. 3D 쪽에서 판정 지표가 하루에 열다섯 번 넘게 틀렸는데, 전부 같은 유형이었다 — 형상이 아니라 다른 것을 재고 있었다. 잔차가 관통 엣지를 못 잡았고, 사각면 비율이 수렴을 못 잡았고, 측정식이 등살을 팔로 읽었고, 검색 범위가 T 포즈에서 손끝까지 벌어졌다. 숫자는 매번 잘 나왔다. 실행도 됐고 값도 그럴듯했다. 그 숫자가 우리가 보려는 결함을 볼 수 있는 숫자가 아니었을 뿐이다. 틀린 지표는 에러를 안 낸다 — 그래서 열다섯 번을 반복할 수 있었다.
여기서 규칙 둘이 굳었다. 「이 지표가 그 결함을 볼 수 있는가」를 매번 따로 확인한다. 그리고 자를 교재에 먼저 돌려 본다 — 정답인 걸 아는 대상에서 그 지표가 반응하는지 확인한 다음에 우리 것을 잰다. 교재에서도 0이 나오는 자로 우리 것을 재고 「문제 없음」이라고 적으면 그건 측정이 아니라 침묵이다. 프롬프트에서 안 쓴 축이 침묵하는 것과 같은 종류의 침묵이고 둘 다 화면이나 숫자 위에는 아무 흔적을 안 남긴다.
그런데 이 규칙에도 뒷이야기가 붙는다. 자기가 방금 적은 규칙을 바로 다음 판에서 어긴 사례가 있었다. 문서에 써 놓고 다음 판에서 안 봤다. 규칙을 적는 것과 다음 판에서 확인하는 것은 다른 일이다. 적는 순간에는 그 규칙이 머릿속에 있으니 다음에도 당연히 볼 것 같지만 다음 판은 다른 문제를 들고 시작하고 그 문제에는 그 규칙이 안 붙어 있다. 규칙이 살아남으려면 다음 판의 작업 순서 안에 들어가 있어야 하는데, 문서에 적는 것만으로는 순서에 안 들어간다. 이건 침묵한 축과 구조가 같다 — 어딘가에 존재하는 것과 그 자리에 호출되는 것은 별개다.
프롬프트도 똑같다. 축을 일곱 개로 나눠 값을 강제해 놨다는 사실은 그 값이 화면에 나왔다는 뜻이 전혀 아니다. 그 둘을 잇는 건 문서가 아니라 렌더다.