人工智能杂记 共轭先验分布 seq2seq DSSM

请说明fasttext各个层的作用

 

fastText的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,都是三层架构:输入层、 隐藏层、输出层:

第一层是输入层:

类似于CBOW的普通词向量输入层CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过。输出层将将输入层中的词和词组构成特征向量,再将特征向量通过线性变换映射到隐藏层。

 

第二层是隐含层:

隐藏层通过求解最大似然函数,然后根据每个类别的权重和模型参数构建Huffman树,将Huffman树作为输出。

 

第三层是输出层

输出是文档对应的类标。

 

简述卷积神经网络中,卷积层,池化层,全连接层的一些作用

 

卷积神经网络由输入层、卷积层、激活函数、池化层、全连接层组成其中卷积层,池化层,全连接层的作用如下:

卷积层:用它来进行特征提取,通常会使用多层卷积层来得到更深层次的特征图

池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。

全连接层:连接所有的特征,将输出值送给分类器(如softmax分类器)。

 

 

卷积神经网络由输入层、卷积层、激活函数、池化层、全连接层组成其中卷积层,池化层,全连接层的作用如下:

 

卷积层:用它来进行特征提取,通常会使用多层卷积层来得到更深层次的特征图。

 

池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。

 

全连接层:连接所有的特征,将输出值送给分类器(如softmax分类器)。

 

 

 

 

 

 

什么是共轭先验分布?

 

回答:

在贝叶斯统计中,如果后验分布与先验分布属于同类,则先验分布与后验分布被称为共轭分布,而先验分布被称为似然函数的共轭先验。比如,高斯分布家族在高斯似然函数下与其自身共轭 (自共轭)

具体地说,就是给定贝叶斯公式http://img0.ph.126.net/HXITcSRNYp42WsRWVbBIWg==/6632695042910326875.png 假定似然函数是已知的,问题就是选取什么样的先验分布http://img2.ph.126.net/nMg7CJI6uMrTFzggc_n-uA==/2183401394445088265.png 会让后验分布与先验分布具有相同的数学形式。共轭先验的好处主要在于代数上的方便性,可以直接给出后验分布的封闭形式,否则的话只能数值计算。共轭先验也有助于获得关于似然函数如何更新先验分布的直观印象。

所有指数家族的分布都有共轭先验。 

 

简述seq2seq模型的encoderdecoder过程。

 

seq2seq模型的encoderdecoder过程:

seq2seq 是一个Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。

编码器处理输入序列中的每个元素(可能是1个词),将捕获的信息编译成向量(称为上下文内容向量)。在处理整个输入序列之后,编码器将上下文发送到解码器,解码器逐项开始产生输出序列。

输入的数据(文本序列)中的每个元素()通常会被使用word embedding编码成一个稠密的向量。encoderdecoder都会借助于循环神经网络(RNN)这类特殊的神经网络完成,循环神经网络会接受每个位置(时间点)上的输入,同时经过处理进行信息融合,并可能会在某些位置(时间点)上输出。

考虑到提升效果,通常我们不会寄希望于把所有的内容都放到一个上下文向量(context vector)中,而是会采用一个叫做注意力模型的模型来动态处理和解码。注意力机制,是一个在解码阶段,简单地对编码器中的hidden states进行不同权重的加权处理的过程,该机制可以使模型学习源语言和目标语言之间词和词对齐关系。

 

 

 简要说明诗词生成的流程

gtihub下载诗词素材。

构建一个语言模型的网络结构。

通过语言模型将诗歌以字为粒度进行输入。

Step 1导入相关包,Import random os numpykeras相关包

Step 2读取诗歌内容,观察内容的格式:

Xx:xxxxx,xxxxx,xxxxx,xxxxx

Step 3定义配置类

其中定义了训练数据的路径,打开训练素材后进行分词,诗的正文中冒号部分就是诗的正文,通过一个规则,每一句后面是不是逗号来进行分词。过滤出五言绝句除掉脏数据。

统计字频,统计字频,字频超过两个才留下来,否则过滤掉。

构建一个字典,可以实现idß à字典的相互的映射。(如果要人能看得懂就要实现这个映射结构)如果判断是否有预训练的模型,有预训练的模型就加载预训练模型,没有的话就训练模型。

构建语言模型,对每个时间点送来的数据,模型获取输出后进行softmax分类,判断下一个输出的字应该是什么字,把文本输入进来经过一个hidden state512维的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中服从均匀分布。例如给定一个外语句子fm是英语句子的词的个数,求词对齐向量的条件概率,则条件概率可以用这个式子来表达:http://img1.ph.126.net/khPn8OBbRTxbNlvNSfXxVw==/6597351241636257625.png

for each i http://img1.ph.126.net/l5lX0zrYfL_aqmZWNtkeMw==/2203386117791272597.png [1,2,...,m]

     a_i ~ Uniform(0,1,2,...n)

    e_i ~ Categorical(  http://img2.ph.126.net/udBRW0UKtH2xgqtWEmgl1A==/6597894400380104195.png)

 

 

p(a|f,m)=\frac{\epsilon}{(n+1)^m}

 

可视化注意力矩阵,发现注意力机制能使得模型学会什么?

 

可视化注意力矩阵,可以看到不同的源语言单词与目标语言单词的相关性与词对齐关系。可以计算出语言之间的对应关系。如果说比较亮(代表相关性比较高)的点在对角线上,说明两种语言的语言顺序是差不多的。

 

训练CNN NMT的技巧包括哪些?

1:训练过程中,我们需要将网络中某些部分进行缩放(scaling)

2:训练过程中,我们需要对权重初始化

3:训练过程中,我们需要对超参数进行设置

 

Transformer 相比CNNRNN的优点:

1RNN需要进行O(n)个序列操作,而TransformerCNN只需要O(1)个,在 Transformer 中,两个任意输入的信号关联的开销会减少到一个固定的运算数量,使用 Multi-Head Attention 注意力机制可以完全脱离RNNCNN的结构,只使用自注意机制(self-attention),使得Transformer可以高效地并行化,并堆叠非常多层的深层网络。

2CNN会形成一个层级结构,类似树状,所以任意两个单词到达的最大路径长度是(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。该模型的encoderdecoder都采用的是卷积核CNN

1.请简述基于TensorFlow搭建一个两层EncoderLSTM模型的基本思路。

使用Tensorflow搭建一个两层EncoderLSTM模型(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) QueryResponse都是经过分词的,分词后每个词embedded为向量形式。初始的词向量使用GloVe vectors,之后词向量随着模型的训练会进行fine-tuned(实验发现,初始的词向量使用GloVe并没有在性能上带来显著的提升)。

(2) 分词且向量化的QueryResponse经过相同的RNNword by word)。RNN最终生成一个向量表示,捕捉了QueryResponse之间的[语义联系](图中的cr);这个向量的维度是可以指定的,这里指定为256维。

(3) 将向量c与一个矩阵M相乘,来预测一个可能的回复r’。如果c为一个256维的向量,M256*256的矩阵,两者相乘的结果为另一个256维的向量,我们可以将其解释为[一个生成式的回复向量]。矩阵M是需要训练的参数。

(4) 通过点乘的方式来预测生成的回复r’和候选的回复r之间的相似程度,点乘结果越大表示候选回复作为回复的可信度越高;之后通过sigmoid函数归一化,转成概率形式。图中把第(3)步和第(4)步结合在一起了。

为了训练模型,我们还需要一个损失函数(loss function)。这里使用二元的交叉熵(binary cross-entropy)作为损失函数。我们已知实例的真实label y,值为01;通过上面的第(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 距离(即余弦相似度) 来表示。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值