본 논문은 IEEE SLT 2018에 게재된 논문(https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8639585)이다
한줄로 요약하면,
SincNet은 음성 피처 추출에 유리한 컨볼루션 신경망(Convolutional Neural Network)의 첫번째 레이어에 싱크 함수(sinc function)를 도입해 (1) 계산 효율성과 (2) 성능 향상을 보인 모델이다.
1. 화자인식 연구 동향
Speaker recognition은 많은 분야에서 응용 (생체 인증, 법의학, 보안, 음성인식, 화자 구분)되고 있음
대다수의 최신 SOTA는 이전 SOTA인 GMM-UBMs (가우시안 혼합 모델-범용 백그라운드 모델)보다 더 나은 성능을 보인 음성 segment인 i-vector*에 기반을 두고 있음
딥러닝이 보인 성과들로는,
<Fig A. hand-crafted 방법이 가진 한계점>
2. 첫 번째 합성곱 층의 중요성
본 논문에서는, waveform-based CNNs에서 가장 중요한 부분 중 하나는 첫 번째 합성곱 층임을 강조함
<Fig B. 기존 CNN filters의 한계점>
multi-band shape는 여러 빈도 대역에서 활성화된 패턴을 뜻함 (아래 파란 상자 같은, noisy !)
CNNs의 결과물인, 파란색 표시된 결과들은 noisy하게 나온 결과물임.
3. 논문에서 제시한 SincNet (뒤 architecture에서 나옴)
CNN이 input layer에서 더 의미 있는 filter를 발견하는 데 도움을 주기 위해 SincNet은 그 filter shape에 일부를 더 추가하는 것을 제안 (= Inject prior knowledge on the filter shape)
실험 결과
i-vector? (참고)
- 화자 인식 때 쓰는 특징 벡터 (음성 신호 효과적으로 표현하려고)
- 음성 segment를 나타내는 고정차원의 벡터 (화자의 발음 특성을 나타낼 때 사용)
- 원리
- 화자 정보 누수를 막고자 -> speaker와 factor를 따로 모델링하자 !
- speaker, channel .. 모든 variability를 모두 하나의 subspace로 표현하는 것
- 음성 내에 있는 모든 정보를 비교적 작은 차원의 subspace (total variability subspace)에 표현하면 화자와 상관없는 정보 (예. channel)이 혼재할 수 있지만 speaker-dependent informantion도 보존되게 될 것이다
- 그래서 -> i-vector는 total variability 모델링이라고도 불림
(그냥 결론은 얻을 수 있는 모든 정보들, 상관없는 것까지 몽땅 넣어서모델링해서, 정보 누수를 막자 ! 이거네)- 수식과 더 많은 설명을 보고 싶다면... 여기로 ! 참고
FBANK? - "음성 신호의 스펙트럼을 효과적으로 표현하는 특성 추출 방법"
Filterbank의 줄임말로, 음성 신호를 주파수 영역으로 변환하는데 사용되는 특성 추출 방법임. FBANK은 음성 신호의 주파수 성분을 대표하는 일련의 주파수 대역에 대한 에너지를 포함하는데, 이는 음성 신호의 스펙트럼을 보다 압축된 형태로 표현할 수 있다는 특징을 가짐. 이러한 특성은 음성 신호를 처리하고 분류하는 데 사용되며, 주로 음성 인식 및 화자 인식과 같은 작업에 적용됨.
여기 부분은 ratsgo를 많이 참고했다.
1.1 CNN이 시간 도메인에서의 컨볼루션 연산을 수행하는 방법
1.1.1 정의
필터는 시간 도메인에서의 1차원 벡터이며, 컨볼루션 연산의 정의는 다음과 같음 (1)
x[n] = 시간 도메인에서의 n 번째 raw wave sample
h[n] = 컨볼루션 필터(filter, 1D 벡터)의 n 번째 요소값
y[n] = 컨볼루션 수행 결과의 n 번째 값
L = 필터의 길이
=> 입력 신호 x와 필터 h를 내적하여 결과인 y를 계산하는 것을 뜻함 (1)
1.1.2 계산 방법
L = 3인 경우, 다음 계산 과정을 거침 (이 부분에 대한 자세한 내용이 ratsgo에 나와있습니다. )
결론적으로, 컨볼루션 연산 결과물인 y 는 입력 시그널 x 와 그에 곱해진 컨볼루션 필터 h 와의 관련성이 높을 수록 커진다.
예를 들어, 만약 필터가 특정 주파수를 강조하는 역할을 한다면, 입력 신호의 해당 주파수 성분이 강조되게 된다. 따라서 컨볼루션 필터 (h)는 입력 신호의 특정 주파수 성분을 부각하거나 감쇄시키는 역할을 할 수 있다.
다시 말해, 컨볼루션 필터는 입력 신호에서 원하는 정보를 추출하거나 무시하는 데 사용되는데 이는 입력 신호의 특정 특징을 감지하고 분류하는 데 도움이 된다.
CNNs은 결론적으로, 각 필터에서 모든 elements를 학습함 (= learn all the elements of each filter)
1.2 SinCNet의 학습 방법
반대로 SincNet은 몇 개의 학습 가능한 매개변수 θ에만 의존하는 사전 정의된 함수 g를 사용하여 합성곱을 수행 (2): (= only learn the θ parameters of the predefined kernel)
x[n] = 입력 음성 시그널(시간 도메인)의 n 번째 샘플
g = 그에 대응하는 컨볼루션 필터 값(스칼라)
y[n] = 컨볼루션 수행 결과 값
=> 이 때 g(*)를 어떻게 설정하는게 좋을까? "band-pass filter"
2.1 목적
음성 신호 x에서 문제 해결에 도움이 되는 주파수 영역대(band)는 살리고, 나머지 주파수 영역대는 무시하고 싶음. 이 때 특정 주파수 영역대만 남기는 역할을 하는 함수를 "bandpass filter"라 부름.
주파수 도메인에서 이런 역할을 이상적으로 할 수 있는 필터의 모양은 사각형(Rectangular) 모양임.
(이상적인 이유는 주파수 영역에서 간단하게 표현되어 필터의 동작 이해가 쉽고, 필터 계산이 간단하며 구현이 쉽기 때문임)
결론적으로, g를 정의하여 filter-bank를 사용하였으며, 이때 filter-bank는 rectangular bandpass filters 로 구성 됨
2.2 Sinc 함수
주파수(frequency) 도메인에서 bandpass filter의 크기는 일반적으로 두 개의 저주파수 필터 간의 차이 (즉 둘을 빼는 것)로 표현됨
(3)에서 f1/f2는 각각 학습된 저주파/고주파 cutoff frequency*이며, rect(·)는 주파수 도메인에서의 직사각형 함수임.
헷갈리니까 다시 요약해보자
주파수 영역 = 신호를 주파수별로 분해하여 처리하는 것
일반적으로 두 개의 저주파수 필터 = 특정 주파수 대역의 신호를 통과시키는 필터
=> bandpass filter가 특정 주파수 대역을 강조하고 그 외의 주파수를 억제하는데 사용되는데, 이를 두 저주파수 필터 사이의 차이로 표현할 수 있다는 것임
cut-off frequencies?? = 차단 주파수 (참고)
- 필터 설계시 -3db가 되는 지점, 신호가 최대 gain에서 0.7배로 떨어지는 지점
- 필터에서 통과 대역과 차단 대역의 경계가 되는 주파수
2.3 주파수 도메인에서 time 도메인으로 돌아가기
역 푸리에 변환*을 사용하여 time domain으로 돌아가기 위해, reference function g는 다음과 같이 정의됨:
(4)에서 sinc 함수 는 sinc(x) = sin(x)/x로 정의됨.
time domain으로 돌아간다? (=주파수 도메인에서의 처리를 마치고 시간 도메인으로 돌아간다)
- 푸리에 변환 = 시간 도메인에서의 신호를 주파수 도메인으로 변환하는 과정
- 주파수 도메인에서 다루던 신호나 연산을 다시 시간 도메인으로 변환하는 것
- 주파수 도메인에서는 주파수를 기반으로 신호를 분석하고 처리하지만, 시간 도메인에서는 시간에 따른 신호의 변화를 직접적으로 살피기에 푸리에변환, 역푸리에변환을 사용해서 왔다갔다하는 것이 가능함
2.3.1 역/푸리에변환으로 돌아가는게 가능한 이유
주파수(frequency) 도메인에서 구형 함수(Rectangular function)으로 곱셈 연산을 수행한 결과는 시간(time) 도메인에서 싱크 함수로 컨볼루션 연산을 적용한 것과 동치(equivalent)이기 때문 (더 자세한 내용은 여기 ratsgo 참고!)
2.3.2 bandpass filter를 sinc 함수로 어떻게 적절히 자를까? -> Hamming window
이상적인 bandpass filter (즉, passband가 완전히 평평하고 stopband의 감쇠가 무한대인 필터)를 얻기 위해서는 무한한 수의 L이 필요
그러나 현실적으로 무한한 길이의 싱크 함수(=컨볼루션 필터)를 사용할 수 없기에 싱크 함수를 적절히 자르는 과정이 필요함
싱크 함수를 유한한 길이로 자르고 이를 푸리에 변환을 하면 그림10의 하단과 같은 모양이 됨. 이는 가장 이상적인 bandpass filter의 모양(사각형)에서 점점 멀어지는 구조로 이런 결과가 나오면 우리가 원하는 주파수 영역대 정보는 덜 포착하게 되고, 버려야 하는 주파수 영역대 정보도 일부 포착하게 됨.
이 문제를 완화하기 위해 windowing 사용, 이는 싱크 함수를 특정 길이로 자르기 보다는 해당 필터에 윈도우 함수를 사용해서 양끝을 스무딩하게 한다는 것임
본 논문에서는 고주파 selectivity를 수행하기에 적합한 'Hamming window'(8) 사용
(논문에 따르면, 사실 실험 결과, Hann, Blackman Kaiser windows 같은 다른 함수를 채택할 때 유의미한 성능 차이가 없었다고 함..)
결론적으로 (그림 11)에서 볼 수 있듯이, 중심 주파수 영역대는 잘 포착하고 그 외 주파수 영역대는 무시하게 됨. 이는 유한한 길이의 싱크 함수를 사용하더라도 해밍 윈도우 기법을 사용하면 원하는 주파수 영역대 정보를 잘 살리고, 버려야 할 주파수 영역대 정보는 잘 버릴 수 있다는 것을 의미함
여기까지 SincNet 작동 방법 설명 끝 !!!! 한 번에 이제 쭉 설명을 해보겠습니다
한 번에 보는 SincNet 작동 방법
SincNet은 푸리에 변환 (Fourier Transform) 없이 시간 도메인의 입력 신호를 바로 처리가 가능함 (2)
이 때 우리가 원하는 컨볼루션 필터 g(시간 도메인)의 이상적인 형태는 주파수 도메인에서 구형 함수(rectangular) 형태로 나타나야함
(3) 처럼 이상적인 Band Filter를 위해 특정 주파수 영역대( f/2f1 에서 f/2f2 사이)만 남기고 나머지 주파수 영역대는 무시해야 함
(논문에서 f가 무엇인지 얘기하지 않는데 ratsgo에 따르면 sample rate로 추정됨)
그 후 (3)을 주파수 도메인에서 시간 도메인으로 역푸리에변환을 통해 옮기면, (4)가 됨
=> 이 때, (4)에 정의된 싱크함수들을 SincNet의 첫번째 컨볼루션 레이어에 적용하는 것임
(4)에서 learnable parameter는 bandpass 범위에 해당하는 스칼라 값은 오로지 두 개로 f1, f2뿐임 (각각은 low cut-off frequency와 high cut-off frequency라 불림)
이때, f1 ≥ 0 , f2 ≥ f1을 보장하고자 저자들은 다음 제약을 둠 (컷오프수 주파수에 대한 제약)
또한 유한한 길이의 싱크 함수를 써서 이상적인 bandpass filter 역할을 수행하지 못하는 문제점과 관련해 이를 극복하고자 해밍 윈도우(7)를 싱크 함수에 적용함
이를 통해 컨볼루션 필터의 양끝을 스무딩하게 됨
결론
논문에서는 4가지로 크게 나누어서 설명
1. Fast Convergence
2. Few Parameters
3. Computational Efficiency
4. Interpretability
첫 번째 합성곱 층에서 얻은 SincNet 특성 맵(feature map)은 다른 접근 방식보다 해석 가능하고 인간이 이해하기 쉬움. 실제로 filter bank*는 명확한 물리적 의미를 가진 매개변수에만 의존.
Filter bank?
- filter bank: 신호 처리에서 주파수 대역을 특정하기 위해 사용되는 필터들의 모음. 일반적으로 다양한 주파수 대역에서 신호의 특징을 추출하기 위해 사용.
- "물리적 의미를 가진 매개변수"란 필터 뱅크의 파라미터 중에서, 실제로 신호 처리의 물리적 특성을 나타내거나 설명하는 의미 있는 값들. 예시로 주파수 대역의 시작과 끝, 주파수 대역의 너비, 필터의 강도 등과 같은 값들이 있음. 이러한 매개변수는 특정 주파수 대역을 신호에서 강조하거나 억제하는 데 사용될 수 있으며, 이로써 필터링된 결과에 직접적인 영향을 미치게 됨
다양한 말뭉치에서 평가되었으며 다양한 화자 인식 베이스라인과 비교함.
대부분의 실험을 Librispeech와 같은 공개 데이터를 사용하여 수행함 (깃허브)
서로 다른 화자 수로 구성된 데이터셋에 대한 실험을 위해, 본 논문은 TIMIT(462명 화자, train chunk) 및 Librispeech(2484 명 화자) 코퍼스를 사용.
전처리
각 문장의 시작과 끝에 있는 비 음성 구간은 제거.
Librispeech 문장 중 125 ms 이상 지속되는 내부 침묵이 있는 경우 이를 여러 청크로 분할.
text-independent 화자 인식을 위해, TIMIT의 보정 문장 (즉, 모든 화자에 대해 동일한 텍스트를 발화한 문장)은 제거됨.
Librispeech의 경우, 각 화자에 대해 다섯 개의 문장이 훈련에 사용되었으며, 나머지 세 개는 테스트에 사용.
Librispeech의 경우, 훈련 및 테스트 자료는 각 화자의 훈련 자료를 12-15초 이용하고 테스트 문장은 2-6초 지속되도록 임의로 선택.
Setup 과정
Training 환경
학습에는 RMSprop optimizer(참고)를 사용했으며, lr = 0.001, α = 0.95, ε = 10^(-7), minibatch 128 사용
SincNet의 모든 초매개변수는 TIMIT에서 조정되었고, 이후 Librispeech에도 상속되었음.
Speaker verification system
speaker verification system은 두 가지 가능한 설정을 고려하여 speaker-id neural network에서 파생되었음.
정확한 평가를 위해, 화자로부터 나온 각 문장에 대해 위조자로부터 10개의 문장이 무작위로 선택되었음. 이때 위조자는 speaker id network를 훈련하는 데 사용된 것과 다른 화자 pool에서 가져옴.
Baseline
Speaker verification experiment
i-vector baseline와 비교함
이때 i-vector은 SIDEKIT toolkit을 사용하여 구현.
또한 GMM-UBM, Total Variability (TV) matrix, PLDA은 Librispeech 데이터에서 훈련되었음 (GMM-UBM은 2048개의 가우시안으로 구성되고, TV 및 PLDA 고유 음성 행렬의 순위는 400)
1. Learned filters 확인
2. 학습된 필터가 어떤 주파수 대역( frequency bands)을 다루고 있는가
1. SincNet과 CNN의 학습 곡선 비교
TIMIT 데이터셋에서 얻은 결과로, SincNet을 사용할 때 Frame Error Rate(FER%)이 빠르게 감소함
또한, SincNet은 더 나은 성능으로 수렴하여 CNN의 37.7%에 비해 33.0%의 FER을 달성함.
2. Sentence Error Rates (SER%) 결과
음성인식 모델의 디코딩 결과 평가하기
- SER은 전체 문장 갯수 가운데 ‘단어 하나라도 틀린 문장 갯수’의 비율을 나타내는 지표 (값이 작을 수록 성능 우수) (ratsgo 참고)
- EER: 오인식률(FAR, False Acceptance Rate)과 오거부율(FRR, False Rejection Rate)이 같아지는 비율 (값이 작을 수록 성능 우수) (tistory 참고)
- FER: 무선 데이터 전송 품질을 측정하는 데 사용되는 용어 blog
1. Librispeech에서 Equal Error Rate (EER%)
2. standard i-vector에서의 실험
깃허브를 공부하고 싶었지만.. latsgo님의 도움을 받아 코드를 정리해봤다 (이건.. 내 깃허브에 올린다)
다음 Reference가 없었다면 너무 슬펐을 것 같다.
유튜브에 저자의 영상이 있으며, ratsgo에서 더 친절하게 SincNet을 설명해주고 있다 ! (그래도 어렵다)
음성은 정말 어렵다, SincNet이 학습하는 필터에서 피크가 발견되었다고 얘기하는 부분 (Fig3)이 있었는데, peak라고 할 수 있나.. 라는 생각이 문득 들었지만, 그래도 잘 작성된 아주 유명한 논문인게 틀림없다
이런 생각을 해낸 저자들,,, 참 대단하고도 멋있다 !
Relatd Work가 좀 더 자세했더라면 더 많이 배웠을 텐데, 사실 큰 내용이 없다 (정리는 뒤에.. 있다)
ratsgo 블로그에서는 CNN의 시간도메인에서 컨볼루션 연산 과정을 더 잘 다루고 있다, 그러나 여러 차례 읽어도 이해가 되지 않아, 그 부분에 대한 내용은 생략했다 (어쨌든 이건.. SincNet을 배우는게 목표니까 ㅎㅎ..)
| Reference
그 외 본 발표를 준비하며 읽고 공부한 내용들이다.
spaker rcognition에 딥러닝이 i-vecotor의 대안책이 되고 있음
CNN이 raw speech samples로 fed된 유망한 결과 나옴
standard hand-crafted features를 이용하는 것 대신에 CNN은 waveform에서 low-level의 speech representation을 학습함
본 논문은 CNN 아키텍쳐인 SinNet 제시
실험 -> speaker identification , speaker verification task에서 수행
Fast Convergence
Few Parameters
이전 연구 동향
기존 동향
해결책 1
해결책 2
본 논문과 가장 유사한 아이디어로는, spectrogram domain에서 작동하는 연구 (SincNet은 raw time domain waveform을 바로 고려)
본 연구
Finite Impulse Response (FIR) 필터
디지털 신호 처리에서 사용되는 필터 중 하나. 시스템의 응답이 유한한 시간 동안만 지속되는 경우에 사용. FIR 필터는 시간 영역에서 유한한 길이의 임펄스 응답을 가지고 있으며, 이 임펄스 응답이 시스템에 적용되는 입력 신호와 합성되어 출력을 생성합니다. FIR 필터는 시스템이 안정적이고 예측 가능하며 설계가 비교적 간단하다는 장점이 있습니다. 일반적으로 FIR 필터의 임펄스 응답은 샘플 수가 유한하기 때문에 그 시스템이 특정 시간에 대한 입력에 대한 반응이 제한되어 있습니다.
filter bank?
"filter bank"는 다양한 주파수 대역을 분리하거나 강조하는 여러 개의 필터로 구성된 그룹을 나타냄. 디지털 신호 처리에서, "filter bank"는 일련의 필터가 주파수 스펙트럼을 여러 개의 부분으로 분할하거나 특정 주파수 대역을 추출하는 데 사용됨. 이러한 "filter bank"는 일반적으로 서로 다른 주파수 대역에 대해 다른 필터를 적용하여 입력 신호를 처리합니다.
- "rectangular bandpass filters" = 직사각형 모양의 주파수 대역을 추출하는 필터로 이루어진 filter bank
- "bandpass filters" = 특정 주파수 대역의 신호를 통과시키고 다른 주파수 대역의 신호를 차단하는 필터.
- 이 필터는 일정 주파수 범위 내에서만 신호를 전달하고 다른 주파수는 차단하여 원하는 대역폭의 신호를 추출하거나 분리하는 데 사용됨. 즉, bandpass filters는 정해진 주파수 대역의 신호를 선택적으로 통과시키는 역할을 함
필터링 (참고)
- 저주파: 주파수 낮은 신호 (우리가 알아보기 쉬움)
- 고주파: 주파수 높은 신호, 예. 심박수, 호흡 수 처럼 빠르게 변하는 생체신호 (미세한 변화나 세부적인 특성)
- 예- 저주파 필터링
- 컷오프 주파수 이하의 주파수 성분만 통과시키고 그 이상은 차단해서, 신호의 저주파 성분은 보존하고 고주파 성분은 제거하는 필터링 기법 (우리가 원하는 저주파 신호는 남기고 원하지 않는 잡음은 제거 하는 것)
푸리에 변환
시간 도메인에서의 신호를 주파수 도메인으로 변환하는 과정. 이 변환은 주파수 성분들이 신호 안에 어떻게 분포하는지를 보여줌, 다양한 분야에서 사용되는데, 예를 들어 음성 처리에서는 주파수 도메인에서 필터링이나 스펙트럼 분석을 수행하는 데에 활용.
정리 엄청 디테일하게 잘 해주셨네요! 잘 보고 갑니다!