Posts with tag 04

what-does-MLP-do-3B1B

2025-05-18
0425julyfunnotes

image.png|600结构: Linear + ReLU + Linear假设 Attention 输出的 $E^->$ 嵌入维度 10000前半 Linear 矩阵 30000x10000:image.png|500[e.g.] 第一行 $R_0^->$ 通过点乘查询:这个 $E^->$ 是否编码了“Michael Jordan” 的含义?(可包含多个含义)点乘结果直接作为输出向量的第一个元素(红框)。在例子中,若该元素为 $2$ 则认为完美匹配含义.[e.g.] 第二行 $R_1^->$ 通过点乘查询:这个 $E^->$ 是否编码了四足动物的含义?后面还有 Bais,每个元素修正一个查询结果. 例如通过 -1 来让第一个点积由 2 变成 1.中间 ReLU 层:image.png|500将前面小于 0 的结果直接变 0. 即把大于 0 当作 active,小于 0 当作 inactive.结果升维了,不再是嵌入空间,而是类似于“每一个元素代表一个查询结果”.后半 Linear 层例如 30000x10000,一定和前半相反:image.png|500[e.g.] 第一列 $C_0$ 可以理解为一个嵌入空间中的向量,将第一个查询结果 $n_0$ 转换为嵌入空间的向量. 比如 $C_0$ 可能在嵌入空间中包含“篮球,数字23”等多个意思!偏置向量可以理解为直接暴力加在结果后的嵌入向量![qm] 我靠,难道意味着一次 MLP 会植入一个信号么?最后通过残差层,将结果加入到开始的输入上. 如最上面的图

UART

2025-05-07
0425julyfunnotes

[ai, I get it]NOTETTL 是 UART 的一种实现。[ai] 在实现UART通信时,可以使用不同的电气接口标准,如TTL、RS-232、RS-485等。这些标准定义了信号的电压范围和电气特性。(1) 发送 0x55(二进制 01010101)| 字段 | 电平序列(TTL) | 说明 | | --------- | ------------------------------------------ | ---------------------------------- | | 起始位 | 0V(低电平) | 持续 1 比特时间(≈104 μs @9600bps),表示帧开始。 | | 数据 0x55 | 0V, 3.3V, 0V, 3.3V, 0V, 3.3V, 0V, 3.3V | 从 LSB(最低位 1)到 MSB(最高位 0)依次发送。 | | 停止位 | 3.3V(高电平) | 持续 1 比特时间,表示帧结束。 | | 空闲 | 3.3V(高电平) | 持续任意时间(直到下一帧起始位)。 |(2) 发送 0xAA(二进制 10101010)| 字段 | 电平序列(TTL) | 说明 | | --------- | ------------------------------------------ | ----------------------- | | 起始位 | 0V(低电平) | 同上。 | | 数据 0xAA | 3.3V, 0V, 3.3V, 0V, 3.3V, 0V, 3.3V, 0V | LSB(0)到 MSB(1)依次发送。 | | 停止位 | 3.3V(高电平) | 同上。 | | 空闲 | 3.3V(高电平) | 持续任意时间。 |起始位下降沿的同步原理注意:收发端波特率可能稍有不同,偏差最多 5% 左右。接收端并不会计算发送端的比特时间(即波特率).(1) 检测下降沿(硬件触发)空闲状态:UART 总线在无数据传输时保持高电平(逻辑 1)。起始信号:发送端通过拉低电平(逻辑 0)表示帧开始,形成一个高→低的跳变(下降沿)。接收端硬件:通过边沿检测电路(如施密特触发器)捕获下降沿,触发接收流程。(2) 重新同步采样时钟接收端在检测到下降沿后,会启动一个本地时钟计数器,按以下步骤同步:延迟至比特中点:从下降沿开始,等待 1.5 个比特时间(例如,波特率 9600 bps 时,1 比特 ≈ 104 μs,1.5 比特 ≈ 156 μs)。此时采样点位于第一个数据位的中心位置(抗干扰最强)。后续比特的同步采样:之后每 1 个比特时间 采样一次,依次读取数据位、校验位和停止位。采样时刻严格依赖初始下降沿的同步,而非全局时钟。关键点:起始位的下降沿相当于一个“时间锚点”,后续所有比特的采样均以它为基准。2. 硬件如何实现?以 16x 过采样为例现代 UART 模块(如 STM32)通常采用过采样技术增强鲁棒性。以下是典型流程:过采样频率:接收端以 16 倍波特率 的时钟频率采样 RX 线(例如 9600 bps → 153.6 kHz)。每个比特周期内采样 16 次(编号 0~15)。下降沿检测与确认:连续检测到 3 个低电平采样点(如采样点 0、1、2)时,确认起始位有效(防噪声干扰)。记录下降沿的时刻(如采样点 0)。同步采样点计算:第一个数据位的采样点位于 第 8、9、10 次采样(对应比特时间的中心区域)。通过多数表决(取 3 次采样中的多数值)确定比特值。后续比特采样:每 16 个采样周期(即 1 比特时间)后,重复中心采样(如第 24、25、26 次采样对应第二个数据位)

