私達と接続

大規模な言語モデルを微調整するための完全ガイド

Artificial Intelligence

大規模な言語モデルを微調整するための完全ガイド

mm

大規模な言語モデル GPT-4、LaMDA、PaLM などの (LLM) は、広範囲のトピックについて人間のようなテキストを理解し、生成する驚くべき能力で世界を席巻しました。これらのモデルは、インターネット、書籍、その他のソースからの数十億の単語で構成される大規模なデータセットで事前トレーニングされています。

この事前トレーニング段階では、言語、トピック、推論能力、さらにはトレーニング データに存在する特定のバイアスに関する広範な一般知識をモデルに与えます。ただし、その範囲は驚くほど広いにもかかわらず、これらの事前トレーニングを受けた LLM には、特定のドメインやタスクに関する専門知識が不足しています。

ここで微調整が必​​要になります。これは、事前トレーニングされた LLM を、特定のアプリケーションまたはユースケースで優れた性能を発揮できるように適応させるプロセスです。より小規模なタスク固有のデータセットでモデルをさらにトレーニングすることで、そのドメインのニュアンスや要件に合わせて機能を調整できます。

ファインチューニングとは、高度な教育を受けたジェネラリストの幅広い知識を、特定の分野に特化した専門家へと転換するようなものです。このガイドでは、LLMのファインチューニングとは何か、なぜ必要なのか、そしてどのように行うのかを探ります。

大規模な言語モデルの微調整

大規模な言語モデルの微調整

微調整とは何ですか?

その中心に、 微調整 これには、大規模な事前トレーニング済みモデルを取得し、ターゲットのタスクまたはドメインに合わせて調整されたデータセットの 2 番目のトレーニング フェーズを使用してそのパラメーターを更新することが含まれます。これにより、モデルはその狭い領域に特有のニュアンス、パターン、目的を学習し、内部化することができます。

事前学習では、膨大かつ多様なテキストコーパスから幅広い言語理解を獲得しますが、微調整ではその汎用的な能力を専門分野に特化します。これは、ルネサンス期の人物を業界のエキスパートへと育成するようなものです。

事前学習済みモデルの重み(一般的な知識をエンコードしたもの)は、微調整プロセスの開始点または初期化として使用されます。その後、モデルはさらに学習されますが、今回は最終アプリケーションに直接関連する例を用いて学習されます。

この特殊なデータ配布にモデルを公開し、それに応じてモデル パラメーターを調整することで、基礎としての広範な事前トレーニング機能の恩恵を受けながら、LLM をターゲットのユースケースに対してより正確かつ効果的にします。

LLM を微調整する理由

大規模な言語モデルを微調整する必要がある主な理由はいくつかあります。

  1. ドメインのカスタマイズ: 法律から医学、ソフトウェア エンジニアリングに至るまで、あらゆる分野には、独自の微妙な言語慣習、専門用語、および文脈があります。微調整により、一般的なモデルをカスタマイズして、特定のドメインに合わせたテキストを理解して生成することができます。
  2. タスクの専門化: LLM は、テキストの要約、機械翻訳、質問応答などのさまざまな自然言語処理タスクに合わせて微調整できます。この特殊化により、ターゲット タスクのパフォーマンスが向上します。
  3. データコンプライアンス:医療や金融などの規制の厳しい業界には、厳しいデータプライバシー要件があります。微調整により、機密情報を保護しながら、独自の組織データに基づいて LLM をトレーニングすることができます。
  4. 限定されたラベル付きデータ: モデルの学習に必要な大規模なラベル付きデータセットをゼロから入手するのは困難な場合があります。事前学習済みモデルの機能を活用し、限られた教師あり学習データからでも優れたタスクパフォ​​ーマンスを達成できるよう、微調整を行います。
  5. モデルの更新: ドメイン内で時間の経過とともに新しいデータが利用可能になると、モデルをさらに微調整して最新の知識と機能を組み込むことができます。
  6. 偏見を軽減する: LLM は、広範な事前トレーニング データから社会的バイアスを検出できます。厳選されたデータセットを微調整することで、これらの望ましくないバイアスを軽減し、修正することができます。

