惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 叶小钗
小众软件
小众软件
博客园 - Franky
D
Docker
Google DeepMind News
Google DeepMind News
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
宝玉的分享
宝玉的分享
C
Check Point Blog
B
Blog
V
V2EX
博客园 - 三生石上(FineUI控件)
MyScale Blog
MyScale Blog
The Cloudflare Blog
博客园 - 聂微东
博客园_首页
Engineering at Meta
Engineering at Meta

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
Как технология LayerScale спасает сверхглубокие трансформ...
Максим · 2026-05-18 · via Все публикации подряд на Хабре

В мире глубокого обучения существует наивный миф: "Если твоя модель недостаточно умная, просто накинь еще пару десятков слоев".

На бумаге residual связи (те самые плюсики в коде: x=x+f(x) ) должны позволять нам строить сети бесконечной глубины, спасая градиенты от затухания. Но любой, кто пытался с нуля обучить трансформер слоев на 80, знает жестокую правду: сеть просто отказывается сходиться. Loss взрывается в первые же эпохи, или модель навсегда застревает на субоптимальном плато.

Долгие годы эту проблему лечили «костылями»: сложными схемами разогрева learning rate, танцами с инициализацией весов и стохастической глубиной. Пока исследователи из Meta AI не предложили изящный хак под названием LayerScale.

Давайте залезем под капот и посмотрим, почему глубокие Трансформеры умирают, и как LayerScale их воскрешает.

Проблема: Токсичность residual stream

Посмотрим на классический блок трансформера:

xout​=xin​+Block(LayerNorm(xin​))

Магистраль X, которая проходит через всю сеть от первого до последнего слоя, часто называют residual stream (Остаточный поток). Это главная информационная шина модели.

В чем проблема? Каждый новый блок (Attention или FFN) берет данные из шины, как-то их обрабатывает и вливает результат обратно в шину через операцию сложения.

На ранних этапах обучения веса блоков инициализированы случайным образом. Это значит, что каждый блок вливает в магистраль чистейший математический шум.

  • Слой 1 добавил шум. Дисперсия сигнала выросла.

  • Слой 2 получил зашумленный сигнал, умножил его на свои случайные матрицы и добавил еще больше шума.

  • К 50-му слою изначальный сигнал (эмбеддинги токенов) полностью тонет в хаосе дисперсии.

LayerNorm пытается спасти ситуацию на входе в каждый следующий блок, но он не спасает саму магистраль. Когда loss функция на самом верху сети пытается прокинуть градиенты вниз, она видит перед собой бушующую реку дисперсии. Оптимизатор сходит с ума.

Решение: LayerScale и концепция мьюта

Идея LayerScale поражает своей простотой. А что, если на старте обучения мы выключим звук у всех слоев, кроме самых первых?

Мы добавляем один обучаемый вектор λ (диагональную матрицу) той же размерности, что и наш вектор x. Мы умножаем выход блока на этот вектор до того, как прибавить его к шине:

xout​=xin​+λBlock(LayerNorm(xin​))

А теперь главная магия: мы инициализируем λ микроскопическими значениями, например 10−4 или 10−5  (10−6 для очень глубоких сетей).

Как мы обманываем оптимизатор

Посмотрите, что происходит на первой итерации обучения.
Поскольку λ≈0 , выход любого блока умножается на ноль. Уравнение схлопывается до:

xout​≈xin​+0

Математически, ваша 100-слойная махина в начале обучения ведет себя как сеть из нуля слоев (чистая функция идентичности). Сигнал пролетает от входа до выхода без единого искажения. Градиенты текут идеально гладко, как по автобану.

Дальше в дело вступает градиентный спуск. Оптимизатор видит параметр λ и понимает: "Ага, если я начну понемногу увеличивать λ в определенных слоях, loss начнет падать".

Сеть начинает постепенно "пробуждать" слои. Она сама решает, какому блоку внимания дать "громкость", а какой оставить заглушенным. Мы больше не вливаем хаос в магистраль. Мы приоткрываем кран ровно на ту величину, которую сеть способна переварить без взрыва градиентов.

Реализация на Pytorch

Внедрить это в свою архитектуру проще простого. Вот как выглядит этот слой:

import torch
import torch.nn as nn

class LayerScale(nn.Module):
    def __init__(self, dim, init_values=1e-5, inplace=False):
        super().__init__()
        self.inplace = inplace
        # Создаем обучаемый параметр: вектор размерности dim
        self.gamma = nn.Parameter(init_values * torch.ones(dim))

    def forward(self, x):
        # Умножаем каждый канал на свой вес
        return x.mul_(self.gamma) if self.inplace else x * self.gamma

# Пример использования внутри блока:
class TransformerBlock(nn.Module):
    def __init__(self, dim):
        super().__init__()
        self.norm1 = nn.LayerNorm(dim)
        self.attn = Attention(dim)
        self.ls1 = LayerScale(dim, init_values=1e-5) # <-- layer scale

        self.norm2 = nn.LayerNorm(dim)
        self.mlp = MLP(dim)
        self.ls2 = LayerScale(dim, init_values=1e-5) # <-- layer scale

    def forward(self, x):
        # Сигнал проходит через блок, глушится LayerScale, и только потом плюсуется
        x = x + self.ls1(self.attn(self.norm1(x)))
        x = x + self.ls2(self.mlp(self.norm2(x)))
        return x

Разница с LayerNorm

Часто возникает вопрос: "Зачем нам LayerScale, если у нас уже есть LayerNorm?".
Это разные инструменты для разных задач:

  • LayerNorm работает внутри пайплайна блока. Он нормирует сигнал, чтобы матрицам (Wq​, Wk​, Wv ) было комфортно с ним работать. Он не защищает внешнюю магистраль.

  • LayerScale работает на выходе из пайплайна. Это гейт (вентиль), который контролирует, насколько сильно этот блок имеет право изменить глобальный residual stream.

Кстати, λ это по-канальный вектор. Сеть может выучить, что для 5-го канала громкость должна быть 1.0, а для 128-го канала остаться около нуля. Это дает колоссальную гибкость в маршрутизации признаков.

Заключение

LayerScale это идеальный пример того, как глубокое понимание градиентной механики побеждает грубую вычислительную силу. Вместо того чтобы придумывать зубодробительные схемы оптимизаторов или сжигать мегаватты на подбор Learning Rate, мы добавляем один вектор на слой и позволяем топологии сети собирать саму себя в процессе обучения.

Если вы пишете архитектуру с нуля, или пытаетесь обучить что-то глубокое (особенно в компьютерном зрении, где эта проблема стоит острее всего), добавьте LayerScale. Вы удивитесь, насколько стабильнее станет ваш loss.