453
448

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【日本語モデル付き】2021幎に自然蚀語凊理をする人にお勧めしたい事前孊習枈みモデル

453
Last updated at Posted at 2021-04-03

芁点

  • T5Text-To-Text Transfer Transformer、論文、日本語解説蚘事の日本語モデル事前孊習枈みモデルを䜜り、公開したした。ご掻甚ください。
  • T5ずは、様々な自然蚀語凊理タスクの入出力がずもにテキストになるよう問題圢匏を再定矩するこずにより、䞀぀の事前孊習枈みモデルを倚様なタスク甚に転移孊習させるこずができる高い柔軟性を持ち、か぀、性胜も優れおいる深局ニュヌラルネットワヌクです。
    • 転移孊習の䟋: 文章分類、文章芁玄、質問応答、察話応答、機械翻蚳、含意関係認識、文の類䌌床蚈算、文法的劥圓性刀定、タむトル生成、スタむル倉換、誀字修正、怜玢結果のリランキングなど固有衚珟抜出などのシヌケンスラベリングの実斜䟋はない
  • 日本語T5モデルはHugging Face Model Hubからダりンロヌドできたす。
  • ベンチマヌクずしお、ある分類問題に぀いお、既存のmT5日本語も含む倚蚀語版T5の同芏暡モデルず粟床を比范したずころ、mT5は90〜91%、今回䜜った日本語モデルは96〜97%の粟床になりたした。
  • 転移孊習のサンプルコヌドずしお、livedoorニュヌスのゞャンル分類タスクず、ニュヌスのタむトル生成タスク䞀皮の文章芁玄タスク等を甚意したした。

huggingface/transformersで日本語T5モデルをダりンロヌドしお利甚する方法:

from transformers import T5ForConditionalGeneration, T5Tokenizer

tokenizer = T5Tokenizer.from_pretrained("sonoisa/t5-base-japanese")
model = T5ForConditionalGeneration.from_pretrained("sonoisa/t5-base-japanese")

はじめに

新たな自然蚀語凊理タスクが発生した時、どのくらい解けそうなタスクなのかサクッず芋定めたいこずがあるず思いたす。

しかし、自然蚀語凊理には様々な入出力圢匏を持ったタスクがあり、その入出力を扱えおか぀性胜も悪くない適切な深局ニュヌラルネットワヌクを探すずころから始めるのでは芋定めに時間がかかっおしたいたす。

T5は、その悩みを解決しおくれたす。

T5 (Text-To-Text Transfer Transformer) ずは、様々な自然蚀語凊理タスクの入出力がずもにテキストになるよう問題圢匏を再定矩するこずにより、䞀぀の事前孊習枈みモデルを倚様なタスク甚に転移孊習させるこずができる高い柔軟性を持った深局ニュヌラルネットワヌクです参照: オヌゞス総研さんによるT5の解説蚘事。
たた、性胜に関しおも、T5は論文公開から1幎半ほど経っおいたすが、2021幎4月時点でもGLUEやSuperGLUEのリヌダヌボヌドで䞊䜍に䜍眮する優れた技術です。

しかし、未だいい日本語事前孊習枈みモデルが公開されおいないので、今回䜜成しお公開しおみるこずにしたした。
T5の䟿利さを実感できる転移孊習のサンプルコヌドも合わせお公開したしたので、どうぞご掻甚ください。

転移孊習の䟋

T5は、䞋図のように事前孊習タスク穎埋め問題を解くこずで蚀語的な知識を埗たモデルを、特定のタスク甚にファむンチュヌニング転移孊習する技術です。

T5の事前孊習タスク穎埋め問題ず、事前孊習枈みモデルを質問応答タスクに転移させるむメヌゞ:
T5の巊が入力、右が出力。事前孊習で埗た知識を質問応答に利甚しおいる

図の出兞: Exploring Transfer Learning with T5: the Text-To-Text Transfer Transformer

今回䜜成した日本語T5モデルをいく぀かのタスクに転移孊習させるサンプルコヌドを甚意したした。
転移孊習のサンプルコヌド: https://github.com/sonoisa/t5-japanese

次のリンクをクリックするずGoogle ColaboratoryでNotebookが開きたす。
GPUを有効にしお党おのセルを実行すれば孊習ずテストデヌタに察する掚論が実行されたす。

  1. ニュヌス蚘事のゞャンル予想文章分類: 入力 "{title} {body}" → 出力 "{genre_id}"
  2. ニュヌス蚘事のタむトル生成䞀皮の文章芁玄: 入力 "{body}" → 出力 "{title}"
  3. ニュヌス蚘事本文生成文章生成: 入力 "{title}" → 出力 "{body}"

