声学模型学习笔记(五) SDT(MMI/BMMI/MPE/sMBR)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xmdxcsj/article/details/52760111
DNN训练使用的CE准则是基于每一帧进行分类的优化,最小化帧错误率,但是实际上语音识别是一个序列分类的问题,更关心的是序列的准确性。所以引入SDT(sequence-discriminative training),训练准则更符合实际,有利于提升识别率。常用的准则包括MMI/BMMI、MPE、MBR等。

准则    目标函数
CE    帧错误率
MMI/BMMI    句子正确率
MPE    phone错误率
sMBR    状态错误率
MMI

MMI(maximum mutual information)准则最大化观察序列分布和word序列分布之间的互信息,减小句子错误率。 
假设观察序列om=om1,...,omTmom=o1m,...,oTmm,word序列wm=wm1,...,wmNmwm=w1m,...,wNmm,其中mm表示utterance,TmTm表示帧数,NmNm表示word个数。训练集为S={(om,wm)|0≤m≤M},S={(om,wm)|0≤m≤M},MMI准则可以表示如下: 
JMMI(θ;S)=∑m=1MJMMI(θ;om,wm)=∑m=1MlogP(wm|om;θ)
JMMI(θ;S)=∑m=1MJMMI(θ;om,wm)=∑m=1MlogP(wm|om;θ)

=∑m=1Mlogp(om|sm;θ)kP(wm)∑wp(om|sw;θ)kP(w)
=∑m=1Mlogp(om|sm;θ)kP(wm)∑wp(om|sw;θ)kP(w)

其中kk表示acoustic scale,θθ表示模型参数,smsm表示状态序列。物理意义可以理解为:分子表示准确结果对应路径的总得分(声学和语言),分母表示所有路径对应的得分总和(为了计算上的可操作性,实际用lattice简化表示)。模型参数的梯度可以表示如下: 
∇JMMI(θ;om,wm)=∑m∑t∇zLmtJMMI(θ;om,wm)∂zLmt∂θ=∑m∑te¨Lmt∂zLmt∂θ
∇JMMI(θ;om,wm)=∑m∑t∇zmtLJMMI(θ;om,wm)∂zmtL∂θ=∑m∑te¨mtL∂zmtL∂θ

其中zLmtzmtL表示softmax层的输入(没有做softmax运算),跟CE准则的不同体现在e¨Lmte¨mtL,进一步计算如下: 
e¨Lmt(i)=∇zLmt(i)JMMI(θ;om,wm)
e¨mtL(i)=∇zmtL(i)JMMI(θ;om,wm)

=∑r∂JMMI(θ;om,wm)∂logp(omt|r)∂logp(omt|r)∂zLmt(i)
=∑r∂JMMI(θ;om,wm)∂logp(otm|r)∂logp(otm|r)∂zmtL(i)
第一部分

∂JMMI(θ;om,wm)∂logp(omt|r)
∂JMMI(θ;om,wm)∂logp(otm|r)

=∂logp(om|sm)kP(wm)∑wp(om|sw)kP(w)∂logp(omt|r)
=∂logp(om|sm)kP(wm)∑wp(om|sw)kP(w)∂logp(otm|r)

=k∂logp(om|sm)∂logp(omt|r)−∂log∑wp(om|sw)kP(w)∂logp(omt|r)
=k∂logp(om|sm)∂logp(otm|r)−∂log∑wp(om|sw)kP(w)∂logp(otm|r)

考虑到p(om|sm)=p(om1|sm1)p(om2|sm2)...p(omTm|smTm)p(om|sm)=p(o1m|s1m)p(o2m|s2m)...p(oTmm|sTmm),所以上式第一项可以简化为: 
k∂p(om|sm)∂logp(omt|r)=k(δ(r=smt))k∂p(om|sm)∂logp(otm|r)=k(δ(r=stm)) 
第二项可以进一步求导: 
∂log∑wp(om|sw)kP(w)∂logp(omt|r)
∂log∑wp(om|sw)kP(w)∂logp(otm|r)

=∂log∑welogp(om|sw)kP(w)∂logp(omt|r)
=∂log∑welogp(om|sw)kP(w)∂logp(otm|r)

=1∑welogp(om|sw)kP(w)∂∑welogp(om|sw)kP(w)∂logp(omt|r)
=1∑welogp(om|sw)kP(w)∂∑welogp(om|sw)kP(w)∂logp(otm|r)

=1∑wp(om|sw)kP(w)∗∑welogp(om|sw)kP(w)∗∂logp(om|sw)kP(w)∂logp(omt|r)
=1∑wp(om|sw)kP(w)∗∑welogp(om|sw)kP(w)∗∂logp(om|sw)kP(w)∂logp(otm|r)

