VisTransformer

Abstract

将图片切割为N个patch。

现有的自注意力在图片中的应用,一般是直接替换CNN中的部分,或者和CNN一起用,总之Transformer在图片上还是依赖卷积的,但实际上不需要依赖。

VisTransformer在大规模数据做训练,迁移到小数据集上时,效果会很好。

Introduction

现有的Bert就是在大规模数据做训练,迁移到小数据集上微调模型。由于Transformer的高效性和可扩展性,这样的方案随着数据增多性能还没有饱和(没有过拟合)。

Transformer用于视觉的难点:将2D图片变成1D的序列,如果直接将像素拉长,对于224x224的图片,拉长后变成224x224=50176,而Bert的序列只有512。

  1. 因此一般是将经过卷积或者ResNet后的特征图拉长;
  2. 也有的是将图片分为高度H和宽度W两个维度,分别做Transformer;
  3. 还有的是在一个局部窗口里拉长做自注意力。
  4. 由于没有优化,这些方案都无法用于大规模数据、模型。ViT则是划分patch,每一个patch当做一个单词

CNN具有归纳偏置的特点,比如桌子和椅子大概率是在一起的,再比如先平移再卷积和先做卷积再平移(同样的输入同样的卷积核)得到的特征是一样的,这个特点可以保证CNN有一定的先验信息,在相对少的数据上就有很好的效果。Transformer没有这样的归纳偏置的特点,因此在大规模数据集上的效果会比CNN更好。

第一步将图片打成patch(对224x224x3使用16x16的patch_size会得到14x14=196个patch,每个patch是16x16x3=768),变成一个序列,由于图片不能打乱顺序,但Transformer是会两两都做self-attention,因此加入了位置信息position embedding(作者发现对位置编码用1D编码即1.2.3和2D编码即11.12.13差不多),生成一个一个token。

在开始加入特征字符cls(形状为1x768,位置为0)是一个可学习的特征,最后可以作为Transformer的输出(图像的整体特征)。

第二步经过线性投射层(实际上是768x768的全连接层),上一步的输入为196x768,乘完全连接层的768x768的矩阵,得到196x768的矩阵,加上cls得到197x768。

第三步用cls经过MLP做分类任务

Bert

Deep Bidirectional 深的双向的Transformer

Deep:

Bert_BASE:Layer = 12, Hidden = 768, Head = 12, Total Parameters = 110M

Bert_LARGE:Layer = 24, Hidden = 1024, Head = 16, Total Parameters = 340M

Bert是只有编码器的Transformer,对比于Transformer: Layer = 6, Hidden = 2048, Head = 8,是个浅而宽,说明Bert这样深而窄的模型效果更好(和CV领域的总体结论基本一致)。

Bidirectional:

Bert直接引用了Transformer架构中的Encoder模块,并舍弃了Decoder模块, 这样便自动拥有了双向编码能力和强大的特征提取能力。

Abstract

设计训练深的双向的表示,使用无标号数据,联合左右上下文信息。训练好的Bert只要加一个额外输出层就可以用于其他NLP任务。相比GPT虽然使用了Transformer但只用了左边的单向信息,而ELMo是基于双向RNN的架构用于下游任务时需要调整。

Introduction

预训练赋能NLP有两类,一种是句子层面的任务,建模句子之间的关系或情绪识别,另一种是词层面的任务例如实体命名识别,需要输出词层面的的信息。

预训练一般有两种,一种是提取特征例如ELMo,另一种是将原模型少部分参数做微调例如GPT。这两种方法都是使用相同的目标函数,即单向的语言模型(给一个词预测下一个词),

GCN

A Gentle Introduction to Graph Neual Networks 综述

大部分数据类型都可以表示成图,但同样在图上做优化会很困难

行与列之间可以相互交换

顶点、边、全局三种图的属性分别做MLP

GCN用k层,每层看节点的一个邻居节点

可以加入attention,由于图中邻居节点可以随意打乱顺序,权重对于位置不敏感,而是取决于两个顶点向量之间的关系,而不是顶点的位置

在图上做卷积,相当于直接将图的邻接矩阵和另一个向量做乘法。

研究写作的艺术

研究、研究者和读者

研究是指收集信息回答一个疑问来解决一个问题。

给自己和读者都创建一个角色给作者和读者建立联系。

提出问题、解决问题

提出论点

阐述论点

Transformer

Abstract