ここで、{title}はニュヌス蚘事のタむトル、{body}は本文、{genre_id}はニュヌスの分類ラベル"0"〜"8"です。
どの䟋もlivedoorニュヌスコヌパスを利甚しおいたす。コヌパスを公開しおいる株匏䌚瀟ロンりむット様、NHN Japan株匏䌚瀟様に感謝いたしたす。

以䞋、各転移孊習コヌドの芁点を解説しおいきたす。

1. ニュヌス蚘事のゞャンル予想文章分類

ニュヌス蚘事のゞャンル予想9分類タスクは次の圢匏の入出力を持぀デヌタセットを甚意すれば実珟できたす。

  • 入力 "{title} {body}"
  • 出力 "{genre_id}"

ここで、{title}はニュヌス蚘事のタむトル、{body}は本文、{genre_id}はニュヌスの分類ラベル"0"〜"8"です。
぀たり、ニュヌス蚘事のタむトルず本文から、そのニュヌス蚘事のゞャンルを予枬する問題です。

サンプルコヌドではtransformersずpytorch-lightningを利甚しおファむンチュヌニング凊理を実装しおいたす。

凊理の流れは次の通りです。

  1. livedoorニュヌスコヌパスをダりンロヌドし、"{title}\t{body}\t{genre_id}"ずいう圢匏のTSVファむルに倉換したす。
  2. TSVファむルを読み蟌み、入力が"{title} {body}"、出力が"{genre_id}"ずいう圢匏のデヌタセットに倉換したす。
    T5の入出力デヌタはこのテキストをSentencePieceでトヌクナむズしたトヌクン列です。扱えるトヌクン数トヌクン列の長さは有限ですので、入出力それぞれに぀いお最倧トヌクン数を定矩したす文字数ではなく、トヌクン数ですのでお間違いなく。今回は最倧入力トヌクン数は512、最倧出力トヌクン数は4にしおいたす。最倧出力トヌクン数が1ではなく、4なのは出力開始トヌクンず文末トヌクンもたたに空癜トヌクンも出力に含たれるためです。
  3. 日本語T5事前孊習枈みモデルをダりンロヌドし、転移孊習を実行したす。
  4. テストデヌタに察する分類予枬粟床を蚈算したす。

2の入出力を定矩する凊理はコヌドの次の箇所です。

class TsvDataset(Dataset):
    ...
    def _make_record(self, title, body, genre_id):
        # ニュヌス分類タスク甚の入出力圢匏に倉換する。
        input = f"{title} {body}"
        target = f"{genre_id}"
        return input, target
    ...

入出力の最倧トヌクン列長をそれぞれ512ず4にしおいたす。
その他、バッチサむズを8、孊習する゚ポック数は仮に4ずしおいたす。
もし、GPUでOut of Memory゚ラヌが発生するようであれば、バッチサむズを小さくしおみるずいいでしょう䟋えば4に枛らす。それでもダメなら入出力文の最倧トヌクン数も枛らしたしょう䟋えば256に枛らす。

# 孊習に甚いるハむパヌパラメヌタを蚭定する
args_dict.update({
    "max_input_length":  512,  # 入力文の最倧トヌクン数
    "max_target_length": 4,  # 出力文の最倧トヌクン数
    "train_batch_size":  8,
    "eval_batch_size":   8,
    "num_train_epochs":  4,
    })

事前孊習枈みモデルのダりンロヌドず読み蟌みは次のコヌドで行われおいたす。

class T5FineTuner(pl.LightningModule):
    def __init__(self, hparams):
        super().__init__()
        self.hparams = hparams

        # 事前孊習枈みモデルの読み蟌み
        self.model = T5ForConditionalGeneration.from_pretrained(hparams.model_name_or_path)

        # トヌクナむザヌの読み蟌み
        self.tokenizer = T5Tokenizer.from_pretrained(hparams.tokenizer_name_or_path, is_fast=True)

ベンチマヌク

この日本語T5モデルパラメヌタ数は222Mを甚いたニュヌス蚘事のゞャンル予枬タスクの粟床は次の通りです。

label precision recall f1-score support
0 0.96 0.94 0.95 130
1 0.98 0.99 0.99 121
2 0.96 0.96 0.96 123
3 0.86 0.91 0.89 82
4 0.96 0.97 0.97 129
5 0.96 0.96 0.96 141
6 0.98 0.98 0.98 127
7 1.00 0.99 1.00 127
8 0.99 0.97 0.98 120
accuracy 0.97 1100
macro avg 0.96 0.96 0.96 1100
weighted avg 0.97 0.97 0.97 1100

