概率与神经网络

时间:2010-05-07 00:13:13

标签: machine-learning neural-network probability classification

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

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

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

我希望确实能够清楚......

修改
在训练NN时,我对State1做随机动作并观察结果状态2;然后教NN输入State1-Action-State2应该导致输出1.0

3 个答案:

答案 0 :(得分:21)

首先,传统的MLP词典中只有几个小点(可能有助于互联网搜索等):'sigmoid'和'tanh'不是'输出层'而是功能,通常称为“激活功能” ”。激活函数的返回值确实是每个层的输出,但它们本身不是输出层(也不是计算概率)。

此外,你的问题叙述了两个“替代”(“sigmoid和tanh”)之间的选择,但它们实际上不是替代品,而是术语“S形函数”是一类函数的通用/非正式术语, 包含您引用的双曲正切('tanh')。

术语'sigmoidal'可能是由于函数的特征形状 - 无论x值如何,return(y)值都被约束在两个渐近值之间。函数输出通常被归一化,因此这两个值是-1和1(或0和1)。 (顺便说一句,这种输出行为显然受到生物神经元的启发,生物神经元要么发射(+1),要么不发射(-1))。看一下S形函数的关键属性,你可以看出为什么它们非常适合作为前馈,后向传播神经网络中的激活函数:(i)实值和可微分,(ii)只有一个拐点,( iii)有一对水平渐近线。

反过来,S形函数是在使用backprop求解的FF神经网络中用作激活函数(又名“压缩函数”)的一类函数。在训练或预测期间,输入的加权和(对于给定层,一次一层)作为参数传递给激活函数,激活函数返回该层的输出。另一组显然用作激活函数的函数是分段线性函数。 step函数是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)

选择激活功能时需要考虑哪些因素?

首先,该功能必须给出所需的行为(由S形形成或由S形形状证明)。其次,功能必须是可区分的。这是反向传播的要求,反向传播是训练期间用于“填充”隐藏层值的优化技术。

例如,双曲正切的导数是(就输出而言,通常是这样写的):

def dsigmoid(y) :
  return 1.0 - y**2

除了这两个要求之外,使一个函数在另一个函数之间的作用是它如何有效地训练网络 - 即,哪一个导致在最短的时期内收敛(达到局部最小误差)?

#--------编辑(参见下面的OP评论)---------#

我不太清楚我的理解 - 有时很难在没有代码的情况下传达NN的细节,所以我应该只是说它受到这个条款的好处:你想要NN预测的必须是与训练期间使用的因变量相同。因此,例如,如果您使用两个状态(例如,0,1)作为单个因变量(显然在您的测试/生产数据中缺失)训练您的NN,那么当您以“预测模式”运行时,您的NN将返回(培训后,或使用合格的权重矩阵)。

答案 1 :(得分: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's Machine Learning中的第6章 对于损失函数及其推导。

答案 2 :(得分:4)

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

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

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

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