前回のブログを振り返ると、モデルのトレーニングと保存に成功しました。トレーニングされたモデルがテキスト生成の基礎となるため、これは重要なマイルストーンです。
さて、次のステップは、このトレーニング済みモデルをロードし、それを使用して古代の詩を生成することです。
この章の内容はテキスト生成段階 に属します。この段階では、古詩生成のコード実装について詳しく紹介します。この部分は、私たちのモデルが以前に学習した知識を活用して新しい古代の詩的テキストを作成する方法を確認するため、プロジェクトの非常にエキサイティングな部分です。古代の詩が生成されるプロセスを掘り下げ、その背後にある技術的な詳細を理解しましょう。
[1]生成開始
生成されたコードは、テキストを生成するときに追加のコードを記述する必要があることを除いて、モデルのトレーニングと非常によく似ています。全体的なコードは次のとおりです。
def create_trainer(wrapper):
# 分词器, 模型
model = wrapper.model
args = TrainingArguments(
'./checkpoints', # 模型保存的输出目录
per_device_train_batch_size=1,
per_device_eval_batch_size=1,
)
trainer = Trainer(
model,
args
)
return trainer
def softmax( f ):
# 坏的实现: 数值问题
return np.exp(f) / np.sum(np.exp(f))
def main():
# ##
# @通用配置
# ##
with open('config.yaml', 'r', encoding='utf-8') as f:
conf = yaml.load(f.read(), Loader=yaml.FullLoader)
conf_pre = conf['pre']
conf_sys = conf['sys']
# 系统设置初始化
System(conf_sys).init_system()
# 初始化任务加载器
Task = TASKS[conf_pre['task_name']]()
data = Task.get_train_examples(conf_pre['dataset_url'])
# 初始化数据预处理器
Processor = PROCESSORS[conf_pre['task_name']](data, conf_pre['max_seq_len'], conf_pre['vocab_path'])
tokenizer = lambda text: Processor.tokenizer(text, add_end=False)
vocab = Processor.vocab
# 初始化模型包装配置
wrapper_config = WrapperConfig(
tokenizer=tokenizer,
max_seq_len=conf_pre['max_seq_len'],
vocab_num=len(Processor.vocab),
word2vec_path=conf_pre['word2vec_path']
)
x = import_module(f'main.model.{
conf_pre["model_name"]}')
wrapper = NNModelWrapper(wrapper_config, x.Model)
trainer = create_trainer(wrapper)
wrapper.model.load_state_dict(torch.load(conf_pre['model_save_dir'] + conf_pre['task_name'] + '/' + conf_pre['model_name'] + '/' + 'pytorch_model.bin', map_location=torch.device('cpu')))
poem = '天'
l = len(poem)
for i in range(l, 32):
test_data = Task.get_single_examples(poem)
test_dataset = wrapper.generate_dataset(test_data, labeled=False)
output = trainer.predict(test_dataset=test_dataset)[0][0]
# 逐字生成
pred = output[i]
pred = softmax(pred)
pred /= np.sum(pred)
sample = np.random.choice(np.arange(len(pred)), p=pred)
# sample = np.argmax(pred)
if sample > len(vocab):
new_word = ' '
else:
# vocab通过键查找key
new_word = vocab[sample]
poem += new_word
print(poem)
このパートでは、事前トレーニングされたモデルを使用して古代の詩などのテキストを生成する方法を検討します。プロセス全体には次の手順が含まれます。
*config.yaml
ファイルから設定を読み込みます。
* システム設定およびタスクローダを初期化します task
。
* データをロードし、データ プリプロセッサを初期化します processor
。
* モデルのパッケージング構成を作成します WrapperConfig
。
* モデルクラスを動的に読み込み、 NNModelWrapper
インスタンスを作成します。
* 予測用のトレーナー trainer
を作成します。
* 事前学習済みモデルの重みを読み込みます。
* テキストの生成:最初のテキスト(「天」など)から、指定した長さ(32 文字など)に達するまで 1 文字ずつ新しいテキストを生成します。
テキスト生成部分の主な手順は次のとおりです。
* モデルを使用して次の文字の確率分布を予測します。
* ソフトマックス関数を適用して標準化された確率分布を求めます。
* 確率分布からランダムに次のキャラを引きます(または最も確率の高いキャラを選択します)。
* 既存のテキストに新しい文字を追加し、上記の処理を繰り返します。
[2] ジェネレートモード
古代の詩を生成するプロセスでは、いくつかの異なる生成モードを使用できます。
1. 補数の生成 : 古代の詩の最初の数単語を入力し、モデルに残りの部分を完成させます。
2. 単語生成なし: 接頭辞を入力せず、モデルに完全な古代詩を直接生成させます。
3. アクロスティック詩: ABCD の 4 文字を入力し、1 番目、9 番目、17 番目、25 番目の位置を手動で入力します。値 A、B、C、D が割り当てられ、残りはモデルによって生成されます。
[3] 展望
生成された古詩の品質を評価する場合、次の重要な要素を考慮する必要があります。
· コンテキストの一貫性 : 生成されたテキストはコンテキストと論理的に一貫しており、全体の一貫性を維持する必要があります。
・ トピックの関連性 : コンテンツは、あらかじめ決められたテーマやテーマに関連している必要があります。
· 新規性 : テキストには新規、創造的、または革新的な要素が導入されている必要があります。
· 様式化 : テキストは特定のスタイルまたは美的品質を示す必要があります。
・ 感情表現 : テキストは感情を効果的かつ適切に表現する必要があります。
特に詩のようなクリエイティブな分野における高品質のテキスト生成は、単に単語をつなぎ合わせるだけではありません。文脈の一貫性、テーマの関連性、革新性、スタイル、感情の深さなど、複数のレベルで共鳴するものでなければなりません。
この実践プロジェクトでは基本的な古詩生成機能のみを提供しており、上記の点についてはあまり掘り下げていません。さらに研究を進め、生成されるテキストの品質を向上させたい場合は、関連する学術論文を参照して詳細な調査を行うことができます。