🔴 Сложный ⏱️ 55 минут

Particle Swarm Optimization

📋 Содержание урока

Particle Swarm Optimization 🐦

Понаблюдай мысленно за стаей скворцов над полем вечером. Тысячи птиц перестраиваются в воздухе почти синхронно, без вожака, без команд, без централизованного плана — и при этом стая как единое целое довольно быстро находит место для ночёвки или облетает хищника. Ни одна птица не видит всей картины целиком: каждая реагирует только на своих ближайших соседей и на собственный недавний опыт. Из этих локальных, очень простых правил рождается сложное и эффективное коллективное поведение — рой оказывается умнее любой отдельной птицы в нём. Именно это наблюдение легло в основу алгоритма, который ты изучишь в этом уроке — Particle Swarm Optimization, или оптимизация роем частиц (PSO). Дальше в тексте мы будем использовать именно этот русский перевод.

Идея PSO предельно конкретная: замени стаю птиц роем «частиц», где каждая частица — это не физический объект, а кандидат-решение задачи оптимизации, точка в пространстве параметров. У частицы есть текущая позиция и скорость движения. Но, в отличие от чисто случайного блуждания, у каждой частицы есть память: она помнит лучшее место, которое сама когда-либо посетила, и знает о лучшем месте, которое нашёл весь рой целиком. На каждом шаге частица корректирует свою траекторию, стремясь одновременно вернуться к собственному лучшему опыту и подтянуться к лучшему опыту всего роя. Никто не отбирает «лучших» частиц и не «скрещивает» их между собой, как в генетических алгоритмах из прошлого урока — весь рой из одного и того же фиксированного набора частиц просто синхронно движется в пространстве поиска, ведомый общей памятью.

Если ты уже настраивал гиперпараметры модели вручную — перебирал скорость обучения, глубину дерева, коэффициент регуляризации, — ты интуитивно понимаешь, зачем нужен инструмент вроде PSO. Пространство гиперпараметров почти всегда непрерывно: скорость обучения — это не дискретный список из пяти вариантов, а любое вещественное число из интервала. Генетический алгоритм из урока 296 отлично справляется с дискретными и комбинаторными задачами, но для непрерывных пространств его приходится подгонять — кодировать вещественные числа в биты или изобретать специальные операторы скрещивания для вещественных векторов. PSO же с самого начала работает именно с вещественными координатами: частица — это просто вектор чисел, а скорость — вектор той же размерности, и никакого кодирования не требуется. Именно поэтому PSO — один из стандартных инструментов автоматического подбора гиперпараметров, наравне с генетическими алгоритмами и байесовской оптимизацией, и особенно уместен там, где пространство параметров непрерывно, а не дискретно закодировано.

В этом уроке ты разберёшь устройство частицы — что такое её позиция, скорость, личный и глобальный рекорд, — выведешь и распишешь по шагам формулу обновления скорости с тремя слагаемыми (инерция, когнитивная тяга к собственному лучшему опыту, социальная тяга к лучшему опыту роя), увидишь формулу обновления позиции и полную числовую трассировку нескольких частиц на пару итераций, а в конце честно сравнишь PSO с генетическими алгоритмами — почему у роя частиц нет ни отбора, ни скрещивания, и чем это оборачивается на практике при подборе гиперпараметров и, реже, при обучении небольших нейросетей методом нулевого порядка.

История

В 1995 году два американских исследователя — Джеймс Кеннеди (James Kennedy), социальный психолог, и Расселл Эберхарт (Russell Eberhart), инженер-электрик, — опубликовали статью «Particle Swarm Optimization» на конференции IEEE International Conference on Neural Networks (Международная конференция IEEE по нейронным сетям). Их изначальная цель была довольно далека от оптимизации в привычном для этого курса смысле: Кеннеди интересовало компьютерное моделирование социального поведения — того, как в группе людей или животных распространяются идеи, нормы, коллективные знания, без единого координатора. Отправной точкой послужили более ранние работы по симуляции стайного поведения — в частности, модель «boids» Крейга Рейнольдса 1987 года, где каждая виртуальная птица следовала трём простым локальным правилам (держаться рядом с соседями, выравнивать скорость с ними, избегать столкновений) и в результате вся группа демонстрировала правдоподобное стайное движение без единого управляющего алгоритма.

Кеннеди и Эберхарт начали с похожей идеи: смоделировать стаю, в которой каждая «птица» тянется одновременно к своему собственному лучшему найденному месту и к лучшему месту, найденному всей стаей. Они хотели увидеть красивую, непредсказуемую хореографию коллективного движения — то, как рождается согласованность без централизованного управления. Но в процессе экспериментов произошло почти случайное открытие: если задать «птицам» конкретную числовую цель — например, минимизировать некоторую функцию, — рой очень быстро и надёжно находил область её минимума. Модель социального поведения оказалась одновременно эффективным алгоритмом оптимизации. Авторы постепенно упростили модель, убрав визуально красивые, но для оптимизации бесполезные детали (например, попытки имитировать физически правдоподобный полёт), и оставили только суть: позицию, скорость и две памяти — личную и коллективную.

Важное усовершенствование пришло уже в 1998 году, когда тот же Эберхарт вместе с И Ши (Yuhui Shi) добавили в формулу обновления скорости коэффициент инерции $w$ — в самой первой версии 1995 года его не было, скорость на каждом шаге полностью пересчитывалась заново из когнитивного и социального слагаемых. Введение инерции решило практическую проблему баланса между широким исследованием пространства поиска и точной доводкой уже найденного решения, и именно эта версия формулы с инерционным весом стала тем каноническим PSO, который используется в подавляющем большинстве современных реализаций и библиотек — той самой, которую ты разберёшь в этом уроке.

Частица: позиция, скорость и две памяти

Интуиция

Прежде чем говорить о формулах обновления, важно чётко зафиксировать, из чего вообще состоит одна частица роя. Представь частицу как дрона, который летает над ландшафтом функции потерь в поисках самой низкой точки. У дрона в любой момент времени есть ровно четыре вещи, которые полностью описывают его состояние: где он сейчас находится, куда и с какой скоростью он летит, где он лично видел самую низкую точку за всё время полёта, и где, по последним данным, самую низкую точку во всём ландшафте нашёл хоть кто-то из всего роя дронов. Первые две характеристики — позиция и скорость — меняются на каждом шаге. Вторые две — личный и глобальный рекорд — это память, и обновляются они только тогда, когда находится что-то лучше уже известного.

Формальное определение

Частица роя. Частица $i$ в момент времени (итерации) $t$ полностью описывается четвёркой:

  • позиция $x_i(t) \in \mathbb{R}^d$ — точка-кандидат в $d$-мерном пространстве параметров задачи;
  • скорость $v_i(t) \in \mathbb{R}^d$ — вектор, задающий направление и величину смещения на следующем шаге;
  • личный рекорд (personal best) $p_i$ — та позиция, которую частица $i$ сама посетила за всю свою историю и в которой значение оптимизируемой функции $f$ оказалось наилучшим из всех, что видела эта частица;
  • глобальный рекорд (global best) $g$ — та позиция среди всех личных рекордов всех частиц роя, в которой $f$ достигает наилучшего известного значения на данный момент.