具身智能大模型简介

2025-05-01
0425julyfunnotes

https://www.bilibili.com/video/BV1QxB9YuERU RT1 - Transfromer 出轨迹 - 3Hz inference - 实验: - 结合仿真数据训练或者其他机械臂的数据训练,也可以学到新技能. - 少一点数据,训练效果会如何变化? - 多样性减少的影响更大!RT2:Use pretrained VLM. (PaLI-X, PaLM-E)vision language + action Co-finetune.Co-finetune how:Input:ViTLanguage modelOutput:sometimes text [err?]sometimes actionInference 的时候只会 sample action token [?]multi-TPU cloud inference在见过的任务上和 RT1 差不多没有结果的 task 上面,对世界知识的保留是非常好的.有 Emergence capability. 可从网络数据中迁移.参数数量影响结论:Cofinetune 有更好的泛化性参数量大,泛化性强引入思维链可以解决很复杂的 command.RT-X:在 OpenX 数据上训练.Trained on 9 manipulators.小规模数据训练上,超越原有模型.大规模数据训练上,RT-2-X 效果好.说明数据量大场景下需要高容量模型结构.跨具身形态训练,让模型从别的 domain 学到技能在输入中包含 image history 可以增强 generalization 性能web-scale pretaining 重要 [?]OXE (Open X Emb..) 非常 diverseRT-H:考虑到有很多任务比较的动作序列比较像.思想: 加入 Language motion 中间层。输入任务后先预测移动指令(用语言描述)好处:多任务数据共享Co-train: Internet data, action data & language motion dataLanguage motion 人类很容易干预,检查和纠正. 纠正也可以用于训练,比遥操作纠正效果更好.在新任务上需要很少的 correction.启示:lang-motion 可以 scale up 数据收集,可以压缩 action-space. 从而样本高效.但是对于复杂任务 lang-motion 可能比较复杂.OpenVLA训练数据集更大更 DiverseDidn't use internet data, use only robot data.模型结构:prethmetic VLM [?]Input to => DINOv2 and SigLIP 融合到一起的 Vision Encoder.Get spacial and high-level semantic feature.outrput => Small 2-layer MLP projector.Project to language token space [?]=> Llama2 7B language model=> Action De-tokenizer输出 action. (夹爪)性能实验:OXE 上训练out-of-the-box 直接泛化能力做了数据清洗VLA Finetune 性能实验:发现 OpenVLA 在困难 diverse 多种 instructions 多物体任务上,比原来更好归结于 OpenX 的 pretraining.Lora 实验:LoRA 在性能保持上非常好!低资源 Finetune验证 memory-efficient4bit 量化可以将 GPU memory 减半,并保持差不多的性能[下面改进 action output]problem:policy 执行每一步都有可能与误差,会累积.同一个任务的方法是多峰的使用 action chunking使用生成式建模[idea] action chunking每一步我都预测后四步,然后做加权.[idea] 生成式建模[paper] ACT (Conditional Variational AutoEncoder)...todo[paper] Diffusion Policy表达多峰分布high-dimensional, 可建模长 action 序列的分布$p(A_t | O_t)$. VAE 的 condition 是 denoising iteration $k$ 和 observation features $O_t$. 生成的是 $A_t$.$pi_0$PS:整个架构是 transfusion基于 Pretrain 的 VLM PaliGemma用 SIGLIP 作为 vision-encodergemma 是 lang model动作生成用的也是 Flow-matchingTraining recipe:Pretraining: 让模型见到各种各样的 task & behaviorsPost-training: 更高质量的目标任务的数据OXE, Bridge v2, DROID为了适应不同机器人维度,使用最大维度的 configuration vector 和 action vector 来训练。对于较小维度机器人,直接 zero-pad"mask out the missing image slots"Pretraining 对长程和困难任务很重要.RDT:基于 Diffusion-transformerData scarcity: 目标任务上数量少?考虑在 cross-embodiment 做大量 Pretrain数据集结构不一样: 提出 unified spaceInput: 图片,lang instruction,本体感知,控制频率Image 通过 SIGLIP (frozen)lang: T5XXL [?] (frozen)随机且独立地 mask 某一个多模态的输入,防止过度依赖某一个模态Training recipe:Unified action spacePre-train 巨大数据集自己 finetune 高质量数据集6K 轨迹,300 任务,instruction (GPT4输出以增加多样性),物体和环境多样性效果:zero-shot 到没有见过的任务.few-shot 学会新技能.可以遥控机器狗.模型大小,数据量大小和 Diffusion 都对于 RDT 性能关键.GR-2 字节提出的模型先做大量 text-video pre-training然后再 video-action co-training(下游 finetune)结构:Text: CLIPImage: VQGANbackbone: GPT-styleaction traj: action chunk + CVAE[idea] Video generation as planner!实验证明视频预测和真实执行非常吻合.Takeaways 思考大量 pre-training 然后在高质量数据集上 finetune 可以提升性能.Cross-embodiment 训练可以增强领域迁移能力。VLA 带来世界知识和推理能力action chunking & generative models (better than single step auto-regressive)LimitationImitation Learning 无法超越示教者的表现.Generalization 还是不够. 主要是没有见过的动作和没有见过的具身形态.跨具身形态和训练可以改进. (see HPT 凯明组)Future work如何从人类视频中学习新的 skillPretraining datasets 如何构成.需要什么样的数据,多少数据才能 near-perfect.需要多 diverse.构建很大很高质量的数据集,高效训练方法和数据来源.继续构建 VLA foundation model.考虑使用 simulation data. 目前做的不多.考虑使用强化学习

