条件随机场(CRFs)

4 CRFs

我们现在转向条件随机场。为了方便,我们使用\underline{x}表示输入序列x_1\dots x_m,\underline{s}表示状态序列s_1\dots s_m,\mathcal{S}表示所有可能状态的集合,\mathcal{S}^m表示所有可能的状态序列的集合。

在条件随机场里,我们依然是为条件概率
p(s_1\dots s_m|x_1\dots x_m)=p(\underline{s}|\underline{x})建立模型。CRFs的第一个关键思想是定义一个特征向量
\underline{\Phi}(\underline{x},\underline{s}) \in \mathbb{R}^d
该函数将整个输入序列\underline{x}和与其配对的整个状态序列\underline{s}映射到某个d维特征向量。我们很快就会给出一个\underline{\Phi}的具体定义。但是现在我们假设函数已经定义好了,我们经常将\underline{\Phi}成为全局特征向量(之所以被称为全局,是因为它将整个状态序列纳入其中)。

这样我们就有了一个巨型的对数线性模型,
p(\underline{s}|\underline{x},\underline{\omega})= \cfrac{exp(\underline{\omega}\cdot\underline{\Phi}(\underline{x},\underline{s}))} {\sum_{s\prime\in\mathcal{S}} exp(\underline{\omega}\cdot\underline{\Phi}(\underline{x},\underline{s\prime})}
该线性模型之所以称为巨型,是因为:
1)所有可能的状态序列\underline{s},也就是\mathcal{S}^m非常大。
2)归一化常数包括对集合\mathcal{S}^m求和,一眼看去,仿佛这会引起非常复杂的计算问题,但是很快我们将看到,在合理的假设下,我们可以非常有效的训练和解码该模型。

第二个问题是我们怎么定义函数\underline{\Phi}(\underline{x},\underline{s}),答案是
\underline{\Phi}(\underline{x},\underline{s}) = \sum_{j=1}^m \underline{\phi}(\underline{x},j,s_{j-1},s_j)
这里的\underline{\phi}(\underline{x},j,s_{j-1},s_j)和MEMMs定义的特征向量是一样的。以另一种方式来说,就是我们假设第k个全局特征是
\underline{\Phi_k}(\underline{x},\underline{s})= \sum_{j=1}^m\underline{\phi}(\underline{x},j,s_{j-1},s_j),所以\underline{\Phi_k}通过累加状态序列s_1\dots s_m的每个状态转移上的局部特征\underline{\phi_k}而得到的。

现在我们来解决CRFs的两个关键问题,第一个是解码,第二个是参数估计。

解码CRFs CRFs的解码问题如下:给定一个输入序列\underline{x}=x_1,x_2\dots x_m,我们要找到模型下最可能的状态序列,也就是,
\arg\,\max_{s\in\mathcal{S}^m} p(\underline{s}|\underline{x};\underline{\omega})

