在神经网络中直接使用sigmoid或tanh输出层来估计概率是一种好习惯吗?
即给定输入发生的概率是NN中sigmoid函数的输出
EDIT
我想使用神经网络来学习和预测给定输入发生的概率 . 您可以将输入视为State1-Action-State2元组 . 因此,NN的输出是State2在State1上应用Action时发生的概率 .
我希望确实清楚......
EDIT
在训练NN时,我对State1做随机动作并观察结果状态2;然后教NN输入State1-Action-State2应该导致输出1.0
3 回答
首先,传统的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的二进制变量:
(实际上,我怀疑阶跃函数是激活函数的合理选择,但它可能有助于理解NN操作中激活函数的用途 . )
我想有无限数量的可能的激活功能,但在实践中,你只看到一小撮;实际上只有两个占绝大多数情况(两者都是S形) . 这里它们是(在python中)所以你可以自己试验,因为主要选择标准是实用的:
选择激活功能时需要考虑哪些因素?
首先,该函数必须给出期望的行为(由S形形成或由S形形状证明) . 其次,功能必须是可区分的 . 这是反向传播的要求,反向传播是在训练期间用于“填充”隐藏层的值的优化技术 .
例如,双曲正切的导数是(就输出而言,通常是这样写的):
除了这两个要求之外,使一个函数在另一个函数之间的作用是它如何有效地训练网络 - 即哪一个导致在最短的时期内收敛(达到局部最小误差)?
#--------编辑(见下面OP的评论)---------#
我不太清楚我是否理解 - 有时很难在没有代码的情况下传达NN的细节,所以我可能只是说它受到这个条件的好处:你想要NN预测的必须与训练期间使用的因变量 . 因此,例如,如果您使用两个状态(例如,0,1)作为单个因变量(显然在您的测试/ 生产环境 数据中缺失)训练您的NN,那么当您以“预测模式”运行时,您的NN将返回(培训后,或使用合格的权重矩阵) .
您应该选择正确的损失函数来最小化 . 该平方误差不会导致这里的最大似然假设 . 平方误差来自具有高斯噪声的模型:
您可以直接估算概率 . 你的模特是:
P(Y = 1 | x,h)是在看到x之后事件Y = 1的概率 .
您的模型的最大似然假设是:
这导致"cross entropy"损失功能 . 有关损失函数及其推导,请参见Mitchell's Machine Learning中的第6章 .
这种方法存在一个问题:如果你有来自R ^ n的向量并且你的网络将这些向量映射到区间[0,1],则不能保证网络代表有效的概率密度函数,因为它的积分网络不保证等于1 .
例如,神经网络可以将任何输入形式R ^ n映射到1.0 . 但这显然是不可能的 .
所以你的问题的答案是:不,你不能 .
但是,您可以说您的网络永远不会看到"unrealistic"代码示例,从而忽略了这一事实 . 有关此问题的讨论(以及有关如何使用神经网络建模PDF的一些更酷的信息),请参阅contrastive backprop .