Правила, яких ніхто не писав

Звичайна програма виконує правила, які придумав ти. Модель робить навпаки: дивиться на готові відповіді й виводить правила сама. Уся решта курсу — про наслідки цього обміну.

За курс Python ти навчився складати програми з правил, які придумуєш сам: якщо ціна менша за поріг — зроби одне, інакше інше. Це працює доти, доки правила знаєш ти. А тепер задача, де їх не знає ніхто.

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

ПостановкаЗвідки беруться правила

Спершу розвʼяжімо задачу так, як ти робив це весь курс Python. Сідаєш, дивишся на кілька десятків шахрайських оголошень, помічаєш спільне — і пишеш умови:

якщо ціна < 60 % ринкової → позначити
якщо акаунту менше 7 днів → позначити

Це звичайна програма. У неї на вході дані про оголошення й написані тобою правила, на виході — відповідь для кожного оголошення. Стрілка йде зліва направо, і найдорожчий елемент тут — твоя голова: правила беруться з неї.

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

Куди дивиться стрілка

Один і той самий набір понять, переставлений місцями. Уся різниця — тут.

Головне: у звичайній програмі правила — це вхід, і пишеш їх ти. У машинному навчанні правила — це результат, і знаходить їх машина. Щойно правило знайдене, модель працює як звичайна програма: дані на вході, відповідь на виході.

Тут одразу варто прибрати найпоширеніше непорозуміння. Модель нічого не «розуміє». Вона не знає, що таке телефон, гроші чи обман. Усе, що вона робить, — знаходить закономірність у прикладах: комбінації чисел, які в навчальних даних частіше траплялися поруч із міткою «шахрайське». Якщо ця закономірність випадкова — модель вивчить випадковість із тим самим старанням.

«Правило», яке знаходить модель, теж не схоже на рядок коду. Найчастіше це просто набір чисел — ваг, які показують, наскільки кожна ознака зсуває відповідь. Формула однакова для всіх оголошень, змінюються лише числа в ній. Саме тому модель можна зберегти у файл і переслати: вона вміщується в кілька кілобайтів.

Ось як виглядають наші дані. Це звичайна таблиця — той самий DataFrame, з яким ти працював у темі pandas:

колонкащо цеприклад
модельназва моделі телефонаGalaxy A54
рікрік випуску2021
станоцінка стану продавцемдобрий
памʼятьобсяг памʼяті, ГБ128
цінаціна в оголошенні, грн7 400
чи шахрайськепозначка модераторані

Перші пʼять колонок — це те, що ми знаємо про оголошення. Остання — те, що хочемо передбачати. Різниця між ними принципова, і наступна тема курсу («Дані: ознаки, таргет, типи задач») присвячена саме їй.

ПорівнянняТі самі дані, два підходи

Розмову про переваги легко звести до гасел, тому краще порахувати. Візьмімо 260 оголошень, з яких 128 насправді шахрайські, і всього дві ознаки: наскільки ціна нижча за ринкову й скільки днів акаунту продавця. Обидві реально доступні модератору, обидві щось значать: шахрай зазвичай ставить привабливо низьку ціну й робить свіжий акаунт.

Спершу спробуй ловити шахраїв правилами. Вмикай і вимикай їх у будь-якому поєднанні й дивись на два числа: скільки шахраїв спіймано і скільки чесних продавців потрапило під підозру помилково. Потім перемкнись у режим «вчимо на прикладах» — там ті самі дані, але жодного написаного руками правила.

Правила проти прикладів

Кожна точка — оголошення. Рожеві справді шахрайські, світлі — чесні. Бурштиновий обідок означає «фільтр позначив».

спіймано—
хибних тривог—
пропущено—
позначено—
Що читати: правило руками — це завжди прямий кут: вертикальна або горизонтальна відсічка. Модель не зобовʼязана різати вздовж осей, тому її межа виходить косою. Це не «розум» — це просто ширший набір можливих форм межі.

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

Друге спостереження важливіше. Модель не придумала нової ознаки й не дізналася про шахраїв нічого, чого не було в даних. Вона просто підібрала межу під форму хмари точок, а не під форму нашої уяви. Людина мислить відсічками «дешевше за X» — і межа виходить сходинками. Модель шукає компроміс одразу по обох ознаках — і межа виходить похилою. Уся перевага саме в цьому, і вона зникає, щойно даних мало або мітки в них неправильні.

