3 图片语义分析
3.1 图片分类
图片分类是一个最基本的图片语义分析方法。
基于深度学习的图片分类
传统的图片分类如下图所示,首先需要先手工提取图片特征,譬如SIFT, GIST,再经由VQ coding和Spatial pooling,最后送入传统的分类模型(例如SVM等)。
图23. 传统图片分类流程图
传统方法里,人工特征提取是一个巨大的消耗性工作。而随着深度学习的进展,不再需要人工特征,通过深度学习自动提取特征成为一种可能。接下来主要讲述卷积神经网络在图片分类上的使用。
下图是一个经典的卷积神经网络模型图,由Hinton和他的学生Alex Krizhevsky在ILSVRC(Imagenet Large Scale Visual Recognition Competition) 2012中提出。 整个网络结构包括五层卷积层和三层全连接层,网络的最前端是输入图片的原始像素点,最后端是图片的分类结果。一个完整的卷积层可能包括一层convolution,一层Rectified Linear Units,一层max-pooling,一层normalization。
图24. 卷积神经网络结构图
对于每一层网络,具体的网络参数配置如下图所示。InputLayer就是输入图片层,每个输入图片都将被缩放成227*227大小,分rgb三个颜色维度输入。Layer1~ Layer5是卷积层,以Layer1为例,卷积滤波器的大小是11*11,卷积步幅为4,本层共有96个卷积滤波器,本层的输出则是96个55*55大小的图片。在Layer1,卷积滤波后,还接有ReLUs操作和max-pooling操作。Layer6~ Layer8是全连接层,相当于在五层卷积层的基础上再加上一个三层的全连接神经网络分类器。以Layer6为例,本层的神经元个数为4096个。Layer8的神经元个数为1000个,相当于训练目标的1000个图片类别。
图25. CNN网络参数配置图
基于Alex Krizhevsky提出的cnn模型,在13年末的时候,我们实现了用于广点通的图片分类和图片检索,下面是一些示例图。
图片分类示例:
图26. 图片分类示例图
图片检索示例:
图27. 图片检索示例图
图片分类上的最新进展
在ILSVRC 2012中,Alex Krizhevsky基于GPU实现了上述介绍的,这个有60million参数的模型(简称为AlexNet),赢得了第一名。这个工作是开创性的,它引领了接下来ILSVRC的风潮。2013年,Clarifai通过cnn模型可视化技术调整网络架构,赢得了ILSVRC。2014年,google也加入进来,它通过增加模型的层数(总共22层),让深度更深[48],并且利用multi-scale data training,取得第一名。baidu最近通过更加“粗暴”的模型[44],在GooLeNet的基础上,又提升了10%,top–5错误率降低至6%以下。具体结果如下图所示。
图28. ImageNet Classification Result
先简单分析一下“GoogLeNet”[48,51]所采用的方法:
- 大大增加的网络的深度,并且去掉了最顶层的全连接层:因为全连接层(Fully Connected)几乎占据了CNN大概90%的参数,但是同时又可能带来过拟合(overfitting)的效果。
- 模型比以前AlexNet的模型大大缩小,并且减轻了过拟合带来的副作用。Alex模型参数是60M,GoogLeNet只有7M。
- 对于google的模型,目前已有开源的实现,有兴趣请点击Caffe+GoogLeNet。
再分析一下“Deep Image by baidu[44]”所采用的方法:
- Hardware/Software Co-design。baidu基于GPU,利用36个服务节点开发了一个专为深度学习运算的supercompter(名叫Minwa,敏娲)。这台supercomputer具备TB级的host memory,超强的数据交换能力,使能训练一个巨大的深层神经网络成为可能。而要训练如此巨大的神经网络,除了硬件强大外,还需要高效的并行计算框架。通常而言,都要从data-parallelism和model-data parallelism两方面考虑。
- data-parallelism:训练数据被分成N份。每轮迭代里,各个GPU基于各自的训练数据计算梯度,最后累加所有梯度数据并广播到所有GPU。
- model-data parallelism:考虑到卷积层参数较少但消耗计算量,而全连接层参数相对比较多。所以卷积层参数以local copy的形式被每个GPU所持有,而全连接层的参数则被划分到各个CPU。每轮迭代里,卷积层计算可以由各个GPU独立完成,全连接层计算需要由所有GPU配合完成,具体方法请参考[46]。
- Data augmentation。训练一个如此巨大的神经网络(100billion个参数),如果没有充分的训练数据,模型将很大可能陷入过拟合,所以需要采用众多data augmentation方法增加训练数据,例如:剪裁,不同大小,调亮度,饱和度,对比度,偏色等(color casting, vignetting, lens distortion, rotation, flipping, cropping)。举个例子,一个彩色图片,增减某个颜色通道的intensity值,就可以生成多张图片,但这些图片和原图的类目是一致的,相当于增加了训练数据。
- Multi-scale training:训练不同输入图片尺度下(例如512*512,256*256)的多个模型,最后ensemble多个模型的输出结果。
3.2 Image2text,Image2sentence
上面讲述的图片分类对图片语义的理解比较粗粒度,那么我们会想,是否可以将图片直接转化为一堆词语或者一段文本来描述。转化到文本后,我们积累相对深的文本处理技术就都可以被利用起来。
Image2text
首先介绍一种朴素的基于卷积神经网络的image to text方法。
- 首先它利用深度卷积神经网络和深度自动编码器提取图片的多层特征,并据此提取图片的visual word,建立倒排索引,产生一种有效而准确的图片搜索方法。
- 再充分利用大量的互联网资源,预先对大量种子图片做语义分析,然后利用相似图片搜索,根据相似种子图片的语义推导出新图片的语义。
其中种子图片,就是可以覆盖所有待研究图片的行业,但较容易分析语义的图片集。这种方法产生了更加丰富而细粒度的语义表征结果。虽说简单,但效果仍然不错,方法的关键在于种子图片。利用比较好的种子图片(例如paipai数据),简单的方法也可以work得不错。下图是该方法的效果图。
图29. 图片语义tag标注示例图
上面的baseline方法,在训练数据优质且充分的情况下,可以取得很不错的图片tag提取效果,而且应用也非常广泛。但上面的方法非常依赖于训练数据,且不善于发现训练数据之外的世界。
另一个直观的想法,是否可以通过word embedding建立image与text的联系[26]。例如,可以先利用CNN训练一个图片分类器。每个类目label可以通过word2vec映射到一个embedding表示。对于一个新图片,先进行分类,然后对top-n类目label所对应的embedding按照权重(这里指这个类目所属的概率)相加,得到这个图片的embedding描述,然后再在word embedding空间里寻找与图片embedding最相关的words。
Image detection
接下来再介绍下image detection。下图是一个image detection的示例,相比于图片分类,提取到信息将更加丰富。
图30. 图片detection示例
目前最先进的detection方法应该是Region-based CNN(简称R-CNN)[75],是由Jeff Donahue和Ross Girshick提出的。R-CNN的具体想法是,将detection分为寻找object和识别object两个过程。在第一步寻找object,可以利用很多region detection算法,譬如selective search[76],CPMC,objectness等,利用很多底层特征,譬如图像中的色块,图像中的边界信息。第二步识别object,就可以利用“CNN+SVM”来做分类识别。
图31. Image detection系统框图
- 给定一张图片,利用selective search方法[76]来产生2000个候选窗口。
- 然后利用CNN进行对每一个候选窗口提取特征(取全连接层的倒数第一层),特征长度为4096。
- 最后用SVM分类器对这些特征进行分类(每一个目标类别一个SVM分类器),SVM的分类器的参数个数为:4096*N,其中N为目标的类别个数,所以比较容易扩展目标类别数。
这里有R-CNN的实现,请点击rcnn code
Image2sentence
那能否通过深度学习方法,直接根据image产生sentence呢?我们先看一组实际效果,如下图所示(copy from 文献[43])。
图32. image2sentence示例图
关于这个方向,最近一年取得了比较大的突破,工业界(Baidu[77],Google[43],Microsoft[80,81]等)和学术界(Stanford[35],Borkeley[79],UML[19],Toronto[78]等)都发表了一系列论文。
简单归纳一下,对这个问题,主要有两种解决思路:
- Pipeline方法。这个思路相对直观一点,先学习到image中visual object对应的word(如上一节image detection所述),再加上language model,就可以生成sentence。这种方法各个模块可以独立调试,相对来说,更灵活一点。如下图所示,这是microsoft的一个工作[81],它分为三步:(1)利用上一节提到的思路detect words;(2)基于language model(RNN or LSTM)产生句子;(3)利用相关性模型对句子打分排序。
图33. “pipeline” image captioning
- End-to-end方法,即通过一个模型直接将image转换到sentence。google基于CNN+RNN开发了一个Image Caption Generator[43]。这个工作主要受到了基于RNN的机器翻译[27][42]的启发。在机器翻译中,“encoder” RNN读取源语言的句子,将其变换到一个固定长度的向量表示,然后“decoder” RNN将向量表示作为隐层初始值,产生目标语言的句子。那么一个直观的想法是,能否复用上面的框架,考虑到CNN在图片特征提取方面的成功应用,将encoder RNN替换成CNN,先利用CNN将图片转换到一个向量表示,再利用RNN将其转换到sentence。可以通过图片分类提前训练好CNN模型,将CNN最后一个隐藏层作为encoder RNN的输入,从而产生句子描述。如下图所示。
图34. “CNN+LSTM” Image Caption Generator
Li-Feifei团队在文献[35]也提到一种image2sentence方法,如下图所示。与google的做法类似,图片的CNN特征作为RNN的输入。
图35. “CNN+RNN”生成图片描述
此方法有开源实现,有兴趣请参考:neuraltalk
3.3 训练深度神经网络的tricks
考虑到图片语义分析的方法大部分都是基于深度学习的,Hinton的学生Ilya Sutskever写了一篇深度学习的综述文章[47],其中提到了一些训练深度神经网络的tricks,整理如下:
- 保证训练数据的质量
- 使训练数据各维度数值的均值为0,方差为一个比较小的值
- 训练时使用minbatch,但不要设得过大,在合理有效的情况下,越小越好。
- 梯度归一化,将梯度值除于minbatch size。
- 设置一个正常的learning rate,validation无提升后,则将原learning rate除于5继续
- 模型参数随机初始化。如果是深层神经网络,不要设置过小的random weights。
- 如果是在训练RNN or LSTM,对梯度设置一个限值,不能超过15 or 5。
- 注意检查梯度计算的正确性
- 如果是训练LSTM,initialize the biases of the forget gates of the LSTMs to large values
- Data augmentation很实用。
- Dropout在训练时很有效,不过记得测试时关掉Dropout。
- Ensembling。训练多个神经网络,最后计算它们的预测值的平均值。
4 总结
4.1 语义分析方法在实际业务中的使用
前面讲述了很多语义分析方法,接下来我们看看如何利用这些方法帮忙我们的实际业务,这里举一个例子,用户广告的语义匹配。
在广点通系统中,用户与广告的关联是通过定向条件来匹配的,譬如某些广告定向到“北京+男性”,那么当“北京+男性”的用户来到时,所有符合定向的广告就将被检索出,再按照“ecpm*quality”排序,将得分最高的展示给用户。但是凭借一些人口属性,用户与广告之间的匹配并不精确,做不到“广告就是想用户所想”,所以用户和广告的语义分析就将派上用场了,可以从这样两方面来说明:
- 特征提取。基于上面介绍的方法,提取用户和广告的语义特征。
- 用户语义特征。可以从用户的搜索,购物,点击,阅读记录中发现用户兴趣。考虑到最终的用户描述都是文本,那么文本topic分析,文本分类,文本keyword提取,文本核心term提取都可以运用起来,分析出用户的语义属性,还可以利用矩阵分解和文本分类找到相似用户群。
- 广告语义特征。在广点通里,广告可以从两个维度来描述,一方面是文本,包括广告title和landing page,另一方面是广告展示图片。利用文本和图片的语义分析方法,我们可以提取出广告的topic,类目,keyword,tag描述。
- 语义匹配。提取到相应的语义特征之后,怎么用于改善匹配呢?
- 用户-广告的语义检索。基于keyword、类目以及topic,对广告建立相应的倒排索引,直接用于广告检索。
- 用户-广告的语义特征。分别提取用户和广告的语义特征,用于计算用户-广告的relevance,pctr,pcvr,达到精确排序。
4.2 Future
对于文本和图片的语义分析,可以看到:最近几年,在某些任务上,基于深度学习的方法逐渐超过了传统方法的效果。但目前为止,对于深度学习的发掘才刚刚开始,比较惊艳的神经网络方法,也只有有限几种,譬如CNN,RNN,RBM等。
上文只是介绍了我们在工作中实践过的几个小点,还有更多方法需要我们去挖掘:
- Video。Learn about 3D structure from motion。如文献[19]所示,研究将视频也转换到自然语言。
- Deep Learning + Structured Prediction,用于syntactic representation。
4.3 总结
上文主要从文本、图片这两方面讲述了语义分析的一些方法,并结合个人经验做了一点总结。
原本想写得更全面一些,但写的时候才发现上面所述的只是沧海一粟,后面还有更多语义分析的内容之后再更新。另外为避免看到大篇理论就头痛,文中尽可能不出现复杂的公式和理论推导。如果有兴趣,可以进一步阅读参考文献,获得更深的理解。谢谢。
5 参考文献
- Term-weighting approaches in automatic text retrieval,Gerard Salton et.
- New term weighting formulas for the vector space method in information retrieval
- A neural probabilistic language model 2003
- Deep Learning in NLP-词向量和语言模型
- Recurrent neural network based language models
- Statistical Language Models based on Neural Networks,mikolov博士论文
- Rnnlm library
- A survey of named entity recognition and classification
- Deep learning for Chinese word segmentation and POS tagging
- Max-margin tensor neural network for chinese word segmentation
- Learning distributed representations of concepts
- Care and Feeding of Topic Models: Problems, Diagnostics, and Improvements
- LightLda
- word2vec
- Efficient Estimation of Word Representations in Vector Space
- Deep Learning实战之word2vec
- word2vec中的数学原理详解 出处2
- 斯坦福课程-语言模型
- Translating Videos to Natural Language Using Deep Recurrent Neural Networks
- Distributed Representations of Sentences and Documents
- Convolutional Neural Networks卷积神经网络
- A New, Deep-Learning Take on Image Recognition
- Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
- A Deep Learning Tutorial: From Perceptrons to Deep Networks
- Deep Learning for Computer Vision
- Zero-shot leanring by convex combination of semantic embeddings
- Sequence to sequence learning with neural network
- Exploting similarities among language for machine translation
- Grammar as Foreign Language Oriol Vinyals, Lukasz Kaiser, Terry Koo, Slav Petrov, Ilya Sutskever, Geoffrey Hinton, arXiv 2014
- Deep Semantic Embedding
- 张家俊. DNN Applications in NLP
- Deep learning for natural language processing and machine translation
- Distributed Representations for Semantic Matching
- distributed_representation_nlp
- Deep Visual-Semantic Alignments for Generating Image Descriptions
- Convolutional Neural Networks for Sentence Classification
- Senna
- ImageNet Large Scale Visual Recognition Challenge
- Krizhevsky A, Sutskever I, Hinton G E. ImageNet Classification with Deep Convolutional Neural Networks
- Gradient-Based Learning Applied to Document Recognition
- Effetive use of word order for text categorization with convolutional neural network,Rie Johnson
- Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
- Show and Tell: A Neural Image Caption Generator
- Deep Image: Scaling up Image Recognition
- Large-Scale High-Precision Topic Modeling on Twitter
- A. Krizhevsky. One weird trick for parallelizing convolutional neural networks. arXiv:1404.5997, 2014
- A Brief Overview of Deep Learning
- Going deeper with convolutions. Christian Szegedy. Google Inc. 阅读笔记
- Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling
- Semi-Supervised Learning Tutorial
- http://www.zhihu.com/question/24904450
- LONG SHORT-TERM MEMORY BASED RECURRENT NEURAL NETWORK ARCHITECTURES FOR LARGE VOCABULARY SPEECH RECOGNITION
- LSTM Neural Networks for Language Modeling
- LONG SHORT-TERM MEMORY
- Bengio, Y., Simard, P., Frasconi, P., “Learning long-term dependencies with gradient descent is difficult” IEEE Transactions on Neural Networks 5 (1994), pp. 157–166
- AliasLDA
- Gibbs sampling for the uninitiated
- Learning classifiers from only positive and unlabeled data
- TF-ICF: A New Term Weighting Scheme for Clustering Dynamic Data Streams
- LDA数学八卦
- Chinese Word Segmentation and Named Entity Recognition Based on Conditional Random Fields Models
- Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data
- Chinese Segmentation and New Word Detection using Conditional Random Fields
- Gregor Heinrich. Parameter estimation for text analysis
- Peacock:大规模主题模型及其在腾讯业务中的应用
- L. Yao, D. Mimno, and A. McCallum. Efficient methods for topic model inference on streaming document collections. In KDD, 2009.
- David Newman. Distributed Algorithms for Topic Models
- Xuemin. LDA工程实践之算法篇
- Brian Lott. Survey of Keyword Extraction Techniques
- Yi Wang, Xuemin Zhao, Zhenlong Sun, Hao Yan, Lifeng Wang, Zhihui Jin, Liubin Wang, Yang Gao, Ching Law, and Jia Zeng. Peacock: Learning Long-Tail Topic Features for Industrial Applications. TIST’2015.
- 刘知远. 基于文档主题结构的关键词抽取方法研究
- Hinton. Reducing the Dimensionality of Data with Neural Networks
- Samaneh Moghaddam. On the design of LDA models for aspect-based opinion mining;
- The FLDA model for aspect-based opinion mining: addressing the cold start problem
- Ross Girshick et. Rich feature hierarchies for accurate object detection and semantic segmentation
- J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selective search for object recognition. IJCV, 2013.
- Baidu/UCLA: Explain Images with Multimodal Recurrent Neural Networks
- Toronto: Unifying Visual-Semantic Embeddings with Multimodal Neural Language Models
- Berkeley: Long-term Recurrent Convolutional Networks for Visual Recognition and Description
- Xinlei Chen et. Learning a Recurrent Visual Representation for Image Caption Generation
- Hao Fang et. From Captions to Visual Concepts and Back
- Modeling Documents with a Deep Boltzmann Machine
- A Deep Dive into Recurrent Neural Nets
- Xiang zhang et. Text Understanding from Scratch
大家可以加我个人微信号:scccdgf
相关推荐
2. 递归下降语法制导翻译法:递归下降语法制导翻译法是一种常用的语义分析方法,用于将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 3. 四元式表:四元式表是一种数据结构,用于存储中间代码,它的结构...
实验中提到的“递归下降语法制导翻译法”是一种常用的语义分析方法。递归下降分析基于语法的递归性质,将每个非终结符对应一个函数,当遇到语法分析树的一个节点时,调用相应的函数进行处理。而“语法制导翻译”则是...
实验报告内容要求:要给出所分析简单语言语法结构的词法说明、上下文无关文法描述,单词的种别编码方案,词法分析程序的主要算法思想,以及所采用的语法语义分析方法的算法思想的详细描述,测试结果与分析,实验总结...
编译原理实验三语义分析 本实验的主要目标是实现语义分析部分的编译原理实验三,主要包括语义分析、符号表管理和类型检查三个部分。 语义分析 语义分析是编译器的中间阶段,目的是检查源代码中是否有语法错误,并...
递归下降分析是一种自顶向下的语法分析方法,它利用递归函数来匹配输入的语法结构。在语义分析阶段,我们会插入适当的语义动作,这些动作将与语法分析同时进行,以便生成表示程序操作的四元式。 1. 语义过程的设置...
在本文中,我们将深入探讨这三种分析方法,并结合C语言实现的四元式生成,来理解它们在编程语言处理中的作用。 首先,词法分析(也称为扫描或词法分解)是编译过程的第一步。它将源代码文本分解成一个个有意义的...
根据提供的信息,我们可以深入探讨与该实验报告相关的几个核心知识点,包括语义分析的基本概念、编译原理中的关键步骤以及代码示例中的具体实现细节。 ### 一、语义分析基本概念 语义分析是编译器设计中的一个重要...
语义分析是编译器设计的第三个主要阶段,它发生在词法分析和语法分析之后。在这一阶段,编译器验证程序的逻辑正确性,包括类型检查、作用域分析和常量折叠等。例如,语义分析会检查运算符两边的操作数类型是否匹配,...
在编程语言的世界里,...词法分析、语法分析和语义分析这三个阶段共同构建了编译器的核心功能,帮助我们创建出符合规范、高效运行的软件。通过实际的实验和实践,你可以更深入地掌握这些概念,并提升自己的编程能力。
例如,Java的语义分析器会检查变量是否在使用前已被正确声明,操作数类型是否匹配运算符,以及方法调用的参数数量和类型是否正确。在Java中,类加载器和类型系统也是语义分析的重要组成部分。 **编译原理在Java中的...
### 编译原理实验语义分析源代码C语言...综上所述,通过本实验,不仅可以了解编译原理中语义分析的基本概念和方法,还可以学习到如何将这些理论知识应用于实际的编程实践中,从而更好地理解和掌握编译器的工作原理。
在这个过程中,语义分析是继词法分析和语法分析之后的第三个关键阶段。 首先,我们要理解什么是语义分析。语义分析是对程序源代码的逻辑意义进行检查和处理的过程。它的主要任务是确保程序的逻辑正确性,即检查代码...
7. **中间代码生成**:在完成语义分析后,编译器通常会生成一种中间表示(IR),如三地址码或抽象语法树(AST)。这种表示形式简化了后续的优化和目标代码生成。 8. **实验报告**:在学习和研究编译原理时,实验...
语义分析是编译器设计中的关键步骤,它在词法分析和语法分析之后进行,主要目的是确保程序的语义正确性。在这个“语义分析程序的设计与实现”项目中,我们将深入探讨这一主题,包括其核心概念、设计原则以及实际编程...
这些代码可能采用了递归下降解析、自底向上或自顶向下的方法来实现语法分析,也可能包含了词法分析的扫描器和语义分析的验证函数。 通过深入理解这三个分析阶段,开发者能够更好地设计和优化编译器,提高程序的效率...
本次实验要求学生采用递归下降的方法实现语法制导翻译法,针对算术表达式与赋值语句进行语义分析,并生成相应的四元式序列。 #### 输入与输出 **输入:** 输入是一段由语法分析器提供的正确单词序列,这些单词构成...
在这个课程设计中,我们将重点关注三个关键步骤:词法分析、语法分析和语义分析,这些都是编译器构建的重要组成部分。 **词法分析**是编译过程的第一步,也称为扫描或词法分解。它负责将源代码文本分解成一系列有...
#### 三、语义分析(Semantic Analysis) 语义分析的主要目的是确保程序的逻辑正确性,即源程序的语法结构虽然正确,但它们的实际意义是否符合语言的规定。这一步骤包括类型检查、变量声明检测、函数调用合法性验证...
### 编译原理语义分析C++:四元式生成详解 #### 一、背景介绍 在编译原理的学习过程中,语义分析是至关重要的一个环节。它主要负责检查源程序是否有语义错误,并收集类型信息供后面的代码生成阶段使用。在本篇文档...