Code Monkey home page Code Monkey logo

bert-book's Introduction

「BERTによる自然言語処理入門: Transformersを使った実践プログラミング」

こちらは、「BERTによる自然言語処理入門: Transformersを使った実践プログラミング」、(編) ストックマーク株式会社、(著) 近江 崇宏、金田 健太郎、森長 誠 、江間見 亜利、(オーム社)のサポートページです。

誤植

誤植はこちらのページにまとめられています。誤植を見つけられた方は、issueを立ててご連絡いただければ幸いです。

エラー

  • 本書では東北大学が開発した事前学習済みのBERTを利用していますが、Hugging Face Hubでのモデルの保存場所が変更されたことに伴い、一部のコードを変更する必要があります。現在、GitHubで公開されているノートブックファイルではこの対応が既に反映されています。詳しくはこちらをご覧ください。

  • コードブロック#6-3, #7-3, #8-3, #9-3で生じるエラーに関してはこちらをご確認ください。現在、GitHubで公開されているノートブックファイルではこの対応が既に反映されています。

コード

本書は、Googleの無料の計算環境であるColaboratoryを利用して、コードを実行することを想定していますが、AWSの無料の計算環境であるAmazon SageMaker Studio Labを利用することもできます(事前のメールアドレスによる登録が必要です)。Colaboratoryの基本的な使い方は本書の付録を、SageMaker Studio Labの使い方はこちらをご覧ください。

以下のボタンから、それぞれの計算環境で各章のNotebookを開くことができます。

Chapter Google Colaboratory Amazon SageMaker Studio Lab
4 Open In Colab Open In SageMaker Studio Lab
5 Open In Colab Open In SageMaker Studio Lab
6 Open In Colab Open In SageMaker Studio Lab
7 Open In Colab Open In SageMaker Studio Lab
8 Open In Colab Open In SageMaker Studio Lab
9 Open In Colab Open In SageMaker Studio Lab
10 Open In Colab Open In SageMaker Studio Lab

なおSageMaker Studio Labを用いる場合には、いずれかのNotebookの冒頭で

!pip install torch==1.9 matplotlib pandas 

によりライブラリの追加インストールを行なってください。

bert-book's People

Contributors

hariby avatar kaibadash avatar nnabeyang avatar omitakahiro avatar po3rin 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  avatar

bert-book's Issues

第7章のマルチラベル分類のBERTモデルについて

書籍ではBertModelを利用した自作モデルを実装していますが、2023年現在ではBertForSequenceClassificationにてproblem_type="multi_label_classification"を指定するとマルチラベル分類ができるようです。

self.bert_scml = BertForSequenceClassification.from_pretrained(
    model_name, num_labels=num_labels, problem_type="multi_label_classification"
)

p.83 training_step と train_step

コードスニペット内ではtraining_stepとなっていますが、文章中ではtrain_stepとして参照されています。

【第二章】CBOWについて(p.19〜20)

"i"及び"j"という添字について少し混乱してしまったので教えて下さい。
以下の理解で問題ないでしょうか? 

①添字"i"は「ある文において登場する単語の順番」に相当する数字。よって、取り得る値の範囲は1≦i≦n(文の長さ)となる。
②添字"j"は「語彙に対して一意に割り当てられた」数字。よって、取り得る値の範囲は1≦j≦N(語彙数)となる。
※但し、「Wj」として表記した場合に取り得るのは、推定対象単語の周辺単語のみ(WjはCiの要素)。一方で、「Sj」と表記した場合に取り得るのは語彙全て。

つまり、例えばですが、i=3の単語Wi(=文の中で3番目に出て来た単語)とj=100の単語Wj(=語彙の中で100番目のIDが割り振られた単語)が、同じ単語を示していることがあり得る、との理解で構わないでしょうか?

タイポ

P36 3.2.1「トークン化」の第一段落の5行目

受け入れるられる

受け入れられる

同じく3.2.1「トークン化」第二段落3行目

末尾にに

末尾に

が正しいかと思います.

【第8章】encode_plus_untagged関数のtorch.Tensor変換について

encode_plus_untagged関数で、最後にtorch.Tensorに変換する部分ですが、以下のように修正すべきではありませんか?

encoding = { k: torch.tensor([v]) for k, v in encoding.items() }

↓修正後

encoding = { k: torch.tensor(v) for k, v in encoding.items() }

torch.Tensorに変換する前にリスト化することで、encode_plus_untagged関数の返り値の要素であるinput_idsなどの値は「2次元Tensor」になっています。
その一方、encode_plus_tagged関数の返り値の要素であるinput_idsなどは値が「1次元Tensor」になっています。
性能評価もバッチ処理にて行うべくコードを書いている中で、encode_plus_untagged関数の返り値を使用してデータローダを作ろうとした際、input_idsなどの値が3次元のTensorになってしまい、BERTへ入力できないという問題が生じました。encode_plus_untagged関数のほうだけ、input_idsなどの値を2次元Tensorにしなくてはならない特別な理由がない限り、バッチ処理も想定して1次元Tensorにすべきと考えます。

