可解釋的卷積濾波器 SincNet

可解釋的卷積濾波器 SincNet

Ravanelli, M. 在 NIPS 2018 進一步討論了 SincNet 可解釋意義,令人感覺該模型已經能夠勝任在說話人識別的基礎上勝任更多的語音處理任務。因此,在先前的 SincNet 講解基礎上,筆者進一步分析 SincNet 的可解釋性、相關的無監督方法和潛在的安全威脅。

Notes from Speaker Recognition from Raw Waveform with SincNet:

In particular, we propose SincNet, a novel Convolutional Neural Network (CNN) that encourages the first layer to discover more meaningful filters by exploiting parametrized sinc functions.

This inductive bias offers a very compact way to derive a customized filter-bank front-end, that only depends on some parameters with a clear physical meaning.

The proposed architecture converges faster, performs better, and is more interpretable than standard CNNs.

摘要

2018 年以後,SincNet 具有更快的收斂速度、更佳的表示能力和更好的可解釋性,但也暴露出其對抗攻擊的脆弱性。筆者詳細分析 SincNet 四部分:設計原理、可解釋性、無監督學習應用和對抗攻擊。考慮到 SincNet 在頻域方面的物理意義,它將爲語音處理應用的研發提供極大的便利,例如說話人識別與語音識別。

SincNet 設計

先前的 SincNet 講解基礎上,該部分着重分析參數化濾波器的設計,及其相關物理含義。值得重視的是:信號處理技術中的帶通濾波器是啓發 SincNet 設計的主要來源,因此,筆者從帶通濾波器的角度來描述參數化濾波器的設計原理。

sincnet-filter

爲了更好的理解參數化濾波器的設計原理,可以通過傳統卷積函數中的一維卷積來看待該濾波器,例如 PyTorch 的 nn.Conv1d。在此基礎上,可以任務該濾波器就是一個長度爲 LL 的一維向量,這些向量的權重,可以通過參數更新的方法學習獲得。

根據上圖給出第一行圖片,可以理解爲三個不同的一維卷積 c={ci}i=0250\mathbb{c}=\{c_i\}_{i=0}^{250},它們的長度都爲 L=251L=251。通過這樣的數學符號,可以將其與二維卷積直接聯繫起來。簡單來說,SincNet 帶通濾波器就是一種特定的一維卷積。

那麼如何設計這樣一個特定的一維卷積函數呢?**直覺地,讓濾波器去學習特定頻域範圍內的信息。**爲設計這樣的濾波器,需要了解一下內容:

  1. 爲什麼希望 SincNet 參數化濾波器來學習特定頻率範圍的內容?

    • 問題:音調和基頻是幫助識別說話人身份的重要線索,也是非常重要且具有物理含義的聲學特性。Mel-Scale 濾波器組提供了提取這類信息類似的功能。然而,傳統的頻譜提取方法,例如 MFCC、PLP、FBANK 等,是依據以往經驗提取的信號信息,無法直接證明這些信息的所有組成成分都是有利於特定語音處理任務的。
    • SincNet 參數化濾波器:爲了適應特定的語音處理任務,設計可學習的濾波器,來替換人工提取的濾波器組或者頻譜相關係數。因此,該學習濾波器滿足一下設計要求:
      • 處理原始信號:在深度學習框架中,它位於與原始波形直接關聯的位置,即網絡第一層,替代 MFCC、FBANK 或者 PLP 的功能。
      • 提取頻率相關的信息:頻譜分析提供了非常重要的信息,例如音調和基頻,或者特定頻帶的信息。
      • 要具有物理含義:“數字信號處理”從物理的角度提供了大量的數字信號濾波器設計相關的知識,例如高通濾波器、低通濾波器、帶通濾波器等。
  2. 爲什麼帶通濾波器可以學習特定頻率範圍內的內容?

    • 帶通濾波器:在“數字信號處理”領域,帶通濾波器的屬性是讓特定頻帶(連續頻率範圍)的數字信號通過。上圖的第二行描述了三種帶通濾波器的頻域特性——通帶。它往往可以用於噪聲過濾,例如高頻噪聲過濾。

    • 數字信號:在“數字信號處理”領域,有一個關於傅里葉的觀點:**任何周期函數,都可以看作是不同振幅,不同相位正弦波的疊加。**就像在“高等數學”的範疇下,把一個周期函數展開成傅里葉級數。

      根據經驗,把說話人的語音看作一個週期信號是可行的,

      或者說,忽略語音信號的非週期成分不會顯著影響語音處理效果。

    • 通過與衰減:根據傅里葉理論,帶通濾波器將通帶以外的頻率都衰減掉了,而留下的通帶內的頻率。

  3. 如何設計這樣的濾波器?

    • c={ci}i=0250\mathbb{c}=\{c_i\}_{i=0}^{250}:爲了使一維卷積滿足帶通濾波器的特性,需要構建與兩個截至頻(低、高)相關的參數化模型。這裏已知濾波器頻域特性,可以通過逆向傅里葉變換來獲得濾波器 g(n,f1,f2)g(n,f_1,f_2) 在頻域上的參數 (f1f_1f2f_2),相應的數學公式爲:

      g(n,f1,f2)=2f2sinc(2πf2n)2f1sinc(2πf1n)g(n,f_1,f_2)=2f_2\text{sinc}(2\pi f_2 n)-2f_1\text{sinc}(2\pi f_1 n)

      其中 nn 表示濾波器長度 LL,上圖中,n=L=251n=L=251

    • 窗函數 (window):帶通濾波器的矩形窗特性無法通過有限的傅里葉成分精準的描述,且這樣的矩形窗特性存在突變不連續性。爲此,“數字信號處理”領域採用 window 來克服。

