TensorFlow : Guide : ML Concepts : 埋め込み (Embedding) (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 07/14/2018
作成日時 : 09/10/2017
* 本ページは、TensorFlow 本家サイトの Guide – ML Concepts – Embedding を翻訳した上で
適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、適宜、追加改変している場合もあります。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
Facebook: https://www.facebook.com/ClassCatJP/ |
埋め込み (= embedding) は単語のような離散的な (= discrete, 別々の) オブジェクトから実数のベクトルへのマッピングです。例えば、英単語のための 300-次元埋め込みは以下を含むかもしれません :
blue: (0.01359, 0.00075997, 0.24608, ..., -0.2524, 1.0048, 0.06259) blues: (0.01396, 0.11887, -0.48963, ..., 0.033483, -0.10007, 0.1158) orange: (-0.24776, -0.12359, 0.20986, ..., 0.079717, 0.23865, -0.014213) oranges: (-0.35609, 0.21854, 0.080944, ..., -0.35413, 0.38511, -0.070976)
埋め込みは離散した入力に機械学習を適用させてくれます。分類器、そしてより一般的にニューラルネットワークは密で連続的なベクトルで動作するように設計されています、そこではすべての値がオブジェクトが何であるかを定義するために寄与します。もし離散的なオブジェクトが離散的なアトム、e.g., 一意な id 数、として素朴にエンコードされるのであれば、それらは学習と一般化を阻害するでしょう。埋め込みを考える一つの方法はベクトルでないオブジェクトを機械学習のための有用な入力に変換する手段としてです。
埋め込みはまた機械学習の出力としても有用です。埋め込みはオブジェクトをベクトルにマップしますので、アプリケーションはベクトル空間における類似性 (e.g., ユークリッド距離やベクトル間の角度) をオブジェクトの類似性の堅牢で柔軟な尺度として利用できます。一つの共通的な利用方法は最近傍を見つけることです。上の同じ単語埋め込み (word embeddings) を使えば、例えば、各単語に対して3つの最近傍と相当する角度 (度単位) がここにあります :
blue: (red, 47.6°), (yellow, 51.9°), (purple, 52.4°) blues: (jazz, 53.3°), (folk, 59.1°), (bluegrass, 60.6°) orange: (yellow, 53.5°), (colored, 58.0°), (bright, 59.9°) oranges: (apples, 45.3°), (lemons, 48.3°), (mangoes, 50.4°)
これはアプリケーションに、(45.3° 離れている) りんごとオレンジはある意味では (48.3° 離れている) レモンとオレンジよりも類似していることを伝えているでしょう。
埋め込みを訓練する
TensorFlow で単語埋め込みを訓練するためには、最初にテキストを単語(群)に分割して語彙の総ての単語に整数を割り当てる必要があります。これは既に行われたとし、word_ids はこれらの整数のベクトルだと仮定しましょう。例えば、文 “I have a cat.” は [“I”, “have”, “a”, “cat”, “.”] に分割されてそして相当する word_ids テンソルは shape [5] を持ち5つの整数から成ります。これらの word ids を埋め込むためには、次のように embedding variable を作成してtf.gather 関数を使用する必要があります :
word_embeddings = tf.get_variable(“word_embeddings”, [vocabulary_size, embedding_size]) embedded_word_ids = tf.gather(word_embeddings, word_ids)
この後、テンソル embedded_word_ids は私たちの例では shape [5, embedding_size] を持ち5つの単語のそれぞれに対する埋め込み (密ベクトル) を含みます。variable word_embeddings は学習されて訓練の最後には語彙の総ての単語に対する埋め込みを含みます。埋め込みは多くの方法で訓練できます、利用可能なデータに依存して。例えば、文の巨大なコーパスが与えられた場合、前の一つから次の単語を予想するためにリカレント・ニューラルネットワークを使用できるでしょう、あるいは多言語翻訳を行なうために2つのネットワークを訓練できるでしょう。これらのメソッドは 単語のベクタ表現・チュートリアル で説明されていますが、しかし総ての場合において上のような embedding variable があり、示したように、単語は tf.gather を使用して埋め込まれます。
埋め込みを可視化する
TensorBoard は、Embedding Projector (埋め込み投射器) と呼ばれる、埋め込みの対話的な可視化のための組み込みのビジュアライザーを持ちます。embedding projector は貴方のチェックポイント・ファイルから埋め込みを読み込みそしてそれらを 主成分分析 を使用して 3-次元に射影します。PCA の視覚的表現については、この記事 を見てください。貴方が利用できる他の非常に有用な射影は t-SNE です。
埋め込みで作業しているのであれば、データポイントにラベル/画像をアタッチすることを多分望むでしょう。各ポイントのラベルを含む メタデータ・ファイル を生成してそして Python API を使用するか手動で projector_config.pbtxt をチェックポイントと同じディレクトリに構築して保存するかをして projector を構成することによってこれを行なうことができます。
セットアップ
TensorBoard をどのように実行して必要な情報の総てをロギングしているかをどのように確かなものにするかについての徹底した情報は TensorBoard: 学習を視覚化する を見てください。
貴方の埋め込みを可視化するには、貴方が行なう必要がある3つのことがあります :
1) 貴方の埋め込みを保持する 2D テンソルをセットアップする。
embedding_var = tf.get_variable(....)
2) 定期的に貴方のモデル variable を LOG_DIR のチェックポイントに保存する。
saver = tf.train.Saver() saver.save(session, os.path.join(LOG_DIR, "model.ckpt"), step)
3) (オプション) メタデータを貴方の埋め込みと関連付ける。
貴方の埋め込みに関連する任意のメタデータ (レベル、画像) を持つ場合、直接 LOG_DIR の projector_config.pbtxt (訳注: projector_config.proto) を保存するか、あるいは Python API を使用することで TensorBoard にそれについて知らせることができます。
例えば、次の projector_config.ptxt (訳注: 原文まま) は word_embedding テンソルを $LOG_DIR/metadata.tsv にストアされている metadata と関連付けます :
embeddings { tensor_name: 'word_embedding' metadata_path: '$LOG_DIR/metadata.tsv' }
同じ config は次のコード・スニペットを使ってプログラムで生成できます :
from tensorflow.contrib.tensorboard.plugins import projector # Create randomly initialized embedding weights which will be trained. vocabulary_size = 10000 embedding_size = 200 embedding_var = tf.get_variable('word_embedding', [vocabulary_size, embedding_size]) # Format: tensorflow/tensorboard/plugins/projector/projector_config.proto config = projector.ProjectorConfig() # You can add multiple embeddings. Here we add only one. embedding = config.embeddings.add() embedding.tensor_name = embedding_var.name # Link this tensor to its metadata file (e.g. labels). embedding.metadata_path = os.path.join(LOG_DIR, 'metadata.tsv') # Use the same LOG_DIR where you stored your checkpoint. summary_writer = tf.summary.FileWriter(LOG_DIR) # The next line writes a projector_config.pbtxt in the LOG_DIR. TensorBoard will # read this file during startup. projector.visualize_embeddings(summary_writer, config)
モデルを実行して埋め込みを訓練した後、TensorBoard を実行してそれにジョブの LOG_DIR をポイントさせてください。
tensorboard --logdir=LOG_DIR
それからトップ・ペインの Embeddings タブ上をクリックして適切な run を選択してください (もし一つ以上の run があれば)。
メタデータ
通常は埋め込みはそれに関連づけられたメタデータを持ちます (e.g. ラベル、画像)。メタデータはモデル・チェックポイントの外の別のファイルにストアされるべきです、何故ならばメタデータはモデルの訓練パラメータではないからです。フォーマットは最初の行がカラム・ヘッダ (ボールドで示されます) を含み続く行がメタデータ値を含む TSV ファイル (タブ・キャラクタは赤色で示されます) であるべきです :
Airplane\t345
Car\t241
…
メインのデータファイルと共有される明示的なキーはありません; 代わりに、メタデータ・ファイルの順序は埋め込みテンソルの順序とマッチすることが仮定されています。換言すれば、最初の行はヘッダ情報でメタデータファイルの (i+1)-th 行は、チェックポイントの埋め込みテンソルの i-th 行に相当します。
Note:
TSV メタデータファイルが単一のカラムだけを持つならば、ヘッダ行を期待せずに、そして各行が埋め込みのラベルと仮定します。この例外を含むのは、一般に使用される “vocab file” フォーマットにに適合するからです。
画像
貴方の埋め込みに関連付けられた画像を持つのであれば、各データポイントの小さいサムネイルからなる単一の画像を生成する必要があるでしょう。これは スプライト画像 として知られています。スプライトは row-first 順でストアされたサムネイルで行とカラムの同じ数を持つべきです : 最初のデータポイントは左上隅に置かれて最後のデータポイントは右下隅です :
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 |
上の例で最後の行は満たされる必要はありません。スプライトの具体的な例として、10,000 MNIST 数字 (100×100) の このスプライト画像 を見てください。
Note: 現時点では 8192px X 8192px までのスプライトをサポートしています。
(訳注: 参考のため MNIST のスプライト画像を張り付けておきます : )
スプライトを作成したら、Embedding Projector にそれをどこで見つけるか知らせる必要があります :
embedding.sprite.image_path = PATH_TO_SPRITE_IMAGE # Specify the width and height of a single thumbnail. embedding.sprite.single_image_dim.extend([w, h])
相互作用
Embedding Projector は3つのパネルを持ちます :
- 左上のデータ・パネル、ここでは彩色してポイントにラベル付けするための run (= 実行)、埋め込みテンソルそしてデータカラムを選択できます。
- 左下の Projections パネル、ここでは射影 (e.g. PCA, t-SNE) のタイプを選択します。
- 右側の Inspector パネル、ここでは特定のポイントを検索して最近傍のリストが見れます。
射影
Embedding Projector はデータセットの次元を削減する3つのメソッドを持ちます : 2つの線形と一つの非線形です。各メソッドは 2- または 3-次元ビューを作成するために使用できます。
主成分分析 次元を削減するための率直なテクニックは 主成分分析 (Principal Component Analysis, PCA) です。Embedding Projector は top 10 主成分を計算します。メニューは貴方にこれらの成分を2つまたは3つの任意の結合に射影させることを可能にします。PCA は線形射影で、大域的な幾何学を検証するのに効果的です。
t-SNE 人気のある非線形次元削減テクニックが t-SNE です。Embedding Projector は 2- と 3-次元両者の t-SNE ビューを提供します。アルゴリズムの各ステップでクライアント側アニメーティングでレイアウトが実行されます。t-SNE はしばしば何某かのローカル構造を保存するので、ローカル近傍の探索とクラスタを見つけるために有用です。高次元データの可視化に非常に有用ですが、t-SNE プロットは時々怪しげ (= mysterious) で誤解させやすいです。”how to use t-SNE effectively (t-SNE をどのように効果的に使用するか)” についてのこの 優れた記事 を見てください。
カスタム 空間における意味のある方向性を見つけるためにテキスト検索に基づく特殊な線形射影を構築することもできます。射影軸を定義するためには、2つの検索文字列または正規表現を入力してください。プログラムは (ポイントの) ラベルがこれらの検索に適合するポイントのセットの重心を計算し、射影軸としての重心間の差分ベクトルを使用します。
ナビゲーション
データセットを探求するために、2D または 3D モードで、自然なクリック & ドラッグという行動を使用してビューをズーム、回転、そしてパンにナビゲートすることができます。ポイントをクリックすると右ペインに最近傍の明示的な textual リストが現在のポイントへの距離と共に表示されます。最近傍ポイントそれ自体は射影上でハイライトされます。
クラスタにズームすることは何某かの情報を与えますが、ポイントのサブセットにビューを制限してそれらのポイント上だけで射影を実行することは時々更に有用です。それを行なうために、複数の方法でポイントを選択できます :
- ポイント上をクリック後、その最近傍もまた選択されます。
- 検索後、クエリーにマッチするポイントが選択されます。
- selection を有効にして、ポイント上をクリックしてドラッグすることは選択球 (= selection sphere) を定義します。
ポイントのセットの選択後、それらのポイントをそれら自身の上の更なる解析のために右側の Inspector ペインの “Isolate Points” ボタンで分離することができます。

