想象你在管理一座繁忙的“忘忧城”。最初,你只需要一张静态的街区图——哪些路相通、哪些街区挨着,画好就够用了。可城市是活的:新住户搬进来,老街区被改造,原先的邻居突然搬走,两栋楼之间多出一条捷径。如果你一直拿着旧地图导航,注定会迷路。同样的道理也发生在数据世界:社交网络里的好友关系、金融网络里的转账往来、交通网络里的拥堵传播,都没有一刻是静止的。动态图的表示学习与时序演化建模,就是教机器学会“看一座城市的地图册”——不仅看某一页,而是理解每一页之间的变化规律,进而预测下一页会发生什么。 在这篇文章里,我们把整座城市当作一个动态图:居民是节点,人际关系是边。你将从“静态图”出发,一步步理解快照图序列、节点状态更新、时序演化建模、动态嵌入方法以及时序采样策略,最终学会如何用动态图表示学习去解决真实的链路预测问题。别担心,整篇故事只用“城市演进”这一个比喻,读完你会发现:原本感觉高深的动态图,其实就是“会动的地图”而已。

岗位关联

对 AI 从业者而言,动态图表示学习是走向推荐、风控、交通预测等实时场景的必经之路。掌握它,意味着你能让模型不再是“看一张旧照片”,而是“读懂一段连续的城市故事”。

目录
  1. 可视化演示
  2. 动态图基础
  3. 快照图序列
  4. 节点状态更新
  5. 时序演化建模
  6. 动态嵌入方法
  7. 时序采样策略
  8. 下游任务评估
  9. 挑战与前景
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

快照图序列与离散时间建模 快照图方法 快照图序列将动态图离散化为静态图序列 连续时间动态图模型 Φ(t) = √(1/d)·[sin(ηt),cos(ηt)...] m(t) = GRU(m(t-1), message(t)) 动态图表示学习可视化:快照图序列、...

动态图基础

还是回到“忘忧城”。当初城市规划师只需画一张街区图:哪里有路、哪里是公园,标清楚就够了。可城市每天都在生长——新楼盘交付、老商圈搬迁、地铁线路延伸到城市另一端。这时候,一张固定不变的地图反而会误导人。你真正需要的,是一本“城市图册”:每一页记录某个时刻的人口分布与街区关系。这就是动态图与传统静态图最根本的差异:静态图是单页,动态图是整个相册。

在计算机里,这种“相册”被形式化为一组随时间排列的图快照。社交网络中,今天你关注了谁、明天谁取关了你;交易网络中,这笔转账发生在几点几分、那笔交易又在哪一刻被标记异常。每个时间点上的图都不同,却又彼此关联——前一刻的互动会影响后一刻的关系。动态图表示学习要做的,正是从这组“连续快照”中挖出演化的规律。

动态图通常被写成如下形式:

理解动态图的第一步,不是去背复杂的模型,而是先认清“城市被记录在哪些时间点”。后面所有的快照聚合、节点更新、时序建模,都建立在这样一个时间序列之上。把这一页看明白,你就已经迈进了动态图的门口。

Gt=(Vt,Et),t=1,2,…,TG_t = (V_t, E_t), \quad t = 1, 2, \ldots, T
  1. 图快照\(G_t\) 表示时刻 \(t\) 的整张图,相当于城市相册中第 \(t\) 页的全景照片。
    GtG_t
  2. 节点集合\(V_t\) 是时刻 \(t\) 的节点集合,对应当时仍住在城里的居民。
    VtV_t
  3. 边集合\(E_t\) 是时刻 \(t\) 的边集合,对应居民之间此刻依然有效的关系。
    EtE_t
  4. 时间推进\(t\) 从 1 取到 \(T\),就像把照片按时间顺序整理成册。
    t=1,2,…,Tt = 1, 2, \ldots, T

快照图序列

