机器翻译

1 模型

1.1

模型
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

1.2 RNN+Beam search+Attention

在这里插入图片描述
损失函数:交叉熵
预测:不使用解码器而是beam search

#paddlepaddle
from __future__ import print_function
import os
import six
import numpy as np
import paddle
import paddle.fluid as fluid
import paddle.fluid.layers as layers
config={'dict_size':30000,'bos_id':0,'eos_id':1,'word_dim':512,'hidden_dim':512,'max_length':256,'beam_size':4,'batch_size':64,'Cell':'GRU','seed':1666,'model_save_dir':'infer_model'
}
config['source_dict_size']=config['target_dict_size']=config['dict_size']
config['decoder_size']=config['hidden_dim']
def write_item(id,s):v=[str(id)]+[str(x) for x in config.values()]s='| '+str(id)+' | '.join(v)+s+' |\n'with open('./work/log/log.txt','a',encoding='utf-8') as f:f.write(s)def data_func(is_train=True):#源语言数据src=fluid.data(name='src',shape=[None,None],dtype='int64')src_sequence_length=fluid.data(name='src_sequence_length',shape=[None],dtype="int64")inputs=[src,src_sequence_length]if is_train:# 目标语言数据trg= fluid.data(name='trg', shape=[None, None], dtype='int64')trg_sequence_length = fluid.data(name='trg_sequence_length', shape=[None], dtype="int64")label=fluid.data(name='label',shape=[None,None],dtype="int64")inputs += [trg, trg_sequence_length,label]#data loaderloader=fluid.io.DataLoader.from_generator(feed_list=inputs,capacity=10,iterable=True,use_double_buffer=True)#capacity是队列的数目,单位batchreturn inputs, loaderdef encoder(src_embedding,src_sequence_length):#前向if config['Cell']=='GRU':Cell=layers.GRUCellelse:Cell=layers.LSTMCellencoder_fwd_cell=Cell(hidden_size=config['hidden_dim'],param_attr=fluid.ParamAttr(initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])),bias_attr=fluid.ParamAttr(initializer=fluid.initializer.Constant(0.)))encoder_fwd_output,fwd_state=layers.rnn(cell=encoder_fwd_cell,inputs=src_embedding,sequence_length=src_sequence_length,time_major=False,#[batch_size,sequence_length,...]is_reverse=False)encoder_bwd_cell = Cell(hidden_size=config['hidden_dim'],param_attr=fluid.ParamAttr(initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])),bias_attr=fluid.ParamAttr(initializer=fluid.initializer.Constant(0.)))encoder_bwd_output, bwd_state = layers.rnn(cell=encoder_bwd_cell,inputs=src_embedding,sequence_length=src_sequence_length,time_major=False,  # [batch_size,sequence_length,...]is_reverse=True)#拼接得到hencoder_output=layers.concat(input=[encoder_fwd_output,encoder_bwd_output],axis=2)encoder_state=layers.concat(input=[fwd_state,bwd_state],axis=1)"""rnn的输出:[batch_size,sequence_length,...] (time_major == False时)或[sequence_length,batch_size,...] (time_major == True时)。final_states是最后一步的状态,因此具有和initial_states相同的结构,形状和数据类型。"""return encoder_output,encoder_stateclass DecoderCell(layers.RNNCell):def __init__(self,hidden_size):self.hidden_size=hidden_sizeif config['Cell'] == 'GRU':Cell = layers.GRUCellelse:Cell = layers.LSTMCellself.cell = Cell(hidden_size=self.hidden_size,param_attr=fluid.ParamAttr(initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])),bias_attr=fluid.ParamAttr(initializer=fluid.initializer.Constant(0.)))def attention(self,hidden,encoder_output,encoder_output_proj,encoder_padding_mask):#attention计算context:c_i,Bahdanau attentiondecoder_state_proj=layers.unsqueeze(layers.fc(hidden,size=self.hidden_size,param_attr=fluid.ParamAttr(initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])),bias_attr=False),[1])mixed_state=fluid.layers.elementwise_add(encoder_output_proj,layers.expand(decoder_state_proj,[1,layers.shape(decoder_state_proj)[1],1]))attn_scores=layers.squeeze(layers.fc(input=mixed_state,size=1,num_flatten_dims=2,param_attr=fluid.ParamAttr(initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])),bias_attr=False),[2])if encoder_padding_mask is not None:attn_scores=layers.elementwise_add(attn_scores,encoder_padding_mask)attn_scores=layers.softmax(attn_scores)context=layers.reduce_sum(layers.elementwise_mul(encoder_output,attn_scores,axis=0),dim=1)return contextdef call(self,step_input,hidden,encoder_output,encoder_output_proj,encoder_padding_mask=None):#Bahdanau attentioncontext=self.attention(hidden,encoder_output,encoder_output_proj,encoder_padding_mask)step_input=layers.concat([step_input,context],axis=1)#RNNoutput,new_hidden=self.cell(step_input,hidden)return output,new_hiddendef decoder(encoder_output,encoder_output_proj,encoder_state,encoder_padding_mask,trg=None,is_train=True):#定义RNN所需要的组件print(config['decoder_size'])decoder_cell=DecoderCell(hidden_size=config['decoder_size'])decoder_initial_states=layers.fc(encoder_state,size=config['decoder_size'],act='tanh',param_attr=fluid.ParamAttr(initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])),)trg_embeder=lambda x:fluid.embedding(input=x,size=[config['target_dict_size'],config['hidden_dim']],dtype='float32',param_attr=fluid.ParamAttr(name="trg_emb_table",initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])))output_layer=lambda x:layers.fc(x,size=config['target_dict_size'],num_flatten_dims=len(x.shape)-1,param_attr=fluid.ParamAttr(name="output_w",initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])))if is_train:#训练时,输入翻译后的结果#执行cell.calldecoder_output,_=layers.rnn(cell=decoder_cell,inputs=trg_embeder(trg),initial_states=decoder_initial_states,time_major=False,encoder_output=encoder_output,encoder_output_proj=encoder_output_proj,encoder_padding_mask=encoder_padding_mask)decoder_output=output_layer(decoder_output)else:#基于 beam search的预测生成## beam search 时需要将用到的形为 `[batch_size, ...]` 的张量扩展为 `[batch_size* beam_size, ...]`encoder_output=layers.BeamSearchDecoder.tile_beam_merge_with_batch(encoder_output,config['beam_size'])encoder_output_proj=layers.BeamSearchDecoder.tile_beam_merge_with_batch(encoder_output_proj,config['beam_size'])encoder_padding_mask=layers.BeamSearchDecoder.tile_beam_merge_with_batch(encoder_padding_mask.config['beam_size'])#BeamSearchDecoder单步解码:‘cell.call+beamsearchstepbeam_search_decoder=layers.BeamSearchDecoder(cell=decoder_cell,start_token=config['bos_id'],end_token=config['eos_id'],beam_size=config['beam_size'],embedding_fn=trg_embeder,output_fn=output_layer)#使用layers.dynamic_decoder动态解码#重复执行decoder.step()知道返回的表示完成状态的张亮中的值全部为True或达到max_step_numdecoder_output,_=layers.dynamic_decoder(decoder=beam_search_decoder,inits=decoder_initial_states,max_step_num=config['max_length'],output_time_major=False,encoder_output=encoder_output,encoder_output_proj=encoder_output_proj,encoder_padding_mask=encoder_padding_mask)return decoder_outputdef model_func(inputs,is_train=True):#源语言输入src=inputs[0]src_sequence_length=inputs[1]src_embeder=lambda x:fluid.embedding(input=x,size=[config['source_dict_size'],config['hidden_dim']],dtype='float32',param_attr = fluid.ParamAttr(name="src_emb_table",initializer=fluid.initializer.TruncatedNormal(scale=0.02, seed=config['seed'])))src_embedding=src_embeder(src)#编码器encoder_output,encoder_state=encoder(src_embedding,src_sequence_length)encoder_output_proj=layers.fc(input=encoder_output,size=config['decoder_size'],num_flatten_dims=2,bias_attr=False)src_mask=layers.sequence_mask(src_sequence_length,maxlen=layers.shape(src)[1],dtype='float32')encoder_padding_mask=(src_mask-1.0)*1e9#目标语言输入,训练时有,预测则无trg=inputs[2] if is_train else None#解码器output=decoder(encoder_output=encoder_output,encoder_output_proj=encoder_output_proj,encoder_state=encoder_state,encoder_padding_mask=encoder_padding_mask,trg=trg,is_train=is_train)return outputdef loss_func(logits,label,trg_sequence_length):probs=layers.softmax(logits)#交叉熵loss=layers.cross_entropy(input=probs,label=label)#生成掩码,以此提出padding部分计算损失trg_mask=layers.sequence_mask(trg_sequence_length,maxlen=layers.shape(logits)[1],dtype='float32')avg_cost=layers.reduce_sum(loss*trg_mask)/layers.reduce_sum(trg_mask)return avg_cost,probsdef optimizer_func():#梯度裁剪fluid.clip.set_gradient_clip(clip=fluid.clip.GradientClipByGlobalNorm(clip_norm=5.0))#先增后降低的学习率策略lr_decay=fluid.layers.learning_rate_scheduler.noam_decay(config['hidden_dim'],1000)return fluid.optimizer.Adam(learning_rate=lr_decay,regularization=fluid.regularizer.L2DecayRegularizer(regularization_coeff=1e-4))def inputs_generator(batch_size,pad_id,is_train=True):data_generator=fluid.io.shuffle(paddle.dataset.wmt16.train(config['source_dict_size'],config['target_dict_size']),buf_size=10000 if is_train elsepaddle.dataset.wmt16.test(config['source_dict_size'],config['target_dict_size']))batch_generator=fluid.io.batch(data_generator,batch_size)#paddingdef _pad_batch_data(insts,pad_id):seq_length=np.array(list(map(len,insts)),dtype='int64')max_len=max(seq_length)pad_data=np.array([inst+[pad_id]*(max_len-len(inst)) for inst in insts],dtype='int64')return pad_data,seq_lengthdef _generator():for batch in batch_generator():batch_src=[ins[0] for ins in batch]src_data,src_length=_pad_batch_data(batch_src,pad_id)inputs=[src_data,src_length]if is_train:batch_trg=[ins[1] for ins in batch]trg_data,trg_length=_pad_batch_data(batch_trg,pad_id)batch_lbl=[ins[2] for ins in batch]lbl_data,_=_pad_batch_data(batch_lbl,pad_id)inputs+=[trg_data,trg_length,lbl_data]yield inputsreturn _generatortrain_prog=fluid.Program()
startup_prog=fluid.Program()
with fluid.program_guard(train_prog,startup_prog):with fluid.unique_name.guard():#训练# inputs=[src,src_length,trg,trg_length,label]inputs,loader=data_func(is_train=True)logits=model_func(inputs,is_train=True)loss,probs=loss_func(logits,inputs[-1],inputs[-2])optimizer=optimizer_func()optimizer.minimize(loss)
# 设置训练设备
use_cuda=False
places=fluid.cuda_places() if use_cuda  else fluid.cpu_places()
loader.set_batch_generator(inputs_generator(config['batch_size'],config['eos_id'],is_train=True),places=places)
exe=fluid.Executor(places[0])
exe.run(startup_prog)
prog=fluid.CompiledProgram(train_prog).with_data_parallel(loss_name=loss.name)EPOCH_NUM=100
for pass_id in six.moves.xrange(EPOCH_NUM):batch_id=0for data in loader():# print(data[0]['label'])loss_val=exe.run(prog,feed=data,fetch_list=[loss])[0]# print(loss_val)loss_val=np.mean(np.array(loss_val))print('pass_id: {}, batch_id: {}, loss: {}'.format(pass_id, batch_id, loss_val))batch_id += 1# 保存模型fluid.io.save_params(exe, config['model_save_dir'], main_program=train_prog)

