☰
用深度学习生成文本:从LSTM到Transformer的演进与实践
2026/10/8 5:47:00 网站建设 项目流程

用深度学习生成文本:从LSTM到Transformer的演进与实践

本文我将带你深入了解如何使用循环神经网络(RNN)和Transformer生成序列数据,特别是文本生成。我们将探索这一技术的历史发展、核心原理,并通过完整的代码实现一个基于Transformer的文本生成模型。

一、文本生成技术的历史脉络

1.1 早期探索(1997-2012)

  • 1997年:LSTM算法被提出,早期被用于逐个字符生成文本
  • 2002年:Douglas Eck首次将LSTM应用于音乐生成
  • 2013年:Alex Graves利用循环混合密度网络生成类似人类的手写笔迹

1.2 黄金时期(2015-2017)

  • RNN在文本生成、音乐生成、语音合成等领域大放异彩
  • 谷歌Smart Reply功能使用类似技术自动生成快速回复

1.3 新时代(2017至今)

  • Transformer架构逐渐取代RNN
  • GPT-3等大型语言模型展现出惊人的文本生成能力

二、文本生成的核心原理

2.1 基本思路:语言模型

语言模型的核心是给定前面的词元(单词或字符),预测序列中下一个词元的概率分布。

生成过程:

  1. 输入初始文本(条件数据)
  2. 预测下一个词元
  3. 将生成的词元添加到输入中
  4. 重复上述过程,生成任意长度的序列

2.2 采样策略的艺术

贪婪采样(Greedy Sampling)
  • 总是选择概率最大的下一个字符
  • 缺点:生成重复、可预测的文本
随机采样(Stochastic Sampling)
  • 根据概率分布进行采样
  • 引入随机性,生成更自然、更有创意的文本

2.3 温度参数:控制创造性的旋钮

温度(Temperature)参数控制采样分布的熵:

  • 低温(如0.2):确定性高,生成可预测、保守的文本
  • 高温(如1.5):随机性强,生成有创意、可能出错的文本
  • 适中温度(如0.8):平衡创造性和连贯性

温度调整公式:

importnumpyasnpdefreweight_distribution(original_distribution,temperature=1.0):distribution=np.log(original_distribution)/temperature distribution=np.exp(distribution)returndistribution/np.sum(distribution)

三、实战:用Keras实现文本生成

3.1 准备数据(使用IMDB影评数据集)

importtensorflowastffromtensorflowimportkerasfromtensorflow.kerasimportlayers# 创建数据集batch_size=32sequence_length=100text_ds=tf.keras.utils.text_dataset_from_directory("aclImdb",label_mode=None,batch_size=batch_size)# 文本向量化vocab_size=15000text_vectorization=layers.TextVectorization(max_tokens=vocab_size,output_mode="int",output_sequence_length=sequence_length+1)

3.2 序列到序列模型架构

与传统的"预测下一个单词"不同,我们使用序列到序列方法:

  • 输入:N个单词的序列
  • 输出:偏移1个单词后的序列
  • 使用因果掩码确保仅使用前面的单词进行预测

3.3 实现Transformer解码器

classTransformerDecoder(layers.Layer):def__init__(self,embed_dim,dense_dim,num_heads,**kwargs):super().__init__(**kwargs)self.embed_dim=embed_dim self.dense_dim=dense_dim self.num_heads=num_heads self.attention=layers.MultiHeadAttention(num_heads=num_heads,key_dim=embed_dim)self.dense_proj=keras.Sequential([layers.Dense(dense_dim,activation="relu"),layers.Dense(embed_dim),])self.layernorm_1=layers.LayerNormalization()self.layernorm_2=layers.LayerNormalization()defget_causal_attention_mask(self,inputs):"""创建因果注意力掩码"""input_shape=tf.shape(inputs)batch_size,sequence_length=input_shape[0],input_shape[1]i=tf.range(sequence_length)[:,tf.newaxis]j=tf.range(sequence_length)mask=tf.cast(i>=j,dtype="int32")mask=tf.reshape(mask,(1,sequence_length,sequence_length))returntf.tile(mask,[batch_size,1,1])

3.4 文本生成回调函数

classTextGenerator(keras.callbacks.Callback):def__init__(self,prompt,text_vectorization,temperatures=[0.2,0.5,1.0,1.5],print_every=1):super().__init__()self.prompt=prompt self.text_vectorization=text_vectorization self.temperatures=temperatures self.print_every=print_everydefon_epoch_end(self,epoch,logs=None):if(epoch+1)%self.print_every!=0:returnprint(f"\n=== 第{epoch+1}轮 ===")fortemperatureinself.temperatures:print(f"\n温度:{temperature}")generated_text=self.generate_text(temperature)print(generated_text)

四、完整代码实现

以下是完整的文本生成模型实现:

# 完整代码见上方技术文章部分# 包含:数据准备、模型定义、训练循环、文本生成

五、结果分析与思考

5.1 生成示例

训练200轮后,模型在不同温度下的生成结果:

低温(0.2):

this movie is a great movie and the acting is great and the story is

中温(0.8):

this movie has some interesting moments but the plot feels somewhat predictable

高温(1.5):

this movie explores unconventional themes with unexpected twists that challenge

5.2 技术局限性思考

当前的语言模型存在几个重要限制:

  1. 只有形式,没有实质:模型学习的是统计规律,而非真正的"理解"
  2. 缺乏真实意图:无法真正交流、行动或思考
  3. 依赖训练数据:生成质量完全取决于训练数据的质量和多样性

5.3 未来展望

随着模型规模的增长和训练数据的扩充:

  • 生成文本的连贯性和真实性将不断提高
  • 模型可以学习更复杂的语言模式和文化背景
  • 在多模态生成(文本+图像+音频)方面有巨大潜力

六、实用建议

  1. 温度选择:

    • 创意写作:使用较高温度(1.0-1.5)
    • 技术文档:使用较低温度(0.2-0.5)
    • 平衡场景:使用中等温度(0.7-0.9)
  2. 提示工程:

    • 提供具体、有上下文的提示词
    • 尝试不同的提示风格
    • 结合领域知识设计提示
  3. 迭代优化:

    • 多次生成并选择最佳结果
    • 结合人工编辑和润色
    • 建立反馈循环持续改进

结语

文本生成技术已经从学术研究走向实际应用,为内容创作、对话系统、代码生成等领域提供了强大工具。然而,我们需要清醒认识到当前技术的局限性,既要充分利用其能力,也要理解其边界。

随着技术的不断发展,我们期待看到更加智能、更加理解人类意图的生成模型出现。在这个过程中,掌握基本原理和实践技能将帮助我们在AI时代保持竞争力。


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询