アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

日本語文章をNeural Network Consoleで学習・評価(分類)する。(単語の出現頻度編)/使い方27

前回から、自然言語の文章をニューラルネットワークコンソール(Neural Network Console・・以後、NNCと書きます)で分類に利用できるようなデータに変換するのをやってます。 

まずは、暫定版として単語ベースで文字数カウントをするパターンでデータをつくりました。

arakan-pgm-ai.hatenablog.com

 

今回は、それを使ってお試しで、NNCで学習・推論をやってみます。 

まず、元ネタとして、以下のようなテキストデータを、200個ほど用意しました。

ポジティブな言葉の例

いまの僕には勢いがある。新しいことを始めてもうまくいきそうな気がする。,0
希望のために扉はいつも開けておきましょう,0
楽しいから笑うのではない。笑うから楽しいのだ,0
幸せとは、健康で記憶力が悪いということだ,0
現在から、未来は生まれ落ちる,0
食べ物に対する愛より誠実な愛はない,0
笑われて笑われてつよくなる,0
元気が一番、元気があれば何でもできる,0

 

ネガティブな言葉の例

僕には勢いがない。新しいことをやってもうまくいかない気がする。,1
希望を持っても仕方ない,1
楽しくもないのに笑えないよね,1
辛い記憶ばっかり思い出す,1
未来よりも過去を振り返って悔やむことが多い,1
愛なんて信じないよ,1
笑われると落ち込む,1
 

 

これを、pythonプログラムでNNCで使える様に数値データに変換したCSVを作成して、NNC用のデータ・セットにしてみました。 

出来上がったデータ・セットCSVを、トレーニング用と評価用にわけておきます。 

f:id:arakan_no_boku:20180120212702j:plain

 

0フォルダの下にはこんな感じで1行ずつのCSVファイルがあります。

f:id:arakan_no_boku:20180120212945j:plain

 

これらを適当なフォルダにコピーして、データの準備は完了です。

 

ニューラルネットワークコンソールのDATASETに登録

 

NNCを立ち上げます。 

まず、DATASETを開き、Open Dataset で、さっき作成したデータ・セット用CSVを選択して登録します。

f:id:arakan_no_boku:20180120213628j:plain

 

続いて、学習評価するプロジェクトを作成します。

 

適当なプロジェクトを作って、Afineとsigmoidの組み合わせを4層ほどかさねて、最後は2値なので、BinaryCrossentropyにしておきます。

f:id:arakan_no_boku:20180120214041j:plain

 

設定をします。 

まず、inputです。 

これは作成したCSVデータのサイズにあわせます。 

用意したテキストデータによって、できるデータの列数が異なるので、必ずデータ・セットタブを見て判断します。(下の赤枠部分)

f:id:arakan_no_boku:20180120214359j:plain

 

それと同じ内容をinputタブに設定します。

f:id:arakan_no_boku:20180120215829j:plain

 

後、AffineのOutputは とりあえず、「1」でいいんじゃないですかね。

f:id:arakan_no_boku:20180120220215j:plain

 

COFIGタブとDATASETタブの設定が意外と重要

プロジェクトのDATASETタブで、テキストデータから作成したデータ・セットCSVを学習用と評価用にそれぞれ登録します。 

ポイントは、「Image Normalization」のチェックをはずすことですね。

f:id:arakan_no_boku:20180120220842j:plain

 

あと、評価用はShuffleもはずしといた方が良いですかね。

f:id:arakan_no_boku:20180120220900j:plain

 

COFIGタブでは、とにかく「Max Epoch」を増やしておきます。 

画像の場合、100とかになってますが、10倍の1000位にした方がいいです。

f:id:arakan_no_boku:20180120221208j:plain

 

さて、これで保存します。

 

学習・評価をやってみます

 

学習した結果のグラフです。 

epoch数が300を超えるぐらいから、急激い損失率が低くなってきてます。 

このへんが、画像なんかでやるときと違いますね。

f:id:arakan_no_boku:20180120221513j:plain

 

それで評価です。 

文章データを全部で200個くらいしか用意できなくて、評価用にはそのうち12個しかまわせませんでいた。 

なので、かなり割り引いて見ないといけないですが、結果は100%です。

f:id:arakan_no_boku:20180120221900j:plain

 

決して、学習と同じ文章をチョイスしたわけでもなく、ランダムに12個抜き出したので、過学習ってわけではなさそうですし・・まあ、まあじゃないですかね。

 

2018/02/04追記

念のために、補足します。

この記事で紹介している方法は汎用性はあまりありません。

だから「暫定版」です。

汎用性がない理由は、学習データに出現する単語数によって、列数が増減するからです・・。

あくまで、「自然言語をNNCで学習可能なデータに落とし込むひとつの方法論を勉強を兼ねてやってみる」という感じで捉えてもらえると良いかなと思います。

 

2018/02/15追記

上記の反省を踏まえて、汎用性を改善した方法論で、再度データ・セット作成をやったバージョンがあります。こちらです。

arakan-pgm-ai.hatenablog.com

 

f:id:arakan_no_boku:20171115215731j:plain