docs: def sg_emb(**kwargs):
      r"""Returns a look-up table for embedding.
      
      kwargs:
        name: A name for the layer.
        emb: A 2-D array (optional). 
          If None, the resulting tensor should have the shape of 
          `[vocabulary size, embedding dimension size]`.
          Note that its first row is filled with 0's associated with padding.
        in_dim: A positive `integer`. The size of input dimension.
        dim: A positive `integer`. The size of output dimension.
        voca_size: A positive integer. The size of vocabulary.
        summary: If True, summaries are added. The default is True.
  
      Returns:
        A 2-D `Tensor` of float32.
      """
      opt = tf.sg_opt(kwargs)
      assert opt.name is not None, 'name is mandatory.'
  
      if opt.emb is None:
          # initialize embedding matrix
          assert opt.voca_size is not None, 'voca_size is mandatory.'
          assert opt.dim is not None, 'dim is mandatory.'
          w = tf.sg_initializer.he_uniform(opt.name, (opt.voca_size - 1, opt.dim), summary=opt.summary)
      else:
          # use given embedding matrix
          w = tf.sg_initializer.external(opt.name, value=opt.emb, summary=opt.summary)
  
      # 1st row should be zero and not be updated by backprop because of zero padding.
      emb = tf.concat([tf.zeros((1, opt.dim), dtype=tf.sg_floatx), w], 0)
  
      return emb