2019년 7월 15일 월요일

음성인식 메모(kaldi) 24 - parameter update Dan's DNN(nnet2)

「原作者へ」

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

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

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


「AffineComponentPreconditionedOnline」 컴포넌트의 파라미터 업데이트 과정을 따라가보자.

모델은 「nnet4c」 기반, mixup을 수행하기 전의 상태

이번에 확인하려는 것은 아래 그림의 점선 부분의 파라미터

BackPropagation에서는 아래 2개의 값을 사용하여 업데이트한다.

또한 여기서 minibatch-size는 「128」로 한다.

  • 「invaluetemp」 : Propagation에서 Tanh 컴포넌트를 통과한 이후의 값(128row x 375col)에 대해, 각 행의 마지막에 「1.0」을 추가한 것(128row x 376col)
  • 「outderivtemp」 : Backpropagation에서 Softmax 컴포넌트를 통과한 이후의 값의 복사본(128row x 192col)

AffineComponentPreconditionedOnline 클래스의 멤버인 2개의 OnlinePreconditioner 클래스에 위 2개를 각각 전달한다.

nnet2/nnet-component.cc

void AffineComponentPreconditionedOnline::Update(
 CuMatrixBase<BaseFloat> &in_value,
 const CuMatrixBase<BaseFloat> &out_deriv)
{
 ...
 preconditioner_in_.PreconditionDirections(&in_value_temp,
                                              &in_row_products,
                                              &in_scale);
 preconditioner_out_.PreconditionDirections(&out_deriv_temp,
                                               &out_row_products,
                                               &out_scale);
 ...

여기에서의 처리 내용의 세부사항은 Daniel povey의 논문에 쓰여 있다.

업데이트 전의 invaluetemp(128row x 376col、 논문의 「X_t」에 해당

0.265  0.362  -0.999  -0.999  -0.946  ... 1
...

t : minibatch index

여기에서, Xhatt를 구한다.

R=30(rankIn(낮은 랭크 근사)의 차원)

「W_t」는 R x D의 Weight Matrix(D=376)

N=128(minibatch size)

업데이트 후의 invaluetemp(128row x 376col、 논문의 「Xhatt」에 해당

0.035  0.562  -0.010  0.040  -0.575  ...
...

해당하는 소스코드 (nnet-precondition-online.cc)

// X_hat_t = X_t - H_t W_t
X_t->AddMatMat(-1.0, H_t, kNoTrans, W_t, kNoTrans, 1.0);  

「Xhatt」의 각 행의 inner product ( (0.035 * 0.035) + (0.562 * 0.562) + (-0.010 * -0.010) + …)를 구한다.

이것이 「inrowproducts」에 해당한다.

inrowproducts (128dim)

62.02  44.57  66.93  81.97  59.58 ...

게다가, 아래 식에 따라 gamma_t를 구한다.

이것이 「in_scale」에 해당한다.

in_scale

2.04739451

「preconditionerout」에 대해서도 같은 처리를 수행한다.

업데이트 전의 outderivtemp(128row x 192col、논문의 「X_t」에 해당)

-0.000  -6.5e-06, -9.9e-06, -1.2-06, -7.5e-07 ...
...

업데이트 후의 outderivtemp(128row x 192col、 논문의 「Xhatt」에 해당)

0.048  -5.5e-06  -0.000  5.9e-08  -0.000  ...
...

outrowproducts(128dim)

0.136  0.163  0.000  0.072  0.008  ...

out_scale

2.1778152

「invaluetemp」(128row x 376dim)로, 「invaluepreconpart」(128row x 375dim)、「preconones」(128dim)를 구한다.

AffineComponentPreconditionedOnline::Update()의 내부 처리

CuSubMatrix<BaseFloat> in_value_precon_part(in_value_temp,
                                            0, in_value_temp.NumRows(),
                                            0, in_value_temp.NumCols() - 1);

CuVector<BaseFloat> precon_ones(in_value_temp.NumRows());
precon_ones.CopyColFromMat(in_value_temp, in_value_temp.NumCols() - 1);

「inscale」、「outscale」、「inrowproducts」、「outrowproducts」으로 해당 미니배치의 「scale」 및 「minibatch_scale」을 구한다.

이상 언급한 데이터를 가지고 파라미터를 업데이트한다.

AffineComponentPreconditionedOnline::Update()의 내부처리

BaseFloat local_lrate = scale * minibatch_scale * learning_rate_;

bias_params_.AddMatVec(local_lrate, out_deriv_temp, kTrans,
                                    precon_ones, 1.0);
linear_params_.AddMatMat(local_lrate, out_deriv_temp, kTrans,
                                      in_value_precon_part, kNoTrans, 1.0);

댓글 없음:

댓글 쓰기