Перейти до вмісту
coden

Нейро-нечіткі системи (ANFIS): нечіткі правила, які навчаються з даних

Нечітка система Суґено як п’ятишарова мережа, гібридне навчання найменшими квадратами й градієнтом, навчання функції із зашумлених даних, вибір кількості правил і перенавчання, читабельність навчених правил і зв’язок із мережами RBF.

13 хвилин Matěj Žalmánek 2026-10-15

Серія Основи ШІ Частина 37 з 52
  1. Мапа штучного інтелекту: що є що і як усе це пов’язано
  2. Коротка історія штучного інтелекту: від Тюрінга до мовних моделей
  3. Дані, модель, тренування, інференс: основні поняття на одному прикладі
  4. Як читати математичний запис: символи, індекси, суми та квантори
  5. Множини й відношення: конструктор, з якого складаються означення в ШІ
  6. Функції й відображення: чому кожна модель у ШІ — це функція
  7. Логіка й доведення: правила, за якими міркують у ШІ
  8. Графи й дерева: структура, на якій тримаються пошук і нейронні мережі
  9. Лінійна алгебра для машинного навчання: вектори, матриці й чому ШІ передусім множить
  10. Похідні, градієнт і правило ланцюжка: як модель дізнається, у якому напрямку вчитися
  11. Градієнтний спуск: як навчається модель
  12. Що таке ймовірність: від кидка кубика до аксіом Колмогорова
  13. Умовна ймовірність і теорема Баєса: як змінити оцінку, коли дізнаєтеся щось нове
  14. Випадкова величина і функція розподілу: одна функція, яка каже про розподіл усе
  15. Функція щільності та функція маси ймовірності: чому неперервна величина має в точці ймовірність нуль
  16. Математичне сподівання, дисперсія і коваріація: де лежить розподіл, наскільки він широкий і що з чим пов’язано
  17. Огляд розподілів ймовірностей: Бернуллі, біноміальний, Пуассона, рівномірний, нормальний і експоненційний
  18. Закон великих чисел і центральна гранична теорема: чому середні поводяться так передбачувано
  19. Статистика й оцінювання параметрів: максимальна правдоподібність, MAP і довірчі інтервали
  20. Теорія інформації: ентропія, перехресна ентропія і KL-дивергенція — звідки беруться функції втрат
  21. Пошук у просторі станів: BFS, DFS, UCS і A* з анімаціями
  22. Ігри та суперник: мінімакс, альфа-бета відсікання і Monte Carlo tree search
  23. Задоволення обмежень: бектрекінг, поширення обмежень і AC-3 на судоку та мапі чеських країв
  24. Логіка й системи, засновані на знаннях: пряме і зворотне виведення, резолюція та експертні системи
  25. Планування: STRIPS, світ кубиків, евристики з релаксації та планування в AI-агентах
  26. Локальний пошук та імітація відпалу: комівояжер через обласні центри Чехії
  27. Генетичні алгоритми: популяція, схрещування, мутація і добір на рюкзаку для походу
  28. Еволюційні стратегії і генетичне програмування: від правила однієї п’ятої до закону Кеплера
  29. Оптимізація мурашиною колонією: як феромоновий слід знаходить короткий шлях
  30. Оптимізація роєм частинок: інерція, власний досвід і досвід рою
  31. Нейроеволюція: еволюція ваг і форми нейронних мереж та алгоритм NEAT
  32. Нечіткі множини й функції належності: як записати «трохи тепло»
  33. Нечітка логіка та ймовірність: чому «трохи тепло» не означає «імовірно тепло»
  34. Нечітка логіка: t-норми, імплікації та правила ЯКЩО–ТО
  35. Нечітке керування: Мамдані та Суґено від вентилятора до маятника на візку
  36. Нечітка кластеризація: алгоритм fuzzy c-means і точки між кластерами
  37. Нейро-нечіткі системи (ANFIS): нечіткі правила, які навчаються з даних
  38. Марковські ланцюги: матриця переходів, стаціонарний розподіл і PageRank
  39. Приховані марковські моделі: алгоритм Вітербі й нечесне казино
  40. Байєсівські мережі: чому трава мокра і що з цього випливає для дощувача
  41. Фільтр Калмана: як за неточними вимірюваннями оцінити, де авто і як швидко воно їде
  42. Види машинного навчання: з учителем, без учителя, з частковим залученням учителя та інші
  43. Промпти, контекст і RAG: як дати моделі правильну інформацію
  44. Варіаційні автокодувальники (VAE): нові зображення з неперервного латентного простору
  45. Генеративні змагальні мережі (GAN): фальшувальник проти детектива
  46. Дифузійні моделі: як із чистого шуму постає зображення
  47. Марковські процеси ухвалення рішень: стани, дії, винагороди й рівняння Беллмана
  48. Q-навчання і DQN: як навчитися цінності дій — від таблиці до нейронної мережі
  49. Policy gradient і PPO: навчання безпосередньо політики
  50. Як працює ШІ-агент: мовна модель у циклі з інструментами
  51. Програмування з AI-агентами: завдання, тести й перевірка
  52. Оцінювання і безпека систем ШІ: як вимірювати і як стежити

