欢迎光临 x-algo
关注算法在工业界应用
Hi, 这是一个关注大数据算法在工业界应用的网站

deep learning 中文分词介绍

介绍论文《Deep Learning for Chinese Word Segmentation and POS tagging》中的方法。

网络结构

网络中将中心词左右窗口向量作为输入,词向量第一次随机初始化,每次迭代通过反向传播更新。

但是不只是词可以作为输入,也可以加入一些规则类特征作为输入,例如这个字是不是姓氏开头;还可以是将一些统计值作为特征,例如当前字的『边界熵』和『边界多样性』。 添加的新维度的特征都映射到一个向量上,类似一个『字』映射到一个向量,这样每一类特征都会有一个矩阵,矩阵大小满足: 矩阵的大小 = 特征取值种数 x 向量维度 。本文讨论的时候只是将字本身作为特征。

论文中的网络结构,如下图:

11C86038-7F3F-41D8-A993-51FB975B4B23

 

边界熵和边界多样性

边界熵(Boundary Entropy,BE)和边界多样性(Accessor Verity,AV)是衡量一个串是不是短语的指标。直观来看,在语料中,如果一个『字串』的左右的『字』种类繁多,就说明这个『字串』和可能是一个短语。

边界熵的定义可以表示为:

\(BE(w_1 w_2...w_k) = -\sum_{w \in D} P(w|w_1w_2...w_k)\ln{P(w|w_1w_2...w_k)}\)

边界多样性的定义可以表示为:

\(AV(w_1w_2...w_k) = \ln{LR_{av}{(w_1w_2...w_k)}}\)

其中 \(LR_{av}{(w_1w_2...w_k)}\) 表示『字串』 \(w_1w_2...w_k\) 左右所有可能临近的字的种数。

计算标签得分

多层的神经网络可以看做是多个函数的嵌套映射, \(L\) 层的神经网络可以定义成下面的函数:

\(f^{l}_{\theta}(\cdot)=f^{L}_{\theta}(f^{L-1}_{\theta}(...f^{1}_{\theta}(\cdot )...))\)

\(c_{[1:n]}\) 表示一个句子, \(c_i\) 表示句子中的第i个字,针对我们的网络结构,可以将网络函数表示为:

\(f_{\theta}(c_i)=f^3_{\theta}(g(f^{2}_{\theta}(f^1_{\theta}(c_i)))\)

每一层的参数维度信息为 \(W^2\in R^{H \times |wd|},b^2 \in R^H ,W^3 \in R^{|T| \times H} , b^3 \in R^{|T|}\)

sigmoida函数为:

\(g(x)=\frac{1}{1 + e^{-x}}\)

通过多层的嵌套计算,最后 \(f_{\theta}(c_i)\) 会计算出来对当前词属于每一个的标注的得分(标注集合为:SBIE),用 \(f_{\theta}(t|c_i)\) 表示标注为t的得分。

预测标注

类似HHM(隐马)的预测过程,通过Viterbi算法进行预测。HMM过程中需要两个矩阵,一个状态转移矩阵 \(A_{i,j}\) 和发射矩阵,但是这里的发射矩阵方向是从字到状态,就是上面通过神经网络计算出来的得分 \(f_{\theta}(t|c_i)\)

自然的,可以将句子标注序列为 \(t_{[1:n]}\) 的得分表示为:

\(s(c_{[1:n]},t_{[1:n]}, \theta)=\sum_{i=1}^{n}{(A_{t_{i-1} , t_i} + f_{\theta}(t_i|c_i))}\)

我们的目标就是求最优标注序列 \(t_{[1:n]}^{*}\) ,使得上式得分最高。

训练

训练过程中要学的参数比较多, \(\theta=(M,W^2,b^2, W^3,b^3,A)\) ,其中M的初始值可以通过word2vec训练的结果初始化,A可以通过类似HMM有监督学习的方式通过极大似然预估出来一个初始值。

通过极大似然的方式求参数:

\(\theta \mapsto \sum_{\forall(c,t) \in R }{\log(p(t|c,\theta))}\)

一般上式通过迭代的方式求参数 \(\theta\)

\(\theta = \theta + \lambda \frac{\partial log(p(t|c,\theta))}{\partial \theta}\)

上面的概率 \(p(t|c,\theta)\) 可以用得分表示为:

\(p(t|c,\theta) =\frac{exp(s(c,t,\theta))}{\sum_{t'}exp({s(c,t',\theta))}}\)

 对上面式子求极大似然的成本非常高,因为分母部分是|T|的指数量级,通过Viterbi算法可以将分母的计算降低为|T|*|c| ,接下来论文中提出了一种更高效的方法。

改进的训练方法

上文中 \(g(x)\) 函数、 \(f^2,f^3\) 都是关于参数的单调递增函数,所以如果某个参数增加就会导致最后的得分增加,一定要理解这一点,对后面迭代更新理解很重要。

具体的,根据上面的算分公式,也就是和 \(A_{i,j}\) 的取值正相关,和 \(f_{\theta}(\cdot)\) 的取值正相关。

站在梯度的角度,下一次迭代参数值是增加还是减小是通过梯度的正负决定的,所以一种很直观的想法就是通过类似投票的方法,如果在当样本预估值和实际真是值相比一致的情况下就将梯度值+1,否则-1,最后根据梯度的取值更新参数值。

形式化描述可以描述为:

如果 \(t_i \neq t_i^{'}\)

\(\frac{\partial L_{\theta}{(t,t'|c)}}{\partial{f_{\theta}{(t_i|i)}}}++,\frac{\partial L_{\theta}{(t,t'|c)}}{\partial{f_{\theta}{(t_i^{'}|i)}}}--\)

如果 \(t_{i-1} \neq t_{i-1}^{'}\) 或者 \(t_i \neq t_i^{'}\) :

\(\frac{\partial L_{\theta}{(t,t'|c)}}{\partial{A_{t_{i-1},t_i}}}++,\frac{\partial L_{\theta}{(t,t'|c)}}{\partial{A_{t_{i-1}^{'},t_i^{'}}}}--\)

具体的训练过程可以描述为:

8328E1AD-EBF7-4F04-B3DA-AEE1C7342F7A

参考文献

Deep Learning for Chinese Word Segmentation and POS tagging

http://blog.csdn.net/itplus/article/details/17122431

未经允许不得转载:大数据算法 » deep learning 中文分词介绍

评论 2

*

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    请问一下,有demo实现吗

    陈军2年前 (2016-10-26)回复
    • 木有。。

      leihao2年前 (2016-10-27)回复

关注大数据算法在工业界应用

本站的GitHub关于本站