FizzBuzz問題のDeepLearning実装で失敗した話

プログラミング

◎FizzBuzz問題とは?
数字を1から順に言っていき、3の倍数の時はFizz、5の倍数の時はBuzz、3の倍数かつ5の倍数の時はFizzBuzzと代わりに言う英語圏における言葉遊び。


 

DeepLearningを勉強し始めた当時、脳死でFizzBuzz問題を解いたときの失敗の話です。

 

結論、先にいいます。

・脳死でなんでもできるほどDeepLearningは万能ではない

・データの特徴量は超重要

 

 

— ここから本編 —

FizzBuzz問題は”Hello, World”に並ぶプログラミング初心者向けの問題で、pythonでコード実装すると↓みたいに書けますね。

実行結果

 

これをDeepLearningで解くために考えたモデルは↓みたいな感じ。(ここで、隠れ層4層からがDeepだとかいう議論は置いておきます。)

↓のようなコードにして学習させました。

実行結果

・・・ん?

acc = 正解率 が53%のまま。学習していない、、だと。。。

一応グラフにして確認します。

縦軸がAccuracy(正解率)、横軸がEpoch(学習回数)です。

右に行くほど学習回数が増え、正解率が上がる右肩上がりのグラフになるのが理想ですが、、、

 

い、一応テストデータで検証してみますか・・・

実行結果

なーーーーーーーーーーーんもできるようになってないじゃん

 

 

色々記事を漁ってみて、こちらの記事にたどり着きました。https://qiita.com/cvusk/items/07659830c41b2c3ff02b(Kerasでfizzbuzz問題を解いてみる)

こちらの方のモデルを図にすると↓です。

数字を2進数に変換してモデルに入力しています。なるほど。。。。

ここでやっと自分の愚かさに気づきました。”数字の特徴”を捉えているものを入力データとしなければいけないことを。。。

 

例えば、12という数字には↓のように様々な表現がありますね。

・10^1+2×10^0  (10進数表現 )

・1×2^3+1×2^2 ( 2進数表現 )

私が最初に作ったモデルの入力データはいうなれば、1桁のn進数です。

学習するには情報が少なすぎる不親切な入力データなのかもしれませんね。

 

さてさて間違いに気づいたところで、いざ実装。

zik

はい。ちゃんと学習しているようですね。

 

テストデータで確認してみます。

 

実行結果

おお!全問正解とはいきませんでしたが、ちゃんと学習していそうです。

 

ここから精度を上げるためには、ハイパーパラメータのチューニングやらモデルの初期値やら学習回数やら学習データを増やしたりやら、、、色々やり方はありそうですがその辺はまた後で。

以上です。

 

コメント

タイトルとURLをコピーしました