Writing / KERNELIZED

AI · Compute · Autograd · MATH

SoftMax Kernel: Forward and Backward Pass (MATH)

A compact derivation of softmax forward and backward operations for later kernel work.

  • A∈Rs2s1A \in \mathbb{R}^{s_2 s_1} where s2s_2 and s1s_1 are the index set, for example in a 5D tensor A∈RijklmA \in \mathbb{R}^{ijklm} a possible index set could be s2={i,j}s_2 = \{ i, j \} and s1={k,l,m}s_1 = \{k, l, m \}.

  • Bs2s1=softmaxs1(As2s1)B_{s_2 s_1} = softmax_{s_1}(A_{s_2 s_1}) is a softmax operation over s1 index set of A, and the resulting index set still remains same as A s.t. B∈Rs2s1B \in \mathbb{R}^{s2s1}

Softmax Operation

Bs2s1=softmaxs1(As2s1)\begin{aligned}B_{s_2 s_1} = softmax_{s_1}(A_{s_2 s_1}) \end{aligned}

Intermediate Result: #1

Is2s11=exp⁡(As2s1)\begin{aligned}I^1_{s_2 s_1} = \exp{(A_{s_2 s_1})} \end{aligned}

Intermediate Result: #2

Is22=∑s1Is2s11\begin{aligned}I^2_{s_2} = \sum_{s1}I^1_{s_2 s_1} \end{aligned}

Softmax:

Bs2s1=Is2s11Is22=exp⁡(As2s1)∑s1exp⁡(As2s1)\begin{aligned}B_{s_2 s_1} = \frac{I^1_{s_2 s_1}}{I^2_{s_2}} = \frac{\exp{(A_{s_2 s_1})}}{\sum_{s1}\exp{(A_{s_2 s_1})}} \end{aligned}

Backward Pass:

Here we will just look at the backward pass of the softmax kernel alone, as it will help us understand a much wider concept of having a multidimensional loss function instead of a scalar loss.

Fortunately this also simplifies the problem for us as we won’t have to account for any pullbacks for the output Bs2s1B_{s_2 s_1} itself.

∂Bs2s1∂As2′s1′∈Rs2s1s2′s1′\begin{aligned}\frac{\partial B_{s_2 s_1}}{\partial A_{s'_2 s'_1}} \in \mathbb{R}^{s_2 s_1 s'_2 s'_1} \end{aligned}

Derivation:

