色鉛筆とチャットで会話

佐藤敏紀氏:「日本語に特化した、大規模汎用モデルを搭載した『HyperCLOVA』の現状」という発表をします。よろしくお願いします。

最初に自己紹介をします。私は佐藤敏紀と言います。自然言語処理と検索を専門にしているソフトウェアエンジニアです。以前はLINE CLOVAの日本語のNLUシステムの開発を担当していましたが、2021年からはNLP開発チームのマネージャーをしており、HyperCLOVAの日本語版の開発面に関する責任者もしています。プライベートではNEologdというOSSプロジェクトを主導しています。

本発表ではNLP開発チームのメンバーによる成果、また過去の貢献者の成果をチームを代表してお話しいたします。よろしくお願いします。

最初にお伝えしますが、このセッションは主に自然言語処理に興味があるエンジニア向けの内容となっています。そして一部は、NLPの専門家向けの内容になっています。NLPは自然言語処理を意味する略語ですので、このセッションではたくさん出てきます。

このセッションでは言語モデルの構築や調整手法に関する詳細な手法について言及しません。EMNLP 2021でNAVERが発表した論文に記載されている、韓国語版の事例に詳細が書いてありますので、そちらをご参照ください。このセッションは40分ですので、コーヒーなどを飲みつつ楽しんで聞いてください。

さて唐突ですが、私が最近したチャットのスクショを披露します。相手は色鉛筆さん。「こんにちはー」「こんにちは」。「いま答えてくれたのは何色さんですか?」「はい。僕は赤です」。「じぶんより大切だと思う色はありますか?」「うーん。やはり青かな」。「それはどうしてですか?」「だって、青い海とか空ってきれいじゃないですか」。

実はこれはHyperCLOVAを応用した対話システムと会話した結果です。HyperCLOVAは、大規模汎用言語モデルや出力を確認するためのユーザーインターフェイスなどを含んだシステムの総称です。HyperCLOVAのシステムは、NAVERとLINEが共同で運用しています。約1年前に「LINEとNAVERが日本語に特化した言語モデルの開発に取り組む」とお伝えしましたが、今回はその取り組みの途中経過や関連する情報をお伝えしたいと思っています。

HyperCLOVAでどう対応しているか

さて先ほどのチャットですが、この色鉛筆さんが話した会話のうち、この部分すべてがHyperCLOVAで自動生成したテキストをそのまま出力しています。解説なしにこのスクリーンショットを見たとしても、私が実際にしゃべる色鉛筆とお話ししていると考える人はいないと思いますが、とても滑らかに応答していますね。このように登場人物の役割に応じて行う対話のことをロールプレイと言います。

HyperCLOVAは、色鉛筆のキャラクターになりきって、滑らかで的確な応答ができていますよね。このような応答をどのようにして返しているのか、今度はマイクから声を拾って応答をスピーカーから音声で返すアプリの例で示したいと思います。

はじめにユーザーは言いたいことを言います。「こんにちは」。この声を音声としてクライアントアプリに入力します。そしてクライアントアプリは、音声認識技術で音声をテキスト化します。その後、対話アプリにテキストを送信します。

対話アプリは、HyperCLOVAに対するクエリを対話の状況に応じて生成します。HyperCLOVAは、対話アプリが入力したクエリに応じて大規模汎用言語モデルを利用したり、知識ベースに対する検索を活用したりして、最終的に何らかの結果を出力します。

対話アプリは、HyperCLOVAの出力をもとに応答用のテキストを作成して、クライアントアプリは、対話アプリの出力を音声合成処理などで音声データにして、スピーカーから出力します。「久しぶり!」という感じですね。大まかにこのような流れの一番深い部分に、今回の主題であるHyperCLOVAの大規模汎用言語モデルがあります。

HyperCLOVAの詳細

ここまでで、HyperCLOVAとは何かを大まかに話しました。今回は、こちらのアジェンダに従ってお送りしていきます。このあとHyperCLOVAの詳細を話していき、プロンプティングによるアプリケーション開発について紹介します。その後、HyperCLOVAの言語モデルの対話タスクでの主観評価、質問応答タスクでの自動評価の結果を、簡単にではありますがお見せいたします。終盤では、対話システムでの応用例を披露します。

ではHyperCLOVAの詳細です。まず、ここで言語モデルについて知らなくても大丈夫なように、簡単に知識を紹介します。まず「LM」という表記が出てきますが、こちらは「Language Model」の略語です。NLPで取り上げる言語モデルは、統計的言語モデルと考えてもらって大丈夫です。このモデルは、単語の列に対する確率値を返していきます。

どんな具合かと言うと、「今日は晴れです」の確率値が「晴れは今日です」の確率値よりも高いです。この確率値は出現確率とも呼ばれています。これは言語モデルを構築する際に使用したコーパスにおける任意の単語の出現しやすさを表しています。

