ТИ МАШИНА І Я МАШИНА
Алгоритми Facebook, безпілотні автомобілі, спам-фільтри пошти – машинне навчання це вже давно не наукова фантастика. Усі про це говорять та мало хто розуміє, як це працює. Що це таке, з чим його їдять і для чого використовують, ми розповімо у міні-курсі лекцій спільно з Abto Software. Тож, якщо ви мріяли пов'язати своє життя зі штучним інтелектом, але не наважувалися розпочати, цей матеріал для вас.
Написав: Рінат Тухватшин
Картки намалювала: Дарія Манцола
За підтримки
Частина 1
Уявіть, що ви – програміст, який працює в лікарні, і керівництво дає вам завдання написати програму, котра виявлятиме рак шкіри. Наприклад, щоб пацієнт міг сфотографувати нову родимку або іншу плямку на телефон, і додаток визначив би, чи бігти до лікаря. Проблема в тому, що ви нічого не тямите в онкології. Лікарі з клініки перерахували вам типові тривожні ознаки, але це не допомогло. Як це закодувати:
При цьому необхідно брати до уваги ще десятки інших характеристик десятків інших різновидів доброякісних і злоякісних пухлин. І щоб додатково ускладнити ситуацію, керівництво вам натякає: їм не подобається точність діагностики навіть досвідчених лікарів (20% помилок при простому огляді), і вони очікують, що ваша програма працюватиме значно краще. Єдина позитивна сторона у вашій ситуації – те, що в архівах зберігається кілька тисяч фото як здорової, так і хворої шкіри.
Та як написати і потім перетворити на код алгоритм визначення діагнозу, який працюватиме не з анкетою чи бланком, а безпосередньо із зображенням? Звичайним способом (мільйон if … else) – ніяк. Але це і непотрібно. Глибинна штучна нейронна мережа (далі – нейромережа) навчиться відрізняти хвору шкіру від здорової, користуючись наявними архівними даними.
Що ж залишається робити людині-розробнику? Попивати мартіні під пальмою? Не все так просто. Нейромережі допомагають вирішити проблеми, що видаються невирішуваними, але не зменшують кількості роботи для програміста. Просто замість розробки алгоритму вирішення проблеми вам доведеться (кілька разів):
Інтелектуальні системи без здатності до навчання ухвалюють рішення на основі даних, які до них надходять, і правил, написаних людиною-програмістом. Наприклад, калькулятор може додати 2 до 2, тому що хтось запрограмував для нього правила додавання. Для цього комп'ютеру не довелося вивчати тисячі прикладів додавання, програміст просто знав, як воно працює, і переклав мовою, зрозумілою комп'ютеру. Це прекрасно працює, коли сам програміст знає правила, які хоче запрограмувати.
На жаль, в реальному житті це не завжди так. Як у прикладі з раком шкіри, програміст не завжди знає, за якими саме правилами повинна працювати програма. І тут нам на допомогу приходять системи з машинним навчанням на основі прикладів. Головна їх властивість – це здатність знаходити правила, використовуючи наявні приклади.
1. Попередній аналіз даних
Цей крок чи не найважливіший у циклі створення нейромережі. Якщо нейромережа не видає очікуваних результатів, до нього доводиться повертатися знову і знову. На цьому етапі слід переконатися, що даних достатньо і вони не тенденційні. Наприклад, необхідно переконатися, що наявні дані адекватно відображають різні етнічні групи і гендери. Це досить складне завдання. Часто це неможливо зробити, не розпочавши створення нейромережі.


Нерідко на цьому етапі все і завершується. Гірше, якщо це відбувається на десятій ітерації вашої нейромережі. Ще гірше – якщо після запуску продукту. У такий спосіб Amazon одного разу створив нейромережу для відсіву претендентів на роботу, яка страждала від сексизму (насправді страждали, звісно, жінки, а не нейромережа).


Схожих прикладів безліч. У 2015 році Google потрапив у скандал через додаток Google Photos, який одночасно надає хмарне сховище для фотографій і групує зображення, щоб їх було легше знайти. Для цього Google Photos використовує технології машинного навчання та комп'ютерного зору, й інколи вони роблять прикрі помилки. На один з таких випадків натрапив програміст із Брукліна Джекі Алціне: Google Photos класифікував фотографію його чорношкірих друзів як світлину з горилами – він зробив знімок екрана і опублікував його у Twitter.


