語音識別語音識別轉(zhuǎn)文字

      網(wǎng)友投稿 1419 2025-04-01

      語音識別基礎(chǔ)


      ?? 特征提取

      (https://asr.pub/posts/feature_extraction/)

      預(yù)加重的目的是提升高頻部分,使信號的頻譜變得平坦,保持在低頻到高頻的整個頻帶中,能用同樣的信噪比求頻譜。同時,也是為了消除發(fā)生過程中聲帶和嘴唇的效應(yīng),來補償語音信號受到發(fā)音系統(tǒng)所抑制的高頻部分,也為了突出高頻的共振峰。這里說的高頻低頻是指時域上采樣點分幀后的頻率,針對每一幀,作傅利葉變換得到頻域的N個分量,這N個分量按照頻率為橫坐標,振幅為縱坐標。如果沒有噪音,這N個分量振幅值應(yīng)該隨著頻率增大逐漸遞減,但因為噪音存在,在某一高頻段處,振幅值出現(xiàn)反常,變得很大,導(dǎo)致信噪比很小,而預(yù)加重就是為了把高頻段的信號都放大,從而增大高頻段的信噪比

      l? 為什么要分幀加窗

      語音信號處理需要弄清楚語音中各個頻率成分的分布。做這件事情的數(shù)學(xué)工具是傅里葉變換。傅里葉變換要求輸入信號是平穩(wěn)的。而語音在宏觀上來看是不平穩(wěn)的——你的嘴巴一動,信號的特征就變了。但是從微觀上來看,在比較短的時間內(nèi),嘴巴動得是沒有那么快的,語音信號就可以看成平穩(wěn)的,就可以截取出來做傅里葉變換了。這就是為什么語音信號要分幀處理,截取出來的一小段信號就叫一「幀」。

      那么一幀有多長呢?幀長要滿足兩個條件:

      從宏觀上看,它必須足夠短來保證幀內(nèi)信號是平穩(wěn)的。前面說過,口型的變化是導(dǎo)致信號不平穩(wěn)的原因,所以在一幀的期間內(nèi)口型不能有明顯變化,即一幀的長度應(yīng)當小于一個音素的長度。正常語速下,音素的持續(xù)時間大約是 50~200 毫秒,所以幀長一般取為小于 50 毫秒。

      從微觀上來看,它又必須包括足夠多的振動周期,因為傅里葉變換是要分析頻率的,只有重復(fù)足夠多次才能分析頻率。語音的基頻,男聲在 100 赫茲左右,女聲在 200 赫茲左右,換算成周期就是 10 毫秒和 5 毫秒。既然一幀要包含多個周期,所以一般取至少 20 毫秒。

      這樣,我們就知道了幀長一般取為 20 ~ 50 毫秒,20、25、30、40、50 都是比較常用的數(shù)值。

      取出來的一幀信號,在做傅里葉變換之前,要先進行「加窗」的操作,即與一個「窗函數(shù)」相乘 加窗的目的是讓一幀信號的幅度在兩端漸變到 0。漸變對傅里葉變換有好處,可以讓頻譜上的各個峰更細,不容易糊在一起(術(shù)語叫做減輕頻譜泄漏。

      加窗的代價是一幀信號兩端的部分被削弱了,沒有像中央的部分那樣得到重視。彌補的辦法是,幀不要背靠背地截取,而是相互重疊一部分。相鄰兩幀的起始位置的時間差叫做幀移,常見的取法是取為幀長的一半,或者固定取為?10 毫秒。

      對一幀信號做傅里葉變換,得到的結(jié)果叫頻譜。語音的頻譜,常常呈現(xiàn)出「精細結(jié)構(gòu)」和「包絡(luò)」兩種模式?!妇毥Y(jié)構(gòu)」就是藍線上的一個個小峰,它們在橫軸上的間距就是基頻,它體現(xiàn)了語音的音高——峰越稀疏,基頻越高,音高也越高。「包絡(luò)」則是連接這些小峰峰頂?shù)钠交€(紅線),它代表了口型,即發(fā)的是哪個音。包絡(luò)上的峰叫共振峰,圖中能看出四個,分別在 500、1700、2450、3800 赫茲附近。有經(jīng)驗的人,根據(jù)共振峰的位置,就能看出發(fā)的是什么音。

      對每一幀信號都做這樣的傅里葉變換,就可以知道音高和口型隨時間的變化情況,也就能識別出一句話說的是什么了。

      l? Fbank特征和MFCC特征對比

      fbank只是缺少mfcc特征提取的dct倒譜環(huán)節(jié),其他步驟相同。

      fbank的不足:相鄰的特征高度相關(guān)(相鄰濾波器組有重疊),因此當我們用HMM對音素建模的時候,幾乎總需要首先進行倒譜轉(zhuǎn)換,通過這樣得到MFCC特征。

      計算量:MFCC是在FBank的基礎(chǔ)上進行的,所以MFCC的計算量更大

      特征區(qū)分度:FBank特征相關(guān)性較高,MFCC具有更好的判別度,所以大多數(shù)語音識別論文中用的是MFCC,而不是Fbank。而端到端的方法基本都用的Fbank

      l? 為什么有DCT

      其中DCT的實質(zhì)是去除各維信號之間的相關(guān)性,將信號映射到低維空間。離散余弦變換(discrete cosine transform,DCT)是傅里葉變換的一個變種,好處是結(jié)果是實數(shù),沒有虛部。DCT還有一個特點是,對于一般的語音信號,這一步的結(jié)果的前幾個系數(shù)特別大,后面的系數(shù)比較小,可以忽略。上面說了一般取40個三角形,所以DCT的結(jié)果也是40個點;實際中,一般僅保留前12~20個,這就進一步壓縮了數(shù)據(jù)。

      ? 語音數(shù)據(jù)增強

      (https://blog.csdn.net/qq_36999834/article/details/109851965)

      音量增強

      速度增強(基于一維的插值算法)

      失真增強

      音調(diào)增強(頻率)

      移動增強

      噪聲增強(加噪)

      SpecAugment:?在語譜圖上做數(shù)據(jù)增強。?語譜圖直觀的表示語音信號隨時間變化的頻譜特性。任一給定頻率成分在給定時刻的強弱用相應(yīng)點的灰度或色調(diào)的濃淡來表示。用語譜圖分析語音又稱為語譜分析。

      時間扭曲:隨機的選擇一個點出來,然后將它放在距離當前位置為W的地方,左邊,右邊都可以。那這個距離怎樣選擇呢,沿著波形線,我們從一個從0到時間扭曲參數(shù)(自己設(shè)置的)的正態(tài)分布里面去選擇。

      時域遮蓋

      頻域遮蓋

      ?? 聲學(xué)模型和語言模型

      l? 聲學(xué)模型

      聲學(xué)模型其實就是可以識別單個音素的模型(音素a的模型可以判定一小段語音是否是a);

      語言模型表示一個個詞串(如何結(jié)合了詞典,就可以成為一個個音素串)它們在語料庫中出現(xiàn)的概率大?。ū热?,不合語法的詞串(句子)概率接近0,很合乎語法的詞串概率大);

      解碼器就是基于Viterbi算法在HMM模型上搜索生成給定觀測值序列(待識別語音的聲學(xué)特征)概率最大的HMM狀態(tài)序列,再由HMM狀態(tài)序列獲取對應(yīng)的詞序列,得到結(jié)果結(jié)果。

      如果你只做單個音素識別,(語音很短,內(nèi)容只是音素),那么只用聲學(xué)模型就可以做到,不用語言模型。做法就是在每個音素的聲學(xué)模型上使用解碼器做解碼(簡單的Viterbi算法即可)。

      但是,通常是要識別一個比較長的語音,這段語音中包含了很多詞。這就需要把所有可能的詞串,結(jié)合詞典展開為音素串,再跟音素的聲學(xué)模型結(jié)合,可以得到解碼圖(實際上可以看成很多很多HMM模型連接而成),然后在這個解碼圖上實施Viterbi算法,得到最佳序列,進而得到識別結(jié)果。

      l? 語言模型

      語言模型把語言(詞的序列)看作一個隨機事件,并賦予相應(yīng)的概率來描述其屬于某種語言集合的可能性。給定一個詞匯集合 V,對于一個由 V 中的詞構(gòu)成的序列S = ?w1, · · · , wT ? ∈ Vn,統(tǒng)計語言模型賦予這個序列一個概率P(S),來衡量S符合自然語言的語法和語義規(guī)則的置信度。用一句簡單的話說,就語言模型就是計算一個句子的概率大小的這種模型。有什么意義呢?一個句子的打分概率越高,越說明他是更合乎人說出來的自然句子。

      N-Gram是一種基于統(tǒng)計語言模型的算法。它的基本思想是將文本里面的內(nèi)容按照字節(jié)進行大小為N的滑動窗口操作,形成了長度是N的字節(jié)片段序列。

      每一個字節(jié)片段稱為gram,對所有g(shù)ram的出現(xiàn)頻度進行統(tǒng)計,并且按照事先設(shè)定好的閾值進行過濾,形成關(guān)鍵gram列表,也就是這個文本的向量特征空間,列表中的每一種gram就是一個特征向量維度。

      該模型基于這樣一種假設(shè),第N個詞的出現(xiàn)只與前面N-1個詞相關(guān),而與其它任何詞都不相關(guān),整句的概率就是各個詞出現(xiàn)概率的乘積。這些概率可以通過直接從語料中統(tǒng)計N個詞同時出現(xiàn)的次數(shù)得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

      n-gram模型用于評估語句是否合理:

      NNLM 即 Neural Network based Language Model,它由四層組成,輸入層、嵌入層、隱層和輸出層。模型接收的輸入是長度為n的詞序列,輸出是下一個詞的類別。首先,輸入是單詞序列的index序列,例如單詞 I 在字典(大小為|V|)中的index是10,單詞 am 的 index 是23, Bengio 的 index 是65,則句子“I am Bengio”的index序列就是 10, 23, 65。嵌入層(Embedding)是一個大小為∣V∣×K的矩陣,從中取出第10、23、65行向量拼成3×K的矩陣就是Embedding層的輸出了。隱層接受拼接后的Embedding層輸出作為輸入,以tanh為激活函數(shù),最后送入帶softmax的輸出層,輸出概率。

      NNLM最大的缺點就是參數(shù)多,訓(xùn)練慢。另外,NNLM要求輸入是定長n,定長輸入這一點本身就很不靈活,同時不能利用完整的歷史信息。

      其結(jié)構(gòu)實際上是用RNN代替NNLM里的隱層,RNN可以接受任意長度輸入、利用完整的歷史信息。同時,RNN的引入意味著可以使用RNN的其他變體,像LSTM等等,從而在時間序列建模上進行更多更豐富的優(yōu)化。

      ? NLP中的subword算法及實現(xiàn)(Tokenization)

      (https://zhuanlan.zhihu.com/p/198964217?utm_source=wechat_session&utm_medium=social&utm_oi=642320524580229120)

      (https://zhuanlan.zhihu.com/p/112444056?utm_source=wechat_session&utm_medium=social&utm_oi=642320524580229120)

      l? token

      token是指,句子經(jīng)過分詞或者subword模型得到的序列,該序列的元素就是token,如果分詞算法將得到的結(jié)果是[ '在', '紐', '約', '生', '活' ],那么‘在’就是token,’在’的embedding是‘在’這個token的特征表示。

      l? word、subword和character

      在NLP任務(wù)中,神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練和預(yù)測都需要借助詞表來對句子進行表示。傳統(tǒng)構(gòu)造詞表的方法,是先對各個句子進行分詞,然后再統(tǒng)計并選出頻數(shù)最高的前N個詞組成詞表。通常訓(xùn)練集中包含了大量的詞匯,以英語為例,總的單詞數(shù)量在17萬到100萬左右。出于計算效率的考慮,通常N的選取無法包含訓(xùn)練集中的所有詞。因而,這種方法構(gòu)造的詞表存在著如下的問題:

      實際應(yīng)用中,模型預(yù)測的詞匯是開放的,對于未在詞表中出現(xiàn)的詞(Out Of Vocabulary, OOV),模型將無法處理及生成;

      詞表中的低頻詞/稀疏詞在模型訓(xùn)練過程中無法得到充分訓(xùn)練,進而模型不能充分理解這些詞的語義;

      一個單詞因為不同的形態(tài)會產(chǎn)生不同的詞,如由"look"衍生出的"looks", "looking", "looked",顯然這些詞具有相近的意思,但是在詞表中這些詞會被當作不同的詞處理,一方面增加了訓(xùn)練冗余,另一方面也造成了大詞匯量問題。

      一種解決思路是使用字符粒度來表示詞表,雖然能夠解決OOV問題,但單詞被拆分成字符后,一方面丟失了詞的語義信息,另一方面,模型輸入會變得很長,這使得模型的訓(xùn)練更加復(fù)雜難以收斂。

      針對上述問題,Subword(子詞)模型方法橫空出世。它的劃分粒度介于詞與字符之間,比如可以將”looking”劃分為”look”和”ing”兩個子詞,而劃分出來的"look",”ing”又能夠用來構(gòu)造其它詞,如"look"和"ed"子詞可組成單詞"looked",因而Subword方法能夠大大降低詞典的大小,同時對相近詞能更好地處理。

      目前有三種主流的Subword算法,它們分別是:Byte Pair Encoding (BPE), WordPiece和Unigram Language Model。

      l? Byte Pair Encoding(BPE)

      Byte Pair Encoding (BPE) 是一種壓縮算法,它屬于自下而上的算法(由少變多)。

      BPE是一種數(shù)據(jù)壓縮的方式,它將字符串中最常見的一對連續(xù)字符數(shù)據(jù)替換成該字符串中不存在的字符串,后續(xù)再通過一個詞表重建原始的數(shù)據(jù)。BPE的處理過程可以理解為一個單詞的再拆分過程。如"loved","loving","loves"這三個單詞,其本身的語義都是”愛”的意思。BPE通過訓(xùn)練,能夠把上面的3個單詞拆分成”lov”,”ed”,”ing”,”es”幾部分,這樣可以把詞的本身的意思和時態(tài)分開,有效的減少了詞表的數(shù)量。

      獲取subword詞表的流程(learn-bpe)

      準備語料,分解成最小單元,比如英文中26個字母加上各種符號,作為原始詞表

      根據(jù)語料統(tǒng)計相鄰字符對出現(xiàn)的頻次

      挑出頻次最高的相鄰字符對,比如"t"和"h",合并組成"th",加入詞表,訓(xùn)練語料中所有該相鄰字符對都進行融合

      重復(fù)2和3操作,直至詞表中單詞的數(shù)量達到期望,或下一個最高頻的字節(jié)對出現(xiàn)頻率為1

      編碼和解碼(apply-bpe及其逆過程)

      得到subword詞表后,對該詞表按照子詞長度由大到小排序。編碼時,對于每個單詞,遍歷排好序的字詞詞表尋找是否有token是當前單詞的子字符串,如果有,則該token是表示單詞的tokens之一。從最長的token迭代到最短的token,嘗試將每個單詞中的子字符串替換為token。 最終,該過程將迭代所有tokens,并將所有子字符串替換為tokens。 如果仍然有子字符串沒被替換但所有token都已迭代完畢,則將剩余的子詞替換為特殊token,如unk。(注:當輸入也是文本數(shù)據(jù)時,需要對每個單詞做編碼,將單詞表示成bpe產(chǎn)生的token集合(在字典中挑選能表示該單詞的字詞),此時就用到了該編碼過程。在標簽數(shù)據(jù)也是文本數(shù)據(jù)時,每個單詞也需要被表示成bpe產(chǎn)生的token集合。這是因為模型的輸出單元是單個token,每個單詞是由好幾個token表示的,所以模型的幾個輸出(token)連接起來才是該單詞)

      而解碼是編碼的逆過程,主要應(yīng)用在得到翻譯輸出怎么將subword恢復(fù)為word

      l? WordPiece

      Google的Bert模型在分詞的時候使用的是WordPiece算法。與BPE算法類似,WordPiece算法也是每次從詞表中選出兩個子詞合并成新的子詞。與BPE的最大區(qū)別在于,如何選擇兩個子詞進行合并:BPE選擇頻數(shù)最高的相鄰子詞合并,而WordPiece選擇能夠提升語言模型概率最大的相鄰子詞加入詞表。

      看到這里,你可能不清楚WordPiece是如何選取子詞的。這里,通過形式化方法,能夠清楚地理解WordPiece在合并這一步是如何作出選擇的。假設(shè)句子 由n個子詞組成,ti表示子詞,且假設(shè)各個子詞之間是獨立存在的,則句子的語言模型似然值等價于所有子詞概率的乘積:

      假設(shè)把相鄰位置的x和y兩個子詞進行合并,合并后產(chǎn)生的子詞記為z,此時句子似然值的變化可表示為:

      從上面的公式,很容易發(fā)現(xiàn),似然值的變化就是兩個子詞之間的互信息。簡而言之,WordPiece每次選擇合并的兩個子詞,他們具有最大的互信息值,也就是兩子詞在語言模型上具有較強的關(guān)聯(lián)性,它們經(jīng)常在語料中以相鄰方式同時出現(xiàn)。

      wordpiece算法中subword詞表的學(xué)習(xí)跟BPE也差不多:

      準備語料,分解成最小單元,比如英文中26個字母加上各種符號,作為原始詞表

      利用上述語料訓(xùn)練語言模型

      從所有可能的subword單元中選擇加入語言模型后能最大程度地增加訓(xùn)練數(shù)據(jù)概率的單元作為新的單元

      重復(fù)上步驟,直至詞表大小達到設(shè)定值或概率增量低于某一閾值

      l? unigram language model

      語言模型作為NLP的大廈根基,也是unigram分詞的基礎(chǔ)。在wordpiece算法中,其實已經(jīng)用到了language modeling,在選擇token進行合并的時候目標就是能提高句子的likelihood。而unigram分詞則更進一步,直接以最大化句子的likelihood為目標來直接構(gòu)建整個詞表。

      首先,了解一下怎么樣在給定詞表的條件下最大化句子的likelihood。 給定詞表及對應(yīng)概率值: {"你":0.18, "們":0.16, "好":0.18, "你們":0.15},對句子”你們好“進行分詞:

      劃分為"你@@" "們@@" "好" 的概率為18*0.16*0.18=0.005184

      劃分為"你們@@" "好@@" 的概率為15*0.18=0.027

      明顯看出后一種分詞方式要比前一種好,當然在真實的案例下詞表可能有幾萬個token,直接羅列各種組合的概率顯然不可能,所以需要用到Viterbi算法。因此在給定詞表的情況下,可以

      1.計算每個token對應(yīng)的概率;

      2.找到一個句子最好的分詞方式

      但是在詞表沒有確定的情況下,同時要優(yōu)化詞表和詞表里每個token的概率很難做到。unigram分詞使用逐步迭代的方式來求解,具體步驟如下:

      首先初始化一個很大的詞表

      重復(fù)以下步驟直到詞表數(shù)量減少到預(yù)先設(shè)定的閾值:

      保持詞表不變,用EM算法來求解每個token的概率

      對于每一個token,計算如果把這個token從詞表中移除而導(dǎo)致的likelihood減少值,作為這個token的loss

      按loss從大到小排序,保留前n%(原文中為80%)的token。

      初始化詞表可以用不同的方法,一個比較直接的辦法就是用所有長度為1的token加上高頻出現(xiàn)的ngram來作為起始詞表。

      l? SentencePiece

      如何使用上述子詞算法?一種簡便的方法是使用SentencePiece,它是谷歌推出的子詞開源工具包,其中集成了BPE、ULM子詞算法。除此之外,SentencePiece還能支持字符和詞級別的分詞。更進一步,為了能夠處理多語言問題,sentencePiece將句子視為Unicode編碼序列,從而子詞算法不用依賴于語言的表示。

      ? word2vec

      基于神經(jīng)網(wǎng)絡(luò)的分布表示又稱為詞向量、詞嵌入,神經(jīng)網(wǎng)絡(luò)詞向量模型與其它分布表示方法一樣,均基于分布假說,核心依然是上下文的表示以及上下文與目標詞之間的關(guān)系的建模。語言模型正好具有捕捉上下文信息的能力。那么構(gòu)建上下文與目標詞之間的關(guān)系,最自然的一種思路就是使用語言模型語言模型statistical language model。就是給你幾個詞,在這幾個詞出現(xiàn)的前提下來計算某個詞出現(xiàn)的(事后)概率。CBOW也是統(tǒng)計語言模型的一種,顧名思義就是根據(jù)某個詞前面的C個詞或者前后C個連續(xù)的詞,來計算某個詞出現(xiàn)的概率。Skip-Gram Model相反,是根據(jù)某個詞,然后分別計算它前后出現(xiàn)某幾個詞的各個概率。

      以“我愛北京天安門”這句話為例。假設(shè)我們現(xiàn)在關(guān)注的詞是“愛”,C=2時它的上下文分別是“我”,“北京天安門”。CBOW(完形填空)模型就是把“我” “北京天安門” 的one hot表示方式作為輸入,也就是C個1xV的向量,分別跟同一個VxN的大小的系數(shù)矩陣W1相乘得到C個1xN的隱藏層hidden layer,然后C個取平均所以只算一個隱藏層。這個過程也被稱為線性激活函數(shù)(這也算激活函數(shù)?分明就是沒有激活函數(shù)了)。然后再跟另一個NxV大小的系數(shù)矩陣W2相乘得到1xV的輸出層,這個輸出層每個元素代表的就是詞庫里每個詞的事后概率。輸出層需要跟ground truth也就是“愛”的one hot形式做比較計算loss。Skip gram(造句)訓(xùn)練過程類似,只不過輸入輸出剛好相反。CBOM和skip gram本質(zhì)上都是在做極大似然估計,CBOM是在上下文已知的條件下,出現(xiàn)中心詞的概率是模型參數(shù)的函數(shù),最大化對應(yīng)的似然函數(shù)(各個時刻的累計和)。skip-gram是在中心詞已知的條件下,分別出現(xiàn)上下文每個單詞的概率是模型參數(shù)的函數(shù),最大化對應(yīng)的似然函數(shù)(各個時刻的累計和)。

      訓(xùn)練trick:

      負采樣緩解sofrmax計算量大的問題。本質(zhì)就是用sigmoid代替softmax,只挑選一部分負樣本計算交叉熵損失,正樣本正常計算。

      層次softmax。構(gòu)造霍夫曼樹

      l? Hierarchical Softmax

      Hierarchical Softmax

      (B站視頻)

      根據(jù)語料庫統(tǒng)計詞頻,構(gòu)造霍夫曼樹(霍夫曼樹的好處是,一般得到霍夫曼樹后我們會對葉子節(jié)點進行霍夫曼編碼,由于權(quán)重高的葉子節(jié)點越靠近根節(jié)點,而權(quán)重低的葉子節(jié)點會遠離根節(jié)點,這樣我們的高權(quán)重節(jié)點編碼值較短,而低權(quán)重值編碼值較長。這保證的樹的帶權(quán)路徑最短)。

      ?? 位置編碼

      不同時間步位置編碼不同,且不同特征維度,位置編碼也不同。

      為什么用sin和cos做位置編碼:我們希望i處的位置向量Pi與j處的位置向量Pj的內(nèi)積是(j-i)的函數(shù)(為什么是內(nèi)積,因為計算attention的score時,兩個向量的內(nèi)積時最簡單的算法。當滿足這個條件時,i和j的相似度就和位置也有關(guān)系了)。而cos和sin函數(shù)正好有這個性質(zhì):

      cos(i-j) = cosi*cosj+sini*sinj([cosi,sini]*[cosj,sinj]T)

      令Pi = [sini, cosi]; Pj = [sinj,cosj],那么Pi和Pj的內(nèi)積= cosi*cosj+sini*sinj

      模型

      l? 端到端

      https://blog.csdn.net/wudibaba21/article/details/110946194

      l? GMM-HMM

      https://blog.csdn.net/fandaoerji/article/details/44853853

      l? RNN

      普通神經(jīng)網(wǎng)絡(luò)的前一個輸入和后一個輸入是完全沒有關(guān)系的。但是,某些任務(wù)需要能夠更好的處理序列的信息,即前面的輸入和后面的輸入是有關(guān)系的,比如某個單詞的意思會因為上文提到的內(nèi)容不同而有不同的含義,RNN就能夠很好地解決這類問題。RNN的核心思想即是將數(shù)據(jù)按時間軸展開,每一時刻數(shù)據(jù)均對應(yīng)相同的神經(jīng)單元,且上一時刻的結(jié)果能傳遞至下一時刻。至此便解決了輸入輸出變長且存在上下文依賴的問題。

      隱藏層St的取值不僅僅取決于Xt,還取決于St-1。用公式表達:St = f(U*Xt+W*St-1);其中St時t時刻隱藏層的輸出,Xt是t時刻的書,U和W分別是兩個權(quán)重矩陣。

      (https://zhuanlan.zhihu.com/p/101322965)

      如果是做序列標注任務(wù)(語音識別也算),在每個time step,我們每一個時刻都會預(yù)測一個結(jié)果,并得到一個損失值,那么最終的損失將會是所有時刻損失之和。St的計算包括了St-1和W,而St-1的計算又包括了St-2和W,所以計算St對W的導(dǎo)數(shù)時,需要一層一層的向下求導(dǎo)。

      l? LSTM

      (https://zhuanlan.zhihu.com/p/50915723)

      LSTM是一種特殊的RNN,主要是為了解決長序列訓(xùn)練過程中的梯度消失和梯度爆炸問題。簡單來說,就是相比普通的RNN,LSTM能夠在更長的序列中有更好的表現(xiàn)。

      LSTM內(nèi)部主要有三個階段,對應(yīng)三個門:

      忘記階段。這個階段主要是對上一個節(jié)點傳進來的信息進行選擇性忘記。簡單來說就是會 “忘記不重要的,記住重要的”。具體來說是通過計算得到的Zf(f表示forget)來作為忘記門控,來控制上一個狀態(tài)的Ct-1?哪些需要留哪些需要忘。

      選擇記憶階段。將這個階段的輸入有選擇性地進行“記憶”。主要是會對輸入Xt?進行選擇記憶。哪些重要則著重記錄下來,哪些不重要,則少記一些。當前的輸入內(nèi)容由前面計算得到的z?表示。而選擇的門控信號則是由zi?(i代表information)來進行控制。

      將上面兩步得到的結(jié)果相加,即可得到傳輸給下一個狀態(tài)的?Ct?。也就是上圖中的第一個公式。

      輸出階段。這個階段將決定哪些將會被當成當前狀態(tài)的輸出。主要是通過Zo?來進行控制的。并且還對上一階段得到的Co?進行了放縮(通過一個tanh激活函數(shù)進行變化)。

      與普通RNN類似,輸出?yt?往往最終也是通過?ht?變化得到。

      l? RNN梯度消失和LSTM怎么緩解該問題的

      “LSTM 能解決梯度消失/梯度爆炸”是對 LSTM 的經(jīng)典誤解。這里我先給出幾個粗線條的結(jié)論,詳細的回答以后有時間了再擴展:

      1、首先需要明確的是,RNN 中的梯度消失/梯度爆炸和普通的 MLP 或者深層 CNN 中梯度消失/梯度爆炸的含義不一樣。MLP/CNN 中不同的層有不同的參數(shù),各是各的梯度;而 RNN 中同樣的權(quán)重在各個時間步共享,最終的梯度 g = 各個時間步的梯度 g_t 的和。

      2、由 1 中所述的原因,RNN 中總的梯度是不會消失的。即便梯度越傳越弱,那也只是遠距離的梯度消失,由于近距離的梯度不會消失,所有梯度之和便不會消失。RNN 所謂梯度消失的真正含義是,梯度被近距離梯度主導(dǎo),導(dǎo)致模型難以學(xué)到遠距離的依賴關(guān)系。

      3、LSTM 中梯度的傳播有很多條路徑, 這條路徑上只有逐元素相乘和相加的操作,梯度流最穩(wěn)定;但是其他路徑(例如 )上梯度流與普通 RNN 類似,照樣會發(fā)生相同的權(quán)重矩陣反復(fù)連乘。

      4、LSTM 剛提出時沒有遺忘門,或者說相當于?ft=1?,這時候在 直接相連的短路路徑上, ?,從而這條路徑上的梯度暢通無阻,不會消失。類似于 ResNet 中的殘差連接。

      5、但是在其他路徑上,LSTM 的梯度流和普通 RNN 沒有太大區(qū)別,依然會爆炸或者消失。由于總的遠距離梯度 = 各條路徑的遠距離梯度之和,即便其他遠距離路徑梯度消失了,只要保證有一條遠距離路徑(就是上面說的那條高速公路)梯度不消失,總的遠距離梯度就不會消失(正常梯度 + 消失梯度 = 正常梯度)。因此 LSTM 通過改善一條路徑上的梯度問題拯救了總體的遠距離梯度。

      6、同樣,因為總的遠距離梯度 = 各條路徑的遠距離梯度之和,高速公路上梯度流比較穩(wěn)定,但其他路徑上梯度有可能爆炸,此時總的遠距離梯度 = 正常梯度 + 爆炸梯度 = 爆炸梯度,因此?LSTM 仍然有可能發(fā)生梯度爆炸。不過,由于 LSTM 的其他路徑非常崎嶇,和普通 RNN 相比多經(jīng)過了很多次激活函數(shù)(導(dǎo)數(shù)都小于 1),因此?LSTM 發(fā)生梯度爆炸的頻率要低得多。實踐中梯度爆炸一般通過梯度裁剪來解決。

      7、對于現(xiàn)在常用的帶遺忘門的 LSTM 來說,6 中的分析依然成立,而 5 分為兩種情況:其一是遺忘門接近 1(例如模型初始化時會把 forget bias 設(shè)置成較大的正數(shù),讓遺忘門飽和),這時候遠距離梯度不消失;其二是遺忘門接近 0,但這時模型是故意阻斷梯度流的,這不是 bug 而是 feature(例如情感分析任務(wù)中有一條樣本 “A,但是 B”,模型讀到“但是”后選擇把遺忘門設(shè)置成 0,遺忘掉內(nèi)容 A,這是合理的)。當然,常常也存在 f 介于 [0, 1] 之間的情況,在這種情況下只能說 LSTM 改善(而非解決)了梯度消失的狀況。

      8、最后,別總是抓著梯度不放。梯度只是從反向的、優(yōu)化的角度來看的,多從正面的、建模的角度想想 LSTM 有效性的原因。

      l? Encoder-Decoder框架

      雖然LSTM確實能夠解決序列的長期依賴問題,但是對于很長的序列(長度超過30),LSTM效果也難以讓人滿意,這時我們需要探索一種更有效的方法,即注意力機制(attention mechanism)。在介紹注意力機制前,我們先了解一種常用的框架:Encoder-Decoder框架。

      在上文的討論中,我們均考慮的是輸入輸出序列等長的問題,然而在實際中卻大量存在輸入輸出序列長度不等的情況,如機器翻譯、語音識別、問答系統(tǒng)等。這時我們便需要設(shè)計一種映射可變長序列至另一個可變長序列的RNN網(wǎng)絡(luò)結(jié)構(gòu),Encoder-Decoder框架呼之欲出。

      Encoder-Decoder框架是機器翻譯(Machine Translation)模型的產(chǎn)物,其于2014年Cho et al.在Seq2Seq循環(huán)神經(jīng)網(wǎng)絡(luò)中首次提出。在統(tǒng)計翻譯模型中,模型的訓(xùn)練步驟可以分為預(yù)處理、詞對齊、短語對齊、抽取短語特征、訓(xùn)練語言模型、學(xué)習(xí)特征權(quán)重等諸多步驟。而Seq2Seq模型的基本思想非常簡單一一使用一個循環(huán)神經(jīng)網(wǎng)絡(luò)讀取輸入句子,將整個句子的信息壓縮到一個固定維度(注意是固定維度,下文的注意力集中機制將在此做文章)的編碼中;再使用另一個循環(huán)神經(jīng)網(wǎng)絡(luò)讀取這個編碼,將其“解壓”為目標語言的一個句子。這兩個循環(huán)神經(jīng)網(wǎng)絡(luò)分別稱為編碼器(Encoder)和解碼器(Decoder),這就是 encoder-decoder框架的由來。

      l? 注意力機制

      注意力機制的主要亮點在于對于seq2seq模型中編碼器將整個句子壓縮為一個固定長度的向量?C?,而當句子較長時其很難保存足夠的語義信息,而Attention允許解碼器根據(jù)當前不同的翻譯內(nèi)容,查閱輸入句子的部分不同的單詞或片段,以提高每個詞或者片段的翻譯精確度。具體做法為解碼器在每一步的解碼過程中,將查詢編碼器的隱藏狀態(tài)。對于整個輸入序列計算每一位置(每一片段)與當前翻譯內(nèi)容的相關(guān)程度,即權(quán)重。再根據(jù)這個權(quán)重對各輸入位置的隱藏狀態(tài)進行加權(quán)平均得到“context”向量(Encoder-Decoder框架向量?C?),該結(jié)果包含了與當前翻譯內(nèi)容最相關(guān)的原文信息 。同時在解碼下一個單詞時,將context作為額外信息輸入至RNN中,這樣網(wǎng)絡(luò)可以時刻讀取原文中最相關(guān)的信息,而不必完全依賴于上一時刻的隱藏狀態(tài)。對比seq2seq,Attention本質(zhì)上是通過加權(quán)平均,計算可變的上下文向量?C?。

      語音識別(語音識別轉(zhuǎn)文字)

      l? Transformer

      (https://www.zhihu.com/question/337886108/answer/893002189)

      l? Conformer

      基于Transformer模型(善于捕捉長序列依賴)和CNN(局部信息,邊緣以及形狀)的優(yōu)勢,以及它們的缺陷Transformer(提取細粒度的局部特征圖案的能力較弱)CNN(局部連接的限制是需要更多地層或者參數(shù)量才能去捕捉全局信息)。

      Transformer在提取長序列依賴的時候更有效,而卷積則是擅長提取局部特征。Conformer將兩者結(jié)合起來。

      ?? CTC

      傳統(tǒng)的語音識別的聲學(xué)模型訓(xùn)練,對于每一幀的數(shù)據(jù),需要知道對應(yīng)的label才能進行有效的訓(xùn)練,在訓(xùn)練數(shù)據(jù)之前需要做語音對齊的預(yù)處理。而語音對齊的過程本身就需要進行反復(fù)多次的迭代,來確保對齊更準確,這本身就是一個比較耗時的工作。與傳統(tǒng)的聲學(xué)模型訓(xùn)練相比,采用CTC作為損失函數(shù)的聲學(xué)模型訓(xùn)練,是一種完全端到端的聲學(xué)模型訓(xùn)練,不需要預(yù)先對數(shù)據(jù)做對齊,只需要一個輸入序列和一個輸出序列即可以訓(xùn)練。這樣就不需要對數(shù)據(jù)對齊和一一標注,并且CTC直接輸出序列預(yù)測的概率,不需要外部的后處理。既然CTC的方法是關(guān)心一個輸入序列到一個輸出序列的結(jié)果,那么它只會關(guān)心預(yù)測輸出的序列是否和真實的序列是否接近(相同),而不會關(guān)心預(yù)測輸出序列中每個結(jié)果在時間點上是否和輸入的序列正好對齊。CTC引入了blank(該幀沒有預(yù)測值),每個預(yù)測的分類對應(yīng)的一整段語音中的一個spike(尖峰),其他不是尖峰的位置認為是blank。對于一段語音,CTC最后的輸出是spike(尖峰)的序列,并不關(guān)心每一個音素持續(xù)了多長時間。

      l? 個人理解

      CTC是一種損失函數(shù)

      我想說的第一個就是CTC是一種損失函數(shù),它對網(wǎng)絡(luò)結(jié)構(gòu)的改變就是在最后輸出層多加了一類,即多加了一個節(jié)點,其他部分與聲學(xué)模型的結(jié)構(gòu)可以完全一樣。一句話表明CTC作為損失函數(shù)所優(yōu)化的目標就是使所有可能映射到正確label的序列概率之和最大。怎么理解呢?語音識別本質(zhì)上是一個序列標注的問題,但是其最大的難點在于輸入的長度T是遠大于輸出的長度U的。如果T=U,那么問題就很簡單了,每幀輸出都有l(wèi)abel,直接對每幀使用交叉熵損失函數(shù)(CE)來進行優(yōu)化,然后對所有幀求和,比如詞性標注任務(wù)。那么T>U怎么辦呢?這里很自然的一個想法就是把U變長了,我理解傳統(tǒng)方法和CTC就是兩種不同的變長U的方法。(基于注意力機制的端到端模型是把T變短,思路不一樣)

      第一種傳統(tǒng)語音識別中的辦法是將標簽中的字重復(fù),因為很顯然一個字的持續(xù)時間不止一幀,所以我們可以把好幾幀的label都標注為同一個字,最終讓U和T一樣長。但是按照上述以字作為建模單元的方法效果會非常差,因為一幀的語音包含的信息非常有限,我們希望每一幀的label應(yīng)該是能反映該幀聲學(xué)信息的單元。于是我們需要把每個標簽按照發(fā)音學(xué)特性劃分成顆粒度更小的單元,比如中文標簽是字,那就繼續(xù)劃分為音節(jié),音素,狀態(tài)。實驗發(fā)現(xiàn)劃分到狀態(tài)一級是比較理想的。經(jīng)過一系列操作之后,輸入仍然會比輸出長,要想使T=U,另外一個問題就是無法確定每個狀態(tài)對應(yīng)的是哪幾幀。于是傳統(tǒng)語音識別方法中有一個強制對齊的過程得到每個狀態(tài)的位置信息,即每一幀對應(yīng)的狀態(tài)級標簽是什么,最后使得T=U。之后便可以訓(xùn)練一個幀級別的分類器(GMM或者DNN)得到每幀的類別后驗概率分布了,也就是傳統(tǒng)方法中的聲學(xué)模型部分。

      第二種辦法就是CTC的方法,除了可以將標簽中的字進行重復(fù)以外,CTC方法在長度為U的序列中間插入一些符號使得輸入輸出一樣長。這個符號就是空白(blank)類別。加入空白類別的好處是我們可以不需要對字的建模單元繼續(xù)切分了,因為在對當前幀無法判斷或者判斷不準確的時候,我們可以輸出一個空白標簽,由于網(wǎng)絡(luò)結(jié)構(gòu)一般使用RNN等遞歸神經(jīng)網(wǎng)絡(luò),每一幀都會保留前面幀的歷史信息,當?shù)竭_某個字的結(jié)束幀時,網(wǎng)絡(luò)完全能夠獲得這個字的所有聲學(xué)信息,因此可以給出比較準確的label。所以CTC方法可以使用更大的建模單元。但是加入空白標簽和重復(fù)標簽的序列是有很多種的,每一個T=U的序列作為label都可以和網(wǎng)絡(luò)的輸出概率分布計算一個交叉熵的損失函數(shù),所以CTC的損失函數(shù)就是將所有這些可以使T=U的序列作為label之后計算的損失函數(shù)進行求和。由于這樣的序列有很多,使用常規(guī)計算方法時間復(fù)雜度很高,所以使用動態(tài)規(guī)劃即很多回答中提到的前向后向算法計算這個損失函數(shù)。在解碼時,直接把空白和重復(fù)去掉就能得到識別的文本序列了。

      端到端具體指什么(CTC算不算端到端?)

      首先我想說我認為CTC并不能算端到端的方法(個人看法),但是它具有很多端到端模型的特性,并且向大家展現(xiàn)了端到端方法的可行性,為端到端方法提供了很好的指導(dǎo)。為什么CTC不算端到端模型呢?我覺得有以下幾個原因:

      依賴語言模型

      首先我們回顧一下端到端語音識別方法的定義,它是指能夠使用一個單一的神經(jīng)網(wǎng)絡(luò)直接將輸入的語音特征(如果更嚴格的話是wav)轉(zhuǎn)化為輸出文本的網(wǎng)絡(luò),它能夠?qū)⒙晫W(xué)模型,語言模型和發(fā)音模型融合在一起,簡化傳統(tǒng)語音識別中的復(fù)雜過程。盡管如此,端到端模型還是會依賴語言模型的,因為通常帶有文本的語音數(shù)據(jù)的數(shù)據(jù)量往往是遠小于純文本的數(shù)據(jù)量的,盡管端到端模型能夠?qū)W習(xí)到語言模型特性,但是由于數(shù)據(jù)量的原因,使用一個更大的文本數(shù)據(jù)集訓(xùn)練的更好的語言模型會對端到端模型有所提升。而CTC方法對于語言模型的依賴并不單單是數(shù)據(jù)量的原因,CTC中每幀的輸出是相互獨立的,這是CTC方法本身的一個缺陷。換句話說,CTC外加語言模型的收益會遠大于端到端模型(RNN-T,LAS)。它對語言模型的依賴與端到端模型對語言模型的依賴不一樣,依賴的程度也不同。

      有時需要詞典

      端到端模型方法中不需要發(fā)音詞典是因為可以使用更大的建模單元,比如漢字,網(wǎng)絡(luò)能夠直接輸出我們所需要的單元,因此不需要發(fā)音詞典。CTC方法當然也可以使用更大的建模單元,但是對于中文的語音識別,會發(fā)現(xiàn)基于音素的建模單元會或得更好的效果,因此在這種情況下,CTC方法需要同時使用發(fā)音詞典和語言模型,解碼則需要基于WFST構(gòu)建解碼網(wǎng)絡(luò),與傳統(tǒng)的語音識別方法類似,并沒有達到端到端方法的效果。

      l? CTC損失

      (https://xiaodu.io/ctc-explained/)

      建立從預(yù)測結(jié)果(編碼,有blank,重復(fù)的詞)到句子(解碼后)的多對一關(guān)系。即有多個路徑能得到同一個句子。在每一時刻輸出是條件獨立的情況下,預(yù)測為某一句子的概率就等于多個解碼后為該句子的預(yù)測結(jié)果概率之和。CTC使用前向和后向算法,通過動態(tài)規(guī)劃計算每條路徑的概率。再反向傳播計算梯度時,也能利用前向概率和后向概率計算梯度,進而減少計算成本。

      l? CTC的解碼方式

      (https://blog.csdn.net/weixin_42615068/article/details/93767781)

      (http://placebokkk.github.io/asr/2020/02/01/asr-ctc-decoder.html#prefix-beam-search%E7%9A%84%E7%AC%94%E8%AE%B0)

      ?? 解碼

      l? 貪心搜索 (greedy search)

      Greedy search 是在每一步選擇概率最大的輸出值,這樣就可以得到最終解碼的輸出序列。然而,CTC網(wǎng)絡(luò)的輸出序列只對應(yīng)了搜索空間的一條路徑,一個最終標簽可對應(yīng)搜索空間的N條路徑,所以概率最大的路徑并不等于最終標簽的概率最大,即不是最優(yōu)解,這是因為最終標簽的概率是所有可達路徑的概率和。

      l? 束搜索(Beam Search)

      貪心搜索的性能非常受限, 這種方法忽略了一個輸出可能對應(yīng)多個對齊結(jié)果。很多時候,如果我們能拿到nearbest的路徑,后續(xù)可以利用其他信息來進一步優(yōu)化搜索的結(jié)果。束搜索能近似找出 top 最優(yōu)的若干條路徑。

      基本原理是通過t i ? 1 中beamsize 個序列,每個序列分別連接t i中所有節(jié)點(字典大小),得到 beamsize個新序列及對應(yīng)的score,然后按照score從大到小的順序選出前beamSize個序列,依次推進。

      l? Prefix Search Decoding

      CTC Prefix Search Decoding本質(zhì)是貪心算法,每一次搜索都會選取“前綴概率”最大的節(jié)點擴展,直到找到最大概率的目標label,它的核心是利用動態(tài)規(guī)劃算法計算“前綴概率”。下面先通過一個簡單的例子來介紹CTC Prefix Search Decoding的大致過程。

      如上圖例子,CTC Prefix Search搜索過程:

      初始化最佳序列l(wèi)*為空集,最佳序列的概率p(l*)。把根節(jié)點放入到擴展集合中,初始化它的前綴概率為1.0,初始化p(l*)=0。

      從擴展集合中選取前綴概率最大的節(jié)點擴展,擴展子節(jié)點a和b,計算a和b的前綴概率(上圖中第一層節(jié)點a和b的前綴概率分別為0.7和0.2),如果前綴概率大于p(l*)則將其加入到擴展集合。同時,計算結(jié)束節(jié)點的概率(上圖中第一層節(jié)點$的概率為0.1),如果結(jié)束節(jié)點的概率大于p(l*),則將其對應(yīng)的label設(shè)置為最佳序列l(wèi)*,同時更新p(l*)。

      繼續(xù)搜索,重復(fù)步驟2,直到擴展集合為空,即搜索結(jié)束,輸出最終解碼的l*和概率p(l*)。(上圖中最終,l*=ab, p(l*)=0.3)

      l? 前綴束搜索(Prefix Beam Search)

      基本的思想是將記錄prefix的時候不在記錄raw sequence(模型在每個時間點輸出的字符組成的字符串),而是記錄去掉blank和duplicate的sequence。前綴束搜索(Prefix Beam Search)方法,可以在搜索過程中不斷的合并相同的前綴。

      prefix beam search基本思想:

      在每個時刻t,計算所有當前可能輸出的規(guī)整字符串(即去除連續(xù)重復(fù)和blank的字符串)的概率。

      因為t時刻的字符串長度最長為t,所有候選的當前所有可能的解碼字符串個數(shù)是C^t,其中C是字符詞典大小。 該值隨著t的增大而增大,

      用beam search的方法,在每個時刻選取最好的N個路徑,從而將每個時間點t上的搜索空間變?yōu)闉槌?shù)。

      針對超多類別的分類問題

      ?? 人臉識別的loss

      L-softmax;A-softmax;AM-softmax

      A-Softmax與L-Softmax的最大區(qū)別在于A-Softmax的權(quán)重歸一化了,而L-Softmax則沒的。A-Softmax權(quán)重的歸一化導(dǎo)致特征上的點映射到單位超球面上,而L-Softmax則不沒有這個限制,這個特性使得兩者在幾何的解釋上是不一樣的。如圖10所示,如果在訓(xùn)練時兩個類別的特征輸入在同一個區(qū)域時,如下圖10所示。A-Softmax只能從角度上分度這兩個類別,也就是說它僅從方向上區(qū)分類,分類的結(jié)果如圖11所示;而L-Softmax,不僅可以從角度上區(qū)別兩個類,還能從權(quán)重的模(長度)上區(qū)別這兩個類,分類的結(jié)果如圖12所示。在數(shù)據(jù)集合大小固定的條件下,L-Softmax能有兩個方法分類,訓(xùn)練可能沒有使得它在角度與長度方向都分離,導(dǎo)致它的精確可能不如A-Softmax。

      機器學(xué)習(xí) 語音通話

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:辦公室oa管理系統(tǒng)(1分鐘之前已更新)
      下一篇:如何做一個表格并打印出來(怎么做一個表格打印出來)
      相關(guān)文章
      亚洲成人黄色在线| 亚洲成a人一区二区三区| 亚洲成a人在线看天堂无码| 91亚洲自偷在线观看国产馆| 亚洲高清在线视频| 亚洲国产精品无码av| 亚洲AV无码成人精品区蜜桃| 亚洲成a人片在线观看日本| 亚洲综合国产一区二区三区| 国产亚洲一区二区在线观看| 亚洲精品国产品国语在线| 亚洲精品无码不卡在线播放HE | 亚洲卡一卡2卡三卡4麻豆| 亚洲欧洲尹人香蕉综合| 亚洲码一区二区三区| 亚洲国产成人久久77| 亚洲女人初试黑人巨高清| 亚洲人成综合在线播放| 亚洲av永久综合在线观看尤物| 亚洲av永久综合在线观看尤物| 亚洲综合精品第一页| 亚洲av成人片在线观看| 国产亚洲福利精品一区二区| 亚洲国产成人久久综合区| 亚洲综合精品网站| 国产亚洲一区二区手机在线观看| 亚洲AV区无码字幕中文色| 青青草原精品国产亚洲av| 4480yy私人影院亚洲| 国产成人精品日本亚洲直接| 亚洲欧美aⅴ在线资源| 亚洲国产精品无码久久青草| 国产午夜亚洲精品午夜鲁丝片| 亚洲熟女少妇一区二区| 色婷婷六月亚洲婷婷丁香| 亚洲欧洲校园自拍都市| 亚洲一区二区三区写真 | 国产av天堂亚洲国产av天堂| 亚洲一区二区三区电影| 亚洲国产最大av| 婷婷亚洲综合一区二区|