Останнє варто пояснити, бо звучить як застереження заради застереження. Модель підганяє межу під ті точки, які їй показали. Коли точок 260, кожна окрема майже не зсуває межу: вона тримається на масі. Коли точок десять, кожна тягне межу на себе, і достатньо однієї дивної, щоб межа поїхала. А коли мітки неправильні — скажімо, модератор помилково позначив чесних продавців як шахраїв — модель відтворить і цю помилку, бо іншого джерела правди в неї немає. Правило руками в обох випадках поводиться інакше: воно написане з голови, тож від кількості прикладів і від помилок у мітках не залежить узагалі. Саме тому на малих і брудних даних правила часто виграють, і це не поразка ML, а межа його застосовності.

МеханізмЯк машина шукає правило

Ми двічі сказали «модель знаходить правило» — і жодного разу не сказали, як саме. Питання законне, бо звучить це як магія. Магії немає: усередині сидить арифметика, яку можна порахувати на аркуші, і зараз ми це зробимо.

Почнімо з того, чим є «правило» технічно. Це формула з невідомими числами. Наприклад, для оцінки підозрілості оголошення:

оцінка = w1 × (наскільки ціна нижча за ринкову)
+ w2 × (наскільки свіжий акаунт) + w0

Форму формули задає людина, обираючи модель. А от числа w0, w1, w2 — невідомі. Їх називають вагами (weights): кожна вага показує, наскільки сильно й у який бік відповідна ознака тягне відповідь. Знайти правило означає рівно одне — підібрати ці числа. Більше в навчанні нічого немає.

Порахуймо руками

Щоб побачити підбір без жодного програмування, візьмімо задачу, меншу нікуди: три телефони, одна ознака, одна вага. Ознака — обсяг памʼяті, відповідь — ціна.

памʼять, ГБсправжня ціна, грн
642 400
1284 800
2569 600

Правило шукаємо у вигляді ціна = w × памʼять. Одне невідоме число. Машина не знає, з чого почати, тому починає з чого завгодно — скажімо, з w = 10. Далі вона робить те саме, що зробили б ми: рахує, наскільки промахнулась.

Спосіб міряти промах теж треба обрати, і найпростіший — середня абсолютна помилка: узяти різницю між відповіддю моделі й правильною, викинути знак (бо промах на 500 грн угору й на 500 грн униз однаково поганий), і усереднити по всіх трьох рядках. Це число називають помилкою моделі, або функцією втрат (loss): одне число, яким описано, наскільки погано модель відтворює всі приклади разом.

вага wщо каже модельпромахисередня помилка
10640 · 1 280 · 2 560−1 760 · −3 520 · −7 0404 107
301 920 · 3 840 · 7 680−480 · −960 · −1 9201 120
402 560 · 5 120 · 10 240+160 · +320 · +640373
37.52 400 · 4 800 · 9 6000 · 0 · 00

Перший рядок читається так: при w = 10 модель каже 10 × 64 = 640 грн замість 2 400, тобто занижує на 1 760. Те саме для двох інших телефонів; середнє з 1 760, 3 520 і 7 040 дорівнює 4 107. Головне тут — знак промахів: усі три відʼємні, модель занижує скрізь, отже вагу треба збільшувати. При w = 40 знаки перевернулись на плюс — проскочили, треба трохи назад. Так, крок за кроком звужуючи, доходимо до w = 37.5, де помилка нульова.

Оце й усе навчання. Три дії по колу: спрогнозувати для всіх прикладів, поміряти сумарну помилку, підправити ваги в бік її зменшення. Модель із двома вагами крутить два числа замість одного, модель із мільйоном ваг — мільйон, але цикл той самий.

Цикл підбору ваг

Ті самі чотири спроби з таблиці вище, розкладені по колу навчання.

Навчання — це цикл, а не осяяння: модель щоразу лише дізнається, у який бік вона промахнулась, і робить крок туди. Помилка падає з 4 107 до нуля не тому, що машина щось зрозуміла, а тому, що коло прокрутили чотири рази.
Чому на справжніх даних нуля не буває. Наші три телефони лягли на одну пряму рівно, бо числа підібрано. У житті два однакові телефони продають за різну ціну — хтось поспішає, хтось торгується. Тоді жодна вага не дає нульової помилки, і цикл зупиняється там, де помилка найменша з можливих, а не там, де вона зникла. Залишок і є тим шумом, який модель прибрати не може.