为了让城市图册不重不漏,绘图员决定每隔一段时间就拍摄一张“城市全景照”。这些全景照就是图快照 \(G_t\)。但快照不是拍得越密越好——如果一小时拍一张,一个季度就是两千多张,既有噪音又浪费存储;如果一年才拍一张,又可能漏掉街区之间的关键变化。快照机制的核心,是在“记录多少细节”和“保留多久历史”之间做权衡。

实际操作中,我们通常不会把全部历史快照都塞进模型,而是引入一个“时间窗口”。窗口大小 \(\tau\) 表示模型最多往前看几步。比如 \(\tau = 3\),就表示模型只关心最近三个时间步的历史。窗口太小,就像只回看上周的天气就要预测下周;窗口太大,则像把十年前的街区格局也当作今天的重要信息。

为了让窗口内的信息形成一张可用的图,我们还要做“聚合”——把多张快照合并成一张代表当前状态的加权图:

快照序列的构建质量,直接决定后续模型的“视野”。就好像一位老记者整理档案:把无关的旧新闻剔除,把最近的关键事件高亮,最后浓缩成一份真正有价值的简报——这份简报,就是 \(\hat{G}_t\)。

G^t=Agg(Gt−τ+1,Gt−τ+2,…,Gt)\hat{G}_t = \text{Agg}(G_{t-\tau+1}, G_{t-\tau+2}, \ldots, G_t)
  1. 聚合结果\(\hat{G}_t\) 是经过窗口聚合后得到的图,可理解为“综合最近几页照片画出的最新地图”。
    G^t\hat{G}_t
  2. 聚合操作\(\text{Agg}\) 是聚合函数,可以是加权平均、求和,也可以是更复杂的注意力聚合。
    Agg\text{Agg}
  3. 窗口起点\(G_{t-\tau+1}\) 是窗口内最早的一张快照,相当于相册中“还值得参考”的最老一页。
    Gt−τ+1G_{t-\tau+1}
  4. 窗口终点\(G_t\) 是最新一张快照,代表当前时刻城市的实际状态。
    GtG_t

节点状态更新

想在忘忧城判断某位居民最近在忙什么,最聪明的办法不是去盘问他本人,而是看他身边那圈朋友:朋友新开的店、刚搬的街区、最近频繁联系的伙伴。节点的“状态”也是如此——它不应该只由自己决定,而应该通过邻居的消息不断修正。这就是动态图里节点状态更新的核心思想:用邻居的信息来更新自己。

这里说的“状态”,是节点在某个时刻的向量表示 \(h_v\),你可以把它理解为居民的“动态小传”。刚开始,小传可能是空白的;但每次消息传递,邻居都会把自己的“小传摘要”发过来,经过聚合形成一条综合信息,再与自己原来的小传融合,生成新的版本。这个过程可以表示为:

城市里的消息就是这样一层层传开的:先问身边朋友,再让朋友去问他们的朋友。动态图把这种“邻居聚合—自身更新”的过程沿着时间轴反复执行,每过一个时刻,居民的小传就会根据最新的邻里关系刷新一次。最终拿到手的,是一份份跟得上城市变化的“活户口本”。

hv(t)=σ(1∣N(v)∣∑u∈N(v)Whu(t−1)+b)h_v^{(t)} = \sigma\left(\frac{1}{|\mathcal{N}(v)|} \sum_{u \in \mathcal{N}(v)} W h_u^{(t-1)} + b\right)
  1. 当前状态\(h_v^{(t)}\) 是节点 \(v\) 在时刻 \(t\) 更新后的状态向量,也就是居民“最新版小传”。
    hv(t)h_v^{(t)}
  2. 邻居集合\(\mathcal{N}(v)\) 是 \(v\) 的直接邻居集合,相当于和这位居民有来往的熟人圈。
    N(v)\mathcal{N}(v)
  3. 邻居聚合\(\frac{1}{|\mathcal{N}(v)|} \sum_{u \in \mathcal{N}(v)} W h_u^{(t-1)}\) 把每个邻居上一时刻的状态乘上权重矩阵 \(W\) 后取平均,相当于听取一圈熟人的综合意见。
    1∣N(v)∣∑u∈N(v)Whu(t−1)\frac{1}{|\mathcal{N}(v)|} \sum_{u \in \mathcal{N}(v)} W h_u^{(t-1)}
  4. 激活函数\(\sigma\) 是对结果做非线性变换的激活函数,让状态数值保持在合理范围。
    σ\sigma

