week(一)循环序列模型
1.1为什么选择序列模型
在下图中,列举出了一些“序列模型”能够应用的场景:
speech recognition:}X:语音片段,y: 语音片段},supervised learning
music generation:{X:input可为空集,y:生成的音乐},supervised learning
sentiment classification:{X:一段评论,y:writer的情感分数},supervised learning
DNA sequence analysis:{X:一段基因片段,y:判断基因是否为蛋白质…},supervised learning
machine translation:{X:一段话,y:一段话},supervised learning
video activity recognition:{X:一系列图片,y:人的动作},supervised learning
name entity recognition:{X:一段话,y:名字},supervised learning
1.2 数学符号
本节中主要给出了“序列模型”中,用到的各个符号的意义,以及word在“序列模型”中的表示方法:
- notation
在序列模型中:
x:表示一段话中的第i个单词
y:表示第i个output
x(i):表示第i个样本
x(i):表示第i个样本的第t个单词
y(i):表示第i个样本的第t个output
Tx:表示某样本的单词量
T(i)x:表示第i个样本的单词量
Ty:表示某个样本的output的长度
T(i)y:表示第i个样本output的长度
- 序列模型中word的表示方法——> one-hot
在序列模型中,会构建一个“dictionary”,比如现有dictionary={a,harry,potter,and,hermione,granger,invented,new,spell},则下述PPT中句子x中各单词的表示方法为:以a为例:[1,0,0,0,0,0,0,0,0]。a的特征向量的长度与字典长度相同,其 特征向量由0,1构成,除a在字典中出现的位置为1外,其它的位置均为0.
利用one-hot进行word表示,可能存在一个问题,即,句子中某个word在dictionary中没有,针对这种情况,我们可以将dictionary中找不到的word标记为 (unkown)。
1.3循环神经网络模型
本节我们主要介绍一下“循环神经网络”:
- 用“普通神经网络”解决“name recognition task”的弊端
假设我们现在要解决一个"name recognition task":即:给出一段话,识别这段话中的name,如果我们用“标准的神经网络”来解决这个问题,流程如下图所示:
input:为一段话x(i)=(x<1>,x<2>,…,x),passage中的每个word都用one-hot的方式能行表示。
output:为y(i)=(y<1>,y<2>,…,y),其中y为第k个word是否为name,y为第k个word为name的probability。
利用“传统的神经网络”进行fit,有2个弊端,如下:
- 在实际的application中,每段话(input)的长度Tx不一定相同,这使得无法固定“neural network”的input dimension,output同理。且在使用one-hot表示word时,input的dimension将是非常巨大的。
- “普通的神经网络”无法将前边学到的知识应用于后来者,如:假设model对一段话中第一个“Harry”的预测结果为name,当model遇到该段话的第2个“Harry”时,他不能从前边学到的知识推断出Harry为name,而是要从头开始学习Harry是否为name。
针对上述两种downside,循环神经网络都可以很好的解决。
- 循环神经网络结构
下图所示为“循环神经网络”得结构:
normal neural network:input会一次性的喂给neural network,output也会一次性的从model末尾输出;normal neural network无法吸取学习经验,每次学习都是从零开始。
recurrent neural network:一段话x(i)中的每个word x是依次输入recurrent neural network的hidden layer的,output y也是依次从每个hidden layer中输出的;recurrent network可以吸取上一个hidden layer的学习经验,将其应用于本次hidden layer的学习中。具体结构如下图所示。
“基本的循环神经网络”有一个缺点,它只能获得当前word之前,其它词汇的学习经验,而无法获得后边词汇的学习经验,如下图中的2段话所示,在识别Teddy是否为name时,“循环神经网络”只能借鉴前边已学单词的学习经验,而无法将Teddy后边的单词应用于Teddy的学习中。
“循环神经网络”的学习公式如下图所示:
首先对notation进行定义:
Wax:W的第一个下标a,表示该W要计算的东西为a like quantity,W的第二个小标x,表示该W要乘的东西为x like quantity。
在“循环神经网络”中涉及到3类parameter w,第一类为input的parameter Wax,第二类为activation的parameter Waa,第三类为output的parameter Wya。
在“循环神经网络”中,input的active function常为tanh,ReLu;output的active function常为sigmoid或softmax(binary/multi classification)。
如下图所示:
第l hidden layer的activation能够应用第l-1 hidden layer的activation:a = g(Waaa + Waxx + ba);
第l hidden layer的output为:y = g(Wya*a + by)
一般情况下,我们把a<0>初始化为0。
note that:循环神经网络每个hidden layer的参数Waa,Wax,Wya均相同。
在接下来的几节中,我们为了describe方便,会简化一些notation,具体如下图示:
Wa = [Waa | Wax]
Wy = Wya
1.4 通过时间的反向传播
上一节中,主要介绍了recurrent network的forward propagation,这一节,将主要讲述recurrent network的backward propagation。
recap:在计算backward propagation时,需要用到forward propagation的一些已知数:a,z;
如下图所示,为“循环神经网络”的backward propagation:
在计算backward propagation时,最重要的是确定“目标函数”,recurrent network中hidden layer t的目标函数为:
L(y,y’) = -y logy’ - (1-y) log(1-y’);其中y为target value,y’为prediction。
recurrent network的目标函数为各个hidden layer 目标函数的summation,如下图所示:
知道目标函数后,我们即可用求导的方式,回溯各层hidden layer参数的更新值(类:neural network的backward propagation)。
在前面几节中,我们讲的循环神经网络,拥有相同维度的input和output,下面一节我们将讲解更多其他形式的循环神经网络。
1.5 不同类型的循环神经网络
下图中总结了一些常见的“循环神经网络”模式:
1) one to one recurrent network;
2)one to many :sequence generation model ,如:music generation;
3)many to one:如:sentiment classification;
4)many to many:如:name recognition;(input = output)
5)many to many:如:machine translation;(input != output)
其中,sequence generation model还有很多细节需要注意,将在下一节中详细介绍。
1.6 语言模型和序列生成
Language model是指:给定一个sentence,通过language model,可以判断该sentence的probability。
- 简介其训练过程:
training data为corpus of text,假设text表示为(y<1>,y<2>,…y),y为一个word的one-hot表示。
将training text的各个word l 依次输入language model的各个hidden layer l+1,并求得各个hidden layer的相对应的word y的output softmax probability 表示,假设为p。
language model的目标函数是:求使得所有样本的似然函数(p<1>p<2>…p…)之和最大时的参数W,即(利用最大似然函数求解W)。
note that:language model每层的参数均相同。
在获得一个language model之后,即可预测某一input sentence的概率P(sentence)。
- language model的应用:
1、machine translation:machine learning model的前半部分只有input,而后半部分只有output(即:language model),在machine learning model的前半部分依次将各个input x输入到各个hidden layer,在machine learning model的后半部分(language model),依次输出各个 prediction word y,并同时可得y的概率值yhat(在machine translation model中,output的是拥有最大softmax概率值的word);
2、给定一句话,预测下一句话为某sentence的probability(个人理解,其model和machine translation model差不多,都是由两部分“循环神经网络”组成,即:input-model,output-model)。
- Language model训练步骤如下:
第一步:将training sequence tokenization,如:将下图中第一个句子(cat…day)进行tokenization 为(y<1>,…,y),每个y表示一个one-hot vector。
在这一步中有两点需要注意:1)当一个sentence完结时,需要给其加’EOS’表示end of setence;2)当一个setence中出现dictionary中没有的word时,将此word标记为UNK表示unkown word;
Tokenization如下PPT所示:
对training sequence做完tokenization后,将其丢到RNN中进行training;
具体如下PPT所示:
RNN中的input:a<0>=0,x<1>=0,将其丢给activation function,得到a<1>,然后在用output function softmax,得到 ,为一概率值。如果dictionary 中有10,000个word的话,则其维度为10,000。下一阶段,将x<2>=y<1>,通过计算a<2>,得到RNN hidden layer2的softmax output probability,
,依次类推,求所有hidden layer的output softmax probability :,…
在得到这一系列output softmax probability 后,即可构建cost function,
RNN的cost function 为最大似然函数(求使得样本序列概率最大时的参数W):
上述公式中,yhat为一个单词概率向量,维度与dictionary维度相同。y表示time t的training sequence 对应word_t 的one-hot vector,二者乘积表示:在time t输出word为word_t的概率值。
通过上述的cost function,利用backward propagation,即可求得“循环神经网络:language model”的参数W。
Weight的具体求解方法如下:
1)初始化weight,求cost function导数;
2)利用gradient descent(backward propagation)求解weight: w = w-;
1.7 对新序列采样
- 基于word-level language model进行“新序列采样”
首先,利用一个text corpus训练一“循环神经网络:language model”,如下图(1)所示(具体language model的训练过程可以参见上一节)。
其次,在获得训练好的“language model”后,即可利用该网络进行“新序列采样”,具体过程如图(2):
在“新序列采样”中,将用到一个function:numpy.random.choice随机选取内容,他可以根据一个概率分布,随机选取样本。
“新序列采样”过程如下:
首先, 明确“language model”中a<0>,x<1>为0。
根据hidden layer1的output softmax distribution,利用np.random.choice()从dictionary中随机抽取样本y<1>(为one-hot表示),并将其送入hidden layer2中,用于形成layer2的output softmax distribution(note that: dictionary中有多少word,softmax就会形成多少个probability)。
在hidden layer2中,x<2> = y<1>,根据layer2的output softmax distribution利用np.random.choice()从dictionay中随机选取一个sample,作为layer2的output word,y<2>,并将其送入hidden layer3,用于形成layer3的 output softmax distribution。
hidden layer3的操作与hidden layer2的相同。
重复上述操作,直到达到以下situation之一:
situation1:np.random.choice()抽到EOS,句子结束符,停止采样。
situation2:采样得到的word个数达到指定数目,停止采样。
将各个hidden layer中随机选取的word按照时序输出,即为根据language model随机采样生成的 “序列”。
note that:上述训练好的“language model”输出的是yhat,为dictionary中各个word的概率值。但是,送入到下一个hidden layer l+1 的不是概率值yhat,而是word的one-hot vector: y。
与word-level language model对应的还有一个character-level language model,其dictionary为一系列character,而在word-level language model中其dictionary为一系列word。
与word-level language model相比,character-level language model具有以下的特点:
首先,在character-level language model中,其dictionary可以根据training text中的字母来建立(甚至也可将标点符号加入dictionary中)。
其次,在character-level language model中,text的表示方法(y<1>,y<2>,…,y),y指的并不是一个word,而是一个“字母”。
第三,在character-level language model中,再对training text进行tokenization时,不用担心会遇到dictinary中没有的word,而导致无法求其probability,因为,不管什么word都可以用字母表示。
第四,character-level language model最大的一个缺点在于,用它进行标记的text 维度将会很大(因为它是用字母,而非单词,对text进行标记)。因此,比起word-level,character-level不善于捕捉“句子前后部分的相互依存关系”。
第五,与word-level相比,character-level language model计算量以及hardware的消耗量都非常庞大。因此,目前,工业界应用较多的依然为word-level language model,而character-level只有在 text data包含很多dictionary中没有的word情况下,才会应用较多。(还有其他应用场景,以后收集)
下图为character-level language model:
1.8 带有神经网络的梯度消失
- vanishing gradient
vanishing gradient:使得你的RNN很难将离当前hidden layer l较远的hidden layer l-n的信息利用起来,举例说明,如下图所示:
图中两个句子如下:
tha cat … was…
the cats … were …
可以看出这两个句子,其前后部分是有关联的:cat/cats —— was/were
但是,在RNN中,由于gradient vanishing,使得通过cost function的backward propagation很难影响位于shallow layer的weight。因而,使得RNN很难将shallow layer学习到的东西应用到deeper layer。引起这种现象的原因称为“vanishing gradient”。
- exploding gradient
exploding gradient:会使得weight变得非常大,可能造成RNN系统崩溃,其典型现象是在neural network computation时,可能造成“数值溢出”。对于exploding gradient的一个解决方案时:gradient clipping(其具体操作为:当gradient vector的value>threshold(maximum)时,对gradient vector进行缩放,保证它的value不会太大。)
在实际应用中,相比vanishing gradeint,exploding gradient更容易解决。在下一节中,我们将讲解vanishing gradient的一个robust 解决方案:GRU单元。
1.9 GRU单元
GRU单元是对RNN 的 hidden layer进行一定modification,从而使得RNN能够将shallow layer学习到的信息应用到deeper layer,解决 vanishing gradient problem。
- RNN visualization
下边为RNN hidden layer的一个图示:
其中,hidden layer l的active function为tanh,该hidden layer既可以output 下一个hidden layer l+1 的a,也可以output一个softmax probability:yhat。这种典型的RNNmodel,只能利用前一个hidden layer l-1学习到的信息:a,但是,却无法利用距其较远的hidden layer的信息,这种现象也称vanishing gradient,即:随着time的进行,在a<0>上相乘的Wa,不断累积:W<1>aW<2>a…Wa*a<0>,从而使得到达a时,其a<0>对于a的影响力已经很薄弱,从而无法获知a<0>的知识。
为了解决上述问题,学者引入了GRU的概念。
- GRU 单元
以下为standard GRU图示:
对RNN的hidden layer应用GRU,可以使得RNN将shallow layer信息应用于deep layer中。
如下图例句:the cat , … ,was …。
引入GRU后的RNN,在“was” 位置能够捕捉到“cat”位置的信息,从而,得出“was”,而非“were”的结论。
下面具体介绍GRU的工作原理:
首先,明确几个概念:
c = a:a为hidden layer t的active fucntion value。c为hidden layer t 输出的“记忆单元”。
ctilt = tanh(Wc[c,x] + bc) :ctilt为 hidden layer t 中新引进的“记忆单元”(hidden layer t中输出的“记忆单元”的候选值),用于计算hidden layer t输出的c。
gama_u = sigmoid(Wu[c,x] + bu) #gamma_u为一gate,用于决定是否更新整条RNN链上的“记忆单元”(c)。gama_u的取值介于0和1之间。
c = gama_u * ctilt + (1 - gama_u) * c^ ; 假设gama_u=1,则hidden layer t输出的“记忆单元”会完全去除前一个hidden layer记忆单元c^的影响,而只记录当前hidden layer的“知识”,用于后序hidden layer的引用。通过每层hidden layer 的gama_u可以决定当前hidden layer的记忆单元要包括的部分(前一层的记忆,当前层的记忆)。
以下图例句说明:
当hidden layer = ‘cat’时,其输出的信息单元包括’cat’。
当hidden layer='which’时,根据当前层gama_u的计算值,决定保留’cat’信息。
…
一直到hidden layer = 'was’时,当前层的activation更新应用到了‘cat’信息,并在应用之后,根据当前层gama_u,决定释放’cat’信息。其输出的“信息单元”中将不再包含’cat’的信息。
在前边的GRU中,ctilt的计算(ctilt = tanh(Wc[c,x] + bc)),百分百会包含c的信息。在接下来的PPT中,我们将对ctilt的计算公式进行调整,使ctilt对于c的依赖与否,也由一个gate gama_r决定。具体请看以下PPT:
ctilt = tanh(Wc[gama_r * c,x] + bc)
gama_r = sigmoid(Wr[c,x] + br)
个人理解:引入GRU的RNN,cost function依然为“最大似然估计”。参数求解方法依然为backward propagation。
除GRU外,学者也引入了很多其他的version of GRU ,来获得一个longer range dependence(即:使得RNN能够保存更长序列的hidden layer的信息,共deeper layer使用),具体,自行查看文献。下一节,将讲述GRU的一个变种,LSTM。
1.10 长短期记忆(LSTM)
LSTM与GRU不同的几点:
0、LSTM中有3个gate gama_o,gama_u,gama_f。GRU中只有2个gate gama_u,gama_r。
1、在LSTM中,a将不再等于c。而是引入output gate gama_o,使得a = gama_o * c。
2、在LSTM中,c中对于c和ctilt的权衡,将不再仅用一个gama_u来决定,而变成了分别用gama_u和game_f来决定c中,是否引入c和ctilt这两种记忆单元,即:c = gama_u * ctilt + gama_f * c。
3、GRU的优点在于,他较LSTM是一个simpler model,因此,应用于network时,可以构建一个更深的neural network。而LSTM则more powerful,more flexible。
下图展示了GRU和LSTM的区别:
下图为LSTM公式的总结,以及图示:
除图中LSTM外,一些学者还引入了LSTM的一个变种:
其差别具体体现在3个gate的求解上:
gama_i = sigmoid(Wi[a,x,c] + bi) #即gate的计算中引入了变量c,gate这种计算形式被称为peepble connections。
question:图中LSTM图示中,a = gama_o * tanh(c),而非a = gama_o * c。
如果在实际中,要在GRU和LSTM中,选一款的话,目前,大多数人会优先选LSTM,因为,它历史悠久,久经试炼。
1.11 双向神经网络(BRNN:bidirectional neural network)
- 双向神经网络 构建
所谓“双向神经网络”,是指对于某一hidden layer的预测,它不仅可以“吸取shallow layer的学习信息”,而且也能“吸取deep layer的学习信息”。需要注意的是,进行“双向神经网络”训练,需要得到完整的sample信息,对应到speech recognition中,你需要等speaker说完以后,才能对其说话内容进行预测。而在NLP中,你要得到一个完整sample后,才可用“双向神经网络”对其进行分析。
“双向神经网络”流程具体如下图所示:
其前向神经的计算如下:
hidden layer1 :a-><1> = g(Wax* x<1> + ba)
hidden layer2:a-><2> = g(Wa[a-><1>, x<2>] + ba)
hidden layer3:a-><3> = g(Wa[a-><2>, x<3>] + ba)
hidden layer4:a-><4> = g(Wa[a-><3>, x<4>] + ba)
其后向神经的计算如下:
hidden layer4:a<-<4> = g(Wax* x<4> + ba)
hidden layer3:a<-<3> = g(Wa[a<-<4>, x<3>] + ba)
hidden layer2:a<-<2> = g(Wa[a<-<3>, x<2>] + ba)
hidden layer1:a<-<1> = g(Wa[a<-<2>, x<1>] + ba)
计算hidden layer i的output yhat :yhat=g(Wy[a->, a<-] + by)。yhat同时兼顾了shallow layer 的信息 和 deep layer 的信息。
举例说明:
He said ‘Teddy Recaoult’…
预测Teddy是否为name,如果用“单项RNN”,则其只能利用Teddy前边的信息进行判断,而无法利用其后边的信息。而如果用“双向RNN”,则其不仅能利用“Teddy”前边的信息(he said),也能利用其后边的信息(Recaoult)。
question:在“前向神经”和“后向神经”的计算中,其参数W,b,是否相同?
- BRNN中参数的求解
BRNN中,cost function为“最大似然估计”,参数求解方法为“backward pro
pagation。
在求“前向神经”参数时,其forward方向为left -> right,因此,其backward propagation的方向为:right -> left。
在求“后向神经”参数时,其forward方向为right -> left,因此,其backward propagation的方向为:left -> right。
note that:在NLP问题中,常用“双向神经网络 + LSTM” model。
1.12 深层循环神经网络
相比“深层卷积网络”,“深层循环网络”一般可达的layer 数量要小很多,这是因为,RNN中每层layer中,还有“时间序列 layer”,由于这个原因,即便RNN层数较少,其总得layer数量也已经很多。
下图,介绍了“深层循环神经网络”的构建方法:
首先,介绍notation:
a[l]:[l]表示RNN的layer数,表示hidden layer l中的第i个时间点。a[l]表示hidden layer l中第i个时间点的activation。
以a[2]<3>为例介绍各层layer的activation的计算方法:
a[2]<3> = g(W[2]a * [a[2]<2>,a[1]<3>] + b[2]a);
有些学者在“深层循环网络”中,每个时间点t的output会加一些“deep neural network”用以预测output y,如下图所示:
在“深层循环网络”中,每个unit的设置可以引入GRU,LSTM等modification,从而增强“深层循环神经网络”将shallower layer信息应用于deeper layer信息的能力(to achieve longer range dependence)。
week(二) 自然语言处理与嵌入
2.1 词汇表征
- one-hot vector VS word embeding algorithm
在week 一 中,我们介绍了一种表征word的方法,即:one-hot vector,其形式如下图所示:
所谓one-hot vector是指:为表征word我们首先构建一个dictionary,然后将word表示为由0 , 1构成的n维向量(n=length of dictionary),word one-hot vector中 的元素除word在dictionary中所在位置为1外,其余均为0.
这种word表示方法的一个显著缺点是,他无法表征两个word之间的相关关系,因为,每两个word之间的inner product均为0。
学者为解决one-hot vector面临的这种问题,提出了一个表征word的新方法,即:word embedding,利用word embedding algorithm能够获得word的featurized representation,他能有效表示两个word之间的相关程度,具体如下图所示:
图中word的特征向量是在(gender,royal,age,…,food,…)等多个维度的一个表示,其每个维度的value都代表着:该word在这一维度(如:gender)上的“显性程度”,value越大,说明,word在该维度的属性越明显,value越小,说明,word与该维度的相关性越低。
从下图可以看出,apple和orange的inner product较大,说明二者的相关度较高,利用apple和orange的相关性,alogrithm可以很好的将一些“适用于orange的词汇搭配”推广到“apple”上(即:word embedding能够显著提高algorithm的泛化能力)。
需要注意的是,利用word embedding algorithm获得的word的featurized representation,其各个维度所表征的意义很难人为界定(不像图中所举栗子,每个维度都有其所要表征的意义),虽然,我们无法明确featurized representation各个维度的意义,但是,不可否认,它是word的一种很好的表示方法。
下图为利用featurized representation表征的word的可视化图,从图中可以看出,这种特征向量,能够清楚的反应不同word之间的相关关系(利用 t-SNE 可以将高维向量映射到低维空间,从而更加直观的观察不同word之间的相关关系):
t-SNE算法
一种新的Unsupervised learning算法:t-SNE
Python中T-SNE实现降维
TSNE——目前最好的降维方法
2.2 使用词嵌入(word embedding)表示word
- word embedding可以使algorithm具有更好的泛化能力
利用word embedding表示word,可以使algorithm具有更好的“泛化能力”,以下图中所示task为例进行说明(note that:图中的RNN应该修改为BRNN):
图中所示为:用RNN 进行 name recognition
1、假设word用one-hot vector进行表示:
如果apple farmer,orange farmer都在training data中,则当利用训练好的BRNN识别“Robert Lin is an apple farmer”中的name entity时,BRNN能够准确将Robert Lin 识别出来,但是,假设durian cultivator没有出现在training data中,现在要识别的是句子“Robert Lin is a durian cultivator”中的name entity,则BRNN则可能无法准确识别出Robert Lin。这是因为,word使用的是one-hot 表示,而one-hot无法得出word之间的相关关系,因此BRNN判断不出duriancultivator和orange farmer具有相似的意思。
2、如果在上述的name recognition task中,将word用word embedding表示,由于word embedding可以推断出不同word之间的相关关系,因此,在使用训练好的BRNN识别“Robert Lin is a durian cultivator”中的name entity时,即便durian cultivator没有在training data中出现过,BRNN也可以根据durian cultivator的“特征向量”,判断出他与orange farmer意思相近,进而,推断出Robert Lin是一个name。
- transfer learning and word embedding
用word embedding algorithm在大量数据上学习到的word embedding,可以应用于其他的NLP task(小型数据量)中,具体阐述如下:
在transfer learning(A transfer to B)中:如果A的数据量很大,而B的数据量较小,这种情况下利用transfer learning 可以得到很好的效果。而当B中的数据量也较大时,此时,最好利用A的结果在B的数据集上,对word embedding 进行微调,然后在将微调后的word embedding应用于task B中(即:将微调后的word embedding作为“特征向量”表征task B中的word)。
- the relationship between face encoding and word embedding
face encoding和word embedding本质上都是一种“特征向量”,用来表征object。但是,二者的应用范围差别很大:face encoding中,只要训练好Siamses network,便能得到任何一个image的编码(将image输入Siamese network,Siamese 将输出该image的编码),而word embedding中,通过一个word embedding algorithm只能得到dictionary中word的编码,对于dictionary以外的word则无能为力。
下图所示为face encoding中,Siamese network结构图。
2.3 词嵌入(word embedding)的特性
- analogy reasoning
word embedding 能够用于 “analogy reasoning”,如下图所示:
下图为各个word的word embedding(featurization representation)表示,通过word embedding不仅可以表征各个word之间的相似度,而且,可以进行analogy reasoning,比如:根据man -> woman,可得出king -> queen。该推演过程具体如下:
求解 eman - ewoman = eking - e?(其中eword为word的word embedding)
上式又可表示为:求解e?,使得similarity(e?,eking-eman+ewoman)最大。
两个eword之间相似度的表示方法如下一部分所示:
- 相似度定义
两个word的相似度可以用2种表征方法:
1) cosine similarity:sim(u,v) = uTv/||u||*||v||;值越大,相似度越高;
2)欧几里得距离:||u-v||2;值越大,相似度越低;
- word的word embedding visulization
将各个word的word embedding进行visulization,如下图所示:
从图中,可以看出,在未进行“降维”之间,man->woman,king->queen,呈现为“平行四边形”,表明,man->woman,king->queen,具有analogy reasoning。
需要注意的是,利用t-SNE,对word embedding进行降维处理后(300D 降到 2D),将破坏原word pair之间的那种“平行四边形”结构,因为,t-SNE为non-linear 降维方法。
2.4 嵌入矩阵
嵌入矩阵:一个dictionary中所有单词的word embedding vector组成的matirx,如下图所示:
1、notation
oj:代表word j的one-hot vector;
ej:代表word j的word embedding;
E:embedding matrix;
2、embedding matrix
假设dictionary中有10,000个word,每个word的word embedding为300D,则“嵌入矩阵”为300*10,000 的matrix。
此时,ej = E * oj (1)。
note that:在实际应用中,提取word j的word embedding,并不采用(1)中的multiplication所示,因为,这种“提取方法”计算量过大,以Keras为例,其会利用special function直接从embedding matrix 中提取出column_j,也即ej。
2.5 学习词嵌入
本节中主要介绍一些“embedding word learning algorithm”。
- 以下图为例,简要介绍word embedding learning algorithm的核心思想:
下图task是:learning language model,learning word embedding matrix。
training data:corpus of text。将corpus of text分解为:{X:给定context,y:待预测的next word}。
如:I want a glass of orange juice。该句training data中,X可以是"I want a glass of orange",y可以是“juice”。
这个task主要通过下述model完成:
1、model的结构:
input:context中各个word的word embedding。
output:context下一个word的预测值。
architecture:context X -> neural netwok -> softmat -> prediction y。
2、model的parameter和hyperparameter:
hyperparameter:n(用前n个word去预测next word);
parameter: word embedding matrix,neural network weight,softmax weight;
3、model中parameter的求解过程:
step1:初始化各个parameter;
step2:model的cost function为“最大似然估计”,利用cost function的gradient descent(backward propagation),求解parameter的更新量。
step3:重复step2,直到达到停止条件,停止iteration。
- language model 和 word embedding 学习过程中,context的设定
如下图所示:
1)在language model learning中,其context(input)可以选用:last 4 words;
2)在word embedding learning中,其context(input)可以选用:
type1:待预测word,前后4个word一起作为context,即: 4 words on left of the prediction and 4 words on right of the prediction;
type2:last 1 word;
type3:nearby 1 word;
在下一节中,我们将介绍一种word embedding learning algorithm “Word2Vec”。
2.6 Word2Vec
- Word2Vec
本节将讲解一个word embedding learning algorithm:Word2Vec ,Word2Vec包含2个version,分别为skip-grams,和CBow。二者learning word embedding的核心思想相同,但是其(input,target)的选取方式不同,具体如下:
- skip-grams:
input:从 training text中,sample一个word作为input(context);
target:其要预测的word为该context“fixed window”内的word。如:从该context 前10或后10个word中,sample一个作为要预测的word。
output:dictionary中各个word为prediction word的概率值。
- CBow:
input:在待预测的word(target)两侧,随机选取一个word作为context(input);
output:dictionary中各个word为prediction word的概率值。
本节重点讲解skip-grams algorithm:
下述PPT中,为skip-grams中(context,target)的选取(参考上边所述规则)。
skip-grams algorithm的结构为: context(word embedding) -> softmax ->output(probability of each word of dictionary);
note that:skip-grams并不能得到好的language model,因为,其(context,target)几乎是随机选定的,但是,通过skip-grams可以得到很好的word embedding.
- 下图为skip-grams model:
skip-grams的结构为:context(word embedding) -> softmax -> probability of each word of dictinary(p(t|c)的求解公式如下图所示,t:target,c:context);
skip-grams的cost function为:“最大似然估计”(L(yhat, y),如下图示,公式中,yi为预测word_i的one-hot vector,yhati为model输出的概率向量,yi * yhati为预测word的概率值)。
skip-grams的parameter为:word embedding matrix,softmax parameter。通过“最大似然估计”(gradient descent),即可求解这些参数。
在skip-grams中,存在一个downside,即:p(t|c)的计算量很大,非常耗时,未解决这一问题,有学者提出了“hierachical softmax”,具体如下一部分所示。
- 下图所示为“为改进skip-grams中p(t|c)计算量过大的问题”,而引进的hierachical softmax classifier:
如图所示,根据“hierachical softmax classifier ”,判断predicting word概率p(t|c),其具体方法如下:
首先声明:
在“hierachical softmax classifier”中,每个node为一个logistic classifier。
“hierachical softmax classifier”的每个内部结点,代表一个dictionary 范围,如:根节点代表dictionary,根节点下的两个左右分支,left-branch代表“dictionary中前5000个word,设为section_l”,right-branch代表“dictionary中后5000个word,设为section_r”。left-branch中的两个分支{left:section_l中前2500个word,right:section_l中后2500个word}。
p(t|c)计算方法:
个人理解:将context输入根节点,一路判断其属于哪个分支,直到其落到“叶子节点”,该叶子节点即为predicting word的概率值p(t|c)。(每个叶子节点为dictionary中的一个word,各个叶子节点的function是不一样的,因此,利用context作为input,求得的dictionary中每个word的概率值p(y|c)也不一样。)
在“hierachical softmax classifier”中,p(t|c)的计算量从linear in vocabulary size 降为了 log in vocabulary size。
note that:“hierachical softmax classifier”在实际应用中往往不是一颗“balance tree”(如图 right-hand)。其shallow layer中存放的是“较常用到的word”,其deep layer中存放的是“较少用到的word”,这样的“非平衡树”可以进一步减少p(t|c)的计算量。
- 在skip-grams中,context(input word)的选取方式
在skip-grams中,input word不能用uniform distribution进行随机抽取,因为,这种方式,抽到的input word基本上都是常用word,如:the , of ,a ,and 等,而类似orange, apple ,durian等真正想要的word抽到的几率很小,这样,skip grams algorithm将花费很多力气去训练这些meaningless common word,而忽视了concerned word。
未解决skip grams中,context的sample问题,很多学者提出了“启发性策略”,详情,自行查阅文献。
2.7 负采样(negative sampling)
“负采样”是skip-grams algorithm的一种改进算法,它利用batch的思想,解决了skip-grams algorithm中,p(t|c)计算量巨大的难题。
- “负采样”样training data的创建
“负采样”中,training data的形式为(context,word,target)。
在一个batch training data中,共有1+k个training data,他们拥有相同的context,但是,只有一个target=1(mean:context,word均来自training text),其它k个target=0(mean:context来自training text,word从dictionary中sample)。
notation:
target=1的sample为positive sample;
target=0的sample我negative sample;
note that:k的取值:对于smaller data set,k为(5-20);对于larger data set,k为(2-5);
target=1时,word的sample方式,与skip-grams中target的sample方式相同(skip-grams中training data的形式为(context,target))。
target=0时,word的sample方式可以采用以下形式:根据p(wi) distribution从dictionary中sample word(wi为dictionary中的word),p(wi)的计算公式如下:
- “负采样”算法
负采样算法核心思想:
具体如下图所示:
“负采样”training data=(context,word,target);
“负采样”model的input为:context(word embedding) ,表示为 ec ;
“负采样”model的output为:给定input 后 ,target的概率值,为k+1维vector,表示为p(y|c,t)。
“负采样”model为logistic regression,公式为 p(y|c,t) = sigmoid(thetaT * ec),其中,theta和ec在“负采样”算法中均是parameter。
“负采样”中cost function为“最大似然估计”,其利用gradient descent求解parameter。
“负采样”与skip-grams最大的不同是,在每次iteration中,“负采样”采用batch training data求解parameter,而skip-grams则是采用“所有的training data”求解parameter(注意:每个batch training data为k+1个sample),也正因为这种不同,使得“负采样”可以以较小的计算量求解sigmoid function(因为,“负采样”中,每个iteration只计算k+1个output,而在skip-grams中,每个iteration需要计算the length of dictionary个output).
note that:每个batch(context,word,target)中,有1个target=1(positive sample),k个target=0(negative sample);
2.8 GloVe词向量
- GloVec中的notation
GloVe algorithm中training data形式为(context,target),二者皆为training corpus of text中的word。
Xij:代表context j和target i同时出现的次数。
在GloVec中,其parameter同样有两部分,分别为theta 和 ej,二者定义具体参见下图中对GloVec algorithm的讲解:
- GloVec algorithm
构建GloVec的目标函数:
目标函数构建以后:可以用gradient descent求解参数;
- GloVec algorithm构建的word embedding不具备“interperation”
如下图所示:
根据GloVec最后所得的embedding vector并不能为人所解释(embedding vector各个维度并不一定相互垂直),这是因为,embedding vector的各个axis可能是综合了多个“性质”的综合体(如上图:ew,1同时综合了gender和royal的属性特征),尽管GloVec所得embedding vetor缺乏可解释性,但他依然可以很好的应用于analogy reasoning;
上图中公式:(A*theta_j)T *(A-1T * ej) = theta_iT * ej,表明,1)由GloVec得到的parameter并不一定为orthogonal;2)GloVec得到的parameter为“数值解”,而不是“解析解”。
Recap:在“序列模型”这一部分,提到的word embedding learning algorithm有以下几种:
word2vector (skip-grams ,CBow);
负采样算法(与skip-grams相近,但是解决了skip-grams中p(t|c)计算量过大的问题);
GloVec algorithm;
2.9 情绪分类
In the sentiment classification,you may face that there is not a huge label training set。10,000-100,000 data set is common. Using word embedding may help you do well in a small training set;
本节主要讲解利用“word embedding”进行“情绪分类”的2中方法:
- average input(word embedding)
如下图所示:
将“评论”中各个word的word embedding vector进行average,然后输入softmax function,可以output 5颗star的probability。
在这个算法中:
training data为(评论,star);
parameter为softmax中的参数;
cost function为“最大似然估计”,利用gradient descent可以求得softmax中各个parameter,用以预测test sample;
值得一提的是,即便test sample的某些word在“average”training data中从未出现过,由于test sample使用word embedding vector表征word,因此,依然可以根据“average”model得到很好的预测结果。
除此以外,训练word 的 word embedding ,可以独立于average 算法进行,即,在其它的large dataset上用word embedding learning algorithm训练好word embedding,然后将这些word embedding应用于average算法中的training data,这也是transfer learning的主要思想(transfer A to B中,A应为large dataset,B为small dataset,可达到更好的迁移学习效果)。
downside:average 算法中,并不考虑word出现的先后顺序,因此,可能给一个“负面评价”以“正面评分”,如: lacking a good tast ,a good service,good ambient;本是负面评价,但是由于该句子中出现太多good等positive词汇,因此,可能导致average算法将该评论视为正面评论。解决这一问题的办法为:利用RNN,进行sentiment classification.
- 利用RNN and word embedding进行“情绪分类”
其结构图如下:
在该结构中,softmax的输出依然为5个star的probability,当star对应的probability>0.5时,则点亮star。
在RNN中,依然可以用transfer learning进行“sentiment classification”:
A task:从large dataset学习word embedding;
B task:sentiment classification,仅有small training data;
可通过transfer A to B,进行sentiment classification.
2.10 词嵌入除偏
本节中,将展示一些“去除word embedding中各种偏见”的方法:
如下图所示:
利用algorithm训练得到word embedding,在已知:man -> computer_programmer的情况下,woman得到的映射为homemaker。这显然是具有性别歧视的,为了消除word embedding中的这一“gender bias”(word embedding中含有gender bias,反映了,其training text中本身含有的gender bias),学者引入了很多方法,本节简单列举一例。
下图中列举出了一个“解决gender bias”的方法:
如下图:
grandmother和grandfather,girl和boy,she和he这些都是具有性别倾向的word。
但是,babysitter,doctor等word本身没有性别倾向,因此,他们与she和he间的相似度理论上应该是相等的,但是,实际上,却不是,为了解决这一问题,给出以下办法(图right-hand):
step1:首先确定bias direction,可用ehe - eshe,表示bias direction;
step2:将词性中立的word投影到bias direction的垂直方向上(unbias direction),消除这些word的gender bias;
step3:将具有性别倾向的word pair,使他们与中立词(如:doctor)之间的距离相等,从而消除:analogy reasoning时的gender bias;
question:在eliminate gender bias时,我们如何确定哪些word为中性词,哪些word有gender倾向?
answer:可以训练一个linear classifier来区分这些词,其中,由于具有性别倾向的word pair比较少见,因此,可以将这些词hand-picking,用以标记training data which is used to fit linear classifier model。
week(三) 序列模型和注意力机制
3.1 基础模型
本节中主要介绍了sequence to sequence model的两个应用场景:
- machine translation
下图所示为machine translation model(from Franch to English):
model的前半部分为encoding part,model的后半部分为decoding part。
- image caption
下图所示为image caption model:给定一张image,利用model,输出image的标题。
在该model中,image同过一个“卷积神经网络”进行encoding,然后,通过一个RNN网络,进行decoding(输出caption)。
3.2 选择最可能的句子
-
machine translation model可以看成是conditional language model,具体如下图所示:
从下图可以看出,在language model中,其model前半部分为a<0>,后半部分为decoding part。在machine translation model中,其model前半部分为encoding part,后半部分为decoding part。如果将language model中的a<0>用machine translation中的encoding part代替,则language model与machine translation model完全一致。因此,也把machine translation model看成是conditional language model。在之前所讲的language model,其output word为randomly sample based on a distribution of output。
在这一节中,我们想要machine translation model达到的目标是,能够output最优可能的translation,那么,这个目的如何达到呢?请看下一部分。
-
finding the most likely translation
如下图所示,过去所讲的language model的output word是randomly sample based on the distribution of output的结果,因此,多次输出的同一Franch sentence的translation可以好坏各异,如下图示:
为了找到一个最好的translation,我们设定如下的 目标函数:argmax P(y<1>,…,y | x),要满足这个目标函数,我们有2种方法,请看下一部分。
-
argmax P(y<1>,…,y | x)的方法
1)贪婪算法
依次找到使output y的概率值P(y|x)最大的那个output word,由这一系列word构成的output,可以使得P(y<1>,…,y | x)达到最大。
note that:贪婪算法中的最优解为局部最优解。
需要注意的是,贪婪算法,其实,并不能找到“最好的translation sentence”,原因如下图所示:
如下图中的2个translation sentence,很明显,第一句优于第二句,但是,如果用贪婪算法的话,则由于p(Jan is going|x) > p(Jan is visiting|x),贪婪算法,会错过“best translation sentence”。因此,贪婪算法,不可取。
2)search algorithm
假设dictionary中word有10,000个,output sentence长度为10。则要满足目标函数要求,可以从10,00010个可能的output sentence中,选出一个probability最高的sentence,但是,由于这种方法搜索量太大,所以不能直接执行,为此,我们可以设计一些search algorithm,简化搜索过程,从而,从所有可能中,找到一个“近似最优解”。
下节中,将介绍一些search algorithm,用于寻找best translation sentence。
3.3 定向搜索(Beam search)
Beam search的核心思想:
step1:以machine translation application为例说明,设定beam search的width=n,则在algorithm的decoding part,当output first word时,output3个probability p(y<1>|x)最大的word。如下图所示:这3个word分别为:in,jane,september。
step2:分别以step1中选定的3个word为y<1>,然后,寻找使得y<2>的probability p(y<2> | x, y<1>)最大的3个wordy<2>。在step2中,从找到的9个(y<1>,y<2>)组合中,找出3组probability最大组合(p(y<1>,y<2>|x))。在这3个组合的基础上,继续找y<3>。
step3:重复step2的步骤,找到3组probability最大的(y<1>,y<2>,y<3>)。
一直重复上述步骤,直到sentence结束。此时,即可从3个translation sentence中,选出probability最大的一个translation。
note that:beam search 比 greed algorithm效果要好。
在下一节中,将讲述一些 beam search的改进方法,从而使其能够得到更好的结果。
3.4 改进定向搜索
本节主要讲述一个改进“beam search”的方法:
首先,来看一下beam search存在的缺陷,如下图所示:
下图中,第一个公式为“beam search”的目标函数,这个公式存在以下缺陷:当translation sentence过长是,各个output word的probability multiplication将会非常小,可能导致numerical underflow;
为了解决这个downside,我们采用下图中公式2,即在原目标函数的基础上,加log,但是,这个目标函数依然存在一个downside,即:
对于shorter translation sentence,与longer translation sentence相比,其势必会得到一个较大的probability(这是因为shorter sentence只有几个word的probability要乘,因此, 不会使得小数缩减太多),由于这个原因,目标函数更倾向于选择shorter translation sentence。
为了解决这一问题,我们引入了公式3,即对公式2进行normalization(即,对目标函数除以Ty:length of translation sentence),通过normalization,使得目标函数对于translation sentence的长度没有了偏好,因而, 可以更加公正的选取translation sentence。需要注意的一点是,在进行normalization时,可以给Ty加一个指数,即:Tyalpha,0<= alpha<=1,通过选择alpha的值,可以决定目标函数是进行完全normalization(alpha=1),而是完全不进行normalization(alpha=0)。
在对beam search的目标函数进行modification以后,我们可以通过以下方法,寻找best translation sentence:
step1:定义beam search width = k(可以尝试在不同的k下执行以下几步,k可选1,3,10…。一般,在科研界,未得到较好的结果,k可达1000到3000不等);
step2:分别对Ty=1,2,3,…,30时,求各个Ty下的前k个最佳translation sentence;
step3:根据上图中的公式3,求这些 选出来的 最佳translation sentence的概率值,选取probability 最大的translation sentence作为最后的translation sentence。
note that:
3.5 定向搜索的误差分析
在machine translation中,model包含两部分(如下图所示):1)beam search ;2)RNN。当你的优化问题出现错误时,error analysis可以使你明白,是beam search出现错误,还是RNN出现错误。
下面具体讲解error analysis的过程,如下图示:
假设现有Franch to English的translation task,下面列出了对于同一条Franch的,Human translation(y*)和algorithm translation(yhat)结果。
理论上来讲,y*应该由于yhat,因此,如果machine translation最终选择的翻译结果为yhat,说明machine translation model的某一部分发生错误,具体,可以用error analysis进行分析,究竟是哪一块出了问题。分别利用algorithm计算p(y*|x)和p(yhat|x)的概率值,当:
case1:p(y*|x) > p(yhat|x)
此时,说明,beam search没有将概率值较大的y*选出来,说明beam search width需要进一步调整,以使beam search能够选出正确的translation sentence;
case2:p(y*|x) < p(yhat|x)
此时,说明,RNN对于y* 和 yhat的概率评估是错误的,应该调整RNN(判断RNN是bias问题,还是variance问题,然后根据相应问题,选择下列解决方案:增加training data;regularization;调整RNN architecture)。
将error analysis应用于实际的machine learning中,如下图所示:
将fit后的model应用于dev set,得到下列的“误分结果”,对这些“误分sample”进行分析,当sample的p(y*|x) > p(yhat|x)时,说明是beam search 错误,反之,则为RNN错误。
记录在“误分sample”中,beam search错误的个数,以及RNN错误的个数,将错误频次较高的model part(如:beam search)看成是machine translation model应该重点调整的对象,具体modification办法,如前所述。
3.6 Bleu 得分
Bleu score可以作为 a single real number evaluation metric ,来评价machine translation algorithm工作的优劣(对于给定的Franch,Bleu score可以根据reference评价由machine translaition algorithm得到的translation sentence的优劣程度(translation sentence的优劣是以reference为参照物,来界定的))。其中,reference是人工翻译结果。本节,主要介绍一下Bleu score的大体工作原理,具体详情,参见PPT下方literature:
Question:当ML-output较短时,BP反而很大,岂不是进一步增加了short ML-output 的得分吗?(可能上式只是intuition,具体参见literature)。
note that:Bleu score除能用于评价machine translation algorithm generate translation sentence 的precision外(based on reference),也可用于评价其它text generation 的algorithm,如 image caption。
值得一提的是,在实际中,很少有人从0开始训练Bleu score,往往是使用一些网上已经训练好的Bleu score,将其作为评价系统,直接应用于自己的system中。
question:如何训练Bleu score?
个人理解:现有training data(Franch,reference),根据训练好的translation algorithm,将Franch翻译为English,并且根据reference,计算这个algorithm翻译的精确度。从这个角度理解,Bleu score的应用,只需给已经训练好的algorithm在喂入training data,计算Bleu score既可,不需要额外训练什么Bleu score algorithm呀?
3.7-3.8 注意力模型直观理解
- the downside of previous machine translation model
在讲解attention model之前,我们先看一下上述所讲的machine translation model的downside,如下图所示:
在翻译一个较短的sentence时,previous machine translation model能够得到一个很好的Bleu score,但是,随着sentence长度的增加,该model的Bleu score也随之降低,这是因为,previous machine translation model仅能记住有限长度的sentence,当sentence过长时,其decoding part的精确性将随着时间的推移而显著下降,从而导致后边一点的output yhatTy 精度严重受损。为了解决model的这种问题,我们引入的“attention model”,它使得每个output word的产生仅基于一小段sentence,而不是the whole sentence(其具体实现方式,是通过给每个input word添加attention weight,从而可以highlight用于output word的重点input word,而将其他远离output的input word忽视掉)。具体attention model原理,见下一部分。
- attention model
1)attention model intuition
如下图所示:
attention model 是由2层RNN组成,下层BRNN用于计算input word的输出,在attention model中,每层BRNN的输出有3个内容:a=(a->t,a<-t),attention weight alpha。其中t: 第t个input word,t’:第t’个output word。
attention model中的上层RNN用于输出word y,y的计算与下列因素有关:alpha ,a,s,y。其中,s为attention model上层RNN中,第t’-1 layer的activation。而y将作为t’ layer的input x输入。alpha * a决定了y 依赖于哪一部分sentence决定(即:分别放多少关注度在input word_t上)。
由上可知:attention model的直观释义为:每一个output word分别由the whole sentence中的部分sentence决定。
关于attention model各个parameter的计算请看下一部分。
2)attention model详解
2.1)这一部分先看attention model上层RNN中,各个layer的input的计算方式,以layer 2为例,其input有以下3部分:
S<1>:layer 1的activation;
y<1> as input x<2>:layer 1的output word vector(embedding word);
c<2> = sum(alpha<2,t> * a) t=1,2,…,Tx。(t为input word的index)。
将上述3个input输入active function即可获得S<2>。将S<2>应用于output function,即可得到output probability vector,选取概率最大值对应word为output word。
2.2)在这一部分,主要讲解attention weight的求解方式,具体如下图所示:
note that:在下图公式中,t与t’的含义,与上述几部分的正好相反。
如下图所示,attention weight是由含一层hidden layer的neural network计算而来(alpha通过计算e的softmax而得,e由neural network计算而来),neural network的input为s,a。该neural network中的weight与attention model中的parameter一并通过backward propagation计算获得。alpha求解公式具体如图:
- Attention example
3.9 语音辨识
在传统的“语音识别”中,audio clip 输入speech recognition algorithm中,并不能直接output text transcript,而只能得到phonemes,在由这些phonemes组合得到text transcript。
随着deep learning 的发展,输入audio clip后,可以直接output transcript。
在speech recognition中,audio clip要先做一些preprocess才可以输入algorithm,具体如图left-hand(将audio clip 处理为 “声谱图”,横坐标:time,纵坐标:the intensity of energy)。
本节介绍了2种 speech recognition 的实现方式:
- 通过attention model实现speech recognition
在attention model中,每个output输出一个“字母”。
input为“声谱图”???
- CTC cost for speech recognition
在该model中,有1000个input就会有1000个output。
在speech recognition中,input 数量 > “字母” 数量,因此,对应到model上,不可能每个input都对应一个有效的output。未解决这个问题,在CTC中,允许output为重复值,如:ttt,也允许output为blank 用_标记,具体如下图所示:
当output为: ttt_h_eee___[space]_qqq…时,我们首先输出the,由于其后有space,可以判断q为下一个单词的开始。
采用这种model结构同样可以进行speech recognition。
3.10 触发字检测
- what is trigger word detection
当你喊出“trigger word”时,machine 启动;
- 利用RNN来构建一个trigger word detection algorithm
如下图所示:
input为“spectrum featurization(由audio clip处理而成)”,在model未检测到trigger word之前,model output为0,检测到trigger word时,output为1。
为了平衡training data中的target 中0多1少的unbalance situation,可以将检测到trigger word后的一个时间段内output都设为1,过了这个时间间隔后,在将output设为0,直到在次检测到trigger word为止。