自注意力

2025-04-27
0425julyfunnotes

自注意力考虑:mole 一词在不同上下文有不同含义.嵌入层将 mole 转换为泛型向量以后,Transformer 的下一层会根据上下文再加一个偏移向量。 image.png|500$E_1^->$ 是词嵌入 $+$ 位置嵌入.$Q_i^-> = W_Q dot E_i^->$ 形象比喻:$E_1^->$ 是第四个单词,且是名词。问在第四个单词前面有形容词不?$K_i^-> = W_k dot E_i^->$ 形象比喻:$E_2^->$ 是第二个单词,形容词。(可以回答上面的询问)上面这张表叫做 Attention Pattern。在从前往后生成文本的任务中,左下角掩码强制置 0,这样前面 Qi 查不到后面 Ki.(在翻译等任务中,则不需要此掩码) image.png|500 image.png|500$V_i^-> = W_v dot E_i^->$ 表示对其他词应该造成什么偏置。比如上图从 creature 到蓝色毛茸茸生物的灰色箭头.这里如果真用 $W_v$ 这个矩阵的话,唯独就爆炸了. 我们先编码再解码,实际上 $V_i^-> = W_(v, "up") dot W_(v, "down") dot E_i^->$PS:$W_q, W_k$ 和两个 $W_v$ 是一样参数量. GPT-3 中是 $128 times 12288$ ($W_(v, "up")$ 为 $12288 times 128$)经过注意力以后的嵌入结果:加起来,如下图。下面 $Delta E_i^->$ 就是一个注意力. image.png|600多头注意力其实就是有 n 组上面这写矩阵,自行学习不同的注意力机制. 比如除了“形容词-名词”修饰,还有可能是“名词推测”、“动作导致形状变化”等注意力机制。GPT-3 中是 96 个头.最后的嵌入结果就是加在一起. image.png|500多层多头注意力每次经过一个多头 Attention 以后会过 MLP,然后再过多头 Attention,重复多层. GPT-3 中是 96 层. image.png|500交叉注意力文本和图像做交叉注意力时,文本 $==>^("CLIP or BERT")$ Embedding。随后计算 KV.图像 $==>^("resnet 等")$ Embedding, 然后计算 Q.这是文本到图像的注意力,即通过文本得到图像中文本对应的内容,并将其给予更高的权重.[AI] PS:Q 来自图像,K/V 来自文本 → 这是一个从图像“查询”文本的过程。注意力权重反映的是“图像需要从文本中获取什么信息”猫区域的 Q 与“cat”的 K 相似度高 → 这些区域的注意力权重较大。最终,来自文本 V 的“猫”语义被注入到图像中猫的区域.以下代码来自: GitHub/RoboTwin/policy/3D-Diffusion-Policy/3D-Diffusion-Policy/diffusion_policy_3d/model/diffusion/conditional_unet1d.py可以看出输入被用来计算 Q,而 condition 被用来计算 K, Qclass CrossAttention(nn.Module): def __init__(self, in_dim, cond_dim, out_dim): super().__init__() self.query_proj = nn.Linear(in_dim, out_dim) self.key_proj = nn.Linear(cond_dim, out_dim) self.value_proj = nn.Linear(cond_dim, out_dim) def forward(self, x, cond): # x: [batch_size, t_act, in_dim] # cond: [batch_size, t_obs, cond_dim] # 下面 horizon 就是 t_act. # Project x and cond to query, key, and value # 注意 nn.Linear 是右乘,即 x @ weights.T # weights 形状为 out_dim * in_dim(和创建时相反) query = self.query_proj(x) # [batch_size, horizon, out_dim] key = self.key_proj(cond) # [batch_size, horizon, out_dim] value = self.value_proj(cond) # [batch_size, horizon, out_dim] # Compute attention attn_weights = torch.matmul(query, key.transpose(-2, -1)) # [batch_size, horizon, horizon] attn_weights = F.softmax(attn_weights, dim=-1) # Apply attention attn_output = torch.matmul(attn_weights, value) # [batch_size, horizon, out_dim] return attn_outputimage.png|500多层多头注意力每次经过一个多头 Attention 以后会过 MLP,然后再过多头 Attention,重复多层

