• Adaptive Importance Sampling to Accelerate Training of a Neural Probabilistic Language Model


    Bengio Y. and Sen\acute{e}cal J. S. Adaptive importance sampling to accelerate training of a neural probabilistic language model. IEEE Transactions on Neural Networks and Learning Systems (TNNLS), 2008.

    一种自适应的负样本采样方法.

    符号说明

    • \(w_{t}^T\) 表示序列 \((w_t, \ldots, w_T)\);

    Motivation

    • 给定一串文字序列 \(w_1, \ldots, w_T\), 传统的语言模型的任务就是建立这串序列的联合分布:

      \[P(w_1^T) = \prod_{t=1}^T P(w_t|w_1^{t-1}), \]

      这里我们认为每个 word \(w\) 只与前面的 words 有关;

    • 即便如此, 依旧难以建模的 (特别是当 \(T\) 很大的时候), 这时惯用的做法是通过截断的方式来逼近:

      \[P(w_1^T) = \prod_{t=1}^T P(w_t|w_{t-n+1}^{t-1}), \]

      即假设仅与前面的 \(n-1\) 个 words 有关;

    • 此时, 我们只需要建模出 \(n\) 个 words 的分布即可:

      \[P(w_t|w_{t-n+1}^{t-1}) = \frac{P(w_{t-n+1}^t)}{P(w_{t-n+1}^{t-1})}; \]

    • 作者采用什么方式建模暂且不论, 我们假设获得了目标 word \(w_t\) 和它的历史 words \(h_t=w_{t-n+1}^{t-1}\) 之间的 energy \(\mathcal{E}(w_t, h_t)\), 然后通常我们会采用如下方式去建模条件概率分布 (Boltzmann energy distribution):

      \[P(w_t|h_t) = \frac{e^{-\mathcal{E}(w_t, h_t)}}{Z(h_t)}, \: Z(h_t) = \sum_{w \in \mathcal{V}} e^{-\mathcal{E}(w, h_t)}, \]

      然后通过

      \[\tag{1} \min_{\theta}\: -\log P(w_t|h_t) \]

      的方式来进行优化;

    • 但是问题是当 \(\mathcal{V}\) 很大的时候, 即 words 数量很多的时候, 计算 \(Z\) 是很麻烦的一件事情.

    本文方法

    1. 首先, 注意到通过梯度求解的时候, (1) 中的梯度为

      \[\nabla_{\theta}(-\log P(x)) = \nabla_{\theta}(\mathcal{E}(x)) - \sum_{x' \in \mathcal{X}} P(x') \nabla_{\theta} (\mathcal{E}(x')) = \nabla_{\theta}(\mathcal{E}(x)) - \mathbb{E}_{P} [\nabla_{\theta'} (\mathcal{E}(x'))], \]

      故我们现在的任务就是估计

      \[\mathbb{E}_{P}[\nabla_{\theta}(\mathcal{E}(x'))]; \]

    2. 一个很自然的想法是从 \(P(x)\) 中采样 \(n\) 个点, 然后

      \[\mathbb{E}_{P}[\nabla_{\theta}(\mathcal{E}(x))] \approx \frac{1}{n} \sum_{i=1}^n [\nabla_{\theta}(\mathcal{E}(x_i))], \]

      但是想要采样的前提必须是知道 \(P\);

    3. 另一种法子是利用 importance sampling:

      \[\mathbb{E}_{P}[\nabla_{\theta}(\mathcal{E}(x))] = \sum_{x \in \mathcal{X}} P(x) \nabla_{\theta} (\mathcal{E}(x)) = \sum_{x \in \mathcal{X}} Q(x) \frac{P(x)}{Q(x)} \nabla_{\theta} (\mathcal{E}(x)) = \mathbb{E}_Q [\frac{P(x)}{Q(x)} \nabla_{\theta} (\mathcal{E}(x))], \]

      于是我们可以从一个已知的便于采样的分布 \(Q\) 中采样 \(y_1, \ldots, y_n\), 然后

      \[\approx \frac{1}{n} \sum_{i=1}^n\frac{P(x_i)}{Q(x_i)} \nabla_{\theta} (\mathcal{E}(x_i)), \]

      虽然能采样了, 计算规模也降下来了, 但是在不知道 \(Z\) 的前提下, 我们还是没法计算 \(P\) ! 所以很可惜, 这样子还是不行;

    4. 我们可以用一个有偏的估计, 注意到

      \[\tag{2} \begin{array}{ll} \frac{1}{n} \sum_{i=1}^n\frac{P(x_i)}{Q(x_i)} \nabla_{\theta} (\mathcal{E}(x_i)) &=\frac{1}{nZ} \sum_{i=1}^n\frac{e^{-\mathcal{E}(x_i)}}{Q(x_i)} \nabla_{\theta} (\mathcal{E}(x_i)) \\ &=\frac{1}{nZ} \sum_{i=1}^n w(x_i) \nabla_{\theta} (\mathcal{E}(x_i)) \quad \leftarrow w(x_i):= \frac{e^{-\mathcal{E}(x_i)}}{Q(x_i)} \\ &\approx \frac{1}{W} \sum_{i=1}^n w(x_i) \nabla_{\theta} (\mathcal{E}(x_i)) \quad \leftarrow W := \sum_{i=1}^n w(x_i). \\ \end{array} \]

    5. 注意到, 当 \(W \rightarrow +\infty\) 的时候 (\(x_i \sim Q\))

      \[\frac{W}{n} = \frac{1}{n} \sum_i w(x_i) \rightarrow \mathbb{E}_Q \frac{e^{-\mathcal{E}(x)}}{Q(x)} = Z \\ \frac{n}{W} \frac{1}{n} \sum_{i=1}^n w(x_i) \nabla_{\theta} (\mathcal{E}(x_i)) \rightarrow \frac{1}{Z} \mathbb{E}_Q [\frac{e^{-\mathcal{E}(x)}}{Q(x)} \nabla_{\theta}(\mathcal{E}(x))] = \mathbb{E}_P [\nabla_{\theta}\mathcal{E}(x)]; \]

    6. 故该方法对应的算法如下:

    更简洁的形式

    让我们把上述算法的更新写成一个更加简洁的形式 (\(x \sim Q\)):

    \[\begin{array}{ll} \nabla_{\theta}(\mathcal{E}(x)) - \sum_{i=1}^n \frac{w(x_i)}{W} \nabla_{\theta}(\mathcal{E}(x_i)) &= \nabla_{\theta} \Big[-\log \frac{e^{-\mathcal{E}(x)}}{\sum_i w(x_i)} \Big] \\ &= \nabla_{\theta} \Big[-\log \frac{e^{-\mathcal{E}(x)}}{\sum_i \frac{e^{-\mathcal{E}(x_i)}}{Q(x_i)}} \Big] \\ &= \nabla_{\theta} \Big[-\log \frac{e^{-\mathcal{E}(x)}}{\sum_i e^{-\mathcal{E}(x_i) - \log Q(x_i)}} \Big] \\ &= \nabla_{\theta} \Big[-\log \frac{e^{-\mathcal{E}(x) - \log Q(x)}}{\sum_i e^{-\mathcal{E}(x_i) - \log Q(x_i)}} \Big]. \\ \end{array} \]

    这里 \(Q\) 就是一个校准的作用, 当然, 它和 \(P\) 越接近是越好的.

  • 相关阅读:
    技术必备:推荐一款接口自动化测试数据校验神器
    提高GUI自动化测试稳定性解决方案
    新特性,推荐一款超强接口管理神器 Apifox
    测试开发:从0到1学习如何测试API网关
    接口自动化测试,一键快速校验接口返回值全部字段
    测试工程师必学:测试人员如何深入了解项目
    Django+Vue+Docker搭建接口测试平台实战
    如何开展线上全链路压测思路分享
    刚转行1年测试新手:学习Python编程经验实战分享
    测开新手:从0到1,自动化测试接入Jenkins学习
  • 原文地址:https://www.cnblogs.com/MTandHJ/p/16705659.html
Copyright © 2020-2023  润新知