第8章: ニューラルネット#

第7章で取り組んだポジネガ分類を題材として、ニューラルネットワークで分類モデルを実装する。なお、この章ではPyTorchやTensorFlow、JAXなどの深層学習フレームワークを活用せよ。

70. 単語埋め込みの読み込み#

事前学習済み単語埋め込みを活用し、\(|V| \times d_\rm{emb}\) の単語埋め込み行列\(\pmb{E}\)を作成せよ。ここで、\(|V|\)は単語埋め込みの語彙数、\(d_\rm{emb}\)は単語埋め込みの次元数である。ただし、単語埋め込み行列の先頭の行ベクトル\(\pmb{E}_{0,:}\)は、将来的にパディング(<PAD>)トークンの埋め込みベクトルとして用いたいので、ゼロベクトルとして予約せよ。ゆえに、\(\pmb{E}\)の2行目以降に事前学習済み単語埋め込みを読み込むことになる。

もし、Google Newsデータセットの学習済み単語ベクトル(300万単語・フレーズ、300次元)を全て読み込んだ場合、\(|V|=3000001, d_\rm{emb}=300\)になるはずである(ただ、300万単語の中には、殆ど用いられない稀な単語も含まれるので、語彙を削減した方がメモリの節約になる)。

また、単語埋め込み行列の構築と同時に、単語埋め込み行列の各行のインデックス番号(トークンID)と、単語(トークン)への双方向の対応付けを保持せよ。

71. データセットの読み込み#

General Language Understanding Evaluation (GLUE) ベンチマークで配布されているStanford Sentiment Treebank (SST) をダウンロードし、訓練セット(train.tsv)と開発セット(dev.tsv)のテキストと極性ラベルと読み込み、全てのテキストをトークンID列に変換せよ。このとき、単語埋め込みの語彙でカバーされていない単語は無視し、トークン列に含めないことにせよ。また、テキストの全トークンが単語埋め込みの語彙に含まれておらず、空のトークン列となってしまう事例は、訓練セットおよび開発セットから削除せよ(このため、第7章の実験で得られた正解率と比較できなくなることに注意せよ)。

事例の表現方法は任意でよいが、例えば”contains no wit , only labored gags”がネガティブに分類される事例は、次のような辞書オブジェクトで表現すればよい。

{'text': 'contains no wit , only labored gags',
 'label': tensor([0.]),
 'input_ids': tensor([ 3475,    87, 15888,    90, 27695, 42637])}

この例では、textはテキスト、labelは分類ラベル(ポジティブならtensor([1.])、ネガティブならtensor([0.]))、input_idsはテキストのトークン列をID列で表現している。

72. Bag of wordsモデルの構築#

単語埋め込みの平均ベクトルでテキストの特徴ベクトルを表現し、重みベクトルとの内積でポジティブ及びネガティブを分類するニューラルネットワーク(ロジスティック回帰モデル)を設計せよ。

73. モデルの学習#

問題72で設計したモデルの重みベクトルを訓練セット上で学習せよ。ただし、学習中は単語埋め込み行列の値を固定せよ(単語埋め込み行列のファインチューニングは行わない)。また、学習時に損失値を表示するなど、学習の進捗状況をモニタリングできるようにせよ。

74. モデルの評価#

問題73で学習したモデルの開発セットにおける正解率を求めよ。

75. パディング#

複数の事例が与えられたとき、これらをまとめて一つのテンソル・オブジェクトで表現する関数collateを実装せよ。与えられた複数の事例のトークン列の長さが異なるときは、トークン列の長さが最も長いものに揃え、0番のトークンIDでパディングをせよ。さらに、トークン列の長さが長いものから順に、事例を並び替えよ。

例えば、訓練データセットの冒頭の4事例が次のように表されているとき、

[{'text': 'hide new secretions from the parental units',
  'label': tensor([0.]),
  'input_ids': tensor([  5785,     66, 113845,     18,     12,  15095,   1594])},
 {'text': 'contains no wit , only labored gags',
  'label': tensor([0.]),
  'input_ids': tensor([ 3475,    87, 15888,    90, 27695, 42637])},
 {'text': 'that loves its characters and communicates something rather beautiful about human nature',
  'label': tensor([1.]),
  'input_ids': tensor([    4,  5053,    45,  3305, 31647,   348,   904,  2815,    47,  1276,  1964])},
 {'text': 'remains utterly satisfied to remain the same throughout',
  'label': tensor([0.]),
  'input_ids': tensor([  987, 14528,  4941,   873,    12,   208,   898])}]

collate関数を通した結果は以下のようになることが想定される。

{'input_ids': tensor([
    [     4,   5053,     45,   3305,  31647,    348,    904,   2815,     47,   1276,   1964],
    [  5785,     66, 113845,     18,     12,  15095,   1594,      0,      0,      0,      0],
    [   987,  14528,   4941,    873,     12,    208,    898,      0,      0,      0,      0],
    [  3475,     87,  15888,     90,  27695,  42637,      0,      0,      0,      0,      0]]),
 'label': tensor([
    [1.],
    [0.],
    [0.],
    [0.]])}

76. ミニバッチ学習#

問題75のパディングの処理を活用して、ミニバッチでモデルを学習せよ。また、学習したモデルの開発セットにおける正解率を求めよ。

77. GPU上での学習#

問題76のモデル学習をGPU上で実行せよ。また、学習したモデルの開発セットにおける正解率を求めよ。

78. 単語埋め込みのファインチューニング#

問題77の学習において、単語埋め込みのパラメータも同時に更新するファインチューニングを導入せよ。また、学習したモデルの開発セットにおける正解率を求めよ。

79. アーキテクチャの変更#

ニューラルネットワークのアーキテクチャを自由に変更し、モデルを学習せよ。また、学習したモデルの開発セットにおける正解率を求めよ。例えば、テキストの特徴ベクトル(単語埋め込みの平均ベクトル)に対して多層のニューラルネットワークを通したり、畳み込みニューラルネットワーク(CNN; Convolutional Neural Network)や再帰型ニューラルネットワーク(RNN; Recurrent Neural Network)などのモデルの学習に挑戦するとよい。