Два наслідки з цього механізму варто помітити одразу, бо вони пояснять половину дивних поведінок далі в курсі. Перший: модель мінімізує помилку на тих прикладах, які їй дали — і більше нічого не оптимізує. Якщо приклади криві, вона старанно відтворить кривизну. Другий: форму формули обираємо ми. Пряма ціна = w × памʼять ніколи не вигнеться дугою, хоч скільки крути w. Коли форма не підходить під дані, підбір ваг цього не виправить — треба міняти модель.

МежаКоли ML доречний, а коли ні

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

Тому чесна межа виглядає так:

ситуаціяознакачим розвʼязувати
правил малоїх можна перелічити на аркушізвичайний код
правило записанезакон, договір, тарифзвичайний код
потрібна гарантіяпомилка коштує надто дорогозвичайний код або людина
правил забагатосотні винятків, що перетинаютьсямодель
правила плаваютьшахраї щомісяця змінюють тактикумодель
правило не формулюється«чи гарне фото» ніхто не опише умовамимодель
немає розмічених данихніхто не проставив відповідіспершу дані, потім модель

Розберімо два рядки, у яких найчастіше помиляються. «Правил забагато» — це не про складність окремого правила, а про їхню кількість і взаємодію. Одну умову «ціна нижча за 60 %» ти напишеш і супроводжуватимеш роками. Але коли до неї додаються двісті винятків на кшталт «крім телефонів старших за пʼять років у місті N у грудні», жодна людина вже не втримає систему в голові. Модель тримає таку кількість поєднань без зусиль — саме тому, що не тримає їх у голові, а просто рахує.

«Правила плавають» — про час. Фільтр із чотирьох умов зловить шахраїв цього місяця. Наступного вони поставлять ціну на рівні 90 % ринкової й почекають три тижні перед публікацією — і фільтр осліпне. Модель тут виграє не розумом, а швидкістю оновлення: щоб перевчити її на нових даних, потрібні години, а не нарада.

Насправді їх не протиставляють. У робочих системах правила й модель стоять поруч. Правила відсікають очевидне й гарантують те, що мусить бути гарантовано («оголошення дорожче мільйона не показуємо ніколи»), а модель ранжує сіру зону, де однозначної відповіді немає. Питання не «що краще», а «що на якій ділянці».

На дошці оголошень це виглядає як три шари, які працюють послідовно. Перший шар — жорсткі правила: оголошення без фото не публікуємо, ціну нижчу за 100 грн не приймаємо, продавця з відомого чорного списку блокуємо. Тут потрібна гарантія, а не ймовірність, тому моделі нема чого робити. Другий шар — модель: усе, що пройшло перший, вона впорядковує за підозрілістю — від найпідозрілішого до найспокійнішого. Третій шар — людина: модератор дивиться перші кількасот оголошень із цього списку, бо переглянути всі десять тисяч він фізично не встигне.

Зверни увагу, що модель тут не ухвалює рішень. Вона лише розставляє чергу, а рішення «блокувати чи ні» лишається за правилом або за людиною. Так побудована більшість реальних систем, і це знімає половину страхів про «модель помилилась і заблокувала чесного продавця»: у такій схемі вона нікого не блокує.

ТипиТри способи вчитися

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

Три типи навчання на одній дошці оголошень

Різниця не в моделі й не в алгоритмі, а в тому, що саме лежить у даних.

Як розрізнити за пʼять секунд: є готові правильні відповіді — з учителем. Відповідей немає взагалі — без учителя. Відповіді немає, але за дію приходить нагорода — з підкріпленням.

Навчання з учителем (supervised learning) — той самий випадок, що й у попередньому розділі. У даних є пари «оголошення → правильна відповідь», і модель вчиться відтворювати цей звʼязок, щоб застосувати його до нових оголошень. «Учитель» тут — не людина поруч із компʼютером, а сама наявність відповідей у таблиці. Хтось їх колись проставив: модератор натиснув кнопку, продавець закрив угоду за конкретну суму.

Навчання без учителя (unsupervised learning) — коли відповідей немає й брати їх нема звідки. Модель отримує самі ознаки й шукає структуру: які оголошення схожі між собою, скільки типових груп узагалі є на дошці, які з них не схожі ні на що. Перевірити такий результат складніше — правильної відповіді, з якою можна звіритись, просто не існує.

