Category: Digital Industry and Frontier Technologies

  • DDPM算法实践-Diffusion Models系列2

    在今后较长的一段时间内,本人的工作方向主要专注在AI和计算机基础核心的相关理论原理和实践技能的知识分享和相关培训教学任务上,如在合作方的介绍下前不久给北京交通大学的本科同学们做的关于深度学习的小学期实践课程培训。现在处在个人创业(自由职业)的初期阶段,还请大家多多鼓励和支持。博客的内容是本人平时汇总总结的相关知识的一些注意的点,1为汇总方便以后的查阅,2为分享出来希望对感兴趣的读者有所帮助。不正确的地方欢迎大家批评指正,不喜勿喷,欢迎大家提出意见和建议。 DDPM算法在实现细节上有一些需要注意和特别的方法,在这里做一下简要记录。 1、模型的神经网络采用U-Net结构,U-Net最早用于医学图像分割上,其输出特征图和输入特征图可以保持相同的分辨率尺寸,而且适合于编码器解码器的这种特征建模,由于DDPM的算法预测的error和生成的图像的尺寸一样,因此用U-Net结构的神经网络是适合于DDPM的建模的输入输出场景需求的。 2、基于方差调度(variance schedule)和重参化技巧,训练时样本可以基于从1和T的时间上的均匀采样去获得t时刻的样本(通过x(0)的uncorrupted data和方差调度以及时间t和重参化技巧去一次性求出t时刻的样本,其中error为从标准高斯分布进行的随机采样,如下图中的第四行伪代码所示)。 3、神经网络同时也要考虑时间t的特殊性(神经网络的结构和参数在不同采样时刻是共享的),作者从transformer的输入特性中借鉴了相关想法,加入了Positional Embedding的时间信息,这样神经网络就能够学习到预测的误差的函数在时间上的表现有差异(对时间有依赖)。其中可以采用SinusoidalPositionEmbeddings。基于时间t和时间embeddng向量位置的正弦向量和余弦向量的拼接(concanate)或交织(interleaved)。 4、DDPM在和生成图像尺寸相同的纯标准高斯噪声空间开始迭代生成清晰图像,其U-Net结构是在二维图像的基础上进行的计算,一般二维图像的数据的训练数据的张量形状为(n,c,h,w),而一般基于NLP的自然语言的训练数据的张量形状为(n, l, e),其中l为输入的token的长度,e为embedding的长度(可以理解为通道数)。下面的一个attention module的实现是基于图像张量上进行的,对代码做了相应的注解。其中用到了einsum和rearrange相关的支持张量的计算和变形的函数。 5、图像中像素基于归一化到-1到1之间的范围,在转化为正式图像时,其先转换到0-1这样的范围,然后再乘以255(t.numpy().astype(np.uint8)。整个的DDPM训练和测试的代码借鉴了开源实现,做了相关的代码验证,关键的地方加了注释和说明,详情请参考链接: difffusion-models/annotated_native_ddpm_impl.ipynb

  • DDPM原理简介-Diffusion Models系列1

    DDPM(Denoising Diffusion Probabilistic Model)是基于扩散模型的里程碑的模型,这篇文章将向大家介绍DDPM模型的数学原理以及相关实验实践方法。在介绍原理的过程中,尽可能针对公式做一些详细的介绍,在介绍的过程中,作者本人对于相关算法的过程理解也会更加的深入,和相关感兴趣的读者一样,知识和相关原理的认识是一个不断加深的过程,希望在介绍这些技术原理的同时,自己也能有更多的进步,也希望对相关的读者有所帮助。 DDPM借鉴了非平衡热力学的相关思想,系统从一个无序(完全高斯随机噪声,高熵)的结构逐渐变成一个有序(低熵)的结构(图像等)。下面将介绍这个过程的一些相关的数学方法和流程。 DDPM有前向和逆向过程,前向是从有序到无序的过程,通过不断的向数据样本中添加随机噪声使得数据一般的清晰图像到随机的高斯噪声(熵增过程)。具体公式为(其中beta的取值范围为0-1之间,但随着时间不断增大,亦即模糊化的过程越来越快,关于beta随着时间t的变化可以有不同的scheduler去生成,如线性的,二次的或余弦的): 上述公式可以通过一个均值为0,方差为1的高斯采样(如果是二维图像数据,则所有像素都是独立同分布采样)生成的随机数eposilon来组合生成,其公式表示为: 上述t时刻的状态在t-1时刻已知的情况下,和t-1时刻之前的状态无关,因此我们也称为这个前向的加噪的过程为马尔可夫链过程。接下来将以问答的形式来介绍后续的相关原理。 问题1:有快速生成t时刻和t+1时刻的样本的方法吗? 回答:可以确认有快速生成t时刻样本的方法,而不需要经过t次高斯随机函数的迭代计算,这种方法称为重参化技巧(The reparameterization trick)。具体公式描述为: 对上述公式的推导过程解释如下,第二行是基于t-1时刻的数据由t-2时刻的数据加噪声生成而来,将第一行的t-1时刻的数据通过t-2时刻的数据生成去替代而得出: 图3公式的后两项为两个均值为0的高斯分布的叠加,epsilon前的系数分别为两个高斯的标准差,根据高斯分布叠加原理,叠加后的高斯分布的方差为两个高斯分布的方差之和(根据高斯概率分布的公式推导)。因此得出图2第二行的第二项,epsilon bar表示叠加后的高斯分布。依次类推得出最后的结果。因此通过t个步骤的叠加后,噪声数据仍表现为高斯分布,当步骤T足够大时,不断加噪后生成的样本数据XT将服从均值为0(无限接近0)的标准随机高斯分布(因为图2中的x0的系数接近于0)。 问题2:前向加噪的过程是已知的概率分布(高斯概率分布函数已知),而生成的过程从各向同性的完全随机高斯分布的高熵数据情况开始,其逆过程为去噪的过程。逆过程为什么也服从高斯分布?逆过程的求解过程怎样,是否只要学习到逆过程高斯分布的噪声就可以进行递推迭代了呢? 关于逆向过程也可以近似为高斯分布的原因也可以从多个角度进行解释,比如1、从t-1到t的加噪过程可以近似的看成是线性的变换加一个小的噪声,影响较小,可以近似为高斯分布;2、根据贝叶斯公式的变换,同时t-1时候的x(先验分布)也可以近似的看成是高斯分布(根据高斯概率公式的推导,两个高斯分布的乘积仍是高斯分布)。由于在训练时,我们是已知0时刻的原始样本x的,因此在原始样本x0已知的情况下,从t时刻到t-1时候的变化概率可以用如下公式进行建模。 上述公式是三个前向高斯分布的运算,具体的运算过程可以参考引文1,其利用到了高斯分布是自然指数函数,利用了指数函数运算特性进行的公式推理。 既然逆向过程的每一步变化也服从小的扰动的高斯分布,关键是怎么学习到这样的分布,即均值和方差,在这里主要就是构建一个神经网络,通过输入t时刻的x和t时间特征,就能输出对应的均值和方差。在学到误差之后,就可以通过t时刻的x和误差以及相关的超参数去构造t-1时刻的x,其公式表达如下,其中epislon为学习到误差,sigma(theta)为方差表达式,具体公式的推导可以参考引文1中的详细描述。因此逆向过程可以理解为系统学习到了从无序到有序构建过程的数学模型结构和构建流程算法。 问题3:用图4以及图5的公式去构建逆向扩散过程的数学原理根据是什么? 回答:上述逆向构建扩散过程的原理在于可以基于公式推导出通过优化VLB,找出其接近的下界,间接的优化了数据x(0)的最大似然,或其CE(cross entroy),因为最大似然和CE的相关loss都是小于VLB的。VLB求得最小,可以理解为其间接优化了我们的目标损失函数。具体的VLB的求解过程可以通过参考引文1中的公式推导,最终的结果(从x(t)到x(t-1)的转换)等同于求解图4的条件概率。 References

  • GPT1和GPT2模型结构与训练方法简介-NLP模型系列3

    这篇文章也将以问答的形式介绍GPT1和GPT2模型的相关技术,欢迎读者提出问题、意见和建议。 问题1:GPT模型的全称是什么,用来做什么? 回答:GPT模型的全称是”Generative Pre-trained Transformer”,是一种NLP领域里的生成式模型,其中Pre-trained的意思是在基于大量的无标记的语料库的基础上进行的无监督训练(样本没有label),训练的任务是基于当前的输入的序列预测下一个最大可能出现的token。GPT模型可以用来做文本生成,对话系统以及文本补全等,通过不断生成下一个token,就可以连续生成较长token的文本序列。 问题2:GPT模型具体怎么达到生成下一个token,并生成长文本的目标的?请介绍一下模型的大体结构和训练细节。 回答:GPT模型的结构采用的Transformer的解码器结构,但和Transformer的编码器解码器结构不同,GPT的解码器结构是独立的,其不依赖于编码器的输出和W^K和W^V参数矩阵进行计算所得K,V和Q进行交叉自注意力机制的实现,即GPT的解码器采用的是自注意力结构(单独解码器架构)。GPT和Bert不同的地方在于GPT依赖序列去预测下一个token,因此其是单向的关系建模,而Bert通过随机遮掩的机制去进行token的embedding的学习,会学习到token的前后的上下文关系。 问题3:GPT中输入的token序列长度一般是不同的,特征embedding怎么通过线性层输出并计算softmax的? 回答:在处理不同长度的输入序列时,和Bert类似,都根据最大长度做了填充,并通过attention mask对填充的位置进行了定义,在输出时也类似做了稀疏化处理,只对实际长度位置的token的特征通过线性层输出(输出为词汇量大小的输出向量)并计算softmax和loss。 问题2:GPT1和GPT2有哪些不同?第2版本有哪些改进? 回答:具体的不同有:1、参数量不同,表现在层数不同,隐藏层维度不同,注意力头数量不同。GPT2在这些方面都做了较大的提升,整体的参数量从GPT1的1.1亿提升到GPT2的最大版本的15亿参数量;2、训练数据来源和数据量不同,GPT1采用的时Bookcorpus的数据集,GTP2采用的时WebText(40GB文本数据)。 References

  • BERT模型结构及训练方法简介-NLP模型系列2

    这篇文章也将以问答的形式介绍Bert模型的相关技术,欢迎读者提出问题、意见和建议。 问题1:Bert模型的全称是什么,用来做什么? 回答:Bert模型的全称是“Bidirectional Encoder Representations from Transformers”, 从名称上来看,其作用是编码器,将语言进行编码表示,bidirectional的意思是双向的,即考虑了语言的上下文的更加全面细微的信息。可以看成是NLP中一种普适的语言特征提取的工具,供下游的NLP任务去对语言进行feature engineering。Bert作为语言的一种通用的作用模型,利用了互联网上的大量的未标记的数据进行的无监督学习,用户可以下载已经训练好的参数的bert模型去构建更加细分的NLP任务,如知识问答(question answering),情感分析(sentiment analysis)等。 问答2:既然Bert用来构建语言的特征用来更加细分的下游任务,其和word2vec等词嵌入模型有哪些区别? 回答:Bert和word2vec等都是语言特征模型,其作用有相似的地方,但也不同。具体表现为:1、词嵌入算法如word2vec等是基于浅层的神经网络,其特征的构建和表达能力相对就会弱一些,如word2vec中一个词只对应一个向量,在模型训练完成后成为静态的表示,没有充分考虑其多义性,而且无法捕捉长距离上下文依赖;2、Bert是对一整个句子的特征表示(是整个句子序列的上下文敏感嵌入,而不是基于一个个词),而且基于双向的表示特性,能够捕获单词在上下文较长距离的敏感信息,对同一个词在不同的上下文序列的不同含义能够进行有区分的编码。虽然通过拼接word2vec等word embedding也可以表示语言序列,但是在处理复杂的NLP任务中Bert具有明显的优势。 问题3:Bert的模型结构,输入输出是什么?其和Transformer的自编码器中的编码器部分的模型结构上有什么不同,双向性在模型结构上如何体现? 回答:首先Transformer的结构能够对序列的所有位置关系进行建模,自然包含双向性,这和双向LSTM的概念不一样(LSTM本身只单向的构建顺序关系,可以堆叠逆向的LSTM去构建双向LSTM,也有称为no causal)。Bert使用的就是Transformer自编码器中的编码器的部分。Bert的输入为:1、词嵌入,BERT使用WordPiece分词,每个词或子词都有一个词嵌入,2、位置嵌入,positional embedding,和Transformers自编码器或seq2seq模型中的位置嵌入一样;3、分段嵌入,对于句对的任务,如问答,下一句预测任务,前一句的分段嵌入为A,下一句的分段嵌入为B;特殊标记,[CLS]开头表示整体对句子进行“分类”,[SEP]分隔符表示句子结束。Bert的输出为每个输入词汇的新的嵌入(新的表示,同一个词在不同的句子中的输出的词嵌入可能不同)。这些词嵌入的汇合可以作为下游细分NLP任务的输入。 问题4:上面问题中的WordPiece是什么,和一般的word2vec等的token分词有什么区别? 回答:wordpiece可以通过算法基于词汇表进行构建,具体可以参考引文2中的说中的说明,wordpiece将单词分成subwords后,这些piece怎么转换成token的呢,Example: Original Text: “ChatGPT is fascinating.” WordPiece Tokens: [“Chat”, “##G”, “##PT”, “is”, “fascinating”, “.”],其中以##开头的即为subword(word piece).加上格式化后,整个句子的token将变为:Example: Original Text: “ChatGPT is fascinating.” Formatted Tokens: [“[CLS]”, “Chat”, “##G”, “##PT”, “is”, “fascinating”, “.”, “[SEP]”]。WordPiece是一种分词(Tokenizer)算法,和Byte Pair Encoding(BPE)分词算法有较大相似性,分词方法还有普通的用正则文法表示的分词,以及更高级的做了词根处理词源等复杂处理的分词,也有基于中文的特殊分词器,如jieba。WordPiece从单个字符开始,通过统计现有vocabulary中的词对的联合概率,将最大的进行合并,一直进行到达到词汇表容量停止。WordPiece和BPE算法类似,都支持未登录词OOV(out of vocabulary)词的处理。 问题5:Bert模型如何从头开始训练,如果利用已经训练好的模型在下游的细分任务和细分数据集上进行迁移学习微调参数? 从头训练Bert模型需要:1、准备大量的语料库,可以从互联网上搜集大量的未标记的语料库;2、通过wordpiece去构建输入的token;3、Bert的训练有两个任务,一个为MLM。Masked…

  • 基于Transformer的自编码器和seq2seq模型的工作原理简介-NLP模型系列1

    今天这篇文章向大家介绍Transformer网络架构在自然语言里边的基本应用,和以往的风格不同,今天的介绍以问答的形式展开,自己提出问题,自己给出解答,这样的形式也许也会引发读者在面对问题时先停下来尝试自己回答一下是否已经知晓答案,这样可能会触发更多的思考,从而会对问题有更加深入或全面的理解。 问题1:自然语言中的单词在网络的输入过程中以何种形式作为输入,以及这种表示方法的由来?怎么在输入中体现单词的位置信息? 回答:自然语言处理中,单词通过词嵌入向量进行表达(word embedding),词嵌入表达能够建模单词之间的语义信息,一般含义接近的单词其词向量之间的夹角更近,传统的词向量嵌入的方法有如Word2Vec、GloVe等(一般word embedding没有对向量进行归一化,但transformer中的LayerNorm层有归一化方法)。一般在word embedding的向量后面再拼接一个positional encoding来表示位置。具体的计算方法可以参考引文。参考引文5中(如Bert和GPT中用的词嵌入矩阵进行的转换,而且词嵌入矩阵在训练的起始可以随机初始化,然后训练过程作为整体参数的一部分参与训练更新参数学习词嵌入矩阵)。 问题2:针对K,Q,V的参数矩阵以及结果向量的计算方法是怎样的? 回答: 句子中的每个单词(word embedding+positional embedding)组成的矩阵和三个参数矩阵相乘后得出新的q,k,v三个矩阵,其中q和k的转置再实现矩阵相乘,得出单词之间的“相关性矩阵”(用softmax计算实现了相关性的大小的归一化计算?),将相关性矩阵和v矩阵相乘得出最后的结果z矩阵。如果是多头时,则会有多组参数矩阵,最终的多组z也会拼接起来并和一个新的参数矩阵相乘得出融合后的z‘。 问题3:基于Transformer的encoder,decoder模型怎么进行训练?transformer的自编码器和seq2seq的模型的区别在哪里? 回答:首先基于transformer的自编码器和seq2seq的模型的应用目标不同,自编码器的应用目标是表示学习和语言重构,而seq2seq模型的目标是机器翻译,任务转换等。如下图所示,自编码器的模型结构包含左边的编码器部分,在训练的时候一般也要包含右边的解码器部分(右边解码模块每个解码层需要接收左边部分的K,V特征数据),只是在训练时可以理解为解码器的输出是对编码器的输入的重构。而seq2seq模型即包含编码器也包含解码器,而且在训练时输入和输出一般对应着不同的内容,如机器翻译,输入为一种语言,输出为另一种语言。这里以训练一句翻译的样本为例子进行说明,假设我们的输入句子是“Hello, how are you?”,目标翻译句子是“Bonjour, comment ça va ?”。则编码器的输入即为“Hello, how are you?”的词向量嵌入+位置编码组成的输入矩阵,而解码器的输入则为”<sos>Bonjour, comment ça”词向量嵌入+位置编码组成的输入矩阵,输出也会是向量的batch组成,输出的size为目标语言的词汇量,通过softmax可以得出最大可能的输出单词,多个批量向量就组成目标输出句子的output,和ground truth去求loss就能实现反向传播更新参数。具体的loss定义可以参看引文3(输出的序列的t从0到完整序列的多个条件概率连乘的结果最大化,具体的优化计算方法和策略也可以参考引文中的说明)。 References

  • ShuffleNet网络结构介绍-CNN模型系列4

    这篇文章将向大家介绍ShuffleNet网络结构的特点,同样也是问题的形式。 问题1:ShuffleNe网络结构提出了什么新的计算结构?该结构有什么特性,和其他类似结构做一个简要的对比。 回答:ShuffleNet采用了分组卷积的计算方式,分组卷积将特征图的不同通道分成一定数目的group,如分为g组(g为分组数量)。如下图左边所示,分组数为3,此时3个组各自进行普通的卷积操作,组之间的信息是隔离的,为了解决这个问题,下图2和3在第一次分组之后进行了通道之间的shuffle,使得隔离的特征可以进行融合。具体的channel shuffle的实现可以参考引文2,也可以用pytorch中的支持张量运算的permute操作进行实现。depth wise convolution可以理解为分组卷积的一种特殊情况,即分成输入通道数的那么多组数,每一组的通道数为1。 下面将要通过图示的方式向大家展示不同的模型结构的参数量上的差异: 经过分组卷积以及通道shuffle后,ShffleNet的FLOPS比ResNet和RestNext的block结构的FLOPS要小。而且合理的分组后和MobileNet相比较准确率和推理时间都有一定的优势。如下图所示。 ShuffleNet v2版本在模型设计方面在模型精度和模型计算复杂度上面做了更好的权衡,特别是模型计算复杂度不仅仅是FLOPS这样的间接指标(因为影响计算时间的还有内存访问耗时,模型并行程度等)。因此在模型推理效率上,将在目标平台上测量速度作为计算复杂度的直接考量。而且通过实验观察,得出一些模型在设计方面的一些指导原则,如:1、过度分组会增加内存访问(memory access cost),2、过度碎片化的机构会影响模型并行化的程度;3、element-wise操作的性能影响不能忽略等等。 问题:ShuffleNet和MobileNet都是面相移动端的计算,比较它们之间的不同。 回答: ShuffleNet用到了分组卷积,并在1*1卷积中用到了channel Shuffle减少了1*1卷积的计算时间,总体达到了更快的计算,适合于对算力更敏感的移动端边缘AI场景应用中。 References

  • 深度学习中反向传播算法的实现介绍-CNN模型系列3

    反向传播算法是最基础的神经网络优化求解算法,我们一般将神经网络看成是一个高维的复杂的复合函数,而且是非凸的,这里先以一个多层感知机的场景为例进行简要说明,比如当前层的每一个节点的输入是上一层的所有节点输出(组成向量x)和参数权重(向量w)的线性函数g(x)= x*w+b,然后在线性函数结果上再套上一个激活函数复sigma(g(x))。当前层的所有节点就可以看成是有多个这样的复合函数sigma(g1(x)),sigma(g2(x)),….sigma(gn(x))。这些复合函数的结果又是下一层的输入向量,以此逐层forward,最后一层输出结果。神经网络的非凸性表现在,如果在中间某一层改变节点的顺序,并且对应调整其影响到的连接到上一层和下一层节点的参数值,神经网络的输出结果不变,这也就说明神经网络如果存在着极小值,可能会出现多种参数配置情况下都能达到这个极小值。 由于神经网络的非凸性,不能直接通过公式求得函数的导数并等于0来求解方程从而得出最佳参数。而一般采用迭代更新参数的方法,每一次可以求出每个参数的梯度,将沿着梯度的方向更新参数(更新的步长与学习率和梯度本身大小都有关系),会使得loss损失逐渐减小,就好像下山的过程,沿着比较陡峭的山坡去下山所走的步数比较少,求解过程也更快。 由于神经网络的层次结构和神经网络复杂复合函数的特性,提出了反向传播算法,其基于神经网络的结构特性和复合函数求导的链式法则,得出从网络的最后层逐层反向求解相关梯度的方法。具有的梯度信息有两个:1为各层的输入的梯度,在公式中称为delta,2为参数的梯度,在公式中为w的偏导。这些梯度都是从最后一层逐层向前去进行求解的,具体的求解过程可以参考引文3和4,在这里不做重复说明。 原始的反向传播算法只针对的是MLP(多层感知机),也就是基于全连接结构的神经网络,而CNN网络结构中用了好多种不同类型的层(layer,如卷积层,池化层,全连接层等等)。而卷积层由于其连接的稀疏性,权值共享特性,其前向的计算方式和全连接有较大的不同。关于池化层和卷积层的反向传播的实现,可以参考引文1和引文2,特别是引文1中通过一个示例场景说明在卷积层的反向回传中为什么要将参数矩阵旋转180度。 References

  • MobileNet网络结构介绍-CNN模型系列2

    这篇短文向大家简要介绍MobileNet系列的CNN网络结构,也主要以问答的形式来进行,问答反应了作者对这个主题题目的思考和找到问题答案的过程,当然还有更多的问题有待读者提出来,欢迎读者朋友们反馈和一起探讨。 问题1:MobileNet 模型系列的网络结构特征和应用目标(场合)? 回答:MoblieNet顾名思义是面向移动端的深度学习场景,如手机或算力较小的边端智能应用。其中MobileNet V1的模型结构主要采用了Depth wise Convolution取代了传统的CNN卷积进行特征提取。这里简要介绍一下两者的不同,1、一般卷积核的计算特征:在CNN网络结构中,一般在视觉场合的数据以NCHW的形状张量在不同的网络层进行数据的输流动,比如在传统的一个卷积层,其输入为四维张量(N,C_in,H,W),输出为四维张量(N,C_out, H, W)。其中C_in为输入通道,C_out为输出通道,如果卷积核的大小为(3*3),则一个卷积核的参数量为(3*3*C_in),即在3*3大小的特征图(feature map)上对每个通道上的数据进行相关性计算,将计算结果输出到输出特征图上的该卷积核对应的某个通道上。所有卷积核的参数量为(3*3*C_in*C_out)。2、Depwise Separable Convolution,该卷积包含两个步骤,第一步的Depth wise Convolution的计算特征:每个卷积核的参数量只为(3*3),即只与当前自己通道的当前”像素“的周围(包含自己)的9个像素计算相关性,因此输出的通道数和输入的通道数相同,整体参数量为(3*3*C_in),因此参数量少了C_out倍。同时每一个通道的计算量从3*3*C_in下降到3*3,降低了C_in倍。第二步的逐点卷积可以理解卷积核的大小为1*1, 但是会将不同通道上的同一个位置的点进行相关性计算,即一个卷积核的参数量为(1*1*C_in),整个的卷积核的参数量为(1*1*C_in*C_out)。 深度可分离卷积相比标准卷积可以减少 8 到 9 倍的计算量。 问题2:MobileNet模型系列的不同版本分别在前面的版本上做了哪些性能的提升? MobileNetV2仍旧采用了Depwise Separable Convolution来减少计算量,但也有两处重要的改进:1为采用了类似于resnet的重复结构(减少计算量,堆叠在一起可以提升网络的表达能力),缓解了特征退化问题(残差连接)。2为在通道数较少的特征图上取消了ReLU非线性激活层,而采用了线性瓶颈结构,即inverted residual block。即先将低通道数特征图通过1*1卷积上升到高通道数(高通道数采用ReLU或类似的非线性激活函数),然后在高通道数上进行深度可分离卷积然后再通过1*1卷积降低通道数(这时由于通道数较少不采用激活函数)。瓶颈结构(bottleneck)顾名思义就是先将通道数降低然后进行卷积后再还原通道数,类似时间漏斗一样的形状,故此得名。inverted residual block的意思则是反过来的,中间粗上下细的结构。MobileNetv3在之前的版本上继续做了改进,如基于网络结构搜索,和SE(squeeze and excitation)注意力机制,以及特殊的激活函数等,具体可以参考引文2。 References

  • 基于CNN和LSTM的OCR文本识别/语音识别基本原理简介-CNN模型系列1

    在深度学习流行以前,智能化的算法主要依赖传统的统计机器学习算法,这个时候特征工程(feature engineering)就显得特别重要,如何构造好的有区分度的特征成为了机器学习算法性能的关键因素之一。比如早期的基于Haar特征和Adaboost的人脸检测算法,基于HOG特征的人体检测等,都是利用了图像中区域的像素特性构造的人工特征提取算法。特征工程需要相关领域专家去人为设计和构造,针对不同的任务场景很可能要设计不同的特征提取算法,设计及验证过程周期长效率低下门槛比较高。深度学习逐渐流行后,基于CNN的深度网络自动化特征提取方法和深度学习目标任务(网络结构中的head输出)实现了端到端的训练,从而使得算法的设计和实现更加的高效,而且由于深度学习的网络表达能力强大的特性,几乎所有的视觉任务上的性能都超越了传统的基于人为设计的特征工程的传统机器学习算法。 今天向大家介绍的基于深度学习的OCR文本识别也和上面的情况相似,早期的OCR文本识别也是基于手写体或印刷体的文字特征进行人为设计的特征提取算法,整个识别过程流程复杂,不同的阶段需要设计不同的算法去解决相关问题,而基于CNN和LSTM的文本识别算法则在基于大样本的基础上实现了端到端的训练,而且在精度上也达到了更高的水平,也是当前文本识别的关键算法。在该算法过程中,一般是将文本先进行行提取(如基于目标检测的文本行检测算法实现行提取),在提取的文本行的基础上,将文本行对应的图像作为文本识别网路的输入。首先CNN对图像的特征进行提取和建模,然后将特征输入到LSTM网络,LSTM网络对基于文本行的特征进行空间序列建模(可以理解为将长条的文本行切分成一段一段的顺序拼接一起的特征,LSTM基于这个序列顺序进行建模,可以对文本行的当前位置和其前后的位置的关系进行序列建模,关于LSTM的计算实现细节可以参考引文3)。 在实际的数据集中,由于文字的特性不同(有的汉字或字母比较宽,而有的比较窄,甚至汉字或字母之间间隔的宽度在不同的数据集的样本中也不一样,还有空格的个数也不尽相同,以及空格开始或空格的位置也不尽相同。一条文本行的ground truth只有对应的汉字或字母的文本句子,并没有标记每个汉字或字母对应在图像上的位置(否则标记成本太高),因此这里有一个特别的Loss能够简化这种自动对齐的计算,这个Loss称为CTCLoss,其在语音样本和groundtruth以及文本行图像和groundtruth的自动对齐上展示了简易灵活且强大的自动对齐的作用。 CTCLoss计算每一个时刻t下经过s的所有可能的路径的后验概率(首先根据引文7中的Composing the graph部分的规则计算y(s,t), 然后基于y(s,t)采用动态规划的算法分别计算alpha(s,t),beta(s,t)等),最后的loss是所有时刻的的概率和(用log去计算),关于CTCLoss的详细算法原理的介绍可以参考引文7。 基于CNN和LSTM的语音识别的算法原理和上述的OCR文本识别的原理类似,语音样本有长短不同,有停顿时间不同等需要输入和标记(输出)进行动态对齐的功能,CTCLoss同样可以在此处得以较好应用。 References

  • 交大老校区听讲座

    昨天去交大老校区去听了一下午的讲座,这是今年第一次去,恰巧很很高兴碰到了好多年未见得老同事们,感概大家还是老样子,感觉还是那么亲切,老校区的变化也不是很大,感觉也还是挺亲切,傍晚在食堂和听讲座新认识的律师朋友一起吃了碗面,短聊了会天,关于讲座的内容也在这里简要记录一下,仅供大家参考,也以备后需。 这次讲座主要的内容是医疗卫生行业的科技发展及产业转化的现状,学校有附属医院,有大规模的真实病例数据,以及医疗过程数据和相关治疗科技进展,也已经有相关的产业化的推进。这里记录两三个比较有印象的案例。 第一个关于精神类疾病的影像数据及人工智能辅助诊断系统,可以针对不同类别的病人的真实数据收集整理了大量的跨病类的数据集,并通过设计的人工智能算法达到对个体的影像数据进行自动诊断的目的,现有精确度尚可。当然最后的诊断还是以有经验的医生的判断为准; 第二个是基于脑电信号的情感智能以及疾病检测(如癫痫检测)方面的研究及在医疗方面的应用,对脑电信号的不断的精确的解码,专家们也相信以后机器人也将具有喜怒哀乐的情感。对于脑电信号的疾病检测以后也可能会应用到更多的疾病检测上,或者说以后的疾病检测的标记物不仅仅有影像数据,还有体液以及脑电等多模态数据,这样的诊断也会更加全面和精准; 第三个是基于脑机接口的视觉重建等方向,也许以后可以为失明失聪的人带来福音,期待对于这样的残疾人以后也能够有享受人类更多的天伦之乐的机会。 期待医疗行业随着数字化和智能技术的发展走上更加系统和全面科学化的道路,给全人类带来更多的福音,辅以图片以作纪念。感谢组织方的精心准备和可口的小点心。