源码链接: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个,原则上只要能被整除就行,在Open transformer中用的是4个
2. 相对位置编码问题:
Transformer 中的 Self-attention 机制如下,输入 ,输出
Relative Position Representations (RPR) 不在输入时将位置表示与 token 表示相加,而是选择对 self-attention 进行改动:
这里的 (不是 ) 的计算方式如下:
因此,模型学习相对位置表示 (同理),同一层的attention heads之间共享,但是在不同层之间是不同的。此处公式有些晦涩,故此举一实例加以解释:
当 时,,那么第 0-8 行则分别对应的是位置 i 与位置 之间的相对位置表示。以输入“I think therefore I am”为例:
其中,“I” 使用的是 ,“think” 使用的是 (因为 “think” 在第一个 “I” 的右边第一个,对应的是 i+1的情况)。套用公式中则是,Query 为“I”,Key 为 “think” 时,有 ,那么 ,那么此时 。
其中,“I” 使用的是 ,“think” 使用的是 (因为 “think” 在第二个 “I” 的左边第二个,对应的 i-2 的情况)。