概述

背景

在实际的序列学习场景中经常会遇到从没有切分的,带有噪音的数据中对序列的label进行预测,例如语音识别中需要将声学信号转换成words或者是 sub-words.
文章提出了一种新的rnn训练方法,可以将没有切分的序列生成相应的标签。

传统方法的问题

传统方法中常用的HMM,CRF等有一些可以较好的解决这种序列标注问题,但是它们也存在相应的问题:
1. 通常需要大量的领域相关知识,例如定义相关的label,选择crf的输入特征等等。
2. 需要基于一定的相关性假设,例如HMM中观察序列之间是相互独立的。
3. 对HMM 来说训练是产生式的,即使序列标注问题是一个判别问题。

RNN的优势

  1. 不需要任何关于数据的先验知识,除了选择定义输入和输出的格式。
  2. 具有强大的特征表达能力,能够很好的对问题进行建模,并且可以表示判别式模型。
  3. 对于噪音问题处理的更加鲁棒。
  4. 可以利用long-range seququence 建模。

效果

效果优于hmm和hmm-rnn模型。

具体思路

将网络的输出表示为所有可能的label序列的概率分布,有了这个概率分布可以定义目标函数为直接最大化正确的label序列的概率。
因为目标函数可导,所以可以用标准的bp方法进行训练。

Temporal Classification

记号

S <script type="math/tex" id="MathJax-Element-1">S</script>表示从一个分布DX×Z<script type="math/tex" id="MathJax-Element-2">D_{X \times Z}</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>维的实数向量。
目标空间 Z=L<script type="math/tex" id="MathJax-Element-5">Z = L ^* </script> 是所有的Label(有限的)组成的序列空间。
我们称 L <script type="math/tex" id="MathJax-Element-6">L^*</script>中的元素为label sequences 或labellings。

任意的一个样本 sS,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. h:X>Z<script type="math/tex" id="MathJax-Element-12">h: X -> Z</script>

Label Error Rate

度量错误

给定一个测试集 SDX×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)为S<script type="math/tex" id="MathJax-Element-15">S ^ \prime</script>数据集上的标准化的 分类结果和目标之间的编辑距离。

LER(h,S)=1|S|(x,z)SED(h(x),z)|z|
<script type="math/tex; mode=display" id="MathJax-Element-16">\begin{equation} LER(h,S^\prime) = {1 \over {|S ^ \prime|}} \sum _{(x, z) \in S ^ \prime} { {ED(h(x),z)} \over {|z|} } \label{eq:defLER} \end{equation}</script>

其中 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>个输入,n<script type="math/tex" id="MathJax-Element-23">n</script>个输出( n=|L|+1 <script type="math/tex" id="MathJax-Element-24">n = |L| + 1</script>)和权重向量 w <script type="math/tex" id="MathJax-Element-25">w</script> as a continuous map :
Nw(Rm)T>(Rn)T<script type="math/tex" id="MathJax-Element-26">N_w : (R^m) ^ T -> (R^n) ^ T</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>个单元的在时间t<script type="math/tex" id="MathJax-Element-30">t</script>时的激活值
即label k <script type="math/tex" id="MathJax-Element-31">k</script>在时间t<script type="math/tex" id="MathJax-Element-32">t</script>概率,则有长度 T <script type="math/tex" id="MathJax-Element-33">T</script>的序列关于L=L{blank}<script type="math/tex" id="MathJax-Element-34">L ^ \prime = L \bigcup \{blank\}</script>概率为:

p(π|X)=t=1Tytπt,πLT
<script type="math/tex; mode=display" id="MathJax-Element-35">\begin{equation} p(\pi | X) = \prod _ {t = 1} ^ T y_{\pi _t} ^ t, \forall \pi \in {L ^ \prime } ^ T \label{eq:ctcSeqProb} \end{equation}</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>是可能的标签
具体步骤:
将所有的空格和重复的标签从路径中移除,例如
β(aab)=β(aaabb)=aa <script type="math/tex" id="MathJax-Element-38">\beta (a-ab-)= \beta (-aa--abb) = aa</script>,其中-代表空格

