Нейронні мережі для початківців. Частина 1

image

Привіт всім читачам Habrahabr, в цій статті я хочу поділитися з Вами моїм досвідом у вивченні нейронних мереж і, як наслідок, їх реалізації з допомогою мови програмування Java, на платформі Android. Моє знайомство з нейронними мережами сталося, коли вийшло додаток Prisma. Воно обробляє будь-яку фотографію, з допомогою нейронних мереж, і відтворює її з нуля, використовуючи вибраний стиль. Зацікавившись цим, я кинувся шукати статті і «туторіали», в першу чергу, на Хабре. І на мій превеликий подив, я не знайшов ні одну статтю, яка чітко і поетапно розписувала алгоритм роботи нейронних мереж. Інформація була розрізненою і в ній були відсутні ключові моменти. Також, більшість авторів кидається показувати код на тому чи іншому мові програмування, не вдаючись до детальних пояснень.

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

Першим і найважливішим моїм відкриттям був плейлист американського програміста Джеффа Хітона, в якому він докладно і наочно розбирає принципи роботи нейронних мереж та їх класифікації. Після перегляду цього списку, я вирішив створити свою нейронну мережу, почавши з самого простого прикладу. Вам напевно відомо, що коли ти тільки починаєш вчити нову мову, першою твоєю програмою буде Hello World. Це свого роду традиція. У світі машинного навчання теж є свій Hello world і це нейромережа вирішує проблему виключного або(XOR). Таблиця виключного або виглядає наступним чином:
a b c
0 0 0
0 1 1
1 0 1
1 1 0
Відповідно, нейронна мережа бере на вхід два числа і має на виході дати інше число — відповідь. Тепер про самих нейронних мережах.

Що таке нейронна мережа?
image

Нейронна мережа — це послідовність нейронів, з'єднаних між собою синапсами. Структура нейронної мережі прийшла у світ програмування прямо з біології. Завдяки такій структурі, машина знаходить здатність аналізувати і навіть запам'ятовувати різну інформацію. Нейронні мережі також здатні не тільки аналізувати вхідну інформацію, але і відтворювати її з своєї пам'яті. Зацікавився обов'язково до перегляду 2 відео з TED Talks: Відео 1, Відео 2). Іншими словами, нейромережа це машинна інтерпретація мозку людини, в якому знаходяться мільйони нейронів передають інформацію у вигляді електричних імпульсів.

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

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

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

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

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

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

Що таке клітина?
image
Нейрон — це обчислювальна одиниця, яка одержує інформацію, виконує над нею прості обчислення і передає її далі. Вони діляться на три основних типи: вхідний (синій), прихований (червоний) і вихідний (зелений). Також є нейрон зміщення і контекстний нейрон про яких ми поговоримо в наступній статті. У тому випадку, коли нейромережа складається з великої кількості нейронів, вводять термін шару. Відповідно, є вхідний шар, який отримує інформацію, n прихованих шарів (зазвичай їх не більше 3), які її обробляють і вихідний шар, який виводить результат. У кожного з нейронів є 2 основних параметра: вхідні дані (input data) і вихідні дані (output data). У випадку вхідного нейрона: input=output. В інших, у полі input потрапляє сумарна інформація всіх нейронів з попереднього шару, після чого, вона нормалізується, за допомогою функції активації (поки що просто уявімо її f(x)) і потрапляє в поле output.


Важливо пам'ятати, що нейрони оперують числами в діапазоні [0,1] або [-1,1]. А як же, запитаєте ви, тоді обробляти числа, які виходять з цього діапазону? На даному етапі, найпростіший відповідь — це розділити 1 на це число. Цей процес називається нормалізацією, і він дуже часто використовується в нейронних мережах. Детальніше про це трохи пізніше.

Що таке синапс?

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

Важливо пам'ятати, що під час ініціалізації нейронної мережі, ваги розташовані у випадковому порядку.

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

В даному прикладі зображена частина нейронної мережі, де літерами I позначені вхідні нейрони, буквою H — прихований нейрон, а буквою w — ваги. З формули видно, що вхідна інформація — це сума всіх вхідних даних, помножених на відповідні їм ваги. Тоді дамо на вхід 1 і 0. Нехай w1=0.4 і w2 = 0.7 Вхідні дані нейрона Н1 будуть наступними: 1*0.4+0*0.7=0.4. Тепер, коли у нас є вхідні дані, ми можемо отримати вихідні дані, підставивши вхідна значення у функцію активації (докладніше про неї далі). Тепер, коли у нас є вихідні дані, ми передаємо їх далі. І так, ми повторюємо для всіх шарів, поки не дійдемо до вихідного нейрона. Запустивши таку мережу в перший раз ми побачимо, що відповідь далекий від правильно, тому що мережа не натренована. Щоб поліпшити результати ми будемо її тренувати. Але перш ніж дізнатися, як це робити, давайте введемо кілька термінів і властивостей нейронної мережі.

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

Лінійна функція

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

Сигмоид

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

Гіперболічний тангенс

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

Тренувальний сет
Тренувальний сет — це послідовність даних, якими оперує нейронна мережа. У нашому випадку виняткового або (xor) у нас всього 4 різних виходу тобто у нас буде 4 тренувальних сету: 0xor0=0, 0xor1=1, 1xor0=1,1xor1=0.

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

Епоха
При ініціалізації нейронної мережі ця величина встановлюється в 0 і має стелю, що задається вручну. Чим більше епоха, тим краще натренована мережу і відповідно, її результат. Епоха збільшується кожен раз, коли ми проходимо весь набір тренувальних сетів, в нашому випадку, 4 сетів або 4 ітерацій.


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

Помилка
Помилка — це відсоткова величина, що відображає розбіжність між очікуваним і отриманими відповідями. Помилка формується кожну епоху і повинна йти на спад. Якщо цього не відбувається, значить, ви щось робите не так. Помилку можна обчислити різними шляхами, але ми розглянемо лише три основних способи: Mean Squared Error (далі MSE), Root MSE і Arctan. Тут немає якого-небудь обмеження на використання, як функції активації, і ви вільні вибрати будь-який метод, який буде приносити вам найкращий результат. Варто лише враховувати, що кожен метод вважає помилки по-різному. У Arctan, помилка, майже завжди, буде більше, так як він працює за принципом: чим більше різниця, тим більша помилка. У Root MSE буде найменша помилка, тому, найчастіше, використовують MSE, яка зберігає баланс в обчисленні помилки.

MSE

Root MSE

Arctan

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

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

Дані: I1=1, I2=0, w1=0.45, w2=0.78 ,w3=-0.12 ,w4=0.13 ,w5=1.5 ,w6=-2.3.


РішенняH1input = 1*0.45+0*-0.12=0.45
H1output = sigmoid(0.45)=0.61

H2input = 1*0.78+0*0.13=0.78
H2output = sigmoid(0.45)=0.69

O1input = 0.61*1.5+0.78*-2.3=-0.672
O1output = sigmoid(-0.672)=0.33

O1ideal = 1 (0xor1=1)

Error = ((1-0.33)^2)/1=0.45

Результат — 0.33, помилка — 45%.

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

Використані ресурси:
Раз
Два
Три
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.