Open Transformer

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

数据准备:

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

(1)vocab.npy

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

Open Transformer_第1张图片

(2)character.txt

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

Open Transformer_第2张图片

(3)wav.scp

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

Open Transformer_第3张图片

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

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

Open Transformer_第4张图片

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

Open Transformer_第5张图片

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

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

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

Open Transformer_第6张图片

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

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

Open Transformer_第7张图片

效果还可以,词错误率:

Open Transformer_第8张图片

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

Open Transformer_第9张图片

1.多头attention的头数确定:

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

2. 相对位置编码问题:

Transformer 中的 Self-attention 机制如下,输入 ,输出 

Open Transformer_第10张图片

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

Open Transformer_第11张图片

这里的 (不是 ) 的计算方式如下:

Open Transformer_第12张图片

因此,模型学习相对位置表示 (同理),同一层的attention heads之间共享,但是在不同层之间是不同的。此处公式有些晦涩,故此举一实例加以解释:

当 时,,那么第 0-8 行则分别对应的是位置 i 与位置 之间的相对位置表示。以输入“I think therefore I am”为例:

Open Transformer_第13张图片

其中,“I” 使用的是 ,“think” 使用的是 (因为 “think” 在第一个 “I” 的右边第一个,对应的是 i+1的情况)。套用公式中则是,Query 为“I”,Key 为 “think” 时,有 ,那么 ,那么此时 。

Open Transformer_第14张图片

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

你可能感兴趣的:(Open Transformer)