粟床の比范察象ずしお、同芏暡のモデルである倚蚀語T5mT5モデルパラメヌタ数は300Mを甚いた堎合の粟床は次のようになりたす。
mT5に比べお、日本語T5モデルの方が5ポむントほど粟床が高いこずが分かりたす。
mT5も日本語を扱うこずができたすが、倚蚀語に関するタスクでなければ、日本語T5モデルを利甚した方が良さそうです。

label precision recall f1-score support
0 0.91 0.88 0.90 130
1 0.84 0.93 0.89 121
2 0.93 0.80 0.86 123
3 0.82 0.74 0.78 82
4 0.90 0.95 0.92 129
5 0.89 0.89 0.89 141
6 0.97 0.98 0.97 127
7 0.95 0.98 0.97 127
8 0.93 0.95 0.94 120
accuracy 0.91 1100
macro avg 0.91 0.90 0.90 1100
weighted avg 0.91 0.91 0.91 1100

2. ニュヌス蚘事のタむトル生成䞀皮の文章芁玄

ニュヌス蚘事のタむトル生成は次の圢匏の入出力を持぀デヌタセットを甚意すれば実珟できたす。

  • 入力 "{body}"
  • 出力 "{title}"

ここで、{title}はニュヌス蚘事のタむトル、{body}は本文です。
぀たり、ニュヌス蚘事の本文から、タむトルを予枬する問題です。

゜ヌスコヌドを芋るず「1. ニュヌス蚘事のゞャンル予想文章分類」のものず芋分けが付かないくらい䌌おいるこずが分かるず思いたす。

実際、孊習に関するコヌドで倉わっおいるのは入出力に関する郚分だけです。
次のコヌドのように{body}を入力に、{title}を出力するよう定矩したす。

class TsvDataset(Dataset):
    ...
    def _make_record(self, title, body, genre_id):
        # ニュヌスタむトル生成タスク甚の入出力圢匏に倉換する。
        input = f"{body}"
        target = f"{title}"
        return input, target
    ...

文章分類の堎合よりも出力するテキストの長さが長いので、最倧出力トヌクン数を64に増やしたす。分類問題よりも難しい問題のため、゚ポック数も8に増やしおいたす孊習時間を枛らしたいなら4皋床でもいいかもしれたせん。
もし、GPUでOut of Memory゚ラヌが発生するようであれば、バッチサむズを小さくしおみるずいいでしょう䟋えば4に枛らす。それでもダメなら入出力文の最倧トヌクン数も枛らしたしょう䟋えば入力を256に、出力を32に枛らす。

# 孊習に甚いるハむパヌパラメヌタを蚭定する
args_dict.update({
    "max_input_length":  512,  # 入力文の最倧トヌクン数
    "max_target_length": 64,  # 出力文の最倧トヌクン数
    "train_batch_size":  8,
    "eval_batch_size":   8,
    "num_train_epochs":  8,
    })

たったこの倉曎だけで、文章分類甚コヌドが、䞀皮の文章芁玄タスクであるタむトル生成タスク甚になりたす。
T5の䟿利さが分かる䟋ですね。

タむトル生成の䟋

このタむトル生成モデルを䜿っお、タむトルの候補をなるべく倚様になるよう耇数個生成しおみたす。
䟋ずしお、『LEGOで䜜るスマヌトロック 〜「Hey Siri 鍵開けお」を実珟する方法 〜』の本文に合ったタむトルを10個生成しおみたす。

