跳转至

High-dimensional online learning via asynchronous decomposition: Non-divergent results, dynamic regularization, and beyond

讲者: Zhifan Li
会场: Some Aspects Related to Feature Learning
报告题目: High-Dimensional Online Learning via Asynchronous Decomposition
链接: arXiv
来源: JCSDS 2026 · 返回会议总览


一、领域脉络与小综述

这个方向是什么

这个子方向解决的根本问题是:如何在高维稀疏模型下,对以批次(batch)形式连续到达的流式数据(streaming data)进行在线(online)统计学习与推断。核心挑战在于:算法必须在不存储全部历史原始数据的前提下,仅利用当前批次数据和一组累积的摘要统计量(summary statistics)来更新参数估计,同时保证估计误差随批次增加不发散,且最终达到与离线分析(即一次性访问全部数据)相当的统计精度。当前该方向的成熟度处于“方法众多但关键瓶颈未解”的阶段——已有方法要么要求批次样本量指数增长,要么误差界随批次指数膨胀,限制了其在长期流式应用中的实用性。

发展脉络(history)

  1. 奠基工作:SGD与RADAR

    • Ruppert (1988); Polyak & Juditsky (1992):提出Polyak-Ruppert平均化SGD,在低维情形下实现O(p)存储和渐近正态性,但在高维情形下ℓ₂估计率仅为N^{-1/4},远非最优。
    • Agarwal et al. (2012b) (RADAR):基于Nesterov对偶平均框架,提出正则化退火历元对偶平均(RADAR)算法,首次在高维稀疏流式数据中达到minimax近优估计率。但其关键局限是要求批次样本量几何增长(n_b ≍ 2^{b-1} n₁),这在实践中往往难以满足。作者在论文中明确指出:“a limitation of RADAR is its reliance on geometrically increasing batch sizes”。
  2. 主要进展:可再生(Renewable)方法与高维扩展

    • Luo & Song (2020):提出可再生学习框架,通过泰勒展开将历史得分函数近似为当前估计处的Hessian矩阵,实现仅需O(p²)存储的递归更新。该工作在低维情形下表现良好,但高维扩展面临根本性困难
    • Luo et al. (2023b); Han et al. (2024); Xie et al. (2025):将可再生框架扩展到高维GLM、单指标模型、分位数回归等,通过ℓ₁惩罚和在线去偏实现推断。然而,这些方法的理论误差界均呈指数级膨胀:∥β̂^(b) - β*∥₂ ≤ C^b √(s log p / N_b),其中C>1是常数。这意味着除非累积样本量N_b随b指数增长,否则误差界在b稍大时即失去统计意义。作者将此称为“exponential inflation of its theoretical error bounds”。
  3. 当前Frontier:信号强度自适应与算法正则化

    • Ndaoud (2019, 2020):在离线高维线性回归中,系统刻画了信号强度对估计精度的影响,证明当最小信号强度超过某个阈值时,ℓ₂误差可从minimax率√(s log(ep/s)/n)提升至Oracle率√(s/n)。这启发了在线学习中“利用信号强度随样本量积累而变弱”这一现象的潜力
    • Fan et al. (2018) (I-LAMM); She et al. (2023) (Slow Kill):提出非凸优化与动态阈值策略,在离线设定下同时控制算法复杂度与统计误差。本文直接借鉴了其“非增阈值序列”的思想,用于在线IHT算法中实现计算-统计误差的联合控制。
  4. 本文的位置:本文提出的异步分解框架(AD-IHT)直接针对上述两个核心瓶颈——可再生方法的误差指数膨胀和RADAR的批次样本量几何增长。其核心创新在于:不再将所有历史得分函数统一在当前估计处展开,而是分别在各自的历史估计处展开,从而保留历史梯度项,将近似误差从一阶降为二阶。这实现了:(i) 误差界非发散(仅log-additive依赖b);(ii) 批次样本量仅需线性增长(n_b ≍ s log p + log b);(iii) 信号自适应地达到Oracle精度。

