BERT を活用したレシピ紹介(2022年8月版)

※本記事は2022年8月31日に更新しました。
Axross Recipeを運営している松田です。
今回は、Google検索エンジンのアルゴリズムにも使われている自然言語処理技術 **BERT**モデルを解説し、BERTを活用したレシピについて紹介します。
# 自然言語処理の理解
自然言語処理（Natural Language Processing=NLP）とは、人間が互いのコミュニケーションを行うために自然に発生した言語、例えば日本語や英語などの「自然言語」と、自然言語をコンピューターに理解・処理させる一連の技術を意味する「処理」を組み合わせた言葉です。

自然言語処理のタスクは、**人の言葉の「あいまいさ」や会話の中での「意味の重複」により、人によって解釈の違いが存在**するため、画像や数値データと比べて実用化が難しいと言われていました。
# BERTの仕組み
## BERTとは
BERTとは、2018年10月にGoogle社のJacob Devlinらの論文で発表された自然言語処理（NLP）モデルです。Google検索のアルゴリズムにも使われており、長文による検索でより文脈に合った検索結果が出るようになったのはBERTのおかげです。
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620853/2f6646fa-62a4-ec1a-b93d-f77fe17bee6d.png)
BERT（Bidirectional Encoder Representations from Transformers）を和訳すると**「Transformerによる双方向のエンコード表現」となります。**BERTには、**Transformer**アーキテクチャ（構造）が組み込まれており、文書中の単語の一部を隠し、隠した単語の正体を当てるように**文章を双方向（文頭と文末）から学習** します。この学習方法により、隠した単語の後に現れる文章も予測可能で、長文であっても**「文脈から読解すること」**を可能にしました。

BERTは、機械翻訳、文書のカテゴリ分類、質問応答、文章生成などの自然言語処理タスクの課題を高い精度で解決し、8個のベンチマークタスクにおいて前SOTAを上回る、当時の最高スコアを叩き出したことで話題になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620853/8b37500a-8f33-f613-66ed-b073ff04985e.png)

下グラフは、[GLUE](https://paperswithcode.com/sota/natural-language-inference-on-qnli)のNLP技術の各項目における平均スコアの推移を示したものです。
2018年10月のBERT登場を皮切りにスコアが飛躍的に上がり、2019年ごろには数値上は、AIが人間の会話能力を超えたことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620853/a440019e-015c-0d69-d75e-ead01d2fe7c2.png)

## 近年における自然言語処理の発展
大規模言語モデル（Transformer）の登場によって、自然言語処理の実用性が一気に高まりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620853/7812c728-6b9e-b56e-3829-15c5070eb287.png)
チャットボットを例にすると、従来までのチャットボットは 一問一答で教師データを作成するFAQ型のものや、条件分岐によるシナリオ型のものしかなく、構造化させた学習データの準備や、回答率を上げるための定常的な運用が課題でした。

しかし、Transformerを組み込んだBERTを活用する場合、サンプル学習モデルによって**単語同士の類似度や重要度といった文脈を高精度で読む**ことができ、多義語や代名詞が何を指しているかまで読み取ることができます。抽象的な表現に対しても、文章のかたまりから導き出して近しい解答ができます。また、従来までは自然言語処理を行うためのラベルが付与されているデータセットは数が少なく、そのデータセットにラベルを付与する場合には多くの時間と労力を必要でしたが、BERTの場合、**ラベルの付与されていないデータセットも処理することができる**為、学習用のデータセット不足の課題を解決し、データセットを容易に準備することができます。

もう１つのBERTの特徴として、**ファインチューニングの際の汎用性の高さ**もあります。従来のタスク処理モデルは特定のタスクのみに対応しているため、対象に応じてモデルの構造の修正が求められますが、BERTの場合は、モデルの修正の必要がなく、様々なタスクに対応することが可能です。タスク処理モデルの前にファインチューニングするだけで、自然言語処理の精度を高めることができるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620853/6fcdd1e6-a3aa-3900-2823-254d027d6075.png)
## BERTの活用例
- 検索エンジン（例：Google）
- チャットボット
- 機械翻訳
- テキストデータのポジティブネガティブ分析
- 大量テキストデータの文章分類
- 大量のテキストデータの文章要約
- 稟議書の記載内容や誤字チェック
- 電子カルテの記載内容チェック

