deep generative model stanford lecture note3 --- latent variable

1 Introduction

自回归模型随着gpt的出现取得很大的成功,还是有很多工程上的问题并不是很适合使用自回归模型:
1)自回归需要的算力太大,满足不了实时性要求:例如在自动驾驶的轨迹预测任务中,如果要用纯自回归的世界模型,耗时太大;
2)要求数据天然有时序性:很多图像任务并没有严格的序列生成的要求;
这个部分开始用隐变量的方式来进行建模。

2 特征提取和线形回归

自动驾驶和机器人中的很多任务,是通过感知的环境输入, 然后进行特征提取,最后用线形回归来预测和生成指令。

在这里插入图片描述
但是这种方式因为采用了非常简单的单高斯分布来估计指令,这个时候有几种提高的方式:
1)提高特征的表达能力
1.1)如果特征提取的模型(一般是transformer)记忆力足够强大,哪怕后面接了单峰高斯估计也能有一个比较好的拟合效果;直觉来说,就是把所有的情况都记住了。高质量的特征能够在一定程度上“预处理”复杂性。
1.2)采用anchor based的query来生成不同的feature,降低拟合难度。
2)提高概率分布的表达能力
2.1)采用混合高斯叠加的概率分布,来生成复杂的概率分布。
因为提高特征表达能力往往是多模态相关的工作,这里我门进行跳过,更加关注通过提高概率分布的表达能力这个方面。

3 vae 模型

z是隐变量,需要用模型构建z存在的情况下 p ( x ∣ z , θ ) p(x|z,\theta) p(xz,θ)的概率。
在这里插入图片描述
按照note2的内容,loss设计的时候,满足极大似然就可以 l o g P θ ( x ) logP_{\theta}(x) logPθ(x)
现在的问题是,每种z都有一定的概率能生成x。可以采用普查的方式,或者采用抽样的方式

l o g P θ ( x ) = 1 D ( z ) ∑ z ∈ D P ( x , z ; θ ) \begin{aligned} logP_{\theta}(x)=\frac{1}{D(z)}\sum_{z \in D}P(x,z;\theta) \end{aligned} logPθ(x)=D(z)1zDP(x,z;θ)

因为z本身是连续分布,如果采用普查的方式也不太现实,不过我们可以随便搞一个抽样方式q(z)。

l o g P θ ( x ) = l o g ∑ j = 1 k q ( z ( j ) ) q ( z ( j ) ) P ( x , z ; θ ) = l o g E x − q ( z ) P ( x , z ; θ ) q ( z ( j ) ) \begin{aligned} logP_{\theta}(x) & = log\sum_{j=1}^k \frac{q(z^{(j)})}{q(z^{(j)})} P(x,z;\theta) \\ & = logE_{x-q(z)}\frac{P(x,z;\theta)}{q(z^{(j)})} \end{aligned} logPθ(x)=logj=1kq(z(j))q(z(j))P(x,z;θ)=logExq(z)q(z(j))P(x,z;θ)

在这里插入图片描述
对于log这种凸函数,满足 l o g E [ x ] > E [ l o g ( x ) ] logE[x]>E[log(x)] logE[x]>E[log(x)],可以对上面这个式子进行变换
l o g P θ ( x ) = l o g E x − q ( z ) P ( x , z ; θ ) q ( z ( j ) ) ≥ E x − q ( z ) l o g P ( x , z ; θ ) q ( z ( j ) ) = ∑ j = 1 k q ( z ( j ) ) l o g P ( x , z ; θ ) q ( z ( j ) ) = ∑ j = 1 k ( q ( z ( j ) ) l o g P ( x , z ; θ ) − q ( z ( j ) ) l o g q ( z ( j ) ) ) = E L B O \begin{aligned} logP_{\theta}(x) & = logE_{x-q(z)}\frac{P(x,z;\theta)}{q(z^{(j)})} \\ & \ge E_{x-q(z)}log\frac{P(x,z;\theta)}{q(z^{(j)})} \\ & = \sum_{j=1}^kq(z^{(j)})log\frac{P(x,z;\theta)}{q(z^{(j)})} \\ & = \sum_{j=1}^k(q(z^{(j)})logP(x,z;\theta)-q(z^{(j)})logq(z^{(j)}))=ELBO \end{aligned} logPθ(x)=logExq(z)q(z(j))P(x,z;θ)Exq(z)logq(z(j))P(x,z;θ)=j=1kq(z(j))logq(z(j))P(x,z;θ)=j=1k(q(z(j))logP(x,z;θ)q(z(j))logq(z(j)))=ELBO

