当前位置: 首页 > news >正文

国产 做 视频网站怎么引导做淘宝的客户做官方网站

国产 做 视频网站,怎么引导做淘宝的客户做官方网站,sem优化师底薪一般多少,南宁公司网站设计GAN作为生成模型的一种新型训练方法#xff0c;通过discriminative model来指导generative model的训练#xff0c;并在真实数据中取得了很好的效果。尽管如此#xff0c;当目标是一个待生成的非连续性序列时#xff0c;该方法就会表现出其局限性。非连续性序列生成#x…GAN作为生成模型的一种新型训练方法通过discriminative model来指导generative model的训练并在真实数据中取得了很好的效果。尽管如此当目标是一个待生成的非连续性序列时该方法就会表现出其局限性。非连续性序列生成比如说文本生成为什么单纯的使用GAN没有取得很好的效果呢主要的屏障有两点 1在GAN中Generator是通过随机抽样作为开始然后根据模型的参数进行确定性的转化。通过generative model G的输出discriminative model D计算的损失值根据得到的损失梯度去指导generative model G做轻微改变从而使G产生更加真实的数据。而在文本生成任务中G通常使用的是LSTM那么G传递给D的是一堆离散值序列即每一个LSTM单元的输出经过softmax之后再取argmax或者基于概率采样得到一个具体的单词那么这使得梯度下架很难处理。 2GAN只能评估出整个生成序列的score/loss不能够细化到去评估当前生成token的好坏和对后面生成的影响。 强化学习可以很好的解决上述的两点。再回想一下Policy Gradient的基本思想即通过reward作为反馈增加得到reward大的动作出现的概率减小reward小的动作出现的概率如果我们有了reward就可以进行梯度训练更新参数。如果使用Policy Gradient的算法当G产生一个单词时如果我们能够得到一个反馈的Reward就能通过这个reward来更新G的参数而不再需要依赖于D的反向传播来更新参数因此较好的解决了上面所说的第一个屏障。对于第二个屏障当产生一个单词时我们可以使用蒙塔卡罗树搜索(Alpho Go也运用了此方法)立即评估当前单词的好坏,而不需要等到整个序列结束再来评价这个单词的好坏。 因此强化学习和对抗思想的结合理论上可以解决非连续序列生成的问题而SeqGAN模型正是这两种思想碰撞而产生的可用于文本序列生成的模型。 SeqGAN模型的原文地址为https://arxiv.org/abs/1609.05473,当然在我的github链接中已经把下载好的原文贴进去啦。 结合代码可以更好的理解模型的细节哟https://github.com/princewen/tensorflow_practice/tree/master/seqgan 2、SeqGAN的原理 SeqGAN的全称是Sequence Generative Adversarial Nets。这里打公式太麻烦了所以我们用word打好再粘过来冲这波手打也要给小编一个赞呀哈哈 整体流程 模型的示意图如下 Generator模型和训练 接下来我们分别来说一下Generator模型和Discriminator模型结构。 Generator一般选择的是循环神经网络结构RNNLSTM或者是GRU都可以。对于输入的序列我们首先得到序列中单词的embedding然后输入每个cell中并结合一层全链接隐藏层得到输出每个单词的概率即 有了这个概率Generator可以根据它采样一批产生的序列比如我们生成一个只有两个单词的序列总共的单词序列有3个第一个cell的输出为(0.5,0.5,0.0),第二个cell的输出为(0.1,0.8,0.1)那么Generator产生的序列以0.4的概率是1-2,以0.05的概率是1-1。注意这里Generator产生的序列是概率采样得到的而不是对每个输出进行argmax得到的固定的值。这和policy gradient的思想是一致的。 在每一个cell我们都能得到一个概率分布我们基于它选择了一个动作或者说一个单词如何判定基于这个概率分布得到的单词的还是坏的呢即我们需要一个reward来左右这个单词被选择的概率。这个reward怎么得到呢就需要我们的Discriminator以及蒙塔卡罗树搜索方法了。前面提到过Reward的计算依据是最大可能的Discriminator即尽可能的让Discriminator认为Generator产生的数据为real-world的数据。这里我们设定real-world的数据的label为1而Generator产生的数据label为0. 如果当前的cell是最后的一个cell即我们已经得到了一个完整的序列那么此时很好办直接把这个序列扔给Discriminator得到输出为1的概率就可以得到reward值。如果当前的cell不是最后一个cell即当前的单词不是最后的单词我们还没有得到一个完整的序列如何估计当前这个单词的reward呢我们用到了蒙特卡罗树搜索的方法。即使用前面已经产生的序列从当前位置的下一个位置开始采样得到一堆完整的序列。在原文中采样策略被称为roll-out policy这个策略也是通过一个神经网络实现这个神经网络我们可以认为就是我们的Generator。得到采样的序列后我们把这一堆序列扔给Discriminator得到一批输出为1的概率这堆概率的平均值即我们的reward。这部分正如过程示意图中的下面一部分 用原文中的公式表示如下 得到了reward我们训练Generator的方式就很简单了即通过Policy Gradient的方式进行训练。最简单的思想就是增加reward大的动作的选择概率减小reward小的动作的选择概率。 Discriminator模型和训练 Discriminator模型即一个分类器对文本分类的分类器很多原文采用的是卷积神经网络。同时为了使模型的分类效果更好在CNN的基础上增加了一个highway network。有关highway network的介绍参考博客https://blog.csdn.net/l494926429/article/details/51737883这里就不再细讲啦。 对于Discriminator来说既然是一个分类器输出的又是两个类别的概率值我们很自然的想到使用类似逻辑回归的对数损失函数没错论文中也是使用对数损失来训练Discriminator的。 结合oracle模型 可以说模型我们已经介绍完了但是在实验部分论文中引入了一个新的模型中被称为oracle model。这里的oracle如何翻译我还真的是不知道总不能翻译为甲骨文吧。这个oracle model被用来生成真实的序列可以认为这个model就是一个被训练完美的lstm模型输出的序列都是real-world数据。论文中使用这个模型的原因有两点首先是可以用来产生训练数据另一点是可以用来评价我们Generator的真实表现。原文如下 我们会在训练过程中不断通过上面的式子来评估我们的Generator与oracle model的相似性。 预训练过程 上面我们讲的其实是在对抗过程中Generator和Discriminator的训练过程其实在进行对抗之前我们的Generator和Discriminator都有一个预训练的过程这能使我们的模型更快的收敛。 对于Generator来说预训练和对抗过程中使用的损失函数是不一样的在预训练过程中Generator使用的是交叉熵损失函数而在对抗过程中我们使用的则是Policy Gradient中的损失函数即对数损失*奖励值。 而对Discriminator来说两个过程中的损失函数都是一样的即我们前面介绍的对数损失函数。 SeqGAN模型流程 介绍了这么多我们再来看一看SeqGAN的流程 3、SeqGAN代码解析 这里我们用到的代码高度还原了原文中的实验过程本文参考的github代码地址为https://github.com/ChenChengKuan/SeqGAN_tensorflow 参考的代码为python2版本的本文将其稍作修改改成了python3版本的。其实主要就是print和pickle两个地方。本文代码的github地址为https://github.com/princewen/tensorflow_practice/tree/master/seqgan 代码实在是太多了我们这里只介绍一下代码结构具体的代码细节大家可以参考github进行学习。 3.1 代码结构 本文的代码结构如下 savesave文件夹下保存了我们的实验日志eval_file是由Generator产生用来评价Generator和oracle model相似性所产生的数据。real_data是由oracle model产生的real-world数据generator_sample是由Generator产生的数据target_params是oracle model的参数我们直接用里面的参数还原oracle model。 configuration : 一些配置参数 dataloader.py: 产生训练数据对于Generator来说我们只在预训练中使用dataloader来得到训练数据对Discriminator来说在预训练和对抗过程中都要使用dataloader来得到训练数据。而在eval过程即进行Generator和oracle model相似性判定时会用刀dataloader来产生数据。 discriminator.py定义了我们的discriminator generator.py 定义了我们的generator rollout.py计算reward时的采样过程 target_lstm.py定义了我们的oracle model这个文件不用管复制过去就好哈哈。 train.py : 定义了我们的训练过程这是我们一会重点讲解的文件 utils.py : 定义了一些在训练过程中的通用过程。 下面我们就来介绍一下每个文件。 3.2 dataloader dataloader是我们的数据生成器。 它定义了两个类一个时Generator的数据生成器主要用于Generator的预训练以及计算Generator和Oracle model的相似性。另一个时Discriminator的数据生成器主要用于Discriminator的训练。 3.3 generator generator中定义了我们的Generator代码结构如下 build_input定义了我们的预训练模型和对抗过程中需要输入的数据 build_pretrain_network : 定义了Generator的预训练过程中的网络结构其实这个网络结构在预训练对抗和采样的过程中是一样的参数共享。预训练过程中定义的损失是交叉熵损失。 build_adversarial_network: 定义了Generator的对抗过程的网络结构和预训练过程共享参数因此你可以发现代码基本上是一样的只不过在对抗过程中的损失函数是policy gradient的损失函数即 -log(p(xi) * v(xi): self.pgen_loss_adv - tf.reduce_sum(tf.reduce_sum(tf.one_hot(tf.to_int32(tf.reshape(self.input_seqs_adv,[-1])),self.num_emb,on_value1.0,off_value0.0)* tf.log(tf.clip_by_value(tf.reshape(self.softmax_list_reshape,[-1,self.num_emb]),1e-20,1.0)),1) * tf.reshape(self.rewards,[-1]))build_sample_network定义了我们Generator采样得到生成序列过程的网络结构与前两个网络参数是共享的。 那么这三个网络是如何使用的呢pretrain_network就是用来预训练我们的Generator的这个没有异议。然后在对抗时的每一个epoch首先用sample_network得到一堆采样的序列samples然后对采样序列的对每一个时点使用roll-out-policy结合Discriminator得到reward值。最后把这些samples和reward值喂给adversarial_network进行参数更新。 3.4 discriminator discriminator的文件结构如下 前面的linear和highway函数实现了highway network。 在Discriminator类中我们采用CNN建立了Discriminator的网络结构值得注意的是我们这里采用的损失函数加入了正则项 with tf.name_scope(output):W tf.Variable(tf.truncated_normal([num_filters_total,self.num_classes],stddev 0.1),nameW)b tf.Variable(tf.constant(0.1,shape[self.num_classes]),nameb)self.l2_loss tf.nn.l2_loss(W)self.l2_loss tf.nn.l2_loss(b)self.scores tf.nn.xw_plus_b(self.h_drop,W,b,namescores) # batch * num_classesself.ypred_for_auc tf.nn.softmax(self.scores)self.predictions tf.argmax(self.scores,1,namepredictions)with tf.name_scope(“loss”): losses tf.nn.softmax_cross_entropy_with_logits(logitsself.scores,labelsself.input_y) # 损失函数中加入了正则项 self.loss tf.reduce_mean(losses) self.l2_reg_lambda self.l2_loss 3.5 rollout 这个文件实现的通过rollout-policy得到一堆完整序列的过程前面我们提到过了rollout-policy实现需要一个神经网络而我们这里用Generator当作这个神经网络所以它与前面提到的三个Generator的网络的参数也是共享的。 另外需要注意的是我们这里要得到每个序列每个时点的采样数据因此需要进行两层循环 假设我们传过来的序列长度是20最后一个不需要进行采样因为已经是完整的序列了。假设当前的step是5那么0-4是不需要采样的但我们需要把0-4位置的序列输入到网络中得到state。得到state之后我们再经过一层循环得到5-19位的采样序列然后将0-4位置的序列的和5-19位置的序列的进行拼接。 sample_rollout tf.concat([sample_rollout_left,sample_rollout_right],axis1)3.6 utils utils中定义了两个函数 generate_samples函数用于调用Generator中的sample_network产生sample或者用于调用target-lstm中的sample_network产生real-world数据 target_loss函数用于计算Generator和oracle model的相似性。 3.7 train 终于改介绍我们的主要流程控制代码了先深呼吸一口准备开始 定义dataloader以及网络 首先我们获取了configuration中定义的参数然后基于这些参数我们得到了三个dataloader。 随后我们定义了Generator和Discriminator以及通过读文件来创建了我们的oracle model在代码中叫target_lstm。 config_train training_config() config_gen generator_config() config_dis discriminator_config()np.random.seed(config_train.seed) assert config_train.start_token 0 gen_data_loader Gen_Data_loader(config_gen.gen_batch_size) likelihood_data_loader Gen_Data_loader(config_gen.gen_batch_size) dis_data_loader Dis_dataloader(config_dis.dis_batch_size) generator Generator(configconfig_gen) generator.build() rollout_gen rollout(configconfig_gen) #Build target LSTM target_params pickle.load(open(‘save/target_params.pkl’,‘rb’),encoding‘iso-8859-1’) target_lstm TARGET_LSTM(configconfig_gen, paramstarget_params) # The oracle model # Build discriminator discriminator Discriminator(configconfig_dis) discriminator.build_discriminator() 预训练Generator 我们首先定义了预训练过程中Generator的优化器即通过AdamOptimizer来最小化交叉熵损失随后我们通过target-lstm网络来产生Generator的训练数据利用dataloader来读取每一个batch的数据。 同时每隔一定的步数我们会计算Generator与target-lstm的相似性(likelihood) # Build optimizer op for pretraining pretrained_optimizer tf.train.AdamOptimizer(config_train.gen_learning_rate) var_pretrained [v for v in tf.trainable_variables() if teller in v.name] gradients, variables zip(*pretrained_optimizer.compute_gradients(generator.pretrained_loss, var_listvar_pretrained)) gradients, _ tf.clip_by_global_norm(gradients, config_train.grad_clip) gen_pre_update pretrained_optimizer.apply_gradients(zip(gradients, variables))sess tf.Session() sess.run(tf.global_variables_initializer()) generate_samples(sess,target_lstm,config_train.batch_size,config_train.generated_num,config_train.positive_file) gen_data_loader.create_batches(config_train.positive_file) log open(‘save/experiment-log.txt’,‘w’) print(‘Start pre-training generator…’) log.write(‘pre-training…\n’) for epoch in range(config_train.pretrained_epoch_num): gen_data_loader.reset_pointer() for it in range(gen_data_loader.num_batch): batch gen_data_loader.next_batch() _,g_loss sess.run([gen_pre_update,generator.pretrained_loss],feed_dict{generator.input_seqs_pre:batch, generator.input_seqs_mask:np.ones_like(batch)}) span classhljs-keywordif/span epoch % config_train.test_per_epoch 0:span classhljs-comment#进行测试通过Generator产生一批序列/spangenerate_samples(sess,generator,config_train.batch_size,config_train.generated_num,config_train.eval_file)span classhljs-comment# 创建这批序列的data-loader/spanlikelihood_data_loader.create_batches(config_train.eval_file)span classhljs-comment# 使用oracle 计算 交叉熵损失nll/spantest_loss target_loss(sess,target_lstm,likelihood_data_loader)span classhljs-comment# 打印并写入日志/spanspan classhljs-built_inprint/span(span classhljs-stringpre-train /span,epoch, span classhljs-string test_loss /span,test_loss)buffer span classhljs-stringepoch:\t/span str(epoch) span classhljs-string\tnll:\t/span str(test_loss) span classhljs-string\n/spanlog.write(buffer)预训练Discriminator 预训练好Generator之后我们就可以通过Generator得到一批负样本并结合target-lstm产生的正样本来预训练我们的Discriminator。 print(Start pre-training discriminator...) for t in range(config_train.dis_update_time_pre):print(Times: str(t))generate_samples(sess,generator,config_train.batch_size,config_train.generated_num,config_train.negative_file)dis_data_loader.load_train_data(config_train.positive_file,config_train.negative_file)for _ in range(config_train.dis_update_time_pre):dis_data_loader.reset_pointer()for it in range(dis_data_loader.num_batch):x_batch,y_batch dis_data_loader.next_batch()feed_dict {discriminator.input_x : x_batch,discriminator.input_y : y_batch,discriminator.dropout_keep_prob : config_dis.dis_dropout_keep_prob}_ sess.run(discriminator.train_op,feed_dict)定义对抗过程中Generator的优化器 这里定义的对抗过程中Generator的优化器即最小化我们前面提到的policy gradient损失再回顾一遍 self.pgen_loss_adv - tf.reduce_sum(tf.reduce_sum(tf.one_hot(tf.to_int32(tf.reshape(self.input_seqs_adv,[-1])),self.num_emb,on_value1.0,off_value0.0)* tf.log(tf.clip_by_value(tf.reshape(self.softmax_list_reshape,[-1,self.num_emb]),1e-20,1.0)),1) * tf.reshape(self.rewards,[-1]))# Build optimizer op for adversarial training train_adv_opt tf.train.AdamOptimizer(config_train.gen_learning_rate) gradients, variables zip(*train_adv_opt.compute_gradients(generator.gen_loss_adv, var_listvar_pretrained)) gradients, _ tf.clip_by_global_norm(gradients, config_train.grad_clip) train_adv_update train_adv_opt.apply_gradients(zip(gradients, variables))# Initialize global variables of optimizer for adversarial training uninitialized_var [e for e in tf.global_variables() if e not in tf.trainable_variables()] init_vars_uninit_op tf.variables_initializer(uninitialized_var) sess.run(init_vars_uninit_op) 对抗过程中训练Generator 对抗过程中训练Generator我们首先需要通过Generator得到一批序列sample然后使用roll-out结合Dsicriminator得到每个序列中每个时点的reward再将reward和sample喂给adversarial_network进行参数更新。 # Start adversarial training for total_batch in range(config_train.total_batch):for iter_gen in range(config_train.gen_update_time):samples sess.run(generator.sample_word_list_reshpae)feed {span classhljs-stringpred_seq_rollout:0/spanspan classhljs-symbol:samples/span}reward_rollout []span classhljs-keywordfor/span iter_roll span classhljs-keywordin/span range(config_train.rollout_num):rollout_list sess.run(rollout_gen.sample_rollout_step,feed_dictfeed)span classhljs-comment# np.vstack 它是垂直按照行顺序的把数组给堆叠起来。/spanrollout_list_stack np.vstack(rollout_list)reward_rollout_seq sess.run(discriminator.ypred_for_auc,feed_dict{discriminator.span classhljs-symbolinput_x:/spanrollout_list_stack,discriminator.span classhljs-symboldropout_keep_prob:/spanspan classhljs-number1.0/span})reward_last_tok sess.run(discriminator.ypred_for_auc,feed_dict{discriminator.span classhljs-symbolinput_x:/spansamples,discriminator.span classhljs-symboldropout_keep_prob:/spanspan classhljs-number1.0/span})reward_allseq np.concatenate((reward_rollout_seq,reward_last_tok),axisspan classhljs-number0/span)[span classhljs-symbol:/span,span classhljs-number1/span]reward_tmp []span classhljs-keywordfor/span r span classhljs-keywordin/span range(config_gen.gen_batch_size):reward_tmp.append(reward_allseq[range(r,config_gen.gen_batch_size * config_gen.sequence_length,config_gen.gen_batch_size)])reward_rollout.append(np.array(reward_tmp))rewards np.sum(reward_rollout,axis span classhljs-number0/span) / config_train.rollout_numspan classhljs-number_/span,gen_loss sess.run([train_adv_update,generator.gen_loss_adv],feed_dict{generator.span classhljs-symbolinput_seqs_adv:/spansamples,generator.span classhljs-symbolrewards:/spanrewards})对抗过程中训练Discriminator 对抗过程中Discriminator的训练和预训练过程一样这里就不再赘述。 for _ in range(config_train.dis_update_time_adv):generate_samples(sess,generator,config_train.batch_size,config_train.generated_num,config_train.negative_file)dis_data_loader.load_train_data(config_train.positive_file,config_train.negative_file) span classhljs-keywordfor/span _ span classhljs-keywordin/span range(config_train.dis_update_time_adv):dis_data_loader.reset_pointer()span classhljs-keywordfor/span it span classhljs-keywordin/span range(dis_data_loader.num_batch):x_batch,y_batch dis_data_loader.next_batch()feed {discriminator.input_x:x_batch,discriminator.input_y:y_batch,discriminator.dropout_keep_prob:config_dis.dis_dropout_keep_prob}_ sess.run(discriminator.train_op,feed)3.8 训练效果 来一发训练效果截图 可以看到我们的Generator越来越接近oracle model啦哈哈哈 参考文献 1、https://blog.csdn.net/liuyuemaicha/article/details/70161273 2、https://blog.csdn.net/yinruiyang94/article/details/77675586 3、https://www.jianshu.com/p/32e164883eab 4、https://blog.csdn.net/l494926429/article/details/51737883
http://www.pierceye.com/news/239628/

