Вероятность и нейронные сети - PullRequest
16 голосов
/ 07 мая 2010

Является ли хорошей практикой использование выходных слоев сигмоида или танха в нейронных сетях напрямую для оценки вероятностей?

Т.е. вероятность того, что заданный вход произойдет, является выходом сигмоидальной функции в NN

EDIT
Я хотел использовать нейронную сеть, чтобы узнать и предсказать вероятность того, что данный вход произойдет .. Вы можете рассматривать вход как кортеж State1-Action-State2. Следовательно, выходные данные NN - это вероятность того, что State2 произойдет при применении Action к State1 ..

Надеюсь, что все проясняется ..

EDIT
При обучении NN я делаю случайное действие на State1 и наблюдаю результирующее State2; затем научите NN, что ввод State1-Action-State2 должен привести к выводу 1.0

Ответы [ 3 ]

21 голосов
/ 07 мая 2010

Во-первых, всего пара небольших точек в традиционной лексике MLP (может помочь при поиске в Интернете и т. Д.): «Sigmoid» и «tanh» - это не «выходные слои», а функции, обычно называемые «функциями активации». ». Возвращаемое значение функции активации действительно является выходным сигналом каждого слоя, но они сами не являются выходным слоем (и при этом они не вычисляют вероятности).

Кроме того, ваш вопрос содержит выбор между двумя «альтернативами» («сигмоид и танх»), но на самом деле они не являются альтернативами, а термин «сигмоидальная функция» является общим / неформальным термином для класса функций, который включает гиперболический тангенс («tanh»), на который вы ссылаетесь.

Термин «сигмоидальный», вероятно, связан с характерной формой функции - значения return (y) ограничены двумя асимптотическими значениями независимо от значения x. Выходные данные функции обычно нормализуются, так что эти два значения равны -1 и 1 (или 0 и 1). (Кстати, это выходное поведение, очевидно, вдохновлено биологическим нейроном, который либо срабатывает (+1), либо не срабатывает (-1)). Посмотрите на ключевые свойства сигмоидальных функций и вы поймете, почему они идеально подходят в качестве функций активации в обратных, распространяющихся нейронных сетях: (i) действительные и дифференцируемые, (ii) имеющие ровно одну точку перегиба, и ( iii) наличие пары горизонтальных асимптот.

В свою очередь, сигмоидальная функция является одной из категорий функций, используемых в качестве функции активации (она же «функция сжатия») в нейронных сетях FF, решаемых с использованием backprop. Во время обучения или прогнозирования взвешенная сумма входных данных (для данного слоя, по одному слою за раз) передается в качестве аргумента функции активации, которая возвращает выходные данные для этого слоя. Другая группа функций, по-видимому, используемая в качестве функции активации, является кусочно-линейной функцией. Шаговая функция - это двоичный вариант PLF:

def step_fn(x) :
  if x <= 0 :
    y = 0
  if x > 0 :
    y = 1    

(С практической точки зрения я сомневаюсь, что пошаговая функция является вероятным выбором для функции активации, но, возможно, она помогает понять назначение функции активации в работе NN.)

Я предполагаю, что существует неограниченное количество возможных функций активации, но на практике вы видите только несколько; на самом деле только два объясняют подавляющее большинство случаев (оба являются сигмоидальными). Вот они (в Python), так что вы можете экспериментировать для себя, учитывая, что основной критерий отбора является практическим:

# logistic function
def sigmoid2(x) :
  return 1 / (1 + e**(-x))   

# hyperbolic tangent
def sigmoid1(x) :
  return math.tanh(x)

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

Сначала функция должна дать желаемое поведение (вытекающее из сигмоидальной формы или подтвержденное ею). Во-вторых, функция должна быть дифференцируемой. Это требование обратного распространения, которое является техникой оптимизации, используемой во время обучения для «заполнения» значений скрытых слоев.

Например, производная гиперболического тангенса равна (в терминах результата, как это обычно пишется):

def dsigmoid(y) :
  return 1.0 - y**2

Помимо этих двух требований, что делает одну функцию между другой, так это то, насколько эффективно она обучает сеть, т. Е. Какая вызывает сближение (достижение локальной минимальной ошибки) в наименьшее количество эпох?

# -------- Редактировать (см. Комментарий ОП ниже) --------- #

Я не совсем уверен, что понял - иногда трудно сообщить детали NN без кода, поэтому я, вероятно, должен просто сказать, что это хорошо при условии, что NN предсказывает, что это должно быть такой же, как зависимая переменная, используемая во время обучения. Так, например, если вы обучаете свой NN, используя два состояния (например, 0, 1) в качестве единственной зависимой переменной (которая явно отсутствует в ваших данных тестирования / производства), то это то, что ваш NN будет возвращать при запуске в «режиме прогнозирования» (после тренировки или с грамотной весовой матрицей).

6 голосов
/ 25 мая 2010

Вы должны выбрать правильную функцию потерь, чтобы минимизировать. Квадратная ошибка здесь не приводит к гипотезе максимального правдоподобия. Квадратная ошибка получается из модели с гауссовским шумом:

P(y|x,h) = k1 * e**-(k2 * (y - h(x))**2)

Вы оцениваете вероятности напрямую. Ваша модель:

P(Y=1|x,h) = h(x)
P(Y=0|x,h) = 1 - h(x)

P (Y = 1 | x, h) - вероятность того, что событие Y = 1 произойдет после просмотра x.

Гипотеза максимального правдоподобия для вашей модели:

h_max_likelihood = argmax_h product(
    h(x)**y * (1-h(x))**(1-y) for x, y in examples)

Это приводит к потере "кросс-энтропийной" функции. См. Главу 6 в Машинное обучение Митчелла для функции потерь и ее вывода.

4 голосов
/ 10 мая 2010

Существует одна проблема с этим подходом: если у вас есть векторы из R ^ n, и ваша сеть отображает эти векторы в интервале [0, 1], то не будет гарантировано, что сеть представляет действительную функцию плотности вероятности, поскольку интеграл сети не гарантируется равным 1.

Например, нейронная сеть может отображать любую форму ввода R ^ n в 1,0. Но это явно невозможно.

Итак, ответ на ваш вопрос: нет, вы не можете.

Однако вы можете просто сказать, что ваша сеть никогда не видит «нереальные» примеры кода и, таким образом, игнорировать этот факт. Обсуждение этого (а также некоторую более классную информацию о том, как моделировать PDF-файлы с помощью нейронных сетей) см. В контрастном backprop .

...