HyperCLOVAは、他の有名な大規模言語モデルと同様に教師なしの自己回帰の言語モデルです。自己回帰言語モデルなので確率分布が計算でき、サンプルが与えられた時に、パラメータの最尤推定ができます。そして現在までのテキストに基づいて、将来のテキストを生成できます。

言語モデルでとても重要なのが、モデル構築に使うコーパスです。とても重要なことなので、しっかりとお伝えしたいのですが、私たちはお客さまがLINEで送受信されたメッセージはもちろん、オープンチャットのトークルームの書き込みなどを含め、LINEのサービスに関するデータは一切使用していません。またこのコーパスは、サブセットの外部提供の可能性も含めて、社内外でなるべく汎用的に利用できるよう、さまざまな権利関係に最大限の配慮をしながら整備を続けています。

LINE LM Corpus

このようなポリシーのもと、構築しているLINE LM Corpusを紹介します。こちらはHyperCLOVAの言語モデルの構築に使っています。このコーパスは2019年以降、BERTのモデル構築のために作られたコーパスをベースにしています。みなさんの公開するつもりがない個人情報に関しては削除していますし、外部コンテンツの購入と利用に関しては、権利問題を解決したうえで実施しています。

また、日本語で言語現象を学習する上で必要な範囲の情報をカバーするように努めています。LINE検索のためにデータを権利侵害がない範囲で活用しています。

このようにして構築したLINE LM Corpusは、現在約100億(10B)サンプル、約1.5テラバイト、約5000億(500B)トークンに達しています。このコーパスは毎月更新しており、徐々にサイズと品質が向上しています。このコーパスから個別の分野ごとのデータを抽出することもできますが、汎用言語モデル用のひと塊のコーパスを作ることだけを考えています。

HyperCLOVAの構築前は、NLP技術を作ったシステム開発をする際に、BERTなどの汎用言語モデルや各種機械学習モデルを個別のタスクごと構築してきました。HyperCLOVAでは、タスクが変わる度に新しいモデルを構築するのではなく、なるべく1つの大きなモデルを活用します。

LINEにおいて、計算資源は有限です。個別のタスクにも、ファインチューニングする計算時間を確保したいのですが、それよりは新しい汎用言語モデルの構築に時間を割きたいと考えています。

その新規モデルの構築状況ですが、現在は日本語の820億(82B)モデルが進行中です。82B以下のモデルについても、応用に向けた施策や評価が進んでおり、各種のチューニングや実験が進行しています。韓国語については、2021年5月のNAVER AI NOWやその後のEMNLP2021(自然言語処理のトップ国際会議)で発表したとおり、先行して、より大きな2040億(204B)パラメタモデルの構築が進行しています。

今後は日本語のモデルについても204B以上のモデル活用が進行していき、2022年には実施できる見込みです。

先ほどお話しした各種のモデルは、HyperCLOVAのアーキテクチャ全体の中のモデルの層に入っています。HyperCLOVAはさまざまなサイズ・タイプのものを扱っており、小さな学習済みモデルにファインチューニングを施したタスクに特化したモデルについても、それぞれの性能を引き出すためのノウハウを確立するため、実験・評価を繰り返しています。この実験・評価については、もう少し後ろのスライドでお伝えします。

プロンプティングとは

さてここからは、プロンプティングについてと、プロンプティングを活用したアプリケーション開発について紹介します。まず、1つの学習済み汎用言語モデルを対象となるタスクに適用する方法が2つあるので紹介します。1つはファインチューニングと呼ばれる手法です。これは対象となるタスクのデータセットを用意して教師あり学習を行う方法です。

この方法の良いところは、明確に教師データを用いるので、対象タスクのベンチマークがとても良くなるということです。短所は、個別のタスクごとに学習する必要があること、モデルの汎用性が損なわれてしまう場合があるということです。

もう一方のタスクの説明文や、いくつかのタスクを解いたお手本を文脈として与える方法があり、こちらはいろいろな呼び方がありますが主に「Few-shot」「One-shot」「Zero-shot」というような呼ばれ方をしています。

この手法は、ファインチューニングを実施して達成したState Of The Artモデルほどの性能を達成できない可能性があるものの、非常に短い指示やタスクの見本を用意するだけで、ある程度の性能を実際に達成できることを確認できています。

Few-shotを活用したプロンプトの作成

ではここで、このFew-shotを活用したプロンプトの作成なのですが、とても用語が多いので用語を見ていくことにします。ここにPlaygroundと書いてありますが、HyperCLOVAの場合はCLOVA StudioというWebアプリケーションになります。こんな感じの画面とフレームが同じものだと思ってください。

そしてPlaygroundにはパラメータやオプションを指定するユーザーインターフェイスの部品があるんですが、今回はそれらすべて無視してTextFieldに着目します。このフィールドでのテキスト入力と出力、これはフィールドの上で両方行われます。

今回のテーマの1つであるプロンプティングなのですが、プロンプトエンジニアリングやプロンプトプログラミングなど、考え方や作り方によって、さまざまな呼ばれ方をします。また自動生成する場合は、プロンプトチューニングやフィーチューニングと呼ばれることもあります。何しろ新しい分野で、日夜新しい手法や呼び方が出てきてしまっている段階です。

