Почему есть функция активации в каждом нейронном net слое, а не только в последнем слое? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь научиться машинному обучению, и у меня есть вопрос, похожий на этот .

Правильно ли это:

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

x1  x2  x3  label
5   1   2   yes
3   9   8   no
1   2   3   yes
9   9   9   no  

То, что вы берете вектор первой строки (не столбца) таблицы выше, который будет введен в сеть, подобная этой:

т.е. будет три нейрона (1 для каждого значения первой строки таблицы), а затем w1, w2 и w3 выбираются случайным образом, затем для вычисления первого нейрона в следующем столбце вы делаете умножение, которое я описал, и добавляете случайно выбранный член смещения. Это дает значение этого узла.

Это делается для набора узлов (т.е. каждый столбец фактически будет иметь четыре узла (три + смещение), для простоты я удалил остальные три узла из второго столбец), а затем в последнем узле перед выводом, есть функция активации, чтобы преобразовать сумму в значение (например, 0-1 для сигмоида), и это значение говорит вам, является ли классификация да или нет.

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

from keras.models import Sequential
from keras.models import Dense

model = Sequential()
model.add(Dense(6,input_dim=3,activation='relu'))
model.add(Dense(6,input_dim=3,activation='relu'))
model.add(Dense(3,activation='softmax'))

Что я не делаю Я понимаю, почему модель keras имеет функцию активации в каждом слое сети, а не только в конце, поэтому мне интересно, правильное ли мое понимание / почему я добавила картинку.

Редактировать 1 : Просто замечание, которое я увидел, что в нейроне смещения я положил на край 'b = 1', что может сбить с толку, я знаю, что у смещения нет веса, так что это было для меня просто напоминанием о том, что вес узла смещения равен 1.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2020

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

Поэтому, как правило, вы должны выбрать число узлов в вашей сети, кратное количеству функций,

Нет.

Число объектов передается в аргументе input_dim, который устанавливается только для первого слоя модели; количество входов для каждого слоя, кроме первого, является просто количеством выходов предыдущего. Модель Keras, которую вы написали, недопустима, и она выдаст ошибку, поскольку для вашего 2-го уровня вы запрашиваете input_dim=3, в то время как предыдущий имеет явно 6 выходов (узлов).

Помимо этого input_dim аргумент, нет никакой другой связи между количеством функций данных и количеством сетевых узлов; и поскольку кажется, что вы имеете в виду данные радужной оболочки (4 функции), вот простой воспроизводимый пример применения к ним модели Keras.

Что несколько скрыто в последовательном Keras API (который вы здесь используете) заключается в том, что на самом деле существует неявный входной слой, а количество его узлов является размерностью входных данных; подробности см. в собственном ответе Входной слой последовательной модели Keras .

Таким образом, модель, нарисованная на планшете, фактически соответствует следующей модели Keras, написанной с использованием последовательного API:

model = Sequential()
model.add(Dense(1,input_dim=3,activation='linear'))

, где в функциональном API это будет записано как:

inputs = Input(shape=(3,))                
outputs = Dense(1, activation='linear')(inputs)     

model = Model(inputs, outputs)

и все, т.е. это на самом деле просто линейная регрессия.

Я знаю Смещение не имеет веса

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

почему модель keras имеет функцию активации в каждом слое сети, а не только в конце

Я полагаю, что это достаточно подробно описано в другом ответе.

Я прошу прощения за то, как это все c, я хочу по-настоящему понять процесс, и я делаю это из бесплатных ресурсов.

Мы все сделали; хотя нет никаких оправданий, чтобы не воспользоваться бесплатной и превосходной машинного обучения Эндрю Нга MOO C в Coursera.

1 голос
/ 22 апреля 2020

Представьте себе, у вас есть слой активации только в последнем слое (в вашем случае, сигмовидная. Это может быть что-то еще тоже .. скажем, softmax). Целью этого является преобразование реальных значений в диапазон от 0 до 1 для ответа классификации. Но активация во внутренних слоях (скрытых слоях) имеет совершенно другое назначение. Это ввести нелинейность. Без активации (скажем, ReLu, tanh et c.) Вы получите линейную функцию. И сколько бы у вас ни было скрытых слоев, вы все равно получите линейную функцию. И, наконец, вы преобразуете это в нелинейную функцию в последнем слое. Это может работать в некоторых простых нелинейных задачах, но не сможет захватить сложную нелинейную функцию. Каждая скрытая единица (в каждом слое) содержит функцию активации для включения нелинейности.

1 голос
/ 22 апреля 2020

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

Возьмем следующий пример, скажем, у вас есть трехслойная нейронная сеть без каких-либо нелинейных активаций в середине, но последний слой softmax. Весами и смещениями для этих слоев являются (W1, b1), (W2, b2) и (W3, b3). Затем вы можете записать окончательный вывод сети следующим образом.

h1 = W1.x + b1
h2 = W2.h1 + b2
h3 = Softmax(W3.h2 + b3)

Давайте сделаем некоторые манипуляции. Мы просто заменим h3 как функцию x,

h3 = Softmax(W3.(W2.(W1.x + b1) + b2) + b3)
h3 = Softmax((W3.W2.W1) x + (W3.W2.b1 + W3.b2 + b3))

Другими словами, h3 имеет следующий формат:

h3 = Softmax(W.x + b)

Итак, без Нелинейные активации, наши 3-уровневые сети были объединены в одноуровневую сеть. Вот почему важны нелинейные активации.

...