在神经网络中直接使用sigmoid或tanh输出层来估计概率是否是一种好的做法?
即给定输入发生的概率是神经网络中sigmoid函数的输出
编辑
我想使用神经网络来学习和预测给定输入发生的概率。你可以将输入视为State1-Action-State2元组。因此,NN的输出是当在State1上应用Action时,State2发生的概率..
我希望这能澄清问题..
编辑
在训练NN时,我在State1上随机执行Action并观察结果State2;然后教NN输入State1-Action-State2应导致输出1.0
回答:
首先,就传统的MLP术语来说,有几个小点(可能有助于网络搜索等):’sigmoid’和’tanh’不是’输出层’而是函数,通常称为“激活函数”。激活函数的返回值确实是每层的输出,但它们本身并不是输出层(也不计算概率)。
此外,你的问题提到了两个“选择”(“sigmoid和tanh”),但它们实际上不是选择,’sigmoidal函数’是一个通用/非正式的术语,用于一类函数,其中包括你提到的双曲正切(’tanh’)。
‘sigmoidal’这个术语可能源于函数的特征形状——无论x值如何,返回的(y)值都被限制在两个渐近值之间。函数输出通常被归一化,使这两个值为-1和1(或0和1)。(顺便说一下,这种输出行为显然受到生物神经元的启发,神经元要么激发(+1),要么不激发(-1)。)查看sigmoidal函数的关键属性,你可以明白为什么它们非常适合作为前馈、反向传播神经网络中的激活函数:(i)实值且可微分,(ii)具有一个拐点,(iii)具有成对的水平渐近线。
反过来,sigmoidal函数是用于前馈神经网络中作为激活函数(也称为“压缩函数”)的一类函数之一,使用反向传播进行求解。在训练或预测期间,输入的加权和(对于给定层,一次一层)作为参数传递给激活函数,该函数返回该层的输出。另一组显然用作激活函数的函数是分段线性函数。阶 leap函数是PLF的二进制变体:
def step_fn(x) : if x <= 0 : y = 0 if x > 0 : y = 1
(从实际角度来看,我怀疑阶 leap函数作为激活函数的选择是否合理,但它可能有助于理解激活函数在NN操作中的目的。)
我想可能有无限多的可能激活函数,但在实践中,你只会看到少数几个;事实上,仅有两个就占了绝大多数情况(两者都是sigmoidal)。这里是它们(用python编写),以便你自己实验,考虑到主要选择标准是实用的:
# 逻辑函数def sigmoid2(x) : return 1 / (1 + e**(-x)) # 双曲正切def sigmoid1(x) : return math.tanh(x)
选择激活函数时需要考虑哪些因素?
首先,函数必须提供所需的行为(源自或由sigmoidal形状证明)。其次,函数必须是可微分的。这是反向传播的要求,这是训练期间使用的优化技术,用于“填充”隐藏层的数值。
例如,双曲正切的导数是(以输出形式表示,这是通常的写法):
def dsigmoid(y) : return 1.0 - y**2
除了这两个要求之外,一个函数比另一个函数更好的原因是它能更有效地训练网络——即,哪个函数能在最少的轮次中达到收敛(达到局部最小误差)?
#——– 编辑(见下方OP的评论) ———#
我不太确定我是否理解了——有时候在没有代码的情况下很难传达NN的细节,所以我可能应该只说在以下条件下这是可以的:你希望NN预测的内容必须与训练期间使用的因变量相同。例如,如果你使用两个状态(例如,0,1)作为单一因变量来训练你的NN(这显然在你的测试/生产数据中缺失),那么这就是你的NN在“预测模式”下运行时(训练后,或使用一个合格的权重矩阵)将返回的内容。