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



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


Що таке нейрон зміщення?


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

Для чого потрібен нейрон зміщення?

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

З шкільного курсу математики, ми знаємо, що якщо взяти функцію y = ax+b і змінювати у неї значення «а», то буде змінюватися нахил функції (кольори ліній на графіку зліва), а якщо міняти «b», то ми будемо зміщувати функцію вправо або вліво (кольори ліній на графіку праворуч). Так от «а» — це вага H1, а «b» — це вага нейрона зміщення B1. Це грубий приклад, але приблизно так все і працює (якщо ви подивитеся на функцію активації праворуч на зображенні, то помітите дуже сильне подібність між формулами). Тобто, коли в ході навчання, ми регулюємо ваги прихованих і вихідних нейронів, ми змінюємо нахил функції активації. Однак, регулювання ваги нейронів зміщення може дати нам можливість зрушити функцію активації по осі X і захопити нові ділянки. Іншими словами, якщо точка, що відповідає за ваше рішення, буде знаходитися, як показано на графіку зліва, то ваша НС ніколи не зможе вирішити завдання без використання нейронів зміщення. Тому, ви рідко зустрінете нейронні мережі без нейронів зміщення.

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

ВАЖЛИВО знати, що іноді на схемах не позначають нейрони зсуву, а просто враховують їх ваги при обчисленні значення вхідного наприклад:
input = H1*w1+H2*w2+b3
b3 = bias*w3
Так як його вихід завжди дорівнює 1, то можна просто уявити, що у нас є додатковий синапс з вагою і додати до суми цей вага без згадки самого нейрона.

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

  • Метод зворотного поширення (Backpropagation)
  • Метод пружного поширення (Resilient propagation або Rprop)
  • Генетичний Алгоритм (Genetic Algorithm)
Про Rprop і ГА мова піде в інших статтях, а зараз ми з вами подивимося на основу основ — метод зворотного поширення, який використовує алгоритм градієнтного спуску.

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


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

Так що ж таке, цей градієнт? Градієнт — це вектор, який визначає крутизну схилу і вказує його напрямок, щодо якоїсь з точок на поверхні або графіку. Щоб знайти градієнт треба взяти похідну від графіка по даній точці (як це і показано на графіку). Рухаючись у напрямку цього градієнта ми будемо плавно скочуватися в низину. Тепер уявімо що помилка — це лижник, а графік функції — гора. Відповідно, якщо помилка дорівнює 100%, то лижник перебувати на самій вершині гори і якщо помилка 0% то в низині. Як всі лижники, помилка прагне якнайшвидше спуститися вниз і зменшити своє значення. У кінцевому разі у нас повинен вийти наступний результат:



Уявіть що лижника закидають, з допомогою вертольота, на гору. На скільки високо або низько залежить від випадку (аналогічно тому, як у нейронної мережі при ініціалізації ваги розташовані у випадковому порядку). Припустимо помилка дорівнює 90% і це наша точка відліку. Тепер лижникові потрібно спуститися вниз, з допомогою градієнта. На шляху вниз, в кожній точці ми будемо обчислювати градієнт, що буде показувати нам напрямок спуску і при зміні нахилу, коригувати його. Якщо схил буде прямим, то після n-ого кількості таких дій ми доберемося до низини. Але в більшості випадків схил (графік функції) буде хвилястий і наш лижник зіткнеться з дуже серйозною проблемою — локальний мінімум. Я думаю всі знають, що таке локальний і глобальний мінімум функції, для освіження пам'яті ось приклад. Попадання в локальний мінімум загрожує тим, що наш лижник назавжди залишиться в цій низині і ніколи не скотитися з гори, отже ми ніколи не зможемо отримати правильну відповідь. Але ми можемо уникнути цього, спорядивши нашого лижника реактивним ранцем під назвою момент (momentum). Ось коротка ілюстрація моменту:



Як ви вже напевно здогадалися, цей ранець додасть лижникам необхідне прискорення щоб подолати пагорб, що утримує нас в локальному мінімумі, проте тут є одне АЛЕ. Уявимо що ми встановили певне значення параметру момент і без праці змогли подолати всі локальні мінімуми, і дістатися до глобального мінімуму. Так як ми не можемо просто вимкнути реактивний ранець, то ми можемо проскочити глобальний мінімум, якщо поруч з ним є ще низини. В кінцевому випадку це не так важливо, так як рано чи пізно ми все одно повернемося назад у глобальний мінімум, але варто пам'ятати, що чим більше момент, тим більше буде розмах з яким лижник буде кататися по долинах. Разом з моментом в методі зворотного поширення також використовується такий параметр, як швидкість навчання (learning rate). Як напевно багато хто подумає, чим більше швидкість навчання, тим швидше ми навчимо нейромережа. Немає. Швидкість навчання, також як і момент, є гиперпараметром — величина яка підбирається шляхом проб і помилок. Швидкість навчання можна безпосередньо пов'язати зі швидкістю лижника і можна з упевненістю сказати — тихіше їдеш-далі будеш. Однак тут теж є певні аспекти, так як якщо ми зовсім не дамо лижникові швидкості то він взагалі нікуди не поїде, а якщо дамо маленьку швидкість той час шляху може розтягнутися на дуже і дуже великий період часу. Що ж тоді станеться якщо ми дамо надто велику швидкість?



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

Що таке Метод Зворотного Поширення (МОР)?
Ось ми і дійшли до того моменту, коли ми можемо обговорити, як же все-таки зробити так, щоб ваша НС могла правильно навчатися і давати вірні рішення. Дуже добре МОР візуалізовано на цій гифке:


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

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

Дані завдання з попередньої статті
Дані: 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.78)=0.69

O1input = 0.61*1.5+0.69*-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%.

Так як ми вже підрахували результат НС та її помилку, то ми можемо відразу приступити до МОРу. Як я вже згадував раніше, алгоритм завжди починається з вихідного нейрона. В такому разі давайте порахуємо для нього значення δ (дельта) за формулою 1.
Так як у вихідного нейрона немає вихідних синапсів, то ми будемо користуватися першою формулою (δ output), слідчо для прихованих нейронів ми вже будемо брати другу формулу (δ hidden). Тут все досить просто: вважаємо різницю між бажаним і отриманим результатом і множимо на похідну функції активації від вхідного значення даного нейрона. Перш ніж приступити до обчислень я хочу звернути вашу увагу на похідну. По перше як це вже напевно стало зрозуміло, з МОР потрібно використовувати тільки ті функції активації, які можуть бути диференційовані. По друге щоб не робити зайвих обчислень, формулу похідної можна замінити на більш доброзичливу і просту формула виду:

Таким чином наші обчислення для точки O1 будуть виглядати наступним чином.

РішенняO1output = 0.33
O1ideal = 1
Error = 0.45

δO1 = (1 — 0.33) * ( (1 — 0.33) * 0.33 ) = 0.148

На цьому обчислення для нейрона O1 закінчені. Запам'ятайте, що після підрахунку дельти нейрона ми зобов'язані оновити ваги всіх вихідних синапсів цього нейрона. Так як у випадку з O1 їх немає, ми переходимо до нейронів схованого рівня і робимо теж саме за виключення того, що формула підрахунку дельти у нас тепер друга та її суть полягає в тому, щоб помножити похідну функції активації від вхідного значення на суму добутків всіх вихідних ваг і дельти нейрона з якою цей синапс пов'язаний. Але чому різні формули? Справа в тому що вся суть МОР полягає в тому, щоб поширити помилку вихідних нейронів на всі ваги НС. Помилку можна обчислити тільки на вихідному рівні, як ми це вже зробили, також ми вирахували дельту в якій вже є ця помилка. Слідчо тепер ми будемо замість помилки використовувати дельту яка буде передаватися від нейрона до нейрона. В такому разі давайте знайдемо дельту для H1:

РішенняH1output = 0.61
w5 = 1.5
δO1 = 0.148

δH1 = ( (1 — 0.61) * 0.61 ) * ( 1.5 * 0.148 ) = 0.053

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

Тут точка A це точка на початку синапсу, а точка B на кінці синапсу. Таким чином ми можемо обчислити градієнт w5 наступним чином:

РішенняH1output = 0.61
δO1 = 0.148

