为什么成本函数和最后一个激活函数在 MXNet 中是绑定的?

Why the cost function and the last activation function are bound in MXNet?

当我们定义深度学习模型时,我们执行以下步骤:

  1. 指定应如何根据输入和模型参数计算输出。
  2. 指定成本(损失)函数。
  3. 通过最小化成本函数来搜索模型的参数。

在我看来,在 MXNet 中,前两个步骤是绑定的。例如,通过以下方式我定义了一个线性变换:

# declare a symbolic variable for the model's input
inp = mx.sym.Variable(name = 'inp')
# define how output should be determined by the input
out = mx.sym.FullyConnected(inp, name = 'out', num_hidden = 2)

# specify input and model's parameters
x = mx.nd.array(np.ones(shape = (5,3)))
w = mx.nd.array(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]))
b = mx.nd.array(np.array([7.0, 8.0]))

# calculate output based on the input and parameters
p = out.bind(ctx = mx.cpu(), args = {'inp':x, 'out_weight':w, 'out_bias':b})
print(p.forward()[0].asnumpy())

现在,如果我想在其上添加一个 SoftMax 变换,我需要执行以下操作:

# define the cost function
target = mx.sym.Variable(name = 'target')
cost = mx.symbol.SoftmaxOutput(out, target, name='softmax')

y = mx.nd.array(np.array([[1.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 0.0], [0.0, 1.0]]))
c = cost.bind(ctx = mx.cpu(), args = {'inp':x, 'out_weight':w, 'out_bias':b, 'target':y})
print(c.forward()[0].asnumpy())

我不明白的是,为什么我们需要创建符号变量target。我们只有在计算成本时才需要它,但到目前为止,我们只是根据输入计算输出(通过线性变换和 SoftMax)。

此外,我们需要为目标提供一个数值来计算输出。所以,看起来它是必需的,但它没有被使用(目标的提供值不会改变输出的值)。

最后,我们可以使用 cost 对象来定义一个模型,一旦我们有数据就可以拟合该模型。但是成本函数呢?它必须被指定,但它不是。基本上,看起来我只是因为使用 SoftMax 而被迫使用特定的成本函数。但是为什么?

已添加

更多统计/数学观点请查看here。尽管当前的问题本质上更务实/程序化。它基本上是:如何解耦 MXNEt 中的输出非线性和成本函数。例如,我可能想做一个线性变换,然后通过最小化绝对偏差而不是平方偏差来找到模型参数。

如果你只想要softmax,你可以使用mx.sym.softmax()mx.sym.SoftmaxOutput() 包含用于计算交叉熵梯度(负对数损失)的有效代码,这是与 softmax 一起使用的最常见损失。如果您想使用自己的损失,只需使用 softmax 并在训练期间在顶部添加损失。我应该注意,如果你真的想的话,你也可以在推理过程中用一个简单的 softmax 替换 SoftmaxOutput 层。