首先,传统 MLP 词典中的几个小点(可能有助于互联网搜索等):“sigmoid”和“tanh”不是“输出层”而是函数,通常称为“激活函数” ”。激活函数的返回值确实是每一层的输出,但它们本身并不是输出层(也不计算概率)。
此外,您的问题列举了两个“替代方案”(“sigmoid 和 tanh”)之间的选择,但它们实际上并不是替代方案,而是术语“sigmoidal 函数”是一类函数的通用/非正式术语,它包括您所指的双曲正切 ('tanh')。
术语“sigmoidal”可能是由于函数的特征形状——无论 x 值如何,返回 (y) 值都被限制在两个渐近值之间。函数输出通常被归一化,使得这两个值分别为 -1 和 1(或 0 和 1)。 (顺便说一下,这种输出行为显然是受到生物神经元的启发,该神经元要么触发(+1),要么不触发(-1))。看看 sigmoidal 函数的关键属性,您就会明白为什么它们非常适合作为前馈、反向传播神经网络中的激活函数:(i) 实值和可微分,(ii) 恰好有一个拐点,以及 ( iii) 有一对水平渐近线。
反过来,sigmoidal 函数是一类在使用反向传播求解的 FF 神经网络中用作激活函数(又名“挤压函数”)的函数。在训练或预测期间,输入的加权和(对于给定层,一次一层)作为参数传递给激活函数,该函数返回该层的输出。另一组显然用作激活函数的函数是分段线性函数。阶跃函数是 PLF 的二进制变体:
def step_fn(x) :
if x <= 0 :
y = 0
if x > 0 :
y = 1
(实际上,我怀疑阶跃函数是否是激活函数的合理选择,但也许它有助于理解激活函数在 NN 操作中的用途。)
我想可能的激活函数数量是无限的,但实际上,你只会看到少数几个;事实上,只有两个占绝大多数情况(都是 S 型)。它们在这里(在 python 中),因此您可以自己试验,因为主要的选择标准是实用的:
# logistic function
def sigmoid2(x) :
return 1 / (1 + e**(-x))
# hyperbolic tangent
def sigmoid1(x) :
return math.tanh(x)
在选择激活函数时要考虑哪些因素?
首先,函数必须给出所需的行为(源自或由 sigmoidal 形状证明)。其次,函数必须是可微的。这是反向传播的要求,反向传播是训练期间用来“填充”隐藏层值的优化技术。
例如,双曲正切的导数是(就输出而言,通常是这样写的):
def dsigmoid(y) :
return 1.0 - y**2
除了这两个要求之外,一个函数之间的区别在于它训练网络的效率如何——即,哪个函数在最少的时期内导致收敛(达到局部最小误差)?
#-------- 编辑(请参阅下面的 OP 评论)---------#
我不太确定我是否理解 - 有时,如果没有代码,很难传达 NN 的详细信息,所以我应该只说符合以下条件没问题:您希望 NN 预测的内容必须是与训练期间使用的因变量相同。因此,例如,如果您使用两个状态(例如,0、1)作为单个因变量(测试/生产数据中显然缺少)训练您的 NN,那么这就是您的 NN 在“预测模式”下运行时将返回的内容(训练后,或使用合适的权重矩阵)。