根據上述原理,帶通濾波器的一維卷積提供了一種提取信號特定頻率範圍信息的功能,它的截至頻的可學習的特性,使得該一維卷積可以通過數據來自適應地學到帶通濾波器的通帶。本質上,SincNet 的參數化濾波器是借鑑了帶通濾波器的設計,並使其可學習化。

SincNet 中第一層濾波器,即參數話帶通濾波器,其精簡後的代碼(完整代碼參考鏈接)如下。特別地,SincNet 的輸入語音通常採用 200 ms 長與 10 ms 間隔的採樣方式。

class SincConv_fast(nn.Module):
    @staticmethod
    def to_mel(hz):
        return 2595 * np.log10(1 + hz / 700)

    @staticmethod
    def to_hz(mel):
        return 700 * (10 ** (mel / 2595) - 1)

    def __init__(self, out_channels, kernel_size, sample_rate=16000, in_channels=1,
                 stride=1, padding=0, dilation=1, bias=False, groups=1, min_low_hz=50, min_band_hz=50):
        super(SincConv_fast,self).__init__()
        self.out_channels = out_channels
        self.kernel_size = kernel_size
        # Forcing the filters to be odd (i.e, perfectly symmetrics)
        if kernel_size%2==0:
            self.kernel_size=self.kernel_size+1
        self.stride = stride
        self.padding = padding
        self.dilation = dilation
        self.sample_rate = sample_rate
        self.min_low_hz = min_low_hz
        self.min_band_hz = min_band_hz

        # initialize filterbanks such that they are equally spaced in Mel scale
        low_hz = 30
        high_hz = self.sample_rate / 2 - (self.min_low_hz + self.min_band_hz)

        mel = np.linspace(self.to_mel(low_hz),
                          self.to_mel(high_hz),
                          self.out_channels + 1)
        hz = self.to_hz(mel)
        
        # filter lower frequency (out_channels, 1)
        self.low_hz_ = nn.Parameter(torch.Tensor(hz[:-1]).view(-1, 1))

        # filter frequency band (out_channels, 1)
        self.band_hz_ = nn.Parameter(torch.Tensor(np.diff(hz)).view(-1, 1))

        # Hamming window
        # computing only half of the window
        n_lin=torch.linspace(0, (self.kernel_size/2)-1, steps=int((self.kernel_size/2))) 
        self.window_=0.54-0.46*torch.cos(2*math.pi*n_lin/self.kernel_size);

        # (1, kernel_size/2)
        n = (self.kernel_size - 1) / 2.0
        # Due to symmetry, I only need half of the time axes
        self.n_ = 2*math.pi*torch.arange(-n, 0).view(1, -1) / self.sample_rate 

    def forward(self, waveforms):
        self.n_ = self.n_.to(waveforms.device)
        self.window_ = self.window_.to(waveforms.device)
        low = self.min_low_hz  + torch.abs(self.low_hz_)
        high = torch.clamp(low + self.min_band_hz + torch.abs(self.band_hz_),self.min_low_hz,self.sample_rate/2)
        band=(high-low)[:,0]
        
        f_times_t_low = torch.matmul(low, self.n_)
        f_times_t_high = torch.matmul(high, self.n_)

        # Equivalent of Eq.4 of the reference paper (SPEAKER RECOGNITION FROM RAW WAVEFORM WITH SINCNET). 
        # I just have expanded the sinc and simplified the terms. This way I avoid several useless computations. 
        band_pass_left=((torch.sin(f_times_t_high)-torch.sin(f_times_t_low))/(self.n_/2))*self.window_ 
        band_pass_center = 2*band.view(-1,1)
        band_pass_right= torch.flip(band_pass_left,dims=[1])
        band_pass=torch.cat([band_pass_left,band_pass_center,band_pass_right],dim=1)
        band_pass = band_pass / (2*band[:,None])

        self.filters = (band_pass).view(
            self.out_channels, 1, self.kernel_size)

        return F.conv1d(waveforms, self.filters, stride=self.stride,
                        padding=self.padding, dilation=self.dilation,
                         bias=None, groups=1) 