主流的序列转录模型(给一句英文生成一句中文)依赖于复杂的循环或卷积NN,使用Encoder和Decoder。性能最好的模型都会在Encoder和Decoder之间用注意力机制,本文仅使用简单的注意力机制架构,而不是循环或卷积NN。

最初用于NLP,后面用于图像等,都很有效。

Introduction

输入、输出中结构化信息较多时,使用编解码器架构会比较有效。

RNN中对第t个词计算一个$h_t$和$h_{t-1}$决定,因此时序过程难以并行(GPU上性能会比较差),且对于长序列无法存储过多$h_t$,早期的信息在后期会丢掉。

Attention这个思想已经在编解码器架构中使用。

新提出的Transformer不再使用RNN而是纯基于注意力机制。

Background

这里说了一些和Transformer结构类似或思想相关的模型。

CNN只能看到比较小的矩阵,无法看到整个序列的信息,但优点是有多输出通道,Transformer用Multi-Head Attention多头注意力机制模拟多通道。

模型结构图如下:

image-20220704160110101

Model Architecture

编码器的输出是z向量,其中$Z_t$是第t个词的向量表示,编码器的输出作为解码器的输入,解码器的输出为$y_m$,即一个一个的生成,在得到y1后才能得到y2,因此是一个auto-regressive自回归模型,即输入就是输出。

把self-attention自注意力和point-wise堆叠起来重复N次。

  • 输入:对单词进行embedding

  • 编码器(图中左侧):用六个层堆叠起来的。每层里面有两个子层,第一个子层是多头注意力机制,第二个子层是MLP(图中的simple,position-wise fully connected feed-forward network),每个子层用一个残差连接,即LayerNorm(x+Sublayer(x))。每层输出维度都是512,方便进行残差连接,不同于CNN的设计。

  • 解码器(图中右侧):自回归,当前的输入是上一个时刻的输出。解码器同样是用六个层堆叠。每层里面三个子层,第一个是带masked的多头注意力机制,是由于注意力机制每次可以看到所有的输入,用掩码防止在预测第t时刻的输出时看不到t时刻之后的输入。

  • 输出:标准的神经网络输出,依次通过线性层和Softmax

Attention

注意力函数是将一个query和一些key-value对映射成输出的函数,这里的query、key、value、output都是向量。输出是value的加权和,每个value的权重是由value对应的key和query求相似度得到的。

Scaled Dot-Product Attention

缩放点积注意力机制最简单的一种Attention。

query和key的长度都是$d_k$,value长度为$d_v$。

  • 权重的计算:对query和key做内积,内积值越大相似度越高,越小则说明两个向量正交,即没有相似度。将得到的内积除以$\sqrt{d_k}$(防止数据过大或过小导致softmax的结果分散到两端,最终导致梯度较小),然后通过Softmax得到n个权重。实际运算中,Q为query的矩阵,K为key的矩阵

$$
Attention(Q,K,V)=softmax(\frac{QK^T}{ \sqrt{d_k}})V
$$

image-20220704173849211

  • mask:在计算第t时刻的输出时,不应该使用$K_t$以及之后的值,但在注意力机制中会计算出所有的K,所以需要将$K_t$以及之后的值换成非常大的负数(-1e10),这个负数在经过softmax的指数运算后会变成0。

多头注意力机制

先用线性层将query、key、value投影到低维度,然后做8次缩放点积注意力计算。这里多次投影、点积计算,类似于多输出通道。
$$
MultiHead(Q,K,V)=Concat(head_1,…,head_h)W^{Output}
$$

$$
head_i=Attention(QW_i^Q,KW_i^K,VW_i^V)
$$

TODO: 需要细读设计原因和投影

网络的输入输出(三个Attention的作用)

TODO:48min

前馈网络

结构:线性层 -> ReLU -> 线性层

两个线性层分别将512投影成2048,然后再将2048投影回512

Positional Encoding

在输入时就加入某一时刻的信息保证模型中带入时序信息。

缺点

Flowformer

虽然可以完成通用关系(image、language、time series、agent trajectory)的建模,但在self-attention的点积计算中,对数据是两两进行计算(比如image任务中每两两图片进行计算),如果是针对长序列计算代价过大。

【项目详情】DateMinder

概述:一款基于人工智能与云开发技术,为用户提供物品保质期记录提醒,与物品清单共享的小程序。