时序演化建模

城市的生活是有节奏的:工作日的早高峰拥堵、周末商圈的人潮涌动、节假日的人口迁徙。这些规律不是一天形成的,而是长期历史累积的结果。动态图的时序演化建模,就是想教会模型识别这种“城市节奏”——不是孤立地看某一时刻,而是把历史串成一条线来理解。

一种主流做法是使用循环神经网络,比如 LSTM,逐个读取时刻的图快照。每一步,模型都会把“当前时刻的图信息”和“上一步留下的记忆”组合起来,生成新的全局状态。用矩阵形式表示,所有节点的状态合起来是 \(\mathbf{H}^{(t)}\),更新方式为:

除了循环编码,注意力机制也是时序建模中的常用工具:模型不再机械地逐帧读取,而是自己决定“哪一帧更重要”。就好比球赛剪辑师不会平均分配镜头,而是把重心放在最后十分钟的关键进攻上。时序演化建模的意义,正是让模型不只看见城市“现在长什么样”,更理解它“怎么走到这一步”。

H(t)=LSTM(G^tH(t−1),H(t−1))\mathbf{H}^{(t)} = \text{LSTM}\left(\hat{G}_t \mathbf{H}^{(t-1)}, \mathbf{H}^{(t-1)}\right)
  1. 全局状态矩阵\(\mathbf{H}^{(t)}\) 把所有节点的状态向量拼在一起,相当于城市整份“居民小传合集”。
    H(t)\mathbf{H}^{(t)}
  2. 上一时刻记忆\(\mathbf{H}^{(t-1)}\) 是模型对过去全部历史压缩后的记忆,相当于记者脑中“此前所有报道的摘要”。
    H(t−1)\mathbf{H}^{(t-1)}
  3. 当前图聚合\(\hat{G}_t \mathbf{H}^{(t-1)}\) 表示用当前时刻的图结构,对历史状态做一次“空间刷新”,让关系变化先影响邻居状态。
    G^tH(t−1)\hat{G}_t \mathbf{H}^{(t-1)}
  4. LSTM 更新\(\text{LSTM}\) 通过门控机制决定哪些历史信息值得保留、哪些应当遗忘,实现滚动式时序编码。
    LSTM\text{LSTM}

动态嵌入方法

如果给每个居民制作一张随时更新的“身份名片”,上面写着他目前的职业、活跃圈子和近期动向,这张名片就是一个动态图嵌入。嵌入的本质是把节点投射到低维向量空间,而动态图嵌入强调:这个向量不是一成不变的,它跟着时间走。

从方法上看,动态嵌入大致分成两条路线。第一条关注“拓扑演化”:用图注意力、图自编码器等结构模型捕捉邻居集合的逐步变化,比如谁新加入了谁的圈子;第二条关注“时间演化”:用循环网络或时间窗口处理节点在时间线上的轨迹,比如一个人从“潜水用户”慢慢变成“活跃博主”。两条路线最终都会汇合到同一个目标——为每个节点、每个时刻产出一个低维向量:

有了这张“流动名片”,下游任务才能精准运作:推荐系统在合适的时机把有共同兴趣的人互相引荐,风控系统在某个账户状态突变时及时发出警报。名片是动态的,因为人总是在变;嵌入是动态的,因为图一直在演化。

