Word Embedding 之深度学习
RNN:
RNN引入了隐状态h(hidden state)的概念,h1接收到前一个隐状态h0和当前输入x1,结合权重和bias,输出y1
RNN存在很多问题, 如序列足够长RNN会遗漏掉比较早时刻的信息。当然还有反向传播时候面临梯度消失的问题,所以原生态RNN没法用,LSTM在RNN基础上做了优化。
LSTM:
LSTM除了RNN的h隐状态又引入一条贯穿顶部的”传送带” Cell 状态 C, LSTM的关键之处就在于这个Cell的状态。
三个门:,遗忘门(下图1),输入门(下图2,3),输出门(下图4)。门与门之间通过一个sigmoid[0,1]和一个点乘操作组成, 结果0不能通过,1可以通过。
回到LSTM为什么能解决RNN的不足,首先LSTM顾名思义“长短期记忆网络”,随着C的加入,LSTM有对长期记忆的处理,同时“门”的加入进行了选择性的保留和添加,所以也可以对短期以及进行处理。同时“门”的设计中,每个激活函数都是sigmoid[0,1], 使其输出要嘛接近0,要嘛接近1.门为0时,说明上一时刻对当前时刻没有影响,也就没必要传递回来更新参数了。所以这样很大程度上减轻了梯度消失发生的概率。
LSTM在keras中的实际应用:
数据表-2D 形状 = (样本数,特征数)
序列类-3D 形状 = (样本数,步长,特征数)
图像类-4D 形状 = (样本数,宽,高,通道数)
视屏类-5D 形状 = (样本数,帧数,宽,高,通道数)
这里重点说说序列类,输入shape(samples, timesteps, input_dim),这里的timesteps可以理解为input_length。比如100条句子,每条句子有13个单词,每个单词200维,shape(100, 13, 200)。当然这个是比较简单的解释,实际中因每条句子长度不一样,需将句子设置为最长长度,句子长度不足的padding补0。keras中model.add(LSTM(128,....))看下图代码中表示是隐层ht是128维。
输出时,当return_sequence = True时,返回3D张量 shape(samples, timesteps, output_dim)
否则,返回shape(samples, output_dim) 2D张量
keras现在被tensorflow封装的好,当然用tf也可以实现,下面是多层LSTM用TF实现
GRU:
GRU在LSTM基础上做了变种,组合了遗忘门和输入门到一个单独的“更新门”,同时也结合了cell状态C和隐状态h,变得比LSTM更简单。
查了一些论文,说这两种方法基本上一样。如果数据少用GRU更快,如果数据多,LSTM也许会有更好的结果.
ELMO
双层双向LSTM,由一个向前和向后语言模型构成,目标函数取这两个方向的最大似然。相对于最基本的LSTM,ELMO相当于deep model. 从之前讨论深度学习的本质来看,ELMO比LSTM提取到了更多词义,句法,上下文关系,long term dependency等等特征信息。所以ELMO目的在解决一词多义的问题,即在不同的上下文环境下,哪怕是同一个词,也会表达出不同的含义。
Elmo由RNN演变而来,所以具备了时序模型类一个最大问题:无法并行计算(计算的本质),咱们的GPU再强大,core再多,提速也不理想。但是不用时序模型,又没法“记忆”。有没有一种方法即可以让计算机并行计算,模型又具备“记忆”功能。Attention就这样横空出世。
Transformer
首先看几幅图,来自论文“Why Self-Attention?....”和张俊林的博文
这样一对比,是不是看出来Transformer在各项指标上都碾压了RNN和CNN。为什么会这样?
上图就是transformer的内部构造,除了大家都知道的self-attention在发挥作用外,还有transform里的各个“部件”也发挥着作用。一起先看看self-attention
Query贯穿整个流程,与Key发生交互后输出value,这就是attention抽象流程图,具体是怎么样了?
”Thinking”输入是one-hot编码,假设通过embedding形成1 * 4矩阵,再与q权重wq(4 * 3)矩阵相乘得出个1 * 3矩阵的q值,同样的分别得到k与v值。q与k的值得到score,为了更好normalization转换后进行softmax得到概率,再与v值相乘输出。从这可以看出q值分别与每个词的k值相乘得到score,然后判断每个词与自己的相关性。这里与每个词都相乘了再判断,所以attention解决了RNN句子太长会损失最初信息的问题,attention“记住”了所有词的信息。另外因为attention每个词都是一样的相乘,所以解决了RNN无法并行计算的问题。只是因为attention的加入,transformer才表现的这么好吗?做个小实验,用transformer的内部构造,把self-attention替换成双向RNN和CNN,看看最后结果
可以看出替换了双向RNN和CNN后,性能得到不同幅度的提升。Transformer有什么神构造这么厉害?看下图
把x输入向量与attention后z向量做相加和归一化(add&Normalize),在减少信息损失的同时,让分布更均匀,这样便于训练梯度。做完后,向量z1做一次前馈神经网络提取更细致的特征,然后与提取前的输入结合再做一次add&normalize。Transformer的架构就是一个优化框架。Multi-head attention使用不同的attention关注点的特征,一开始是随机初始化,通过训练输入到前馈神经网络后获取不同w值,这么多组都输入到前馈神经网络是不合理的,所以为了解决这个问题,需要再初始化一个矩阵w,和多个attention结果做乘法最终变换成前馈神经网络可以接收的大小。
最后就是encoder - decoder。 Self-attention 是自身去做attention,输入和输出是一样长,encoder-decoder attention对编码输入和解码输出做attention,可以不是一样长。Decoder后再经过Linear线性计算,然后做一次softmax.
Bert
双向transformer,相当于把ELMO中的LSTM替换成transformer.
Transformer XL
RNN主要的问题是梯度消失和梯度爆炸的问题,而且其捕捉上下文的长度没有Transformer那么强大,而Transformer虽然能力比较强,但是在预测时会受到训练时所设定的最大长度限制。 两者都局限在捕捉长期依赖性上。
Transformer规定输入大小为512,这意味着我们需要对原始的输入文本进行裁剪或填充.剪裁填充后,整个文章被割裂,这样文本如果跨片段就无法学习。Transformer XL做了两件事:XL把上一次处理的片段存储起来,在当前片段的处理中会把这部分信息添加进来,这便是“延长”的含义。这样做便完成了上下文之间的迁移。第二件事是使用相对编码位置,Transformer原本的位置embedding是一种绝对的位置编码。XL做第一件事时,绝对位置编码会发生变化。
XLNet
BERT 虽然用了深层双向信息,但没有对被遮掩(Mask)的 token 之间的关系进行直接学习,因此 XLNet 通过提出 Permutation Language Model (PLM)对其进行了学习。
更多的数据,还有用 Transformer-XL 中的技巧带来的更大范围上下文,对模型有正向加强。这就是为什么XLNet数据上能跑过Bert.
最近的新闻,Facebook AI团队 RoBERTa 采用Bert-Large,并通过更多的数据和更长时间的训练来提升预训练的过程,最终结果超过XLNet。其实到这里,我对NLP还是有点失望的,自从Bert诞生再到Transformer XL再到XLNet, Google大佬们引领这AI进入了需要更多数据和更强计算力才能跑赢各项指标的时代。不客气的讲一句,我这有大量数据又有超强计算力,用什么模型不都一样能跑出不错的分数,这样让“算法”不知不觉中从核心变成了辅助,让数据量和计算机的算力成为了主角。更致命的一点是,数据如果都需要TPU来跑了,工业界又有多少能承担的起?又怎么落地了?