すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:EmbeddingVariable

最終更新日:Jul 22, 2024

超大規模トレーニングでEmbedingVariableを使用すると、メモリリソースの使用量を減らし、モデル機能が損傷しないようにすることができます。

警告

GPUアクセラレーションサーバーは段階的に廃止されます。 CPUサーバーで実行されるTensorFlowタスクを送信できます。 モデルトレーニングにGPU高速化インスタンスを使用する場合は、Deep Learning Containers (DLC) に移動してジョブを送信します。 詳細については、「トレーニングジョブの送信」をご参照ください。

背景情報

埋め込みは、ディープラーニングで単語とIDを含む機能を管理する効果的な方法です。 埋め込みは、高次元の疎な特徴を低次元の密なベクトルにマッピングし、エンドツーエンドのモデルトレーニングを実行する一種の関数マッピングです。 TensorFlowでは、変数を使用してモデルまたはノードステータスを定義します。 変数を使用することによるモデルまたはノード状態の定義は、データ構造のテンソルに依存する。 Tensorは、スカラー、ベクトル、行列、および高次元データ構造を含むTensorFlowの抽象データ型です。 Tensorは、オペレータ間の通信用のデータキャリアとして使用されます。 入力および出力としてテンソルをサポートする任意の演算子をグラフ計算に使用できます。 Tensorは連続ストレージを使用します。 変数を定義するときは、変数の型と形状を指定する必要があります。 形状は変更できません。

TensorFlowは変数を使用して埋め込みメカニズムを実装します。 [vocabulary_size, embedding_dimension] は、埋め込み時の変数の形状を指定するために使用されます。 大規模なスパースフィーチャを使用するシナリオには、次の欠点があります。

  • vocabilar_sizeパラメータの値は、IDサイズによって決定され、オンライン学習シナリオではIDの数が増加するため、推定が困難な場合があります。

  • ほとんどの場合、IDは大きなサイズの文字列です。 埋め込む前に、vocabuly_sizeパラメーターの値の範囲に基づいてIDをハッシュする必要があります。

    • 語彙サイズが小さすぎると、ハッシュ衝突の確率が高くなる。 異なるフィーチャが同じ埋め込みを共有してもよく、その結果、フィーチャが少なくなる。

    • vocabilar_sizeが大きすぎると、変数に不要な埋め込みが格納され、メモリが冗長になります。

  • 埋め込み変数の値が大きいと、モデルサイズが大きくなります。 正規表現を使用して一部のフィーチャの埋め込みがモデルに与える影響を減らす場合でも、モデルから埋め込みを削除することはできません。

上記の問題を解決するために、PAI-TensorFlowはEmbeddingVariableを提供します。 EmbedingVariableは、メモリリソースを費用対効果の高い方法で使用して、超大規模な機能のオフライントレーニングを実行し、機能を損なうことなくモデルをオンラインで公開します。 PAI-TensorFlowは、EmbeddingVariable V3.1およびFeature_Column V3.3 APIを提供します。 文字列の機能識別プロセスを自動的に高速化できるFeature_Column APIを使用することを推奨します。

EmbeddingVariableの機能

  • ダイナミック埋め込み

    PAI-TensorFlowがトレーニングに基づいて辞書サイズを動的に増減できるようにするには、embedding_dimパラメーターのみを指定する必要があります。 この方法はオンライン学習に適しており、PAI-TensorFlowモデルのデータを前処理する必要がありません。

  • グループ投げ縄

    ほとんどの場合、深層学習を受けた埋め込み変数のサイズは大きくなります。 埋め込み変数をオンラインサービスとして展開すると、サーバーが過負荷になる可能性があります。 投げ縄ベースの埋め込み変数をグループ化すると、モデル展開の作業負荷が軽減されます。

  • EmbeddingVariableを使用すると、元のフィーチャ値を埋め込みルックアップに転送できます。 これにより、ハッシュなどの識別操作を実行する必要がなくなり、機能ロスレストレーニングを実現できます。

  • EmbedingVariableは、グラフ推論、バックプロパゲーション、および変数のインポートとエクスポートをサポートします。 モデルトレーニング中、オプティマイザを使用して埋め込み変数を自動的に更新します。

tf.get_embedding_変数

tf. get_embeding_variableは、既存または新しい埋め込み変数を返します。 定義は下記の通りです。