zv(t)=Encoder(hv(t))z_v^{(t)} = \text{Encoder}\left(h_v^{(t)}\right)
  1. 节点嵌入\(z_v^{(t)}\) 是节点 \(v\) 在时刻 \(t\) 的最终嵌入向量,相当于居民此刻的“数字身份名片”。
    zv(t)z_v^{(t)}
  2. 输入状态\(h_v^{(t)}\) 是经过前面节点状态更新与时序建模后的状态向量。
    hv(t)h_v^{(t)}
  3. 编码器\(\text{Encoder}\) 是一个可学习的神经网络,把高维状态压缩成低维、稠密的嵌入。
    Encoder\text{Encoder}

时序采样策略

如果让你回忆忘忧城最近的变化趋势,你不会把十年前每条街道的变迁都翻出来,而是优先回想最近几个月的关键事件。动态图建模也应遵循这个直觉:时间越近,信息越重要。这种直觉被形式化成“时间衰减”——距离当前时刻越远的边,影响力越小。

在具体模型中,时间衰减通常体现为对边或邻居的权重调整:

时序采样策略还包括“邻域采样”和“时序游走”。邻域采样是每步只选部分邻居做消息传递,减少计算量;时序游走则要求游走路径沿着时间递增的边前进,让采样得到的序列天然保留演化顺序。这就像记者的采访策略:不去翻十年前的旧档案,而是循着最近的人脉线索,一步步还原事件的来龙去脉。

w(u,v,t)=exp⁡(−t−tuvτ)w(u,v,t) = \exp\left(-\frac{t - t_{uv}}{\tau}\right)
  1. 边权重\(w(u,v,t)\) 表示边 \((u,v)\) 在时刻 \(t\) 的采样权重,决定这条关系被模型“看重多少”。
    w(u,v,t)w(u,v,t)
  2. 距现在的时间\(t - t_{uv}\) 是当前时刻与边最后发生时间之间的间隔,相当于“这件事发生了多久”。
    t−tuvt - t_{uv}
  3. 时间尺度参数\(\tau\) 控制衰减快慢,\(\tau\) 越大,历史信息衰减越慢;\(\tau\) 越小,模型越只关心最近动态。
    τ\tau
  4. 指数映射\(\exp\) 把间隔映射到 \((0,1]\) 区间,最近的事件权重接近 1,越久远越接近 0。
    exp⁡\exp

下游任务评估

给忘忧城画了一整套动态地图,怎么判断它画得准不准?最经典的验证方法是“回访预测”:只允许模型看到某个时间点之前的数据,然后让它预测之后会出现的新关系。如果地图真的理解了城市演化规律,它就应该能提前猜中“谁会搬进谁的小区”。这种任务就是链路预测。

链路预测中,模型会给每条候选边打一个“存在可能性”得分。评估这些得分最常用的指标是 AUC(Area Under the ROC Curve),它的数学定义是:

AUC 的通俗含义是:随机抽一条真实边和一条虚假边,模型给真实边打更高分的概率。AUC 越高,说明模型越能分清“会发生的缘分”和“不会发生的偶遇”。除了链路预测,节点分类也是常见评估方式——利用学到的动态嵌入去预测节点的社区归属,检验嵌入是否保留了节点本身的语义信息。

AUC=1n+n−∑i=1n+∑j=1n−I(y^i+>y^j−)\text{AUC} = \frac{1}{n^+ n^-}\sum_{i=1}^{n^+}\sum_{j=1}^{n^-} \mathbb{I}\left(\hat{y}_i^+ > \hat{y}_j^-\right)
  1. 正负样本数\(n^+\) 是真实存在的边(正样本)数量,\(n^-\) 是不存在的边(负样本)数量。
    n+,n−n^+, n^-
  2. 正样本得分\(\hat{y}_i^+\) 是模型给第 \(i\) 条真实边打出的得分。
    y^i+\hat{y}_i^+
  3. 负样本得分\(\hat{y}_j^-\) 是模型给第 \(j\) 条不存在的边打出的得分。
    y^j−\hat{y}_j^-
  4. 指示函数\(\mathbb{I}(\cdot)\) 在条件成立时取 1,否则取 0,用来统计“正样本比负样本得分高”的次数。
    I\mathbb{I}