相关文章:

  • 仿制网站建设写网站建设的软文
  • 0基础网站建设教程wordpress去掉rss订阅
  • 爱网站查询外贸推广具体是做什么
  • 商务网站价格找人做效果图那个网站
  • 上传到网站租一个服务器要多少钱
  • 网站制作服务合同安徽建设工程信息网文件
  • 成都企业网站建设公司正规的跨境电商平台有哪些
  • 中山工程建设信息网站网站监控系统
  • 个人网站想添加支付功能怎么做北京二次感染最新消息
  • 上海注册汽车租赁公司网站模板对seo的影响
  • 上海松江做网站公司wordpress 网站暂停
  • 太仓苏州网站建设网站的规划与建设课程设计
  • 遵义住房城乡建设厅网站电子商务网店毕业设计
  • 惠州市博罗县建设局网站防静电产品东莞网站建设技术支持
  • 茂名整站优化百度一下 你知道首页
  • 郑州网站微信微博维护品牌网站建设流程图
  • 网站建站销售怎么做做门窗安装去哪些网站找生意
  • 太原建站司点击查看荆州网站开发
  • 个人音乐网站开发宁波网站推广工作室电话
  • 建设部网站 造价工程师wordpress忘了秘密
  • 如何分析一个网站建设策划案湖南网络推广公司大全
  • 惠州市建设工程交易中心网站如何制作网页导航栏
  • 保山网站建设哪家好做led视频好的网站
  • 如何利用网站策划做好网站建设申请域名要多少钱
  • 专业做公司logo的网站谷歌网站推广方案
  • 公司网站建设情况说明网站开发用php好吗
  • 网站做关键词库的作用空间怎么做网站
  • 制作网站公司名称网络营销与策划实践报告
  • 哈尔滨手机网站建设价格低长沙网业公司
  • 如皋网站建设公司网站推广优化排名