DTW算法

  Dynamic Time Warping(DTW)誕生有一定的歷史了(日本學者Itakura提出),它出現的目的也比較單純,是一種衡量兩個長度不同的時間序列的相似度的方法。應用也比較廣,主要是在模板匹配中,比如說用在孤立詞語音識別(識別兩段語音是否表示同一個單詞),手勢識別,數據挖掘和信息檢索等中。

 

一、概述

       在大部分的學科中,時間序列是數據的一種常見表示形式。對於時間序列處理來說,一個普遍的任務就是比較兩個序列的相似性。

       在時間序列中,需要比較相似性的兩段時間序列的長度可能並不相等,在語音識別領域表現爲不同人的語速不同。因爲語音信號具有相當大的隨機性,即使同一個人在不同時刻發同一個音,也不可能具有完全的時間長度。而且同一個單詞內的不同音素的發音速度也不同,比如有的人會把“A”這個音拖得很長,或者把“i”發的很短。在這些複雜情況下,使用傳統的歐幾里得距離無法有效地求的兩個時間序列之間的距離(或者相似性)。

       例如圖A所示,實線和虛線分別是同一個詞“pen”的兩個語音波形(在y軸上拉開了,以便觀察)。可以看到他們整體上的波形形狀很相似,但在時間軸上卻是不對齊的。例如在第20個時間點的時候,實線波形的a點會對應於虛線波形的b’點,這樣傳統的通過比較距離來計算相似性很明顯不靠譜。因爲很明顯,實線的a點對應虛線的b點纔是正確的。而在圖B中,DTW就可以通過找到這兩個波形對齊的點,這樣計算它們的距離纔是正確的。

       也就是說,大部分情況下,兩個序列整體上具有非常相似的形狀,但是這些形狀在x軸上並不是對齊的。所以我們在比較他們的相似度之前,需要將其中一個(或者兩個)序列在時間軸下warping扭曲,以達到更好的對齊。而DTW就是實現這種warping扭曲的一種有效方法。DTW通過把時間序列進行延伸和縮短,來計算兩個時間序列性之間的相似性。

       那如果才知道兩個波形是對齊了呢?也就是說怎麼樣的warping纔是正確的?直觀上理解,當然是warping一個序列後可以與另一個序列重合recover。這個時候兩個序列中所有對應點的距離之和是最小的。所以從直觀上理解,warping的正確性一般指“feature to feature”的對齊。

 

二、動態時間規整DTW

         動態時間規整DTW是一個典型的優化問題,它用滿足一定條件的的時間規整函數W(n)描述測試模板和參考模板的時間對應關係,求解兩模板匹配時累計距離最小所對應的規整函數。

      假設我們有兩個時間序列Q和C,他們的長度分別是n和m:(實際語音匹配運用中,一個序列爲參考模板,一個序列爲測試模板,序列中的每個點的值爲語音序列中每一幀的特徵值。例如語音序列Q共有n幀,第i幀的特徵值(一個數或者一個向量)是qi。至於取什麼特徵,在這裏不影響DTW的討論。我們需要的是匹配這兩個語音序列的相似性,以達到識別我們的測試語音是哪個詞)

= q1, q2,…,qi,…, q;

= c1, c2,…, cj,…, c;

       如果n=m,那麼就用不着折騰了,直接計算兩個序列的距離就好了。但如果n不等於m我們就需要對齊。最簡單的對齊方式就是線性縮放了。把短的序列線性放大到和長序列一樣的長度再比較,或者把長的線性縮短到和短序列一樣的長度再比較。但是這樣的計算沒有考慮到語音中各個段在不同情況下的持續時間會產生或長或短的變化,因此識別效果不可能最佳。因此更多的是採用動態規劃(dynamic programming)的方法。

      爲了對齊這兩個序列,我們需要構造一個n x m的矩陣網格,矩陣元素(i, j)表示qi和cj兩個點的距離d(qi, cj)(也就是序列Q的每一個點和C的每一個點之間的相似度,距離越小則相似度越高。這裏先不管順序),一般採用歐式距離,d(qi, cj)= (qi-cj)2(也可以理解爲失真度)。每一個矩陣元素(i, j)表示點qi和cj的對齊。DP算法可以歸結爲尋找一條通過此網格中若干格點的路徑,路徑通過的格點即爲兩個序列進行計算的對齊的點。

       那麼這條路徑我們怎麼找到呢?那條路徑纔是最好的呢?也就是剛纔那個問題,怎麼樣的warping纔是最好的。

我們把這條路徑定義爲warping path規整路徑,並用W來表示, W的第k個元素定義爲wk=(i,j)k,定義了序列Q和C的映射。這樣我們有:

     首先,這條路徑不是隨意選擇的,需要滿足以下幾個約束:

1)邊界條件:w1=(1, 1)和wK=(m, n)。任何一種語音的發音快慢都有可能變化,但是其各部分的先後次序不可能改變,因此所選的路徑必定是從左下角出發,在右上角結束。

2)連續性:如果wk-1= (a’, b’),那麼對於路徑的下一個點wk=(a, b)需要滿足 (a-a’) <=1和 (b-b’) <=1。也就是不可能跨過某個點去匹配,只能和自己相鄰的點對齊。這樣可以保證Q和C中的每個座標都在W中出現。