2 数据集

数据集
OpenSubtitles2016

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

姚能伟:以邻盛智能为例,如何在行业大脑进行创新实践

报告内容摘要随着技术发展,未来一定是智慧的时代。为此我们提除了感知世界,透视数据,洞察未知为理念的新型技术探索与实践。依托多年项目经验与行业专业积累,形成了一些行业深度的解决方案。在实践过程中形成了客观世界的泛感知和…

Science:已“死亡”的细菌仍能感知来自环境的信息

根据信号强度对细菌孢子进行颜色编码的显微镜图像:颜色越亮,信号越强细菌依靠其顽强的生命力,在包括人类在内的各种生命体和地球的各个角落繁衍生息。细菌之所以难以被杀死,是因为它们具有独特的生存策略,其中一种是在…

Berttransformer

1.transformer transformer self-attention 当前编码的词和整个句子所有词做attention,权重加在所有句子上获得当前的表示 encoder-decoder-attention 当前解码的单元和编码器的所有输出做attention,权重加在所有编码输出上,获得当前的表示…

GPT1-3(GPT3/few-shot,无需finetune)

GPT1–finetune 12层单向transformer预训练精调被bert比下去了 GPT2-元学习 输入:加上任务描述 “英翻法:This is life” 输出: “C’est la vie” 参数15亿在NLU:比不上bert也比不过其他大参数模型:如Turing-NLG GPT3-Langua…