Рой состоит из $N$ частиц, $i = 1, \dots, N$, и все они обновляются одновременно на каждой итерации по одним и тем же правилам.

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

Примеры

Пример 1: инициализация роя из трёх частиц. Возьмём задачу минимизации функции $f(x, y) = x^2 + y^2$ (парабола с единственным минимумом в точке $(0, 0)$, где $f = 0$). Инициализируем рой из трёх частиц в случайных позициях с нулевой начальной скоростью:

  • Частица A: $x_A(0) = (4, 3)$, $v_A(0) = (0, 0)$, $f_A(0) = 4^2+3^2 = 25$;
  • Частица B: $x_B(0) = (-2, 5)$, $v_B(0) = (0, 0)$, $f_B(0) = (-2)^2+5^2 = 29$;
  • Частица C: $x_C(0) = (1, -4)$, $v_C(0) = (0, 0)$, $f_C(0) = 1^2+(-4)^2 = 17$.

На самом первом шаге, пока история ещё не накоплена, у каждой частицы личный рекорд совпадает с её начальной позицией: $p_A = (4,3)$, $p_B = (-2,5)$, $p_C = (1,-4)$ — других точек эти частицы ещё не видели, сравнивать не с чем.

Пример 2: определение глобального рекорда. Чтобы найти $g$, нужно сравнить значения $f$ во всех трёх личных рекордах: $f_A = 25$, $f_B = 29$, $f_C = 17$. Минимальное значение — у частицы C, значит на старте $g = (1, -4)$ с $f(g) = 17$. Важно: глобальный рекорд — это позиция, а не «имя» частицы-обладателя. Если позже другая частица найдёт точку с ещё меньшим $f$, $g$ обновится независимо от того, какая именно частица её нашла.

Пример 3: асимметрия обновления памяти. Допустим, частица B на следующем шаге переместилась в точку с $f = 96{,}2$ — заметно хуже, чем её стартовое значение $f_B(0) = 29$. Сама позиция частицы B при этом действительно стала хуже: если бы алгоритм остановился прямо сейчас, кандидатом на ответ она бы не годилась. Но её личный рекорд $p_B$ при этом не изменится — он остаётся равным $(-2, 5)$ с $f = 29$, потому что $96{,}2 > 29$, и новое значение не лучше уже сохранённого. Ровно так же не изменится и глобальный рекорд $g$ всего роя: даже если бы движение частицы B временно всех «напугало», $g$ продолжает указывать на лучшую из когда-либо найденных точек, а не на текущее положение какой-либо конкретной частицы.

Почему это важно

Разделение на «текущее состояние» и «память» — это структурный фундамент всего PSO. Именно потому что личный и глобальный рекорды монотонно улучшаются и никогда не портятся, рой в целом не может «забыть» уже найденное хорошее решение, даже если отдельные частицы в моменте разлетаются в куда более плохие области пространства — а такое разлетание, как ты увидишь дальше, действительно происходит и даже полезно для исследования пространства. Без этой памяти PSO выродился бы в обычное случайное блуждание без всякой тенденции к сходимости.

Обновление скорости: инерция, личный опыт и коллективная тяга

Интуиция

Каждая частица на каждом шаге решает, куда двигаться дальше, взвешивая ровно три соображения одновременно. Во-первых, у неё уже есть направление движения — по инерции естественно продолжить примерно в ту же сторону, а не менять курс рывком. Во-вторых, у неё есть собственная память о том, где было хорошо — тянет вернуться туда. В-третьих, она знает, где было хорошо у всего роя, — тянет и туда тоже. Финальная скорость — это взвешенная сумма всех трёх тяг, а не выбор одной из них: частица не «решает» между собственным опытом и опытом роя, она комбинирует оба сигнала в одном векторе.

Формальное определение

Формула обновления скорости PSO. Для частицы $i$, координаты $j = 1, \dots, d$:

$$v_{i,j}(t+1) = w \cdot v_{i,j}(t) \;+\; c_1 \cdot r_1 \cdot \bigl(p_{i,j} - x_{i,j}(t)\bigr) \;+\; c_2 \cdot r_2 \cdot \bigl(g_j - x_{i,j}(t)\bigr)$$

где:

  • $w$ — инерционный вес, доля предыдущей скорости, сохраняемая на новом шаге;
  • $c_1$ — когнитивный коэффициент, сила притяжения к личному рекорду $p_i$;
  • $c_2$ — социальный коэффициент, сила притяжения к глобальному рекорду роя $g$;
  • $r_1, r_2$ — случайные числа, независимо разыгрываемые из равномерного распределения на $[0, 1]$ (обычно отдельно для каждой координаты и каждой частицы на каждом шаге), которые вносят стохастичность и не дают всем частицам двигаться абсолютно синхронно.

Три слагаемых формулы принято называть соответственно инерционным, когнитивным (cognitive) и социальным (social) компонентами скорости. Стандартные значения, восходящие к исходной работе Кеннеди и Эберхарта: $w \approx 0{,}7\text{–}0{,}9$, $c_1 = c_2 = 2{,}0$ — при таких коэффициентах сумма математических ожиданий когнитивного и социального слагаемых (при $r_1=r_2=0{,}5$) составляет ровно $c_1+c_2=4$, что на практике даёт устойчивый, не расходящийся и не застревающий рой.

Примеры

Разберём одну итерацию для роя из трёх частиц, введённого выше, при параметрах $w=0{,}7$, $c_1=c_2=2{,}0$. Начальное состояние: $x_A(0)=(4,3)$, $x_B(0)=(-2,5)$, $x_C(0)=(1,-4)$, все скорости нулевые, $g=(1,-4)$ (найдено в примере выше). Случайные числа для первой итерации возьмём заданными явно, чтобы трассировка была полностью воспроизводимой: для частицы A — $r_1=0{,}6$, $r_2=0{,}3$; для частицы B — $r_1=0{,}2$, $r_2=0{,}8$; для частицы C — $r_1=0{,}5$, $r_2=0{,}5$.

Пример 1: частица A — типичный шаг с преобладанием социальной тяги. Поскольку $p_A = x_A(0) = (4,3)$ (истории ещё нет, личный рекорд совпадает со стартом), когнитивное слагаемое равно нулю: $c_1 r_1 (p_A - x_A) = 2 \cdot 0{,}6 \cdot (0,0) = (0,0)$. Социальное слагаемое: $c_2 r_2 (g - x_A) = 2 \cdot 0{,}3 \cdot \bigl((1,-4)-(4,3)\bigr) = 0{,}6 \cdot (-3,-7) = (-1{,}8,\,-4{,}2)$. Инерционное слагаемое тоже нулевое, так как $v_A(0)=(0,0)$. Итог:

$$v_A(1) = 0{,}7\cdot(0,0) + (0,0) + (-1{,}8,-4{,}2) = (-1{,}8,\,-4{,}2)$$

Вся скорость этого первого шага целиком порождена социальным слагаемым — частица A ещё не успела накопить собственный опыт, отличный от старта, поэтому её единственный ориентир на этой итерации — текущий глобальный рекорд роя.