贡献:

  • CLIP模型:使用Websocket动态更新清单。使用CLIP模型进行识别,并探究了Bert文本特征融合策略对检索的影响。
  • 共享清单:使用 diff-match-patch 算法解决并发带来的多用户共同修改的冲突问题,使用高性能NoSQL,设计数据库权限划分,提高读写速度。

项目介绍

​ 在生活中我们使用的大部分物品都有保质期,而我们往往难以做到清楚地记住每样物品的过期时间。导致在期限内未被使用而被浪费扔掉、或是由于使用过期产品对身心造成伤害,以及在家中,往往家庭成员无法记得其他成员购买的东西,导致重复购买同一类物品,而目前市面上的其他产品都不能很好的解决这些问题。

​ 基于以上几种情况,我们开发的Date Minder——是一款基于人工智能与云开发技术,为用户提供物品保质期记录提醒,与物品清单共享的小程序。

​ 我们希望通过数字化技术解决这一系列问题,为大家创造一个绿色、健康的生活环境,Date Minder 应运而生。

重点难点

共享清单

1、使用 diff-match-patch 算法解决并发带来的多用户共同修改的冲突问题。

2、使用高性能NoSQL,提高读写速度。

3、设计数据库权限划分。

4、使用Websocket动态更新清单。

物品识别模型 - CLIP

​ CLIP的模型采用的是经典的双塔结构,对于图片域和文本域有着不同的图片编码器(Image Encoder)和文本编码器(Text Encoder)。其中文本编码器采用了经典的Transformer结构,而图片编码器则采用了两种:第一种是改进后的ResNet,作者选择用基于注意力的池化层去替代ResNet的全局池化层,此处的注意力机制同样是与Transformer类似的多头QKV注意力;作者同样采用ViT结构作为第二种图片编码器进行实验。

​ CLIP的负样本采样,采用了in-batch负采样的方法。其CLIP模型也是经典的双塔结构。此时如图所示,对图片嵌入特征和文本嵌入特征进行矩阵相乘。那么形成的打分矩阵上,对角线上都是配对的正样本对打分,而矩阵的其他元素,则是由同个batch内的图片和不配对的文本(相反亦然)组成的负样本。而后只需要对每一行和每一列求交叉熵损失,并且加和起来即形成了总损失了。其中每一行可以视为是同个图片,与同个batch内其他所有样本对的文本进行组合构成的负样本对形成的损失,而每一列自然就是同个文本,对于每个图片进行组合而构成的损失了。

​ 如下图显示,考虑到以单词作为标签存在多义的情况,比如在Oxford-IIIT Pet dataset 数据集中boxer表示斗牛犬,而在其他数据集中则可能表示拳击运动;在ImageNet中,crane同时表示了起重机和鹤。这种词语的多义显然对是因为缺少对标签的上下文描述导致的。为了解决这种问题,作者在指示上下文中添加了一些提示标签类型的词语,比如A photo of a

img

img

改进:Bert文本特征不同的融合机制

​ 原始CLIP模型中只返回last hidden state和pooler_output,即cls最后一层的隐藏状态。CLIP一般使用最后一层的特征作为文本特征。

​ Bert输出是一个元组类型的数据,包含四部分: last hidden state shape是(batch_size, sequence_length, hidden_size),hidden_size=768,它是模型最后一层的隐藏状态。

​ pooler_output:shape是(batch_size, hidden_size),这是序列的第一个token (cls) 的最后一层的隐藏状态,它是由线性层和Tanh激活函数进一步处理的,这个输出不是对输入的语义内容的一个很好的总结,对于整个输入序列的隐藏状态序列的平均化或池化可以更好的表示一句话。hidden_states:这是输出的一个可选项,如果输出,需要指定config.output_hidden_states=True,它是一个元组,含有13个元素,第一个元素可以当做是embedding,其余12个元素是各层隐藏状态的输出,每个元素的形状是(batch_size, sequence_length, hidden_size)。attentions:这也是输出的一个可选项,如果输出,需要指定config.output_attentions=True,它也是一个元组,含有12个元素,包含每的层注意力权重,用于计算self-attention heads的加权平均值。

img

​ 近期发表于ICCV2021关于跨模态视频检索的研究中,作者探究了Bert不同层特征聚合对检索的影响,如CLS,Maxpolling和Average Pooling,1D-CNN,发现使用Average Pooling的特征检索结果最好,受此启发,我们复现以上方法,对CLIP的文本特征使用所有层特征Average Pooling。

