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.