1. 程式人生 > >語音識別:深入理解CTC Loss原理

語音識別:深入理解CTC Loss原理

  最近看了百度的Deep Speech,看到語音識別使用的損失函式是CTC loss。便整理了一下有關於CTC loss的一些定義和推導。由於個人水平有限,如果文章有錯誤,還懇請各位指出,萬分感謝~
  附上我的github主頁,歡迎各位的follow~~~獻出小星星~

1. 背景介紹

  在傳統的語音識別的模型中,我們對語音模型進行訓練之前,往往都要將文字與語音進行嚴格的對齊操作。這樣就有兩點不太好:

  1. 嚴格對齊要花費人力、時間。
  2. 嚴格對齊之後,模型預測出的label只是區域性分類的結果,而無法給出整個序列的輸出結果,往往要對預測出的label做一些後處理才可以得到我們最終想要的結果。

  雖然現在已經有了一些比較成熟的開源對齊工具供大家使用,但是隨著deep learning越來越火,有人就會想,能不能讓我們的網路自己去學習對齊方式呢?因此CTC(Connectionist temporal classification)就應運而生啦。

  想一想,為什麼CTC就不需要去對齊語音和文字呢?因為CTC它允許我們的神經網路在任意一個時間段預測label,只有一個要求:就是輸出的序列順序只要是正確的就ok啦~這樣我們就不在需要讓文字和語音嚴格對齊了,而且CTC輸出的是整個序列標籤,因此也不需要我們再去做一些後處理操作。

  對一段音訊使用CTC和使用文字對齊的例子如下圖所示:

這裡寫圖片描述

2. 從輸出到標籤

2.1符號的表示

  接下來,我們要對一些符號的定義進行介紹。由於水平有限,看這部分定義介紹的時候繞在裡面很久,可能有些理解有誤,還懇請各位大大及時指出~

  1. ytk:代表輸出序列在第t步的輸出為k的概率。舉個簡單的例子:當輸出的序列為(a-ab-)時,y3a 代表了在第3步輸出的字母為a的概率;

  2. p(πx):代表了給定輸入x,輸出路徑為 π 的概率;

    由於假設在每一個時間步輸出的label的概率都是相互獨立的,那麼 p(πx) 用公式來表示為 p(πx)=Tt=1(ytk),可以理解為每一個時間步輸出路徑 π 的相應label的概率的乘積。

  3. F:代表一種多對一的對映,將輸出路徑 π

    對映到 標籤序列 l 的一種變換

    舉個簡單的例子 F(aab)=F(aaabb)=aab (其中-代表了空格)

  4. p(lx) :代表給定輸入x,輸出為序列 l 的概率。

    因此輸出的序列為 l 的概率可以表示為所有輸出的路徑 π 對映後的序列為 l 的概率之和,用公式表示為 p(lx)=πF1(l)p(πx)

2.2 空格的作用

  在最開始的CTC設定中是沒有空格的,F 只是簡單的移除了連續的相同字母。但是這樣會產生兩個問題:

  1. 無法預測出連續兩個相同的字母的單詞了,比如說hello這個單詞,在CTC中會刪除掉連續相同的字母,因此CTC最後預測出的label應該是helo;
  2. 無法預測出一句完整的話,而只能預測單個的單詞。因為缺乏空格,CTC無法表示出單詞與單詞之間停頓的部分,因此只能預測出單個單詞,或者將一句話中的單詞全部連線起來了;

因此,空格在CTC中的作用還是十分重要的。

3. 前向傳播與反向傳播

3.1前向傳播

  在對符號做了一些定義之後,我們接下來看看CTC的前向傳播的過程。我們前向傳播就是要去計算 p(lx)。由於一個序列 l 通常可以有多條路徑經過對映後得到,而隨著序列 l 長度的增加,相對應的路徑的數目是成指數增加的,因此我們需要一種高效的演算法來計算它。

  有一種類似於HMM的前向傳播的演算法可以幫助我們來解決這個問題。它的key就是那些與序列 l 對應的路徑概率都可以通過迭代來計算得出。

  在進行計算之前,我們需要對序列 l 做一些預處理,在序列 l 的開頭與結尾分別加上空格,並且在字母與字母之間都新增上空格。如果原來序列 l 的長度為U,那麼預處理之後,序列 l 的長度為2U+1 。

  對於一個特定的序列 l ,我們定義前向變數 α(t,u) 為輸出所有長度為 t ,且經過 F 對映之後為序列 l 的路徑的概率之和,用公式表達如下所示:

