我正在读< 统计自然语言处理的基础 >。它对信息熵与语言模型之间的关系有以下几点说明:
这里的...The要点是,如果模型捕获了更多的语言结构,那么模型的熵应该更低。换句话说,我们可以用熵来衡量模型的质量.
但是这个例子怎么样:
假设我们有一台机器,它一个一个地吐出两个字符,A和B。机器的设计者使A和B具有相等的概率。
我不是设计师。我试着通过实验来模拟它。
在最初的实验中,我看到机器分裂了以下字符序列:
A,B,A
因此,我将机器建模为P(A)=2/3,P(B)=1/3。我们可以计算出这个模型的熵值如下:
-2/3*Log(2/3)-1/3*Log(1/3)= 0.918 bit (the base is 2)
但是,设计师告诉我他的设计,所以我用更多的信息改进了我的模型。新的模型看起来如下:
P(A)=1/2 P(B)=1/2
这个新模型的熵是:
-1/2*Log(1/2)-1/2*Log(1/2) = 1 bit
第二种模式明显优于第一种模式。但熵增加了。
我的观点是,由于模型的任意性,我们不能盲目地说熵越小,模型越好。
有人能解释一下这件事吗?
加1
(非常感谢罗布·纽豪斯!)
是的,在我重新消化了提到的NLP书之后。我想我现在可以解释了。
我计算的是语言模型分布的熵。它不能用来评估语言模型的有效性。
要评估一个语言模型,我们应该测量它给我们提供了多少惊喜,用于该语言中的真实序列。对于遇到的每个真实单词,语言模型将给出概率p。我们用-log(p)来量化这个惊喜。我们用一个足够长的序列来平均总惊喜。因此,对于带有500 A和500 B的1000字母序列,1/3-2/3模型给出的惊喜是:
-500*log(1/3) - 500*log(2/3)/1000 = 1/2 * Log(9/2)
而正确的1/2-1/2模式将提供:
-500*log( 1/2 ) - 500*log(1/2)/1000 =1/2* Log(8/2)
因此,我们可以看到,1/3,2/3模型给出了更大的惊喜,这表明它比正确的模型更糟糕。
只有当序列足够长时,平均效应才能模拟1/2-1/2分布上的期望。如果序列很短,就不会给出令人信服的结果。
我在这里没有提到cross-entropy,因为我认为这个行话太吓人了,对揭示根本原因没有多大帮助。
发布于 2014-04-08 15:54:35
如果您有更多的数据样本,那么分配2/3到A和1/3到B的模型很可能比真正的模型更糟糕,后者给出了每个模型的1/2。问题是你的训练集太小,所以你被误导认为错误的模式更好。我鼓励你进行实验,生成一个长度为10000的随机字符串,其中每个字符的概率相等。然后测量2/3,1/3模型与1/2,1/2模型在更长的字符串上的交叉熵。我相信你会看到后者表现得更好。下面是一些Python示例代码,演示了这一事实。
from math import log
import random
def cross_entropy(prediction_probability_seq):
probs = list(prediction_probability_seq)
return -sum(log(p, 2) for p in probs) / len(probs)
def predictions(seq, model):
for item in seq:
yield model[item]
rand_char_seq = [random.choice(['a', 'b']) for _ in xrange(1000)]
def print_ent(m):
print 'cross entropy of', str(m), \
cross_entropy(predictions(rand_char_seq, m))
print_ent({'a': .5, 'b': .5})
print_ent({'a': 2./3, 'b': 1./3})
请注意,如果在选择中添加一个额外的“a”,那么第二个模型(它更接近真实分布)的交叉熵比第一个模型低。
然而,另一件需要考虑的事情是,你真的想测量你在训练期间没有观察到的数据的可能性。如果不这样做,在训练数据中记忆噪声的更复杂的模型将比小型/简单的模型更有优势,后者没有足够的记忆噪音的能力。
作为度量语言模型质量的可能性的一个实际问题是,它有时不能很好地预测实际较高级别的应用程序错误率。例如,语言模型常用于语音识别系统中。改进的语言模型(在熵方面)并没有降低整个系统的错误率,这正是设计者真正关心的问题。如果语言模型改进了整个识别系统已经有足够信心得到正确答案的预测,那么这种情况就会发生。
https://stackoverflow.com/questions/22933412
复制相似问题