Open10
pythonによる機械学習入門メモ
BERT
利用するライブラリの概要
- Transformers
- Huggingface社が開発している
- BERTを始めとするさまざまなニューラルネットワークを用いた言語モデルが実装されている
- https://github.com/huggingface/transformers
- fugashi
- MecabのCythonラッパー
- https://github.com/polm/fugashi
- ipadic
- Mecab用の辞書?
- GitHubが見つからない
実行環境
Google Colaboratory
- ブラウザから実行できる
- Google Driveを開いて「新規」から選択できる
- 最初は選択できないので有効化する必要がある
- GPUの有効化ができる
- PyTorchが最初からインストールされている
- Google Driveを開いて「新規」から選択できる
トークナイザ
日本語の文章をBERTの指定するフォーマットに従ってトークン化する。あらかじめ学習済みのトークナイザが公開されているので、それを使うとトークン化ができる。
トークン化した際の##は、WordPieceによってサブワードに分割されたときの記号。
from transformers import BertJapaneseTokenizer
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
tokenizer.tokenize('明日は自然言語処理とディープラーニングの勉強をしよう')
['明日',
'は',
'自然',
'言語',
'処理',
'と',
'ディープ',
'##ラー',
'##ニング',
'の',
'勉強',
'を',
'しよ',
'う']
文章の穴埋め
BertForMaskedLMを使うことで実装できる。
以下のように、穴埋めしたいテキストを[MASK]とトークン化して利用する。
text = '今日は[MASK]へ行く。'
tokens = tokenizer.tokenize(text)
BERTによる文書分類
これをやっていく
bert_sc = BertForSequenceClassification.from_pretrained(
MODEL_NAME, num_labels=2
)
BertForSequenceClassificationクラスを使って文書分類ができる。num_labels引数で、カテゴリの下図をあらかじめ関数に入力する必要がある。
疑問点
カテゴリの数が事前にわからない場合はどうしたらいいか?
疑問点
with torch.no_grad():
output = bert_sc.forward(**encoding)
torch.no_grad()で囲むことで計算結果がメモリに保存されなくなり、効率的に計算できるとのことだが、それ自体がなぜなのかが気になる。そもそもPythonのwithの意味がわからない
コーパス
コーパスといえども、生テキストをカテゴリ別にディレクトリ別に保存したもので、1行目にURL、2行目に作成日時、3行目にタイトル、4行目に本文みたいな形式で保存したテキストファイルが実態
BERTは最大で512のトークンまでしか受け入れることができません
これって長文の扱いに向いていないってこと?
あーーーなるほど、画像系のMLで、ある画像から反転したものとか白黒にしたものを生成して学習させるのと同じ発想ね。