GRADw5 = 0.61 * 0.148 = 0.09

Зараз у нас є всі необхідні дані, щоб оновити вага w5 і ми зробимо це завдяки функції МОР яка розраховує величину на яку потрібно змінити той чи інший вага і виглядає вона наступним чином:

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

Тут ми бачимо 2 константи про яких ми вже говорили, коли розглядали алгоритм градієнтного спуску: E (епсилон) — швидкість навчання, α (альфа) — момент. Переводячи формулу слова отримаємо: зміна ваги синапсу дорівнює коефіцієнту швидкості навчання, помноженому на градієнт цієї ваги, додати момент помножений на попереднє зміна ваги (на 1-ій ітерації дорівнює 0). В такому разі давайте порахуємо зміна ваги w5 і оновимо його значення додавши до нього Δw5.

РішенняE = 0.7
Α = 0.3
w5 = 1.5
GRADw5 = 0.09
Δw5(i-1) = 0

Δw5 = 0.7 * 0.09 + 0 * 0.3 = 0.063
w5 = w5 + Δw5 = 1.563

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

РішенняH2output = 0.69
w6 = -2.3
δO1 = 0.148
E = 0.7
Α = 0.3
Δw6(i-1) = 0

δH2 = ( (1 — 0.69) * 0.69 ) * ( -2.3 * 0.148 ) = -0.07

GRADw6 = 0.69 * 0.148 = 0.1

Δw6 = 0.7 * 0.1 + 0 * 0.3 = 0.07

w6 = w6 + Δw6 = -2.2

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

Рішенняw1 = 0.45, Δw1(i-1) = 0
w2 = 0.78, Δw2(i-1) = 0
w3 = -0.12, Δw3(i-1) = 0
w4 = 0.13, Δw4(i-1) = 0
δH1 = 0.053
δH2 = -0.07
E = 0.7
Α = 0.3

GRADw1 = 0.45 * 0.053 = 0.02
GRADw2 = 0.78 * -0.07 = -0.05
GRADw3 = -0.12 * 0.053 = -0.006
GRADw4 = 0.13 * -0.07 = -0.009

Δw1 = 0.7 * 0.02 + 0 * 0.3 = 0.014
Δw2 = 0.7 * -0.05 + 0 * 0.3 = -0.035
Δw3 = 0.7 * -0.006 + 0 * 0.3 = -0.004
Δw4 = 0.7 * -0.009 + 0 * 0.3 = -0.006

w1 = w1 + Δw1 = 0.464
w2 = w2 + Δw2 = 0.745
w3 = w3 + Δw3 = -0.124
w4 = w4 + Δw4 = 0.124

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

РішенняI1 = 1
I2 = 0
w1 = 0.464
w2 = 0.745
w3 = -0.124
w4 = 0.124
w5 = 1.563
w6 = -2.2

H1input = 1 * 0.464 + 0 * -0.124 = 0.464
H1output = sigmoid(0.464) = 0.6139

H2input = 1 * 0.745 + 0 * 0.124 = 0.745
H2output = sigmoid(0.745) = 0.678

O1input = 0.6139 * 1.563 + 0.678 * -2.2 = -0.53
O1output = sigmoid(-0.53) = 0.37

O1ideal = 1 (0xor1=1)

Error = ((1-0.37)^2)/1=0.39

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

Як ми бачимо після однієї ітерації МОР, нам вдалося зменшити помилку на 0.04 (6%). Тепер потрібно повторювати це знову і знову, поки ваша помилка не стане досить мала.

Що ще потрібно знати про процес навчання?
Нейромережа можна навчати з учителем і без (supervised, unsupervised learning).

