본문 바로가기
딥러닝으로 하루하루 씹어먹기

딥러닝 STT 모델 - ESPNet (1)

by Yoo Sung Hyun 2021. 5. 14.
728x90

BERT부터 설명을 하려고 하긴 했는데, 이제 곧 업무가 시작되기도 할 것이며, 최근에 논문을 읽어본 ESPNet에 대해서 먼저 정리해보겠다.

서론

사실 이전 회사에서, 크롤링 -> Text Analysis(TA) -> Power BI 시각화 업무를 PoC로 담당하여 진행한 적이 있었고, Seq2Seq기반 딥러닝으로 추출요약, KR-WordRank로 키워드 분석등을 진행해본 경험이 있다.

이 부분도 뭐 기회가 되면 소스로 올려보도록 하겠고, (실제로 운영서비스 되지 않아 소스까지 올려도 가능하지 않을까? 싶다.)

 

현재 회사에서도 TA를 하는줄 알았더니, 이게 왠걸 STT도 제대로 되어있지 않아서, STT부터 해야될 상황이 되버렸다. (사실 TA하는 줄 알고 BERT 소스, 논문 다까보고 있었는데...)

 

ETRI와 협업으로 진행되긴 할테지만, 베이스라인 모델이라는게, 분명 도메인에 실적용하면 기대만큼 적중률이 나오지 않을 것이고, 분명히 커스터마이징에 대한 챌린지가 들어올 것이 뻔하므로, ETRI 기술이전에 관련된 ESPNet을 먼저 톺아보기로 했다.

 

필자는 음성처리에 대한 지식은 한 3~4년전인가? Zeroth 초반에 시작됐을때, 최초 개발자들(이때 jo lucas도 있었다.)과 Summit 할 자리가 있어서, 같이 참석해서 음성처리와 딥러닝 이전의 작업들, 딥러닝으로는 어떻게 나아가야할 것인지에 대해 이야기했던 적은 있었는데, 아무래도 그때는 lstm, seq2seq 기반이었던거로 기억이 나서(하도 과거라 가물가물하다..;;), 사실 ESPNet을 시작함에 있어서, 매~우 기초적인 지식 수준만 갖고있을뿐, 완전히 새롭게 파악하는 것과 다름이 없었다.

 

필요 기초지식

이 부분은 먼저 이해하고 있지 않다면, 이후에 논문 이해에 어려움이 있을 수 있다. 적어도 '이런거구나' 정도는 파악하고 넘어가자.

Hidden Markov Model (HMM)

https://ko.wikipedia.org/wiki/%EC%9D%80%EB%8B%89_%EB%A7%88%EB%A5%B4%EC%BD%94%ED%94%84_%EB%AA%A8%ED%98%95

 

은닉 마르코프 모형 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 은닉 마르코프 모형(영어: hidden Markov model, HMM)은 통계적 마르코프 모형의 하나로, 시스템이 은닉된 상태와 관찰가능한 결과의 두 가지 요소로 이루어졌다고 보

ko.wikipedia.org

  • 사실 머신러닝/딥러닝 한다고 하면, 한번쯤은 들어본적 있지 않을까 싶다. 개인적으로 바움-웰치 알고리즘과 함께(뭐 서로 이어지는 내용이지만...), 이해하기 쉬우면서도 정말 어렵다. 역전파는 실제 문제에서 어느정도 레이어의 값들로 추상적으로나마 이해하고 활용할 수 있지만, HMM은 솔직하게 말하면 개념 자체를 추상적으로 이해하고 있을 뿐 예제에서 벗어나는 몇가지 다양한 케이스에 대한 계산은 적용시켜서 뭔가 해본적은 없다. 그래서 필자는 개인적으로 역전파 알고리즘보다 이게 훨씬 어렵다. ㅠㅠ
  • 시계열에 따른 다음값의 예측을 조건부확률의 재귀적 표현으로 표현할 수 있고, 그 결과값은 다음 행위에 대한 확률값이 된다.
  • 음성인식에서는 어떤 시점의 음성특징이 나왔을때, 해당 단어일 확률을 구하는 것으로, 시점에 흐름에 따라 각각의 단어를 조건부 확률을 이용해서 구하게되는 HMM 모델을 '과거'에 활용했다. (번역할 논문은 2018년 논문이나, 논문에서 영어는 HMM/DNN모델이 ESPNet보다 성능이 좋았다고 한다. 구관이 명관)

