LLMの性能の最大化

以下の動画の個人メモです.  www.youtube.com

性能改善のステップ

プロンプトエンジニアリングから始める: 最初のステップとして、プロンプトエンジニアリングを行います。これにより、迅速にテストを行い、学習することができます。初期のプロンプトの設計から始め、内容がモデルの必要性にどれだけ適しているかを評価します。

情報取得拡張生成(RAG)の最適化: 次に、RAGによって、モデルが特定のコンテンツを用いて問題を解決するようにします。これにより、内容の関連性を高め、モデルの幻覚(不正確な情報の生成)を減らすことができます。

ファインチューニングの実施: RAGの最適化後、モデルを特定のドメインやタスクに合わせてファインチューニングします。これにより、モデルの効率性と精度が向上し、複雑な指示やスキーマの必要性が減少します。

反復的な評価と改善: モデルのパフォーマンスを評価し、必要に応じてこれらのステップを繰り返します。特に、プロンプトエンジニアリングやRAGを改善することで、ファインチューニングの効果を最大化することができます。

継続的なモニタリングと調整: 実際の使用状況においてモデルのパフォーマンスを継続的に監視し、必要に応じてこれらのステップを再度実施します。

RAG(Retrieval-Augmented Generation)について

定義と目的: RAGは、モデルが特定のコンテンツを利用して質問に答える技術です。この方法は、モデルの知識範囲を特定の知識ベースに限定し、幻覚(誤った情報の生成)を減らすのに役立ちます。

実用例とプロセス: 例えば、モデルに与えられたコンテンツのみを使用して質問に回答するよう指示することがあります。これにより、モデルの知識を特定の知識ベースに制限し、より正確な情報を提供することができます。

改善と評価: RAGは、情報の取得と生成を最適化することによって、モデルのパフォーマンスを向上させます。これには、回答の関連性や幻覚の識別などの評価指標が関連します。

ファインチューニングについて

プロセスの概要: ファインチューニングは、基本モデルを特定のドメインに特化させるプロセスです。これにより、モデルは特定のタスクや問題に対してより効率的かつ精度高く動作するようになります。

効率と簡素化: ファインチューニングされたモデルは、複雑な指示やスキーマを必要とせず、よりシンプルなプロンプトで効率的に動作します。これにより、リクエストごとのコストとレイテンシーが削減されます。

実践的な応用: 不動産リストのような実例を取り上げ、ファインチューニングを通じてモデルがどのように特定のタスクを理解し、正確な出力を生成するかを示します。

反復的アプローチ: ファインチューニングは、特定のタスクに対するモデルの理解を深めるための反復的なプロセスです。ユーザーは、モデルに新しい知識を追加したり、特定の出力形式に従わせたりすることができます。

LLMの性能の最大化

以下の動画の個人メモです.  www.youtube.com

性能改善のステップ

プロンプトエンジニアリングから始める: 最初のステップとして、プロンプトエンジニアリングを行います。これにより、迅速にテストを行い、学習することができます。初期のプロンプトの設計から始め、内容がモデルの必要性にどれだけ適しているかを評価します。

情報取得拡張生成(RAG)の最適化: 次に、RAGによって、モデルが特定のコンテンツを用いて問題を解決するようにします。これにより、内容の関連性を高め、モデルの幻覚(不正確な情報の生成)を減らすことができます。

ファインチューニングの実施: RAGの最適化後、モデルを特定のドメインやタスクに合わせてファインチューニングします。これにより、モデルの効率性と精度が向上し、複雑な指示やスキーマの必要性が減少します。

反復的な評価と改善: モデルのパフォーマンスを評価し、必要に応じてこれらのステップを繰り返します。特に、プロンプトエンジニアリングやRAGを改善することで、ファインチューニングの効果を最大化することができます。

継続的なモニタリングと調整: 実際の使用状況においてモデルのパフォーマンスを継続的に監視し、必要に応じてこれらのステップを再度実施します。

RAG(Retrieval-Augmented Generation)について

定義と目的: RAGは、モデルが特定のコンテンツを利用して質問に答える技術です。この方法は、モデルの知識範囲を特定の知識ベースに限定し、幻覚(誤った情報の生成)を減らすのに役立ちます。

