音声認識メモ(Kaldi)その24( パラメータ更新 Dan's DNN(nnet2))
「AffineComponentPreconditionedOnline」コンポーネントのパラメータ更新過程を追ってみる。
モデルは「nnet4c」ベース、mixupを行う前の状態。
今回、確認するのは下図の破線部分のパラメータ。
BackPropagationにおいて、以下2つの値を使って更新する。
尚、ここでのminibatch-sizeは「128」であるとする。
- 「in_value_temp」 : PropagationでTanhコンポーネントを通した後の値(128row x 375col)に対して、各行の最後に「1.0」を加えたもの(128row x 376col)
- 「out_deriv_temp」 : 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); ...
ここでの処理内容の詳細はDan氏の論文に書かれている。
更新前のin_value_temp(128row x 376col、 論文中の「X_t」に該当
0.265 0.362 -0.999 -0.999 -0.946 ... 1 ...
t : minibatch index
ここから、X_hat_tを求める。
R=30(rankIn(低ランク近似)の次元)
「W_t」はR x DのWeight Matrix(D=376)
N=128(minibatch size)
更新後のin_value_temp(128row x 376col、 論文中の「X_hat_t」に該当
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);
「X_hat_t」の各行の内積( (0.035 * 0.035) + (0.562 * 0.562) + (-0.010 * -0.010) + ...)を求める。
これが「in_row_products」に該当する。
in_row_products (128dim)
62.02 44.57 66.93 81.97 59.58 ...
また、以下の式により、gamma_tを求める。
これが「in_scale」に該当する。
in_scale
2.04739451
「preconditioner_out_」に対しても同様の処理を行う。
更新前のout_deriv_temp(128row x 192col、論文中の「X_t」に該当)
-0.000 -6.5e-06, -9.9e-06, -1.2-06, -7.5e-07 ... ...
更新後のout_deriv_temp(128row x 192col、論文中の「X_hat_t」に該当)
0.048 -5.5e-06 -0.000 5.9e-08 -0.000 ... ...
out_row_products(128dim)
0.136 0.163 0.000 0.072 0.008 ...
out_scale
2.1778152
「in_value_temp」(128row x 376dim)より、「in_value_precon_part」(128row x 375dim)、「precon_ones」(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);
「in_scale」、「out_scale」、「in_row_products」、「out_row_products」より、当該ミニバッチの「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);