Навчання з учителем — тип тренувань властивий таким проблемам як регресія і класифікація (ним ми і скористалися в наведеному вище прикладі). Іншими словами тут ви виступаєте в ролі вчителя, а НС в ролі учня. Ви надаєте вхідні дані і бажаний результат, тобто учень подивившись на вхідні дані зрозуміє, що потрібно прагнути до того результату, який ви йому надали.
Навчання без вчителя — цей тип навчання зустрічається не так часто. Тут немає вчителя, тому мережа не отримує бажаний результат або ж їх кількість дуже мало. В основному такий вид тренувань притаманний НС у яких завдання полягає в групуванні даних за певними параметрами. Припустимо ви подаєте на вхід 10000 статей на хабре і після аналізу всіх цих статей НС зможе розподілити їх за категоріями базуючись, наприклад, на часто зустрічаються словах. Статті в яких згадуються мови програмування, програмування, а де такі слова як Photoshop, до дизайну.
Існує ще такий цікавий метод, як навчання з підкріпленням (reinforcement learning). Цей метод заслуговує окремої статті, але я спробую коротко описати його суть. Такий спосіб застосовується тоді, коли ми можемо ґрунтуючись на результатах отриманих від НС, дати їй оцінку. Наприклад ми хочемо навчити НС грати в PAC-MAN, тоді кожен раз коли НС буде набирати багато очок ми будемо заохочувати її. Іншими словами ми надаємо НС право знайти будь-який спосіб досягнення мети, до тих пір, поки він буде давати добрий результат. Таким чином, мережа почне розуміти, чого від неї хочуть добитися і намагається знайти найкращий спосіб досягнення цієї мети без постійного надання даних «вчителем».

Також навчання можна здійснювати трьома методами: стохастичний метод (stochastic), пакетний метод (batch) і міні-пакетний метод (mini-batch). Існує дуже багато статей і досліджень на тему того, який з методів краще і ніхто не може прийти до спільної відповіді. Я ж прихильник стохастичного методу, проте я не заперечую той факт, що кожен метод має свої плюси і мінуси.

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

Що таке гиперпараметры?
Гиперпараметры — це значення, які потрібно підбирати вручну і часто методом проб і помилок. Серед таких значень можна виділити:

  • Момент і швидкість навчання
  • Кількість прихованих шарів
  • Кількість нейронів у кожному шарі
  • Наявність або відсутність нейронів зміщення
В інших типах НС присутні додаткові гиперпараметры, але про них ми говорити не будемо. Підбір вірних гиперпараметров дуже важливий і буде безпосередньо впливати на збіжність вашої НС. Зрозуміти чи варто використовувати нейрони зміщення або немає достатньо просто. Кількість прихованих шарів та нейронів у них можна обчислити перебором грунтуючись на одному простому правилі — чим більше нейронів, тим точніше результат і тим експоненціально більше час, який ви витратите на її навчання. Проте варто пам'ятати, що не варто робити НС з 1000 нейронів для вирішення простих завдань. А от з вибором моменту і швидкості навчання все трішки складніше. Ці гиперпараметры будуть змінюватись, в залежності від поставленої задачі та архітектури НС. Наприклад, для вирішення XOR швидкість навчання може бути в межах 0.3 — 0.7, але в НС яка аналізує і прогнозує ціну акцій, швидкість навчання вище 0.00001 призводить до поганої збіжності НС. Не варто зараз загострювати свою увагу на гиперпараметрах і намагатися дасконально зрозуміти, як же їх вибирати. Це прийде з досвідом, а поки що раджу просто експериментувати і шукати приклади вирішення тієї чи іншої задачі в мережі.

Що таке збіжність?

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

Що таке перенавчання?
Перенавчання, як випливає з назви, це стан нейромережі, коли вона перенасичена даними. Це проблема виникає, якщо занадто довго навчати мережу на одних і тих же даних. Іншими словами, мережа почне не вчитися на даних, а запам'ятовувати і «зубрити» їх. Відповідно, коли ви вже будете подавати на вхід цієї НС нові дані, то в отриманих даних може з'явитися шум, який буде впливати на точність результату. Наприклад, якщо ми будемо показувати НС різні фотографії яблук (тільки червоні) і говорити що це яблуко. Тоді, коли НС побачить жовте або зелене яблуко, воно не зможе визначити, що це яблуко, так як вона запам'ятала, що всі яблука повинні бути червоними. І навпаки, коли НС побачить щось червоне і за формою збігається з яблуком, наприклад персик, вона скаже, що це яблуко. Це і є шум. На графіку шум буде виглядати наступним чином.

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

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

Джерело: Хабрахабр

0 коментарів

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