DistilBERT:BERTの蒸留バージョン
DistilBERT は、BERT の小型・高速・蒸留バージョンとして導入された。BERTの言語理解能力の97%を維持しながら、40%の小型化と60%の高速化を実現している。
シリーズ全体を読む
- BGE-M3とSplade: スパース埋め込みを生成する2つの機械学習モデルの探究
- SPLADEスパース・ベクターとBM25の比較
- ColBERTの探求:効率的な類似検索のためのトークン・レベルの埋め込みとランキング・モデル
- UnstructuredとMilvusによるEPUBコンテンツのベクトル化とクエリ
- バイナリ・エンベッディングとは?
- RAGアプリケーションのためのウェブサイト・チャンキングと埋め込み入門ガイド
- ベクトル埋め込み入門:ベクトル埋め込みとは何か?
- 画像検索のための画像埋め込み:詳細な説明
- OpenAIのテキスト埋め込みモデルを使うための初心者ガイド
- DistilBERT:BERTの蒸留バージョン
- ベクトル量子化のパワーを解き放つ:効率的なデータ圧縮と検索のテクニック
変換器ベースの言語モデル](https://zilliz.com/glossary/transformer-models)の進歩は、自然言語処理(NLP)を大きく変えた。BERT、すなわち双方向エンコーダ表現変換器は、2018年に登場した最も影響力のある言語モデルの一つである。その双方向性はテキストを両方向から読み取るため、テキストを一方向にのみ処理する以前のモデルとは異なる。このため、BERTはさまざまなNLPタスクで最先端の結果を達成している。
しかし、BERTの大きな欠点は、リソースを大量に消費することである。BERTの基本モデルには1億1,000万個のパラメータがあり、より大きなバージョンには3億4,000万個のパラメータがあります。エッジデバイス](https://zilliz.com/blog/unstructured-data-processing-from-cloud-to-edge)上でのBERTの訓練と展開には、多くのメモリと計算リソースが必要です。
これらの問題を克服するために、DistilBERT は、BERTのより小さく、より高速で、蒸留されたバージョンとして導入されました。これは、BERT の言語理解能力の 97%を維持しながら、40%の小型化と 60%の高速化を実現している。この記事では、訓練アプローチとその結果を含め、DistilBERT 開発で使用された方法論について説明する。また、Hugging FaceでDistilBERTを実装する方法も紹介する。
DistilBERTとは?
DistilBERTは、より小さく、より高速な汎用言語表現モデルを事前学習します。
DistilBERTの背後にある主な動機は、エッジデバイス上でリアルタイムに動作するNLPアプリケーションのためのコンパクトでより効率的なモデルの必要性です。BERTのような言語モデルは、多くの場合、かなりの計算資源を必要とするため、リソースに制約のある環境での展開が制限されます。
これらの課題に対処するため、DistilBERT は以下の主要な目標に焦点を当てています:
計算効率:**** BERT は、その多数のパラメータのために動作に多くの計算リソースを必要としますが、****DistilBERT は、BERT モデルのサイズを 40% 削減します。計算量と時間が少なくて済むため、大規模なデータセットを扱う場合に特に有効です。
より速い推論速度:** BERTの複雑さは、推論時間の遅さにつながります。DistilBERTは、BERTと比較してより小さく、スピードのために最適化され、60%より速い推論時間を与えることによって、この問題に対処しています。モバイル質問応答アプリのようなデバイス上のアプリケーションでは、DistilBERTはBERTよりも71%高速です。
比較可能なパフォーマンス: DistilBERTははるかに小さいですが、一般的なNLPベンチマークにおけるBERTの精度の 97% を維持しています。このサイズ縮小と最小限の性能劣化のバランスにより、BERTに代わる確かな選択肢となっています。
DistilBERT はどのように機能するのか?
DistilBERTモデルが性能を犠牲にすることなく大幅な効率向上を実現するための基礎となる方法論を理解することは重要です。
DistilBERTの主要な方法論は以下の通りである:
知識の蒸留
トリプルロス機能
アーキテクチャの変更
知識蒸留
Hinton et al. in 2015](https://arxiv.org/abs/1503.02531)によって導入された知識蒸留は、DistilBERTの背後にある圧縮とコア技術である。この技法は、より大きな、事前に訓練されたモデル(教師)からの知識を複製することによって、より小さな、より単純なモデル(生徒)を訓練する。ここでは、BERT が教師として機能し、DistilBERT が生徒となる。一般に、蒸留手順は、関連するモデルの学習中に適用されるが、微調整中にも使用することができる。
知識の蒸留を理解するための例を考えてみよう。ResNet-50](https://zilliz.com/blog/combine-ai-models-for-image-search-using-onnx-and-milvus)のような、大規模な、最先端の画像分類モデルが、大規模なデータセットで学習されているとする。このモデルを教師ネットワークとして使うことができる。ここで、精度を犠牲にすることなく、スマートフォンのようなリソースに制約のあるデバイスに、より小さなモデルを導入したいと思います。知識の蒸留によって、MobileNetのような小さな生徒ネットワークを訓練することができます。
生徒ネットワークは教師ネットワークのソフト確率から学習し、生徒の予測分布間のクロスエントロピーを最小化する。ソフト確率は、ハードな離散クラス予測に変換する前のモデルの出力確率を指す。これにより、パフォーマンスが向上し、メモリと計算の必要性が削減される。
図:教師-生徒モデルの知識蒸留](https://assets.zilliz.com/Figure_Teacher_student_model_knowledge_distillation_c309acdc2a.png)
この図では、教師ネットワークは生徒ネットワークにソフトな確率を与えて訓練する。これにより、生徒ネットワークはよく学習し、教師ネットワークの振る舞いを再現することができる。
知識蒸留における三重損失関数
DistilBERT の知識蒸留プロセスは、三重損失関数を使用します。この損失関数は、生徒モデル(DistilBERT)が教師モデル(BERT)の知識とパターンから学習するのを助ける。しかし、損失関数について詳しく説明する前に、ソフトマックス温度(ソフトマックス関数の温度)の概念を理解する必要がある。このハイパーパラメータは教師モデルの出力確率の滑らかさを制御する。
我々は通常、標準的なニューラルネットワークにおいて、モデルの出力スコアを確率に変換するためにソフトマックス関数を使用します。ソフトマックス関数は次のように定義されます:
ソフトマックス(z)=f(zi)= exp(z) / sum(exp(z))
ただし、ソフトマックス温度は、標準的なソフトマックス関数にわずかなバリエーションを導入し、ソフトマックス関数を適用する前に、モデル出力を↪L_1D447↩(温度)で割ります。これは生徒モデルの難易度を下げるために行われます。教師が学習した確率分布は、しばしば0または1に非常に近く、生徒が学習するのが難しくなるからです。ソフトマックス温度の公式は
ソフトマックス(zi, T)=f(zi, T)= exp(z/T) / sum(exp(z/T))
温度 ↪Lu_1D447 は確率分布の滑らかさを制御します:
↪Lu_1D447 = 1のとき、これは標準的なソフトマックスと等価です。
↪Lu_1D447 > 1のとき、出力確率はより滑らかになります。
↪Lu < 1のとき、出力確率分布はより荒くなります。
言い換えれば、温度が高いほど確率分布は滑らかになる。
図:温度𝑇に基づいて異なる確率分布を生成するニューラルネットワークの図](https://assets.zilliz.com/Figure_Illustration_of_a_neural_network_producing_different_probability_distributions_based_on_the_temperature_9fb5942c11.png)
では、DistilBERT で使用される損失関数を 1 つずつ見ていこう。これらの関数は、DistilBERT が BERT から学習し、その重みを更新するのに役立つ。
マスク言語モデリング損失 Lmlm
蒸留損失 Lce
コサイン埋め込み損失 Lcos
マスク言語モデリング損失 (MLM)
BERT と同様、DistilBERT は、マスク言語モデリング(MLM)と呼ばれる技法を使用して言語パターンを 学習する。MLM では、文中の特定の単語がランダムに特別なトークンに置き換えられ、モデルは周囲のコンテキストに基 づいてこれらのマスクされた単語を予測するように学習する。
予測された分布と実際の分布の間のクロスエントロピー損失が計算され、バックプロパゲーションによって生徒のモデルの重みが更新される。
図:マスク言語モデリングの損失計算の説明](https://assets.zilliz.com/Figure_Illustration_of_Masked_language_modeling_loss_calculation_75c02e8ca4.png)
蒸留損失
Distillation lossは、知識蒸留中に生徒モデルを訓練する際に不可欠である。これは、生徒の予測確率と教師モデルによって提供されるソフト確率を比較することによって計算される。
Lce= iti*log(si)
ここで、tiは教師が推定した確率、siは生徒が推定した確率である。
生徒モデルの学習に生徒の損失のみを使用することは技術的には可能ですが、温度 𝑇 を1に設定した場合、ソフトマックス変換のため、生徒の損失のみに依存することは最適ではありません。↪Lu_1 = 1のとき,得られる確率分布は非常に偏り,1つのラベルは1に近い非常に高い確率を持つが,他のすべてのラベルの確率は0に近づく.
この問題に対処するため、DistilBERTは蒸留損失を使用し、ソフトマックスの確率は温度𝑇 > 1で計算される。この変更により、出力確率がより均等になり、学生モデルが複数の可能性のある答えを考慮するのに役立ちます。
図:蒸留損失計算の説明](https://assets.zilliz.com/Figure_Illustration_of_Distillation_loss_calculation_874c06bd64.png)
コサイン埋め込み損失
コサイン埋め込み損失は、DistilBERTの学習プロセスで使用されるもう一つの重要なコンポーネントである。その主な目的は、生徒モデルと教師モデルによって生成された埋め込み間のコサイン距離を最小化することによって、生徒モデルが教師モデルの内部知識表現(embeddings)を複製することを学習することを保証することである。
余弦類似度](https://zilliz.com/blog/similarity-metrics-for-vector-search)は、教師と生徒の生成した埋め込み(h)間の余弦類似度の負の値として計算されます。
Lcos= 1 - hteacher . hstudenthteacher hstudent
図:コサイン埋め込み損失計算](https://assets.zilliz.com/Figure_Cosine_embedding_loss_calculation_45465360c6.png)
トリプルロス
最後に、DistilBERTの損失関数は、3つの損失関数の線形結合を加算することによって決定される。損失値に基づいて、スチューデントモデルはその重みを更新するためにバックプロパゲーションを受ける。
損失 = Lmlm+ Lce+ Lcos
図:DistilBERT損失関数](https://assets.zilliz.com/Figure_Distil_BERT_loss_function_61e774bfd1.png)
DistilBERTアーキテクチャ
学生モデルのDistilBERTは、BERTと同じ一般的なアーキテクチャを持つが、いくつかの変更が加えられている。トークン型embeddingsとプーラーは削除され、層数は 2 分の 1 に減らされた。BERT Base には 12 の層があるが、DistilBERT には 6 しかない。これらのアーキテクチャの変更により DistilBERT はより効率的になり、次に説明するように、訓練中にさらなる改良が加えられた。
生徒の初期化:** DistilBERTの訓練で重要なのは、生徒モデルがうまく学習できるように、生徒モデルを初期化する方法を決定することである。BERT (教師) と DistilBERT (生徒) は同じ次元を共有しているため、生徒の初期化は教師モデルから 2 層中 1 層を取り出します。
蒸留:** DistilBERTは、動的マスキングを使用して、非常に大きなバッチ(バッチあたり最大4K例)で蒸留された。次文予測(NSP)の目的は、モデルが各文中のマスクされた単語を理解することに集中できるように削除された。このコンセプトはRoBERTaから採用され、よりロバストな性能を提供する。
DistilBERTは、オリジナルのBERTモデルと同じデータセット、English Wikipedia (2500Mワード)とToronto Book Corpus (800Mワード)を連結したもの、および8つの16GB V100 GPUで約90時間訓練された。
BERT BASEとDistilBERTモデルのアーキテクチャ図](https://assets.zilliz.com/Diagram_of_BERT_BASE_and_Distil_BERT_model_architecture_facb5e7639.png)
実験結果
DistilBERTの言語理解と汎化能力は、自然言語理解システムを評価するための9つのデータセットからなるGeneral Language Understanding Evaluation (GLUE)ベンチマークで評価された。DistilBERTの性能は、センチメント分類(IMDb)***や質問応答タスク(SQuAD v1.1 - Stanford Question Answering Dataset)などの下流タスクでも評価されました。
GLUE
図:GLUEベンチマークのデータセット比較](https://assets.zilliz.com/Figure_Comparison_of_the_dev_sets_of_the_GLUE_benchmark_98148c1ef8.png)
DistilBERTは、GLUEベンチマークで77.0のスコアを達成し、GLUEの作者によって提供されたELMoベースラインと常に同等か、それよりも向上しています(STS-B - Semantic Textual Similarity Benchmarkで最大19ポイントの精度)。DistilBERTもBERTと比較し、40%少ないパラメータで97%の性能を維持しています。
IMDb & SQuAD
図:DistilBERTはダウンストリームタスクで同等の性能をもたらす](https://assets.zilliz.com/Figure_Distil_BERT_yields_comparable_performance_on_downstream_tasks_b96297dd06.png)
DistilBERT は、ダウンストリームタスクにおいて BERT と同等の結果を達成した。IMDb ベンチマークのテスト精度では、BERT にわずか 0.6%劣っていますが、その一方で 40%小さくなっています。SQuADでは、DistilBERTは完全なBERTの3.9ポイント以内です。
サイズと推論速度
図:DistilBERT推論時間とモデル・パラメータ](https://assets.zilliz.com/Figure_Distil_BERT_inference_time_and_model_parameters_7c22057079.png)
DistilBERT は、BERT よりパラメータ数が 40%少なく、BERT より 60%高速である。両モデルのパラメータ数と推論時間は、STS-B 開発セット上で、CPU 上でバッチサイズ 1 を使用して比較された。
ハギングフェースによるDistillBERTの実装
DistilBERTは、Hugging Face Transformersライブラリを使用してPythonで実装することができます。以下はDistilBERTの実装手順です。以下のコードはHuggingFaceのものです。
ステップ1:Transformersライブラリのインストール
Transformersライブラリはpipを使ってインストールできます。ターミナルを開き、以下のコマンドを入力します。
pip install transformers
ステップ2: 事前学習されたDistilBERTモデルをロードする
DistilBertForSequenceClassification_クラスを使用して、事前にトレーニングされたDistilBERTモデルをロードできます。
# ライブラリのインポート
インポート torch
from transformers import AutoTokenizer,DistilBertForSequenceClassification
#トークナイザと学習済みモデルをロードする
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
model = DistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
ステップ3:入力テキストをトークン化する
tokenizer_関数を使用して入力テキストをトークン化します。
Input_text = "こんにちは、私の犬はかわいいです"
# 入力テキストをトークン化する
inputs = tokenizer(Input_text, return_tensors="pt")
ステップ4:入力テキストに対する事前学習済みモデルを使った推論
最後に、モデルの出力ロジットのargmaxを取ることで予測ラベルを得る。
torch.no_grad()を使う:
logits = model(**inputs).logits
# 予測クラスIDを取得
predicted_class_id = logits.argmax().item()
特定のタスクでDistilBERTを訓練するには、出力クラスの数を設定し、適切な訓練データを提供する必要があります。次のコードはその方法を示している:
# 出力クラス数の設定
num_labels = len(model.config.id2label)
# 必要なラベル数で新しいモデルを作成する
model = DistilBertForSequenceClassification.from_pretrained(
"distilbert-base-uncased", num_labels=num_labels
)
# 損失を計算する
labels = torch.tensor([1])
損失 = model(**inputs, labels=labels).loss
このコードは、モデルが入力テキストに基づいてラベルを予測する、Hugging FaceによるSequenceClassificationのためにDistilBERTを使用する手順を示している。現在の例は分類に焦点を当てていますが、DistilBERTは、BERTのように、テキストの文脈埋め込みを生成するために使用することができる汎用の事前訓練された言語モデルです。
これらの埋め込みは、効率的なベクトル検索と意味検索のために設計された、MilvusやZilliz Cloudのようなベクトルデータベースに格納することができる。ベクトル・データベースは、高次元のベクトルを扱うために最適化されており、検索拡張世代(RAG)システム、AIチャットボット、レコメンデーション・エンジン、自然言語処理アプリなど、多くの最新のAIアプリケーションに最適である。
結論
DistilBERTは、様々なNLPタスクで同等の性能を維持しながらモデルを大幅に圧縮することで、BERTを進歩させる大きな一歩を踏み出した。さらに、わずか 207 MB であるため、リソースの限られたデバイスへの統合が非常に容易になりました。知識蒸留が主要な手法である一方で、DistilBERTは、さらに効率を高めるために、量子化や刈り込みアルゴリズムのような手法によってさらに圧縮することができます。
その他のリソース
DistilBERT論文:BERTの蒸留版
DistilBERT GitHubリポジトリ](https://github.com/huggingface/swift-coreml-transformers)
BERT (Bidirectional Encoder Representations from Transformers)とは](https://zilliz.com/learn/what-is-bert)
RoBERTa: 自己教師付き自然言語処理システムの事前学習のための最適化手法](https://zilliz.com/blog/roberta-optimized-method-for-pretraining-self-supervised-nlp-systems)
ベクトルデータベースとは何か、どのように機能するか](https://zilliz.com/learn/what-is-vector-database)
Retrieval Augmented Generation (RAG)によるAIアプリの構築](https://zilliz.com/learn/Retrieval-Augmented-Generation)
ジェネレーティブAIリソースハブ|Zilliz](https://zilliz.com/learn/generative-ai)
トランスフォーマーモデルとは](https://zilliz.com/glossary/transformer-models)
MilvusとOpenAIによるセマンティック検索](https://www.google.com/search?q=semantic+search+Zilliz&sca_esv=4d75a1f392f2e349&sca_upv=1&rlz=1C1JJTC_en-GBPK1104PK1104&sxsrf=ADLYWIJHm5QG1ryd070A9ih-2JAzKIps6w%3A1726862028229&ei=zNLtZtXQDar2i-gPg7mdkQw&ved=0ahUKEwjV5pKuptKIAxUq-wIHHYNcJ8IQ4dUDCA8&uact=5&oq=semantic+search+Zilliz&gs_lp=Egxnd3Mtd2l6LXNlcnAiFnNlbWFudGljIHNlYXJjaCBaaWxsaXoyBBAjGCcyCBAAGIAEGKIEMggQABiABBBDIIEAAYgAQYogQyCBAAGIAEGKIEMggQABiABBiiBEj3CVDtAVj2BXABeACQAQCYAb8CoAHyBqoBBTItMi4xuAEDyAEA-。AEC-AEBmAIDoAKFBcICChAAGLADGNYEGEfCAgcQIxiwAhgnmAMAiAYBkAYFkgcHMS4wLjEuMaAHwA0&sclient=gws-wiz-serp)
意味的類似性とは](https://zilliz.com/glossary/semantic-similarity)
読み続けて

BGE-M3とSplade: スパース埋め込みを生成する2つの機械学習モデルの探究
このブログでは、ベクトル埋め込みという複雑な世界を旅し、BGE-M3とSpladeがどのように学習されたスパース埋め込みを生成するのかを探ってきました。

バイナリ・エンベッディングとは?
このブログでは、バイナリ埋込みのコンセプトを紹介し、その特徴、利点、他の埋込みタイプとの比較のメリットを説明します。

RAGアプリケーションのためのウェブサイト・チャンキングと埋め込み入門ガイド
この記事では、ウェブサイトからコンテンツを抽出し、RAGアプリケーションのLLMのコンテキストとして使用する方法を説明します。しかし、その前にウェブサイトの基礎を理解する必要があります。