bert是unsupervise-train 的transformer
transformer是seq2seq model with “self-attention”
b1可以通过权值来控制,可以忽略远处,只考虑local information;也可以考虑global information。
普通的self-attention
Multi-head self-attention
self-attention layer的问题:每个type step两两之间都有attention,那么词语的顺序就没有利用到,即a->b和b->a的attention是一样的,只需位置不同。
in other word:解释为什么要 e i e^i ei+ a i a^i ai,是相加,而不是拼接。我们需要位置信息,很明显 p i p^i pi有这个信息。通过拼接 x i x^i xi与 p i p^i pi,然后进行矩阵变换, W p W^p Wp * p i p^i pi就等同于 e i e^i ei。李宏毅说, W p W^p Wp可以训练,也有人工设置。(没细讲)
seq2seq model
input:x1…x4,output:o1…o3;应用:翻译器…
x1…x4 ——>Encoder(bi-RNN、self-attention Layer)——>h1…h4
c1…c3——>Decoder(bi-RNN、self-attention Layer)——>o1…o3
视频中有展示google描述encoder-decoder的动态图,图中信息有
(1)attention-layer不止一层,encoder同一层是并行计算的
(2)decoder是按序列输出的,非并行输出。
(3)decoder的输入为:encoder的全部输出值加上decoder已经输出的值,如decode第三个词时,输入是c1+c2+c3+c4+o1+o2。如果decoder layer是多层的,只是用同一层进行相加。即要输出O(2,3),3是层数,2是序列,则输入是c1+c2+c3+c4+O(2,1)+O(2,2)。
对于BN(针对二维卷积),通过查阅其他csdn,还有代码:
x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True)
x_var = np.var(x, axis=(0, 2, 3), keepdims=True)
#x_shape:[B, C, H, W],它利用3个维度的数据得到一个维度的均值和方差
我的观点如图,对于一层CNN,batch里面的二维矩阵求一个均值,有多少层就有多少个均值。
李宏毅说法:假设batchszie=4,
BN:对于同一个batch=4里面的不同data的同样的dimension作normalization。下图中,使横条的均值为0,方差为1。
LN:与batch无关,对一个data的同一层作normalization,即竖条的均值为0,方差为1。
我也很迷,难道是编程与理论的差距吗?求救sos
上图,熟悉又不熟悉,use Chinese to English translation as example。
左块是编码,右边块是解码。注意上述的信息(3),即decoder需要前一次decoder的输出,初始值为
李宏毅的视频到这了,流程介绍完,但是实际一点的例子却没有。接下来看看view数比较多的博客。感谢梁同学和宋同学关于transformer介绍,让我没那么懵逼。
作者: 龙心尘
时间:2019年1月
出处:https://blog.csdn.net/longxinchen_ml/article/details/86533005
提炼
论文中是将6个编码器叠在一起,每个编码器不共享参数,且可以分解成两个子层:self-attention,feed-forward。
self-attention:帮助编码器在对每个单词编码时关注输入句子的其他单词。
feed-forward:每个位置的单词对应的前馈神经网络都完全一样。词于词之间没有依赖关系,所以可以并行执行。(一维卷积神经网络)
解码器在两层之间还有一个注意力层,用来关注输入句子的相关部分
The animal didn’t cross the street because it was too tired.
“it”在这个句子中代指那个名词?它指的是street还是animal还是others呢?
注意力的任务是允许“it”与“animal”建立联系。随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。
与RNN区别:自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中。
在编码器#5(栈中最上层编码器)中编码“it”这个单词的时,注意力机制的部分会去关注“The Animal”,将它的表示的一部分编入“it”的编码中。
(1) 假设sequence只有两个词,词向量4个格子,QKV3个格子。
(2) 对于multi-head self-attention,有多个产生Q,K,V矩阵集weights,Transformer使用8个head(64*8=512),8个矩阵集合中的每一个weights都是随机初始化的,将词向量投影到不同的表示子空间中。
(3) self-attention的输出要传入前馈神经网络,所以需要把8个矩阵Z合并或压缩成一个矩阵。
形式上是给词向量添加位置向量。位置向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。大部分文章应该都没有给出位置向量怎么计算出来,李宏毅的间接解释有说服力一点
特定模式:每一行对应一个词向量的位置编码,所以第一行对应着输入序列的第一个词。每行包含512个值,每个值介于1和-1之间。
原始论文里描述了位置编码的公式(第3.5节)。你可以在 get_timing_signal_1d()中看到生成位置编码的代码。这不是唯一可能的位置编码方法。然而,它的优点是能够扩展到未知的序列长度(例如,当我们训练出的模型需要翻译远比训练集里的句子更长的句子时)。
Decoder的第一次输入为起始符的embedding + Positional Encoding,也可能是其他特殊的Token,目的是通过起始符预测“I”,也就是通过起始符预测实际的第一个输出。Shifted Right 意思是将输出整体右移一位。
【1】csdn链接Mask部分
【2】知乎链接decoder部分,attention机制没细看
【3】csdn链接mask代码,内容少
这里只针对李宏毅没讲的和decode与encoder的区别这两点进行补充:
训练过程中,我们有输出结果(要翻译的结果),仍记为 X = ( x 1 , . . . , x m ) T X = (x_1,...,x_m)^T X=(x1,...,xm)T,但与encoder的参数是不共享的。对X做embedding,词嵌入矩阵与输入此的词嵌入矩阵也是不同的。
Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask,Padding Mask可以看链接【1】。
sequence mask:
我感觉了解到这应该对transformer有一个完整的流程,在细节一点就要看代码了。
还有一篇知乎,关于数据的shape如何变幻。下面只描述新的点
https://zhuanlan.zhihu.com/p/44731789
他讲到embedding完成了将一句话变为一个矩阵,矩阵的每一行代表一个特定的单词,但他用xaviers方法生成随机映射矩阵。
(1)encoder中V=K=Q=matEnc,首先分别对V,K,Q三者分别进行线性变换,即将三者分别输入到三个单层神经网络层,激活函数选择relu,输出新的V,K,Q(三者shape都和原来shape相同,即经过线性变换时输出维度和输入维度相同);
(2)然后将Q在最后一维上进行切分为num_heads(假设为8)段,然后对切分完的矩阵在axis=0维上进行concat链接起来;
(3)最后将outputs在axis=0维上切分为num_heads段,然后在axis=2维上合并, 恢复原来Q的维度;
(4)feedForward:
对outputs进行第一次卷积操作,结果更新为outputs(卷积核为11,每一次卷积操作的计算发生在一个词对应的向量元素上,卷积核数目即最后一维向量长度,也就是一个词对应的向量维数);
对最新outputs进行第二次卷积操作,卷积核仍然为11,卷积核数目为N;
对于大的模型,我的学习效率有点滴,搞这么久一点代码都还没看。视频50分钟…视频讲的肯定不够。提高效率就要知道模型哪一个知识点不清楚然后去看其他博客,不要重复去看已经了解的知识点。
正常路线应该是:视频->英文论文->博客(不一定正确)->代码的实现->分析代码
如果您看到这,希望您有所收获