実用例とプロセス: 例えば、モデルに与えられたコンテンツのみを使用して質問に回答するよう指示することがあります。これにより、モデルの知識を特定の知識ベースに制限し、より正確な情報を提供することができます。

改善と評価: RAGは、情報の取得と生成を最適化することによって、モデルのパフォーマンスを向上させます。これには、回答の関連性や幻覚の識別などの評価指標が関連します。

ファインチューニングについて

プロセスの概要: ファインチューニングは、基本モデルを特定のドメインに特化させるプロセスです。これにより、モデルは特定のタスクや問題に対してより効率的かつ精度高く動作するようになります。

効率と簡素化: ファインチューニングされたモデルは、複雑な指示やスキーマを必要とせず、よりシンプルなプロンプトで効率的に動作します。これにより、リクエストごとのコストとレイテンシーが削減されます。

実践的な応用: 不動産リストのような実例を取り上げ、ファインチューニングを通じてモデルがどのように特定のタスクを理解し、正確な出力を生成するかを示します。

反復的アプローチ: ファインチューニングは、特定のタスクに対するモデルの理解を深めるための反復的なプロセスです。ユーザーは、モデルに新しい知識を追加したり、特定の出力形式に従わせたりすることができます。

Multi Vector Retrieverの概要

以下のlangchainのMulti Vector Retrieverの記事を読んでまとめました.

MultiVector Retriever | 🦜️🔗 Langchain

ドキュメントごとに複数の埋め込みベクトルを保存したいときにどのようにするのが良いか? 以下の方法が考えられ,Multi Vector Retrieverではその方法を提供する.

  • Smaller chunks: ドキュメントを小さなチャンクに分割し,埋め込む(ParentDocumentRetriever)
  • Summary: 各文書の要約を作成し、文書と一緒に(または文書の代わりに)埋め込む
  • Hypothetical questions: 各文書が答えるのに適切であろう仮定の質問を作成し、その質問を文書とともに(または文書の代わりに)埋め込む。

Smaller Chunks

小さなチャンクにすることで,できるだけ意味的に近いものを取得し、 かつできるだけ多くのコンテキストを下流に渡すことができるようになる.

Summary

LLMによる要約を行い,その内容を埋め込む.要約はチャンクの内容をより正確に抽出することができ、より良い検索につながる。

Hypothetical Queries

LLMはまた、特定の文書に尋ねられる可能性のある仮定の質問のリストを生成するために使用することができる。それらの質問を埋め込む.

weblab-10bとチャット

公開された松尾研の大規模言語モデルweblab-10bとチャットして遊んでみました.

> こんにちは
weblab: こんにちは、ゲストさん
新潟県のその他専門職のアルバイト・バイト・パート求人情報
新潟県のその他専門職のバイト・アルバイト・パートの求人情報<|endoftext|>

> 今日は何の日ですか?
weblab: 今日は何の日ですか?」という質問に、「おいしい卵の日です」と答えた。
卵の日は、卵に関する記念日である。
卵の日は、卵に関する記念日である。
卵の日は、卵に関する記念日である。
卵の日は、卵に関する記念日である。

> 卵は好きです
weblab: 卵は好きですが、料金が好きなわけではありませんから、引越しのショートケーキ風味というのは、想像する
だけでつらいです。料金はいつもこういう斜め上いくところがあって、見積もりは本当に好きなんですけど、比較もの
はさすがにアウトです

> 比較ものってどういう意味ですか?

weblab: 比較ものってどういう意味ですか?
A. ホテルにおける価格と設備の比較です。
Q. なぜホテルの価格は、設備と比較する必要がありますか?
A. ホテルの価格は、設備と比較することで、ホテルの品質を確認することが

> ホテルと卵は関係ありますか?
weblab: ホテルと卵は関係ありますか?
ホテルと卵は関係ありますか?
卵を食べるとホテルに行けると聞いたことがありますが、本当ですか?
本当です。卵を食べるとホテルに行けるという噂があります。この噂は、卵を食べるとホテルに行けるという噂が広ま

ソースコード

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from colorama import Fore, Back, Style, init

init(autoreset=True)

