在神经网络中直接使用sigmoid或tanh输出层来估计概率是一个好习惯吗?
即给定输入发生的概率是NN中sigmoid函数的输出
修改
我想使用神经网络来学习和预测给定输入发生的概率。
您可以将输入视为State1-Action-State2元组。
因此,NN的输出是State2在State1上应用Action时发生的概率。
我希望确实能够清楚......
修改
在训练NN时,我对State1做随机动作并观察结果状态2;然后教NN输入State1-Action-State2应该导致输出1.0
答案 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。