プロンプトには、タスクの全体内容を書く領域があります。推定結果は、このアウトラインの後ろ側に生成されます。タイトルに何を書くか、はけっこう大切です。タスクと関係ない文字列を書いてもいいのですが、より適切なタイトルを探すことで結果が変化することが確認できています。他に必要な情報を埋め込む位置がけっこう難しいのですが、概ねタイトルの次の領域に入れると、実装の難易度が低いです。

サンプル内のshot数が変わると、このプロンプト全体が変わることも先ほど軽く触れましたが、shot数がゼロだとZero-shot、1だとOne-shot、shot数が複数だとFew-shotという呼び方に変わります。

タイトルとFew-shotの例としては、例えばこのように、タイトルが「加減乗除を実行します」の後ろに2つサンプルが書いてある状態です。このような感じで計算してほしいんです、というサンプルが書いてある状態です。この状態は2shotなので、これはFew-shotのプロンプトということになります。

Queryは各サンプル中の各shotと同じ形式で書きますが、その際に推定したい末尾の部分を削った状態にします。そうすることで、推定時に後ろ側のテキストがアウトプットされるというわけです。

最後に、Outputとして得られる推定結果を、次から次に連続してどんどん表示させたい場合もありますよね。

こういう場合はどうするかというと、このOutputを次の推定に使うプロンプトのどこかに入れなければいけなくて、(今回は)説明のために分けましたが、プロンプトの記述内容は全部1つのTextFieldに書いてあるテキストで実装されています。なので、前回推定した際のアウトプットは、ここのshotの1つとして含めることができます。

以上までに説明してきたプロンプトを実際にテキストデータとして書くと、例えばFew-shotを使って俳句を書く例、しかもタイトル付きの場合には、このようになります。このプロンプトの末尾のクエリ部分である"OUT:"から後ろを削った状態で推定処理を実行すると、例えばこのようなアウトプットが得られます。このアウトプットが欲しいアウトプットじゃなかった場合には、手で編集してあげれば良いわけです。

大規模汎用言語モデルがある状況では、特に開発の初期段階では今示したような、プロンプティングの結果として作成できたFew-shotを含む、タスクに特化したプロンプトを作っていきます。これによって、言語モデルの出力を調整して、必要な方向性と結果を持った出力を素早く手に入れることを狙っていきます。

ファインチューニングやタスク固有の要素技術の開発は、その結果に不満があったら始めることです。最初から、ファインチューニングや深い開発をしないことには理由があります。モデルを構築するために必要な計算機とファインチューニングに必要な計算機とは、実は両方とも同じ規模であることは有名な話ですが、HyperCLOVAの規模になると桁違いに大きな計算機まわりの資源が必要だからです。

商品の説明文を生成するというデモ

さて今度は、具体例として1つのデモをお見せいたします。今回は商品の説明文を生成するというデモになっています。商品パッケージには商品の概要の説明文が掲載されていますが、多くの場合、その説明文は販売員さんや営業さんが、がんばって書き起こしているんですね。このデモでは、CLOVA Studioのパラメータを調整して、魅力的な説明文が生成できないかにチャレンジしてみます。

では最初に、CLOVA Studioに「商品の概要から思わず買いたくなる説明文を生成する」というタイトルを入れ、商品名、概要、説明などをお手本として入れます。つまりこれは、One-shotのプロンプトということです。その後クエリとして商品名、概要を入れます。この概要には、かにの身、粉末酢、昆布パウダーなどの原材料名が入っているようです。

では生成してみましょう。1個テキストが生成されました。このテキストはちょっと短くてあまり魅力的ではないので、Temperatureのパラメータを調整してランダム生成の確率を上げてみます。そして実行すると、より長い文ができました。材料に化学調味料が入っていないことが反映されましたね。

ここから次々に生成していきましたが、やはり(説明文の)最初は「ほんのり酸味」から始めたいと思ったので、そう実行してみます。それでもちょっと微妙なので、Repetitionのペナルティを下げて、繰り返しのテキストが出ても大丈夫にしてどんどん生成していくと、最後「ほんのり酸味の効いたカニ風味のせんべいです。口の中に入れると……」という魅力的なテキストが出てきました。

これでいいかなと思ったので、完成としたいと思います。以上が、商品説明の生成デモでした。

先ほどのデモではOne-shotを使いましたが、こちらの中を見てみると、タイトル、商品名、概要、説明が書いてあります。これをもとに、クエリの中にベースとなる商品名と概要を入れて、最後の行に、プレフィックスとして後ろに続けてほしい文字列を入れて、さらに生成ボタンを押してアウトプットを獲得しました。

今回は、TemperatureのパラメータとRepetition penaltyを調整して、より自分が思っているのに近いテキストを生成したわけですが、このような生成する際の微妙な調整が必要な状況が、現在のテキスト生成の段階ということになります。

後半につづく