zoukankan      html  css  js  c++  java
  • HMM (隐马尔可夫) 推导 (上)

    认识

    跟 EM 算法的那部分是有些类似的思想, 引入 "隐变量" (Latent Variable).

    对于观测样本:

    (x_1, x_2, x_3, ...x_n)

    存在相对应的 Latent 变量:

    (z_1, z_2, z_3, ...z_n)

    可以理解为观测值的另一种表示, 而且很难直观去观测到, 就像之前 EM 里面的扔硬币, 只能看到最后结果, 却不知道该结果是由哪个硬币产生 的.

    在 HMM 中, 我们把 (z_1, z_2, ...z_n) 叫做 状态, 不同的状态, 生成对应的 观测值, 而状态之间是有一个状态转移(矩阵)

    case 扔硬币

    跟之前的 EM 一样的. 假设有2个硬币 A, B , 已知事件, 正面朝上的概率分别为 (mu_1, mu_2) 即:

    (A: P(正面) = mu_1; p(反面) = 1-mu_1)

    (B: P(正面) = mu_2; p(反面) = 1-mu_2)

    现在开始扔硬币, 我们只能看到最终的结果, 却不知该结果是由哪个硬币产生的.

    也不是乱扔, 扔也是有一定概率分布(状态转移)的, 只是不知道而已

    我们重点关系如下几个问题:

    • 假设知道模型参数(就假设知道 z1->x1, z2-x1 的概率下, 如何通过 观测结果 反推 背后逻辑

    Viterbi 算法 求解

    • 知道观测值, 如何进行参数估计 (此处就是通过 "正,反"的结果去估计 z 的转移概率和 (mu_1, mu_2)

    可用前面的 EM 算法求解

    • 参数已知, 如何根据观测值去做 预测

    预测

    需求: 计算 (p(正, 正, 正, 反, 正, 反))

    求解: 考虑所有的状态 (s) , 即: (sum limits_{s} p(正, 正, 正, 反, 正, 反 | s) p(s)) => 可用DP算法求解 (动态规划)

    硬币自身的产生"正面朝上" 的概率, 被称为 发射概率 (Emission Probability)

    如何选择下一次扔哪个硬币的这个规律性 ( heta), 被称为 转移概率 (Transtion Probability)

    还有最开始的一个状态, 嗯, 就叫初始状态 Initialization 吧

    转移矩阵是要通过学出来, 通过EM算法来找出背后的逻辑呀

    对于初始状态, 相当于第一实验, 有一个策略, 比如 0.7 概率会选择A, 0.3 概率选择B, 然后后面的则根据 ( heta) 参数来选择呀

    可以发现, 核心的参数求解过程, 还是用的EM算法呀, 需求解出3个参数: 初始状态, 发射概率, 转移矩阵

    case2 词性分析

    其实我们每说一句话, 是有背后的词性逻辑的, 即语法. 只是我们平时并不关注而已, 但, 存在.

    隐变量 : 主 + 谓 + 宾

    观测值 : 我 + 想 + 你

    • 对于 隐变量, 即"主谓宾"的顺序, 是有规律的, 这个规律就是我们说的 状态转移矩阵

    • 而我们直接听到的是 "我想你"

    于是 HMM 用在在词性分析上,

    EM 部分, 所要做的事情是, 通过 我想你 这样的句子, 去 发现背后的 主谓宾词性规律

    而预测部分则是, 通过算好的模型参数, 去生成新的句子.

    感觉这不是就是在打造一个 聊天机器人吗

    HMM 参数估计

    ( heta = (A, B, pi))

    假设有5个状态, 同样是扔2个硬币

    (pi) 表示初始状态, 如: (pi = [0.8, b, c, d, e])

    A 表示两个状态的转移矩阵; 是一个 5x5 的方阵

    B 表示发射概率 (隐含规则->观测的概率值); 是一个 5x2 的矩阵

    如果是词性分析, 则矩阵就非常大了, 如果观测是连续型 则需要用 概率分布来描述了.

    对于, HMM, 要求解出这3个参数, 主要有两个步骤, 或者说是2个关键点:

    • 给定模型的参数, 找出最适合的 Z => Inference (推断过程)
    • 估计模型参数的 ( heta) => Parameter Estimation (估计过程)

    最好的 Z 状态 - 枚举法

    Z 就是隐变量.

    前提条件是模型参数已知哦.

    最能想到的一种方式, 就是枚举法, 将 所有可能的 z 都枚举出来, 选择最好的一个 z 状态.

    什么是最好的状态, 就是 极大似然估计最大的参数呀

    具体如何选择呢, 假设 z = 1, 1, 1, 1, 1 其实就是:

    (p(x, z) = [p(z_1 = 1)p(z_2 = 1|z_1=1)p(z_3=1|z_2=1)p(z_4=1 |z_3=1) p(z_5=1|z_4=1) ] \ * [p(x_1 |z_1=1) p(x_2|z_2=1) p(x_3|z_3=1)p(x_4|z_4=1)p(x_5|z_5=1)])

    同样, 简化一点哈, 假设 状态有3种, z = 1,3, 2则:

    (p(x, z) = [p(z_1=1)p(z_2=3 |z_1=1)p(z_3=2|z_2=3)] * [p(x_1|z_1=1)p(x_2|z_2=3)p(x_3|z_3=2])

    ....

    最后选出最大的 状态 Z 即可呀. (有点像, 求给定 z 求最大的后验概率 (p(z|x) = frac {p(z,x)}{p(x)}) 分母一样, 只关心 分子p(z, x)即可, 但涉及p(x)的计算很麻烦, 而我们目的是最大化 p(z|x) => 关注 p(z, x) 即可, p(x) 是不需要考虑的)

    目标导向和数学思维才是最为重要的, 注, 此阶段是假定已经知道所有模型参数的情况下来求解哦

    对于离散型的, 即一个状态对应 一个向量, 可用用 不同的(均值, 方差) 的高斯分布来进行估计 发射概率, 每一个状态就对应一个高斯分布而已. 参数是 ((mu, Sigma)) 也都是学出来的 (就是模型的 B),

    最好的 Z 状态 - Viterbi 算法

    比之前的枚举还是要好一点, Viterbi 就是一个 动态规划算法.

    ​ z_1 z_2 z_3 z_4 z_5 z_6 z_n

    1 x x x x x x x

    2 a a x x x x x

    j x x a a x a x

    ... x x x x a x a

    m x x x x x x x

    列就表示 我们要求解的状态, 行表示每个状态想的所有取值

    这样来看, 其实我要求最好的 z 则 是去选择 z1 ... z_n 最好的 路径, 使得这个路径的值, 即联合概率 p(x, z) 是最大的

    so, 这样问题就变成了, 寻找最优路径, 关于找路径, 可以用 动态规划算法求解的哦. 先定义个一变量:

    (delta_k (j))

    表示一开始从 状态 z_1 到 状态 z_k 且 z_k 取值为 第j 行的那个 节点的最好路径的值

    (delta _{k+1} (j))

    表示 z_(k+1) 最好的状态, 跟其前一个状态 z_k 的每个取值(行) 是有关联的, 一直往前这样去 分割问题

    (delta _{k+1} (j) = max) (

    (delta_{k(1)} + log p(z_{k+1}=j | z_k=1)),

    (delta_{k(2)} + log p(z_{k+1}=j | z_k=2)),

    (delta_{k(3)} + log p(z_{k+1}=j | z_k=3)),

    ​ ...

    (delta_{k(m)} + log p(z_{k+1}=j | z_k=n)),

    )

    其实每一项还有一个发射概率, 可以省略, 因为每行, 其实是一样的值呀

    整个过程有点跟 XGBoost 有点像. 在计算 (delta_1 ....delta_n) 每后一下的行值, 都是由前一列的值来计算出来的, 这样一直从前往后的过程, 全部循环过后呢, (就很像是在按列填充一个二维表) .

    最后的评估, 其实就是从最后一列值中选择最大的值, 及其所在的节点位置, 然后从后往前进行节点的 "溯源" 就完整地画出了最优路径了呀.

    由此再从前往后写出最后的 z 答案 (假设上述的 a) 则: z = 2, 2, .j..j..j)

    至此, 关于 HMM 的 inference 部分就求解结束, 然后, 是关于参数估计的部分推导.

  • 相关阅读:
    【转载】 HTTP 中 GET 与 POST 的区别
    JS 浏览器cookie的设置,读取,删除
    JS Event事件流(冒泡机制、捕获机制、事件绑定)
    DOM节点树和元素树--深度遍历
    Html_Task4(知识点:水平居中+垂直居中/position/float/border-radius)
    百度前端技术学院—斌斌学院题库
    百度前端技术学院—-小薇学院(HTML+CSS课程任务)
    js正则表达式
    js设计模式(一)发布订阅模式
    vue学习笔记(一)——利用vue-cli搭建一个前端项目
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12105188.html
Copyright © 2011-2022 走看看