歌词生成(一)-SongNet简述

歌词生成相较于普通文本生成,需要配合特定的乐曲,并演唱。因而要求,每句歌词演唱的长度正好合拍,即不同曲子,每句歌词的字符个数是要受限制于乐曲。

本文暂不考虑曲配词问题,只是将问题抽象为,在已知歌词每句的字数时,如何生成一个文本,满足字数格式。歌词的押韵没有古诗那么严格,但押韵的歌词朗朗上口,更易演唱,对于歌词生成还是很重要的。总之,歌词生成应当满足两个条件:

(1) 每句的字数可控
(2) 押韵

针对上述两个问题,发表在ACL2020的《Rigid Formats Controlled Text Generation》【1】,可以很好地解决字数可控和押韵问题。该论文将其模型称为SongNet。既可以读作“宋(词)Net”(论文本身是为了生成宋词),又可以读作“Song Net”(歌词网络),一语双关。

1. SongNet简述

SongNet是基于BERT【2】做的改进。相较于BERT,SongNet有如下不同:

将格式信息embedding,输入到模型

通过mask使得BERT具有生成能力

接下来首先介绍,SongNet所属的领域:条件文本生成。

2. 条件文本生成

文本生成领域分为三个部分,自由文本生成Generic / Free-Text Generation )、条件文本生成Conditional Text Generation)以及受约束的文本生成Constrained Text Generation),条件文本生成和受约束的文本生成两者并没有明确的界限,该文将文本生成领域看做两个部分自由文本生成条件文本生成。【3】

自由文本生成是,没有显式地给出条件的文本生成任务,即只要不是条件文本生成,便是自由文本生成任务。其概率公式如下,

相较于条件文本生成,自由文本生成,只是去建模文本的一个前后依赖。

条件文本生成是,在已知条件情况下,生成满足条件的文本的任务。该任务的概率表示如下,

即,模型需要建模一个条件概率,p(x|c),其中c是条件的向量表示,x是单个文本的向量表示,<i表示在第i个时间步之前的文本。

实际情况下,条件文本生成的应用更多,狭义的包括根据主题生成文本、根据情感生成文本,广义的角度来看,机器翻译也可以看做条件文本生成,对于中-英翻译任务,可以看做条件为中文,然后生成英文文本。

例如,生成一个情绪为积极乐观的文本。(文本情绪为积极乐观,即是条件)

条件文本生成的关键在于,如何将条件加入到模型中,常见方法有两种:

将条件进行embedding:无论训练还是生成截断,条件作为输入编码,进行embedding

重加权:在生成阶段,用条件信息重新调整每个时间步下,每个词生成的概率值。

SongNet采用的是第一种方式,将条件进行embedding

3. Embedding

该章节主要介绍,Embedding的发展,即从Token Embedding(字符编码)到Position Embedding(位置编码),有了这些前置知识,能更好地理解条件Embedding。

最初的Embedding:Token Embedding

embedding是,将离散的符号组成的序列数据,转化为由词向量(word vector)表示的矩阵的过程

token embedding是, 将自然语言文本转化为词向量(word vector)表示的矩阵的过程。只包含了文本的字符序列信息

机器学习模型是在做数值的运算s,而自然语言文本是由离散的符号表示的,无法直接进行加法、乘法等运算,更无法进行反向传播,因而需要将文本数值化连续化),这个过程即是embedding。通用的方案是,将文本切分成token,接着id化,然后再将每个token用一个向量来表示,该过程即完成了embedding工作。

embedding的过程可以分解为如下的过程:

1. token化:将文本切分成token,token指的是代表文本的组成元素的符号,常用的是字、子词或者词。
2. id化:每个token都对应着一个id号,用id号表示token。
3. embedding:将id转化为向量。通常id号对应着向量的embedding的权重表中的位置。对于每个id,查找权重表中其对应的向量,拼接成整个文本。

如下为对文本“无谓人海的拥挤”进行embedding。

文本:无畏人海的拥挤

第一步:token化(字为单位,空格分割各个token),token化的结果为无 畏 人 海 的 拥 挤 的

第二步:id化,假设,无的id为0,依此类推,重复的字用第一次出现的id号表示

则id化的结果为0 1 2 3 4 5 3

第三步:embedding,(只截取用到的)假设,V的大小为6,dim的大小为6

假设embedding的权重矩阵为 W =[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]]

