# Pitch: 음의 높낮이(진동수 Hz의 크고 작음과는 다르다)
Pitch는 보다 추상적인 개념으로, 사람이 인지할 수 있는 Hz의 변화가 저주파일때 더 민감하고, 고주파로 갈수록 둔감해지는 just-noticeable differences에서 출발한 개념이다.

즉 사람이 인지하는 음의 높낮이는 Hz와 linear한 관계가 아니라 exponential한 관계이다. 아래 보이는 그림과 같이 옥타브가 저주파에서와 고주파에서 다르다는 것을 알 수 있다.

https://en.wikipedia.org/wiki/Pitch_(music)



# log scale: 픽셀의 값 자체인 amplitude에 decibel을 적용하는 것도 log scale이고, y-axis인 frequency에도 log scale을 취한다. 게다가 mel scale자체도 일종의 log-scale이다.

# 데시벨: 10*log_10^[에너지의 비율]을 취한것
https://ghebook.blogspot.com/2014/06/decibel-and-logarithmic-function.html

# Mel-scale: Melody scale
Mel-scale은 이러한 pitch에서 발견한 사람의 음을 인지하는 기준(threshold)을 반영한 scale 변환 함수이다. 위에서처럼 [Hz -> 음계]의 관계가 exponential하기 때문에 주파수를 바로 linear하게 다루지 말고, log함수를 통과시켜 mel scale로 바꾼다음, linear하게 다루자는 것이다.(사실 이런 scale 변환은 computer vision이나 금융AI에서도 빈번하게 일어난다.)

그래서 아래와 같은 함수를 이용해 mel-scale(log-scale)로 변환한다.

https://en.wikipedia.org/wiki/Mel_scale

그리고 이 함수는 다음과 같이 생겼다.

만약 mel-scale에서 다시 Hz로 변환하고 싶으면, 위 함수의 역함수(지수함수)를 이용하면 된다.

# Mel-filterbank
Mel-filterbank는 mel-scale에서 linear하게 구간을 N개로 나눠구현한 triangular filter(=triangular window)를 가리킨다. 아래 그림을 보면 직관적으로 이해할 수 있을 것이다. Mel-scale(log-scale)에서 linear하게 나누었기 때문에, 주파수 영역에서보면 지수적으로 넓어지는 것을 확인할 수 있다.

https://towardsdatascience.com/getting-to-know-the-mel-spectrogram-31bca3e2d9d0
http://practicalcryptography.com/media/miscellaneous/files/10_filt_melfb.png



# Spectral Leakage
기본적으로 Fourier transform은 길이가 무한한 wav에 대한 infinite Fourier transform 알고리즘이다. 그런데 우리는 실제로는 길이가 유한한 wav를, 다시 짧은 window 단위로 자른 frame에 대해서 Fourier transform을 적용한다. 그런데 문제는 이 wav를 사각형 window로 잘라서 frame으로 만드는 과정이 엄밀히 말해 rectangule filter를 wav에 적용하는 것과 완벽히 동치이다. 그래서 이렇게 만든 frame에 Fourier transform을 하게 되면 sinc function에 해당하는 noise가 발생하는데 그 이유는 rectangule filter를 inverse Fourier transform을 하면 sinc function이 되기 때문이다.
이러한 일종의 noise를 spectral leakage라 부르는데, 이를 해결하기 위해서 hamming window를 frame에 적용하거나, frame의 양 끝에 zero-padding을 넣는 등의 휴리스틱 솔루션들이 많이 만들어지게 되었다.
https://stackoverflow.com/a/21641171/7573626
https://dspillustrations.com/pages/posts/misc/spectral-leakage-zero-padding-and-frequency-resolution.html

# Window function: Sliding window에 사용되는 다양한 모양을 가진 filter function
다양한 window function이 사용되는 이유는 바로 spectral leakage를 완화시키기 위함이다. spectral leakage는 유한한 길이로 제한하는 과정에서 rectangle filter가 사용되기 때문에 발생한다. mel-filterbank에서는 mel-amplitude 공간에 삼각형 filter를 사용했지만, 사실 삼각형이 아니라 온갖 종류의 다양한 모양을 가진 filter를 적용할 수 있다.
https://en.wikipedia.org/wiki/Window_function#Triangular_window

## Hamming window
여러가지 Window function중 하나로, 모양새는 truncated gaussian분포처럼 생겼는데, 실제로는 cosine함수를 이용해 구현한 filter이다.

## Rectangle filter
sincNet에서 사용되는 rectangle filter는 sinc function과 동치이다.

http://www.thefouriertransform.com/pairs/box.php


## Triangle filter
Mel-filterbank에서 사용되는 triangle filter는 sinc^2 function과 동치이다.

http://www.thefouriertransform.com/pairs/triangle.php