我们可以将表达式向如下这么简化
\begin{aligned} \arg\,\max_{s\in\mathcal{S}^m}p(\underline{s}|\underline{x};\underline{\omega})&= \arg\,\max_{\underline{s}\in\mathcal{S}^m} \cfrac{exp(\underline{\omega}\cdot\underline{\Phi}(\underline{x},\underline{s}))} {\sum_{s\prime\in\mathcal{S}} exp(\underline{\omega}\cdot\underline{\Phi}(\underline{x},\underline{s\prime})} \\ &=\arg\,\max_{\underline{s}\in\mathcal{S}^m} exp(\underline{\omega}\cdot\underline{\Phi}(\underline{x},\underline{s}))\\ &=\arg\,\max_{\underline{s}\in\mathcal{S}^m}\underline{\omega}\cdot\underline{\Phi}(\underline{x},\underline{s})\\ &=\arg\,\max_{\underline{s}\in\mathcal{S}^m}\underline{\omega}\cdot\sum_{j=1}^m\underline{\phi}(\underline{x},j,s_{j-1},s_j)\\ &=\arg\,\max_{\underline{s}\in\mathcal{S}^m}\sum_{j=1}^m\underline{\omega}\cdot \underline{\phi}(\underline{x},j,s_{j-1},s_j) \end{aligned}

所以在模型下寻找最有可能的序列等价于寻找满足
\arg\,\max_{\underline{s}\in\mathcal{S}^m}\sum_{j=1}^m\underline{\omega}\cdot \underline{\phi}(\underline{x},j,s_{j-1},s_j)
的序列。这个问题有个直观的解释,每个从状态s_{j-1}s_j的转移有一个分数
\underline{\omega}\cdot \underline{\phi}(\underline{x},j,s_{j-1},s_j)
这个分数可以是真的也可以是负的。直觉的,如果状态转移很有可能则分数相对较高。解码问题就是找到使转移分数之和最高的那个状态序列。

我们可以使用一个维特比算法来解决这个问题。

  • 初始化,对所有s\in\mathcal{S}
    \pi[1,s]=\underline{\omega}\cdot\underline{\phi}(x,1,s_0,s)
    这里s_0是一个特殊的初始状态。
  • j=2\dots m,所有s\in\mathcal{S}:
    \pi[j,s]=\max_{s\prime\in\mathcal{S}}\big( \pi[j-1,s\prime]+\underline{\omega}\cdot\underline{\phi}(\underline{x},j,s\prime,s)\big)

最后我们可以得到
\max_{\underline{s}\in\mathcal{S}^m}\sum_{j=1}^m\underline{\omega}\cdot \underline{\phi}(\underline{x},j,s_{j-1},s_j)=\max_s\pi[m,s]
然后利用回指,我们可以得到最高分的状态序列,这个算法具有O(mk^2)时间复杂度,所以解码算法是很高效的。

估计CRFs的参数。假设我们有一个打好标签的样本集\{(\underline{x}^i,\underline{s}^i)\}_{i=1}^n,每个\underline{x}^i是一个输入序列x_1^i\dots x_m^i,每个\underline{s}^i是一个状态序列s_1^i\dots s_m^i
。我们可以用对数线性空间参数估计一样的方法来估计CRFs的参数。正则化的对数似然函数是
\mathcal{L}(\underline{\omega})=\sum_{i=1}^n\log p(\underline{s}^i|\underline{x}^i,\underline{\omega})-\cfrac{\lambda}{2}||\omega||^2

CRFs的参数估计就是
\underline{\omega}^*=\arg\,\max_{\underline{\omega}\in\mathbb{R}^d}\sum_{i=1}^n\log p(\underline{s}^i|\underline{x}^i,\underline{\omega})-\cfrac{\lambda}{2}||\omega||^2

我们使用基于梯度的最优化方式求解\underline{\omega}^*,偏导数是
\cfrac{\partial}{\partial\omega_k}\mathcal{L}(\underline{\omega})=\sum_i \Phi_k(\underline{x}^i,\underline{s}^i)-\sum_i\sum_{\underline{s}\in\mathcal{S}^m}p(\underline{s}|\underline{x}^i;\underline{\omega})\Phi_k(\underline{x}^i,\underline{s})-\lambda\omega_k
第一项是很容易计算的,因为
\sum_i \Phi_k(\underline{x}^i,\underline{s}^i)= \sum_i\sum_{j=1}^m \phi_k(\underline{x}^i,j,s_{j-1},s_j^i)只需要对所有训练样本集i=1\dots n,对每个样本所有位置j=1\dots m求和即可。
第二项就复杂多了,需要对巨大的集合\mathcal{S}^m求和,但是注意观察,这里可以使用动态规划的方法有效的计算。
\begin{aligned} \sum_{\underline{s}\in\mathcal{S}^m}p(\underline{s}|\underline{x}^i;\underline{\omega})\Phi_k(\underline{x}^i,\underline{s})&=\sum_{\underline{s}\in\mathcal{S}^m}p(\underline{s}|\underline{x}^i)\sum_{j=1}^m\phi_k(\underline{x}^i,j,s_{j-1},s_j)\\ &=\sum_{j=1}^m\sum_{\underline{s}\in\mathcal{S}^m} p(\underline{s}|\underline{x}^i;\underline{\omega})\phi_k(\underline{x}^i,j,s_{j-1},s_j)\\ &=\sum_{j=1}^m\sum_{a\in\mathcal{S},b\in\mathcal{S}}\sum_{\underline{s}\in\mathcal{S}^m,s_{j-1}=a,s_j=b}p(\underline{s}|\underline{x}^i;\underline{\omega}) \phi_k(\underline{x}^i,j,s_{j-1},s_j) \\ &=\sum_{j=1}^m\sum_{a\in\mathcal{S},b\in\mathcal{S}}\phi_k(\underline{x}^i,j,s_{j-1},s_j)\sum_{\underline{s}\in\mathcal{S}^m,s_{j-1}=a,s_j=b}p(\underline{s}|\underline{x}^i;\underline{\omega}) \\ &=\sum_{j=1}^m\sum_{a\in\mathcal{S},b\in\mathcal{S}}q_j^i(a,b)\phi_k(\underline{x}^i,j,a,b) \end{aligned}
其中q_j^i(a,b)=\sum_{\underline{s}\in\mathcal{S}^m\\s_{j-1}=a,s_j=b}p(\underline{s}|\underline{x}^i;\underline{\omega})如果能有效的计算q_j^i(a,b),也就可以有效的计算这个偏导数,q_j^i(a,b)有个直观的解释,它是第i个训练样本位置j-1具有状态a和位置j具有状态b的概率。

一个关键的结论是对于给定的i,所有q_j^i(a,b)项可以一起计算,具有时间复杂度O(mk^2)。这是另一个动态规划问题,也可以使用维特比算法求解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 主要内容 自然语言输入编码 前馈网络 卷积网络 循环网络(recurrent networks ) 递归网络(re...
    JackHorse阅读 9,853评论 0 2
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 14,817评论 2 64
  • 机器学习术语表 本术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义。 A A/B 测试 (...
    yalesaleng阅读 6,240评论 0 11
  • 9. 循环神经网络 场景描述 循环神经网络(Recurrent Neural Network)是一种主流的深度学习...
    _龙雀阅读 7,949评论 0 3
  • 五、Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,...
    dma_master阅读 5,803评论 1 2

友情链接更多精彩内容