Нечёткая логика

«Кому написано на роду ярмо носить — тот есть бык…» В общем, у чётких пацанов логика чёткая, а ярмоносцам приходится компромиссы находить. Логика бывает ещё и нечёткой, а создатель оной — Лотфи Заде; помню, на занятиях по ТАУ нам подчёркивали важность орфоэпии, без которой хошь не хошь, а преисполниться знаниями не получится.

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

В общем, цель создания нечёткой логики в том, чтобы описать строго математически нестрогие понятия. Например, яблоко — это нечто небольшое, круглое и красное. Хм, а если зелёное яблоко? Ну тогда оно яблоко на 73%, то есть, наверное, яблоко. А если большое, круглое и красное — тогда, может быть, это шар для боулинга или моя голова — что соответствует яблоку на 23%, а тыкве на 42%. Нечёткая логика — это попытка перевести человеческие слова в понятные для компьютера байты.

По сути, LLM делают это тоже: мы им пишем, а они берут слова, переводят в токены и в своём многомерном пространстве строят вектор — таким образом получается, что король − мужчина + женщина = королева, и т.д. К связи с нейросетями мы ещё вернёмся в конце.

1. От чёткого множества к нечёткому

Нечёткое множество задаётся функцией принадлежности μA(x)\mu_A(x) — для каждого значения xx она показывает, насколько xx к множеству «причастен»:

A={(x,μA(x))xX},μA:X[0;1]A = \{\, (x, \mu_A(x)) \mid x \in X \,\}, \qquad \mu_A : X \to [0;\, 1]
(1)

Дам несколько определений. Универсум — это всё множество значений xx, на котором задана функция принадлежности. Носитель — это все значения xx, для которых μA(x)>0\mu_A(x) > 0: они хоть немного принадлежат множеству. Ядро — значения, для которых μA(x)=1\mu_A(x) = 1: это самые «чистые» представители множества. Высота — максимальное значение μA(x)\mu_A(x); если она равна 1, множество называется нормальным. Дальше договоримся работать только с нормальными множествами.

Так яблоко это, тыква или голова? Вот чтобы вернуться от нечёткого множества к обычному, выбирают порог α\alpha от 0 до 1 и оставляют только те xx, у которых принадлежность не ниже этого порога. Это называется альфа-срезом: например, при α=0,7\alpha = 0{,}7 остаются элементы, принадлежащие множеству хотя бы на 70%.

Aα={xXμA(x)α}A_\alpha = \{\, x \in X \mid \mu_A(x) \ge \alpha \,\}
(2)

Разница видна на примере «тёплой воды» (рис. 1): у чёткого множества 29,9° — ещё «не тёплая», а 30,1° — уже «тёплая»; у нечёткого никакого скачка нет.

Слева ступенчатая характеристическая функция чёткого множества, справа плавная трапециевидная функция принадлежности нечёткого
Рис. 1 — чёткое множество «тёплая вода» и нечёткое. а) характеристическая функция интервала [30°; 40°]: скачок в точке 30° — 29,9° ещё «нет», 30,1° уже «да»; б) функция принадлежности: температура 26° принадлежит множеству со степенью 0,6.

2. Функции принадлежности

Форма функции принадлежности — тут как карта ляжет, ну или как проще программировать. Типовой набор — на рис. 2: треугольная, трапециевидная, гауссова, сигмоида.

Графики треугольной, трапециевидной, гауссовой и сигмоидной функций принадлежности
Рис. 2 — типовые функции принадлежности: а) треугольная с параметрами a, b, c; б) трапециевидная с параметрами a, b, c, d; в) гауссова с центром c и шириной σ; г) сигмоида с точкой перегиба c на уровне 0,5.

Найдёте лишний график? Конечно же а\text{а}, ведь это единственный график с острым углом. А, стоп: б\text{б} — там от bb до cc плато. Ладно-ладно, график г\text{г} отличается тем, что при увеличении аргумента не вернётся на 0.

Треугольник, трапеция и гауссова функция удобны для понятий с серединой: «около 20 градусов», «средний рост», «похоже на яблоко» — далеко слева и далеко справа принадлежность снова падает к нулю. Сигмоида нужна для пороговых понятий: «дорого», «горячо», «слишком быстро» — чем больше значение, тем увереннее принадлежность, и назад к нулю график уже не разворачивается.

В формуле ниже — треугольная и трапециевидная функции принадлежности.

