第8章: ニューラルネット
第6章で取り組んだニュース記事のカテゴリ分類を題材として,ニューラルネットワークでカテゴリ分類モデルを実装する.なお,この章ではPyTorch, TensorFlow, Chainerなどの機械学習プラットフォームを活用せよ.
70. 単語ベクトルの和による特徴量Permalink
問題50で構築した学習データ,検証データ,評価データを行列・ベクトルに変換したい.例えば,学習データについて,すべての事例xiの特徴ベクトルxiを並べた行列Xと,正解ラベルを並べた行列(ベクトル)Yを作成したい.
X=(x1x2…xn)∈Rn×d,Y=(y1y2…yn)∈Nnここで,nは学習データの事例数であり,xi∈Rdとyi∈Nはそれぞれ,i∈{1,…,n}番目の事例の特徴量ベクトルと正解ラベルを表す. なお,今回は「ビジネス」「科学技術」「エンターテイメント」「健康」の4カテゴリ分類である.N<4で4未満の自然数(0を含む)を表すことにすれば,任意の事例の正解ラベルyiはyi∈N<4で表現できる. 以降では,ラベルの種類数をLで表す(今回の分類タスクではL=4である).
i番目の事例の特徴ベクトルxiは,次式で求める.
xi=1TiTi∑t=1emb(wi,t)ここで,i番目の事例はTi個の(記事見出しの)単語列(wi,1,wi,2,…,wi,Ti)から構成され,emb(w)∈Rdは単語wに対応する単語ベクトル(次元数はd)である.すなわち,i番目の事例の記事見出しを,その見出しに含まれる単語のベクトルの平均で表現したものがxiである.今回は単語ベクトルとして,問題60でダウンロードしたものを用いればよい.300次元の単語ベクトルを用いたので,d=300である.
i番目の事例のラベルyiは,次のように定義する.
yi={0(記事xiが「ビジネス」カテゴリの場合)1(記事xiが「科学技術」カテゴリの場合)2(記事xiが「エンターテイメント」カテゴリの場合)3(記事xiが「健康」カテゴリの場合)なお,カテゴリ名とラベルの番号が一対一で対応付いていれば,上式の通りの対応付けでなくてもよい.
以上の仕様に基づき,以下の行列・ベクトルを作成し,ファイルに保存せよ.
- 学習データの特徴量行列: Xtrain∈RNt×d
- 学習データのラベルベクトル: Ytrain∈NNt
- 検証データの特徴量行列: Xvalid∈RNv×d
- 検証データのラベルベクトル: Yvalid∈NNv
- 評価データの特徴量行列: Xtest∈RNe×d
- 評価データのラベルベクトル: Ytest∈NNe
なお,Nt,Nv,Neはそれぞれ,学習データの事例数,検証データの事例数,評価データの事例数である.
71. 単層ニューラルネットワークによる予測Permalink
問題70で保存した行列を読み込み,学習データについて以下の計算を実行せよ.
ˆy1=softmax(x1W),ˆY=softmax(X[1:4]W)ただし,softmaxはソフトマックス関数,X[1:4]∈R4×dは特徴ベクトルx1,x2,x3,x4を縦に並べた行列である.
X[1:4]=(x1x2x3x4)行列W∈Rd×Lは単層ニューラルネットワークの重み行列で,ここではランダムな値で初期化すればよい(問題73以降で学習して求める).なお,ˆy1∈RLは未学習の行列Wで事例x1を分類したときに,各カテゴリに属する確率を表すベクトルである. 同様に,ˆY∈Rn×Lは,学習データの事例x1,x2,x3,x4について,各カテゴリに属する確率を行列として表現している.
72. 損失と勾配の計算Permalink
学習データの事例x1と事例集合x1,x2,x3,x4に対して,クロスエントロピー損失と,行列Wに対する勾配を計算せよ.なお,ある事例xiに対して損失は次式で計算される.
li=−log[事例xiがyiに分類される確率]ただし,事例集合に対するクロスエントロピー損失は,その集合に含まれる各事例の損失の平均とする.
73. 確率的勾配降下法による学習Permalink
確率的勾配降下法(SGD: Stochastic Gradient Descent)を用いて,行列Wを学習せよ.なお,学習は適当な基準で終了させればよい(例えば「100エポックで終了」など).
74. 正解率の計測Permalink
問題73で求めた行列を用いて学習データおよび評価データの事例を分類したとき,その正解率をそれぞれ求めよ.
75. 損失と正解率のプロットPermalink
問題73のコードを改変し,各エポックのパラメータ更新が完了するたびに,訓練データでの損失,正解率,検証データでの損失,正解率をグラフにプロットし,学習の進捗状況を確認できるようにせよ.
76. チェックポイントPermalink
問題75のコードを改変し,各エポックのパラメータ更新が完了するたびに,チェックポイント(学習途中のパラメータ(重み行列など)の値や最適化アルゴリズムの内部状態)をファイルに書き出せ.
77. ミニバッチ化Permalink
問題76のコードを改変し,B事例ごとに損失・勾配を計算し,行列Wの値を更新せよ(ミニバッチ化).Bの値を1,2,4,8,…と変化させながら,1エポックの学習に要する時間を比較せよ.
78. GPU上での学習Permalink
問題77のコードを改変し,GPU上で学習を実行せよ.
79. 多層ニューラルネットワークPermalink
問題78のコードを改変し,バイアス項の導入や多層化など,ニューラルネットワークの形状を変更しながら,高性能なカテゴリ分類器を構築せよ.