Програма створення та розрахунок нейромережі для чайників. Як працює нейронна мережа? Штучна нейронна мережа

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

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

З чого все почалося

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

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

Як працює нейромережа?

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

Якими бувають нейронні мережі та що вони вміють

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

Згорткові нейромережі

Нейрони діляться групи, кожна група обчислює задану їй характеристику. У 1993 році французький учений Ян Лекун показав світові LeNet 1 - першу згорткову нейронну мережу, яка швидко і точно могла розпізнавати цифри, написані на папері від руки. Дивіться самі:

Сьогодні згорткові нейронні мережі використовуються переважно з мультимединими цілями: вони працюють з графікою, аудіо та відео.

Рекурентні нейромережі

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

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

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

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

Комбіновані нейромережі (згорткові + рекурентні)

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

Нейросети постійно самонавчаються. Завдяки цьому процесу:

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

2. Яндекс на базі нейронних мереж створив два пошукові алгоритми: «Палех» та «Корольов». Перший допомагав знайти максимально релевантні сайти для низькочастотних запитів. «Палех» вивчав заголовки сторінок і зіставляв їх зміст із змістом запитів. На основі "Палеха" з'явився "Корольов". Цей алгоритм оцінює як заголовок, а й весь текстовий контент сторінки. Пошук стає все точнішим, а власники сайтів розумніше починають підходити до наповнення сторінок.

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

4. У Google Inbox за допомогою нейромереж здійснюється відповідь на повідомлення. Розвиток технологій йде повним ходом, і сьогодні мережа вже вивчає листування та генерує можливі варіантивідповіді. Можна не витрачати час на друк і не боятися забути якусь важливу домовленість.

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

6. Facebook активно працює над DeepText AI – програмою для комунікацій, яка розуміє жаргон та чистить чатики від обсценної лексики.

7. Додатки типу Prisma і Fabby, створені на нейромережах, створюють зображення та відео:

Colorize відновлює кольори на чорно-білих фото (здивуйте бабусю!).

MakeUp Plus підбирає для дівчат ідеальну помаду із реального асортименту реальних брендів: Bobbi Brown, Clinique, Lancome та YSL вже у справі.


8.
Apple і Microsoft постійно апгрейдять свої нейронні Siri та Contana. Поки що вони тільки виконують наші накази, але вже найближчим часом почнуть виявляти ініціативу: давати рекомендації та передбачати наші бажання.

А що ще на нас чекає в майбутньому?

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

Аграрний сектор

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

Медицина

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

Маркетинг

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

Ecommerce

Ecommerce буде запроваджено повсюдно. Вже не потрібно переходити в інтернет-магазин за посиланням: ви зможете купити все там, де бачите, в один клік. Наприклад, читаєте ви цю статтю за кілька років. Дуже вам подобається помада на скрині з MakeUp Plus (див. вище). Ви кликаєте на неї і потрапляєте одразу в кошик. Або дивіться відео про останню модель Hololens (окуляри змішаної реальності) і відразу оформляєте замовлення прямо з YouTube.

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

PS.Зінаїда Фолс - нейронна мережа Яндекса, яка пише вірші. Оцініть твір, який машина написала, навчившись на Маяковському (орфографія та пунктуація збережено):

« Це»

це
всього-навсього
щось
в майбутньому
і міць
у тієї людини
є на світі все чи ні
це кров навколо
домовилися
жиріє
слава у
землі
з тріском у дзьобі

Вражає, правда?

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

Теорія

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

Перетворення, які відбуваються лише на рівні окремих нейронів, дуже прості, проте навіть зовсім невеликі нейронні мережі здатні багато на що. Все різноманіття поведінки хробака Caenorhabditis elegans – рух, пошук їжі, різні реакції на зовнішні подразники та багато іншого – закодовано всього у трьох сотнях нейронів. І добре черви! Навіть мурах вистачає 250 тисяч нейронів, а те, що вони роблять, машинам виразно не під силу.

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

Електромеханічний мозок із моторчиком