2. Підготовка даних для введення
Зі всіх кроків цей, мабуть, найпростіший. Крім того, саме він показує перевагу глибинних нейромереж порівняно з більш традиційним машинним навчанням (SVM і таким іншим).




У глибинній нейромережі ви вводите інформацію в мережу такою, як вона є, без складних трансформацій і виділення ознак.
Зображення на комп'ютері розбиваються на точки, пікселі. Яскравість кожного пікселя кодується числом від 0 (найтемніші) до 255 (найяскравіші). Таким чином, будь-яке чорно-біле зображення можна уявити у вигляді двовимірного масиву з чисел від 0 до 255

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

Натомість для глибинних нейромереж ви майже напряму вводите значення пікселів у мережу (нормалізувавши їх значення в діапазоні від 0 до 1). Ось і все. Перші шари нейромережі навчаться знаходити релевантні ознаки (типові просторові комбінації пікселів), а наступні вирішать, які комбінації ознак визначають унікальне обличчя. Тому ми й називаємо ці нейромережі глибинними. Різні їхні шари вирішують різні завдання. Зокрема і виділення релевантних ознак.

Це найважливіше для завдань, де цілком незрозуміло, які ознаки використовувати, або коли ми не хочемо витрачати власний час на виділення цих ознак. Наприклад, вам необхідно створити нейромережу, яка буде знаходити на картинці дев'ять тисяч класів різних об'єктів. З яких ознак тут розпочати?

3. Архітектура нейромережі
Нейромережі схожі на цибулину – вони також складаються з шарів (і теж іноді змушують вас плакати). Так само кожен шар складається з «нейронів». Найцікавіше, що самі нейрони є всього-на-всього десятковими дробами (тип float). Себто, шар нейромережі – це масив десяткових дробів (одновимірний у простих випадках і багатовимірний у трохи складніших).


Перший шар нейромережі називається вхідним. Як було сказано вище, фактично це і є ваші дані. Якщо чорно-біле зображення родимки (яка може виявитися раком шкіри) складається з десяти тисяч пікселів, то й нейронів у першому шарі буде десять тисяч (звісно, всі архівні фото слід буде звести до єдиного розміру).


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


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


Якщо ви намагаєтеся передбачити неперервне значення, а не визначити клас (наприклад, спрогнозувати температуру повітря або курс акцій), то у вихідному шарі нейромережі буде лише один нейрон. Його значення і буде передбаченням нейромережі.


Всі шари пов'язані між собою вагами. Це також лише десяткові дроби. Припустімо, у вас у вхідному шарі два нейрони, а в наступному (першому прихованому) – три нейрони. Кожен нейрон у першому шарі зв'язаний із кожним нейроном у другому. Це означає, що між цими двома шарами у вас буде шість ваг.


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


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




Сьогодні для більшості нейромереж у прихованих шарах як функцію активації використовують ReLU (англ. rectified linear unit – випрямляч). У вихідному шарі використовуються інші функції активації, які залежать від того, з чим ми маємо справу – з регресією чи з класифікацією. Повторюємо цю операцію для кожного нейрона пошарово аж до вихідних нейронів.




Процес такого пошарового обчислення від вхідного шару до вихідного називається прямим поширенням (forward propagation). Виходить, що при прямому поширенні на основі відомих значень нейронів вхідного шару і відомих ваг ми обчислюємо значення всіх інших нейронів у мережі. Звідки ж ми дізнаємося значення ваг?



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



Як досягти такої зміни ваг? Поступово. Ми мінятимемо їх потрохи для кожного наявного еталонного прикладу за допомогою процесу, який називається зворотним поширенням (backward propagation).


Що відбувається з передбаченням нейромережі після одного циклу прямого поширення? Ми беремо його й порівнюємо з відомим результатом. Нейромережа робить це за допомогою функції втрат. Наприклад, нейромережа передбачає, що температура буде +18 градусів, але ми достеменно знаємо, що в день, на який ми робимо передбачення, температура була +25. Тобто різниця становить 7 градусів (знову ж таки, значення відповідей теж зазвичай нормалізовані, і використовується не проста різниця, а середня квадратична похибка для регресії і трохи складніша функція для класифікації).


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


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


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


