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

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

その4(汎用版):自然言語文章をNeural Network Consoleで分類を行える様に符号化する/使い方29

前回、自然言語の文章を、Neural Network Console(ニューラルネットワークコンソール。以後、NNCと書きます)で学習可能なデータに変換する汎用的な方法として、文字コードに着目して出現頻度で数値データ化する方法をためしました。

 

元ネタとして、livedoorニュースコーパスのテキストを使わせていただき、とりあえず、2ジャンルを変換してみました。

arakan-pgm-ai.hatenablog.com

 

今回は、それを使って、とりあえず適当なネットワークモデルで学習と推論をやって感触をみます。

 

する前に、ちょっと、どのようなデータを生成したのかを、おさらいしときます。

 

元にしたニュースコーパスこちらから取得したものです。

f:id:arakan_no_boku:20180215193802j:plain

 

記事1本1ファイルになっています。

 

こんな内容。

http://news.livedoor.com/article/detail/4403717/
2009-10-19T19:10:00+0900
鉄道好きの女の子が旅行の時に聞きたい15曲って?
 旅や鉄道好きの女の子だけで結成された“鉄旅(てつたび)ガールズ”が、ゆったりとした電車の旅、どこか懐かしい旅気分を味わえる曲を選んだコンピレーションCD「tabiuta -旅へ 歌と-〜鉄旅ガールズrecomend〜」が10月21日に発売される。秋の旅行シーズンのお供に、楽しみたいちょっとセンチメンタルな選曲が魅力的。

 

サイズも1ファイル当たり数KB程度と、非常に使いやすいデータです。

 

クリエイティブ・コモンズライセンスのもと公開してくださいましたNHN Japan株式会社様に感謝です。

 

このうちの、「sports Watch」と「Peachy」を使いました。

 

こんな文章のままでは、NNCで使えないので、文章をUTF-8文字コードを構成する'00'~'FF'の集合と捉えて、出現頻度をもとに数値化して、256列(次元)のこんなデータにしました。(途中は省略してます)

0.005860805860805861,0.002197802197802198,

0.0014652014652014652,0.0014652014652014652,

0.0007326007326007326,0.0014652014652014652,

0.0029304029304029304,0.0014652014652014652,

0.007326007326007326,・・・・,

0.0007326007326007326,0.0007326007326007326,

0.005128205128205128,0.0029304029304029304,

0.005860805860805861,0.0007326007326007326

 

ここまでが前回の話です。

 

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

f:id:arakan_no_boku:20180215200408j:plain

 

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

f:id:arakan_no_boku:20180120212945j:plain

 

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

 

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

 

NNCを立ち上げます。

 

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

f:id:arakan_no_boku:20180120214041j:plain

 

お断りしておきますが、このネットワークはかなり適当です。

 

あくまで、データ・セットの感触を確かめるために、「とりあえず組んでみました」的なものでしかない点、ご容赦くださいね。

 

このプロジェクトにデータ・セットを関連づけます。

 

DATASETタブを選んで、trainingとvalidationのそれぞれに、下記の赤丸のボタンを押して、作成したデータ・セットCSVを関連づけます。

f:id:arakan_no_boku:20180215201854j:plain

 

上の赤丸ボタンを押すと、以下のような画面が開くので、ここで「OpenDataset」を使ってCSVフィルを指定します。

f:id:arakan_no_boku:20180215202237j:plain

 

続けて、設定をします。

 

まず、inputです。

 

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

 

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

f:id:arakan_no_boku:20180215202635j:plain

 

 

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

f:id:arakan_no_boku:20180215202848j:plain

 

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

f:id:arakan_no_boku:20180215203033j:plain

 

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

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

 

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

f:id:arakan_no_boku:20180215203259j:plain

 

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

f:id:arakan_no_boku:20180215203321j:plain

 

次は、COFIGタブです。

 

とにかく「Batch Size」と「Max Epoch」を増やしておきます。

 

Max Epochは、1000位にした方がいいです。

 

今回は、「Batch Size」=128、「Max Epoch」=1000 でやりました。

f:id:arakan_no_boku:20180215214458j:plain

 

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

 

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

 

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

 

epoch数が200くらいまでは、横に伸びるばかりです。

 

300に近づくあたり、急激に損失率が低くなってきてます。

 

f:id:arakan_no_boku:20180215214839j:plain

 

それで評価です。 

f:id:arakan_no_boku:20180215215024j:plain

 

97.14%です。

 

140個中、4つ間違えたというわけですね。

 

正直、予測よりも相当良い結果です。

 

スポーツよりか、女性向けかのテーマは違えど、同じネタ元のニュースです。

 

記事のテーマも毎回違いますしね。

 

女性向きといっても、料理だったり、美容だったり・・とか、バラバラです。

 

なにより、ネットワークも適当で、何のチューニングもしてませんし。

 

だから、一発目で90%以上いくのは、相当難しいんじゃないかと思ってました。

 

ところが、間違えたのは4つだけ。

 

あらためて、すごいなと。

 

しかも、間違えたのは例えばこんな内容のものです。

小島:どう考えたって、顔の出来不出来はどっかの時点で気がつきますよ。足が早ければリレーの選手になるだろうし、計算が得意だったら理系の仕事に就こうと思うのと同じように、顔が良ければこの顔を使って何か世の中を渡っていこうと思うのは当たり前じゃないですか。

犬山:足が早い人がオリンピックに出たらみんなで応援するくせに。

 

女性向きニュースのジャンルですけど、話題に「リレーの選手」とか「オリンピック」とかスポーツの話題がでてるわけです。

 

Peachyのニュースだったから、スポーツが不正解になっているだけで、内容を事前にチェックしてたら、スポーツが正解でもおかしくないのです。

 

うーーん。

 

すごいですね。

 

これはいいかもしれないです。

 

ちょっと真面目にデータ変換クラスみたいなのを作って、このデータ向けに最適化したニューラルネットワークモデルとか試してみたくなります。

 

ということで引き続き、このテーマを追っかけてみます。

f:id:arakan_no_boku:20171115215731j:plain