このシリーズでは、自然言語処理において主流であるTransformerを中心に、環境構築から学習の方法までまとめます。
今回の記事ではHuggingface Transformersによる日本語のテキスト生成のファインチューニングの実装を紹介します。
ニュース記事をファインチューニングして、架空のニュース記事を生成してみましょう。
Google colabを使用して、簡単に最新の自然言語処理モデルを実装することができますので、ぜひ最後までご覧ください。
今回の内容
・日本語版のテキスト生成学習済モデル
・「japanese-gpt2-medium」によるテキスト生成のファインチューニング
テキスト生成とは
自然言語処理におけるテキスト生成とは、特定のコンテキストからの継続であるテキストの一貫した部分を作成するタスクです。
例えば今回紹介するように「むかし、むかし、あるところに、」に続く自然な文章を生成することができます。
このような例だけなく、商品のキャッチコピーや説明文の自動生成など、様々な用途で応用が期待されています。
今回の記事では、「japanese-gpt2-medium」による日本語テキスト生成のファインチューニングを実装を紹介します。
ニュース記事をファインチューニングして、架空のニュース記事を生成してみましょう。
Transformerとは
概要
「Transformer」は2017年にGoogleが「Attention is all you need」で発表した深層学習モデルです。
現在では、自然言語処理に利用する深層学習モデルの主流になっています。
これまでの自然言語処理分野で多く使われていた「RNN」(Recurrent Neural Network)や「CNN」(Convolutional Neural Network)を利用せず、Attentionのみを用いたEncoder-Decoder型のモデルとなっています。
「Transformer」が登場して以降、多くの自然言語処理モデルが再構築され、過去を上回る成果を上げています。
最近では自然言語処理だけでなく、ViTやDETRなどといった画像認識にも応用されています。
詳細は以下の記事をご覧ください。
Huggingface Transformersとは
概要
「Hugging Face」とは米国のHugging Face社が提供している、自然言語処理に特化したディープラーニングのフレームワークです。
「Huggingface Transformers」は、先ほど紹介したTransformerを実装するためのフレームワークであり、「自然言語理解」と「自然言語生成」の最先端の汎用アーキテクチャ(BERT、GPT-2など)と、何千もの事前学習済みモデルを提供しています。
ソースコードは全てGitHub上で公開されており、誰でも無料で使うことができます。
事前学習済みモデル
Hugging Faceではタスクに応じた様々な事前学習済みモデルが提供されています。
こちらからご確認ください。
日本語版のテキスト生成学習済モデル
「japanese-gpt-1b」
「japanese-gpt-1b」はrinna社が2022年に公開した、日本語に特化した13億パラメータのGPT言語モデルです。
rinna社は2020年6月にマイクロソフトのAI&リサーチ部門でAIチャットボットの研究を行っていたチームがスピンアウトして設立されました。
このモデルの学習データとして、日本語のC4 ( https://huggingface.co/datasets/allenai/c4 )、CC-100 ( http://data.statmt.org/cc-100/ ) 、Wikipediaのオープンソースデータを使用しており、約14 perplexityを達成しています。
(14 perplexityとは、次の単語を予測するときに、単語候補の数を14に絞れる。この数は少ない程性能が良い。)
モデルはHugging Face でMITライセンスで公開されています。
「japanese-gpt-1b」によるテキスト生成は以下の記事で紹介しています。
「japanese-gpt-1b」は非常に高性能なモデルですが、サイズが非常に大きいため、Google colabでファインチューニングするとメモリが不足してしまいます。
今回の記事ではGoogle colabでも扱えるよう、「japanese-gpt2-medium」によるファインチューニングの実装を紹介します。
「japanese-gpt2-medium」
「japanese-gpt2-medium」は「japanese-gpt-1b」と同様にrinna社から公開されたモデルであり、学習はCC-100のオープンソースデータを用いて、Tesla V100 GPUで70GBの日本語テキストを約1カ月学習しています。
モデルの性能は約18 perplexityとなっています。
テキスト生成のファインチューニング
ここからはテキスト生成のファインチューニングを実装していきます。
ニュース記事をファインチューニングして、架空のニュース記事を生成してみましょう。
Google colabによる導入
ここからはGoogle colabを使用して実装していきます。
まずはGPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。
まずはGoogleドライブをマウントして、作業フォルダを作成します。
from google.colab import drive
drive.mount('/content/drive')
!mkdir -p '/content/drive/My Drive/huggingface_transformers_demo/'
%cd '/content/drive/My Drive/huggingface_transformers_demo/'
!git clone https://github.com/huggingface/transformers
%cd transformers
次に必要なライブラリをインストールします。
!pip install git+https://github.com/huggingface/transformers
!pip install -r ./examples/pytorch/language-modeling/requirements.txt
データセット取得
今回のこちらのサイトからニュース記事のデータセットを使用します。
(livedoor ニュースコーパス(https://www.rondhuit.com/download.html)より引用)
以下のコマンドを実行することで、データを取得することができます。
# livedoorニュースコーパスのダウンロード
!wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz
!tar zxvf ldcc-20140209.tar.gz
サイトからニュース記事を取得する事ができました。
データは「huggingface_transformers_demo/transformers/text」に保存されます。
データセット作成
取得したデータから、学習用のデータセットを作成します。
まずは各テキストファイルを読み込んで、すべての文章を1つのファイルにまとめます。
今回は「dokujo-tsushin」のニュースを内容を読み込みます。
import os
path = 'text/dokujo-tsushin/'
title_list = []
filenames = os.listdir(path)
for filename in filenames:
with open(path+filename) as f:
datalist = f.readlines()
for data in datalist:
if data == '\n':
pass
else:
title_list.append(data)
読み込んだニュースデータを学習用と検証用ファイルに分割して出力します。
title_list = [s.replace('\n', '') for s in title_list]
num = len(title_list)
with open('dokujo_train.txt',mode='w', newline='') as f:
f.writelines(title_list[:int(num*0.8)])
with open('dokujo_val.txt',mode='w', newline='') as f:
f.writelines(title_list[int(num*0.8):])
学習の実行
先程作成したデータをもとに、学習を行います。
「train_file=dokujo.txt」とすることで、先程作成したデータセットを使用することができます。
!python ./examples/pytorch/language-modeling/run_clm.py \
--model_name_or_path=rinna/japanese-gpt2-medium \
--train_file=dokujo_train.txt \
--validation_file=dokujo_val.txt \
--do_train \
--do_eval \
--num_train_epochs=10 \
--save_steps=500 \
--block_size 512 \
--save_total_limit=3 \
--per_device_train_batch_size=1 \
--per_device_eval_batch_size=1 \
--output_dir=text_generation/ \
--overwrite_output_dir \
--use_fast_tokenizer=False \
--logging_steps=5
参考(引数)
詳細は以下の表をご覧ください。
引数 | 設定 |
---|---|
model_name_or_path | モデルのチェックポイント |
do_train | 学習をするかどうか |
do_eval | 検証をするかどうか |
save_steps | 何ステップ毎に保存するかどうか |
save_total_limit | 直近でいくつのチェックポイントを保存するか |
output_dir | 結果の出力先 |
model_type | モデルの種別 |
use_fast_tokenizer | Fastトークナイザーを使用するかどうか |
use_auth_token | 「transformers-cli login」の実行時に生成されたトークンを使用するかどうか |
推論
作成したモデルを使って、実際に文章を生成してみましょう。
from transformers import T5Tokenizer, AutoModelForCausalLM
import torch
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
tokenizer.do_lower_case = True
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = AutoModelForCausalLM.from_pretrained("text_generation/")
model.to(device)
model.eval()
“タイトル「独身女性が」”に続く文章を3つ生成してみます。
prompt = "タイトル「独身女性が"
num = 3
input_ids = tokenizer.encode(prompt, return_tensors="pt",add_special_tokens=False).to(device)
with torch.no_grad():
output = model.generate(
input_ids,
max_length=500,
min_length=500,
do_sample=True,
top_k=500,
top_p=0.95,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
num_return_sequences=num
)
decoded = tokenizer.batch_decode(output,skip_special_tokens=True)
for i in range(num):
print(decoded[i])
以下のような結果が出力されました。
タイトル「独身女性が結婚をするのはバカバカしい」という女性が多くいる。やっぱり結婚は一生独身でいること。ダメ男にひっかかりやすいとか、モテないんじゃないかとか。やっぱりそういう女性の気持ちは良くわかる。けれど、それは独身だからの特権であり、結婚をしない、しない人生も大変だと思って欲しい。自分に万が一のことがあった時、ひとり身ではどうしようもないことが沢山あるだろう。自分の身体も、お金も、大切な人を失うかもしれない。だから独身でも結婚をしておけばよかったと後悔しても遅い。今や日本中、世界中の人が独身を貫いているのだから。独女や結婚に不利な状況は、けっして不幸なだけじゃない。むしろ、幸せなことが多いのではないだろうか。(橋口まどか)http://news.livedoor.com/article/detail/6310731/2012-03-1212:30:00+0900悩ましき人間関係、人間関係を楽しくするコツ「うちの旦那、ムカつくんです!」と、弱音をこぼす旦那さんの叫び。かつて、結婚してしばらくたつと、夫婦間でムカつくことがあるのでは?「わが家に嫌な感じの人たちが寄ってくるんですよ。何が嫌かって、うちの家の人たち、すごく優しくていい人なんですよ。」と語るのは、に勤務するさん(32歳)。この旦那さん、一見すると優しくて家事はテキパキできるのに、お酒の勢いでヤッちゃうんです。何度かやってダメなら、悪口を言い合ったり、投げやりなところがあるのでは? 「私、絶対に嫌だ」と一方的にケンカになったこともあるそうです。そんなさんが、ある日、いきなり実家に帰ってしまったんです。「やっぱり無理です!」と彼は嘆いていたのですが...。いくら、「男には何かしら困ることがあっても、女にはありがたいこともある」なんていう理屈でも、「本当に何が悪い!」と、その旦那さんは、ひどく怒ってしまったとか。 「あ〜、仕方ない!」とさんは諦めたが、「やっぱりさんは人間らしい生活をしているし、母親も元気なんですよ。それなのに、私はなんでこんなに怒ってるのだろう?」と、さんはどんどん
タイトル「独身女性が彼氏以外と過ごす時間が苦痛だと感じるのは、どんなときか?」に対し、圧倒的に多かった回答が「忙しくて恋愛する暇がない」(38.4%)、「彼氏が遊びに来ても問題ない」(29.3%)、「料理や洗濯、家族サービスなどで自分の時間がないと感じる」(19.7%)だった。また、「結婚して家庭ができると、普段は一人で過ごさなくちゃいけないから、精神的に寂しい」(20.3%)といった意見もあるが、独身女性の多くは、夫の干渉を常に受けているわけではないので、「寂しい」とは思っていないようだ。では、既婚女性に「独身女性が家事や育児に費やす時間」を聞いてみると、独身女性は結構、長い時間、家事をやっていることが多い。ただし、「その腕前は?」と聞くと「料理が得意じゃないから、とりあえずお皿洗いを手伝っています」「家事全般(特に洗濯&掃除)を完璧にこなすことは難しいけど、料理は得意」(29.6%)、「洗濯(特にマンション住まい)は嫁にやってもらう」(26.6%)など、少々、面倒くさいらしい。一方、既婚女性に「独身女性が家事や育児に費やす時間」を聞いてみると、1位が「洗濯」、2位が「料理」、3位が「洗濯」で、圧倒的に主婦の時間が多いという結果に。結婚して1人で生活するようになると、自分一人のための時間がなくなるのはもちろん、夫婦の関わり方が変わり、家事や育児について責任を持つようになる。当然、分担も必要となるし、力も入る。主婦の方は、ほんの少しでも夫が洗濯を手伝ってくれるよう、必死に“洗濯の時短”を頑張るのかもしれない。また、専業主婦の方は家事に対して、ほとんど夫にまかせっぱなしになっていることもある。そんな中、頼れるのは夫だけ! という独女たちにとって、家族がいる「主婦」は羨望の的かも。アンケートの結果を受けて、既婚女性たちに既婚男性に「独身女性が夫以外の人と過ごす時間が苦痛だと感じる瞬間」を聞いてみた。アンケートには、こんな回答もあった。「彼が来ても全く構わない時間に帰宅しなくちゃいけないとき」(29歳・女・独身)「彼が自転車で帰宅途中、寂しそうに私の元に立ち寄ってきて、『どうした?』と聞いてきたとき」(27歳・女・独身)「
タイトル「独身女性が婚活する意味は?」 質問者:愛さん独身女性です。結婚相談所を利用しているのですが、登録したお見合い相手が一向に成婚しないでいます。私のアドバイス通り、婚活していますがなかなか上手く行きません。お見合いはしたのですが返事が来ないし、最近結婚が決まった女性会員様も活動を始めてからすぐに成果がでています。長々と婚活の話ばかりで失礼かと思いましたが、私の婚活の愚痴を聞かせて下さい。早く結果を出したいので結婚相談所に入会したのですが、結果がでなくてとても残念です。早く成婚しないと、貴方に不妊の影があると言われて慌てています。少しでも早く結婚したい気持ちが、プレッシャーになって婚活をより辛くさせているのでしょうか?長々とすみませんでした。(続きを読む)http://news.livedoor.com/article/detail/5283045/2011-09-0917:30:00+0900女の体を描くとき「気持ちよさ」は不可欠独女達も歳を重ねるにつれ、パートナーへの安心や価値観も出てくる。お付き合いしている人がいる場合は、特にその気持ちが大切になり、さまざまな形で相手に伝えているだろう。そろそろ心機一転、気持ちを改めて、自分の体とも向き合ってみようと思う独女も多いはず。今回は、「男ウケ」から「女ウケ」へ心機一転、と女性陣を中心に「気持ちよさ」がどのように変化するのかを、イラストレーターである原智佐さんに伺った。「私は、疲れていたり心が弱っているときには、身体がむき出しになっているのを感じます。その時、私は、上半身裸になれる裸水泳のような感覚が楽しかったりします。身体がむき出しのままポーズを決めたり、ぼーっとしながら目を閉じるだけで、心も清められたりします。これは、最近、気づいたことなのですが......」どうやら、身体のむくみは脳と関係があるらしい。「私は、女性に向かって声を荒げている時は、男性に気持ちよく出てもらう事ができます」と話してくれた。心と身体は一見、繋がっているようにも思えるが、実はリンクしていないことが多い。自分の気持ちを伝えるときには、男性にも女性にもない高いレベルの技、それが「気持ちよさ」なのだ。
学習したデータをもとにした文章が出力されました。
まとめ
最後までご覧いただきありがとうございました。
今回の記事ではHuggingface Transformersによる日本語のテキスト生成のファインチューニングを実装を紹介しました。
このシリーズでは、自然言語処理全般に関するより詳細な実装や学習の方法を紹介しておりますので、是非ご覧ください。