Машина Розенблатта називалася Mark I Perceptron. Вона призначалася для розпізнавання зображень - завдання, з якою комп'ютери досі справляються так собі. Mark I був забезпечений подобою сітківки ока: квадратною матрицеюіз 400 фотоелементів, двадцять по вертикалі та двадцять по горизонталі. Фотоелементи в випадковому порядкупідключалися до електронних моделей нейронів, а вони, своєю чергою, до восьми виходів. Як синапси, що з'єднують електронні нейрони, фотоелементи та виходи, Розенблатт використовував потенціометри. При навчанні перцептрону 512 крокових двигунів автоматично обертали потенціометрові ручки, регулюючи напругу на нейронах в залежності від точності результату на виході.

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

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

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

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

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

Практика

Отже, давай спробуємо побудувати найпростішу нейронну мережу своїми руками і розберемося в її роботі по ходу справи. Ми будемо використовувати Python з бібліотекою Numpy (можна було б обійтися і без Numpy, але з Numpy лінійна алгебра забере менше сил). Розглянутий приклад заснований на коді Ендрю Траска.

Нам знадобляться функції для обчислення сигмоїди та її похідної:

Продовження доступне лише передплатникам

Варіант 1. Оформи передплату на «Хакер», щоб читати всі матеріали на сайті

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

Що ми будемо робити? Ми спробуємо створити просту і зовсім маленьку нейронну мережу, яку ми пояснимоі навчимощось розрізняти. При цьому не вдаватимемося в історію і математичні нетрі (таку інформацію знайти дуже легко) — натомість постараємося пояснити завдання (не факт, що вдасться) вам і самим малюнками і кодом.
Багато термінів в нейронних мережах пов'язані з біологією, тому давайте почнемо з самого початку:

Мозок - штука складна, але і його можна розділити на кілька основних частин та операцій:

Збудник може бути і внутрішнім(наприклад, образ або ідея):

А тепер поглянемо на основні та спрощені частинимозку:

Мозок взагалі схожий на кабельну мережу.

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

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

Зрозуміло, це все спрощення та узагальнення, але завдяки їм ми можемо описати просту
нейронну мережу:

І описати її формалізовано за допомогою графа:

Тут потрібні деякі пояснення. Гуртки - це нейрони, а лінії - це зв'язки між ними, і, щоб не ускладнювати на цьому етапі, взаємозв'язкує пряме пересування інформації зліва направо. Перший нейрон у Наразіактивний та виділений сірим. Також ми надали йому число (1 — якщо він працює, 0 — якщо ні). Числа між нейронами показують вагазв'язку.

Графи вище показують час мережі, для більш точного відображення, потрібно розділити його на тимчасові відрізки:

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

Коли на них спрямовують безпечний струмінь повітря, кролики, як і люди, моргають:

Цю модель поведінки можна намалювати графами:

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

Введемо ще один елемент – безпечний звуковий сигнал:

Ми можемо змоделювати зацікавленість кролика так:

Основна відмінність у тому, що зараз вага дорівнює нулютому моргаючого кролика ми не отримали, ну, поки що, Крайній мірі. Тепер навчимо кролика моргати по команді, змішуючи
подразники (звуковий сигнал та подих):

Важливо, що ці події відбуваються в різні часи епохи, У графах це буде виглядати так:

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

Щоб навчити кролика, повторимо дії:

Для перших трьох спроб схеми виглядатимуть так:

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

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

Ми навчили кролика реагувати на звук морганням.

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

Тепер ми залишимо біологічний світ мозку та кроликів та спробуємо адаптувати все, що
довідалися для створення штучної нейромережі. Для початку спробуємо зробити просте завдання.

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

Ми можемо зобразити (схематично), що робить кнопка при натисканні так:

Таке завдання краще вирішувати повністю, тому давайте подивимося на всі можливі результати, включаючи правильний:

Натисніть на 3-ю кнопку, щоб отримати свою вечерю.

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

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

Зверніть увагу, що всі ваги дорівнюють 0, тому нейронна мережа, як немовля, абсолютно порожня, але повністю взаємопов'язана.

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

