2018년 8월 28일 화요일

180828 CTC 책 노트

배경지식

  • (https://en.wikipedia.org/wiki/Connectionism)
  • (https://en.wikipedia.org/wiki/Connectionism#Connectionismvs.computationalism_debate)
  • (http://www.aistudy.com/neural/connectionism.htm)

1. Introduction

  • 음성인식에는 alignment가 필요한데 RNN은 그걸 못하기 때문에 HMM의 도움을 받았다

2. Supervised Sequence Labeling

  • 강화학습(reinforcement learning)과 supervised learning의 차이점: 강화학습 시에는 scalar reward만 주어진다(정말?)

2.2.2 Training Probabilistic Classifiers

  • predictive distribution은 구하기 어렵다 (bishop책 3장을 보면 온통 라이너 전개와 라플라스 근사로 도배되어 있다)
  • 그래서 그냥 MAP을 구하는 것으로 근사한다.
  • MAP의 posterior 중 prior는 weight decay이기도 하다. 'Occam's razor'에 따라 큰 weight에 대해 페널티를 준다(정말로 Occam's razor 때문에 그렇다고?)

2.2.3 Generative and Discriminative Methods

  • p(C|x)(posterior)를 한 방에 구하는게 discriminative 방식이다.
  • (bishop책을 보면 discriminative를 한 방에 구하는 것보다는 likelihood와 prior를 나눠서 구하는게 더 유용하다고는 한다)
  • generative 방식은 원래 데이터의 분포인 prior를 구하는 것이다.
  • (근데 어차피 음성인식 얘기를 하고 있으므로 원래 데이터의 분포 같은걸 알아낼 필요도 없고), 성능 상으로도 discriminative가 더 좋다.

2.3 Sequence Labelling

  • sequence가 iid라고 가정한다.
  • sequence labelling task는 세 가지로 나뉜다.
  • Temporal Classification: weakly target(예를 들어 문장)만 가지고 학습해야 하는 것. 가장 어렵다
  • Segment Classification: segment 단위로 잘 정리된 label로 학습하는 것
  • Sequence Classification: label이 한 덩어리인 것(예를 들어 A, B이런것들)

2.3.2 Segment Classification

  • 자연어처리나 생물정보학에서는 input들이 discrete해서 쉽게 쪼갤 수 있다(can be trivially segmented)
  • 가장 쉽게 생각해볼 수 있는 measure는 segment error rate인데, 걍 잘못 맞춘 segment들의 비율을 구하는 것이다.
  • segment error rate 구하는 과정엔 두 sequence 간의 hamming distance를 구하게 된다.
    • (이 과정에서 두 시퀀스의 길이가 같으니까 substitution 에러를 고려할 것 같은데, 어떻게 하는지는 잘 모름)

2.3.3 Temporal Classification

  • 여기서는 segment error rate를 쓸 수 없으므로 label error rate를 써야 한다.
  • label error rate = 평균(edit distance): edit distance는 substitution, deletion, insertion으로 이루어져 있다.
  • (substitution, deletion, insertion을 구하는 과정은 CMU 2013년도 봄학기 음성인식 강의 자료 4장에 나와 있다)
  • edit distance 이외에 transposition이나 연산의 상대적 중요도(relative importance of the operator)를 고려할 수도 있다.
  • operator라는 건 (substitution, deletion, insertion)을 말하는 것 같다. 잘은 모르겠다.

3. Neural Networks

3.1.1 Forward Pass

  • activation function은 대개 무한대의 range를 유한하게 만들어주기 때문에, squashing function이라 부르기도 한다.

3.2.4 Bidirectional Networks

3.2.4.1 Causal Tasks
  • bidirectional networks는 causality를 어긴다. (네비게이션이나 주가 예측 등에 쓸 수 없다)
  • 하지만 솔직히 causality를 위반해도 되는 task들이 있다. (단백질 구조 분석이라든지…)

3.2.5 Sequential Jacobian

  • 어떤 network를 학습했다고 치자. 그때의 Jacobian은 input에 대한 output의 sensitivity라 할 수 있다. Jacobian은 output과 별로 관련이 없는 input을 알아내는데 쓸 수 있다.
  • (neural network는 비선형 모델이기 때문에 어떤 input의 변화에 대한 output의 변화가 Jacobian을 통해 근사적으로만 계산될 수 있다)(bishop책 5.3.4)
  • Jacobian을 통해 구한 output derivative값이 크다고 해서 민감하다는 것은 아니다. output derivative끼리 상대적으로 고려했을 때 얼마나 변했는지가 sensitivity의 척도가 된다.
  • 근데 또 그렇다고 해서 sensitivity가 importance를 의미하지는 않는다;;; (가령, 이미지를 letter box로 만들었을 때 까만 패딩 부분에 대해서는 sensitivity가 높지만 아무 정보가 없기 때문에 중요하진 않다고 할 수 있다)
  • Jacobian은 원래 2차원인데, RNN의 경우는 input이 sequence이므로 Jacobian에 해당하는 것은 4차원이 된다. 이것을 Sequential Jacobian이라 한다.

7. Connectionist Temporal Classification

  • CTC라는 이름은 그냥 지은게 아니다.

7.1 Background

  • 94년에 Bourlard와 Morgan은 connectionist 방식으로는 ASR(연속음성인식)을 다룰 수 없다고 했다.
  • segmentation이 모호한 경우에는 target function을 정의할 수 없기 때문
  • 하지만 CTC를 사용하면 Temporal Classification에 대한 target function을 정의할 수 있다.

7.2 From Outputs to Labellings

7.2.1 Role of the Blank Labels

  • 초기 CTC는 blank label이 없어서 같은 label이 연속되는 경우를 학습할 수 없었다.

7.2.2 Bidirectional and Unidirectional Networks

  • CTC를 쓰면 bidirectional RNN을 쓰지 않아도 성능이 덜 떨어진다.

7.3 Forward-Backward Algorithm

  • HMM의 그것과 비슷하다.
  • unidirectional과 bidirectional의 output을 비교해보면, unidirectional의 output이 약간 더 delay되어 있다.
  • (bidirectional은 causality를 어기기 때문에 input이 다 들어오기도 전에 맞추는 것 처럼 나타난다) 
  • HMM의 Alpha에 해당하는 것을 계산하한다. U 축에서 이전 label이 같은 경우, stride가 2인 connection은 없다.
  • (예시로 보여준 figure에서는 그 부분이 없어 직접 그렸다)

7.3.1 Log Scale

  • underflow를 방지하고자 Log Scale에서 연산을 수행한다.
  • 원래 덧셈이었던 연산은 Log Scale을 빠져나왔다가 다시 들어가야 하는 문제는 아래와 같이 해결할 수 있다.
  • ln(a + b) = ln(a) + ln(1 + exp(ln(b) - ln(a)))
  • log scale. always.

7.4 Loss Function

  • pi: target 문장
  • z: pi를 u domain에서 나타낸 sequence (u domain이 좀 더 길기 때문에 가능한 sequence는 여러개이다)
  • z': expanded z (z의 앞뒤와 label 간 blank를 넣은 sequence. len(z) = U 라면 len(z') = 1 + 2U)
  • x: input sequence (MFCC sequence 같은 것들. t domain)
  • Loss(x,z) = -ln(sum(alpha(t,u) * beta(t,u)) for u in range(z'))
  • 특정 X(t,u)를 가지는 모든 path에 대해 marginalization 한 것이라 보면 된다.
  • (u에 대해서만 sum했는데 Loss에서 t도 없어지는 것은 u와 t가 독립적인 index가 아니기 때문에 u에 대해 더하면 u에 해당하는 t도 자동으로 고려되어서 그런 것 같다. 잘은 모르겠다)
  • 특정 X(t,u)에 대한 alpha(t,u) * beta(t,u)를 나타내면 아래와 같다. (eq 7.25)

7.4.1 Loss Gradient

  • u: z에서 label 'k'가 나타난 위치 (eq 7.31)
  • 다행히도 Loss Gradient는 alpha, beta를 이용해 나타낼 수 있다.

7.5 Decoding

  • CTC라고 해서 decoding 과정에 뭐가 딱히 있지는 않다. (intractable)

7.5.1 Best Path Decoding

  • 각 path 중 가장 확률이 높은 path를 고르는 것이다.
  • 계산하기는 쉽지만 best path가 최적의 답은 아니다.
  • blank를 '-'라 표기하고 어느 문자 A가 있다고 하자.
  • 이 때 p(--) > p(AA) 인 경우가 있는데 사실 pi(char. domain)에서 보면 p(-)와 p(A)를 비교해야 하는 문제가 된다.
  • best path 방식으로 해버리면 p(--) < p(AA)이기 때문에 '-'가 선택되는데, p(-) > p(A) = p(AA) + p(A-) + p(-A) 이면 사실 p(A)를 만드는 path들이 선택되어야 한다.

7.5.2 Prefix Search Decoding

  • (여기부터는 솔직히 이해가 잘 안된다)
  • 이 방식은 best alpha를 보면서 decoding을 진행한다. t domain에서 한 칸씩 진행하면서 best children을 선택한다.
  • 시간이 아주 많아서 모든 children의 chlidren의 children을 다 볼 수 있다면 좋겠지만… 불가능하기 때문에 heuristic을 쓴다(예를 들어 beam width를 정해 쳐낸다든지…?). heuristic으로도 잘 된다.
  • fig 7.6

7.5.3 Constrained Decoding

  • 미리 준비한 Grammar를 가지고 Decoding에 사용할 수도 있다.

  • 이 경우 Grammar에 없는 단어들을 쳐낼 수 있다.

  • Grammar를 쓰면 CTC의 기본 가정을 위배한다(input sequence가 iid).

  • l: 위에서 언급한 z와 같음 (u domain에서 나타낸 문장)

  • l': best l

  • G: Grammar

  • l' = argmax( p(l|x, G) )

  • 여기서 근사적으로 p(l|x, G) = p(l|x)p(l|G) / p(l) 이다.

  • (x와 G가 사실 아예 독립은 아니다. 왜냐면 화자는 자신이 알고 있는 문법에 맞춰 문장을 말했을 것이므로)

  • 하지만 문법이라는게 사실 어떤 개인에게 속한다기 보다는 Global한 것이기 때문에, 독립이라고 봐도 된다.

  • (그리고 외부 데이터를 통해 만든 Grammar를 쓰면 독립이라고 봐도 된다)

  • 여기서 가능한 l의 갯수가 유한하기 때문에, p(x)와 p(G)에 equal probability를 적용해도 improper prior가 되지 않는다.

    • (sum 했을 때 1이 아니게 될 수도 있다든가 하는 위험이 없다) improper prior

7.5.3.1 CTC Token Passing Algorithm

  • HMM의 token passing과 비슷하다.
  • HMM의 token passing은 HTK book의 1.6 Continuous Speech Recognition 에 자세히 나와 있지만, 솔직히 만들어보지 않고는 알 수 없는 수준이다.
  • Kaldi 소스코드에도 token passing을 볼 수 있는데(lattice-faster-decoder.cc), 사용 목적의 프로그램 소스코드에서 한 6 단계 정도 아래로 내려가야(…) 볼 수 있기 때문에 코드만 봐서도 이해하기 어렵다. 대충 그림으로 나타내면 아래와 같다.

7.5.3.2 Computional Complexity

  • bigram을 쓰는 CTC token passing은 최악의 경우 O(TW^2)이지만, token을 매번 sorting 한다면 O(TWlogW)가 된다.

7.7 Discussion

  • HMM과 LSTM-CTC를 비교해보자. (저자분께서 작정한 것 같다)
  • HMM은 generative이고, LSTM-CTC는 discriminative이다. discriminative method가 더 성능이 좋다. 그 이유는 원래 데이터 분포 같은 것보다 classification에만 집중하기 때문이다.
  • LSTM-CTC가 HMM보다 훨씬 flexible이다.
  • standard HMM의 state들은 discrete이고 single value를 가진다. 반면 RNN의 state는 vector이다. RNN이 훨씬 더 복잡한 정보를 표현할 수 있다.
  • (HMM variant 같은걸로 되지 않나…)
  • HMM은 continuous input sequence를 hidden states로 나타내는데 한계가 있다(예를 들어 필기체 인식).
  • state를 많이 늘리면 그만큼 각 state의 확률이 exponentially 줄어든다. (음… 반만 이해된다)
  • 하지만 CTC는 state를 더 늘릴 필요가 없다. continuous 값을 가지는 vector니까
  • HMM은 현재 state에 대한 observation만 다루기 때문에(context dependency를 반영할 수 없기 때문에) triphone 같은 것을 사용하는 짓을 한다. triphone 같은걸 쓰면 파라미터가 exponentially 늘어난다. 그 수많은 파라미터를 학습시키려면 수 많은 데이터가 필요하다. (이것 역시 반만 이해된다)

2018년 8월 23일 목요일

180823 Beamforming notes

Acoustic Source Separation 11장 - Recent Advances in Multichannel Source Separation and Denoising Based on Source Sparseness

무슨 watson distribution 뭐 어쩌구저쩌구 있는데 결국 cGMM이 최고다

what?) sawada 방식의 permutation solving은 뭘까

(original, GEV) Lukas

제안된 방식과 달리 주파수 별로 모델 만드는 기존 EM 방식(DNN 아닌거)은 주파수 개별적으로 고려해서 뭐 음성의 전체 구조를 반영하지 못했다

GEV BF의 경우 matrix inversion을 피한다(대신 EVD가 오래걸리잖아? post filtering도 필요하고)

각 채널에서 나온 mask 가지고 noise 꺼 speech 꺼 만든다. mean 대신 median 씀

채널 별로 tf domain에서 mask가 튀어나오는데 이걸 mean보다는 median을 쓰는게 더 좋다(outliers때문)

Noise와 Target의 IBM 만들 때 정해놓은 threshold 이하/이상이어야 1로 줌. (대충 크다고 다 1로 주면 안됨)

IBM의 경우 CE criterion

why?) MVDR BF의 경우, 특정 주파수에서 mask가 매우 sparse할 경우 수치적으로 불안정 할 수 있다

