RNN

之前刚开始接触AI的时候并没有学习RNN,现在补上。
首先为什么使用RNN呢?RNN相比CNN有哪些优势?因为有些问题存在以下特点,导致必须使用RNN来解决。

  • 输入和输出的长度不固定。
  • 区分输入的顺序不同,重要性不同。

RNN的缺点:

  1. 训练慢,不能充分利用并行计算。
  2. 对于距离长的句子,容易丢失信息。

RNN基础知识

在这里插入图片描述
其中每一个隐藏单元如下图所示:
在这里插入图片描述
如图所示, a < i > a^{<i>} a<i>表示第i个激活值,当i=0时,通常初始化为0.这些符号之间的关系为:
a < i > = g ( W a a a < i − 1 > + W a x x < i − 1 > + b a ) a^{<i>}=g(W_{aa}a^{<i-1>}+W_{ax}x^{<i-1>}+b_a) a<i>=g(Waaa<i1>+Waxx<i1>+ba) ,其中g()为激活函数,通常使用tanh.
y ^ < i > = g ( W y a a < i > + b y ) \hat{y}^{<i>}=g(W_{ya}a^{<i>}+b_y) y^<i>=g(Wyaa<i>+by),g()的类型取决于 y ^ < i > \hat{y}^{<i>} y^<i>的值,如果是二分类选用sigmod,如果是多分类选用softmax.
上边公式写起来有些繁琐,简化为:
a < i > = g ( W a [ a < i − 1 > , x < i − 1 > ] + b a ) a^{<i>}=g(W_{a}[a^{<i-1>},x^{<i-1>}]+b_a) a<i>=g(Wa[a<i1>,x<i1>]+ba) ,其中 W a W_a Wa表示 W a a W_{aa} Waa W a x W_{ax} Wax的增广矩阵, [ , ] [,] [,]表示上下型的增广矩阵。

  • RNN网络中权重共享。

概念

假设词典里有10K个词。每个词用embedding vector表示时,维度为300,那么:
嵌入矩阵:shape为(300,10K)。
one hot:shape为(10K,1),只有相同词的一项为1其他为0.

词嵌入的操作

  1. 人名识别:
    在这里插入图片描述
    从第一句话中,可由orange farmer推知Sally Johnson是一个人名。模型如果知道orange与apple相似,那么就也可以推知Robert Lin是一个人名。这两个词之间的距离常用的度量函数为余弦相似度函数。NLP与计算机视觉算法的一个不同点在于,如果一个词在词典中不存在那么不能比较距离,而在计算机视觉的任务中,依然可以计算其特征向量并计算距离。还有一点需要注意的是当训练集数据很少时,可以使用迁移学习,使用已经训练好的词嵌入向量,并且通常情况下不需要微调。
  2. 类比推理:
    在这里插入图片描述

已知男人->女人,那么推理国王->王后,与1中的方法相同。计算两个词嵌入向量(embedding vector)的距离。

word2vec

与2013年谷歌提出的NLP工具,目的是将词向量化。之前的方法是使用DNN(输入层、隐藏层、输出层)训练skip-gram、CBOW模型,但是这种做法计算量极大,word2vec在其基础上做了改进。
skip-gram:输入为中心词,输出为上下文词向量。
CBOW:输入为上下文词向量,输出为中心词。
改进有两点:

  1. 输入层到隐藏层:在CBOW模型中输入为上下文词向量,word2vec舍去了DNN的线性变换而是直接将其求均值。
  2. 隐藏层到输出层:舍去了softmax函数,提出两种算法:分层softmax和负采样。

之前的softmax方法:
学习一个映射从context到target,如下图所示:
在这里插入图片描述
假设选择一个context为"orange",在距离context距离为正负 d d d(5)个间距内,随机选择一个词作为target。
缺点:假设词典一共含有10K个词,softmax函数的表达方式: p ( t ∣ c ) = θ t T e t ∑ i = 1 i = 10 k θ i T e t p(t|c)=\frac{\theta_t^Te_t}{\sum_{i=1}^{i=10k}\theta_i^Te_t} p(tc)=i=1i=10kθiTetθtTet,计算机在处理分母时需要进行大量的想加运算,严重影响速度。

负采样

skip-gram之负采样

判断一对词是否相关。分为正负样本,在一个batch内,设正负样本的比列为1:k,当数据集很大时,k通常比较小, 2 < = k < = 5 2<=k<=5 2<=k<=5,当数据集很小时,k值通常比较大 50 < = k < = 20 50<=k<=20 50<=k<=20
选取一个context(orange),在选取一个对应目标词(juice)作为正样本,他们输出的label为1。同样的上下文词,目标词从字典中选取作为负样本。
在这里插入图片描述

  • 因为target为0,1值,所以是一个二分类。逻辑回归函数为 p ( y = 1 ∣ < c , t > ) = σ ( θ t T e c ) p(y=1|<c,t>)=\sigma(\theta_t^Te_c) p(y=1<c,t>)=σ(θtTec)
  • 选择负样本的方法:存在两个极端,第一个种是负样本采样概率为每个词在语料中出现的频率。第二个是按照随机分布函数。实验证明采用折中的办法比较好,那么取一个词的概率为: p ( w i ) = f ( w i ) 3 4 ∑ j = 1 j = 10 k f ( w j ) 3 4 p(w_i)=\frac{f(w_i)^{\frac{3}{4}}}{\sum_{j=1}^{j=10k}f(w_j)^{\frac{3}{4}}} p(wi)=j=1j=10kf(wj)43f(wi)43,其中f(w)表示频数。
