音声認識メモ(Kaldi)その24( パラメータ更新 Dan's DNN(nnet2))

「AffineComponentPreconditionedOnline」コンポーネントのパラメータ更新過程を追ってみる。

モデルは「nnet4c」ベース、mixupを行う前の状態。
f:id:ichou1:20180904124824p:plain

今回、確認するのは下図の破線部分のパラメータ。
f:id:ichou1:20180904130001p:plain

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を求める。
f:id:ichou1:20180904145210p:plain
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」に該当する。
f:id:ichou1:20180904152353p:plain

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);