It is not a fluke

The obvious response is that something about the setup was unlucky. So take the obvious remedies one at a time, because ruling them out is what turns this from a disappointment into a fact.

Train it for longer. Twenty five more passes leaves the error at 60. A thousand more leaves it at 60. It settled within the first pass and has not moved since.

Show it more bottles. The four types are already repeated, and adding more changes nothing, because every new bottle is another example of a pairing the model already cannot represent. A thousand of them is the same problem a thousand times.

Use a smaller learning rate. That was the fix for thrashing in the last chapter. It does not apply. Nothing here is thrashing. The weights are sitting perfectly still.

Use a larger one. Now the weights move more per bottle, and then move back by the same amount on the next one. Faster, and just as stuck.

Start the weights somewhere else. Any four numbers at all. Some starting points take longer to settle than others, and wild ones settle at wild-looking weights, but the error always lands on the same 60 and stays there.

Every knob from the last chapter has now been turned, and none of them touches it.

Which means the problem is not the training. The training is working exactly as designed, doing precisely what the rule says on every bottle.

The problem is the machine.