10/18/2020, 12:26:13 PM - 94 days ago
前回の記事に引き続き入門していく。今回は fine-tuning をすることによってタスクを解いてみる。
今回扱うデータセットは The Corpus of Linguistic Acceptability (CoLA) データセットである。このデータセットでは、各データの文章に対してそれぞれ gramatically correct か incorrect かのラベルが貼られている。
データセットには様々な長さの文章が含まれているが、BERT ではこれをどう扱えばよいのだろうか?
BERT には以下の制約がある。
Padding は [PAD]
というトークンを使って行われる(これは BERT の vocabulary の 0 番目にあたる)。加えて、各トークンが [PAD]
であるか否かに応じて Attention Mask の値が変わる([PAD]
であれば 0 になる)。
ちなみに、元の記事の内容は微妙に古く、今では tokenizer.encode
関数で padding も truncation もできるようだ。
# MAX_LEN = 64 としてみる
input_ids = []
for sent in sentences[:10]:
encoded_sent = tokenizer.encode(
sent,
add_special_tokens=True, # default で True にはなっている
truncation=True,
padding='max_length',
max_length=64
)
input_ids.append(encoded_sent)
今回は、文書分類問題なので、BertForSequenceClassification
というモデルを使う。これは、通常の BERT モデルに線形レイヤを加えたもの。
論文の著者たちは fine-tuning に関して以下からパラメータを選ぶように推奨している。
訓練
forward()
backward()
optimizer.step()
でネットワークのパラメータを更新するEvaluation
forward()
前回同様 Google Colaboratory で再現実装したのでリンクを貼る。
https://colab.research.google.com/drive/1-DegNcYZWsXF5inC_VHN43EMhb8p5HBy?usp=sharing