img

OCR识别模型 - StrucTexT

​ 光学字符识别(OCR)是目前应用最为广泛的视觉AI技术之一。随着OCR技术在产业应用的快速发展,现实场景对OCR提出新的需求:从感知走向认知,OCR不但需要认识文字,也要进一步理解文字。因此,识别结构化文本逐渐成为OCR产业应用的核心技术之一,旨在快速且准确地分析卡证、票据、档案图像等富视觉数据中的结构化文字信息,并对关键数据进行提取。

​ StrucTexT是一个基于双粒度表示的多模态信息提取模型。除了采用字符粒度建模文本之外,StrucTexT利用字段组织文档视觉线索,并构建字符和字段的匹配关系对齐图像与文本特征。在多模态信息表示上,StrucTexT构建文本、图像和布局的多模态特征,并提出“遮罩式视觉语言模型”,“字段长度预测”和“字段方位预测”三种自监督预训练任务促进跨模态特征交互,帮助模型学习模态间的信息关联,增强对文档的综合理解能力。另外,StrucTexT支持中英双语编码。在双粒度表征下,模型能够实现字符和字段粒度的信息抽取任务,实现灵活选型和场景适配。

img

​ 我们使用预训练模型StrucTexT作为程序识别文字的模型,同时,由于模型不能直接识别保质期,我们在模型识别返回的基础上,对市面上一些常见的保质期标签进行了收集,构建正则表达式,将物品生产日期和保质期从OCR识别结果中匹配出来,自动填写。

功能展示

功能名称 功能描述
登录 用户可以通过登陆界面登录小程序,来进行对物品的管理。
AI识图 支持拍照进行AI识图,识别出物品的名称及种类。
搜索 用户可以通过小程序中的搜索功能进行对物品的搜索。
分类 用户可以对录入的物品进行分类,目前有食品,药品,护肤/化妆品三类。
过期提醒 用户可以设置物品的保质日期,小程序会在保质期到期时进行提醒。
多人数据共享 本小程序支持多人之间建立不同清单实现数据共享,方便多人管理共有数据。
保质期参考 在Q&A中进行常用物品保质期的展示

界面展示

主页面

image-20220607221017158

添加页面

image-20220607221924849

共享清单

image-20220607221854361

创建清单

image-20220607221841071

我的界面

image-20220607221822080

项目总结

​ 加入语音输入功能可与现在市场上的智能音箱,百度旗下小度,小米旗下ai音箱等结合。还可与智能冰箱结合将Date Minder内物品信息显示在智能冰箱显示屏上。为用户生活带来更多便利。

​ 坚持对软件的再开发与功能完善,未来会增设用户饮食规律提醒与建议与各类APP使用时长的健康提醒与报告,还将利用智能分析系统完善生成用户不常用物品清单功能。未来还将继续推出可以与智能家居链接的其他版本的软件。

​ 从用户需求的角度,不断完善和开发新的功能,未来会不断地给用户带来新的体验和惊喜。未来的市场优势也一定属于我们。一款好的产品,不仅仅是一个工具,还将会提供一种美好的生活方式。绿色,节能,环保。

【项目详情】解字

作品现已上架TapTap,支持篝火计划 点击链接

创作简介

作品简介

​ 汉字文化在当下如何利用数媒游戏阵地有效发挥其文化价值和影响力,是应对互联网发展带来的表达匮乏,如提笔忘字等现象的重要论题。

​ 基于此,我们团队充分挖掘汉字的结构特点和文化底蕴,设计出一款基于Unity的汉字解密游戏,游戏分为三个篇章,分别是汉字冒险、汉字竞速和汉字识解。

​ 我们自主设计了丰富的故事情节并融入古典诗歌与民间神话,充满了古典韵味,弘扬了古典文化,能激发玩家的兴趣,带给玩家沉浸式游戏体验。在保证趣味性的同时,具有深刻教育意义,宣扬积极向上的价值观,玩家可以在古典文化的氛围中更好的学习和理解汉字。

​ 由于汉字的复杂结构和丰富的文化底蕴,如何在紧扣《送东阳马生序》的故事背景的基础上利用汉字的结构特性进行组合和拆分以表达具象的场景和物体成为游戏设计的一大难点。通过阅读相关期刊和《宋学士全集》,对汉字的结构演变、笔画之间的形态关系和《送东阳马生序》故事情节的研究总结,设计出七个以宋濂奔走还书为主线的关卡。