子线索聚类

  1. 基于SGD的在线学习:Agarwal et al. (2012a) (信息论下界), Chen et al. (2020) (在线去偏SGD), Lee et al. (2025) (分位数回归SGD)。共同特征:O(p)存储,但高维下收敛率次优(N^{-1/4}),且通常需要强凸性假设。
  2. 基于批次的再生/可再生方法:Luo & Song (2020) (低维可再生), Luo et al. (2023b) (高维ℓ₁可再生), Han et al. (2024) (单指标模型), Xie et al. (2025) (分位数回归)。共同特征:O(p²)存储,通过泰勒展开近似历史得分,但误差界随批次指数膨胀。
  3. 信号自适应与算法正则化:Ndaoud (2019, 2020) (信号强度相变), Fan et al. (2018) (I-LAMM), She et al. (2023) (Slow Kill), Tan et al. (2022) (分位数回归凹正则化)。共同特征:利用非凸惩罚或硬阈值算子实现信号自适应,避免ℓ₁正则化对强信号的收缩偏差。

这个方向在追问的核心问题

  1. 如何实现非发散的误差界? 现有可再生方法的误差界随批次指数增长,限制了其应用范围。核心困难在于历史得分函数的泰勒展开近似误差(一阶项)会累积。
  2. 如何避免批次样本量的指数增长? RADAR要求批次样本量几何增长,这在许多实际场景中不可行。能否在固定或线性增长的批次样本量下仍保持统计最优性?
  3. 如何利用信号强度随样本积累而变弱这一现象? 离线理论表明,当信号强度超过某个阈值时,估计率可提升至Oracle率。在线学习中,这一阈值随样本量增加而降低,但现有方法未能利用这一自适应增益。
  4. 如何同时控制每批次的优化误差与统计精度? 可再生方法通常假设优化误差可忽略,但实际迭代算法会引入计算误差,这些误差可能在批次间累积。

⚠️ 作者的framing

作者将缺口frame成:现有高维在线学习方法(可再生方法)的误差界随批次指数膨胀,而RADAR要求批次样本量几何增长,两者都限制了长期流式应用。因此,本文提出的异步分解框架是“显然的下一步”——它同时解决了这两个问题。

被淡化或回避的竞争路线: - RADAR的变体:作者提到“some variants with fixed epoch lengths have been explored (e.g., Section 3.3 in Agarwal et al. [2012b], Juditsky et al. [2023])”,但仅以“these methods often depend on knowing the total sample size N in advance and are thus not directly applicable to a fully online setting”一笔带过。值得研究者去查:这些变体是否真的无法适应完全在线设定?其实际性能如何? - 基于SGD的去偏方法:Chen et al. (2020) 的在线去偏SGD在高维线性模型中实现了渐近正态性,但作者仅在“Related work”中提及,未详细比较其与本文框架在误差界和批次样本量要求上的差异。

什么明显该被引/该存在、却没出现在intro里? - 关于自适应数据收集(adaptive data collection)的近期工作:作者在Discussion中提到了Khamaru et al. (2025)和Lin et al. (2025)作为未来方向,但intro中未提及任何关于“当前批次数据可能依赖于历史估计”的文献。值得研究者去查:是否存在将自适应数据收集与高维在线学习结合的工作?这可能是本文的一个直接扩展方向。 - 关于计算-统计权衡(statistical-computational tradeoff)的文献:本文的AD-IHT算法本质上是一种算法正则化方法,其计算复杂度与统计精度之间存在权衡。但作者未引用任何关于“低度多项式障碍”或“信息-计算缺口”的文献。值得研究者去查:本文的误差界是否在某种计算模型下是最优的?是否存在更快的算法?

张力

未见明显对立引用。所有被引工作基本在“承认可再生方法误差指数膨胀”和“RADAR批次样本量几何增长”这两个问题上达成共识,本文的贡献是在此共识基础上提出解决方案。

二、最核心、最简单的例子 / 数学问题

