Зачем умножать ошибку на производную сигмоида в нейронных сетях?

Вот код:

import numpy as np

# sigmoid function
def nonlin(x,deriv=False):
    if(deriv==True):
        return x*(1-x)
    return 1/(1+np.exp(-x))

# input dataset
X = np.array([  [0,0,1],
                [0,1,1],
                [1,0,1],
                [1,1,1] ])

# output dataset            
y = np.array([[0,0,1,1]]).T

# seed random numbers to make calculation
# deterministic (just a good practice)
np.random.seed(1)

# initialize weights randomly with mean 0
syn0 = 2*np.random.random((3,1)) - 1

for iter in xrange(10000):

    # forward propagation
    l0 = X
    l1 = nonlin(np.dot(l0,syn0))

    # how much did we miss?
    l1_error = y - l1

    # multiply how much we missed by the 
    # slope of the sigmoid at the values in l1
    l1_delta = l1_error * nonlin(l1,True)

    # update weights
    syn0 += np.dot(l0.T,l1_delta)

print "Output After Training:"
print l1

Вот веб-сайт: http://iamtrask.github.io/2015/07/12/basic-python-network/

Строка 36 кода, l1 error умножается на производную ввода, отмеченную весовыми точками. Я понятия не имею, почему это делается, и часами пытался это понять. Я только что пришел к выводу, что это неправильно, но что-то мне подсказывает, что это, вероятно, неправильно, учитывая, сколько людей рекомендуют и используют это руководство в качестве отправной точки для изучения нейронных сетей.

В статье говорится, что

Посмотрите еще раз на сигмовидную картинку! Если наклон был действительно мелким (близким к 0), то сеть имела либо очень высокое значение, либо очень низкое значение. Это означает, что сеть так или иначе была достаточно уверенной. Однако, если сеть угадала что-то близкое к (x = 0, y = 0,5), то это не очень уверенно.

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

Конечно, было бы лучше просто кубить l1_error, если бы вы хотели подчеркнуть ошибку?

Это настоящее разочарование, учитывая, что до этого момента казалось, что я нашел многообещающий способ действительно интуитивно начать изучение нейронных сетей, но снова я ошибался. Было бы признательно, если у вас есть хорошее место для начала обучения, где я могу очень легко понять.


person Meme Stream    schedule 20.08.2017    source источник
comment
Сеть может быть в равной степени уверена в низком значении, низкий результат не означает низкую уверенность, это просто означает, что он уверен, что он не сработает для этого ввода. Почему вы считаете, что уверенность связана только с результатами увольнения?   -  person AChampion    schedule 21.08.2017
comment
Почему низкий результат означает уверенность в том, что он не сработает для этого входа? В чем разница между этим и уверенностью?   -  person Meme Stream    schedule 21.08.2017
comment
Производная сигмоида указывает на его уверенность, она может спускаться или подниматься до уверенности на основе обучения.   -  person AChampion    schedule 21.08.2017
comment
Об этом говорилось в статье ... но мой вопрос - как? В этом случае сигмоид используется только для сжатия значений до значений от 0 до 1. Как он указывает на уверенность, когда единственное, что должно указывать на уверенность, - это ошибка предсказанного результата?   -  person Meme Stream    schedule 21.08.2017
comment
С моей точки зрения, это проблема SGD / GD. Вы пытаетесь достичь с помощью своей NN минимальной функции ошибок, чтобы получить, что вы вычисляете градиентную производную функции ошибок по всем весам и смещениям. Если вы производите функцию ошибок по весам, часть результата будет производной от сигмоида (из-за правила цепочки, и только сигмоид является вашей функцией активации). Я рекомендую вам прочитать об алгоритме стохастического градиентного спуска и взглянуть на производную обратного распространения ошибок. И еще один момент: если вы используете функцию ошибок кроссэнтропии, вы избежите сигмовидной деривации.   -  person viceriel    schedule 21.08.2017


Ответы (2)


Посмотрите на это изображение. Если сигмовидная функция дает вам HIGH или LOW значение (довольно хорошая уверенность), производной этого значения будет LOW. Если вы получаете значение на самом крутом склоне (0,5), производная от этого значения будет ВЫСОКОЙ.

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

Сигмоидальная функция и производная

person Truffle    schedule 17.04.2018

Во-первых, это правильная строка:

l1_delta = l1_error * nonlin(l1, True)

Общая ошибка следующего слоя l1_error умножается на производную текущего слоя (здесь я считаю сигмоид отдельным слоем, чтобы упростить поток обратного распространения). Это называется правилом цепочки.

Цитата о «сетевой уверенности» действительно может сбить с толку новичка. Здесь они имеют в виду вероятностную интерпретацию сигмовидной функции. Сигмоид (или вообще softmax) очень часто является последним слоем в задачах классификации: сигмоидальный значение между [0, 1], которое можно рассматривать как вероятность или достоверность класса 0 или класса 1.

В этой интерпретации sigmoid=0.001 - высокая степень достоверности класса 0, что соответствует небольшому градиенту и небольшому обновлению сети, sigmoid=0.999 - высокая степень достоверности класса 1, а sigmoid=0.499 - низкая достоверность. любого класса.

Обратите внимание, что в вашем примере sigmoid является последним слоем, поэтому вы можете рассматривать эту сеть как выполняющую двоичную классификацию, поэтому приведенная выше интерпретация имеет смысл.

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

Неужто было бы лучше просто кубить l1_error, если бы вы хотели подчеркнуть ошибку?

Вот важное замечание. Большой успех нейронных сетей за последние несколько лет, по крайней мере частично, связан с использованием ReLu вместо сигмоида в скрытых слоях именно потому, что лучше не насыщать градиент. Это известно как проблема исчезающего градиента. Так что, наоборот, вы обычно не хотите подчеркивать ошибку обратного распространения.

person Maxim    schedule 05.10.2017