首先,传统 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 操作中的用途。)
我想可能的激活函数数量是无限的,但在实践中,你只会看到少数几个;事实上,只有两个占绝大多数情况(都是 sigmoid)。它们在这里(在 python 中),因此您可以自己试验,因为主要的选择标准是一个实用的标准:
# logistic function
def sigmoid2(x) :
return 1 / (1 + e**(-x))
# hyperbolic tangent
def sigmoid1(x) :
return math.tanh(x)
选择激活函数时要考虑哪些因素?
首先,该函数必须给出所需的行为(由 S 形形状产生或由 S 形形状证明)。其次,函数必须是可微的。这是反向传播的要求,反向传播是训练期间用于“填充”隐藏层值的优化技术。
例如,双曲正切的导数是(就输出而言,通常是这样写的):
def dsigmoid(y) :
return 1.0 - y**2
除了这两个要求之外,使一个函数介于另一个函数之间的原因是它训练网络的效率——即,哪个函数在最少的时期内导致收敛(达到局部最小误差)?
#-------- 编辑(请参阅下面的 OP 评论)---------#
我不太确定我是否理解 - 有时很难在没有代码的情况下传达 NN 的详细信息,所以我应该只说这很好,但要遵守这个附带条件:你希望 NN 预测的内容必须与训练期间使用的因变量。因此,例如,如果您使用两个状态(例如,0、1)作为单个因变量(测试/生产数据中显然缺少)训练您的 NN,那么这就是您的 NN 在“预测模式”下运行时将返回的内容(训练后,或有一个称职的权重矩阵)。