То як ми можемо змінити ваги, щоб зменшити похибку? Якщо коротко, то нейромережу під час процесу зворотного поширення (backward propagation) можна уявити у вигляді функції, в якій масштаб похибки залежить від кожної з ваг. Себто кожна вага – це змінна. Не варто навіть намагатися уявити графік такої функції, бо вона існує в просторі з кількістю вимірів, що відповідає кількості параметрів нейромережі (як правило, від десятків тисяч до десятків мільйонів). Розв'язати таке рівняння, поставивши на місце похибки нуль, на практиці неможливо.

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




Що це означає? Уявіть собі графік звичайної квадратної функції, параболу – адже що працює в двох вимірах, працює і в трьох, і в чотирьох, і в ста, і загалом в n вимірів. Проведімо до неї дотичну через будь-яку точку. По значенню кута дотичної (яке можна обчислити за допомогою похідної), ми можемо визначити, що відбувається з у при збільшенні х. Подивіться на дотичну зліва: поблизу точки, через яку вона проходить, у зменшується при збільшенні х. Справа все цілком навпаки: у збільшується при збільшенні х.

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






y=x2
y=4 при x=2 ; y=4 при x= -2
Якщо збільшити в кожному випадку x на 0,1
y=4,41 при x=2,1; y= 3,61 при x= -1.9
Тобто, щоб зменшити y ліворуч, ми маємо x збільшувати, а праворуч зменшувати.

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




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




Погана нейромережа може бути поганою по-різному. На початку навчання нейромережа цілком неадекватно оцінює навіть тренувальні дані. Цей стан називається недостатня навченість (underfitting), і його можна порівняти зі станом студента, який тільки-но почав навчатися. Як і студент, нейромережа може навчатися по-різному: намагатися просто визубрити вміст підручника або по-справжньому спробувати розібратися в навчальному матеріалі. Нейромережа, яка ідеально передбачає тренувальні дані, але не може впоратися з тестовими, схожа на «зубрилку»: текст підручника знає ідеально, а на абстрактні запитання відповісти не може. Такий стан мережі називається надмірна навченість (overfitting), або «перенавченість».




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

Про навчання нейромережі йтиметься детальніше в наступних частинах.




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






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





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





Якщо я мешкаю в проблемному районі, де мешкають люди тієї ж національності, що і я, і я спілкуюся по телефону здебільшого з ними – чи обмежить це мої можливості отримати кредит, щоб переїхати? Так, можливо банківські клерки також не дали б мені кредиту, якби дізналися, де я мешкаю. Але ті ж клерки і надали дані для навчання нейромережі.




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




І, мабуть, перевіркою нейромережі в реальному світі слід було би займатися людям, які не брали участі в її розробці. Тож в ідеалі ваші функції як розробника нейромережі мали б завершитися на цьому етапі. На жаль, на практиці так буває рідко.




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




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




Інтелектуальні системи можна розділити на такі, які навчаються і такі, які не навчаються. Інтелектуальні системи, що навчаються, становлять галузь машинного навчання. Машинне навчання ділиться на supervised (навчання з учителем) і unsupervised (навчання без учителя). Методи без учителя (unsupervised) навчаються самостійно на нерозмічених даних. Методи з учителем (supervised) навчаються на розмічених даних, на основі цього виробляють певний внутрішній алгоритм і потім за його допомогою вже обробляють невідомі дані.




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




Втома є основним фактором, що спричиняє ДТП. Інженери R&D компанії Abto Software розробили спеціальний алгоритм комп'ютерного зору, який оцінює сонливість водія.
У наступних частинах із серії «Вступ до машинного навчання» ми розкажемо про типи задач машинного навчання, види машинного навчання, основні алгоритми та сучасні застосування. Тож слідкуйте за оновленнями на сайті Куншт!
Abto Software – українська ІТ компанія, що з 2007 року створює унікальні програмні рішення для лідерів у галузі інтернету, електронного урядування, енергетики, медицини, будівництва та безпеки. Візія компанії – стати партнером NASA та розвивати українських комп'ютерних інженерів. З 2015 року у Abto Software функціонує R&D відділ, який спеціалізується на Artificial Intelligence, Machine Learning та Computer Vision проектах і розробляє прототипи власних продуктів. Щороку компанія організовує безкоштовний літній навчальний інтенсив з Artificial Intelligence & Computer Vision.