挑战与前景

把动态图方法从论文搬进真实业务,就像把城市测绘从实验室搬到现实世界,困难接踵而至。第一座大山是“城市太大”——忘忧城有千万人口,每秒钟都有新的关系产生,模型如果每次都要重新跑一遍全图,计算资源根本撑不住。这对应动态图的可扩展性挑战:我们需要增量式地更新节点状态,而不是每次从头训练。

第二座大山是“新区没有历史”——新注册的用户、新开通的航线,没有任何历史快照可供参考。这对应冷启动问题:如何利用节点属性、社区先验或相似用户的信息,让“新居民”也能快速获得可靠的嵌入。为了理解动态图模型的训练目标,最常用的损失函数是链路预测损失:

展望未来,动态图建模正从“研究课题”走向“生产组件”:增量式图神经网络、时序游走与大语言模型的结合、可解释的动态演化归因,都是被看好的方向。给一座永远在变化的城市做地图,从来不是一次性工程,而是一项需要持续投入的长效工作——模型要跟上城市的步伐,地图才能永远新。

L=∑(u,v,t)∈D−log⁡σ(zu(t)⊤zv(t))\mathcal{L} = \sum_{(u,v,t)\in\mathcal{D}} -\log\sigma\left(z_u^{(t)\top} z_v^{(t)}\right)
  1. 观测边集合\(\mathcal{D}\) 是训练集中真实存在的时间边集合,相当于城里确实发生的熟人关系。
    D\mathcal{D}
  2. 嵌入相似度\(z_u^{(t)\top} z_v^{(t)}\) 是两个节点嵌入的内积,数值越大表示它们在此时刻关系越亲密。
    zu(t)⊤zv(t)z_u^{(t)\top} z_v^{(t)}
  3. 对数概率\(-\log\sigma(\cdot)\) 把相似度变成“这条边不该是负样本”的惩罚,边越假,损失越大。
    −log⁡σ-\log\sigma
  4. 求和优化对所有正样本求和并最小化 \(\mathcal{L}\),等价于让真实相连的节点嵌入在对应时刻更靠近。
    L\mathcal{L}

AI 应用场景

社交网络好友推荐

阶段:特征表示学习(链路预测)

解决的问题:传统推荐系统把每个用户“定格”在某一个时间点,看着好友列表做推荐,无法感知关系从“陌生”到“熟络”的渐进过程。动态图把关注、互动、聊天等行为按时间戳记录下来,让模型在每次更新中体会用户兴趣的变化,从而预测“下一步最可能成为好友”的关系边。

具体案例:某短视频社区用动态图嵌入作为召回特征,对用户近两周的互动序列建模,在 A/B 实验中,新用户的好友推荐点击率提升了约 15%。

金融交易反欺诈

阶段:异常检测与动态监测

解决的问题:静态交易图只呈现“谁转给了谁”的结果,看不出账户“潜伏—试探—爆发”的行为节奏,很多欺诈账户直到活动末期才被识别。动态图跟踪每笔交易发生时账户状态的变化,让节点的状态向量随交易行为实时刷新,从而更早暴露异常模式。

具体案例:银行风控团队将千万级流水构建成动态交易图,配合时间窗口和节点状态更新,在数分钟内标记出多个疑似洗钱团伙,识别时效和准确率显著优于传统规则引擎。

城市交通流量预测

阶段:时空建模与时序预测

解决的问题:路段的拥堵关系是随时间变化的,早晚高峰、事故封路都会改变路网的“有效连接”。静态图模型对这类突变反应迟缓,而动态图用快照序列加时序模型,让每个路段的嵌入跟随邻居的拥堵状态持续演化。

