美国:1 中国:2 印度:3 … 朝鲜:197
标量编码问题:美国 + 中国 = 3 = 印度
美国:[1,0,0,0,…,0] 中国:[0,1,0,0,…,0] 印度:[0,0,1,0,…,0]
美国 + 中国 = [1,1,0,0,…,0],代表拥有美国和中国双重国籍
整个RNN只有一个参数矩阵A。RNN 在大规模的数据集上已经过时,不如Transformer模型,但在小规模数据集上,RNN还是很有用的。
参数矩阵A的行: shape(h)
参数矩阵A的列: shape(h)+shape(x)
总参数数量: shape(h)× [shape(h)+shape(x)] (未考虑偏移量bias)
输入x 的维度(词嵌入向量)应该通过交叉验证的方式选择 输出状态向量h的维度也应该通过交叉验证的方式选择。
可以使用多个状态向量进行下游任务:
RNN 在状态向量ht中积累xt及之前的所有信息,ht可以看作整个输入序列中抽取的特征向量
RNN 记忆比较短,会遗忘很久之前的输入x 。
过去的信息直接流向未来。 LSTM使用“传送带”C 来获得比RNN更长的记忆。
可以使用RNN或LSTM进行更为复杂的任务,例如机器翻译,下面会介绍机器翻译模型Seq2Seq。
Seq2Seq模型用来进行句子翻译,Seq2Seq包括Encoder编码器以及Decoder 解码器 两部分,最早的Seq2Seq模型由两个RNN模型组成,如下图所示。
Attention对Seq2Seq网络的提升十分明显,如下图所示(BLEU:机器翻译评价指标,“双语评估替补”)
无论输入多长,Attention都可以获得所有输入信息,且由于计算每个输出与所有输入的状态向量的相关性,所以会对相关的输入产生较高相关性,也就具备了一定的可解释性
Attention可以用来做句子翻译。 而Self-Attention可以用来代替RNN。 Self-Attention是Attention的特殊形式。Self-Attention模型其实就是在序列内部做Attention,寻找序列内部的联系。
例如输入一个句子,那么里面的每个词都要和该句子中的所有词进行attention计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构。
Self-Attention和RNN最大的区别是不使用状态向量h,而是采用状态向量c 去更新下一个状态h。
Transformer中的Attention剔除了RNN,即没有循环部分。
Attention层接收两个输入序列,分别为输入序列:?_? , ?_? , ?_? ,…, ?_(?,) 输出序列:?’_? , ?‘_? , ?’_? ,…, ?′_?
使用参数矩阵Wq生成q1,具体计算方式如下:
C1 依赖于所有的输入x1,x2,…,xm 以及当前的输入x’_1,具体计算方式如下:
利用Self-Attention Layer + Dense Layer 构造Transformer模型的Encoder模块:
BERT的全称为Bidirectional Encoder Representations from Transformers 。
BERT 用来预训练Transformer模型的Encoder网络 两个基本任务: 1、预测被遮挡的单词: 随机遮挡单/多个单词,根据上下文预测被遮挡的单词。 2、预测两句话是否在原文里真实相邻。
两句子拼接 训练数据构造 50%为真实相邻的句子,label=True(1); 50%为随机选择的句子,label=False(0)
Bert具备广泛的通用性,就是说绝大部分NLP任务都可以采用类似的两阶段模式直接去提升效果。
从模型创新角度看一般,创新不算大。但效果太好了,基本刷新了很多NLP的任务的最好性能。 Bert最大的亮点在于效果好及普适性强,几乎所有NLP任务都可以套用Bert这种两阶段解决思路,而且效果应该会有明显提升。
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=eji4i5y8xjp