μ(x)={0,xaxaba,a<xbcxcb,b<x<c0,xcμtrap(x)={0,xaxaba,a<xb1,b<xcdxdc,c<x<d0,xd\mu_{\triangle}(x) = \begin{cases} 0, & x \le a \\ \dfrac{x-a}{b-a}, & a < x \le b \\ \dfrac{c-x}{c-b}, & b < x < c \\ 0, & x \ge c \end{cases} \qquad \mu_{\mathrm{trap}}(x) = \begin{cases} 0, & x \le a \\ \dfrac{x-a}{b-a}, & a < x \le b \\ 1, & b < x \le c \\ \dfrac{d-x}{d-c}, & c < x < d \\ 0, & x \ge d \end{cases}
(3)

где a,b,ca, b, c — левое основание, вершина и правое основание треугольника, а a,b,c,da, b, c, d — левое основание, начало плато, конец плато и правое основание трапеции.

Гладкие варианты — гауссова функция и сигмоида.

μ(x)=exp ⁣((xc)22σ2),μ(x)=11+ek(xc)\mu(x) = \exp\!\left( -\dfrac{(x-c)^2}{2\sigma^2} \right), \qquad \mu(x) = \dfrac{1}{1 + e^{-k(x-c)}}
(4)

где cc — центр гауссовой функции и точка перегиба сигмоиды, σ\sigma — ширина гауссовой функции, а kk — крутизна сигмоиды.

3. Пример лингвистических переменных

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

На рис. 3 видно, зачем термы перекрывают друг друга. Значение 28° не обязано выбирать один ярлык навсегда: оно ещё «комфортно» со степенью 0,5 и уже «жарко» со степенью 0,25. Благодаря этому переход между режимами получается плавным.

Слова можно усиливать или ослаблять. «Очень жарко» должно быть строже, чем просто «жарко», а «более-менее жарко» — мягче. В формулах это превращается в операции над функцией принадлежности μA(x)\mu_A(x). Мы договорились ранее, что функция μA\mu_A нормальная. Вариантов усилить и ослабить функцию много; в формуле 5 — самые простые примеры:

μоченьA(x)=μA2(x),μболее-менееA(x)=μA(x)\mu_{\text{очень}\,A}(x) = \mu_A^2(x), \qquad \mu_{\text{более-менее}\,A}(x) = \sqrt{\mu_A(x)}
(5)
Три перекрывающихся терма лингвистической переменной температура на одной шкале
Рис. 3 — терм-множество переменной «температура»: синяя кривая — терм «холодно», зелёная — «комфортно», красная — «жарко».

4. Операции

Дополнение — отражение графика относительно уровня 0,5

μ¬A(x)=1μA(x)\mu_{\neg A}(x) = 1 - \mu_A(x)
(6)

Пересечение и объединение по Заде — поточечные минимум и максимум двух функций принадлежности (рис. 4): в пересечении выживает только зона, где оба множества «согласны», объединение накрывает всё, до чего дотягивается хотя бы одно.

μAB(x)=min(μA(x),μB(x)),μAB(x)=max(μA(x),μB(x))\mu_{A \cap B}(x) = \min\big(\mu_A(x),\, \mu_B(x)\big), \qquad \mu_{A \cup B}(x) = \max\big(\mu_A(x),\, \mu_B(x)\big)
(7)
Четыре панели с операциями над нечёткими множествами: исходные кривые, дополнение, минимум и максимум
Рис. 4 — операции Заде: а) исходные множества A и B; б) дополнение ¬A; в) пересечение A ∩ B; г) объединение A ∪ B — поточечный максимум.

min\min и max\max — лишь один вариант. Так же, как ранее мы примерно давали формулы для усиления и ослабления, так и тут: логика нечёткая же, вот и формулы тоже нечёткие. Если у нас есть две степени принадлежности, например aa и bb, то нечёткому «И» нужна функция, которая из них делает одну общую степень: насколько верно «A и B» одновременно. Такие функции называют t-нормами. Для нечёткого «ИЛИ» нужна похожая функция, только она считает степень «A или B»; её называют t-конормой. Ниже — несколько стандартных вариантов:

Tprod(a,b)=ab,TL(a,b)=max(0,a+b1)T_{\text{prod}}(a, b) = a \cdot b, \qquad T_{L}(a, b) = \max(0,\, a + b - 1)
(8)
Sprob(a,b)=a+bab,SL(a,b)=min(1,a+b)S_{\text{prob}}(a, b) = a + b - ab, \qquad S_{L}(a, b) = \min(1,\, a + b)
(9)

Плата за размытость: законы исключённого третьего и противоречия перестают выполняться

A¬AX,A¬AA \cup \neg A \ne X, \qquad A \cap \neg A \ne \varnothing
(10)

при этом на «крайних» значениях 0 и 1 все формулы совпадают с булевой логикой — нечёткая логика является её обобщением, а не заменой.

5. Нечёткий вывод: схема Мамдани

Система, использующая нечёткую логику, настраивается человеческими правилами, структурно выглядящими так:

ЕСЛИ x есть A И y есть B, ТО z есть C\text{ЕСЛИ } x \text{ есть } A \text{ И } y \text{ есть } B, \text{ ТО } z \text{ есть } C
(11)

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

Например, правила могут быть такими:

Если цвет красный и размер средний, то это яблоко.
Если цвет зелёный и размер средний, то это тоже яблоко.
Если цвет оранжевый и размер большой, то это тыква.
Если цвет красный и размер большой, то это моя голова.

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

Степень срабатывания правила: «И» внутри условия — это min (или другая t-норма)

αk=min(μAk(x0),μBk(y0))\alpha_k = \min\big( \mu_{A_k}(x_0),\, \mu_{B_k}(y_0) \big)
(12)

