LoRA (低ランク適応) は、大規模言語モデル (LLM) を微調整するために設計された一般的な手法です。このテクノロジはもともと Microsoft の研究者によって提案され、論文「LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS」に含まれていました。 LoRA は、ニューラル ネットワークのすべてのパラメーターを調整するのではなく、少数の低ランク行列の更新に重点を置き、モデルのトレーニングに必要な計算量を大幅に削減するという点で他の手法と異なります。
LoRA の微調整品質はフルモデルの微調整に匹敵するため、多くの人がこの方法を微調整アーティファクトと呼んでいます。そのリリース以来、多くの人がこのテクノロジーに興味を持ち、研究をより深く理解するためにコードを作成したいと考えてきました。これまでは、適切なドキュメントが存在しないことが問題でしたが、現在は役立つチュートリアルが用意されています。
このチュートリアルの著者は、機械学習と AI の著名な研究者である Sebastian Raschka 氏で、さまざまな効果的な LLM 微調整手法の中で、依然として LoRA が第一の選択肢であると述べています。この目的のために、Sebastian は LoRA をゼロから構築するブログ「Code LoRA From Scratch」を書きました。
この記事では、コードを最初から作成して低ランク適応 (LoRA) を紹介します。Sebastian は実験で DistilBERT モデルを微調整して使用しました。分類タスクに適用されます。
LoRA 手法と従来の微調整手法の比較結果は、LoRA 手法が 92.39% のテスト精度を達成し、最後の数層のみを微調整するよりも優れていることを示しています。モデルの (テスト精度の 86.22%) は、より優れたパフォーマンスを示しています。これは、LoRA 手法にはモデルのパフォーマンスの最適化において明らかな利点があり、モデルの汎化能力と予測精度をより向上させることができることを示しています。この結果は、より良いパフォーマンスと結果を得るために、モデルのトレーニングとチューニング中に高度な技術と方法を採用することの重要性を強調しています。
#セバスチャンがそれを達成する方法を比較することで、私たちは引き続き下を向いていきます。
LoRA レイヤーをコードで表現すると次のようになります:
このうち、in_dim は LoRA を使用して変更するレイヤーの入力ディメンションであり、対応する out_dim はレイヤーの出力ディメンションです。ハイパーパラメータ (スケーリング係数アルファ) もコードに追加されます。アルファ値が高いほどモデルの動作が大きく調整されることを意味し、値が低いほどその逆を意味します。さらに、この記事では、行列 A をランダム分布からのより小さい値で初期化し、行列 B をゼロで初期化します。
LoRA が関与するのは通常、ニューラル ネットワークの線形 (フィードフォワード) 層であることは言及する価値があります。たとえば、2 つの線形層を持つ単純な PyTorch モデルまたはモジュール (たとえば、これは Transformer ブロックのフィードフォワード モジュールである可能性があります) の場合、forward メソッドは次のように表現できます。
LoRA を使用する場合、通常、LoRA 更新はこれらの線形レイヤーの出力に追加され、コードは次のとおりです。
# #既存の PyTorch モデルを変更して LoRA を実装したい場合、簡単な方法は、各線形レイヤーを LinearWithLoRA レイヤーに置き換えることです。
A上記の概念の概要を以下の図に示します。
LoRA を適用するために、この記事ではニューラル ネットワーク内の既存の線形層を置き換えます。オリジナルの線形レイヤーと LoRALayer の LinearWithLoRA レイヤーを組み合わせたものです。
LoRA は、GPT や画像生成などのモデルに使用できます。説明を簡単にするために、この記事ではテキスト分類に小規模な BERT (DistilBERT) モデルを使用します。
#この記事では新しい LoRA 重みのみをトレーニングするため、すべてのモデル パラメーターをフリーズするには、すべてのトレーニング可能なパラメーターの require_grad を False に設定する必要があります。
##次に、print (model) を使用してモデルの構造を確認します。
出力から、モデルが線形層を含む 6 つのトランス層で構成されていることがわかります。 さらに、モデルには 2 つの線形出力層があります:
次の割り当て関数を定義することで、これらの線形層に対して LoRA を選択的に有効にすることができます。およびループ:
print (model) を使用してモデルを再度チェックし、更新された構造を確認します:
##
上でわかるように、Linear レイヤーは LinearWithLoRA レイヤーに正常に置き換えられました。
上記のデフォルトのハイパーパラメータを使用してモデルをトレーニングすると、IMDb 映画レビュー分類データセットで次のパフォーマンスが得られます:
次のセクションでは、このホワイト ペーパーでは、これらの LoRA 微調整結果と従来の微調整結果を比較します。
前のセクションでは、LoRA はデフォルト設定で 89.44% のテスト精度を達成しました。これは従来の微調整方法と比較しますか?
比較のために、この記事では DistilBERT モデルのトレーニングを例として別の実験を実施しましたが、トレーニング中に更新されたのは最後の 2 層のみでした。研究者らは、すべてのモデルの重みをフリーズし、次に 2 つの線形出力層をフリーズ解除することでこれを達成しました。
最後の 2 つの層のみをトレーニングすることで得られる分類パフォーマンス
結果は、LoRA が最後の 2 つのレイヤーを微調整する従来の方法よりもパフォーマンスが優れていることを示していますが、使用するパラメーターは 4 分の 1 です。すべてのレイヤーを微調整するには、LoRA セットアップの 450 倍のパラメーターを更新する必要がありましたが、テスト精度は 2% しか向上しませんでした。
上記の結果はすべてデフォルト設定で LoRA によって実行され、ハイパーパラメーターは次のとおりです。
##ユーザーが別のハイパーパラメータ構成を試したい場合は、次のコマンドを使用できます:ただし、最適なハイパーパラメータ構成は次のとおりです。
この構成では、結果は次のようになります。
元のリンク: https://lightning.ai/lightning-ai/studios/code-lora-from-scratch?cnotallow=f5fc72b1f6eeeaf74b648b2aa8aaf8b6
##
以上がLoRA コードを最初から作成する方法、チュートリアルはこちらの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。