计算关于 lL<=T <script type="math/tex" id="MathJax-Element-39">l \in L^ {<= T}</script>的条件概率

p(l|x)=πβ1(l)p(π|x)
<script type="math/tex; mode=display" id="MathJax-Element-40">\begin{equation} p(l|x) = \sum _ {\pi \in \beta ^ {-1}(l)} p (\pi | x) \label{eq:binverseprob} \end{equation}</script>

构建分类器

有了以上的计算方法,分类器的输出应该是对输入生成的标注可能性最大的一个序列。

h(x)=argmaxlLTp(l|x)
<script type="math/tex; mode=display" id="MathJax-Element-41">\begin{equation} h(x) = arg max _ {l \in L ^{\leq T}} p(l | x) \label{eq:targetFunction} \end{equation}</script>
此过程可以借鉴传统的叫法decoding,但是目前还没有一个通用的,tractable的解码算法。
目前常用以下两种 近似的方法 来做解码:

第一种解码方法(Best Path Decoding)

思路:假设最可能的路径( π <script type="math/tex" id="MathJax-Element-42">\pi</script>)往往和最可能的labeling相关:

h(x)β(π)
<script type="math/tex; mode=display" id="MathJax-Element-43">\begin{equation} h(x) \approx \beta (\pi ^ *) \label{eq:decodeMethod1} \end{equation}</script>

其中: π=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>,长度为r<script type="math/tex" id="MathJax-Element-114">r</script>,记为 q1:p <script type="math/tex" id="MathJax-Element-115">q_{1:p}</script> 和 qrp,r <script type="math/tex" id="MathJax-Element-116">q_{r-p, r}</script>作为它的最前和最后的 p <script type="math/tex" id="MathJax-Element-117">p</script>的标记。
对一个labeling序列 l<script type="math/tex" id="MathJax-Element-118">l</script>,定义前向变量 αt(s)=πNT:β(π1:t)=l1:stt=1ytπt <script type="math/tex" id="MathJax-Element-119"> \alpha _ t (s) = \sum _ {\pi \in N^T:\beta(\pi_{1:t})=l_{1:s}} \prod _ {t ^\prime = 1} ^ t y _ {\pi _ {t ^ \prime}} ^ {t ^ \prime} </script>
(前s个label由前t个观察序列生成的概率)
对序列在处理一下对序列 l <script type="math/tex" id="MathJax-Element-120">l</script>前后及中间增加一个blank,则l>l,2|l|+1<script type="math/tex" id="MathJax-Element-121">l-> l^\prime,长度为2|l|+1</script>
(此时应该 s<|l|2(Tt)1 <script type="math/tex" id="MathJax-Element-122">s< |l^\prime| - 2(T-t)-1</script>)
则有以下等式成立

α1(1)=y1bα1(2)=y1l1α1(s)=0,s>2
<script type="math/tex; mode=display" id="MathJax-Element-123"> \alpha_ 1 (1) = y_b ^ 1 \\\\ \alpha_ 1 (2) = y_{l _ 1} ^ 1 \\\\ \alpha_ 1 (s) = 0, { \forall s > 2 } \\\\ </script>
并且有递归形式如下:
\begin{equation}
\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}
<script type="math/tex; mode=display" id="MathJax-Element-124">\begin{equation} \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}</script>
其中 ytk <script type="math/tex" id="MathJax-Element-125">y_k ^ t</script>是第 k <script type="math/tex" id="MathJax-Element-126">k</script>个单元的在时间t<script type="math/tex" id="MathJax-Element-127">t</script>时的激活值
即label k <script type="math/tex" id="MathJax-Element-128">k</script>在时间t<script type="math/tex" id="MathJax-Element-129">t</script>概率,则有长度 T <script type="math/tex" id="MathJax-Element-130">T</script>的序列关于L=L{blank}<script type="math/tex" id="MathJax-Element-131">L ^ \prime = L \bigcup \{blank\}</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( αt1(s) <script type="math/tex" id="MathJax-Element-67">\alpha _{t - 1} (s)</script>)或者前一个状态是状态序列中的前一个状态 αt1(s1) <script type="math/tex" id="MathJax-Element-68">\alpha _{t - 1} (s - 1)</script>转移而来
2. 当前状态和两步前的状态相同
则当前状态可以由前一个状态是blank( αt1(s) <script type="math/tex" id="MathJax-Element-69">\alpha _{t - 1} (s)</script>)和前一个状态跟两步前相同的状态 αt1(s1) <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>的概率由l<script type="math/tex" id="MathJax-Element-72">l ^ \prime</script>最后是空格和最后不是空格求和而来。

