m4
1、nlp数据增强
同义词替换:就是在文本中随机抽取一个单词,然后再同义词库里将其替换为同义词
词嵌入替换:采取已经预训练好的单词嵌入向量,将嵌入空间中最近的邻接词作为句子中某些单词的替换。
基于TF-IDF的单词替换:TF-IDF得分低的单词是没有信息量的的词,因此可以替换,不大影响句子的原本含义
反向翻译:先将句子翻译成另一种语言,比如,英语翻译成法语。然后再翻译回原来的语言,也就是将法语翻译回英语,将新的句子作为增强文本,还可以一次使用多种语言进行反向翻译,产生更多的变体。
文本形式转换:将原本形式转换为缩写,反之亦然,如it is 转成it‘s
随机噪声注入:顾名思义,也就是在文本中注入噪声,来训练模型对扰动的鲁棒性。比如,拼写错误、句子语序调换、插入空格、随机插入一个词、随机交换词语顺序、随机删除一个词
语法树:利用语法规则进行转换,生成新句子。比如,将句子的主动语气转换为被动语气,反之亦然。
详细:https://baijiahao.baidu.com/s?id=1670817254623697562&wfr=spider&for=pc
3、resnet
在ResNet提出之前,所有的神经网络都是通过卷积层和池化层的叠加组成的。
人们认为卷积层和池化层的层数越多,获取到的图片特征信息越全,学习效果也就越好。但是在实际的试验中发现,随着卷积层和池化层的叠加,不但没有出现学习效果越来越好的情况,反而两种问题:梯度消失和梯度爆炸,退化问题(随着层数的增加,预测效果反而越来越差。)为了解决梯度消失或梯度爆炸问题,ResNet论文提出通过数据的预处理以及在网络中使用 BN(Batch Normalization)层来解决。为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为 残差网络 (ResNets)。ResNet论文提出了 residual结构(残差结构)来减轻退化问题
4、感受野
感受野(Receptive Field)的定义:卷积神经网络每一层输出的特征图(feature map)上的像素点映射回输入图像上的区域大小。通俗点的解释是,特征图上一点,能看到输入图像多大的区域。通过的卷积层越多(即网络的加深),感受野会越来越大。小尺寸的卷积代替大尺寸的卷积(例如:3 个 3 x 3 的卷积层的叠加可以替代7*7的卷积),可减少网络参数、增加网络深度、扩大感受野,网络深度越深感受野越大性能越好
举例:若输入图像的尺寸大小是5*5,经过两次3*3的卷积核(其中stride=1,padding=0)后,其感受野大小为5*5,如下图所示:
详细:https://zhuanlan.zhihu.com/p/394917827
4、神经网络参数都初始化为0
就会出现同一隐藏层所有神经元的输出都一致,对于后期不同的batch,每一隐藏层的权重都能得到更新,但是存在每一隐藏层的神经元权重都是一致的,多个隐藏神经元的作用就如同1个神经元
5、多任务学习
用一个模型去做多个任务,通常将多任务学习方法分为:hard parameter sharing和soft parameter sharing
hard parameter sharing:无论最后有多少个任务,底层参数统一共享,顶层参数各个模型各自独立。由于对于大部分参数进行了共享,模型的过拟合概率会降低,共享的参数越多,过拟合几率越小,共享的参数越少,越趋近于单个任务学习分别学习。
现代研究重点倾向的方法:soft parameter sharing:
图3 引用谷歌MMOE模型图
底层共享一部分参数,自己还有独特的一部分参数不共享;顶层有自己的参数。底层共享的、不共享的参数如何融合到一起送到顶层,也就是研究人员们关注的重点。这里可以放上咱们经典的MMOE模型结构(图3),大家也就一目了然了。和最左边(a)的hard sharing相比,(b)和(c)都是先对Expert0-2(每个expert理解为一个隐层神经网络就可以了)进行加权求和之后再送入Tower A和B(还是一个隐层神经网络),通过Gate(还是一个隐藏层)来决定到底加权是多少。
详细:https://zhuanlan.zhihu.com/p/348873723
6、LSTM+CRF的优势
序列标注问题本质上是分类问题,因为其具有序列特征,所以LSTM就很合适,但是 lstm 学习不到 状态 序列的依赖关系,也就是说这样使用LSTM无法对标签(状态)转移关系进行建模。而标签转移关系对序列标注任务来说是很重要的,所以就在LSTM的基础上引入CRF。
7、梯度爆炸和梯度消失
神经网络在计算梯度时,根据链式法则,会出现对激活函数的求导项,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。
解决方案
【方案1—梯度剪切】
思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
【方案2—权重正则化】
比较常见的是l 1正则,和l 2 l2正则,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。
【方案3—relu、leakrelu、elu等激活函数】
Relu:思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,使用它计算方便,计算速度快,但是也存在一些缺点:由于负数部分恒为0,会导致一些神经元无法激活
leakrelu:leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:l e a k r e l u = m a x ( k ∗ x , x ) ,其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来
elu:elu激活函数也是为了解决relu的0区间带来的影响,但是elu相对于leakrelu来说,计算要更耗时间一些
【方案4—batchnorm】
【方案5—残差结构】
加入残差机制能够无损的传播梯度
【方案6—lstm】
LSTM全称是长短期记忆网络,是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”
9、1*1卷积
调节通道数:1*1卷积并不会改变 height 和 width,改变的只是channel这一个维度的大小而已。
增加非线性:可以在保持特征图尺度不变的的前提下大幅增加非线性特性(利用后接的非线性激活函数如ReLU)。非线性允许网络学习更复杂的功能,并且使得整个网络能够进一步加深。
减少参数:特征图少了,参数也自然跟着就减少,相当于压缩特征图,二次提取特征。
10、Vision Transformer
Vision Transformer将CV和NLP领域知识结合起来,对原始图片进行分块,然后对每个图片块展平成一维向量,再拼成序列,输入进原始Transformer模型的编码器Encoder部分,最后接入一个全连接层对图片进行分类。
详细:https://blog.csdn.net/weixin_44106928/article/details/110268312
11、Lattice LSTM
中文命名实体识别 NER 主要有 Character-based (基于字符) 方法和 Word-based (基于单词) 方法:基于单词的方法首先会利用分词模型对句子分词,然后把分好的单词序列传递到 NER 模型中预测实体。基于字符的方法不对句子分词,每一个 token 就是一个汉字,直接将 token 序列传递到 NER 模型预测实体。但是这两种方法都存在一些问题:
· 基于字符的方法不能利用词汇和词汇序列的信息,而这些信息对于实体识别通常很重要。
· 基于单词的方法需要经过分词模型,分词中产生的错误会传递到 NER 模型中。分词的错误会导致 NER 模型出错。
Lattice LSTM 在 Char-LSTM 的基础上增加了 word-base cell ,这是针对中文NER任务引入词汇信息(词汇增强)的开篇之作。字符的向量是通过字符embedding得到,词向量是通过词embedding得到,字符串序列中有多少个词(通过和外部的一个词典匹配,比如以“市”结尾的那些个单词在词典里有没有)就有多少个word-base cell,这个word cell接受该词(南京市)的首字(南)LSTM单元输出的Hidden State和Cell State以及自己词的词向量,得到 word-base 的 cell state 后,Lattice 会融合到 Char-LSTM 的 cell state 上,融合的方法是将字符a的候选 state 和以字符a为结尾的所有word cell state进行加权求和,这个word-base cell 没有输出门,因为 CRF 层接受的还是char cell 输出的 h 。
详细:https://blog.csdn.net/weixin_33006121/article/details/112667434?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
12、FLAT
由于Lattice-LSTM引入词汇信息是有损的,每个字符只能获取以它为结尾的词汇信息。如对于「药」,并无法获得‘inside’的「人和药店」信息。同时 lattice 结构也不能充分进行GPU并行。为解决计算效率低下、引入词汇信息有损的这两个问题,FLAT基于Transformer结构进行了两大改进:
改进1:使用transformer结构的encoder来替代 lstm,encoder的输出结果传给 crf 。论文将与词典匹配到的所有词汇直接添加到了整句话的最后,这样FLAT可以直接建模字符与所有匹配的词汇信息间的交互了,例如,字符[药]可以匹配词汇[人和药店]和[药店]。在计算self-attention的时候,就可以利用transformer的全局注意力机制,获取增强词汇的信息,将词汇信息更加充分的融合到模型当中。
改进2:对于NER任务来说,位置和方向信息都是十分重要的。下图中,在「Inc.」前的单词更可能的实体类型是「ORG」,在「in」后的单词更可能为时间或地点。对于方向性的感知会帮助单词识别其邻居是否构成一个连续的实体Span。
由于原生Transformer用绝对位置编码计算出来的attention score没有方向性,因此引入相对位置编码计算attention score,对于每一个字符和词汇都构建两个head position 和tail position,在计算词(字符)i 和词 j 的attention score时,通过head 和 tail 计算出4个相对距离:
然后利用之前transformer的位置向量计算方法把4个相对距离装换成4个相对向量,然后把4 个向量做拼接,然后通过1层神经网络映射为1个数字Rij,下图中的 d 就是相对距离:
然后结合这个词的输入词向量,并引入2个可训练的权重 u 和 v,计算出A*:
然后通过softmax得到 attention score,最后再与v向量做加权求和得到每个字符的z向量,下图中把A换成A*:
通过encoder后,把每个字符的输出传给crf层,注意只要字符,不要词
详细:https://zhuanlan.zhihu.com/p/362349210
https://arxiv.org/pdf/2004.11795.pdf
https://blog.csdn.net/qq_27590277/article/details/111087735?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-111087735-blog-114262995.pc_relevant_aa&spm=1001.2101.3001.4242.1&utm_relevant_index=3
13、调参
(1)参数初始化
下面的n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5
uniform均匀分布初始化: w =np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)
He初始化,适用于ReLU:scale = np.sqrt(6/n)
normal高斯分布初始化: w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0
(2)数据预处理
bn,减均值/标准差
(3)模型设计
梯度裁剪: 限制梯度阈值,如果超过了阈值,就截断
dropout:0.3 0.5 0.7,一般设为0.5,小数据上dropout+sgd在大部分实验中,效果提升都非常明显。
优化算法中的adam,adadelta等,在小数据上,这里实验的效果不如sgd。 对于大数据集,可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练。
激活函数:尽量不要用sigmoid,可以relu的激活函数。
embdding size,128,256。
batch size,一般从128左右开始调整
尽量对数据做shuffle
LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果。
learning rate: 1 0.1 0.01 0.001,一般从1开始尝试。学习率一般要随着训练进行衰减,建议使用自适应梯度的办法,例如adam,adadelta,rmsprop等,这些一般使用相关论文提供的默认值即可,可以避免再费劲调节学习率,如果人工调的话,隔一段时间,如果cost没有下降,就对学习率减半。对RNN来说,如果RNN要处理的序列比较长,或者RNN层数比较多,那么learning rate一般小一些比较好,否则有可能出现结果不收敛,甚至Nan等问题。
每层结点数: 16 32 128
Loss设计要合理。一般来说分类就是Softmax,回归就是L2的loss。
观察loss胜于观察准确率。准确率虽然是评测指标,但是训练过程中还是要注意loss的。有些情况下,准确率是突变的,原来一直是0,可能保持上千迭代,然后突然变1。而loss是不会有这么诡异的情况发生的,毕竟优化目标是loss。
filter数量2^n
刚开始,先上小规模数据,模型往大了放,只要不爆显存,能用256个filter你就别用128个。直接奔着过拟合去。一般在小数据集上合适的参数,在大数据集上效果也不会太差。
underfitting: 增加网络的复杂度(深度),增加网络的非线性度。
overfitting: 丰富数据,增加网络的稀疏度,降低网络的复杂度(深度),L1 regularization,L2 regulariztion,添加Dropout,Early stopping,适当降低Learning rate,适当减少epoch的次数
14、模型蒸馏
模型蒸馏是一种模型压缩的方法,就是用小模型去学习大模型的预测结果,而不是直接学习训练集中的label。在蒸馏的过程中,我们将原始大模型称为教师模型(teacher),新的小模型称为学生模型(student),训练集中的标签称为hard label,教师模型预测的概率输出为soft label,蒸馏这个概念之所以work,核心思想是因为好模型的目标不是拟合训练数据,而是学习如何泛化到新的数据。所以蒸馏的目标是让学生模型学习到教师模型的泛化能力,理论上得到的结果会比单纯拟合训练数据的学生模型要好。
有两种使用模型蒸馏压缩 BERT 的算法,第一种是 DistilBERT,将 12 层的 BERT-base 模型蒸馏到 6 层的 BERT 模型;第二种是将 BERT 模型蒸馏到 BiLSTM 模型。
(1):
DistilBERT 最终的损失函数由 KL 散度 (蒸馏损失) 和 MLM (遮蔽语言建模) 损失两部分线性组合得到。
KL 散度中,q 表示 student 模型的分布,而 p 表示 teacher 模型输出的分布,公式如下:
DistilBERT 移除了 BERT 模型的 token 类型 embedding 和 NSP (下一句预测任务),保留了 BERT 的其他机制,然后把 BERT 的层数减少为原来的 1/2。
(2)将 BERT 蒸馏到 BiLSTM:
teacher 模型是 BERT,而 student 模型是 BiLSTM。文章提出了两种模型,其中一个是针对单个句子的分类;另一个是针对两个句子做匹配。
上图是第一种 BiLSTM 模型,用于单个句子的分类,将句子的所有单词的词向量输入一个 BiLSTM,然后将前向和后向 LSTM 的隐藏层向量拼接在一起,传入全连接网络中进行分类。
上面是第二种 BiLSTM 模型,用于两个句子的匹配,两个 BiLSTM 输出的隐藏向量分别为 h1 和 h2,则需要用将两个向量拼接在一起,再进行分类。
将 BERT 蒸馏到 BiLSTM 模型,使用的损失函数包含两个部分:一部分是 hard target,直接使用 one-hot 类别与 BiLSTM 输出的概率值计算交叉熵。一部分是 soft target,使用 teacher 模型 (BERT) 输出的概率值与 BiLSTM 输出的概率值计算均方误差 MSE
15、CV的注意力机制模块有 SENet、CBAM
【SENet】
通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。SENet 构造非常简单,而且很容易被部署,不需要引入新的函数或者层。除此之外,它还在模型和计算复杂度上具有良好的特性。
一个SEblock的过程分为 Squeeze(压缩) 和 Excitation(激发) 两个步骤:
Squeeze(压缩) :通过在Feature Map层上执行Global Average Pooling,得到当前Feature Map的全局压缩特征量,此时长宽都被压缩成1*1了,厚度没变;
Excitation(激发) :两个 Fully Connected 层组成一个 Bottleneck 结构,即先将特征维度降低到输入的 1/16,然后经过 ReLu 激活后再通过一个 Fully Connected 层升回到原来的维度。这样做比直接用一个 Fully Connected 层的好处在于:1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;2)极大地减少了参数量和计算量。然后通过一个 Sigmoid 的门获得 0~1 之间归一化的权重,这就是Feature Map中每个通道的权值,最后将权重加权到每个通道的特征上。
下图是将 SE 嵌入到 ResNet 模块中:
【CBAM】
提出CBAM的作者主要对分类网络和目标检测网络进行了实验,证明了CBAM模块确实是有效的。
主要网络架构也很简单,一个是通道注意力模块,另一个是空间注意力模块,分别在通道和空间维度上学习关注什么、在哪里关注,最后集成了通道注意力模块和空间注意力模块。
通道注意力机制:
将输入的特征图,分别经过global max pooling 和global average pooling,平均值池化对特征图上的每一个像素点都有反馈,而最大值池化在进行梯度反向传播计算时,只有特征图中响应最大的地方有梯度的反馈,再分别通过Shared MLP,MLP中第一层有较少的1*1卷积核,将输入的厚度降低(channel降低,w,h不变),再通过ReLU激活函数,然后再通过较多的1*1卷积核,将厚度channel还原,然后二者相加再通过一个sigmoid函数,shape是1*1*channel,每个数对应通道的权重
class ChannelAttention(nn.Module): def __init__(self, in_planes, rotio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.sharedMLP = nn.Sequential( nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(), nn.Conv2d(in_planes // rotio, in_planes, 1, bias=False)) self.sigmoid = nn.Sigmoid() def forward(self, x): avgout = self.sharedMLP(self.avg_pool(x)) maxout = self.sharedMLP(self.max_pool(x)) return self.sigmoid(avgout + maxout)
空间注意力机制
输入的特征图分别在通道维度进行最大池化和平均池化,再把二者拼起来,此时shape是w*h*2,只是厚度变成了2,然后通过只有1个卷积核的卷积层,输出的厚度为1,最后通过sigmoid函数,此时w*h上每个点的值对应输入的每个像素的权重
class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3,7), "kernel size must be 3 or 7" padding = 3 if kernel_size == 7 else 1 self.conv = nn.Conv2d(2,1,kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avgout = torch.mean(x, dim=1, keepdim=True) maxout, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avgout, maxout], dim=1) x = self.conv(x) return self.sigmoid(x)
2个机制集成:按照通道注意力机制加权后再通过空间注意力加权
16、AC自动机
AC自动机的数据结构是字典树——Trie树,字典树是基于公共前缀来构建的,大大节省了查找字符串的效率,它的每个节点保存一个字符,字符串末尾所对应的节点代表终点态,AC自动机用多个模式串(关键词)构建字典树,然后在此基础上加上fail路径,在匹配长文本中的关键词时,若匹配到了终点态则记录下来,若下一个字符不匹配,则沿着fail路径回溯,最终能够查询到长文本中的所有关键词
详细:https://benarvintec.com/2018/11/26/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E4%B9%8BAho-Corasick/
17、GAN
GAN是由两部分主成:生成模型G(generative model)和判别模型D(discriminative model)。输入:原始数据x和随机噪声信号z ,输出:一个概率值。生成模型G生成假数据,判别模型D是一个二分类器,真实数据与假数据一起送入分类器D,后面接一个sigmoid函数,输出判定类别。根据GAN的组成结构我们可以知道,GAN 整个的过程就是,G产生一个自创的假数据和真数据放在一起让D来区分,在这种不停的较量中G就模拟出来了跟真实数据十分相近的数据。所以GAN主要的应用场景就是能够学习出这样模拟分布的数据,并且可以用模拟分布代替原始数据
推导:
补充:KL散度=相对熵,是描述2个概率分布之间的差异,越小表示分布越相近,相同则=0,KL-divergence始终是大于等于0的。
比如有四个类别,一个方法A得到四个类别的概率分别是0.1,0.2,0.3,0.4。另一种方法B(或者说是事实情况)是得到四个类别的概率分别是0.4,0.3,0.2,0.1,那么这两个分布的
KL-Distance(A,B)=0.1*log(0.1/0.4)+0.2*log(0.2/0.3)+0.3*log(0.3/0.2)+0.4*log(0.4/0.1)
所以证明了,当G产生的数据和真实数据是一样的(分布)时候,得到理想的生成器,此时判别器对真假数据的分辨率为0.5,即它已经无法辨认。
9、高斯混合模型GMM
样本X不再是服从1个高斯分布,而是多个高斯分布的加权和《=》X背后有个隐变量Z,给Z自定义一个分布q(Z),这样Z有自己的取值,每个值的意义定义为对应的高斯分布,定义Z取某个值表示X来自于这个高斯分布,最后通过MLE来求这些高斯分布的参数以及q(Z)的参数(比如,P(Z=1)=?,P(Z=2)=?....)),由于解析解很难求(不是1个高斯分布),所以用em算法来求数值解
em算法:X后面有个隐变量Z,每个值的意义还未定义,来用极大似然估计来参数:
假定X=(x1,x2,x3...xn),似然函数:
两边求z的期望:
所以看出似然函数=下界elbo+KL散度>=下界elbo,该式子也可以用jensen不等式得到:
取等号(似然函数=下界)的条件是:
此时elbo是:
只要elbo越大,似然函数就越大,所以采用近似的思想,看看参数取什么值的时候elbo越大
开始流程:
Θ初始化为参数Θ0,即 t=0
E步:带入ELBO公式(只带入q(z)中的Θ,不带入log里的Θ),它是θ的函数:
M步:求出使得它最大的θ作为θ1,比如令对θ的导数=0;
再带着θ1回到E步...
所以高斯混合模型就是把高斯分布的情况带入到了em算法里面,当设置了K个高斯分布后(这个K可以通过观察数据可能是有个几个高斯分布组合来的),通过em算法求得所有参数,这样就知道每个样本的属于哪个高斯分布了,还能知道这个样本点属于各个类别(高斯分布)的概率(p(z|x)),从而实现聚类。
10、自编码器AE
通过编码器把输入映射为特征向量,再通过解码器还原,损失函数是输出和输入的距离,这样编码器能将一个东西做更好的编码(保留它最重要的东西),后面用的时候可以把解码器去掉,只用它的编码器
10、对比学习:通过数据增强自动给数据加上同类和异类标签,同类的物体的embedding应该尽可能相似,以此训练模型学会分类
10、后验分布p(y|x)是先验分布p(y)在抽样x后的分布
10、变分推断就是用简单的分布q去近似复杂的分布p(一般是后验分布)
11、变分自编码器vae(2014)
正态分布中可以包含有不同输入的细节,所以不同图片可以有自己专属的正态分布,好的vae的解码器是可以区分不同种类的正态分布的,从而重构出对应的图片。针对第k个图片xk,因为P(Z|X)为标准正态分布(通过分布损失保证,即损失=该分布与N(0,1) 的KL散度 ),所以编码器生成专属的正态分布mk,log标准差k(该分布接近于N(0,1) ),然后再从该分布中采样zk(为了能够梯度回传,先从N(0,1) 采样e,再mk+e*标准差k),然后解码器解码为xk。
实现:编码器有2个神经网络(均值编码网络、方差编码网络),分别输出均值向量m和 log标准差向量,再抽取一个e(e从N(0,1)中抽取)倍的标准差加到m上:m+标准差 元素积 e得到z
损失函数有重构误差(输出和输入的距离),分布损失(该损失用来确保解码器能举一反三,KL散度可以推出图中右下角)
概率角度理解vae,属于latent vairable model,可以看成是无限个高斯混合模型
以下等式恒成立:
vae 在nlp上的应用:
对于词x1,通过编码器得到它的带噪声的编码向量(每个元素都服从N(0,1)),最后通过解码器还原词向量;缺点是单词间的关系完全没有考虑到
cvae:通过给vae多了一个输入Y,让它通过神经网络生成一个均值uy,使得Z的每个元素不再服从N(0,1)而是N(uy,1),这样就达到了通过输入Y来控制模型的输出了
GMvae:vae认为中间的隐变量Z都服从一个N(0,1),而 GMVAE认为隐变量可能来自K个高斯分布中的1个,所以当输出有m类时,可以设置GMVAE的高斯分布个数为m