Чья модель получается после усреднения очень разных клиентов?
В федеративном обучении строки остаются у клиентов, а сервер объединяет
обновления модели. Это уменьшает передачу сырых данных, но не создаёт
приватность автоматически. Неодинаковые клиенты превращают простое среднее в
содержательный выбор цели: «средняя строка» и «средний человек» — разные
задачи, и побеждают в них разные модели.
Клавиатура учится на телефонах
Модель следующего слова должна учитывать реальные пользовательские тексты,
которые нельзя собирать в одну центральную таблицу без серьёзного риска.
Федеративная схема отправляет текущие веса на выбранные устройства, каждое
делает несколько локальных шагов, сервер агрегирует изменения. Сырые сообщения
остаются на телефоне; наружу выходит только «поправка к модели».
У клиента k есть данные Dk объёмом nk строк и локальная функция
Fk(w)=nk1i∈Dk∑ℓi(w).
Классическая цель, взвешенная по числу примеров:
F(w)=k=1∑K∑jnjnkFk(w).
Она в точности равна среднему loss по всем строкам, как если бы данные были
объединены в одну таблицу. Но «средний пользователь» и «средняя строка» —
разные цели: активный человек с миллионом сообщений получает в первой формуле
огромный вес, а редкий клиент почти не слышен.
Фраза Винера здесь буквальна: обновление модели — не сырьё и не энергия, но и
не пустота. Оно несёт информацию о данных, и весь дальнейший урок — о том,
сколько именно и как этим управлять.
Опыт, на котором всё видно
Чтобы не рассуждать в воздухе, возьмём тот же корпус, что и в
уроке о наивном Байесе: SMS Spam Collection — 5574 реальных
сообщения, из них 747 спама, то есть 13,4%. Отложим 1115 сообщений
на общий тест, оставшиеся 4459 раздадим двадцати «телефонам».
Модель — логистическая регрессия на мешке слов, свёрнутом хеш-приёмом в 256
координат:
Pr(спам∣x)=σ(w⊤ϕ(x)),σ(z)=1+e−z1,
а качество мы меряем по редкому классу — гармоническим средним точности и
полноты,
F1=2TP+FP+FN2TP,
потому что при доле спама 13,4% голая доля верных ответов слишком
снисходительна (см. урок 31).
Централизованно обученная, эта модель даёт на тесте точность 97,0% и
F1=0,88 по классу «спам». Это наш потолок: столько можно выжать, если
собрать все письма в одном месте. Дальше мы будем пытаться дойти до него, не
собирая их.
Раздать данные можно двумя способами. Первый — перемешать и нарезать поровну:
клиенты получаются статистически одинаковыми (IID). Второй — раздать так, как
бывает в жизни: разного объёма и разного состава. Мы использовали для этого
распределение Дирихле по каждому классу, и получилось похоже на правду: от 40
до 1002 строк на клиента (разброс в 25 раз), доля спама от 0 до 100%,
причём у двух клиентов спама нет вообще ни одного.
FedAvg: раунд как единица времени
В одном раунде клиент получает общий вектор wt и выполняет E локальных
эпох SGD (см. урок 24):
в общем случае — уже сама выборка устройств вносит смещение. Здесь St —
множество доступных в этом раунде устройств. Ключевое наблюдение:
при E=1 и полном батче
То есть один локальный шаг у всех — это ровно один обычный градиентный шаг по
глобальной цели. Всё, что федеративного в FedAvg, начинается со второго
локального шага: он экономит связь, но уводит клиентов в стороны их собственных
данных.
Одни письма, разное расселение
Запустим FedAvg на нашем корпусе: 20 клиентов, в каждом раунде участвует
половина, 100 раундов. Сравним IID-раздачу и перекошенную.
Рис. 64.1. Цена неоднородности измеряется в раундах связи
Одни и те же 4459 сообщений, розданные двумя способами. Пунктир — потолок
централизованного обучения (F1=0,88). При одинаковых клиентах и E=1
порог F1=0,80 берётся за 6 раундов, при перекошенных — за 19: в
3,2 раза дороже по связи. Локальные эпохи помогают обоим, но неоднородность
съедает часть выигрыша: E=5 даёт IID два раунда, а non-IID — восемь.
Три вывода читаются прямо с картинки. Первый: федеративное среднее вообще
работает — на ста раундах перекошенная раздача доходит до F1=0,88, то есть
до централизованного потолка. Второй: неоднородность стоит не столько качества,
сколько раундов, а раунды — это батарея, трафик и время. Третий: локальные
эпохи — рычаг с двух сторон. При IID переход от E=1 к E=5 сокращает путь с
шести раундов до двух; при перекошенных данных дальнейшее увеличение до E=20
уже вредит — двенадцать раундов вместо восьми.
Client drift: почему среднее не равно шагу
Разберём механизм на чистом модельном примере — двух квадратичных потерях с
разными минимумами (числа ниже посчитаны точно, это не иллюстрация «на глаз»):
F1(w)=∥w−m1∥2,F2(w)=2∥w−m2∥2,F=21(F1+F2).
Из общей точки каждый клиент делает E шагов с η=0,1, сервер усредняет.
Сравним результат с E последовательными шагами по F.
Рис. 64.2. После одного шага среднее совпадает с центральным, после пяти — нет
Синие и красные контуры — локальные потери двух клиентов, звёзды — их
минимумы. После одного локального шага среднее локальных весов (фиолетовое)
совпадает с центральным шагом (зелёное) с точностью до машинного нуля. После
пяти шагов между ними образуется разрыв 0,34 — это и есть client drift.
Он растёт с числом локальных шагов и с расстоянием между минимумами.
Причина алгебраическая. Первый шаг линеен по градиенту, а среднее линейных
функций — линейная функция среднего. Второй шаг берёт градиент уже в разных
точках:
и при усреднении по k квадратичный член содержит
∇2Fk∇Fk, тогда как центральный шаг дал бы
∇2Fk⋅∇Fk — среднее произведения
против произведения средних. В среднем появляется член, зависящий от того,
насколько ∇Fk отличается от ∇F. Обычная мера этой разницы —
дисперсия локальных градиентов:
ζ2=K1k=1∑K∥∇Fk(w)−∇F(w)∥2.
При ζ=0 (одинаковые клиенты) локальные шаги бесплатны; при большом
ζ каждый лишний локальный шаг покупает скорость ценой смещения.
На реальных данных разброс обновлений ведёт себя так же, как в модельном
примере. При одной локальной эпохе перекошенная раздача даёт разброс 0,65
против 0,33 у одинаковых клиентов — в 1,97 раза больше при том же
алгоритме и том же корпусе. Разница целиком создана расселением данных.
Глушков и сеть, где данные остаются на месте
Мысль «считать там, где рождаются данные, а вверх передавать только сводки»
старше машинного обучения. В 1962–1964 годах Виктор Михайлович Глушков,
директор Института кибернетики в Киеве, разрабатывал проект ОГАС —
общегосударственной автоматизированной системы, ядром которой должна была
стать Единая государственная сеть вычислительных центров. Устройство сети было
принципиально не «одна большая ЭВМ»: первичные данные обрабатывались на
предприятиях, в районные и республиканские центры уходили агрегаты, и только
они сводились дальше. Глушков прямо формулировал причину — «информационный
барьер»: объём первичных сведений растёт быстрее, чем способность любого
единого центра их переработать.
Для нас важна не историческая деталь, а структура аргумента, которая
повторяется в федеративном обучении дословно. Централизация упирается сразу в
три стены: пропускную способность каналов, скорость обработки в центре и
уязвимость единого хранилища. Децентрализация снимает первые две и меняет
природу третьей — вместо одного архива появляется поток агрегатов, у которого
своя, куда более тонкая, теория утечек. Глушков решал первую пару задач и
проектировал макроконвейерные ЭВМ для второй; вопрос приватности агрегата в
полный рост встал позже, и ему посвящена вторая половина этого урока.
Лаборатория федеративного усреднения
Локальные шаги, неоднородность, веса агрегации и шум приватности
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Начните с нулевой неоднородности: все клиенты имеют почти общий минимум,
локальные траектории лежат друг на друге, и число локальных эпох ни на что не
влияет — это режим ζ≈0. Теперь двигайте неоднородность вверх и
следите за тонкими золотыми линиями: они разлетаются, а зелёная траектория
глобальной модели начинает вилять. Увеличьте E до пятнадцати — локальные
концы уезжают почти в свои звёзды, и среднее промахивается мимо обеих мишеней.
Дальше — самое важное. Переключите веса агрегации. Синяя мишень (оптимум
«средней строки») и красная (оптимум «среднего клиента») стоят в разных местах,
и алгоритм честно сходится к той, которую вы выбрали. Поднимите неравенство
размеров — мишени разъедутся сильнее. Наконец, добавьте шум приватности: точка
перестаёт застывать и начинает дрожать вокруг цели, а полоски справа
показывают, кому от этого хуже всего.
Обе — частные случаи одного семейства с распределением α на клиентах:
Fα(w)=k∑αkFk(w),αk≥0,k∑αk=1,
а третьей, некооперативной, границей семейства служит худший случай
Fmax(w)=1≤k≤KmaxFk(w)=αmaxFα(w).
Первая оптимизирует случайно взятую строку, вторая — случайно взятого
клиента. Разница видна на арифметике. Пусть у клиента A тысяча записей и
локальный минимум wA=0, у клиента B десять записей и минимум wB=10 (обе
потери квадратичные). Тогда
Ни один ответ не ошибочен арифметически. Первый оптимизирует среднюю запись и
почти игнорирует маленького клиента; второй оптимизирует среднего клиента и
заметно ухудшает большинство строк A. Выбор между 0,099 и 5 — это не
вопрос оптимизации, а вопрос о том, кого мы обещали обслуживать.
Рис. 64.3. Среднее по строкам, среднее по клиентам и худший клиент — три разных числа
Реальный корпус, перекошенная раздача, сорок раундов. Веса «по строкам» дают
глобальную F1=0,85, средний клиент 0,970, худший 0,921. Веса «по
клиентам» — F1=0,87, средний 0,974, худший 0,936. Здесь равный вес
клиентов оказался не хуже и по глобальной метрике: перекос был не настолько
сильным, чтобы возникла настоящая жертва. Так бывает — и об этом честнее
сказать, чем подгонять пример под драматичный вывод.
Обратите внимание на аккуратность формулировки. Наш эксперимент не доказывает,
что равный вес клиентов всегда лучше; он показывает, что разница между целями
на реальных данных может оказаться небольшой — и что узнать это можно только
измерением. В модельном примере с A и B разрыв колоссален (0,099 против
5), потому что размеры отличались в сто раз, а минимумы стояли далеко. У нас
размеры отличались в двадцать пять раз, но локальные задачи были родственны:
спам остаётся спамом на любом телефоне.
Персонализация и её цена
Одна глобальная модель может быть компромиссом, неудобным для всех сразу.
Естественная идея: после федеративного обучения дать устройству дообучить
последний слой на своей истории. Разумный компромисс между общим и личным
записывается смесью
vk=βkwglob+(1−βk)wkloc,βk=λ+nkλ,
где вес личной модели растёт вместе с объёмом локальных данных. Формально мы решаем
vkminFk(vk)+2λ∥vk−wglob∥2,
где штраф удерживает личную модель рядом с общей — тот же приём стягивания,
что и в регуляризации.
Мы проверили это на наших клиентах: взяли глобальную модель и дали каждому одну
локальную эпоху с маленьким шагом. Результат отрезвляющий. Средняя точность по
клиентам сдвинулась с 0,970 до 0,967, худший клиент — с 0,921 до
0,917, а лучше или так же стало ровно у половины клиентов. Персонализация
не бесплатна: у клиента мало строк, и одна эпоха способна увести модель в шум
локальной выборки быстрее, чем принести пользу.
Коммуникация как ограничение
Посчитаем масштаб. Модель с 10 млн параметров во float32 — это
107⋅4байт=40МБ
на одно обновление. В общем виде объём раунда
B=m⋅P⋅b/8,
где m — число участников, P — число параметров, b — бит на координату.
Если в раунде участвуют 500 устройств, вверх уходит
500⋅40МБ=20ГБзараунд,
и это только клиент→сервер. При сотнях раундов счёт идёт на терабайты — и, что
важнее, на батарею и мобильный трафик пользователей. Отсюда весь арсенал:
выбор части клиентов, несколько локальных шагов, квантование, разреживание,
отправка только крупных координат и error feedback, накапливающий отброшенный
остаток
et+1=(Δt+et)−Q(Δt+et),
чтобы невысказанная часть попала в следующий раунд, а не потерялась навсегда.
Сколько качества стоит один килобайт
Общие слова про сжатие легко проверить. Мы прогнали тот же FedAvg на реальном
корпусе, применяя к каждому обновлению одно из преобразований, и измерили F1
после сорока раундов.
Рис. 64.4. Квантование почти бесплатно, агрессивное разреживание — нет
Одно обновление нашей модели — 257 чисел. Во float32 это 1,00 кБ и
F1=0,85. Восемь бит на координату дают 0,25 кБ при том же качестве,
четыре бита — 0,13 кБ и снова 0,85. А вот разреживание бьёт больнее:
оставив 10% крупнейших координат (0,10 кБ), получаем 0,79, а при
1% (0,01 кБ) модель разваливается до 0,49.
Вывод для практики: точность отдельного числа почти не нужна — восьмикратное
огрубление шкалы прошло незамеченным. А вот структура важна: у логистической
регрессии на словах сигнал размазан по многим координатам, и выбрасывание
мелких обнуляет как раз редкие слова, которых у отдельного клиента и так мало.
Именно здесь error feedback и оправдывает себя.
Secure aggregation: сервер видит только сумму
Даже без сырых текстов отдельное обновление Δk — это функция личных
данных. Secure aggregation позволяет серверу узнать сумму, не увидев слагаемых.
Идея проста: клиенты попарно договариваются о случайных масках skj так,
что
Δk=Δk+j=k∑±skj,k∑Δk=k∑Δk,
потому что каждая маска входит в сумму дважды с противоположными знаками.
Сервер видит набор равномерно случайных на вид векторов, а их сумма — ровно то,
что нужно для агрегации.
Протокол должен переживать отключения: если клиент пропал после раздачи масок,
его маска не погасится, и сумма испортится. Практические схемы поэтому
раздают доли секретов соседям, чтобы уцелевшие могли восстановить маску
выбывшего.
И, главное, secure aggregation защищает от любопытного сервера, глядящего на
отдельное обновление, но не от информации в самой сумме. Если в раунде
участвует один клиент, сумма равна его обновлению. Отсюда обязательное
требование минимального размера группы и анализа угроз.
Differential privacy: обрезка и шум
Формальная гарантия формулируется не как «данные не передаются», а как
требование к распределению результата. Механизм M удовлетворяет
(ε,δ)-дифференциальной приватности, если для любых соседних
наборов D и D′, отличающихся участием одного клиента, и любого множества
исходов A
Pr[M(D)∈A]≤eεPr[M(D′)∈A]+δ.
Чтобы такое обещание выполнить, нужно ограничить влияние одного клиента.
Сначала обрезка нормы обновления,
Δk=Δk⋅min(1,∥Δk∥C),
затем шум, пропорциональный этой чувствительности:
Δˉ=m1(k∑Δk+N(0,σ2C2I)).
Обрезка создаёт смещение, шум — дисперсию. Гарантия расходуется с каждым
раундом: наивная композиция T механизмов даёт
εtotal=Tε,
а более тонкий продвинутый анализ — примерно
εtotal≈2Tln(1/δ′)ε+Tε(eε−1),
то есть бюджет растёт как T, а не как T. Отсюда практический вывод:
число раундов — не только вопрос трафика, но и статья расхода приватности.
Рис. 64.5. Шум приватности покупается точностью, и платит за него не каждый поровну
Нормы обновлений наших клиентов лежат от 1,71 до 5,09 при медиане
2,73, так что порог C=2,5 обрезает 55% из них. Одна обрезка почти
не повредила (F1 осталась 0,85), но добавление шума стоит дорого:
σ=0,2 роняет F1 до 0,73, σ=0,5 — до 0,65,
σ=1,0 — до 0,53. Это цена формальной гарантии, и её надо называть
вслух, а не прятать за словом «приватно».
Заметьте, кого обрезка задевает сильнее: клиентов с большой нормой обновления,
то есть тех, чьи данные сильнее отличаются от текущей модели. Это как раз
редкие сценарии и малые группы. Приватность, добытая обрезкой и шумом, слегка
сглаживает именно хвост — тот самый, ради которого мы в предыдущем разделе
беспокоились о худшем клиенте.
Утечки из обновлений и отравление агрегата
Градиент — не шифр. По обновлению можно узнать, встречалось ли у клиента редкое
слово (для многих архитектур это видно по единственной ненулевой координате
эмбеддинга), а при небольших батчах — приблизительно восстановить сам обучающий
пример. Злонамеренный сервер способен пойти дальше: разослать разным клиентам
разные модели и сравнить ответы, фактически проведя эксперимент над людьми.
Симметричная угроза идёт снизу. Клиенты могут отравлять агрегат: подмешивать
обновление, встраивающее backdoor — «при виде такого триггера отвечай так».
Робастная агрегация (медиана по координатам, усечённое среднее, отбраковка по
норме) помогает, но плохо совмещается с secure aggregation: сервер, который не
видит отдельных векторов, не может и отбраковать подозрительный.
Честная оценка федеративной системы
Федеративный benchmark должен сохранять естественное разбиение по клиентам и
неодинаковые объёмы. Случайное перемешивание всех строк уничтожает главную
трудность: получится обычное распределённое обучение, и все выводы окажутся
неприменимы. Именно поэтому наборы вроде LEAF строят из данных, у которых
клиент — реальная единица (автор, устройство, учреждение).
Отчёт по такой системе состоит минимум из шести чисел:
Сравнивать методы из уроков 61 и 62 следует при
равном бюджете раундов и локальных вычислений — иначе выигрывает тот, кому
дали больше связи. Разделение train/test делают по времени внутри клиента и,
отдельно, по новым клиентам: это два разных сценария — продолжение личной
истории и cold start.
Что решает архитектор до первой строки кода
Прежде чем запускать раунды, проект обязан назвать:
клиента и единицу приватности (человек, устройство, учреждение);
глобальную цель и веса — «по строкам» или «по клиентам»;
механизм выборки доступных устройств и его смещение;
локальный оптимизатор, число шагов E и шаг η;
протокол агрегации и модель угроз;
бюджет (ε,δ), байты, раунды и качество групп;
сценарий нового клиента и мониторинг деградации.
Пункт третий обычно недооценивают. Устройства выходят на связь, когда заряжены
и в Wi-Fi, то есть ночью и в богатых сетях: выборка клиентов систематически
смещена, и это ровно та проблема отбора, о которой шла речь в
уроке 57. Заявленная цель «средний клиент» превращается в
«средний клиент, который часто бывает онлайн» — и никакая формула агрегации
этого не исправит.
Что уезжает с телефона
Федеративное обучение полезно там, где централизация данных неприемлема, а
распределённое вычисление реально доступно. Оно начинается с невинной формулы
среднего, но каждое слово в ней оказывается решением: чьи данные, с каким
весом, за сколько раундов, под какой маской и с каким шумом. Наш маленький
опыт на пяти с половиной тысячах реальных сообщений показал всё сразу:
федеративное среднее догоняет централизованный потолок F1=0,88; перекос
данных стоит втрое больше раундов; локальные эпохи разгоняют разброс
обновлений в 3,4 раза; квантование до четырёх бит бесплатно, а
разреживание до одного процента разрушительно; шум приватности σ=1
роняет F1 с 0,85 до 0,53 — на треть с лишним.
Ни одно из этих чисел не следует из лозунга «сырые данные не покидают
устройство». Они следуют из измерений — и именно поэтому в честном проекте
рядом с обещанием приватности всегда стоит таблица её цены.