2017-07-15 13 views
12

は私が(要素のタイプ= tf.float32)通常のランダム化300次元のベクトルを追加することができますどのようになど興味がありますたび語で未知語のための新たな埋め込みを追加する方法事前に訓練された語彙に未知のものが遭遇する。私は事前に訓練された手袋ワード埋め込みを使用していますが、いくつかのケースでは、私は未知語に遭遇実現する、と私は、この新しい見つけられた未知語の通常のランダム化ワードベクトルを作成したいです。Tensorflow(トレーニング&プリセットテストのために)

私の現在の設定では、既知の語彙に基づいて単語から整数に変換するのに、tf.contrib.lookup.index_table_from_tensorを使用しています。この関数は、新しいトークンを作成して、語彙のうちのいくつかの事前定義された数のためにそれらをハッシュが、私のembedは、この新しい未知のハッシュ値のための埋め込みは含まれませんすることができます。私は単にembedリストの最後にランダム化された埋め込みを追加することができるかどうか確信がもてません。

私はまた、効率的な方法でこれをやりたい、そうtensorflow関数を含む事前に構築されたtensorflowの関数やメソッドは、おそらく最も効率的です。私は、このような文のトークンの終わりとして、事前に知られている特殊なトークンと(インデックス0「」)空の文字列として、未知のデフォルトを定義しますが、これは、様々な異なる未知の単語を学ぶためにその力に制限されています。私は現在、最後の埋め込みステップとしてtf.nn.embedding_lookup()を使用しています。

訓練データに未知の単語ごとに新しいランダム300dベクトルを追加したいと思っています。遭遇する可能性のある未知のトークンについては、あらかじめ作成されたランダムな単語ベクトルも追加したいと思いますテスト中。これを行う最も効率的な方法は何ですか?

def embed_tensor(string_tensor, trainable=True): 
    """  
    Convert List of strings into list of indicies then into 300d vectors 
    """ 
    # ordered lists of vocab and corresponding (by index) 300d vector 
    vocab, embed = load_pretrained_glove() 

    # Set up tensorflow look up from string word to unique integer 
    vocab_lookup = tf.contrib.lookup.index_table_from_tensor(
     mapping=tf.constant(vocab), 
     default_value = 0) 
    string_tensor = vocab_lookup.lookup(string_tensor) 

    # define the word embedding 
    embedding_init = tf.Variable(tf.constant(np.asarray(embed), 
           dtype=tf.float32), 
           trainable=trainable, 
           name="embed_init") 

    # return the word embedded version of the sentence (300d vectors/word) 
    return tf.nn.embedding_lookup(embedding_init, string_tensor) 

答えて

1

私はそれを試したことがないが、私はあなたのコードの同じ機械を使用して可能な方法を提供しようとすることができますが、私はもっと後でそれを考えるだろう。

index_table_from_tensor方法は、バケットの所定の数にすべてのあなたのOOVワードをシャッフルnum_oov_bucketsパラメータを受け付けます。

「十分大きな」値に設定すると、データがこれらのバケットに分散して表示されます(各バケットは、ID>最後の語彙内語IDです)。

ので、

  • あなたは(すなわちassign)ランダムな値
  • にごembedding_init変数の最後の行(バケットに対応するもの)セット(各検索で)場合には、十分なnum_oov_bucketsを加えた場合大規模な衝突は最小限に抑えられます

あなたは非常に効率的な方法で求めている動作を得ることができます。

ランダム行動は、ハッシュテーブルのものと同様の理論によって正当化することができます:バケットの数が十分な大きさであれば、文字列のハッシュ方式は、高い確率で異なるバケットに各OOV単語を割り当てます(つまり、最小化同じバケットへの衝突)。異なるバケツに異なる乱数を割り当てているので、それぞれのoov単語の(ほとんど)異なるマッピングを得ることができます。以下

3

コード例は、以下のように単語が埋め込まれているように、あなたのembed_tensor関数適応:pretrained埋め込みを有する単語の

  • を、埋め込みはpretrained埋め込みで初期化されます。 trainableFalseの場合、埋め込みはトレーニング中に固定されたままにできます。
  • トレーニングデータ内で事前に埋め込まれていない単語については、埋め込みはランダムに初期化されます。 trainableFalseの場合、埋め込みはトレーニング中に固定されたままにできます。
  • トレーニングデータにはなく、事前に埋め込まれていないテストデータ内の単語に対しては、ランダムに初期化された埋め込みベクトルが1つ使用されます。このベクターは訓練できません。 FYI
import tensorflow as tf 
import numpy as np 

EMB_DIM = 300 
def load_pretrained_glove(): 
    return ["a", "cat", "sat", "on", "the", "mat"], np.random.rand(6, EMB_DIM) 

def get_train_vocab(): 
    return ["a", "dog", "sat", "on", "the", "mat"] 

def embed_tensor(string_tensor, trainable=True): 
    """ 
    Convert List of strings into list of indices then into 300d vectors 
    """ 
    # ordered lists of vocab and corresponding (by index) 300d vector 
    pretrained_vocab, pretrained_embs = load_pretrained_glove() 
    train_vocab = get_train_vocab() 
    only_in_train = set(train_vocab) - set(pretrained_vocab) 
    vocab = pretrained_vocab + only_in_train 

    # Set up tensorflow look up from string word to unique integer 
    vocab_lookup = tf.contrib.lookup.index_table_from_tensor(
    mapping=tf.constant(vocab), 
    default_value=len(vocab)) 
    string_tensor = vocab_lookup.lookup(string_tensor) 

    # define the word embedding 
    pretrained_embs = tf.get_variable(
     name="embs_pretrained", 
     initializer=tf.constant_initializer(np.asarray(pretrained_embs), dtype=tf.float32), 
     shape=pretrained_embs.shape, 
     trainable=trainable) 
    train_embeddings = tf.get_variable(
     name="embs_only_in_train", 
     shape=[len(only_in_train), EMB_DIM], 
     initializer=tf.random_uniform_initializer(-0.04, 0.04), 
     trainable=trainable) 
    unk_embedding = tf.get_variable(
     name="unk_embedding", 
     shape=[1, EMB_DIM], 
     initializer=tf.random_uniform_initializer(-0.04, 0.04), 
     trainable=False) 

    embeddings = tf.concat([pretrained_embs, train_embeddings, unk_embedding], axis=0) 

    return tf.nn.embedding_lookup(embeddings, string_tensor) 

、トレーニングデータでは発生しませんし、pretrained埋め込みを持っていない単語のための賢明な、非ランダムな表現を持っている、あなたは低頻度でマッピング単語を検討することもできあなたの訓練データをunkトークン(あなたの語彙には含まれていません)に翻訳し、unk_embeddingを訓練可能にしてください。この方法で、トレーニングデータには見えない単語のプロトタイプを学習します。

0

私がこれを持っていたアイデアは、新しい単語ごとに新しいディメンションを追加することで、訓練された埋め込みに新しい単語を取り込むことでした。

新しい単語の数が少ないが、重要であると仮定すると、埋め込み結果のサイズを300から300 +新しい単語の数に増やすことができます。寸法。

関連する問題