我们可以来研究一下随机的抽样概率分布q(z|x)和p(z|x;\theta)的概率分布的差异。
D K L ( q ( z ) ∣ ∣ p ( z ∣ x ; θ ) ) = ∑ z q ( z ∣ x ) l o g q ( z ∣ x ) p ( z ∣ x ; θ ) = ∑ z q ( z ∣ x ) l o g q ( z ∣ x ) p ( z , x ; θ ) / p ( x ; θ ) = ∑ z ( q ( z ∣ x ) l o g q ( z ∣ x ) + q ( z ∣ x ) l o g p ( x ; θ ) − q ( z ∣ x ) l o g p ( x , z ; θ ) ) = ∑ z q ( z ∣ x ) l o g p ( x ; θ ) − ∑ z ( q ( z ∣ x ) l o g q ( z ∣ x ) − q ( z ∣ x ) l o g p ( x , z ; θ ) ) = l o g p ( x ; θ ) − ∑ j = 1 k ( q ( z ( j ) ) l o g P ( x , z ; θ ) − q ( z ( j ) ) l o g q ( z ( j ) ) ) \begin{aligned} D_{KL}(q(z)||p(z|x;\theta))&=\sum_z q(z|x)log\frac{q(z|x)}{p(z|x;\theta)} \\ & = \sum_z q(z|x)log\frac{q(z|x)}{p(z,x;\theta)/p(x;\theta)} \\ & = \sum_z (q(z|x)logq(z|x)+q(z|x)logp(x;\theta)-q(z|x)logp(x,z;\theta)) \\ & = \sum_z q(z|x)logp(x;\theta) - \sum_z (q(z|x)logq(z|x)-q(z|x)logp(x,z;\theta)) \\ & = logp(x;\theta)- \sum_{j=1}^k(q(z^{(j)})logP(x,z;\theta)-q(z^{(j)})logq(z^{(j)})) \end{aligned} DKL(q(z)∣∣p(zx;θ))=zq(zx)logp(zx;θ)q(zx)=zq(zx)logp(z,x;θ)/p(x;θ)q(zx)=z(q(zx)logq(zx)+q(zx)logp(x;θ)q(zx)logp(x,z;θ))=zq(zx)logp(x;θ)z(q(zx)logq(zx)q(zx)logp(x,z;θ))=logp(x;θ)j=1k(q(z(j))logP(x,z;θ)q(z(j))logq(z(j)))
这个式子说明了 l o g p ( x ; θ ) − D K L ( p ( z ∣ x ; θ ) ∣ ∣ q ( z ) ) = E L B O logp(x;\theta)-D_{KL}(p(z|x;\theta)||q(z))=ELBO logp(x;θ)DKL(p(zx;θ)∣∣q(z))=ELBO
在这里插入图片描述

现在我们来更新一下极大似然
l o g P θ ( x ) = ∑ z ( q ( z ∣ x ) l o g P ( x , z ; θ ) − q ( z ∣ x ) l o g q ( z ∣ x ) ) − D K L ( q ( z ∣ x ) ∣ ∣ p ( z ∣ x ; θ ) ) \begin{aligned} logP_{\theta}(x) & = \sum_{z}(q(z|x)logP(x,z;\theta)-q(z|x)logq(z|x)) - D_{KL}(q(z|x)||p(z|x;\theta))\\ \end{aligned} logPθ(x)=z(q(zx)logP(x,z;θ)q(zx)logq(zx))DKL(q(zx)∣∣p(zx;θ))
现在核心的问题来了, p ( z ∣ x ; θ ) p(z|x;\theta) p(zx;θ)的真值是什么,没有人知道!!!这意味着,我们无法教模型去学这个分布。
这里涉及了一些先验和后验的基本概念。
我们的先验知识是q(z|x)应该是标准正态分布 N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1),但是实际的q(z|x)没人知道。
q(z|x)既然我们知道是标准正态分布,那么我们就可以用模型来学习,可以表示成 q ( z ∣ x , ϕ ) q(z|x,\phi) q(zx,ϕ)
那么 D K L ( q ( z ∣ x ) ∣ ∣ p ( z ∣ x ; θ ) ) D_{KL}(q(z|x)||p(z|x;\theta)) DKL(q(zx)∣∣p(zx;θ))的结果,我们祈祷数据的后验分布是真的符合高斯分布。也就是一般vae计算极大似然的时候只需要考虑ELBO.