Навчання з підкріпленням (reinforcement learning) — коли моделі ніхто не каже правильну відповідь, але за кожну дію вона отримує нагороду. Наш бот обирає, яке оголошення показати покупцеві першим. Правильної відповіді немає: ніхто не знає, що саме треба було показати. Але є сигнал — покупець написав продавцеві або пішов геть. Максимізуючи суму таких сигналів за багато показів, бот поступово вчиться вибирати краще. Про це є окрема тема наприкінці курсу.

Тип навчання тягне за собою тип задачі, а тип задачі — набір придатних моделей. Чотири назви, які тобі знадобляться вже за хвилину, і кожна означає рівно те, на що схожа відповідь:

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

Карта типів задач

Датасет один і той самий — оголошення про телефони. Змінюється лише те, що вважати відповіддю.

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

ТерміниDS, ML, DL, AI: хто кого містить

Ці чотири скорочення новачок плутає постійно — і це не його провина. У літературі вони справді перекриваються: різні автори проводять межі по-різному, а вакансії з однаковою назвою описують різну роботу. Найкорисніше не шукати єдино правильне визначення, а запамʼятати робочу схему й знати, де вона умовна.

Вкладеність понять і типовий порядок роботи

Угорі — хто в кому міститься. Унизу — у якому порядку це роблять на практиці.

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

DS, наука про дані (data science) — найширше з чотирьох. Це весь комплекс роботи з даними: зібрати, почистити, подивитись, побудувати модель, зробити висновок, показати його людині, яка ухвалює рішення. Математика й статистика тут — інструмент, а не окремий вид спорту.

AI, штучний інтелект (artificial intelligence) — про системи, які розвʼязують задачі, що традиційно вважалися людськими: бачити, розуміти мову, планувати, грати. Історично сюди входять і підходи, які нічого не вчать на даних, — наприклад, шаховий перебір або система правил лікарської діагностики.

ML, машинне навчання (machine learning) — підмножина, у якій модель будується з даних, а не програмується вручну. Саме цим і займається весь наш курс. Той факт, що деякі автори вважають ML ширшим за AI, а не вужчим, — теж чесна частина картини: межа проходить не там, де хочеться, а по-різному в різних школах.

DL, глибоке навчання (deep learning) — частина ML, де моделлю є нейронна мережа з багатьма шарами. Це не окремий вид магії, а конкретне сімейство моделей, яке вчиться тим самим циклом, що й лінійна регресія. У курсі є окрема тема, і виявиться, що нового там менше, ніж здається.

Практичне правило. Коли в тексті вакансії чи статті бачиш «AI», підстав подумки «модель, навчена на даних» — у девʼяти випадках із десяти йдеться саме про ML, а слово AI стоїть там, бо гучніше звучить. Якщо після підстановки речення втрачає сенс — тоді автор і справді має на увазі щось інше, і варто читати уважніше.

МежіЧого модель не вміє

Це найважливіший розділ теми. Усе попереднє можна вивчити за годину; те, що нижче, відрізняє людину, яка навчила модель, від людини, якій можна довірити рішення.

Модель бачила лише те, що було в даних

Модель — це закономірність, знайдена в конкретному діапазоні прикладів. Поза цим діапазоном вона не мовчить і не каже «не знаю». Формула визначена скрізь, тож модель підставить будь-які числа й видасть результат — з тією самою впевненістю, що й завжди.

Нижче — крихітна модель ціни телефона, навчена на оголошеннях 2018–2023 років з памʼяттю 64, 128 і 256 ГБ. Виведи запит за межі цього діапазону й подивись, що вона відповідає — і що при цьому показує метрика її якості.

Що таке метрика і що таке R². Метрика — це одне число, яким описують якість моделі, щоб дві моделі можна було порівняти, не роздивляючись кожен прогноз. Для чисел найзрозуміліша метрика — R2 (читається «ер квадрат»), і вона порівнює нашу модель із найдурнішою можливою: з такою, що на будь-яке питання називає середню ціну навчальних оголошень. R2 = 1 означає, що модель влучає точно; R2 = 0 — що вона рівно така сама корисна, як це середнє; відʼємне значення — що вона гірша за середнє. У нашої моделі на навчальних даних R2 = 0.955: майже вся різниця в цінах між телефонами пояснена роком і памʼяттю. Звучить чудово — і саме тому наступний абзац важливий. Докладно метрики регресії розбирає тема Метрики регресії.

Межа моделі

Бірюзова смуга — діапазон, у якому модель бачила приклади. Пряма продовжується й за неї.