=1∑wp(om|sw)kP(w)∗∑wp(om|sw)kP(w)∗δ(smt=r)
=1∑wp(om|sw)kP(w)∗∑wp(om|sw)kP(w)∗δ(stm=r)

=∑w:st=rp(om|sw)kP(w)∑wp(om|sw)kP(w)
=∑w:st=rp(om|sw)kP(w)∑wp(om|sw)kP(w)

综合前面的第一项和第二项,可得: 
∂JMMI(θ;om,wm)∂logp(omt|r)=k(δ(r=smt)−∑w:st=rp(om|sm)kP(w)∑wp(om|sm)kP(w))
∂JMMI(θ;om,wm)∂logp(otm|r)=k(δ(r=stm)−∑w:st=rp(om|sm)kP(w)∑wp(om|sm)kP(w))
第二部分

考虑到p(x|y)∗p(y)=p(y|x)∗p(x)p(x|y)∗p(y)=p(y|x)∗p(x),第二部分可以表示如下: 
∂logp(omt|r)∂zLmt(i)
∂logp(otm|r)∂zmtL(i)

=∂logp(r|omt)−logp(r)+logp(omt)∂zLmt(i)
=∂logp(r|otm)−logp(r)+logp(otm)∂zmtL(i)

=∂logp(r|omt)∂zLmt(i)
=∂logp(r|otm)∂zmtL(i)

其中p(r|omt)p(r|otm)表示DNN的第r个输出, 
p(r|omt)=softmaxr(zLmt)=ezLmt(r)∑jezLmt(j)
p(r|otm)=softmaxr(zmtL)=ezmtL(r)∑jezmtL(j)

所以, 
∂logp(omt|r)∂zLmt(i)=δ(r=i)
∂logp(otm|r)∂zmtL(i)=δ(r=i)

按照文章的推导应该得到这个结果,但是实际上分母还包含zLmt(i)zmtL(i),是不是做了近似认为分母是常量,这一步有疑问????
综合上面两部分,可以得到最终的公式: 
e¨Lmt(i)=k(δ(i=smt)−∑w:st=ip(om|sm)kP(w)∑wp(om|sm)kP(w))
e¨mtL(i)=k(δ(i=stm)−∑w:st=ip(om|sm)kP(w)∑wp(om|sm)kP(w))
Boosted MMI

JBMMI(θ;S)=∑m=1MJBMMI(θ;om,wm)=∑m=1MlogP(wm|om)∑wP(w|om)e−bA(w,wm)
JBMMI(θ;S)=∑m=1MJBMMI(θ;om,wm)=∑m=1MlogP(wm|om)∑wP(w|om)e−bA(w,wm)

=∑m=1MlogP(om|wm)kP(wm)∑wP(om|wm)kP(w)e−bA(w,wm)
=∑m=1MlogP(om|wm)kP(wm)∑wP(om|wm)kP(w)e−bA(w,wm)

相比于MMI,BMMI在分母上面增加了一个权重系数e−bA(w,wm)e−bA(w,wm),一般b=0.5b=0.5,A(w,wm)A(w,wm)是ww和wmwm之间准确率的度量,可以是word/phoneme/state级别的准确率。 
物理意义: 
参考[3]给出的解释,We boost the likelihood of the sentences that have more errors, thus generating more confusable data. Boosted MMI can viewed as trying to enforce a soft margin that is proportional to the number of errors in a hypothesised sentence。 
结合参数理解,就是ww和wmwm越接近(错误的word越少),e−bA(w,wm)e−bA(w,wm)这个权重越小,相反,权重会越大,增加了数据的困惑度。 
通过可以推导出误差信号: 
e¨Lmt(i)=k(δ(i=smt)−∑w:st=ip(om|sw)kP(w)e−bA(w,wm)∑wp(om|sw)kP(w)e−bA(w,wm))
e¨mtL(i)=k(δ(i=stm)−∑w:st=ip(om|sw)kP(w)e−bA(w,wm)∑wp(om|sw)kP(w)e−bA(w,wm))
MPE/sMBR

MBR(minimum Bayes risk)的目标函数是最小化各种粒度指标的错误,比如MPE是最小化phone级别的错误,sMBR最小化状态的错误。目标函数如下: 
JMBR(θ;S)=∑m=1MJMBR(θ;om,wm)=∑m=1M∑wP(w|om)A(w,wm)
JMBR(θ;S)=∑m=1MJMBR(θ;om,wm)=∑m=1M∑wP(w|om)A(w,wm)

