儿童节快乐,保留初心,砥砺前行
- embedding通俗易懂说就是将word映射为向量。
- 对自然语言处理中需要让机器理解word与word之间的关系,例如法国对应巴黎、中国对应北京,就需要用到embedding技术使词与词产生的向量之间存在某种联系(例如意思相近的词产生的向量在空间上更加接近等等)。这些都是后话。
- 这里只记录tensorflow中关于embedding给出的一个函数
embedding_lookup
tensorflow官方文档见这里
tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None, validate_indices=True, max_norm=None)
作用:Looks up ids in a list of embedding tensors:也就是说在参数params中查找ids所对应的表示,如果这样的叙述并不清楚,那么参考下边这个简单的例子。
import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
embedding = tf.Variable(np.identity(6, dtype=np.int32))
input_ids = tf.placeholder(dtype=tf.int32, shape=[None])
input_embedding = tf.nn.embedding_lookup(embedding, input_ids)
sess.run(tf.global_variables_initializer())
print sess.run(embedding)
print sess.run(input_embedding, feed_dict={input_ids: [4, 0, 2, 4, 5, 1, 3, 0]})
运行结果
从以上简单示例可以看出,embedding将变量表现成了one-hot形式,而
input_embedding = tf.nn.embedding_lookup(embedding, input_ids)
就是把input_ids中给出的tensor表现成embedding中的形式。
简单来说上图中红线上部是创建了一个embedding词典,红线下部是通过输入的input_ids查询上部的字典得到embedding后的值。而字典是可以由用户随意创建的,图中给出的是一个one-hot字典,还可以自由创建其他字典,例如使用正态分布或均匀分布产生(0,1)的随机数创建任意维度的embedding字典
- 也就是说 embedding_lookup是tensorflow中给出的用于以某种方式进行embedding的函数
如果参数partition_strategy是 "mod",我们把每一个id分配到间隔p的分区中(p = id % len(params))。例如,13个ids划分为5个分区:[[0, 5, 10], [1, 6, 11], [2, 7, 12], [3, 8], [4, 9]]
如果参数partition_strategy是 "div",我们把用连续的方式将ids分配到不同的分区。例如,13个ids划分为5个分区:[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10], [11, 12]]