如何计算每个字符的位数(BPC)?

机器算法验证 可能性 神经网络 lstm 循环神经网络
2022-03-21 10:03:40

在 Alex Graves 的一篇论文(以及其他几位作者)中,使用了术语每字符位数 (BPC)。我在这里引用的论文是“使用递归神经网络生成序列”(http://arxiv.org/abs/1308.0850)。

在论文中,他将 BPC 定义为log2P(xt+1|yt),在第 3.1 节中定义,结果如表 1 所示。

这是如何准确计算的,尤其是当涉及到循环神经网络时,例如 char-rnn?例如,给定循环神经网络的输入和预测,我如何计算每个字符的这些位数?

此外,这个问题解决了这个问题(https://stackoverflow.com/questions/17797922/how-to-calculate-bits-per-character-of-a-string-bpc)但没有一个答案解释它是如何计算的,特别是当涉及到 RNN 时。

1个回答

据我了解,BPC 只是平均交叉熵(与对数基数 2 一起使用)。

在 Alex Graves 的论文中,模型的目的是在给定过去字符的情况下近似下一个字符的概率分布。在每个时间步t,我们称之为(近似)分布P^t然后让Pt是真实的分布。这些离散的概率分布可以用一个大小为的向量来表示n,其中 n 是字母表中可能的字符数。

因此 BPC 或平均交叉熵可以计算如下:

bpc(string)=1Tt=1TH(Pt,P^t)=1Tt=1Tc=1nPt(c)log2P^t(c),=1Tt=1Tlog2P^t(xt).
在哪里T是输入字符串的长度。

第二行中的相等来自于真实分布Pt is zero everywhere except at the index corresponding to the true character xt in the input string at location t.

Two things to note:

  • When you use an RNN, P^t can be obtained by applying a softmax to the RNN's output at time step t (The number of output units in your RNN should be equal to n - the number of characters in your alphabet).
  • In the equation above, the average cross-entropy is calculated over one input string of size T. In practice, you may have more than one string in your batch. Therefore, you should average over all of them (i.e. bpc=meanstringsbpc(string)).