AIプラットフォーム「Hugging Face」の使い方を解説

## はじめに
今回の記事は、「Hugging Face」についての話題です。Hugging Faceは、AI技術のためのプラットフォームとして知られており、AI技術の研究と開発に広く使用されています。

## Hugging Faceとは
Hugging Faceは、人工知能（AI）のモデルやデータを共有し、利用するためのオープンソースプラットフォームです。Hugging Faceは、自然言語処理の分野において特に有名であり、AIの開発者や研究者がモデルを共有し、利用するための主要な場所となっています。

Hugging Faceの主な目的は、AIコミュニティの協力と共有を促進することです。プラットフォームは、AIモデルやデータセットをユーザーがアップロードし、共有することができるようになっています。また、他のユーザーがアップロードしたモデルやデータセットを検索して利用することもできます。

Hugging Faceは、AIの開発や研究に役立つさまざまなツールを提供しています。代表的なものとしては、自然言語の分野で主に活用される「Transformers」ライブラリや、画像や音声を扱う分野に強い「Diffusers」ライブラリ、データセットを簡単に扱うことができる「Datasets」ライブラリ等があります。Hugging Faceで共有されるモデルやデータセットはこれらのライブラリに基づいており、一大プラットフォームとしての地位を築いています。

## Hugging Faceが提供するライブラリ
上でも述べた通り、Hugging Faceが提供するライブラリとして最も有名なものにTransformersがあります。ここでは、Transformersを含め自然言語処理の分野で有用なライブラリをまとめその概要を解説します。なお、[こちら](URL "https://huggingface.co/docs")からそれぞれのドキュメントを見ることもできます。

#### Transformers
Transformersの主な目的は、自然言語処理モデルを簡単に利用できるようにすることです。Transformersライブラリは、学習済みモデルの利用、新たなデータセットでの事前学習、そしてモデルの微調整を行うためのツールを提供しています。
ユーザーはこのライブラリを使って、テキスト分類、情報抽出、質問応答、テキスト生成などのタスクを容易に実行できます。また、Transformersは多数のプログラミング言語（Python、Node.js、Rustなど）に対応しており、高い拡張性と共有性を持つことが特徴です。
話題のGPTもこのTransformersがベースとなっています。

#### Tokenizers
Tokenizersは、自然言語処理におけるトークン化に用いられるライブラリです。
そもそもトークン化とは、文章やフレーズをより小さな単位「トークン」に分割するプロセスを指します。コンピュータは人間のように一度に全体の文を理解することはできません。そのため、文を個々の単語やフレーズに分割し、それぞれを個別に解析します。
Tokenizersライブラリは、様々なトークン化アルゴリズムをサポートしていることや、高速であるため大量のテキストデータを効率的にトークン化できるという特徴を持っています。

#### Datasets
Datasetsライブラリは、大規模なデータセットの処理と操作を効率的に行うためのツールです。データセットの読み込み、変換、フィルタリングなど、一般的な前処理タスクを簡単に行えるように設計されています。
Datasetsライブラリを使えば、豊富なデータセットのリポジトリに直接アクセスする能力を提供します。これには、SQuAD、GLUE、CommonVoiceといった一般的なNLPデータセット、さらに様々な言語やドメイン特定のデータセットが含まれています。
一方で、Datasetsライブラリは自分で作成したカスタムデータセットの読み込みと使用もサポートしています。これにより、特定のプロジェクトのニーズに合わせたデータセットを簡単に統合できます。
また、Datasetsライブラリはメモリ効率的です。データセット全体をメモリにロードするのではなく、データはディスク上で直接処理されます。これにより、大規模なデータセットでもコンピューティングリソースを効果的に活用することが可能となります。

## Hugging Faceを使ってみる
Hugging Faceは、以下のリンクからアクセス可能です。

https://huggingface.co/

ページ上部にある「Models」や「Datasets」といったタブからそれぞれ検索可能です。キーワード検索のほか、タスクの種類ごとに探すことも可能となっています。



