Code Monkey home page Code Monkey logo

llm-book's Introduction

大規模言語モデル入門

大規模言語モデル入門」(技術評論社, 2023)のリポジトリです。

コード

コードはすべて Google Colaboratory で動作確認を行なっています。 コードの中で利用したデータセットや作成したモデルはHugging Face Hubにて公開しています。

⚠️ 2023/7/28 現在、MARC-ja のデータセットの配布元のリンクが切れており、書籍上の 5.2, 5.3, 5.5.4 に掲載されているコードにおいて、データセット読み込みの箇所でエラーが出る状態です。 現在問い合わせのメールを送り、復旧待機中です。

これに応じて、日本語感情分析データセットである WRIME を使用したノートブックを追加致しましたので、コードを動作させたい方はご活用ください。

節/項 Colab Link
第 1 章 はじめに 1.1 transformers を使って自然言語処理を解いてみよう
1.2 transformers の基本的な使い方
Open in Colab Link
第 2 章 Transformer 2.2 エンコーダ Open in Colab Link
第 3 章 大規模言語モデルの基礎 3.2 GPT(デコーダ)
3.3 BERT・RoBERTa(エンコーダ)
3.4 T5(エンコーダ・デコーダ)
Open in Colab Link
3.6 トークナイゼーション Open in Colab Link
第 5 章 大規模言語モデルのファインチューニング 5.2 感情分析モデルの実装 Open in Colab
Open in Colab
Link (MARC-ja)
Link (WRIME)
5.3 感情分析モデルのエラー分析 Open in Colab
Open in Colab
Link (MARC-ja)
Link (WRIME)
5.4.1 自然言語推論の実装(訓練) Open in Colab Link
5.4.1 自然言語推論の実装(分析) Open in Colab Link
5.4.2 意味的類似度計算の実装(訓練) Open in Colab Link
5.4.2 意味的類似度計算の実装(分析) Open in Colab Link
5.4.3 多肢選択式質問応答モデルの実装(訓練) Open in Colab Link
5.4.3 多肢選択式質問応答モデルの実装(分析) Open in Colab Link
5.5.4 LoRA チューニング(感情分析) Open in Colab
Open in Colab
Link (MARC-ja)
Link (WRIME)
第 6 章 固有表現認識 6.2 データセット・前処理・評価指標
6.3 固有表現認識モデルの実装
6.4 アノテーションツールを用いたデータセット構築
Open in Colab Link
第 7 章 要約生成 7.2 データセット
7.3 評価指標
7.4 見出し生成モデルの実装
7.5 多様な生成方法による見出し生成
Open in Colab Link
第 8 章 文埋め込み 8.3 文埋め込みモデルの実装 Open in Colab Link
8.4 最近傍探索ライブラリ Faiss を使った検索 Open in Colab Link
第 9 章 質問応答 9.3 ChatGPT にクイズを答えさせる Open in Colab Link
9.4.3 BPR の実装 Open in Colab Link
9.4.4 BPR によるパッセージの埋め込みの計算 Open in Colab Link
9.5 文書検索モデルと ChatGPT を組み合わせる Open in Colab Link

正誤表

本書の正誤表は以下のページで公開しています。

https://github.com/ghmagazine/llm-book/wiki/errata

リンク

llm-book's People

Contributors

ikuyamada avatar kosuke-yamada avatar ryokan0123 avatar singletongue avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

llm-book's Issues

5.5.2 勾配累積 で説明内容で参照されているコードにgradient_accumulation_stepsがない

興味深く勉強させていただいております。
p125におきまして「5.2節ではTrainingArgumentsにgradient_accumulation_stepsの値を指定して~」との記述がありますが、参照先と思われる5.2節で掲載されているTrainingArgumentsのパラメータにはgradient_accumulation_stepsが含まれていないと思います。
特に実行などに問題がないものですが、念のためご報告させていただきました。

組み込み関数anyを使った型ヒントをtyping.Anyを使うように全部置き換えたい

