多元微积分_散度3.高维散度

上一节我们推导 了二维的散度公式

在这里插入图片描述
观察这个公式,我们还可以表示成梯度与向量v的点积

在这里插入图片描述
我们知道梯度里面包含了所有分量的偏导信息

也就是我们可以将维度推到更高维,用梯度来封装所有分量的偏导

在这里插入图片描述
但是 ∇ \nabla 并不是一个向量或者一个函数,只是为了方便理解和记忆
在这里插入图片描述
在这里插入图片描述
点积就是对应位置相乘再求和

在这里插入图片描述
这里的乘以其实是

∂ ∂ x ∗ P ( x , y ) = ∂ ∗ P ( x , y ) ∂ x \frac{\partial}{\partial x}*P(x,y)=\frac{\partial* P(x,y)}{\partial x} xP(x,y)=xP(x,y)

∂ ∂ x ∗ Q ( x , y ) = ∂ ∗ Q ( x , y ) ∂ x \frac{\partial}{\partial x}*Q(x,y)=\frac{\partial* Q(x,y)}{\partial x} xQ(x,y)=xQ(x,y)

乘积才是取偏导
在这里插入图片描述
在这里插入图片描述
以上 用梯度表示后,推导到高维就很容易理解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

帮我给每一行代码添加注释 class DeepKalmanFilter(nn.Module): def __init__(self, config): super(DeepKalmanFilter, self).__init__() self.emitter = Emitter(config.z_dim, config.emit_hidden_dim, config.obs_dim) self.transition = Transition(config.z_dim, config.trans_hidden_dim) self.posterior = Posterior( config.z_dim, config.post_hidden_dim, config.obs_dim ) self.z_q_0 = nn.Parameter(torch.zeros(config.z_dim)) self.emit_log_sigma = nn.Parameter(config.emit_log_sigma * torch.ones(config.obs_dim)) self.config = config @staticmethod def reparametrization(mu, sig): return mu + torch.randn_like(sig) * sig @staticmethod def kl_div(mu0, sig0, mu1, sig1): return -0.5 * torch.sum(1 - 2 * sig1.log() + 2 * sig0.log() - (mu1 - mu0).pow(2) / sig1.pow(2) - (sig0 / sig1).pow(2)) def loss(self, obs): time_step = obs.size(1) batch_size = obs.size(0) overshoot_len = self.config.overshooting kl = torch.Tensor([0]).to(self.config.device) reconstruction = torch.Tensor([0]).to(self.config.device) emit_sig = self.emit_log_sigma.exp() for s in range(self.config.sampling_num): z_q_t = self.z_q_0.expand((batch_size, self.config.z_dim)) for t in range(time_step): trans_loc, trans_sig = self.transition(z_q_t) post_loc, post_sig = self.posterior(trans_loc, trans_sig, obs[:, t]) z_q_t = self.reparametrization(post_loc, post_sig) emit_loc = self.emitter(z_q_t) reconstruction += ((emit_loc - obs[:, t]).pow(2).sum(dim=0) / 2 / emit_sig + self.emit_log_sigma * batch_size / 2).sum() if t > 0: over_loc, over_sig = self.transition(overshooting[:overshoot_len - 1]) over_loc = torch.cat([trans_loc.unsqueeze(0), over_loc], dim=0) over_sig = torch.cat([trans_sig.unsqueeze(0), over_sig], dim=0) else: over_loc = trans_loc.unsqueeze(0) over_sig = trans_sig.unsqueeze(0) overshooting = self.reparametrization(over_loc, over_sig) kl = kl + self.kl_div(post_loc.expand_as(over_loc), post_sig.expand_as(over_sig), over_loc, over_sig) / min(t + 1, self.config.overshooting) reconstruction = reconstruction / self.config.sampling_num kl = kl / self.config.sampling_num return reconstruction, kl
最新发布
02-22
答:class DeepKalmanFilter(nn.Module): # 定义深度Kalman滤波器类 def __init__(self, config): # 初始化 super(DeepKalmanFilter, self).__init__() # 调用父类构造函数 self.emitter = Emitter(config.z_dim, config.emit_hidden_dim, config.obs_dim) # 实例化发射器 self.transition = Transition(config.z_dim, config.trans_hidden_dim) # 实例化转换器 self.posterior = Posterior(config.z_dim, config.post_hidden_dim, config.obs_dim) # 实例化后验概率 self.z_q_0 = nn.Parameter(torch.zeros(config.z_dim)) # 设置参数z_q_0 self.emit_log_sigma = nn.Parameter(config.emit_log_sigma * torch.ones(config.obs_dim)) # 发射标准差参数 self.config = config # 配置参数 @staticmethod def reparametrization(mu, sig): # 重置参数 return mu + torch.randn_like(sig) * sig # 根据均值和标准差重置参数 @staticmethod def kl_div(mu0, sig0, mu1, sig1): # 计算KL散度 return -0.5 * torch.sum(1 - 2 * sig1.log() + 2 * sig0.log() - (mu1 - mu0).pow(2) / sig1.pow(2) - (sig0 / sig1).pow(2)) # 计算KL散度 def loss(self, obs): # 损失函数 time_step = obs.size(1) # 观测序列的时间步数 batch_size = obs.size(0) # 批量大小 overshoot_len = self.config.overshooting # 超调量 kl = torch.Tensor([0]).to(self.config.device) # kl散度 reconstruction = torch.Tensor([0]).to(self.config.device) # 构建重构误差 emit_sig = self.emit_log_sigma.exp() # 发射标准差 for s in range(self.config.sampling_num): # 采样次数 z_q_t = self.z_q_0.expand((batch_size, self.config.z_dim)) # 估计量初始化 for t in range(time_step): # 遍历每一时刻 trans_loc, trans_sig = self.transition(z_q_t) # 更新转换器 post_loc, post_sig = self.posterior(trans_loc, trans_sig, obs[:, t]) # 更新后验概率 z_q_t = self.reparametrization(post_loc, post_sig) # 重新参数化 emit_loc = self.emitter(z_q_t) # 计算发射器 reconstruction += ((emit_loc - obs[:, t]).pow(2).sum(dim=0) / 2 / emit_sig + self.emit_log_sigma * batch_size / 2).sum() # 计算重构误差 if t > 0: # 如果不是第一步 over_loc, over_sig = self.transition(overshooting[:overshoot_len - 1]) # 计算超调量 over_loc = torch.cat([trans_loc.unsqueeze(0), over_loc], dim=0) # 转换器的位置 over_sig = torch.cat([trans_sig.unsqueeze(0), over_sig], dim=0) # 转换器的协方差 else: # 如果是第一步 over_loc = trans_loc.unsqueeze(0) # 转换器的位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值