- 深度 | David Silver 全面解读深度强化学习:从基础概念到 AlphaGo
- 深度 | 深度学习漫游指南:强化学习概览
- 重磅 | 详解深度强化学习,搭建DQN详细指南(附论文)
- 独家 | 吴恩达NIPS 2016演讲现场直击:如何使用深度学习开发人工智能应用?
- 深度 | 迁移学习全面概述:从基本概念到相关研究
- 深度 | 理解深度学习中的卷积
- 专访 | 东南大学漆桂林教授:知识图谱不仅是一项技术,更是一项工程
- 综述 | 知识图谱研究进展
- 盘点 | 机器学习入门算法:从线性模型到神经网络
- 深度神经网络全面概述:从基本概念到实际模型和硬件基础
- 想了解概率图模型?你要先理解图论的基本定义与形式
- 机器理解大数据的秘密:聚类算法深度详解
- 图灵测试通过事件的噱头以及沉思
- 重磅 | DeepMind 最新生成模型 WaveNet,将机器合成语音水平与人类差距缩小 50%(附论文)
- 谷歌最新的全端到端语音合成系统
- 人工智能能骗过人类吗?愚人节特写:这不是玩笑
- 三张图读懂机器学习:基本概念、五大流派与九种常见算法
- LSTM 入门必读:从基础知识到工作方式详解
- 从语言学到深度学习 NLP 一文概述自然语言处理
- 最全的 DNN 概述论文:详解前馈、卷积和循环神经网络技术
- 从贝叶斯定理到概率分布:综述概率论基本定义
- 追根溯源!一图看尽深度学习架构谱系
- 徒手实现 CNN:综述论文详解卷积网络的数学本质
- 读懂概率图模型:你需要从基本概念和参数估计开始
- 从零开始:教你如何训练神经网络
- 开发者必读:计算机科学中的线性代数
- 学界 | 定量研究:当前机器学习领域十大研究主题
- 机器学习和深度学习引用量最高的 20 篇论文(2014-2017)
- 从贝叶斯角度,看深度学习的属性和改进方法
- 良心 GitHub 项目:各种机器学习任务的顶级结果(论文)汇总
- 深度 | 从朴素贝叶斯到维特比算法:详解隐马尔科夫模型
- 揭秘深度学习成功的数学原因:从全局最优性到学习表征不变性
- 深度 | 从 AlexNet 到残差网络,理解卷积神经网络的不同架构
- 从 Pix2Code 到 CycleGAN:2017 年深度学习重大研究进展全解读
- OpenAI 详解进化策略方法:可替代强化学习
- 从自编码器到生成对抗网络:一文纵览无监督学习研究现状
- 资源 | 从文本到视觉:各领域最前沿的论文集合
- 从决策树到随机森林:树型算法的原理与实现
- 从概率论到多分类问题:综述贝叶斯统计分类
- 从遗传算法到 OpenAI 新方向:进化策略工作机制全解
- 综述 | 一文帮你发现各种出色的 GAN 变体
- 资源 | 生成对抗网络及其变体的论文汇总
- 生成对抗网络综述:从架构到训练技巧,看这篇论文就够了
- 干货 | 物体检测算法全概述:从传统检测方法到深度神经网络框架
- 重磅 | 自动驾驶计算机视觉研究综述:难题、数据集与前沿成果(附 67 页论文下载)
- 神经风格迁移研究概述:从当前研究到未来方向(附论文和代码)
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN 和 SSD
- 计算机视觉这一年:这是最全的一份 CV 技术报告
- 计算机视觉这一年:2017 CV 技术报告 Plus 之卷积架构、数据集与新趋势
- 深度 | 2017 CV 技术报告之图像分割、超分辨率和动作识别
- 深度 | 2017CV 技术报告:从 3D 物体重建到人体姿态估计
- 语音合成到了跳变点?深度神经网络变革 TTS 最新研究汇总
- 资源 | 从全连接层到大型卷积核:深度学习语义分割全指南
- 学界 | 词嵌入 2017 年进展全面梳理:趋势和未来方向
- 深度 | 一文概述 2017 年深度学习 NLP 重大进展与趋势
- 学界 | 一文综述所有用于推荐系统的深度学习方法
- 使用深度学习构建先进推荐系统:近期 33 篇重要研究概述
- 业界|谷歌 TensorFlow 的一份全面评估报告:好的坏的及令人讨厌的
- 初学者怎么选择神经网络环境?对比 MATLAB、Torch 和 TensorFlow
- 业界 | 剖析用于深度学习的硬件:GPU、FPGA、ASIC 和 DSP
- 神经形态计算与神经网络硬件最全调查:从研究全貌到未来前景
- 从 GPU、TPU 到 FPGA 及其它:一文读懂神经网络硬件平台战局
- 从浅层模型到深度模型:概览机器学习优化算法
- 综述论文:当前深度神经网络模型压缩和加速方法速览
- 深度 | 从修正 Adam 到理解泛化:概览 2017 年深度学习优化算法的最新研究进展
- 一文概览深度学习中的五大正则化方法和七大优化策略
- 从强化学习基本概念到 Q 学习的实现,打造自己的迷宫智能体
- 回归、分类与聚类:三大方向剖解机器学习算法的优缺点(附 Python 和 R 实现)
- 基于 TensorFlow 理解三大降维技术:PCA、t-SNE 和自编码器
- 一文读懂遗传算法工作原理(附 Python 实现)
- 10 大深度学习架构:计算机视觉优秀从业者必备(附代码实现)
- 从算法到训练,综述强化学习实现技巧与调试经验
- 2017 年度盘点:15 个最流行的 GitHub 机器学习项目
深度 | 从朴素贝叶斯到维特比算法:详解隐马尔科夫模型
本文首先简要介绍朴素贝叶斯,再将其扩展到隐马尔科夫模型。我们不仅会讨论隐马尔科夫模型的基本原理,同时还从朴素贝叶斯的角度讨论它们间的关系与局限性。
隐马尔科夫模型是用于标注问题的统计机器学习模型,是一种生成模型。隐马尔科夫模型是关于时序的概率模型,它描述了由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。本文将重点介绍这种经典的机器学习模型。
简介
机器学习一个经典的问题就是学习一个能区分两个或多个类别的分类器,即在给定训练样本下能预测新样本所属的类别。机器学习分类器经常用于处理 NLP 任务,例如将邮件根据内容分类为垃圾邮件或正常邮件,将新闻按内容分为不同的主题等。但除了这种分类任务,NLP 还有很多都涉及到另一种与结构有关的预测,这种结构化预测一般可用概率图表示。
NLP 中一个经典的案例就是词性标注问题。在该任务中,x_i 表示一个个的单词,y_i 表示对应 x_i 的词性(如名词、动词和形容词等)。对于这种任务来说,输入的和输出都是一个序列,即给定一个单词序列,模型的输出为对应单词的标注序列,这种序列是与对应位置和上下文相关,所以是一种与结构相关的预测。
在这种序列预测问题中,数据由(x, y)的序列组成,即一个样本可描述为(x_1, x_2,...,x_m,y_1, y_2, ..., y_m)。我们要学习的是在给定一个 x 的序列下,各种 y 序列的概率是多少,即:

