引言
今天组会又被老板教训了,原因是觉得我研究问题一直浮于表面,他看不到我对研究内容的推动。组会结束后,做了一下自我反思。这一周我大部分时间都在实验室,虽然会在座位上玩手机摸鱼,但是起码有一半的时间是在学习,一周下来不应该像老板说的那样毫无进展呀。我总结了两点原因,1、我的摸鱼时间可能有点多,学习时间可能还是不够。2、我没有认真做好总结,在组会的时候没能把学到的东西展现出来。对于第二点,我最近觉也越来越觉得自己缺乏展示自己成果的能力。事儿可能做了不少,但是没能展示出来,让别人知道,那就相当于白做。不只局限于研究生搞科研的阶段,我觉得以后工作了,向他人展现自己所做事情的这项能力也是很重要的。工作中埋头干了半天,如果领导没能看出来你干了很多活,那就相当于没有干。所以,我决定更加勤快的更新博客,把自己学习到的知识用自己的语言在博客上做总结,这样在组会的时候就有东西可说了。
CTCLoss的详细介绍
今天发现了一篇博客,讲CTCLoss讲的特别好,图文并茂,终于弄懂了这个概念。想要深入理解CTCTLoss的朋友【戳这里】。我就不在这里做过多详细介绍,这篇博客只用做自我的一个总结
自我总结
1、CTCLoss的motivation
RNN可以有效的处理序列数据。但是,RNN处理的数据是分割好的,比如说在机器翻译中,翻译的文字可以根据空格分割成一个一个的字符或者可以用分词算法分成一个一个的单词。但是在语音识别中,按照发音将语音数据分割是一件困难的事情,做起来要消耗很大的人力。因此,在处理语音数据的时候,是使用固定的窗口来分割数据的。比如一段10s的语言,用0.5s的固定窗口进行分割。这种方法虽然降低了分割数据的成本,但是带来了新的问题。这种分割方法会导致某些窗口重复的现象。举个例子来说,一段语音的内容是【我爱你中国】,输入的语言数据在分割窗口的时候会出现这样的情况,由于【爱】这个发音拖的比较长,可能会有连续的多个窗口识别出来都是【爱】这个字,那么到时候输出就是【我爱爱爱你中国】或者【我爱爱_你中国】(这里的“_”是blank,在语音识别中,会有声音停顿的情况,因此需要加入blank来表示停顿),这两种情况其实都对应着【我爱你中国】。在一般的RNN模型的训练中,会将输出和和label的差异,来当做损失,然后使用梯度下降的算法更新参数。但是语音识别这种使用固定窗口分割的数据存在着多对一的关系,会有多个输出对应同一个label的情况。因此,就不能直接使用RNN的输出和标签计算损失了。这个时候CTCLoss就被提了出来,用于解决这一问题。
2、CTCLoss的具体方法
CTCLoss的想法其实很简单,像上节说的那样,语音数据存在多个输出对应一个标签的问题,那么我们就将所有可能的输出的概率求和,然后将这个概率和用于交叉熵公式得到损失。但是如何找到所有对应的输出呢?一种直接的方法就是使用暴力搜索,但是这种时间成本太高,假设输出的长度是
T
T
T,词表的大小是
L
L
L,那么搜索的范围就是
T
L
T^L
TL,这个复杂度是不能接受的。因此CTCLoss的作者提出使用动态规划的方法来求所有可能的输出,动态规划大大降低了搜索的复杂度,让CTCLoss的实现成为可能。
下一节我讲一讲对这个动态规划的理解,先把坑挖在这里,明天有时间来填。