5_Text Generation(文本生成)

简介: 5_Text Generation(文本生成)

一、Example(案例)


前提:假设RNN已经训练好了。


输入文本,把文本分割成字符,用one-hot encoding来表示字符,每个字符表示为one-hot 向量,把one-hot向量一次输入RNN,RNN的状态向量h会积累看到的信息,RNN返回最后一个状态向量h,在RNN层上面是一个Softmax分类器,把h与参数矩阵W相乘得到一个向量,经过Softmax函数的变换,最终输入为一个向量,每个元素在(0,1)之间,元素全部相加为1。


Softmax的输出为一个概率分布:


6398c075d1774be93119ad07fc4ea928.png


Input text: “the cat sat on the ma”


Question: what is the next char?


RNN outputs a distribution over the chars.(Softmax的输出为一个概率分布)


Sample a char from it; we may get ‘t’.(假设我们得到字符t)


Take "the cat sat on the mat"as input.(把t接入到输入的文本末尾,然后把这句话作为输入,计算下一个字符的概率分布,从而生成下一个字符)


Maybe the next char is period “.” .(下一次可能抽到的是一个句号)


再下次可能抽到一个空格,不停重复下去,可能生成一段话,一篇文章,甚至是一本书


68812b1fb1ce0d94a2d3c9b014ea9d7e.png


二、Train an RNN for Text Prediction


How do we train such an RNN?(怎么样训练一个RNN)


训练数据为文本,比如英文维基百科的所有文章


Cut text to segments (with overlap) 把文章划分为很多片段,这些片段可以有重叠


E.g: seg len_40 and stride=3. (设置片段的长度为40,红色的片段有40个字符;步长为3表示下一个片段会向右平移三个字符的长度)


红色片段作为输入的文本,输入神经网络,神经网络做出的预测是这个蓝色的字符a


蓝色的字符a作为标签


5b1a651d46202e58ea7346e6ec683733.png


A segment is used as input text.(红色的片段用于神经网络的输入)


Its next char is used as label.(蓝色的字符会用作标签)


Training data: (segment , next _char ) pairs.(假如文章有3000个字符,文章会切成大约1000个pairs)


It is a multi-class classification problem.(它是一个多分类问题)


#class = #unique chars.(假如共有50个不同的字符,类别的数量是50,输入一个片段,输出50个概率值)


82222dd0fa321fc528c59a83d072ff26.png


训练神经网络的目的:给定输入的片段,神经网络可以预测下一个字符。


If the RNN is trained on Shakespeare’s books, then the generated text is Shakespeare’s style.


三、Training a Text Generator(训练文本生成器)—模型训练


3.1 Prepare Training Data(准备训练数据)


print("Text length:",len(text))            # Text length: 600893
text[0:1000]   # 文本的前1000个字符


3.2 Character to Vector(字符变为向量)


准备好文本,要处理文本,把一个字符变成一个向量,于是一个片段变成一个矩阵。


第一步,建立一个字典,把一个字符映射到一个正整数。用字典把字符变成正整数。

第二步,有了字典,做one-hot encoding。变成数值向量。


713bc4ff1b953fed42d7db7c1780bacf.png


问题:前几次,得到one-hot向量之后,要进行word Embedding,用一个低维词向量来表示一个词,这次不需要Embedding层。


原因:前几次,把一句话分成多个单词,英语里面有10000个常用词,把vocabulary设置成10000,那么one-hot encoding得到的one-hot 向量都是10000维的,维度太高,所以要用word Embedding把高维的one-hot 向量变成低维词向量,而这里我们把一句话切割成很多字符,文本里面通常也就几十个或100个常用字符(比如字母,数字,标点等),所以字典里面的vocabulary顶多100个,做one-hot encoding得到的one-hot 向量顶多100维,维度足够低,因此不需要进一步做Embedding。


Vocabulary is V = 57 (including letter, blank, punctuation, etc.) (字典里共有V=57个不同的字符,包括26个小写字母,空格,标点符号等)


Segment length is l = 60. (A segment has 60 chars.) (设置每个片段的长度l=60,每个片段里面有60个字符)


于是每个长度为60的片段就变成了60×57的矩阵,每个字符用57维的one-hot向量表示

便签是这个片段的下一个字符,这个字符编码成了57维的one-hot向量


Number of segments is n = 200,278. (Number of training samples.)


d4f2f743b55a0312e7bfeb8db192c757.png


3.3 Build a Neural Network(设计一个神经网络)

from keras import layers
# 开始搭建网络
model = keras.models.Sequential()     # 建立Sequential()模型
# LSTM层状态向量h的维度设为128,输入是60×57的矩阵,seg_len=60,vocabulary=57,每个片段编码成60×57的矩阵
# 这里面只能用单向LSTM,不能用双向LSTM,文本生成需要预测下一个字符,必须从前往后
model.add(layers.LSTM(128,input_shape=(seg_len,vocabulary)))
# 上面加载一个全连接层,加一个激活函数softmax,输出是v=57的向量,向量的每个元素是字符的概率值
# 字典里面有57个不同的字符,输出的向量是57维的
model.add(layers.Dense(vocabulary,activation="softmax"))
model.summary()


004ade77888b96608749b6dc32b96d30.png

3.4 Train the Neural Network(训练神经网络)

编译模型
# 指定优化算法为 RMSprop,loss为损失函数,
optimizer= keras.optimizers.RMSprop(lr=0.01)
model.compile(loss="categorical_cossentropy",optimizer=optimizer)
# 用训练数据来拟合模型,训练数据用x,y表示
model.fit(x,y,batch_size=128,epochs=1)

