请说明fasttext各个层的作用
fastText的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,都是三层架构:输入层、 隐藏层、输出层:
第一层是输入层:
类似于CBOW的普通词向量输入层CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过。输出层将将输入层中的词和词组构成特征向量,再将特征向量通过线性变换映射到隐藏层。
第二层是隐含层:
隐藏层通过求解最大似然函数,然后根据每个类别的权重和模型参数构建Huffman树,将Huffman树作为输出。
第三层是输出层
输出是文档对应的类标。
简述卷积神经网络中,卷积层,池化层,全连接层的一些作用
卷积神经网络由输入层、卷积层、激活函数、池化层、全连接层组成其中卷积层,池化层,全连接层的作用如下:
卷积层:用它来进行特征提取,通常会使用多层卷积层来得到更深层次的特征图
池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
全连接层:连接所有的特征,将输出值送给分类器(如softmax分类器)。
卷积神经网络由输入层、卷积层、激活函数、池化层、全连接层组成其中卷积层,池化层,全连接层的作用如下:
卷积层:用它来进行特征提取,通常会使用多层卷积层来得到更深层次的特征图。
池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
全连接层:连接所有的特征,将输出值送给分类器(如softmax分类器)。
什么是共轭先验分布?
回答:
在贝叶斯统计中,如果后验分布与先验分布属于同类,则先验分布与后验分布被称为共轭分布,而先验分布被称为似然函数的共轭先验。比如,高斯分布家族在高斯似然函数下与其自身共轭 (自共轭)。
具体地说,就是给定贝叶斯公式 假定似然函数是已知的,问题就是选取什么样的先验分布 会让后验分布与先验分布具有相同的数学形式。共轭先验的好处主要在于代数上的方便性,可以直接给出后验分布的封闭形式,否则的话只能数值计算。共轭先验也有助于获得关于似然函数如何更新先验分布的直观印象。
所有指数家族的分布都有共轭先验。
简述seq2seq模型的encoder和decoder过程。
seq2seq模型的encoder和decoder过程:
seq2seq 是一个Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。
编码器处理输入序列中的每个元素(可能是1个词),将捕获的信息编译成向量(称为上下文内容向量)。在处理整个输入序列之后,编码器将上下文发送到解码器,解码器逐项开始产生输出序列。
输入的数据(文本序列)中的每个元素(词)通常会被使用word embedding编码成一个稠密的向量。encoder和decoder都会借助于循环神经网络(RNN)这类特殊的神经网络完成,循环神经网络会接受每个位置(时间点)上的输入,同时经过处理进行信息融合,并可能会在某些位置(时间点)上输出。
考虑到提升效果,通常我们不会寄希望于把所有的内容都放到一个上下文向量(context vector)中,而是会采用一个叫做注意力模型的模型来动态处理和解码。注意力机制,是一个在解码阶段,简单地对编码器中的hidden states进行不同权重的加权处理的过程,该机制可以使模型学习源语言和目标语言之间词和词对齐关系。
简要说明诗词生成的流程
从gtihub下载诗词素材。
构建一个语言模型的网络结构。
通过语言模型将诗歌以字为粒度进行输入。
Step 1:导入相关包,Import random os numpy和keras相关包
Step 2:读取诗歌内容,观察内容的格式:
Xx:xxxxx,xxxxx,xxxxx,xxxxx。
Step 3:定义配置类
其中定义了训练数据的路径,打开训练素材后进行分词,诗的正文中冒号部分就是诗的正文,通过一个规则,每一句后面是不是逗号来进行分词。过滤出五言绝句除掉脏数据。
统计字频,统计字频,字频超过两个才留下来,否则过滤掉。
构建一个字典,可以实现idß à字典的相互的映射。(如果要人能看得懂就要实现这个映射结构)如果判断是否有预训练的模型,有预训练的模型就加载预训练模型,没有的话就训练模型。
构建语言模型,对每个时间点送来的数据,模型获取输出后进行softmax分类,判断下一个输出的字应该是什么字,把文本输入进来经过一个hidden state为512维的LSTM处理。后面接一个随机失活函数dropout,再接一个lstm,再接一个dropout,最后做一个多分类,类的数量是诗句中字的个数。
头是input_tensor(输入),输出是dense,优化器选择Adam Optimizer,
编译模型,使用交叉熵损失作为loss,使用’accuracy’作为metrics选项的参数。
(temperature的作用:由于作诗是一种创作,会希望有一种多样性在模型中得到体现,使用temperature来控制创作的自由度,以一定的概率来取概率值最高的结果。以一定的概率取剩下的一些字。当temperature<1.0时,模型会做一些随机探索,输出相对比较新的内容,当temperature>1.0时,模型预估方式偏保守)
(外部不可以调用的函数在前面用下划线表示)
预估函数,有4种预估方式,1:随机切片取出随机一首诗的前五个字生成五言绝句。2:根据给出的首个文字,生成五言绝句.3:根据给出的前max_len个字,生成诗句. 4:根据给4个字,生成藏头诗五言绝句
生成数据函数,编写data_generator方法作为生成器生成数据。会不断产生输入的向量。每次一批一批抛出训练用的数据
编写训练函数:此处指定模型的重要参数,设置检查点定期保存模型
Step 4:训练或预加载模型
Step 5:生成预测
IBM 模型1做了哪些假设
M个次对其的决定是相互独立的。
词对齐的分布式在所有的源语言单词及以及NULL中服从均匀分布。例如给定一个外语句子f,m是英语句子的词的个数,求词对齐向量的条件概率,则条件概率可以用这个式子来表达:。
for each i [1,2,...,m]
a_i ~ Uniform(0,1,2,...n)
e_i ~ Categorical( )
p(a|f,m)=\frac{\epsilon}{(n+1)^m}
可视化注意力矩阵,发现注意力机制能使得模型学会什么?
可视化注意力矩阵,可以看到不同的源语言单词与目标语言单词的相关性与词对齐关系。可以计算出语言之间的对应关系。如果说比较亮(代表相关性比较高)的点在对角线上,说明两种语言的语言顺序是差不多的。
训练CNN NMT的技巧包括哪些?
1:训练过程中,我们需要将网络中某些部分进行缩放(scaling)
2:训练过程中,我们需要对权重初始化
3:训练过程中,我们需要对超参数进行设置
Transformer 相比CNN与RNN的优点:
1:RNN需要进行O(n)个序列操作,而Transformer和CNN只需要O(1)个,在 Transformer 中,两个任意输入的信号关联的开销会减少到一个固定的运算数量,使用 Multi-Head Attention 注意力机制可以完全脱离RNN及CNN的结构,只使用自注意机制(self-attention),使得Transformer可以高效地并行化,并堆叠非常多层的深层网络。
2:CNN会形成一个层级结构,类似树状,所以任意两个单词到达的最大路径长度是(log(k(n)))。
3:如果self-attention只对该单词周围r个单词进行attention操作,我们可以得到restricted版本的self-attention, 这样可以减少每一层的计算复杂度,但会增加两个任意词之间到达的最长路径。
CNN通过在固定窗口内的计算,使得计算的并行化变得更加简单,而且通过多层CNN网络可以构建层级结构(hierarchical structure),可以达到利用更短的路径去覆盖更长范围内的信息
1:最简单的non-recurrent encoder就是把k个连续的单词的词向量求平均值,通过在句子左右两边都做添加额外的空单词(paddings),可以使得encoder输出跟原来句子同等长度的hidden embeddings。
2:卷积编码器在pooling encoder的基础上进行改进,使用一个CNN-a 卷积层来进一步编码源语言句子中的每个单词。该编码器在进行attention的时候,使用了另一个CNN-c卷积层来编码源语言句子中的每个单词,并计算atttention weight,再进行加权求和。该模型的encoder 采用的是CNN,但其decoder还是采用了传统的RNN模型。
3:全卷积神经翻译模型Convolutional NMT。该模型的encoder和decoder都采用的是卷积核CNN。
1.请简述基于TensorFlow搭建一个两层Encoder的LSTM模型的基本思路。
使用Tensorflow搭建一个两层Encoder的LSTM模型(Dual Encoder LSTM Network)基本思路:
使用numpy、pandas、TensorFlow和TF Learn等工具。分为以下几个步骤
1:据预处理:
数据集的原始格式为csv格式,我们需要先将其转为TensorFlow专有的格式,这种格式的好处在于能够直接从输入文件中load tensors,并让TensorFlow来处理洗牌(shuffling)、批量(batching)和队列化(queuing)等操作。预处理中还包括创建一个字典库,将词进行标号,TFRecord文件将直接存储这些词的标号。
2:创建输入函数
为了使用TensoFlow内置的训练和评测模块,我们需要创建一个输入函数:这个函数返回输入数据的batch。因为训练数据和测试数据的格式不同,我们需要创建不同的输入函数。输入函数需要返回批量(batch)的特征和标签值(如果有的话)。
3:定义评测指标
之前已经提到用recall@k这个指标来评测模型,TensorFlow中已经实现了许多标准指标(包括recall@k)。为了使用这些指标,需要创建一个字典,key为指标名称,value为对应的计算函数。
4.训练程序样例
首先,给一个模型训练和测试的程序样例,这之后你可以参照程序中所用到的标准函数,来快速切换和使用其他的网络模型。假设我们有一个函数model_fn,函数的输入参数有batched features,label和mode(train/evaluation),函数的输出为预测值。
5.创建模型
输入参数为:hparams,mode,context,context_len,utterance,utterance_len,
Targets。
首先随机或者使用预训练的向量初始化词嵌入embedidngs
接着做context与utterance的嵌入操作。
构建RNN,使用LSTM构建。
将向量化的Query和Response通过该RNN运行。此时分词且向量化的Query和Response经过相同的RNN(word by word)。RNN最终生成一个向量表示,捕捉了Query和Response之间的[语义联系](图中的c和r)
将向量c与一个矩阵M相乘,来预测一个可能的回复r’。
通过点乘的方式来预测生成的回复r’和候选的回复r之间的相似程度,点乘结果越大表示候选回复作为回复的可信度越高;之后通过sigmoid函数归一化,转成概率形式。
使用二元的交叉熵(binary cross-entropy)作为损失函数。
最后计算平均误差并返平均误差。
大致的流程如下:
(1) Query和Response都是经过分词的,分词后每个词embedded为向量形式。初始的词向量使用GloVe vectors,之后词向量随着模型的训练会进行fine-tuned(实验发现,初始的词向量使用GloVe并没有在性能上带来显著的提升)。
(2) 分词且向量化的Query和Response经过相同的RNN(word by word)。RNN最终生成一个向量表示,捕捉了Query和Response之间的[语义联系](图中的c和r);这个向量的维度是可以指定的,这里指定为256维。
(3) 将向量c与一个矩阵M相乘,来预测一个可能的回复r’。如果c为一个256维的向量,M维256*256的矩阵,两者相乘的结果为另一个256维的向量,我们可以将其解释为[一个生成式的回复向量]。矩阵M是需要训练的参数。
(4) 通过点乘的方式来预测生成的回复r’和候选的回复r之间的相似程度,点乘结果越大表示候选回复作为回复的可信度越高;之后通过sigmoid函数归一化,转成概率形式。图中把第(3)步和第(4)步结合在一起了。
为了训练模型,我们还需要一个损失函数(loss function)。这里使用二元的交叉熵(binary cross-entropy)作为损失函数。我们已知实例的真实label y
,值为0或1;通过上面的第(4)步可以得到一个概率值 y'
;因此,交叉熵损失值为L = -y * ln(y') - (1 - y) * ln(1 - y')
。这个公式的意义是直观的,即当y=1
时,L = -ln(y')
,我们期望y'
尽量地接近1使得损失函数的值越小;反之亦然。
2.请简述构建一个 NMT 系统的步骤?
在网络的底层,编码器和解码器 RNN 接收到以下输入:首先是原句子,然后是从编码到解码模式的过渡边界符号「<s>」,最后是目标语句。对于训练来说,我们将为系统提供以下张量,它们是以时间为主(time-major)的格式,并包括了单词索引:
1: 嵌入(embedding):
给定单词的分类属性,模型首先必须查找词来源和目标嵌入以检索相应的词表征。为了令该嵌入层能够运行,我们首先需要为每一种语言选定一个词汇表。通常,选定词汇表大小 V,那么频率最高的 V 个词将视为唯一的。而所有其他的词将转换并打上「unknown」标志,因此所有的词将有相同的嵌入。我们通常在训练期间嵌入权重,并且每种语言都有一套。我们同样可以构建 embedding_decoder 和 decoder_emb_inp。注意我们可以选择预训练的词表征如 word2vec 或 Glove vectors 初始化嵌入权重。通常给定大量的训练数据,我们能从头学习这些嵌入权重。
2: 编码器(encoder):
一旦可以检索到,词嵌入就能作为输入馈送到主神经网络中。该网络有两个多层循环神经网络组成,一个是原语言的编码器,另一个是目标语言的解码器。这两个 RNN 原则上可以共享相同的权重,然而在实践中,我们通常使用两组不同的循环神经网络参数(这些模型在拟合大型训练数据集上做得更好)。解码器 RNN 使用零向量作为它的初始状态。注意语句有不同的长度以避免浪费计算力,因此我们会通过 source_seqence_length 告诉 dynamic_rnn 精确的句子长度。因为我们的输入是以时间为主(time major)的,我们需要设定 time_major=True。现在我们暂时只需要构建单层 LSTM、encoder_cell。
3. 解码器(decoder):
decoder 也需要访问源信息,一种简单的方式是用编码器最后的隐藏态 encoder_state 对其进行初始化。代码的核心是 BasicDecoder、获取 decoder_cell(类似于 encoder_cell) 的 decoder、helper 以及之前作为输入的 encoder_state。通过分离 decoders 和 helpers,我们能重复使用不同的代码库,例如 TrainingHelper 可由 GreedyEmbeddingHelper 进行替换,来做贪婪解码。最后,我们从未提到过的 projection_layer 是一个密集矩阵,将顶部的隐藏态转变为维度 V 的逻辑向量。
4. 损失构建:
上一步代码中得到的logits,可用于计算训练损失。训练损失可以由 batch_size 分割,因此我们的超参数 batch_size 是「不变量」。也有些人将训练损失按照 batch_size * num_time_steps 分割,这样可以减少短句所造成的误差。更巧妙的,我们的超参数(应用于前面的方法)不能用于后面的方法。例如,如果两种方法都是用学习率为 1.0 的随机梯度下降,后面的方法将更有效地利用一个较小的学习率,即 1 / num_time_steps。
5. 梯度计算和优化器优化
训练 RNN 的一个重要步骤是梯度截断(gradient clipping)。这里,我们使用全局范数进行截断操作。最大值 max_gradient_norm 通常设置为 5 或 1。最后一步是选择优化器。Adam 优化器是最常见的选择。我们还要选择一个学习率,learning_rate 的值通常在 0.0001 和 0.001 之间,且可设置为随着训练进程逐渐减小。在我们的实验中,我们使用标准的随机梯度下降(tf.train.GradientDescentOptimizer),并采用了递减的学习率方案,因此也就有更好的性能。
第十门 视觉文本任务:看图说话作业_主观题
问答题 (10分)
Fang et al 2014, From Captions to Visual Concepts and Back 这篇文章中的流程使用了哪几个步骤去实现“看图说话”?
1:预测文字: 使用一个CNN去做目标识别,并且根据bounding box生成可能出现的文字
2:生成句子:通过一个统计语言模型,生成很多个可能的句子集合
3:重新排序已经生成的句子: 通过学习一个Deep Multimodal Similarity Model (DMSM)去重新排序所有可能的句子集合,取最高分数的句子作为系统输出。
一个VQA系统通常包括了哪三个步骤?
1.抽取问题特征
2.抽取图片特征
3.结合图片和问题特征去生成答案
使用word2vec进行文本相似度计算的具体步骤?
把单词映射到具有语义含义的空间中,相近的词挨得比较近。词向量用于测量单词的相似度,利用个句子中的单词做word averaging计算句子相似度。
简述DSSM模型的原理:
DSSM可以被用作开发latent semantic models,把不同的实体投影到同一个低维度的语义空间,然后用于文本分类,排序等任务。
通过搜索引擎里 Query 和 Title 的海量的点击曝光日志,用 DNN 把 Query 和 Title 表达为低维语义向量,并通过 cosine 距离来计算两个语义向量的距离,最终训练出语义相似度模型。该模型既可以用来预测两个句子的语义相似度,又可以获得某句子的低维语义向量表达。
DSSM模型中,我们采用句子的最后一个hidden state来作为整个句子的vector表示。 这个vector通过两次Feedforward神经网络就可以作为query vector。类似地,我们可以把答案句子编码成answer vector。
首先定义模型的输入,分别是query和answer的sequence。每个CNTK的sequence都包含一个dynamic axis,表示sequence的长度。当sequence有不同的长度和不同的单词表大小,他们都应该有一个dynamic axis。 这时候就需要声明named axis。
DSSM 从下往上可以分为三层结构:输入层、表示层、匹配层。
输入层:输入层做的事情是把句子映射到一个向量空间里并输入到 DNN 中。
表示层:DSSM 的表示层采用 BOW(Bag of words)的方式。
匹配层:Query 和 Doc 的语义相似性可以用这两个语义向量的 cosine 距离(即余弦相似度) 来表示。