タむトル生成の入力ずなる文章
body = """
これはLEGOずRaspberry Piで実甚的なスマヌトロックを䜜り䞊げる物語です。
スマヌトロック・システムの党䜓構成は䞋図のようになりたす。図䞭右䞊にある塊が、党郚LEGOで䜜られたスマヌトロックです。

特城は、3Dプリンタ䞍芁で、LEGOずいう比范的誰でも扱えるもので䜜られたハヌドりェアであるずころ、芋た目の野暮ったさず機胜のスマヌトさを兌ね備え、゚ンゞニア心をくすぐるポむント満茉なずころです。
なお、LEGO (レゎ)、LEGO Boost (ブヌスト) は LEGO Group (レゎグルヌプ) の登録商暙であり、この文曞はレゎグルヌプやその日本法人ず䞀切関係はありたせん。

次のようなシチュ゚ヌションを経隓したこずはありたせんか

- 倖出先にお、「そういや、鍵、閉めおきたかな蚘憶がない ゜ワ゜ワ」
- 朝の通勀にお、駅に到着しおみたら「あ、鍵閉め忘れた。戻るか 」
- 料理䞭に「あ、鍵閉め忘れたでも、いた手が離せない。」
- 玄関先で「手は買い物で䞀杯。ポケットから鍵を出すのが倧倉。」
- 職堎にお、倕方「そろそろ子䟛は家に垰っおきたかな」
- 玄関にお「今日は傘いるかな」

今回䜜るスマヌトロックは、次の機胜でこれらを解決に導きたす。

- 鍵の閉め忘れをSlackに通知しおくれる。iPhoneで斜錠状態を確認できる。
- 䜕凊ででもiPhoneから斜錠できる。
- 「Hey Siri 鍵閉めお鍵開けお」で斜錠/開錠できる。
- 鍵の開閉むベントがiPhoneに通知され、垰宅が分かる。
- LEDの色で倩気予報傘の必芁性を教えおくれるただし、時間の郜合で今回は説明省略。

欲しくなりたしたでしょうか

以䞋、ムヌビヌ倚めで機胜の詳现ず䜜り方に぀いお解説しおいきたす。ハヌドりェアも゜フトりェアもオヌプン゜ヌスずしお公開したす。
"""

数秒で次の10個のタむトルが生成されたす。
正解のタむトル『LEGOで䜜るスマヌトロック 〜「Hey Siri 鍵開けお」を実珟する方法 〜』は結構長い時間悩んで決めたタむトルなのですが、数秒でこんなに色々生成しおくれるなんお。次からはタむトルを考えるずきの参考にしようかず思いたす。

タむトル生成結果
 1. アむデア満茉の「lego」で䜜るスマヌトロックの䜜り方
 2. 「レゎ」ずraspberry piで䜜る実甚的なスマヌトロック
 3. 「レゎ」ずraspberry piで䜜る実甚的なスマヌトロック(例)
 4. 開発秘話!legoで䜜る実甚的なスマヌトロック(例)
 5. アむディアずアむデアで䜜る、legoで䜜られたスマヌトロックの䜜り方
 6. アむディアずアむデアで䜜る、legoで䜜られたスマヌトロック
 7. “lego"で䜜る実甚的なスマヌトロック、いかがでしたでしょうか?
 8. デザむンが野暮ったい!誰でも扱えるスマヌトロックを䜜ろう
 9. アむディアずアむデアで䜜る、legoで䜜られたスマヌトロックの䜜り方(例)
10. デザむンが野暮ったい!誰でも扱えるスマヌトロックを䜜ろう!

デザむンが野暮ったいっお、そんなに匷調しなくおも・・・。野暮ったいスマヌトロックは䞋図の右偎の写真です

その他、テストデヌタに察するタむトル生成結果抜粋は次の通りです。
generated:が生成されたタむトル、actual:が正解である人が付けたタむトルです。
簡単に䜜った割には、たあたあいい感じなんじゃないでしょうか。タむトル生成は挑みやすいタスクであるずいえるでしょう。

テストデヌタで詊した結果抜粋
generated: あなたの愛車が今いくら?オンラむン䞊で䞀括査定できる「愛車無料査定」
actual:    別れる?続ける?3月末で決断を迫る査定サヌビス

generated: facebook掻甚術/同窓䌚・女子䌚で倧掻躍!など-【知っ埗!虎の巻】
actual:    むベント䜜成や友人の玹介方法facebook掻甚のスゎ技・裏技テクニック集

generated: nttドコモ、android 4.0 ics搭茉3.4むンチスマホ「aquos phone st sh-07d」を発衚!1ghzcpuや防氎、ワンセグに察応
actual:    nttドコモ、android 4.0 ics搭茉3.4むンチスマホ「aquos phone st sh-07d」を発衚!1ghzcpuや防氎、防塵、ワンセグに察応

generated: プロ野球ファンの想いを数倀化しお競う、今幎の“目利き指数"ずは?
actual:    2010幎プロ野球界のキヌマンは?

generated: むンタビュヌ:森䞋奈保子さん「映画を創る、女性たち。」
actual:    「映画祭を創る、女性たち。」vol.4コンテンツマヌケットディレクタヌ森䞋矎銙さん

generated: タンスの肥やしがドンドン増える!?宅配買取サヌビス『ブランディア』
actual:    タンスの肥やしがサむフの糧に!?最新の買取りサヌビスの実力ずは

generated: ダヌス・ベヌダヌ颚のデザむンがかわいい!『kinectスタヌ・りォヌズ』が数量限定発売
actual:    スタヌりォヌズ「r2-d2」をむメヌゞした限定xbox発売決定!ダサい?それずもレトロでかわいい?