e99ff47354d7abaa0c61f0a7fa24ad1a.png

四、Text Generation(文本生成)


4.1 Predict the Next Char(预测下一个字符)


Question: Given the distribution, what will be the next char? (知道每个字符的概率值怎样生成下一个字符)


方法一:greedy selection.(哪个字符的概率大,选择哪个字符)


next_index = np.argmax(pred)


It is determipistic.(这种方法是确定性的,没有随机性)

Empirically not good.(从经验上讲不好。我们希望生成的文本尽量多元化)


方法二:sampling from the multinomial distrihution(多项式分布中随机抽取)


next_onehot = np.random.multinomial(1,pred,1)
next_index = np.argmax(next_onehot)


Maybe too random.(这种抽样太随机,生成的文本会有很多拼写和语法错误)


方法三:adjusting the multinomial distribution.(调整概率)


pred = pred ** (1 / temperature)
pred = pred / np.sum(pred)  # 归一化,大的概率值变大,小的概率值变小
  • Sample according to pred.
  • Between greedy and multinomial (controlled temperature).


c415449fba2311d18c9af32f6cbb689e.png

4.2 Text Generation: An Example


bb01e66c9932348247e157d26b5a8151.png


五、Summary(总结)


5.1 Train a Neural Network (训练神经网络)


Partition text to (segment, next_char) pairs. (把文本划分成片段)


One-hot encode the characters.(把字符编码成向量)


Character V x 1 vector. (每个字符用 V x 1的向量表示)


Segment LxV matrix. (每个片段用 LxV 的矩阵表示)


Build and train a neural network.

Lxv matrix ==> LSTM ==> Dense ==> vx1 vector.


5.2 Text Generation(文本生成)


Propose a seed segment.

Repeat the followings:

Feed the segment (with one-hot) to the neural network.

The neural network outputs probabilities.

next_char <——Sample from the probabilities.(根据概率值做抽样,得到下一个字符)

Append next char to the segment.(把新生成的字符接到片段的后面,作为神经网络新的输入,开始下一轮循环)


目录
相关文章
|
SQL 存储 OLAP
如何基于维度模型自动化生成SQL语句
众所周知数据分析的核心是数据,为了更容易的分析数据,数据模型的设计需要遵循一定的规范。当前最流行的联机分析处理(OLAP)的规范为维度建模规范。本文介绍Quick BI如何进行维度建模,基于维度模型如何来自动化的生成分析查询的SQL语句,从而使数据分析变得更容易。
2652 0
|
7月前
|
设计模式 搜索推荐 测试技术
提示词工程的十大认知误区
本文将列举一些提示工程认知和创作方面的认知误区,并分享了作者的一些见解,希望能够为读者提供启发。
291 35
|
5月前
|
人工智能 供应链 调度
|
UED
理解服务中数据驱动及实现方式
【6月更文挑战第15天】本文介绍数据驱动设计强调通过分析用户行为和反馈来指导设计决策,减少个人偏见。通过识别关键领域、设定具体目标、形成可验证的假设,设计师可以使用数据来优化CTA转化率、降低跳出率等关键指标。数据分为定量和定性两种,用于衡量设计更改的效果。这种方法已被证实能提升转化率和销售额,同时平衡创新与用户体验。
497 3
理解服务中数据驱动及实现方式
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错合集之遇到了关于MySqIValidator类缺失的错误,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
开发者 Java Spring
【绝技揭秘】掌握Vaadin数据绑定:一键同步Java对象,告别手动数据烦恼,轻松玩转Web应用开发!
【8月更文挑战第31天】Vaadin不仅是一个功能丰富的Java Web应用框架,还提供了强大的数据绑定机制,使开发者能轻松连接UI组件与后端Java对象,简化Web应用开发流程。本文通过创建一个简单的用户信息表单示例,详细介绍了如何使用Vaadin的`Binder`类实现数据绑定,包括字段与模型属性的双向绑定及数据验证。通过这个示例,开发者可以更专注于业务逻辑而非繁琐的数据同步工作,提高开发效率和应用可维护性。
195 0
|
人工智能 程序员 API
【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt
【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt
584 0
|
机器学习/深度学习 人工智能 自然语言处理
让大模型不再巨无霸,这是一份最新的大模型参数高效微调综述
【5月更文挑战第12天】最新综述探讨了大模型参数高效微调,旨在减少计算成本、增强泛化能力和灵活性。方法包括Additive、Selective、Reparameterized和Hybrid PEFT,已应用于NLP、CV和多模态学习。尽管取得进展,仍需解决泛化、效率和可解释性问题。未来研究将关注多任务学习、强化学习和神经架构搜索。论文链接:https://arxiv.org/pdf/2403.14608.pdf
650 2
|
机器学习/深度学习 人工智能 Python
性能调优:提升AI模型准确率的策略
【7月更文第17天】在人工智能的世界里,打造一个预测精准、表现优异的模型就像是烹饪一道美味佳肴,不仅要选对食材(特征),还得掌握火候(超参数调整)和调味技巧(正则化)。今天,我们就来聊聊如何通过《性能调优:提升AI模型准确率的策略》,让我们的AI模型变得更加聪明伶俐。
1097 0
|
Ubuntu
Ubuntu20.04安装软件报错:The following packages have unmet dependencies - 蓝易云
请注意,替换上述命令中的 `<package-name>`为你实际要安装的软件包名。
2772 0

热门文章

最新文章