Фон:
Если я не ошибаюсь, когда мы тренируемся в сети, мы корнем вперед, выполняя сигмоид (сумма (W * x)) для каждого слоя, а затем при обратном распространении вычисляем ошибку и дельта (изменение), тогда мы вычисляем градиенты и обновляем веса,
Допустим, у нас нет активации на одном из слоев, как керам рассчитать градиент? он просто принимает значение sum(W*x)*next_layer_delta*weights
чтобы получить дельта для текущего слоя и использовать это для вычисления градиентов?
Код:
У меня есть этот код, который я написал для создания модели word2vec (skip-gram):
model = Sequential()
model.add(Dense(2, input_dim=len(tokens_enc)))#what does it mean for it not to have an activation here? This makes it linear because there is no non-linear function such as tanh!
model.add(Dense(len(tokens_enc), activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# Fit the model
model.fit(X, y, epochs=20000)
Вход и выход - 1 горячий вектор.
Вопрос: Как кера оптимизирует вес в этом сценарии и каковы последствия отсутствия функции активации в скрытом слое?
Обычно функция линейной активации применяется только к последнему слою для некоторых проблем регрессии. Конечно, вы все равно можете использовать его как скрытые слои в многоуровневой сети. Однако, если вы складываете несколько линейных слоев рядом друг с другом, он будет действовать как один линейный слой, поэтому вы не сможете построить с ним большую модель. Линейная функция активации имеет локальный градиент = 1, поэтому локальный градиент полного узла - это сам вес.
Keras использует возможности автоматической дифференциации Theano и TensorFlow (в зависимости от того, какой бэкэнд вы используете), поэтому Keras действительно не делает ничего особенного в том, что у вас нет функции активации.
Градиенты вычисляются Theano/TensorFlow, и они вычисляют правильные.