tokenizer = AutoTokenizer.from_pretrained("matsuo-lab/weblab-10b-instruction-sft")
model = AutoModelForCausalLM.from_pretrained("matsuo-lab/weblab-10b-instruction-sft", torch_dtype=torch.float16, device_map="auto")

if torch.cuda.is_available():
    model = model.to("cuda")

while True:
    input_text = input('> ')
    token_ids = tokenizer.encode(input_text, add_special_tokens=False, return_tensors="pt")
    with torch.no_grad():
        output_ids = model.generate(
            token_ids.to(model.device),
            max_new_tokens=100,
            do_sample=True,
            temperature=0.6,
            top_p=0.9,
            # pad_token_id=tokenizer.pad_token_id,
            # bos_token_id=tokenizer.bos_token_id,
            # eos_token_id=tokenizer.eos_token_id
        )

    output = tokenizer.decode(output_ids.tolist()[0])
    print(Fore.YELLOW + 'weblab: ' + output)

LLMのファインチューニングの有効性

事前学習した大規模言語モデルを新しいタスクに使うには、主にIn-context learningとfine tuningの2つの方法がある.

In-Context Learning and Indexing

  • 一般的なテキストコーパスで事前学習した大規模言語モデル(LLM)は文脈内学習が可能であり、LLMが明示的に訓練されていない特定のタスクや新しいタスクを実行したい場合に、事前学習したLLMをさらに訓練したり微調整する必要がない。
  • これはモデルに直接アクセスできない場合、例えば、APIを通じてモデルを使用している場合などに非常に有効。
  • In-context learningは、出力を改善するために入力を変更する"ハード"プロンプトチューニングによって利用される.
  • 特定のタスクに対してモデルのパラメータを更新しないため、タスク固有のニュアンスへの適応が制限される可能性があり、その性能は一般的に微調整に及ばない。
  • プロンプトチューニングは、異なるプロンプトの品質を比較するために人間が関与することが多いため、基本的には労力がかかる.

indexing

  • In-context learningを利用するもう1つの方法

文脈内学習に基づくアプローチを利用するもう一つの方法として、indexingがある。 LLMの領域でindexing作成は、LLMを外部リソースやウェブサイトからデータを抽出するための情報検索システムに変換することを可能にする、コンテキスト内学習の回避策とみなすことができる。このプロセスでは、インデックス作成モジュールが文書やウェブサイトをより小さなセグメントに分解し、ベクトルデータベースに格納できるようにベクトルに変換する。そして、ユーザーがクエリを送信すると、インデックス作成モジュールは、埋め込まれたクエリとデータベース内の各ベクトルとの間のベクトルの類似性を計算します。最終的に、インデックス作成モジュールは、最も類似した上位k個の埋め込みをフェッチし、応答を生成する。

3つの従来の特徴ベースアプローチとファインチューニングアプローチ

  • In-context learningは、APIなどを通じてLLMと対話する場合など、大規模言語モデル(LLM)への直接アクセスが制限される状況において有効な手段
  • しかし、もしLLMにアクセスできるのであれば、ターゲットドメインのデータを使ってターゲットタスクに適応させ、fine tuningすることで、基本的に優れた結果を得ることができる。では、どのようにすればモデルを対象タスクに適応させることができるのだろうか。従来からの以下の3つのアプローチがある。

The 3 conventional feature-based and finetuning approaches.

1) 特徴量ベースアプローチ

訓練済みのLLMを使って特徴量を抽出し,それを用いて分類モデルを訓練する方法. (BERTのような埋め込みに特化したものでは一般的だが,GPT形式の生成モデルから埋め込みを抽出することも可能) モデルはロジスティック回帰モデル,ランダムフォレスト, XGBoostなどなんでも良いが,ロジスティック回帰のような線形分類器が有効な場合が多い.

2) Finetuning I – 最終層の更新

  • 事前学習されたLLMのパラメータをfix
  • 出力層のファインチューニング
  • 理論的には特徴ベースのアプローチと同様の性能を発揮するはず。しかし、特徴量ベースのアプローチでは、トレーニングデータセットに埋め込む特徴量を事前に計算し、保存することが若干容易になるため、特定の実用的なシナリオでは、特徴量ベースのアプローチの方が便利な場合がある。