(weight 기반)+AM 마소

가정: 발화 구간 중 음원이 움직이지 않는다고 치자

BF 방식: filter-and-sum, weight 기반

?) 그냥 멀티채널 신호를 DNN에 집어넣는 것은 DNN의 flexibility가 커서 좋지 않다

BF까지 computational node에 넣자

median pooling 좋은 줄은 아는데 (아마 편의상) mean pooling 썼다 다들 그냥 mean 쓰더라(사실 computational graph에 넣기 쉬워져서 그런것 같음)

그래서 adaptative라고 써놨지만 사실 그냥 발화 하나에 대해 통으로 weight 구한다 (초기 아이디어라 그런듯)

weight 추정에는 GCC feature를 쓴다

DOA 대신 weight를 추정하는 이유: 둘다 비슷하긴 한데 weight로 하면 energy 정보도 담을 수 있다

AM과 BF모듈의 gradient dynamic range가 매우 다르기 때문에 세심하게 트레이닝 -> 나눠서 하고 나중에 jointly

(time filter 기반)+AM gated feedback 구글 interspeech 17

우리 방식을 NAB라고 부르겟다 neural network adaptive beamforming

크게 filter prediction(FP) -> filter-and-sum(FS) -> AM 모듈로 구성된다 ( Multitask learning 용은 빼고)

