Wetts's blog

Stay Hungry, Stay Foolish.

0%

$z = w_{1}x_{1} + w_{2}x_{2} + \ldots +w_{n}x_{n}$,$b=0$,暂时忽略 $b$,为了预防 $z$ 值过大或过小,你可以看到 $n$ 越大,你希望 $w_{i}$ 越小,因为 $z$ 是 $w_{i}x_{i}$ 的和,如果你把很多此类项相加,希望每项值更小,最合理的方法就是设置 $w_{i}=\frac{1}{n}$,$n$ 表示神经元的输入特征数量,实际上,你要做的就是设置某层权重矩阵 $w^{[l]} = np.random.randn( \text{shape})*\text{np.}\text{sqrt}(\frac{1}{n^{[l-1]}})$,$n^{[l - 1]}$ 就是我喂给第 $l$ 层神经单元的数量(即第 $l-1$ 层神经元数量)。

结果,如果你是用的是Relu激活函数,而不是$\frac{1}{n}$,方差设置为$\frac{2}{n}$,效果会更好。你常常发现,初始化时,尤其是使用Relu激活函数时,$g^{[l]}(z) =Relu(z)$,它取决于你对随机变量的熟悉程度,这是高斯随机变量,然后乘以它的平方根,也就是引用这个方差$\frac{2}{n}$。这里,我用的是$n^{[l - 1]}$,因为本例中,逻辑回归的特征是不变的。但一般情况下$l$层上的每个神经元都有$n^{[l - 1]}$个输入。如果激活函数的输入特征被零均值和标准方差化,方差是1,$z$也会调整到相似范围,这就没解决问题(梯度消失和爆炸问题)。但它确实降低了梯度消失和爆炸问题,因为它给权重矩阵$w$设置了合理值,你也知道,它不能比1大很多,也不能比1小很多,所以梯度没有爆炸或消失过快。

我提到了其它变体函数,刚刚提到的函数是Relu激活函数,一篇由Herd等人撰写的论文曾介绍过。对于几个其它变体函数,如tanh激活函数,有篇论文提到,常量1比常量2的效率更高,对于tanh函数来说,它是$\sqrt{\frac{1}{n^{[l-1]}}}$,这里平方根的作用与这个公式作用相同($\text{np.}\text{sqrt}(\frac{1}{n^{[l-1]}})$),它适用于tanh激活函数,被称为Xavier初始化。Yoshua Bengio和他的同事还提出另一种方法,你可能在一些论文中看到过,它们使用的是公式$\sqrt{\frac{2}{n^{[l-1]} + n^{\left[l\right]}}}$。其它理论已对此证明,但如果你想用Relu激活函数,也就是最常用的激活函数,我会用这个公式$\text{np.}\text{sqrt}(\frac{2}{n^{[l-1]}})$,如果使用tanh函数,可以用公式$\sqrt{\frac{1}{n^{[l-1]}}}$,有些作者也会使用这个函数。

实际上,我认为所有这些公式只是给你一个起点,它们给出初始化权重矩阵的方差的默认值,如果你想添加方差,方差参数则是另一个你需要调整的超级参数,可以给公式$\text{np.}\text{sqrt}(\frac{2}{n^{[l-1]}})$添加一个乘数参数,调优作为超级参数激增一份子的乘子参数。有时调优该超级参数效果一般,这并不是我想调优的首要超级参数,但我发现调优过程中产生的问题,虽然调优该参数能起到一定作用,但考虑到相比调优,其它超级参数的重要性,我通常把它的优先级放得比较低。

希望你现在对梯度消失或爆炸问题以及如何为权重初始化合理值已经有了一个直观认识,希望你设置的权重矩阵既不会增长过快,也不会太快下降到0,从而训练出一个权重或梯度不会增长或消失过快的深度网络。我们在训练深度网络时,这也是一个加快训练速度的技巧。

一般分为:

  • 训练集(train set)
  • 开发测试集(training-dev set)
  • 开发集(dev set):有时称为保留交叉验证集(hold out cross validation set)
  • 测试集(test set)

数据集作用:

  • _train set_:训练模型。
  • _training-dev set_:评估模型的误差(bias、variance)原因。
  • _dev set_:评估所有训练出的模型,迭代并选出适用的模型。
  • _test set_:对最终所选定的神经网络系统做出无偏估计。

数据集分布:

  • train set 可以是网上爬取的数据。与 dev set_、_test set 的分布可能不同。
  • training-dev settrain set 同分布。
  • dev set 一般和 test set 同分布。都来自真实场景中的数据。

Bias、Variance与数据集分布优化

如果出现了 train setdev set_、_test set 不匹配的情况,可尝试以下方法:

  • 分析不匹配的原因,可人工合成数据新的 _train set_。
  • 迁移学习

  • 贝叶斯误差(一般用人类水平代替)与训练集错误率之差是 __bias(avoidble bias)__。
  • 训练集错误率与开发集错误率之差是 __variance__。