∂Bs2s1∂As2′s1′=1∑s1exp⁡(As2s1)∂exp⁡(As2s1)∂As2′s1′+exp⁡(As2s1)∂∑s11/exp(As2s1)∂As2′s1′\begin{aligned}\frac{\partial B_{s_2 s_1}}{\partial A_{s'_2 s'_1}} = \frac{1}{\sum_{s_1}\exp{(A_{s_2 s_1})}} \frac{\partial \exp{(A_{s_2 s_1})}}{\partial A_{s'_2 s'_1}} + \exp(A_{s_2 s_1})\frac{\partial \sum_{s_1} 1/exp(A_{s_2 s_1})}{\partial A_{s'_2 s'_1}} \end{aligned}
1∑s1exp⁡(As2s1)∂exp⁡(As2s1)∂As2′s1′=exp⁡(As2s1)∑s1exp⁡(As2s1)As2s1As2′s1′=exp⁡(As2s1)∑s1exp⁡(As2s1)1(s2s1)=(s2′s1′)\begin{aligned}\frac{1}{\sum_{s_1}\exp{(A_{s_2 s_1})}} \frac{\partial \exp{(A_{s_2 s_1})}}{\partial A_{s'_2 s'_1}} = \frac{\exp(A_{s_2 s_1})}{\sum_{s_1}\exp{(A_{s_2 s_1})}} \frac{A_{s_2 s_1}}{A_{s'_2 s'_1}} = \frac{\exp(A_{s_2 s_1})}{\sum_{s_1}\exp{(A_{s_2 s_1})}} \mathbb{1}_{(s_2 s_1) = (s'_2 s'_1)} \end{aligned}
exp⁡(As2s1)∂∑s11/exp(As2s1)∂As2′s1′=−exp⁡(As2s1)[∑s1exp(As2s1)]2∂∑s1exp⁡(As2s1)∂As2′s1′\begin{aligned}\exp(A_{s_2 s_1})\frac{\partial \sum_{s_1} 1/exp(A_{s_2 s_1})}{\partial A_{s'_2 s'_1}} = -\frac{\exp(A_{s_2 s_1})}{[\sum_{s_1} exp(A_{s_2 s_1})]^2} \frac{\partial \sum_{s_1} \exp(A_{s_2 s_1})}{\partial A_{s'_2 s'_1}} \end{aligned} ∂∑s1exp⁡(As2s1)∂As2′s1′=∑s1∂exp⁡(As2s1)∂As2′s1′=∑s1exp⁡(As2s1)∂As2s1∂As2′s1′=∑s1exp⁡(As2s1)1(s2s1)=(s2′s1′)=exp⁡(As2s1′)1s2=s2′\begin{aligned}\frac{\partial \sum_{s_1} \exp(A_{s_2 s_1})}{\partial A_{s'_2 s'_1}} = \sum_{s_1} \frac{\partial \exp(A_{s_2 s_1})}{\partial A_{s'_2 s'_1}} = \sum_{s_1} \exp(A_{s_2 s_1}) \frac{\partial A_{s_2 s_1}}{\partial A_{s'_2 s'_1}} \\ = \sum_{s_1} \exp(A_{s_2 s_1}) \mathbb{1}_{(s_2 s_1) = (s'_2 s'_1)} = \exp(A_{s_2 s'_1}) \mathbb{1}_{s_2 = s'_2} \end{aligned}

Final Derivative Simplification:

∂Bs2s1∂As2′s1′=exp⁡(As2s1)∑s1exp⁡(As2s1)1(s2s1)=(s2′s1′)−exp⁡(As2s1)[∑s1exp(As2s1)]2exp⁡(As2s1′)1s2=s2′=exp⁡(As2s1)∑s1exp⁡(As2s1)1(s2s1)=(s2′s1′)−exp⁡(As2s1)exp⁡(As2s1′)[∑s1exp(As2s1)]21s2=s2′=Bs2s11(s2s1)=(s2′s1′)−Bs2s1Bs2s1′1s2=s2′\begin{aligned} \frac{\partial B_{s_2 s_1}}{\partial A_{s'_2 s'_1}} = \frac{\exp(A_{s_2 s_1})}{\sum_{s_1}\exp{(A_{s_2 s_1})}} \mathbb{1}_{(s_2 s_1) = (s'_2 s'_1)} - \frac{\exp(A_{s_2 s_1})}{[\sum_{s_1} exp(A_{s_2 s_1})]^2} \exp(A_{s_2 s'_1}) \mathbb{1}_{s_2 = s'_2} \\ = \frac{\exp(A_{s_2 s_1})}{\sum_{s_1}\exp{(A_{s_2 s_1})}} \mathbb{1}_{(s_2 s_1) = (s'_2 s'_1)} - \frac{\exp(A_{s_2 s_1}) \exp(A_{s_2 s'_1})}{[\sum_{s_1} exp(A_{s_2 s_1})]^2} \mathbb{1}_{s_2 = s'_2} \\ = B_{s_2 s_1} \mathbb{1}_{(s_2 s_1) = (s'_2 s'_1)} - B_{s_2 s_1}B_{s_2 s'_1} \mathbb{1}_{s_2 = s'_2} \end{aligned} ∂Bs2s1∂As2′s1′=Bs2s11(s2s1)=(s2′s1′)−Bs2s1Bs2s1′1s2=s2′\begin{aligned} \frac{\partial B_{s_2 s_1}}{\partial A_{s'_2 s'_1}} = B_{s_2 s_1} \mathbb{1}_{(s_2 s_1) = (s'_2 s'_1)} - B_{s_2 s_1}B_{s_2 s'_1} \mathbb{1}_{s_2 = s'_2} \end{aligned}

Full reduction: With Loss Drivative

Let’s assume the output Bs2s1B_{s_2 s_1} being used by some frisky function to generate loss Os3O_{s_3} and somehow we have the pullback of BB w.r.t. OO as dBs3s2s1=∂Os3∂Bs2s1dB_{s_3 s_2 s_1} = \frac{\partial O_{s_3}}{\partial B_{s_2 s_1}}, and now we are interested in find out what’s the pullback of As2′s1′A_{s'_2 s'_1} w.r.t. Os3O_{s_3} i.e. ∂Os3∂As2′s1′\frac{\partial O_{s_3}}{\partial A_{s'_2 s'_1}}.

∂Os3∂As2′s1′=∑s2s1∂Os3∂Bs2s1∂Bs2s1∂As2′s1′=∑s2s1dBs3s2s1[exp⁡(As2s1)∑s1exp⁡(As2s1)1(s2s1)=(s2′s1′)−exp⁡(As2s1)exp⁡(As2s1′)[∑s1exp(As2s1)]21s2=s2′]=dBs3s2′s1′exp⁡(As2′s1′)∑s1exp⁡(As2′s1)−∑s2s1dBs3s2s1exp⁡(As2s1)exp⁡(As2s1′)[∑s1exp(As2s1)]21s2=s2′\begin{aligned}\frac{\partial O_{s_3}}{\partial A_{s'_2 s'_1}} = \sum_{s_2 s_1} \frac{\partial O_{s_3}}{\partial B_{s_2 s_1}}\frac{\partial B_{s_2 s_1}}{\partial A_{s'_2 s'_1}} \\ = \sum_{s_2 s_1} dB_{s_3 s_2 s_1} \left[ \frac{\exp(A_{s_2 s_1})}{\sum_{s_1}\exp{(A_{s_2 s_1})}} \mathbb{1}_{(s_2 s_1) = (s'_2 s'_1)} - \frac{\exp(A_{s_2 s_1}) \exp(A_{s_2 s'_1})}{[\sum_{s_1} exp(A_{s_2 s_1})]^2} \mathbb{1}_{s_2 = s'_2} \right] \\ = dB_{s_3 s'_2 s'_1} \frac{\exp(A_{s'_2 s'_1})}{\sum_{s_1}\exp{(A_{s'_2 s_1})}} - \sum_{s_2 s_1} dB_{s_3 s_2 s_1} \frac{\exp(A_{s_2 s_1}) \exp(A_{s_2 s'_1})}{[\sum_{s_1} exp(A_{s_2 s_1})]^2} \mathbb{1}_{s_2 = s'_2} \end{aligned}
∑s2s1dBs3s2s1exp⁡(As2s1)exp⁡(As2s1′)[∑s1exp(As2s1)]21s2=s2′=∑s1dBs3s2′s1exp⁡(As2′s1)exp⁡(As2′s1′)[∑s1exp(As2′s1)]2=exp⁡(As2′s1′)[∑s1exp(As2′s1)]2∑s1[dBs3s2′s1exp⁡(As2′s1)]\begin{aligned}\sum_{s_2 s_1} dB_{s_3 s_2 s_1} \frac{\exp(A_{s_2 s_1}) \exp(A_{s_2 s'_1})}{[\sum_{s_1} exp(A_{s_2 s_1})]^2} \mathbb{1}_{s_2 = s'_2} = \sum_{s_1} dB_{s_3 s'_2 s_1} \frac{\exp(A_{s'_2 s_1}) \exp(A_{s'_2 s'_1})}{[\sum_{s_1} exp(A_{s'_2 s_1})]^2} \\ = \frac{\exp(A_{s'_2 s'_1})}{[\sum_{s_1} exp(A_{s'_2 s_1})]^2} \sum_{s_1} [dB_{s_3 s'_2 s_1} \exp(A_{s'_2 s_1})] \end{aligned}
∂Os3∂As2′s1′=dBs3s2′s1′exp⁡(As2′s1′)∑s1exp⁡(As2′s1)−exp⁡(As2′s1′)[∑s1exp(As2′s1)]2∑s1[dBs3s2′s1exp⁡(As2′s1)]=dBs3s2′s1′Bs2′s1′−Bs2′s1′1∑s1exp(As2′s1)∑s1[dBs3s2′s1exp⁡(As2′s1)]=dBs3s2′s1′Bs2′s1′−Bs2′s1′∑s1[dBs3s2′s1Bs2′s1]=Bs2′s1′[dBs3s2′s1′−∑s1[dBs3s2′s1Bs2′s1]]\begin{aligned}\frac{\partial O_{s_3}}{\partial A_{s'_2 s'_1}} = dB_{s_3 s'_2 s'_1} \frac{\exp(A_{s'_2 s'_1})}{\sum_{s_1}\exp{(A_{s'_2 s_1})}} - \frac{\exp(A_{s'_2 s'_1})}{[\sum_{s_1} exp(A_{s'_2 s_1})]^2} \sum_{s_1} [dB_{s_3 s'_2 s_1} \exp(A_{s'_2 s_1})] \\ = dB_{s_3 s'_2 s'_1} B_{s'_2 s'_1} - B_{s'_2 s'_1}\frac{1}{\sum_{s_1} exp(A_{s'_2 s_1})} \sum_{s_1} [dB_{s_3 s'_2 s_1} \exp(A_{s'_2 s_1})] \\ = dB_{s_3 s'_2 s'_1} B_{s'_2 s'_1} - B_{s'_2 s'_1} \sum_{s_1} [dB_{s_3 s'_2 s_1} B_{s'_2 s_1}] = B_{s'_2 s'_1} [dB_{s_3 s'_2 s'_1} - \sum_{s_1} [dB_{s_3 s'_2 s_1} B_{s'_2 s_1}]] \end{aligned}
∂Os3∂As2′s1′=Bs2′s1′[dBs3s2′s1′−∑s1dBs3s2′s1Bs2′s1]\begin{aligned} \frac{\partial O_{s_3}}{\partial A_{s'_2 s'_1}} = B_{s'_2 s'_1} \left[dB_{s_3 s'_2 s'_1} - \sum_{s_1} dB_{s_3 s'_2 s_1} B_{s'_2 s_1}\right] \end{aligned}

Application in Attention: Specialize the Expressions

Setup:

Pij=softmax(Sij)Sij∈RM×NPij∈RM×NOϕ∈RdPϕij=∂Oϕ∂Pij∈Rϕ×M×N  ⟹  Known\begin{aligned}P_{ij} = softmax(S_{ij}) \\ S_{ij} \in \mathbb{R}^{M \times N} \\ P_{ij} \in \mathbb{R}^{M \times N} \\ O_{\phi} \in \mathbb{R} \\ dP_{\phi ij} = \frac{\partial O_{\phi}}{\partial P_{ij}} \in \mathbb{R}^{\phi \times M \times N} \implies \text{Known} \end{aligned}

Differentiation:

∂Oϕ∂Si′j′=∑ij∂Oϕ∂Pij∂Pij∂Si′j′=Pi′j′[dPϕi′j′−∑jdPϕi′jPi′j]=Pi′j′[dPi′j′−∑jdPi′jPi′j]=Pi′j′[dPi′j′−dPi′:T∘Pi′:]=P×[dP−BMM(dPi′1j,Pi′j1)]\begin{aligned}\frac{\partial O_{\phi}}{\partial S_{i'j'}} = \sum_{ij} \frac{\partial O_{\phi}}{\partial P_{ij}}\frac{\partial P_{ij}}{\partial S_{i'j'}} = P_{i'j'} \left[dP_{\phi i'j'} - \sum_{j} dP_{\phi i'j} P_{i'j} \right] \\ = P_{i'j'} \left[dP_{i'j'} - \sum_{j} dP_{i'j} P_{i'j} \right] = P_{i'j'} \left[dP_{i'j'} - dP_{i':}^T \circ P_{i':} \right] \\ = P \times \left[dP - BMM(dP_{i'1j, P_{i'j1}}) \right] \end{aligned} ∂Oϕ∂Si′j′=Pi′j′[dPi′j′−dPi′:T∘Pi′:]\begin{aligned} \frac{\partial O_{\phi}}{\partial S_{i'j'}} = P_{i'j'} \left[dP_{i'j'} - dP_{i':}^T \circ P_{i':} \right] \end{aligned}