3)單調性:如果wk-1= (a’, b’),那麼對於路徑的下一個點wk=(a, b)需要滿足0<=(a-a’)和0<= (b-b’)。這限制W上面的點必須是隨着時間單調進行的。以保證圖B中的虛線不會相交。

         結合連續性和單調性約束,每一個格點的路徑就只有三個方向了。例如如果路徑已經通過了格點(i, j),那麼下一個通過的格點只可能是下列三種情況之一:(i+1, j),(i, j+1)或者(i+1, j+1)。

      滿足上面這些約束條件的路徑可以有指數個,然後我們感興趣的是使得下面的規整代價最小的路徑:

      分母中的K主要是用來對不同的長度的規整路徑做補償。我們的目的是什麼?或者說DTW的思想是什麼?是把兩個時間序列進行延伸和縮短,來得到兩個時間序列性距離最短也就是最相似的那一個warping,這個最短的距離也就是這兩個時間序列的最後的距離度量。在這裏,我們要做的就是選擇一個路徑,使得最後得到的總的距離最小。

      這裏我們定義一個累加距離cumulative distances。從(0, 0)點開始匹配這兩個序列Q和C,每到一個點,之前所有的點計算的距離都會累加。到達終點(n, m)後,這個累積距離就是我們上面說的最後的總的距離,也就是序列Q和C的相似度。

      累積距離γ(i,j)可以按下面的方式表示,累積距離γ(i,j)爲當前格點距離d(i,j),也就是點qi和cj的歐式距離(相似性)與可以到達該點的最小的鄰近元素的累積距離之和:

      最佳路徑是使得沿路徑的積累距離達到最小值這條路徑。這條路徑可以通過動態規劃(dynamic programming)算法得到。

 下面是一個例子來理解上述原理:

DTW爲(Dynamic Time Warping,動態時間歸準)的簡稱。應用很廣,主要是在模板匹配中,比如說用在孤立詞語音識別,計算機視覺中的行爲識別,信息檢索等中。可能大家學過這些類似的課程都看到過這個算法,公式也有幾個,但是很抽象,當時看懂了但不久就會忘記,因爲沒有具體的實例來加深印象。

      這次主要是用語音識別課程老師上課的一個題目來理解DTW算法。

  首先還是介紹下DTW的思想:假設現在有一個標準的參考模板R,是一個M維的向量,即R={R(1),R(2),……,R(m),……,R(M)},每個分量可以是一個數或者是一個更小的向量。現在有一個才測試的模板T,是一個N維向量,即T={T(1),T(2),……,T(n),……,T(N)}同樣每個分量可以是一個數或者是一個更小的向量,注意M不一定等於N,但是每個分量的維數應該相同。

     由於M不一定等於N,現在要計算R和T的相似度,就不能用以前的歐式距離等類似的度量方法了。那用什麼方法呢?DTW就是爲了解決這個問題而產生的。

首先我們應該知道R中的一個分量R(m)和T中的一個分量T(n)的維數是相同的,它們之間可以計算相似度(即距離)。在運用DTW前,我們要首先計算R的每一個分量和T中的每一個分量之間的距離,形成一個M*N的矩陣。(爲了方便,行數用將標準模板的維數M,列數爲待測模板的維數N)。

然後下面的步驟該怎麼計算呢?用個例子來看看。

這個例子中假設標準模板R爲字母ABCDEF(6個),測試模板T爲1234(4個)。R和T中各元素之間的距離已經給出。如下:

 

     既然是模板匹配,所以各分量的先後匹配順序已經確定了,雖然不是一一對應的。現在題目的目的是要計算出測試模板T和標準模板R之間的距離。因爲2個模板的長度不同,所以其對應匹配的關係有很多種,我們需要找出其中距離最短的那條匹配路徑。現假設題目滿足如下的約束:當從一個方格((i-1,j-1)或者(i-1,j)或者(i,j-1))中到下一個方格(i,j),如果是橫着或者豎着的話其距離爲d(i,j),如果是斜着對角線過來的則是2d(i,j).其約束條件如下圖像所示:

 

     其中g(i,j)表示2個模板都從起始分量逐次匹配,已經到了M中的i分量和T中的j分量,並且匹配到此步是2個模板之間的距離。並且都是在前一次匹配的結果上加d(i,j)或者2d(i,j),然後取最小值。

     所以我們將所有的匹配步驟標註後如下:

     怎麼得來的呢?比如說g(1,1)=4, 當然前提都假設是g(0,0)=0,就是說g(1,1)=g(0,0)+2d(1,1)=0+2*2=4.

     g(2,2)=9是一樣的道理。首先如果從g(1,2)來算的話是g(2,2)=g(1,2)+d(2,2)=5+4=9,因爲是豎着上去的。

     如果從g(2,1)來算的話是g(2,2)=g(2,1)+d(2,2)=7+4=11,因爲是橫着往右走的。

     如果從g(1,1)來算的話,g(2,2)=g(1,1)+2*d(2,2)=4+2*4=12.因爲是斜着過去的。

     綜上所述,取最小值爲9. 所有g(2,2)=9.

     當然在這之前要計算出g(1,1),g(2,1),g(1,2).因此計算g(I,j)也是有一定順序的。

其基本順序可以體現在如下:

 

     計算了第一排,其中每一個紅色的箭頭表示最小值來源的那個方向。當計算了第二排後的結果如下:

 

     最後都算完了的結果如下:

     到此爲止,我們已經得到了答案,即2個模板直接的距離爲26. 我們還可以通過回溯找到最短距離的路徑,通過箭頭方向反推回去。如下所示:

     到這裏,估計大家動手算一下就會明白了。其實很簡單,通過例子的學習後再回去看那些枯燥的理論公式就發現很容易了。

     在實際應用中,比如說語音識別中的孤立詞識別,我們首先訓練好常見字的讀音,提取特徵後作爲一個模板。當需要識別一個新來的詞的時候,也同樣提取特徵,然後和訓練數據庫中的每一個模板進行匹配,計算距離。求出最短距離的那個就是識別出來的字了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章