Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Math——f-divergence


f-divergence定义

  • \( f \)-散度(\( f \)-divergence)是概率论和信息论中的一种概念,用于衡量两个概率分布之间的差异
  • 形式上,对于两个概率分布 \( P \) 和 \( Q \),定义在一个共同的样本空间上, \( f \)-散度可以被定义为:
    $$ D_f(P|Q) = \int_{\Omega} q(x) f\left(\frac{p(x)}{q(x)}\right) dx $$
    • \( \Omega \) 是样本空间
    • \( p(x) \) 和 \( q(x) \) 分别是 \( P \) 和 \( Q \) 的概率密度函数
    • \( f \) 是一个凸函数,满足 \( f(1) = 0 \),这是为了保证当 \( P = Q \) 时 \( D_f(P|Q) = 0 \)
  • \( f \)-散度的一个重要性质是它是非负的,即 \( D_f(P|Q) \geq 0 \),并且只有当 \( P = Q \) 时等号成立。这意味着 \( f \)-散度可以作为两个概率分布之间距离的一种度量,尽管它不满足距离的所有公理(比如对称性)

常见的 f-divergence 例子

  • Kullback-Leibler 散度 (KL 散度),其中 \( f(u) = u \log u \)
    • 注意带入以后可以消去分母得到KL散度的最终公式
  • Hellinger距离,这里 \( f(u) = (\sqrt{u} - 1)^2 \)
  • 总变差距离,此时 \( f(u) = |u - 1| \)
  • χ²散度,使用 \( f(u) = \frac{(u - 1)^2}{u} \)

附录:KL 散度的非负性证明

  • 核心,利用Jensen 不等式证明 Kullback-Leibler(KL)散度是非负的
  • 对于两个概率分布 \( P \) 和 \( Q \) 在同一空间 \( \mathcal{X} \) 上,KL 散度定义为:
    $$
    D_{\text{KL} }(P \parallel Q) = \sum_{x \in \mathcal{X} } P(x) \log \frac{P(x)}{Q(x)}
    $$
    • 注意 KL 散度的积分权重和分子是相同的(这是由其含义和非负性决定的,详情见附录),若对换分子分母,得到的是 KL 的负数值
  • 对于连续变量,定义为:
    $$
    D_{\text{KL} }(P \parallel Q) = \int_{-\infty}^{\infty} p(x) \log \frac{p(x)}{q(x)} , dx
    $$
    • 其中 \( p(x) \) 和 \( q(x) \) 分别是 \( P \) 和 \( Q \) 的概率密度函数
  • 进一步地,KL 散度可以表示为:
    $$
    D_{\text{KL} }(P \parallel Q) = \mathbb{E}_{P} \left[ \log \frac{P(x)}{Q(x)} \right]
    $$
    • 即 \( \log \frac{P(x)}{Q(x)} \) 在分布 \( P \) 下的期望
  • KL 散度非负性的直观理解:
    • 表面上看,KL 散度内部是两个 对数的差,应该是有正有负的
    • 实际上,由于 KL 散度是两个对数差的期望,而这个期望是基于第一个概率的分布的,而在我自己的概率上采样得到的分布,显然是一定大于其他概率值的期望的
      • 因为每个分布一定会把自己概率高的点采样出来(但这些点其他的概率分布不一定高)
      • 所以有:
        • 越接近采样分布的概率分布,与采样分布的 KL 散度越小
        • 跟采样分布的差异越大的概率分布,与采样分布的 KL 散度越大

应用 Jensen 不等式求负 KL 散度

  • 由于 \( \log(x) \) 是一个凹函数(伞状),根据Jensen不等式,对于凹函数有:
    $$
    \mathbb{E}[\log X] \leq \log \mathbb{E}[X]
    $$
    • 令 \( X = \frac{Q(x)}{P(x)} \),则:
      $$
      \mathbb{E}_{P} \left[ \log \frac{Q(x)}{P(x)} \right] \leq \log \left( \mathbb{E}_{P} \left[ \frac{Q(x)}{P(x)} \right] \right)
      $$
  • 计算期望:
    $$
    \mathbb{E}_{P} \left[ \frac{Q(x)}{P(x)} \right] = \sum_{x} P(x) \cdot \frac{Q(x)}{P(x)} = \sum_{x} Q(x) = 1
    $$
  • 因此:
    $$
    \mathbb{E}_{P} \left[ \log \frac{Q(x)}{P(x)} \right] \leq \log(1) = 0
    $$