高 bias 可尝试以下方法:

  • 新的网络(含有更多隐藏层或者隐藏单元的网络)
  • 花费更多时间来训练网络

高 variance 可尝试以下方法:

  • 更多的数据
  • 正则化(L1、L2、dropout、数据扩增、early stopping)

误差分析

在你的开发集里或者测试集里,观察错误标记的样本,统计属于不同错误类型的错误数量。

通过统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。

形式语言

概述

乔姆斯基(Noam Chomsky)曾经把语言定义为:按照一定规律构成的句子和符号串的有限或无限的集合。

一般地,描述一种语言可以有三种途径 [刘颖,2002;石青云 (译),1987]

  1. 穷举法:把语言中的所有句子都枚举出来。显然,这种方法只适合句子数目有限的语言。
  2. 文法(产生式系统)描述:语言中的每个句子用严格定义的规则来构造,利用规则生成语言中合法的句子。
  3. 自动机法:通过对输入的句子进行合法性检验,区别哪些是语言中的句子,哪些不是语言中的句子。

文法用来精确地描述语言和其结构,自动机则是用来机械地刻画对输入字符串的识别过程。用文法来定义语言的优点是:由文法给予语言中的句子以结构,各成分之间的结构关系清楚、明了。但是,如果要直接用这些规则来确定一个字符串是否属于这套规则所定义的语言似乎并不十分明确。而由自动机来识别一个字符串是否属于该语言则相对简单,但自动机很难描述语言的结构。所以自然语言处理中的识别和分析算法,大多兼取两者之长。

形式语法的定义

形式语言是用来精确地描述语言(包括人工语言和自然语言)及其结构的手段。形式语言学也称代数语言学。

形式语法是一个4元组 $G=(N, \Sigma, P, S)$,其中 $N$ 是非终结符的有限集合(有时也叫变量集或句法种类集);$\Sigma$ 是终结符的有限集合,$N \cap \Sigma = \emptyset$;$V = N \cup \Sigma$ 称总词汇表;$P$ 是一组重写规则的有限集合:$P={ \alpha \rightarrow \beta }$,其中,$\alpha, \beta$ 是 $V$ 中元素构成的串,但 $\alpha$ 中至少应含有一个非终结符号;$S \in N$,称为句子符或初始符。

  • 如果每步推导中只改写最左边的那个非终结符,这种推导称为“最左推导”。
  • 如果每次都只改写最右边的非终结符,则为最右推导。__最右推导又称规范推导__。

形式语法的类型

正则文法

如果文法 $G=(N, \Sigma, P, S)$ 的 $P$ 中的规则满足如下形式:$A \rightarrow Bx$,或 $A \rightarrow x$,其中$A, B \in N, x \in \Sigma$,则称该文法为正则文法或称 3 型文法。(左线性正则文法)

如果 $A \rightarrow x B$,则该文法称为右线性正则文法。

上下文无关文法(context-free grammar, CFG)

如果 $P$ 中的规则满足如下形式:$A \rightarrow \alpha$,其中 $A \in N,\alpha \in (N \cup \Sigma)*$,则称该文法为上下文无关文法(CFG)或称 2 型文法。

上下文有关文法(context-sensitive grammar, CSG)

如果 $P$ 中的规则满足如下形式:$\alpha A \beta \rightarrow \alpha \gamma \beta$, 其中 $A \in N, \alpha, \beta, \gamma \in (N \cup \Sigma)*$,且 $\gamma$ 至少包含一个字符,则称该文法为上下文有关文法(CSG)或称 1 型文法。

另一种定义:$if \ x \rightarrow y, x \in (N \cup \Sigma)+, y \in (N \cup Sigma)*$,并且 $|y| \geq |x|$。

无约束文法(无限制重写系统)

如果 $P$ 中的规则满足如下形式:$\alpha \rightarrow \beta$,$\alpha, \beta$ 是字符串,则称 $G$ 为无约束文法,或称 0 型文法。

显然,每一个正则文法都是上下文无关文法,每一个上下无关文法都是上下文有关文法,而每一个上下文有关文法都是 0 型文法,即:$L(G3) \subseteq L(G2) \subseteq L(G1) \subseteq L(G0)$。

语言与文法类型的约定

如果一种语言能由几种文法所产生,则把这种语言称为在这几种文法中受限制最多的那种文法所产生的语言。

CFG 识别句子的派生树表示

二义性文法1
二义性文法2
二义性文法

一个文法 $G$,如果存在某个句子有不只一棵分析树与之对应,那么称这个文法是二义的。

自动机理论

有限自动机

有限自动机又分为确定性有限自动机(definite automata, DFA)和不确定性有限自动机(non-definite automata, NFA)两种。

确定的有限自动机(definite automata, DFA)