Каждое заключение CkC_k срезается на уровне αk\alpha_k, а срезанные множества объединяются максимумом — это и есть итоговое нечёткое множество на выходе

μC(z)=maxkmin(αk,μCk(z))\mu_{C'}(z) = \max_k \, \min\big( \alpha_k,\, \mu_{C_k}(z) \big)
(13)

Вся схема для двух правил «ЕСЛИ x есть A1A_1 И y есть B1B_1, ТО z есть C1C_1» и «ЕСЛИ x есть A2A_2 И y есть B2B_2, ТО z есть C2C_2» — на рис. 5.

Шесть панелей вывода Мамдани: условия двух правил с уровнями срабатывания, срезанные выходные термы и аккумулированная фигура с центроидом
Рис. 5 — вывод Мамдани для двух правил. а) правило 1: входы x₀ и y₀ дают степени принадлежности 0,6 и 0,4, степень срабатывания α₁ = min(0,6; 0,4) = 0,4, терм C₁ срезается на этом уровне; б) правило 2: степени 0,33 и 0,8, α₂ = 0,33, срез C₂; в) аккумуляция — максимум двух срезанных множеств — и центроид z* ≈ 49.

6. Дефаззификация

В конечном итоге нам нужно число, а не множество. Стандарт — центроид (центр тяжести фигуры под μC\mu_{C'})

z=zμC(z)dzμC(z)dzz^* = \dfrac{\displaystyle\int z\, \mu_{C'}(z)\, dz}{\displaystyle\int \mu_{C'}(z)\, dz}
(14)

Альтернативы: бисектор (вертикаль, делящая площадь пополам), MOM — середина области максимума, SOM/LOM — её левый и правый края. Разные методы дают разные ответы на одном и том же множестве (рис. 6) — выбор влияет на поведение регулятора.

Аккумулированное нечёткое множество с тремя вертикальными маркерами разных методов дефаззификации
Рис. 6 — три метода дефаззификации на одном аккумулированном множестве: синий пунктир — MOM, середина области максимума (z* = 30); зелёный штрих — бисектор, делящий площадь фигуры пополам (z* = 46); фиолетовая линия — центроид, центр тяжести (z* ≈ 49).

7. Модель Такаги—Сугено

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

ЕСЛИ x есть A И y есть B, ТО z=f(x,y)\text{ЕСЛИ } x \text{ есть } A \text{ И } y \text{ есть } B, \text{ ТО } z = f(x, y)
(15)

Выход — взвешенное среднее по степеням срабатывания, дефаззификация не нужна:

z=kαkzkkαk,zk=fk(x0,y0)z^* = \dfrac{\sum_k \alpha_k \, z_k}{\sum_k \alpha_k}, \qquad z_k = f_k(x_0, y_0)
(16)

Сугено проще считать и удобнее обучать; Мамдани нагляднее и легче читается экспертом.

8. Связь с нейросетями

Нечёткая система и нейросеть — два универсальных аппроксиматора с противоположными характерами. У нечёткой системы знания читаемы (правила «ЕСЛИ–ТО» понятны эксперту), но параметры — границы и формы термов — приходится подбирать вручную. У нейросети наоборот: она сама учится по данным, но выученное не прочитать. Гибрид берёт лучшее из обоих миров — это направление называется нейро-фаззи.

Классика гибрида — ANFIS (Янг, 1993): система Такаги—Сугено, буквально развёрнутая в сеть из пяти слоёв (рис. 7). Слой 1 — фаззификация (узлы-функции принадлежности с настраиваемыми параметрами a,b,ca, b, c или c,σc, \sigma); слой 2 — правила, «И» берётся произведением

αk=μAk(x)μBk(y)\alpha_k = \mu_{A_k}(x) \cdot \mu_{B_k}(y)
(17)

слой 3 — нормировка степеней срабатывания, слой 4 — линейные заключения fkf_k, слой 5 — сумма, дающая формулу (16). Каждый узел дифференцируем, поэтому вся конструкция обучается как обычная нейросеть: градиентным спуском (обычно гибридно — метод наименьших квадратов для коэффициентов fkf_k плюс backprop для параметров термов).

Пятислойная сеть ANFIS от входов x и y через узлы принадлежности, правил и нормировки к суммирующему выходу
Рис. 7 — ANFIS — система Такаги—Сугено в виде сети. Слой 1 — фаззификация входов x и y (термы A₁, A₂, B₁, B₂); слой 2 — правила: узлы Π перемножают степени принадлежности; слой 3 — узлы N нормируют степени срабатывания; слой 4 — линейные заключения f₁, f₂ (пунктир — входы x, y заходят и сюда); слой 5 — сумма Σ даёт чёткий выход z*. Все параметры сети настраиваются обучением.

ANFIS обучается по построению, но и классической нечёткой системе обучение не помешает: помимо правил надо выбрать функции принадлежности, а они, кстати, очень похожи на функции активации нейронов — сигмоида и есть классическая активация, а гауссова функция — ядро RBF-сетей. Схема та же: мы даём правила, а далее прогоняем множество примеров с ответами и получаем хорошие параметры функций принадлежности.