神经网络|Representation:构建一个四合一的网络(附完整git资源)

导读:

这是一篇来自印度德里的大神Paras Chopra新鲜出炉的blog。除了知名博主这个众人皆知的身份之外,大神本人也是软件公司Wingify的Founder & CEO。这位印度大哥风趣幽默、极擅言辞;他的blog是小编我的最爱之一,各种技术解读和代码播放都非常值得大家空闲时间刷起来。Blog链接在此,不用感谢我哈:https://paraschopra.com/blog/。

众所周知,神经网络擅长处理我们普遍称之为”范围比较窄的任务“,而且最好为单项任务;相反它们在处理复杂的多任务项任务时,往往表现欠佳。 这与人类大脑的表现非常不同,人类大脑能够在惊人的多样化任务中使用相同的概念。

让我们用个简单的例子,来试试看!

比如你之前从未见过分形(fractal),我现在就给你看一个分形。简单的解释一下,下面这个漂亮的图片就是分形,而所谓分形是一个几何术语,指具有以非整数维形式充填空间的形态特征。

请看下图:

Okay,现在你进看过这张图片了,假设你从来没有了解过什么是分形,在你看到这张图片后,你的脑子现在已经能够处理以下的多个任务了:

  • 在一组图像中,分辨出哪张是猫的图片,哪张是分形的图片;

  • 在一张纸上,绘制一个分形粗略的样子(它不是完美的,但它不是随机的涂鸦);

  • 把图片分类成为跟分形像的一类,和不像的一类(能够自动从最相似到最相似的图像排序);

  • 闭上眼睛,想象一下分形的样子(即使没有在看着图片,你甚至可以在一次曝光后就能够清晰的在脑子中想象它)。

你怎么能完成所有这些任务? 大脑中是否有专门用于所有这些任务的专用神经网络?

现代神经科学认为,大脑中的信息是在不同部分共享和交流的,但究竟它是如何完成共享和交流的仍然是一个复杂的研究领域。但我们对大脑这种独特的“多任务性能”是如何发生有了一些初步的了解。 答案可能在于:如何在大脑神经网络中存储和解释数据。

Representations表达的重要性

顾名思义,representation(s)指的是信息是如何通过网络内编码进行表示的。 当一个单词或句子或图像(或其他任何东西)作为训练神经网络的输入时,它会被连续在不同层的神经网络中不断的传递变换,并伴随着权重乘以输入进行应用激活。 最后,在输出层,我们得到的数字可以解释为类标签,也可以是网络训练的任何其他任务。

从输入到输出的神奇转换是由于连续层中发生的输入转换而发生的。 输入数据的这些转换称为representation(s)。 一个关键的想法是每个层使下一层更容易完成它的工作。

这计划应该如何理解呢,让我们看一下图像分类器的不同层的激活示例:

图像分类网络的作用是将像素空间(pixel-space) 中的图像转换为越来越高级别的概念空间(concept space)。 因此,一个表示为RGB值的汽车图像将开始在第一层中的边缘空间(space of edges)中第一次进行representation,然后在第二层space of circles和pre-最终层basic shapes的空间中被表示,最终它将会在更高级物体层(high-level objects)中被represent,例如轮子,门等等。

由于深度网络的分层性质而自动出现这种日益丰富的表示,使得图像分类的任务变得微不足道,甚至可以说是小菜一碟。 最后一层所要做的就是权衡车轮和车门的概念,是个汽车汽车;然后有耳朵和有眼睛的,更个像人。

我们用Representations做什么?

由于这些中间层会去存储有意义的输入数据编码,因此你可以将这些编码和信息用于多个任务。 例如,你可以用一个语言模型(经过训练以预测下一个单词的反复神经网络)并激活特定神经元以达到预测句子情绪的目的。

令人惊奇的是,情感神经元在无人监督的语言建模任务中自然而然地出现。该网络经过训练可以预测下一步的工作,我们在任务中没有任何地方要求网络预测情绪。 也许情绪是一个非常有用的概念,网络自然而然的发明它是为了更好地完成语言建模,which is我们原本交给他的任务。

一旦你理解什么是Representations,你就会开始以完全不同的方式看到深层神经网络。 您将开始把Representations看做是一个为以进行转换的语言,使不同网络(或同一网络的不同部分)可以相互通信。

探索Representations:构建一个四合一网络

为了完全理解什么是Representations,让我们构建自己的多任务(multi-task)深度神经网络,让可以做四件事:

  • 图像标题生成器:给定图像,为其生成标题

  • 类似的单词生成器:给出一个单词,找到与它类似的其他单词

  • 视觉上相似的图像搜索:给定图像,找到最相似的图像

  • 通过描述图像的内容进行搜索:搜索具有文本描述所描述的内容的图像

