平滑(smoothing)

article/2025/8/19 4:22:19

1 问题的提出

由于在现实生活中,我们的观察尺度有限,我们的样本(输入)很可能没有办法包含所有可能的情况,那么我们怎么去处理先前看不见的事件呢?


举个例子,莎士比亚使用了30000个双连词(bigram),然而我们总共有V^2=8.44亿个可能的双连词,所以,99.96%的可能的双连词都没有出现过,那是不是意味着,任何句子包含有其中某一种双连词的概率就为0呢?同样的问题有很多,当我们面对的升起问题时,我们联系观察了20天,即我们手里有20个样本,这20个样本都显示,明天太阳会升起,但是是不是意味着“明天太阳会升起”这个事件发生的概率是100%呢?

当然,我们不能否认,在我们设置的所有事件里,某些事件发生的概率真的是0,也就意味着它们真的不会发生,但是这种情况往往比我们认为的要少。在另一方面,这些我们从有限的样本中推理出出不会发生的事件很可能只是一个小概率事件,这些事件发生的可能性会比样本的估计值要大。那么,我们怎么去评估这些模型呢?

首先,我们会定义一个评估度量标准(evaluation metric),通常被称为得分函数(scoring function),我们想去测量模型的预言与真实情况的相似度。

其次,我们会用可见的训练集进行训练,也许我们会在留存数据上进行协调(tune),为了对不可见的数据进行仿真。

最后,我们会在不可见的测试集上进行测试,不过通常跟训练集是一个集合。测试数据必须要从训练集和留存数据中解体(disjoint),通过他们的得分来比较模型。

在文本分类中,有一种效应为Zipf’s Law,有兴趣的朋友可以去了解一下长尾现象(long tail phenomenon)。这个效应是这样描述的:

高频率发生的事件是少量的,低频率发生的事件是大量的。你可以迅速收集高频率事件的统计数据,却需要很长时间去收集低频率事件的合适的统计数据。结果就造成了我们的估计很自然地变得很稀疏,大量我们想要评估的数据甚至都没有计数。解决的办法就是要对看不见的n-元模型进行似然估计。处理的办法通常有两种:

第一种:使用一种完全不同的评估技术

其中包括拉普拉斯平滑(Add-1(Laplace) Smoothing), Good-TuringDiscounting,核心思想是取代MLE估计

第二种:将一个复杂的模型和一个更简单的模型联合使用。

其中包括线性插值(Linear Interpolation),修改Knesser-Ney平滑(Modified Knesser-Ney smoothing),核心思想是使用的二元概率去计算的三元概率

平滑算法就像是罗宾汉(Robin Hood)一样,劫富济贫:


 

2.拉普拉斯平滑(Laplace smoothing)

明天太阳会升起吗?


拉普拉斯平滑是拉普拉斯在研究太阳升起问题时提出的。

其中,第n+1天,我们观察到之前太阳升起了s次,则今天太阳升起的概率为


拉普拉斯平滑既然被称作加一平滑,自然是在每一个计数上加一。我们以一个词典为例,我们从一个大小为V的词典里,独立得取出N个词,我们有一元概率:


每个计数上加一:


结果为:


二元概率:


这里有一个问题,就是加一算法从可见事件到不可见事件移动的概率块太多了。

我们重组一下伪计数:

对一元模型:

对二元模型:


我们可以对比重组之后的二元计数:


所以我们可以总结一下拉普拉斯平滑:

优点:简单,便于实现

缺点:转移太多的概率

回到之前的莎士比亚问题上,V=30000个词,’the’出现25545次,’the’的概率为


既然拉普拉斯平滑在N元模型上的效果并不好,那么我们就会有更好的平滑算法

 

3. Good-Turing smoothing


现在假设你正在钓鱼,现在湖里有八种鱼:carp, perch, whitefish, trout, salmon, eel,catfish, bass,你现在已经钓到了10 carp, 3 perch, 2 whitefish, 1 trout, 1salmon, 1 eel = 18 fish。所以,下次钓鱼钓到没钓过的种类(catfish or bass)的概率是多少呢?

下次钓鱼又钓到trout的概率是多少呢?我们一会来回答这个问题。

现在定义:是频率x出现的次数。