3D-Diffusion-Policy

2025-04-24
0425julyfunnotes

符号T: 预测轨迹长度eval_policy.py 调用 deploy_policy.py:eval(),其调用 RobotRunner.get_action()RobotRunner.get_action() (robot_runner.py)obs = self.get_n_steps_obs()obs <- update_obs() 就是 append <- Base_task.get_obs()[ai]observation - 包含来自各种相机的观察数据相机数据包括 head_camera, left_camera, right_camera, front_camera 等每个相机可以包含以下数据(取决于 data_type 设置):rgb - RGB图像数据mesh_segmentation - 网格分割数据actor_segmentation - 实体分割数据depth - 深度图像数据相机内参和外参矩阵pointcloud - 点云数据如果 data_type['pointcloud'] 为 True,则包含点云数据可以选择是否合并多个相机的点云数据joint_action - 机器人关节状态如果 data_type['qpos'] 为 True,包含机器人关节角度双臂模式下,包含左臂和右臂的关节角度单臂模式下,仅包含右臂的关节角度endpose - 机器人末端执行器姿态如果 data_type['endpose'] 为 True,包含末端执行器的位置和姿态双臂模式下,包含左右两个末端执行器的信息(位置x,y,z,欧拉角roll,pitch,yaw,以及夹爪状态)单臂模式下,仅包含右臂末端执行器信息vision_tactile - 视觉触觉传感器数据(当 TACTILE_ON 为 True 时)如果 data_type['vision_tactile'] 为 True,包含触觉传感器的RGB图像数据随后拿出两个数据并重命名: pointcloud -> point_cloud, joint_action -> agent_pos得到 obs: Dicteach_key => 将最近 n 个观测的 key 在第 0 维度拼接. 形状为 (n_steps, ) + shape_of_the_valuen_steps 在参数 yaml 里为 n_obs_steps = 3在前面 unsqueeze 一个长度为 1 的维度后送进 DP3.predict_action() (应该是因为推理的时候 batch 必是 1)class DP3:predict_action() (dp3.py)Input (obs_dict):'point_cloud': (1, 3, 1024, 6)'agent_pos': (3, 14) 就是关节角度过程:normalizeif global_cond:point_cloud & agent_pos 都送入 DP3Encoder,得到 (3, 192),压扁成 (1, 576)mask 就是全部 mask 掉, 所有动作都需要通过扩散模型生成else:mask 观察特征保持可见送入 self.condition_sapmle()return. 实测表明一次预测 6 步且会把这 6 步执行完,再预测下 6 步.condition_sample():ps:出的 traj shape 是 (B, T, action_dim) = (1, 8, 14)每个去噪步 model(sample=trajectory, timestep=t, local_cond=local_cond(必为 None), global_cond=global_cond)model is ConditionalUnet1D.forward():... timestep (形状 (B, ) or int) encoding (SinusoidalPosEmb, Linear, Mish, Linear) 如 global_cond,则 `global_feature = cat([timestep_embed, global_cond], axis=-1) x = sample (即 trajactory) ... for idx, (resnet, resnet2, downsample) in enumerate(self.down_modules): if self.use_down_condition: x = resnet(x, global_feature) if idx == 0 and len(h_local) > 0: x = x + h_local[0] x = resnet2(x, global_feature) else: x = resnet(x) if idx == 0 and len(h_local) > 0: x = x + h_local[0] x = resnet2(x) h.append(x) x = downsample(x) ... 后面有一个 mid_module (ConditionalResidualBlock1D) ... 后面面 Upsample 一毛一样 x = self.final_conv(x) return x其中 resnet, resnet2, downsample:ConditionalResidualBlock1D( dim_in, dim_out, cond_dim=cond_dim, kernel_size=kernel_size, n_groups=n_groups, condition_type=condition_type), ConditionalResidualBlock1D( dim_out, dim_out, cond_dim=cond_dim, kernel_size=kernel_size, n_groups=n_groups, condition_type=condition_type), Downsample1d(dim_out) if not is_last else nn.Identity()其中 ConditionalResidualBlock1D.forward():out = Conv1dBlock() (x)if cross_attention_addembed = CrossAttention() (x)out = out + embed (是 tensor 值加)out = another Conv1dBlock() (x)out = out + self.residual_conv(x)return outInnerDP3Encoder输入'point_cloud' => B x N x 3的 点云 (B: batch) = (3, 1024, 3) 送入:class PointNetEncoderXYZMLP: [Linear + LayerNorm + ReLU] x 3channels: 3 => 64 => 128 => 256 => max => Linear + LayerNorm (128)forward():(B, N, 3) = (3, 1024, 3)mlp => (3, 1024, 256)max => (3, 256)Linear + LayerNorm => (3, 128)self.state_mlp: 简单的 MLP (Linear + ReLU). state_mlp_size = (64, 64).最后 cat 成 (3, 192)Oute

No more posts to load.