【第8章】encode_plus_untagged関数の分割箇所について

encode_plus_untagged関数では、encode_plus_tagged関数のように固有表現の周りで必ず文章が分割されるような処理をしていないので、P.116で問題として挙げられている、"「みらい事務所」の前の「の」と「み」が誤って連結される"などの問題が生じるように思います。
この点について、推論時は仕方ないものとして諦めるしかないのでしょうか?
(encode_plus_untagged関数実行時は当然位置情報が与えられないので手段はないと思いますが…)

再現性の担保(Chapter6)に関して

お世話になっております。
Chapter 6に関してご質問がございます。

p73に関して,ランダムな値が分類期に割り当てられているため,結果が異なるとありますが,こちらはどのように再現性を担保したら良いかご教授頂けると幸いです。

以下私が取り組んだものになりますが,

from transformers.trainer_utils import set_seed

# 6-4
seed=0
set_seed(seed)
torch.cuda.manual_seed_all(seed)
tokenizer = BertJapaneseTokenizer.from_pretrained(MODEL_NAME)
bert_sc = BertForSequenceClassification.from_pretrained(
    MODEL_NAME, num_labels=2
)
bert_sc = bert_sc.cuda()

%%time
# 6-5
text_list = [
    "この映画は面白かった。",
    "この映画の最後にはがっかりさせられた。",
    "この映画を見て幸せな気持ちになった。"
]
label_list = [1,0,1]

# データの符号化
encoding = tokenizer(
    text_list, 
    padding = 'longest',
    return_tensors='pt'
)
encoding = { k: v.cuda() for k, v in encoding.items() }
labels = torch.tensor(label_list).cuda()

# 推論
with torch.no_grad():
    output = bert_sc.forward(**encoding)
scores = output.logits # 分類スコア
labels_predicted = scores.argmax(-1) # スコアが最も高いラベル
num_correct = (labels_predicted==labels).sum().item() # 正解数
accuracy = num_correct/labels.size(0) # 精度

print("# scores:")
print(scores.size())
print("# predicted labels:")
print(labels_predicted)
print("# accuracy:")
print(accuracy)

としたところ再現性は担保できるようになりましたが,seedの値を変えても

# predicted labels:
tensor([1, 1, 1], device='cuda:0')

と全て同じ値となり,再現性の取り方について疑問を感じたため質問させていただきました。
何卒よろしくお願いいたします。

P.121 タイポ BertForToeknClassification

BertForToeknClassification -> BertForTokenClassification と思われます。

同じタイポが3箇所あります。
本文の3行目と4行目、及び図8.2のキャプションです。

P.25 h_i -> y_i

P.25の説明で、何箇所かある出力y_iはすべてh_iかと思います。

typo p.118/p.128

タイポのレポートです。第1版 第1刷です。

1箇所目

p.118 L.3
「Tencent Holdings Limited」 -> 「Tencent Holdings Ltd」

2箇所目

p.128 L.15
〜再現率は下がってしまします。 -> 〜再現率は下がってしまいます。

p.58

上から2行目
誤:なにかを予測する」というというタスクを用いて、
正:なにかを予測する」というタスクを用いて、

[第9章] 誤字訂正のやり方について

こんにちは。現在第九章のところは誤変換のエラータイプに対して、fine-tuningを介して修正できるようになっていると存じております。誤字、脱字の場合を対応できるようには、プログラムをどう修正すればよいのでしょうか。
それに関する資料を見つからずこちらで質問させていただきました。
恐縮ですが、ご教授いただければ幸いです。どうぞよろしくお願いいたします。

【第6章】Pytorch Lightningの関数定義について(p.82〜83)

p.82〜83で実装している3つの関数training_step、validation_step、test_stepはそれぞれ引数として「batch」と「batch_index」の2つを受け取るようになっています。

その一方で、今回の学習において与えるデータは、データローダから取り出した段階では「batch_index」に相当するものが無いように思います。

「batch」に相当するデータのみを使ってtraining_step関数を実行してしまうと、普通は"missing 1 required positional argument"のような、必要な位置引数が不足していることを示すエラーを吐くと思うのですが、Pytorch Lightningではこの点をどのように扱っているのでしょうか?

trainer.fit()の実行時に「batch_index」に相当するデータが作られ、training_step関数に渡される?など色々考えて自分でも調べてみたのですが答えが見つからず、ご教示頂ければ助かります。

P.12 図2.1のReLU

P.12の図2.1(b)のReLUにおいて、x < 0でのyの値が0ではなく0より少し小さな値になっています。

pytorch_lightningのimport時のエラーについて

pytorch_lightningのimport時のエラーについて、最新のGitHubのコードを用いても解決できない場合はPythonまたはpytorchのバージョンが原因でしょうか?

それぞれのバージョン
python 3.7.13
pytorch 1.8.1