确定的有限自动机 $M$ 是一个五元组:$M = (\Sigma, Q, \delta, q_0, F)$

  • $\Sigma$ 是输入符号的有穷集合;
  • $Q$ 是状态的有限集合;
  • $q_0 \in Q$ 是初始状态;
  • $F$ 是终止状态集合,$F \subseteq Q$;
  • $\delta$ 是 $Q$ 与 $\Sigma$ 的直积 $Q×\Sigma$ 到 $Q$ (下一个状态)的映射。它支配着有限状态控制的行为,有时也称为状态转移函数。

DFA
DFA2

DFA 定义的语言

如果一个句子 $x$ 使得有限自动机 $M$ 有 $\delta(q_0, x) = p, p \in F$,那么,称句子 $x$ 被 $M$ 接受。由 $M$ 定义的语言 $T(M)$ 就是被 $M$ 接受的句子的全集。即:$T(M) = {x | \delta(q_0, x) \in F }$

不确定的有限自动机(non-definite automata, NFA)

不确定的有限自动机 $M$ 是一个五元组 $M = (\Sigma, Q, \delta, q_0, F)$

  • $\Sigma$ 是输入符号的有穷集合;
  • $Q$ 是状态的有限集合;
  • $q_0 \in Q$ 是初始状态;
  • $F$ 是终止状态集合,$F \subseteq Q$;
  • $\delta$ 是 $Q$ 与 $\Sigma$ 的直积 $Q×\Sigma$ 到Q的幂集 $2^Q$ 的映射。

NFA 与 DFA 的关系和区别

NFA 与 DFA 的唯一区别是:在 NFA 中 $\delta(q, a)$ 是一个状态集合,而在 DFA 中 $\delta(q, a)$ 是一个状态。

设 $L$ 是一个被 NFA 所接受的句子的集合,则存在一个 DFA,它能够接受 $L$。

正则文法与有限自动机的关系

若 $G = (V_N, V_T, P, S )$ 是一个正则文法,则存在一个有限自动机 $M=(\Sigma, Q, \delta, q_0, F)$,使得: $T(M) = L(G)$。

由 $G$ 构造 $M$ 的一般步骤:

  1. 令 $\Sigma =V_T, Q=V_N \cup {T}, q_0=S$,其中,$T$ 是一个新增加的非终结符。
  2. 如果在 $P$ 中有产生式 $S \rightarrow \epsilon$,则 $F={S, T}$,否则 $F={T}$。
  3. 如果在 $P$ 中有产生式 $B \rightarrow a, B \in V_N, a \in V_T$,则 $T \in \delta(B, a)$。
  4. 如果在 $P$ 中有产生式 $B \rightarrow aC, B, C\in V_N,a \in V_T$,则 $C \in \delta(B, a)$。
  5. 对于每一个 $a \in V_T$,有 $\delta(T, a) = \emptyset$。

