将神经网络输出限制为受过训练的课程的子集

大卫·S·

是否有可能将向量传递到经过训练的神经网络,以便它仅从经过训练的识别类别的子集中进行选择。例如,我的网络经过训练可以识别数字和字母,但是我知道接下来要运行的图像将不包含小写字母(例如序列号的图像)。然后我给它传递一个向量,告诉它不要猜测任何小写字母。由于这些类是互斥的,因此网络以softmax函数结尾。以下只是我想尝试的示例,但没有一个真正有用。

import numpy as np

def softmax(arr):
    return np.exp(arr)/np.exp(arr).sum()

#Stand ins for previous layer/NN output and vector of allowed answers.
output = np.array([ 0.15885351,0.94527385,0.33977026,-0.27237907,0.32012873,
       0.44839673,-0.52375875,-0.99423903,-0.06391236,0.82529586])
restrictions = np.array([1,1,0,0,1,1,1,0,1,1])

#Ideas -----

'''First: Multilpy restricted before sending it through softmax.
I stupidly tried this one.'''
results = softmax(output*restrictions)

'''Second: Multiply the results of the softmax by the restrictions.'''
results = softmax(output)
results = results*restrictions

'''Third: Remove invalid entries before calculating the softmax.'''
result = output*restrictions
result[result != 0] = softmax(result[result != 0])

所有这些都有问题。第一个导致无效选择默认为:

1/np.exp(arr).sum()

由于softmax的输入可能为负,因此可能会增加赋予无效选择的可能性,并使答案更糟。(在尝试之前,应该已经调查过。)

第二个和第三个都有类似的问题,因为它们要等到给出应用限制的答案之前。例如,如果网络正在查看字母l,但它开始确定它是数字1,则直到使用这些方法结束时才对其进行更正。因此,如果采用这种方式,则以.80的概率给出1的输出,但是如果删除了此选项,则似乎剩余的选项将重新分配,并且最高的有效答案不会像80%那样可信。剩下的选项最终要统一得多。我想说的一个例子:

output
Out[75]: array([ 5.39413513,  3.81445419,  3.75369546,  1.02716988,  0.39189373])

softmax(output)
Out[76]: array([ 0.70454877,  0.14516581,  0.13660832,  0.00894051,  0.00473658])

softmax(output[1:])
Out[77]: array([ 0.49133596,  0.46237183,  0.03026052,  0.01603169])

(对数组进行排序使其更容易。)在原始输出中,softmax给出.70的答案是[1,0,0,0,0],但是如果这是无效的答案,则删除了重新分配如何分配剩余的4个值可能性低于50%的期权,由于太低而无法使用,因此很容易被忽略。

我已经考虑过将向量作为另一种输入传递到网络中,但是我不确定如何在不要求它学习向量告诉它做什么的情况下进行此操作,我认为这会增加训练所需的时间。

编辑:我在评论中写的太多了,所以我只在这里发布更新。我最终确实尝试将这些限制作为网络的输入。我选择了一个热编码答案,并随机添加了额外的启用类来模拟答案键,并确保正确答案始终在键中。当密钥只有很少的启用类别时,网络会严重依赖它,并且会干扰从图像中学习功能。当密钥具有很多启用的类别时,它似乎完全忽略了密钥。这可能是一个需要优化的问题,或者是我的网络体系结构出现了问题,或者只是需要进行调整以进行培训,但我始终没有解决该问题的方法。

我确实发现,当我最终减去np.inf而不是乘以0时,删除答案和清零几乎是相同的。我知道合奏,但是正如在对第一个响应的评论中提到的那样,我的网络正在处理CJK字符(字母只是为了使示例更容易),并拥有3000多个课程。网络已经非常庞大,这就是为什么我想研究这种方法的原因。我没想到要为每个类别使用二进制网络,但是3000多个网络似乎也很成问题(如果我理解您的话正确的话),尽管以后可能会研究。