Пример 2: частица B — опасность слишком сильного «перелёта». Частица B стартует дальше от $g$, чем частица A, и её случайный множитель $r_2=0{,}8$ намного больше, чем у A. Когнитивное слагаемое снова нулевое (личной истории ещё нет): $c_1 r_1(p_B-x_B) = (0,0)$. Социальное: $c_2 r_2 (g - x_B) = 2 \cdot 0{,}8 \cdot \bigl((1,-4)-(-2,5)\bigr) = 1{,}6 \cdot (3,-9) = (4{,}8,\,-14{,}4)$.

$$v_B(1) = 0{,}7\cdot(0,0) + (0,0) + (4{,}8,-14{,}4) = (4{,}8,\,-14{,}4)$$

Скорость получилась очень большой — почти 15 единиц по координате $y$ при том, что расстояние до цели по этой координате было всего 9. Как ты увидишь в следующем разделе, это заставит частицу B при обновлении позиции не аккуратно подойти к текущему $g$, а с запасом пролететь мимо него — характерный эффект «перелёта» (overshoot), который прямо зависит от того, насколько велики $c_2$ и разыгранное $r_2$ в конкретный момент.

Пример 3: частица C — парадокс нулевой скорости у текущего лидера. Частица C на старте сама является глобальным рекордом: $x_C(0) = p_C = g = (1,-4)$. Тогда оба слагаемых — и когнитивное, и социальное — равны нулю, потому что разность между текущей позицией и целью в обоих случаях нулевая: $c_1 r_1 (p_C - x_C) = (0,0)$ и $c_2 r_2 (g - x_C) = (0,0)$. А поскольку и стартовая скорость тоже нулевая, получаем:

$$v_C(1) = 0{,}7\cdot(0,0) + (0,0) + (0,0) = (0,0)$$

Частица C, будучи лидером роя, на этом шаге не сдвинется вообще — у неё попросту нет тянущей силы ни к себе самой, ни к себе самой в качестве глобального рекорда. Это важное наблюдение: без инерции, накопленной на предыдущих шагах, текущий лидер роя рискует замереть в найденной точке, пока остальные частицы его не обгонят и не сместят глобальный рекорд.

Почему это важно

Три коэффициента формулы — это не произвольные настройки, а прямой рычаг управления балансом exploration (широкое исследование пространства поиска) и exploitation (точная доводка уже найденного хорошего решения). Большой инерционный вес $w$ сохраняет высокую скорость надолго — рой продолжает активно облетать пространство, даже приблизившись к хорошей области, это работает на exploration. Малый $w$ быстро гасит скорость, заставляя частицы быстро «оседать» в окрестности текущих рекордов — это exploitation. Доминирующий когнитивный коэффициент $c_1$ делает частицы более «индивидуалистами», каждая тянется в первую очередь к собственному опыту — рой дольше сохраняет разнообразие. Доминирующий социальный коэффициент $c_2$, наоборот, быстро стягивает всех к одной точке — это ускоряет сходимость, но повышает риск застрять в локальном минимуме, который первым нашла любая из частиц. Именно поэтому на практике инерционный вес часто линейно уменьшают в процессе оптимизации — например, от $w=0{,}9$ в начале до $w=0{,}4$ к концу заданного числа итераций $T_{\max}$: $w(t) = 0{,}9 - 0{,}5 \cdot t / T_{\max}$. Такая схема даёт рою простор для широкого исследования на старте и постепенно переключает его в режим точной доводки к финалу — ровно та же логика затухающего шага, что ты уже видел у скорости обучения в градиентном спуске.

Обновление позиции и полная трасса роя

Интуиция

После того как новая скорость посчитана, обновление позиции — самая простая формула во всём алгоритме: частица просто перемещается на вектор своей новой скорости, без каких-либо дополнительных весов или случайности. Вся сложность и вся «умность» PSO целиком сосредоточена в формуле скорости — позиция лишь механически следует за ней.

Формальное определение

Формула обновления позиции PSO.

$$x_i(t+1) = x_i(t) + v_i(t+1)$$

После обновления позиции вычисляется новое значение функции $f\bigl(x_i(t+1)\bigr)$, и по нему обновляются память частицы и память роя:

$$p_i \leftarrow x_i(t+1), \quad \text{если } f\bigl(x_i(t+1)\bigr) < f(p_i)$$

$$g \leftarrow x_i(t+1), \quad \text{если } f\bigl(x_i(t+1)\bigr) < f(g)$$

(неравенства даны для задачи минимизации; для максимизации знаки переворачиваются).

Полный шаг итерации PSO для одной частицы можно записать псевдокодом:

для каждой частицы i:
    вычислить v_i(t+1) по формуле скорости (инерция + когнитивное + социальное)
    x_i(t+1) = x_i(t) + v_i(t+1)
    вычислить f(x_i(t+1))
    если f(x_i(t+1)) лучше f(p_i): обновить p_i = x_i(t+1)
    если f(x_i(t+1)) лучше f(g): обновить g = x_i(t+1)
повторять, пока не выполнен критерий остановки

Примеры

Пример 1: полная трасса роя из трёх частиц на две итерации. Продолжим численный пример из предыдущего раздела — $w=0{,}7$, $c_1=c_2=2{,}0$, функция $f(x,y)=x^2+y^2$. Скорости первой итерации уже посчитаны: $v_A(1)=(-1{,}8,-4{,}2)$, $v_B(1)=(4{,}8,-14{,}4)$, $v_C(1)=(0,0)$. Применяем формулу позиции:

$$x_A(1) = (4,3)+(-1{,}8,-4{,}2) = (2{,}2,\,-1{,}2), \quad f_A(1) = 2{,}2^2+1{,}2^2 = 6{,}28$$

$$x_B(1) = (-2,5)+(4{,}8,-14{,}4) = (2{,}8,\,-9{,}4), \quad f_B(1) = 2{,}8^2+9{,}4^2 = 96{,}2$$

$$x_C(1) = (1,-4)+(0,0) = (1,\,-4), \quad f_C(1) = 17$$

Сравниваем с памятью: у A новое значение $6{,}28$ лучше старого $25$ — личный рекорд обновляется, $p_A=(2{,}2,-1{,}2)$. У B новое значение $96{,}2$ хуже старого $29$ — личный рекорд остаётся прежним, $p_B=(-2,5)$. У C значение не изменилось. Сверяем все личные рекорды: $6{,}28$ (A), $29$ (B), $17$ (C) — минимум теперь у A, значит глобальный рекорд роя переходит к ней: $g=(2{,}2,-1{,}2)$, $f(g)=6{,}28$.

Переходим ко второй итерации со случайными числами $r_1=0{,}4$, $r_2=0{,}7$ для A; $r_1=0{,}7$, $r_2=0{,}2$ для B; $r_1=0{,}3$, $r_2=0{,}6$ для C.

