码迷,mamicode.com
首页 > 其他好文 > 详细

AI嘻哈写歌词软件总结

时间:2018-11-13 02:56:19      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:编码   idt   tf-idf   语句   src   comm   固定   数学   cell   

(一)软件功能

实现两个功能:根据主题生成歌词和辅助写歌词

  • 根据用户给定的主题生成一段歌词,歌词表达要流畅,语句通顺,押韵
  • 提供相关的词语和句子供用户选择,使用户在帮助下完成歌词创作

核心模型

  • 主题生成首句模型-相似度计算 + 基于SIF加权的word2vec模型
  • 首句生成整段歌词模型-基本的Seq2Seq模型和双向Decoder + beam search的改进模型

(二) 核心模型

A. 主题生成首句模型--基于向量和基于字符的相似度模型 + 基于SIF加权的word2vec模型

事先划定20个主题词,将语料库的歌词人工标注为20类中的一种。将用户输入的主题和20个主题词对比,找到最相近的主题词。每个主题词下有30句预先定义了30句歌词,从这些歌词中随机抽取一句作为生成的首句。使用Dice相似度和基于SIF的word2vec方式。

基于向量和基于字符的相似度模型

  1. 如果用户输入的字符已经存在的语料库中,那么直接使用输入字符的word embedding和预定义主题的word embedding做余弦相似度比较,余弦相似度可以将文本置于向量空间,解释性强,效果好。

  2. 如果用户输入的字符不在语料库中,那么使用基于字符的Dice相似度计算方式如下,这种计算方式可以是直接计算字符之间的相似度,不需要通过字符的向量表示。

Dice系数=$\frac{2*commmon(S_1,S_2)}{len(S_1)+len(S_2)}$

基于SIF加权的word2vec模型

模型的目标是计算和主题词最相关的30句话。计算语料库每一句歌词中所有关键词的word embedding,使用SIF对所有词的word embedding加权平均。求得句子的embedding表示。计算主题词的embedding和句子embedding之间的相似度,找到相似度最大的30句歌词。

word2vec原理

word2vec是个单层的神经网络,包括输入、隐含层和输出层。输入是词语的one hot向量,输出的是词语的在语义上的唯一向量表示embedding。Word2Vec包含两个模型:CBOW和Skip-gram。CBOW是上下文预测当前词的词向量;Skip-gram使用当前词预测上下文的词向量。在模型求解过程中使用分级是softmax和负采样方式加快算法。

计算句子的word embedding

  • 对句子中所有词的word vector求平均,获得sentence embedding,对不相关的词给太多权重。
  • 以每个词的tf-idf为权重,对所有词的word embeddingr加权平均,获得sentence embedding
  • 以SIF的方式计算权重,对所有词的word embedding加权平均,最后从中减掉principal component,得到sentence embedding。解决了tf-idf对出现频率过高词的权重的依赖。

SIF加权:类似词频计算权重的方法,但是这种方式多考虑不常见元素的权重。SIF取句中词嵌入的平均权重。每个词嵌入都由a/(a +p(w))进行加权,其中a的值经常被设置为0.01,而p(w)是词语在语料中出现的频率。常见元素删除:接下来,SIF计算了句子的嵌入中最重要的元素。然后它减去这些句子嵌入中的主要成分。这就可以删除与频率和句法有关的变量,他们和语义的联系不大。最后,SIF使一些不重要的词语的权重下降,例如but、just等,同时保留对语义贡献较大的信息。


B. 主题生成首句模型--押韵版模型和不押韵版模型

给定第一句生成一段歌词。输入是第一句歌词的字符形式,输出是几段歌词的字符形式。根据用户要求歌词分成押韵和不押韵两种。不押韵的基本模型是双LSTM+Decoder的Seq2Seq模型 + Attention + Beam Search加强模型效果。押韵和不押韵的区别在于押韵模型是双Decoder和自定义的Beam search方式。

Seq2Seq + Attention + Beam search + Techer forcing模型

双向RNN

在经典的循环神经网络中,状态的传输是从前往后单向的。然而,在有些问题中,当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。我_ _ 想吃羊肉,要预测空格中的词语要同时看前后的词语的意思和时态、词性。这时就需要双向RNN(BiRNN)来解决这类问题。

双向RNN是由两个RNN上下叠加在一起组成的。输入是同时传到来个RNN,输出由这两个RNN的输出共同决定,一般采用均值的方式。

技术分享图片

其中,正向计算时,隐藏层的 $s_t$ 与 $s_{t-1}$ 有关;反向计算时,隐藏层的 $s_t$ 与 $s_{t+1}$ 有关。

Seq2Seq

模型的目标是输入一句歌词生成下一句歌词。但是传统的LSTM神经网络存在两个问题:1.每个字词的预测和之前的预测结果是独立的。2.输入语句和输出语句的长度必须一致。但这是违反常规的,所以我们使用Seq2Seq模型,分成encoder和decoder模型,可以使输入语句和输出语句的长度不一样。

技术分享图片

