歌词生成(一)-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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52586.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 开源歌词控件 LyricViewX

Android 开源歌词控件 LyricViewX 开源地址 Github https://github.com/Moriafly/LyricViewX LyricViewX 是一个美观的安卓歌词控件。 基于 LrcView 设计。 效果展示 Dso Music Github https://github.com/Moriafly/DsoMusic 双语 拖动 单语 比较与 LrcView 100% Kotlin…

如何获取LRC歌词

在日常的剪辑或者是其他情况下&#xff0c;需要使用LRC歌词&#xff0c;不需要下载新的杂门软件就能获取lrc歌词&#xff0c;真的很心动了&#xff0c;这里以网易云音乐为例&#xff1a; 1、打开网易云音乐网页版&#xff0c;找到需要的歌词 2、按F12键&#xff0c;选择 Netwo…

从ChatGPT等大模型的兴起,看未来计算芯片的发展趋势

欢迎关注软硬件融合公众号&#xff1a; 编者按 ChatGPT的火爆&#xff0c;直接引爆了大模型的繁荣&#xff0c;也使得NVIDIA GPU供不应求。 从发展的角度看&#xff0c;GPU并不是大模型最高效的计算平台。 GPT等大模型为什么没有突破万亿参数&#xff1f;核心原因在于在现在的G…

GPU和CPU芯片区别:为何要用GPU挖矿?

CPU和GPU之所以大不相同&#xff0c;是由于其设计目标的不同&#xff0c;它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型&#xff0c;同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是…

2023全云在线联合微软AIGC专场沙龙:人工智能与企业创新,促进创造力的数字化转型

6月29日&#xff0c;由全云在线平台和微软联合主办的人工智能与企业创新&#xff1a;促进创造力的数字化转型——2023AIGC微软专场沙龙在广州天河区正佳万豪酒店举行。 关于2023AIGC微软专场沙龙 GPT翻开了AGI新的一页&#xff0c;也翻开了各行各业的新篇章。 2022年11月30日…

呼吁暂停 GPT-5 研发的马斯克,转身抢购 1 万个 GPU,为 Twitter 大模型做准备!...

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 曾不止一次地支持 AI 威胁论、曾与 OpenAI 分道扬镳、曾怒批 ChatGPT 唤醒人工智能、曾联合发起公开信&#xff0c;呼吁全球实验室应停止训练比 GPT-4 更强大的模型...... 毫无疑问&#xff0c;曾被 Fa…

个人掏5000万美元、获2.3亿美金认购,造中国版OpenAI,45岁前美团联合创始人王慧文再创业!...

整理 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 「即便只有一个人&#xff0c;我也要出发」&#xff0c;2023 年 2 月 13 日&#xff0c;原美团联合创始人王慧文在社交媒体平台郑重地说道。 这一次他的目光不再是聚焦在社交关系网络平台、二手房网站、…

微软:多模态大模型GPT-4就在下周,撞车百度?

欢迎关注“ 计算机视觉研究院 ” 计算机视觉研究院专栏 作者&#xff1a;Edison_G 扫描二维码 关注我们 大家都在猜 GPT-4 发布时间&#xff0c;现在有人提前公布答案了&#xff0c;还是微软自己的 CTO。 转自《机器之心》 我们知道&#xff0c;引爆如今科技界军备竞赛的 ChatG…

【全栈】vue3.0 + golang + mysql + gorm + jwt + M5stack + Chatgpt集成【博客系统2.1】版本

2.1版本release 修复博客2.0bug&#xff08;我的-切换后-博客不能刷新&#xff09; 增加了远程灯控 chatGpt3.0集成 项目结构 <template><div id"app"><!-- 表单处理 ------------------><!-- <MyHeader :addTodo"addTodo"/…

【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)

ChatGLM-6B模型结构代码解析(单机版) ​ 本文介绍ChatGLM-6B的模型结构&#xff0c;代码来自https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py。 相关博客 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版) 【自然语言处理】【大模型】BL…