所以,,被看见10次的鱼的种类数为1(carp),,被看见1次的鱼的种类数为3 (trout, salmon, eel)。

因此,去评估一个没见过的种类:



其他的评估都要向下调整,来适应未出现的概率:



二元频率的频率于GT重组估计:


GT平滑的二元概率:


我们再重新回顾一下Good-Turing smoothing的思想:使用仅发生一次的事件的总频率,去估计可见事件到不可见事件的转移概率。


其中,Nc代表发生c次的时间的个数。

将发生n次的事件的概率块分配给发生n-1次的事件。

Nn发生了n次,总频率为n⋅Nn

所以,发生n-1次的事件的概率就变成:


Good-Turing代替原始的Cn-1,变成了新的C*n-1:


事件w发生n-1次的极大似然估计为:


事件w发生n-1次的Good-Turing估计为:


Good-Turing无法解决的问题有:

1.     无法处理更频繁的事件

2.     不对每一个n都观察事件

Good-Turing的变体:Simple Good-Turing

将Nn替换成一个适应函数f(n):


4.线性插值(Linear Interpolation)

假如我们没有看到”Bob was reading”,我们看到了“__ was reading”,我们将会估计P(reading |’Bob was’) =0而不是 P(reading | ‘was’) > 0。

所以我们尝试着使用n-1元概率去估计n-元概率:


我们从来不会看到“Bob was reading”,但是我们可能会看到“__ was reading”,或者更直接的看到“__ reading”。


λ的上下文条件:


但是现在面临一个问题:怎样设置λ。我们有两种思想:

A:留存估计

       将数据分成训练数据和留存数据,根据训练数据评估模型,利用留存数据(或者一些优化技术)去寻找使模型表现更好的λ(有点像k-折叠交叉验证)。当然,λ也可以取决于Wi-n...Wi-1

B:λ是Wi-n...Wi-1频率的函数

 

其他的平滑算法还包括绝对折扣(Absolute discounting),Kneser-Ney smoothing,和bayesian prior Smoothing.其中bayesian prior Smoothing为:




http://chatgpt.dhexx.cn/article/67ijtjXJ.shtml

相关文章

【简单理解】自然语言处理-平滑方法(Smoothing)

【简单理解】自然语言处理-平滑方法(Smoothing) 简单介绍平滑策略 平滑策略的引入,主要使为了解决语言模型计算过程中出现的零概率问题。零概率问题又会对语言模型中N-gram模型的Perplexity评估带来困难。 零概率问题,就是在计算实例的概率时&#xf…

二十二、动网格Smoothing Spring方法及实例

1 概念介绍 最近一直忙着其他的事情,好久都没有更新,让各位家人们久等了。 今天我们接着聊一聊动网格问题,我们在文章二十一中介绍了动网格的Layering方法,但是Layering方法的局限性很高,只能对四边形网格或六面体网格…

numpy安装

1.以管理员的形式打开cmd 2.安装numpy插件 pip install numpy 3.安装成功后,输入pip list 命令查看是否安装成功 pip list 3.创建 #使用array创建一维数组 list01 [1,2,3,4] np01 np.array(list01) print(np01) print(type(np01)) #使用array创建二维数组 …

Matplotlib安装

安装matplotlib 使用python中pip命令安装 使用python中pip命令安装 第一步:使用winR输入cmd命令打开命令窗口,找到python安装目录下的Scripts目录,使用python -m pip install matplotlib命令 如果出现以下错误或警告,则需按照指示…

node安装

1、进入node官网,下载长期支持版,安装 2、输入node -v,能查询到版本号即为安装成功 3、为方便管理,修改默认的缓存和模块存放路径(C:\Users\Administrator\AppData\Roaming\npm),在nodede 安装文…

如何安装仿宋GB2312字体

步骤: 一、下载仿宋_GB2312.zip压缩包并解压缩; 百度网盘:https://pan.baidu.com/s/1L7yYKhoDmUw1RpNXVS5KDQ 提取码:eclz 阿里云盘:https://www.aliyundrive.com/s/ih3kDDidcGa 二、双击打开字体文件,…

安装Matplotlib