上图是Seq2Seq的总体流程图。
Encoder和Decoder分别是一个传统的RNN,encoder最后一个时刻的cell的hidden state输出到decoder的第一个cell里,通过激活函数和softmax层,得到候选的symbols,筛选出概率最大的symbols,作为下一个cell的输入。汇总所有的decoder的output就是最后的预测结果。

为什么要使用Encoder的最后一个hidden state?
在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中包含原始序列中的所有信息。

技术分享图片
这是Encoder的构造,它和普通的RNN、LSTM没有区别。具体每个细胞接受的是每一个单词word embedding,和上一个时间点的hidden state。输出的是这个时间点的hidden state。

技术分享图片
这是Decoder的构造,第一个cell是输入是encode的最后一个cell的hidden state,并且当前的output会输入到下一个cell中。

Attention

设计思想

由于Seq2Seq模型中是将encoder的最后一个hidden state输入到decoder,encdoer要将整个序列的信息压缩进一个固定长度的向量中去。这就造成了 (1)语义向量无法完全表示整个序列的信息,(2)最开始输入的序列容易被后输入的序列给覆盖掉,会丢失许多细节信息。在长序列上表现的尤为明显。

引入Attention

相比于之前的encoder-decoder模型,attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。

原理

完整流程

技术分享图片
上图是Seq2Seq模型+Attentionmo模型的完整示意图。

现在的解码过程(Decoder)是:
预测当前词$y_i$需要当前时刻的$h_i$和$c_i$上下文向量和上一时刻的输出$y_i$
预测当前词的$h_i$需要上一时刻的$h_{i-1},y_{i-1}$和$C_i$

计算$c_i$

技术分享图片
上图是计算$c_i$的完整过程示意图

其中:$c_i=\sum_{j=1}^{T_x}{\alpha_{ij}h_j}$,
$T_x$表示Encoder输入文本的长度,
$i$ 表示预测的第i个字符,
$j$ 表示Encoder中第j个字符,
$\alpha_{ij}$ 表示:输入Encoder中的第j个字符对预测第i个字符的影响程度,
$h_j$ 表示输入Encoder的第j个字符的hidden state。
这个计算公式的本质意义就是将输入字符的hidden state加权。重点是权重的计算方式。

技术分享图片
上图是计算$c_i$的图形过程示意图,之前的计算过程表示成图形就是这个样子的。

*计算$\alpha_{i}$

技术分享图片
$\alpha_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}{exp(e_{ik})}} \quad$,底下分母的意义就是归一化

$e_{ij}=a(y_{i-1,h_j})$,意义就是将已经得到的预测输出和输入Encoder的文字做匹配计算,得到i时刻的输出和j时刻的输入之间的注意力分配关系。最后带入上一个公式计算$c_i$.

Attention分类
  • Soft Attention
    就是我们刚才举例的模型,使用输入Encoder的所有hidden state加权取平均。我们使用的soft Attention类型。
  • Hard Attention
    使用概率抽样的方式,选择某个hidden state,估计梯度的时候也采用蒙特卡洛抽样的方法。

teacher forcing

Teacher Forcing是运用在解码过程中加强细胞的学习的方法。细胞接受来自上一个细胞的隐藏状态和细胞状态和上一个细胞的预测值的时候,这里细胞改成不用上一个细胞的预测值作为输出,用真实值作为输入,提高细胞的学习内容。

就拿Seq2Seq模型来举例,我们假设正输出到第三项,准备生成第四项:
input  = [A,B,C,D]
output = [X,Y,Z,W]
label  = [X,Y,N,W]

押韵模型

输入是根据主题词生成的第一句歌词的反序形式和押韵要求(单押、双押、长度)。输出是一段按照符合预定义押韵形式的歌词。使用skip thought模型和改进的beam search模型。skip thought使模型产生的结果更通顺,beam search完成押韵的要求。

Skip Thought

skip thought模型是双decoder,可以同时预测当前句子的上一句和下一句,使梯度回传到Encoder,增强encoder的参数学习,更好地捕捉前后文的信息。同时Encode和Decoder之间使用均值的方式连接。

Beam search

Beam Search是运用在inference阶段的加强预测结果的方法。它改进了贪婪解码中只选择一个得分最大的词语作为输出的方式,而是选出得分最大的K个词,在下一步的时候在当前选择的词语的基础上还是选择K个单词,然后不断沿着时间步长走下去,保证整体得到的结果最优。

有了首句之后,不是直接搜索首句韵脚相同的词语,而且先通过skip thought模型得到首句的上一句和下一句和最后一个细胞的输出(语料库的词语的概率分布),用概率最大并且满足韵脚的词语作为歌词末尾的韵脚歌词,使用自定义的beam search方式,使其从最后一个押韵词开始向前搜索每个词语,直至遇到停止符,输出整个语句。

AI嘻哈写歌词软件总结

标签:编码   idt   tf-idf   语句   src   comm   固定   数学   cell   

原文地址:https://www.cnblogs.com/x739400043/p/9949695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!