# SincNet과 Mel spectrogram의 차이
- SincNet은 rectangle filter(=band pass filter)의 high cut, low cut에 해당하는 f1, f2 두 파라미터를 learining한다. 이에 반해 Mel spectrogram은 해당 파라미터들이 모두 fixed되어 변하지 않는다.
- SincNet은 learnable rectangle filter -> hamming window를 사용하고, Mel spectrogram은 hamming window -> fixed triangle filter를 사용한다.
- SincNet으로 구한 (learnable) mel spectrogram은 time domain에서 band-pass filter로 부터 바로 구한 spectrogram인 반면, Mel spectrogram으로 추출된 feature들은 Fourier transform을 통해 frequency domain에서 구해진 mel spectrogram이다.

 

# Spectrogram을 구하는 두가지 방법
두가지 방법으로 구한 spectrogram은 서로 특정한 조건하에서 동치이다.
https://en.wikipedia.org/wiki/Spectrogram#Generation

1. band-pass filter 이용
Time-domain에서 바로 K개의 band-pass filter를 각 frame마다 적용해서 매 frame에 대한 K dim feature를 뽑아서 spectrogram을 만든다.

2. Fourier transform 이용
각 frame에 대해 Fourier transform을 한다음 

 


 

 

# MFCC(Mel-frequency cepstral coefficients) 구하는 과정

https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html
https://en.wikipedia.org/wiki/Mel-frequency_cepstrum
http://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/
https://m.blog.naver.com/mylogic/220988857132

Mic → Wav signal
- 마이크에서 나온 전기신호가 ADC를 통과하면서 16kHz의 sampling rate로 얻은 raw signal
- Wav signal은 x축이 time, y축이 신호의 세기(amplitude)이다.

Framing Frames
- 25ms 사이즈의 window size를 10ms step-size로 sliding하여 frame들을 만든다.
- 35ms짜리 소리라면, 2개의 frame이 나온다.

 Hamming Window → Hamming Windowed Frames
- 각 frame에 hamming window를 적용하여 spectral leakage를 줄인다.

STFT Spectrogram(=Frequency Spectrum)
- 각 frame에 short-time Fourier transform을 적용한다.
- Fourier transform에서 샘플링하는 N은 보통 256 혹은 512이다. 이 N의 값은 보통 frame의 길이, 즉 window size와 같다.
- 기본적으로 FFT를 하게 되면 time domain(x축: time, y축: amplitude)에서 frequency domain(x축: frequency, y축: magnitude)로 바뀌게 된다. 그런데 여기서 1차원을 더 만들어서, spectrogram(x축: frame 들, y축: frequency, color값: magnitude)은 3차원의 heat map 데이터가 된다.
- Y-axis에는 log scale을 취할 수도 있고 그냥 놔둘 수도 있다.(선택 가능한 옵션)
- 픽셀의 값에 log scale을 취한다. (데시벨)
- Spectrogram의 y축은 Nyquist limit에 따라 원본 sampling rate의 1/2이다.

 Power normalized → Power Spectrum(=Periodogram, Power Spectral Density)
- Frequency Specturm에 제곱을 취하고, N으로 나눈다.

 Mel-scale filterbanks  Mel Spectrogram
- Mel-scale이란 사람의 non-linear한 ear perception of sound를 고려한 hz의 변형된 scale이다.
- Mel-scale Filterbanks: non-linear한 구간을 가진 40개의 triangular filterbanks를 만든다.
- Mel spectrogram의 y축은 filterbank의 개수와 동일한 dim을 갖는다. 즉 40개의 각 filterbank들이 커버하는 영역의 Hz를 triangle filter로 검출하여 요약한 정보이다.

Take log → Log Mel Spectrogram
- log 취하는 것이 deeplearning에서는 큰 의미를 갖는다.

Take DCT MFCC
- Discrete Consine Transform을 수행하고 이 계수들 중 가장 저차원의 12개만 남긴다.(feature selection)
- 이때 Deltas and Delta-Deltas feature를 구해서 append 하기도 한다.
- 딥러닝에서는 이 마지막 과정을 생략할 수도 있다. DCT가 linear operation이기도 하고, 딥러닝에서는 12개 이외의 정보도 잘 사용될 여지가 있기 때문이다.

 


NLP 기초

# 용어
- phonmeme: 음소, 가장 작은 소리 단위. 쉽게 영어 사전의 발음기호를 생각하면 됨. 
- grapheme: 자소(문자소), 가장 작은 문자 단위. 대부분의 경우 알파벳 1개가 1개의 phoneme에 대응 된다. ex) help -> h / e / l / p
그러나 항상 phoneme과 1:1대응은 아니다. ex) shop 에서 sh는 2개의 알파벳이 묶여서 사용되므로, 2개의 알파벳이 1개의 grapheme이 된다. 최대 4개의 알파벳이 1개의 graphpeme이 되기도 한다. ex) weight -> w / eigh / t