p(l|x)=αT(|l|)+αT(|l|1)
<script type="math/tex; mode=display" id="MathJax-Element-73">\begin{equation} p(l|x) = \alpha_T(|l ^\prime|) + \alpha_T(|l ^\prime| - 1) \label{eq:forwardfullProbability} \end{equation}</script>

类似可以有后向变量 βt(s) <script type="math/tex" id="MathJax-Element-74">\beta _ t (s)</script>

βt(s)=πNT:B(πt:T)=ls:|l|tTytπt
<script type="math/tex; mode=display" id="MathJax-Element-75">\begin{equation} \beta_t(s) = \sum _ {\pi \in N^T: B(\pi_{t:T})=l_{s:|l|} } \prod _{t ^ \prime } ^ T y _{\pi _ {t ^ \prime}} ^ {t ^ \prime} \label{eq:backVariable} \end{equation}</script>

其中

βT(|l|)=yTbβT(|l|1)=yTl|l|βT(s)=0,s<|l|1
<script type="math/tex; mode=display" id="MathJax-Element-76">\beta_ T(|l ^ \prime |) = y_ b ^ T \\\\ \beta_ T (|l ^ \prime | - 1) = y_ {l_ {|l|}} ^ T \\\\ \beta_ T (s) = 0,\forall s < | l ^ \prime| - 1</script>

βt(s)=β¯t(s)ytls,(β¯t(s)+βt+1(s+2))ytls,if ls=b or ls+2=lsotherwise
<script type="math/tex; mode=display" id="MathJax-Element-77">\begin{equation} \beta_ t(s) = \begin{cases} {\overline \beta}_ t(s) y_ {l_s ^\prime} ^ t ,& \text{if $l^\prime_ s = b$ or $l ^ \prime_ {s + 2} = l_ s ^ \prime $} \\\\ (\overline \beta_ t (s) + \beta_ {t + 1} (s + 2)) y_ {l_s ^ \prime} ^ t, & \text {otherwise} \end{cases} \label{eq:recurrBackward} \end{equation}</script>

并且有

β¯t=βt+1(s)+βt+1(s+1)
<script type="math/tex; mode=display" id="MathJax-Element-78">\begin{equation} \overline \beta_ t = \beta_ {t + 1}(s) + \beta_ {t + 1}(s + 1) \label{eq:backFullProb} \end{equation}</script>
and βt(s)=0s>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>

上述的前后向算法会导致下溢,我们的处理方式是定义如下公式

Ct=sαt(s),α^t(s)=αt(s)Ct
<script type="math/tex; mode=display" id="MathJax-Element-81">C_t = \sum_ s \alpha_t (s),\hat \alpha_t(s) = {\alpha_t (s) \over C_t}</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>

类似定义后向的计算方式如下:

Dt=sβt(s),β^t(s)=βt(s)Dt
<script type="math/tex; mode=display" id="MathJax-Element-85">D_t = \sum_ s \beta_t (s),\hat \beta_t(s) = {\beta_t (s) \over D_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 如下式:

ln(p(l|x))=t=1Tln(Ct)
<script type="math/tex; mode=display" id="MathJax-Element-89">ln(p(l|x)) = \sum _ {t = 1} ^ T ln(C_t)</script>

参考文献

minimum edit distance
Temporal classification Extending the classification paradigm to multivariate time series
Supervised Sequence Labelling with Recurrent Neural Networks 第7章

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