=∑m=1M∑wP(om|sw)kP(w)A(w,wm)∑w′P(om|sw′)kP(w′)
=∑m=1M∑wP(om|sw)kP(w)A(w,wm)∑w′P(om|sw′)kP(w′)

其中A(w,wm)A(w,wm)表示两个序列之间的差异,MPE就是正确的phone的个数,sMBR是指正确的state的个数。求导可得: 
e¨Lmt(i)=∇zLmt(i)JMBR(θ;om,wm)
e¨mtL(i)=∇zmtL(i)JMBR(θ;om,wm)

=∑r∂JMBR(θ;om,wm)∂logp(omt|r)∂logp(omt|r)∂zLmt(i)
=∑r∂JMBR(θ;om,wm)∂logp(otm|r)∂logp(otm|r)∂zmtL(i)
第一部分

对于MPE,参考文献[4]: 
首先将JMBR(θ;om,sm)JMBR(θ;om,sm)分子分母求和部分分为两块,r∈swr∈sw和r∉swr∉sw 
JMBR(θ;om,sm)=∑sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)
JMBR(θ;om,sm)=∑sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)

=∑s:r∈sP(om|s)kP(s)A(s,sm)+∑s:r∉sP(om|s)kP(s)A(s,sm)∑s′:r∈s′P(om|s′)kP(s′)+∑s′:r∉s′P(om|s′)kP(s′)
=∑s:r∈sP(om|s)kP(s)A(s,sm)+∑s:r∉sP(om|s)kP(s)A(s,sm)∑s′:r∈s′P(om|s′)kP(s′)+∑s′:r∉s′P(om|s′)kP(s′)

- 如果满足r∈sr∈s,那么导数满足以下关系: 
∂P(om|s)k∂logp(omt|r)=∂ek∗logP(om|s)∂logp(omt|r)=k∗P(om|s)k
∂P(om|s)k∂logp(otm|r)=∂ek∗logP(om|s)∂logp(otm|r)=k∗P(om|s)k

- 如果不满足r∈sr∈s,那么导数将为0: 
∂P(om|s)k∂logp(omt|r)=0
∂P(om|s)k∂logp(otm|r)=0
不难推出: 
∂JMBR(θ;om,sm)∂logp(omt|r)
∂JMBR(θ;om,sm)∂logp(otm|r)

=k∗∑s:r∈sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)−k∗∑sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)∗∑s:r∈sP(om|s)kP(s)∑s′P(om|s′)kP(s′)
=k∗∑s:r∈sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)−k∗∑sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)∗∑s:r∈sP(om|s)kP(s)∑s′P(om|s′)kP(s′)

上面的等式可以简化为以下形式: 
∂JMBR(θ;om,sm)∂logp(omt|r)=k∗γ¨DENmt(r)(A¯m(r=smt)−A¯m)
∂JMBR(θ;om,sm)∂logp(otm|r)=k∗γ¨mtDEN(r)(A¯m(r=stm)−A¯m)

各个部分的定义如下: 
γ¨DENmt(r)=∑s:r∈sP(om|s)kP(s)∑s′P(om|s′)kP(s′)
γ¨mtDEN(r)=∑s:r∈sP(om|s)kP(s)∑s′P(om|s′)kP(s′)

A¯m=∑sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)
A¯m=∑sP(om|s)kP(s)A(s,sm)∑s′P(om|s′)kP(s′)

A¯m(r=smt)=E(A(s,sm))=∑s:r∈sP(om|s)kP(s)A(s,sm)∑s′:r∈s′P(om|s′)kP(s′)
A¯m(r=stm)=E(A(s,sm))=∑s:r∈sP(om|s)kP(s)A(s,sm)∑s′:r∈s′P(om|s′)kP(s′)

第一项表示occupancy statistics 
第二项表示lattice中所有路径的平均准确率 
第三项表示lattice中所有经过r的路径的平均准确率,是A(s,sm)A(s,sm)的均值,可以将三个三项合并起来进行还原就很容易里面均值的含义。
第二部分

第二部分和MMI的一致

tricks

lattice generation

区分性训练时生成高质量的lattice很重要,需要使用最好的模型来生成对应的lattice,并且作为seed model。

lattice compensation

如果lattice产生的不合理的话,会导致计算出来的梯度异常,比如分子的标注路径没有在分母中的lattice出现,这种情况对于silience帧尤其常见,因为silience经常出现在分子的lattice,但是很容易被分母的lattice忽略。有一些方法可以解决这种问题: 
- fame rejection,直接删除这些帧 
- 根据reference hypothesis修正lattice,比如在lattice中人为地添加一下silience边

frame smoothing

