はじめに
k/Nの実数入力から k を出力できるのか? の後にふと思ったのが、ログファイルの1行を入力とみなして例えば単純に特定の文字列を含む行を見つけられるのか? ということでした。
1行の中の各文字を [char byte code]/255
の実数すると、1行は普通のベクトルで表されます。
ここから特定のパターンを学習できるのでしょうか。
お題: ログファイルの行から /apple/i を含む行を見つけられるか?
問題
- 問題: ログファイルの各行から
/apple/i
を含む行を見つける、ということを学習できるか? - 入力: 1行は100文字以下からなるとする。1文字は
[char byte code]/255
という実数で表される。(入力層は100個) - 出力: 正規表現の /apple/i がマッチする行のときにy2=1とする。何もマッチしないならy1=1とする。(出力層は2個)
実験
今回使った log.txt
は 1000行で、/apple/i
にマッチする行は135行あります。
log.txt
の90%を学習データ、残り10%を評価データとします。
学習は 100回のbatchで loss が 0.001 以上改善しなければ、打ち切るようにしました。
実験で使ったソースコードはこちらになります。一緒に log.txt もUpしてありますが、うーん、LocalPCのログとは言え結構怖いなぁ。。
結果
ある試行では、7000バッチ目で学習が打ち切りになり、その時の評価データの正解率は約96.0%でした。
中間層は [100,20] のケースのみ試しました(あまり試行錯誤してないです)。
※つまり IN:100 -> H1:100 -> H2:20 -> OUT:2 という構造です。
考察
ログファイルって出現する文字の位置が結構決まっているので、特に工夫をしなくても思ったより高い値になりますね。
一般的にはもっと工夫しないと全然厳しいとは思いますが、こういう形での利用も有りのような気がしました。
さいごに
個人的に少し有意義な結果が得られたような気がします。
監視システムとか特にルールを教えなくても、エキスパートの振る舞いを見て学習してくれると嬉しいんですけどねー