1.RNN。
答:用x(i)<t>表示第i个样本input的第t个元素,用y(i)<t>表示第i个样本output的第t个元素。
用Tx(i)表示第i个样本input的输入序列长度,用Ty(i)表示第i个样本output的序列长度。
RNN的表示如上图,a<0>一般用零向量。每一层的参数是共享的。
也可以用下图的方法来表示。
RNN的前向传播如下。其中权重Wya这样的表示是为了说明,该权重用于计算y,且要乘上a。
可以把每一层理解为一个hidden layer,然后用该层的激活值做一个softmax或者sigmoid得到该层的y,并且还要把该层的激活值往下传。
对RNN的表示做一些简化,把两个参数矩阵堆成一个。
Wa为Waa和Wax水平堆放,[a<t-1>,x<t>]为a<t-1>,x<t>垂直堆放。
RNN的反向传播。
cost function为每个y的loss之和,一般用交叉熵。
2.Tx≠Ty的情况。
答:前面介绍的Tx=Ty的网络称为many-to-many的RNN。有时候Tx≠Ty,比如说文本情感分类,input是一个sequence而output是0或1表示negative or positive。这种情况称为many-to-one的RNN。
如下图所示,对于many-to-one的RNN,只需要在最后输出y即可。
也可以有one-to-many的RNN,比如说音乐生成,只需改成第一个单元有输入x,其他单元没有x即可,一般情况下,会把上一个y也输入到下一个单元中。如下图所示。
当然,many-to-many的RNN也可以有Tx≠Ty的情况,比如翻译问题。
只需把RNN改成如下结构即可(先全部读入,再输出)。前半部分称为encoder,后半部分称为decoder。
总结。(one-to-one就和普通的神经网络单元一样)
2.语言模型。
答:在语言模型中,用one-hot编码后,如果遇到语料库中没有的词,可以用UNK标志表示。对于句子的结尾,用EOS标志表示。
RNN处理语言模型如下(从左到右预测下一个词)。
在上面的例子中,y_<1> = "Cats",y_<2> = "average"...
对于每一个单元,接受上一个单元的激活值(a_t-1)和上一个词(y_t-1),通过softmax输出对于每个词出现的概率(y ^ _t)。
损失函数一般用交叉熵,总体cost function为每个单元的loss之和。
通过这种方式,就可以用已经有的词,预测后面出现的词。
如果要预测一个句子的概率,比如预测P(y_<1>,y_<2>,y_<3>),第一个单元预测了P(y_<1>),第二个单元预测了P(y_<2> | y_<1>),第三个单元预测了P(y_<3> | y_<1>,y_<2>),那么P(y_<1>,y_<2>,y_<3>) = P(y_<1>)P(y_<2> | y_<1>)P(y_<3> | y_<1>,y_<2>)。
3.对新序列采样。
答:
如上图,上半部分完成对模型的训练后,下半部分用模型采样新序列(生成新的sequence)。对于第一个单元,a0和x1都为0,之后的每一个单元,接收上一个单元的a和y ^ 。对于每一个单元,y ^ 是一个通过softmax得到的离散概率分布,从这个分布中采样即可。停止采样一般有两种方式:1.采样到EOS标志停止。2.固定采样的个数。
如果采样到UNK标志,可以考虑重新采样。
4.RNN中的梯度消失问题。
答:在RNN中,如果模型很深,会出现梯度消失问题,会导致某一个输出只与附近的输入有关,很难受到很前面的输入的影响,即不擅长处理长期依赖问题。
梯度消失是因为随着模型层数的增加,参数呈指数型下降,当然也有可能出现指数型上升,出现梯度爆炸,即参数显示为NaN。
对于梯度爆炸,可以采用梯度修剪,即当梯度向量大于某个阈值时,缩放梯度向量,保证它不会太大。
梯度消失问题会相对更难处理一些,见下。
5.GRU(Gated Recurrent Unit)单元。
答:GRU单元让RNN能够更好的捕捉深层连接,并改善了梯度消失问题。
c<t>为记忆单元(memory cell),c~<t>为记忆单元的候选值,Γu为逻辑门单元(gate)。gate决定了memory cell的更新情况。
因为gate由sigmoid计算,sigmoid函数在很多时候值接近于0,此时c<t>接近于c<t-1>,因此可以有效缓解梯度消失问题。
需要注意的是,c<t>可以是一个向量,此时c~<t>也是一个相同维度的向量,Γu也是相同维度的向量。此时通过gate计算c<t>的那个式子中的乘就是element-wise了。
上面讲到的只是简化过的GRU,完整的GRU如下(只是加上了另一个gate Γr,称为relevant gate)。
6.LSTM(long short term memory)。
答:LSTM中不使用relevant gate,增加了forget gate(遗忘门) Γf,output gate(输出门) Γo,并且c<t>≠a<t>。
用计算图来表示LSTM。
下面的红线说明了为什么LSTM能够长时间的记忆某个值(GRU也可以)。
需要强调的是,和GRU一样,各种单元可以是高维的,但是比如说c<t-1>中的第一个元素只能影响其他单元的第一个元素,这是one-to-one对应的。
peephole connection。如下,让c<t-1>也能影响gate value。
7.双向RNN(Bidirectional RNN,也称为BRNN)。
答:
如上图,先做两次forward pop,一次从左到右,一次从右到左,再预测各个单元的值。此时,每个单元的预测值考虑了过去的信息,也考虑了未来的信息。
每个单元的输出y ^ 会综合考虑正向激活值和反向激活值。
需要注意的是,每个单元可以是普通的RNN,可以是GRU,也可以是LSTM。
8.Deep RNN。
答:用a[l]<t>来表示第l层,第t个时间点。
Deep RNN如下。
需要注意的是,每层的参数W和b是共享的。
也有一些Deep RNN的变形,比如说把直接softmax求y改成一些多层网络(这些层没有水平的连接)。
当然,Deep RNN中的每个单元可以用普通的RNN,可以用GRU,也可以用LSTM。
9.使用one-hot对单词编码的不足?
答:如果one-hot对单词编码,所有不同的单词之间的内积都是0,不能体现单词之间的联系。所以,引入了word embedding。
10.Transfer learning and word embedding。
答:
10.Embedding matrix。
答:embedding matrix乘上单词的one-hot vector就可以得到它对应的word embedding。在实际实现过程中,维度很大的矩阵乘法效率比较低,因此一般直接选择embedding matrix中对应的列。
11.学习word embedding。
答:这里给出了一种学习word embedding的方法。每个词的one-hot vector乘上embedding matrix得到word embedding,之后把每个词的embedding输入到网络的层中(直接stacking成一个n*1的长向量),然后做softmax(softmax的维度和one-hot的维度一致)。之后做back pop,embedding matrix由网络学习得到。
图中o表示one-hot,E表示embedding matrix,e表示word embedding。
现在比较常见的学习word embedding的模型是skip-gram,需要注意的是,skip-gram的trainset是一些单词对,如(a,b)。softmax的分母部分求和计算量太大,因此有两种常见的优化方法,hierarchical softmax(拆成多个二分类,一般构造成哈弗曼树)和负采样。
12.负采样。
答:如下图,由orange预测juice这是一个正样本,然后负样本由orange预测一些随机产生的词。
需要强调的是,负采样放弃了softmax,改用logistics regression单元做多个二分类。
如下图,一组训练数据包括1个正样本和k个负样本,之前10000维的softmax被拆成10000个二分类问题,即logistics regression单元。每次只更新正样本和负样本对应的共k+1个logistics regression单元。
负样本的选取概率一般选用如下等式,其中P(wi)表示wi被选为负样本的概率,f(wi)表示wi的词频。
13.文本情感分类上的处理。
答:可以对文本中的词向量求和或求平均,再放入softmax中做分类。但这样做没有考虑词序信息。
要考虑词序信息,可以用RNN,把每个词的词向量作为输入,最后一个单元做softmax输出。
14.机器翻译。
答:x<i>为要翻译的文本,y<i>为翻译后的文本。前半部分称为encoder network,后半部分称为decoder network。
15.图片描述。
答:用预训练好的CNN学习图片的representation向量,再接一个RNN即可。
16.beam search algorithm。
答:机器翻译问题希望能找到一个更好的翻译,一般定义如下目标函数。
枚举y<1>,...y<Ty>的效率很低,因此使用beam search algorithm。
beam search algorithm:
1)设置超参数B称为beam width,这里令B = 3。
2)把要翻译的句子输入RNN的encoder network,decoder network的第一个单元softmax后输出的是各个词的概率,保留概率最大的3(beam width大小)个词。
3)如下图,分别取前面保留的3个词输入到网络中,预测第二个词。(如果B = 3,就复制3份这样的网络)
此时,可以通过P(y<1>,y<2>|x) = P(y<1>|x)*P(y<2>|x,y<1>)计算前两个词出现的概率。
4)如果vocabulary有10000个词,当前有3*10000个P(y<1>,y<2>|x)组合。取最大的3(beam width大小)个P(y<1>,y<2>|x) ,重复上述过程。
5)一般以EOS标志终止。
当B = 1时,就变成了贪心策略了。
17.改进beam search。
答:之前的beam search的目标函数可以拆成多个概率之积(概率的链式法则),每个概率都是小于0的,当句子很长时,可能造成数值下溢,因此如下图,给它加上log。
但是仍然存在一些问题,p ≤ 1,则log p ≤ 0,模型会更倾向于选择短的句子。
因此,如下图所示,再加上一个句子长度惩罚项,Ty为句子长度,α为超参数,0 ≤ α ≤ 1。(Length normalization)
需要注意的是,beam search不能保证找到最优解,只是一个近似搜索。
18.beam search的误差分析。
答:通过误差分析来判断改进beam search还是改进RNN。
对于一个句子的翻译,人工翻译为y *,模型翻译得到y ^。
将y * 和y ^ 放入RNN,计算P(y * | x)和P(y ^ | x)。
如果P(y * | x) > P(y ^ | x),说明beam search没有选择更好的解,因此改进beam search;如果P(y * | x) ≤ P(y ^ | x),说明RNN更倾向于选择后者,而前者却是更好的翻译,因此要改进RNN。
通过多个example来判断beam search和RNN分别出错的比例,可以了解更应该focus在哪个方面来改进模型。
19.注意力模型(attention model)。(很重要,GAT里用的就是这个想法)
答:在翻译中使用attention的想法,比如说一个长句子翻译,一般不会读完整个句子再全部翻译,而是读一点翻译一点。对于第一个词的翻译,我们希望把更多的attention放在原句第一个词附近的词上,而不是很远的词。
如下图,使用双向RNN,a<t'> = (a_-><t'>,a<-_<t'>) 也就是正向和反向两个激活值组成的向量(正向和反向激活值都可以是高维的)。C<1>,C<2>,...,C<t>是attention,也就是对所有a<t'>的加权求和。然后把attention的值,再往S层传。
计算attention α<t,t'> (第一个t是上图中S层的输出那个t,第二个t'是上图中最下面一层的那个t)。
α<t,t'> = amount of attention y<t> should pay to a<t'>
具体α<t,t'>的计算如下式,使用softmax是为了让所有权重加起来为1。
e<t,t'>看下图,使用了一个小型神经网络来训练。这么直觉上可以这样想,α<t,t'>和e<t,t'>应该与s<t-1>和a<t'>有关,但是我们不知道这个函数关系,因此用小型神经网络让它自己学习。