여기서 FS 부분은 학습과는 무관

raw wave input 사용

time domain filter를 추정함. stft filter도 시험해보긴 함. 근데 CFFT feature를 쓰면 filter 차원이 매우 높아짐

gated feedback이 핵심 요소인데 RNN cell과 비슷한 아이디어임.

gated feedback: AM에서 나오는 매우 sparse한 CD states(13,522 senone) 벡터를 FP모듈에 feedback

그냥 집어넣으면 초반 학습 시 악영향을 줄 수 있으므로 LSTM cell의 gate처럼 구성함. 그냥 CD states 라고 해서 다 들어가지 않게 만듬. gated feedback은 원래 input과 붙여서 FP에 집어넣음

(adaptive GEV) DeLiang Wang ICASSP 2017 .pdf

Lukas 방식보다 약간 더 진보

frame마다 adaptively update

구글스콜라에서 찾은 올해 나온 논문

Rank-1 constrained Multichannel Wiener Filter for speech recognition in noisy environments

(제안된 방법 수식만 대충 읽음)

x, n의 mask는 LSTM으로 추정함

mask를 통해 얻은 x, n의 acorr를 구함

BF steering vector h 구하는 방식 중 SDW-MWF라는게 있음 (solution 구하는 과정이 매우 복잡)

