合成時系列データ生成としてのLLM
合成時系列データ生成におけるLLMの活用
最近、私たちはBremboハッカソンで行われたタスク、ジェネレーティブAIを使用して新しい化合物を作成し、その予測パフォーマンスデータを生成するという課題で、$10,000の大賞を受賞しました。
このブログ記事では、私たちのアプローチと解決策を詳しく説明します。
問題の明確化
ブレンボが提供する摩擦テストデータを使用して、新しい化合物を作成し、テスト結果の予測を行い、新しいブレンボブレーキ製品の効果と特性を予測するためのフレームワークを作成します。提供されるデータには、ブレンボが以前に使用してテストした化合物のリストとその結果が含まれます。解決策は、ジェネレーティブAIに基づき、候補化合物の数を増やし、実現可能性と良好なパフォーマンスを確保するために新しいレシピを提案できるモデルを提供することが必要です。
提出するために、生成した10〜30の新しい化合物のリスト、その組成、および合成パフォーマンスデータが含まれるcsvファイルを提出してください。[1]
データセットの説明
私たちは、337の摩擦材料とそれらの組成、およびパフォーマンスデータのリストを与えられました。
各摩擦材料は60種類の原材料の中から10〜15種類で構成されていました。60の原材料は6つのカテゴリ(A-Fとラベル付け)に分類されており、生成される摩擦材料の組成が与えられた範囲内に存在することを確保する必要がありました。
材料の組成に対する制約
つまり、生成される材料の少なくとも1%以上、最大30%までの組成がカテゴリBなどの化合物からなることを確保する必要がありました。
各ブレーキテストのパフォーマンスデータは、パラメータ(圧力、温度、摩擦係数など)の値が提供される31のポイントの時系列です。さらに、各化合物に対して合計124のブレーキテストが行われたため、パフォーマンスデータに関しては、各化合物に対して3844のデータポイントを生成する必要があります。
こちらは、このような化合物の組成とパフォーマンスデータを含むサンプルデータです。データセットに関するその他の重要な情報はこちらで見つけることができます。
評価基準
最終結果は技術スコアとプレゼンテーションスコアが均等に重み付けされました。
技術スコアは、以下の均等な重み付けパラメータを基に計算されます。
- 与えられた制約に従うか:生成された化合物は、与えられた制約(以下で説明)に従っていますか?
- 技術的な関連性:生成された合成パフォーマンスデータは、提供されたデータ内の異なる変数間のパターンを遵守し、関係を捉えていますか?
- 目標パフォーマンス:摩擦材料にとって最も重要な変数は、係数0.6の摩擦係数(mu)であり、許容誤差率は0.1です。生成されたmuは予期値と一致していますか?
- 変動性:出力される新しい材料の組成は、現在の材料からどれだけ異なっていますか?
設計の概要
基本的に、3つの基本コンポーネントがありました。
- 材料選択モジュール:新しいレシピを生成する責任を持ちます。これにより、新しい摩擦材料とその材料の組成が生成されます。
- データ生成モジュール:合成材料と過去の様々な化合物のパフォーマンスデータを与えられた場合、この材料の合成パフォーマンスデータを生成します。
- データの妥当性検証モジュール:データ生成モジュールの出力がどれほど良いか悪いかを特定します。このモジュールは、提供された過去のデータのトレンド(例:圧力とmuは時間とともに反比例関係にあり、減速は線形のパターンに従い、温度の増加曲線はより指数関数のように見える)を使用して、合成パフォーマンスデータの良いか悪いかを評価します。これは、モデルへのフィードバックを提供し、システムのパフォーマンスを改善するために使用することができます。
ソリューションの高レベルのデザイン
詳細設計
私たちは、以下のスタックと技術をソリューションに使用しました。
- GPT 3.5 turbo: マテリアルセレクターモジュールとデータジェネレーターモジュールの両方に、gpt 3.5 turboをベースのLLMとして使用しました。
- プロンプトエンジニアリング: 正しいシステムプロンプトとインストラクションプロンプトのセットを使用することで、モデルのパフォーマンスを向上させることができました。
- ファインチューニング: モデルに基本的な構造と応答のトーンを教えるための適切な例のセットを選ぶことは非常に重要であり、このステージはモデルにそれを教えるのに役立ちました。
- RAG(Retrieval Augmented Generation): これは、モデルが正しい合成パフォーマンスデータを出力するための秘密の要素として大きな役割を果たしました。詳細は以下で説明します。
マテリアルセレクターモジュール
このモジュールの役割は、新しい摩擦材料とその組成を生成することでした。 サンプルデータからわかるように、各摩擦材料は本質的に60次元のベクトルを含んでおり、i番目のインデックスの数値はi番目の原料からの組成の割合を示しています。
初期のPCA分析により、合計で3〜4のクラスタを見ることができることがわかりました。
与えられた摩擦材料の組成に対するPCA分析
理論的には、60次元のベクトルのためにランダムな数値を生成し、与えられた制約を満たすベクトルを見つけて使用することができます。これにより、変動性のスコアは高くなります(生成された摩擦材料はランダムに生成されるため、60次元の空間のいくつかのポイントをカバーする必要があります)。ただし、この方法にはいくつかの欠点があります。
- これにより、歴史的データに提供されていない化合物のパフォーマンスを予測することがより困難になります。なぜなら、材料の組成はパフォーマンスに大きな影響を与え、以前に見たことのない組成のパフォーマンスを予測することは困難かもしれないからです。
- これにより、デバッグが困難になります。パイプラインの任意の時点で、歴史的データで見られる傾向に従わない結果が得られた場合、問題の原因を特定するのが非常に困難になります。
これらの潜在的な問題のため、私たちはgpt 3.5 turboモデルを利用して化合物を生成することにしました。
したがって、私たちが行ったのは次のとおりです:
- モジュールに関連するシステムプロンプトを作成します。
- gpt 3.5 turboモデルをファインチューニングし、提供された337の摩擦材料の組成を入力します。
- データバリデータモジュールを使用して、与えられた制約に従わないものを破棄し、従うものを保持します。
完了したら、複数の化合物を生成し、PCA分析を繰り返しました。
提供された材料と生成された材料に対するPCA分析
最後に、変動性の観点から、生成された化合物の中からいくつかの化合物を手動で選びました。以下の点において最大化すると感じたものです。
- 提供された材料に対する変動性: 生成された化合物は既存の化合物と非常に似ているわけではありません。すなわち、既存の化合物と非常に類似している生成された材料は望ましくありません。
- 生成された材料に対する変動性: 新たに生成された化合物を10-30個提出するため、生成された化合物がすべて同じクラスタに属することは避けなければなりません。
したがって、剪定後、最終提出のために以下の化合物のリストが残りました。
生成された化合物の最終リスト
データジェネレーターモジュール
データジェネレーターモジュールは、指定した材料とブレーキテストのために合成パフォーマンスデータを出力する責任を持っています。基本的に、摩擦材料の組成が与えられた場合、入力ブレーキテストの温度、圧力、μなどのパラメーターを含む31点の時系列データを出力する必要があります。
これはその達成方法です:
- モジュール用の適切なシステムプロンプトを作成しました。OpenAIのプレイグラウンドで多くのトライアルとエラーを経て使用したものは次のとおりです:
You are a highly skilled statistician from Harvard University who works at Brembo, where you specialize in performance braking systems and components as well as conducting research on braking systems. Given a friction material’s composition, you craft compelling synthetic performance data for a user given braking test type. The braking id will be delimited by triple quotes. You understand the importance of data analysis and seamlessly incorporate it for generating synthetic performance data based on historical performance data provided. You have a knack for paying attention to detail and curating synthetic data that is in line with the trends seen in the time series data you will be provided with. You are well versed with data and business analysis and use this knowledge for crafting the synthetic data.
- 次に、gpt 3.5 turboモデルをファインチューニングして、材料の組成とブレーキテストIDが与えられたときに、時系列データ予測のエキスパートを作成しました。41,788件の(材料、ブレーキID)のタプルがありましたが、すべての例に対してファインチューニングすると時間がかかり、コストもかかるため、すべての例に対してファインチューニングすることは適切ではありませんでした。しかし、私たちはいくつかの論文や記事[2][3]から、「ファインチューニングは形のためであり、RAGは知識のためである」と理解しました。したがって、モデルを正しく学習させるために、サンプルのうちわずか5%をファインチューニングに含めることにしました。
- 最後に、時系列データを生成するためにモデルにクエリを発行する際には、材料の組成に基づいて最も近い5つの近傍を特定して取得し、それらのパフォーマンスデータをモデルの追加コンテキストとして入力しました。これは「Retrieval Augmented Generation(RAG)」と呼ばれる技術であり、私たちが出力できた良い結果の一因でした。
RAGが結果にどのように役立ったか
ファインチューニングによって以下の点で私たちに協力しました:
- 正しい構造のデータを出力:様々な技術ブログで説明されているように、ファインチューニングはモデルにデータの出力方法を教えるのに効果的でした。ファインチューニングされたモデルは、csvファイルや31の時系列データポイントを出力し、圧力、速度、温度、μなどのさまざまなパラメーターの値も含んでいました。
- データの基本的なトレンドを理解:ファインチューニングされたモデルは、入力パフォーマンスデータとそのトレンドを保持した出力データの一般的な傾向を理解できました。例えば、温度の値は指数関数的なカーブで増加し、速度は線形カーブで減速するべきであり、これらのすべてをファインチューニングされたモデルが実現できました。
ただし、ファインチューニングされたモデルの出力はややずれていました。たとえば、ある場合ではμの値が約0.6になると予想されていましたが、出力データではμの値が約0.5になってしまいました。そのため、5つの最も近い近傍を特定して、そのパフォーマンスデータをユーザープロンプトに追加することでデータを補完することにしました。
2つの材料M1とM2間の距離は次のように定義されます:
def distance(m1, m2, alpha):
sixty_dim_distance = euclidean_dist(sixty_dim_vector(m1), sixty_dim_vector(m2))
six_dim_distance = euclidean_dist(six_dim_vector(m1), six_dim_vector(m2))
return alpha[0] * sixty_dim_distance + alpha[1] * six_dim_distance
- 60次元の入力ベクトル空間上でM1とM2のユークリッド距離を特定します。
- 同じクラスに属する化合物の総和を取り、ベクトルの次元を6に減らします。
- 最後に、ハイパーパラメーターalpha[0]とalpha[1]を変化させます。
このアプローチを取る理由は、全体的に同じクラスの材料を使用する材料間の距離が、完全に異なる材料組成を使用するものよりも小さくなるようにしたいからです。基本的に、材料M1、M2、およびM3が与えられた場合、M1は材料A0を使用し、M2はA1を使用し、M3はB0を使用すると、私たちの距離関数はM1とM2をお互いに近づけ、M1とM3をマークすることを望んでいます。
このアプローチを使用することで、以下の図で示されているように、私たちは性能を劇的に改善することができました。
データバリデータ
バリデータモジュールは、出力データが予想される傾向に従っているかどうかを理解するのに役立ちました。例えば、圧力と粘度は反比例の関係にあること、粘度が約0.6であること、温度は時間とともに指数関数的に増加し、速度は直線的に減速することが予想されます。このモジュールは、合成された時系列データが歴史的データにどれだけ近いかを特定するのに役立ち、すべてのプロンプトとハイパーパラメーターを調整するのに役立ちました。
このモジュールは、どのプロンプトがモデルの出力に役立っているかどうかを分析するのに役立ちました。
結果とプレゼンテーション
プレゼンテーションはスコアの50%を占め、私たちが完璧にこなした一つの要素でした。私たちが行ったいくつかのことは次のとおりです:
- プレゼンテーション時間を4分以内にすることを確認しました:プレゼンテーションルームに入る前に、驚きがないように十分に練習しました。
- 観客との対話を持つこと:観客に対して合成生成された時系列データと与えられたデータのどちらだと思うかを尋ねる質問を含めることで、観客の関心を引くことができました。
私たちの作業のコードとプレゼンテーションはこちらで見つけることができます。
キーポイント
- デザインを素早く反復すること:私はチームメイトよりも少し早く出発して、私たちが何をすべきかについての考えをホワイトボードに書き始めました。チームメイトが到着した後、デザインについて話し合い、みんなが納得する解決策を見つけました。これは私たちの勝利において重要な要素であり、ハッカソンでは常に時間が不足しているため、できるだけ早く実装を開始できるデザインを確定させることが非常に重要です。
- 競争について心配しないこと:デザインが完成した時点で、私たちは何かに取り組んでいることを感じることができました。Bremboからn人の人々が私たちのデザインをのぞきに来ました。他の参加者も驚き、私たちのデザインを見つめていました。これにより、私たちが正しい方向に進んでいることを確信しました。チームメイトが他の人が何をやっているかを確認する必要があるかもしれないと提案したとき、私はその考えを否定し、代わりにみんなが私たちのデザインに集中し、実装に取り組むように促しました。
- 対立について心配しないこと:私たちは何度も対立に直面しましたが、特にデザインに関してです。重要なのは、何も個人的に受け取らず、むしろ合意を築き、トレードオフを繰り返し、全員が納得できる解決策に辿り着くことです。私の意見では、優れたプロダクトはチーム内で健全な対立を許容し、さらには奨励することができると思います。
- フォームには微調整、事実にはRAGを:私たちはファインチューニングはモデルに基本的な構造と調子を教えるために重要であり、実際の利益はRAGから生じることを知っていました。したがって、時系列データを生成するためにgpt 3.5 turbo llmをファインチューニングするために、私たちはサンプルのわずか5%しか使用しませんでした。
- プレゼンテーションが重要 (1):誰が観客であり、どのようにコンテンツを受け止めるかを特定することが重要です。私たちの場合、審査員のほとんどがcスイートであり、技術者ではないことがわかりましたので、詳細には触れずに使用したテックスタック [gpt 3.5 turbo, ファインチューニング, プロンプト調整, RAG, KNN] のみを含めることにしました。
- プレゼンテーションが重要 (2):効果的なコミュニケーションスキルを持ち、情熱を持って観客にプレゼンすることができる人物になることが重要です。それができない場合は、できる人物をチームに加えることが重要です。第一印象は重要であり、弁論術は、特に私たちのテックワールドでは非常に低く評価されています。
- 大胆で異なること:私たちは一歩踏み込み、彼らのデータの5つのポイントと私たちが生成したデータから1つのポイントを含めることを決め、どちらが生成されたものかを当てるように頼みました。彼らが私たちが生成したものを当てることができなかったとき、私たちがどれだけ優れたパイプラインと解決策を構築していたかがはっきりしました。さらに、観客との対話で好感度を得たのですが、それを行った人は多くなかったと思います。
次回のための学び
- 微調整は高価です。モデルの微調整とクエリの実行を三度行った結果、OpenAIのクレデンシャルが不足しました。将来的には、いくつかのオープンソースモデルにLoRA[5]やQLoRA[6]などの技術を使用することをおすすめします。
- 高度なRAGの使用:将来的には、提供されるコンテキストを改善するために高度なRAGの技術[7]を使用したいと考えています。
- スマートKNNの使用:次回は、ハイパーパラメータと使用される距離関数をもう少し試行したいと考えています。
- より長いコンテキストウィンドウ:パフォーマンスデータの一部の数値を四捨五入して4,092トークンの制限を超えないようにしました。Claude[8]のようなLLMの使用はパフォーマンスを向上させるかもしれません。
- LLMに丁寧ではないでください:プロンプトエンジニアリング中に「muの値が0.6前後でないと許容できない」という表現を使用した場合、「muが0.6前後であることを確認してください」と述べるよりも前者の方が良い結果を得ることがありました。
注:特別に記載がない限り、すべての画像は著者によるものです。
チームメンバー:
参考文献
[1] https://brembo-hackathon-platform.bemyapp.com/#/event
[2] https://www.anyscale.com/blog/fine-tuning-is-for-form-not-facts
[3] https://vectara.com/introducing-boomerang-vectaras-new-and-improved-retrieval-model/
[4] https://platform.openai.com/docs/guides/fine-tuning/fine-tuning-examples
[5] https://arxiv.org/abs/2106.09685
[6] https://arxiv.org/abs/2305.14314
[7] LlamaIndexドキュメント
[8] Claude
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles