2019년 7월 13일 토요일

음성인식 메모(kaldi) 8 - training Karel's DNN

「原作者へ」

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

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

http://work-in-progress.hatenablog.com/entry/2018/04/02/214421


DNN모델의 학습 과정을 따라가보자.

학습에는 「nnetbin/nnet-train-frmshuff」 커맨드를 사용한다.

nnetbin/nnet-train-frmshuff \
--minibatch-size=128 \
--randomize=false \
scp:train/feats.scp \          <--input이 되는 feature
ark:mosimosi_ali2post.ark \    <-- 정답 파일
nnet.init \                    <-- 모델
dbn_dnn_iter1                  <-- 업데이트 후의 모델

옵션으로 아래와 같이 지정. 처리의 흐름을 파악하는 것이 목적이므로 randomize는 off로 한다.

mini-batch의 사이즈는 「128」(=2의 7승, 198프레임에 대한 coverage는 65%)

randomize은 사용하지 않는다(input이 되는 MFCC의 프레임을 shuffle하지 않는다)

초기 모델(nnet.init)은 아래의 조건으로 생성

  • input layer : 13 (MFCC13차원)
  • output layer : 6 (pdf-id의 수)
  • hidden layer(중간층)의 수 : 1
  • hidden layer의 neuron 수 : 256

Propagate(Forward)의 흐름은 아래 그림과 같다.

그림의 의미

  • mini : mini-batch size(여기 예시에서는 「128」)
  • prop_buf : forward-pass buffers
  • transpose : transpose 행렬을 사용

그림의 "prop_buf[5]"가 output layer에 있어서의 activation(softmax)의 출력이 된다.

값은 아래와 같이 나타났다. 각 프레임에서 가장 확률이 높은 것을 녹색, 정답에 해당하는 것은 빨간색으로 표시하였다.

한편 정답이 되는 Matrix는 아래 그림과 같다.

이것은 "bin/ali-to-post" 커맨드의 출력 결과인 "mosimosi_ali2post.ark"에서 생성된 것

mosimosi_ali2post.ark

utterance_id_001 [ 3 1 ] [ 3 1 ] [ 3 1 ] [ 3 1 ] [ 3 1 ]  ...(이후 193개 생략)

2개의 Matrix의 차를 얻자

이것이 back propagation의 input이 된다.

Propagate(backward)의 흐름은 아래 그림과 같다(2개의 Matrix의 차를 구한 것은 "backprop_buf[5]"에 해당)

그림의 의미

  • backprop_buf : backward-pass buffers

모델의 파라미터 업데이트에 사용되는 gradient를 구해보자.

그림의 의미

linearitycorr : gradient

gradient

이것에 learning rate 「0.008」을 곱한 것을 업데이트 전의 파라미터에 빼서 파라미터를 업데이트한다.

파라미터 (업데이트 전)

파라미터(업데이트 후)

댓글 없음:

댓글 쓰기