これは、私が実際に体験した話なんですがね。
その時私は、ニューラルネットワークを使って、
特定の文章を機械が読める特殊な形式に変換する、
という実験をやってたんだ。
でも何しろニューラルネットワークなんて大学でちょびっと習ったっきりなもんで、
処理ソフトについてるチュートリアルをやってみたり、インターネットに転がってるサンプルコードを読んでみたり、
とにかくいろいろやってみるしかない、ってんでいろいろ勉強して、
やーっと、それらしいものが動くようになった。
あるところからもらってきたデータセット、これを仮にデータAさんとしましょうか、データAさんでニューラルネットワークを学習してあげたあとに、それらしい入力をニューラルネットに与えてみる。
そうすると、けっこう面白い結果が出てくるようになったんですね。
いろいろ悩んでやってみた結果ちゃんとした出力が出てきたわけですから、それはもううれしかった。
これはいいな〜、すごいな〜、っていうんで、こんどは別のデータ、こちらはデータBさんとしましょうか、こいつでも学習させてみて、結果を見てみようということになった。
さっそくデータBさんをニューラルネットワークに与えたいとこなんですが、そのまえに簡単な下処理をしないといけない。
データBさんから必要な列だけをとってくる。
するとたまに、べらぼうにデータが長い行があるんで、そういうのは取り除いてあげる。
それから全角英字だの半角カタカナだのというのを正規化して、
最後にデータの4分の3を学習用に、4分の1を検証用のデータに分けてあげた。
ニューラルネットワークを学習用に動かす。
ぶうーーんとファンの音がなって、学習が始まった。
学習の途中では、進み具合を知るために200ステップごとにモデルの評価値が出てくるんです。
最初の200ステップは、
お、76.64か・・・
次は、31.04。
この評価値は低いほどいいんで、数字が減るように固唾を呑んで見守るんですね。
27.35。
26。
24.38。
少ーしずつ数字が減っていく。
ニューラルネットワークが変換パターンを覚えていくのが見えるようで、そりゃ、うれしいもんです。
10.62。
9.53。
8.68。
8.38。
7.86。
7.53。
7.19。
どんどんどんどん下がっていく。
評価値がだいたい下がりきったところで、学習を止めた。
そしたら学習した結果が見てみたくなった。
なにか適当な入力を与えると、それに対応した表現が出てくるかを確認するんですね。
それで、どんなテキストで検証しようかなー、と、
参考にするために、まずは学習用に与えたデータを見てみた。
するとね。なーんか様子がおかしいんだ。
データBさんってのは、入力と出力がペアになってて、
機械に読ませるための表現を出力するとはいえ、
人間が見ても出力が入力のどのへんと対応するかはわかるようになってる。
でも、ニューラルネットワークに与えたデータを見てみると、
入力と出力がまるでちんぷんかんぷんで、噛み合ってない。
アチャー、やっちゃった。
データBさんを下処理する段階で、処理の方法を間違えて、行と列の対応がめちゃめちゃになっちゃっていたんだ。
はあー、データの下処理からやり直しか。時間、ムダにしちゃったな。
そう思いながら、こんどは間違えないように、もう一回下処理をやっていく。
と、ふと作業の手がとまった。
アレッ、おかしいぞ・・・?
入力と出力の対応がめちゃめちゃってことは、そこに意味のある法則はないはずなんだ。
でもさっき、学習の評価値はどんどん下がっていった。
あれは確かに、**「何か」**を学習していたんだ。
それじゃあボクのニューラルネットワーク、
一体**「何」**を学習していたんだろう・・・?
キャーーー!!!
教訓
- データの下処理は慎重に。
- 特に教師あり学習に使う入力と正解の組み合わせはずれないように細心の注意を払う。
- ニューラルネットワークは自由度が高いので、入力と正解がずれててもそこそこの評価値が出たりするらしい。