9

我正在阅读的一篇论文http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf使用每个字符的位数作为评估文本生成计算机模型质量的测试指标,但是没有提到它是如何计算的。谷歌搜索,我真的找不到任何关于它的东西。

有谁知道如何计算它?Python 最好,但伪代码或任何东西都可以。谢谢!

4

3 回答 3

16

每个字符的位数是衡量压缩方法性能的指标。它是通过压缩一个字符串然后测量压缩表示总共占用多少位,除以原始字符串中有多少符号(即字符)来应用的。压缩版本每个字符占用的位数越少,压缩方法就越有效。

换句话说,作者使用他们的生成语言模型等进行压缩,并假设所得到的压缩方法的高效性表明基础生成模型的准确性很高。

在第 1 节中,他们指出:

本文的目标是通过将大型 RNN 应用到预测文本流中的下一个字符的任务中来展示使用新的 Hessian-Free 优化器训练的大型 RNN 的强大功能。这是一个重要问题,因为更好的字符级语言模型可以改进文本文件的压缩 (Rissanen & Langdon, 1979) [...]

Rissanen & Langdon (1979) 文章是算术编码的原始描述,这是一种众所周知的文本压缩方法。

算术编码在生成语言模型的基础上运行,例如作者建立的模型。给定一个(可能是空的)字符序列,模型预测接下来可能出现的字符。人类也可以这样做,例如给定输入序列hello w,我们可以猜测下一个字符的概率:o具有高概率(因为hello world是一个似是而非的延续),但是像has inhello where can I find..ias in这样的字符hello winston也有非零概率。所以我们可以为这个特定的输入建立一个字符的概率分布,这正是作者的生成模型所做的。

这自然适合算术编码:给定一个已经编码的输入序列,下一个字符的位序列由可能字符的概率分布决定:高概率的字符得到一个短的位序列,低概率的字符得到一个更长的序列。然后从输入中读取下一个字符,并使用从概率分布中确定的位序列对其进行编码。如果语言模型好,字符将被预测的概率很高,因此位序列会很短. 然后对下一个字符继续压缩,再次使用到目前为止的输入来建立字符的概率分布,确定位序列,然后读取实际的下一个字符并相应地对其进行编码。

请注意,每个步骤都使用生成模型来建立新的概率分布。所以这是自适应算术编码的一个例子。

在读取和编码所有输入之后,测量结果的总长度(以位为单位)并除以原始未压缩输入中的字符数。如果模型好,它会以高精度预测字符,因此每个字符使用的比特序列平均会很短,因此每个字符的总比特数会很低。


关于即用型实现

我不知道允许轻松集成您自己的生成语言模型的算术编码的实现。大多数实现即时构建自己的自适应模型,即它们在读取输入时调整字符频率表。

您的一种选择可能是从arcode开始。我看了看代码,似乎可以集成自己的模型,虽然不是很容易。self._ranges成员代表语言模型;基本上作为累积字符频率的数组,所有小于的字符的总相对频率也是如此(即,self._ranges[ord('d')]如果d我们a只假设小写字母字符)。您必须在每个输入字符之后修改该数组,并将您从生成模型获得的字符概率映射到字符频率范围。bc

于 2013-07-23T01:40:54.333 回答
4

在 Alex Graves (2014) 的“使用递归神经网络生成序列”中,它在整个数据集上给出为:-log p(X(t+1) | y(t))。其中 X(t+1) 是正确的符号,y(t) 是算法的输出。此条件概率是您分配给正确答案的条件概率。

因此,如果您的系统的输出是概率性的,那么它就是平均预测能力。

于 2014-07-06T20:04:01.290 回答
-1

The sys library has a getsizeof() function, this may be helpful? http://docs.python.org/dev/library/sys

于 2013-07-23T00:57:52.823 回答