Var inputs = ; var weights =; // Для зручності ці вектори можна назвати

Наступний крок — створення функції, яка збирає вхідні значення та ваги та розраховує значення на виході:

Function evaluateNeuralNetwork(inputVector, weightVector)( var result = 0; inputVector.forEach(function(inputValue, weightIndex) ( layerValue = inputValue*weightVector; result += layerValue; )); return (result.to / Може здаватися комплексною, але все, що вона робить - це зіставляє пари вага/введення і додає результату

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

EvaluateNeuralNetwork(inputs, weights); // 0.00

Живий приклад: Neural Net 001. Наступним кроком у вдосконаленні нашої нейромережі буде спосіб перевірки її власних вихідних або результуючих значеньПорівняно реальній ситуації, давайте спочатку закодуємо цю конкретну реальність у змінну:

Щоб виявити невідповідності (і скільки їх), ми додамо функцію помилки:

Error = Reality - Neural Net Output

З нею ми можемо оцінювати роботу нашої нейронної мережі:

Але що важливіше — як щодо ситуацій, коли реальність дає позитивний результат?

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

Error = Desired Output- Neural Net Output

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

Var input =; var weights =; var desiredResult = 1;

І нову функцію:

Function evaluateNeuralNetError(desired,actual) ( return (desired — actual); ) // After evaluating both the Network and Error we would get: // "Neural Net output: 0.00 Error: 1"

Живий приклад: Neural Net 002. Підіб'ємо проміжний підсумок. Ми почали із завдання, зробили її просту модельу вигляді біологічної нейронної мережі та отримали спосіб вимірювання її продуктивності порівняно з реальністю чи бажаним результатом. Тепер нам потрібно знайти спосіб виправлення невідповідності — процес, який і для комп'ютерів, і людей можна розглядати як навчання.

Як навчати нейронну мережу?

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

У природі під алгоритмами навчання розуміються зміни фізичних чи хімічних
характеристик нейронів після проведення експериментів:

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

Var learningRate = 0.20; // Чим більше значення, тим швидше буде процес навчання:)

І що це змінить?

Це змінить ваги (прямий як у кролика!), особливо вага висновку, який ми хочемо отримати:

Як кодувати такий алгоритм - ваш вибір, я для простоти додаю коефіцієнт навчання до ваги, ось він у вигляді функції:

Function learn(inputVector, weightVector) ( weightVector.forEach(function(weight, index, weights) ( if (inputVector > 0) ( weights = weight + learningRate; ) ))) )

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

// Original weight vector: // Neural Net output: 0.00 Error: 1 learn(input, weights); // New Weight vector: / / Neural Net output: 0.20 Error: 0.8 // Якщо це не очевидно, виведення нейронної мережі близьке до 1 (видача курки) - те, чого ми і хотіли, тому можна зробити висновок, що ми рухаємося в правильному напрямку

Живий приклад: Neural Net 003. Окей, тепер, коли ми рухаємося у вірному напрямку, останньою деталлю цієї головоломки буде впровадження повторів.

Це не так вже й складно, в природі ми просто робимо те саме знову і знову, а в коді ми просто вказуємо кількість повторів:

Var trials = 6;

І впровадження в нашу навчальну нейромережу функції кількості повторів виглядатиме так:

Function train(trials) ( for (i = 0; i< trials; i++) { neuralNetResult = evaluateNeuralNetwork(input, weights); learn(input, weights); } }

Ну і наш остаточний звіт:

Neural Net output: 0.00 Error: 1.00 Weight Vector: Neural Net output: 0.20 Error: 0.80 Weight Vector: Neural Net output: 0.40 Error: 0.60 Weight Vector: Neural Net output: 0.60 Error: 0.40 : 0.20 Weight Vector: Neural Net output: 1.00 Error: 0.00 Weight Vector: // Chicken Dinner !

Живий приклад: Neural Net 004. Тепер у нас є вектор ваги, який дасть лише один результат (курка на вечерю), якщо вхідний вектор відповідає реальності (натискання на третю кнопку). Так що ж таке класне ми щойно зробили?

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

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

  • Механізм зберігання вивчених ваг не передбачено, тому дана нейронна мережа забуде все, що знає. При оновленні або повторному запуску коду потрібно не менше шести успішних повторів, щоб мережа повністю навчилася, якщо ви вважаєте, що людина чи машина натискатимуть на кнопки у випадковому порядку… Це займе якийсь час.
  • Біологічні мережі для навчання важливим речаммають швидкість навчання 1, тому потрібен лише один успішний повтор.
  • Існує алгоритм навчання, який дуже нагадує біологічні нейрони, у нього помітна назва: правило widroff-hoff, або навчання widroff-hoff.
  • Пороги нейронів (1 у нашому прикладі) та ефекти перенавчання (при велику кількістьповторів результат буде більше 1) не враховуються, але вони дуже важливі в природі і відповідають за великі та складні блокиповедінкових реакцій. Як і негативні ваги.

Нотатки та список літератури для подальшого читання

Я намагався уникнути математики та строгих термінів, але якщо вам цікаво, то ми побудували перцептрон, який визначається як алгоритм контрольованого навчання (навчання з учителем) подвійних класифікаторів – важка штука. Біологічна будова мозку — тема не проста, частково через неточність, частково через його складність. Краще починати з Neuroscience (Purves) та Cognitive Neuroscience (Gazzaniga). Я змінив і адаптував приклад із кроликом із Gateway to Memory (Gluck), яка також є чудовим провідником у світ графів. Ще один шикарний ресурс An Introduction to Neural Networks (Gurney) підійде для всіх ваших потреб, пов'язаних з ІІ.
А тепер на Python! Дякуємо Іллі Андшмідту за надану версію на Python:

Inputs = weights = desired_result = 1 learning_rate = 0.2 trials = 6 def print("evaluate_neural_network: " + str(result)) print("weights: " + str(weights)) return result def evaluate_error(desired; ) return error def learn(input_array, weight_array): print("learning...") for i in range(len(input_array)): if input_array[i] > 0: weight_array[i] += learning_rate def train(trials ): for i in range(trials): neural_net_result = evaluate_neural_network(inputs, weights) learn(inputs, weights) train(trials)

А зараз на GO! За цю версію дякую Кірану Мехеру.

Package main import ("fmt" "math") func main() ( fmt.Println("Creating inputs and weights ...") inputs:= float64(0.00, 0.00, 1.00, 0.00) weights:= float64(0.0) 0.00, 0.00, 0.00) desired:= 1.00 learningRate:= 0.20 trials:= 6 train(trials, inputs, weights, desired, learningRate) ) func train(trials int, inputs float64, weights float64, desired float64, learningRate float64) ( for i:= 1;< trials; i++ { weights = learn(inputs, weights, learningRate) output:= evaluate(inputs, weights) errorResult:= evaluateError(desired, output) fmt.Print("Output: ") fmt.Print(math.Round(output*100) / 100) fmt.Print(" Error: ") fmt.Print(math.Round(errorResult*100) / 100) fmt.Print(" ") } } func learn(inputVector float64, weightVector float64, learningRate float64) float64 { for index, inputValue:= range inputVector { if inputValue >0.00 ( weightVector = weightVector + learningRate ) ) return weightVector ) func evaluate(inputVector float64, weightVector float64) float64 ( result:= 0.00 for index, inputValue:= range inputVu + layerValue ) return result ) func evaluateError(desired float64, actual float64) float64 ( return desired - actual )

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

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

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

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

