首页 文章

概率与神经网络

提问于
浏览
16

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

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

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

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

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

3 回答

  • 6

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

    另外,你的问题列举了两个选项之间的选择,但它们实际上并不是替代品,而是术语'sigmoidal function'是一类函数的通用/非正式术语,包括你所引用的双曲正切('tanh') .

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

    反过来,S形函数是一类函数,用作使用backprop求解的FF神经网络中的 activation function (又名"squashing function") . 在训练或预测期间,输入的加权和(对于给定层,一次一层)作为参数传递给激活函数,激活函数返回该层的输出 . 另一组显然用作激活函数的函数是分段线性函数 . 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将返回(培训后,或使用合格的权重矩阵) .

  • 21

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

    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)
    

    这导致"cross entropy"损失功能 . 有关损失函数及其推导,请参见Mitchell's Machine Learning中的第6章 .

  • 4

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

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

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

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

相关问题