음성인식에서 가장 기초적인 CTC를 공부하려는데, 명쾌하게 어떤 방식으로 돌아가는지 정리된 블로그가 없어 작성해보고합니다.

 

CTC는 아래 논문에서 처음 제시되었습니다.

https://www.cs.toronto.edu/~graves/icml_2006.pdf 

A. Graves, S. Fern´andez, F. Gomez, and J. Schmidhuber, “Connection-ist temporal classification: labelling unsegmented sequence data withrecurrent neural networks,” in Proceedings of the 23rd internationalconference on Machine learning, 2006, pp. 369–376.

 

먼저 CTC는 target label $\textbf{l}$ 이 나올 수 있는 가능한 모든 alignment path들의 posterior probability들의 summation으로 정의가 됩니다.

target label l의 posterior probability

예를 들어, 8초 길이의 input sequence x를 받고 target label sequence인 단어 'CAT'을 출력해야한다면, C, A, T가 어느 시간인지는 모르지만 slience ($\emptyset$; blank token)을 포함해서 쭉 순서대로 출력하게될 것 입니다. 그러면 아래처럼 다양한 alignment path가 존재나옵니다.

CAT이 나올 수 있는 alignment path

이 모든 alignment path들은 아래처럼 정의된 collapsing function $B(\pi)$를 거치면 $\emptyset$과 여러 번 중복되서 나오는 token들을 제거해 target token으로 맵핑합니다. (따라서 위 수식에서 $B^{-1}(\textbf{l})$은 target $\textbf{l}$에 대한 가능한 모든 path들의 집합을 의미)

이제 input sequence $\textbf{x}$가 들어갔을 때 $\textbf{l}$이 나올 확률을 구하기 위해서는 각 path $\pi$들의 posterior probability를 계산해주어야합니다. 해당 값을 아래 식처럼 모델을 통해 추정된 각 frame 별 classification 결과에 따른 probability $y_{\pi_{t}}^{t}$의 곱으로 계산할 수 있습니다.

해당 $y_{\pi_{t}}^{t}$는 병렬적으로 모델에서 frame-wise classification을 통해서 구하게 됩니다.

여기서 이 path를 찾을 때 CTC가 가정을 하는 점이 있습니다.

가정: "target token의 사이와 sequence의 양 끝에 blank token이 있다"는 점입니다. 따라서 모든 path는 아래의 확장된 target sequence를 따라서 계산하게 됩니다.

 

물론 그냥 무작정 계산을 할 수도 있겠지만, 그렇게 되면 시간복잡도가 exponential하게 증가하게 됩니다.

따라서 논문에서는 해당 연산을 여러 iteration으로 나눠서 처리하는 forward-backward algorithm을 제시하였습니다.

 

forward-backward algorithm의 식은 아래와 같이 복잡해보이지만... 사실 규칙을 그대로 반영한 것이기 때문에 그림으로 보았을 때 더 이해하기가 쉽습니다.

path를 구하는 과정은 아래와 같이 격자형태의 그래프로 나타낼 수 있습니다. CTC는 monotonic assumtion이기 때문에 아래와 같은 규칙에 따라 path를 찾아나갑니다.

규칙1: 제자리 유지, 앞으로 이동만 가능 (뒤로 이동이 불가)

규칙 2: 다른 위치면서 동일한 sequence로는 skip이 불가능하다.

forward variable은 현위치를 이동할 수 있는 후보들의 variable들의 합에 해당 토큰이 t번째 시간(=frame)에서 나올 확률$y_{l^{'}_v}^{t}$를 곱해 계산합니다.

 

예를 들어,

붉은 원의 forward variable을 구하게 되면 규칙에 따라 blank token에서 2번째 뒤에 blank token으로 이동이 불가하기 때문에 $\alpha(2, 2)$와 동일 위치인 $\alpha(2, 3)$만 해당 $\alpha(3, 3)$으로 이동이 가능합니다.

파란 원의 경우에는 위 if 조건에 해당이 되지 않으니 $\alpha(T-2, 6)$, $\alpha(T-2, 5)$, $\alpha(T-2, 4)$으로 부터 이동할 수 있습니다.

 

어떤 고정된 시점과 위치 $(t, v)$에 대하여 그 지점의 점유 확률(occupation probability)은 forward variable과 backward variable의 곱으로 구할 수 있게됩니다.

그럼 최종적으로 모든 alignment path $\pi$에 대하여 posterior probability $p(\pi|\textbf{x})$를 계산하여 해당 target sequence에 대한 posterior probability $P(\textbf{l}|\textbf(x))$를 구해 CTC loss를 계산할 수 있게됩니다.

*참고로 CTC loss는 negarive log likelibood입니다.

https://devbirdfeet.tistory.com/169

 

Windows - AWS CLI 설치하기 (AWS Session Manager 구성)

윈도우에 맥 개발환경과 동일한 세팅을 위해 AWS Session Manager(SSM) 를 설치하려고 한다. 그러기 위해서는 AWS CLI 가 설치가 되어있어야 그 위에서 SSM 을 사용할 수 있다. 맥에서는 $ brew install awscli 만

devbirdfeet.tistory.com

 

AWS에 있는 Open dataset 다운받기

https://brain-nim.tistory.com/46

 

AWS S3 한번에 다운받기 (AWS CLI)

AWS 콘솔은 어지간히 불편한게 많습니다. 별 것 아닌 것 같은 기능이 지원이 안되죠. 대표적인게 S3의 데이터를 폴더째 다운받거나 여러개를 한번에 다운받는게 안된다는 것입니다. 현재로서는

brain-nim.tistory.com

 

'신호처리' 카테고리의 다른 글

[DSP] CTFT와 DTFT의 관계  (0) 2024.01.04
[Sampling] Upsampling  (0) 2023.11.16
[Emphasis] Pre-emphasis 와 De-emphasis  (0) 2023.11.10
Noise Pattern  (0) 2023.11.10

https://velog.io/@ddeo99/VS-Code-C-%EC%82%AC%EC%9A%A9-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95

 

VS Code C++ 환경 설정 (MinGW 설치)

VS Code에서 C++ 헤더 파일과 관련된 에러가 계속하여 발생하여 vscode와 .vscode 폴더를 삭제하여 vscode 설정을 초기화하고 재설치를 진행 하였다. 1. MinGW 설치 다운로드 링크에서 this direct link to the MinG

velog.io

 

MinGW 설치 파일이 다운로드 자체가 안돼서 애먹었는데,,, 위의 블로그 글 따라해서 성공했다.

'환경구축' 카테고리의 다른 글

CMAKE Error 해결  (0) 2024.03.21

+ Recent posts