鹿児島弁翻訳gemを作る!
やること
Ruby x 自然言語処理 x ディープラーニング で標準語を鹿児島弁(あるいはその逆)に翻訳するgemを作る
なぜやるのか
この分野の初学者である自身がこの分野へのハードルを越えることで、同じように挑戦する人が増えることを期待する
あと、おもしろそう。
ログ
/icons/hr.icon
2019-12-01 ~ 2019-12-04
/icons/hr.icon
2019-11-30
登壇してきた。内容的にはディープラーニング入門、という感じになってしまったけど反応は上々だったので良しとする
/icons/hr.icon
2019-11-26
引き続き資料を作っている〜
数式これだけ載せよう
$ \bold{W} \leftarrow{\bold{W}} - \eta \dfrac{\partial L}{\partial \bold{W}}
$ \eta : 学習率
/icons/hr.icon
2019-11-23
登壇資料を作っている〜
登壇が終わってもこのプロジェクトは続けていくつもりで、登壇がゴールじゃないんすよ、という内容の登壇資料を作っている
Red Chainer を使いこなすところを書くぞ〜という気持ち。
/icons/hr.icon
2019-11-21
/icons/hr.icon
2019-11-20
発表資料を作り始めよう
まずは内容をリストアップするか
/icons/hr.icon
2019-11-17 ~ 2019-11-19
/icons/hr.icon
2019-11-16
読んだ。むぅ〜、イマイチだなぁ。納得感がない。
Vocabulary クラスは便利そうなので参考にする。
links.lstmだけを使っているから今のRedChainerの状況に合わせて実装しやすそう
さて、雰囲気で実装始めるか。
/icons/hr.icon
2019-11-15
次は...
seq2seqを実装して行くぞ!
前者は functions.lstm しかなかったころの chainer で実装されていて、
後者は functions.lstm links.lstm functions.n_step_lstm links.n_step_lstm を使って実装している
RedChainerのyouchanさんのlstmブランチは functions.lstm links.lstm に相当する部分が実装されている
なので基本的には前者っぽく実装して行けば良いかなぁと思っている
けど本家chainerの方が正しい書き方をしていそうなので、ちょいちょい参照したい
/icons/hr.icon
2019-11-14
/icons/hr.icon
2019-11-13
この辺りで最終発表の形をどうするか、改めて考えながらアクションを決めていきたい
「鹿児島弁翻訳にこだわるか?」という観点
そりゃこだわりたいよね
懸念はなに?
越えるべきハードル(=不明な要素)が多すぎる
「論理的に正しい実装」ができない懸念
自動翻訳をseq2seqで実装した経験がないので、そもそも自分の実装が正しいかどうか判断できない
「論理的に正しい実装」ができたとしても、期待する結果が出ない懸念
学習データが足りない
精度の高い推論結果を導くためのモデル作り
適当に実装して「推論結果が悪い」という結果になった場合に、原因特定が極めて難しい
「実装が論理的に間違っている」or「データが足りない」or「モデルが微妙」or ...
seq2seqの「論理的に正しい実装」をRubyでやる、というのがまず必要かな。
これ「できる」自信を持てないと、鹿児島弁翻訳に進めない
と思ったけど実装の方をもう少し読んでみるか。データあっても実装の目処がついていないと不安で仕方ない。心配性。
RNNForLM というモデルを作ってる。これは RNN for Language Model (= 言語モデルの用のRNN)だろうなぁ
chainer本家にも examples/ptb があるんすねぇ
This is an example of a recurrent net for language modeling. The network is trained to predict the word given the preceding word sequence.
「言語モデルのRNNの例です。このネットワークは、直前の単語列(文章)から次の単語を予測することを目的として学習を行ないます。」的な。
唯一読んでいる5章(RNN)でも触れられているな。
ベンチマークとしてよく利用されるコーパス
忘れないようにメモ
/icons/hr.icon
2019-11-10
何やるか。いくつか選択肢がある。
1. 日英翻訳に向けたデータセットの準備
2. RNNに必要な機能(functions.lstm など)の実装
3. 自前で実装した SubDataset クラスを使えるか確認& Iris の実装を改良
この観点では 1. 日英翻訳に向けたデータセットの準備 やっとくと無駄にはならない
当初の目的の完遂を目指すなら 2. RNNに必要な機能(functions.lstm など)の実装 かなぁ
でもこれやるならSubDatasetクラスみたいに Red Chainer 側に実装したい。
try-red-chainer 側から呼び出したい。
で、この形式をまだ試せてないんだよな。加筆したgemを呼び出す、みたいなやつ。これは仕事にも活かせる。
Gemfile に gem 'gem-name', git: 'repository-url', branch: 'branch-name' と書けば良いだけだ
使ってみるとバグが見つかるね〜。get_exampleのindexがバグってた。
3. 自前で実装した SubDataset クラスを使えるか確認& Iris の実装を改良
結構自信ついた〜。SubDataset クラスを自作できたことで、今後楽になるよなぁ
野良データをDatasetにするのは頑張るとして、そのあとそのデータセットを分割したい時に絶対便利だ。
2. RNNに必要な機能(functions.lstm など)の実装 はyouchanさんが既にやっていた〜。神。
Chainer::Links::Connection::LSTM
Chainer::Functions::Activation::LSTM
1. 日英翻訳に向けたデータセットの準備
これをやろう。
/icons/hr.icon
2019-11-09
直近の目標は、英語翻訳をRed Chainerで実装すること。そのための参考になりそうなものを探している。
あ、その前に、Red Chainer で学習済みモデルを使って推論する方法を知っておかないとだ。
によれば seq2seq はEncoderDecoderモデルのことらしいしね。
ちょっと読んだけど、そのまま書き直すのは無理そう〜
L.NStepLSTM とかが Red Chainer にはないから、自前で実装することになる。
となると qiita の記事とか読みながら地道にやったほうがいいかな。
いずれにせよデータセットの準備は必要だからそのあたりからだなぁ
日本語:英語の対訳例文データを用意する
日本語例文は分かち書きする必要がある
日本語辞書を用意する
英語辞書を用意する
辞書データの加工_φ(・_・
code:py
def load_vocabulary(path):
with io.open(path, encoding='utf-8') as f:
# +2 for UNK and EOS
word_ids = {line.strip(): i + 2 for i, line in enumerate(f)}
return word_ids
単語をkeyとするdictを作っている。rubyならhashだね。
Red Chainer、RNN関連のロジックがまだ1つもないじゃん。あ。これ無理じゃね?
せめて functions.lstm に相当するものがあれば何とかなるんだが...
え、作る?え〜、その余裕はないやろ...
世の中のすごい人たちが「一旦あとまわしで...」としてきたものをそんなにサクッと実装できるのかえ?
/icons/hr.icon
2019-11-04 ~ 2019-11-06
/icons/hr.icon
2019/10/29
トレーナを使った書き方にするとか
/icons/hr.icon
2019/10/28
最後の章、「トレーナーとエクステンション」の冒頭まで行った!続きは明日。
かなり理解が深まってきた感がある〜。これまで読んできたQiitaの記事を読み返したらさらに理解できそう
/icons/hr.icon
2019/10/27
/icons/hr.icon
2019/10/26
/icons/hr.icon
2019/10/24
/icons/hr.icon
2019/10/23
回帰分析までやった!
NumPy入門のブロードキャストまでやった!次は行列積から
/icons/hr.icon
2019/10/22
昨日Pythonの基礎までサッと読んだ。やっぱり先ずはChainerの理解だ!
/icons/hr.icon
2019/10/20
多分大体理解したと思う
英語翻訳を実装していく
その前にChainerに入門すべきか?
これで
1. 機械学習・ディープラーニング・Chainerを完全理解する
2. 英語翻訳をPython(Chainer)でやってみて機械翻訳を完全理解する
3. 英語翻訳をRuby(Red Chainer)でやってみてRubyでの機械翻訳を完全理解する
4. 最後に鹿児島弁での機械翻訳チャレンジする
で、完璧なのでは?
時間あるか?笑
割と不安なのは、ChainerとRed Chainerでできることにギャップがあるのでは?という懸念。
初期の移植バージョンがChanier 2.0だよ、という意味だけど...
ここに 2019/03 Correspondence to Chainer v3 と書いてある :eyes: 2. 英語翻訳をPython(Chainer)でやってみて機械翻訳を完全理解する まではできそうだけど、Red Chainerで同じことをやろうとするとツライかもしれない...
もしRed Chainerで出来ないことがあったら、コントリビュートするか!!!???
コントリビュートチャンス!?!?
いま改めてRubyKaigiの登壇資料見るとめちゃ勉強になるな、わかりやすい
/icons/hr.icon
2019/10/19
登壇までのスケジュールを作る 完
中納言で鹿児島弁データを調べる これ後日でいいや
簡単なものでいいから実装を始めたい
と、思いつつ、Red-Chainerを使うのでそれ関連の情報を調べてみる
Google Colaboratory 知らなかった。GPUが使えるのね
てかGPUよく分かっていないよ僕は
定型的かつ膨大な計算処理を行うのに適したプロセッサ と理解した
困るまではCPUでいいんじゃないかな
色々あるんだなぁと分かる
今回はDeep Learningで行こうと思ってるからこれ系はスルーでいいかな
めちゃ勉強になりそう〜
てかまずはRed Chainerを動かしてみればいいんじゃね?そもそも手元で動くんかいな、という話がある
/icons/hr.icon
2019/10/16
/icons/hr.icon
2019/10/15
Chainerを使いこなせるか、と、データをうまく用意できるか、という2大不安が明確になった。
この2つの不安、分解してそれぞれ考えたほうがいいかもな
Ruby x 自然言語処理 x ディープラーニング という観点では、題材はなんでも良いんだよ
鹿児島弁じゃなくても良いわけだ。
まずはこの分野にRubyで入門することが大事だ
その観点では、データ量を心配しなくてよさそうな「英語翻訳」を題材にすると良いのかもしれない
入門した上で「鹿児島弁」を題材にする場合の特徴や課題を出して「これにどうアプローチするか?」= 実装をどう書き換えるか? を語ったほうがよさそう
特徴
データが「発話音声を表現するための表記(ひらがな、カタカナ、ローマ字もどき)」になっている
「翻訳前後の語順の変化は無い」と仮定できる(同じ日本語だから)
課題
学習データが少ない
もっと審査的なものが厳しいのかと思ったけど、大丈夫だった。よかった。
/icons/hr.icon
2019/10/14
適当な学習データと評価データを用意して、モデルを作ってみたい
データは学習用を8件、評価用を2件とかで良い
適当なデータを持ってきてみた↑
すでに多少加工しているけど、from ひらがな標準語 to ひらがな方言 のモデルが作れるようにこれらのデータをさらに加工しよう
データを集めるのは当然大事だけど、少数のデータでそれっぽい実装ができるのか、やってみないと不安で仕方ない
さて、集めた10データで実装してみたい気持ちになったが、まず何をすればいい?
割とわかりやすそう
あぁ、これまだ読んでなかった
ふーんという感じだ。Chainerを使いこなせるか、と、データをうまく用意できるか、という2大不安が明確になった。
時間ないけど読むか...?
古い本だけど定番はこれ
データ集めの準備も進める
ユーザ登録をするぞ
申請が承認されると、専用の URL をメールで、登録コードをショートメッセージでお送りします。二つが揃ったら、専用の URL から登録手続きを行ってください。専用の URL と登録コードが届くのは、国語研究所コーパス開発センターでの承認後となり、一週間程お時間をいただく場合がございます。
hai
鹿児島弁はない
それに対する標準語訳が書かれている
/icons/hr.icon
2019/10/13
読んだ
結構気づきのある論文だったなぁ
今回やりたいことに活かせそう。
活かせそうなことをまとめておく
1. 学習は from ひらがな to ひらがな でやる
スコープが狭い方がやりやすい
問題の分割(漢字かな混じりの文章は一度ひらがなに変換してから、学習したモデルに食わせれば良い)
2. データを訓練用、開発用、評価用に分ける
良い感じの仕組みになったかどうかを評価するのどうしようかな?(鹿児島弁ネイティブじゃないし...)と思っていたけど、データを分けて 評価用 を用意しておけば良いのか〜、気づいた。てか研究やってたときは当たり前だったのにすっかりこの発想を忘れていた。
3. 訓練データが足りないと感じたら、類似した方言のデータも訓練データに突っ込んでみる。という飛び道具的発想。
この研究によると、鹿児島弁は佐賀、鳥取、長崎、秋田、あたりと近いらしい
4. 鹿児島弁の語彙を辞書として追加しておくのは大事!
語彙が足りずに翻訳精度が下がったら勿体無い
5. データを得られそうなところ
微妙...
なんでここに鹿児島弁ないんじゃぁぁぁ....
「東北大学方言研究センター コーパス」でググった
申請しておいた方がよさそう
/icons/hr.icon
2019/10/9
まずは基礎知識をつけないとな
どういうフレームワークを活用したら実現できそうかを知る
そのフレームワークをRubyでどのように使うか知る
ruby-jpのslackで質問したらコメントをもらった
いいですねー。機械学習でやってみるのはいかがでしょうかー?機械翻訳のテクニックが使えそうです
機械学習か〜