对于ELBO,这里只能采用mento carlo的方式进行采样计算
z ( k ) = μ ϕ ( x ) + σ ϕ ( x ) ϵ , ϵ ∼ N ( 0 , 1 ) z^{(k)}=\mu_{\phi}(x)+\sigma_{\phi}(x)ϵ, ϵ \sim \mathcal{N}(0, 1) z(k)=μϕ(x)+σϕ(x)ϵ,ϵN(0,1)

那么极大似然可以更新成,现在还有个问题,vae的decoder只能给出p(x|z)的概率,所以我们还需要继续修改。
E L B O = 1 K ∑ k l o g P ( x , z ( k ) ; θ ) − l o g q ( z ( k ) ∣ x ; ϕ ) ) = 1 K ∑ k l o g P ( x ∣ z ( k ) , θ ) + l o g P ( z ( k ) ) − l o g q ( z ( k ) ∣ x , ϕ ) = 1 K ∑ k l o g P ( x ∣ z ( k ) , θ ) − D K L ( q ( z ∣ x , ϕ ) ∣ ∣ P ( z ) ) \begin{aligned} ELBO & =\frac{1}{K} \sum_{k}logP(x,z^{(k)};\theta)-logq(z^{(k)}|x;\phi))\\ & = \frac{1}{K}\sum_k logP(x|z^{(k)},\theta)+logP(z^{(k)})-logq(z^{(k)}|x,\phi) \\ & = \frac{1}{K}\sum_k logP(x|z^{(k)},\theta)-D_{KL}(q(z|x,\phi)||P(z)) \end{aligned} ELBO=K1klogP(x,z(k);θ)logq(z(k)x;ϕ))=K1klogP(xz(k),θ)+logP(z(k))logq(z(k)x,ϕ)=K1klogP(xz(k),θ)DKL(q(zx,ϕ)∣∣P(z))

P(z)是标准正态分布,KL散度可以积分直接得到解析解,这里直接给出公式的结果
D K L ( q ϕ ( z ∣ x ) ∣ ∣ P ( z ) ) = D K L ( N ( μ , σ ) ∣ ∣ N ( 0 , 1 ) ) = 1 2 ∑ i ( σ i 2 + μ i 2 − 1 − l n σ i 2 ) \begin{aligned} D_{KL}(q_{\phi}(z|x)||P(z)) & = D_{KL}(\mathcal{N}(\mu, \sigma)||\mathcal{N}(0, 1)) \\ & = \frac{1}{2}\sum_i(\sigma_i^2+\mu_i^2-1-ln\sigma_i^2) \end{aligned} DKL(qϕ(zx)∣∣P(z))=DKL(N(μ,σ)∣∣N(0,1))=21i(σi2+μi21lnσi2)

4 cvae实例分析

aloha作为机器人模仿学习的重要的一项工作[1],在他们的工作中使用了cvae,让我们来看一下它是如何设计的。

4.1 encoder