素晴らしい書籍をありがとうございます。
6章でBERT-CRFまで触れて非常に学びとなりましたし、他の章を読むのも楽しみにしています。

6章で見かけた型ヒントなのですが、組み込み関数のanyを型ヒントに使っています
https://github.com/ghmagazine/llm-book/blob/ca62baeda2f47af23ba79e7db84b76d6fb8abc1a/chapter6/6-named-entity-recognition.ipynb

def convert_results_to_labels(
    results: list[dict[str, any]]
) -> tuple[list[list[str]], list[list[str]]]:

この部分をmypyで型チェックすると、以下のエラーが出力されます。

error: Function "builtins.any" is not valid as a type [valid-type]

組み込み関数anyは型ヒントに使えない(=現状の型ヒントが誤り)からで、typing.Anyを使うべきと考えます。
ref: https://docs.python.org/ja/3/library/typing.html#the-any-type

from typing import Any

def convert_results_to_labels(
    results: list[dict[str, Any]]
) -> tuple[list[list[str]], list[list[str]]]:

組み込み関数anyを型ヒントに使っている箇所は6章のnotebookでは複数箇所見られました。
全9章となると使用箇所が多いかと思います。
ですが、読者が誤った型ヒントの書き方を学んでしまうのもよいことではないと思いますので、サンプルコードの型ヒントの修正をご検討いただけますと幸いです。

参考までに、上記の動作確認は

  • Python 3.10.9
  • mypy 1.2.0

でしています。

第7章の見出し語生成ができない

7.4.2でファインチューニングを行った後に以下のコードを実行するとその下のようなエラーが発生しました。

from torch.utils.data import DataLoader
from transformers import PreTrainedModel

def convert_list_dict_to_dict_list(list_dict: dict[str, list]) -> list[dict[str, list]]:
    """ミニバッチのデータを事例単位のlistに変換"""
    dict_list = []
    #dictのキーのリストを取得する
    keys = list(list_dict.keys())
    for idx in range(len(list_dict[keys[0]])):  #各事例で処理する
        #dictの各キーからデータを取り出してlistに追加する
        dict_list.append({key: list_dict[key][idx] for key in keys})
    return dict_list

def run_generation(dataloader: DataLoader, model: PreTrainedModel) -> list[dict[str, Any]]:
    """見出しを生成"""
    generations = []
    for batch in tqdm(dataloader): #各ミニバッチを処理する
        #for k, v in batch.items():print(f"batch {batch}¥n key {k}¥n item{v}¥n¥n")
        batch = {k: v.to(model.device) for k, v in batch.items()}
        #見出しのトークンIDを生成する
        batch["generated_title_ids"] = model.generate(**batch)
        batch = {k: v.cpu().tolist() for k, v in batch.items()}
        #ミニバッチのデータ事例単位のlistに変換する
        generations += convert_list_dict_to_dict_list(batch)
    return generations

#テストセットに対して前処理を行う
test_dataset = dataset["test"].map(
    preprocess_data,
    fn_kwargs={"tokenizer": tokenizer},
    remove_columns=dataset["test"].column_names,
)

test_dataset = test_dataset.remove_columns(["labels"])

#ミニバッチの作成にDataLoaderを用いる
test_dataloader = DataLoader(
    test_dataset,
    batch_size=8,
    shuffle=False,
    collate_fn=data_collator,
)

#見出しを生成する
generations = run_generation(test_dataloader, model)
AttributeError                            Traceback (most recent call last)
[<ipython-input-19-2945c01206a3>](https://localhost:8080/#) in <cell line: 45>()
     43 )
     44 # 見出しを生成する
---> 45 generations = run_generation(test_dataloader, model)

