ニューラルネットでローマ字を読む
昨日ひらがなとカタカナの埋め込みをやったって話を妻にしていたら、ローマ字を教えたら面白いのではないかという話になったので作ってみた。
多層パーセプトロンで入力はアルファベット4文字(ベクトルに埋め込んで16次元)、中間層が256次元と128次元で、出力は37次元で、かな文字の埋め込みベクトル10次元*3に、出力長と入力の消費量のOneHotが付いている。
うまく学習しないとき、だいたい教える側が悪い。
nishio → ニキオ
ニキオは惜しいなー、せめて教えた物はちゃんと答えてほしいなー
学習データに訓令式ローマ字しか含めてなかったので「si→シ」は教えたが「shi→シ」は教えてなかった
ni → ミ
shi → キ
si → キ
o → ピ
nisio → ニシピ
なんか女子高生みたいなことを言い出したぞ
なんで個別だと「ミキピ」なのに繋げると「ニシピ」になるのか考えたら、学習データの作り方が悪かった
当初学習データは"nish"と入力されて「先頭2文字が『ニ』」と返すように、niの後ろにランダムに別のものをつけていた
一方テストの時には与えられた文字列が4文字に満たない場合は後ろに文末マーカーをつけて"ni$$"とする
学習データに"$"が含まれないため、テストの時に文末で初めて"$"をみて混乱する
その結果としてニシピ
学習データに$も混ぜるようにしたらnishioをちゃんと読めるようになった
chopin → チチピン
nishioが読めるのにこれをチョピンと読まないのはおかしいだろ、と思って調査した
chi → チ
cha → チチ
chu → チチ
cho → チチ
推測結果の出力の部分で一度に2文字以上のかなを出力する時に間違えて1文字目を繰り返して出力している僕の側の実装ミスだった
全問正解できてるかチェック
du -> デゥ (A: ヅ)
du -> デゥ (A: ドゥ)
同じ出題で求める回答が異なっているといういじめをしていた
「ヅ」なのか「ド」なのかわからないので、混ぜて「デ」にしていて面白い