Повна програма серії Готово: 52 з 83 тем

Що ви винесете
  • Як нечітку систему Суґено записати у вигляді мережі і які з її параметрів навчаються.
  • Чому гібридне навчання (найменші квадрати плюс градієнт) випереджає чистий градієнтний спуск.
  • Чому з додаванням правил зростає ризик перенавчання і що залишається від читабельності навчених правил.

Що варто знати заздалегідь: Нечітке керування: Мамдані та Суґено від вентилятора до маятника на візку, Градієнтний спуск: як навчається модель

Нечіткі регулятори з минулих частин мали одну слабину: правила й функції належності хтось мусив вигадати. Коли досвідчений оператор є, це перевага. Коли його немає — або коли система має відтворювати виміряні дані, — це проблема. Нейронні мережі мають протилежну вдачу: навчаться чого завгодно з даних, але того, чого вони навчилися, ніхто не прочитає. 1993 року Цзи-Шин Роджер Джанг поєднав обидва підходи в системі ANFIS (Adaptive Neuro-Fuzzy Inference System): нечітку систему Суґено, записану як мережа, параметри якої навчаються з даних. Цією частиною завершується модуль про нечітку логіку.

Продовжує частини Нечітке керування: Мамдані та Суґено і Градієнтний спуск.

1. Нечітка система як мережа

Візьмімо систему Суґено першого порядку з одним входом і чотирма правилами «ЯКЩО x є Ai, ТО y = pix + ri». Кожен крок її обчислення — це шар мережі:

x A1 w N f1 A2 w N f2 A3 w N f3 A4 w N f4 ∑ y 1. належність μ_A(x) c, σ 2. сила w_i — 3. нормалізація w_i / ∑ w — 4. висновок w̄ (p x + r) p, r 5. сума ∑ —
ANFIS з одним входом і чотирма правилами; помаранчевим — шари з параметрами, що навчаються
Означення — ANFIS (Джанг, 1993)
  1. Належність: μi(x) = exp(−(x − ci)2 / 2σi2) — гауссова функція з центром ci і шириною σi.
  2. Сила правила: wi = добуток належностей умови (з одним входом лише μi(x)).
  3. Нормалізація: w̄i = wi / ∑j wj.
  4. Висновок: w̄i · (pix + ri).
  5. Сума: y = ∑i w̄i (pix + ri).

Параметри передумов — це ci, σi; параметри висновків — pi, ri.

Простими словами

Це точнісінько регулятор Суґено з минулої частини, тільки намальований як мережа. Кожне правило має свою «зону дії» (гауссів пагорб) і в ній лінійне передбачення. Вихід — зважене середнє передбачень залежно від того, наскільки вхід лежить у зоні того чи іншого правила. Уся система диференційовна, тож її можна навчати так само, як нейронну мережу.

y = ∑i wi / ∑j wj · (pix + ri)

y
вихід усієї системи для входу x — те, що ми порівнюємо з даними і чим вимірюємо похибку
∑i
сума за всіма правилами — кожне робить свій внесок, жодне не «вибирається»; тому вихід гладкий і його можна диференціювати
wi / ∑j wj
нормалізована сила w̄i — ділення на суму гарантує, що ваги разом дають 1, тож вихід є зваженим середнім висновків і не залежить від того, наскільки високі пагорби
pix + ri
лінійний висновок правила — локальна пряма, яка описує функцію в зоні правила; пряма замість константи дає змогу з невеликою кількістю правил відстежувати й нахил
Вихід — це середнє локальних прямих, зважене тим, наскільки вхід належить до зони того чи іншого правила.

