forked from kaldi-asr/kaldi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
indirect-diff-diag-gmm.h
74 lines (61 loc) · 3.05 KB
/
indirect-diff-diag-gmm.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// gmm/indirect-diff-diag-gmm.h
// Copyright 2012 Johns Hopkins University (Author: Daniel Povey)
// See ../../COPYING for clarification regarding multiple authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
// WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
// MERCHANTABLITY OR NON-INFRINGEMENT.
// See the Apache 2 License for the specific language governing permissions and
// limitations under the License.
#ifndef KALDI_GMM_INDIRECT_DIFF_DIAG_GMM_H_
#define KALDI_GMM_INDIRECT_DIFF_DIAG_GMM_H_ 1
#include "gmm/diag-gmm.h"
#include "gmm/diag-gmm-normal.h"
#include "gmm/mle-diag-gmm.h"
#include "gmm/mle-am-diag-gmm.h"
#include "gmm/model-common.h"
namespace kaldi {
// This gets the derivative of the (MMI or MPE) objective function w.r.t. the
// statistics for ML update, assuming we're doing an ML update-- as described in
// the original fMPE paper. This is used in fMPE/fMMI, for the "indirect
// differential". This derivative is represented as class AccumDiagGmm, as
// derivatives w.r.t. the x and x^2 stats directly (not w.r.t. the mean and
// variance).
//
// If the parameter "rescaling" is true, this function will assume that instead
// of the ML update, you will do a "rescaling" update as in the function
// DoRescalingUpdate().
//
// CAUTION: for fMPE (as opposed to fMMI), to get the right answer, you would have
// to pre-scale the num and den accs by the acoustic scale (e.g. 0.1).
void GetStatsDerivative(const AmDiagGmm &gmm,
const AccumAmDiagGmm &num_accs, // for MMI, would equal ml accs.
const AccumAmDiagGmm &den_accs,
const AccumAmDiagGmm &ml_accs,
BaseFloat min_variance,
BaseFloat min_gaussian_occupancy,
AccumAmDiagGmm *out_accs);
// This function "DoRescalingUpdate" updates the GMMs in a special way-- it
// first works out how the Gaussians differ from the old stats (in terms of an
// offset on the mean, a scale on the variance, and a factor on the weights),
// and it updates the model so that it will differ in the same way from the new
// stats.
//
// The idea here is that the original model may have been discriminatively
// trained, but we may have changed the features or the domain or something
// of that nature, and we want to update the model but preserve the discriminative
// training (viewed as an offset).
void DoRescalingUpdate(const AccumAmDiagGmm &old_ml_accs,
const AccumAmDiagGmm &new_ml_accs,
BaseFloat min_variance,
BaseFloat min_gaussian_occupancy,
AmDiagGmm *gmm);
} // end namespace kaldi
#endif // KALDI_GMM_INDIRECT_DIFF_DIAG_GMM_H_