大規模言語モデル入門 の輪読会を開催したので、発表に使った資料を一部修正して公開します。
他の章の資料も公開していくので、よろしければご覧ください。
- 【勉強会資料】 大規模言語モデル入門 第1章 はじめに
- 【勉強会資料】 大規模言語モデル入門 第2章 Transformer
- 【勉強会資料】 大規模言語モデル入門 第3章 大規模言語モデルの基礎
- 【勉強会資料】 大規模言語モデル入門 第4章 大規模言語モデルの進展
- 【勉強会資料】 大規模言語モデル入門 第5章-1 大規模言語モデルのファインチューニング
- 【勉強会資料】 大規模言語モデル入門 第5章-2 大規模言語モデルのファインチューニング
- 【勉強会資料】 大規模言語モデル入門 第6章 固有表現認識
- 【勉強会資料】 大規模言語モデル入門 第7章 要約生成
- 【勉強会資料】 大規模言語モデル入門 第8章 文埋め込み
- 【勉強会資料】 大規模言語モデル入門 第9章 質問応答
大規模言語モデルの基礎
大規模言語モデルは、大規模コーパスに含まれるトークンを予測する学習を通じて訓練されている。
予測する単語の位置を変更することで、様々な知識を得ることができる。
私たちが英語のテストで穴埋め問題を解くのに似ている
例えば以下のようなもの
- 日本で最も高い山は???である → 富士山
- 日本で最も???山は富士山である → 高い
- 鉛筆を1ダース買って10本使ったので、残りは???本になった→2
単語を予測するタスクを通じて文法、知識、感情、推論を学習する。
GPT(デコーダ)
Transformerを採用した最初の大規模言語モデルで、2018年に登場
GPT(Generative Pre-Trained Transformer)はデコーダ構成のTransformerを
7000冊の書籍から作成したデータを用いて事前学習
入力表現
入力トークン列に対応する入力トークン埋め込みと位置埋め込みを加算した埋め込み列を入力とする
入力トークン埋め込みってなに?
テキストデータを数値ベクトルに変換すること
1.トークン化
テキスト : "I love NLP"
↓
トークン化 : ["I","love","NLP"]
↓
埋め込みベクトルの作成:
[0.1,0.2,0.3] #"I"
[0.4,0.5,0.6] #"love"
[0.7,0.8,0.9] #"NLP"
位置埋め込みってなに?
文章中の単語の順序情報(文脈)を保持すること
各単語に対して、その位置に基づいた位置エンコーディングを追加
"I"(位置1) : [0.01,0.01,0.01]
"love"(位置2) : [0.02,0.02,0.02]
"NLP"(位置3) : [0.03,0.03,0.03]
入力トークン埋め込みと位置情報埋め込みの加算
"I" : [0.1,0.2,0.3] + [0.01,0.01,0.01] = [0.11,0.21,0.31]
"love" : [0.4,0.5,0.6] + [0.02,0.02,0.02] = [0.42,0.52,0.62]
"NLP" : [0.7,0.8,0.9] + [0.03,0.03,0.03] = [0.73,0.83,0.93]
入力のトークン長さ : ${K}$
トークン列 :${w_1 , w_2, ... w_K}$
トークン${w_i}$のトークン埋め込み : ${e_{wi}}$
位置埋め込み : ${p_i}$
入力埋め込み : ${x_i}$
x_i = e_{wi} + p_i
GPTには${x_1,x_2,...x_K}$が入力される
言語モデル
与えられたトークン列に対して、次のトークンの作成される確率を予測するモデルを「言語モデル」と呼ぶ
ファインチューニング
ニューラルネットワークのモデルに新しい層を追加して、特定のタスクを解くためのデータを使ってモデル全体を調整します。
ヘッド:事前学習済みモデルの上に新しい層(ヘッド)を追加し、この層がモデルの出力を特定のタスクに合わせて変換します。
GPTで特定のタスクを解く際には、特殊トークン(special token)を用いる
<s> 文章の最初に
<e> 文章の最後に
$ テキストの境目に挿入
モデルに入力される前の前処理の段階で特殊トークンが追加される
「こたつでみかんを食べる」 → <s>こたつでみかん食べる<e>
特殊トークンは特定のタスク用にモデルに追加される新しい単語や記号で、最初はランダムな数値で初期化される。ファインチューニングによって、これらのトークンが適切に学習されるようにモデルが調整される
BERT/RoBERT(エンコーダ)
デコーダ構成を採用しているGPTでは、先行する位置${i}$までのトークン列の情報はわかるが、後続する${i+1}$以降のトークン列の情報は分からない。
エンコーダ構成のtransformerを採用したのが、BERT(Bidirectional Representations from transformers)で先行するトークンと後続のトークンの双方向から文脈を捉えることができる
Meta社はBERTの10倍のデータ量でRoBERTaを作成
入力表現
特殊トークンを事前学習の段階から採用
そのためファインチューニングとの間の齟齬 が少ない
[CLS] 開始トークン
[SEQ] 区切れを表す
[CLS]こたつでみかんを食べる[SEQ]
2つのテキストを入力する場合
[CLS]こたつでみかんを食べる[SEQ]こたつでみかんを食べる[SEQ]
テキストの範囲を区別しやすくするセグメント埋め込み(segment embedding)が導入されている。
入力テキストの一つ目と二つ目のどちらに属しているのか${s_1}$と${s_2}$で表現
BERTの入力埋め込み計算方法
入力のトークン長さ : ${K}$
トークン列 :${w_1 , w_2, ... w_K}$
トークン${w_i}$のトークン埋め込み : ${e_{wi}}$
位置埋め込み : ${p_i}$
入力埋め込み : ${x_i}$
セグメント埋め込み:${s_m}$
x_i = e_{wi} + p_i + s_m
RoBertだとセグメント埋め込み${s_m}$を採用していない
BERTの事前学習
マスク言語モデリングと次文予測の2タスクで構成されている
マスク言語モデリングってなに?
テキストの一部をマスクし、そのマスクされた部分を予測することでモデルを訓練する。
これにより、文脈に基づいて単語やフレーズを予測する能力を向上されることが可能。
例)今日は「MASK」がいい天気です。
具体的な訓練方法
1. 選択されたトークンの80%を隠す
モデルが文脈からマスクされた単語を予測する力を強化するため。
「今日はとてもいい天気です」という文章があったとする。
この文章から「とても」という単語を選択し、
80%の確率でこれを隠すと「今日は[mask]いい天気です」となる
2. 残りの10%はランダムなトークンに変換
モデルが誤った情報やノイズに対して耐性を持つようにするため。
今日は美味しいいい天気です(例:ランダムな単語「美味しい」に変換)
3. 残りの10%は置換せず、元のまま入力
モデルが文脈における正しい単語の重要性を学び、正しい予測を行う際の参考にするため。
今日はとてもいい天気です。
次文予測ってなに?
モデルに文章間の関係性を理解さえるために行う。
複数の文章からテキストを取り出して連結させ、それが同じ文章から取り出されたか、ランダムな文章から取り出されたか予測する。
同じ文章から2文:「今日はいい天気です」と「公園に行きました」
ランダムな2文 :「今日はいい天気です」と「映画が好きです」
T5(エンコーダ・デコーダ)
Transformer提案時のエンコーダ,デコーダ構成を採用している大規模言語モデル T5(text-to-text transfer transformer)をGoogleが発表2019年
事前学習のためにClossal clean Crawled Corpus (c4) 750GBが使用されてる
言語生成を必要としないタスクはBERTの方が高い性能を示す。
入力表現
特殊トークンとして</s>が文末に挿入される
例:こたつでみかんを食べる</s>
位置の埋め込みは相対位置埋め込みが採用される
入力に加算する形式の位置埋め込みは行わない
T5の事前学習
T5ではトークン単位ではなくスパン単位(範囲)で学習が行われる。
入力の文章から,ランダムな長さのを文をランダムに選択。
隠す範囲を固有表現や日付に対応させると精度が上がるとされている。
スパンに含まれるトークン数の平均を3にする。
「MASK」という特殊トークンを使用して隠す。
デコーダはこの隠されていた範囲の文章を予測する。
t5のファインチューニング
複数のタスクを同一のモデルで学習するマルチタスク学習が提案されていて、
データセットにタスク固有の接頭辞を追加することで可能としている。
多言語モデル
複数の言語を含んだコーパスを用いて事前学習することで一つのモデルで複数の言語に対応可能。
多言語BERT,XLM-R,mT5など100程度の言語に対応している。
多言語モデルは言語に依存しない表現を内部的に獲得していることが示唆されている。
言語横断転移学習、英語でファインチューニングしたモデルに日本語の事例を解かせること。