美文网首页
Open Transformer

Open Transformer

作者: 静一下1 | 来源:发表于2020-12-10 16:21 被阅读0次

源码链接:https://github.com/ZhengkunTian/OpenTransformer 

数据准备:

选用Thchs30数据集,首先生成3个训练所需的数据集:

(1)vocab.npy

内容是汉字 及其对应的编号

(2)character.txt

内容是 id 及其对应的 汉语意思 (注意每个汉字之间要有空格)

(3)wav.scp

内容是 id 及其 对应音频文件的地址

将transformer.yaml 中对应文件位置稍作修改,即可训练,我是在RTX2070 上训练的

先训练100个epochs:(大概训练了5个小时)

测试了一部分效果并不好: 

显示的预测结果都是一样的。

又选了较小的数据集训练,准备训练1000个epochs,由于每个epoch训练的模型都会保存,跑到800多个的时候磁盘满了

然后用最后一个模型参数去测试了这个数据集,测试其他少部分数据结果:

结果不一样,但明显对不上。

测试所有的训练集,结果:

效果还可以,词错误率:

查看了一下模型的参数:269992个

1.多头attention的头数确定:

            没有固定的标准,Transformer原文给的是8个,原则上只要能被d_{model}整除就行,在Open transformer中用的是4个

2. 相对位置编码问题:

Transformer 中的 Self-attention 机制如下,输入 x=(x_1,...,x_n),输出z=(z_1,...,z_n) \in R^{n \times d} 

Relative Position Representations (RPR)  不在输入时将位置表示与 token 表示相加,而是选择对 self-attention 进行改动:

这里的 a_{ij}^{\{ K,V\}}(不是 a_{ij}) 的计算方式如下:

因此,模型学习相对位置表示 w^K = (w_{-k}^K,...,w_{k}^K) \in R^{(2k+1 \times d)}(w^V同理),同一层的attention heads之间共享,但是在不同层之间是不同的。此处公式有些晦涩,故此举一实例加以解释:

当 k=4时,w^K = (w_{-4}^K,...,w_{4}^K) \in R^{(9 \times d)},那么第 0-8 行则分别对应的是位置 i 与位置 [i-4,i-3,i-2,i-1,i,i+1,i+2,i+3,i+4]之间的相对位置表示。以输入“I think therefore I am”为例:

其中,“I” 使用的是 RPR_4,“think” 使用的是 RPR_5(因为 “think” 在第一个 “I” 的右边第一个,对应的是 i+1的情况)。套用公式中则是,Query 为“I”,Key 为 “think” 时,有 i=0,j=1,那么 clip(j-i,k)=clip(1,4)=max(-4,min(4,1))=max(-4,1)=1,那么此时 a_{ij}=w_1=RPR_4

其中,“I” 使用的是 RPR_4,“think” 使用的是 RPR_2(因为 “think” 在第二个 “I” 的左边第二个,对应的 i-2 的情况)。

相关文章

网友评论

      本文标题:Open Transformer

      本文链接:https://www.haomeiwen.com/subject/nnilgktx.html