若 $M=(\Sigma, Q, \delta, q_0, F$ 是一有限自动机,则存在正则文法 $G = (V_N, V_T, P, S )$ 使 $L(G)=T(M)$。

由 $M$ 构造 $G$ 的一般步骤:

  1. 令 $V_N = Q, V_T = \Sigma, S = q_0$;
  2. 如果 $C \in \delta(B, a), B, C \in Q, a \in \delta$,则在 $P$ 中有产生式 $B \rightarrow aC$;
  3. 如果 $C \in \delta(B, a), C \in F$,则在 $P$ 中有产生式 $B \rightarrow a$。

下推自动机

下推自动机(push-down automata, PDA)

PDA 可以看成是一个带有附加的下推存储器的有限自动机,下推存储器是一个栈。

PDA

一个不确定的 PDA 可以表达成一个 7 元组:$M = (\Sigma, Q, \Gamma, \delta, q_0, Z_0, F)$

  • $\Sigma$ 是输入符号的有穷集合;
  • $Q$ 是状态的有限集合;
  • $q_0 \in Q$ 是初始状态;
  • $\Gamma$ 为下推存储器符号的有穷集合;
  • $Z_0 \in \Gamma$ 为最初出现在下推存储器顶端的符号;
  • $F$ 是终止状态集合,$F \subseteq Q$;
  • $\delta$ 是从 $Q×(\Sigma \cup {\epsilon})×\Gamma$ 到 $Q×\Gamma*$ 子集的映射。

映射关系 $\delta$ 的解释

映射关系 $\delta(q, a, Z)={(q_1, \gamma_1), (q_2, \gamma_2),…,(q_m, \gamma_m)}$

其中, $q_1, q_2, …, q_m \in Q, a \in \Sigma, Z \in \Gamma, \gamma_1, \gamma_2,…,\gamma_m \in \Gamma*$。

该映射的意思是:当 PDA 处于状态 $q$,面临输入符号 $a$ 时,自动机将进入 $q_i, i = 1, 2, …, m$ 状态,并以 $\gamma_i$ 来代替下推存储器(栈)顶端符号 $Z$,同时将输入头指向下一个字符。当 $Z$ 被 $\gamma_i$ 取代时,$\gamma_i$ 的符号按照从左到右的顺序依次从下向上推入到存储器。

特殊情况下,当 $\delta(q, a, Z)={(q_1, \gamma_1), (q_2, \gamma_2),…,(q_m, \gamma_m)}$ 时,输入头位置不移动,只用于处理下推存储器内部的操作,叫作“$\epsilon$ 移动”。

另外两种自动机

图灵机

  • 图灵机与 0 型文法等价;
  • 图灵机与有限自动机(FA)的区别:图灵机可以通过其读/写头改变输入带的字符。

线性带限自动机

  • 线性带限自动机与 1 型文法等价;
  • 线性带限自动机是一个确定的单带图灵机,其读写头不能超越原输入带上字符串的初始和终止位置,即线性带限自动机的存储空间被输入符号串的长度所限制。

语言与识别器的对应关系

语言与识别器的对应关系

  • 语言学

  • 语音学

  • 计算语言学:更侧重于计算方法和语言学理论等方面的研究

  • 自然语言理解:更偏向于对语言认知和理解过程等方面问题的研究

  • 自然语言处理:包含的语言工程和应用系统实现方面的含义似乎更多一些

自然语言处理大致研究方向:

  • 机器翻译(machine translation, MT)
  • 自动文摘(automatic summarizing 或 automatic abstracting)
  • 信息检索(information retrieval):从海量文档中找到符合用户需要的相关文档
  • 文档分类(document categorization/classification)
  • 问答系统(question-answering system)
  • 信息过滤(information filtering):自动识别和过滤那些满足特定条件的文档信息
  • 信息抽取(information extraction)
  • 文本挖掘(text mining)
  • 舆情分析(public opinion analysis)
  • 隐喻计算(metaphorical computation):研究自然语言语句或篇章中隐喻修辞的理解方法
  • 文字编辑和自动校对(automatic proofreading)
  • 作文自动评分
  • 光读字符识别(optical character recognition, OCR)
  • 语音识别(speech recognition)
  • 文语转换(text-to-speech conversion)
  • 说话人识别/认证/验证(speaker recognition/identification/verification)

自然语言处理涉及的几个层次

  • 语音学
  • 形态学(morphology):形态学(又称“词汇形态学”或“词法”)是语言学的一个分支,研究词的内部结构,包括屈折变化和构词法两个部分。由于词具有语音特征、句法特征和语义特征,形态学处于音位学、句法学和语义学的结合部位,所以形态学是每个语言学家都要关注的一门学科。
  • 语法学(syntax):研究句子结构成分之间的相互关系和组成句子序列的规则。其关注的中心是:为什么一句话可以这么说,也可以那么说?
  • 语义学(semantics):是一门研究意义,特别是语言意义的学科。语义学的研究对象是语言的各级单位(词素、词、词组、句子、句子群、整段整篇的话语和文章,乃至整个著作)的意义,以及语义与语音、语法、修辞、文字、语境、哲学思想、社会环 境、个人修养的关系,等等。其重点在探明符号与符号所指的对象之间的关系,从而指导人们的言语活动。它所关注的重点是:这个语言单位到底说了什么?
  • 语用学(pragmatics):是现代语言学用来指从使用者的角度研究语言,特别是使用者所作的选择、他们在社会互动中所受的制约、他们的语言使用对信递活动中其他参与者的影响。目前还缺乏一种连贯的语用学理论,主要是因为它必须说明的问题是多方面的,包括直指、会话隐含、预设、言语行为、话语结构等。部分原因是由于这一学科的范围太宽泛,因此出现多种不一致的定义。从狭隘的语言学观点看,语用学处理的是语言结构中有形式体现的那些语境。相反,__语用学最宽泛的定义是研究语义学未能涵盖的那些意义__。因此,语用学可以是集中在句子层次上的语用研究,也可以是超出句子,对语言的实际使用情况的调查研究,甚至与会话分析、语篇分析相结合,研究在不同上下文中的语句应用,以及上下文对语句理解所产生的影响。其关注的重点在于:为什么在特定的上下文中要说这句话?

自然语言处理面临的困难

  • 歧义消解(disambiguation)
  • 未知语言现象的处理问题

自然语言处理的基本方法

  • 理性主义(rationalist)方法【规则】
  • 经验主义(empiricist)方法【统计】

贝叶斯误差:理论最低的错误率,通常用“人类水平错误率”来估计贝叶斯误差。相当于是天花板。


转自:https://www.zhihu.com/question/263546637

问题

正在学习机器学习,不是特别理解其中的贝叶斯误差的概念,书上说是从预先知道的分布预测而出现的c误差,既然已经预先知道分布了,那么为什么还有误差呢?

解答

Wiki 定义:贝叶斯误差(bayes error rate)是指在现有特征集上,任意可以基于特征输入进行随机输出的分类器所能达到最小误差。也可以叫做最小误差。

先直接回答题主的疑问:“书上说是从预先知道的分布预测而出现的c误差,既然已经预先知道分布了,那么为什么还有误差呢?”

回答:分布是真实的,但预测的输出只能是一个值,所以会有误差。例如,假设真实世界中90%长头发的人为女性,10%为男性(这是已知的真实分布);此时已知一个人头发长,预测该同学性别。由于只能预测男/女。此时即使你知道真实分布,预测为女,也会有10%的误差。这就是贝叶斯误差。

===========================

下面详细说一下我的理解,贝叶斯误差的定义有两个关键点:

  1. 给定特征集后的最小误差:即可以认为我们的训练集无限大且已经按真实分布穷举了所有可能的特征组合后,任何分类器所能达到的误差下限。产生贝叶斯误差的本质原因是特征集不足以推理出准确预测值,否则贝叶斯误差为0。
  2. 概率特性:“最小误差”是限定在概率随机性条件下的 (– 如果是开了实例级别的“天眼”的最小误差,显然无论任何情形下最小误差都是 0,这个概念将没有任何意义。贝叶斯误差只能开概率级别的“天眼”)。即:
    1. 如果场景是给定特征输入,输出值是唯一的,则贝叶斯误差为 0。例如特征是人的净高和鞋底厚度,回归目标是人的头顶距离地面高度。那贝叶斯误差为 0。在训练集准确的情况下,线性回归也可以达到相同误差。
    2. 反之,如果输出值是有一定随机性的,贝叶斯误差是此时选概率最大输出作为输出值所能达到的误差。比如,特征为头发长短,目标值为男、女分类 label。假设在长发下,真实世界中女性概率 90%,10% 男性。反之女性 10%,男性 90%。那么贝叶斯概率误差即为认定长发为女,短发为男的误差。显然其贝叶斯误差为 10%。

题主的疑问,比较重要的是理解分布是真实的,但输出只能是一个值,所以会有误差。如果输出也可以是分布,那就没有误差了。

贝叶斯误差的作用:直观上可以这么理解,贝叶斯误差是在给定特征集的情况下,假设数据无限(且准确),依靠统计所能得到的最小误差。它是我们通过增加数据集/优化数据集分布/提升模型学习能力/防止过拟合等等措施后所能达到的误差下限。如果当前算法已经能达到接近贝叶斯误差的误差,则在不动特征的前提下(比如 DNN 输入特征为原始文本/像素时,输入特征就动不了)我们已经没有继续优化的意义了。

– 然而,事实上,贝叶斯误差无法求得(因为求得的前提是你知道真实分布,你知道真实分布还做什么机器学习呀)。目前就我知道的,业界并不会真正使用该指标,该指标更多的还是出现在学术探讨中。

转自:https://www.cnblogs.com/hlongch/p/5870384.html

首先,假设你知道训练集和测试集的关系。简单来讲是我们要在训练集上学习一个模型,然后拿到测试集去用,效果好不好要根据测试集的错误率来衡量。但很多时候,我们只能假设测试集和训练集的是符合同一个数据分布的,但却拿不到真正的测试数据。这时候怎么在只看到训练错误率的情况下,去衡量测试错误率呢?

由于训练样本很少(至少不足够多),所以通过训练集得到的模型,总不是真正正确的。(就算在训练集上正确率 100%,也不能说明它刻画了真实的数据分布,要知道刻画真实的数据分布才是我们的目的,而不是只刻画训练集的有限的数据点)。而且,实际中,训练样本往往还有一定的噪音误差,所以如果太追求在训练集上的完美而采用一个很复杂的模型,会使得模型把训练集里面的误差都当成了真实的数据分布特征,从而得到错误的数据分布估计。这样的话,到了真正的测试集上就错的一塌糊涂了(这种现象叫过拟合)。但是也不能用太简单的模型,否则在数据分布比较复杂的时候,模型就不足以刻画数据分布了(体现为连在训练集上的错误率都很高,这种现象较欠拟合)。过拟合表明采用的模型比真实的数据分布更复杂,而欠拟合表示采用的模型比真实的数据分布要简单。

在统计学习框架下,大家刻画模型复杂度的时候,有这么个观点,认为 Error = Bias + Variance。这里的 Error 大概可以理解为模型的预测错误率,是有两部分组成的,一部分是由于模型太简单而带来的估计不准确的部分(Bias),另一部分是由于模型太复杂而带来的更大的变化空间和不确定性(Variance)。

所以,这样就容易分析朴素贝叶斯了。它简单的假设了各个数据之间是无关的,是一个被严重简化了的模型。所以,对于这样一个简单模型,大部分场合都会Bias部分大于Variance部分,也就是说高偏差而低方差。

在实际中,为了让 Error 尽量小,我们在选择模型的时候需要平衡Bias和Variance所占的比例,也就是平衡 over-fitting 和 under-fitting。

转自:https://blog.csdn.net/liupeip_vipl/article/details/54762257

和 Huffman-Tree 一样,Shannon-Fano coding 也是用一棵二叉树对字符进行编码。但在实际操作中呢,Shannon-Fano 却没有大用处,这是由于它与 Huffman coding 相比,编码效率较低的结果(或者说香农-范诺算法的编码平均码字较大)。但是它的基本思路我们还是可以参考下的。

Shannon-Fano 的树是根据旨在定义一个有效的代码表的规范而建立的。实际的算法很简单:

  1. 对于一个给定的符号列表,制定了概率相应的列表或频率计数,使每个符号的相对发生频率是已知。
  2. 排序根据频率的符号列表,最常出现的符号在左边,最少出现的符号在右边。
  3. 清单分为两部分,使左边部分的总频率和尽可能接近右边部分的总频率和。
  4. 该列表的左半边分配二进制数字 0,右半边是分配的数字 1。这意味着,在第一半符号代都是将所有从 0 开始,第二半的代码都从 1 开始。
  5. 对左、右半部分递归应用步骤 3 和 4,细分群体,并添加位的代码,直到每个符号已成为一个相应的代码树的叶。

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。

哈夫曼编码,主要目的是根据使用频率来最大化节省字符(编码)的存储空间。

哈夫曼编码

熵又称为自信息(self-information),表示信源 X 每发一个符号(不论发什么符号)所提供的平均信息量。__熵也可以被视为描述一个随机变量的不确定性的数量。一个随机变量的熵越大,它的不确定性越大。那么,正确估计其值的可能性就越小__。越不确定的随机变量越需要大的信息量用以确定其值。

转自:https://www.zhihu.com/question/22178202/answer/49929786

信息熵,信息熵,怎么看怎么觉得这个“熵”字不顺眼,那就先不看。我们起码知道这个概念跟信息有关系。而它又是个数学模型里面的概念,一般而言是可以量化的。所以,第一个问题来了:信息是不是可以量化?

起码直觉上而言是可以的,不然怎么可能我们觉得有些人说的废话特别多,“没什么信息量”,有些人一语中的,一句话就传达了很大的信息量。

为什么有的信息量大有的信息量小?

有些事情本来不是很确定,例如明天股票是涨还是跌。如果你告诉我明天NBA决赛开始了,这两者似乎没啥关系啊,所以你的信息对明天股票是涨是跌带来的信息量很少。但是假如NBA决赛一开始,大家都不关注股票了没人坐庄股票有99%的概率会跌,那你这句话信息量就很大,因为本来不确定的事情变得十分确定。

而有些事情本来就很确定了,例如太阳从东边升起,你再告诉我一百遍太阳从东边升起,你的话还是丝毫没有信息量的,因为这事情不能更确定了。

所以说信息量的大小跟事情不确定性的变化有关。

那么,不确定性的变化跟什么有关呢?

  1. 跟事情的可能结果的数量有关;
  2. 跟概率有关。

先说一。例如我们讨论太阳从哪升起。本来就只有一个结果,我们早就知道,那么无论谁传递任何信息都是没有信息量的。

当可能结果数量比较大时,我们得到的新信息才有潜力拥有大信息量。

二,单看可能结果数量不够,还要看初始的概率分布。例如一开始我就知道小明在电影院的有15*15个座位的A厅看电影。小明可以坐的位置有225个,可能结果数量算多了。可是假如我们一开始就知道小明坐在第一排的最左边的可能是99%,坐其它位置的可能性微乎其微,那么在大多数情况下,你再告诉我小明的什么信息也没有多大用,因为我们几乎确定小明坐第一排的最左边了。

那么,怎么衡量不确定性的变化的大小呢?怎么定义呢?

这个问题不好回答,但是假设我们已经知道这个量已经存在了,不妨就叫做信息量,那么你觉得 信息量起码该满足些什么特点呢?

  1. __起码不是个负数吧__,不然说句话还偷走信息呢~
  2. __起码信息量和信息量之间可以相加吧__!假如你告诉我的第一句话的信息量是3,在第一句话的基础上又告诉我一句话,额外信息量是4,那么两句话信息量加起来应该等于7吧!难道还能是5是9?
  3. 刚刚已经提过,信息量跟概率有关系,但我们应该会觉得,信息量是连续依赖于概率 的吧!就是说,某一个概率变化了 0.0000001,那么这个信息量不应该变化很大。
  4. 刚刚也提过,信息量大小跟可能结果数量有关。__假如每一个可能的结果出现的概率一样,那么对于可能结果数量多的那个事件,新信息有更大的潜力具有更大的信息量__,因为初始状态下不确定性更大。

那有什么函数能满足上面四个条件呢?负的对数函数,也就是 $-log(x)$!底数取大于 1 的数保证这个函数是非负的就行。前面再随便乘个正常数也行。

  1. 为什么不是正的?因为假如是正的,由于 x 是小于等于 1 的数,$log(x)$ 就小于等于 0 了。第一个特点满足。
  2. 咱们再来验证一下其他特点。三是最容易的。假如 x 是一个概率,那么 $log(x)$ 是连续依赖于 x 的。
  3. 四呢?假如有 n 个可能结果,那么出现任意一个的概率是 1/n,而 $-log(1/n)$ 是 n 的增函数,没问题。
  4. 最后验证二。由于 $-log(xy) = -log(x) -log(y)$,所以也是对的。学数学的同学注意,这里的 y 可以是给定 x 的条件概率,当然也可以独立于 x。

By the way,这个函数是唯一的(除了还可以多乘上任意一个常数),有时间可以自己证明一下,或者查书。

ok,所以我们知道一个 __事件的信息量就是这个事件发生的概率的负对数__。

最后终于能回到信息熵。信息熵是跟所有可能性有关系的。每个可能事件的发生都有个概率。__信息熵就是平均而言发生一个事件我们得到的信息量大小。所以数学上,信息熵其实是信息量的期望__。

$H=-\sum_{x \in U} P(x) \log P(x)$

至于为什么用“熵”这个怪字?大概是当时翻译的人觉得这个量跟热力学的熵有关系,所以就用了这个字,君不见字里头的火字旁?而热力学为什么用这个字?这个真心不知道。。。


据评论里 @林杰威 的说法:熵最早是由热力学定义的一个函数,是普朗克来中国讲学的时候引入的。英文是“entropy”这个字,中文词汇中没有相关的字眼。当时是一个有名的姓胡的学者作为普朗克的翻译。因为这个熵“S”是定义为热量Q与温度的比值,所以当时他翻译是立刻创造出熵这个字,从火,从商。

联合熵(joint entropy)

如果 X, Y 是一对离散型随机变量 $X, Y \sim p(x, y)$, X, Y 的联合熵 $H(X, Y)$ 为:
$$
H(X, Y)=-\sum_{x \in X} \sum_{y \in Y} p(x, y) \log _{2} p(x, y)
$$

联合熵实际上就是描述一对随机变量平均所需要的信息量。

条件熵(conditional entropy)

给定随机变量 X 的情况下,随机变量 Y 的条件熵定义为:
$$
\begin{aligned}
H(Y | X) &=\sum_{x \in X} p(x) H(Y | X=x) \
&=\sum_{x \in X} p(x)\left[-\sum_{y \in Y} p(y | x) \log {2} p(y | x)\right] \
&=-\sum
{x \in X} \sum_{y \in Y} p(x, y) \log _{2} p(y | x)
\end{aligned}
$$

联合熵、条件熵的关系

$\begin{aligned} H(X, Y) &=-\sum_{x \in X} \sum_{y \in Y} p(x, y) \log [p(x) p(y | x)] \ &=-\sum_{x \in X} \sum_{y \in Y} p(x, y)[\log p(x)+\log p(y | x)] \ &=-\sum_{x \in X} \sum_{y \in Y} p(x, y) \log p(x)-\sum_{x \in X} \sum_{y \in Y} p(x, y) \log p(y | x) \ &=-\sum_{x \in X} p(x) \log p(x)-\sum_{x \in X} \sum_{y \in Y} p(x, y) \log p(y | x) \ &=H(X)+H(Y | X)\end{aligned}$

熵率

一般地,对于一条长度为 n 的信息,每一个字符或字的熵为:
$$
H_{\text {rate }}=\frac{1}{n} H\left(X_{\text {ln }}\right)=-\frac{1}{n} \sum_{x_{\text {1n }}} p\left(x_{\text {ln }}\right) \log p\left(x_{\text {1n }}\right)
$$

这个数值我们也称为熵率(entropy rate)。其中,变量 $X_{1n}$ 表示随机变量序列 $(X_1, …, X_n)$,$x_{1n} = (x_1, …, x_n)$ 表示随机变量的具体取值。有时将 $x_{1n}$ 写成:$x_1^n$。

相对熵(relative entropy)

相对熵(relative entropy, 或称 Kullback-Leibler divergence, KL 距离)

两个概率分布 $p(x)$ 和 $q(x)$ 的相对熵定义为:
$$
D(p | q)=\sum_{x \in X} p(x) \log \frac{p(x)}{q(x)}
$$

该定义中约定 $0 log (0/q) = 0$,$p log (p/0) = \infty$。

相对熵常被用以衡量两个随机分布的差距。当两个随机分布相同时,其相对熵为 0。当两个随机分布的差别增加时,其相对熵也增加。

相对熵

交叉熵(cross entropy)

如果一个随机变量 $X \sim p(x)$,$q(x)$ 为用于近似 $p(x)$ 的概率分布,那么,随机变量 $X$ 和模型 $q$ 之间的交叉熵定义为:
$$
\begin{aligned}
H(X, q) &=H(X)+D(p | q) \
&=-\sum_{x} p(x) \log q(x)
\end{aligned}
$$

交叉熵的概念用以衡量估计模型与真实概率分布之间的差异。

对于语言 $L=(X) \sim p(x)$ 与其模型 $q$ 的交叉熵定义为:
$$
H(L, q)=-\lim {n \rightarrow \infty} \frac{1}{n} \sum{x_{1}^{n}} p\left(x_{1}^{n}\right) \log q\left(x_{1}^{n}\right)
$$

其中,

  • $x^n_1=x_1,…,x_n$ 为语言L的词序列(样本);
  • $p(x_1^n)$ 为 $x_1^n$ 的概率(理论值);
  • $q(x_1^n)$ 为模型 $q$ 对 $x_1^n$ 的概率估计值。

信息论中有如下定理:假定语言 L 是稳态(stationary)遍历性(ergodic)随机过程,$x^n_1$ 为 L 的样本,那么,有:
$$
H(L, q)=-\lim {n \rightarrow \infty} \frac{1}{n} \log q\left(x{1}^{n}\right)
$$

由此,我们可以根据模型 $q$ 和一个含有大量数据 的 $L$ 的样本来计算交叉熵。__在设计模型 $q$ 时,我们的目的是使交叉熵最小,从而使模型最接近真实的概率分布 $p(x)$__。

相对熵与交叉熵

由于 $H(X, q) =H(X)+D(p | q)$。机器学习的目的就是希望 $q(x)$ 尽可能地逼近甚至等于 $p(x)$,从而使得相对熵接近最小值 0。由于真实的概率分布是固定的,相对熵公式的前半部分 $H(X)$ 就成了一个常数。那么相对熵达到最小值的时候,也意味着交叉熵达到了最小值。对 $q(x)$ 的优化就等效于求交叉熵的最小值。另外,对交叉熵求最小值,也等效于求最大似然估计(maximum likelihood estimation)。

困惑度(perplexity)

在设计语言模型时,我们通常用困惑度来代替交叉熵衡量语言模型的好坏。给定语言 $L$ 的样本 $l_1^n = l_1 … l_n$,$L$ 的困惑度 $PP_q$定义为:
$$
P P_{q}=2^{H(L, q)} \approx 2^{-\frac{1}{n} \log q\left(l_{1}^{n}\right)}=\left[q\left(l_{1}^{n}\right)\right]^{-\frac{1}{n}}
$$

语言模型设计的任务就是寻找困惑度最小的模型,使其最接近真实的语言。

互信息(mutual information)

如果 $(X, Y) \sim p(x, y)$,$X, Y$ 之间的互信息 $I(X; Y)$ 定义为:
$$
I(X; Y) = H(X) - H(Y|X)
$$

根据 $H(X)$ 和 H(X|Y)$ 的定义:

  • $H(X)=-\sum_{x \in X} p(x) \log _{2} p(x)$
  • $H(X | Y)=-\sum_{x \in X} \sum_{y \in Y} p(x, y) \log _{2} p(x | y)$

$$
\begin{aligned}
I(X ; Y) &=H(X)-H(X | Y) \
&=-\sum_{x \in X} p(x) \log {2} p(x)+\sum{x \in X} \sum_{y \in Y} p(x, y) \log {2} p(x | y) \
&=\sum
{x \in X} \sum_{y \in Y} p(x, y)\left(\log {2} p(x | y)-\log {2} p(x)\right) \
&=\sum
{x \in X} \sum
{y \in Y} p(x, y)\left(\log {2} \frac{p(x | y)}{p(x)}\right) \
I(X ; Y) &=\sum
{x \in X} \sum_{y \in Y} p(x, y) \log _{2} \frac{p(x, y)}{p(x) p(y)}
\end{aligned}
$$

互信息 $I (X; Y)$ 是在知道了 $Y$ 的值以后 $$ 的不确定性的减少量,即 $Y$ 的值透露了多少关于 $X$ 的信息量。

注:类似决策树中的信息增益。

互信息、条件熵、联合熵

互信息值越大,表示两个汉字之间的结合越紧密,越可能成词。反之,断开的可能性越大。

当两个汉字 $x$ 和 $y$ 关联度较强时,其互信息值 $I(x, y)>0$;$x$ 与$y$ 关系弱时,$I(x, y)≈0$;而当 $I(x, y)<0$ 时,$x$ 与 $y$ 称为 “互补分布”。

在汉语分词研究中,有学者用双字耦合度的概念代替互信息:设 $c_i$,$c_{i+1}$ 是两个连续出现的汉字,统计样本中 $c_i$,$c_{i+1}$ 连续出现在一个词中的次数和连续出现的总次数, 二者之比就是 $c_i$,$c_{i+1}$ 的双字耦合度:

$\text { Couple }\left(c_{i}, c_{i+1}\right)=\frac{N\left(c_{i} c_{i+1}\right)}{N\left(c_{i} c_{i+1}\right)+N\left(\cdots c_{i} | c_{i+1} \cdots\right)}$

  • $N(c_i c_{i+1})$ 表示字符串$c_i c_{i+1}$构成的词出现的频率
  • $N(…c_i|c_{i+1}…)$ 表示 $c_i$ 作为上一个词的词尾且 $c_{i+1}$ 作为相邻下一个词的词头出现的频率

    注意:此处“|”不表示条件概率!