get_embedding_variable(
    name,
    embedding_dim,
    key_dtype=dtypes.int64,
    value_dtype=None,
    initializer=None,
    trainable=True,
    collections=None,
    partitioner=None,
    custom_getter=None,
    steps_to_live=None,
    filter_options=variables.CounterFilterOptions()
)
  • name: 埋め込み変数の名前。

  • embedding_dim: 埋め込みディメンション。 例: 8または64。

  • key_dtype: 埋め込みルックアップのキーの型。 デフォルト値: int64。

  • value_dtype: 埋め込みベクトルの型。 FLOATタイプのみがサポートされています。

  • initializer: 埋め込み変数の初期値。

  • trainable: 埋め込み変数をGraphKeys.TRAINABLE_VARIABLESのコレクションに追加するかどうかを指定します。

  • collections: コレクションキーのリスト。 埋め込み変数は、リスト内のコレクションに追加されます。 デフォルト値: [GraphKeys.GLOBAL_VARIABLES] 。

  • partitioner: パーティション関数。

  • custom_getter: 最初の引数としてtrue getterを使用し、内部のget_variableメソッドを上書きできる呼び出し可能なオブジェクトです。 custom_getterは、def custom_getter(getter,* args,**kwargs) 形式である必要があります。 def custom_getter(getter、name、* args、**kwargs) では、すべてのget_variableパラメーターに直接アクセスできます。

  • steps_to_live: グローバルステップの数。 このパラメーターは、期限切れの機能を削除するために使用されます。 グローバルステップ数がこのパラメーターの値を超えるフィーチャが削除されます。

  • filter_options: 入場ポリシー。 機能頻度に基づいてポリシーを設定できます。

EmbeddingVariable

EmbedingVariableの構造:

class EmbeddingVariable(ResourceVariable)

  def total_count():
    # Return the total_count and [rowCount,EmbeddingDim] of the embedding variable. 
  def read_value():
    raise NotImplementedError("...")
  def assign():
    raise NotImplementedError("...")
  def assign_add():
    raise NotImplementedError("...")
  def assign_sub():
    raise NotImplementedError("...")
  • スパースデータの読み取りに使用されるsparse_read() メソッドがサポートされています。 クエリされたkeyが存在せず、埋め込み変数の初期値を返す場合、keyに対応するinitializerが返されます。

  • 埋め込み変数内の単語の総数をカウントするために使用されるtotal_count() メソッドがサポートされています。 このメソッドは、変数の動的形状値を返します。

  • すべての埋め込み変数の読み取りに使用されるread_value() メソッドはサポートされていません。

  • 埋め込み変数に値を割り当てるために使用されるメソッドはサポートされていません。 メソッドには、assign()assign_add() 、およびassign_sub() が含まれます。

  • CounterFilterOptionsの構造:

    	@tf_export("CounterFilterOptions")
    	class CounterFilterOptions(object):
    		def __init__(self, filter_freq=0):
    			pass

    承認頻度を指定します。 デフォルト値:0

feature_columnを使用して埋め込み変数を作成する

