是否有可能在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
模型
你肯定可以在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)
一些数学
简短版本:在你的模型的某个地方,我认为应该至少有一个约束(可能是两个):
任何 x
, sum(g(x)) = 1
任何 x
, g0(x) > 0 and g1(x) > 0
#可能不是绝对必要的
领域研究
如果 o1(x)
和 o2(x)
是无限的 远 从 y
:
- exp期限倾向于+0
A -> B -> +-0
取决于 g0(x)
和 g1(x)
迹象
cost -> +infinite
要么 nan
如果 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