Частица A теперь сама является и своим личным рекордом, и глобальным рекордом роя ($p_A=x_A(1)=g=(2{,}2,-1{,}2)$), поэтому оба слагаемых — когнитивное и социальное — обнуляются, и в дело идёт только инерция: $v_A(2) = 0{,}7\cdot(-1{,}8,-4{,}2) = (-1{,}26,\,-2{,}94)$, откуда $x_A(2) = (2{,}2,-1{,}2)+(-1{,}26,-2{,}94) = (0{,}94,\,-4{,}14)$, $f_A(2) = 0{,}94^2+4{,}14^2 \approx 18{,}02$ — хуже, чем $6{,}28$, поэтому личный рекорд A не обновляется и остаётся $(2{,}2,-1{,}2)$.

Частица B: когнитивное слагаемое $c_1 r_1 (p_B - x_B) = 2\cdot0{,}7\cdot\bigl((-2,5)-(2{,}8,-9{,}4)\bigr) = 1{,}4\cdot(-4{,}8,14{,}4) = (-6{,}72,\,20{,}16)$; социальное $c_2 r_2 (g - x_B) = 2\cdot0{,}2\cdot\bigl((2{,}2,-1{,}2)-(2{,}8,-9{,}4)\bigr) = 0{,}4\cdot(-0{,}6,8{,}2)=(-0{,}24,\,3{,}28)$; инерция $0{,}7\cdot(4{,}8,-14{,}4)=(3{,}36,\,-10{,}08)$. Сумма: $v_B(2) = (3{,}36-6{,}72-0{,}24,\; -10{,}08+20{,}16+3{,}28) = (-3{,}6,\,13{,}36)$, значит $x_B(2)=(2{,}8,-9{,}4)+(-3{,}6,13{,}36)=(-0{,}8,\,3{,}96)$, $f_B(2)=0{,}64+15{,}68 \approx 16{,}32$ — заметно лучше прежнего личного рекорда B ($29$), обновляем: $p_B=(-0{,}8,3{,}96)$.

Частица C: когнитивное слагаемое нулевое ($p_C=x_C$), социальное $c_2 r_2 (g-x_C) = 2\cdot0{,}6\cdot\bigl((2{,}2,-1{,}2)-(1,-4)\bigr)=1{,}2\cdot(1{,}2,2{,}8)=(1{,}44,\,3{,}36)$, инерция нулевая. $v_C(2)=(1{,}44,3{,}36)$, $x_C(2)=(1,-4)+(1{,}44,3{,}36)=(2{,}44,\,-0{,}64)$, $f_C(2)=5{,}95+0{,}41\approx6{,}36$ — лучше прежнего $17$, обновляем $p_C=(2{,}44,-0{,}64)$.

Сверяем личные рекорды после второй итерации: $6{,}28$ (A, не изменился), $16{,}32$ (B), $6{,}36$ (C) — минимум по-прежнему у A, глобальный рекорд роя остаётся $g=(2{,}2,-1{,}2)$. Сводная таблица трассы:

Итерация $x_A$ $f_A$ $x_B$ $f_B$ $x_C$ $f_C$ $g$
0 $(4,3)$ 25 $(-2,5)$ 29 $(1,-4)$ 17 $(1,-4)$
1 $(2{,}2,-1{,}2)$ 6,28 $(2{,}8,-9{,}4)$ 96,2 $(1,-4)$ 17 $(2{,}2,-1{,}2)$
2 $(0{,}94,-4{,}14)$ 18,02 $(-0{,}8,3{,}96)$ 16,32 $(2{,}44,-0{,}64)$ 6,36 $(2{,}2,-1{,}2)$

За две итерации все три частицы заметно приблизились к истинному минимуму $(0,0)$, хотя ни одна из них не двигалась к нему по прямой линии, а лучшая найденная точка роя ($f\approx6{,}28$) намного превосходит худшую начальную точку ($f=29$) — именно за счёт коллективной, а не индивидуальной памяти.

Пример 2: что происходит без инерции ($w=0$). Пересчитаем шаг частицы A на второй итерации при $w=0$ вместо $0{,}7$, оставив всё остальное неизменным. У частицы A на этом шаге когнитивное и социальное слагаемые и так нулевые (она сама лидер), значит при $w=0$ инерционное слагаемое тоже обнуляется: $v_A(2) = 0\cdot(-1{,}8,-4{,}2) + (0,0) + (0,0) = (0,0)$, и частица A остаётся точно в точке $(2{,}2,-1{,}2)$ без единого движения. Без инерции текущий лидер роя замирает намертво в момент, когда становится лидером, — и продолжает исследование пространства только благодаря остальным частицам. Это ровно тот «парадокс нулевой скорости», о котором говорилось в предыдущем разделе, доведённый до предела: инерция — это единственное, что не даёт лидеру застыть.

Пример 3: расходимость роя при слишком большом $w$. Теперь пересчитаем шаг частицы B на второй итерации с $w=2{,}5$ вместо $0{,}7$ — когнитивное и социальное слагаемые остаются теми же, что и в примере 1 ($(-6{,}72,20{,}16)$ и $(-0{,}24,3{,}28)$), но инерционное слагаемое становится $2{,}5\cdot(4{,}8,-14{,}4)=(12,\,-36)$. Тогда $v_B(2) = (12,-36)+(-6{,}72,20{,}16)+(-0{,}24,3{,}28)=(5{,}04,\,-12{,}56)$, откуда $x_B(2) = (2{,}8,-9{,}4)+(5{,}04,-12{,}56)=(7{,}84,\,-21{,}96)$, и $f_B(2)=61{,}47+482{,}24\approx543{,}7$ — почти в шесть раз хуже, чем было на предыдущем шаге ($96{,}2$), хотя все три компонента формулы формально тянули частицу к лучшим точкам. Слишком большая инерция не даёт скорости гаситься между шагами: частица сохраняет и наращивает разгон вместо того, чтобы плавно подходить к цели, и в итоге улетает от оптимума всё дальше. Это ровно та неустойчивость, ради предотвращения которой на практике рекомендуют держать $w$ в разумных пределах (обычно не выше $0{,}9$) либо использовать явное ограничение скорости — velocity clamping, о котором пойдёт речь в разделе с практикой.

Почему это важно

Формула позиции сама по себе тривиальна, но именно она превращает абстрактную «тягу» из формулы скорости в фактическое движение частицы по пространству поиска — и именно на этом шаге видно, как сильно инерционный вес влияет на устойчивость всего процесса. Слишком малый $w$ гасит движение до полной остановки, как только частица оказывается лидером или совпадает с собственным личным рекордом. Слишком большой $w$, напротив, накапливает скорость быстрее, чем притягивающие слагаемые успевают её скорректировать, и рой расходится вместо того, чтобы сходиться. Разумный выбор и, как правило, постепенное уменьшение $w$ в процессе оптимизации — это то, что превращает PSO из набора формул в практически работающий, устойчиво сходящийся алгоритм.

PSO против генетических алгоритмов: рой без отбора и скрещивания

Интуиция

Раздели два алгоритма по одному ключевому вопросу: что происходит с популяцией кандидатов-решений между итерациями? В генетическом алгоритме из урока 296 ответ — «она полностью пересобирается». Родители отбираются по фитнесу, худшие особи выбраковываются, а вместо них скрещиванием и мутацией создаются новые особи-потомки, физически не совпадающие ни с одним из родителей. Состав популяции на итерации $t+1$ — это, вообще говоря, совсем другой набор точек в пространстве поиска, чем на итерации $t$. В PSO ответ принципиально другой: рой весь оптимизационный процесс состоит из одних и тех же $N$ частиц с самого первого до самого последнего шага. Ни одна частица не «умирает» и не заменяется потомком — каждая просто меняет свою позицию, ведомая формулой скорости. Весь рой движется одновременно и непрерывно, а не сменяет поколения дискретными скачками состава.

