GENZITSU / UsefulMaterials

34 stars 0 forks source link

almost weekly useful materials - 11/15 - #140

Open GENZITSU opened 6 months ago

GENZITSU commented 6 months ago

IBIS2023チュートリアル「大規模言語モデル活用技術の最前線」

2023年10月末時点でのLLMの活用事例やpromptテクニック、最近の研究までがまとめられている資料。

勉強になったところだけログとして残す。

prompting

Plan-and-Solve: 問題を解くにあたってのプランニングもさせる

スクリーンショット 2023-10-31 12 09 07

Step-Back Prompting: 問題を解くにあたって原理・原則を答えさせたのちに、解かせる

スクリーンショット 2023-10-31 12 09 58

Auto-CoT: Few-shot例の自動生成.

実態としては入力に近しい、base queryをサンプリングして、step by stepをつけてFew-shot例を作って、LLMに流しているだけ (論文)

実際はbase query側のfew-shot例も整備しておいた上でサンプリングした方が良さそう

スクリーンショット 2023-10-31 12 12 05

Program of Thought: 言語ではなくソースコードを生成して、その生成結果を答えとする

計算系とかプログラム処理できる系は確かにこれでも良さそう。voyagerとかもこれに通ずるのだろうか

論文

スクリーンショット 2023-10-31 12 23 53

スクリーンショット 2023-10-31 12 25 58

これを一般化したFaithful COTなるものもある (Pythonコード意外にも別の問題形式に変換する)

スクリーンショット 2023-10-31 12 28 42

思考ステップを刻むと性能が上がる

回答に使える情報や、考える時間がふえるから...?

スクリーンショット 2023-10-31 12 29 23

Least-to-Most

planningと似たような話だが、サブ問題への分割もLLMにやってもらう

スクリーンショット 2023-10-31 13 22 20

Self-Refine: LLM自身に出力のFB・修正を行わせる

かなりゆこうそうだが、FB用のexample作成がとても大事そう

スクリーンショット 2023-10-31 13 23 28

その他、雑多な話題

重要な情報は最初 or 最後あたりに入れた方がよい

スクリーンショット 2023-10-31 12 30 15

指示をもう一度入れると性能が上がる

考えるための時間がその分増える?

スクリーンショット 2023-10-31 12 56 30

LLMに複数ペルソナを与えたセルフレビュー

ペルソナに専門知識を持たせることも効果的

スクリーンショット 2023-10-31 12 58 14

複数LLMの結果の統合

スクリーンショット 2023-10-31 12 59 29

LLMを用いた下流タスク向けの情報拡張

スクリーンショット 2023-10-31 13 00 11

スクリーンショット 2023-10-31 13 00 19

LLMは4bitまで量子化しても性能が大きくは変化しない

特定タスク用のモデルは基本的に4bitで運用することになりそう

スクリーンショット 2023-10-31 13 01 15

特定状況に沿った対話エージェントに設定するプロンプト例

対話の大まかな流れ + そこそこ長い対話例をつける

スクリーンショット 2023-10-31 13 04 48

スクリーンショット 2023-10-31 13 04 55

コメント

最新の話題にまで振られれていて、とても勉強になる

LLMに特定のタスクを解く際に重要なのは、「そのタスクを解く筋道を与えること」 と 「筋道からそれてないかを監視すること」っぽい。

筋道の与え方は人間による指示 or LLM自身で考えさせるがあるが、LLM自身で考えさせる場合はexampleが必要だったり、監視機構を強固なもの(採点項目の例示や複数ロールによる関し)にする必要があるということ

出典

GENZITSU commented 6 months ago

LLMのプロンプト技術まとめ

気になったものだけ抜粋

Take a Deep Breath

論文:Large Language Models as Optimizers 「Take a deep breath」とプロンプトに加えることで精度が改善する手法.

Chain of Verification(CoVe)