第一步:符号、模型、可观测数据交代清楚

  • 符号

    • β ∈ ℝᵖ:真参数向量,假设是s-稀疏的(即∥β∥₀ = s)。
    • b = 1, 2, ...:批次索引。
    • D_b = (X_{I_b}, Y_{I_b}):第b批数据,其中X_{I_b} ∈ ℝ^{n_b × p}是设计矩阵,Y_{I_b} ∈ ℝ^{n_b}是响应向量,n_b是批次样本量。
    • N_b = Σ_{j=1}^b n_j:截至第b批的累积样本量。
    • f_b(β):第b批数据的损失函数(如负对数似然)。
    • ∇f_b(β) ∈ ℝᵖ:梯度(得分函数)。
    • ∇²f_b(β) ∈ ℝ^{p×p}:Hessian矩阵。
    • β̂^(b):第b批处理完后输出的最终估计量。
    • β̂^(b,t):第b批内第t次迭代的中间估计量。
    • s:真实稀疏度。
    • p:维度。
    • α_b:累积得分函数无穷范数的上界,即α_b ≥ ∥Σ_{j=1}^b ∇f_j(β*)∥_∞。
    • θ_b:累积得分函数在真实支撑集上的ℓ₂范数的上界,即θ_b ≥ ∥(Σ_{j=1}^b ∇f_j(β))_{S}∥₂。
  • 模型:考虑线性模型作为最简例子: Y_{I_b} = X_{I_b} β + ξ_{I_b}, 其中ξ_{I_b} ∈ ℝ^{n_b}是次高斯噪声。 损失函数为f_b(β) = ∥Y_{I_b} - X_{I_b} β∥₂²。 更一般地,本文考虑GLM:Y_i服从指数族分布,自然参数ζ_i = X_i β,损失为负对数似然。

  • 可观测数据

    • 可观测:每个批次D_b = (X_{I_b}, Y_{I_b})。研究者可以访问当前批次的所有原始数据。
    • 不可观测/潜在:真参数β、噪声ξ、稀疏度s、支撑集S = supp(β*)。
    • 可存储的摘要统计量:累积Hessian矩阵 H_b = Σ_{j=1}^b ∇²f_j(β̂^(j)) ∈ ℝ^{p×p},累积向量 v_b = Σ_{j=1}^b [∇f_j(β̂^(j)) - ∇²f_j(β̂^(j)) β̂^(j)] ∈ ℝᵖ。注意:这些摘要统计量依赖于历史估计β̂^(j),因此是随机的,但一旦计算出来就可以存储,无需保留原始数据。

第二步:讲最小内核

最简特例:考虑最简单的线性模型,每个批次样本量相同(n_b = n),且设计矩阵X_{I_b}是各向同性高斯(即X_i ~ N(0, I_p))。目标是估计β*。

核心困难:在可再生方法中,当处理第b批数据时,需要近似累积得分函数 Σ_{j=1}^b ∇f_j(β)。可再生方法将历史得分 Σ_{j=1}^{b-1} ∇f_j(β) 在当前估计β̂^(b-1)处做一阶泰勒展开: Σ_{j=1}^{b-1} ∇f_j(β) ≈ Σ_{j=1}^{b-1} ∇²f_j(β̂^(b-1)) (β - β̂^(b-1))。 这个近似的误差是O(∥β̂^(b-1) - β∥₂),即一阶误差*。由于β̂^(b-1)本身的误差会随b积累,这个一阶误差也会积累,导致最终误差界指数膨胀。

本文的关键想法(异步分解):不再统一在β̂^(b-1)处展开,而是对每个历史批次j,在其自己的历史估计β̂^(j)处分别展开: Σ_{j=1}^{b-1} ∇f_j(β) = Σ_{j=1}^{b-1} [∇f_j(β̂^(j)) + ∇²f_j(β̂^(j)) (β - β̂^(j)) + O(∥β - β̂^(j)∥₂²)]。 这样,近似误差变成了二阶误差O(∥β - β̂^(j)∥₂²),比一阶误差小得多。更重要的是,历史梯度项∇f_j(β̂^(j))被保留了下来,而不是像可再生方法那样被近似为零。这消除了可再生方法中因近似∇f_j(β̂^(j)) ≈ 0而产生的一阶误差。

在这个最简特例下,要证的命题退化成什么? 要证明:通过异步分解构造的代理损失函数,并用IHT算法优化,得到的估计量β̂^(b)满足: ∥β̂^(b) - β*∥₂ ≤ C √(s (log p + log b) / N_b), 其中常数C不依赖于b。这比可再生方法的C^b √(s log p / N_b)要好得多。