可以看到 q ( z ∣ x , ϕ ) q(z|x,\phi) q(zx,ϕ) 用的是transformer的cls query, 再经过一个mlp,得到 μ , 和 σ \mu,和\sigma μ,σ

  action_embed = self.encoder_action_proj(actions) # (bs, seq, hidden_dim)
  qpos_embed = self.encoder_joint_proj(qpos)  # (bs, hidden_dim)
  qpos_embed = torch.unsqueeze(qpos_embed, axis=1)  # (bs, 1, hidden_dim)
  cls_embed = self.cls_embed.weight # (1, hidden_dim)
  cls_embed = torch.unsqueeze(cls_embed, axis=0).repeat(bs, 1, 1) # (bs, 1, hidden_dim)
  encoder_input = torch.cat([cls_embed, qpos_embed, action_embed], axis=1) # (bs, seq+1, hidden_dim)
  encoder_input = encoder_input.permute(1, 0, 2) # (seq+1, bs, hidden_dim)
  # do not mask cls token
  cls_joint_is_pad = torch.full((bs, 2), False).to(qpos.device) # False: not a padding
  is_pad = torch.cat([cls_joint_is_pad, is_pad], axis=1)  # (bs, seq+1)
  # obtain position embedding
  pos_embed = self.pos_table.clone().detach()
  pos_embed = pos_embed.permute(1, 0, 2)  # (seq+1, 1, hidden_dim)
  # query model
  encoder_output = self.encoder(encoder_input, pos=pos_embed, src_key_padding_mask=is_pad)
  encoder_output = encoder_output[0] # take cls output only
  latent_info = self.latent_proj(encoder_output)
  mu = latent_info[:, :self.latent_dim]
  logvar = latent_info[:, self.latent_dim:]
  latent_sample = reparametrize(mu, logvar)
  latent_input = self.latent_out_proj(latent_sample)

4.2 decoder

decoder 这里采用的是标准的detr,先将所有的conditional的信息融合latent_feature先经过transformer encoder,然后用一个query 过一个transformer decoder,得到feature, 然后直接出action,这里输出没有用高斯分布。

 if self.backbones is not None:
     # Image observation features and position embeddings
     all_cam_features = []
     all_cam_pos = []
     for cam_id, cam_name in enumerate(self.camera_names):
         features, pos = self.backbones[0](image[:, cam_id]) # HARDCODED
         features = features[0] # take the last layer feature
         pos = pos[0]
         all_cam_features.append(self.input_proj(features))
         all_cam_pos.append(pos)
     # proprioception features
     proprio_input = self.input_proj_robot_state(qpos)
     # fold camera dimension into width dimension
     src = torch.cat(all_cam_features, axis=3)
     pos = torch.cat(all_cam_pos, axis=3)
     hs = self.transformer(src, None, self.query_embed.weight, pos, latent_input, proprio_input, self.additional_pos_embed.weight)[0]
 else:
     qpos = self.input_proj_robot_state(qpos)
     env_state = self.input_proj_env_state(env_state)
     transformer_input = torch.cat([qpos, env_state], axis=1) # seq length = 2
     hs = self.transformer(transformer_input, None, self.query_embed.weight, self.pos.weight)[0]
 a_hat = self.action_head(hs)
 is_pad_hat = self.is_pad_head(hs)

4.3 loss

loss和极大似然是相反的,所以在
l o s s = 1 K ∑ k − l o g P ( x ∣ z ( k ) , θ ) + D K L ( q ( z ∣ x , ϕ ) ∣ ∣ P ( z ) ) loss=\frac{1}{K}\sum_k -logP(x|z^{(k)},\theta)+D_{KL}(q(z|x,\phi)||P(z)) loss=K1klogP(xz(k),θ)+DKL(q(zx,ϕ)∣∣P(z))
也就是说在loss中直接计算 D K L ( q ( z ∣ x , ϕ ) ∣ ∣ P ( z ) ) D_{KL}(q(z|x,\phi)||P(z)) DKL(q(zx,ϕ)∣∣P(z))
对应代码

def kl_divergence(mu, logvar):
    batch_size = mu.size(0)
    assert batch_size != 0
    if mu.data.ndimension() == 4:
        mu = mu.view(mu.size(0), mu.size(1))
    if logvar.data.ndimension() == 4:
        logvar = logvar.view(logvar.size(0), logvar.size(1))

    klds = -0.5 * (1 + logvar - mu.pow(2) - logvar.exp())
    total_kld = klds.sum(1).mean(0, True)
    dimension_wise_kld = klds.mean(0)
    mean_kld = klds.mean(1).mean(0, True)

    return total_kld, dimension_wise_kld, mean_kld