α(t,u)=πV(t,u)ti=1yiπi

其中,V(t,u)={πAt:F(π)=l1:u/2,πt=lu} 代表了所有滿足經過 F 對映之後為序列 l ,長度為t的路徑集合,且在第t時間步的輸出為label: lu

  所有正確路徑的開頭必須是空格或者label l1,因此存在著初始化的約束條件:

α(1,1)=y1b
α(1,2)=y1l1
α(1,u)=0,u>2

也就是當路徑長度為1時,它只可能對應到空格或者序列 l 的第一個label,不可能對應到序列 l 第一個之後的label中。

  因此,p(lx) 可以由前向變數來表示,即為

p(lx)=α(T,U)+α(T,U1)

其中α(T,U)可以理解為所有路徑長度為T,經過 F 對映之後為序列 l ,且第T時刻的輸出的label為:

相關推薦

語音識別深入理解CTC Loss原理

  最近看了百度的Deep Speech,看到語音識別使用的損失函式是CTC loss。便整理了一下有關於CTC loss的一些定義和推導。由於個人水平有限,如果文章有錯誤,還懇請各位指出,萬分感謝~   附上我的github主頁,歡迎各位的follow~~~

內存系列二深入理解硬件原理

還要 傳輸 矩陣 bios 怎麽 線上 工程 什麽 所有 本篇文章承接上文繼續介紹DDR內存的硬件原理,包括如何尋址,時序和時延以及可以為提高內存的效能可以有哪些方法。 上次雖然解決了小張的問題,卻引發了他對內存原理的興趣。這不他又來找我了,說我還欠他一個解釋。這次我們約在

Mysql高手系列 - 第22篇深入理解mysql索引原理,連載中

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第22篇。 背景 使用mysql最多的就是查詢,我們迫切的希望mysql能查詢的更快一些,我們經常用到的查詢有: 按照id查詢唯一一條

深入理解MyBatis的原理(三)配置文件上