上面列出的三个任务中都是独立的,传统的操作中我们需要三个不同的模型才能完成任务。 但是今天我们将使用一个模型完成去完成所有这些操作,让我们一起挑战一下吧。

我将代码放在了Jupyter Notebook中用Pytorch编写,大家可以从此存储库下载它[1]。

第一部分 - 图像标题

网上有很多很好的教程来实现自动给图片生成标题,所以我不打算深入地来讲它。 我的实现与本教程中的完全相同:Building an Automated Image Captioning Application[2]。关键的区别在于我是用Pytorch实现的,而教程使用的是Keras。

你需要下载Flickr8K数据集。 填写此表单[3],您将收到电子邮件中的下载链接。 将“Flicker8k_Dataset”文件夹中的zip文件解压缩到与notebook相同的目录中。 您还需要下载字幕,提取文件夹'caption_datasets'中的标题[4]。你可以在贪心科技AI公众号,后台回复“看图说话”,获得字幕文件。

(1) Model 模型

给图片生成标题可以大致分成两个组成部分:a)一个图像编码器,它对输入图像进行representation,而这个representation的所表达的意义将会直接帮助后半部分的字幕生成; b)接着,我们将用一个字幕解码器,它采用上半部分我们对于图像representation并输出它的文本描述。

这个图像编码器是一个深度卷积网络,而字幕解码器是传统的LSTM / GRU递归神经网络。当然,我们可以从头开始训练这两种方法。但这样做需要的数据和训练时间将会非常的多。因此,我们不是从头开始训练图像编码器,而是采用预先已经存在的图像分类器并用它激活最终的图层。

这是你将在本文中看到的许多表示的神奇示例中的一个。我正在用PyTorch modelzoo[5]中的Inception网络,该模型在ImageNet上进行了训练,可以对100个类别的图像进行分类,并使用它来为我提供可以输入到递归神经网络中的representation。

这里值得注意的是,Inception网络从未接受过图像字幕任务的训练。 我们是第一个完成这个任务的,而且证明它的确有效的!

完整的模型架构如下所示:


 

这里值得注意的是,Inception网络从未接受过图像字幕任务的训练。 我们是第一个完成这个任务的,而且证明它的确有效的!

完整的模型架构如下所示:

(2) Performance 性能

来展示一下我训练完的模型能够达到的效果吧。

整体来说效果还是不错的! 我比较注意的是这句, "a man who’s wearing a white T-shirt." ,其实这句英文的语法有点不准确,我确信更多训练可以修复这个问题,但基本信息是准确的。所以我基本是成功的~

当然,这个模型也会有软肋。如果输入的图像包含网络以前从未见过的东西,它往往会失败。 例如,我很好奇网络将如何标记一个iPhone X的图像。

显然它做得不好。但总的来说,我对性能非常满意,这为我们提供了一个很好的基础,现在我们可以使用网络在学习图像标题时开发的representation来构建其他功能。

第二部分 - 类似的词

回想一下我们刚刚从图像表示中解码标题的方法。我们将representation提供给LSTM / GRU网络,生成输出,将其解释为第一个单词;然后取出第一个单词并将其反馈回网络以生成第二个单词。这一直持续到网络生成表示句子结束的特殊标记。

为了将单词反馈到网络中,我们需要将单词转换为一个representation并输入网络。这意味着如果输入层包含300个神经元,对于所有标题中的8000多个不同单词,每一个我们都需要100个数字来指代该单词。将单词字典转换为数字representation的过程称为单词嵌入word embeddings。

我们可以下载和使用预先存在的单词嵌入,如word2vec或GLoVE。但在目前的情况下,我们需要让模型从头开始学习嵌入的单词。我们从随机生成的单词嵌入开始,并在训练完成时探索我们的网络对单词的了解。

由于我们无法想象100维数字空间,我们将使用一种称为t-SNE的技术来实现二维学习单词嵌入的可视化。 t-SNE是一种降维技术,它试图使高维空间中的邻居也成为低维空间中的邻居。

(1) 单词嵌入的可视化

首先,让我们看一下我们的字幕解码器所学习的字嵌入空间(与其他有数百万字和句子的语言任务不同,我们的解码器在训练数据集中只看到了~30k的句子)。

所以,我们的网络已经知道像 “play”, “plays” and “playing”这样的词非常相似(它们具有类似的representation,从带有红色箭头的紧密簇中可以看出)。

让我们探索这个2D空间中的另一个区域:

这个区域似乎有聚集的数字 -  “two”, “three”, “four”, “five”, 等等。

另一个:

它知道词语“people”和“children”是非常相似的。 而且,它隐含地推断出物体的形状。

(2) 相似的词语

我们可以使用100维的representation来构建一个函数,该函数将帮助我们找到与输入单词最相似的单词。 工作原理很简单:采用100维表示法,找到与数据库中所有其他单词的余弦相似度(cosine similarity)。

让我们看一下与“boy”这个词最相似的词:

这个效果是不错的。 从“boy”这个词,模型帮助我们匹配到了“kids”,“kid”和“tiddler”,这几个都是正确的。例外是“rider”,它差的比较远。

再看一个例子,网络认为与“chasing”这个词类似的是:

“chaese”很好,但我不确定为什么它认为“police”与”chasing“相似......

第三部分 - 类似图像

如果单词的representation将相似的单词聚集在一起,那么图像的representation又该如何操作呢。 我将相同的t-SNE技术应用于图像representation (在标题解码器的第一步中作为输入的300维张量)。

(1) 可视化

点是不同图像的representation,红色箭头指向附近表示的集群。

所以,赛车聚集在一起。

孩子们在森林/草地区玩耍也是如此。

篮球运动员聚集在一起。

(2) 查找与输入图像类似的图像

对于找相似单词的任务(即上一个任务),我们的结果仅限于在测试集词汇表来查找相似的单词。但是,对于查找类似的图像任务,我们有一个图像表示生成器,它将采用任何输入图像并生成其编码。

这意味着我们可以使用余弦相似性方法来构建按图搜索功能,如下所示:

Step1:获取数据库或目标文件夹中的所有图像并存储它们的representations(由图像编码器给出);

Step2:当用户想要搜索与他已经拥有的图像最相似的图像时,采用新图像的representation并找到数据库中最接近的图像(由余弦相似度给出)。

Google Images可能正在使用这种(或非常类似的)方法来支持其反向图像搜索功能。

第四部分 - 通过描述它们来搜索图像

在最后一部分中,我们需要将图像标题生成器反过来运行。因此,我们不是拍摄图像并为其生成标题,而是输入标题(文字说明)并找到与其最匹配的图像。

听起来好得令人难以置信?嗯,事实并非如此。我们是这样做的:

Step1:代替来自编码器的300维图像representation,从输入完全随机的300维张量开始;

Step2:冻结整个网络的所有层(即指示PyTorch不计算渐变);

Step3:假设随机生成的输入张量来自图像编码器并将其馈送到字幕解码器;

Step4:在给出随机输入时获取网络生成的标题,并将其与用户提供的标题进行比较;

Step5:计算比较生成的和用户提供的标题的损失;

Step6:找到最小化损失的输入张量的梯度(即,应该改变每个300维数字的方向和数量,以便当张量输入到字幕解码器时,标题接近用户提供的标题);

Step7:在梯度通知的方向上改变输入张量;

Step8:继续Step4到Step7,直到收敛或当损失低于某个阈值时;

Last Step:取最终输入张量并使用其值通过余弦相似性找到最接近它的图像。

当我们这样做时,结果是神奇的:

我搜索了“狗”,这是网络发现的图像:

不过,问题依然出现了,因为我搜索了:

图片显示出了以下这两张:

无法解释对吧~

没关系,我们的模型已经完成的够好了~ 给它点赞吧!

总结和挑战

提醒一下,你可以从github存储库下载完成所有这些操作的代码。它包括用于数据预处理,模型描述,预训练图像字幕网络,可视化的代码。它不包括你必须从公众号后台单独下载的Flickr8K数据集和字幕文件。

我希望你喜欢这篇文章。如果你想更进一步挑战一下,你可以从给定的描述中生成一个图像。就像从随机起点生成的300维图像representation与用户提供的标题相匹配一样,你是否可以更进一步从头开始生成用户提供的标题图像?

它比我们在这篇文章中所处理的要难10倍,但我的感觉是它是可行的。如果有一项服务不仅可以搜索与文本对应的图像,而且能够动态生成一个图像,那将会有多酷。

让我们一起来实现吧~ 约起来~

Resource:

[1]https://github.com/paraschopra/one-network-many-uses

[2]https://daniel.lasiman.com/post/image-captioning/

[3]https://forms.illinois.edu/sec/1713398

[4]贪心科技AI公众号,后台回复“看图说话”,获得字幕文件

[5]https://pytorch.org/docs/stable/torchvision/models.html]

原文链接:https://towardsdatascience.com/one-neural-network-many-uses-image-captioning-image-search-similar-image-and-words-in-one-model-1e22080ce73d

猜你喜欢

转载自blog.csdn.net/perfectlwz/article/details/88140808
今日推荐