正常来说,
∑ k − l o g P ( x ∣ z ( k ) , θ ) = ∑ k − l o g 1 2 π σ e − ( x − μ ) 2 / ( 2 σ 2 ) = ∑ k ( x − μ ) 2 / ( 2 σ 2 ) \begin{aligned} \sum_k-logP(x|z^{(k)},\theta) &=\sum_k-log\frac{1}{\sqrt{2\pi}\sigma}e^{-(x-\mu)^2/(2\sigma^2)}\\ &=\sum_k(x-\mu)^2/(2\sigma^2) \end{aligned} klogP(xz(k),θ)=klog2π σ1e(xμ)2/(2σ2)=k(xμ)2/(2σ2)
这里act policy因为vae decoder没有输出 σ \sigma σ,默认就是1了。

a_hat, is_pad_hat, (mu, logvar) = self.model(qpos, image, env_state, actions, is_pad)
total_kld, dim_wise_kld, mean_kld = kl_divergence(mu, logvar)
loss_dict = dict()
all_l1 = F.l1_loss(actions, a_hat, reduction='none')
l1 = (all_l1 * ~is_pad.unsqueeze(-1)).mean()
loss_dict['l1'] = l1
loss_dict['kl'] = total_kld[0]
loss_dict['loss'] = loss_dict['l1'] + loss_dict['kl'] * self.kl_weight

4.4 vae decoder 的重参数化

act policy对于z只采样了一次,没有多重采样。

latent_sample = reparametrize(mu, logvar)
latent_input = self.latent_out_proj(latent_sample)

def reparametrize(mu, logvar):
    std = logvar.div(2).exp()
    eps = Variable(std.data.new(std.size()).normal_())
    return mu + std * eps

References

[1] https://tonyzhaozh.github.io/aloha/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32_SD卡的SDIO通信_DMA读写

本篇,将使用CubeMXKeil,创建一个SD卡的DMA读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果,如下图: 一、简述 上篇已简单介绍了SD、SDIO,本篇不再啰嗦,…

互联网行业常用12个数据分析指标和八大模型

本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据(4个) (1) 存量(DAU/MAU) (2) 新增用户 (3) 健康程度(留存率) (4) 渠道来源 2. 用户行为数据(4个) (1) 次数/频率…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网:www.acvra.org 简介 2025年计算机视觉研究进展与应用(ACVRA 2025)将于2025年2月28-3月2日在中国广州召开,将汇聚世界各地的顶尖学者、研究人员和行业专家,聚焦计算机视觉领域的最新研究动态与应用成就。本次…

【Unity踩坑】Unity项目管理员权限问题(Unity is running as administrator )

问题描述: 使用Unity Hub打开或新建项目时会有下面的提示。 解决方法: 打开“本地安全策略”: 在Windows搜索栏中输入secpol.msc并回车,或者从“运行”对话框(Win R,然后输入secpol.msc)启…

开发板上Qt运行的环境变量的三条设置语句的详解

在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量: export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器,使用PyQt5框架构建。以下是代码的主要功能和特点: 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…

Java 数据库连接池:HikariCP 与 Druid 的对比

Java 数据库连接池:HikariCP 与 Druid 的对比 数据库连接池:HikariCP 1. 卓越的性能表现 HikariCP 在数据库连接池领域以其卓越的性能脱颖而出。 其字节码经过精心优化,减少了不必要的开销,使得连接获取和释放的速度极快。 在…

PHP实现混合加密方式,提高加密的安全性(代码解密)

代码1&#xff1a; <?php // 需要加密的内容 $plaintext 授权服务器拒绝连接;// 1. AES加密部分 $aesKey openssl_random_pseudo_bytes(32); // 生成256位AES密钥 $iv openssl_random_pseudo_bytes(16); // 生成128位IV// AES加密&#xff08;CBC模式&#xff09…

Turing Complete-3位解码器