2. Редактор нейронної мережі (Багатошарового персептону). Дає можливість створювати та редагувати нейронну мережу. Візуально мережа відображається як структури з різнокольорових куль. Зелені кулі – вхідні ядра, червоні – вихідні, а жовті – ядра внутрішніх шарів. Є можливість встановлювати кількість шарів та ядер у них. Для завантажених завдань та мереж, а також у разі, коли для навчання проекту вже були завантажені дані, кількість вхідних та вихідних ядер приймається рівною кількості існуючих аргументів та результатів. При натисканні кнопки "Зберегти мережу" відбувається збереження мережі у параметрах обробки та ініціалізація початкової ваги ребер випадковим чином. Тобто навіть якщо ми не змінювали структуру мережі, її можна очистити від результатів попереднього навчання заново зберігши в редакторі.

3. Підсистема аналізу ходу навчання . Підсистема дуже проста і є графіком, що демонструє хід навчання мережі в даному проекті. Крок збору статистики та загальна кількість кроків навчання налаштовуються у "Панелі управління проектом". Статистику не можна бачити в real timeпід час навчання. Вона є такою ж складовоюпроекту, як мережа та масиви даних для навчання і буде оновлено та записано в проект по завершенню навчання разом з новими параметрами мережі. Відповідно, якщо в завантаженому проекті при попередньому навчанні була включена опція ведення статистики, то перегляд графіків помилок апроксимації доступний відразу після завантаження завдання (проекту).

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

