word2vec_basic.py を相変わらず読んでいるが..
さっぱりわからん..
ようやく、generate_batch()が何やってるかわかったのだけど、肝心の計算グラフがよくわからん..
特に tf.nn.embedding_lookup() 。
なのでTensorFlowサイトの該当するリファレンスっぽい箇所を翻訳してみた。
今回は、いつも以上に翻訳結果がよくわからない..
一応載せますが、載せてる本人まったく正しいかどうか自信なし。
参照する方は、at your own risk でお願いします。
--------
埋め込みテンソルのリストからidsをlookupする。
この関数はparams 内のテンソルのリスト上を並列lookup処理を実行するために使用されます。paramsが大きな埋め込みテンソルの分割として解釈される場合、この関数はtf.gather()の生成となります。
もし len(params) >1 であれば、idsの各要素は partition_strategy に従って params の要素を分割します。すべての戦略において、もしid空間がパーティションを均等な数に分けられない場合、最初の (max_id + 1) % len(params) 個の各パーティションは、もう一つのidを割り当てられます。
もし partition_strategy が "mod" であれば、パーティション p が p = id % len(params) となるよう各idを割り当てます。例えば、13個のidは次のような5つのパーティションに分割されます:[[0, 5, 10], [1, 6, 11], [2, 7, 12], [3, 8], [4, 9]]
もし partition_strategy が "div" であれば、隣接法でidをパーティションに割り当てます。この場合、13個のidは次のような5つのパーティションに分割されます:[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10], [11, 12]]
lookupの結果は密度テンソルへ連結されます。返却されたテンソルは shape(ids) + shape(params)[1:] 形式です。
-----
lookupは検索とか索引とかの意味だけど、ここは何なんだろう..
tf.gater()も調べないとダメかな..
ということで、コッチも翻訳してみた。
以下、at your own risk で参照してください。
-----
indices (インデックスの複数形) に従って params からスライスを集約します。
indices は、(一般的には0次元もしくは1次元の)整数テンソルであるべきです。 indices.shape + params.shape[1:] 形式のアウトプットテンソルを作成します:
引数:
戻り値:
テンソル。paramsと同じタイプ。
-----
ためにに実行してみないと、さっぱりわからんなあ..
ちなみに、以下のかんじで実行して試すことができます。
いりいろやってみた。
..なるほどね、実際にイロイロ入れてみたほうがわかりやすいかもね..
Excelのうんちゃらlookupをイメージした方がいいのか..
さっぱりわからん..
ようやく、generate_batch()が何やってるかわかったのだけど、肝心の計算グラフがよくわからん..
特に tf.nn.embedding_lookup() 。
なのでTensorFlowサイトの該当するリファレンスっぽい箇所を翻訳してみた。
今回は、いつも以上に翻訳結果がよくわからない..
一応載せますが、載せてる本人まったく正しいかどうか自信なし。
参照する方は、at your own risk でお願いします。
--------
tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None, validate_indices=True)
埋め込みテンソルのリストからidsをlookupする。
この関数はparams 内のテンソルのリスト上を並列lookup処理を実行するために使用されます。paramsが大きな埋め込みテンソルの分割として解釈される場合、この関数はtf.gather()の生成となります。
もし len(params) >1 であれば、idsの各要素は partition_strategy に従って params の要素を分割します。すべての戦略において、もしid空間がパーティションを均等な数に分けられない場合、最初の (max_id + 1) % len(params) 個の各パーティションは、もう一つのidを割り当てられます。
もし partition_strategy が "mod" であれば、パーティション p が p = id % len(params) となるよう各idを割り当てます。例えば、13個のidは次のような5つのパーティションに分割されます:[[0, 5, 10], [1, 6, 11], [2, 7, 12], [3, 8], [4, 9]]
もし partition_strategy が "div" であれば、隣接法でidをパーティションに割り当てます。この場合、13個のidは次のような5つのパーティションに分割されます:[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10], [11, 12]]
lookupの結果は密度テンソルへ連結されます。返却されたテンソルは shape(ids) + shape(params)[1:] 形式です。
-----
lookupは検索とか索引とかの意味だけど、ここは何なんだろう..
tf.gater()も調べないとダメかな..
ということで、コッチも翻訳してみた。
以下、at your own risk で参照してください。
-----
tf.gather(params, indices, validate_indices=None, name=None)
indices (インデックスの複数形) に従って params からスライスを集約します。
indices は、(一般的には0次元もしくは1次元の)整数テンソルであるべきです。 indices.shape + params.shape[1:] 形式のアウトプットテンソルを作成します:
# スカラ indices
output[:, ..., :] = params[indices, :, ... :]
# ベクトル indices
output[i, :, ..., :] = params[indices[i], :, ... :]
# 高階 indices
output[i, ..., j, :, ... :] = params[indices[i, ..., j], :, ..., :]
もし indices が配列で len(indices) == params.shape[0] であるならば、indicesに従ってこの操作はparamsを置換します。
引数:
- params:テンソル
- indices:テンソル。int32もしくはint64形式でなければならない
- validate_indices:オプションの真偽値。デフォルトは真
- name:オペレーションの名前(オプション)
戻り値:
テンソル。paramsと同じタイプ。
-----
ためにに実行してみないと、さっぱりわからんなあ..
ちなみに、以下のかんじで実行して試すことができます。
いりいろやってみた。
..なるほどね、実際にイロイロ入れてみたほうがわかりやすいかもね..
Excelのうんちゃらlookupをイメージした方がいいのか..
0 件のコメント:
コメントを投稿