rank-1 assumption: xx’ = source * gg’ 인데, 여기서 gg’의 rank가 1임 (음성 소스가 하나라고 가정ㅇㅇ)

(g는 acoustic transfer function vector)

하여튼 그렇다면(중간과정을 모르겟다) xx’ 의 rank도 1이 되기 때문에, h를 좀 더 간단히 나타낼 수 있음.

이렇게 하면 real 환경에 한해 성능이 좋음.

대충 읽은 것

Speaker Adaptation for Multichannel End-to-End Speech Recognition

  • multichannel input일 때 nn-bf + ((encoder + attention + decoder), (CTC)) 를 구성하고 speaker adaptation을 적용했을 때 어떤 모듈 간의 조합에 대해 성능이 좋은지 알아봄
  • 결론: 그냥 이것저것 빼고 음향모델 encoder만 adaptation 적용하는게 가장 좋다. nn-bf에 화자 특성까지 적응 시킬 필요 없는 것 같다.
  • 토의(뒷부분): MVDR BF의 constraint가 너무 강해서(??) 인식률이 좀 떨어진게 아닐까(????)

이 논문을 이해하기 위해서는 아래 논문들을 차례로 읽어야 한다.

  • IEEE Journal of Selected Topics in Signal Processing, 2017) A unified architecture for multichannel end-to-end speech recognition with neural beamforming
  • ICML17) Multichannel end-to-end speech recognition
  • IS17) Advances in joint CTC-attention based end-to-end speech recognition with a deep CNN encoder and RNN-LM
  • IC17) JOINT CTC-ATTENTION BASED END-TO-END SPEECH RECOGNITION USING MULTI-TASK LEARNING

