Як перетворити входи та отримати корисні результати в нейронній мережі?


9

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

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

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price 

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

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

  • Кількість спалень: 3
  • Пл. футів: 2000
  • Район: Нормалтаун
  • Продажна ціна: 250 000 доларів

Чи можете ви просто подати 3 і 2000 безпосередньо в нейронну мережу, оскільки вони є числами? Або вам потрібно перетворити їх на щось інше? Точно так само, як щодо значення Normaltown , це рядка, як ви перейдете до перекладу його у значення, яке нейронна мережа може зрозуміти? Чи можете ви просто вибрати число, наприклад, індекс, якщо воно є послідовним у всіх даних?

Більшість прикладів нейронної мережі, які я бачив, числа, що проходять між шарами, становлять або 0 до 1, або -1 до 1. Отже, наприкінці обробки, як ви перетворюєте вихідне значення на щось корисне, наприклад, 185 000 доларів ?

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

Відповіді:


10

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

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

Примітка. Я вважаю, що ви використовуєте f (x) = tanh (x) як функцію активації. Якщо ви цього не зробите, ви все ще можете мати можливість міркувати, як нормалізувати свої дані, прочитавши це.

Як підготувати вхідні дані:

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

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

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

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

  • Виконайте вище для кожної вхідної змінної.

Тепер, коли ви вводите кожне вхідне значення через нейрон, вихід нейрона - активація між -1 та 1 (подивіться на зображення tanh (x)). Оскільки це вже знаходиться у «чутливому» діапазоні функції активації, вам не потрібно турбуватися про зміну виводу нейронів вхідного рівня перед тим, як надсилати їх на перший прихований шар. Просто дайте будь-яким прихованим нейронам шару виходи попереднього шару безпосередньо - вони зможуть справитись із ними просто чудово.

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

  • Обчисліть середнє значення [/ / кожного] вихідної змінної та збережіть її.
  • Обчисліть максимальне відхилення вихідної змінної від середнього. Пітон:MaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
  • Коли мережа повертає вихід (и) між -1 і 1, помножте висновок на MaxDevі додайте його до середнього.

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

  1. Якщо всі вхідні значення є середніми (наприклад, середня кількість спалень, середня квадратна кімната тощо), чи є вихідна мережа такою, як середня величина вихідної змінної (наприклад, значення будинку)? (Вона повинна бути.)
  2. Якщо всі вхідні значення незвично високі / низькі, чи є також вихід мережі незвично високим / низьким? (Це працює лише в тому випадку, якщо всі вклади позитивно пов'язані з результатом ... якщо деякі з них пов'язані в зворотному порядку, вам доведеться подумати трохи більше).

Зауважте, що представлена ​​тут схема відповідає цим двом умовам.

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

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

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

Я сподіваюся, що це було корисно. Повідомте мене, якщо у вас є додаткові запитання. Мій модуль ANN, до речі, є в Python, тому я можу отримати поради щодо мови.


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

Отже, пара питань. Якщо моя площа Дані тренінгу на футах були {2000, 800, 850, 550, 2000}, тоді мої вхідні показники z {1900, 1500, 600} будуть (якщо я правильно розрахував) {1.0496, 0.4134, -1.0177}. Отже, одне з цих значень> 1, а одне <-1, що б я зробив з ними? Введіть їх у вузли вхідного шару незалежно або округляйте їх до 1 & -1? Чому 1900 та 600 виробляють ці значення, коли вони знаходяться в діапазоні 550 - 2000? Це лише хитрість даних, оскільки існує такий невеликий набір даних?
Девід

Що стосується перенормування вихідного шару, чи правильно я вважаю, що ви плануєте вихід на значення min та max? Так якби мінімальне значення було0andthemaximum100, а вихід дорівнював нулю (якщо вважати -1 до 1), то це означатиме $ 50?
Девід

Пам’ятайте, що вводи не повинні бути строго між 1 і -1. Все, що вам потрібно для введення даних, - це те, що більшість даних знаходиться в цьому діапазоні. Значення більше або менше одного означає, що точка знаходиться більше ніж одне стандартне відхилення від середнього, так що ця точка знаходиться ближче до вищого кінця даних. Слід зазначити, що ваші дані виходять за межі [-1, 1], ще рідше - виходять за межі [-2, 2] і вкрай рідко виходять за межі [-3, 3]. Подивіться на tanh (x), і ви побачите, що чутливий діапазон не просто строго між -1 та 1, але й трохи далі, ніж це.
Марко Бакич

Щодо вихідної денормалізації, то мінімальна денормалізація - це те, що я зробив у своїй реалізації, і ваше тлумачення є правильним, але вам не обов’язково робити це. Ви можете зробити так, щоб 1 відповідає двократному максимальному значенню будинку - таким чином ваша мережа зможе передбачити значення будинків вище того, на що ви його навчали.
Марко Бакич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.