자동화 파이프라인7 분 읽기

내 학습 신호가 앱 수만큼 쪼개져 있었다

숏츠 자동화는 영상 성과를 보상 신호로 삼아 앱별로 무엇이 먹히는지 배우도록 짜여 있었습니다. 그런데 앱 하나에 쌓이는 데이터는 너무 적었습니다. 앱과 상관없는 창작 속성 기준으로 같은 신호를 묶고, 데이터가 모일 때까지 스스로 꺼져 있게 만든 기록입니다.

#sparse-data#pooling#self-gating#shorts#automation
개념 도식: 왼쪽은 앱별로 잘게 나뉜 빈 칸들, 오른쪽은 훅 길이와 줄 수 기준으로 모든 앱의 영상이 모인 칸
같은 보상 신호를 앱이 아니라 앱과 무관한 훅 속성으로 묶으면 표가 훨씬 빨리 찹니다.

쌓이지 않는 데이터

제 숏츠 파이프라인은 영상마다 성과를 보상 신호로 받습니다. 처음 설계는 단순했습니다. 앱별로 어떤 영상이 잘 됐는지 보고, 그 앱의 다음 영상에 반영한다.

문제는 이 신호를 앱 단위로 나누는 순간 생겼습니다. 앱이 여러 개라서 앱 하나에 돌아가는 영상은 적고, 그중 분석 데이터까지 붙은 영상은 더 적습니다. 앱별 표가 판단을 내릴 만큼 차려면 한참 기다려야 했습니다. 신호 자체가 없었던 건 아닙니다. 앱 수만큼 잘게 쪼개 놓아서 어느 칸도 의미 있는 크기가 되지 못했던 겁니다.

당신의 시스템도 학습 단위를 너무 잘게 잡아서, 칸마다 데이터가 몇 개씩밖에 없는 상태로 굴러가고 있지 않나요?

앱별로 보는 건 직관적이라 의심을 안 했습니다. 앱마다 사용자도, 소재도 다르니 따로 배우는 게 맞다고 생각했습니다. 하지만 데이터가 쌓이는 속도가 학습 단위를 따라오지 못하면, 그 단위가 맞든 틀리든 결론은 늦게 나옵니다.

앱을 지우고 남는 것

그래서 질문을 바꿨습니다. 이 앱에서 뭐가 먹히는지가 아니라, 어떤 앱이든 상관없이 뭐가 먹히는지를 물으면 데이터를 전부 쓸 수 있습니다.

그러려면 앱과 무관한 속성이 필요했습니다. 지금 쓰는 축은 두 가지입니다.

  • 훅 길이 구간
  • 훅이 한 줄인지 여러 줄인지

앱이 뭐든 모든 영상에는 이 두 속성이 있습니다. 같은 보상 신호를 앱이 아니라 이 속성 기준으로 모으면, 모든 앱의 영상이 같은 표에 들어갑니다. 앱별 표는 텅 비어 있어도 속성별 표는 훨씬 빨리 찹니다.

당신이라면? 앱별 데이터가 찰 때까지 기다리겠습니까, 아니면 앱을 구분하지 않는 대신 정밀도를 조금 포기하겠습니까?

바꾼 것

dna_perf.py라는 모듈을 새로 만들었습니다. 하는 일은 셋입니다.

  1. 기존 보상 신호를 위의 두 속성 기준으로 앱을 가로질러 묶습니다.
  2. 결과를 hook/dna_hints.json에 씁니다.
  3. 게시 전 검토 단계의 프롬프트에 이 힌트를 넣습니다.

여기서 신경 쓴 건 스스로 켜지는 조건입니다. 분석 데이터가 있는 영상이 8개가 되기 전까지는 아무것도 하지 않습니다. 8개를 넘으면 그때부터 자동으로 동작합니다. 제가 따로 켤 필요가 없습니다. 데이터가 얼마 없을 때 나온 힌트가 프롬프트에 섞여 들어가는 것보다 아무 힌트도 없는 편이 낫다고 판단했습니다.

변경은 새 모듈 119줄, 테스트 46줄, 그리고 기존 스케줄러와 검토 코드에 몇 줄 연결한 정도입니다. 큰 작업은 아니었습니다. 시간이 걸린 건 코드가 아니라 앱별로 나눠야 한다는 전제를 의심하는 일이었습니다.

자가진단 체크리스트

  • 학습 단위(앱, 카테고리, 사용자군)마다 실제로 데이터가 몇 개씩 쌓여 있는지 세어 본 적이 있습니까?
  • 그 단위를 지워도 성립하는 공통 속성이 데이터에 있습니까?
  • 표본이 적을 때 학습 결과가 하위 단계에 흘러가지 않도록 막는 문턱이 코드에 있습니까?

솔직한 부분

이 글을 쓰는 시점에서 저는 이 묶음이 실제로 더 나은 영상을 만들었는지 모릅니다. 커밋은 더 빨리 쓸 만한 신호를 얻는다는 의도를 적었을 뿐, 결과를 측정한 기록은 아닙니다. 8이라는 문턱도 통계적으로 계산한 값이 아니라 아무것도 없는 것보다는 낫겠다는 판단에 가깝습니다. 앱을 가로질러 묶는다는 건 훅 길이의 효과가 앱마다 비슷하다고 가정하는 것인데, 그 가정이 맞는지도 아직 확인하지 못했습니다. 그리고 두 속성만으로 창작의 무엇을 얼마나 설명할 수 있을지도 모르겠습니다. 데이터가 적다는 문제를 푼 게 아니라, 적은 데이터를 조금 덜 낭비하게 만든 정도입니다.

관련 글