Joint Localization and Classification of Multiple Sound Sources Using a Multi-task Neural Network

speech source localization용 CNN과

speech / non speech classification용 CNN을 함께 붙여서 트레이닝.

SRP PHAT 이김.

MULTI-VIEW NETWORKS FOR DENOISING OF ARBITRARY NUMBERS OF CHANNELS

로우 웨이브에서 다시 로우 웨이브 만드는거고

마이크가 아무렇게나 배치되어 있을때 SDR 높이는거임

2018년 8월 22일 수요일

180822 Automatic Speech Recognition - A Deep Learning Approach 요약

읽은 기간: 2018.08.19 ~ 08.21

필요한 챕터만 읽음.

읽지 않은 챕터: 1, 5, 13, 14

소챕터 당 가능한 한 3줄 이내로 요약.

읽었지만 굳이 요약하지 않아도 되는 내용은 쓰지 않음

2 Gaussian Mixture Models

2.3 Parameter Estimation

  • (무슨 말인지 이해 안됨) EM 알고리즘은 (데이터가 충분히 많은 경우) 내부적으로 확률벡터(누구?)에 대해 constraint을 주고 샘플 사이즈가 충분히 크면 covariance가 positive definite이 됨. 다른 알고리즘은 외부적으로 constraint를 줘야 함
  • 수렴 빠름
  • 초기값 세팅에 따라 결과가 달라질 수 있음. local maxima 문제 있음. peak가 몇개인지도 모름. 그래서 처음에 peak 하나짜리로 출발한다음에 점점 쪼개는 해결책이 있음

2.4 Mixture of Gaussians as a Model for the Distribution of Speech Features

  • 수학적으로 기술하기 쉬움(이건 정말 중요함)
  • non-linear manifold에 있는 데이터들에 대해 적합하지 않음
  • 음성은 적은 수의 파라미터로 만들어지는(변조되는) dynamic system. 실제로는 낮은 차원에 있음

3 Hidden Markov Models and the Variants

3.1 Introduction

  • uniformly spaced discrete time에 대해 사용

3.2 Markov Chains

  • markov chain은 discrete-state markov sequence markov sequence
  • state-occupation 확률이 있는데 이건 recursively 계산되는 것으로 무한 번 계산했을 때 HMM의 initial transition 확률에 해당.
  • state-occupation 확률 덕분에 수학적으로 기술하기 까다로운 것들도 그냥 비벼서 다 기술 가능하다는 장점이 있음.

3.3 Hidden Markov Sequences and Models

  • 그냥 markov chain은 관찰 가능함. 쓰면 output을 만든 state가 그대로 보이기 때문에 state에 randomness가 없음.
  • 그래서 안보이게끔 한층 더 넣어서 HMM 만듬

3.4 EM Algorithm and Its Application to Learning HMM Parameters

3.4.1 Introduction to EM Algorithm

  • 관찰 데이터에 대해 local optimum likelihood를 줌
  • 좋은 초기상태가 필요함
  • log likelihood는 closed-form으로 기술가능한데 expectation은 closed-form으로 만들기 어려움

3.6 The HMM and Variants for Generative Speech Modeling and Recognition

3.6.1 GMM-HMMs for Speech Modeling and Recognition

  • context-dependency 중요함(critically)

3.6.2 Trajectory and Hidden Dynamic Models for Speech Modeling and Recognition

  • (무슨 말인지 이해 안됨) GMM-HMM 좋은데 piece-wise stationary assumption이 있다는 단점이 있음
  • (그 다음 부분은 무슨 HMM 변종들을 잔뜩 설명하고 있는데 패스)

