batch_size = 512epoch_num = 3embedding_size = 200step = 0learning_rate = 0.001#定义一个使用word-embedding查询同义词的函数#这个函数query_token是要查询的词,k表示要返回多少个最相似的词,embed是我们学习到的word-embedding参数#我们通过计算不同词之间的cosine距离,来衡量词和词的相似度#具体实现如下,x代表要查询词的Embedding,Embedding参数矩阵W代表所有词的Embedding#两者计算Cos得出所有词对查询词的相似度得分向量,排序取top_k放入indices列表def get_similar_tokens(query_token, k, embed):W = embed.numpy()x = W[word2id_dict[query_token]]cos = np.dot(W, x) / np.sqrt(np.sum(W * W, axis=1) * np.sum(x * x) + 1e-9)flat = cos.flatten()indices = np.argpartition(flat, -k)[-k:]indices = indices[np.argsort(-flat[indices])]for i in indices:print('for word %s, the similar word is %s' % (query_token, str(id2word_dict[i])))#将模型放到GPU上训练(fluid.CUDAPlace(0)),如果需要指定CPU,则需要改为fluid.CPUPlace()with fluid.dygraph.guard(fluid.CUDAPlace(0)):#通过我们定义的SkipGram类,来构造一个Skip-gram模型网络skip_gram_model = SkipGram(vocab_size, embedding_size)#构造训练这个网络的优化器adam = fluid.optimizer.AdamOptimizer(learning_rate=learning_rate, parameter_list = skip_gram_model.parameters())#使用build_batch函数,以mini-batch为单位,遍历训练数据,并训练网络for center_words, target_words, label in build_batch(dataset, batch_size, epoch_num):#使用fluid.dygraph.to_variable函数,将一个numpy的tensor,转换为飞桨可计算的tensorcenter_words_var = fluid.dygraph.to_variable(center_words)target_words_var = fluid.dygraph.to_variable(target_words)label_var = fluid.dygraph.to_variable(label)#将转换后的tensor送入飞桨中,进行一次前向计算,并得到计算结果pred, loss = skip_gram_model(center_words_var, target_words_var, label_var)#通过backward函数,让程序自动完成反向计算loss.backward()#通过minimize函数,让程序根据loss,完成一步对参数的优化更新adam.minimize(loss)#使用clear_gradients函数清空模型中的梯度,以便于下一个mini-batch进行更新skip_gram_model.clear_gradients()#每经过100个mini-batch,打印一次当前的loss,看看loss是否在稳定下降step += 1if step % 100 == 0:print("step %d, loss %.3f" % (step, loss.numpy()[0]))#经过10000个mini-batch,打印一次模型对eval_words中的10个词计算的同义词#这里我们使用词和词之间的向量点积作为衡量相似度的方法#我们只打印了5个最相似的词if step % 10000 == 0:get_similar_tokens('one', 5, skip_gram_model.embedding.weight)get_similar_tokens('she', 5, skip_gram_model.embedding.weight)get_similar_tokens('chip', 5, skip_gram_model.embedding.weight)
step 200, loss 0.693step 300, loss 0.693step 400, loss 0.693step 500, loss 0.691step 600, loss 0.688step 700, loss 0.682step 800, loss 0.665step 900, loss 0.658step 1000, loss 0.646step 1100, loss 0.631step 1200, loss 0.612step 1300, loss 0.592step 1400, loss 0.568从打印结果可以看到,经过一定步骤的训练,Loss逐渐下降并趋于稳定 。同时也可以发现skip-gram模型可以学习到一些有趣的语言现象,比如:跟who比较接近的词是"who, he, she, him, himself" 。
3.4词向量的有趣应用在使用word2vec模型的过程中,研究人员发现了一些有趣的现象 。比如得到整个词表的word embedding之后,对任意词都可以基于向量乘法计算出跟这个词最接近的词 。我们会发现,word2vec模型可以自动学习出一些同义词关系,如:
Top 5 words closest to "beijing" are:1. newyork2. paris3. tokyo4. berlin5. seoul...Top 5 words closest to "apple" are:1. banana2. pineapple3. huawei4. peach5. orange
除此以外,研究人员还发现可以使用加减法完成一些基于语言的逻辑推理,如:
Top 1 words closest to "king - man + woman" are1. queen...Top 1 words closest to "captial - china + america" are1. Washington
经验总结扩展阅读
- 米游社上传图片水印怎么关
- 苹果se3参数与图片_苹果se3参数详细配置
- 双叶h-单叶双曲面与双叶双曲面的图像区别
- 许褚怎么牺牲的(三国名将许褚之死)
- 红警尤里怎么玩(红警2共和国之辉尤里怎么玩)
- 怎么玩比较合适(休假去哪玩比较合适)
- 斗地主怎么玩(斗地主怎么记牌最轻松)
- 会玩怎么玩(会玩app低价买金币)
- CSS处理器-Less/Scss
- JUC学习笔记——进程与线程