わざわざこの記事を取り上げた理由はこの記事そのものではなく、これに対するGoogle翻訳。
- "Like"(名詞)を「いいね!」
- "like"(動詞)を「『いいね!』する」
のように、ちゃんと文脈を捉えて訳しているのが興味深かったです。
𝕏関連の文章も大量に学習させたんでしょうけど、過学習起こしてないよな・・・?
わざわざこの記事を取り上げた理由はこの記事そのものではなく、これに対するGoogle翻訳。
のように、ちゃんと文脈を捉えて訳しているのが興味深かったです。
𝕏関連の文章も大量に学習させたんでしょうけど、過学習起こしてないよな・・・?
ニューラルネットワークの活性化関数にReLUってあるじゃないですか。あれがどうもよくわからんのです。
数学的な定義とか「正の値の微分が1なので勾配消失問題に強い」とかは知ってるんですけど、なぜこれを使うと精度が向上するのか、負の値を一律で0にすることがニューラルネットワーク上でどういう意味を持つのかがわかりません。
上でリンクを張ったWikipediaでは
2000年にHahnloseらによって強い生物学的動機と数学的正当化を持って、動的ネットワークへに導入された
とありますが、生物学的な動機ってなんだろう。。。
そしてPyTorchのseq2seqとAttentionのチュートリアルでは、デコーダーの単語埋め込み(ベクトル表現)に対してReLUを適用していますが、これって大丈夫なん?
ベクトル表現の負の値を0にしてしまうと別の単語が同じ表現になってしまったり、特に全ての要素が負の値で表現される単語があったら、ゼロベクトル(PADやUNKなどの特別な単語)として扱われたりするんじゃないかと。
まあ内部状態は刻々と変化するのでゼロベクトルが渡されたからといって毎回出力結果が同じになるわけじゃないですし、そうなることを織り込み済みで学習させているので問題ないという理屈なんでしょうか。
誰か詳しい人教えてください。生物学的動機についても。
最近、seq2seqの独自実装にハマっています。まあ独自実装といってもまだ自慢できるような工夫はほとんどないんですが、翻訳とかチャットボットとかになんか使えそうなのでとりあえずエンジンを作っている段階です。
そんな自作seq2seqを使って試しに英日翻訳エンジンを作ってみたんですが、どれだけ学習させても全くもってトンチンカンな翻訳結果にしかなりません。多分アルゴリズムは合ってるはずだし学習データもネット上で公開されている機械学習用のトレーニングデータを使っています。ただデータ量が多いので、ある程度まとめてミニバッチ学習をさせています。何がおかしいんだ・・・
数日悩んでいましたが、ある日ソースコードを見直して気づきました。
ミニバッチ学習させるときに、パディングの影響を最小限にするためにトレーニングデータを長さ順にソートしています。それはいいんですが、入力と出力を独立にソートしていたため、英文と和文の対応がグチャグチャになっていることに。
対応がずれないように、英文の長さを基準にして「英文・和文のペアの配列」をソートして再学習させたところ、無事それっぽい翻訳結果が出ました。そのうちどこかで公開したり、基礎から始めるseq2seq的な記事を書いたりするかもしれません。
良い子のみんな、学習データの入力と出力は別々にソートしちゃダメだよ!こんなことするのは他にいないと思うけどね!