docs: def split_heads(self, x):
      """Split x into different heads, and transpose the resulting value.
  
      The tensor is transposed to insure the inner dimensions hold the correct
      values during the matrix multiplication.
  
      Args:
        x: A tensor with shape [batch_size, length, hidden_size]
  
      Returns:
        A tensor with shape [batch_size, num_heads, length, hidden_size/num_heads]
      """
      with tf.name_scope("split_heads"):
        batch_size = tf.shape(x)[0]
        length = tf.shape(x)[1]
  
        # Calculate depth of last dimension after it has been split.
        depth = (self.hidden_size // self.num_heads)
  
        # Split the last dimension
        x = tf.reshape(x, [batch_size, length, self.num_heads, depth])
  
        # Transpose the result
        return tf.transpose(x, [0, 2, 1, 3])