【AI_17日目_2回目】自然言語処理_3冊目
こんにちは投資ロウトです。
背景
AI開発ができるために自然言語処理について理解を深めていきます。
以下の記事のStep2として、「BERT・GPTモデルについての本を読む」3選が書かれているので、そちらをやっていきたいと思います。
Transformers
トークン化の流れ
①MeCabで単語を分割
②WordPieceで単語をトークンに分割
・WordPiece・・・語彙に含まれているトークンで分割する
・「##」・・・WordPieceによってサブワードに分割されたときに単語の最初の先頭以外に付与されるトークンに付与
・「[UNK]」は未知語を示す特殊トークン
・符号化・・・文章をトークン化し、それぞれのトークンをIDに変換する処理。
・BERTでデータを処理するとき・・・複数の文章をまとめて処理する必要があり、トークンの長さを揃える必要があるため、[PAD]を必要な数だけ足す必要があるとのこと。
・TransformersのBERTに入力するには、PyTorchの多次元配列を扱う型であるtorch.Tensorにしておく必要がある。
・バッチサイズ・・・まとめて処理する文章の数のこと
・BERTで推論のみを行うときは「torch.no_grad()」で囲う・・・計算の途中経過が保存されなくなり、メモリや計算時間を減らせる。
文章の穴埋め
・BertForMaskdLM・・・穴埋めを行うためのクラスで、特殊トークン「[Mask]」に入るトークンを語彙の中から予測する。
・線形変換・・・元のベクトルの成分を線形結合して新たなベクトルを生み出すの変換のこと
・GELU関数
・貪欲法・・・複数穴埋めがある場合に、一番最初にある[MASK]を最高のスコアで穴埋めし、次の[MASK]を埋めていく処理を行うこと
・BERTは自然言語処理でよくある前から順番に生成するのは得意ではないとのこと。
→[MASK]でそれを予測するような状況で学習していないからとのこと。
→GPTはトークンから次のトークンを予測する方式で事前学習を行っているとのこと。
文章分類
・文書分類・・・文章を与えられたカテゴリーに仕分けするタスク
・ネガポジ判定・・・文章に内在する感情を判定する感情分析の一つ。
・BertForSequenceClassification・・・BERTで文書分類を行うクラス
・tanh関数・・・あらゆる入力値を-1.0~1.0の範囲の数値に変換して出力する関数
・Softmax関数・・・入力データ(=ベクトル)内の複数の値(=ベクトルの各成分)を0.0~1.0の範囲の確率値に変換する関数
・株式会社ロンウィットによって公開されているコーパス等
・ColaboratoryからGoogle Driveへのアクセスはあまり早くはないとのこと。
→Colaboratoryのシステムディレクトリに配置の方が早いとのこと。
・提供データの全てを読み込ませて学習すればいいわけではなく、URLや作成日時、記事のタイトルを除外した本文だけ学習させるようにしなければならないとのこと。
・ファインチューニングや性能評価前にやること・・・データを前処理し、BERTに入力できるようにしていく必要がある。
→PyTorchではデータローダという形式にするとのこと。
・前処理・・・各データを符号化し、BERTに入力できるようにするが、BERTは最大で512のトークンまでしか受け入れることができませんとのこと。
・tqdm・・・Pythonで何かしら時間のかかる処理をする際にプログレスバーを表示するのに便利なライブラリ
・PyTorch LightningはモデルやデータをGPUに載せるコードや推論時のtorch.no_grad()のコードは書く必要がなく、自動で行ってくれるとのこと。
・ckpt・・・トレーニング中の学習している最中の一時的なデータ
・TensorBoard・・・TensorFlowやPyTorchで利用できる可視化ツール
# PyTorch Lightningモデルをロード
model = BertForSequenceClassification_pl.load_from_checkpoint(best_model_path)
# Transformers対応のモデルを./model_transformesに保存
model.bert_sc.save_pretrained('./model_transformers')
以下のエラーが発生
ValueError: You are trying to save a non contiguous tensor: `bert.encoder.layer.0.attention.self.query.weight` which is not allowed. It either means you are trying to save tensors which are reference of each other in which case it's recommended to save only the full tensors, and reslice at load time, or simply call `.contiguous()` on your tensor to pack it before saving.
ググると類似する事象あり
以下の対処を実施
# モデルのパラメータに対して連続化を行う
for param in model.parameters():
param.data = param.data.contiguous()
# GPUからCPUに移行
model = model.cpu()
# 連続化して保存
model.bert_sc.save_pretrained('./model_transformers')
結果データが保存された
と一旦以上で学習を区切りたいと思います。ご精読ありがとうございました。焦らず一歩ずつ行きたいと思います。
Discussion