μi(x) = exp( − (x − ci)2 / 2σi2 )

μi(x)
ступінь належності з [0, 1] — наскільки x «близько ci»; експонента від’ємного числа завжди лежить між 0 і 1, а в центрі дорівнює рівно 1
(x − ci)2
квадрат відстані від центру — належність спадає в обидва боки однаково і гладка навіть у центрі (з модулем там був би гострий кут і похідна не існувала б)
2σi2
ширина пагорба — відстань вимірюється в одиницях σi, тож на відстані σi від центру належність завжди дорівнює e−1/2 ≈ 0,61; навчаючи σi, ми змінюємо, як далеко правило «дістає»
Приклад — прямий прохід у точці x = 3

Візьмімо систему після нульової епохи навчання (див. нижче): центри c = 0, 2, 4, 6, усі ширини σ = 1 і висновки з методу найменших квадратів. Для x = 3 відстані від центрів дорівнюють 3, 1, 1, 3, отже

  1. належність і сила: w = (e−4,5; e−0,5; e−0,5; e−4,5) = (0,0111; 0,6065; 0,6065; 0,0111);
  2. нормалізація: сума дорівнює 1,2353, тож w̄ = (0,0090; 0,4910; 0,4910; 0,0090);
  3. висновки: прямі pix + ri з навченими коефіцієнтами (9,54x + 0,01; 9,34x − 17,38; 8,56x − 36,61; 2,60x − 18,90) мають у точці 3 значення (28,63; 10,66; −10,94; −11,09) — коефіцієнти округлені, значення обчислені з точних;
  4. сума: y = 0,2574 + 5,2329 − 5,3698 − 0,0997 ≈ 0,021.

Справжнє значення — sin(3) = sin(32/3) ≈ 0,141. Зверніть увагу, що вихід утворюється відніманням двох великих, майже однакових внесків — до цього ми повернемося, коли говоритимемо про читабельність.

2. Гібридне навчання

Ми хочемо мінімізувати середньоквадратичну похибку на навчальних даних. Можна було б зробити все градієнтним спуском. Але Джанг помітив, що вихід є лінійним за параметрами висновків.

Означення — середньоквадратична похибка і RMSE

Для даних (x1, y1), …, (xN, yN) і виходу моделі ŷ(x) середньоквадратична похибка дорівнює E = (1/N) ∑k (ŷ(xk) − yk)2, а RMSE (root mean square error) — це її квадратний корінь √E. Мінімізувати одну чи другу — те саме; проте наводять RMSE, бо вона має одиниці виходу. Усі похибки в цій частині — RMSE.

RMSE = √( (1/N) ∑k (ŷ(xk) − yk)2 )

ŷ(xk)
передбачення системи в k-й точці — єдине місце, через яке в похибку входять параметри c, σ, p, r
− yk, потім у квадрат
відхилення від виміряного значення, піднесене до квадрата — знак не відіграє ролі, великі похибки важать більше за малі, а квадрат можна гладко диференціювати (і для висновків він дає точний розв’язок методом найменших квадратів)
(1/N) ∑k
середнє за точками — тоді похибки на 40 навчальних і на 121 тестовій точці можна порівнювати
Корінь наприкінці повертає похибку в одиниці y: RMSE 0,1 означає «зазвичай мимо на 0,1».
Алгоритм — гібридне навчання

За фіксованих передумов y(x) = ∑i (w̄ix) pi + w̄i ri — лінійна функція параметрів висновків. Тому в кожній епосі:

  1. вперед: обчисли w̄i для всіх даних і знайди параметри висновків точно методом найменших квадратів;
  2. назад: зі знайденими так висновками зроби крок градієнтного спуску для центрів ci і ширин σi.
Простими словами

Там, де задачу можна розв’язати точно, розв’язуйте її точно; градієнт залиште лише для того, що точно розв’язати не вдається. Лінійна регресія з частини про статистику знаходить найкращу пряму одним обчисленням — а тут вона знаходить одразу найкращі лінійні висновки всіх правил. Градієнт потім лише зсуває й розширює пагорби функцій належності.

Означення — найменші квадрати для висновків

