超大規模トレーニングで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オプティマイザのみをサポートします。