Audio Auto Tagging
- 오디오 신호에서 발생하는 이벤트 종류를 찾는 문제
- 아기의 웃음 소리나 기타 소리가 동시에 있는 소리는 즉시 인식
- 전기 톱 소리와 믹서기 소리는 유사해 인식하기 어려움
- 여러 이벤트를 tagging하는 multi-label classification
Metric
- IR(Information Retrieval)
- 실제로 1인 label에 대해 얼만큼 높은 확률로 예측
- Average Precision
- precision-recall 그래프의 아래 면적
- Rank-Average Precision
- LRAP(Label-Weighted-Label-Ranking-Average-Precision)
- 라벨이 1인 값에 대해서만 rank precision 계산
- multi-label ranking 문제에서 자주 사용
- precision-recall 대신 label ranking 사용
- 0이상 1이하
- 상위 라벨의 몇 퍼센트가 실제 라벨인지 측정
- LRAP(y,f^)=nsamples1Σi=0nsamples−1∣∣yi∣∣01Σj:yij=1rankij∣Lij∣where,Lij={k:yij=1,f^ik≥f^ij}rankij=∣{k:f^ik≥f^ij}∣
- [고양이, 개, 새]
- 고양이만 있는 이미지는 [1, 0, 0] 으로 표현
- 해당 이미지를 모델에 입력해 [.9, .2, .3]을 얻음
- 고양이가 1위이고, 고양이 라벨이 정확하고 이동할 필요가 없으므로 해당 값도 1
- 1/1 = 1
- 다른 모델은 해당 이미지를 [.6, .8, .1]로 출력
- 개, 고양이, 새 순서로 순위 차지
- 올바른 라벨(고양이)의 순위는 2
- 그 과정에서 올바른 레이블 있었는지 확인: 1만 있다?
- 정답 라벨 개수 / 2위 = 1/2 = .5
- 이미지에 고양이와 새가 있는 경우: [1, 0, 1]
- 모델 출력: [.8, .2, .9]
- 고양이: 2개의 올바른 라벨 존재 / 순위 2위 = 2/2 = 1.
- 새: 1개의 올바른 라벨 존재 / 순위 1위 = 1/1 = 1.
- 잘못된 라벨 지정 - 이미지에 고양이, 강아지 존재: [1, 1, 0]
- 모델 출력: [.1, .2, .8]
- 고양이의 경우, 라벨 2개 / 3위 = 2/3 = 0.66
- 강아지의 경우, 라벨 1개 / 2위 = 1/2 = 0.5
- 각 클래스 최종 점수 계산
- 각 점수 평균
- 고양이: (1 + .66) / 2 = .83
- 개: .5 / 1 = .5
- 새: 1/1 = 1.
- 해당 모델의 최종 점수 계산
- 가중 평균 사용
- (고양이 2마리/라벨 4개) .83 + (개 1마리/라벨 4개) .5 + (새 1마리/라벨 4개) * 1. = .79
- 그러므로 (1 + 1 + .66 + .5)/4 = .79
Procedure
- wave form → mel spectrogram → modeling-feature extraction(CNN, RNN) → modeling-classifier
- 오디오마다 sequence 길이가 다르면 data를 여러 개로 쪼갬 (label 복사)
Speech Recognition (STT)
- 사람이 말하는 음성 언어를 컴퓨터가 해석해 문자 데이터로 전환
- 평가 지표
- Levenshtein Distance
- 두 개의 문자열이 얼마나 유사한지
- 두 개의 문자열이 같아지기 위해 몇 번의 연산을 수행해야 하는지?
- joint CTC: 한국어 STT 논문
- ClovaCall: github에 코드 존재
CTC(Connectionist Temporal Classification) Loss
- speech recognition 손실 함수
- STT의 데이터셋은 오디오 클립과, 스크립트
- 어떤 단어의 character가 audio와 alignment가 맞는지 알 수 없다.
- 2초 동안 조용하다가 hello라고 말하는 것과 바로 hello를 말하는 것 모두 script는 hello로 동일
- CTC는 둘 사이의 가능한 모든 alignment의 가능성을 합산해 적용
- input도 output의 가능한 alignment를 모두 뽑아 marginalize한다는 의미
- 하지만 모든 X에 Y가 할당되는 것은 옳지 않다.
- silence가 존재하는 부분 또한 글자가 할당될 수도 있기 때문
- 이를 방지하기 위해 토큰 ϵ 사용
- input과 같은 길이로 alignment 진행 후, y로 mapping할 때 ϵ 제거
- alignment 과정에서 하나의 input에서 다음 input으로 진행하면서 output을 동일하게 유지하거나 다음 output으로 assign
- hello가 output일 경우, 하나의 Input이 h일 때 다음 input은 h 또는 e 할당
- many-to-one 문제: 여러 개의 input이 h에 할당
- 만약 input과 연결되지 못한 output의 글자가 있을 경우 해당 경우는 배제
- hello가 나와야하는데, hllo가 나오면 ctc 계산에서 배제
- 계산
- input sequence의 spectrogram으로 시작
- input은 RNN 계열 layer의 input으로 들어옴
- ouput 각 글자(h,e,l,o,ϵ)의 time step 별 확률 분포 반환
- time step별 output을 갖고, 다른 시퀀스 간의 확률을 구함
- alignment에 대해 marginalize를 진행하면, output의 확률 분포 계산 가능
- p(Y∣X)=ΣA∈AX,Y∏t=1Tpt(at∣X)
- ΣA∈AX,Y: 모든 validation alignment를 marginalize
- ∏t=1Tpt(at∣X): step별 alignment 확률 계산
- p(Y∣X): CTC 함수 - 조건부 확률 분포
- time step별 확률 분포를 얻기 위해, input sequence의 context를 고려하기 위해 RNN 기반 모델 사용해 학습
- 모델 파라미터 학습
- θ^=argmaxθ∏i=1Np(z(i)∣x(i);θ)p(z(i)∣x(i)=Σπ∈B−1(z)p(π∣X;θ)
- 길이가 t인 sequence의 가능한 경로 집합: π
- 즉, input이 주어졌을 때 확률이 가장 높은 alignment를 찾자!
- 손실 함수
- θ^=argmaxθ∏i=1NΣπ∈B−1(z)p(π∣X;θ)
- θ^=argmaxθΣi=1NlogΣπ∈B−1(z)p(π∣X;θ)
- log를 취해주면 ∏가 Σ로 바뀐다.
- θ^=argminθ−Σi=1NlogΣπ∈B−1(z)p(π∣X;θ)
- 해당 방법으로 모든 경우의 수를 찾게 되면, 길이가 길어질수록 음소 수가 많아질 수록 경우의 수가 너무 많아지고 연산량이 커진다.
- h(x)=argmaxl∈L≤Tp(l∣x)
- 그렇기 때문에 주어진 data에 대한 alignment의 확률 중 가장 높은 alignment를 사용(Greedy한 방법)
- 해당 방식은 구현이 편하지만 좋은 방식은 아니다.
- 그렇기 때문에 다이나믹 프로그래밍으로 딥 서칭을 해라.
- 다이나믹 프로그래밍
- 모든 output 음소 사이에 \epsilon 존재
- output의 시작은 ϵ이나 첫 음소가 등장
- ϵ 다음에는 ϵ이나 다음 글자 등장
- 음소 다음에는 자기 자신이나 다음 음소, ϵ 등장
- output 음소에 없는 글자는 등장할 수 없으며, 모든 음소가 등장해야 한다.
- αt(s)={{αt−1(s)+αt−1(s−1)}yls′t,{αt−1(s)+αt−1(s−1)+αt−1(s−2)}yls′t}
- 순환 함수로 설명 가능(recursive)
- 즉, 마지막 2개의 α값으로 alignment를 설명할 수 있다.
- 즉, 모델을 통해 각 sequence 별 확률 분포가 나오면 이를 통해 적절한 alignment를 찾는 것!!!!
- DeepSpeech2는 input을 encoding해 CTC를 구함
- Encoder, Decoder을 통해 CTC를 구하는 것은 LSA
LSA
- Listener: Encoder로 음성 신호를 feature extraction
- BiLSTM을 pyramical 형식으로 3개를 붙여 사용
- 이를 pBLSTM라고 부르는데, pBLSTM 1개당 연산 속도를 2배 줄여주기 때문에 사용
- hij=pBLSTM(hi−1j,[h2ij−1,h2i+1j−1])
- 음소 단위, 단어 단위, 문장 단위 모두 포착 가능
- Attend&Spell: 어텐션 모듈
- score=fc(tanh(W(query)+V(value)+conv_attn+b))
- 최종적으로 P(yu∣yu−1,…,y0,x)를 계산
- 이전 step까지의 decoding 정보와 input step 정보 받아 계산
참고
https://velog.io/@tobigsvoice1516/2%EC%A3%BC%EC%B0%A8-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EB%B0%98-%EC%9D%8C%EC%84%B1%EC%9D%B8%EC%8B%9D-%EA%B8%B0%EC%B4%88
https://www.youtube.com/watch?v=YiW7aOTZFQQ&list=PL9mhQYIlKEhdrYpsGk8X4qj3tQUuaDhrl