本文主要是介绍transformer之预训练task小析(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
上接transformer预训练task之小析(四)
首先思考一个问题,怎么表示掌握了一门语言?
最好的方式可能体现在遣词造句上吧,比如饱受诟病的八股文上有很多的旷世奇作[1],比如很多读起来朗朗上口的👇
天对地,雨对风。大陆对长空。山花对海树,赤日对苍穹。雷隐隐,雾蒙蒙。日下对天中。风高秋月白,雨霁晚霞红。牛女二星河左右,参商两曜斗西东。十月塞边,飒飒寒霜惊戍旅;三冬江上,漫漫朔雪冷渔翁。河对汉,绿对红。雨伯对雷公。烟楼对雪洞,月殿对天宫。云叆叇,日曈朦。腊屐对渔蓬。过天星似箭,吐魄月如弓。驿旅客逢梅子雨,池亭人挹藕花风。茅店村前,皓月坠林鸡唱韵;板桥路上,青霜锁道马行踪。山对海,华对嵩。四岳对三公。宫花对禁柳,塞雁对江龙。清暑殿,广寒宫。拾翠对题红。庄周梦化蝶,吕望兆飞熊。北牖当风停夏扇,南檐曝日省冬烘。鹤舞楼头,玉笛弄残仙子月;凤翔台上,紫箫吹断美人风。
我们的语言教育也正是从遣词造句开始的,组词的基本训练,完形填空,各种题目衡量的对于语言的深层语义的理解,而这不正是MLM体现的东西嘛,其他预训练任务也可以找到类似的对照
而在更早期的训练形式更贴近于多模态,尚在牙牙学语不会写字的时候就通过看图说话,看图连线的方式来建立图像和声音,图像和文字的联系了。所以,不负责任地说,灵长类高级是不是就在于天然具有可以处理多模态信息的复杂构造啊。
回到多模态预训练的主题,图像和文本联合起来的关键在于把二者投影到同一个表征空间,在这个表征空间里,两者的信息可以互相补充,验证,就可以达到我们想在多模态上做的事情了。在预训练任务上采用的预训练任务有:
MVLM
Masked Visual-Language Model,正是从MLM延伸而来。做法上会mask文本的部分token,通过使用图像和未mask的文本来对mask掉的文本内容进行预测,图像会提供mask掉token的位置信息,以及整个文本的布局信息。
MDC
Multi-label Document Classication,通过对图像tag分类来实现统一,比如给一张图像,会将图像中文本内容的要点作为tag。
Text-image alignment strategy
图文对齐,在图像上遮挡text部分,通过文本内容预测图像是否遮挡
Text-image matching strategy
图文相关,这个比较好理解,判断图文内容是否相关
任务明确以后,来到结构部分。一图以蔽之,整个结构还是非常明了的,在预处理阶段,对图文分别进行编码,统一编号后送入transformer模型,在模型输出上执行各种任务
上code
# 模型部分,分别计算图,文embedding,联合作为transformer输入,得到outingdef forward(self,input_ids=None,bbox=None,image=None,attention_mask=None,token_type_ids=None,position_ids=None,head_mask=None,inputs_embeds=None,encoder_hidden_states=None,encoder_attention_mask=None,output_attentions=None,output_hidden_states=None,return_dict=None,):output_attentions = output_attentions if output_attentions is not None else self.config.output_attentionsoutput_hidden_states = (output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states)text_layout_emb = self._calc_text_embeddings(input_ids=input_ids,bbox=bbox,token_type_ids=token_type_ids,position_ids=position_ids,)
visual_emb = self._calc_img_embeddings(image=image,bbox=visual_bbox,position_ids=visual_position_ids,)final_emb = torch.cat([text_layout_emb, visual_emb], dim=1)
extended_attention_mask = final_attention_mask.unsqueeze(1).unsqueeze(2)
extended_attention_mask = extended_attention_mask.to(dtype=self.dtype)extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0
if head_mask is not None:if head_mask.dim() == 1:head_mask = head_mask.unsqueeze(0).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)head_mask = head_mask.expand(self.config.num_hidden_layers, -1, -1, -1, -1)elif head_mask.dim() == 2:head_mask = head_mask.unsqueeze(1).unsqueeze(-1).unsqueeze(-1)head_mask = head_mask.to(dtype=next(self.parameters()).dtype)else:head_mask = [None] * self.config.num_hidden_layers
encoder_outputs = self.encoder(final_emb,extended_attention_mask,bbox=final_bbox,position_ids=final_position_ids,head_mask=head_mask,output_attentions=output_attentions,output_hidden_states=output_hidden_states,return_dict=return_dict,)sequence_output = encoder_outputs[0]pooled_output = self.pooler(sequence_output)
if not return_dict:return (sequence_output, pooled_output) + encoder_outputs[1:]
return BaseModelOutputWithPoolingAndCrossAttentions(last_hidden_state=sequence_output,pooler_output=pooled_output,hidden_states=encoder_outputs.hidden_states,attentions=encoder_outputs.attentions,cross_attentions=encoder_outputs.cross_attentions,)
需要说明的是,本文提到的预训练任务处理的都是Visual rich document,偏向于文档领域。但在多模态处理上,指导思想是不变的,绕不开对图文同一表征空间的映射,在结构上就表现为双塔结构(如代码中的_calc_text_embeddings, _calc_image_embeddings)。从双塔结构出发,结合大规模未标注语料,又来到了全新的对比学习(contrastive learning)的领域:广阔天地,大有可为有木有
1、https://www.zhihu.com/question/55762656?from=timeline
2、https://github.com/microsoft/unilm/tree/master/layoutlm
3、https://arxiv.org/abs/1912.13318
4、https://arxiv.org/abs/2012.14740
5、https://arxiv.org/abs/2104.08836
6、https://github.com/microsoft/unilm
7、https://www.microsoft.com/en-us/research/project/document-ai/
8、https://zhuanlan.zhihu.com/p/370782081
这篇关于transformer之预训练task小析(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!