具体案例:某导航平台以小时为粒度构建城市路网动态图,预测未来 15–60 分钟的拥堵等级,结果显示导航 ETA 的平均偏差下降约 8%。

Python 演示

python53 行
"""动态图表示学习:基于快照的节点状态演化示例"""import numpy as np  def gen_dynamic_graph(n=12, steps=5, p_add=0.25, p_rm=0.2):    """生成一个随时间演化的动态图序列(邻接矩阵列表)"""    rng = np.random.default_rng(42)    A = (rng.random((n, n)) < 0.2).astype(float)    A = np.triu(A, 1) + np.triu(A, 1).T    seq = [A.copy()]    for _ in range(steps - 1):        A2 = A.copy()        for i in range(n):            for j in range(i + 1, n):                if A[i, j] > 0 and rng.random() < p_rm:                    A2[i, j] = A2[j, i] = 0                elif A[i, j] == 0 and rng.random() < p_add:                    A2[i, j] = A2[j, i] = 1        A = A2        seq.append(A.copy())    return np.stack(seq)  def window_aggregate(seq, t, tau=2):    """聚合最近 tau 步,得到当前时刻的加权邻接矩阵(时间窗口)"""    start = max(0, t - tau + 1)    agg = np.zeros_like(seq[0])    for k in range(start, t + 1):        age = t - k        agg += np.exp(-age) * seq[k]    return agg  def update_states(H, A_agg, W, b):    """节点状态更新:聚合邻居信息并按可学习权重变换"""    return np.tanh(A_agg @ H @ W + b)  def main():    seq = gen_dynamic_graph()    n, steps = seq.shape[1], seq.shape[0]    H = np.random.randn(n, 4) * 0.01    W = np.eye(4) * 0.5    b = np.zeros(4)    for t in range(steps):        A_agg = window_aggregate(seq, t)        H = update_states(H, A_agg, W, b)        edges = int(A_agg.sum() / 2)        print(f"t={t} 加权边数={edges:.0f} 状态均值={H.mean():.4f}")  if __name__ == "__main__":    main()
目的:用纯 NumPy 实现一个精简的动态图学习流程,演示“快照序列 → 时间窗口聚合 → 节点状态更新”的核心链路。
  1. A = (rng.random((n, n)) < 0.2).astype(float)以 20% 的概率随机生成初始邻接矩阵,作为城市第一张地图。
  2. A = np.triu(A, 1) + np.triu(A, 1).T只保留上三角再镜像,确保生成的是无向图的对称邻接矩阵。
  3. seq.append(A.copy())把当前时刻的图快照存入序列,构成“城市图册”。
  4. agg += np.exp(-age) * seq[k]用指数衰减给更早的快照打折扣,距离当前越远权重越小。
  5. return np.tanh(A_agg @ H @ W + b)把邻居状态聚合结果经过非线性激活,得到节点新状态。
  6. H = update_states(H, A_agg, W, b)每个时刻先聚合窗口内历史信息,再更新节点状态,形成时序演化闭环。

常见误区

误区以为时间窗口开得越大、塞进去的历史快照越多,模型掌握的信息就越全,效果自然更好。于是把窗口从 3 调到 30,模型却越来越不灵敏。

正解窗口太大,相当于让模型记住十年前的城区街景,真正说明未来走向的“近期变化”反而被淹没在旧数据里。动态图建模要做的是“恰当长度”的记忆——窗口大小需要结合业务周期调节,比如交易数据看分钟级、社交关系看周级,而不是盲目堆历史。

为何常见:人们习惯性觉得“数据越多越不亏”,却忽略了图数据天然带有时间老化特性——旧信息的价值会衰减。

误区以为只要在每个时间步独立跑一遍静态图嵌入,再把结果拼起来,就得到了动态图嵌入。这样操作简单,却得不到真正的演化表示。

