我正在阅读的一篇论文http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf使用每个字符的位数作为评估文本生成计算机模型质量的测试指标,但是没有提到它是如何计算的。谷歌搜索,我真的找不到任何关于它的东西。
有谁知道如何计算它?Python 最好,但伪代码或任何东西都可以。谢谢!
我正在阅读的一篇论文http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf使用每个字符的位数作为评估文本生成计算机模型质量的测试指标,但是没有提到它是如何计算的。谷歌搜索,我真的找不到任何关于它的东西。
有谁知道如何计算它?Python 最好,但伪代码或任何东西都可以。谢谢!
每个字符的位数是衡量压缩方法性能的指标。它是通过压缩一个字符串然后测量压缩表示总共占用多少位,除以原始字符串中有多少符号(即字符)来应用的。压缩版本每个字符占用的位数越少,压缩方法就越有效。
换句话说,作者使用他们的生成语言模型等进行压缩,并假设所得到的压缩方法的高效性表明基础生成模型的准确性很高。
在第 1 节中,他们指出:
本文的目标是通过将大型 RNN 应用到预测文本流中的下一个字符的任务中来展示使用新的 Hessian-Free 优化器训练的大型 RNN 的强大功能。这是一个重要问题,因为更好的字符级语言模型可以改进文本文件的压缩 (Rissanen & Langdon, 1979) [...]
Rissanen & Langdon (1979) 文章是算术编码的原始描述,这是一种众所周知的文本压缩方法。
算术编码在生成语言模型的基础上运行,例如作者建立的模型。给定一个(可能是空的)字符序列,模型预测接下来可能出现的字符。人类也可以这样做,例如给定输入序列hello w
,我们可以猜测下一个字符的概率:o
具有高概率(因为hello world
是一个似是而非的延续),但是像h
as inhello where can I find..
或i
as in这样的字符hello winston
也有非零概率。所以我们可以为这个特定的输入建立一个字符的概率分布,这正是作者的生成模型所做的。
这自然适合算术编码:给定一个已经编码的输入序列,下一个字符的位序列由可能字符的概率分布决定:高概率的字符得到一个短的位序列,低概率的字符得到一个更长的序列。然后从输入中读取下一个字符,并使用从概率分布中确定的位序列对其进行编码。如果语言模型好,字符将被预测的概率很高,因此位序列会很短. 然后对下一个字符继续压缩,再次使用到目前为止的输入来建立字符的概率分布,确定位序列,然后读取实际的下一个字符并相应地对其进行编码。
请注意,每个步骤都使用生成模型来建立新的概率分布。所以这是自适应算术编码的一个例子。
在读取和编码所有输入之后,测量结果的总长度(以位为单位)并除以原始未压缩输入中的字符数。如果模型好,它会以高精度预测字符,因此每个字符使用的比特序列平均会很短,因此每个字符的总比特数会很低。
关于即用型实现
我不知道允许轻松集成您自己的生成语言模型的算术编码的实现。大多数实现即时构建自己的自适应模型,即它们在读取输入时调整字符频率表。
您的一种选择可能是从arcode开始。我看了看代码,似乎可以集成自己的模型,虽然不是很容易。self._ranges
成员代表语言模型;基本上作为累积字符频率的数组,所有小于的字符的总相对频率也是如此(即,self._ranges[ord('d')]
如果d
我们a
只假设小写字母字符)。您必须在每个输入字符之后修改该数组,并将您从生成模型获得的字符概率映射到字符频率范围。b
c
在 Alex Graves (2014) 的“使用递归神经网络生成序列”中,它在整个数据集上给出为:-log p(X(t+1) | y(t))。其中 X(t+1) 是正确的符号,y(t) 是算法的输出。此条件概率是您分配给正确答案的条件概率。
因此,如果您的系统的输出是概率性的,那么它就是平均预测能力。
The sys library has a getsizeof() function, this may be helpful? http://docs.python.org/dev/library/sys