CBOW之负采样

与skip gram类似。

分层softmax

CBOW之分层softmax

使用霍夫曼树(加权路径最短的二叉树)模型,叶子节点相当于输出层的神经元,非叶子节点相当于DNN隐藏层的神经元。
在这里插入图片描述
规定左子树为负类(哈夫曼值为1),右子树为正类(哈夫曼值为0),相当于一个二分类,假设非叶子节点的权重为 θ \theta θ,词向量为 x w x_w xw,那么 p ( + ) = S i g m o i d ( x w θ T ) p(+)=Sigmoid(x_w\theta^T) p(+)=Sigmoid(xwθT),目的是最大化输入属于中心词向量的概率。这个过程与逻辑回归模型类似,似然函数的形式与损失函数相同,那么反向传播的求解与似然函数的求解过程相同,都是更新每个非叶节点中的参数和输入词向量 x i x_i xi
具体推导可参考:https://www.cnblogs.com/pinard/p/7243513.html

skip gram之分层softmax

与CBOW类似,不同的是skip gram输入为中心词,输出为上下文词,可以使 p ( x i ∣ x w ) p(x_i|x_w) p(xixw)的概率最大,也可以使 p ( x w ∣ x i ) p(x_w|x_i) p(xwxi)的概率最大,这两种方式都可以,word2vec选用的是后者,好处是一次反向传播可以更新2c个向量,令一种方式只能更新1个向量。这种方式与CBOW本质上是一样的,不同点在于skip gram的输入为 x i x_i xi而CBOW的输入为 1 2 c ∑ x i \frac{1}{2c}\sum x_i 2c1xi,在 x i x_i xi的更新公式中只有输入不同。

CBOW和skip-gram的区别

cbow:速度更快,对于低频词效果不太好
skip-gram:速度稍慢,在小数据集上也能取得很好效果,对于低频效果也可以。

Globe算法

