Как преобразовать входы и извлечь полезные результаты в нейронной сети?

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, это означает, что сеть возвращает максимально возможное значение дома в качестве своего прогноза. Какой должна быть максимальная ценность, которую может оценить сеть? Правильный подход здесь просто зависит от вашего приложения. Вот что я сделал:

  • Вычислите среднее значение выходной переменной [/ each] и сохраните его.
  • Рассчитайте максимальное отклонение выходной переменной от среднего. Python: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? Это просто обман данных, потому что существует такой маленький набор данных?
Дэвид
0aNdTчасемaИксямUм
Помните, что входные данные не должны быть строго между 1 и -1. Все, что вам нужно для ввода, - это то, что большая часть данных находится в этом диапазоне. Значение, большее или меньшее единицы, означает, что точка находится на расстоянии более одного стандартного отклонения от среднего значения, поэтому эта точка ближе к верхнему концу данных. Ваши данные должны быть довольно редко выходить за пределы [-1, 1], еще реже выходить за пределы [-2, 2] и крайне редко выходить за пределы [-3, 3]. Посмотрите на tanh (x), и вы увидите, что чувствительный диапазон не только строго между -1 и 1, но и немного дальше.
Марко Бакич
Что касается денормализации выходных данных, то минимально-максимальная денормализация - это то, что я сделал в моей реализации, и ваша интерпретация верна, но вам не обязательно делать это. Вы можете сделать так, чтобы 1 соответствовал удвоенной максимальной стоимости дома - таким образом ваша сеть могла бы предсказать стоимость дома выше того, на котором вы ее обучили.
Марко Бакич