正解独立训练会让相邻时刻的嵌入处于不同坐标系,就像两台相机分别拍同一个街区,拍出来的照片却对不齐。动态方法通过共享参数或时间状态传递,让相邻时刻的嵌入彼此连续、可比,这才是“演化”的意义所在。

为何常见:静态图嵌入工具普及太广,开发者容易先入为主,忽视了动态图的核心在于跨时间的信息共享与状态传播。

误区觉得只要给近期边乘以一个大权重、给远期边乘一个小权重,模型就已经“会建模时间”了。

正解时间衰减只是时序建模的一种简化先验,而不是全部。交易网络中,几秒前的边和几小时前的边含义截然不同;衰减参数 \(\tau\) 选得不合适,模型要么退化回静态图,要么过于敏感。真正完备的时序建模还需要循环编码、注意力机制和合理的采样策略协同工作。

为何常见:指数衰减公式只有一个参数,看起来简单,容易让人低估时间建模本身的复杂度。

误区看到链路预测的 AUC 指标很高,就认为这个动态嵌入方法在所有场景都比其他方案强。

正解AUC 描述的是排序质量,只是评估体系里的一环。就像只走访城市一条主干道,不能断言整个城市交通顺畅。评估动态图嵌入时,还要看冷启动节点的表现、嵌入随时间的稳定性、计算开销和落地成本,综合判断才靠谱。

为何常见:论文和榜单偏爱 AUC 这种单一数字指标,容易让人忽略真实业务中多维度的评估需求。

面试题

Q1. 动态图与静态图的核心区别是什么?

单选题 · easy

  • A.动态图包含时间维度与演化信息← 正确答案
  • B.动态图只比静态图多了标注
  • C.动态图不支持节点属性特征
  • D.静态图才有邻接矩阵结构

答案:A。动态图把时间维度纳入图数据,节点和边会随时间演化,这是它与静态图的根本区别。B、C、D 都属于常见误解:动态图不仅支持节点属性,也完全可以使用邻接矩阵,只是这些矩阵会随时间变化。用城市作比,静态图是一帧街景照片,动态图是一部持续更新的城市纪录片。

Q2. 快照图序列中,时间窗口的主要作用是什么?

单选题 · easy

  • A.决定模型回看多近的历史情况← 正确答案
  • B.决定节点嵌入向量的维度大小
  • C.决定随机游走的步数设置
  • D.决定链路预测的最终得分

答案:A。时间窗口决定模型从历史快照序列中读取多长一段信息,直接影响模型能否捕捉到有效演化信号。B 是嵌入维度问题,C 是采样策略问题,D 是任务输出问题,都与时间窗口无关。就像城市摄影的不同快门节奏,窗口越合理,拍摄到的趋势越准确。

Q3. 节点状态更新中,邻居消息传递的核心作用是什么?

单选题 · easy

  • A.让节点吸收周围环境的变化← 正确答案
  • B.让所有节点更新成同一状态
  • C.让边权重归一到固定范围
  • D.让嵌入空间自动降低维度

答案:A。消息传递让每个节点从邻居那里收集信息,从而感知周围环境的变化并更新自身状态。B 把聚合误解为同化,C 是归一化的目标,D 是降维问题,均与消息传递无关。生活在城市里的每个居民,都会受朋友动态影响,这正是节点状态更新的意义。

Q4. 在时序演化建模中,LSTM 的主要角色是什么?

单选题 · mid

  • A.压缩历史状态并滚动预测← 正确答案
  • B.完全替代邻接矩阵做训练
  • C.删除旧边以降低计算量
  • D.将节点标签转为连续向量

答案:A。LSTM 通过门控机制把历史状态压缩成记忆并滚动更新,让模型在长时序中记住重要演化信息。B 错在邻接矩阵仍是核心输入,C 是采样层的工作,D 是嵌入层的工作。它就像城市档案员,既记得老格局,又随时更新新地图。