SincNet 可解釋性

帶通濾波器源自數字信號處理,這使得 SincNet 第一層濾波器具有很好的可解釋性,在頻率上的可解釋意義。

頻域上的物理意義

  • SincNet 第一層濾波器,即參數化、可學習的帶通濾波器,複製了帶通濾波器的特性與功能,因此,它的物理意義可以與帶通濾波器相當——一維卷積的截至頻 f1f_1f2f_2 表示了特定任務所需的頻域信息。

  • 與二維卷積相同,SincNet 可以同時學習多個一維卷積,例如 SincNet 第一層濾波器是 80 個,這就使得該帶通濾波器組具有物理統計意義——累積頻率響應(下圖紅色實線 SincNet),即將 80 個濾波器組的通帶累加,並歸一化。此外,先前的 SincNet 講解描述了 SincNet 相比較其與 CNN 學習的優勢。

  • 在累積頻率響應的基礎上,可以發現特定頻率的信息對特定任務的重要性——佔比小/歸一化累積值低的頻域範圍的(針對任務的)重要性較低,例如下圖 2 kHz - 2.5 kHz。

    image-20200522171830073

噪聲場景的解釋

噪聲場景的語音處理任務是常見的問題,通常設計噪聲魯棒的表示學習和遠距離/遠場的語音處理,包含語音識別和說話人識別。

image-20200522185825213

針對人爲的特定頻帶的噪聲,如上時頻譜圖,2 kHz - 2.5kHz 範圍內有一個噪聲。SincNet 可以更早(對比CNN)避免噪聲帶寬,如下圖 1 小時訓練後的累積頻率響應。

image-20200522190103313

基於 SincNet 無監督學習

根據 SincNet 作爲說話人的緊湊表示形式,Ravanelli, M. 將其作爲語音編碼器,建立了一種無監督學習方法——Local Info Max (LIM)。在 TIMIT、Librispeech 與 VoxCeleb1 三個語料上,LIM 的性能超過了多種監督學習技術,該結論意味着一種潛在的可能:無監督學習方法獲得的說話人嵌入,可以獲得與監督學習更優或者相當的結果。

image-20200522192704254

此外,在 LIM 的研究中,Ravanelli, M. 建立了兩個巧妙假設:

  1. 兩個隨機的語音段可能屬於不同的說話人
  2. 每一段語音僅包含當個說話人。

第 2 個假設在常見的訓練集中,通常都是成立的,因爲大多數語音段都是按照不同說話人劃分的;而第 1 個假設並不一定成立,特別是在每個說話人都包含大量語音段都時候,有可能來個隨機的語音段可能屬於相同的說話人,其概率大致爲 (n1)/(m1)(n-1)/(m-1),其中 nn 爲訓練集中該說話人擁有的語音段數,mm 爲總的語音段數。例如 n=101,m=10001n=101,m=10001,兩個不同的語音段選擇到同一說話人的概率爲 0.10.1,即

(1011)/(100011)=100/10000=0.01(101-1)/(10001-1)=100/10000=0.01

由此可知,這一假設在“多目標說話人鑑別”或者大規模數據集中,其概率非常小,**這意味着假設 1 是顯著可行的。**根據這兩個假設,可以進一步形成一類無監督/自監督學習方法。