4 Deep Neural Networks

4.3 Practical Considerations

4.3.1 Data Preprecessing

  • normalization 빼먹지 말고 해라
  • (이건 정확하지 않은 말인 것 같은데?) 발화별 MFCC에 CMN적용하는 건 acoustic channel distortion을 줄임
  • (CMN이랑 standardization이랑 어떻게 다른지?) feature의 각 차원에 대해서는 보통 standardization(zero-mean unit-variance) 적용. 이건 global transformation

4.3.2 Model Initialization

  • DNN은 매우 비선형 모델, 파라미터 non convex, 초기값 매우 중요.
  • 그래서 weight들이 sigmoid 선형기울기 내에서 움직이도록 초기값을 0~1 사이로 해줘야 함.
  • 랜덤으로 초기화 하는 것도 중요함. 랜덤으로 안하면 만약의 경우 weight가 전부 1일때 그냥 아래층하고 똑같아지기 때문 -> symmetry breaking을 위함

4.3.4 Dropout

  • 각 뉴런이 서로에게 덜 의존하도록 해줌, 트레이닝 데이터에 노이즈를 추가하는 것과 같은 효과
  • DNN의 capacity를 줄임 -> generalization
  • training 시 매번 랜덤 monte carlo 샘플링 돌려야 해서 속도가 많이 느려질 수 있음 -> gaussian approximation(?)을 사용(무슨 샘플링의 일종인듯?)

4.3.5 Batch Size Selection

  • batch training(데이터 전체에 대해 한번씩 모델 업데이트 하는것) 하면 gradient의 variance가 안정적이긴 한데 느림
  • SGD로 하면 unbiased이고 좋은데 샘플 하나씩 해야 되서 gradient variance가 커져서 수렴이 잘 안됨(noisy). 물론 그래서 local optima를 빠져나올 수 있기도 함.
  • minibatch 써라

4.3.7 Momentum

  • convex condition에서 optimal이라고 알려짐 (하지만 이건 DNN인데…? momentum이 정말 효과가 있는지 비판하는 논문도 있음)
  • 수렴 속도 향상됨. oscillation 문제 줄여줌
  • mini batch size에 따라 조정해줘야 함(뭘?)

4.3.8 Learning Rate and Stopping Criterion

  • 샘플 수에 따른 적절한 rate가 있음
  • criterion이 한번 뛸 때마다(fluctuation이 있을 때마다) 배치사이즈를 줄여준다든지 하는 것이 필요

6 Deep Neural Network-Hidden Markov Model Hybrid Systems

6.1.1 Architecture

  • DNN이 senones(triphone 같은 것들)을 바로 모델링 하게끔 학습시키는게 젤 좋음.

6.1.3 Training Procedure for CD-DNN-HMMs

  • 모델 업데이트 시 likelihoo 식을 보면 성능이 올라가긴 하는데 개별 문장 하나에 대해 더 likelihood가 올라가는지는 장담못함.

6.2 Key Components in the CD-DNN-HMM and Their Analysis

  • CD-DNN-HMM 은 GMM의 likelihood 를 DNN의 posterior로 대체한 것이고, 그 이외엔 전부 같음.

6.2.2 Modeling Monophone States or Senones

  • senone을 바로 모델링 하면 DNN 자체의 성능은 좀 떨어질 수 있지만, overfitting을 방지할 수 있고 HMM하고 결합 시 더 성능이 좋아짐

6.2.6 Better Alignment Helps

  • 이미 트레이닝 된 DNN-HMM에서 나온 alignment로 새로운 DNN-HMM을 트레이닝하면 더 성능이 좋아짐(…)

7 Training and Decoding Speedup

7.1.1 Pipelined Backpropagation Using Multiple GPUs

  • 병렬화 제대로 안하면 minibatch 방식으로 모델 업데이트 할 때 bandwidth를 잡아먹어서 안좋음. gradient가 PCIe-2 limit(6GB)를 넘어감(…)
  • minibatch 사이즈를 작게 하면 업데이트를 많이 해야 해서 안 좋고, 크게 하면 batch를 크게 봐야 해서 안좋음(왜?). 적절하게 조정해야 함

7.1.4 Reduce Model Size

  • DNN weight는 low rank임. 마지막 layer가 전체 계산의 50%를 담당함(전체 계산이라는게??).
  • 적은 output target만 활성화됨. 활성화된 output들은 서로 correlated임.
  • low rank factorization으로 layer 하나를 linear layer + non-linear layer로 만듬. 이렇게 하면 파라미터 수가 줄어듬