Kaldi

  • Kaldi부터 보자니, 너무 음성처리 도메인에 집중하게되서, 알고리즘 파악이 우선이므로, Kaldi를 톺아보는건 나중으로 미루겠다.
  • ESPNet은 기본 베이스는 Kaldi의 데이터 전처리와 특징 추출 알고리즘을 사용한다고 한다.
  • 일단은 믿고 쓰되, 필요에 따라 커스터마이징이 필요하다면 그 때 음성처리에 대해서 공부해보도록 하자.

Automatic Speech Recognition (ASR)

https://ratsgo.github.io/speechbook/docs/introduction

 

Introduction

articles about speech recognition

ratsgo.github.io

  • 말 그대로 자동 음성 인식. 음향 모델과 언어 모델을 이용하여(ESPNet은 언어모델은 선택이다.), 음향을 단어로 인식시킬 수 있게 하는 일련의 아키텍쳐, 알고리즘들을 전부 통용한다.
  • 대부분은 '어떤 음성이 들어왔을때 해당 단어가 등장할 확률'(조건부 확률)을 재귀적으로 표현한, HMM 모델에 기반하였으며, 조금 지식이 있다면 느낌이 올 것이, 딥러닝(lstm)을 활용하는 것과 비슷한 뉘앙스로 만들 수 있기 때문에, 딥러닝으로 많이 넘어가는 추세이다. (일단 조건부 확률이 재귀로 등장하면 곱이 많아져서 단어 수가 많을 수록 불리하다. 속도도 느려지고, 확률도 퍼지니까 예측하기 점점 어려워지겠지.)

Connectionist Temporal Classification (CTC)

https://ratsgo.github.io/speechbook/docs/neuralam/ctc

 

Connectionist Temporal Classification

articles about speech recognition

ratsgo.github.io

  • ASR에서, 음향 모델(Acoustic Model)과 언어 모델(Language Model)을 이용해서 만든다고 했다. CTC는 음향 모델로, 고전 음향 모델인 HMM 모델에서 신경망 학습 아이디어를 적용하였다.
  • 확률은 HMM을 사용해서 구하되, 경로별 확률에 따른 로그 우도를 계산하여, 기울기를 계산함으로써 최적경로를 탐색해나가는 것으로, 로그 우도를 계산하고 기울기를 계산해나간다는 점에서, 신경망 학습 아이디와 동일하다고 볼 수 있다. 때문에, 음성 시퀀스에 따라 가장 정확한 단어 순서(높은 확률값)에 가장 간단하게 도달하는 최적경로를 찾아나가는 과정을 '학습'할 수 있다.
  • 과거에는 음성 시간 별, 단어 시퀀스를 전부 라벨링하여 지도학습 시켰어야 했으나, CTC를 이용하면, 단어 시퀀스가 없더라도, 음성과 단어만으로 쉽게 음성 시간상에 따른 단어 매핑이 가능해졌다.

Attention

https://shyu0522.tistory.com/12

 

LSTM Attention 이해하기 - 어텐션 기초

Attention 예제 소스가 있는 git github.com/YooSungHyun/attention-time-forecast.git YooSungHyun/attention-time-forecast attention으로 시계열 예측은 할 수 없을까. Contribute to YooSungHyun/attention-ti..

shyu0522.tistory.com

  • 자연어 학습에 주로 활용되는 기술이며, 어떤 Source 시간 순서 별 등장이, Target 시간 T의 등장을 예측함에 있어 가장 상관관계가 높았는가? 를 계산하는 수학적 방식이다. (나는 사과를 먹었다. 를 영어로 번역할 때, apple을 예측하기 위한 한국어는 어디에 가장 집중해서 봐야하는가?)
  • 주로 유사도를 구할때 사용하는 벡터의 내적(Dot-Product)을 활용하는 경우가 기본적이며, 때에 따라서는 여러가지 방식들의 Attention 기법들이 존재한다.