прогноз, грн—
схожих у даних—
R² на навчанні—
дані охоплюють—
Головне тут — праве верхнє число поруч із лівим. «Схожих у даних» падає до нуля, а «R² на навчанні» не змінюється взагалі: метрика якості міряє, як модель відтворила минулі приклади, і про новий запит не знає нічого. Попередити мусить не модель, а ти.

Звідси практичний висновок: перед тим як вірити прогнозу, перевір, чи схожий обʼєкт узагалі був у навчальних даних. Модель ніколи не зробить цього за тебе — у неї немає поняття «я такого не бачила».

Кореляція — не причина

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

Тло, ціна і той, хто за ними обома стоїть

Дві стрілки, які модель бачить, і третя — якої вона не бачить.

Звʼязок є, стрілки немає: тип продавця тягне вгору і біле тло, і ціну одночасно. У таблиці це видно як звʼязок «тло — ціна», хоч перефарбувати тло в приватного продавця означає лише перефарбувати тло. Коли дві ознаки повʼязані через третю, непомічену, цю третю називають прихованою причиною.

Модель знаходить сумісну зустрічальність: що з чим траплялося поруч. Питання «що станеться, якщо втрутитись і змінити ознаку» — інше питання, і відповідає на нього експеримент, а не навчальна вибірка. Це не дрібниця: більшість дорогих провалів у прикладному ML — саме тут.

Упереджені дані дають упереджену модель

Уяви, що торік модератори з якихось причин ретельніше перевіряли оголошення з одного міста. Шахраїв там знайшли більше — не тому, що їх було більше, а тому, що більше шукали. Модель, навчена на цих мітках, чесно вивчить: «місто N — підозріло». Далі вона починає позначати звідти більше оголошень, модератори перевіряють їх ще ретельніше, знаходять ще більше — і наступна версія моделі впевнена вже сильніше.

Петля, яка сама себе годує

Чотири кроки по колу. Жоден із них окремо не є помилкою.

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

Ключове тут: модель не помилилась. Вона точно відтворила закономірність, яка справді була в даних. Помилка в тому, що ця закономірність описувала роботу модераторів, а не поведінку продавців. Дані ніколи не бувають нейтральним знімком світу — вони завжди знімок того, як їх збирали. Тема Справедливість моделей наприкінці курсу саме про це.

Немає закономірності — не буде моделі

І найпростіше обмеження, яке чомусь згадують останнім. Якщо звʼязку між ознаками й відповіддю не існує, жодна модель його не знайде. Спробуй передбачити, о котрій годині покупець напише продавцеві, маючи лише марку телефона й ціну, — отримаєш модель, чия якість на нових даних не відрізняється від випадкового вгадування.

Прикро тут те, що на навчальних даних така модель усе одно покаже якийсь результат: досить складна модель завжди знайде спосіб запамʼятати окремі рядки замість того, щоб знайти закономірність — а закономірності й немає. Це явище зветься перенавчанням (overfitting), і зустрічатиметься воно в курсі постійно. Саме тому якість вимірюють лише на прикладах, яких модель не бачила, — і цьому присвячена тема Train / Validation / Test.

Одним реченням. Модель не знає нічого поза даними, не відрізняє звʼязок від причини, успадковує всі перекоси збору й не вміє відповісти «тут закономірності немає». Усі чотири речі мусить перевіряти людина — і саме за це, а не за виклик fit, платять інженерові.

ДаліЩо з цим робити

Підсумуймо коротко. Звичайна програма — це дані плюс правила на вході й відповіді на виході. Машинне навчання міняє місцями відповіді й правила: ми даємо приклади з готовими відповідями, а отримуємо правило. Правило це не розумне й нічого не розуміє — воно лише відтворює закономірність, яка була в прикладах, і рівно настільки добре, наскільки ці приклади описують реальність.

Далі курс іде по цьому ланцюжку. Наступна тема — «Дані: ознаки, таргет, типи задач» — розбирає найперший практичний крок: як з таблиці оголошень зробити те, що модель узагалі здатна прийняти. Що вважати ознакою, що таргетом, куди подіти текст і категорії, чому рік випуску й ціна в тисячах гривень погано живуть в одній формулі. Далі — як чесно міряти якість, перша модель для чисел і перша модель для міток.

Один наскрізний приклад — дошка оголошень про вживані телефони — пройде з тобою кілька перших тем. Це зроблено навмисно: коли датасет не змінюється, добре видно, що змінюється насправді.