2019년 7월 13일 토요일

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

「原作者へ」

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

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

http://work-in-progress.hatenablog.com/entry/2018/04/09/211753


pre-training의 흐름을 따라가보자.

input이 되는 음성은 연속값이므로, GB(Gaussian-Bernoulli)형의 Restricted boltzmann machine(RBM)을 사용한다.

  • visible: Gaussian, 연속값을 취한다.
  • hidden: Bernoulli, 이산값을 취한다.

nnet (Karel's DNN)에서는 「nnetbin/rbm-train-cd1-frmshuff」 커맨드를 실행한다.

nnetbin/rbm-train-cd1-frmshuff 1.rbm.init ark:mosimosi.ark 1.rbm

「1.rbm.init」은 「nnetbin/nnet-initialize」 커맨드에 아래 prototype을 input으로 전달하여 생성한다.

<NnetProto>
<Rbm> <InputDim> 13 <OutputDim> 16 <VisibleType> gauss <HiddenType> bern <ParamStddev> 0.1
</NnetProto>

아래 그림은 visible을 「13」, hidden layer를 「16」으로 나타낸 것

데이터를 저장하는 행렬은 소스 내의 변수이름으로 표시되어 있다.

mini : mini-batch size
( ) x ( )은 행렬을 나타낸다(row x col)

일단 forward-pass를 구한다.

pos_vis

feature로부터 미니 배치 파일만큼을(여기 예시에서는 디폴트 값 100) 취하여 프레임 순서를 랜덤으로 섞는다

vis_hid

「1.rbm.init」, hidden layer의 파라미터

pos_hid

「posvis」와 「vishid」(Transpose)의 곱셈

pos_hid(sigmoid 적용 후)

이것에 랜덤값을 더하여 [-1..1]의 범위가 되도록 조절한다.

또한 Heaviside step function을 적용한다(0보다 크다면 「1」、0보다 작으면 「0」)

poshidaux

이것에 「vishid」(hidden layer 파라미터 16row x 13col)을 곱한 것이 「negvis」이 된다.

neg_vis

「posvis」와 같은 방식으로 「negvis」에 대해 forward-pass을 구한다.

neg_hid(sigmoid 적용 후)

여기까지 얻은 4개의 행렬 「posvis」、「negvis」、「poshid」、「neghid」을 가지고 hidden layer 파라미터 「vis_hid」를 업데이트 한다.

일단 「neghid」(100row x 16col, Transpose)와 「negvis」(100row x 13col)를 곱한다.

이것에 「poshid」(100row x 16col, Transpose)와 「posvis(100row x 13col)」를 곱한 것을 더한다.

더한 결과

이어서 「vis_hid」에 learning-rate와 L2 regularization 파라미터를 곱한 것을 더한다.

이 결과를 「vis_hid」에 더한 것이 업데이트 후의 파라미터가 된다.

vis_hid

댓글 없음:

댓글 쓰기