Формальное определение

Структурное различие PSO и генетического алгоритма. Пусть популяция (рой) состоит из $N$ кандидатов-решений на каждой итерации.

Генетический алгоритм: $P(t+1) = \text{Mutate}\bigl(\text{Crossover}(\text{Select}(P(t)))\bigr)$ — из $P(t)$ через селекцию отбираются родители, через кроссовер создаются новые особи-потомки, через мутацию в них вносятся случайные изменения; состав $P(t+1)$ в общем случае не пересекается по конкретным точкам с $P(t)$.

PSO: $x_i(t+1) = x_i(t) + v_i(t+1)$ для каждой частицы $i = 1, \dots, N$ по отдельности — множество индексов частиц $\{1,\dots,N\}$ фиксировано на всё время оптимизации, обновляется только позиция и скорость каждой конкретной частицы, никакого оператора отбора или рекомбинации между разными частицами нет.

Примеры

Пример 1: один и тот же токовый набор точек GA пересобрал бы, а PSO — просто передвинул. Возьмём наш рой из трёх частиц после первой итерации: $x_A(1)=(2{,}2,-1{,}2)$ с $f=6{,}28$, $x_C(1)=(1,-4)$ с $f=17$ — два относительно неплохих кандидата. Генетический алгоритм на этом шаге выбрал бы их как родителей (например, турнирной селекцией по фитнесу) и построил бы потомка скрещиванием — скажем, одноточечным кроссовером по первой координате: потомок $= (2{,}2,\,-4)$, то есть новая точка, физически не совпадающая ни с A, ни с C, составленная из частей обеих. У этого потомка нет собственной истории, нет накопленного личного рекорда — для генетического алгоритма это нормально, там понятие «личной памяти» вообще отсутствует. PSO с теми же двумя частицами не создаёт никакой третьей точки — вместо этого частица C на следующем шаге получает социальную тягу в сторону $g$ (в данном случае это позиция A) и сама смещается ближе к ней, оставаясь при этом той же самой частицей C со своей накопленной историей.

Пример 2: непрерывное пространство гиперпараметров — естественная территория PSO. Пусть мы подбираем скорость обучения $\text{lr}$ и коэффициент дропаута $\text{dropout}$ для нейросети, оба параметра непрерывны: $\text{lr} \in [10^{-4}, 10^{-1}]$, $\text{dropout} \in [0, 0{,}5]$. Одна частица роя — это просто вектор $(0{,}01,\ 0{,}3)$, её личный рекорд, скажем, $(0{,}005,\ 0{,}25)$ с лучшей точностью на валидации, а глобальный рекорд роя $(0{,}003,\ 0{,}2)$. Применяя формулу скорости с $w=0{,}7$, $c_1=c_2=1{,}5$, $r_1=0{,}4$, $r_2=0{,}6$ по каждой координате отдельно: по $\text{lr}$ — когнитивное $1{,}5\cdot0{,}4\cdot(0{,}005-0{,}01)=-0{,}003$, социальное $1{,}5\cdot0{,}6\cdot(0{,}003-0{,}01)=-0{,}0063$, суммарная скорость (без инерции на первом шаге) $\approx-0{,}0093$, новая позиция $\text{lr}\approx0{,}0007$. Всё это — обычные вещественные операции над вещественными числами, без единого шага кодирования. Генетическому алгоритму для той же задачи пришлось бы либо дискретизировать интервал $[10^{-4},10^{-1}]$ в конечный набор значений и терять точность, либо использовать специальные операторы вещественного кроссовера (такие как BLX-$\alpha$ или SBX), которые фактически изобретают что-то похожее на PSO-шаг, только внутри чуждой для непрерывных величин рамки «родитель — потомок».

Пример 3: разная природа потери разнообразия. В генетическом алгоритме потеря разнообразия популяции происходит явно и структурно — через селекционное давление: слабые особи физически исчезают из популяции, отбор безвозвратно сужает генофонд. В PSO ни одна частица не исчезает никогда, но разнообразие всё равно постепенно теряется — по другому механизму. Смотри снова на трассу из предыдущего раздела: скорость частицы B на первой итерации была огромной ($|v_B(1)|\approx15{,}2$), но к концу процесса, по мере того как все частицы стягиваются к общему $g$, разности $(p_i - x_i)$ и $(g-x_i)$ у большинства частиц становятся всё меньше, и скорости у всего роя постепенно затухают сами по себе, даже без явного отбора. Рой не «убивает» плохие частицы — он их просто синхронно подтягивает всё ближе друг к другу, и в пределе весь рой коллапсирует в одну точку без единого акта явной селекции.

Почему это важно

Отсутствие явного отбора и скрещивания — не техническая деталь, а прямое следствие того, что PSO моделирует принципиально другой механизм коллективного поведения, чем эволюция: не смену поколений через размножение и вымирание, а синхронное движение с общей памятью, как у стаи. На практике это различие определяет, для каких задач какой алгоритм выбрать. Для непрерывных пространств гиперпараметров — learning rate, коэффициенты регуляризации, веса в ансамблях — PSO чаще оказывается естественнее и быстрее сходится, чем генетический алгоритм с его накладными расходами на кодирование вещественных чисел. Для существенно комбинаторных, дискретных задач — порядок слоёв в архитектуре, выбор подмножества признаков, структура графа — генетический алгоритм с его естественными операторами перестановки и кроссовера часто удобнее. На практике PSO и генетические алгоритмы конкурируют друг с другом и с байесовской оптимизацией именно в задаче подбора гиперпараметров: PSO обычно выигрывает на полностью непрерывных пространствах, байесовская оптимизация — там, где каждое обучение модели дорого и важно тратить как можно меньше пробных запусков, а генетические алгоритмы — там, где пространство поиска смешанное или существенно дискретное. Отдельная, менее распространённая область применения PSO в машинном обучении — обучение небольших нейросетей как метод нулевого порядка: если сеть достаточно мала (сотни или несколько тысяч весов), а вычисление градиента по какой-то причине недоступно или нежелательно, каждую частицу роя можно интерпретировать как полный набор весов сети, а её фитнес — как ошибку на обучающей выборке, и PSO способен подобрать веса, вообще не обращаясь к обратному распространению ошибки — хотя для сетей современного масштаба, с миллионами и миллиардами параметров, это уже практически неприменимо ровно по той же причине, по которой неприменимы и генетические алгоритмы: число частиц/особей, необходимое для покрытия пространства такой размерности, растёт неподъёмно быстро.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Частица в 1D-задаче находится в позиции $x=5$ со скоростью $v=0{,}3$. Её личный рекорд $p=1$, глобальный рекорд роя $g=2$. Параметры: $w=0{,}5$, $c_1=c_2=2$, $r_1=0{,}6$, $r_2=0{,}4$. Найди новую скорость $v(t+1)$.