​ 故事情节是激发玩家兴趣必不可少的部分,如何将汉字文化与民间神话、古典诗歌结合起来形成连贯、完整的情节是一大难点。经过团队的反复讨论和研磨,我们团队为每一关卡设计了不同的情节,增加游戏整体古典韵味的同时,为游戏关卡提供了一定的线索。

​ 我们设计四大系统,训练基于CNN的中文OCR模型实现游戏基本功能,同时制作了一个框架,涵盖了汉字移动过程中所产生的所有的事件,有利于我们将游戏的场景做的更大更宏观。

CLIP

项目GitHub链接

在线CLIP-as-service

总结

数据集:句子 - 图片对(将单词做成句子“A photo of a xxx”,对应图片)

优点:预训练、结构简单、在zero-shot(能够对从没见过的类别分类)上比有监督下ResNet50效果好、泛化性好。数据集大模型复杂,因此效果更好。

1、利用自然语言处理的监督信号做预训练:

输入 图片和句子的配对

通过图片编码器,Resnet或vison transformer,得到图像特征

通过文本编码器,CBOW或Text Transformer,得到文本特征

然后通过投射层,合并图片和文本多模态的特征

计算cosine相似度得到logits

用logits和labels做交叉熵,计算出图片loss和文本loss,并求平均

然后对图片和文本进行对比学习,得到文本和图片的特征

正样本:配对的图片文本对,即左图中对角线上的样本,共n个

负样本:非对角线的元素,共$ n^2-n$ 个

数据集:OpenAI上4亿个文本和图片配对

2、用Prompt template做推理:

Prompt engineringh或Prompt ensemble

输入 图片

通过图片编码器得到特征,与每个文本特征求cos similarity

优点:得到语义特征,迁移性强(素描、动漫风格的物体都能识别出是什么)

可以应用在;目标检测(丰富检测出物体的信息)、用文本检索视频中物品出现的帧等

Abstract

​ 现有模型都是通过提前定义好的标签集合(即物品类别)来预测,是有限制性的监督信号,无法识别新的类别;CLIP直接从自然语言处理中得到特征,即用爬取到的4亿图片-文本配对进行多模态的对比训练;在30个不同数据集上做预测效果都很好,比如在ImageNet上和有监督训练的ResNet-50打平手;预训练代码没开源,但模型在Github上开源了。

​ Bert、GPT、T5是在原始的文本数据上预训练一个模型,已经取得革命性成果,无论是自回归预测还是掩码完形填空的方式,都是自监督的方式,目标函数和下游任务无关,随着模型、数据、计算资源变多,性能也会变好,比如GPT-3无需特定领域的数据就能与之前精心设计的网络做对比。

​ 对99年到21年工作的讨论,……,总之,有了Transformer后,出现了VirTex和ConVIRT这些和CLIP类似的工作,但这些模型由于数据和模型规模不够大,所以效果不够好;CLIP是ConVIRT的简化版,共尝试8个模型,包括Vision Transformer和ResNet,迁移学习效果和模型大小呈正相关。

Approach

1、监督的NLP

​ NLP中原来多是基于N-gram,无法用于跨模态zero-shot工作

2、造数据集

​ 现有的数据量都不够大,自己收集了WebImage Text(WIT)作为数据集

3、训练方法

​ 文本用Transformer即 CBOW 或 Text Transformer,图片用CNN即ResNet或Vision Transformer ;由于同一张图有不同的文字描述,不能用预测型任务,而是对比任务,即对比文本和图片是否配对。

I为图片的输入,n为batchsize,224 * 224 * 3

T为文本的输入,由于和图片配对,batchsize也是n,l为文本序列长度

通过编码器之后得到特征,使用投射层,学习一下如何从单模态到多模态,得到用来对比的特征I_e和T_e,最后用logits(求得的余弦相似度)和 ground truth(labels)求两个交叉熵损失函数,再将两个损失函 数求平均。

ground truth 是 arange 即从1到n,这样可以使对角线(即保证1-a 2-b……)上的元素为正样本;

Experiments

zore-shot Transfer推理

prompt:文本引导提示

由于文本的多义性且单个单词易产生歧义,将词语转化为句子“A photo of A xxx”计算出文本特征和图片特征对比,同时在句子中可以加入提示“A photo of A xxx,a type of xxx”,论文中用了80个提示模板,比如“A photo of a hard to see xxx”。