Labelling Unsegmented Sequence Data with Recurrent Neural Networks(笔记)
概述背景在实际的序列学习场景中经常会遇到从没有切分的,带有噪音的数据中对序列的label进行预测,例如语音识别中需要将声学信号转换成words或者是 sub-words.文章提出了一种新的rnn训练方法,可以将没有切分的序列生成相应的标签。传统方法的问题传统方法中常用的HMM,CRF等有一些可以较好的解决这种序列标注问题,但是它们也存在相应的问题:1. 通常需要大量的领域相关知识,例如定义相
概述
背景
在实际的序列学习场景中经常会遇到从没有切分的,带有噪音的数据中对序列的label进行预测,例如语音识别中需要将声学信号转换成words或者是 sub-words.
文章提出了一种新的rnn训练方法,可以将没有切分的序列生成相应的标签。
传统方法的问题
传统方法中常用的HMM,CRF等有一些可以较好的解决这种序列标注问题,但是它们也存在相应的问题:
1. 通常需要大量的领域相关知识,例如定义相关的label,选择crf的输入特征等等。
2. 需要基于一定的相关性假设,例如HMM中观察序列之间是相互独立的。
3. 对HMM 来说训练是产生式的,即使序列标注问题是一个判别问题。
RNN的优势
- 不需要任何关于数据的先验知识,除了选择定义输入和输出的格式。
- 具有强大的特征表达能力,能够很好的对问题进行建模,并且可以表示判别式模型。
- 对于噪音问题处理的更加鲁棒。
- 可以利用long-range seququence 建模。
效果
效果优于hmm和hmm-rnn模型。
具体思路
将网络的输出表示为所有可能的label序列的概率分布,有了这个概率分布可以定义目标函数为直接最大化正确的label序列的概率。
因为目标函数可导,所以可以用标准的bp方法进行训练。
Temporal Classification
记号
S <script type="math/tex" id="MathJax-Element-1">S</script>表示从一个分布
输入空间 X=(Rm)∗ <script type="math/tex" id="MathJax-Element-3">X = (R^m)^*</script> 是所有的 m <script type="math/tex" id="MathJax-Element-4">m</script>维的实数向量。
目标空间
我们称 L∗ <script type="math/tex" id="MathJax-Element-6">L^*</script>中的元素为label sequences 或labellings。
任意的一个样本 s∈S,s=(x,z) <script type="math/tex" id="MathJax-Element-7">s \in S,s= (x,z)</script>,
目标序列 z=(z1,z2,...,zU) <script type="math/tex" id="MathJax-Element-8">z = (z_1, z_2, ..., z_U)</script>,
输入序列 x=(x1,x2,...,xT) <script type="math/tex" id="MathJax-Element-9">x = (x_1, x_2,...,x_T)</script>
其中 U<=T <script type="math/tex" id="MathJax-Element-10">U <= T</script>
目标是用 S <script type="math/tex" id="MathJax-Element-11">S</script>来训练一个temporal classifier s.t.
Label Error Rate
度量错误
给定一个测试集 S′⊂DX×Z <script type="math/tex" id="MathJax-Element-13">S^\prime \subset D_{X \times Z}</script>
定义 h <script type="math/tex" id="MathJax-Element-14">h</script>的标签错误率(LER = Label Error Rate)为
其中 ED(p,q) <script type="math/tex" id="MathJax-Element-17">ED(p,q)</script>是sequence p,q <script type="math/tex" id="MathJax-Element-18">p,q</script>之间的编辑距离。(插入,替换和删除)
Connectionist Temporal Classification
介绍了如何表示RNN的输出可以用来做CTC,最直接的想法是将RNN的输出表示为一个给定的输入的关于Label sequences的条件概率分布
网络输出到标签序列
CTC网络有一个softmax输出层,
输出层有 |L|+1 <script type="math/tex" id="MathJax-Element-19">|L| + 1</script>个输出单元,
其中 |L| <script type="math/tex" id="MathJax-Element-20">|L|</script>指的是label的个数,
1代表空格或其他非label的输出。
具体形式
首先定义初步的映射关系
输入序列 X,|X|=T <script type="math/tex" id="MathJax-Element-21">X,|X| = T</script>
RNN m <script type="math/tex" id="MathJax-Element-22">m</script>个输入,
定义 y=Nw(x) <script type="math/tex" id="MathJax-Element-27">y = N_w(x)</script>是神经网络从输出,并且 ytk <script type="math/tex" id="MathJax-Element-28">y_k ^ t</script>是第 k <script type="math/tex" id="MathJax-Element-29">k</script>个单元的在时间
即label k <script type="math/tex" id="MathJax-Element-31">k</script>在时间
定义一个多对一的映射
映射形式如下:
β:(L′)T−>L<=T <script type="math/tex" id="MathJax-Element-36">\beta : (L ^ \prime )^T -> L ^{<=T}</script>, L<=T <script type="math/tex" id="MathJax-Element-37">L^{<= T}</script>是可能的标签
具体步骤:
将所有的空格和重复的标签从路径中移除,例如
β(a−ab−)=β(−aa−−abb)=aa <script type="math/tex" id="MathJax-Element-38">\beta (a-ab-)= \beta (-aa--abb) = aa</script>,其中-代表空格
计算关于 l∈L<=T <script type="math/tex" id="MathJax-Element-39">l \in L^ {<= T}</script>的条件概率
构建分类器
有了以上的计算方法,分类器的输出应该是对输入生成的标注可能性最大的一个序列。
此过程可以借鉴传统的叫法decoding,但是目前还没有一个通用的,tractable的解码算法。
目前常用以下两种 近似的方法 来做解码:
第一种解码方法(Best Path Decoding)
思路:假设最可能的路径( π <script type="math/tex" id="MathJax-Element-42">\pi</script>)往往和最可能的labeling相关:
其中: π∗=argmaxπ∈Ntp(π|x) <script type="math/tex" id="MathJax-Element-44">\pi ^* = arg max _ {\pi \in N^t} p (\pi | x)</script>
此方法简单易于实现,而且找到的是在各个时间点的激活值最大的值,但是不能保证找到的是最有可能的label序列。
第二种解码方法(Prefix Search Decoding)
类似于前后向算法基础上进行,具体见第四章(下一章训练网络部分)
这种方法只要时间足够往往可以找到最优的结果,但是解码时间跟序列长度成指数增长。
通常使用启发式的解码方法。
启发式的思路如下:
首先根据输出中预测是blank的节点进行切分,然后分段进行prefix 查找。
缺陷
通常情况下启发式的方法工作的很好,并且能够找到最优的路径,但是在一些情况下会出错,例如在一个分割点的两端两者的预测label都相同,而且概率较小。
训练网络
CTC前后向算法
我们需要一个高效的方式来计算 p(l|x) <script type="math/tex" id="MathJax-Element-111">p(l|x)</script>,但是参考公式 ??? <script type="math/tex" id="MathJax-Element-112">\ref{eq:binverseprob}</script> 会发现这是一个难以计算的任务。
本文引入了动态规划的方法,类似于hmm中的前后向算法,如下:
一个序列 q <script type="math/tex" id="MathJax-Element-113">q</script>,长度为
对一个labeling序列
(前s个label由前t个观察序列生成的概率)
对序列在处理一下对序列 l <script type="math/tex" id="MathJax-Element-120">l</script>前后及中间增加一个blank,则
(此时应该 s<|l′|−2(T−t)−1 <script type="math/tex" id="MathJax-Element-122">s< |l^\prime| - 2(T-t)-1</script>)
则有以下等式成立
并且有递归形式如下:
\alpha_t(s) =
\begin{cases}
(\alpha_{t-1}(s) + \alpha_{t - 1}(s - 1))y_{l_s ^ \prime} ^ t, & \text {$if \space l ^ \prime _ s = b \space or \space l ^ \prime _ {s - 2} = l _ s ^ \prime$} \\\\
(\alpha_{t-1}(s) + \alpha_{t - 1}(s - 1) + \alpha _ {t - 1} (s - 2)) y_{l_s ^ \prime} ^ t, & \text {otherwise}
\end{cases}
\label{eq:recurrForward}
\end{equation}
其中 ytk <script type="math/tex" id="MathJax-Element-125">y_k ^ t</script>是第 k <script type="math/tex" id="MathJax-Element-126">k</script>个单元的在时间
即label k <script type="math/tex" id="MathJax-Element-128">k</script>在时间
解释
状态序列 b,l1,b,l2,b,l3,...,b,lk,b <script type="math/tex" id="MathJax-Element-66">b,l_1,b,l_2,b,l_3,...,b,l_k,b</script>
1. 当前状态为blank
则当前状态可以由 前一个状态是blank( αt−1(s) <script type="math/tex" id="MathJax-Element-67">\alpha _{t - 1} (s)</script>)或者前一个状态是状态序列中的前一个状态 αt−1(s−1) <script type="math/tex" id="MathJax-Element-68">\alpha _{t - 1} (s - 1)</script>转移而来
2. 当前状态和两步前的状态相同
则当前状态可以由前一个状态是blank( αt−1(s) <script type="math/tex" id="MathJax-Element-69">\alpha _{t - 1} (s)</script>)和前一个状态跟两步前相同的状态 αt−1(s−1) <script type="math/tex" id="MathJax-Element-70">\alpha _{t - 1} (s - 1)</script>转移而来
3. 其余的情况有三条转移途径
当前状态不为空,而且前两步的状态和当前状态不同
1. 两步前状态不为空
则当前状态可以由中间状态为两步前状态,空或当前状态三条路径转移而来。
2. 两步前状态为空
则当前状态可以由中间状态为空,中间状态为状态序列中两步前状态和中间状态为当前状态转移而来。
示意图如下:
从而有整条序列 l <script type="math/tex" id="MathJax-Element-71">l</script>的概率由
类似可以有后向变量 βt(s) <script type="math/tex" id="MathJax-Element-74">\beta _ t (s)</script>
其中
并且有
and βt(s)=0∀s>2t <script type="math/tex" id="MathJax-Element-79">\beta_ t (s) = 0 \forall s > 2t</script> and ∀s>|l′| <script type="math/tex" id="MathJax-Element-80">\forall s > |l ^ \prime|</script>
上述的前后向算法会导致下溢,我们的处理方式是定义如下公式
替换( ??? <script type="math/tex" id="MathJax-Element-82">\ref{eq:recurrForward}</script>),( ??? <script type="math/tex" id="MathJax-Element-83">\ref{eq:forwardfullProbability}</script>)式中的 αt <script type="math/tex" id="MathJax-Element-84">\alpha_t</script>
类似定义后向的计算方式如下:
替换( ??? <script type="math/tex" id="MathJax-Element-86">\ref{eq:recurrBackward}</script>),( ??? <script type="math/tex" id="MathJax-Element-87">\ref{eq:backFullProb}</script>)式中的 βt <script type="math/tex" id="MathJax-Element-88">\beta_t</script>
要计算maximum likelihood error 如下式:
参考文献
minimum edit distance
Temporal classification Extending the classification paradigm to multivariate time series
Supervised Sequence Labelling with Recurrent Neural Networks 第7章
更多推荐
所有评论(0)