def tf.contrib.layers.sparse_column_with_embedding(column_name=column_name,
                                                   dtype=tf.string,
                                                   partition_num=None,
                                                   steps_to_live=None,
                                                   # Only the 140 Lite version of TensorFlow supports these parameters. 
                                                   steps_to_live_l2reg=None,
                                                   l2reg_theta=None)

  # column_name: column name
  # dtype: type, default is tf.string

  • tf. get_embeding_variableを使用して、埋め込み変数を含むTensorFlowグラフを作成します。

    #!/usr/bin/python
    import tensorflow as tf
    
    var = tf.get_embedding_variable("var_0",
                                    embedding_dim=3,
                                    initializer=tf.ones_initializer(tf.float32),
                                    partitioner=tf.fixed_size_partitioner(num_shards=4))
    
    shape = [var1.total_count() for var1 in var]
    
    emb = tf.nn.embedding_lookup(var, tf.cast([0,1,2,5,6,7], tf.int64))
    fun = tf.multiply(emb, 2.0, name='multiply')
    loss = tf.reduce_sum(fun, name='reduce_sum')
    opt = tf.train.FtrlOptimizer(0.1,
                                 l1_regularization_strength=2.0,
                                 l2_regularization_strength=0.00001)
    
    g_v = opt.compute_gradients(loss)
    train_op = opt.apply_gradients(g_v)
    
    init = tf.global_variables_initializer()
    
    sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)
    with tf.Session(config=sess_config) as sess:
      sess.run([init])
      print(sess.run([emb, train_op, loss]))
      print(sess.run([emb, train_op, loss]))
      print(sess.run([emb, train_op, loss]))
      print(sess.run([shape]))
  • 埋め込み変数をチェックポイントとして保存する

    #!/usr/bin/python
    import tensorflow as tf
    
    var = tf.get_embedding_variable("var_0",
                                    embedding_dim=3,
                                    initializer=tf.ones_initializer(tf.float32),
                                    partitioner=tf.fixed_size_partitioner(num_shards=4))
    
    emb = tf.nn.embedding_lookup(var, tf.cast([0,1,2,5,6,7], tf.int64))
    
    init = tf.global_variables_initializer()
    saver = tf.train.Saver(sharded=True)
    print("GLOBAL_VARIABLES: ", tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES))
    print("SAVEABLE_OBJECTS: ", tf.get_collection(tf.GraphKeys.SAVEABLE_OBJECTS))
    
    checkpointDir = "/tmp/model_dir"
    sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)
    with tf.Session(config=sess_config) as sess:
      sess.run([init])
      print(sess.run([emb]))
    
      save_path = saver.save(sess, checkpointDir + "/model.ckpt", global_step=666)
      tf.train.write_graph(sess.graph_def, checkpointDir, 'train.pbtxt')
      print("save_path", save_path)
      print("list_variables", tf.contrib.framework.list_variables(checkpointDir))
  • チェックポイントから埋め込み変数を復元する

    #!/usr/bin/python
    import tensorflow as tf
    
    var = tf.get_embedding_variable("var_0",
                                    embedding_dim=3,
                                    initializer=tf.ones_initializer(tf.float32),
                                    partitioner=tf.fixed_size_partitioner(num_shards=4))
    
    emb = tf.nn.embedding_lookup(var, tf.cast([0,1,2,5,6,7], tf.int64))
    
    init = tf.global_variables_initializer()
    saver = tf.train.Saver(sharded=True)
    print("GLOBAL_VARIABLES: ", tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES))
    print("SAVEABLE_OBJECTS: ", tf.get_collection(tf.GraphKeys.SAVEABLE_OBJECTS))
    
    checkpointDir = "/tmp/model_dir"
    sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)
    with tf.Session(config=sess_config) as sess:
      print("list_variables", tf.contrib.framework.list_variables(checkpointDir))
      saver.restore(sess, checkpointDir + "/model.ckpt-666")
      print(sess.run([emb]))
  • feature_columnを使用して、埋め込み変数を含むTensorFlowグラフを作成します。

    import tensorflow as tf
    import os
    
    columns_list=[]
    columns_list.append(tf.contrib.layers.sparse_column_with_embedding(column_name="col_emb", dtype=tf.string))
    W = tf.contrib.layers.shared_embedding_columns(sparse_id_columns=columns_list,
            dimension=3,
            initializer=tf.ones_initializer(tf.float32),
            shared_embedding_name="xxxxx_shared")
    
    ids={}
    ids["col_emb"] = tf.SparseTensor(indices=[[0,0],[1,0],[2,0],[3,0],[4,0]], values=["aaaa","bbbbb","ccc","4nn","5b"], dense_shape=[5, 5])
    
    emb = tf.contrib.layers.input_from_feature_columns(columns_to_tensors=ids, feature_columns=W)
    
    fun = tf.multiply(emb, 2.0, name='multiply')
    loss = tf.reduce_sum(fun, name='reduce_sum')
    opt = tf.train.FtrlOptimizer(0.1, l1_regularization_strength=2.0, l2_regularization_strength=0.00001)
    g_v = opt.compute_gradients(loss)
    train_op = opt.apply_gradients(g_v)
    init = tf.global_variables_initializer()
    init_local = tf.local_variables_initializer()
    sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)
    with tf.Session(config=sess_config) as sess:
      sess.run(init)
      print("init global done")
      sess.run(init_local)
      print("init local done")
      print(sess.run([emb, train_op,loss]))
      print(sess.run([emb, train_op,loss]))
      print(sess.run([emb, train_op,loss]))
      print(sess.run([emb]))
    説明

    EmbeddingVariableは、FTRLオプティマイザ、Adagradオプティマイザ、Adamオプティマイザ、およびAdagradDecayオプティマイザのみをサポートします。