За фіксованих ci, σi величини w̄i(xk) — просто числа. Упорядкуймо параметри висновків у вектор θ = (p1, r1, …, pn, rn) і для кожної точки складімо рядок

ak = (w̄1xk, w̄1, …, w̄nxk, w̄n), тож ŷ(xk) = ak · θ.

Рядки утворюють матрицю A (N × 2n), а похибка дорівнює ‖Aθ − y‖2/N. Її мінімум задовольняє нормальні рівняння ATA θ = ATy — систему з 2n лінійних рівнянь. Для 4 правил і 40 точок A — матриця 40 × 8, а система має 8 рівнянь. Наше обчислення додає до діагоналі ATA ще 10−6 (малий гребеневий член), щоб система була розв’язною навіть за майже залежних стовпців, і розв’язує її методом Гаусса.

Теорема — градієнт за центром і шириною

Позначмо gi = pix + ri і W = ∑j wj. З ŷ = ∑j wjgj / W похідна частки дає ∂ŷ/∂wi = (gi − ŷ)/W. Похідні гауссового пагорба: ∂wi/∂ci = wi(x − ci)/σi2 і ∂wi/∂σi = wi(x − ci)2/σi3. За ланцюговим правилом

∂E/∂ci = (2/N) ∑k (ŷ − yk) (gi − ŷ) w̄i (xk − ci)/σi2,

∂E/∂σi = (2/N) ∑k (ŷ − yk) (gi − ŷ) w̄i (xk − ci)2/σi3,

де ŷ, gi і w̄i беруться в точці xk.

∂E/∂ci = (2/N) ∑k (ŷ − yk) (gi − ŷ) w̄i (xk − ci)/σi2

∂E/∂ci
як зміниться похибка, якщо зсунути центр i-го пагорба — крок навчання йде проти цього знака
ŷ − yk
похибка в точці — там, де система влучає, точка нічого не хоче і в градієнт не робить внеску
gi − ŷ
наскільки висновок правила відрізняється від загального виходу — додати правилу ваги означає потягти вихід до його висновку; коли висновок каже те саме, що й ціле, зсувати пагорб немає сенсу
w̄i
частка правила у виході — точки далеко від пагорба, де правило майже мовчить, на його центр майже не впливають
(xk − ci)/σi2
напрямок зсуву — точка праворуч від центру тягне пагорб праворуч, ліворуч — ліворуч; у самому центрі пагорб плаский і зсув нічого не змінить
Для ширини формула така сама, лише останній член дорівнює (xk − ci)2/σi3: віддалені точки хочуть розширити або звузити пагорб, напрямок не має значення.

Усе навчання з прикладу нижче в псевдокоді (крок η = 0,1, 300 епох):

c = центри рівномірно на [0, 6]      # для 4 правил 0, 2, 4, 6
σ = половина відстані між центрами   # для 4 правил 1
for epocha in 0 … 300:
    # вперед: шари 1–3, потім висновки точно найменшими квадратами
    wn[k][i] = w̄_i(x_k)  для всіх точок k і правил i
    A = рядки (wn[k][1]·x_k, wn[k][1], …, wn[k][n]·x_k, wn[k][n])
    p, r = розв’яжи (AᵀA + 10⁻⁶·I)·θ = Aᵀy
    if epocha == 300: break
    # назад: крок градієнта за формулами вище
    gc, gσ = ∂E/∂c, ∂E/∂σ
    c = c − η·gc
    σ = max(0,05; σ − η·gσ)  # пагорб не сміє зникнути

3. ANFIS навчається функції

Задача: з 40 зашумлених зразків (шум зі стандартним відхиленням 0,1) навчитися функції y = sin(x2/3) на інтервалі [0, 6]. Праворуч функція коливається дедалі швидше, тож чотири рівномірно розміщені правила не ідеальні. Похибку вимірюємо також на 121 точці без шуму поза навчальними даними:

−101 01 0123456 епоха 0 · похибка на тесті 0,394 епоха 25 · похибка на тесті 0,367 епоха 100 · похибка на тесті 0,202 епоха 300 · похибка на тесті 0,173 вхід x (без одиниць) вихід y (без одиниць) належність μ (0–1)
Навчання ANFIS із чотирма правилами: угорі вихід, унизу функції належності

