Blank bias
--blank_bias subtracts a constant from the blank logit before the softmax at
decode time, for both the greedy and the beam decoder. Positive values penalise
blank, so the model emits more words. It is exactly a shift of the joint
network’s output bias for the blank class. Under --eos_decoding blank, which
folds EOS into blank, the EOS logit is shifted too.
This helps because the RNN-T loss sums over all alignments, but greedy decoding takes the argmax in each lattice cell. A model can therefore score a good loss and still delete words. The bias corrects that.
Tuning at the end of training
At the last training step, before the final validation, the dev set is decoded
greedily once for each value in --blank_bias_grid (default
0.0 0.25 ... 1.5). The value with the lowest error rate is used for the final
validation and stored as blank_bias in every checkpoint saved from then on.
It is also copied into the hardware checkpoint, which leaves the weights
unchanged, and load_hw_checkpoint returns it as Checkpoint.blank_bias. Pass --blank_bias_grid with no values to skip tuning.
Checkpoint averaging carries the value into the
averaged checkpoint.
Validation
With --decoder greedy, val.sh decodes at the checkpoint’s stored value
unless you pass --blank_bias. Beam search does not pick up the stored value,
because beam wants a smaller bias than greedy. Pass --blank_bias to set one
for beam. Checkpoints without a stored value decode at 0.0.
The bias is subtracted before the logits are divided by --temperature, so a
value tuned under greedy decoding, which uses temperature 1.0, does not carry
over to other temperatures.