【隨感】在Keras中如何按最大似然(Max Likewood)訓練模型
阿新 • • 發佈:2018-12-17
在Keras中如何按最大似然(Max Likewood)訓練模型
按照生成模型的思路,模型的引數是和資料分佈無關的,利用極大似然準則就可以訓練模型。但是在類似Keras這種神經網路庫中,如何訓練類似如下的目標函式:
其中類似這樣的對映的取樣是困難的(你不能將一次/多次前向傳播的結果就當做是取樣的結果),必須以極大量的前向傳播結果才能逼近這個分佈(大數定律)。下面將介紹一種替代方案,也就是將證明可以用KL散度 (Kullback–Leibler divergence)代替最大似然模型。
最大似然的損失函式:
優化目標即為,假設真實資料分佈服從,那麼引數的風險期望為:
由於真實資料分佈是,那麼是給定的,那麼在時是最小的且為.
因此我們在訓練時採用Keras自帶的crossentropy即可:
from keras.layers import Input,Embedding,LSTM,Dense
from keras.models import Model
from keras import backend as K
word_size = 128
dim_hidden = 100
dim_action = 10
dim_value = 10
encode_size = 64
input = Input(shape=(None,))
embedded = Embedding(dim_hidden,word_size)(input)
encoder = LSTM(encode_size)(embedded)
predict_action = Dense(dim_action)(encoder)
predict_value = Dense(dim_value)(encoder)
def object1(y_true, y_pred, eta=0.2):
loss1 = K.categorical_crossentropy(y_true, y_pred)
return K.log(loss1)
def object2(y_true, y_pred, eta=0.2):
loss2 = K.categorical_crossentropy(y_true, y_pred)
return eta*loss2
model = Model(inputs=input, outputs=[predict_action,predict_value])
model.compile(optimizer='adam', loss=[object1,object2])