Послідовність характеру в ШІ-відео: як моделі вчаться запам'ятовувати обличчя
Глибокий технічний розбір архітектурних інновацій, що дозволяють ШІ-моделям відео підтримувати ідентичність персонажа протягом сцен, від механізмів уваги до ембедингів, що зберігають ідентичність.

Одна з найнаполегливіших проблем у генерації ШІ-відео — це збереження послідовності персонажа протягом сцен. Запитайте будь-якого кінематографіста: історія розпадається, як тільки обличчя головного героя змінюється між дублями. У 2025 році ми нарешті побачили, як моделі вирішили цю проблему архітектурними інноваціями, які мають таку ж елегантність, як добре спланований маршрут на складну вершину. Дозвольте мені розповісти, як сучасні відео-моделі вчаться запам'ятовувати обличчя.
Виклик послідовності
Традиційні дифузійні моделі генерують кожен кадр за допомогою ймовірнісного вибірки. Це вносить дисперсію — корисну для різноманітності, проблемну для ідентичності. При генерації 10-секундного відео на 24 кадри за секунду модель приймає 240 послідовних рішень, кожне з яких може призвести до відхилення.
# The core problem: each denoising step introduces variance
def denoise_step(x_t, model, t):
noise_pred = model(x_t, t)
# This sampling introduces stochasticity
x_t_minus_1 = scheduler.step(noise_pred, t, x_t).prev_sample
return x_t_minus_1 # Slight variations accumulate over framesРанні відео-моделі, як Gen-1 та Pika 1.0, явно мали з цим проблеми. Персонажі змінювали зовнішність, дещо старіли між сценами або розвивали несумісні риси — те, що практики називали "зносом ідентичності". Прорив прийшов з розуміння послідовності персонажа не як проблеми пост-обробки, а як архітектурної.
Ембединги, що зберігають ідентичність: основа
Перша велика інновація — введення спеціалізованих ембедингів ідентичності, які залишаються протягом процесу генерації. Замість того, щоб покладатися виключно на текстове кондиціонування, моделі тепер зберігають явні токени ідентичності:
class IdentityEncoder(nn.Module):
def __init__(self, embed_dim=768):
super().__init__()
self.face_encoder = FaceRecognitionBackbone() # Pre-trained face model
self.projection = nn.Linear(512, embed_dim)
self.identity_bank = nn.Parameter(torch.randn(32, embed_dim))
def encode_identity(self, reference_frame):
# Extract identity features from reference
face_features = self.face_encoder(reference_frame)
identity_embed = self.projection(face_features)
# Cross-attend with learned identity tokens
identity_tokens = self.cross_attention(
query=self.identity_bank,
key=identity_embed,
value=identity_embed
)
return identity_tokensЦі токени ідентичності потім вводяться в дифузійний процес на кожному кроці видалення шуму, створюючи те, що я люблю називати "точками закріплення" — як фіксована страховка на маршруті альпінізму, до якої ви завжди можете повернутися, коли умови стають непевні.
Перехресна увага між кадрами: навчання тимчасової ідентичності
Другий прорив був архітектурним: моделі тепер явно звертають увагу на кадри, коли приймають рішення про зовнішність персонажа. Дифузійні трансформери природно підтримують це через їхню обробку патчів простору-часу, але моделі, зосереджені на послідовності, йдуть далі.
Ключна інновація: спеціалізовані шари уваги ідентичності, які конкретно звертають увагу на лицьові регіони протягом часу:
class IdentityAwareAttention(nn.Module):
def __init__(self, dim, num_heads=8):
super().__init__()
self.spatial_attn = nn.MultiheadAttention(dim, num_heads)
self.temporal_attn = nn.MultiheadAttention(dim, num_heads)
self.identity_attn = nn.MultiheadAttention(dim, num_heads)
def forward(self, x, identity_tokens, face_masks):
# Standard spatial attention within frames
x = self.spatial_attn(x, x, x)[0] + x
# Temporal attention across frames
x = rearrange(x, '(b t) n d -> (b n) t d', t=num_frames)
x = self.temporal_attn(x, x, x)[0] + x
x = rearrange(x, '(b n) t d -> (b t) n d', n=num_patches)
# Identity-specific attention using face regions
face_tokens = x * face_masks.unsqueeze(-1)
x = self.identity_attn(
query=x,
key=identity_tokens,
value=identity_tokens
)[0] + x
return xЦей механізм потрійної уваги — просторова, тимчасова та специфічна для ідентичності — дозволяє моделі приймати рішення про зовнішність, явно посилаючись як на встановлену ідентичність, так і на попередні кадри.
Порівняння поточних підходів моделей
Основні платформи генерації відео реалізували послідовність персонажа по-різному:
| Модель | Підхід | Метод послідовності | Ефективність |
|---|---|---|---|
| Sora 2 | Патчі простору-часу | Імплічитно через довгий контекст | Хорошо для коротких кліпів |
| Veo 3 | Багатоетапна генерація | Закріплення ключових кадрів | Сильно для людської моції |
| Gen-4.5 | Кондиціонування з референцією | Явне впровадження ідентичності | Найкраща послідовність |
| Kling 1.6 | Увага, обізнана обличчям | Спеціалізованого стеження за обличчям | Сильно для крупних планів |
Gen-4.5 від Runway заслуговує особливої згадки. Їхній підхід поєднує кондиціонування референцією зі зображенням з тим, що вони називають "блокувачами ідентичності" — навченими токенами, які модель навчена зберігати незалежно від інших генеративних рішень. Цей архітектурний вибір, ймовірно, сприяв їхній домінації в Video Arena.
Парадигма референцного кадру
Значний зсув у 2025 році був рухом до генерації, кондиціонованої референцією. Замість того, щоб генерувати персонажів чисто з текстових описів, моделі тепер приймають референцні зображення, які встановлюють канонічну зовнішність:
class ReferenceConditionedGenerator:
def __init__(self, base_model, identity_encoder):
self.model = base_model
self.identity_encoder = identity_encoder
def generate(self, prompt, reference_images, num_frames=120):
# Encode identity from reference images
identity_embeds = []
for ref in reference_images:
identity_embeds.append(self.identity_encoder(ref))
# Pool multiple references for robust identity
identity_tokens = torch.stack(identity_embeds).mean(dim=0)
# Generate with identity conditioning
video = self.model.generate(
prompt=prompt,
num_frames=num_frames,
cross_attention_kwargs={
"identity_tokens": identity_tokens,
"identity_strength": 0.8 # Balances consistency vs creativity
}
)
return videoПараметр identity_strength представляє важливий компроміс. Занадто високо — модель стає жорсткою, неспроможною показувати природну варіацію виразів. Занадто низько — повертається зміщення. Знаходження золотої середини — як правило, близько 0,7-0,85 — це частково мистецтво, частково наука.
Функції втрати для збереження ідентичності
Навчання цих систем потребує спеціалізованих функцій втрати, які явно штрафують за зміщення ідентичності:
Втрата збереження ідентичності:
L_identity = ||f(G(z, c)) - f(x_ref)||² + λ_temporal * Σ_t ||f(v_t) - f(v_{t+1})||²Де f — це попередньо навчений кодер розпізнавання обличчя, G — це генератор, а v_t представляє генеровані кадри. Перший доданок забезпечує, що генеровані обличчя відповідають референціям; другий штрафує за варіацію від кадру до кадру.
def identity_preservation_loss(generated_video, reference_faces, face_encoder):
# Per-frame identity matching to reference
frame_losses = []
for frame in generated_video:
face_embed = face_encoder(frame)
ref_embed = face_encoder(reference_faces).mean(dim=0)
frame_losses.append(F.mse_loss(face_embed, ref_embed))
reference_loss = torch.stack(frame_losses).mean()
# Temporal consistency between adjacent frames
temporal_losses = []
for i in range(len(generated_video) - 1):
curr_embed = face_encoder(generated_video[i])
next_embed = face_encoder(generated_video[i + 1])
temporal_losses.append(F.mse_loss(curr_embed, next_embed))
temporal_loss = torch.stack(temporal_losses).mean()
return reference_loss + 0.5 * temporal_lossСценарії з кількома персонажами: складніша проблема
Послідовність одного персонажа практично розв'язана. Сценарії з кількома персонажами — де кілька окремих ідентичностей повинні зберігатися одночасно — залишаються складними. Механізми уваги можуть змішувати ідентичності, призводячи до просякання ознак між персонажами.
Поточні підходи використовують окремі банки ідентичності:
class MultiCharacterIdentityBank:
def __init__(self, max_characters=8, embed_dim=768):
self.banks = nn.ModuleList([
IdentityBank(embed_dim) for _ in range(max_characters)
])
self.character_separator = nn.Parameter(torch.randn(1, embed_dim))
def encode_multiple(self, character_references):
all_tokens = []
for idx, refs in enumerate(character_references):
char_tokens = self.banks[idx].encode(refs)
# Add separator to prevent conflation
char_tokens = torch.cat([char_tokens, self.character_separator])
all_tokens.append(char_tokens)
return torch.cat(all_tokens, dim=0)Токени-розділювачі працюють як страховки між альпіністами — зберігаючи окремі ідентичності навіть коли вони працюють у близькій близькості.
Практичні наслідки для творців
Для тих, хто використовує ці інструменти, а не будує їх, з'явилося кілька практичних патернів:
Якість референцного зображення має значення: зображення вищої розділювальної здатності, добре освітлені, з нейтральними виразами дають послідовніші результати. Модель вчиться ідентичності з цих якорів, і шум поширюється.
Кілька референцій покращують робастність: надання 3-5 референцних зображень під різними кутами допомагає моделі побудувати більш повне уявлення про ідентичність. Подумайте про це як триангуляцію позиції з кількох точок.
Інженерія запитів для послідовності: явні опису ідентичності в запитах посилюють візуальну послідовність. "Тридцятирічна жінка з коротким коричневим волоссям та зеленими очима" дає додаткові обмеження, які модель може використовувати.
Дорога вперед
Ми наближаємось до порогу, де ШІ-генероване відео може підтримувати послідовність персонажа, достатню для розповідання історій. Залишаючись проблем — тонка послідовність виразів, довгоформатна генерація понад 60 секунд та взаємодія між кількома персонажами — активно вирішуються.
У Bonega.ai ми особливо зацікавлені в тому, як ці поліпшення послідовності інтегруються з можливостями розширення відео. Здатність розширити існуючу відеозйомку, зберігаючи ідеальну послідовність персонажа, відкриває творчі можливості, які просто були неможливі 12 місяців тому.
Математична елегантність розглядання ідентичності як архітектурної проблеми першого рівня, а не як пост-обробного виправлення, позначає дозрівання в тому, як ми думаємо про генерацію відео. Подібно до встановлення добре залишеного високого табору перед штурмом вершини, ці фундаментальні поліпшення дозволяють довші, більш амбітні творчі подорожі, що лежать попереду.
Послідовність персонажа — це не просто технічна метрика — це основа візуального розповідання. І у 2025 році ця основа нарешті стала достатньо твердою для того, щоб на ній будувати.
Ця стаття була корисною?

Alexis
Інженер ШІІнженер ШІ з Лозанни, що поєднує глибину досліджень з практичними інноваціями. Ділить час між архітектурами моделей та альпійськими вершинами.
Схожі статті
Продовжуйте дослідження з цими схожими публікаціями

Революція відкритого ШІ-відео: чи зможуть споживчі GPU конкурувати з технологічними гігантами?
ByteDance та Tencent щойно випустили відкриті моделі відео, які працюють на споживчому залізі. Це змінює все для незалежних творців.

MiniMax Hailuo 02: Бюджетна модель генерування відео з Китаю конкурує з гігантами
Hailuo 02 від MiniMax генерує відео конкурентної якості за мізерну частку вартості, з 10 відео за ціну одного кліпу Veo 3. Ось що робить цього китайського претендента вартим уваги.

Kandinsky 5.0: Російська відповідь у відкритій генерації відео за допомогою ШІ
Kandinsky 5.0 забезпечує генерацію 10-секундного відео на споживчих GPU з ліцензією Apache 2.0. Ми розглянемо, як механізми NABLA attention та flow matching роблять це можливим.