证明怎么走(最简特例下的直觉): 1. 压缩映射:在IHT的每次迭代中,梯度下降步骤本质上是一个压缩映射,将当前估计β̂^(b,t)拉向真值β。压缩因子由Hessian矩阵的特征值决定(RSS假设)。 2. 误差分解:梯度更新可以分解为三部分:(i) 压缩映射项(将β̂^(b,t)拉向β);(ii) 异步优化误差项(来自历史批次泰勒展开的二阶余项);(iii) 随机误差项(来自累积得分函数在β处的值)。 3. 误差传播控制:关键引理(Assumption 3)保证,历史批次的异步优化误差(二阶项)的累积效应,可以被当前批次的随机误差项所“吸收”,从而不会导致误差随b发散。这要求历史误差的加权和不超过当前随机误差的某个倍数。 4. 硬阈值操作*:硬阈值算子通过动态衰减的阈值λ^{(b,t)},逐步筛选出强信号,同时控制估计量的稀疏度。当信号足够强时(超过某个阈值),硬阈值算子不会对信号产生收缩偏差,从而允许后续达到Oracle精度。

为什么成立:因为异步分解将近似误差从一阶降为二阶,而二阶误差的累积可以通过精心设计的“渐进误差控制”条件(Assumption 3)来限制,该条件本质上要求历史批次的二阶误差加权和不超过当前批次的随机波动。在GLM例子中,这转化为对批次样本量的温和要求(n_b ≳ s log p + log b),而不是指数增长。

三、这篇论文做了什么

三句话

  1. 研究了什么问题:高维稀疏模型下的在线学习问题,核心是解决现有方法(可再生方法)误差界随批次指数膨胀、以及RADAR要求批次样本量几何增长这两个关键瓶颈。
  2. 核心工具/方法:提出了一个异步分解框架,将历史得分函数分别在各自的历史估计处展开,而非统一在当前估计处展开,从而将近似误差从一阶降为二阶;并基于此框架设计了一个动态正则化迭代硬阈值(AD-IHT)算法,通过非增阈值序列同时控制计算误差与统计精度。
  3. 主要结论:证明了AD-IHT估计量的ℓ₂误差界对批次索引b呈对数可加(log-additive) 依赖(即C√(s(log p + log b)/N_b)),而非指数依赖;所需每批样本量仅需线性增长(n_b ≳ s log p + log b);并且当信号强度随样本积累而变弱时,估计量能自适应地达到Oracle精度(即C√(s/N_b)),实现几乎完全的支撑恢复。

关键设定与假设

  • 设定:数据以批次D_b形式连续到达,每批样本量n_b。目标是顺序估计一个s-稀疏的高维参数β* ∈ ℝᵖ。每批数据有对应的损失函数f_b(β),假设二阶可微。
  • Assumption 1 (RSS: Restricted Strong convexity and Smoothness):对任意满足|S| ≤ Cs的指标集S,限制性Hessian矩阵∇²f_j(β)_{S,S}的特征值在[m n_j, M n_j]之间,其中m, M > 0是通用常数。含义:损失函数在稀疏子空间上是强凸且光滑的,这是保证IHT算法收缩性质的标准条件。相比已有文献,这里的Cs是通用常数,不随b变化。
  • Assumption 2 (RGS: Restricted second-order smoothness):梯度∇f_j(β)在β附近满足局部二阶光滑性:对任意γ ∈ B₀ᵖ(Cs) ∩ B₂ᵖ(β, δ_j),有∥[∇f_j(β) - ∇f_j(γ) - ∇²f_j(γ)(β - γ)]_S∥₂ ≤ L_j ∥β - γ∥₂²。含义*:控制异步分解中泰勒展开的二阶余项。这是本文特有的假设,用于量化异步优化误差。相比可再生方法(仅需一阶光滑性),本文需要更强的二阶光滑性,但这是将误差从一阶降为二阶的代价。
  • Assumption 3 (Progressive error control):存在序列{α_j}满足α_j ≥ ∥Σ_{k=1}^j ∇f_k(β)∥∞,且对每个b≥1,有C_p Σ{j=1}^b (s L_j α_j² / N_j²) ≤ √s α_{b+1}。含义*:这是控制误差传播的核心条件。它要求历史批次的异步优化误差(加权和)不超过当前批次的随机误差。在GLM例子中,这转化为对初始样本量和批次样本量的具体数值要求。