在大多数问题中,这些序列具有顺序相关性。即 x 近邻的值与 y 近邻的值具有相关性,或者也可以说 x_i 的近邻决定了 y_i 的属性。例如在英语中,介词 to(x_i)后面所带的单词常常是动词(y_i)。当然在机器学习中还有其它的任务涉及序列数据,例如在时序建模中,我们需要使用所有前面的观测值 y 在 t+1 步时预测新的 y。在序列监督学习中,我们必须序列地预测所有 y 值。
隐马尔科夫模型(HMM)是第一个针对序列分类所提出的算法。当然还有其它很多的序列模型,不过本文会从朴素贝叶斯模型开始逐步扩展到 HMM。
朴素贝叶斯分类器
朴素贝叶斯(分类器)是一种生成模型,它会基于训练样本对每个可能的类别建模。在预测中,朴素贝叶斯分类器在给定一个观察样本下,它会计算所有可能类别的概率并返回最可能由观察样本生成的类别。也就是说,朴素贝叶斯分类器会预测新样本最可能生成的类别是什么。相比之下,如 Logistic 回归那样的判别模型会尝试学习训练样本中的哪些特征最可能对区分类别起作用。
朴素贝叶斯模型在给定特征下最大化后验概率而返回最可能的类别:

其中 y 为类别,x arrow 为一个观察样本的特征向量。
NB 分类器是基于贝叶斯定理的,若我们将贝叶斯定理代入到上式,那么条件概率可以写为:

在训练中,对于一个给定的观察样本,我们可以用上式计算给定观察样本下是某个类别的概率,这样迭代地可以计算所有类别的概率。又因为分母对所有项都是相同的,且不影响最大化概率的结果,上式可以简写为以下:

如果我们将向量按分量分解出来,那么原式可以写为:

这个式子非常难以计算,因为它涉及到估计所有特征可能的组合。因此,我们可以根据朴素贝叶斯假设放宽各特征的条件。朴素贝叶斯定理假设:「给定一个类别,每一个特征都与其它特征条件独立」。该假设可以表示为 p(x_i | y, x_j)=p(x_i | y),其中 i 不等于 j。在给定类别 y 的条件下,概率 p(x_i∣y) 是相互独立的,因此也就能如下简单地乘积表示联合分布:

将上式带入后验概率可得:

上式就是我们最终得到的朴素贝叶斯模型,我们根据朴素贝叶斯假设大大地简化了计算。
训练
朴素贝叶斯的训练主要由计算特征和类别的频率而实现。以下描述的过程需要对每一个类别 y_i 都执行一次计算。为了计算先验概率,我们简单地通过计算所有样本中类别 y_i 占的比率而估计类别出现的概率:

为了计算似然度估计,我们需要计算 x_i 和 y_i 一同出现的次数占 y_i 所出现次数的比率,来估计在 y_i 出现的情况下,x_i 出现的概率:

该计算式将产生一个关于训练样本中所有类别特征的大型同现矩阵。
分类
当我们给一个新的样本进行分类,假设该样本的特征为 x_1、w_3、w_5。那么对于每一个类别 y_i,我们需要计算:

上式可以分解为:

该式需要对每一个类别 y_i 都执行一次计算,因此我们可以选出在这些特征出现的情况下,最可能出现的类别是什么。
从朴素贝叶斯到隐马尔科夫模型
前面展示的模型预测了在给定观察样本下最可能出现的类别。要想预测观察序列 x=(x_1, …, x_n) 对应的类别序列 y=(y_1, …, y_n),可以使用多个朴素贝叶斯模型的累乘而构建一个序列模型:

该模型包括两个方面:
- 每个序列位置只有一个特征,即假设每个特征都以类 y_i 为基础独立生成时每个观察结果对应的特征。
- 该模型不捕捉可观察变量 x_i 之间的互动。
但是,假设在连续序列位置 y_i 上存在依赖项是合理的,还记得上文中关于词性标注的示例吗?这就是一阶马尔科夫模型,其引入了马尔科夫假设:「特定状态的概率仅依赖于前一个状态」。

更常见的形式是:

其中 Y 代表所有可能的标签序列 y arrow 的集合。
隐马尔科夫模型
隐马尔科夫模型(HMM)是一个序列分类器。和其他的机器学习算法一样,它可以被训练,即给定观察结果的标注序列,然后使用学得的参数给观察结果序列分配标签。我们可以把 HMM 框架定义为包含以下组件:
- 状态(如标签):T=t_1, t_2, …, t_N
- 观察结果(如单词):W=w_1, w_2, …, w_N
- 两个特殊状态:t_start 和 t_end,这两个状态与观察结果无关
和状态和观察结果相关的概率:
- 初始概率:状态的初始概率分布
- 最终概率:状态的最终概率分布
- 转移概率:从一个状态到另一个状态的概率矩阵 A
- 发射概率(emission probability):从一个状态生成的观察结果的概率矩阵 B
一阶隐马尔科夫模型具备以下假设:
- 马尔科夫假设:特定状态的概率仅依赖于前一个状态。形式:P(t_i∣t_1, …, t_i−1)=P(t_i∣t_i−1)
- 输出的独立性:输出观察结果 wi 的概率仅依赖于输出观察结果 ti 的状态,而不是其他状态或观察结果。形式:P(w_i∣t_1…q_i, …, q_T, o_1, …, o_i, …, o_T)=P(o_i∣q_i)
注意:输出假设和前述朴素贝叶斯分类器紧密相关。下图便于理解该假设与朴素贝叶斯分类器之间的依赖性和关系:

