def __init__(self, embedding_dim, position_encoding, feat_merge, feat_vec_exponent, feat_embedding_dim, dropout, word_padding_idx, feat_padding_idx, word_vocab_size, feat_vocab_sizes=[]): super(Embeddings, self).__init__() self.word_padding_idx = word_padding_idx # Parameters for constructing the word embedding matrix vocab_sizes = [word_vocab_size] emb_dims = [embedding_dim] pad_indices = [word_padding_idx] self.embedding_dim = embedding_dim # Parameters for additional feature embedding matrices # (these have no effect if feat_vocab_sizes is empty) if feat_merge == 'concat': feat_dims = [int(vocab ** feat_vec_exponent) for vocab in feat_vocab_sizes] else: if feat_merge == 'sum': feat_dim = embedding_dim else: feat_dim = feat_embedding_dim feat_dims = [feat_dim] * len(feat_vocab_sizes) vocab_sizes.extend(feat_vocab_sizes) emb_dims.extend(feat_dims) pad_indices.extend(feat_padding_idx) # The embedding matrix look-up tables. The first look-up table # is for words. Subsequent ones are for features, if any exist. emb_params = zip(vocab_sizes, emb_dims, pad_indices) embeddings = [nn.Embedding(vocab, dim, padding_idx=pad) for vocab, dim, pad in emb_params] emb_luts = Elementwise(feat_merge, embeddings) # The final output size of word + feature vectors. This can vary # from the word vector size if and only if features are defined. self.embedding_size = (sum(emb_dims) if feat_merge == 'concat' else embedding_dim) # The sequence of operations that converts the input sequence # into a sequence of embeddings. At minimum this consists of # looking up the embeddings for each word and feature in the # input. Model parameters may require the sequence to contain # additional operations as well. self.make_embedding = nn.Sequential() self.make_embedding.add_module('emb_luts', emb_luts) if feat_merge == 'mlp': in_dim = sum(emb_dims) out_dim = feat_embedding_dim mlp = nn.Sequential(BottleLinear(in_dim, out_dim), nn.ReLU()) self.make_embedding.add_module('mlp', mlp) if position_encoding: pe = PositionalEncoding(dropout, self.embedding_size) self.make_embedding.add_module('pe', pe)
def __init__(self, word_vec_size, word_vocab_size, word_padding_idx, position_encoding=False, feat_merge="concat", feat_vec_exponent=0.7, feat_vec_size=-1, feat_padding_idx=[], feat_vocab_sizes=[], dropout=0): self.word_padding_idx = word_padding_idx # Dimensions and padding for constructing the word embedding matrix vocab_sizes = [word_vocab_size] emb_dims = [word_vec_size] pad_indices = [word_padding_idx] # Dimensions and padding for feature embedding matrices # (these have no effect if feat_vocab_sizes is empty) if feat_merge == 'sum': feat_dims = [word_vec_size] * len(feat_vocab_sizes) elif feat_vec_size > 0: feat_dims = [feat_vec_size] * len(feat_vocab_sizes) else: feat_dims = [int(vocab ** feat_vec_exponent) for vocab in feat_vocab_sizes] vocab_sizes.extend(feat_vocab_sizes) emb_dims.extend(feat_dims) pad_indices.extend(feat_padding_idx) # The embedding matrix look-up tables. The first look-up table # is for words. Subsequent ones are for features, if any exist. emb_params = zip(vocab_sizes, emb_dims, pad_indices) embeddings = [nn.Embedding(vocab, dim, padding_idx=pad) for vocab, dim, pad in emb_params] for embed in embeddings: vsize, _ = embed.weight.data.size() embed.weight.data.uniform_(-3. / vsize, 3. / vsize) emb_luts = Elementwise(feat_merge, embeddings) # The final output size of word + feature vectors. This can vary # from the word vector size if and only if features are defined. # This is the attribute you should access if you need to know # how big your embeddings are going to be. self.embedding_size = (sum(emb_dims) if feat_merge == 'concat' else word_vec_size) # The sequence of operations that converts the input sequence # into a sequence of embeddings. At minimum this consists of # looking up the embeddings for each word and feature in the # input. Model parameters may require the sequence to contain # additional operations as well. super(Embeddings, self).__init__() self.make_embedding = nn.Sequential() self.make_embedding.add_module('emb_luts', emb_luts) if feat_merge == 'mlp': in_dim = sum(emb_dims) out_dim = word_vec_size mlp = nn.Sequential(BottleLinear(in_dim, out_dim), nn.ReLU()) self.make_embedding.add_module('mlp', mlp) if position_encoding: pe = PositionalEncoding(dropout, self.embedding_size) self.make_embedding.add_module('pe', pe)