Q5. 时间衰减公式 \(w=e^{-\Delta t/\tau}\) 中,参数 \(\tau\) 越大说明什么?

单选题 · mid

  • A.历史信息影响力衰减得越慢← 正确答案
  • B.历史信息影响力衰减得越快
  • C.边的初始权重变得越大
  • D.边的初始权重变得越小

答案:A。\(\tau\) 是时间尺度参数,\(\tau\) 越大,指数衰减越平缓,意味着较久以前的事件仍保留较高权重;\(\tau\) 越小,模型越只关心眼前的数据。C、D 描述的是边权重初始值,不受 \(\tau\) 控制。这就像城市记忆:\(\tau\) 大的人对老街念念不忘,\(\tau\) 小的人只记得昨天发生了什么。

Q6. 链路预测中,AUC 指标描述的是什么?

单选题 · mid

  • A.正样本得分高于负样本的比例← 正确答案
  • B.预测图中边的总数量占比
  • C.节点嵌入向量间的平均距离
  • D.模型训练轮数的收敛速度

答案:A。AUC 表示随机抽取一条真实边和一条虚假边时,真实边得分更高的概率。它衡量的是一种排序质量,而非边数、距离或训练速度。类比城市预测:AUC 高,说明模型能分清“哪些人际关系会成真”,而不是只看地图上画了多少条线。

Q7. 动态图嵌入中的“冷启动”问题指的是什么?

单选题 · hard

  • A.新节点缺少历史数据难以嵌入← 正确答案
  • B.初始节点太少导致严重过拟合
  • C.时间窗口过小导致信息稀疏
  • D.模型损失函数收敛速度过慢

答案:A。冷启动指新加入的节点在历史快照中没有出现,模型无法通过时间演化获得它的可靠表示。B 是数据规模问题,C 是窗口配置问题,D 是优化问题,均不等同于冷启动。就像新搬进忘忧城的居民没有过去的社交记录,要预测他的行为,只能借助属性或相似老住户的信息。

Q8. 下列哪些是常见的动态图建模策略?

多选题 · mid

  • A.使用循环网络编码时序信息← 正确答案
  • B.使用图注意力聚合邻居信息← 正确答案
  • C.对全图直接做奇异值分解
  • D.使用时序游走采样演化路径← 正确答案

答案:ABD。循环网络负责时序编码,图注意力负责邻域聚合,时序游走负责采样带时间顺序的路径,三者都是动态图建模的常用工具。而直接对全图做奇异值分解是静态降维方法,虽然历史上有过应用,但它不天然包含时间演化机制,自然不属于常见动态建模策略。

Q9. 下列哪些做法能缓解动态图模型的可扩展性压力?

多选题 · hard

  • A.对大规模图使用邻居采样← 正确答案
  • B.每个时刻重新训练全模型
  • C.使用增量式节点状态更新← 正确答案
  • D.用注意力关注全部历史边

答案:AC。邻居采样能显著减少每步消息传递的计算量,增量式状态更新让模型不必重新训练整个图,两者都是缓解可扩展性压力的有效手段。而每个时刻都重训全模型只会让开销翻倍,关注全部历史边则会让计算复杂度随时间线性增长,与可扩展性目标背道而驰。

Q10. 评估动态图嵌入质量时,常见的下游任务有哪些?

多选题 · mid

  • A.链路预测与时序边预测← 正确答案
  • B.节点分类与社区发现← 正确答案
  • C.图的可视化与聚类分析← 正确答案
  • D.数据的版权与配额管理

答案:ABC。链路预测和时序边预测用于检验模型对未来关系的判断力,节点分类和社区发现用于检验嵌入是否保留语义,可视化和聚类分析帮助判断嵌入空间的分布结构,这三类都是常见评估手段。数据版权与配额管理属于业务治理问题,与嵌入质量评估无关。