docs: def gradient_summaries(grad_vars, groups=None, scope='gradients'):
    """Create histogram summaries of the gradient.
  
    Summaries can be grouped via regexes matching variables names.
  
    Args:
      grad_vars: List of (gradient, variable) tuples as returned by optimizers.
      groups: Mapping of name to regex for grouping summaries.
      scope: Name scope for this operation.
  
    Returns:
      Summary tensor.
    """
    groups = groups or {r'all': r'.*'}
    grouped = collections.defaultdict(list)
    for grad, var in grad_vars:
      if grad is None:
        continue
      for name, pattern in groups.items():
        if re.match(pattern, var.name):
          name = re.sub(pattern, name, var.name)
          grouped[name].append(grad)
    for name in groups:
      if name not in grouped:
        tf.logging.warn("No variables matching '{}' group.".format(name))
    summaries = []
    for name, grads in grouped.items():
      grads = [tf.reshape(grad, [-1]) for grad in grads]
      grads = tf.concat(grads, 0)
      summaries.append(tf.summary.histogram(scope + '/' + name, grads))
    return tf.summary.merge(summaries)