HMM 中的转移概率和发射概率。(图源:维吉尼亚大学 CS6501 课程)
现在我们可以定义两个用 HMM 可以解决的问题。
- 学习和给定观察序列相关的参数,即训练。例如,给定一个句子中的单词和相关的词性标注,模型可以学到其潜在结构(latent structure)。
- 将训练后的 HMM 用于观察结果序列。例如,给定一个句子,使用 HMM 根据训练数据学得的潜在结构预测每个单词的词性。
学习:估计转移矩阵和发射矩阵(emission matrices)
给定一个观察结果序列 W 和相关状态 T,我们如何学习 HMM 参数,即矩阵 A 和 B?
在 HHM 监督场景下,可以使用最大似然估计原则来计算矩阵,从而完成参数学习。
过程为:计算每个事件在语料库中出现的次数,然后将次数归一化以形成适当的概率分布。我们需要对每个事件在语料库中出现的次数计算 4 次:




其中,M 代表训练样本的个数,N 代表序列长度,1 代表当特定事件发生时指示函数的值为 1,0 代表特定事件未发生。该公式概览了训练数据库,计算每个事件出现的频率。
然后将全部 4 次计算归一化,以得出正确的概率分布:

这些公式将输出转移概率矩阵 A 和发射概率矩阵 B。
拉普拉斯平滑
训练过程中,该模型如何处理未见过的单词?
当未见过的单词/观察结果出现了,P(W_i∣T_i)=0,且预测过程中将会作出错误的序列决策。
有一种技术可以处理这种情况,即拉普拉斯平滑(Laplace smoothing):每个状态总有一个小发射概率要输出未见单词(可标注为 UNK)。每次 HMM 遇到未知单词,该模型将使用 P(UNK∣T_i) 的值作为发射概率。
解码:为观察序列寻找隐藏状态序列
给定一个已训练的 HNN,即转移矩阵 A 和 B 以及一个新的观察序列 W=w_1,w_2,…,w_N,我们希望找到最佳的状态序列 T=t_1,t_2,…,t_N 以解释该观察序列。
这一过程可以通过使用维特比算法(Viterbi algorithm)实现,该算法试图找到总体上最佳的状态序列 T=t_1,t_2,…,t_N。一般来说我们还可以使用另外一种后验解码的算法,该算法独立地为序列中每个位置 i 选择后验概率最高的状态。
维特比算法
维特比算法实际是用动态规划解隐马尔科夫模型的预测问题,即用动态规划求概率最大的路径,在 HMM 中,这些路径对应着一个状态序列。根据动态规划的原理,如果最优状态序列在时刻 i 通过结点 t_i,那么这一状态序列从结点 t_i 到终点 t 的部分状态序列,对于从 t_i 到 t 所有可能的部分状态序列来说,必须是最优的。因为如果不是最优的,那么我们就能从 t_i 到 t 寻找一个更好的状态序列以加大获得观察序列的概率。

定义在时刻 i 状态为 t 的所有单个路径中概率最大值为 δ,维特比算法可以通过使用马尔科夫假设和如下定义的两个函数计算上式单个路径的最大值。

如下计算每一个状态最可能的前面状态:

维特比算法使用使用一个被称之为 trellis 的 HMM 表征,它折叠了每一个位置的所有可能状态,并作出了非常明确的独立性假设:每一个位置仅依赖于前一个位置。

HMM 的 trellis 表示。

发射概率矩阵和状态迁移概率矩阵。
通过使用维特比算法,转移概率矩阵,我们可以将数据填充到 trellis 图表中,并快速高效地找到维特比路径。

将数据填入 trellis 表示中。
上图是 Roger Levy 展示的维特比算法,完全的案例可参考:http://www.davidsbatista.net/assets/documents/posts/2017-11-12-hmm_viterbi_mini_example.pdf。
HMM 的重要观察结果
- 本文的主要思想是看到朴素贝叶斯分类器和序列分类器 HMM 的联系。
- 如果我们使 HMM 的隐藏状态固定,则它就是朴素贝叶斯模型。
- 序列中每个单词/观察结果只有一个特征,即每个观察结果的值。
- 每个状态仅依赖于前一个状态,即每个状态 t_i 都独立于前面所有状态 t_1, t_2, …, t_i−2,除了紧挨着的前一个状态 t_i-1。
- 每一个观察结果变量 w_i 仅依赖于当前状态 t_i。
软件包
- seqlearn:适合 Python 的序列分类库,包括隐马尔科夫模型实现,它使用 sklearn API。
- NLTK HMM:NLTK 也包括一个可以实现隐马尔科夫模型框架的模块。
- lxmls-toolkit:在里斯本机器学习夏季课程中使用的自然语言处理工具包,也包括隐马尔科夫模型实现。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论