Уже в нульовій епосі — лише з найменшими квадратами для висновків і рівномірними пагорбами — похибка на тесті становить 0,394, а на навчальних даних 0,198. Потім починають навчатися передумови. Після 100 епох похибка на тесті 0,202, а після 300 епох 0,173. На навчальних даних вона падає до 0,107 — нижче за рівень шуму в даних (0,114), розумно краще не вийде. Центри пагорбів при цьому зсунулися лише трохи; головна зміна — у ширинах: останнє правило праворуч, де функція коливається найшвидше, звузилося з 1 до 0,64.

Означення — рівень шуму в даних

Навчальні точки — це yk = f(xk) + εk, де f(x) = sin(x2/3), а εk — незалежні випадкові відхилення з нормального розподілу зі стандартним відхиленням 0,1. Рівень шуму — це RMSE, яку на навчальних даних мала б сама справжня функція: √((1/40) ∑k εk2) = 0,114. Він трохи більший за 0,1 лише випадково — у наших 40 випадково вибраних відхиленнях.

Модель, яка має на навчальних даних похибку меншу за рівень шуму (0,107 < 0,114), уже починає копіювати й випадкові відхилення. За такої малої різниці це ще не шкодить — похибка на тесті далі спадає, — але це перше попередження, до якого ми повернемося, коли говоритимемо про кількість правил.

00,20,40,6 0100200300 епоха (кількість проходів даними) похибка на тесті (RMSE)
Похибка на тесті: гібридне навчання проти чистого градієнта гібридне лише градієнт пунктиром шум у даних

Чистий градієнтний спуск для всіх параметрів починає з нульових висновків і навчається значно повільніше: після 300 епох його похибка на тесті 0,387, і навіть після 3 000 епох (0,188) він не наздоганяє гібридне навчання після 300. Більший крок навчання до того ж швидко веде до розбіжності. Розділити задачу на лінійну й нелінійну частини варто.

4. Скільки правил?

Кількість правил2346812
Похибка на навчальних даних0,5100,1810,1070,0980,0890,085
Похибка на тесті0,5900,1770,1730,1720,5660,319

Із додаванням правил похибка на навчальних даних постійно спадає. Але на тесті вона від восьми правил різко зростає — система почала вчити шум: із 40 точками та 32 параметрами (8 правил × 4) вона має досить свободи, щоб між навчальними точками дико коливатися. Це перенавчання, те саме явище, що й у надто вигнутої поліноміальної регресії. Розумна кількість правил тут лежить між трьома й шістьма.

Приклад — скільки параметрів має ANFIS

З одним входом кожне правило має два параметри передумови (ci, σi) і два параметри висновку (pi, ri), разом 4n. На 40 навчальних точок:

  • 4 правила: 16 параметрів, із них 8 лінійних — на кожен лінійний параметр припадає 5 точок;
  • 8 правил: 32 параметри, із них 16 лінійних — 2,5 точки на лінійний параметр, і найменші квадрати мають досить свободи, щоб пройти навіть через шум;
  • 12 правил: 48 параметрів — більше, ніж точок. Найменші квадрати, щоправда, визначають «лише» 24 висновки із 40 рівнянь, але ще 24 параметри передумов можуть пересунути й звузити пагорби саме там, де шум якраз відхилився.

Корисне емпіричне правило: точок має бути принаймні в кілька разів більше, ніж параметрів, які з них оцінюються.

5. Що можна прочитати

Обіцянка нейро-нечітких систем полягає в тому, що навчена модель залишиться читабельною. Передумови читабельні: чотири правила «близько 0», «близько 2,2», «близько 4» і «близько 6,2». А от висновки — ні. Правило «ЯКЩО x близько 2,2, ТО y = 10,06 x − 13,83» у своєму центрі передбачало б 8,25, хоча справжнє значення — 1,0. Окремі правила взаємно врівноважуються — пагорби сильно перекриваються, і вихід має сенс лише як ціле.

Приклад — як правила врівноважуються в точці x = 2,195

Навчений центр другого правила — c2 = 2,195. Там друге правило має повну належність (w2 = 1), але сусіди — не нульову: w = (0,140; 1; 0,331; 0,000), сума 1,471, отже

Правило1234
вага w̄i0,0950,6800,2250,000
висновок gi12,648,25−25,64−31,68
внесок w̄igi1,2035,609−5,7690,000