# BERTのレシピ紹介
Axrossで学べる**BERTを活用したレシピ** を11つご紹介します。
## チャットボット
### [01_BERTによる日本語QAの発話応答モデル作成レシピ](https://axross-recipe.com/recipes/118)
投稿者：[@kanikani](https://axross-recipe.com/users/670)さん

Google検索エンジンに使われている自然言語処理技術BERTをfinetuningし、QAタスクに適用する手法をPyTorchで学べるレシピです。

BERTを使って、A4紙1枚程度の日本語マニュアルの中から、日本語での質問に対する日本語の回答を探し出すモデルを作成します。

https://axross-recipe.com/recipes/118

### [02_【発展編】BERTによるQAチャットボットの学習モデル作成レシピ](https://axross-recipe.com/recipes/141)
投稿者：[@kanikani](https://axross-recipe.com/users/670)さん

Google検索エンジンに使われている自然言語処理 **BERT**と自然言語処理に特化した深層学習のフレームワーク **Transformers** を活用し、日本語QAチャットボットの学習モデルを作成するレシピです。

BERTは自然言語処理の精度が良いだけでなく、学習が容易という利点があり、金融業界を中心に各社が注目しています。

https://axross-recipe.com/recipes/141

### [03_ELECTRAでユーザからの質問に対して応答するレシピ](https://axross-recipe.com/recipes/530)
投稿者：[@Kay Hosoda](https://axross-recipe.com/users/1532)さん

ELECTRAというディープラーニングによる言語モデルを使用してユーザからの質問に応答するプログラム動かしながら学ぶことができます。

チャットボットや音声アシスタントに活用することができます。

https://axross-recipe.com/recipes/530

### [04_BERTによるQAチャットボットの作成レシピ](https://axross-recipe.com/recipes/411)
投稿者：[@Y Shimizu](https://axross-recipe.com/users/6717)さん

自然言語処理モデルの中でも人気のある「BERT」を用いて、Wikipediaのコーパスを用いてQAチャットボットを作成する方法を学びます。

コールセンター、ヘルプデスク、オペレーター支援に活用することができます。

https://axross-recipe.com/recipes/411

### [05_BERTとXLNetの精度比較を行うレシピ](https://axross-recipe.com/recipes/409)
投稿者：[@Y Shimizu](https://axross-recipe.com/users/6717)さん

自然言語処理の最新モデルである「BERT」と「XLNet」を用いて、Wikipediaのコーパスをベースに質疑応答のタスクを処理する方法を学び、その精度を比較します。

コールセンター、ヘルプデスク、オペレーター支援に活用することができます。

https://axross-recipe.com/recipes/409


## 感情予測
### [06_日本語BERT事前学習モデルを使ってMultilabel Sentiment分類器を学習するレシピ](https://axross-recipe.com/recipes/216)
投稿者：[@sb-toukou](https://axross-recipe.com/users/1542)さん

事前学習モデルを使ったマルチラベルデータの学習方法と、テキストから感情分類をするモデルの作成手法を学ぶレシピです。

Twitter APIを使ってTwitterのツイートから日本語の教師データを集めて、Hugging Faceで公開されている**BERTの事前学習モデル**使って、モデルをFinetuningし、マルチラベル問題の分類器を作成します。

https://axross-recipe.com/recipes/216

## 文章分類
### [07_日本語BERTを利用してZero-shotで文書分類するレシピ](https://axross-recipe.com/recipes/320)
投稿者：[@睦広](https://axross-recipe.com/users/278)さん

教師データに存在しないラベルを予測する「**Zero-shot Learning**」という問題設定でテキスト分類するレシピです。

自然言語処理の分野ではトップの国際会議である、ACL2020でBERTを利用したモデルが提案されました。比較的少ないコードでZero-shot Text Classificationを実装する方法を紹介します。

https://axross-recipe.com/recipes/320

### [08_フェイクニュースを検知するレシピ](https://axross-recipe.com/recipes/336)
投稿者：[@Kay Hosoda](https://axross-recipe.com/users/1532)さん

近年ディープラーニングを使った文章生成の技術が進化しており、それに対抗するためにフェイクニュースを検知する研究も盛んに行われるようになりました。

BERTベースのGraph Neural Network（GNN）用いた、**GNN-based Fake News Detection**というディープラーニングの技術を使って、フェイクニュースを検知する方法を実際にプログラム動かしながら学ぶレシピです。

https://axross-recipe.com/recipes/336

### [09_Googleが開発しているJAX用の高性能ニューラルネットワークライブラリFlaxを用いてツイート分類を行うレシピ](https://axross-recipe.com/recipes/424)
投稿者：[@petapeta](https://axross-recipe.com/users/6733)さん

**Flax**とはGoogleによるDeep Learningフレームワークです。Flaxは**TensorFlow**と比較して簡素に、柔軟に書くことができ、**huggingface**の**transformers**もv4.8.0からFlaxをサポートするようになっています。

**GPU**や**TPU**といったアクセラレーター対応による高速化を図ることができるレシピです。

https://axross-recipe.com/recipes/424

### [10_BERTを用いたネガポジ分類モデルの実装](https://axross-recipe.com/recipes/463)
投稿者：[@petapeta](https://axross-recipe.com/users/6733)さん

近年自然言語処理タスクで利用されている**BERT**について、実際にツイート情報を用いて実装、またBERTの他に**Roberta**と呼ばれるモデルも実装していき、BERTとの比較を行うレシピです。

テキストのネガポジ分類、スパムメールの分類に使用することができます。

https://axross-recipe.com/recipes/463

## 文章要約
### [11_BertSumを使った文書要約のレシピ](https://axross-recipe.com/recipes/251)
投稿者：[@Kay Hosoda](https://axross-recipe.com/users/1532)さん

文書要約技術で話題となっているBERTを応用して文書要約を行う深層学習モデル**BertSum**について、実際にプログラム動かして、最先端の文章要約性能を体感しながら学ぶレシピです。

BertSumのコンピュータによって文章から要約を生成する技術は、ニュース記事のサマリや、議事録・日報の自動生成等、様々な業務シーンに応用ができます。

https://axross-recipe.com/recipes/251

### [12_BertSum(T5)を用いてアンケートの自由記述を要約するレシピ](https://axross-recipe.com/recipes/410)
投稿者：[@Y Shimizu](https://axross-recipe.com/users/6717)さん

「BERTSum」や「T5」を用いて、自由記述アンケート回答の要約を作成します。

自然言語処理を用いた要約プログラムが作成できるようになると、様々な文章の要約が可能になります。

https://axross-recipe.com/recipes/410


### [13_類似文章を検索するAPIを作成するレシピ](https://axross-recipe.com/recipes/333)
投稿者：[@runner](https://axross-recipe.com/users/369)さん

自然言語処理の各分野で顕著な成果を挙げている深層学習モデル**BERT**を使ったマイクロサービスを作成するレシピです。具体的には、**transformer**と**flask**を使って、類似文章を検索するAPIを作成したいと思います。

BERTを用いて、文章から検索するサービスの開発に活用できます。

https://axross-recipe.com/recipes/333

## 択一問題
### [14_日本語の択一問題を解くレシピ](https://axross-recipe.com/recipes/284)
投稿者：[@su2umaru](https://axross-recipe.com/users/304)さん

rinna社の機能を用いて、択一問題を解くタスクをテーマに解説し、日本語言語モデルの発展を体感しながら学ぶレシピです。

マイクロソフトのAIチームから独立した**rinna株式会社**が、**日本語GPT-2/BERTの事前学習モデル**を開発し、オープンソース化を発表しました。rinna社が公開したHuggingFaceページでは、一般的な日本語テキストの特徴を有した高度な日本語文章の自動生成を実行できます。

https://axross-recipe.com/recipes/284

## 画像分類
### [15_BERTをImage Transformersに応用したBEiTで画像分類するレシピ](https://axross-recipe.com/recipes/499)
投稿者：[@12kaz](https://axross-recipe.com/users/7011)さん

**Microsoft Research**が2021年6月に論文発表した、Transformerベースの自己教師あり画像分類モデル**BEit**を使用してアノテーションコストを削減するレシピです。

本技術を使えば、データのラベル付けなど**アノテーション作業**に多くのコストを要するという問題解決に役に立ちます。
実務では、商品写真から商品カテゴリを分類することによる自動タグ付け等の画像分類ができるようになります。

https://axross-recipe.com/recipes/499

## 誤字チェック
### [16_BERTによる日本語の誤字をチェックするレシピ](https://axross-recipe.com/recipes/610)
投稿者：[@佐藤優](https://axross-recipe.com/users/8190)さん

BERTの内容を理解すると同時に、自動で文章校正を行うコードをを学ぶレシピです。

ディープラーニングの概要に加え、誤字チェックに活用できる技術を学ぶことができます。

https://axross-recipe.com/recipes/610


# 最後に
**[AxrossRecipe](https://axross-recipe.com/recipes)** は、エンジニアの"教育"と"実務"のギャップに着目し、「学んだが活用できない人を減らしたい」という想いで、ソフトバンク社内起業制度にて立ち上げたサービスです。

現役エンジニアによる実践ノウハウが"レシピ"として教材化されており、実際の業務に近いテーマで、動くものを作りながら学ぶことができます。

Axross：https://axross-recipe.com
公式Twitter：https://twitter.com/AxrossRecipe_SB
![アクロス広告2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620853/de2a10ed-5576-663e-7a6a-6643e92c2d93.jpeg)



プログラミングは「**習うより慣れろ、繰り返し演習すること**」が重要です。

AxrossRecipeのレシピを通して、プログラムの意味を考えながら写経（コードを実際に書き写す行為）し、実際に動くものをつくりながら学ぶことで、新たな知識の習得やスキルアップの一助になれれば幸いです。