generated: なでしこ田䞭陜子の掻躍に期埅!?
actual:    期埅高たる、柀穂垌の“矎少女埌継者"

generated: 橋䞋培倧阪府知事が週刊新朮の取材批刀にツむッタヌで賛吊䞡論
actual:    ツむッタヌ䞊で週刊新朮にブチギレした橋䞋培氏にネットでは賛吊䞡論

3. ニュヌス蚘事本文生成文章生成

䞊手くいく䟋ばかりではなんなので、䞊手くいかない䟋も。

ニュヌス蚘事本文生成はタむトル生成ず入出力を逆さたにした問題です。
぀たり、次の圢匏の入出力を持぀デヌタセットを甚意すれば実珟できたす。

  • 入力 "{title}"
  • 出力 "{body}"

ここで、{title}はニュヌス蚘事のタむトル、{body}は本文です。
どういうコヌドを曞けば良いかはもう解説䞍芁ですね。

蚘事生成の䟋

この蚘事生成モデルにタむトル「LEGOで䜜るスマヌトロック 〜「Hey Siri 鍵開けお」を実珟する方法 〜」を入力しお蚘事生成を行なっおみたす。

蚘事生成の入力ずなるタむトル
title = "LEGOで䜜るスマヌトロック 〜「Hey Siri 鍵開けお」を実珟する方法 〜"

結果は次の通りです。最初にandroid向けアプリを䜜るず蚀っおいるのに、盎埌にiphone向けアプリに話がズレおいたり、䜜る方法の玹介だったはずが実行に話が倉わっおいたり、党䜓的に論理砎綻しおいたす。党然ダメですね。
この玠朎な方法では、タむトルから蚘事を生成するこずは難しいずいうこずがいえるでしょう。
論理砎綻が発生しやすいこずはニュヌラル蚀語モデル党般の課題ですが

蚘事生成結果
先日玹介した「スマヌトロックの䜜り方」でお䌝えしたように、lego(レゎ)はandroid向
けアプリ「hey siri鍵開けお」を実珟する方法をご玹介したす。今回玹介するiphone向
けアプリ「hey siri鍵開けお」は、google+やfacebookなどのsnsに連携しお䜿うこずが
できる䟿利な機胜です。今回は、このスマヌトロックを䜜るためのテクニックを玹介した
す。たずは、スマヌトフォンからアクセスし、「hey siri鍵開けお」を実行するにはど
うしたらいいのでしょうか?siriが持っおいるセキュリティキヌずは䞀䜓䜕なのかずいう
こずです。その方法は簡単ですが、簡単にできるわけではありたせん。しかし、実際に䜿
っおみるずわかるず思いたすが、ちょっず面倒くさいかもしれたせんね。では、さっそく
解説しおいきたいず思いたす。今回の蚘事では、そんな簡単な操䜜手順を説明しおいきた
しょう。【関連蚘事】・気を぀けお!スマホず連動するledむルミネヌションラむト付きメ
ガネ型防氎ipx5/6hモニタリングに察応【売れ筋チェック】・今幎のトレンドは3月16日
に米アップルが発衚した新os「i-o data resolve4」の新バヌゞョンをリリヌス【売れ
筋チェック】・スタむリッシュ&ハむクオリティhd液晶モニタヌspモヌド察応bluetooth
ルヌタヌaquos phone xperia nxso-04d甚倧容量バッテリヌ【売れ筋チェック】

以䞊で芋たように、こういった様々なタスクに぀いお、少しのコヌドを曞くだけで実珟性を芋定められるのがT5の䟿利なずころです。

免責事項

本モデルの䜜者は本モデルを䜜成するにあたっお、その内容、機胜等に぀いお现心の泚意を払っおおりたすが、モデルの出力が正確であるかどうか、安党なものであるか等に぀いお保蚌をするものではなく、䜕らの責任を負うものではありたせん。本モデルの利甚により、䞇䞀、利甚者に䜕らかの䞍郜合や損害が発生したずしおも、モデルやデヌタセットの䜜者や䜜者の所属組織は䜕らの責任を負うものではありたせん。利甚者は本モデルやデヌタセットの䜜者や所属組織が責任を負わないこずを明確にする矩務がありたす。

たずめ

日本語コヌパスを甚いたT5の事前孊習枈みモデルを䜜り、Hugging Face Models Hubで公開したした。転移孊習のサンプルコヌドもGithubで公開しおいたす。どうぞご掻甚ください。

453
448
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
453
448

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?