Сума y = 1,203 + 5,609 − 5,769 = 1,043, справжнє значення sin(2,1952/3) = 0,999. Вихід добрий, але утворюється як різниця двох внесків близько ±5,7: друге правило «перестрілює» вгору, а третє тягне його вниз. Жодне з правил саме по собі не каже, чому дорівнює y.

Отже, інтерпретованість не дається задарма. Зберегти її допомагають обмеження: менше перекриття функцій належності, регуляризація висновків або Суґено нульового порядку з константними висновками. Платити за це доводиться точністю. Це той самий баланс, що й усюди в машинному навчанні, — між тим, що модель уміє, і тим, що ми вміємо про неї сказати.

6. ANFIS і нейронні мережі

  • Спорідненість із мережами RBF. Джанг і Сунь 1993 року показали, що мережі з радіальними базисними функціями та нечіткі системи Суґено нульового порядку за м’яких умов — одне й те саме, лише по-різному витлумачене.
  • Прокляття розмірності. З n входами і k термами на вхід сітка правил має kn правил — для 10 входів і 3 термів понад 59 тисяч. Тому ANFIS використовують для невеликої кількості входів або з правилами, вибраними кластеризацією (наприклад, fuzzy c-means з минулої частини).
  • Застосування. Прогнозування часових рядів (класичним тестом є хаотичний ряд Макі–Гласса), моделювання і керування системами, для яких ми маємо виміряні дані, але мало теорії.
  • Сьогодні. Глибокі мережі давно перебрали задачі з багатьма входами. Але ідея «навчуване, але читабельне» живе далі в пояснюваному ШІ — і нечіткі шари часом додають навіть до глибоких мереж там, де вихід треба пояснити правилами.
Означення — мережа з радіальними базисними функціями (RBF)

Нормалізована мережа RBF з n прихованими нейронами обчислює

y(x) = ∑i vi φ(‖x − ci‖) / ∑j φ(‖x − cj‖),

де φ — спадна функція відстані від центру ci (зазвичай гауссова), а vi — вихідні ваги. Система Суґено нульового порядку з гауссовими належностями і добутком як «і водночас» — це y = ∑i w̄i ri — після підстановки wi = φ(‖x − ci‖) і vi = ri точно та сама формула. Спрощено кажучи: правило = нейрон, функція належності = базисна функція, висновок = вихідна вага. (Джанг і Сунь, 1993, перелічують умови точно: однакова кількість правил і нейронів, константні висновки, гауссові належності з однаковою шириною в межах одного правила, добуток як «і водночас» та однаковий спосіб складання виходу — зважене середнє або зважена сума.)

Приклад — прокляття розмірності в числах

З n входами і k термами на кожен вхід повна сітка має kn правил. Висновок Суґено першого порядку y = p1x1 + … + pnxn + r має n + 1 параметрів, тож лінійних параметрів — kn(n + 1). Параметрів передумов лише 2kn — кожен вхід має свої k пагорбів, спільні для всіх правил.

Для n = 10 і k = 3: 310 = 59 049 правил, 59 049 · 11 = 649 539 параметрів висновків і 2 · 3 · 10 = 60 параметрів передумов. Найменші квадрати розв’язували б систему з 649 539 невідомими — а даних знадобилося б іще набагато більше.

7. Підсумок

  • ANFIS — це нечітка система Суґено, записана як п’ятишарова мережа: належність, сила, нормалізація, висновок, сума.
  • Гібридне навчання знаходить лінійні висновки точно найменшими квадратами, а центри й ширини функцій належності доналаштовує градієнтом.
  • На функції sin(x2/3) навчання передумов знизило похибку на тесті з 0,394 до 0,173; чистому градієнту знадобилося вдесятеро більше епох для гіршого результату.
  • Забагато правил веде до перенавчання — від восьми правил похибка на тесті різко зростає.
  • Передумови залишаються читабельними, а от висновки взаємно врівноважуються; за інтерпретованістю треба стежити.

Цією частиною завершується модуль про нечітку логіку: від слова «тепло» через логіку й регулятори аж до системи, яка сама навчається правил. Хочете спробувати це самі? Доручіть ШІ-агенту навчити ANFIS передбачати споживання електроенергії за температурою з відкритих даних — а потім подивіться, які правила мають сенс.

Маєте іншу думку? Напишіть на support@coden-app.com.

Агент на вашому комп’ютері, керований з телефона