여기까지의 내용이 ESPNet 논문에 주로 등장하는 이야기들이다. 톺아본다면야 자연어 처리 쪽에서는 더할나위 없이 좋은 내용들도 있으나, 급하다면 '이런거구나~' 정도만 알고 넘어가도, 논문 이해에는 크게 어려움은 없을 걸로 보인다.

 

논문 번역 요약

원문

https://arxiv.org/abs/1804.00015

 

ESPnet: End-to-End Speech Processing Toolkit

This paper introduces a new open source platform for end-to-end speech processing named ESPnet. ESPnet mainly focuses on end-to-end automatic speech recognition (ASR), and adopts widely-used dynamic neural network toolkits, Chainer and PyTorch, as a main d

arxiv.org

필자 해석 필기본

espnet_ori_본인해석.pdf
3.42MB

알아볼 수만 있다면, 필자 해석 필기본을 한번 보는게 더 유용하긴 하겠다. 여기에는 필기본보다도 더 요약해서 쓸 것이기 때문에.

언제나와 같이 내 의견은 '--  --' 블럭으로 작성하겠다.

 

ESPNet은 일단, PyTorch, Chainer 기반으로 작성되어있다.

Attention과 CTC를 병합하여, 둘의 장점만 활용하고 있다.

Attention Score와 CTC one-pass beam pass score를 이용해서 학습한다.

서로 병합함으로써, 이상치 제거에 효과적이고, 수렴이 빠르다. (학습속도가 빠르다.)

 

-- 이 부분은 살짝 의문인게, Attention도, CTC도 한 문장의 길이가 꽤나 길면, 상당히 느릴 것으로 판단된다. 결국 곱계산은 피할 수 없기 때문인데, 그래도 상대적인 다른 음향모델들 보다는 빠르다는 의미로 해석해야 될 것으로 보인다. --

 

-- 조금 의문인게, CTC와 Attention을 같이 활용하는 것이, 서로 어떤 단점을 보완하여 장점만 가져가게 하는지 조금 이해가 안되긴 한다.

결국 산술적 수치(Attention Score)를 활용하느냐, 신경망의 비선형적 결과 수치(CTC)를 활용하느냐인데, 결국 표현하고자 하는 바는, 어떤 시점의 파형특징에서, 어떤 단어글자가 등장하게 되느냐를 구하는 것일 뿐이기 때문이다.

기억하기로 Attention은 비교적 인코더에 귀속되는 편이라서, 예측값이 들어온 인코더 값 수치에 제한될 수 있는 단점이 있다면, CTC의 HMM은 매 파형마다 단어글자를 확률로 계산하기 때문에, 그나마 근사한 무언가라도 추출되기 때문이지 않을까? 라고 생각은 하고 있다. (HMM 기반의 CTC가 Attention보다 아웃라이어에 좀 더 강하지 않을까...?라는 생각) --

 

ESPNet은 기능 제공의 폭이 넓다.

  • Kaldi의 데이터 전처리와 특징 추출을 활용하며, Kaldi로만 처리된 결과와 비교해볼 수도 있는 기능이 있다.
  • BI-LSTM 기반의 Attention을 사용하고 있으며, Chainer를 사용하면 VGG 래퍼의 Attention도 활용할 수 있고, 이게 그냥 Attention 사용하는 것 보다 효과가 더 좋았다.
  • Attention은 11개의 알고리즘이 제공된다. (기본은 내적, BERT의 Multi-Head도 지원된다.)
  • CTC와 Attention Score의 비율을 조정해서 사용할 수도 있으며, Unigram 평활을 이용했으므로 오버피팅에도 강하다.
  • 이전값으로 예측된 현재값을 이용해서 CTC/Attention Score를 활용하는 것으로, 이상치에 강하다.
  • RNN기반의 언어모델(RNNLM)이 제공되며, 사용은 필수는 아니고 선택 가능하다.
  • 여기서는 영어뿐만 아니라, 일본어, 중국어에서도 유의미한 결과를 얻을 수 있었다.

