0

我正在尝试将 GPT2 架构用于音乐应用程序,因此需要从头开始对其进行训练。经过一番谷歌搜索后,我发现来自拥抱脸的 github 的问题 #1714 已经“解决”了这个问题。当我尝试运行建议的解决方案时:

from transformers import GPT2Config, GPT2Model

NUMLAYER = 4
NUMHEAD = 4
SIZEREDUCTION = 10 #the factor by which we reduce the size of the velocity argument.
VELSIZE = int(np.floor(127/SIZEREDUCTION)) + 1 
SEQLEN=40 #size of data sequences.
EMBEDSIZE = 5 

config = GPT2Config(vocab_size = VELSIZE, n_positions = SEQLEN, n_embd = EMBEDSIZE, n_layer = NUMLAYER, n_ctx = SEQLEN, n_head = NUMHEAD)  
model = GPT2Model(config)

我收到以下错误:

Traceback (most recent call last):

  File "<ipython-input-7-b043a7a2425f>", line 1, in <module>
    runfile('C:/Users/cnelias/Desktop/PHD/Swing project/code/script/GPT2.py', wdir='C:/Users/cnelias/Desktop/PHD/Swing project/code/script')

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
    execfile(filename, namespace)

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/cnelias/Desktop/PHD/Swing project/code/script/GPT2.py", line 191, in <module>
    model = GPT2Model(config)

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 355, in __init__
    self.h = nn.ModuleList([Block(config.n_ctx, config, scale=True) for _ in range(config.n_layer)])

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 355, in <listcomp>
    self.h = nn.ModuleList([Block(config.n_ctx, config, scale=True) for _ in range(config.n_layer)])

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 223, in __init__
    self.attn = Attention(nx, n_ctx, config, scale)

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 109, in __init__
    assert n_state % config.n_head == 0

这是什么意思,我该如何解决?

更一般地说,是否有关于如何使用 GPT2 进行转发呼叫的文档?我可以定义自己的train()函数还是必须使用模型的内置函数?我是被迫使用 aDataset来进行训练还是可以给它单独的张量?我找了它,但在文档上找不到这些的答案,但也许我错过了一些东西。

PS:我已经阅读了来自 huggingface.co 的博文,但它省略了太多信息和细节,对我的应用程序有用。

4

1 回答 1

2

我认为错误信息很清楚:

assert n_state % config.n_head == 0

回溯代码,我们可以看到

n_state = nx # in Attention: n_state=768

这表示n_state表示嵌入维度(在类 BERT 模型中默认情况下通常为 768)。然后,当我们查看GPT-2 文档时,似乎指定 this 的参数是n_embd您正在设置的参数5。如错误所示,嵌入维度必须通过注意力头的数量均匀整除,注意力头被指定为4。因此,选择不同的嵌入维度作为 的倍数4应该可以解决问题。当然,您也可以更改开头的头数,但似乎不支持奇数嵌入维度。

于 2020-03-24T14:53:57.723 回答