要求如下&#xff1a; 就是搭建一个3-8译码器 思路一&#xff1a; 使用四种判断来解决问题。 判断一&#xff1a;3个输入中是否有0个绿色。 解决办法&#xff1a;三个输入通过三输入或门再取反。 判断二&#xff1a;3个输入中是否有1个绿色&#xff0c;并确定是输入1、输入…

我主编的电子技术实验手册(24)——RL并联电路

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

手写MVVM框架-模板渲染1

虚拟dom创建好了&#xff0c;依赖也收集好了&#xff0c;这个时候就该去渲染dom了&#xff0c;把页面上的 { {name}} 渲染成具体的值。 渲染之前我们给原型上添加一个render方法 //代码在src/core/render.jsexport function renderMixin(MiniVue) {MiniVue.prototype.$render …

人类心智逆向工程:AGI的认知科学基础

文章目录 引言:为何需要逆向工程人类心智?一、逆向工程的定义与目标1.1 什么是逆向工程?1.2 AGI逆向工程的核心目标二、认知科学的四大支柱与AGI2.1 神经科学:大脑的硬件解剖2.2 心理学:心智的行为建模2.3 语言学:符号与意义的桥梁2.4 哲学:意识与自我模型的争议三、逆向…

【C语言篇】“三子棋”

一、游戏介绍 三子棋&#xff0c;英文名为 Tic - Tac - Toe&#xff0c;是一款简单而经典的棋类游戏。游戏在一个 33 的棋盘上进行&#xff0c;两名玩家轮流在棋盘的空位上放置自己的棋子&#xff08;通常用 * 和 # 表示&#xff09;&#xff0c;率先在横、竖或斜方向上连成三个…

尝试ai生成figma设计

当听到用ai 自动生成figma设计时&#xff0c;不免好奇这个是如何实现的。在查阅了不少资料后&#xff0c;有了一些想法。参考了&#xff1a;在figma上使用脚本自动生成色谱 这篇文章提供的主要思路是&#xff1a;可以通过脚本的方式构建figma设计。如果我们使用ai 生成figma脚本…

【玩转 Postman 接口测试与开发2_015】第12章:模拟服务器(Mock servers)在 Postman 中的创建与用法(含完整实测效果图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十二章 模拟服务器&#xff08;Mock servers&#xff09;在 Postman 中的创建与用法1 模拟服务器的概念2 模拟服务器的创建2.1 开启侧边栏2.2 模拟服务器的两种创建方式2.3 私有模拟器的 API 秘钥的用法…

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …

Android学习19 -- 手搓App

1 前言 之前工作中&#xff0c;很多时候要搞一个简单的app去验证底层功能&#xff0c;Android studio又过于重型&#xff0c;之前用gradle&#xff0c;被版本匹配和下载外网包折腾的堪称噩梦。所以搞app都只有找应用的同事帮忙。一直想知道一些简单的app怎么能手搓一下&#x…

实验六 项目二 简易信号发生器的设计与实现 (HEU)

声明&#xff1a;代码部分使用了AI工具 实验六 综合考核 Quartus 18.0 FPGA 5CSXFC6D6F31C6N 1. 实验项目 要求利用硬件描述语言Verilog&#xff08;或VHDL&#xff09;、图形描述方式、IP核&#xff0c;结合数字系统设计方法&#xff0c;在Quartus开发环境下&#xff…

< 自用文儿 > 下载 MaxMind GeoIP Databases 对攻击的 IP 做 地理分析

起因 两个 VPM/VPS&#xff0c;安装了 fail2ban 去拦截密码穷举攻击。每天的记录都在增长&#xff0c;以前复制屏幕输出就行&#xff0c;一屏的内容还容易粘贴出来的。昨天已经过 500 条&#xff0c;好奇 fail2ban 是如何存储这些内容的&#xff1f;就发现它在使用 SQLite3 数…

通过IP地址查看终端具体位置

最近关于deepseek的热度不断&#xff0c;无论是deepseek的优秀性价比和能力&#xff0c;以及deepseek遭受到海外攻击然后国内反击的AI上甘岭&#xff0c;随之而来的是铺天盖地的营销号&#xff0c;要擦亮自己的眼睛&#xff0c;要勇于质疑和证实网络言论的真实性。 其中一点&am…