2019년 7월 13일 토요일

음성인식 메모(kaldi) 10 - input layer Karel's DNN

「原作者へ」

連絡先を存じ上げませんでしたので、不本意ながら無断で翻訳しました。 
正式に翻訳を許可されたいです。 
gogyzzz@gmail.comでご連絡ください。

아래 포스트의 번역입니다.

http://work-in-progress.hatenablog.com/entry/2018/04/15/110711


input layer의 구성을 파헤쳐보자.

input layer는 feature (MFCC)에 대해 변환을 수행한 것으로, 가령 MFCC가 13차, 198프레임이라 하면 변환 후는 143차, 198프레임이 된다.

(splice는 5로 가정, 상세한 내용은 앞 포스팅을 참고)

splice5.proto

<Splice> <InputDim> 13 <OutputDim> 143 <BuildVector> -5:5 </BuildVector>

이어서, splice한 결과를 정규화(CMVN、Cepstral mean and variance normalization)한다.

일단, 정규화를 위해 통계량을 구한다.

-> 「featbin/compute-cmvn-stats」 커맨드를 실행

이때, 제 2인자(WriteSpecifier)에는 "ark:"를 붙이지 않는다(붙이면 발화마다의 ID가 부여되지만, 다음 단계인 「nnetbin/cmvn-to-nnet」 커맨드를 실행 시 입력 에러가 난다.

featbin/compute-cmvn-stats ark:mosimosi_splice.ark mosimosi_splice.stat

[input] mosimosi_splice.ark (198row x 143col)

utterance_id_001  [
  62.45969 6.921756 -3.167147 <snip> 7.116017 3.814293 -11.61487 
  <snip>
  43.7294 -12.57844 0.5020582 <snip> -4.028705 9.270482 -15.07414 ]

< snip >은 '생략'이라는 의미로 사용

[output] mosimosi_splice.stat (2row x 144col)

[ 13006.95 -1868.364 -2065.489 <snip> -1037.709 1670.101 -1622.727 1103.897 -185.1455 198 
  917240.7 94988.03 56884.15 15132.56 <snip> 48641.36 32924.85 17136.12 17641.37 0 ]

1행째는 평균을 구하기 위한 것으로 열(차원)마다 값을 더한 것. 마지막 꼬리는 프레임 수를 나타낸다.

2행째는 분산을 구하기 위한 것으로, 열(차원)마다 값을 2승한 것을 더한 것.

이번엔 1개의 파일 밖에 없지만, 여러개의 파일의 경우 단순히 전부 더한다.

이어서 「nnetbin/cmvn-to-nnet」 커맨드를 실행하여, Nnet 형식으로 변환한다.

nnetbin/cmvn-to-nnet mosimosi_splice.stat mosimosi_splice.nnet

[output] mosimosi_splice.nnet

<Nnet> 
<AddShift> 143 143 
<LearnRateCoef> 0  [ -65.69 9.43 10.43 <snip> 8.19 -5.57 0.93 ]
<!EndOfComponent> 
<Rescale> 143 143 
<LearnRateCoef> 0  [ 0.05 0.05 0.07 <snip> 0.10 0.13 0.10 ]
<!EndOfComponent> 
</Nnet> 

「AddShift」는, 통계의 평균(예를 들어 1열째라면 13006.95 / 198 = 65.69)에 마이너스를 곱한 것

「Rescale」은 통계의 분산에 대해 아래 계산을 수행한 것

표준편차 / (( 분산 / 프레임 수 ) - (평균 2승))의 sqaure root

표준편차는 디폴트 1로, 예를 들어 1열째라면

1 / sqrt((( 917240.7 / 198 ) - (65.69 * 65.69)))
= 1 / sqrt(317.3)
= 1 / 17.80
= 0.0561

이어서, 「nnetbin/nnet-concat」 커맨드로 splice에 관한 Nnet과 결합한다. (아래 참고)

tr_splice5.nnet

<Nnet> 
<Splice> 143 13 
[ -5 -4 -3 -2 -1 0 1 2 3 4 5 ]
<!EndOfComponent> 
</Nnet> 
nnetbin/nnet-concat tr_splice5.nnet mosimosi_splice.nnet "output이 되는 Nnet의 이름" 

이것이 「nnetbin/nnet-forward」 커맨드나 「nnetbin/nnet-train-frmshuff」 커맨드의 「--feature-transform」 옵션으로 전달한 feature 변환의 파라미터가 된다.

(참고)파라미터를 「nnetbin/nnet-info」 커맨드로 표시

num-components 3
input-dim 13
output-dim 143
number-of-parameters 0.000286 millions
component 1 : <Splice>, input-dim 13, output-dim 143, 
  frame_offsets [ -5 -4 -3 -2 -1 0 1 2 3 4 5 ]
component 2 : <AddShift>, input-dim 143, output-dim 143, 
  shift_data ( min -65.6917, max 10.6742, mean -2.88202, stddev 19.0171, skewness -2.61368, kurtosis 5.95439 ) , lr-coef 0
component 3 : <Rescale>, input-dim 143, output-dim 143, 
  scale_data ( min 0.0505918, max 0.134276, mean 0.0879972, stddev 0.0225562, skewness 0.214666, kurtosis -0.551825 ) , lr-coef 0

댓글 없음:

댓글 쓰기