问题 Keras混合型号


是否有可能在Keras实施专家方法的MLP混合物? 您能否通过Keras中的简单代码向我指导2位专家的二进制问题。

它需要定义一个这样的成本函数:

g = gate.layers[-1].output
o1 = mlp1.layers[-1].output
o2 = mlp2.layers[-1].output

def ME_objective(y_true, y_pred):
    A = g[0] * T.exp(-0.5*T.sqr(y_true – o1))
    B = g[1] * T.exp(-0.5*T.sqr(y_true – o2))
    return -T.log((A+B).sum())  # cost

11057
2017-10-16 19:50


起源

嗯,你想训练一个分类器吗? g 其任务是组合两个“子”分类器的输出 o1 和 o2 ? - Arnaud P
嗨,我有2个MLP专家,一个神经元输出(o1expert1输出和o2专家2输出),还有1个MLP选通网络,有两个神经元输出(g [0],g [1])。在转发过程中,o1 * g [0] + o2 * g [1]是模型的最终输出。这个模型是端到端训练的,损失函数就像上面那样。我可以通过theano和keras实现这个方法吗? - Reza R
MLP专家和MLP门是深层模型。 - Reza R


答案:


模型

你肯定可以在Keras模拟这样的结构 合并层,使您可以组合不同的输入。 这里有一个 SSCCE 你希望能够适应你的结构

import numpy as np
from keras.engine import Merge
from keras.models import Sequential
from keras.layers import Dense
import keras.backend as K

xdim = 4
ydim = 1
gate = Sequential([Dense(2, input_dim=xdim)])
mlp1 = Sequential([Dense(1, input_dim=xdim)])
mlp2 = Sequential([Dense(1, input_dim=xdim)])


def merge_mode(branches):
    g, o1, o2 = branches
    # I'd have liked to write
    # return o1 * K.transpose(g[:, 0]) + o2 * K.transpose(g[:, 1])
    # but it doesn't work, and I don't know enough Keras to solve it
    return K.transpose(K.transpose(o1) * g[:, 0] + K.transpose(o2) * g[:, 1])


model = Sequential()
model.add(Merge([gate, mlp1, mlp2], output_shape=(ydim,), mode=merge_mode))
model.compile(optimizer='Adam', loss='mean_squared_error')

train_size = 19
nb_inputs = 3  # one input tensor for each branch (g, o1, o2)
x_train = [np.random.random((train_size, xdim)) for _ in range(nb_inputs)]
y_train = np.random.random((train_size, ydim))
model.fit(x_train, y_train)

自定义目标

这是您描述的目标的实现。有几个 数学问题 但要记住(见下文)。

def me_loss(y_true, y_pred):
    g = gate.layers[-1].output
    o1 = mlp1.layers[-1].output
    o2 = mlp2.layers[-1].output
    A = g[:, 0] * K.transpose(K.exp(-0.5 * K.square(y_true - o1)))
    B = g[:, 1] * K.transpose(K.exp(-0.5 * K.square(y_true - o2)))
    return -K.log(K.sum(A+B))

# [...] edit the compile line from above example
model.compile(optimizer='Adam', loss=me_loss)

一些数学

简短版本:在你的模型的某个地方,我认为应该至少有一个约束(可能是两个):

任何 xsum(g(x)) = 1

任何 xg0(x) > 0 and g1(x) > 0  #可能不是绝对必要的

领域研究

  1. 如果 o1(x) 和 o2(x) 是无限的  从 y

    • exp期限倾向于+0
    • A -> B -> +-0  取决于 g0(x) 和 g1(x) 迹象
    • cost -> +infinite 要么 nan
  2. 如果 o1(x) 和 o2(x) 是无限的  至 y

    • exp期限倾向于1
    • A -> g0(x) 和 B -> g1(x)
    • cost -> -log(sum(g(x)))

问题是 log 仅定义于 ]0, +inf[。这意味着,为了始终定义目标,需要在某处确保约束 sum(A(x) + B(x)) > 0 对于 任何  x。该约束的限制性更强的版本是(g0(x) > 0 和 g1(x) > 0)。

收敛

这里一个更重要的问题是,这个目标似乎并没有设计成向0收敛 mlp1 和 mlp2 开始预测 y 正确(情况2),目前没有什么阻止优化器做 sum(g(x)) 倾向于 +infinite,使 loss 倾向于 -inifinite

理想情况下,我们愿意 loss -> 0,即 sum(g(x)) -> 1


11
2017-10-18 12:57



嗨,my_mode fun会在您需要一些调试之前生成以下错误: - Reza R
例外:合并层merge_1具有可调用性 mode 参数,我们不能推断它的输出形状,因为没有 output_shape 提供了参数。确保传递一个形状元组(或一个可调用的) output_shape 合并。 - Reza R
用一个实例来编辑我的问题。您可能需要对其进行调整以使其与您自己的3个分支一起使用。至少就输入维度而言;)我可能会花更多的时间来尝试实现您的自定义目标,我会告诉您 - Arnaud P
谢谢亲爱的Amaud - Reza R
目标也是如此。花了我一些时间来写数学问题,但它很有趣:) - Arnaud P