論文:Chain-of-Verification Reduces Hallucination in Large Language Models LLMの出力からハルシネーション(事実と異なる間違い)を減らすための手法です. 以下のようなステップで検証を行います.

  1. ある入力に対するLLMから回答を得る(検証したい文章)
  2. 検証するための質問文をいくつか生成する
  3. それぞれの質問に対して独立して回答する
  4. 最終的な検証済みの回答を生成

Generated Knowledge Prompting

論文:Generated Knowledge Prompting for Commonsense Reasoning LLMに関連知識を生成させプロンプトに追加することで,いくつかのデータセットでSOTAを達成した手法です.

関連知識をLLMに出力させることもOKだし、自分で記入するのもOK

EchoPrompt

論文:EchoPrompt: Instructing the Model to Rephrase Queries for Improved In-context Learning 質問に答える前にその質問を言い換えるように指示をすることでいくつもの指標で精度が改善した手法.また,step by stepなどと組み合わせることもできる.

Chain of density(CoD)

論文:From Sparse to Dense: GPT-4 Summarization with Chain of Density Prompting テキストを要約する精度を高めるためのプロンプトです。

荒い要約から密度の高い要約へと段階的に生成するという方法

Inferential Exclusion Prompting (IEP)

論文:Eliminating Reasoning via Inferring with Planning: A New Framework to Guide LLMs’ Non-linear Thinking LLMに非線形な思考をさせることで精度を改善するアプローチ.

  1. 複数の選択肢を回答するように質問
  2. 選択肢が正しい場合の前提を質問(2.からは選択肢ごとに実行する)
  3. 選択肢は前提と矛盾しないか質問する.矛盾する場合は他の選択肢を試す.
  4. 矛盾しない答えが出てきたら終了

planningはしないもののTree of thoughtとやり方は似ている

プロンプトの基本テクニック

基本といえば基本だが、抜け漏れないかチェックする時に使える

スクリーンショット 2023-10-31 13 08 08

コメント

めちゃまとめられていてすごい。

ただ、やってることのエッセンスはそう変わらない気もする。

出典

GENZITSU commented 6 months ago

各種Prompt Engineeringの日本語実例集(Zero-CoT、mock、ReAct、ToT、Metacog、Step Back、IEPなど)

Prompt Engineeringの手法を日本語タスクで実践する場合の実例がまとめられている。

以下勉強になった点

zero-shot CoT

Take a deep breath and work on this problem step-by-step. を追加する 日本語タスクに取り組む際も、和訳などせずこのまま入れた方が良いらしい。(N=1)

bothinst

依頼内容を一挙に書くのではなく、system message と user messageにわけることをbothinstというらしい。 chatgpt系だと標準実装だが、OSSモデルを利用する際は一行の余地あり

07: mock

mockはユーザーが実施するタスクをLLMに確認し、自身に実施する内容を承諾・発言させる

具体的には、会話の最初にuserから

新卒者にふさわしい仕事とは 下級職で、豊富な職業経験を必要としない仕事です。
私は仕事の情報を渡します。
あなたはその仕事が新卒者に適したものであるかどうかを分析し、
新卒にふさわしいポジションかどうかを判定します。
分かりましたか?

と与え、asssistantの回答として

はい、理解しました。提供された職務内容が新卒者に適しているかどうかを判定します。

と、一度、役割とタスクについて内容を一度再確認するメッセージを一往復させておきます。

10: Metacognitive Prompting

タスクの理解、ドラフト作成→推敲→回答の根拠づけ/修正のステップで問題を解かせる

スクリーンショット 2023-10-31 17 05 03

11: Step Back

問題を回答するのに、重要な観点などをLLMに生成させたのちに回答させる

あなたはユーザーが質問する仕事内容について、
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらなのか、その答えを回答します。

答えを回答するまえに、新卒に適した仕事なのか否かを判断するための、
<<<一般的・普遍的な観点・ポイントについて回答してください。>>>
その後、「質問」そのものに対する回答をしてください。

「質問」
以下の仕事について          
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務          
---------          
この仕事は          
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらですか。  
以下の出力形式に従って、回答してください。         