值得注意的是,本文采用了互信息 (Mutual Information, MI) 作爲測量兩個隨機變量距離的方法,它不僅可以用作無監督學習的優化目標,仍可以作爲監督學習模式的正則器。此外,MI 與判別器優化目標的一致性(都是最大化),使得該學習模型的優化過程相對容易,不會產生類似 GANs 的 min-max 博弈的優化問題。

這裏列出 MI 數學模型 MI(z1,z2)MI(z_1,z_2) 和最簡單有效的判別器損失 binary cross-entropy (BCE) L(Θ,Φ)L(\Theta,\Phi) 分別爲:

MI(z1,z2)=z1z2p(z1,z2)log(p(z1,z2)p(z1)p(z2))dz1dz2=DKL(p(z1,z2)p(z1)p(z2)),MI(z_1,z_2)=\int_{z_1}\int_{z_2}p(z_1,z_2)\log\left(\frac{p(z_1,z_2)}{p(z_1)p(z_2)}\right)d_{z_1}d_{z_2}=D_{KL}(p(z_1,z_2)\Vert p(z_1)p(z_2)),

L(Θ,Φ)=EXp[log(g(z1,z2))]+EXn[1log(g(z1,zrnd))].L(\Theta,\Phi)=\mathbb{E}_{X_p}\left[\log(g(z_1,z_2))\right]+\mathbb{E}_{X_n}\left[1-\log(g(z_1,z_{rnd}))\right].

SincNet 對抗樣本

研究說話人識別的對抗攻擊具有兩個主要應用:

  1. 攻擊應用:在非系統期望的情況下,擾動說話人識別系統;

  2. 防禦應用:幫助改善說話人識別系統的性能與魯棒性。

考慮到 SincNet 是以原始波形作爲輸入,因而對抗攻擊生成的擾動可以直接作用在原始波形上,產生攻擊行爲,這意味着 SincNet 的對抗攻擊是可實現的,研究 SincNet 的對抗攻擊具有必要性。

攻擊者行爲如下圖所示,從模型的角度,攻擊行爲是建立一個攻擊者模型,該模型在原始波形上加入對抗擾動,從而產生目標模型的誤分類效果。其中攻擊模型採用 adversarial transformation networks (ATNs),該模型無需測試階段的梯度信息。

image-20200522201147549

另一方面,對抗攻擊加入的擾動會對原有的聲音造成影響,因此,單純採用 L2L_2 距離來衡量對抗擾動量並不合理,Li, J. 引入“心理聲學” (psychoacoustic) 的感知質量和噪聲擾動量來評價語音變化,具體地,PESQ (Perceptual Evaluation of Speech Quality) 與 SNR (Signal-to-Noise Ratio)。Non-targeted 攻擊實現 99.2% 分類誤差,擾動條件高達 57.2 dB SNR 與 4.2 PESQ。

image-20200522202705104

根據擾動的頻譜分佈可知,如上圖,高頻段(7 kHz - 8 kHz)較爲顯著,這一信息可以結合 SincNet 濾波器組的累積頻率響應曲線進行分析,但論文中並未做進一步的研究。

參考文獻

本文中的所有圖片來自參考文獻。

  1. Ravanelli, M., Bengio, Y., 2019. Speaker Recognition from Raw Waveform with SincNet, in: Proceedings of 2018 IEEE Spoken Language Technology Workshop (SLT). IEEE, Athens, Greece, pp. 1021–1028. https://doi.org/10.1109/SLT.2018.8639585
  2. Ravanelli, M., Bengio, Y., 2018. Interpretable Convolutional Filters with SincNet, in: 32nd Conference on Neural Information Processing Systems (NIPS 2018) IRASL Workshop. Montréal, Canada.
  3. Ravanelli, M., Bengio, Y., 2019. Learning speaker representations with mutual information, in: Proceedings of the Annual Conference of the International Speech Communication Association, INTERSPEECH. Graz, Austria, pp. 1153–1157. https://doi.org/10.21437/Interspeech.2019-2380
  4. Li, J., Zhang, X., Xu, J., Zhang, L., Wang, Y., Ma, S., Gao, W., 2020. Learning to Fool the Speaker Recognition, in: ICASSP 2020 - 2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). pp. 2937–2941. https://doi.org/10.1109/ICASSP40776.2020.9053058

作者信息:

CSDN:https://blog.csdn.net/i_love_home

Github:https://github.com/mechanicalsea

聯繫方式:2019 級同濟大學博士研究生 王瑞 [email protected]

研究方向:說話人識別、說話人分離

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