本質的に、微調整は、一般的な広範なモデルと特殊なアプリケーションの焦点を絞った要件との間のギャップを埋めるものです。これにより、対象となるユースケースに対するモデル出力の精度、安全性、関連性が向上します。

大規模な言語モデルの微調整

大規模な言語モデルの微調整

提供されている図は、特にエンタープライズアプリケーション向けの大規模言語モデル(LLM)の実装と活用のプロセスを概説しています。まず、T5のような事前学習済みモデルに、CSVやJSONなど様々な形式の構造化および非構造化企業データを入力します。このデータは、教師あり、教師なし、または転送による微調整プロセスを経て、企業固有のニーズへのモデルの適合性を高めます。

企業データを使用してモデルが微調整されると、それに応じて重みが更新されます。その後、トレーニングされたモデルはさらなるトレーニング サイクルを繰り返し、新しい企業データに対する応答を時間の経過とともに継続的に改善します。このプロセスは反復的かつ動的であり、進化するデータ パターンに適応するためにモデルの学習と再トレーニングが行われます。

このトレーニングされたモデルの出力 (単語を表すトークンと埋め込み) は、さまざまなエンタープライズ アプリケーションに展開されます。これらのアプリケーションは、チャットボットからヘルスケアまで多岐にわたり、それぞれのモデルが業界固有のクエリを理解して応答する必要があります。金融分野では、アプリケーションには不正行為の検出や脅威の分析が含まれます。医療分野では、モデルは患者の問い合わせや診断を支援できます。

トレーニング済みのモデルは、時間の経過とともに新たな企業データを処理・対応できる能力を備えているため、その有用性は持続的に向上します。その結果、企業ユーザーはアプリケーションを通じてモデルと対話し、質問を投げかけることで、ドメイン固有のデータに基づくモデルのトレーニングと微調整を反映した情報に基づいた回答を得ることができます。

このインフラストラクチャは幅広いエンタープライズ アプリケーションをサポートし、ビジネス コンテキスト内で適切に実装および維持された場合の LLM の多用途性と適応性を示します。

微調整アプローチ

大規模な言語モデルを微調整するには、主に 2 つの戦略があります。

1) フルモデルの微調整

完全な微調整アプローチでは、事前トレーニングされたモデルのすべてのパラメーター (重みとバイアス) が 2 番目のトレーニング フェーズ中に更新されます。モデルはタスク固有のラベル付きデータセットに公開され、標準トレーニング プロセスによってそのデータ分布に合わせてモデル全体が最適化されます。

これにより、モデルはより包括的な調整を行い、ターゲットのタスクまたはドメインに総合的に適応できるようになります。ただし、完全な微調整にはいくつかの欠点があります。

  • トレーニング前フェーズと同様に、トレーニングには大量の計算リソースと時間が必要です。
  • タスクごとに細かく調整されたモデルのコピーを個別に保持する必要があるため、ストレージ要件が高くなります。
  • 微調整によりモデルが事前トレーニング中に学習した一般的な機能の一部を失う「壊滅的な忘却」のリスクがあります。

これらの制限にもかかわらず、完全な微調整は、リソースが許せば、対象のタスクが一般的な言語から大幅に異なる場合には依然として強力で広く使用されている手法です。

2) 効率的な微調整方法

完全なファインチューニングに伴う計算上の課題を克服するため、研究者たちは、ファインチューニング中にモデルのパラメータのごく一部のみを更新する効率的な戦略を開発しました。これらのパラメータ的に効率的な手法は、特化とリソース要件の削減のバランスを実現します。

一般的な効率的な微調整方法には次のようなものがあります。

プレフィックスチューニングここでは、タスク固有のベクトル、つまり「プレフィックス」と呼ばれる少数の要素が導入され、事前学習済みモデルの注意を対象タスクに調整するために学習されます。ファインチューニングでは、これらのプレフィックスのみが更新されます。