###出力形式          
一般的・普遍的な観点・ポイント:新卒に適した仕事なのか否かを判断する普遍的なポイントを記載
答え:答えを記載

このように「判断理由や使用した法則」をLLM自身に回答させる手法は、AIやLLMの解釈性・説明性・透明性に役立つ重要なポイントです。

12: IEP(Inferential Exclusion Prompting)

あえて複数の観点で回答さえた上で、その前提を確認させる手法

あなたはユーザーが質問する仕事内容について、
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらなのか、その答えを回答します。

最初に、ユーザーが質問した仕事内容を、(A) 新卒に適した仕事だと仮定してください。
もしそれが本当に正しいとしたら、その前提は何になりますか?

次に、ユーザーが質問した仕事内容を、(B) より専門的な経験を必要とする仕事
だと仮定してください。
もしそれが本当に正しいとしたら、その前提は何になりますか?

次に、ユーザーが質問した仕事の前提を記載してください。

ユーザーが質問した仕事の前提とより一致するのは(A)と(B)のどちらか回答してください。
そして満たせていない選択肢を除外し、残った選択肢を答えとして回答してください。

「質問」
以下の仕事について          
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務          
---------          
この仕事は          
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらですか。  
以下の出力形式に従って、回答してください。

###出力形式          
(A) が正しいとした場合の前提:(A) が正しいとした場合の前提を記載
(B) が正しいとした場合の前提:(B) が正しいとした場合の前提を記載
ユーザーが質問した仕事の前提:ユーザーが質問した仕事の前提を記載
前提に反していて除外する答え:前提をより満たせていない答え
答え:答えを記載

コメント

手法だけだとイメージがしにくいが、実例まであるとどういうことかよくわかってとても助かる。

出典

GENZITSU commented 6 months ago

SIGNATE 金融データ活用チャレンジ ~解法編~

銀行内データを用いた住宅ローンの延滞予測タスクにおける21位 解法の共有

コンペ概要

入出金や預金残高などの銀行の口座情報から、顧客が基準年月+3ヶ月目と基準年月+4ヶ月目に連続して住宅ローンを延滞するかどうかを予測するタスクを解くコンペティションです。

validation

今回はテストデータに最も近い1年月のデータをvalidationデータとするHold Out法を採用

その他の、時系列を考慮しない5-fold CVや、5-foldのTime split、顧客IDをtrainデータとvalidationデータで分け、Positive、Negativeの比率も保持するStratified Group 5 foldも試した

いろいろなvalidation strategyを試すことが重要

特徴量エンジニアリング

ある程度汎用的なもののみメモ

  • 期間系特徴量の経過日数 「口座開設日からの経過月数」「住宅ローン開始日からの経過月数」などの自レコードとの差分特徴量を作成しました。

資産・住宅ローン金額系特徴量の比率 自分の資産に対する住宅ローンの割合が高いほど延滞確率は高いと考え、普通預金残高に対する住宅ローン借入額などの、住宅ローン/資産比率特徴量を作成しました。

入出金系特徴量の合計値・比率 ATM、振込、振替に対してそれぞれ入出金データがあったため、それらを合計することで月当たりのトータルの入出金額特徴量を作成 また、それぞれの入出金データについて比率算出することで、入出金のどちらがどの程度多いかを示す特徴量を作成しました。

ラグ特徴量 各特徴量について、前月のデータに対する当月データの比率特徴量を作成しました。最初は単なるラグ特徴量や複数期間のラグ特徴量を作成したのですが、メモリの関係上最も効果的だった、前月との比率特徴量を採用しました。

過去データの累積特徴量 過去データを全て集計し、最小値、最大値、平均値、件数のデータを作成しました。

合計は入っていない...?

コメント

テーブル系やる時のヒントとしてメモ

出典

GENZITSU commented 6 months ago

Feature Importanceによる特徴量選択とリーク

Feature Importanceに基づいた特徴量選択でリークを起こしうる事象を実験に基づいて検証しているスライド

