1

背景:

如果我没记错的话,在训练网络时,我们前馈对每一层执行 sigmoid(sum(W*x)) 然后在反向传播中我们计算误差和增量(变化),然后我们计算梯度并更新权重.

假设我们在其中一层上没有激活,keras 如何计算梯度?是否只需要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 个热向量。

问题:在这种情况下,keras 如何优化权重以及在隐藏层中没有激活函数的含义是什么?

4

2 回答 2

1

通常,线性激活函数仅应用于某些回归问题的最后一层。当然,您仍然可以将其用作多层网络中的隐藏层。但是,如果您将多个线性层彼此相邻堆叠,它将充当 1 个线性层,因此您无法使用它构建大模型。线性激活函数的局部梯度 = 1,因此,完整节点的局部梯度就是权重本身。

于 2018-08-01T02:23:48.080 回答
0

Keras 使用 Theano 和 TensorFlow 的自动微分功能(取决于您使用的后端),因此 Keras 并没有真正做任何特殊的事情,即没有激活功能。

梯度由 Theano/TensorFlow 计算,它们计算正确的梯度。

于 2018-08-01T03:48:49.787 回答