LoRA (低ランク適応): ロラ 微調整中に、トレーニング可能な低ランク行列を事前トレーニング済みモデルの各層に注入します。これらの小さなランク調整は、完全な微調整よりもはるかに少ないトレーニング可能なパラメーターでモデルを特殊化するのに役立ちます。

もちろん、LoRA (低ランク適応) について、数式とコード例とともに詳細に説明します。 LoRA は、大規模言語モデル (LLM) 適応の分野で大きな注目を集めている、人気のあるパラメーター効率の良い微調整 (PEFT) 手法です。

LoRAとは何ですか?

LoRAは、事前学習済みのLLMに少数の学習可能なパラメータを導入するファインチューニング手法です。これにより、元のモデルの知識の大部分を維持しながら、下流のタスクへの効率的な適応が可能になります。LoRAは、LLMのすべてのパラメータをファインチューニングする代わりに、タスク固有の低ランク行列をモデルのレイヤーに挿入することで、ファインチューニングプロセスにおける計算量とメモリ使用量を大幅に削減します。

数学的定式化

LoRA (低ランク適応) は、重み行列に低ランクの更新を導入する大規模言語モデル (LLM) の微調整方法です。重み行列の場合 0∈、LoRA は低ランクのマトリックスを追加します 、と および ここで、 ランクです。このアプローチにより、トレーニング可能なパラメーターの数が大幅に削減され、最小限の計算リソースで下流のタスクに効率的に適応できるようになります。更新された重み行列は次の式で与えられます。 .

この低ランクの更新は、低ランクの行列 $BA$ を追加することによって元の重み行列 $W_{0}$ を変更するものとして解釈できます。この公式の主な利点は、$W_{0}$ 内のすべての $d \times k$ パラメーターを更新する代わりに、LoRA は $A$ と $B 内の $r \times (d + k)$ パラメーターのみを最適化する必要があることです。 $、トレーニング可能なパラメータの数が大幅に減少します。

Pythonでの例を以下に示します。 peft テキスト分類のために事前トレーニングされた LLM に LoRA を適用するライブラリ:

</div>
<div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> transformers <span class="token" data-darkreader-inline-color="">import</span> AutoModelForSequenceClassification
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> peft <span class="token" data-darkreader-inline-color="">import</span> get_peft_model<span class="token" data-darkreader-inline-color="">,</span> LoraConfig<span class="token" data-darkreader-inline-color="">,</span> TaskType
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Load pre-trained model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> AutoModelForSequenceClassification<span class="token" data-darkreader-inline-color="">.</span>from_pretrained<span class="token" data-darkreader-inline-color="">(</span><span class="token" data-darkreader-inline-color="">"bert-base-uncased"</span><span class="token" data-darkreader-inline-color="">,</span> num_labels<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">2</span><span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Define LoRA configuration</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">peft_config <span class="token" data-darkreader-inline-color="">=</span> LoraConfig<span class="token" data-darkreader-inline-color="">(</span>task_type<span class="token" data-darkreader-inline-color="">=</span>TaskType<span class="token" data-darkreader-inline-color="">.</span>SEQ_CLS<span class="token" data-darkreader-inline-color="">, </span>r<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">8</span><span class="token" data-darkreader-inline-color="">,</span>  <span class="token" data-darkreader-inline-color=""># Rank of the low-rank update</span>
lora_alpha<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">16</span><span class="token" data-darkreader-inline-color="">,</span></code><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Scaling factor for the low-rank update</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">    target_modules<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">[</span><span class="token" data-darkreader-inline-color="">"q_lin"</span><span class="token" data-darkreader-inline-color="">,</span> <span class="token" data-darkreader-inline-color="">"v_lin"</span><span class="token" data-darkreader-inline-color="">]</span><span class="token" data-darkreader-inline-color="">,</span>  <span class="token" data-darkreader-inline-color=""># Apply LoRA to the query and value layers</span>
<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Create the LoRA-enabled model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> get_peft_model<span class="token" data-darkreader-inline-color="">(</span>model<span class="token" data-darkreader-inline-color="">,</span> peft_config<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Fine-tune the model with LoRA</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># ... (training code omitted for brevity)</span></code></div>
</div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">

この例では、シーケンス分類用に事前トレーニングされた BERT モデルをロードし、LoRA 構成を定義します。の r パラメータは低ランク更新のランクを指定し、 lora_alpha 更新の倍率です。の target_modules パラメーターは、モデルのどの層が低ランクの更新を受け取る必要があるかを示します。 LoRA 対応モデルを作成した後、標準のトレーニング手順を使用して微調整プロセスを続行できます。

アダプター層: LoRA に似ていますが、低ランクの更新の代わりに、事前トレーニングされたモデルの各トランスフォーマー ブロック内に薄い「アダプター」レイヤーが挿入されます。これらのいくつかの新しいコンパクト レイヤーのパラメーターのみがトレーニングされます。

即時チューニングこのアプローチでは、事前学習済みモデルは完全に固定された状態のままです。代わりに、学習可能な「プロンプト」埋め込みを入力として導入し、モデルの事前学習済み知識を対象タスクに対して有効化します。

これらの効率的な方法では、完全な微調整と比較して最大 100 倍のコンピューティング削減を実現しながら、多くのタスクで競争力のあるパフォーマンスを実現できます。また、完全なモデルの重複を回避することで、ストレージの必要性も削減します。

ただし、一般的な言語とは大きく異なるタスクや、より総合的な専門化が必要なタスクの場合、そのパフォーマンスは完全な微調整よりも遅れる可能性があります。

微調整プロセス

微調整戦略に関係なく、LLM を特殊化するための全体的なプロセスは、一般的なフレームワークに従います。

  1. データセットの準備: 対象タスクの入力(プロンプト)と望ましい出力をマッピングするラベル付きデータセットを取得または作成する必要があります。要約などのテキスト生成タスクの場合、これは入力テキストと要約された出力のペアになります。
  2. データセット分割: ベスト プラクティスに従って、ラベル付きデータセットをトレーニング セット、検証セット、テスト セットに分割します。これにより、モデルのトレーニング、ハイパーパラメーターの調整、および最終評価のデータが分離されます。
  3. ハイパーパラメータ調整: データを最も効果的に微調整するには、学習率、バッチ サイズ、トレーニング スケジュールなどのパラメーターを調整する必要があります。これには通常、小さな検証セットが含まれます。
  4. モデルトレーニング: 調整されたハイパーパラメータを使用して、検証セットでのモデルのパフォーマンスの向上が止まるまで (早期停止)、完全なトレーニング セットで微調整の最適化プロセスを実行します。
  5. 評価: 理想的には対象ユースケースの実際の例を含む保留テスト セットで微調整されたモデルのパフォーマンスを評価し、実際の有効性を推定します。
  6. 導入と監視: 満足のいく結果が得られたら、微調整されたモデルを新しい入力に対する推論に展開できます。コンセプトドリフトが発生しないよう、時間の経過とともにパフォーマンスと精度を監視することが重要です。

これは全体的なプロセスの概要ですが、多くのニュアンスが特定の LLM またはタスクの微調整の成功に影響を与える可能性があります。カリキュラム学習、マルチタスクの微調整、数回のプロンプトなどの戦略により、パフォーマンスをさらに向上させることができます。

さらに、効率的な微調整方法には追加の考慮事項が必要です。たとえば、LoRA では、結合レイヤーを通じて事前トレーニングされたモデルの出力を調整するなどのテクニックが必要です。プロンプト調整には、適切な動作を有効にするために慎重に設計されたプロンプトが必要です。

高度な微調整: 人間のフィードバックを組み込む

ラベル付きデータセットを使用した標準的な教師あり微調整は効果的ですが、エキサイティングなフロンティアは、人間の好みとフィードバックを直接使用して LLM をトレーニングすることです。この人間参加型アプローチでは、強化学習のテクニックが活用されています。

PPO (近位ポリシーの最適化)ここで、LLMは強化学習エージェントとして扱われ、その出力は「アクション」です。報酬モデルは、これらの出力に対する人間の評価または品質スコアを予測するように学習されます。PPOは、LLMを最適化し、報酬モデルのスコアを最大化する出力を生成します。

RLHF (人間のフィードバックからの強化学習)これはPPOを拡張し、人間のフィードバックを学習プロセスに直接組み込むことで実現します。固定報酬モデルではなく、微調整中にLLMの出力に対する人間による反復的な評価から報酬を得ます。

これらの方法では計算量が多くなりますが、静的データセットで捕捉できるものを超えて、人間が評価した望ましい特性に基づいて LLM の動作をより正確に成形できます。

Anthropic のような企業は、RLHF を使用して、Claude のような自社の言語モデルに、タスクの能力だけでなく、真実性、倫理、安全意識を向上させました。

潜在的なリスクと制限

LLM の微調整は非常に強力ですが、慎重に管理する必要があるリスクがないわけではありません。

バイアス増幅: 微調整データに性別、人種、年齢、その他の属性に関する社会的バイアスが含まれている場合、モデルはこれらの望ましくないバイアスを増幅する可能性があります。代表的で偏りのないデータセットを厳選することが重要です。

事実の乖離: 高品質のデータを微調整した後でも、言語モデルは、長い会話やプロンプトを通じて、不正確な事実やトレーニング例と矛盾する出力を「幻覚」させる可能性があります。事実の検索方法が必要になる場合があります。

スケーラビリティの課題: GPT-3 のような巨大なモデルを完全に微調整するには、膨大なコンピューティング リソースが必要ですが、多くの組織では実行不可能である可能性があります。効率的な微調整によりこの問題は部分的に軽減されますが、トレードオフもあります。

壊滅的な忘却: 完全な微調整中に、モデルは壊滅的な忘却を経験する可能性があり、事前トレーニング中に学習した一般的な機能の一部が失われます。マルチタスク学習が必要になる場合があります。

知的財産とプライバシーのリスク: 微調整に使用される独自のデータが、公開されている言語モデルの出力に漏洩する可能性があり、リスクが生じます。差分プライバシーと情報危険軽減技術は、活発な研究分野です。

全体として、微調整は非常に便利ではありますが、データ品質、ID の考慮事項、リスクの軽減、ユースケースの要件に基づくパフォーマンスと効率のトレードオフのバランスなどに注意が必要な微妙なプロセスです。

将来: 大規模な言語モデルのカスタマイズ

今後、微調整およびモデル適応技術の進歩は、さまざまなアプリケーションやドメインにわたって大規模な言語モデルの可能性を最大限に引き出すために非常に重要になります。

リソースに制約があるPaLMのような大規模なモデルでも微調整できるより効率的な方法により、アクセスが民主化される可能性があります。データセット作成パイプラインと迅速なエンジニアリングを自動化することで、専門化を合理化できる可能性があります。

ラベルのない生データから微調整する自己監視型手法により、新たな境地が開かれる可能性があります。また、さまざまなタスクやデータでトレーニングされた微調整されたサブモデルを組み合わせる構成的なアプローチにより、高度に調整されたモデルをオンデマンドで構築できる可能性があります。

最終的に、LLM がより普及するにつれて、考えられるあらゆるユースケースに合わせて LLM をシームレスにカスタマイズおよび特化できる機能が重要になります。微調整および関連するモデル適応戦略は、あらゆる領域と取り組みにわたって人間の能力を強化する、柔軟で安全かつ強力な AI アシスタントとしての大規模言語モデルのビジョンを実現するための極めて重要なステップです。

私は過去 50 年間、機械学習と深層学習の魅力的な世界に没頭してきました。 私の情熱と専門知識により、特に AI/ML に重点を置いた XNUMX を超える多様なソフトウェア エンジニアリング プロジェクトに貢献してきました。 私の継続的な好奇心は、私がさらに探求したいと思っている分野である自然言語処理にも引き寄せられました。