主要结果

  • Theorem 1 (General batch):在Assumptions 1-3下,对每个批次b,AD-IHT输出的估计量β̂^(b)满足:
    • ℓ₂误差:∥β̂^(b) - β̄∥₂ ≤ C_e √s · α_b / N_b,其中常数C_e不依赖于b。
    • ℓ₀稀疏度:∥β̂^(b)∥₀ ≤ (1 + C_s) s。
    • 核心意义:误差界非发散。常数C_e由m, M, κ决定,与b无关。这直接回答了Question 1。
  • Theorem 2 (Sharper bound):在Theorem 1的条件下,当批次索引b ≥ b*(即信号足够强且历史误差足够弱)时,有更锐利的ℓ₂误差界:
    • ∥β̂^(b) - β̄∥₂ ≤ C_sharp · θ_b / N_b。
    • 核心意义:信号自适应。由于θ_b通常远小于√s α_b(因为θ_b是支撑集上的ℓ₂范数,而α_b是全局ℓ_∞范数),这个界比Theorem 1更紧。当信号足够强时,估计量达到Oracle精度(如同已知支撑集)。这回答了Question 2。
  • Theorem 3 (Streaming GLM):在GLM设定下(Assumptions 4 & 5),若初始样本量n₁ ≳ s² (log² n₁) log²(p ∨ n₁),后续批次n_b ≳ s log p + log b,则AD-IHT以高概率满足:
    • ℓ₂误差:∥β̂^(b) - β*∥₂ ≤ 4√(aU) K C'_e C'_β · √(s (log p + log b) / N_b)。
    • ℓ₀稀疏度:∥β̂^(b)∥₀ ≤ (1 + C'_s) s。
    • 核心意义:具体化。误差界对b是对数可加(log-additive)依赖,而非指数依赖。这显著优于可再生方法的C^b √(s log p / N_b)。同时,批次样本量仅需线性增长,避免了RADAR的几何增长。
  • Theorem 4 (Oracle accuracy and support recovery):在Theorem 3的条件下,当累积样本量N_b满足一定条件(即信号足够强)时:
    • ℓ₂误差:∥β̂^(b) - β*∥₂ ≤ C'_sharp · √((s + log(2b²/ϱ)) / N_b)。(Oracle率,仅多一个log因子)
    • 支撑恢复:|Ŝ^(b) \ S| + |S \ Ŝ^(b)| ≺ s。(几乎完全恢复)
    • 核心意义:自适应Oracle。随着批次增加,估计量自动从minimax率过渡到Oracle率,并实现几乎完全的变量选择。这是本文在在线学习文献中的新颖贡献。

证明路线与技术技巧

  • 整体路线:采用双重数学归纳法

    1. 外层归纳(对批次b):假设对所有历史批次j < b,定理结论成立。然后证明对当前批次b也成立。
    2. 内层归纳(对迭代t):在批次b内,假设对第t次迭代结论成立,证明对第t+1次迭代也成立。
    3. 核心步骤:在每次迭代中,将梯度更新分解为三部分(见公式16):
      • 压缩映射项:η_b A_b(β̄, β̂^(b,t)) + η_b Σ_{j=1}^{b-1} ∇²f_j(β̂^(j)) - I_p,其谱范数被RSS假设控制在(0,1)内,保证收缩。
      • 异步优化误差项:η_b Σ_{j=1}^{b-1} [∇f_j(β̄) - ∇f_j(β̂^(j)) - ∇²f_j(β̂^(j))(β̄ - β̂^(j))],其ℓ₂范数被RGS假设控制为二阶小量。
      • 随机误差项:-η_b Σ_{j=1}^b ∇f_j(β̄),其ℓ₂范数由α_b或θ_b控制。
    4. 稀疏性控制:通过反证法证明,若某次迭代后估计量的支撑集超出真实支撑集太多,则会导致矛盾(公式20-22)。核心是利用硬阈值算子的性质:只有绝对值大于阈值的分量才被保留。
    5. 误差传播控制:Assumption 3确保历史批次的异步优化误差(二阶项)的累积效应,可以被当前批次的随机误差项所“吸收”,从而保证误差界不随b发散。
  • 关键跳跃点

    • 从一阶误差到二阶误差:这是整个证明的基石。可再生方法的一阶近似误差(公式5)导致误差指数膨胀。异步分解通过保留历史梯度项,将误差降为二阶(公式6),这是实现非发散误差的关键。
    • Assumption 3的设计:这个条件看起来技术性很强,但它是连接历史误差与当前随机误差的桥梁。在GLM例子中,它被验证为对样本量的温和要求。难点在于:如何保证这个条件在每批都以高概率成立?作者通过精细的随机矩阵理论和次高斯尾界(Lemma 1-3)来验证。
    • Theorem 2的锐化:从Theorem 1到Theorem 2的过渡,需要利用信号强度条件(b的定义)。关键技巧*是:当信号足够强时,硬阈值算子不会错误地剔除真实信号,从而允许对支撑集上的误差进行更精细的分析(公式39-41),最终得到Oracle率。
  • 技术技巧点名

    • 随机矩阵理论:用于验证RSS假设(Lemma 1),特别是限制性特征值的集中不等式。
    • 次高斯尾界:用于控制随机误差项(Lemma 2 & 3),包括Hsu et al. (2012)的二次型尾界和Vershynin (2010)的随机矩阵尾界。
    • 压缩映射:证明的核心,利用RSS假设保证梯度下降步骤是收缩的。
    • 硬阈值算子:用于强制稀疏性,并避免ℓ₁正则化对强信号的收缩偏差。
    • 动态阈值衰减:借鉴Fan et al. (2018)的I-LAMM,通过非增阈值序列实现计算-统计误差的联合控制。

真实例子与应用

本文为纯理论,无实证例子。 作者仅在GLM设定下进行了理论验证,未提供任何模拟或真实数据实验。

🔎 结论是否比证明窄

  • Theorem 2的锐利界依赖于b*的定义:b = b₁ ∨ b₂,其中b₁要求最小信号强度超过某个阈值,b₂要求历史误差足够弱。论文没有给出b的具体上界,只是说“当N_b足够大时”。这意味着Theorem 2的结论是渐近的(随b增加),而非对每个b都成立。作者在GLM例子中(Theorem 4)给出了N_b的具体条件(公式15),但该条件依赖于未知参数(如最小信号强度),因此是非自适应**的。
  • Theorem 4的支撑恢复是“几乎完全恢复”而非“精确恢复”:结论是|Ŝ^(b) \ S| + |S \ Ŝ^(b)| ≺ s,即错误数量远小于s,但并未证明错误数量为0。这与离线文献中在“最小信号强度”条件下的精确恢复结果相比,稍弱一些。
  • Assumption 3的验证依赖于GLM的具体结构:作者在Section 7.3中验证了GLM满足Assumption 3,但这依赖于GLM的特定性质(如次高斯误差、限制性特征值)。对于更一般的损失函数,Assumption 3是否容易验证? 论文未讨论。这限制了框架的通用性。

四、开放问题

  1. 建立统一的渐近推断理论:作者在Discussion中提到“a natural progression is to establish asymptotic inference properties that hold uniformly for all batches b ≥ 1”。扎根于:Section 4第一段。目前本文只给出了ℓ₂误差界,未涉及置信区间或假设检验。如何结合在线精度矩阵估计和去偏技术,实现对所有批次统一的渐近正态推断,是一个直接且重要的开放问题。

  2. 扩展到非光滑损失函数:本文要求每批损失函数二阶可微(Assumption 1 & 2),这排除了Huber损失、分位数损失等鲁棒损失。扎根于:Section 4第二段。作者提到“introduce second-order smoothing for these losses and embed them into our framework”。如何对非光滑损失进行二阶平滑,并保持本文的非发散误差和自适应性质,是一个有挑战性的方向。

  3. 处理自适应数据收集:本文假设数据是独立同分布或至少是预先收集好的。但在多臂老虎机等场景中,当前批次的数据收集可能依赖于历史估计。扎根于:Section 4第三段,以及引用的Khamaru et al. (2025)和Lin et al. (2025)。如何将异步分解框架扩展到自适应数据收集场景,并处理由此产生的依赖性和选择性偏差,是一个重要的未来方向。

  4. 计算-统计最优性:本文的AD-IHT算法是一种算法正则化方法,其计算复杂度(每批迭代次数)与统计精度之间存在权衡。扎根于:论文未讨论。是否存在一个计算-统计相变?即,在多项式时间限制下,本文的误差界是否是最优的?这需要与低度多项式障碍或SQ下界等计算复杂性理论建立联系。值得研究者去查:本文的误差界是否与某个已知的计算下界相匹配?


Maintained by 陈星宇 · Homepage · Source on GitHub

评论