Задание 2: Используя результат задания 1, найди новую позицию частицы $x(t+1)$.


Задание 3: Частица находится ровно в точке своего личного рекорда, но не в точке глобального рекорда роя ($p_i = x_i$, $g \ne x_i$). Что происходит с когнитивным слагаемым формулы скорости?


Задание 4: У частицы $f(x_{\text{старое}}) = 40$, а после шага $f(x_{\text{новое}}) = 35$ (задача минимизации). Личный рекорд частицы до шага был $p$ с $f(p) = 32$. Обновится ли $p$?


Задание 5: Пять частиц роя имеют личные рекорды со значениями фитнеса (минимизация): $f = [12,\ 8,\ 15,\ 8,\ 20]$. Чему равно значение $f(g)$ глобального рекорда роя? Единственна ли частица-обладатель этого значения?


Задание 6: Что произойдёт с формулой скорости, если положить $w=0$, но $c_1, c_2 > 0$?


Задание 7: Что произойдёт, если положить $c_1 = c_2 = 0$, но $w=1$?


Задание 8: Частица в 2D находится в $x=(3,3)$, её личный рекорд $p=(1,1)$. Вычисли вектор когнитивного слагаемого при $c_1=2$, $r_1=0{,}5$.


Задание 9: Верно ли утверждение: «в PSO, как и в генетическом алгоритме, есть оператор скрещивания, просто он называется иначе»?


Задание 10: Сопоставь понятия: «популяция» в генетическом алгоритме и ___ в PSO; «особь» в генетическом алгоритме и ___ в PSO; «фитнес-функция» в генетическом алгоритме и ___ в PSO.


Продвинутые задания (11–20)

Задание 11: Частица в 2D: $x=(0,0)$, $v=(1,-1)$, $p=(2,2)$, $g=(-1,3)$. Параметры $w=0{,}6$, $c_1=1{,}5$, $c_2=2{,}5$, $r_1=0{,}5$, $r_2=0{,}4$. Найди $v(t+1)$ и $x(t+1)$.


Задание 12: В примере урока частица B на первой итерации получила скорость $v_B(1)=(4{,}8,-14{,}4)$ и в результате её $f$ выросла с 29 до 96,2. Объясни, какой конкретно параметр формулы больше всего повлиял на этот «перелёт», и предложи, что изменить, чтобы его смягчить.


Задание 13: Частица является одновременно и своим личным рекордом, и глобальным рекордом роя ($x_i = p_i = g$), а её скорость на предыдущем шаге была нулевой. Что произойдёт с ней на следующем шаге при любых значениях $w, c_1, c_2 > 0$?


Задание 14: Инерционный вес убывает по линейному расписанию $w(t) = 0{,}9 - 0{,}5\cdot t/T_{\max}$. При $T_{\max}=100$ найди $w(20)$ и $w(80)$.


Задание 15: Вычисленная скорость частицы оказалась равна $v=(15,-22)$, а установленный предел $v_{\max}=5$ на каждую координату (velocity clamping). Как должна быть скорректирована скорость перед применением к позиции?


Задание 16: Сравни поведение роя при двух наборах коэффициентов: (а) $c_1=3{,}5$, $c_2=0{,}5$ и (б) $c_1=0{,}5$, $c_2=3{,}5$ (при прочих равных). Какой из них быстрее сойдётся к общей точке, а какой дольше сохранит разнообразие роя?


Задание 17: Требуется подобрать скорость обучения $\text{lr}\in[10^{-4},10^{-1}]$ генетическим алгоритмом с 8-битным двоичным кодированием интервала. Вычисли шаг дискретизации (минимальную разницу между соседними закодированными значениями $\text{lr}$).


Задание 18: Рой из пяти частиц. Личные рекорды и их фитнес: $A: f=14$, $B: f=9$, $C: f=9$, $D: f=22$, $E: f=11$. Определи $g$ и объясни, что произойдёт с формулой скорости частицы D на следующем шаге, если её текущая позиция совпадает с её личным рекордом.


Задание 19: Оцени, сошёлся ли рой, по разбросу позиций трёх частиц: $x_1=(0{,}01,-0{,}02)$, $x_2=(0{,}03,0{,}01)$, $x_3=(-0{,}02,0{,}00)$. Приведи качественный критерий, который можно использовать как правило остановки.


Задание 20: Для одной и той же одномерной задачи выполни один шаг генетического алгоритма (одноточечный кроссовер двух родителей $[3,7]$ и $[5,1]$ по средней точке, без мутации) и один шаг PSO (для частицы $x=3$, $v=0$, $p=3$, $g=5$, $w=0{,}5$, $c_1=c_2=2$, $r_1=r_2=0{,}5$). Сравни результаты.


Задания-челленджи (21–30)

Задание 21: Рой из двух частиц минимизирует $f(x)=x^2$ (1D). Стартовые позиции $x_A=6$, $x_B=-3$, скорости нулевые. Параметры $w=0{,}6$, $c_1=c_2=1{,}8$, для первой итерации $r_1^A=0{,}5$, $r_2^A=0{,}5$, $r_1^B=0{,}4$, $r_2^B=0{,}9$. Выполни одну полную итерацию: найди $g$ на старте, посчитай $v(1)$, $x(1)$ для обеих частиц и новый $g$.


Задание 22: Объясни, почему у классического PSO без дополнительных модификаций (коэффициент сжатия / constriction factor, ограничение скорости / velocity clamping, ограничение области поиска) нет теоретической гарантии сходимости именно к глобальному, а не к локальному оптимуму многоэкстремальной функции.


Задание 23: Как можно адаптировать PSO для оптимизации дискретного параметра — например, числа слоёв нейросети, целого числа от 2 до 10? Опиши идею.


Задание 24: В чём именно PSO выступает «методом нулевого порядка» при обучении небольшой нейросети, и почему этот подход неприменим для современных больших моделей?


Задание 25: Для подбора гиперпараметров PSO с 20 частицами делает 30 итераций, на каждой итерации каждая частица требует полного обучения модели. Сколько всего обучений модели потребуется? Сравни с байесовской оптимизацией, которой для той же задачи обычно достаточно 50 последовательных обучений — какой метод дешевле по числу запусков, а какой лучше распараллеливается?


Задание 26: Покажи алгебраически, при каких условиях на $w$ и на слагаемые скорость частицы, даже при нулевых когнитивном и социальном слагаемых, будет неограниченно расти от итерации к итерации.


Задание 27: Объясни идею constriction factor (коэффициента сжатия) $\chi$, введённого Морисом Клерком и Джеймсом Кеннеди в 2002 году, и почему типичный практический набор параметров $w\approx0{,}729$, $c_1=c_2\approx1{,}494$ считается хорошим значением по умолчанию.


Задание 28: Опиши, как выглядела бы «частица» PSO при подборе гиперпараметров случайного леса (Random Forest): число деревьев (целое, 10–500), максимальная глубина (целое, 2–30), доля признаков на разбиение (вещественная, 0,1–1,0). Как считать фитнес такой частицы?


Задание 29: Следующий урок курса — метод имитации отжига (simulated annealing). Он тоже метаэвристика и тоже не использует градиент. Чем принципиально отличается устройство simulated annealing от PSO в плане того, сколько кандидатов-решений участвует в поиске одновременно?