単語埋め込みデータセットで “important” の最近傍の選択
カスタム射影によるフィルタリングの組み合わせはパワフルです。下で、私たちは “politics” の 100 最近傍をフィルタしてそれらを x 軸として “best” – “worst” ベクトルに射影しました。y 軸はランダムです。
右側には “ideas”, “science”, “perspective”, “journalism” を持ち、その一方左側では “crisis”, “violence” を “conflict” を持つことが見れます。
![]() | ![]() |
カスタム射影コントロール。 | “politics” の近傍の “best” – “worst” ベクトルへのカスタム射影。 |
共同的な特徴
貴方の発見を共有するために、右下隅の bookmark パネルを使用して現在の (任意の射影の計算された座標を含む) 状態を小さいファイルに保存することができます。それから Projector はこれらのファイルの一つまたはそれ以上のセットにポイントされることが可能で、下のパネルを生成します。そして他のユーザはブックマークのシークエンスを通り歩くことができます。
Mini-FAQ
“埋め込み” は action ですか thing ですか? 両者です。人々はベクトル空間に単語を埋め込む (action) ことについてそして単語埋め込み (things) を生成することについて話します。両者に共通なのは離散したオブジェクトからベクトルへのマッピングとしての埋め込みの概念です。そのマッピングを作成または適用することは action ですが、マッピングそれ自身は thing です。
埋め込みは高次元ですか低次元ですか? 場合によります。単語と句の 300-次元ベクトル空間は、例えばですが、それが含むことができる数百万の単語と句と比較した時にはしばしば低次元 (そして密) と呼ばれます。しかし数学的にはそれは高次元で、人間の直感が 2- と 3- 次元空間について学ぶものとは劇的に異なる多くの特性を表示します。
埋め込みは埋め込み層と同じですか ? いいえ; 埋め込み層はニューラルネットワークの一部ですが、埋め込みはより一般的な概念です。
以上