赞
踩
• 基于Word2Vec的思想,基于TensorFlow相关API实现CBOW+负采样以及
skip-gram+负采样的训练及应用代码(获取对应单词的向量)。
• 要求:
• 代码结构清晰、条理要清晰。
• 训练数据:使用《人民的名义》这部小说。
• 提示:
• 负采样API:tf.nn.sampled_softmax_loss
---代码的执行流程---
创建新项目Word2VecProject -->创建data文件夹放入split_input_file(人民的名义.txt)-->创建数据处理包utils
1. 文本数据分词
1.data_utis.py #jieba,定义split_sentence,convert_sentence_to_words
2.convert_data.py #数据转换运行主程序,os,tf.logging,tf.app.run()
运行命令:
python convert_data.py --opt=split --split_input_file=./data/in_the_name_of_people.txt --split_output_file=./data/words_sentence.txt
2. 词典的构建
运行命令:
python convert_data.py --opt=dictionary --dictionary_input_file=./data/words_sentence.txt --dictionary_output_file=./data/dictionary.json --dictionary_min_count=5
3. 训练数据转换
运行命令:
python convert_data.py --opt=record --record_input_file=./data/words_sentence.txt --record_output_file=./data/train.cbow.data --record_window=4 --record_structure=cbow --record_allow_padding=False
python convert_data.py --opt=record --record_input_file=./data/words_sentence.txt --record_output_file=./data/train.skipgram.data --record_window=4 --record_structure=skip-gram --record_allow_padding=False
4. 训练数据批次加载
详细代码见:utils.data_utils.DataManager
5. 模型训练代码撰写
a. 大的框架搭建
b. 将各个部分的代码完善
B:batch_size, 也就是一个批次中的样本序列数目
T:times, 窗口大小
V:vocab_size, 词汇数目
E:Embedding size, 词向量转换的向量维度大小
6. Word2Vec的负采样的执行过程(以CBOW结构为例)
运行命令:
python train.py --data_path=./data/train.cbow.data --dictionary_path=./data/dictionary.json --network_name=w2v --embedding_size=128 --structure=cbow --window=4 --cbow_mean=True --max_epoch=10 --batch_size=1000 --num_sampled=100 --optimizer_name=adam --learning_rate=0.001 --regularization=0.00001 --checkpoint_dir=./running/model/cbow2 --checkpoint_per_batch=100 --summary_dir=./running/graph/cbow2
NOTE:
训练数据格式:
X:[batch_size,window], eg:[1000,4],表示现在有1000个训练数据/样本,每个样本是4个单词id
Y:[batch_size,1],eg:[1000,1],表示现在有1000个训练数据/样本,每个样本预测对应的某个单词id
网络的执行:
1). 针对每个单词获取其对应的词向量,也就是将id转换为向量
vectors: [batch_size,window] ---> [batch_size,window,embedding_size]
vectors: eg:[1000,4,128],表示现在有1000个训练数据/样本,每个样本是4个单词,每个单词对应128维的一个向量
2). 将上下文单词的向量合并成一个整体向量
features: [batch_size,window,embedding_size] ---> [batch_size,embedding_size]
features: eg:[1000,128],表示现在有1000个训练数据/样本,每个样本有一个高阶特征向量,这个向量的维度为128维,可以基于这个向量判断实际单词id是哪一个。
3). 判断对应的单词是哪一个
NOTE: 模型的目的实际上仅仅只需要获取单词的词向量,而不是要这个预测单词,所以判断对应单词是哪一个的这个过程属于损失函数构建的过程。
a. 普通全连接的执行过程(普通损失函数的构建过程):
-1). 前向过程之后后,得到的高阶特征向量features,需要基于该值得到预测属于各个类别的概率值以及对应的损失函数
-2). 得到属于所有类别的置信度:
logits: [batch_size,vocab_size],eg: [1000,3365], 表示现在有1000个训练数据/样本,预测每个训练数据对应属于各个单词的置信度(总共有3365个单词)。
-3). 思考:
基于logits置信度来构建这个损失函数,步骤如下:
-a). 计算属于各个类别的概率
p = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis=1, keep_dims=True) # [batch_size,vocab_size] / [batch_size,1] --> [batch_size,vocab_size]
-b). 获取实际类别对应的类别预测概率值
pred_p = p[:,labels] # 类似获取对应列的值,当然实际API应该不是这个,形状应该为:[batch_size,]
-c). 计算损失函数
loss = sum(-log(pred_p)) # 先对概率求对数,然后求相反数,最后求和,最终形状为[],是一个数字
b. 负采样的执行过程:
-1). 前向过程之后后,得到的高阶特征向量features,需要基于该值得到对应的损失函数
-2). 首先抽取对应类别的模型参数w(计算得到各个类别置信度的模型参数w)
获取实际类别(正例)对应的模型参数w以及负例对应的模型参数w
-a. 先获取num_sampled个类别对应的参数id(是作为负例的)
-b. 将正例id和负例id合并到一起,获取w,然后w分割开为true_w和sampled_w
-c. 对于高阶特征向量features,分别判断属于正例以及负例的置信度
-d. 对于属于负例的置信度中,如果存在负例id和正例id一致的情况,那么将负例对应的置信度修改为0
-c. 将负例和正例的置信度合并到一起,作为最终的置信度。
-3). 基于抽取的参数计算预测属于各个类别的置信度
-4). 数据结构转换
-5). 计算损失函数(和普通的方式一样)
=====================================================================
7.模型应用代码及模型部署代码完善
deploy.py 部署
eval.py 可视化构建
当模型训练好后,我们需要进行模型的评估、应用等操作,但是在应用的时候要根据业务模型特点,采用不同的方式来进行应用:
也就是说在企业中,一般我们常用的一种用法是:
1. 算法工程师使用Python语言结合业务需求训练好这个模型,并且模型持久化;
2. 模型的应用(一般结合模型特点来做),常规方式如下:
a. 基于训练模型的语言以及框架,将训练好的模型持久化为二进制磁盘文件,然后再需要的地方进行模型的恢复加载(这种方式有一个缺陷,要求模型恢复语言和模型的训练语言必须是一致的), eg:Tensorlow中的ckpt格式模型、sklearn中的joblib保存方式等等。
b. 基于某种特定的框架、API将模型转换为支持跨语言调用的格式文件,然后在需要的地方进行模型的恢复加载(这种方式比较常用,一般企业中就是使用python训练模型,然后使用c++或者java进行模型的恢复)
c. 将模型参数(根据业务来定)保存,然后再需要的地方加载模型参数,进行数据的预测应用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。