パスワードを忘れた? アカウント作成
15247260 journal
人工知能

yasuokaの日記: 『古事記』言語モデルroberta-kojiki-base-charの作成

日記 by yasuoka

昨日の日記で作成したroberta-classical-chinese-base-charを改造して、『古事記』のRoBERTaモデルを作成してみた。Google Colaboratory (GPU付)で2時間程度かかる。

from google.colab import drive
drive.mount("/content/drive")
!pip install transformers
!cp /dev/null train.txt
!for F in 古事記/上卷 古事記/中卷 古事記/下卷 ; do curl -L 'https://ws-export.wmcloud.org/?lang=zh&format=txt&page='$F | sed -e 1,/Exported/d -e '/About/,$d' -e 's/〈[^〉]*〉//g' -e 's/。/&\n/g'  >> train.txt ; done

from transformers import AutoTokenizer,AutoModelForMaskedLM,LineByLineTextDataset,DataCollatorForLanguageModeling,TrainingArguments,Trainer
tokenizer=AutoTokenizer.from_pretrained("/content/drive/My Drive/roberta-classical-chinese-base-char")
model=AutoModelForMaskedLM.from_pretrained("/content/drive/My Drive/roberta-classical-chinese-base-char")
dataset=LineByLineTextDataset(tokenizer=tokenizer,file_path="train.txt",block_size=512)
collator=DataCollatorForLanguageModeling(tokenizer=tokenizer,mlm=True,mlm_probability=0.15)
args=TrainingArguments(output_dir="/tmp",overwrite_output_dir=True,num_train_epochs=200,per_device_train_batch_size=100,warmup_steps=500,learning_rate=2e-04,weight_decay=0.01,adam_beta1=0.9,adam_beta2=0.98,adam_epsilon=1e-04,save_steps=500,save_total_limit=2,seed=1)
trainer=Trainer(model=model,args=args,data_collator=collator,train_dataset=dataset)
trainer.train()
trainer.save_model("/content/drive/My Drive/roberta-kojiki-base-char")
tokenizer.save_pretrained("/content/drive/My Drive/roberta-kojiki-base-char")

データ量が少ないので、15200ステップでも「過学習」ぎみではあるのだが、うまくいけばGoogle Driveにroberta-kojiki-base-charが作成される。「伊邪那[MASK]命詔之」を穴埋めさせてみよう。

from google.colab import drive
drive.mount("/content/drive")
!pip install transformers
import torch
from transformers import AutoTokenizer,AutoModelForMaskedLM
tokenizer=AutoTokenizer.from_pretrained("/content/drive/My Drive/roberta-kojiki-base-char")
model=AutoModelForMaskedLM.from_pretrained("/content/drive/My Drive/roberta-kojiki-base-char")
tokens=tokenizer.tokenize("伊邪那[MASK]命詔之")
print(tokens)
mask=tokens.index("[MASK]")
ids=torch.tensor([tokenizer.convert_tokens_to_ids(tokens)])
with torch.no_grad():
  outputs=model(ids)
  pred=outputs[0][0,mask].topk(5)
for i,t in enumerate(tokenizer.convert_ids_to_tokens(pred.indices)):
  tokens[mask]=t
  print(i+1,tokens)

私(安岡孝一)の手元では、以下の結果になった。

['伊', '邪', '那', '[MASK]', '命', '詔', '之']
1 ['伊', '邪', '那', '岐', '命', '詔', '之']
2 ['伊', '邪', '那', '伎', '命', '詔', '之']
3 ['伊', '邪', '那', '美', '命', '詔', '之']
4 ['伊', '邪', '那', '藝', '命', '詔', '之']
5 ['伊', '邪', '那', '勢', '命', '詔', '之']

イザナギとイザナミの両方を理解したらしい。この『古事記』言語モデル、通常の古典中国語(漢文)とは様子がかなり違ってるのだが、さて、何に使おうか。

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

読み込み中...