尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

可微分智能体仿真:实现超快速交通临近预报与实时控制优化

可微分智能体仿真:实现超快速交通临近预报与实时控制优化 1. 项目概述当交通仿真遇上可微分计算最近在交通工程和城市计算圈子里一个结合了“可微分仿真”和“智能体建模”的技术方向热度很高。简单来说它试图解决一个困扰我们多年的老问题如何对瞬息万变的城市交通进行精准的“现在时”预测与即时调控。传统的交通仿真模型比如SUMO、VISSIM功能强大但有个“硬伤”——它们本质上是复杂的、离散的事件模拟器参数调整和优化过程非常笨重通常需要大量的手动试错或依赖启发式算法难以实现与实时数据的快速闭环。而“Ultra-fast Traffic Nowcasting and Control via Differentiable Agent-based Simulation”这个方向正是用“可微分”这把钥匙试图撬开高效、精准实时交通管控的大门。所谓“Nowcasting”临近预报在气象领域指对未来几小时天气的预测移植到交通上就是对未来几分钟到几十分钟交通状态的超短期预测。这比传统的短期预测Short-term Prediction要求更高因为它需要近乎实时的数据同化和模型更新并对控制策略做出即时反馈。而“Differentiable Agent-based Simulation”可微分智能体仿真则是实现这一目标的核心引擎。它意味着我们将整个交通仿真系统——从微观的车辆跟驰、换道决策到宏观的网络流分配——构建成一个可微分的计算图。这样一来系统中的任何参数如驾驶行为参数、信号灯配时、路径诱导策略的微小变化如何最终影响我们关心的目标如全网总行程时间、平均速度、排队长度都可以通过自动微分技术快速、精确地计算出来即获得梯度信息。有了梯度信息一切都不同了。我们可以利用成熟的梯度下降优化算法自动、高效地校准模型参数使其与实时观测数据如线圈、摄像头、浮动车GPS数据匹配更重要的是我们可以直接对交通控制变量如信号灯相位、绿信比进行梯度优化在仿真环境中快速寻找到能改善当前及未来交通状态的最佳控制策略。这相当于给交通控制系统装上了一套“自动驾驶”大脑能基于仿真模型对多种控制方案进行秒级评估与迭代从而实现“现在时”的感知-决策-控制闭环。对于城市交通管理者、自动驾驶算法开发者甚至是物流和出行服务规划者来说这套技术栈的潜力是巨大的它意味着更灵敏的交通应急响应、更高效的信号配时方案以及更优的网络级交通流疏导。2. 技术核心可微分智能体仿真的实现路径实现一个可微分的交通智能体仿真系统并非将传统仿真器简单包装而是需要从底层建模逻辑上进行重构。其核心在于确保仿真过程中的每一个关键决策函数都是连续且可微的或至少是次可微的从而允许误差梯度从系统输出如交通状态反向传播到输入参数如控制指令。2.1 传统智能体仿真的“不可微”之痛在经典的基于智能体的交通仿真中车辆智能体的行为由一系列规则和随机模型决定。例如跟驰模型如智能驾驶员模型IDM根据前车距离、速度差计算加速度。这个模型本身是连续可微的公式。换道模型如MOBIL模型基于安全性和收益性进行离散决策换或不换。这里引入了“如果...那么...”的逻辑判断和阈值比较导致了不可微点。路径选择通常基于离散选择模型如Logit模型或确定性的最短路径算法前者涉及随机抽样后者涉及不可微的操作如argmin。当我们将这些模型组合成一个仿真步进循环时整个系统就变成了一个充满条件分支和离散采样的复杂程序。直接对这个程序进行自动微分得到的梯度要么是零在分支处要么是未定义的无法有效指导优化。2.2 关键组件的可微分化改造要让仿真可微必须对上述不可微环节进行平滑近似或重构。1. 离散决策的平滑化对于换道、路径选择这类离散决策核心技巧是用连续的、可微的函数来近似“选择”这个动作。一个常见的方法是使用Gumbel-Softmax技巧或Straight-Through Estimator (STE)。Gumbel-Softmax在离散分类如选择哪条车道中引入Gumbel噪声并通过Softmax函数得到一个连续的、近似one-hot的分布。在反向传播时使用这个Softmax输出的梯度在前向传播时可以从这个分布中采样得到离散决策采用“直通”技巧将采样动作的梯度直接赋给Softmax输出。这使得模型可以训练同时最终输出仍是离散动作。应用示例车辆在决定是否换道时原本是计算左换、右换、保持三个选项的效用值然后取argmax。可微分版本中我们计算效用值后加上Gumbel噪声输入Softmax得到三个选项的概率分布。训练时用这个概率分布参与梯度计算执行时根据概率采样或直接取概率最大的选项。2. 基于学习的行为模型替代另一种更彻底的思路是直接用神经网络来表示智能体的策略函数。例如用一个神经网络取代IDM和MOBIL模型输入是车辆周围的环境状态前车距离、速度、邻车道情况等输出是连续的加速度和转向角或换道意图的概率。这个神经网络本身当然是可微的。通过大量驾驶数据或与仿真环境交互结合强化学习可以训练这个网络模仿或优化驾驶行为。在可微分仿真框架中这个策略网络就成了可微分计算图的一部分。3. 物理与运动学的可微建模车辆的运动学本身位置、速度、加速度的关系是连续可微的。关键在于如何将决策加速度、转向角与运动学更新无缝衔接。通常使用数值积分方法如欧拉法、龙格-库塔法这些方法本身也是可微分的操作序列。只要保证输入给积分器的控制量是可微函数的输出整个运动轨迹对控制参数的梯度就可以被追踪。4. 网络级流量的可微分配对于宏观或中观的路网流量分配传统用户均衡UE模型涉及求解一个变分不等式过程复杂且不可微。可微分版本可以采用基于深度学习的流量分配网络或者使用可微分凸优化层如CVXPYLayer来嵌入一个可微的优化问题求解器使得路径流量对路段成本函数的梯度可以计算。注意可微分化往往意味着在“精确性”和“可优化性”之间取得平衡。平滑近似可能会改变系统的动力学特性。因此在模型校准阶段必须用真实数据验证经过可微分改造后的仿真器其输出统计特性如平均速度、流量-密度关系是否与真实系统或高保真仿真器一致。2.3 系统架构与计算图构建一个典型的可微分交通仿真系统架构如下环境编码器将当前路网状态车辆位置、速度、信号灯状态编码为可微的张量表示。可微分智能体模型每个智能体车辆包含一个可微分的策略函数如神经网络或参数化IDM根据编码后的环境状态输出控制动作加速度、转向角概率。可微分状态转移根据所有智能体的动作利用可微分的运动学方程和碰撞检测可采用基于距离场的连续惩罚函数近似硬碰撞约束计算下一时间步的状态。可微分损失函数定义优化目标。对于模型校准损失函数是仿真输出如路段流量、速度与真实观测数据之间的差异如MSE。对于控制优化损失函数是交通效率指标如总行程时间的负数。自动微分引擎利用PyTorch、JAX或TensorFlow等框架将上述步骤构建成一个静态或动态的计算图。通过一次前向仿真模拟未来一段时间然后计算损失函数对可调参数模型参数或信号灯参数的梯度。# 一个高度简化的伪代码示例展示在PyTorch中的思路 import torch class DifferentiableTrafficSimulator(torch.nn.Module): def __init__(self, network, agent_models): super().__init__() self.network network # 路网拓扑的张量表示 self.agent_models torch.nn.ModuleList(agent_models) # 可微分的车辆策略网络 def forward(self, initial_state, traffic_signal_params, simulation_steps): # initial_state: 初始车辆状态张量 # traffic_signal_params: 需要优化的信号灯参数如绿灯时长 # simulation_steps: 仿真步数 current_state initial_state total_travel_time 0.0 for step in range(simulation_steps): # 1. 根据当前状态和信号灯参数计算每个车辆的动作可微 actions [] for i, model in enumerate(self.agent_models): # 模型输入车辆自身状态周围环境感知从current_state和network计算 obs self._get_observation(current_state, i, traffic_signal_params) action model(obs) # 输出加速度、换道意图概率等 actions.append(action) actions torch.stack(actions) # 2. 可微分状态更新运动学简单的连续碰撞规避 next_state self._differentiable_state_update(current_state, actions, self.network) # 3. 累计计算目标函数例如总行程时间 total_travel_time self._compute_step_travel_time(current_state, next_state) current_state next_state # 返回总损失例如负的总行程时间因为我们想最小化行程时间 loss -total_travel_time return loss # 使用示例 simulator DifferentiableTrafficSimulator(...) optimizer torch.optim.Adam(simulator.parameters(), lr0.01) for epoch in range(100): loss simulator(initial_state, traffic_signal_params, steps50) optimizer.zero_grad() loss.backward() # 关键自动微分计算梯度 optimizer.step() # 更新信号灯参数 print(fEpoch {epoch}, Loss (负行程时间): {loss.item()})这个框架允许我们将交通信号控制参数traffic_signal_params作为可训练变量通过梯度下降直接优化以最小化仿真期内的总行程时间。3. 核心应用一超快速交通状态临近预报Nowcasting交通Nowcasting不是一个独立的预测模型而是一个“数据同化-仿真推演”的闭环过程。可微分仿真在其中扮演了动态模型的核心角色。3.1 Nowcasting 与传统预测的区别传统预测通常使用时间序列模型如ARIMA、LSTM或历史数据匹配模式对未来状态进行推断。它严重依赖历史规律对突发事故、特殊事件的响应能力弱。Nowcasting基于当前实时观测数据利用一个物理/行为驱动的仿真模型快速推演未来短时交通状态。它更注重对“当下”状态的准确刻画和基于因果关系的推演。可微分仿真使得这个“刻画-推演”循环极快。3.2 基于可微分仿真的Nowcasting流程数据同化与模型初始化输入来自各类传感器地磁线圈、摄像头、浮动车的实时数据流包括路段平均速度、流量、占有率、轨迹点等。状态估计利用滤波算法如卡尔曼滤波、粒子滤波或直接优化将稀疏、异构的观测数据融合估计出仿真系统在当前时刻所需的完整初始状态。这包括所有车辆的位置、速度、目的地以及路网的当前拥堵状态。在可微分框架下状态估计可以表述为一个优化问题通过梯度下降最小化仿真初始状态与观测数据之间的差异。模型参数快速校准交通流参数如自由流速度、阻塞密度、驾驶员行为参数如IDM中的期望速度、安全车头时距并非一成不变会随天气、时段、事件而变化。在可微分仿真中我们将这些参数θ设为可变量。在Nowcasting周期开始时例如每5分钟我们固定当前估计的初始状态运行一个很短时间如过去2分钟的仿真将仿真输出S_sim(θ)与对应时间段的真实观测O_obs对比计算损失L ||S_sim(θ) - O_obs||^2。由于仿真可微我们可以计算dL/dθ并用几次梯度下降迭代快速调整θ使仿真器在最近过去的表现最优。这个过程在几秒内完成实现了模型的在线自适应。快速推演与不确定性量化使用校准后的模型和最新的初始状态向前仿真推演未来10-30分钟的交通状态。可微分仿真的高效性允许进行多次并行推演。为了量化预测不确定性可以采用概率性推演。例如在智能体策略中注入噪声或对关键参数如交通需求进行采样生成一个预测集合。通过分析集合的分布可以得到未来流量、速度的概率区间而不仅仅是点估计这对于风险敏感的决策如应急车辆调度至关重要。3.3 实操要点与心得数据融合是关键Nowcasting的精度上限取决于初始状态估计的准确性。需要精心设计一个融合定点检测器高频率但空间稀疏和浮动车数据空间连续但时间稀疏的方案。可尝试使用图神经网络GNN对路网进行编码同时吸收多源数据。校准频率的权衡参数校准太频繁可能导致模型过拟合噪声校准间隔太长则模型可能滞后。实践中可以根据交通状态的平稳性动态调整。在平峰期可以每15-30分钟校准一次在早晚高峰或事件期间可能需要缩短到5分钟甚至更短。计算效率的取舍为了达到“超快速”Ultra-fast需要在仿真规模和保真度上做权衡。对于城市级Nowcasting可能需要对路网进行分区或采用混合仿真核心区域用微观可微分仿真外围用中观或宏观可微分模型。实操心得在初期搭建系统时不必追求全路网、全车辆的微观仿真。可以从一个关键走廊或一个拥堵区域开始验证整个数据同化-校准-推演流程的可行性和时效性。我们曾在一个包含20个路口的主干道走廊上测试在GPU上完成2分钟历史数据校准和未来15分钟推演包含1000辆车整个流程可以在10秒内完成满足了“现在时”响应的要求。4. 核心应用二基于梯度的实时交通控制优化这是可微分仿真最具吸引力的应用。传统交通信号优化方法如SCATS、SCOOT基于预设方案或简单的自适应规则优化周期长且难以处理复杂、动态的网络流。强化学习RL是另一种思路但其需要大量试错训练慢且策略可解释性差。基于可微分仿真的优化提供了一条介于两者之间的新路径利用模型的梯度信息进行快速、精准的闭环优化。4.1 控制优化问题建模我们将交通信号控制问题表述为一个基于仿真的优化问题决策变量x需要优化的控制参数。例如对于每个信号灯相位x可以是一个周期内各相位的绿灯时长或者是相位差对于线控。目标函数J(x)我们希望最小化的交通性能指标。常见的有全网总行程时间Total Travel Time, TTT总延误Total Delay平均排队长度综合指标如TTT α * 停车次数约束条件x必须满足的物理和操作约束如绿灯时长最小值和最大值。周期长度固定或在一定范围内。各相位绿灯时间之和等于周期长减损失时间。优化问题即为min_x J(x), subject to x ∈ C。在可微分仿真中J(x)是通过运行仿真T个时间步例如未来30分钟计算出来的。由于仿真S(x)是可微的J(S(x))对x的梯度∇_x J可以通过自动微分获得。4.2 优化算法与实施步骤梯度计算进行一次前向仿真得到损失J然后调用backward()函数自动计算∇_x J。这个梯度告诉我们如果微调某个路口的绿灯时间全网总行程时间会如何变化。约束处理由于控制变量有约束不能直接使用梯度下降。常用方法有投影梯度下降在梯度更新后将x投影回可行域C。例如如果某个绿灯时长更新后小于最小值则将其设为最小值。拉格朗日乘子法/内点法将约束优化转化为无约束优化问题但这在动态在线优化中可能较复杂。变量变换将受约束的原始变量x通过一个无约束变量z来表示。例如用Softmax函数将一组无约束的数转换为一个和为1的概率分布对应各相位的绿灯时间比例。在线滚动优化在时间t基于当前估计的交通状态利用可微分仿真优化未来一个控制时段如15分钟的信号参数x*。只实施x*中第一个控制步长如5分钟的方案。到了时间t5分钟获取新的交通观测数据更新仿真初始状态重复上述优化过程。这就是模型预测控制MPC的框架可微分仿真作为MPC中的内部预测模型因其可微特性使得在线优化速度大大加快。4.3 多智能体协同优化与网络级控制单个路口的优化可能以邻路口为代价。可微分仿真天然适合进行网络级协同优化因为梯度∇_x J包含了所有控制变量对全局目标的贡献信息。集中式优化将所有路口的信号参数x_1, x_2, ..., x_N拼接成一个大的决策向量进行统一优化。这能实现全局最优但决策变量维度高对计算要求高。可微分仿真和GPU并行可以缓解此问题。分布式/联邦优化每个路口控制器利用本地仿真包含相邻路口的影响计算本地目标函数的梯度然后通过通信协调更新。可微分仿真可以方便地计算局部梯度。这更适合大规模网络。4.4 实操中的挑战与解决方案仿真与现实差距Sim-to-Real Gap优化出来的策略在仿真中表现优异但在现实路口可能效果打折扣。这是因为仿真模型无法完全复现真实的驾驶员行为。解决方案采用在线自适应。将现实路口实施控制方案后的实际效果数据通过检测器获取持续反馈给仿真器用于微调仿真模型参数即Nowcasting中的校准步骤使仿真器不断逼近现实。这样优化器基于一个越来越准的模型做决策。计算实时性尽管可微分仿真很快但对于超大规模网络一次前向仿真和反向传播可能仍需数秒甚至更久。解决方案分层控制主干道采用在线滚动优化支路采用固定配时或感应控制。提前计算与缓存在流量模式相对固定的时段如早高峰可以离线预计算多种典型场景下的最优方案在线时根据当前状态匹配最接近的方案并在此基础上进行小幅梯度优化微调。模型简化使用更轻量级的可微分模型如元胞传输模型CTM的可微分版本牺牲一些微观细节以换取速度。探索与利用的平衡梯度下降是局部优化方法容易陷入局部最优。解决方案在MPC框架中可以结合一些全局探索策略。例如在优化开始时从多个不同的初始控制方案可能是历史方案或随机扰动同时启动梯度下降选择结果最好的一个。或者在目标函数中加入小的熵正则项鼓励探索。踩坑记录我们曾尝试对一个有30个信号路口的区域进行集中式优化。直接优化所有相位的绿灯时长约120个变量即使使用GPU一次迭代也需要近2秒难以满足在线需求。后来改为优化关键干线上的“绿波”带宽和关键交叉口的周期与相位差将变量缩减到20个左右并将仿真时长从30分钟减少到15分钟最终将单次优化时间控制在500毫秒以内实现了秒级响应。这说明工程落地中结合领域知识对问题进行降维和简化至关重要。5. 系统实现、工具链与常见问题排查构建一个完整的可微分交通仿真与控制原型系统需要整合多个层面的工具和技术。5.1 推荐工具链与开发栈深度学习框架PyTorch或JAX是首选。两者都提供强大的自动微分功能。PyTorch动态图更灵活易于调试JAX基于静态图和函数式编程在GPU/TPU上性能极高尤其适合大规模并行仿真。TensorFlow也可以但其计算图模式有时不够灵活。可微分物理/仿真引擎NVIDIA Warp一个用于仿真的Python框架其内核可编译并在GPU上运行且支持自动微分。非常适合编写自定义的可微分交通仿真逻辑。Brax基于JAX的物理引擎常用于强化学习但其可微分特性也可用于梯度优化。自定义实现对于交通仿真很多时候需要自己从零构建。可以利用上述DL框架的自动微分核心的车辙运动、跟驰模型都用张量操作实现。传统仿真器接口如果不想完全重写仿真器可以考虑为传统仿真器如SUMO构建一个可微分包装层。但这非常困难因为需要修改或重写其核心逻辑以暴露梯度。一个折中方案是使用仿真器的API进行采样然后训练一个可微分的代理模型来近似仿真器的输入输出关系即“仿真器蒸馏”。路网处理与可视化OpenStreetMaposm2po/osm2sumo获取和转换路网数据。PyTorch Geometric/Deep Graph Library (DGL)用于处理路网图结构数据实现基于GNN的状态编码器。Matplotlib/Plotly/FleetPy用于结果可视化。5.2 开发与部署工作流数据准备与路网建模获取目标区域的路网文件.net.xml并处理成适合张量计算的格式如节点-边列表边属性。构建可微分仿真内核定义车辆状态张量位置、速度、加速度、航向角等。实现可微分的车辆行为模型跟驰、换道。实现可微分的车辆运动更新和简单的连续碰撞规避如基于距离的排斥力。实现交通信号逻辑将信号灯状态作为可微分的函数输入例如将周期和绿灯时长作为参数生成一个随时间变化的状态信号。集成训练/优化循环对于Nowcasting构建数据同化与参数校准的损失函数和训练循环。对于控制优化构建以控制参数为输入、以交通指标为输出的前向传播并设置优化循环。验证与测试开环测试在历史数据上测试Nowcasting的精度MAE, MAPE。闭环测试仿真中在仿真环境中测试控制优化策略与固定配时、感应控制等基准策略对比。敏感性分析测试模型对不同参数、不同随机种子、不同交通需求的鲁棒性。部署考量在线系统需要低延迟。可以考虑将训练好的模型如优化器导出为TorchScript或ONNX格式在推理服务器上运行。控制指令通过标准协议如NTCIP下发到实际信号控制器。5.3 常见问题与排查技巧实录在实际开发和实验中会遇到各种各样的问题。下面是一个常见问题速查表问题现象可能原因排查与解决思路梯度消失或爆炸1. 仿真步数太多导致计算图过深。2. 模型中存在数值不稳定的操作如除以很小的数。3. 激活函数选择不当。1. 使用梯度裁剪torch.nn.utils.clip_grad_norm_。2. 在反向传播中定期检查梯度值param.grad。3. 尝试减少仿真步数或使用截断反向传播只对最近若干步回传梯度。4. 确保所有运算都有良好的数值范围必要时添加微小常数eps。优化过程震荡不收敛1. 学习率设置过大。2. 目标函数非凸存在多个局部极小值。3. 仿真噪声过大导致梯度估计方差大。1. 使用学习率衰减调度器如ReduceLROnPlateau。2. 尝试不同的优化器如AdamW Nadam它们对学习率不那么敏感。3. 在目标函数中加入平滑正则项如对控制变量变化的L2惩罚。4. 使用梯度下降的多个随机初始点选择最佳结果。仿真结果与真实数据偏差大校准失败1. 模型结构过于简单无法捕捉真实交通复杂性。2. 观测数据噪声大或存在系统性偏差。3. 优化陷入了错误的局部最优。1. 增加模型容量如使用更复杂的神经网络策略。2. 对观测数据进行更严格的清洗和预处理。3. 在损失函数中对不同类型的数据流量、速度赋予不同的权重。4. 尝试先在一个小的、数据质量高的子区域上进行校准成功后再推广。控制优化后仿真中拥堵转移或加剧1. 优化目标过于单一如只优化总行程时间可能导致“以邻为壑”。2. 仿真时长太短优化策略牺牲了长期利益。3. 模型未考虑驾驶员对信号变化的适应性如路径重选择。1. 在目标函数中加入公平性指标如各路段延误的方差。2. 延长MPC的预测时域或使用折扣因子更看重近期收益。3. 在仿真中引入简单的路径选择模型让驾驶员能够根据预测的旅行时间重新选择路径。计算速度慢无法满足实时要求1. 仿真车辆数过多计算负载大。2. Python循环效率低。3. 未充分利用GPU并行。1. 采用混合仿真核心区域微观仿真外围区域宏观或中观仿真。2.将所有车辆的状态更新用张量操作向量化避免对每个车辆使用Python for循环。这是性能提升的关键。3. 使用JAX的vmap、pmap进行自动向量化和并行化。4. 考虑使用C/CUDA编写高性能计算内核并通过PyTorch扩展调用。一个关键的调试技巧可视化梯度流。在开发可微分模型时我习惯在关键节点如行为模型的输出、损失值上注册钩子hook打印或绘制梯度的范数和分布。这能帮助你快速定位梯度在哪里消失或爆炸从而有针对性地修改模型结构或数值处理方式。6. 未来展望与进阶思考可微分仿真为交通建模与控制打开了一扇新的大门但它仍是一个蓬勃发展的前沿领域有许多开放性问题值得深入。1. 从“可微分”到“可解释”梯度告诉我们参数如何影响输出但有时这种关系是复杂且非线性的。如何将梯度信息转化为人类管理者可以理解的决策建议例如“将A路口的东向绿灯增加5秒主要是因为能缓解下游B路口北向左转的排队”是一个挑战。可解释AIXAI技术如积分梯度、显著性图可以尝试引入。2. 与强化学习的融合可微分仿真和强化学习并非对立而是互补。RL擅长在复杂环境中通过试错学习长期策略但样本效率低。可微分仿真可以提供更精确的模型和梯度信息。一个很有前景的方向是基于模型的强化学习其中可微分仿真就作为那个“模型”用于生成模拟数据或计算价值函数的梯度从而大幅提升RL的训练效率。3. 大规模分布式在线学习一个城市的交通系统是不断演化的。未来的系统可能是一个持续学习的生命体。每个路口或区域的控制器作为一个智能体在本地进行可微分仿真和优化同时通过安全的边缘计算节点共享经验或模型更新实现联邦学习使整个城市交通系统具备集体智能。4. 拥抱新兴数据源网联车CV和车路协同V2X技术能提供更丰富、更精确的实时数据。可微分仿真框架需要升级以融合这些新型数据例如直接接收车辆的意图信号如变道、刹车从而做出更超前、更精准的预测和控制。从我个人的实践来看这项技术从实验室走向真实路口的最大障碍可能不是算法本身而是系统工程和数据质量。如何与现有的交通控制系统通常是封闭、异构的无缝集成如何保证实时数据流的稳定与低延迟如何处理数据中的噪声和缺失这些“脏活累活”往往决定了项目的成败。因此在钻研前沿算法的同时建立一个稳定、可靠的数据流水线和系统架构是与交通管理部门合作时赢得信任的关键。
返回列表