ここからは、Hugging Faceから利用可能なリソースを使ってニュースの見出しから4種類に分類するモデルを作ってみます。
モデルとして「DistilBERT」を用います。DistilBERTは、BERTの精度をある程度保ちつつ大きく軽量化されたモデルです。
データセットは「ag_news」というものを用います。ag_newsは、英語で書かれたニュースの見出しとそれに対応した4種類のラベル（World, Sports, Business, Science/Technology）が与えられたデータセットです。

なお、今回の検証はGoogle Colaboratoryで行いました。

#### 1. ライブラリのインストール
以下を実行してtransformersとdatasetsのライブラリをインストールしました。
また、後々必要になるためHugging Faceが提供するaccelerateというライブラリもインストールしています。

```Python
!pip install transformers datasets
!pip install git+https://github.com/huggingface/accelerate
```
#### 2. ライブラリのインポート
必要になるライブラリをインポートします。
```Python
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
import torch
```
#### 3. データセットの準備
データセットをロードします。
また、今回は訓練データセットのサイズを小さくするために最初の10000件のデータのみを使用しています。
```Python
dataset = load_dataset("ag_news")
dataset["train"] = dataset["train"].select(range(10000))
```
#### 4. トークナイザーの設定
トークナイザーを設定し、データセットをトークン化します。
```Python
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")

def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_dataset = dataset.map(tokenize_function, batched=True)
```
#### 5. データセットの分割
データセットを訓練データとテストデータに分割します。
```Python
train_dataset = tokenized_dataset["train"]
test_dataset = tokenized_dataset["test"]
```
#### 6. 事前学習済みモデルの読み込み
DistilBERTモデルを読み込みます。
```Python
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=4)
```
#### 7. モデルの訓練
「Trainer」オブジェクトを作成し、その「train」メソッドを呼び出してモデルの訓練を行います。
```Python
training_args = TrainingArguments("test_trainer", evaluation_strategy="epoch")
trainer = Trainer(
    model=model, args=training_args, train_dataset=train_dataset, eval_dataset=test_dataset
)

trainer.train()
```
#### 8. モデルの評価
訓練されたモデルをテストデータで評価します。「Trainer」オブジェクトの「evaluate」メソッドを使って評価を行い、結果を表示します。
```Python
eval_results = trainer.evaluate()

print(f"Eval results: {eval_results}")
```

#### 実際に予測してみる
これらのコードを実行してモデルを作った上で、以下のコードを実行すると、見出しを分類してくれます。"Text"となっている部分を分類したいテキストに書き換えて実行します。

```Python
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
input_text = "Text"
input_data = tokenizer(input_text, return_tensors='pt').to(device)
outputs = model(**input_data)
predicted_class_idx = outputs.logits.argmax(-1).item()
class_dict = {0: "World", 1: "Sports", 2: "Business", 3: "Science/Technology"}
predicted_class_name = class_dict[predicted_class_idx]
print(f"The input text is classified as: {predicted_class_name}")
```

実際に分類してみる見出しは、ChatGPTを用いて各カテゴリについて3つずつ出力したものを用いました。具体的には以下のものを用います。
![スクリーンショット 2023-06-09 11.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/76f2ddf3-e04f-c3f1-750d-1b93338bcb85.png)


#### 予測結果
上で作った12個の見出しのうち、Businessの１つ目をScience/Technologyと誤解してしまった以外は正しい予測が出力されました。

## まとめ
今回はHugging Faceとそれに伴うライブラリの概要とその使い方について、具体例を交えて紹介してきました。皆様のご参考になれば幸いです。

---

NOVEL株式会社では、業務委託パートナーを募集しています。AIやLLMに興味があるエンジニアやPMの方、大歓迎です。副業としてでも問題ありませんので、ご興味を持たれた方はぜひこちらのフォームよりご応募ください。

https://forms.gle/P7JmYGFVrit1R8kH9