Verwenden Sie GPT-2, um das CPM-LM-Modell zu laden und einen einfachen Roboter zur Beantwortung von Fragen zu implementieren

einführen

Zeige Ergebnisse

  • Unterstützt zwei Frage- und Antwortmodi sowie das Diktat alter Gedichte
    Zeige Ergebnisse

Schnelle Erfahrung

  • Sie können dieses Projekt schnell auf der Baidu AIStudio-Plattform erleben: Link

Qingyuan CPM

  • Qingyuan CPM (Chinese Pretrained Models) ist ein groß angelegtes Open-Source-Projekt für vorab trainierte Modelle, das gemeinsam vom Beijing Zhiyuan Artificial Intelligence Research Institute und dem Forschungsteam der Tsinghua-Universität entwickelt wurde
  • Das Qingyuan-Projekt ist ein groß angelegtes Vorschulungsmodell mit Chinesisch als Kern
  • Die erste Phase von Open-Source-Inhalten umfasst vorab trainierte chinesische Sprachmodelle und vorab trainierte Wissensrepräsentationsmodelle, die in großem Umfang für das Verständnis natürlicher chinesischer Sprache, Generierungsaufgaben und Wissensberechnungsanwendungen verwendet werden können
  • Alle Modelle stehen Wissenschaft und Industrie für Forschungszwecke kostenlos zum Download zur Verfügung
  • Offizielle Website des Qingyuan CPM- Projekts , Github

Laden Sie die Parameter des CPM-LM-Modells

  • Mit dem folgenden Code können Sie das zuvor erstellte GPT-2-Modell verwenden, um die Parameter von CPM-LM zu laden
  • CPM-LM-Modellparameter für die Paddle-Plattform können hier heruntergeladen werden
  • Da die offiziellen Modellparameter in FP16-Halbgenauigkeit gespeichert werden, ist es beim Laden erforderlich, die Parameter vorab in das FP32-Format zu konvertieren
  • Andere Orte unterscheiden sich nicht vom Laden normaler Modelle
import paddle
from GPT2 import GPT2Model

# 初始化GPT-2模型
model = GPT2Model(
    vocab_size=30000,
    layer_size=32,
    block_size=1024,
    embedding_dropout=0.0,
    embedding_size=2560,
    num_attention_heads=32,
    attention_dropout=0.0,
    residual_dropout=0.0)

# 读取CPM-LM模型参数(FP16)
state_dict = paddle.load('CPM-LM.pdparams')

# FP16 -> FP32
for param in state_dict:
    state_dict[param] = state_dict[param].astype('float32')

# 加载CPM-LM模型参数
model.set_dict(state_dict)

# 将模型设置为评估状态
model.eval()

Q&A-Bot-Implementierung

  • CPM-LM verfügt über eine gute Fähigkeit zur Textgenerierung in wenigen Schritten. Das heißt, Sie können einige Beispiele eingeben und dann die Beispiele lernen, um entsprechenden Text wie folgt zu generieren:
  • Ps. Der folgende Code dient nur zur Demonstration und das darin enthaltene Modell bezieht sich nicht auf das obige Modell
inputs = '''默写古诗:
日照香炉生紫烟,遥看瀑布挂前川。
飞流直下三千尺,'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

Schreiben Sie im Stillen ein altes Gedicht:
Die Sonne scheint auf das Weihrauchfass und erzeugt violetten Rauch, und der Wasserfall hängt aus der Ferne vor dem Fluss.
Es wird vermutet, dass die Milchstraße beim Flug dreitausend Fuß in die Tiefe neun Tage lang fällt.

inputs = '''问题:西游记是谁写的?
答案:'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

Frage: Wer hat „Journey to the West“ geschrieben?
Antwort: Wu Chengen.

inputs = '''小明决定去吃饭,小红继续写作业
问题:去吃饭的人是谁?
答案:'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

Xiao Ming beschließt zu essen, Xiao Hong macht weiterhin ihre Hausaufgaben.
Frage: Wer wird essen?
Antwort: Xiaoming

inputs = '''默写英文:
狗:dog
猫:'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

Schreiben Sie lautlos Englisch:
Hund: Hund
Katze: Katze

  • Durch das Zusammenfügen einiger einfacher Vorhersagefunktionen für wenige Schüsse können Sie einen einfachen Frage-Antwort-Roboter realisieren