Задание 30: Обобщи блок уроков 295–297: эволюционные алгоритмы, генетические алгоритмы, PSO. В двух-трёх предложениях опиши общий принцип, объединяющий все три, и главное структурное отличие PSO от первых двух.


Частые ошибки

Ошибка 1. Считают, что в PSO, как и в генетическом алгоритме, есть операторы отбора и скрещивания, просто названные иначе.

Как выглядит: «раз это тоже популяционный алгоритм, значит, худшие частицы тоже как-то отсеиваются».

Почему возникает: PSO и генетические алгоритмы решают похожие задачи и оба работают с популяцией кандидатов, из-за чего кажется, что у них должны быть одинаковые внутренние механизмы.

Как правильно: в PSO нет ни отбора, ни скрещивания — состав роя фиксирован от первой до последней итерации, каждая частица обновляется исключительно на основе собственной истории и единой для всего роя памяти $g$, никакая частица не «умирает» и не заменяется потомком.

Ошибка 2. Путают понятие «глобального рекорда $g$» с текущей позицией какой-либо конкретной «лучшей» частицы.

Как выглядит: «раз частица C была лидером, надо всегда двигать остальных к текущей позиции частицы C».

Почему возникает: на старте позиция лучшей частицы действительно совпадает с $g$, и легко забыть, что $g$ — это отдельно хранимая точка в пространстве, а не привязка к конкретному индексу частицы.

Как правильно: $g$ — это позиция с наилучшим когда-либо найденным значением функции среди всех личных рекордов, и она может «принадлежать» разным частицам на разных итерациях; более того, сама частица, изначально нашедшая эту точку, вполне может улететь оттуда на следующем шаге, а $g$ при этом останется прежним, пока кто-то не найдёт значение лучше.

Ошибка 3. Устанавливают инерционный вес $w \ge 1$ (или отрицательным) без проверки устойчивости.

Как выглядит: «поставим $w=1{,}5$, чтобы частицы двигались энергичнее и быстрее исследовали пространство».

Почему возникает: интуитивно кажется, что больший вес инерции — это просто «больше движения», а значит, лучше для исследования.

Как правильно: при $|w|\ge1$ (особенно в сочетании с ненулевыми $c_1$, $c_2$) скорость частиц может расти от итерации к итерации вместо затухания, и рой вместо сходимости расходится, как показано в разобранном примере с $w=2{,}5$ — практический диапазон $w$ обычно держат в пределах $0{,}4$–$0{,}9$, либо используют формально обоснованный constriction factor.

Ошибка 4. Ставят $w=0$ по всему процессу оптимизации, полагая, что это «упрощает» алгоритм без потерь.

Как выглядит: «зачем нам инерция вообще, будем считать скорость заново каждый раз только из когнитивного и социального слагаемых».

Почему возникает: формула без инерционного слагаемого действительно проще и исторически была именно такой в самой первой версии PSO 1995 года.

Как правильно: без инерции частица, совпавшая со своим личным и глобальным рекордом одновременно (типичная ситуация для текущего лидера роя), полностью замирает на месте до следующего улучшения $g$ — это резко снижает эффективность исследования пространства; именно добавление $w$ в 1998 году стало ключевым усовершенствованием, без которого канонический PSO сегодня почти не используется.

Ошибка 5. Применяют PSO «в лоб» к задачам с существенно дискретной, комбинаторной структурой — например, к перестановкам городов в задаче коммивояжёра — без какой-либо адаптации.

Как выглядит: «раз PSO работает лучше генетического алгоритма для гиперпараметров, будем использовать его вместо ГА и для задачи коммивояжёра».

Почему возникает: PSO действительно во многих задачах превосходит генетический алгоритм, и из этого ошибочно делают вывод об универсальном превосходстве.

Как правильно: классическая формула PSO оперирует непрерывными вещественными векторами позиции и скорости, а понятие «скорости между двумя перестановками городов» физически не определено без специальной, нетривиальной переформулировки задачи — для существенно комбинаторных задач генетический алгоритм с естественными операторами перестановки (order crossover, swap-мутация) обычно подходит напрямую куда лучше.

Ошибка 6. Игнорируют velocity clamping (ограничение максимальной скорости) при работе с реальными гиперпараметрами разного масштаба.

Как выглядит: применяют одну и ту же формулу скорости к параметрам вроде learning rate (диапазон около $0{,}0001$–$0{,}1$) и числа эпох (диапазон 10–200) без нормализации и без ограничения скорости.

Почему возникает: формула скорости одинаково записывается для всех координат, и легко забыть, что абсолютные величины и разумные шаги для разных гиперпараметров могут отличаться на порядки.

Как правильно: перед запуском PSO гиперпараметры обычно нормализуют к сопоставимому масштабу (например, к отрезку $[0,1]$), а на скорость по каждой координате накладывают явное ограничение $v_{\max}$ — иначе координата с большим абсолютным диапазоном значений будет диктовать неадекватно большие шаги по координате с маленьким диапазоном, если считать их в одних и тех же «сырых» единицах.

Главное запомнить

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

  • Частица полностью описывается четвёркой: текущей позицией $x_i(t)$, текущей скоростью $v_i(t)$, личным рекордом $p_i$ (лучшая позиция, посещённая этой частицей) и глобальным рекордом $g$ (лучшая позиция, найденная всем роем).

  • Формула обновления скорости — сумма трёх слагаемых: инерции $w\cdot v_i(t)$, когнитивного слагаемого $c_1 r_1 (p_i - x_i(t))$ и социального слагаемого $c_2 r_2 (g - x_i(t))$; случайные множители $r_1, r_2 \in [0,1]$ добавляют стохастичность.

  • Формула обновления позиции предельно проста — $x_i(t+1) = x_i(t) + v_i(t+1)$ — вся содержательная сложность алгоритма сосредоточена в формуле скорости, а не позиции.

  • Инерционный вес $w$ управляет балансом exploration/exploitation: большой $w$ поддерживает широкое исследование пространства, малый — ускоряет точную доводку найденного решения; типичный практический приём — линейно уменьшать $w$ от примерно $0{,}9$ до примерно $0{,}4$ в процессе оптимизации.

  • Соотношение когнитивного и социального коэффициентов $c_1$, $c_2$ определяет, насколько частицы «индивидуалисты» (доверяют своему опыту) или «конформисты» (быстро стягиваются к общей точке); стандартный выбор — $c_1=c_2\approx2$, либо формально обоснованные значения constriction factor $w\approx0{,}729$, $c_1=c_2\approx1{,}494$.

  • В отличие от генетического алгоритма, PSO с самого начала работает с непрерывными вещественными координатами без какого-либо кодирования, что делает его естественным инструментом для подбора непрерывных гиперпараметров моделей машинного обучения.

  • PSO конкурирует с генетическими алгоритмами и байесовской оптимизацией в задаче подбора гиперпараметров: он часто выигрывает на полностью непрерывных пространствах, тогда как байесовская оптимизация экономнее по числу дорогих обучений модели, а генетический алгоритм естественнее для дискретных и комбинаторных пространств.

  • PSO может выступать методом нулевого порядка — использующим только значения целевой функции, без градиента — для обучения небольших нейросетей, но на масштабе миллионов и миллиардов весов современных моделей это практически неприменимо.

  • Алгоритм придумали в 1995 году Джеймс Кеннеди и Расселл Эберхарт, изначально моделируя стайное социальное поведение по мотивам модели «boids» Крейга Рейнольдса; инерционный вес $w$, без которого сегодня PSO почти не используют, добавили Ши и Эберхарт лишь в 1998 году.

