Are there any benefits of implementing the Fisher–Yates shuffle algorithm from tail to head instead of head to tail?
With 0-indexed arrays, and stopping the loop at the last non-trivial random selection, we have

for x = n to 2 step -1:
    swap A[x-1], A[uniform_random(0 inclusive to x exclusive)]


vs

for x = 0 to n-2 step 1:
    swap A[x], A[uniform_random(x inclusive to n exclusive)]


which would probably be implemented as

for x = 0 to n-2 step 1:
    swap A[x], A[x + uniform_random(0 inclusive to n-x exclusive)]


So the forward loop has at least as much complexity.

I would claim that the simplest version is looping backwards in a 1-indexed environment (i.e. 1-indexed arrays and random number generation):

for x = n to 2 step -1:
    swap A[x], A[uniform_random(1 inclusive to x inclusive)]


There are various other variants possible: e.g. in the first example, we could loop x = n-1 to 1 step -1; in the second example, we could use two loop variables instead of one; etc.