【随感】在Keras中如何按最大似然(Max Likewood)训练模型

本文探讨了在Keras框架下使用最大似然方法训练模型的替代方案,通过引入KL散度的概念,证明了其等价性,并提供了具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Keras中如何按最大似然(Max Likewood)训练模型


按照生成模型的思路,模型的参数是和数据分布无关的,利用极大似然准则就可以训练模型。但是在类似Keras这种神经网络库中,如何训练类似如下的目标函数:

− E o [ t ] , l [ log ⁡ π θ ( a [ t ] ∣ o [ t ] , h [ t − 1 ] , l ) ) + η v θ ( o [ t ] , h [ t − 1 ] , l ) ] -\mathbb{E}_{{o}^{[t]},{l}} [ { \log\pi_{\theta}(a^{[t]}|{o}^{[t]},{h}^{[t-1]},{l})) } + { \eta v_{\theta}({o}^{[t]},{h}^{[t-1]},{l})} ] Eo[t],l[logπθ(a[t]o[t],h[t1],l))+ηvθ(o[t],h[t1],l)]

其中类似 π θ ( a [ t ] ∣ o [ t ] , h [ t − 1 ] , l ) ) \pi_{\theta}(a^{[t]}|{o}^{[t]},{h}^{[t-1]},{l})) πθ(a[t]o[t],h[t1],l))这样的映射的采样是困难的(你不能将一次/多次前向传播的结果就当做是采样的结果),必须以极大量的前向传播结果才能逼近这个分布(大数定律)。下面将介绍一种替代方案,也就是将证明可以用KL散度 (Kullback–Leibler divergence)代替最大似然模型。

最大似然的损失函数:
L ( θ , x ) = − l o g ( P θ ( x ) ) \mathcal{L}(\theta,x) = -log(\mathcal{P}_{\theta}(x)) L(θ,x)=log(Pθ(x))

优化目标即为 θ = min ⁡ θ − l o g ( P θ ( x ) ) \theta=\min_{\theta} -log(\mathcal{P}_{\theta}(x)) θ=minθlog(Pθ(x)),假设真实数据分布服从 x ∼ Q ( x ) x \sim \mathcal{Q}(x) xQ(x),那么参数 θ \theta θ的风险期望为:

E x [ L ( θ , x ) ] = − ∑ x Q ( x ) l o g ( P θ ( x ) ) = ∑ x Q ( x ) l o g ( Q ( x ) / P θ ( x ) ) ⎵ D K L ( Q ∣ ∣ P ) + ∑ x Q ( x ) l o g ( 1 / Q ( x ) ⎵ H ( Q ) ) \mathbb{E}_{x}[\mathcal{L}(\theta,x)]=-\sum_{x}\mathcal{Q}(x) log(\mathcal{P}_{\theta}(x)) \\ = \underbrace{\sum_{x}\mathcal{Q}(x) log( { \mathcal{Q}(x) }/{ \mathcal{P}_{\theta}(x) })}_{D_{KL}(\mathcal{Q}||\mathcal{P}) } + \underbrace{\sum_{x}\mathcal{Q}(x) log( {1}/{ \mathcal{Q}(x) }}_{H(\mathcal{Q})} ) Ex[L(θ,x)]=xQ(x)log(Pθ(x))=DKL(QP) xQ(x)log(Q(x)/Pθ(x))+H(Q) xQ(x)log(1/Q(x))

由于真实数据分布是 Q ( x ) \mathcal{Q}(x) Q(x),那么 H ( Q ) H(\mathcal{Q}) H(Q)是给定的,那么 E x [ L ( θ , x ) ] \mathbb{E}_{x}[\mathcal{L}(\theta,x)] Ex[L(θ,x)] Q = P θ \mathcal{Q}=\mathcal{P_{\theta}} Q=Pθ时是最小的且为 0 0 0.

因此我们在训练时采用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])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值