7.2 Decoding Speedup

  • 실시간 디코딩 매우 챌린지함.
  • quantization + parallel computing + sparse DNN + low-rank factorization + multiframe DNN + SSE + lazy evaluation 전부 사용해봄. (multiframe DNN?)

7.2.2 Sparse Network

  • 대부분의 connection은 작은 weight를 가지고 있음. 70% 정도가 0.1보다 작음
  • (잘 모르겠음 패스)

7.2.3 Low-Rank Approximation

  • 보통 DNN weight나 그것들의 singular value는 0에 가까움. (SVD등을 했을 시) 크기 순으로 봤을 때 40% 정도의 singular value들이 전체 singular value의 80%를 차지함(크기를 말하는것 같음)
  • 모델 사이즈를 30%로 만들어도 성능 저하가 크게 없었음

7.2.4 Teach Small DNN with Large DNN

  • 제목 그대로…
  • criterion은 여러가지가 있을 수 있는데, 두 모델 간의 DL divergence를 최소화 한다든지 등
  • unlabeled data도 도움됨(어차피 큰 모델의 output을 사용하면 되니까…)

7.2.5 Multiframe DNN

  • 어차피 현재프레임이나 옆 프레임이나 다 비슷하니까 한번에 여러 프레임을 맞추는 모델을 만들자
  • 속도 빨라짐. (프레임을 한번에 많이 맞추려 할수록 약간씩 성능 저하가 있음)

8 Deep Neural Network Sequence-Discriminative Training

  • 음성인식은 사실 sequence classification임

8.1 Sequence-Discriminative Training Criteria

  • cross entropy(CE) criterion은 사실 expected frame error를 줄이고 있었음