一种基于人工智能的化学合成机器人,用于纳米材料的探索和优化

编辑 | 萝卜皮格拉斯哥大学(University of Glasgow)的研究人员提出了一种自主化学合成机器人,用于探索、发现和优化由实时光谱反馈、理论和机器学习算法驱动的纳米结构,这些算法控制反应条件并允许选择性地模板化反应。这种方法允…

千脑智能理论:开启创造机器智能的路线图 | 《千脑智能》

导语当人们谈论人工智能时,往往热衷于算法优化、模型迭代、算力提升,海量参数的复杂网络仿佛就是人工智能的发展方向。然而,这就是真正的智能吗?计算机科学家与神经科学家杰夫霍金斯在《千脑智能》中提出了一种关于大脑和智能的理…

一类机械神经网络的架构材料,未来智能技术的全新畅想

编辑 | 萝卜皮除了一些活组织之外,很少有材料能够在长时间暴露于意料之外的环境负载情况下自主学习表现出所需的行为。在不断变化的条件下(例如,内部损坏程度的上升、不同的夹具场景和波动的外部负载),仍然有更少的材料…

自然语言处理的未来之路(周明老师,CCF-GRIR,笔记)

文章目录1.什么叫自然语言处理1.1 困难1.2历史1.3 智能1.4 经典nlp任务的进展02.技术体系2.1 词2.2 句子03 未来发展3.1 资源丰富的任务---中英翻译3.2 资源少的任务3.3 多轮问题--多轮对话4 未来之路自然语言:规则—>统计—>神经网络现在:黄金时代…