损失函数为:
在这里插入图片描述
X i j X_{ij} Xij:i相当于t,j相当于c,表示词t和词c同时出现的频数。
f ( X i j ) f(X_{ij}) f(Xij):表示 X i j X_{ij} Xij的权重。
b i b_i bi b j ‘ b_j^` bj:偏置项。

需要注意的是这些算法学习到的embedding与人们理解的在坐标轴上可解释的特征有偏差。也就是说,人们认为embedding第一维代表gender,第二维代表royal,第三维代表age…但是实际上学习到的"第一维"可能代表gender、royal、age…的组合。

处理歧视词问题

比如说man->computer programmer:women->housemaker。这个推理就有歧视女性的意思。
推荐阅读:
在这里插入图片描述

RNN类型

  • one to one
    在这里插入图片描述
  • one to many

在这里插入图片描述

  • many to one
    在这里插入图片描述

  • many to many
    在这里插入图片描述

梯度爆炸与消失

当网络深度很深时,会发生梯度消失或爆炸现象,梯度爆炸很好解决,只需要采用梯度裁剪就可以,即判断梯度是否大于某一个值。梯度消失可以使用GRU(gated recurrent unit)/LSTM来解决。

GRU单元

这个方法很简单,当需要记忆时设置 Γ u = 1 Γ_u=1 Γu=1,假设该激活值被保存在 c t c^t ct当中,当不需要使用该信息时设置 Γ u = 0 Γ_u=0 Γu=0,此时传递的激活值是 c t c^t ct,当需要使用该信息时,再次设置 Γ u = 1 Γ_u=1 Γu=1,那么使用的激活值就是一直传递的 c t c^t ct
吴恩达给的例子是:
在这里插入图片描述

简化版的GRU隐藏单元结构图为:
在这里插入图片描述
图中 c c c表示记忆单元, Γ u Γ_u Γu表示一个门函数。
Γ u = s i g m o d ( w u ∗ [ c t − 1 , x t ] + b u ) Γ_u=sigmod(w_u*[c^{t-1}, x^t]+b_u) Γu=sigmod(wu[ct1,xt]+bu)
c N < t > = t a n h ( w c ∗ [ c t − 1 , x t ] + b c ) c^{N<t>}=tanh(w_c*[c^{t-1}, x^t]+b_c) cN<t>=tanh(wc[ct1,xt]+bc)
c t = Γ u ∗ c N < t > + ( 1 − Γ u ) ∗ c t − 1 c^t=Γ_u*c^{N<t>}+(1-Γ_u)*c^{t-1} ct=ΓucN<t>+(1Γu)ct1
a t = c t a^t=c^t at=ct
Γ u = 0 Γ_u=0 Γu=0时表示不更新 c t c^t ct的值,当为1时表示更新。
完整的GRU公式在简化版基础上增加参数 Γ r Γ_r Γr表示 c t c^t ct c t − 1 c^{t-1} ct1之间的相关度。在原公式基础上做如下改动:
Γ u = s i g m o d ( w u ∗ [ c t − 1 , x t ] + b u ) Γ_u=sigmod(w_u*[c^{t-1}, x^t]+b_u) Γu=sigmod(wu[ct1,xt]+bu)
c N < t > = t a n h ( w c ∗ [ Γ r ∗ c t − 1 , x t ] + b c ) c^{N<t>}=tanh(w_c*[Γ_r*c^{t-1}, x^t]+b_c) cN<t>=tanh(wc[Γrct1,xt]+bc) //修改
c t = Γ u ∗ c N < t > + ( 1 − Γ u ) ∗ c t − 1 c^t=Γ_u*c^{N<t>}+(1-Γ_u)*c^{t-1} ct=ΓucN<t>+(1Γu)ct1
Γ r = t a n h ( w c ∗ [ c t − 1 , x t ] + b r ) Γ_r=tanh(w_c*[c^{t-1}, x^t]+b_r) Γr=tanh(wc[ct1,xt]+br) //添加
a t = c t a^t=c^t at=ct

LSTM单元(long short-term memory)

早于GRU出现,但是拥有更加强大的功能因为有3个门(遗忘门、记忆门、输出门),也更加灵活,与GRU不同之处在于:

  • 多加了两个门。
  • c t c^t ct a t a^t at不再相等。

公式表示为:
在这里插入图片描述
画图表示形式为:
在这里插入图片描述
遗忘门:控制遗忘多少上一层记忆单元中的内容。
记忆门:控制记忆多少输入和上一层的激活值。
输出门:控制输出多少本轮记忆单元中的内容。
这三个门实际上就是sigmoid函数,控制另外一个输入的输入比例。

优点:

  1. 缓解了RNN中梯度消失的问题。(长期历史信息信号微弱)

缺点:

  1. 不能并行元算.
  2. 参数是GRU的两倍,容易过拟合。

双向RNN

识别某个句子中某个单词是否为人名,需要从句首和句尾两个方向进行分析,因此需要用到双向RNN。常与GRU或LSTM结合使用。
如图所示:
在这里插入图片描述
缺点:只能当输入完成后才能执行。当输入为语音时,不能进行实时翻译。

seq2seq

机器翻译:构建一个多对多的RNN即可。
在这里插入图片描述
绿色部分表示encoder,紫色部分表示decoder。
比如将法语翻译成英语。

  • 相比之前的模型随机生成可能的英语不同的是,这个模型需要找到最可能的英语句子。所以需要一个搜索最好英语句子的算法。两种算法:贪心搜索(不好)和束搜索(beam search)。

贪心搜索

一个词一个词的输出,先选择可能性最大的一个词然后接着选择第二个可能性最大的词,以此类推。
在这里插入图片描述
如图所示,这两个英语翻译显然第一个要比第二个更简洁,但是如果使用贪心搜索时,going将比visiting更可能出现在结果当中。因为going更加常见。

集束搜索

是贪心的复杂版,当集束宽度w=1时,就是贪心搜索。当集束宽度为3时,如下图所示:
在这里插入图片描述

集束搜索算法本质上就是使用局部最优算法代替全局最优。也就是说只能保证输出在当前位置是最优的,如果使用全局最优算法的话,复杂度将会很大,假设字典大小为s,输出长度为n,复杂度为 O ( s n ) O(s^n) O(sn)

注意力模型

比encoder-decoder的效果更好。一个词对应的输出取决于它本身以及邻近的词,并赋予不同的权值,这些权值由神经网络自己学习。模型unit如下图所示:
在这里插入图片描述
α < t , t ‘ > \alpha^{<t,t^`>} α<t,t>表示当输出为 y < t > y^{<t>} y<t>时,输入 a < t ‘ > a^{<t^`>} a<t>的权重值。输出 y < t > y^{<t>} y<t>的所有输入的权重之和为1.
在这里插入图片描述

s t s^{t} st为t时刻隐藏单元的值。
在这里插入图片描述

输出 e < t , t ‘ > e^{<t,t^`>} e<t,t>的值与 α < t ‘ > \alpha^{<t^`>} α<t> S < t − 1 > S^{<t-1>} S<t1>有关,也就是说权重的数据只与上一个激活值有关。

语音识别

可以用注意力模型也可以用CTC模型(connectionist temporal classification)。
CTC模型如下:
在这里插入图片描述
保证输入与输出的个数相同。将输出中空白符之间的字符去重,即为最后的结果。比如
在这里插入图片描述
其中""表示空白字符。||表示空格。

触发字检测系统

比如百度的"小度"。简单的实现方法:
在这里插入图片描述

  • 问题:训练样本中0太多1太少
  • 简单方法:在1前面的几个0输出也置为1.

image2sequence

图片描述即给定一张图片输出对它的描述:构建RNN,输入是feature vector,输出是描述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值