【问题标题】:Probability and Neural Networks概率和神经网络
【发布时间】:2011-02-16 15:24:16
【问题描述】:

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

即给定输入发生的概率是神经网络中 sigmoid 函数的输出

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

我希望这确实可以解决问题..

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

【问题讨论】:

  • 嗨 Betamoo,当您说“给定输入的概率是 sigmoid 函数的输出”时,请澄清您的意思?我有点困惑。
  • 我已经编辑了这个问题。请看一下。

标签: machine-learning neural-network probability classification


【解决方案1】:

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

【讨论】:

  • +1 但是,如果他直接估计概率,我想真正强调 开箱即用 1/(1+e**(-x))会做正确的事并产生介于 0 和 1 之间的值。要使用 tanh,他需要稍微修改激活函数,例如tanh(x)/2 + 0.5
  • 我已经用训练 NN 的方法编辑了我的问题。请看看并告诉我这样做是否正确?
  • 这可能是吹毛求疵,但您的径向基函数的实现肯定有问题。 1应该是lx吗?此外,正如您所说,我不相信径向基函数是 sigmoidal。
  • 我们可以在输入层和输出层使用不同的激活函数吗??
【解决方案2】:

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

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's Machine Learning 中的第 6 章 损失函数及其推导。

【讨论】:

    【解决方案3】:

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

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

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

    但是,您可以说您的网络永远不会看到“不切实际”的代码示例,从而忽略这一事实。有关此问题的讨论(以及有关如何使用神经网络建模 PDF 的一些更酷的信息),请参阅contrastive backprop

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2020-12-21
      • 2018-09-01
      • 2015-07-20
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多