16

在神经网络中直接使用 sigmoid 或 tanh 输出层来估计概率是一种好习惯吗?

即给定输入发生的概率是 NN 中 sigmoid 函数的输出

编辑
我想使用神经网络来学习和预测给定输入发生的概率。您可以将输入视为 State1-Action-State2 元组。因此,NN 的输出是在 State1 上应用 Action 时 State2 发生的概率。

我希望这确实清楚事情..

编辑
在训练 NN 时,我对 State1 执行随机操作并观察结果 State2;然后教 NN 输入 State1-Action-State2 应该导致输出 1.0

4

3 回答 3

21

首先,传统 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 在“预测模式”下运行时将返回的内容(训练后,或有一个称职的权重矩阵)。

于 2010-05-07T02:21:28.053 回答
6

您应该选择正确的损失函数来最小化。平方误差不会导致这里的最大似然假设。平方误差来自具有高斯噪声的模型:

P(y|x,h) = k1 * e**-(k2 * (y - h(x))**2)

您直接估计概率。你的模型是:

P(Y=1|x,h) = h(x)
P(Y=0|x,h) = 1 - h(x)

P(Y=1|x,h) 是在看到 x 之后事件 Y=1 发生的概率。

您的模型的最大似然假设是:

h_max_likelihood = argmax_h product(
    h(x)**y * (1-h(x))**(1-y) for x, y in examples)

这导致了“交叉熵”损失函数。 有关损失函数及其推导,请参阅Mitchell 的机器学习中的第 6 章。

于 2010-05-25T09:35:41.973 回答
4

这种方法有一个问题:如果你有来自 R^n 的向量并且你的网络将这些向量映射到区间 [0, 1] 中,则不能保证网络代表一个有效的概率密度函数,因为积分网络不保证等于 1。

例如,神经网络可以将任何输入形式 R^n 映射到 1.0。但这显然是不可能的。

所以你的问题的答案是:不,你不能。

但是,您可以说您的网络从未看到“不切实际的”代码示例,因此忽略了这一事实。有关此问题的讨论(以及有关如何使用神经网络建模 PDF 的一些更酷的信息),请参阅对比反向传播

于 2010-05-09T21:00:07.693 回答