【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版)

BLOOM模型结构源码解析(单机版) ​ 本文基于transformers中BLOOM模型代码来解析BLOOM的原理及实现。 相关博客 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版) 【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版) 【自然语言处理】【大模型】极低资源微…

最新发布!面向开发者的 ChatGPT Prompt Engineering 免费教程,吴恩达与OpenAI合作打造!...

就在几小时之前&#xff0c;吴恩达在Twitter上宣布了与OpenAI合作的最新免费教程&#xff1a;《ChatGPT Prompt Engineering for Developers》 我们可以通过下面的链接&#xff0c;直达官网网站&#xff1a; https://www.deeplearning.ai/short-courses/chatgpt-prompt-enginee…

Datawhale-基于向量检索减少chatGPT的幻觉

AI的幻觉 可以使用CVP技术栈解决上述问题 CVP技术栈 ossChat Application 向量数据库 Zilliz Cloud是Milvus的托管服务。 基于Langchain搭建问答系统

chatgpt赋能python:Python中连接数据库的方式

Python中连接数据库的方式 数据库是现代Web应用程序中必不可少的组成部分之一。Python是一个功能丰富的编程语言&#xff0c;为我们提供了许多连接数据库的选项。在本文中&#xff0c;我们将介绍Python中的一些最受欢迎的数据库连接选项&#xff0c;并帮助您选择最适合您项目的…

chatgpt赋能python:Python如何添加数据库

Python如何添加数据库 介绍 Python是一种高级的、通用的、解释型的编程语言&#xff0c;因其简单易学、可读性强而被广泛应用在各种领域&#xff0c;尤其是数据处理、Web开发等方面。随着Web应用越来越流行&#xff0c;数据库的使用也变得越来越普遍&#xff0c;因此&#xf…

chatgpt赋能Python-python怎么装数据库

介绍 Python 是一种强大的编程语言&#xff0c;能够让程序员轻松地编写高效的代码来解决各种问题。Python 也被广泛用于 web 应用程序的开发。这些应用程序通常需要与数据库进行交互。本文将介绍如何在 Python 中安装数据库以便进行数据操作。 步骤 第一步&#xff1a;选择一…

机械臂全面学习---moveit和gazebo联合仿真

1、修改XXX.moveit_config/config/ros_controllers.yaml # MoveIt-specific simulation settings moveit_sim_hw_interface:joint_model_group: controllers_initial_group_joint_model_group_pose: controllers_initial_pose_ # Settings for ros_control control loop gener…

机械原理课程设计 洗瓶机机构设计(设计说明书+3张CAD图纸+连杆机构设计软件)

目 录 一 前 言 1 二 设计任务书 1 1、设计题目 1 2、设计任务 2 三 工艺动作分解和工作原理 2 1、工艺动作分解 2 2、原始数据 3 四 机械运动方案设计 3 1、分析设计要求 3 2、推瓶机构方案的设计 4 &#xff08;1&#xff09; 推瓶机构方案的选择 4 &#xff08;2&#xff09…

机械搬运手结构设计

目录…1 文摘…3 Abstract…3 第一章 绪论 1.1机械手概述…4 1.2机械手的组成和分类…4 1.2.1机械手的组成. 1.2.2机械手的分类 1.3国内外发展状况… …7 1.4课题的提出及主要任务………………………………………………8 1.4.1课题的提出 1.4.2课题的主要任务 第二章 机械手的设…

测试底妆的软件,一天一款粉底液,实测7款“网红”粉底液的妆感、遮瑕、持妆效果...

每次在入手粉底液前&#xff0c;各位会关注她的什么效果呢&#xff1f;是持妆度&#xff1f;还是妆感&#xff1f;还是遮瑕效果&#xff1f;其实&#xff0c;一款粉底液不可能兼顾我们的所有皮肤需求&#xff0c;有的粉底可能侧重遮瑕&#xff0c;有个侧重保湿&#xff0c;有的…