3) Finetuning II – 全ての層の更新

  • ターゲットタスクやターゲットドメインが、モデルが事前学習したデータセットとどれだけ似ているかによって、アプローチは変わる。しかし、実際には、すべてのレイヤーを細かく調整することで、ほとんどの場合、優れたモデリング性能を得ることができる。

Parameter-Efficient Finetuning

少数のパラメータ更新で有用なfine tuning手法

基本的には少数の追加パラメータを導入するもの

Reinforcement Learning with Human Feedback

教師あり学習強化学習の組み合わせにより,事前学習したモデルをfinetuningする. InstructGPTをベースとしたChatGPTによって広まった.

RLHFは人間がモデルの出力をランクづけや評価することで報酬信号を提供し,人間のフィードバックを収集し,報酬ラベルとしてモデルの訓練に使用される.

報酬モデル自体は教師あり学習で学習される?? 事前に訓練されたLLMを更新するために使用される 近接政策最適化と呼ばれる強化学習の一種

結論

事前学習されたLLMの全層を微調整することは、新しいターゲットタスクに適応するためのゴールドスタンダードであり続けているが、効率的な代替手段がいくつか存在する。特徴ベースのアプローチ、in-context learning、パラメータ効率の良いfine tuning技術などの方法は、計算コストとリソースを最小限に抑えながら、新しいタスクにLLMを効果的に適用することができる。 さらに、人間によるフィードバックを伴う強化学習(RLHF)は、教師ありの微調整の代替となり、モデルの性能を向上させる可能性がある。

Reference

以下の記事の要約,翻訳です. magazine.sebastianraschka.com

LlamaIndexのIndexの仕組み

大規模言語モデル(LLM)を利用する上でLangChainと合わせて重要なLlamaIndexについて,LlamaIndexのドキュメントembedding方法や回答の合成方法がイマイチ不思議(理解できてなかった)だったので,読んで整理しました.

LlamaIndexとは

LlamaIndexはLLMを利用する際,①外部ドキュメントをLLMに効率的に渡すための構造化データの作成や,②構造化データを踏まえて質問解答するようにLLMに要求しする処理を実現してくれます.
 ①LlamaIndexはドキュメントを取り込み,Nodeと呼ばれるオブジェクトにテキストをパース・チャンクします.
 ②レスポンスの合成:取得したNodeをもとにレスポンス文書を合成する.(複数のレスポンス・モードが存在) 
今回は①の際のIndex方法について整理します.

Indexの種類(4種類)

リスト,ベクトル,キーワードテーブル,ツリーの4種類が存在.

リスト Index

  • 単にノードを直列に保存 https://gpt-index.readthedocs.io/en/latest/_images/list.png

  • クエリするときにパラメータを指定しないと,リスト内のすべてのノードをロードする https://gpt-index.readthedocs.io/en/latest/_images/list_query.png

  • top kの近傍をフェッチするembeddingベースやキーワードのフィルタリングを追加したクエリの指定も可能. https://gpt-index.readthedocs.io/en/latest/_images/list_filter_query.png

ベクトルストアIndex

各Nodeと対応するembeddingをベクトルストアに格納

https://gpt-index.readthedocs.io/en/latest/_images/vector_store.png

クエリの際は最も類似した上位k個のノードを取得し、それをレスポンス合成モジュールに渡す.

https://gpt-index.readthedocs.io/en/latest/_images/vector_store_query.png

ツリーIndex

Nodeの階層的なツリーを構築

https://gpt-index.readthedocs.io/en/latest/_images/tree.png

ルート・ノードからリーフ・ノードに至るまで辿る. デフォルトでは(child_branch_factor=1)、クエリは親ノードから1つの子ノードを選ぶ.child_branch_factor=2の場合、クエリは親ノード1つにつき2つの子ノードを選ぶ.

https://gpt-index.readthedocs.io/en/latest/_images/tree_query.png

キーワードテーブルIndex

各Nodeからキーワードを抽出し、各キーワードから対応するNodeへのマッピングを構築

https://gpt-index.readthedocs.io/en/latest/_images/keyword.png

クエリから関連するキーワードを抽出し、それらをノードに対応するキーワードと照合して、ノードを取得する。

https://gpt-index.readthedocs.io/en/latest/_images/keyword_query.png