用深度学习生成文本:从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):平衡创造性和连贯性

温度调整公式:

import numpy as np

def reweight_distribution(original_distribution, temperature=1.0):
    distribution = np.log(original_distribution) / temperature
    distribution = np.exp(distribution)
    return distribution / np.sum(distribution)

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

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

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 创建数据集
batch_size = 32
sequence_length = 100

text_ds = tf.keras.utils.text_dataset_from_directory(
    "aclImdb",
    label_mode=None,
    batch_size=batch_size
)

# 文本向量化
vocab_size = 15000
text_vectorization = layers.TextVectorization(
    max_tokens=vocab_size,
    output_mode="int",
    output_sequence_length=sequence_length + 1
)

3.2 序列到序列模型架构

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

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

3.3 实现Transformer解码器

class TransformerDecoder(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()
    
    def get_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))
        return tf.tile(mask, [batch_size, 1, 1])

3.4 文本生成回调函数

class TextGenerator(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_every
        
    def on_epoch_end(self, epoch, logs=None):
        if (epoch + 1) % self.print_every != 0:
            return
        
        print(f"\n=== 第 {epoch + 1} 轮 ===")
        
        for temperature in self.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时代保持竞争力。


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