文章目录 一、pip安装二、conda安装1、anaconda navigator安装2、condan命令安装 一、pip安装 运行如下的命令即可 pip install matplotlib二、conda安装 Anaconda包括Conda、Python以及一大堆安装好的工具包,比如:numpy、pandas等。conda是一个开源的…

cnpm安装

1.将node安装到D:\Program Files\nodejs目录。 2.设置npm全局安装路径与缓存路径 npm config set prefix "D:\Program Files\nodejs\node_global" npm config set cache "D:\Program Files\nodejs\node_cache" 3.安装cnpm npm install -g cnpm --regis…

torch安装

第n次安装了,每次都得结合很多篇才能安装成功,这次直接自己写一个。 一、安装anaconda 这个自己搜吧,挺简单的。 二、安装pytorch 进入anaconda prompt 创建一个虚拟环境(就不用再安装python了,创建之后直接就是用…

pytorch安装

(一)安装Anaconda 1、详细步骤这里不多说。anaconda安装时会自带安装相应的python版本。 安装完成后,可以运行cmd,使用conda --version查看anaconda的版本;用conda list查看安装的包,这里面也包含了python…

halcon21.11安装教程详解

文章目录 1.软件下载2.安装过程 halcon21.11安装教程详解 1.软件下载 a 官网:https://www.mvtec.com/cn b 百度网盘下载 链接:https://pan.baidu.com/s/1-Bdz1l54PQWxbDBkSlILlA 提取码:a5yg 2.安装过程 解压之后,双击som.exe…

安装TensorFlow

文章目录 1.准备工作2.安装TensorFlow3.激活tensorflow 1.准备工作 在安装TensorFlow之前得先安装Anaconda如果还没有进行安装,可以看我主页安装Anaconda教程 2.安装TensorFlow 我们打开Anaconda Prompt 输入python -m pip install -U pip,按回车等待…

Nodejs安装教程

目录 一、安装环境 二、安装步骤 三、验证安装 四、修改全局模块下载路径 五、更换npm源为淘宝镜像 六、全局安装基于淘宝源的cnpm 总结 一、安装环境 本教程演示的环境:win 10 64位node.js下载官网: nodejs官网. 点击选中图标下载到电脑本地即可。 二、安…

操作系统第一次作业

一.执行运行VirtualBox的安装程序 1、进入安装向导,点击下一步。 2、进入自定安装,软件的位置默认在c盘,可以将软件的位置自定义,注意这里需要点击VirtualBox Networking,选择将整个功能安装到本机硬盘,点…

如何安装Java、Idea、mysql

Java、Idea手把手教你如何安装 一、java 如何安装二、 java配置环境变量三、Idea 如何安装四、IDEA安装成功五、如何安装mysql1、下载mysql2、安装Mysql3.检查必需项(Check Requirements)5.进入配置界面 Product Configuration,Next6、进行服…

windows10 输入法 切换 热键 快捷键 更改 设置

windows10 输入法 切换 热键 快捷键 设置 点击左下角窗口图标“开始”,点击齿轮图标“设置”,输入“高级键盘设置”并选择, 点击“输入语言热键“ 选择要改的项目,点击”更改按键顺序“

解决Windows 10不能切换输入法

问题:使用Windows 10自带的输入法,按shift键不能切换中英输入法。 解决办法: 1、选中“此电脑“,右击,选择”管理“,弹出下面的对话框 2、依次选择计算机管理(本地),系统工具,任务计…

windows 10 输入法切换设置

windows 10 输入法切换设置 目的:win10系统中,搜狗输入法、英文(美国)输入法,实现二者的快捷键切换。 搜索栏——输入“语言设置” 查看是否有想用的输入法,没有的话,添加即可。之后&#x…

如何关闭或更改Windows自带输入法繁体简体切换(Ctrl+Shift+F)的快捷键

文字描述步骤: 注:【括号内容表示点击内容】 点击屏幕右下角图标输入法【语言首选项】—>标题为首选语言栏下的【中文(简体,中国)】—>【选项】—>下拉滚动条标题为键盘下的【微软拼音】—>【选项】—>【按键】—>下拉滚…

Win10系统输入法(微软拼音)切换简体和繁体

Win10系统微软拼音切换简体和繁体有两种方式。 方式1-快捷键 ctrlshiftf(强烈建议关闭该快捷键) 方式2-界面设置