529 Views
October 17, 24
スライド概要
AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!
KaiRA 後期輪読会 大規模言語モデル入門 2024/10/17 第3章 大規模言語モデルの基礎 (3.4~3.6) 京都大学 工学部 4回生 河田 賢斗 0
アジェンダ 3.4 T5 (エンコーダ・デコーダ) 3.4.1 入力表現 3.4.2 事前学習 3.4.3 ファインチューニング 3.4.3 transformersで使う 3.5 多言語モデル 3.6 トークナイゼーション 3.6.1 バイト対符号化 3.6.2 WordPiece 3.6.3 日本語の扱い 1
3.4 T5 (エンコーダ・デコーダ) 3.4 T5 (エンコーダ・デコーダ) T5 (Text-to-Text Transfer Transformer)とは? ⚫ エンコーダ・デコーダ構成を採用した大規模言語モデル ✓ エンコーダ : 双方向の文脈情報を捉えることが可能 ✓ デコーダ : 自由にテキストで結果を生成可能 ⚫ 事前学習にColossal Clean Crawled Corpus (C4) を使用 ✓ 約750 GB のウェブサイトデータ(大規模なコーパス) ✓ BERTやRoBERTaと比較して 30 倍以上のパラメータを含む ⚫ 入力テキストと関連の高い結果を生成する必要のある下流タスクに有効 ✓ 後続テキストの予測 → GPT のようなデコーダで十分 ✓ 言語生成が不要なタスク → エンコーダ構成のモデルが適している 2
3.4 T5 (エンコーダ・デコーダ) 3.4.1 入力表現 ⚫ T5 では</s>トークンが文末に挿入される Ex. 「こたつでみかんを食べる」→ A.「こたつでみかんを食べる</s>」 Aのテキストがエンコーダに入力される ⚫ 位置埋め込みとして相対位置埋め込みを用いる (𝑚) 𝑠𝑖𝑗 = 𝒒𝒊 𝒎 𝑻 (𝒎) 𝒌𝒋 𝑫ൗ 𝑴 (𝒎) + 𝒑 𝒊−𝒋 ・・・式(1.1) 3
3.4 T5 (エンコーダ・デコーダ) 3.4.1 入力表現 ⚫ 相対位置埋め込み ✓ 注意機構の関連スコア(式(1.1)の左部) に クエリのトークン i とキーのトークン j の相対距離に基づいたパラメータ(式 (1.1)の右部)を付加 ✓ 入力トークン埋め込みが直接入力埋め込みとして使用される ✓ モデルは、近い位置にあるトークンの影響を強く受け、遠くにあるトークン の影響を緩和でき、文脈に応じた柔軟な注意分布を学習可能 ✓ モデルは、文脈をより正確に理解できる 4
3.4 T5 (エンコーダ・デコーダ) 3.4.2 事前学習 ⚫ スパン(連続したトークン列)単位で実行 ✓ 入力トークン列からランダムにスパンを選択 (条件) ・全体の15 %にあたるトークンを抽出 ・各スパンに含まれるトークン数の平均が3 ✓ スパン部分がマスクされ、入力トークン列から隠される →モデルがマスクされた部分(IDが与えられた特殊トークン列)を予測するよう に訓練される → 自己教師型学習 ✓ 事前学習のデータセットはC4 (利点) ラベル無しデータを扱うことが出来る・ 様々なタスクに転用可能なモデルの構築に繋がる (課題) 膨大な計算資源を要する 5
3.4 T5 (エンコーダ・デコーダ) 3.4.2 事前学習 ⚫ 「顕著なスパンのマスク化」について ✓ スパンをランダムに選択するのではなく、例えば固有表現や日付に対応する スパンを使用 → 特定のタスクに対する性能がより向上 ✓ 事前学習に用いるスパンは固有表現認識などにより抽出する 6
3.4 T5 (エンコーダ・デコーダ) 3.4.3 ファインチューニング T5は text-to-text 形式を保持するため、訓練はエンコーダへの入力テキスト及び デコーダの出力すべきテキストの組で構成されるデータセットを使用 ⚫ 事前学習済の T5 モデルを特定のタスクに最適化 ✓ 準備したタスクに対してモデルの重みを最適化 ✓ モデルの評価(テストデータセットで得られた出力も確認) ⚫ 複数のタスクを同一のモデルにより学習するマルチタスク学習 ✓ 複数のタスクのデータセットを連結して訓練を行う ✓ エンコーダの入力テキストにはタスク固有の接頭辞(prefix)を追加 Ex. 感情分析 : , 自然言語推論 : etc. 7
3.4 T5 (エンコーダ・デコーダ) 3.4.4 transformersで使う T5は、事前学習によりスパンの穴埋め問題を解くことが可能 T5の日本語モデルである retrieva-jp/t5-large-long* を使用する (*https://huggingface.co/retrieva-jp/t5-large-long) ⚫ Google Colaboratory により実装 ✓ 江戸幕府を開いた人物の予測 ← → コード ←結果(徳川家康が出力) 8
3.4 T5 (エンコーダ・デコーダ) 3.4.4 transformersで使う ✓ Hugging Face の pipeline 関数を用いて、日本語モデルのT5を使用するテキ スト生成パイプラインを作成 ✓ 予測対象のマスクを含むmasked_text を定義 → <extra_id_0> はT5のマスクトークンであり、適切なテキストを予測させる outputs = t2t_generator(masked_text, eos_token_id=32098)について、 • eos_token_id=32098 は生成が終了する「終了トークン」 • t2t_generatorにmaskd_textを入力し、outputsにモデルが予測したテキスト をリストの形で出力 • print(outputs[0][“generated_text”])について、 generated_text は予測されたテキストそのものであり、辞書のキーである キーの値は、「徳川家康」である 9
3.4 T5 (エンコーダ・デコーダ) 3.4.4 transformersで使う ✓ <extra_id_1> に対応するIDについて ← 特殊トークンを、対応するトークンIDに変換 ✓ 日本の通貨を発行している組織について質問してみる ← masked_textを変更し、先ほどと同様に マスクされた部分を予測する 「日本銀行」が出力される ← ただし、「日本銀行」はモデルの語彙に含まれていない ことに注意する 10
3.5 多言語モデル 3.5 多言語モデル 英語のコーパスによる事前学習を行ったモデル →コーパスを他言語に差し替えることで多言語(英語以外)のモデルを構築可能 複数の言語を含むコーパス(大規模多言語コーパス*)を用いて事前学習を行う →一つのモデルで複数の言語に対応可能となる Ex. mT5, XLM-R, 多言語BERT 上記の多言語モデルは、言語横断転移学習 * が可能 何故か? モデルは言語の抽象的な構造の共通性を手掛かりに、言語に依存しない内部表 現を獲得 *大規模多言語コーパス : CC-100 for XLM-R, mC4 for mT5, OSCAR (特徴) : 言語識別・重複判定を行っている、ルールベースや機械学習で前処理の実施 11
3.6 トークナイゼーション 3.6 トークナイゼーション 大規模言語モデル → あらかじめ作成された語彙中のトークンに対して埋め込 みを割り当てる →語彙をどのように作成するのか ? A. 特定の大規模コーパスに含まれる単語を全て含むように語彙を作成 →語彙のサイズが非常に大きくなる (課題) 低頻度な単語を大量に含めてしまう、単語埋め込み行列の容量が大きくなる 全ての語彙に対する確率計算のコストが増加する B. 語彙のサイズを小さく設定する →語彙に含まれていない未知語(unknown word) をモデルで適切に扱えない 単語と文字の中間の単位であるサブワードをLLMでは標準的に使用する 12
3.6 トークナイゼーション 3.6.1 バイト対符号化 ⚫ サブワード分割の標準的な方法が「バイト対符号化(BPE)」 ✓ 与えられたテキストに含まれるすべての文字をサブワードとみなし、語彙に 登録する ✓ 次に以下の1・2の処理を規定された回数繰り返して語彙を構築する 1. 隣接するサブワードの組の中で最も頻度の高いものを探す (compute_most_frequent_pair()関数で出力) 2. サブワードの組(結合ルール)を語彙に追加する (merge_pair()関数を使用し、結合ステップ毎にサブワード語彙を結合) 13
3.6 トークナイゼーション ⚫ 3.6.1 バイト対符号化 ✓ 「たのしい」を6回、「たのしさ」を2回、「うつくしい」を4回、「うつく しさ」を1回含む擬似的なテキストからサブワード語彙を構築するコードの 実装 (注意) 単語の境界を超えたサブワードの組の結合は行わない ✓ word_freqs(単語とその頻度の辞書) で擬似的なテキストを定義 ✓ vocab はword_freqs に使用される全ての単語に含まれるサブワードのリスト を生成. (重複無し・昇順) Ex. [“い”, “の”] ✓ splits は、word_freqs の各キー(単語)に対して、その単語を1文字ずつ分割し たリストを作成し、キーに対応させる形の辞書を生成. Ex. {"たのしい": ["た", "の", "し", "い"]} 14
3.6 トークナイゼーション ✓ 以下にword_freqs, vocab, splits に関するコードを添付 各々の出力結果も可視化している 15
3.6 トークナイゼーション ✓ 最も頻度の高い隣接するサブワードの組を計算する compute_most_frequent_pairの関数を定義 (手順) 1.Pythonの標準ライブラリcollectionsからCounterクラス*をインポート *Counterクラスは各要素の出現回数を辞書形式で出力するクラス 2. splits を引数とし、2つの文字列を要素とするタプルを返す compute_most_frequent_pairの関数を定義 3. pair_freqs(各ペアの頻度を記録するための辞書のようなデータ構造を有する) を定義 4. word_freqs.items()により辞書型のword_freqsに対して、タプルのリストを返 し、wordにキー(単語)を、freqに値(出現回数)を格納 5. splitにより現在の各単語の分割状態を取得(splitsの値の部分) 16
3.6 トークナイゼーション 6. split リストの隣り合う要素を処理(pairで隣り合うサブワードのタプルを定義) 7. 2つのfor loopにより、word_freqsに含まれる全ての単語において、サブワー ド分割したリスト(=split) 内の隣り合うサブワードの組が、テキスト中で何回 登場したのかを計算出来る 8. 最終的に、キーがタプルであり値が出現回数である辞書(=pair_freqs)を返す 9. コードの最終部で、最も出現頻度の高いタプル(サブワードの組み合わせ、 =pair )及びその出現回数( = _ )を選出し、(pair_freqs.most_common(1)) [0]を つけることでタプル( = pair )を取得 17
3.6 トークナイゼーション ✓ 以下に compute_most_frequent_pair() に関するコードを添付 18
3.6 トークナイゼーション ✓ サブワードの組を結合するmerge_pair()の関数を定義 (手順) 1. target_pair(結合したい2つのサブワードを格納するタプルであり、直接 コードから与えるのではなくcompute_most_frequent_pairなどから取得 することを想定)及びsplits辞書を引数として、結合処理を行った後の splits辞書を返すmerge_pair()関数の定義 2. l_str, r_strはそれぞれtarget_pairのタプルにおける左側/右側の文字列 を示す(タプルのアンパッキング) 3. for loop を用いてword_freqsに含まれるすべての単語を処理 4. splitにより現在の各単語の分割状態を取得(splitsの値の部分) 19
3.6 トークナイゼーション 5. インデックスを初期化( i = 0 ) 6. 各wordに対応するsplitリスト内の隣接するサブワードの組が結合対象の tatget_pairと完全に一致したら結合 7. この操作をsplitに含まれる隣接サブワードの組の数だけ実行 8. splits[word] を、結合操作後のsplitの内容に更新 20
3.6 トークナイゼーション ✓ 以下に merge_pair() に関するコードを添付 21
3.6 トークナイゼーション ✓ 結合回数を9回としてバイト対符号化の語彙を計算してみる ✓ 以下に 結合 に関するコードを添付 ✓ 語彙サイズは、文字数+結合回数となる 下流タスクでの性能やモデルのサイズ、計算量を考慮して、適切な値を決め る必要性 22
3.6 トークナイゼーション ✓ 獲得した語彙を用いてテキストをサブワード分割する手法 →テキストを文字単位に分割して結合ステップ1以降の結合ルールを適用 ✓ 前ページのサブワード結合処理は単語の境界を超えない →あらかじめテキストが単語単位で分割されている必要性 単語の分割が明確ではない場合、どうするのか? →文単位でテキストを処理する A.単語単位のバイト対符号化 B.文単位のバイト対符号化 Ex. Sentencepiece (https://github.com/google/sentencepiece) バイト対符号化 文字単位(語彙を圧迫してしまう可能性)ではなく、バイト対符号化も提案され ている(語彙に登録するエントリを256 通りまで削減可能) 23
3.6 トークナイゼーション 3.6.2 WordPiece ⚫ サブワード分割の手法としてよく使用される手法にWordPieceがある BERTで採用されている ✓ サブワードの組は、最も頻度の高い組ではなくスコアが最も高い組を採用 サブワードの組の頻度 スコア = 一つ目のサブワードの頻度+二つ目のサブワードの頻度 ✓ 事前に単語分割が行われることを前提とする(1~3でサブワード分割を行う) 1. 与えられた文字列の先頭からはじまる最長のサブワードを探す 2. サブワードの終了位置で文字列を分割する 3. 分割された位置の後側に文字列があれば、その後側の文字列について1. か ら繰り返す 24
3.6 トークナイゼーション 3.6.3 日本語の扱い ⚫ 単語単位のバイト対符号化やWordPiece →単語の分割が与えられる必要がある 単語が空白で区切られていない日本語・中国語・韓国語にどう対応するか? ✓ 多言語BERTでは漢字の周囲でテキストを単語に分割し、サブワード分割を 行う ✓ 具体的なコードを以下に示す ✓ 「自然言語処理」は6つの漢字 に分割されてしまう 25
3.6 トークナイゼーション ✓ 「自然言語処理にディープラーニングを使う」という文を分割すると以下のようになる ✓ ‘##’ は単語の途中からはじまるサブワードを表す(BERT・多言語BERT) ✓ XLM-RやmT5などの多言語モデルでは、文ベースのバイト対符号化が用いられる より自然な分割が可能となる ✓ 右にXLM-Rの分割の例を示す (課題) 単語の境界を超えて結合 が行われるため、分割結果が 自然な単語境界に従わない 26
3.6 トークナイゼーション ✓ (課題)は他の事例でも確認できる →単語単位の自然言語処理のタスク を解くことは難しくなる ✓ 日本語の大規模言語モデルでは形態素解析器を用いて 1. 事前に単語単位にテキストを分割 2. バイト対符号化やWordPieceでサブワード分割を行う →単語単位の自然言語処理タスクを自然に解くことが出来る 次ページから、日本語BERTでの分割結果を示す 本モデルでは、MeCab*(形態素解析器)を用いて単語分割を行った後にサブワー ド分割を実行 27
3.6 トークナイゼーション ✓ 実装のコード例を示す サブワード分割が単語をま たがずに実行されている 28