推导KL散度的非负性

  • 注意到:
    $$
    \mathbb{E}_{P} \left[ \log \frac{Q(x)}{P(x)} \right] = -D_{\text{KL} }(P \parallel Q)
    $$
  • 因此:
    $$
    -D_{\text{KL} }(P \parallel Q) \leq 0 \implies D_{\text{KL} }(P \parallel Q) \geq 0
    $$
  • 当且仅当 \( P(x) = Q(x) \) 对所有 \( x \) 成立时,\( \frac{P(x)}{Q(x)} = 1 \),此时:
    $$
    D_{\text{KL} }(P \parallel Q) = \sum_{x} P(x) \log 1 = 0
    $$
  • KL散度始终满足:
    $$
    D_{\text{KL} }(P \parallel Q) \geq 0
    $$
  • 且 \( D_{\text{KL} }(P \parallel Q) = 0 \) 当且仅当 \( P = Q \)

附录:KL 散度=交叉熵与熵的差 推导

  • KL 散度本质上是交叉熵与熵的差,反映了用错误模型编码时的“额外信息量”

熵 \(H(P)\) 和 交叉熵 \(H(P, Q)\) 的定义

  • 对于离散分布 \(P(x)\),熵定义为:
    $$
    H(P) = -\sum_x P(x) \log P(x)
    $$
    • 它表示在分布 \(P\) 下,平均需要多少信息量(比特或 nats)来编码事件
  • 交叉熵定义为:
    $$
    H(P, Q) = -\sum_x P(x) \log Q(x)
    $$
    • 它表示在真实分布是 \(P\) 时,如果用分布 \(Q\) 来编码,平均需要的信息量

KL 散度=两者的差

  • 交叉熵与熵的差:
    $$
    \begin{align}
    H(P, Q) - H(P) &= \left[ -\sum_x P(x) \log Q(x) \right] - \left[ -\sum_x P(x) \log P(x) \right] \\
    &= -\sum_x P(x) \log Q(x) + \sum_x P(x) \log P(x) \\
    &= \sum_x P(x) \left[ \log P(x) - \log Q(x) \right] \\
    &= \sum_x P(x) \log \frac{P(x)}{Q(x)} \\
    &= D_{\mathrm{KL} }(P | Q)
    \end{align}
    $$

理解

  • 熵 \(H(P)\) :理想编码长度
  • 交叉熵 \(H(P, Q)\) :用错误分布 \(Q\) 编码的平均长度
  • KL 散度 :额外的编码长度,也就是交叉熵比真实熵多出来的部分

附录:卡方散度 和 KL 散度对比

卡方散度定义

  • 设 \(P,Q\) 为两个概率分布,且 \(Q\) 绝对连续于 \(P\)(\(P(x)=0\Rightarrow Q(x)=0\)), 皮尔逊卡方散度(简称卡方散度) 定义为:
    $$
    \chi^2(P|Q) = \int \frac{(P(x)-Q(x))^2}{Q(x)} dx
    $$
  • 离散形式:
    $$
    \chi^2(P|Q) = \sum_i \frac{(P_i-Q_i)^2}{Q_i}
    $$
  • 卡方散度的其他形式:
    $\chi^2(P | Q) = \sum_x \frac{(P(x) - Q(x))^2}{Q(x)} = \sum_x Q(x) \left(\frac{P(x)}{Q(x)} - 1\right)^2 = E_Q\left[\left(\frac{P}{Q} - 1\right)^2\right]$$
    • 等价形式:
      $$
      \begin{align}
      \chi^2(P | Q) &= \mathbb{E}_Q\left[\left(\frac{P}{Q} - 1\right)^2\right] = \mathbb{E}_Q\left[\left(\frac{P}{Q}\right)^2\right] - 2\mathbb{E}_Q\left[\frac{P}{Q}\right] + \mathbb{E}_Q[1] \\
      &= \mathbb{E}_Q\left[\left(\frac{P}{Q}\right)^2\right] - 2\sum_x Q(x)\cdot\frac{P(x)}{Q(x)} + 1 \\
      &= \mathbb{E}_Q\left[\left(\frac{P}{Q}\right)^2\right] - 2 + 1 \\
      &= \mathbb{E}_Q\left[\left(\frac{P}{Q}\right)^2\right] - 1 \\
      \end{align}
      $$

回顾 KL 散度定义

  • 连续形式
    $$
    D_{\mathrm{KL} }(P|Q) = \int P(x)\log\frac{P(x)}{Q(x)} dx
    $$
  • 离散形式:
    $$
    D_{\mathrm{KL} }(P|Q) = \sum_i P_i\log\frac{P_i}{Q_i}
    $$

卡方散度与 KL 散度的关系

  • 关系1:泰勒展开关系
    • 当 \(P\) 接近 \(Q\) 时,对 \(\log\frac{P}{Q}\) 在 \(P=Q\) 处展开:
      $$
      D_{\mathrm{KL} }(P|Q) = \frac{1}{2}\chi^2(P|Q) + o\bigl(|P-Q|^2\bigr)
      $$
      • 即:KL 散度在局部等价于卡方散度的 1/2
  • 关系2:不等式关系
    • 由 Jensen 不等式可证:
      $$
      D_{\mathrm{KL} }(P|Q) \le \chi^2(P|Q)
      $$