则该文本的embeddding为E = [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36],[19,20,21,22,23,24]]

3.1 Position Embedding

但只有字符信息,并不能很好的表示文本。如下,

文本一:我喜欢这个电影,因为它包含人性的思考。

文本二:我喜欢这个电影,因为它包含人性的思考。

文本一和文本二的意思完全相反,但对于自然语言模型而言,尤其是self-attention的模型,难以识别字符位置的不同导致的文本差异。

如下为self-attention的公式。dense为全连接层。

相应的示例为下图。

如图,self-attention相当于对所有的e进行了两两运算,这过程中并没有建模序列,因而说self-attention基本上没有序列建模能力。

因而,NLPer提出了Position Embedding【4】,即将每个token的位置,通过运算变成向量,然后与原本的token embedding进行add操作,作为文本的表示。从而加强模型对token的位置敏感性,该过程也是在建模句法特征。

该过程体现一个思路,将模型难以建模的特征通过embedding,融入模型中,从而增强其建模能力。

对于条件文本生成,可以将条件看做是文本中难以建模的信息,然后进行embedding

回顾文章开始提到的两个要求,字数可控和押韵,两者均是目前文本生成模型所缺乏的,作者提出了Token EmbeddingsFormat and Rhyme EmbeddingsSegment EmbeddingsIntra-Position Embeddings四个额外的格式信息embedding来增强模型对字数可控和押韵的表现。

4. 格式信息embedding

格式信息的embedding也类似token embedding的步骤,第一w步也是进行token化,由于信息本身并不是离散的符号,因而第一步需要将其表示为离散的符号。

4.1 Format and Rhyme Embeddings

对于每句歌词,用标点符号用c1表示,最后一个字用符号c2表示,其他字符用c0表示。

例如:我听见远方下课钟声响起(11个字,1个标点)

Format and Rhyme Embeddings = [c0,c0,c0,c0,c0,c0,c0,c0,c0,c0,c2,c1] 10个c0,1个c2,一个c1。

这样可以让押韵的那个字单独获得一种表示,从而让模型注意到该位置的字与其他字符的不同,从而做到押韵。

4.2 Intra-Position Embeddings

对于每句歌词,将字符位置从右到左,依次用p[位置索引]的方式表示。

例如:我听见远方下课钟声响起,(11个字,1个标点)

Intra-Position Embeddings = [p11,p10,p9,p8,p7,p6,p5,p4,p3,p2,p1,p0]

Intra-Position Embeddings是为了让模型在生成第一个字的时候,就知道这句歌词有几个字;从右到左的顺序,使得p1正好指向韵脚,更好押韵。

4.3 Segment Embeddings

类似BERT的Segment Embedding,第一句每个字符的segment Embeddings为s0,第二句每个字符的segment Embeddings为s1。

对于歌词:

我听见雨滴落在青青草地
我听见远方下课钟声响起
可是我没有听见
你的声音认真呼唤我姓名

Segment Embeddings

s0,s0,s0,s0,s0,s0,s0,s0,s0,s0,s0,s0,
s1,s1,s1,s1,s1,s1,s1,s1,s1,s1,s1,s1,
s2,s,2,s2,s2,s2,s,2,s2,s2,s2,s,2,s2,s2,
s3,s3,s3,s3,s3,s3,s3,
s4,s4,s4,s4,s4,s4,s4,s4,

Segment Embeddings可以使模型确定每个字在所在的句子顺序。

4.4 如何将如上的格式信息融合到模型中

这三种embedding都兼顾到了字数可控和押韵。

SongNet将上述三种的embedding的符号(s0、s1、c0、c1、p0、p1等等)看做字(token),加入到vocab中,与文本字符(我、你等等)经过同一个embedding层,得到向量,再相加。

即,将Intra-Position EmbeddingsSegment EmbeddingsFormat and Rhyme Embeddings相加得到format_embedding

相应代码为:

x = self.tok_embed(ys_inp) + self.pos_embed(ys_inp) + self.tok_embed(ys_tpl) + self.tok_embed(ys_seg) + self.tok_embed(ys_pos)

ys_inp:Token Embeddings的id表示

ys_tpl:Format and Rhyme Embeddings的id表示

ys_seg:Segment Embeddings的id表示

ys_pos:Intra-Position Embeddings的id表示

self.tok_embed:字符embedding层

