674 Views
October 31, 24
スライド概要
AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!
2024年度後期輪読会 #5(2024/10/31) 大規模言語モデル入門 5.4-5.6 大規模言語モデルのファインチューニング 京都大学工学部理工化学科 1回生 岡本 和優 0
アジェンダ ◼ 自然言語推論モデルの実装 ◼ 意味的類似度計算モデルの実装 ◼ 多肢選択式質問応答モデルの実装 ◼ メモリ効率の良いファインチューニング ◼ 日本語大規模言語モデルの比較 1
アジェンダ ◼ 自然言語推論モデルの実装 ◼ 意味的類似度計算モデルの実装 ◼ 多肢選択式質問応答モデルの実装 ◼ メモリ効率の良いファインチューニング ◼ 日本語大規模言語モデルの比較 2
5.4.1 自然言語推論モデルの実装 自然言語推論モデルの概要 JNLI(Japanese Natural Language Inference)は2つの文の推論関係を判定するタスク。 データセットは2つの文と,その関係を表す3種類のラベル(含意・矛盾・中立)を持つ。 文を2つ連結して入力している点以外は,MARC-jaの実装と同じ。 3
5.4.1 自然言語推論モデルの実装 データセットの前処理 単一の文書を分類するときと違うのは,tokenizerにテキストが2つ渡されている点。 [SEP]を挟んで連結された2つのテキストのトークンが出力される。 4
5.4.1 自然言語推論モデルの実装 訓練したモデルを読み出して評価する モデルとトークナイザーを読み込み,trainer.evaluate()を実行することで, 事前に訓練したモデルを読み出し,指定したeval_datasetを用いて評価することができる。 5
アジェンダ ◼ 自然言語推論モデルの実装 ◼ 意味的類似度計算モデルの実装 ◼ 多肢選択式質問応答モデルの実装 ◼ メモリ効率の良いファインチューニング ◼ 日本語大規模言語モデルの比較 6
5.4.2 意味的類似度計算モデルの実装 意味的類似度計算モデルの概要 JSTS(Japanese Semantic Textual Similarity)は2つの文の類似度を算出するタスク。 回帰タスクである点以外はJNLIの実装と同じ。 モデルを定義するときに,AutoModelForSequenxeClassificationを用いて, problem_type="regression"を指定する。 7
5.4.2 意味的類似度計算モデルの実装 回帰タスクの評価 回帰タスクは正解率でモデルを評価することができないから,次の2つの相関係数を用いる。 • ピアソンの相関係数 • いわゆる普通の相関係数。2つの変数間の線形相関を測定する。 σ𝑁 ො𝑖 − 𝑦തො (𝑦𝑖 − 𝑦) ത 𝑖=1 𝑦 r𝑝𝑒𝑎𝑟𝑠𝑜𝑛 = 2 𝑁 ത σ𝑁 σ𝑖=1(𝑦𝑖 − 𝑦) 𝑦 ො − 𝑦 ො ത 2 𝑖=1 𝑖 • スピアマンの順位相関係数 • 2つの変数間の順位の関係から算出する(線形関係でなくてもよい)。 • ピアソンの相関係数と異なり,2つの変数の分布を仮定する必要がない。 • ピアソンの相関係数と同様に,-1から1の値をとる。 6 σ𝑁 ො𝑖 ))2 𝑖=1(𝑟𝑎𝑛𝑘 𝑦𝑖 − 𝑟𝑎𝑛𝑘(𝑦 𝑟𝑠𝑝𝑒𝑎𝑟𝑚𝑎𝑛 = 1 − 𝑁(𝑁 2 − 1) 8
アジェンダ ◼ 自然言語推論モデルの実装 ◼ 意味的類似度計算モデルの実装 ◼ 多肢選択式質問応答モデルの実装 ◼ メモリ効率の良いファインチューニング ◼ 日本語大規模言語モデルの比較 9
5.4.3 多肢選択式質問応答モデルの実装 多肢選択式質問応答モデルの概要 JCommonsenseQAは5択のクイズを用いた常識推論のタスク。 問題文の選択肢のペアを連結させて文を作り,それぞれの妥当性を表すスコアを計算し, 最も高いスコアの選択肢を回答として選択する。 10
5.4.3 多肢選択式質問応答モデルの実装 データセットの前処理 問題文と選択肢のペアを連結させる。 問題文を選択肢の数だけ複製して 作成したリストと,選択肢を含むリスト をtokenizerに与えて連結させている。 推論時にも使い回すために,正解ラベル が無くても使用できるよう定義している。 11
5.4.3 多肢選択式質問応答モデルの実装 ミニバッチ構築処理 1つの入力(問題)が複数の系列(選択肢の文章)を持っているから, 各選択肢を別々の系列として入力するために,バッチサイズ×選択肢数×最大系列長 のテンソルを作ることになる。 そのために,すべての系列を1つのリストに まとめてパディングを行って, (バッチサイズ・選択肢数)×最大系列長 のテンソルを作ってから, バッチサイズ×選択肢数×最大系列長 のテンソルに変換する。 12
5.4.3 多肢選択式質問応答モデルの実装 モデルの定義と推論 モデルはAutoModelForMultipleChoice を用いて読み込む。 多肢選択式質問応答のためのpipelineは 実装されてないため,自ら定義する必要がある。 訓練のときに用いた,前処理とミニバッチ構築の 関数を利用する。 モデルに入力するテンソルは, モデルが使用するデバイス上に移動しておく。 13
アジェンダ ◼ 自然言語推論モデルの実装 ◼ 意味的類似度計算モデルの実装 ◼ 多肢選択式質問応答モデルの実装 ◼ メモリ効率の良いファインチューニング ◼ 日本語大規模言語モデルの比較 14
5.5 メモリ効率の良いファインチューニング 自動混合精度演算(automatic mixed precision:AMP) FP32ではなくFP16でパラメータや計算結果を表現すると,メモリ使用量が半分に抑えられる。 自動混合精度演算は,FP32とFP16を使い分けることで精度と効率を両立させた。 パラメータ更新用のFP32表現(Master-Weights)を保持することで, FP32を用いたときと同等の精度で学習が進められる。 図は[1710.03740] Mixed Precision Trainingから。 15
5.5 メモリ効率の良いファインチューニング FP16でパラメータを更新すると精度が落ちる理由 FP16だと重みがうまく更新できない。 • 重みの更新値がFP16で表現できる最小値(2−24 )を下回り0になる。 • 重みの更新値と比べて,重みの値が大きすぎる(2048倍以上)場合は重みが更新されない。 通常だと重みの勾配には2−24 を下回る値が含まれる。 AMPでは誤差逆伝播の計算前に損失を定数倍することで, 勾配がこれを下回らないように工夫している (損失スケーリング(loss scaling))。 図は[1710.03740] Mixed Precision Trainingから。 16
5.5 メモリ効率の良いファインチューニング 勾配累積(gradient accumulation) 小さなバッチサイズで計算した勾配を集約することで,実質のバッチサイズを大きくできる。 パラメータを更新せずに,各バッチで計算される勾配を足し合わせてから,まとめて更新する。 勾配累積を用いない場合と勾配のスケールを 合わせるために,累積回数で損失を割っている。 これにより,得られる勾配は各バッチで計算した 勾配の平均に相当する。 17
5.5 メモリ効率の良いファインチューニング 勾配チェックポインティング(gradient checkpointing) 誤差逆伝播に必要な途中の計算結果を間引き,必要になれば再度計算することで, 計算速度は遅くなるがメモリ消費量を抑えている。 PyTorchではtorch.utils.checkpoint.checkpointという関数で実現できる。 transformersのBERTやRoBERTaなどの モデルではTrainingArgumentsの引数 としてgradient_checkpointing=True を指定することで使用できる 18
5.5 メモリ効率の良いファインチューニング LoRA(Low-Rank Adaptation) 線形層のパラメータの事前学習済みモデルからの差分Δ𝑊を, Δ𝑊 = 𝐴𝐵と2つの低ランク 行列の積で表し,この𝐴と𝐵を学習させることで学習するパラメータを削減している。 推論時には𝑊とΔ𝑊を足し合わせて1つのパラメータ𝑊とし,ℎ = 𝑊𝑥と出力を計算する。 Δ𝑊(𝐷𝑖𝑛 × 𝐷𝑜𝑢𝑡 )が𝐴(𝐷𝑖𝑛 × 𝑟)と𝐵 𝑟 × 𝐷𝑜𝑢𝑡 の積で表されている。 Δ𝑊が動く範囲が制限されるから, モデルが訓練セットに過剰に適合 することが抑えられる。 19
5.5 メモリ効率の良いファインチューニング peftライブラリでLoRAをtransfomersと組み合わせて使用する peft(Parameter-Efficient Fine-Tuning)ライブラリを用いることで簡単にLoRAを使用できる。 𝛼 𝑟 LoRA層の出力が𝛼と𝑟によりh = 𝑊𝑥 + ∆𝑊𝑥でスケールされている。 Transformerの場合,注意機構の線形層にのみLoRAを適用することが多い。 20
アジェンダ ◼ 自然言語推論モデルの実装 ◼ 意味的類似度計算モデルの実装 ◼ 多肢選択式質問応答モデルの実装 ◼ メモリ効率の良いファインチューニング ◼ 日本語大規模言語モデルの比較 21
5.6 日本語大規模言語モデルの比較 LUKE(Language Understanding with Knowledge-based Embeddings) LUKEはエンティティ情報を取り入れたエンコーダ構成のTransfoemer。 Wikipediaの記事を1つのエンティティとし,その集合で定義されるエンティティ語彙をもつ。 テキスト中にエンティティへの言及があれば,そのエンティティも入力に追加している。 これにより,テキストだけでなく,エンティティの文脈化トークン埋め込みを得られる。 事前学習ではマスク言語モデリングに加え,マスクされたエンティティトークンを予想させる。 図は[2010.01057] LUKE: Deep Contextualized Entity Representations with Entity-aware Self-attentionから。 22
5.6 日本語大規模言語モデルの比較 DeBERTa(Decoding-enhanced BERT with disentangled attention)V2 DeBERTaはBERTのアーキテクチャを以下の点で改良したもの。 • Disentangled Attention • 注意機構の重みを,トークン埋め込み間,位置埋め込み間,トークン埋め込みと位置埋込間 に分けて計算したものを足し合わせる。 • 𝑖番目のトークンは 𝐻𝑖 と{𝑃𝑖|𝑗 }の2つのベクトルによって表される。 𝑇 𝑇 𝐴𝑖,𝑗 = 𝐻𝑖 , 𝑃𝑖|𝑗 × {𝐻𝑗 , 𝑃𝑗|𝑖 }𝑇 = 𝐻𝑖 𝐻𝑗𝑇 + 𝐻𝑖 𝑃𝑗|𝑖 + 𝑃𝑖|𝑗 𝐻𝑗𝑇 + 𝑃𝑖|𝑗 𝑃𝑗|𝑖 • Enhanced Mask Decoder • 事前学習時にマスク言語モデリングでトークンを予測する出力層の埋め込みに, 絶対位置を表す埋め込みを加えている。 • nGiE(nGram induced input encoding)(V2で追加) • Transformerエンコーダの第1ブロックの出力の後に畳み込み層を加える。 • これにより近接トークンとの依存関係をより良く学習できる。 23