Связь с темами курса

Что нужно было знать до этого урока

Этот урок напрямую опирается на блок из уроков 295 и 296 — эволюционные и генетические алгоритмы. Понимание того, что такое метаэвристика, популяция кандидатов-решений, фитнес-функция и общая логика итеративного улучшения без вычисления производной, было заложено именно там, и в этом уроке ты увидел, как та же самая общая идея реализуется через принципиально иной, не-дарвиновский механизм. Пригодилось и более раннее знакомство с методами нулевого порядка (урок 294) — именно к этому семейству методов, работающих исключительно со значениями функции, а не с её производными, относится и PSO.

Что изучить дальше

Следующий урок 298 разбирает имитацию отжига (simulated annealing) — ещё одну метаэвристику, вдохновлённую не биологией, а физикой процесса медленного остывания металла. В отличие от PSO, simulated annealing работает не с целым роем, а с единственным текущим решением, компенсируя отсутствие коллективной памяти вероятностным допуском временных ухудшений качества решения — вероятность такого допуска постепенно снижается по мере «остывания» процесса. Ты сможешь напрямую сравнить, как две разные метафоры — стая и остывающий металл — решают одну и ту же по сути задачу глобальной оптимизации без градиента.

Где это нужно в жизни

🤖 Подбор гиперпараметров моделей машинного обучения. PSO — один из стандартных инструментов автоматического машинного обучения (AutoML) наряду с генетическими алгоритмами и байесовской оптимизацией, особенно уместный там, где пространство гиперпараметров преимущественно непрерывно — скорости обучения, коэффициенты регуляризации, коэффициенты дропаута, веса в ансамблевых моделях.

🧠 Обучение небольших нейросетей без градиента. Там, где обратное распространение ошибки недоступно или нежелательно (например, при недифференцируемых компонентах модели), PSO способен подобрать веса относительно небольшой сети как метод нулевого порядка, оценивая кандидатов исключительно по значению функции потерь.

📡 Инженерное проектирование. PSO исторически активно применяли для задач проектирования антенн и электромагнитных систем (в частности, в NASA и Sandia National Laboratories) — задач с непрерывными геометрическими параметрами и дорогими, но детерминированными симуляциями качества конкретной конфигурации, где явный градиент недоступен.

⚡ Оптимизация энергосистем и производственных процессов. Задачи вроде оптимального распределения нагрузки между генераторами электросети или настройки параметров промышленных процессов часто формулируются как минимизация непрерывной целевой функции с ограничениями, и PSO — один из практических инструментов для таких сценариев, когда аналитический градиент недоступен или задача не выпукла.

Интересные факты

  • Джеймс Кеннеди, один из создателей PSO, по образованию социальный психолог, а не инженер или специалист по оптимизации — алгоритм родился из попытки смоделировать распространение идей и норм в человеческих сообществах, а не из целенаправленного поиска нового метода оптимизации.

  • Прямым источником вдохновения для ранней версии модели послужила программа «boids» Крейга Рейнольдса 1987 года — одна из первых компьютерных симуляций стайного поведения, где сложная согласованная хореография птичьей стаи рождалась всего из трёх простых локальных правил, без единого управляющего центра.

  • В самой первой версии алгоритма 1995 года инерционного веса $w$ не существовало вообще — скорость на каждом шаге пересчитывалась заново полностью из когнитивного и социального слагаемых. Добавление $w$ в 1998 году настолько улучшило устойчивость и управляемость алгоритма, что практически все современные реализации используют именно эту, «усиленную» версию.

  • PSO реально применяли в инженерных задачах NASA и Sandia National Laboratories для проектирования антенн — там, где качество конкретной геометрической конфигурации антенны можно оценить дорогой, но детерминированной электромагнитной симуляцией, а явный градиент недоступен в принципе.

Лайфхаки

  • Не реализуй PSO с нуля для практических задач — для подбора гиперпараметров и общей непрерывной оптимизации есть готовые, хорошо оттестированные библиотеки (например, pyswarms на Python), где уже встроены и линейное затухание $w$, и velocity clamping, и разные топологии обмена информацией между частицами.

  • Если не хочешь вручную подбирать расписание изменения $w$, начни с формально обоснованных значений constriction factor — $w\approx0{,}729$, $c_1=c_2\approx1{,}494$ — это разумный, устойчивый выбор по умолчанию почти для любой задачи.

  • Перед запуском PSO на реальных гиперпараметрах приведи все координаты к сопоставимому масштабу (нормализуй к отрезку $[0,1]$ или похожему диапазону) — иначе координата с большим абсолютным диапазоном (число эпох) будет диктовать неадекватно большие шаги по координате с маленьким диапазоном (learning rate) при одной и той же «сырой» формуле скорости.

  • Поскольку фитнес всех частиц одной итерации вычисляется независимо друг от друга, распараллель обучение моделей для всех частиц роя на одной итерации по разным ядрам или машинам одновременно — PSO, как и генетический алгоритм, по своей структуре «неприлично параллелен» (embarrassingly parallel), и это одно из главных практических преимуществ перед последовательной по своей природе байесовской оптимизацией.

  • Если бюджет на число обучений модели крайне ограничен (условно, меньше 50–100 запусков), присмотрись сначала к байесовской оптимизации — она обычно эффективнее использует малое число дорогих оценок; PSO раскрывается лучше там, где обучений можно себе позволить много, а инфраструктура позволяет запускать их параллельно.

  • Для смешанных пространств гиперпараметров (часть непрерывных, часть дискретных — например, learning rate вместе с типом оптимизатора) не бойся комбинировать методы: PSO для непрерывной части плюс отдельный дискретный перебор или генетическое кодирование для дискретной части часто работает лучше, чем попытка загнать всё пространство целиком в один алгоритм не самой подходящей для этого природы.

Вернись мысленно к стае скворцов, с которой начинался этот урок. Ни одна отдельная птица не видит всего поля и не знает заранее, где лучшее место для ночёвки, — и тем не менее стая находит его быстро и надёжно, просто потому что каждая птица честно комбинирует свой скромный личный опыт с сигналом от остальных. Ты только что увидел, как эта же самая идея, записанная всего двумя короткими формулами — обновлением скорости из трёх слагаемых и тривиальным сложением позиции со скоростью, — превращается в рабочий инструмент оптимизации, способный подбирать гиперпараметры реальных моделей машинного обучения без единого вычисленного градиента. В следующем уроке ты увидишь, как задачу глобальной оптимизации без градиента решает совсем другая метафора — не стая, а одна-единственная остывающая частица металла, — и сможешь сам сравнить, какая из двух картин мира тебе ближе для той или иной практической задачи.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!