self.pos_embed:位置embedding层

相较于embedding章节的token embedding,格式信息的embedding是用符号而不是字来表示token。也要进行id化以及embedding。

以上即为SongNet的第一个亮点,接下来阐述,SongNet是如何让BERT拥有生成能力。

5. Mask策略

原版的BERT并不具有生成能力,究其原因要从自回归语言模型说起。

5.1 自回归语言模型

自回归生成模型是文本生成常用的一种模型。通过迭代生成token,来完成整个文本的生成。

如下图,浅绿色的矩形为同一个模型(可以看做单向单层RNN网络模型),蓝色矩形为文本的token(可以看做字)。

要生成“你是谁”需要,在第一个时间步,根据”你“生成“是”;第二个时间步,根据”是“和第一个时间步传来的“你”信息,生成”谁“·····

5.2 使BERT具有生成能力:Masking Multi-Head Self-Attention

BERT是双向的transformer模型,在每个时间步知道下文(即在“你”位置,知道“是”和“谁”的信息),从而无法作为生成模型使用。

BERT的各个时间步所知道的信息可以表示为:

第一个时间步:你是谁
第二个时间步:你是谁
第三个时间步:你是谁

自回归生成模型,在各个时间步所知道的信息:

第一个时间步:你
第二个时间步:你是
第三个时间步:你是谁

两者可以通过一个三角矩阵进行转换,即mask,如下图。

SongNet就是通过上图的mask,将BERT变成自回归语言模型,其核心实现为Masking Multi-Head Self-Attention

Masking Multi-Head Self-Attention的算法步骤是:

(1) 将embedding信息mask,得到mask_embedding
(2) 将mask_embedding输入到transformer层中,得到context_vector

注:该方案并非SongNet首创,类似的思路在19年微软的Unilm【5】模型中,有所体现。

5.3 让模型有大局观:Global Multi-Head Attention

在每个时间步,模型不应当知道格式信息,但可以知道文本整体格式的信息,从而更好地输出符合格式的文本。因而,对于格式信息,不应当进行mask操作,即没有mask的attention即是Global Multi-Head Attention。

另外,Global Multi-Head Attention还将内容信息和格式信息进行了融合。

注:该过程涉及了self attention的实现,暂不做展开。

算法步骤:

将格式信息和内容信息通过没有mask的transformer层,进行融合。

这时候再看SongNet结构图。

可以总结出SongNet模型的算法步骤:

(1) 进行格式信息的embedding,得到format_embedding

(2) 将format_embedding经过add得到format_vector

(3) 对当前时间步以前的字符信息和格式信息进行embedding,得到content_embedding

(4) 将content_embedding经过Masking Multi-Head Self-Attention得到content_vector

(5) 将content_vectorcontent_embedding一同输入到Global Multi-Head Attention中,得到输出

6. 总结

SongNet的架构,没有什么数学推导,更多的是符合直觉的设定。通过增加embedding,从而控制文本生成,可能成为可控文本生成领域的一个主要思路。

即:特征->符号化->embedding->融入模型

该文旨在初步介绍SongNet模型用于歌词生成,行者AI将会持续跟进歌词生成的博文推送,希望大家多多关注。

参考文献

  1. Li, P., Zhang, H., Liu, X. and Shi, S., 2020. Rigid Formats Controlled Text Generation. arXiv preprint arXiv:2004.08022.
  2. Devlin J, Chang MW, Lee K, Toutanova K. Bert: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805. 2018 Oct 11.
  3. Garbacea, C. and Mei, Q., 2020. Neural Language Generation: Formulation, Methods, and Evaluation. arXiv preprint arXiv:2007.15780.
  4. Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, Ł. and Polosukhin, I., 2017. Attention is all you need. In Advances in neural information processing systems (pp. 5998-6008).
  5. Dong, L., Yang, N., Wang, W., Wei, F., Liu, X., Wang, Y., Gao, J., Zhou, M. and Hon, H.W., 2019. Unified language model pre-training for natural language understanding and generation. In Advances in Neural Information Processing Systems (pp. 13063-13075).

PS:

我们是行者AI,我们在“AI+游戏”中不断前行。

如果你也对游戏感兴趣,对AI充满好奇,那就快来加入我们(hr@xingzhe.ai)。

原文地址:https://www.cnblogs.com/xingzheai/p/14119445.html