在接下来的TensorFlow函数中,我们必须在最后一层中输入人工神经元的激活。我能理解。但我不明白为什么叫logits?这不是一个数学函数吗?
loss_function = tf.nn.softmax_cross_entropy_with_logits( logits = last_layer, labels = target_output )
Logits是一个重载的术语,可以有很多不同的含义:
在数学, 分对数是一个将概率([0, 1])映射到R ((-inf, inf))的函数
[0, 1]
(-inf, inf)
概率0.5对应logit为0。负logit对应概率小于0.5,正到>等于0.5。
在ML,它可以
原始(非标准化)预测的向量,即分类 生成模型,然后通常将其传递给规范化 函数。如果模型正在解决一个多类分类 问题是,对数通常成为softmax函数的输入。的 然后,Softmax函数生成一个(标准化)概率向量 每个可能的类都有一个值
分对数也 有时指的是sigmoid函数的元素逆。
logit (/ o . oʊdʒɪt/ LOH-jit)函数是数学,特别是统计学中使用的s型“逻辑”函数或逻辑变换的逆函数。当函数的变量表示概率p时,logit函数给出log-odds,或p/(1 - p)的对数。
看这里:https://en.wikipedia.org/wiki/Logit
个人理解,在TensorFlow领域,logits是用作softmax输入的值。我是在这个张量流教程的基础上得到这个理解的。
https://www.tensorflow.org/tutorials/layers
虽然logit确实是数学(尤其是统计学)中的一个函数,但我不认为这是你所看到的那个“logit”。在Ian Goodfellow的书深度学习中,他提到,
函数σ−1(x)在统计学上被称为logit,但是这个术语 很少用于机器学习。σ−1(x)表示 logistic sigmoid函数的逆函数。
在TensorFlow中,它经常被视为最后一层的名称。在Aurélien Géron的书使用Scikit-learn和TensorFLow进行动手机器学习的第10章中,我看到了这一段,它清楚地说明了logits层。
logits
注意,logits是神经网络之前的输出 通过softmax激活函数:出于优化原因,我们 稍后将处理softmax计算。
也就是说,虽然我们在设计的最后一层使用softmax作为激活函数,但为了计算方便,我们单独取出logits。这是因为将softmax和cross-entropy损失一起计算更有效。记住cross-entropy是一个代价函数,不用于前向传播。
softmax
cross-entropy
它们基本上是你能从网络中得到的最完整的学习模型,在它被压缩到只适用于我们感兴趣的类之前。看看一些研究人员是如何使用它们来训练基于深度网络学习的浅神经网络的:https://arxiv.org/pdf/1312.6184.pdf
这有点像在详细学习一门学科时,你会学到很多次要的东西,但在教学生时,你会试图把它压缩到最简单的情况。如果这个学生现在试图教,这将是相当困难的,但他能够很好地描述它,足以使用语言。
分对数是一个将概率[0, 1]映射到[-inf, +inf]的函数。
[-inf, +inf]
Softmax是一个将[-inf, +inf]映射到[0, 1]的函数,类似于Sigmoid。但是Softmax也将值的和(输出向量)归一化为1。
Tensorflow“with logit”:这意味着你正在对logit数字应用一个softmax函数来规范化它。input_vector/logit不是标准化的,可以从[-inf, inf]开始缩放。
这种归一化用于多类分类问题。对于多标签分类问题,使用sigmoid归一化,即tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits
我只是添加了这个说明,以便任何向下滚动这么多的人至少可以得到正确的答案,因为有这么多错误的答案被点赞。
Diansheng's 回答 and JakeJ's 回答 get it right. 由Shital Shah发布的一个新的答案是一个更好和更完整的答案
是的,logit作为统计学中的数学函数, 但是在神经网络上下文中使用的logit是不同的。统计学logit在这里甚至没有任何意义。
logit
我在任何地方都找不到正式的定义,但logit基本上意味着:
来自神经网络最后一层的原始预测 1. 这是你应用argmax函数来获得预测类的张量 2. 这是你输入softmax函数来获得预测类的概率的张量
argmax
另外,来自官方tensorflow网站上的教程:
分对数层 神经网络的最后一层是logits层,它将返回我们预测的原始值。我们创建了一个有10个神经元的密集层(每个目标类0-9一个),线性激活(默认值): logits = tf.layers.dense(inputs=dropout, units=10)
神经网络的最后一层是logits层,它将返回我们预测的原始值。我们创建了一个有10个神经元的密集层(每个目标类0-9一个),线性激活(默认值):
logits = tf.layers.dense(inputs=dropout, units=10)
如果你仍然感到困惑,情况是这样的:
raw_predictions = neural_net(input_layer) predicted_class_index_by_raw = argmax(raw_predictions) probabilities = softmax(raw_predictions) predicted_class_index_by_prob = argmax(probabilities)
其中,predicted_class_index_by_raw和predicted_class_index_by_prob将相等。
predicted_class_index_by_raw
predicted_class_index_by_prob
上面代码中__ABC0的另一个名字是logit。
不过,如果你愿意,你可以将统计的logit应用于softmax函数产生的probabilities。
probabilities
如果某个类的概率是p, 那么该类的log-odds是L = logit(p).
p
L = logit(p)
另外,该类的概率可以使用sigmoid函数恢复为p = sigmoid(L)。
sigmoid
p = sigmoid(L)
但是计算对数概率不是很有用。
总结
在深度学习的上下文中,分对数层表示输入到softmax(或其他类似的规范化)的层。softmax的输出是分类任务的概率,其输入是logits层。logits层通常生成从-∞到+∞的值,而softmax层将其转换为从0到1的值。
历史背景
这个词是怎么来的?在20世纪30年代和40年代,一些人试图将线性回归应用于预测概率的问题。然而,线性回归产生从-∞到+∞的输出,而对于概率,我们期望的输出是0到1。一种方法是通过某种方式映射概率0到1到-∞到+∞,然后像往常一样使用线性回归。切斯特·伊特纳·布利斯(Chester Ittner Bliss)在1934年使用的一种映射是累积正态分布,他称之为“probit”模型,是“概率单位”的缩写。然而,这个函数在计算上是昂贵的,同时缺乏多类分类所需的一些属性。1944年,Joseph Berkson使用log(p/(1-p))函数来进行映射,并将其称为logit,是“逻辑单元”的缩写。逻辑回归这个术语也是由此而来。
log(p/(1-p))
的混乱
不幸的是,logits这个术语在深度学习中被滥用了。从纯数学的角度来看,logit是执行上述映射的函数。在深度学习中,人们开始把输入logit函数的层称为“logits层”。然后人们开始将该层的输出值称为“logit”,这与logit 这个函数造成了混淆。
TensorFlow代码
不幸的是,TensorFlow代码通过tf.nn.softmax_cross_entropy_with_logits这样的名称进一步增加了混乱。logits在这里是什么意思?它只是意味着函数的输入应该是上面描述的最后一个神经元层的输出。_with_logits后缀是冗余、混乱和无意义。函数的命名不应该考虑这些非常特定的上下文,因为它们只是可以对从许多其他域派生的值执行的数学操作。事实上,TensorFlow还有另一个类似的函数sparse_softmax_cross_entropy,幸运的是,他们忘记添加_with_logits后缀,造成了不一致,增加了混乱。另一方面,PyTorch只是简单地命名它的函数,没有这些后缀。
tf.nn.softmax_cross_entropy_with_logits
_with_logits
sparse_softmax_cross_entropy
参考
Logit/Probit讲座幻灯片是理解logit的最佳资源之一。我也用上面的一些信息更新了维基百科的文章。
以下是一个简明的答案,供将来的读者参考。Tensorflow的logit被定义为不应用激活函数的神经元的输出:
Tensorflow
logit = w*x + b,
X:输入,w:权重,b:偏差。就是这样。
以下内容与这个问题无关。
关于历史课程,请阅读其他答案。向Tensorflow的“创造性”令人困惑的命名惯例致敬。在PyTorch中,只有一个CrossEntropyLoss,它接受未激活的输出。卷积、矩阵乘法和激活都是同一层次的运算。设计更加模块化,更少混乱。这是我从Tensorflow切换到PyTorch的原因之一。
PyTorch
CrossEntropyLoss
(FOMOsapiens)。
如果你检查数学Logit函数,它将实空间从[0,1]区间转换为无穷大[-inf, inf]。
[0,1]
[-inf, inf]
Sigmoid和softmax正好相反。它们将[-inf, inf]实空间转换为[0, 1]实空间。
这就是为什么在机器学习中,我们可以在sigmoid和softmax函数之前使用logit(因为它们是匹配的)。
这就是为什么“;我们可以称之为”;在机器学习中,任何东西位于乙状结肠或softmax函数的前面。
这里是G. Hinton 视频使用这个术语。
分类模型生成的原始(非归一化)预测向量,然后通常将其传递给归一化函数。如果模型要解决一个多类分类问题,对数通常会成为softmax函数的输入。然后,softmax函数生成一个(规范化)概率向量,每个可能的类都有一个值。
此外,对数有时指的是sigmoid函数的元素逆。有关更多信息,请参见tf.nn.sigmoid_cross_entropy_with_logits。
官方tensorflow文档 .