通过嵌入层向后传播

时间:2020-10-02 16:00:48

标签: machine-learning nlp pytorch encoder-decoder style-transfer

我有一个句子数据集,属于2个类别。我已经根据该数据训练了一个分类器,以将给定的句子分类为两个类别之一。接下来,我想训练一个 Pytorch 生成器(编码器-解码器)模型,以使用预先训练的分类器将给定的句子从1类转换为2类。因此,基本上,这是NLP中的样式转换。这是我模型的骨架:

Encoder:
  Embedding layer --> LSTM [outputs= o, h]

Decoder:
  Embedding layer --> LSTM --> Linear --> Relu --> log_softmax [output= probability for each word in vocab]

Classifier:
  Encoder --> Linear layer1 --> Linear2 --> sigmoid [output = class probability]

Generator:
  Encoder --> Decoder --> topK(1) [outputs = token for each word in generated sentence as floats]

我想做的是,使用来自预训练分类器模型的错误信号训练生成器。此模型是否有效是一个单独的问题(我当然很想听听这里经验丰富的成员的反馈)。但是,这里的主要问题是Generator会以浮点数的形式返回句子标记(单词)的数组,然后应将其传递到一个(冻结的)分类器模型,该模型包含嵌入层作为第一层,该层仅接受Long数据类型。但是将float转换为长张量会破坏梯度历史。根据我对类似嵌入相关问题的了解,通过类型转换无法保留渐变。那我有什么选择呢?任何解决方法?例如,精明的读者会注意到,即使“ topK / argmax”运算也会破坏渐变历史记录,为此,我计划在训练时使用线性层来查找argmax。对于“嵌入”问题也有类似的解决方案吗?我很确定人们会尝试类似的方法,但是我在seq2seq +分类器上找不到任何资源。

注意:我不会发布代码来保持帖子整洁,以便更好地理解。如果需要,我可以提供相关部分。

0 个答案:

没有答案