dynamic 如何 turn ready conf 屬性。 支持 left bool 前言:前文提到一個入門的demo,從這裏開始,會了解深入 MyBatis 的配置,本文講解 MyBatis 的配置文件的用法。 目錄 1、properties 元素 2、設置(set

深入理解MyBatis的原理(三)配置文件用法(續)

pac amt 單個 gis obb rri tab obj 用戶 前言:前文講解了 MyBatis 的配置文件一部分用法,本文將繼續講解 MyBatis 的配置文件的用法。 目錄 1、typeHandler 類型處理器 2、ObjectFactory 3、插件 4、e

記憶體系列二深入理解硬體原理

本篇文章承接上文繼續介紹DDR記憶體的硬體原理,包括如何定址,時序和時延以及可以為提高記憶體的效能可以有哪些方法。 上次雖然解決了小張的問題,卻引發了他對記憶體原理的興趣。這不他又來找我了,說我還欠他一個解釋。這次我們約在一個咖啡館見面,這次內容有點深入,我帶了些圖片,小張也點了一大杯美式,計劃大幹一

Nodejs探祕深入理解單執行緒實現高併發原理

前言 從Node.js進入我們的視野時,我們所知道的它就由這些關鍵字組成 事件驅動、非阻塞I/O、高效、輕量,它在官網中也是這麼描述自己的: Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript e

Java基礎深入理解java異常處理機制的原理和開發應用【轉載】

Java異常處理機制在日常開發中應用頻繁,本篇文章主要在基礎的使用方法上,更進一步的,如何更加合理的使用異常機制,希望可以對各位朋友能有所幫助。   Java異常處理機制其最主要的幾個關鍵字:try、catch、finally、throw、throws,以及各種各樣

視訊深入理解Java虛擬機器(jvm效能調優+記憶體模型+虛擬機器原理)共110集

龍果學院深入理解Java虛擬機器(Jvm效能調優+記憶體模型+虛擬機器原視訊 Java虛擬機器視訊教程一套不錯的視訊,課程一共有110課,課程目錄較多隻展示部分出來,喜歡的朋友下載看下 課程目錄(課程較多,只展示部分目錄) 課程大綱 第1節說在前面的話 [免費觀看]

iOS開發深入理解UITableView的cell複用原理

簡介 在我們的日常開發中,絕大多數情況下只要詳細閱讀類標頭檔案裡的註釋,組合UIKit框架裡的大量控制元件就能很好的滿足工作的需求。但僅僅會使用UIKit裡的控制元件還遠遠不夠,假如現在產品需要一個類似 Excel 樣式的控制元件來呈現資料,需要這個控制元件能上下左右滑

鏈接深入理解javascript構造函數和原型對象

原型對象 函數 href 深入理解java asc 構造 rip spa tar 鏈接:深入理解javascript構造函數和原型對象http://www.jb51.net/article/55539.htm 鏈接:深入理解javascript構造函數和原型對象

C中異步IO淺析之三深入理解異步IO的基本數據結構

c 異步io libaio 一個函數庫或一段代碼的數據結構之間的關系,既展示了數據的行蹤,同時又隱含了函數的調用順序和使用方法。libaio內部的多個數據結構尤其如此,哪怕我們找不到文檔或者幫助手冊,只要深刻領悟頭文件中定義的數據結構及其內在聯系,再加一點代碼的驗證,就可以達到對libaio的A

深入理解Java G1垃圾收集器

線程數 hot 原因 重要 特性 賦值 圖標 參數 堆內存 java垃圾收集器的歷史 第一階段,Serial(串行)收集器 在jdk1.3.1之前,java虛擬機僅僅能使用Serial收集器。 Serial收集器是一個單線程的收集器,但它的“單線程”的意義並不僅僅是說明它只

Android 異步消息處理機制前篇(二)深入理解Message消息池

連接 guid ply 指針 cau ann 區別 就會 消息處理機制 版權聲明:本文出自汪磊的博客,轉載請務必註明出處。 上一篇中共同探討了ThreadLocal,這篇我們一起看下常提到的Message消息池到底是怎麽回事,廢話少說吧,進入正題。 對於稍有經驗的開發人員來

深入理解 Spring 事務原理

順序 etc wid efi 這一 tran source 所在 回滾 一、事務的基本原理 Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。對於純JDBC操作數據庫,想要用到事務,可以按照以下步驟進行: 獲取連接

自定義RPC的完整實現---深入理解rpc內部原理

channel struct seek raise services utf-8 proto encode res 倘若不使用RPC遠端調用的情況下,代碼如下: local.py # coding:utf-8 # 本地調用除法運算的形式 class InvalidOper

java基礎學習總結(十二)深入理解java內部類

內部類 內部類也是語法糖,是因為它僅僅是一個編譯時的概念,outer.java裡面定義了一個內部類inner,一旦編譯成功,就會生成兩個完全不同的.class檔案了,分別是outer.class和outer$inner.class。所以內部類的名字完全可以和它的外部類名字相同。 內部類分為四

java基礎學習總結(九)深入理解Java泛型

一、什麼是泛型         “泛型” 意味著編寫的程式碼可以被不同型別的物件所重用。泛型的提出是為了編寫重用性更好的程式碼。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 比如常見的集合類 LinkedList: publi

深入理解JVM——基本原理

前言   JVM一直是java知識裡面進階階段的重要部分,如果希望在java領域研究的更深入,則JVM則是如論如何也避開不了的話題,本系列試圖通過簡潔易讀的方式,講解JVM必要的知識點。 執行流程   我們都知道java一直宣傳的口號是:一次編譯,到處執行。那麼它如何

安卓專案實戰之強大的網路請求框架okGo使用詳解(二)深入理解Callback之自定義JsonCallback

前言 JSON是一種取代XML的資料結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網路傳輸資料將減少更多流量從而加快了傳輸速度,目前客戶端伺服器返回的資料大多都是基於這種格式的,相應的我們瞭解的關於json的解析工具主要有兩個:Gson(Google官方出的)和fas