Keras混合型号

Rez*_*a R 13 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
Run Code Online (Sandbox Code Playgroud)

Arn*_*d P 11

模型

你肯定可以在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)
Run Code Online (Sandbox Code Playgroud)

自定义目标

这是您描述的目标的实现.但是要记住一些数学问题(见下文).

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)
Run Code Online (Sandbox Code Playgroud)

一些数学

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

对于任何x,sum(g(x)) = 1

对于任何人来说x,g0(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) > 0g1(x) > 0).

收敛

在这里,一个更重要的问题是,这一目标似乎并没有被设计成将朝着0时mlp1mlp2开始预测y正确(盒2),目前还没有办法来防止优化器产生sum(g(x))趋向+infinite,做出loss趋向-inifinite.

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