希蒙·马斯凯(Szymon Maszke)

首先,我将轻松地列出您列出的可用选项,并添加一些可行和可行的替代方案。构造此答案有点困难,但我希望您能得到我要介绍的内容:

1.在通过softmax发送之前将其乘以限制。

显然,正如您所写的那样,清零后的条目可能会赋予更高的机会,一开始似乎是一种错误的方法。

替代方案:将不可能的值替换为smallestlogit值。这与相似softmax(output[1:]),尽管网络对结果的不确定性更大。示例pytorch实现:

import torch

logits = torch.Tensor([5.39413513, 3.81445419, 3.75369546, 1.02716988, 0.39189373])
minimum, _ = torch.min(logits, dim=0)
logits[0] = minimum
print(torch.nn.functional.softmax(logits))

产生:

tensor([0.0158, 0.4836, 0.4551, 0.0298, 0.0158])

讨论区

  • 引用您:“在原始输出中,softmax给出的答案是[1,0,0,0,0],而.max则为.70,但是如果这是无效的答案,则删除了重新分配,如何以50%以下的概率分配剩余的4个选项太低而无法使用,很容易被忽略。

是的,这样做是正确的更重要的是,此类的实际概率实际上要低得多,约为14%tensor([0.7045, 0.1452, 0.1366, 0.0089, 0.0047]))。通过手动更改输出,实际上是在破坏该NN所学习的属性(及其输出分布),从而使计算的某些部分变得毫无意义。这指向了这次赏金中提到的另一个问题:

2.众所周知,NN对于分类问题过于自信

我可以想象这可以通过多种方式解决:

2.1合奏

创建多个神经网络,并采取求和logits合奏他们argmax末(或softmax然后`argmax)。带有3种不同模型且具有不同预测的假设情况

import torch

predicted_logits_1 = torch.Tensor([5.39413513, 3.81419, 3.7546, 1.02716988, 0.39189373])
predicted_logits_2 = torch.Tensor([3.357895, 4.0165, 4.569546, 0.02716988, -0.189373])
predicted_logits_3 = torch.Tensor([2.989513, 5.814459, 3.55369546, 3.06988, -5.89473])

combined_logits = predicted_logits_1 + predicted_logits_2 + predicted_logits_3
print(combined_logits)
print(torch.nn.functional.softmax(combined_logits))

这将为我们提供以下概率softmax

[0.11291057 0.7576356 0.1293983 0.00005554 0.]

(请注意,现在头等舱最有可能)

您可以使用引导聚合和其他汇总技术来改善预测。这种方法使分类决策表面更加平滑,并修复了分类器之间的相互误差(假设它们的预测相差很大)。可能需要很多帖子来进行更详细的描述(或者需要单独的问题和特定的问题),此处此处的一些内容可能会让您入门。

我仍然不会将这种方法与手动选择输出混合使用。

2.2将问题转换为二进制

如果可以将其分布在多个GPU上,则此方法可能会产生更好的推理时间,甚至可能会得到更好的训练时间。

基本上,您的每个班级都可以出席(1)或缺席(0)。原则上,您可以NN训练神经网络,每个神经网络输出一个无界数(logit)。这个数字告诉网络是否认为此示例应归类为该类。

如果您确定某些类别不会成为结果,则确保您不运行负责该类别检测的网络从所有网络(或网络子集)获得预测后,选择最高值(如果使用sigmoid激活,则选择最高值,尽管这在计算上会很浪费)。

额外的好处将是所述网络的简单性(更轻松的培训和微调),以及switch-like在需要时易于操作

结论

如果您是我,我会采用2.2中概述的方法,因为您可以轻松地节省一些推理时间,并允许您以明智的方式“选择输出”。

如果这种方法还不够,则可以考虑N网络的集成,因此可以使用2.22.1的混合,一些引导程序或其他集成技术。这也将提高您的准确性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章