这里写目录标题
1 TF-IDF 文本挖掘预处理
-
词频-逆文档频率,在单个文章出现越多越重要,在多个文章出现越多越不重要
TF-IDF = TF * IDF
-
TF:词的重要性随着它在文件中出现的次数成正比增加
TF i , j _{i,j} i,j = n i , j n ∗ , j \frac {n_{i,j}} {n_{*,j}} n∗,jni,j
-
IDF:但同时会随着它在语料库中的出现频率成反比下降
IDF i _i i = log( N + 1 N i + 1 \frac {N+1} {N_i+1} Ni+1N+1)
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
corpus=["I come to China to travel",
"This is a car polupar in China",
"I love tea and Apple ",
"The work is to write some papers in science"]
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
re = tfidf2.fit_transform(corpus)
print tfidf
2 word2vec
-
One-hot(独热)
话筒:[000010000]
麦克:[000001000]
局限:词与词之间的关系无法表示 -
SVD
# 优缺点 优点:可以一定程度上得到词与词之间的相似程度 缺点:矩阵太大,SVD矩阵分解效率低,学习得到的词向量可解释性差
-
N-gram语言模型
# 语言模型概念 (无监督) 语言模型是计算一个句子是句子的概率模型。 # 统计语言模型,S表示句子,w表示词 P(S) = P(w1,w2,..,wn) = P(w1)P(w2|w1)P(w3|w1w2)P(wn|w1w2..wn-1) 词频计算:P(w1) = count(w1)/N -N表示词总数 # 一些词或词组在语料中没有出现过,但这不能代表他不可能存在。 ====》平滑操作 平滑操作就是给哪些没有出现过的词或词组也给一个较小的概率 Laplace Smoothing,也称加1平滑 词频计算:P(w1) = count(w1)+1/N+V - V表示去重后的词数 # 例子 平滑操作 A:0 P(A)=0/100 1 P(A)=1/103 B:99 P(B)=99/100 100 P(A)=100/103 c:1 P(C)=1/100 2 P(A)=2/103 # 平滑操作的两个问题 P(s) = P(w1)P(w2|w1)P(w3|w1w2)P(wn|w1w2..wn-1) 如果每句话都计算这个词前面所有词的概率,会导致 1、参数空间过大 2、数据稀疏严重 # 解决方法: N-gram 马尔可夫假设:下一个词的出现仅依赖于前面的一个词或几个词 unigram(1-gram):P(s)=P(w1)P(w2)...P(wn) bigram(2-gram): P(s)=P(w1)P(w2|w1)...P(wn|wn-1) trigram(3-gram):P(s)=P(w1)P(w2|w1)P(w3|w1w2)...P(wn|wn-2wn-1) # 优缺点 优点:简单,可以用在很大规模的语料上 缺点: # 评价指标:困惑度(Perplexity) 句子概率越大,语言模型约好,困惑度越小。
公式:PP(s)= P ( w 1 , w 2 , . . . , w n ) − 1 n P(w1,w2,...,wn)^{-\frac{1}{n}} P(w1,w2,...,wn)−n1 = 1 P ( w 1 , w 2 , . . . , w n ) N \sqrt[N] {\frac{1}{P(w_1,w_2,...,w_n)}} NP(w1,w2,...,wn)1
-
基于神经网络的语言模型 word embedding 分布式表示/稠密表示(distributed/representation)
-
word2vec
对比模型
1、NNLM
# 思想:根据前n-1个单词,预测第n个位置的单词概率 与统计语言模型思路一样,只是引入了神经网络模型 # 输入层 单词one-hot向量 # hidden 层 tanh为激活函数 # 输出层 softmox为激活函数 # softmax 1.得到 0-1之间的数,对数据进行以e为底的指数操作 2.进行归一化 ,分母是所有ek累加 # 模型优化 1.仅对一部分输出进行梯度传播,如the,a 2.引入先验知识,如词性 3.解决一词多义问题 4.加速softmax层
模型公式:
f ( w t , w t − 1 , . . , w t − n + 2 , w t − n + 1 ) = p ( w t ∣ w 1 t − 1 ) f(w_t,w_{t-1},..,w_{t-n+2},w_{t-n+1})=p(w_t|w_1^{t-1}) f(wt,wt−1,..,wt−n+2,wt−n+1)=p(wt∣w1t−1)
损失函数:
l o s s = − 1 T ∑ i = 1 T l o g p ( w i ∣ w i − n + 1 , . . . , w i − 1 ) loss=-\frac{1}{T}\sum^T_{i=1}logp(w_i|w_{i-n+1},...,w_{i-1}) loss=−T1∑i=1Tlogp(wi∣wi−n+1,...,wi−1)
困惑度与loss函数:
PP(s)= P ( w 1 , w 2 , . . . , w n ) − 1 T P(w1,w2,...,wn)^{-\frac{1}{T}} P(w1,w2,...,wn)−T1
l o g ( P P ( s ) ) = − 1 T l o g ( P ( w 1 ) P ( w 2 ∣ w 1 ) . . ) log(PP(s)) = -\frac{1}{T}log(P(w_1)P(w_2|w_1)..) log(PP(s))=−T1log(P(w1)P(w2∣w1)..)
l o g ( P P ( s ) ) = − 1 T ( l o g P ( w 1 ) + l o g P ( w 2 ∣ w 1 ) . . ) log(PP(s)) = -\frac{1}{T}(logP(w_1)+logP(w_2|w_1)..) log(PP(s))=−T1(logP(w1)+logP(w2∣w1)..)
l o g ( P P ( s ) ) = L = = > P P ( s ) = e L log(PP(s)) = L ==> PP(s)= e^L log(PP(s))=L==>PP(s)=eL
2、RNNLM
# 循环神经网络语言模型
每个时间步预测一个词,在预测第n个词时,使用n-1个词的信息
输入层:
同NNLM,转化为词向量
损失函数:
l o s s = − 1 T ∑ i = 1 T l o g p ( w i ∣ w i − n + 1 , . . . , w i − 1 ) loss=-\frac{1}{T}\sum^T_{i=1}logp(w_i|w_{i-n+1},...,w_{i-1}) loss=−T1∑i=1Tlogp(wi∣wi−n+1,...,wi−1)
输出层:
一个全连接层接一个softmax函数生成概率分布。
# 原理
语言模型的基本思想:句子中下一个词的出现和前面的词是有关系的,所以可以使用前面的词预测下一个词
word2vec基本思想:句子中相近的词之间是有联系的,比如今天后面经常出现上午。`基本思想是用词来预测词`
Skip-gram: 使用中心词预测周围词
CBOW: 使用周围词预测中心词
# 词的分布式表示/稠密表示
中心矩阵W
或者
(中心矩阵W+周边词矩阵W*)/2
1、Skip-gram模型
模型公式:
损失函数(求最小值需要加负号):
2、CBOW模型
Word2vec关键技术,优化训练速度
1、层次softmax (Hierarchical softmax)
将 softMax 转换为 多个sigmoid 计算
softMax 需要做V次指数运算,sigmoid 做log_2 V 次指数运算
2、负采样(效果好)
# 原理
当我们用训练样本 ( input word: "fox",output word: "quick") 来训练我们的神经网络时,“ fox”和“quick”都是经过one-hot编码的。如果我们的vocabulary大小为10000时,在输出层,我们期望对应“quick”单词的那个神经元结点输出1,其余9999个都应该输出0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们称为“negative” word。
当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的“positive” word进行权重更新(在我们上面的例子中,这个单词指的是”quick“)。
# 小规模数据集,选择5-20个negative words会比较好
# 大规模数据集可以仅选择2-5个negative words。
原始:隐层-输出层拥有300 x 10000的权重矩阵。
负采样的方法:仅仅去更新positive word-“quick”和其他5个negative words的结点对应的权重,共计6个输出神经元。
相当于每次只更新300*6=1800个权重。这样计算效率就大幅度提高。
# 如何选择negative words
使用“一元模型分布(unigram distribution)”来选择“negative words”。
一个单词被选作negative sample的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words。
# 速度提升: V是词袋数量 100000级别, K是采样数量,5-20
原始:需要做V次指数运算,
sigmoid 做log_2 V 次指数运算
负采样 做 K+1 次指数运算
优点:舍弃多分类,提升速度
选择negative words公式:
每个单词被赋予一个权重,即[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hayUp4qz-1635994897252)(https://www.zhihu.com/equation?tex=f%28w_i%29)], 它代表着单词出现的频次。
3、重采样
`自然语言处理共识`:文档或者数据集中出现频率高的词往往携带信息比较少,如a,the,而出现频率低的词往往携带信息多。
- 重采样的原因:想要更多地训练重要的词对,如:France和paris 比 France和the 之间的关系要有用
- 高频词很快就训练好了,而低频词需要更多轮次
所以需要高频词少采一些,低频词多采一些。
# 重采样分析
词频越大,f(wi)越大,p(wi)越大,那么词 wi 就有更大的概率被删除,反之亦然
优点:加速训练,能够得到更好的词向量
模型复杂度和评价方法
O = E * T *Q
O是训练复杂度 training complexity
E是训练迭代次数 number of the training `epochs` # 训练多少轮
T是数据集大小 number of words in the training set # 每一轮训练多少次
Q是模型计算复杂度 model computational complexity # 训练多长时间
# 词向量的评价方法(cosine/Analogy)
1、cosine
sim(word1,word2) = cos(wordvec1,wordvec2)
3 HMM和CRF模型
# seq2seq
# 隐马尔可夫模型是一个关于时序的概率模型,
它描述了一个由隐藏的马尔可夫链生成状态序列,再由状态序列生成观测序列的过程。 # 状态序列 -> 观测序列
其中,状态之间的转换以及观测序列和状态序列之间都存在一定的概率关系。
# CRF模型 (条件随机场)
与隐马模型类似
与HMM差异:
1、CRF模型没有隐马假设,计算速度慢
2、HMM因为隐含序列只与上一个单元相关,HMM准确率大大降低
# 应用
解决文本序列标注问题,如分词,词性标注,命名实体识别
# 例子
状态序列: 名词 动词 名词
观测序列: 我 爱 你
设共有N个隐藏状态,状态集合为:
设共有M个观测状态,观测集合为:
注:隐藏状态的数目和观测状态的数目不一定相同。
状态序列为:
观测序列为:
1、模型概述(三大要素)
初始状态向量 。模型最开始的时候处于哪状态?这个就靠初始状态向量,它决定了模型在最开始时每个状态的概率。若有N个状态,则初试状态向量的长度为N。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDneLshd-1635994897272)(img/76.png)]
其中:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H47xaV7U-1635994897275)(img/76.png)]表示状态i作为初始状态的概率,所有的概率之和为1.
状态转移概率矩阵A。此矩阵主要描述了不同状态之间的转移概率。由于共有N个状态,则状态转移概率矩阵的大小为N*N。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xD7NTfsm-1635994897277)(img/77.png)]
其中[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJViQrpj-1635994897279)(img/79.png)]:表示状态i直接转移到状态j的概率。并且,状态转移概率矩阵的每一行的概率之和为1.
观测概率矩阵B。表示由状态生成观测的概率。其符号表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1RjkgQx-1635994897281)(img/78.png)]
其中[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A96PjmH9-1635994897283)(img/80.png)]:表示由状态j生成观测k的概率。同样,矩阵的每一行的概率之和为1.
2、三大假设
齐次马尔可夫假设。又叫一阶马尔可夫假设,即任意时刻的状态只依赖前一时刻的状态,与其他时刻无关。符号表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3huxF4ZR-1635994897286)(img/81.png)]
推广:n阶马儿可夫模型:任意时刻的状态只依赖前面n个时刻的状态,与其他时刻无关。
观测独立性假设。任意时刻的观测只依赖于该时刻的状态,与其他状态无关。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XL1THQxb-1635994897290)(img/82.png)]
参数不变性假设。上面介绍的三大要素不随时间的变化而改变,即在整个训练过程中一直保持不变。
3、三大问题
概率计算问题。已知模型参数和观测序列,求给定观测序列出现的概率。
学习问题。已知观测序列,估计模型参数。
预测问题。已知模型参数和观测序列,求观测序列对应的最可能的状态序列。
4 RNN
按照输入和输出的结构进行分类:
-
N vs N - RNN:
它是RNN最基础的结构形式, 最大的特点就是: 输入和输出序列是等长的.
由于这个限制的存在, 使其适用范围比较小, 可用于生成等长度的合辙诗句.
-
N vs 1 - RNN:
有时候我们要处理的问题输入是一个序列,而要求输出是一个单独的值而不是序列,应该怎样建模呢?
我们只要在最后一个隐层输出h上进行线性变换就可以了,大部分情况下,为了更好的明确结果, 还要使用sigmoid或者softmax进行处理. 这种结构经常被应用在文本分类问题上.
-
1 vs N - RNN:
如果输入不是序列而输出为序列的情况怎么处理呢?
我们最常采用的一种方式就是使该输入作用于每次的输出之上. 这种结构可用于将图片生成文字任务等.
-
N vs M - RNN (又叫seq2seq)
这是一种不限输入输出长度的RNN结构, 它由编码器和解码器两部分组成, 两者的内部结构都是某类RNN, 它也被称为seq2seq架构.
输入数据首先通过编码器, 最终输出一个隐含变量c,
之后最常用的做法是使用这个隐含变量c作用在解码器进行解码的每一步上, 以保证输入信息被有效利用.
seq2seq
5 RNN变换
传统RNN
# 优点:
由于内部结构简单, 对计算资源要求低, 相比之后我们要学习的RNN变体:LSTM和GRU模型参数总量少了很多, 在短序列任务上性能和效果都表现优异.
# 缺点:
传统RNN在解决长序列之间的关联时, 通过实践,证明经典RNN表现很差, 原因是在进行反向传播的时候,
过长的序列导致梯度的计算异常, 发生梯度消失或爆炸.
什么是梯度消失或爆炸呢?
根据反向传播算法和链式法则, 梯度的计算可以简化为以下公式:
其中sigmoid的导数值域是固定的, 在[0, 0.25]之间, 而一旦公式中的w也小于1, 那么通过这样的公式连乘后, 最终的梯度就会变得非常非常小, 这种现象称作梯度消失. 反之, 如果我们人为的增大w的值, 使其大于1, 那么连乘够就可能造成梯度过大, 称作梯度爆炸.
梯度消失或爆炸的危害:
如果在训练过程中发生了梯度消失,权重无法被更新,最终导致训练失败; 梯度爆炸所带来的梯度过大,大幅度更新网络参数,在极端情况下,结果会溢出(NaN值)
LSTM
-
经典RNN相比能够有效捕捉长序列之间的语义关联,更长的序列中有更好的表现
-
缓解梯度消失或爆炸现象。
LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, 与同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析:
遗忘门
输入门
输出门
细胞状态
6 注意力机制和自注意力机制(NLP应用)
Attention是从大量信息中有筛选出少量重要信息,并聚焦到这些重要信息上,忽略大多不重要的信息。权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。
Attention机制可以将其归纳为两个过程:
第一个过程是根据Query和Key计算权重系数,第二个过程根据权重系数对Value进行加权求和。
注意力计算规则
它需要三个指定的输入Q(query), K(key), V(value), 然后通过计算公式得到注意力的结果, 这个结果代表query在key和value作用下的注意力表示. 当输入的Q=K=V时, 称作自注意力计算规则.
-
将Q,K进行纵轴拼接, 做一次线性变化, 再使用softmax处理获得结果最后与V做张量乘法.
-
将Q,K进行纵轴拼接, 做一次线性变化后再使用tanh函数激活, 然后再进行内部求和, 最后使用softmax处理获得结果再与V做张量乘法.
-
将Q与K的转置做点积运算, 然后除以一个缩放系数, 再使用softmax处理获得结果最后与V做张量乘法.
为什么要用注意力机制
在Attention诞生之前,已经有CNN和RNN及其变体模型了,那为什么还要引入attention机制?主要有两个方面的原因,如下:
(1)计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。
(2)优化算法的限制:LSTM只能在一定程度上缓解RNN中的长距离依赖问题,且信息“记忆”能力并不高。
attention的优缺点
1.参数少:相比于 CNN、RNN ,其复杂度更小,参数也更少。所以对算力的要求也就更小。
2.速度快:Attention 解决了 RNN及其变体模型 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
3.效果好:在Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。
**缺点:**attention机制不是一个"distance-aware"的,它不能捕捉语序顺序(这里是语序哦,就是元素的顺序)。这在NLP中是比较糟糕的,自然语言的语序是包含太多的信息。
可以通过position Embeding 解决这一缺点。
bmm运算.bmm是一种特殊的张量乘法运算.第一维相同,只做二,三维矩阵运算
# 如果参数 1 形状是 ( b × n × m ), 参数 2 形状是 ( b × m × p ), 则输出为 ( b × n × p )
>>> input = torch.randn ( 10 , 3 , 4 )
>>> mat2 = torch.randn ( 10 , 4 , 5 )
>>> res = torch.bmm ( input , mat2 )
>>> res.size ()
torch.Size ([ 10 , 3 , 5 ])
import torch import torch.nn as nn
import torch.nn.functional as F
class Attn (nn.Module):
def __init__( self , query_size, key_size, value_size1, value_size2, output_size):
"""初始化函数中的参数有5个,
query_size代表query的最后一维大小
key_size代表key的最后一维大小,
value_size1代表value的导数第二维大小, value = (1, value_size1, value_size2)
value_size2代表value的倒数第一维大小,
output_size输出的最后一维大小
"""
super (Attn, self ).__init__()
# 将以下参数传入类中
self .query_size = query_size
self .key_size = key_size
self .value_size1 = value_size1
self .value_size2 = value_size2
self .output_size = output_size
# 初始化注意力机制实现第一步中需要的线性层.
self .attn = nn.Linear( self.query_size + self.key_size, value_size1)
# 初始化注意力机制实现第三步中需要的线性层.
self .attn_combine = nn.Linear( self.query_size + value_size2, output_size)
def forward ( self , Q, K, V):
"""forward函数的输入参数有三个, 分别是Q, K, V, 根据模型训练常识, 输入给Attion机制的 张量一般情况都是三维张量, 因此这里也假设Q, K, V都是三维张量"""
# 第一步, 按照计算规则进行计算,
# 我们采用常见的第一种计算规则
# 将Q,K进行纵轴拼接, 做一次线性变化, 最后使用softmax处理获得结果
attn_weights = F.softmax(
self.attn(torch.cat((Q[ 0 ], K[ 0 ]), 1 )), dim= 1 )
# 然后进行第一步的后半部分, 将得到的权重矩阵与V做矩阵乘法计算,
# 当二者都是三维张量且第一维代表为batch条数时, 则做bmm运算
attn_applied = torch.bmm(attn_weights.unsqueeze( 0 ), V)
# 之后进行第二步, 通过取[0]是用来降维, 根据第一步采用的计算方法,
# 需要将Q与第一步的计算结果再进行拼接
output = torch.cat((Q[ 0 ], attn_applied[ 0 ]), 1 )
# 最后是第三步, 使用线性层作用在第三步的结果上做一个线性变换并扩展维度,得到输出
# 因为要保证输出也是三维张量, 因此使用unsqueeze(0)扩展维度
output = self.attn_combine(output).unsqueeze( 0 )
return output, attn_weights
7 Transformer
Transformer整体架构
Transformer Encoder
Transformer Decoder
Autoregressive(AR,自回归的)
第一个输入会有一个特定的标志,Begin作为输入
由于模型输出的长度不确定,无法人为设定,需要让机器自己学习在什么地方停止,当遇到Eed特殊符号时停止。
通常Begin和End可以设定为同一符号
Non-Autoregressive(NAR,自回归的)
评估:bleu
它的总体思想就是准确率,假如给定标准译文reference,神经网络生成的句子是candidate,句子长度为n,candidate中有m个单词出现在reference,m/n就是bleu的1-gram的计算公式。
BLEU-1衡量的是单词级别的准确性,更高阶的bleu可以衡量句子的流畅性。
bleu的2-gram的计算公式
预测译文(candidate): the cat sat on the mat n = 6
标准译文(reference): the cat is on the mat n = 6
candidate中的5个词,{the cat,cat sat,sat on,on the,the mat} ,
reference中的5个词,{the cat,cat is, is on, on the, the mat},
(candidate in reference)/count(reference) 发现有3个词在reference中,所以占比就是0.6
8 Residual block(残差网络)
残差网络是为了解决深度神经网络(DNN)隐藏层过多时的网络退化问题而提出。
退化(degradation)问题是指:当网络隐藏层变多时,网络的准确度达到饱和然后急剧退化,而且这个退化不是由于过拟合引起的。
# 网络层数增多一般会伴着下面几个问题
1. 计算资源的消耗 # 通过GPU集群来解决
2. 模型容易过拟合 # 通过采集海量数据,并配合Dropout正则化等方法
3. 梯度消失/梯度爆炸问题的产生 # 通过Batch Normalization也可以避免。
但是随着网络层数的增加,网络发生了退化(degradation)的现象:
"注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。"
从信息论的角度讲,由于DPI(数据处理不等式)的存在,在前向传输的过程中,随着层数的加深,Feature Map包含的图像信息会逐层减少,而ResNet的直接映射的加入,保证了 [公式] 层的网络一定比 [公式] 层包含更多的图像信息。
Resnet网络结构图
DenseNet网络结构图
9 GAN网络(生成式对抗网络)
应用领域:图像生成,图像转换,图像编辑。
核心要点:
- 提出了一个基于对抗的新生成式模型,他由一个生成器和一个判别器组成。
- 生成器的目标是学习到样本的数据分布,从而能生成样本欺骗判别器;判别器的目标是判断输入样本是生成还是真实的概率。
- GAN模型等同于博弈论中的二人零和博弈。
- 对于任意的生成器和判别器,都存在一个独特的全局最优解。
- 生成器和判别器都由多层感知机实现,整个网络可以用反向传播算法来训练。
什么是零和博弈:
一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为"零",双方不存在合作的可能
什么是Minmax:
在零和博弈中,为了使己方达到最优解,所以吧目标设为让对方的最大收益最小化。
数据集:1、MNIST 2、TFD 人脸数据集 3、CIFAR-10 10类别彩图
判别式模型(D)
- 模型学习的是条件概率:P(Y|X)
- 任务是从属性X(特征)预测标记Y(类别)
- 模型:线性回归,逻辑回归,KNN,SVM,决策树,CRF,boosting
生成式模型(G)
- 模型学习的是联合概率:P(X,Y)
- 任务是得到属性为X且类别为Y时的联合概率
- 模型:朴素贝叶斯,混合高斯,HMM,贝叶斯网络,马尔可夫随机场,深度信念网络(DBN),变分自编码器
变分自编码器(VAE)
-
编码器
把数据编码成mean vector 和 standard deviation vector
-
采样
从构建的高斯分布中采样得到 latent vector
-
解码器
从 latent vector生成数据
VAE是从编码器生成的高斯分布中进行随机采样。
GAN是从随机噪声分布中进行随机采样。
GAN网络
价值函数
式子左:
- D的目标,最大化价值函数V
- 最大化V就是最大化D(x) 和 1-D(G(z))
- 对于任意x,都有D(x)=1 ; 对于任意z,都有D(G(z)) = 0
- G的目标,针对特定D,最小化价值函数V
- 最小化V就是最小化D(x) 和 1-D(G(z))
- 对于任意z,都有D(G(z)) = 1
式子右:
- Data:真实数据
- D:判别器,输入值为[0,1],代表输入来自真实数据的概率
- z:随机噪声
- G:生成器,输出为合成数据
训练方式
固定G,训练D,训练 k 次,固定D,训练G , 训练1次
- 使用mini-batch梯度下降(带momentum)
- 训练 k 次判别器
- 训练1词生成器
优缺点
缺点:
- 没有显式表示的 P g ( X ) P_g(X) Pg(X)
- 必须同步训练G和D,可能会发生模式崩溃
优点:
- 不使用马尔可夫链,在学习过程中不需要推理
- 可以将多种函数合并到模型中
- 可以表示非常尖锐、甚至退化的分布
- 不是直接使用数据来计算loss更新生成器,而是使用判别器的梯度,所以数据不会直接复制到生成器的参数中。
模式崩溃:
马尔可夫链
10 DCNN
AlexNet
-
AlexNet由5层卷积层、最大池化层、dropout层和3层全连接层组成;
-
ReLU非线性激活函数,成功使用Relu作为CNN的激活函数,并验证其效果在较深的网络中超过了sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题;
-
提出了LRN(局部响应归一化层),对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其它反馈较小的神经元,增强了模型的泛化能力;
-
使用数据增强技术包括图像转换,水平反射和补丁提取;
-
利用dropout方法解决过拟合问题;
-
在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化。且提出了让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性;
-
使用批量随机梯度下降训练模型,使用特定的动量和权重衰减;
-
使用CUDA加速深度学习神经网络训练
LRN(局部响应归一化层)
VGG Net
-
最深的是19层卷积层,表现最好的是16层网络(后三个block各少一层conv3),卷积核尺寸为3×3,步长为1,最大池化层尺寸为2×2,步长为2;
-
将AlexNet模型中5×5卷积核替换为3×3卷积核。两个3×3的conv层=一个5×5的有效感受野。三个3×3的conv层=7×7的有效感受野。用小尺寸卷积核模拟大尺寸的卷积核,减少卷积核参数数量。
-
随着每层输入volume的空间尺寸减小(conv和pool层的结果),volume的深度会随着卷积核数量的增加而增加。每经过一次maxpolling层后,输出的深度翻倍。
-
在训练过程中使用比例抖动数据增强技术。
-
在每个conv层之后使用ReLU激活函数,使用批梯度下降优化算法进行训练。
Google Inception Net (Inception V1-V4)
-
在整个架构中使用了9个Inception模块,具有22个conv层,总共超过100层。 没有使用全连接层,使用的是averge polling,从7×7×1024的volume变成1×1×1024的volume,这减少了大量参数;;
-
应用了1×1卷积提供了降维的方法。减小volume的深度,这可以被认为是“特征汇集”,类似于使用普通的maxpolling层来减小高度和宽度的尺寸。
-
由于第一层中往往含有大量的高频和低频信息,却没有覆盖到中间的频率信息,如果步长过大,则容易引起大量的信息混叠,因此卷积核的尺寸和步长都要尽量小;
1*1卷积的作用:
- 在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。
- 使用1x1卷积进行降维,降低了计算复杂度。
网络对输入做了4个分支,分别用不同尺寸的filter进行卷积或池化,最后再在特征维度上拼接到一起。
这种全新的结构有什么好处呢?
- 在直观感觉上在多个尺度上同时进行卷积,能提取到不同尺度的特征。特征更为丰富也意味着最后分类判断时更加准确。
- 利用稀疏矩阵分解成密集矩阵计算的原理来加快收敛速度。
- Hebbin赫布原理。
Inception V1
点评:构建了1x1、3x3、5x5的 conv 和3x3的 pooling 的分支网络,同时使用 MLPConv 和全局平均池化,扩宽卷积层网络宽度,增加了网络对尺度的适应性;
Inception V2
点评:提出了 Batch Normalization,代替 Dropout 和 LRN,其正则化的效果让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高,同时学习 VGG 使用两个3´3的卷积核代替5´5的卷积核,在降低参数量同时提高网络学习能力;
Inception V3
- 引入了 Factorization,将一个较大的二维卷积拆成两个较小的一维卷积,比如将3´3卷积拆成1´3卷积和3´1卷积,一方面节约了大量参数,加速运算并减轻了过拟合,同时增加了一层非线性扩展模型表达能力;
- Inception V3 优化了 Inception Module 的结构,现在 Inception Module 有35´35、17´17和8´8三种不同结构。这些 Inception Module 只在网络的后部出现,前部还是普通的卷积层。并且 Inception V3 除了在 Inception Module 中使用分支,还在分支中使用了分支(8´8的结构中),可以说是Network In Network In Network。
Inception V4
- Inception V4 相比 V3 主要是结合了微软的 ResNet;
- 引入了专用的「缩减块」(reduction block),它被用于改变网格的宽度和高度。早期的版本并没有明确使用缩减块,但也实现了其功能。
ResNet
- 152层的结构,极度深寒(Ultra-deep);
- 发明了残差结构Residual network。主要是在 plain network上加入 shortcut connections,允许原始输入信息直接传递到后面的层中,构成一个残差单元,这样相当于改变了学习目标,学习的不再是一个完整的输出,而是输出与输入的差。
- 一个有意思的特点是,最初两层处理后,输入图像的空间尺寸由224224压缩至5656
- 作者声明若在平层网络plain nets中随意增加层数会导致训练计算量以及错误率上升;
- 研究团队曾尝试使用1202层网络架构,结果精确度反而降低了,推测原因是过拟合。
DenseNet
借鉴了ResNet及Inception的思想,使用了全新的结构,使用DenseBlock将所有的层都连起来了。
总的来DenseNet的效果比Resnet稍好,而且参数数量下降许多,但densenet在训练时会消耗更多的内存。
总结
我们可以看到模型发展有以下趋势:
卷积核方面:
- 大卷积核用多个小卷积核代替;
- 单一尺寸卷积核用多尺寸卷积核代替;
- 固定形状卷积核趋于使用可变形卷积核;
- 使用1×1卷积核(bottleneck结构)。
卷积层通道方面:
- 标准卷积用depthwise卷积代替;
- 使用分组卷积;
- 分组卷积前使用channel shuffle;
- 通道加权计算。
卷积层连接方面:
- 使用skip connection,让模型更深;
- densely connection,使每一层都融合上其它层的特征输出(DenseNet)
11 CRNN(OCR文字识别)
常用文字识别算法主要有两个框架:
CNN+RNN+CTC(CRNN+CTC)
CNN+Seq2Seq+Attention
整个CRNN网络结构包含三部分,从下到上依次为:
- CNN(卷积层),使用深度CNN,对输入图像提取特征,得到特征图;
- RNN(循环层),使用双向RNN(BLSTM)对特征序列进行预测,对序列中的每个特征向量进行学习,并输出预测标签(真实值)分布;
- CTC loss(转录层),使用 CTC 损失,把从循环层获取的一系列标签分布转换成最终的标签序列。
Beam Search:预测使用
CTC:训练使用
CRNN结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DkPSVo2a-1635994897375)(img/122.png)]
CNN 内部详解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqUEpS1u-1635994897378)(img/120.png)]
# 灰度图(32,160,1) =》 cnn提取特征 =》 特征图(1,40,512) =》 map-to-seq =》 特征向量序列(512,40)
特征向量序列中每个向量关联一个感受野。
RNN部分使用的是双向的LSTM:
因为基于图像序列中,两个方向的上下文是相互有用且互补的。LSTM相比于RNN更不容易梯度爆炸/消失。
CTC 转录层
使用CTC的损失来对CNN和RNN进行端到端的联合训练。
CTC(Connectionist Temporal Classification)是一种避开输入与输出手动对齐的一种方式,是非常适合语音识别或OCR这种应用的。
TC算法
给定输入序列 X = [ x 1 , x 2 , . . , x T ] X = [x_1,x_2,..,x_T] X=[x1,x2,..,xT],以及对应的标签数据 Y = [ y 1 , y 2 , . . , y U ] Y=[y_1,y_2,..,y_U] Y=[y1,y2,..,yU],例如语音识别中的音频文件和文本文件。我们的工作是找到 X 到 Y 的一个映射,这种对时序数据进行分类的算法叫做时序分类(Temporal Classification)。
对比传统的分类方法,时序分类有如下难点:
- X 和 Y 的长度都是变化的;
- X 和 Y 的长度是不相等的;
- 对于一个端到端的模型,我们并不希望手动设计X 和 Y 的之间的对齐。
CTC算法原理
CTC序列合并机制
我们以“-”符号代表blank,RNN 输出序列时,在文本标签中的重复的字符之间插入一个“-”,比如输出序列为“bbooo-ookk”,则最后将被映射为“book”,即有blank字符隔开的话,连续相同字符就不进行合并。
即对字符序列先删除连续重复字符,然后从路径中删除所有“-”字符,这个称为解码过程,而编码则是由神经网络来实现。引入blank机制,我们就可以很好地解决重复字符的问题。
相同的文本标签可以有多个不同的字符对齐组合,例如,“aa-b”和“aabb”以及“-abb”都代表相同的文本(“ab”),但是与图像的对齐方式不同。更总结地说,一个文本标签存在一条或多条的路径。
CTC训练阶段
如上图,对于最简单的时序为 2 的字符识别,有两个时间步长(t0,t1)和三个可能的字符为“a”,“b”和“-”,我们得到两个概率分布向量,如果采取最大概率路径解码的方法,则“–”的概率最大,即真实字符为空的概率为0.6*0.6=0.36。
但是为字符“a”的情况有多种对齐组合,“aa”, “a-“和“-a”都是代表“a”,所以,输出“a”的概率应该为三种之和:
0.4 * 0.4 + 0.4 * 0.6 + 0.6 * 0.4 = 0.16 + 0.24 + 0.24 = 0.64
所以“a”的概率比空“”的概率高!如果标签文本为“a”,则通过计算图像中为“a”的所有可能的对齐组合(或者路径)的分数之和来计算损失函数。
对于一个给定的输入序列X,CTC给出所有可能的Y的输出分布。根据这个分布,我们可以输出最可能的结果或者给出某个输出的概率。
损失函数:给定输入序列 X,我们希望最大化Y 的后验概率 P(Y|X),P(Y|X)应该是可导的,这样我们能执行梯度下降算法;
测试:给定一个训练好的模型和输入序列 X,我们希望输出概率最高的Y:
当然,在测试时,我们希望 Y* 能够尽快的被搜索到。
类似普通的分类,CTC的损失函数O定义为负的最大似然,为了计算方便,对似然取对数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7EM7ogP-1635994897387)(img/125.png)]
CTC测试阶段
比如上面这个图,有5个时间步,字符类别有“a”, “b” and “-” (blank),对于每个时间步的概率分布,我们都取分数最大的字符,所以得到序列路径“aaa-b”,先移除相邻重复的字符得到“a-b”,然后去除blank字符得到最终结果:“ab”。
使用Beam Search算法预测。
传统OCR(使用CNN和DCNN)
实现原理:通过字符检测将每一个字符检测出来,进行分类
缺点:1、依赖高精度的字符检测模型 2、需要将检测出的字符从原图中裁剪出来
研究成果
- 支持端到端训练
- 支持任意长度字符序列,且不需要字符分割、水平尺度归一化
- 支持无预定义词典识别,且在预定义词典、无预定义词典上都取得显著性能
- 模型更轻量级
Beam Search算法(集束搜索)
贪心搜索,即每一个时间步都取出一个条件概率最大的输出
beam search是对贪心策略一个改进。思路也很简单,就是稍微放宽一些考察的范围。在每一个时间步,不再只保留当前分数最高的1个输出,而是保留num_beams个。当num_beams=1时集束搜索就退化成了贪心搜索。
num_beams=2,如下图
- 在第一个时间步,A和C是最优的两个,因此得到了两个结果
[A],[C]
,其他三个就被抛弃了; - 第二步会基于这两个结果继续进行生成,在A这个分支可以得到5个候选人,
[AA],[AB],[AC],[AD],[AE]
,C也同理得到5个,此时会对这10个进行统一排名,再保留最优的两个,即图中的[AB]
和[CE]
; - 第三步同理,也会从新的10个候选人里再保留最好的两个,最后得到了
[ABD],[CED]
两个结果。
12 RCNN(目标检测)
基于region proposal的RCNN系列RCNN、Fast RCNN、Faster RCNN
基于区域划分的YOLO、SSD
基于强化学习的AttentionNet等
Selective Search
实现思路:
- 首先通过基于图的图像分割方法初始化原始区域,就是将图像分割成很多很多的小块。
- 然后我们使用贪心策略,计算每两个相邻的区域的相似度,然后每次合并最相似的两块,直到最终只剩下一块完整的图片。
- 然后这其中每次产生的图像块包括合并的图像块我们都保存下来,这样就得到图像的分层表示了呢。
保持多样性的策略
为了尽最大可能去分割所有情景的图片我们得保持特征的多样性啊,该文章主要通过两种方式保持特征多样性,一方面是通过色彩空间变换,将原始色彩空间转换到多达八中的色彩空间。然后通过多样性的距离计算方式,综合颜色、纹理等所有的特征。
距离计算方式
距离计算方式需要满足两个条件:
- 其一速度得快啊,因为毕竟我们这么多的区域建议还有这么多的多样性。
- 其二是合并后的特征要好计算,因为我们通过贪心算法合并区域,如果每次都需要重新计算距离,这个计算量就大太多了。
-
颜色距离
对各个通道计算颜色直方图,然后取各个对应bins的直方图最小值。这样做的话两个区域合并后的直方图也很好计算,直接通过直方图大小加权区域大小然后除以总区域大小就好了。
-
纹理距离
纹理距离计算方式和颜色距离几乎一样,我们计算每个区域的快速sift特征,其中方向个数为8,3个通道,每个通道bins为10,对于每幅图像得到240维的纹理直方图,然后通过上式计算距离。
-
优先合并小的区域
如果仅仅是通过颜色和纹理特征合并的话,很容易使得合并后的区域不断吞并周围的区域,后果就是多尺度只应用在了那个局部,而不是全局的多尺度。因此我们给小的区域更多的权重,这样保证在图像每个位置都是多尺度的在合并。
-
区域的合适度度距离
不仅要考虑每个区域特征的吻合程度,区域的吻合度也是重要的,吻合度的意思是合并后的区域要尽量规范,不能合并后出现断崖的区域,这样明显不符合常识,体现出来就是区域的外接矩形的重合面积要大。因此区域的合适度距离定义为:
-
综合各种距离
现在各种距离都计算出来,我们要做的就是整合这些距离,通过多种策略去得到区域建议,
-
参数初始化多样性
我们基于基于图的图像分割得到初始区域,而这个初始区域对于最终的影响是很大的,因此我们通过多种参数初始化图像分割,也算是扩充了多样性。
13 异常检测
什么是异常检测(单分类)?
异常检测:实现将异常样本从正常样本中的区分
任务特点:正常样本多,异常样本少,无法使用监督型学习方法,可以看做是单分类问题。
自我表征(self-representation)
非监督学习,根据图像重建误差判断正常或异常。
常见模型结构:自编码器,将图像压缩重建
特点:
- 自编码器是数据相关
- 自编码器是有损的
- 自编码器是从数据样本中自动学习的
ALOCC模型
输入是加噪后的样本,经过降噪自编码器,正常样本降噪后更加清晰,分数更高,异常样本会更模糊,分数会更低。
降噪自编码器没有采用Pooling下采样,仅含卷积与反卷积,Encoder中采用了lrelu激活函数,Dncoder中采用了relu激活函数,同时所有卷积层都用了BN来增强稳定性。
-
降噪自编码器作为R(G),
-
CNN作为D(D)采用类似于GAN的对抗训练策略
-
降噪自编码器有助于提升正样本重建能力,降低异常样本重建能力
-
最早实现端到端的单分类异常检测算法之一
-
采用对抗学习训练方式训练模型,G与D都得以保留,效率更高
-
降噪自编码器在异常检测领域的应用
14 YOLO V3
目标检测的三种思路:
`Anchor base`先生成所有Anchor(锚框),再进行位置的精确
1、双阶段目标检测(two-stage):
第一级网络用于`候选区域提取`;第二级网络对提取的候选区域`进行分类和精确坐标回归`,例如RCNN系列
2、单阶段目标检测(one-stage):
废弃了候选区域提取这一步骤,只用一级网络就完成了`分类和回归`两个任务,例如YOLO和SSD等
`Anchor Free`
取消Anchor(锚框)机制,速度更快,例如CornerNet,FSAF、FCOS
YOLO原理:
1、一次性输出所检测到的目标信息,包括类别和位置
2、一个区域浓缩为一个多维度的点(1*1*N)
3、每个1*1点生成3个锚框anchor(或其他值)
4、综合所有锚框(上万个),与标签进行比较计算loss