Feature ImportanceのCV平均値に基づいて全Fold共通の特徴量選択するとCV値が不当に高くなるため、FoldごとのFeature Importanceに基づいてそれぞれで、特徴量選択するのがリークを防ぐ上では良いとのこと。

コメント

言説としてよく言われていたことだが、実際に実験結果として現れているのが面白い。

出典

GENZITSU commented 6 months ago

LLMを利用したFAQ検索の評価データセットの作成〜その2〜

既存FAQと元にLLMで新たなFAQデータセットを作成する試みの試行錯誤が述べられている。

以下、重要そうなことのメモ

生成プロンプトを日本語から英語に

英語で書くと、英語で返答されることもあったため また、例示しているところも良い。 さらに工夫するなこの例示部分もランダムに変えたい。

templete1 = f"""あなたの仕事は、与えられたFAQから、そのFAQへの想定質問を作成することです。以下に示すルールを満たす必要があります。

    1. 与えられたFAQを無視して読んでも意味のわかる質問であること。
    2. 与えられたFAQから完全に答えられる問題であること。
    3. 問題の難易度は中程度であること。
    4. 質問は合理的で、人間が理解し回答できるものでなければならない。
    5. 「ログインできない」「退会したい」のような実際のユーザーが問い合わせてくるような文言にすること。
    6. 短く簡潔な言葉遣いを心がけること。

応答はカンマで区切られた値のリストでなければなりません。 例: `ログインできない, 退会したい`

### FAQ
{faq}"""

ルールベースの後処理

実際に生成させてみて、弾きたいケースを見極めていく必要あり

def remove_to_bullet(text):
    text = re.sub(r'^\s*\d+\. ', '', text, flags=re.MULTILINE)
    text = re.sub(r'^質問\d+:\s*', '', text, flags=re.MULTILINE)
    text = re.sub(r'^FAQ:\s*', '', text, flags=re.MULTILINE)
    text = re.sub(r'- ', '', text, flags=re.MULTILINE)
    text = re.sub(r'Q. ', '', text, flags=re.MULTILINE)
    text = re.sub(r'^Q\d+\. ', '', text, flags=re.MULTILINE)
    return text

LLMによる生成結果の検証

一度生成してもらったものを、再度別の推論で検証してもらう. 一度目の生成の際にXXするなと書くよりも分けた方が効果的だったとのこと。
また、ここで用いられているPydanticOutputParserは、後ほど結果を集計する時にめちゃ有用そう

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field

template2 = """想定質問作成時によくある間違いとして以下が挙げられます。

    1. 視点: 質問がユーザーが情報を求める形式になっておらず、カスタマーサポートのオペレーターがユーザーに問いかける形式になっている
    2. 不整合: FAQに答えが存在しない質問や、FAQの範囲外の質問を想定質問として設定している

作成した想定質問にこれらの問題が起こっているか確認してください

{format_instructions}
"""

class QueryChecker(BaseModel):
    is_problem_1_occurring: bool = Field(description="`1. 視点`の問題が起こっているか")
    is_problem_2_occurring: bool = Field(description="`2. 不整合`の問題が起こっているか")

parser = PydanticOutputParser(pydantic_object=QueryChecker)
format_instructions = parser.get_format_instructions()
prompt2 = PromptTemplate(
    template=template2,
    input_variables=[],
    partial_variables={"format_instructions": format_instructions}
)

input_prompt2 = prompt2.format()

コメント

こういう試行錯誤のログ勉強になる。

出典

GENZITSU commented 6 months ago

大規模言語モデルのFine-tuningによるドメイン知識獲得の検討

PFNのインターンで実施された、英語で主に学習されたLLaMA2に対して日本語データを用いたInstruciton Tuningや追加事前学習がどの程度可能かの検証記事

学習はQLoRAで実装したとのこと

重要そうなポイントをメモ

LoRAの派生手法

4bitでLoRAを学習させるQLoRAの他にもさまざまなの種類のLoRAが存在