8.1.1 Maximum Mutual Information (이건 좀 중요해서 여러 줄을 할애)

  • MMI loss = log{(post(label 문장 | observed) / marg(post(한 문장 | observed)}
  • MMI loss의 gradient = (모든 발화 * 시간 만큼 sum)(error signal * (irrelvant term))
  • 여기서 error signal을 어떻게 계산하느냐가 중요
  • error signal = k * [{1 - (DEN of label)} + sum{-(DEN of others)}] * (log posterior from DNN)
  • marg: marginalization을 줄여서 쓴 것
  • k: acoustic scaling factor
  • DEN of xx: [marg{post(xx를 가지는 모든 문장 | observed)}] / [marg{post(모든 문장 | observed)}]
  • (주의: 자의적 해석이 있습니다)
  • 실제로 '모든 문장'에 대해 marg. 계산을 할 수는 없으므로, decoded speech lattice 내에 있는 문장에 대해서만 함.
  • (이것들이 전부 sum 형태로 가능한 이유는 log를 붙여서임. log 참 좋다)

8.1.2 Boosted MMI

  • MMI loss 의 분모에 exp(-b * A(w,w_m)) 을 붙임. A(.,.)는 Accuracy라 하고, (# correct phones - # insertions) 임.
  • A(.,.)는 phone으로 하든 state로 하든 word로 하든 상관 없음

8.1.3 MPE/sMBR

  • MBR loss = marg{post(어떤 문장, o) * A(어떤 문장,label 문장)} / marg{post(또 어떤 문장)}
  • 여기서 '어떤 문장' 같은게 두개나 나와서 이해를 못하고 패스
  • state 기준으로 accuracy를 보면 A(w,wm)은 w와 wm 간에 같은 state가 몇개나 있는지 단순히 센 것
  • MBR loss gradient의 error signal = k * DEN' * {A'(r) - A'}
  • 여기서 DEN'과 A'(r), A'는 위에서 등장한 것들과 다름.
  • 더 구체적으로 써보려고 했는데 말이 늘어지고 너무 복잡해져서 그냥 수식을 볼 것을 권장드립니다

8.1.4 A Uniformed Formulation

  • loss 의 numerator lattice는 reference transcription에 해당, denominator는 후보 hypothesis들이라 볼 수 있음

8.2 Practical Considerations

8.2.1 Lattice Generation

  • sequence-discriminative 학습은 GMM-HMM lattice를 쓰든 DNN-HMM의 그것을 쓰든 성능이 좋다

8.2.2 Lattice Compensation

  • 결국 lattice를 어떻게 준비해놓느냐가 중요
  • 그런데 lattice에 silence가 많이 들어있으면 괜히 training epoch, deletion err만 증가. 심지어 overfitting 땜에 epoch 돌지도 못하고 멈춤
  • demoninator lattice의 silence frame를 적절히 제거하면 epoch도 많이 돌고 성능 올라감

8.2.3 Frame smoothing

  • 이것도 lattice를 미리 가공하는 건데 잘은 모르겠음.
  • L1, L2 regularization 도움 안됨

8.2.5 Training Criterion Selection

  • MMI, BMMI, MPE, sMBR 다 비슷비슷함. MMI가 가장 구현이 쉬우므로 이것 먼저 해보길 바람 (…)

9 Feature Representation Learning in Deep Neural Networks

9.1 Joint Learning of Feature Representation and Classifier

  • DNN 이전엔 domain knowledge로 feature 잘 가공하면 그게 장땡이었음

9.2 Feature Hierarchy

  • 대략 상위레이어로 갈 수록 대부분의 뉴런이 1 또는 0에 수렴. 그런데 0으로 수렴하는 경우가 훨씬 많음(즉 sparse feature를 만듬)
  • (왜 그렇지?) 상위 레이어는 invariant, discriminative인데, 이는 non-linear 변환을 많이 적용한 결과임
  • weight norm 측면에서 봐도 상위 레이어로 갈 수록 average norm은 작아지는데 maximum norm은 유지됨
  • 즉 discrimination 성능이 좋아짐(어느 한 차원에 대해 확실히 구별)
  • normalization -> filterbank -> non-linear -> pooling
  • filterbank: 높은 차원으로 projection
  • non-linear: sparsity에 robust, saturation
  • pooling: invariant feature 추출, 차원 축소

9.5.2 Robustness Across Speaking Rates

  • speaking rate: 얼마나 빨리 말하는지 시간 당 비율
  • 너무 빨리 말하거나 너무 느리게 말하면 WER이 올라감. 영어 기준으로 (7~9 phones / sec) 이 가장 인식 성능이 좋음 (데이터셋 때문인가?)

9.6 Lack of Generalization Over Large Distortions

  • mixed-bandwidth 방식(한 발화에 대한 16kHz, 8kHz feature 합치는 등)으로 학습 시키면 인식 성능이 더 좋음

10 Fuse Deep Neural Network and Gaussian Mixture Model Systems

10.2 Fuse Recognition Results (여러 음성인식 시스템 간 퓨전)

  • 대표적인게 ROVER와 SCARF가 있음. (SCARF는 어려워서 패스). ROVER는 2 step(alignment, voting)으로 되어 있음.
  • ROVER step 1: 여러 시스템에서 예측한 단어 시퀀스에 대해 word transition network를 만듬(겹치는 단어를 고려해서 시간 순으로 정렬)
  • ROVER step 2: transition network 내의 시점 별로 competing 단어 중 단어의 중복 수를 세서 하나를 고름
  • 뭔가 굉장히 나이브한테 성능이 좋음

10.2.3 MBR Lattice Combination

  • 각 시스템에서 나온 여러 Lattice들을 결합해서 하나의 Lattice를 만듬

11 Adaptation of Deep Neural Networks

11.4.3 Reducing Per-Speaker Footprint

  • Adaptation 할 때마다 새로운 모델을 저장하면 넘므 용량이 크니까 delta(변한 부분)만 저장하자. delta라 해도 matrix가 너무 크니까 SVD로 쪼개서 저장하자. 원래 delta의 10% 사이즈로 만들어서 저장해도 성능 저하가 별로 없음(;;;)
  • 쪼갤 layer를 하나 정하고, layer의 weight에 대해 SVD로 (U, S*V) 형태의 matrix 두개를 준비하고 아래처럼 레이어를 구성
  • S*V -> linear activation -> U
  • (실제로는 V가 아니라 V^T인데 편의상 V로)
  • adaptation 시킬 squared mat 하나를 준비해서 S*아래처럼 레이어를 다시 구성
  • S*V -> linear activation -> squared mat -> linear activation -> U
  • 다른 matrix는 고정시키고 adaptation set에 대해 squared mat만 학습시키면 효율적으로 adaptation 이 됨.
  • 이 방법 말고 SVD 결과로 나오는 U S V 중 S를 학습시키는 것도 좋음(S는 diagonal이라 파라미터 수가 거의 없음)

11.6.1 KL-Divergence Regularization Approach

  • adaptation이 정말 효과가 있는가? -> adaptation set 사이즈가 커질수록 성능이 향상