めるぱんブログ

とある医大生の勉強の記録です

PythonとKerasによるディープラーニング 第3章①

第3章では二値分類、多クラス分類、スカラー回帰の3つを実際に試してみる章です。

今回はとりあえず二値分類をやってみます。 まず最初にIMDbというデータセットを使用するみたいです。 これは50000件の映画の肯定的な、または否定的なレビューで構成されています。また、訓練データ25000件、テストデータ25000件に分かれており、それぞれ肯定的と否定的が50%ずつ含まれています。

出現頻度の高い10000個の単語のみを残すことによりデータを扱いやすいサイズにします。 train_dataとtest_dataは各レビューの単語のシーケンスをエンコードしたものからなるリストで、整数のリストです。([1, 20 ,145, 500, ...]のようなリスト) 一方train_labelとtest_labelは0と1のリストで、0は否定的、1は肯定的を意味します。

続いてこれらのデータをニューラルネットワークに入れるための準備をします。 整数のリストをそのまま入力はできないようなので今回はone-hotエンコーディングで0と1のベクトルに変換します。

ベクトルに変換する際、今回は10000の単語を選んでいるため、まず10000次元をすべて0で埋め、次に実際に先ほどの例の[1, 20 ,145, 500, ...]のようなリストを考えるとインデックスの1,20,145,500...が1になるという感じです。 これでデータの下準備は完了です。 ここでは手動で行うと書いてあったのでもしかしたらもっと楽に自動化できる方法がこの後出てくるのかもしれません。正直個々の部分が一番つらかったので自動でできるようになってほしい…

今回ニューラルネットワークでは活性化関数としてReLUを用い、16のユニットを持つ中間層を2つ、最後の出力層ではシグモイド関数を使用しています。二値分類ではシグモイド関数を用いるのがベストらしいです。

最後に損失関数とオプティマイザの選択をします。 今回はオプティマイザはrmspropを使用しました。これはどんな問題でもとりあえず使えるという便利なものらしいので覚えときたいです。 また損失関数はbinary_crossentropyを使いました。これは二値分類でシグモイド関数を使うときに用いる最適なものだそうです。 そして今回は正解率で監視をします。

全く新しいデータでモデルを訓練するときの正解率を監視するには、元のデータセットから取り分けた10000個のサンプルで検証データセットを作成する必要があるそうです。

次に512サンプルのミニバッチで20エポック訓練を行います。 この際に取り分けた10000サンプルで正解率を監視します。この検証データはvalidation_dataに指定します。

訓練データと検証データでの損失値と正解率をmatplotlibでプロットします。

ドットは訓練データ、実線は検証データを表します。

f:id:melpan:20200412065923p:plain
訓練データと検証データでの正解率

これをみると訓練データではどちらもうまく学習されているように見えます。 しかし、検証データでは損失関数では5エポック目以降逆に上昇しているように見え、正解率も横ばいになっています。 これがいわゆる過学習の状況です。 そのため今回は4エポックで訓練すること正解率87.5%になりました。

今回は中間層を2層でやってみましたが、3層にしてやってみた結果も載せてみます。

f:id:melpan:20200412071736p:plain
3層損失値
f:id:melpan:20200412071822p:plain
3層正解率
正直そんなに変わったようには見えないですね... むしろ2層の時のほうが訓練データでの上がり方も滑らかなように見えます。 層を増やせばいいっていうものではないということなのでしょうか?

実際にやっていると感じますがモデルの構築はそこまで難しい要素はなく、むしろ入力するデータの処理が毎回大変なような感じがします。今回もベクトルに変換するなどなかなか難しい処理が多かったので勉強が必要だなあと感じます。 今回自分として一番大事だと思ったのは二値分類では出力はシグモイド関数で損失関数はbinary_crossentropyを使うということですね。