ランクを適応的に定めるAdaLoRA[7] やDyLoRA[8]、コンテキスト長を拡大できるLongLoRA[9]、行列Aの重みをfreezeすることでさらに軽量化を行うLoRA-FA、行列積をアダマール積やクロネッカー積で計算するLoHAやLoKRなどがあります(一部はLLMではなくStable Diffusionの学習で用いられる手法の通称です)。

学習手法まわり

学習率はcosine schedulerを利用して減衰

また、学習率をcosineスケジューラによって減衰させていることから、学習させるデータの順番によって学習率が異なることで、知識の習得具合に影響する可能性がありますが、最初に学習させた500件、ランダムに抽出した500件、最後に学習させた500件それぞれで検証した場合に有意な差は見られなかったことから、

初期の学習率は小さめが良い

初期学習率を小さくした方が安定する可能性が高いと思われます。LoRAの論文[2] ではGPTのFine-tuneは2e-4で行われており、hugging faceの実装でもデフォルトでは2e-4となっていますが、他の論文やブログでは3e-5での例などもあります。しかし、単に下げれば安定するということでもなく、1回の試行における計算コストとチューニングがトレードオフになる可能性はあります。

モデルサイズ / データ数 / LoRAランク数がInstruction Tuningに与える影響

スクリーンショット 2023-11-06 11 32 45

スクリーンショット 2023-11-06 11 33 15

その他の知見

QLoRAでどこを学習させるか

スクリーンショット 2023-11-06 11 40 46

スクリーンショット 2023-11-06 11 40 53

一方で、7Bに対するInstruction TuningではAttention層、特にValueの重みを更新しない場合にスコアが悪くなる傾向を確認

Instruction TuningとAdditional Trainingの順序

スクリーンショット 2023-11-06 11 44 19

additional trainingに用いるデータの質

スクリーンショット 2023-11-06 11 48 28

その他のモデルを用いた場合の傾向

同じパラメータ級の日本語事前学習済みモデルに対して同様の実験してもLLaMA2よりも性能が低かった

日本語対応の事前学習モデルとしてPLaMo-13BやJapanese StableLM Base Alpha 7Bで同様の実験をした際には、Instruction Tuningにおいて同じ設定ではLLaMA2ほどのスコアは出ませんでしたし、その他の挙動も大きく異なりました。そのため、日本語対応のベースモデルをFine-tuningする場合は、epoch数や学習率、LoRAのランクやデータ数などについての新たな検証が必要であると考えられます。学習データの件数が少ない場合に、日本語をほとんど学習していないLLaMA2のようなモデルの方がスコアが良い可能性がある点についても詳細な調査が望まれます。

コメント

LLMの追加学習に関するベストプラクティスはまだ固まっておらずい以下を頭に入れておいた方が良い

モデル一個あたり少なくとも12パターンはやる必要があって、さらに学習率等の学習パラメータの設定もいるので検証はかなり大変そう...

出典

GENZITSU commented 6 months ago

(続)ファッションにおける類似商品検索アルゴリズムの性能評価

ファッションにおける類似商品検索アルゴリズムの性能評価の続編記事

テキストデータを元に算出したスコアと画像から算出したを重み付け平均することでRecall@10が30%ほど改善したよという報告

before

スクリーンショット 2023-11-14 15 20 22

after

スクリーンショット 2023-11-14 15 20 36

スクリーンショット 2023-11-14 15 20 44

テキストと画像両方のデータを利用して初めて取得できるデータも確認

スクリーンショット 2023-11-14 15 22 19

一方で、定量評価値は向上したものの、定性的な評価は画像のみよりも精度が下がっていることは興味深い

スクリーンショット 2023-11-14 15 23 35

コメント

使えるデータが増えるのでそれはそうという感じだが、定性的には精度が下がっているということでレコメンドの難しさが見て取れる。

さらになんかやるとしたら、画像から色や柄情報を何らかの方法で抽出してテキストに追加するとか...?

出典