Q&A-Bot-Code

  • Lassen Sie uns den laufenden Prozess des Programms anhand des Codes kurz verstehen
  • Spezifische Codedetails finden Sie in meinem GitHub-Projekt CPM-Generate-Paddle
  • Dekodiert anders als Beispiele, die von offiziellen Open-Source-Projekten verwendet werden
  • Für die Dekodierung wird in diesem Projekt die einfachste Greedy-Suche verwendet, sodass die Ausgabe, die derselben Eingabe entspricht, eindeutig ist
  • Daher ist dieses Projekt nicht für die Generierung von Artikeltexten geeignet, da die generierten Ergebnisse zu fest sind
import paddle
import argparse
import numpy as np
from GPT2 import GPT2Model, GPT2Tokenizer

# 参数设置
parser = argparse.ArgumentParser()
parser.add_argument("--pretrained_model", type=str, required=True, help="the detection model dir.")
args = parser.parse_args()

# 初始化GPT-2模型
model = GPT2Model(
    vocab_size=30000,
    layer_size=32,
    block_size=1024,
    embedding_dropout=0.0,
    embedding_size=2560,
    num_attention_heads=32,
    attention_dropout=0.0,
    residual_dropout=0.0)

print('正在加载模型,耗时需要几分钟,请稍后...')

# 读取CPM-LM模型参数(FP16)
state_dict = paddle.load(args.pretrained_model)

# FP16 -> FP32
for param in state_dict:
    state_dict[param] = state_dict[param].astype('float32')

# 加载CPM-LM模型参数
model.set_dict(state_dict)

# 将模型设置为评估状态
model.eval()

# 加载编码器
tokenizer = GPT2Tokenizer(
    'GPT2/bpe/vocab.json',
    'GPT2/bpe/chinese_vocab.model',
    max_len=512)

# 初始化编码器
_ = tokenizer.encode('_')

print('模型加载完成.')

# 基础预测函数
def predict(text, max_len=10):
    ids = tokenizer.encode(text)
    input_id = paddle.to_tensor(np.array(ids).reshape(1, -1).astype('int64'))
    output, cached_kvs = model(input_id, use_cache=True)
    nid = int(np.argmax(output[0, -1].numpy()))
    ids += [nid]
    out = [nid]
    for i in range(max_len):
        input_id = paddle.to_tensor(np.array([nid]).reshape(1, -1).astype('int64'))
        output, cached_kvs = model(input_id, cached_kvs, use_cache=True)
        nid = int(np.argmax(output[0, -1].numpy()))
        ids += [nid]
        # 若遇到'\n'则结束预测
        if nid==3:
            break
        out.append(nid)
    print(tokenizer.decode(out))

# 问答
def ask_question(question, max_len=10):
    predict('''问题:中国的首都是哪里?
    答案:北京。
    问题:李白在哪个朝代?
    答案:唐朝。
    问题:%s
    答案:''' % question, max_len)

# 古诗默写
def dictation_poetry(front, max_len=10):
    predict('''默写古诗:
    白日依山尽,黄河入海流。
    %s,''' % front, max_len)

# 主程序
mode = 'q'
funs = ask_question
print('输入“切换”更换问答和古诗默写模式,输入“exit”退出')
while True:
    if mode == 'q':
        inputs = input("当前为问答模式,请输入问题:")
    else:
        inputs = input("当前为古诗默写模式,请输入古诗的上半句:")
    if inputs=='切换':
        if mode == 'q':
            mode = 'd'
            funs = dictation_poetry
        else:
            mode = 'q'
            funs = ask_question
    elif inputs=='exit':
        break
    else:
        funs(inputs)

Zusammenfassen

  • Durch die einfache Implementierung von zwei Vorhersagefunktionen mit wenigen Schüssen kann ein so einfacher Frage-und-Antwort-Roboter konstruiert werden, der die Funktionen von Frage-und-Antworten und dem Diktat alter Gedichte realisiert
  • Aus diesem Beispiel ist ersichtlich, dass die Fähigkeit des CPM-LM-Modells zur Textgenerierung mit wenigen Schüssen immer noch gut ist, und selbst die Leistung mit Null Schüssen ist ebenfalls gut. Ein so großes chinesisches Vortrainingsmodell hat einiges zu bieten von GPT-3-Geschmack

Ich denke du magst

Origin blog.csdn.net/jm_12138/article/details/111480941
Empfohlen
Rangfolge