两者特点对比

  • 对比详情:
    特性 KL 散度 \(D_{\mathrm{KL} }(P|Q)\) 卡方散度 \(\chi^2(P|Q)\)
    形式 含对数,信息论度量 二次型,统计检验度量
    对称性 非对称:\(D_{\mathrm{KL} }(P|Q)\neq D_{\mathrm{KL} }(Q|P)\) 非对称:\(\chi^2(P|Q)\neq \chi^2(Q|P)\)
    非负性 满足 \(D_{\mathrm{KL} }\ge 0\) 满足 \(\chi^2\ge 0\)
    对小 \(Q_i\) 敏感,但存在对数约束,爆炸缓慢 及其敏感,但无对数,更容易爆炸
    权重 按 \(P_i\) 加权 按 \(1/Q_i\) 加权
    来源 信息论、编码、熵 皮尔逊卡方检验、拟合优度
    优化 常用于变分推断、生成模型 常用于密度比、分布检验
  • 重点:卡方散度比 KL 散度更不稳定(在 \(Q(x)\) 极小时,卡方散度很容易出现爆炸)
    • 卡方散度是被 \(\frac{1}{Q}\) 修饰的,当 \(Q(x)\) 减小时,是线性增长
    • KL 散度是被 \(\log \frac{1}{Q}\) 修饰的,当 \(Q(x)\) 减小时,对数增长就慢很多

Math——运筹优化开源求解器-GLPK的使用

本文介绍各种运筹优化开源求解器-GLPK的使用

  • GLPK是一款完全开源免费的运筹优化求解器,可以任意商用

Ubuntu安装GLPK

  • 据说Ubuntu安装较为方便,所以建议首选Ubuntu

  • 在网站下载文件:https://ftp.gnu.org/gnu/glpk/

    • 可以下载任意版本,建议选最新
  • 安装命令

    1
    2
    3
    4
    tar -xzvf glpk-xxx.tar.gz
    ./configure
    make
    sudo make install
  • 安装后直接执行可能出现错误

    1
    error while loading shared libraries: libglpk.so.36:...
  • 解决方案(原始解决方案地址):

    1
    https://github.com/rstudio/renv/issues/1881

Ubuntu下GLPK的使用

  • 下列式子参考了:线性规划工具 GLPK 的安装及基本使用

  • 创建问题描述文件glpkDemo.mod

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* Variables */
    var x1 >= 0;
    var x2 >= 0;
    var x3 >= 0;

    /* Object function */
    maximize z: 3*x1 + x2 +2*x3;

    /* Constrains */
    s.t. con1: x1 + x2 + 3*x3 <= 30;
    s.t. con2: 2*x1 +2*x2 + 5*x3 <= 24;
    s.t. con3: 4*x1 + x2 + 2*x3 <= 36;

    end;
  • 执行命令解决问题

    1
    glpsol -m glpkDemo.mod -o ./output/glpkDemo.sol
  • 输出文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Problem:    glpkDemo
    Rows: 4
    Columns: 3
    Non-zeros: 12
    Status: OPTIMAL
    Objective: z = 28 (MAXimum)

    No. Row name St Activity Lower bound Upper bound Marginal
    ------ ------------ -- ------------- ------------- ------------- -------------
    1 z B 28
    2 a B 12 30
    3 b NU 24 24 0.166667
    4 c NU 36 36 0.666667

    No. Column name St Activity Lower bound Upper bound Marginal
    ------ ------------ -- ------------- ------------- ------------- -------------
    1 x1 B 8 0
    2 x2 B 4 0
    3 x3 NL 0 0 -0.166667

    Karush-Kuhn-Tucker optimality conditions:

    KKT.PE: max.abs.err = 0.00e+00 on row 0
    max.rel.err = 0.00e+00 on row 0
    High quality

    KKT.PB: max.abs.err = 0.00e+00 on row 0
    max.rel.err = 0.00e+00 on row 0
    High quality

    KKT.DE: max.abs.err = 2.22e-16 on column 1
    max.rel.err = 3.17e-17 on column 1
    High quality

    KKT.DB: max.abs.err = 0.00e+00 on row 0
    max.rel.err = 0.00e+00 on row 0
    High quality

    End of output
  • Activity这一列就是想要的解

  • 其他输出项如何理解?

自动化生成问题

  • 使用shell或者Python自动生成.mod文件,然后自然解析.sol文件,实现自动化测试参数
1…128129130…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4