Тепер трохи розповім про параметри мережі та про процес навчання.

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

Алгоритм навчання- зворотне поширенняпомилки. За подробицями, якщо цікаво, до Google.

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

Навчальна вибірка. Усі передані як аргументи та результати дані рандомно діляться перед початком навчання на 3 частини (Тренувальна, Тестова та Верифікаційна) у співвідношенні 7:2:1. Причому цей рандом щоразу різний та дані діляться перед кожним циклом навчання. У результаті Ви бачите картину, що з запуску другого (третього тощо.) циклу навчання однієї й тієї ж проекту помилки апроксимації можуть у перших кроках різко просісти чи підскочити. Це не від того, що була взята не та мережа - просто новий рандом вибірок і нові значення помилок.

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

Верифікаційна вибірка - не видно користувачеві до кінця навчання. Так як у процесі навчання ми можемо стежити за тестовою вибіркою, вона теж опосередковано є об'єктом навчання. У даному випадку верифікація - фінальний і неупереджений суддя якості мережі, що вийшла.

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

Тепер про способи запуску процесу навчання із форми обробки. Їх всього 3:

1. Звичайний запуск процесу. Стартуємо навчання в поточному сеансі та чекаємо на закінчення. Так як до закінчення виклику сервера нічого на клієнт повернути не можна - чекаємо і сподіваємося, що все буде гаразд.

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

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

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

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

Що у доданому архіві? Опис складу проекту мережі (специфікація) для самостійної розробки проектів ( MS Word ), демо-файли проекту та мережі, а також набір з 2-х файлів демо даних. Дані - це таблиці значень із наборами аргументів та результатів.

Обробка викладена окремим файлом для зручності оновлення та заміни новими версіями. Найважливіша частина додаткових матеріалів - специфікація проекту мережі міститься в довідці обробки, так що в принципі можна завантажувати лише саму обробку для економії $ m . Функціонал та документацію при цьому Ви отримаєте у повному обсязі.

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

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

Крок 0. Розбираємось, як влаштовані нейронні мережі

Найпростіше розібратися із принципами роботи нейронних мереж можна на прикладі Teachable Machine – освітнього проекту Google.

Як вхідні дані - те, що потрібно обробити нейронної мережі - в Teachable Machine використовується зображення з камери ноутбука. Як вихідні дані — те, що має зробити нейромережа після обробки вхідних даних, — можна використовувати гіфку або звук.

Наприклад, можна навчити Teachable Machine при піднятій догори долоні говорити «Hi». При піднятому вгору великому пальці - Cool, а при здивованому обличчі з відкритим ротом - Wow.

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

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

Як тільки нейромережа навчена, її можна використовувати. Teachable Machine показує коефіцієнт "впевненості" - наскільки система "впевнена", що їй показують одну з навичок.

Крок 1. Готуємо комп'ютер для роботи з нейронною мережею

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

Для створення власної нейронної мережі знадобиться Python — одна з наймінімалістичніших і найпоширеніших мов програмування, і TensorFlow — відкрита бібліотека Google для створення та тренування нейронних мереж.

Встановлюємо Python