-- 기능은 진짜 혜자인거 같긴 하다...ㅋㅋㅋ --

 

이 이후에는, 간단한 사용법과, 기능대비 코드가 얼마나 짧은지, 실제 데이터를 돌려봤을때 어떤 결과를 얻어냈는지에 관한 이야기이다.

 

데이터 양은 논문에 정확하게 기재되지 않아서 내가 직접 데이터를 찾아보진 않았지만, 논문에서는 1080TI 기준 PyTorch로 5시간, Chainer로 20시간 소요되었다고한다. -- 역시 Chaniner는 Attention이 VGG기반이라 더 오래걸리는 듯 하다 --

 

영어는 HMM/DNN기반이 좀 더 좋았다고 한다. 구관이 명관이긴 하다고 이야기하나, 그래도 연구수 대비 ESPNet이 충분히 선전했으며, 추후 연구가치는 충분하다고 평가한다.

 

일본어와 중국어는 성능에서는 HMM/DNN과 비교했을때 조금 더 좋거나, 비슷하더라도 속도면에서 이득이므로, 사용가치가 충분하다고 설명한다. (5 GPU 환경에서 581시간 데이터 학습에 26시간 걸렸다고 한다.)

 

결과적으로는, 딥러닝에 의한 연구는 이제 활발히 진행되고 있고, 소스도 훨씬 간단하며, 속도도 빠르니, 전망있는 기술이라는 이야기로 논문이 끝이난다.

 

정리겸으로, 우리가 논문으로 알 수 있는 정보는,

ESPNet을 그냥 사용하고 싶다면,

1. 데이터 추출

2. ESPNet 사용

3. 검증

에 매우 간단한 작업만 진행하면 된다. 논문상으로 봤을때, 데이터도 그냥 '음성파일, 문장' 구성이기만 하면 될 것 같다. 

심지어 그냥 그대로 사용하려면 사용 설명서까지 매우 상세하게 git에 있다.

https://github.com/espnet/espnet

 

espnet/espnet

End-to-End Speech Processing Toolkit. Contribute to espnet/espnet development by creating an account on GitHub.

github.com

 

만약, 커스터마이징 하고싶다면,

1. CTC Score 계산방식 변경

  • One-Pass Beam은 가장 가능성 높은 1개의 패스만 따라가게 되므로, 속도는 빠를지 몰라도, 한번 잘못빠지면 되돌리지 못할 수 있다. 다른 Score 방식을 채용해보는것도 방법.

2. Attention Score 계산 방식 변경

  • Dot-Product에서 변경해보는 것도 방법이겠다. 컴퓨팅 파워만 좋다면, 현재 기준으론 Multi-head 따라갈 것이 없을텐데...

3. CTC : Attention 비중 변경

4. unigram 평활방식 변경

  • 자연어라서 unigram이 사실 가장 무난해보이긴하는데, 뭐 바꿔서 테스트 해볼 수는 있지.

5. 언어모델의 선택과 변경

  • BERT에서도 느껴지지만, 언어모델은 데이터의 수와 종류, 컴퓨팅 파워에 절대적으로 지배되는 경향이 강해서, 솔직히 작은 회사에서 가능할지는 잘 모르겠다.

6. CTC 방식 튜닝

  • 한국어는 '한' '국' '어'로 떼도 되지만, 'ㅎㅏㄴ' 'ㄱㅜㄱ' 'ㅇㅓ'로 때도 된다. 아니면 HMM말고 다른 방식으로 튜닝해보는 것도 가능하지 않을까?

논문을 읽어보지 않고 막연하게 적용만 하고 있었다면, 이런 아이디어들은 얻어낼 기회조차 없었겠지.

매우 뜻깊은 시간이었다고 생각한다.

 

2020년에 ESPNet이 개선된 새로운 논문이 하나 발표되었는데, 이것도 읽고 정리해봐야겠다.

728x90

댓글