从英国首位印裔首相,看印度IC产业

来源:芯师爷当地时间10月24日,英国前财政大臣苏纳克在保守党党首竞选中胜出,将成为英国新一任首相。这也意味着他将成为英国历史上第一位印度裔首相。图源:环球网一时间,关于“首位印度裔首相,苏纳克成功逆…

CASREL:A Novel Cascade Binary Tagging Framework for Relational Triple Extraction(关系抽取,ACL2020,重叠关系)

文章目录1.介绍2.相关工作3.The CASREL Framework3.1 Bert3.2 cascade decoder4.实验5.结果参考1.介绍 做重叠关系的少 重叠关系: Zeng et al. (2018) :seq2seq强化学习改善提取顺序Fu et al. (2019):(GraphRel)GCNs将文本建模为关系图 以前…

机器学习数学本质的理解

来源:计算机视觉与机器学习近日,国际数学家大会丨鄂维南院士作一小时大会报告:从数学角度,理解机器学习的“黑魔法”,并应用于更广泛的科学问题。鄂维南院士在2022年的国际数学家大会上作一小时大会报告(plenary talk)…

Exploiting the Syntax-Model Consistency for Neural Relation Extraction(关系抽取,语法模型,跨领域关系抽取

文章目录1.Introductiony1.1 神经网络的关系抽取1.2使用依赖树的关系抽取1.2.2 依赖树的一般树1.3 本文做法2. 相关工作2.1核方法2.2 深度学习方法2.2.1 CNN2.2.2 RNN2.2.3 transformer2.2.4 依赖树3.模型3.1CEON-LSTM3.1.1 LSTM3.1.2ON-LSTM3.1.2.1 公式3.1.2.2the master gat…

从500亿缩水到167亿!自动驾驶芯片第一股“流血上市”

来源:数据观综合编辑:蒲蒲美股年内最后一次大规模IPO,MobilEye首日大涨近40%。美国时间10月26日,英特尔旗下自动驾驶子公司 Mobileye 正式登陆纳斯达克,股票代码为“MBLY”,首日上涨37.95%,报收…

[ACL2020]Generalizing Natural Language Analysis through Span-relation Representations

文章目录1 介绍2 span-relation representations2.1未涉及句子级任务3.span-relation model3.1 span representation3.2 span and relation label prediction3.3 应用到不同任务3.5 多任务学习MTL4 GLAD Benchmark基准 and Results4.1 实验4.2 证明通用模型有效4.3 MTL4.3.2 任…

为什么生成式AI这么火?OpenAI刚刚被曝估值已接近200亿美金

“生成式 AI 提醒我们,很难做出有关于人工智能的预测。十年前,传统观点认为:人工智能首先会影响体力劳动;然后,是认知劳动;然后,也许有一天它可以做创造性工作。现在看起来,它会以相…

报告预告:北斗网格码国家标准与城市大脑网格底座探讨

来源:中国指挥与控制学会中国指挥与控制学会“百名专家、百场讲座”第十七讲——城市大脑系列学术报告(第八期)主办单位:中国指挥与控制学会承办单位:中国指挥与控制学会城市大脑专业委员会远望智库报告人:…

{ACL2020}In Layman’s Terms: Semi-Open Relation Extraction from Scientific Texts(关系抽取,半开放关系抽取)

半开放关系抽取 用FOBIE训练一个narrow IE训练一个OpenIE用narrowIE矫正OpenIE 1.Introduction 标注困难、 跨领域标注更难 TRADE-OFF relations 随着干燥度的增加,木质部的安全性增加和效率降低的广泛模式是明显的,有一些证据表明在针叶树种或个体之…

马斯克成功收购推特,开除CEO等多名高管,还派特斯拉工程师进驻总部审查代码...

来源:AI前线作者:刘燕这场连环反转“大戏”,终于落幕。靴子终于落地10 月 28 日,据 《纽约时报》、CNBC 、《 华尔街日报》、《华盛顿邮报》 等多家外媒报道,马斯克收购推特的交易已经完成。这笔 440 亿美元的收购案终…

【ACL2020】Reasoning with Latent Structure Refinement for Document-Level Relation Extraction

1. 问题 句间关系 很多约等于文档级关系抽取 文档级关系抽取 句子间关系多 生物医药领域尤其多 需求/困难 整合同一文档不同句子间的信息处理句间实体复杂的交互 2.相关工作 文档级别关系抽取 结论: 实体mention之间的交互促进推理过程(文档级关系抽…

孤独的宇宙中,人类是个例外吗?

© Movie Content Plus来源:人工智能学家利维坦按:爱因斯坦曾说,“宇宙的永恒之谜在于其可理解性,宇宙能被理解是个奇迹。”不过,就可理解性(comprehensibility)来说,该如何定义…