word embedding之skip gram理解

所谓word embedding我的理解就是把词通过上下文之间的联系转换成词向量
word embedding之skip gram理解_第1张图片

skip gram是其中一种,是由中心词到周围词

word embedding之skip gram理解_第2张图片

小周亲手画的

上图中,首先输入中心词的onehot编码,与矩阵W1相乘,获取中心词的词向量;接着与矩阵W2相乘,相当于中心词的词向量与每一个其他词的词向量相乘,向量内积可以代表余弦相似性,然后输入softmax层,即输出词库里各个词汇的概率

实现即把中心词的onehot编码当做输入,上下文里的词出现的概率做输出,以此来进行训练,其实真正想要的是中间的隐藏层权重,也就是我们想要的对应于每个词的词向量。那么输入就是某个poi的one-hot编码,输出就是对应于词库内各个词的概率。但其实我们想要的是中间隐藏层的权重,W1,W2
其实核心也就是两个矩阵,转换来转换去的

简单实现就是直接弄一个隐藏层,然后输入隐藏层的权重就是上图中的W1,隐藏层输出的权重就是上图中的W2

def weight_variable(shape,name_w):
    initial = tf.truncated_normal(shape, stddev=0.1,name=name_w)
    return tf.Variable(initial)


X = tf.placeholder(tf.float32, [None, input_size],name='x')
W1 = weight_variable([input_size,embedding_size],name_w='W1')
v_c= tf.matmul(X, W1)
W2= weight_variable([embedding_size,input_size],name_w='W2')
M=tf.matmul(v_c, W2)
Y = tf.placeholder(tf.float32, [None,output_size],name='y')
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=M, labels=Y))
train_op = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)
correct_prediction = tf.equal(tf.argmax(M, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
saver = tf.train.Saver(tf.global_variables())

至于哪个矩阵是词向量矩阵,我看有人说W1和W2都可以本质是一样的,也有人说应该取W1,好像官方取得是W1

学习链接

Word2Vec介绍:直观理解skip-gram模型
Word2Vec介绍:skip-gram模型
Word2Vec介绍:skip-gram模型的python实现
Embedding理解与代码实现

你可能感兴趣的:(机器学习)