前回から、ニューラルネットワークコンソール(Neural Network Console・・以後、NNCと書きます)で自然言語処理を試みてます。
前回は、単語ベースで文字数カウントをするパターンでデータをつくりました。
今回は、それを使ってNNCで学習・推論をやってみます。
テキストデータの準備
まず、元ネタとして、以下のようなテキストデータを、200個ほど用意しました。
ポジティブな言葉の例
いまの僕には勢いがある。新しいことを始めてもうまくいきそうな気がする。,0
希望のために扉はいつも開けておきましょう,0
楽しいから笑うのではない。笑うから楽しいのだ,0
幸せとは、健康で記憶力が悪いということだ,0
現在から、未来は生まれ落ちる,0
食べ物に対する愛より誠実な愛はない,0
笑われて笑われてつよくなる,0
元気が一番、元気があれば何でもできる,0
ネガティブな言葉の例
僕には勢いがない。新しいことをやってもうまくいかない気がする。,1
希望を持っても仕方ない,1
楽しくもないのに笑えないよね,1
辛い記憶ばっかり思い出す,1
未来よりも過去を振り返って悔やむことが多い,1
愛なんて信じないよ,1
笑われると落ち込む,1
これを、pythonプログラムでNNCで使える様に数値データに変換したCSVを作成して、NNC用のデータ・セットにしてみましたというのが前回までの話。
出来上がったデータ・セットCSVを、トレーニング用と評価用にわけておきます。
0フォルダの下にはこんな感じで1行ずつのCSVファイルがあります。
これらを適当なフォルダにコピーして、データの準備は完了です。
ニューラルネットワークコンソールのDATASETに登録
NNCを立ち上げます。
まず、DATASETを開き、Open Dataset で、さっき作成したデータ・セット用CSVを選択して登録します。
新規プロジェクト作成
適当なプロジェクトを作って、Afineとsigmoidの組み合わせを4層ほどかさねて、最後は2値なので、BinaryCrossentropyにしておきます。
設定をします。
inputレイヤーの設定
作成したCSVデータのサイズにあわせます。
用意したテキストデータによって、できるデータの列数が異なるので、必ずデータ・セットタブを見て判断します。(下の赤枠部分)
それと同じ内容をinputタブに設定します。
Affineレイヤーの設定
後、AffineのOutputは とりあえず、「1」でいいんじゃないですかね。
DATASETタブの設定
プロジェクトのDATASETタブで、テキストデータから作成したデータ・セットCSVを学習用と評価用にそれぞれ登録します。
ポイントは、「Image Normalization」のチェックをはずすことですね。
あと、評価用はShuffleもはずしといた方が良いですかね。
CONFIGタブの設定
COFIGタブでは、とにかく「Max Epoch」を増やしておきます。
画像の場合、100とかになってますが、10倍の1000位にした方がいいです。
さて、これで保存します。
学習の実行
学習した結果のグラフです。
epoch数が300を超えるぐらいから、急激い損失率が低くなってきてます。
このへんが、画像なんかでやるときと違いますね。
評価の実行
それで評価です。
文章データを全部で200個くらいしか用意できなくて、評価用にはそのうち12個しかまわせませんでいた。
なので、かなり割り引いて見ないといけないですが、結果は100%です。
決して、学習と同じ文章をチョイスしたわけでもなく、ランダムに12個抜き出したので、過学習ってわけではなさそうですし・・まあ、まあじゃないですかね。
2018/02/04追記
念のために、補足します。
この記事で紹介している方法は汎用性はあまりありません。
だから「暫定版」です。
汎用性がない理由は、学習データに出現する単語数によって、列数が増減するからです・・。
あくまで、「自然言語をNNCで学習可能なデータに落とし込むひとつの方法論を勉強を兼ねてやってみる」という感じで捉えてもらえると良いかなと思います。
2018/02/15追記
上記の反省を踏まえて改善した方法論で、再度データ・セット作成をやったバージョンもあります。こちらです。