大変恐縮ではありますが、ご回答いただけると幸いです。

p27 損失関数

「次の損失関数、」とありますが、式自体は尤度関数になっているようです。

論文の該当箇所を確認しましたが、

Our formulation jointly maximizes the log
likelihood of the forward and backward directions:

とありましたので、「損失関数」を「(対数)尤度関数」に変更する、もしくは「損失関数」の表記のままで式にマイナス記号をつけるのが適切ではないかと思いました。

p.48 タイポ

#4-4 の下: マシーンラーニング -> マシンラーニング

6章 BERTによる文章分類 について

6-4

tokenizer = BertJapaneseTokenizer.from_pretrained(MODEL_NAME)
bert_sc = BertForSequenceClassification.from_pretrained(
MODEL_NAME, num_labels=2
)
bert_sc = bert_sc.cuda()

を実行すると、以下のようなエラーが出ます。(#7-5でも同じです)
コードを改訂して頂くことは可能でしょうか?

OSError Traceback (most recent call last)
in <cell line: 2>()
1 # 7-5
----> 2 tokenizer = BertJapaneseTokenizer.from_pretrained(MODEL_NAME)
3 bert_scml = BertForSequenceClassificationMultiLabel(
4 MODEL_NAME, num_labels=2
5 )

2 frames
/usr/local/lib/python3.10/dist-packages/transformers/utils/hub.py in get_from_cache(url, cache_dir, force_download, proxies, etag_timeout, resume_download, user_agent, use_auth_token, local_files_only)
490 # If we don't have any of those, raise an error.
491 if etag is None:
--> 492 raise OSError(
493 "Distant resource does not have an ETag, we won't be able to reliably ensure reproducibility."
494 )

OSError: Distant resource does not have an ETag, we won't be able to reliably ensure reproducibility.

p.72 scoresの表示

#6-5 において、分類スコア(scores)を表示しようとしていますが、scoresのsizeを表示しています。また、コードでは"# scores:"を表示していますが、出力結果では"# size:"が出力されています。

P.37最終行

とてもわかりやすい書籍の出版ありがとうございます。
P.37の最終行にある、e^S_iですが、e^P_iの誤りではないかと思いご連絡させていただきました。
ご確認いただければと思います。

第8章 BERTjapaneseTokenizer以外を使う場合について

NER_tokenizer_BIOをmLUKETokenizerやT5Tokenizerを使った日本語言語モデルでも使用したいと思っているのですが、うまく言っていません。どうすれば適切に修正、使用ができるのでしょうか?

お忙しいところ恐縮ですがご教授いただけると幸甚です。

P.78 タイポ

1段落目の最終行で、本項をを -> 本項を

[改善]P34 の $K^T$ と P37 の $E^T$ のフォントを変更するか、注釈がほしい

  • P34 では $^T$ が(おそらく)転置行列の意味で使われている
  • P37 では $^T$ が 単に記号として使われている

意味合いが別なのに同じ表記であるため、Tのフォントを変えるか、P34のどこかにAttention の式に現れるTは(ここでのみ)転置行列の意味合いだという注釈があると良いかもしれない。

p.59 タイポ

コードブロック #5-5 コメント内 iput_ids -> input_ids

torchmetricsのバージョンアップに関連する動作不良

9/2に6章のipynbを動かしたところ、6-3でエラーが発生しました。
torchmetricsのバージョンが上がったことによる不具合のようです。6-2でtorchmetricsのバージョンを固定することでエラーが出なくなりました。

# 6-2
!pip install transformers==4.5.0 fugashi==1.1.0 ipadic==1.0.0 pytorch-lightning==1.2.7 torchmetrics==0.5.0

p.53 タイポ

本文中の num_hidden_layer -> num_hidden_layers, max_position_embedding -> max_position_embeddings

#5-8 2つ以上の[MASK]を含む文章のときに起きている問題

出力時に
今日は[MASK]へ行く。
という文章になってしまい、
[MASK]が残る原因がわからない状況です。

またトークナイザとモデルをロードしたときに
Some weights of the model checkpoint at cl-tohoku/bert-base-japanese-whole-word-masking were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']

  • This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
  • This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
    という警告文が表示されており、原因がわからないです。
    解決できる方がいましたら、助けていただきたいです。

P34 タイポ

3.1.2の1段落目の3行目で、Scale -> Scaled

P.25 タイポ

P.25の最後から2行目で、h_i計算する際 -> h_i計算する際

P46 タイポ

4-2のコードブロック内で、BertJapanese-Tokenizer -> BertJapaneseTokenizer

p.179 タイポ

p.179の中段、 「アルゴリズムをを」->「アルゴリズムを」。

p36 タイポ

  1. Feedforward Networkの2行目で、
    Layer Normalizationであるべきところが「Layer Normalizatin」になっています。

P.28 図2.6(a)がない

P.28の一行目にて、図2.6(a)を参照していますが、図2.6の中に(a)が見当たらないように思います。

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.