1 frames
[<ipython-input-19-2945c01206a3>](https://localhost:8080/#) in <dictcomp>(.0)
     20     generations = []
     21     for batch in tqdm(dataloader):  # 各ミニバッチを処理する
---> 22         batch = {k: v.to(model.device) for k, v in batch.items()}
     23         # 見出しのトークンのIDを生成する
     24         batch["generated_title_ids"] = model.generate(**batch)

AttributeError: 'NoneType' object has no attribute 'to'

DataLoaderの性質上、こうなってしまうようなのですが、何か解決策はありますでしょうか

第7章 llm-book/livedoor-news-corpus がダウンロードできない

from datasets import load_dataset

データセットを読み込む

dataset = load_dataset("llm-book/livedoor-news-corpus")

を実行しデータセットをHugging faceからダウンロードしようとしましたが、以下のようなエラーが発生しました。
Kaggle Notebookを利用しています。

File /opt/conda/lib/python3.10/site-packages/datasets/builder.py:480, in DatasetBuilder._info(self)
    470 @abc.abstractmethod
    471 def _info(self) -> DatasetInfo:
    472     """Construct the DatasetInfo object. See `DatasetInfo` for details.
    473 
    474     Warning: This function is only called once and the result is cached for all
   (...)
    478         info: (DatasetInfo) The dataset information
    479     """
--> 480     raise NotImplementedError

NotImplementedError: 

Windows環境で llm-book/livedoor-news-corpus を load_dataset()するとUnicodeDecodeError

発生した問題

from datasets import load_dataset
dataset = load_dataset("llm-book/livedoor-news-corpus")

を実行すると以下のエラーが発生します

File ~\.cache\huggingface\modules\datasets_modules\datasets\llm-book--livedoor-news-corpus\xxxx\livedoor-news-corpus.py:91 in (.0)
     89         continue
     90     with open(file_name, "r") as f:
---> 91         d = [line.strip() for line in f]
     92         data.append(
     93             {
     94                 "url": d[0],
   (...)
     99             }
    100         )
    102 if self.config.shuffle == True:

UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 96: illegal multibyte sequence

解決法

livedoor-news-corpus.pyの90行目を下記に修正したところ、解決しました

with open(file_name, "r", encoding="utf-8") as f:

7.3の評価指標のn-gramの説明

7.3の評価指標のn-gramの説明で、以下の説明が何回か繰り返されています。確認したのは電子版なのですが、電子版だけかもしれません。

n=のときはユニグラム(unigram)、n=のときはバイグラム(bigram)、n=のときはトライグラム(trigram)..

コードの抜け

p158のIn[27]:ですが、最後の箇所で以下の記述が抜けてないでしょうか?
if best_score < scores["f1-score"]:
best_score = scores["f1-score"] #<--(抜け)
best_model = model

同様に、p172のIn[40]:の最後の箇所ですが、
if best_score < scores["f1-score"]:
best_score = scores["f1-score"] #<--(抜け)
best_model_crf = model_crf

第9章サンプルコードのopenaiパッケージについて

  • 概要

最新のopenaiパッケージを使用すると9章のコードが動かない。コメントでどこか補足してもらうと良いかなと思いました。

  • 原因と対応策

新しいopenaiパッケージはAPIが変更されているため。

既存のコードを試しながら読む場合は意図的に古いバージョンを使用する。0.27で試して実行できることを確認しました(出力エラーを見ると0.28でも動きそう)。

!pip install datasets openai==0.27 tiktoken tqdm

  • 参考

openaiパッケージのバージョン

https://pypi.org/project/openai/#history

2.2.4 式(2.17) W_o の次元は D x D でなく、 D x MD が正しいのではないでしょうか?

概要

2.2.4 の 式(2.17) の $W_o$ の次元は $D \times D$ でなく $D \times MD$ が正しいのではないでしょうか?
$\left[ \right]$ の記法は厳密には定義されていないですが、 $M$ 個の $D$ 次元ベクトル $o_i^{(j)}$ を縦に並べるものとすると、 $W_o$$MD$ 次元のベクトルを $D$ 次元のベクトルにマッピングする行列になるので $D \times MD$ 次元であるのではないかと思いました。

image

版情報

Kindle 版で読んでいます。巻末に下記の記載がありました。

電子版発行日: 2023年7月29日 初版 第1刷発行
電子版更新日: 2023年8月1日 初版 第2刷発行

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.