我对以下默认设置感到惊讶keras
:
keras.layers.Dense(units, activation=None, ...)
为什么我们可以选择只使用密集层(即矩阵乘法)而不使用激活函数(非线性变换)?我认为这两者应该始终在神经网络中结合使用。还有另一种情况,我们可以使用没有激活函数的密集层吗?
我对以下默认设置感到惊讶keras
:
keras.layers.Dense(units, activation=None, ...)
为什么我们可以选择只使用密集层(即矩阵乘法)而不使用激活函数(非线性变换)?我认为这两者应该始终在神经网络中结合使用。还有另一种情况,我们可以使用没有激活函数的密集层吗?
一种这样的场景是执行回归的网络的输出层,它应该是自然线性的。本教程演示了这种情况。
我想到的另一个案例是深度线性网络,它经常在神经网络文献中用作玩具模型,用于研究一些对于通常的非线性网络来说过于复杂的现象。
使用线性层的另一个目的是减少维度(和参数的数量)。例如用于词嵌入的 Skip-gram 和 CBOW 模型。
训练任务是预测给定词的上下文词。一种天真的方法是计算每个单词的上下文单词的出现次数并将它们放入矩阵中,那么概率就是,其中是归一化函数。
问题通常是单词的数量很大,我们买不起 ×矩阵。因此,我们可以先使用一个 x矩阵来减少维度(例如 128),然后使用另一个 x矩阵将其转回,然后参数数量可以减少到。在我们使用来近似的意义上,它有点像矩阵分解。
该模型可以实现为两个线性层,后跟一个归一化函数,并且可以使用交叉熵损失进行训练,其中对于 Skip-gram 模型,是一个单热向量,对于 CBOW 模型,是一个 BOW 向量。
假设您有一个用于二元分类任务的网络。实现这一点的一种方法是使用产生预测概率(非负,总和为 1)的最终激活。逆逻辑函数是在二进制情况下执行此操作的一种方法。
使用标准二元交叉熵损失意味着我们'重新往返指数函数和对数函数。由于累积的数值误差,这可能会导致严重的精度损失。
另一方面,使用的尺度而不是概率尺度消除了往返。换句话说,在最后一层使用恒等函数,以及在线性预测器规模上工作的损失函数,在不损失精度的情况下实现了相同的模型。
我们可以将相同的推理扩展到具有 softmax 激活
参见:实践中交叉熵的数值计算
您总是希望从您正在使用的库中获得最大的灵活性。例如,如果您想要一个带有跳过连接的深度 NN(请参阅本文),您需要在操作 F(x) + x 完成后应用您的激活函数。如何在输出 F(x) 的密集层上实现它,在求和之前无法阻止它应用激活函数?