SDT很容易出现overfitting,两方面原因 
- sparse lattice 
- sdt的squence相比于frame增加了建模的维度,导致训练集的后验概率分布更容易跟测试集出现差异

可以修改训练准则来减弱overfitting,通过结合squence criteria和frame criteria来实现: 
JFS−SEQ(θ;S)=(1−H)JCE(θ;S)+HJSEQ(θ;S)
JFS−SEQ(θ;S)=(1−H)JCE(θ;S)+HJSEQ(θ;S)

HH成为smoothing factor,经验值设为4/54/5到10/1110/11
learning rate

SDT的学习率相比于CE要下,因为 
- SDT的起点一般基于CE训练出来的model 
- SDT训练容易出现overfitting

criterion selection

sMBR效果相比其他会好一点,MMI比较容易理解和实现。

noise contrastIve estimation

NCE可以用于加速训练

参考

[1]《automatic speech recognition a deep learning approach》 chapter8 
[2]Sequence-discriminative training of deep neural networks 
[3]Boosted MMI for model and feature-space discriminative training 
[4]discriminative training for large vocabulary speech recognition {daniel povey的博士论文chapter6}
 ———————————————— 
版权声明:本文为CSDN博主「xmucas」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xmdxcsj/article/details/52760111

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java 示例代码,用于上传图片到海康威视的设备中: ```java import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.UUID; public class PictureUploadDemo { public static void main(String[] args) { String ip = "192.168.1.100"; // 设备的 IP 地址 String username = "admin"; // 登录用户名 String password = "123456"; // 登录密码 String picturePath = "C:\\pictures\\test.jpg"; // 待上传的图片路径 String requestUrl = "http://" + ip + "/ISAPI/SDT/pictureUpload"; // 图片上传接口地址 try { // 登录获取 cookie,用于后续请求的认证 String cookie = login(ip, username, password); // 上传图片 String result = uploadPicture(requestUrl, picturePath, cookie); System.out.println(result); } catch (IOException e) { e.printStackTrace(); } } /** * 登录设备,获取 cookie */ public static String login(String ip, String username, String password) throws IOException { String requestUrl = "http://" + ip + "/ISAPI/Security/userCheck"; HttpURLConnection conn = (HttpURLConnection) new URL(requestUrl).openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/xml"); // 构造登录请求的 XML 数据 String xmlData = String.format("<UserCheck><userName>%s</userName><password>%s</password></UserCheck>", username, password); // 发送登录请求 OutputStream out = conn.getOutputStream(); out.write(xmlData.getBytes()); out.flush(); out.close(); // 获取 cookie String cookie = conn.getHeaderField("Set-Cookie"); conn.disconnect(); return cookie; } /** * 上传图片 */ public static String uploadPicture(String requestUrl, String picturePath, String cookie) throws IOException { HttpURLConnection conn = (HttpURLConnection) new URL(requestUrl).openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + UUID.randomUUID().toString()); conn.setRequestProperty("Cookie", cookie); // 构造 multipart/form-data 请求体 OutputStream out = conn.getOutputStream(); PrintWriter writer = new PrintWriter(out); // 第一个部分,图片文件 File pictureFile = new File(picturePath); writer.printf("--%s\r\n", UUID.randomUUID().toString()); writer.printf("Content-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n", pictureFile.getName()); writer.printf("Content-Type: image/jpeg\r\n\r\n"); writer.flush(); InputStream pictureIn = PictureUploadDemo.class.getResourceAsStream(picturePath); byte[] buffer = new byte[1024]; int len; while ((len = pictureIn.read(buffer)) != -1) { out.write(buffer, 0, len); } pictureIn.close(); writer.printf("\r\n--%s--\r\n", UUID.randomUUID().toString()); writer.flush(); // 发送请求并获取响应 out.flush(); out.close(); int responseCode = conn.getResponseCode(); InputStream in; if (responseCode >= 200 && responseCode < 300) { in = conn.getInputStream(); } else { in = conn.getErrorStream(); } buffer = new byte[1024]; StringBuilder response = new StringBuilder(); while ((len = in.read(buffer)) != -1) { response.append(new String(buffer, 0, len)); } in.close(); conn.disconnect(); return response.toString(); } } ``` 在这个示例代码中,我们通过 `login` 方法登录设备,并获取到了认证用的 cookie。然后,在 `uploadPicture` 方法中,我们构造了一个 `multipart/form-data` 的 POST 请求,将待上传的图片文件作为其中的一个部分。最后,我们发送请求并获取响应,将响应的内容作为方法的返回值。 注意,这个代码中的 `picturePath` 是指图片文件在本地的路径,如果你要上传的图片文件不在本地文件系统中,你需要对代码进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值