- monophone, single phone: 위에서와 같은 직관적인 발음기호 표기
- triphone: 좌-현재+우, 의 format으로 좌우에 등장한 phone을 같이 표기하는 방식.
http://www.voxforge.org/home/docs/faq/faq/what-is-the-different-between-a-monophone-and-a-triphone

- consonant: 자음
- vowel: 모음
- morpheme: 형태소, 뜻을 갖는 최소 단위
- syntactic: 문법적인
- semantic: 의미적인
- delexicalization: 3시15분 -> [Time]으로 바꿈

# Acoustic model
오디오 --> phoneme(혹은 grapheme 등)을 예측해주는 모델 

# Phoneme Dictionary
word -> phoneme가 기록된 정보

# G2P model
대규모 dictionary를 학습해서, 임의의 word에 대한 phoneme을 예측해주는 모델
(dictionary와의 차이점은, dictionary에 없는 word에 대한 phoneme 예측도 가능함)

# Beam search
greedy 탐색 알고리즘(휴리스틱 탐색)이다. DP가 아니다. 적당히 쓸만한 solution을 구하는 것이다.

# IOB format: token classification(Slot filling)에서 New York과 같든 2개의 word로 된 녀석들을 처리하기 위한 것. 
- New: B-city
- York: I-city
이런식으로 B가 등장하고, 같은 종류의 sub-slot에 해당하는 I slot이 연속해서 나오면 하나로 묶어서 처리함. 그리고 O의 경우 None slot을 의미함.
inside, outside, beginning
https://en.wikipedia.org/wiki/Inside%E2%80%93outside%E2%80%93beginning_(tagging)
- 그런데 이 방식보다 그냥 I를 쓰지 않고, 단순히 최초에 등장하는 B이후의 모든 (O를 만나기전) token을 묶어버리는 방식이 더 성능이 좋다고 함.

# state tracking
slot:value pair를 context혹은 domain에 맞게 계속해서 만들거나 수정해 가는 과정.


# subword
subword는 word dictionary 사이즈가 너무 크기 때문에 이를 작게 쪼개고 싶은 니즈가 있음.
그런데 char는 너무 단순함. 그 중간이 필요하다는 것은 다들 동의할 수 있음.
그런데 BPE같은걸 하면 문제가, an 같은 단어가 fan에서 쓰이는거랑 단독으로 an에서 쓰이는게 완전히 다른데 이걸 같은 걸로 처리하는 문제가 있음..

# word piece
https://wikidocs.net/22592
http://aidev.co.kr/nlp/7777
https://lovit.github.io/nlp/2018/04/02/wpm/
word piece는 byte pair encoding하고 거의 똑같고, 디테일만 차이남.(BPE에서 띄어쓰기인 ‘/w’ 만 언더바로 바꾸면 똑같은듯)
그냥 word dictionary를 만들면 사이즈가 너무 크니까, 이걸 N개로 딱 지정하고, 그냥 character level에서 자주 나오는 단위순으로 자른 것

* 그런데 이렇게 word piece를 사용하면 문제가 "아웃백" 같은 단어는 등장빈도가 매우 낮으므로, 아 ## 웃 ## 백 이렇게 쪼개져서 token이 나눠진 채로 토큰 임베딩이 뽑힘 되어버림.
그런데 우리가 원하는 결과는 "아웃백" 이렇게 띄어쓰기로 구분된 녀석에 대해서 tagging을 하고 싶은것임. 그래서 IOB 포멧을 사용함.

# Teacher forcing
seq2seq에서 병렬화+캐스케이딩 에러를 줄이기 위한 트릭. sequential prediction을 끊고, 걍 각 GT word들이 next word만 예측함. 커리큘럼러닝과 관련

# GLUE
가장 공신력있는 NLP모델 성능측정 지표. 굉장히 여러개의 데이터셋과 task에 대해서 종합적으로 모델을 평가함. 개중에는 서로 코릴레이션이 음수인 task도 있다고 함.

# Language Model
next word를 예측하는 모델

# Task oriented dialog(==Goal oriented dialog)
- user 혹은 agent 혹은 둘다가 대화를 통해서 특정한 목표를 달성에 성공해야하는 문제. ex) 음식 주문하기

# Slot normalizer
룰베이스로 입력된 slot:value 에 대해서 특정 값으로 변환시킴. 모르는 값이 들어오면 처리 불가.

# Token classification
각 word piece 그대로 value로 사용해서, 어떤 slot인지만 분류하는 방식. ASR에서 발생한 에러 때문에 무한가지 value가 가능.

 

by 곽동현 이스텔리앙 2019. 10. 25. 12:01
| 1 2 3 4 5 6 7 8 9 ··· 221 |