2020年12月17日木曜日

神奈川工科大学で講義:自然言語処理と機械学習(事後編)

 【what is this】神奈川工科大学_情報工学科向けの「入門:自然言語処理と機械学習」講義後の報告です。前回の続編になります。現状の小生にとって、今年のn大ニュース(n ≦ 3)入りとなりました。 

久しぶりに約140名に90分講義(講演)
 前回記載のとおり、90分のオンライン講演を実施(2020-12-10)。対象は、約140名の2年生ですが、先生方や大学院生にも聴いていただきました。このコロナ禍ゆえ、自宅からZOOMを利用した講演でしたが、特にトラブルもなく終えることができました。
 熱心に聴講し質問もしてくれた学生諸君に、そして準備された担当の先生、応援して質問もしていただいた先生方に感謝したい。当方としてはここ2ヶ月間、構想を練り準備してきた甲斐があり、たいへん嬉しく思っています。下図のスクリーンショット、どこか良い雰囲気を醸し出しているような気がします。

2年生約140名と、院生、先生方にも参加していただいた

質問が出るのはオンラインのメリット
 上図右欄に見えますが、講演後に学生諸君から3件ほどの質問がチャットで寄せられました。対面授業では通常、ほとんど出ませんので、これは、オンライン授業の良い点のようです。ただ、質問時間は限られていたので、その場でパチパチ素早く質問を正確に打つのは難しかったと思います。後でメールでも質問できるように、当方のメールアドレスも講義スライドに記載はしておきました。

その場の反応が分からないデメリットも
 一方、受講状況が掴めません。私は、ユーモアというか、「ここで学生諸君を和ませよう」と、スライドの何カ所かに仕組んでいたものがあります。それに対する反応が分からないのです。対面であれば、大人数の場合でも、ちょっとどよめいたり、笑いが起こったりするのが分かります。それが知りたいのです。それは5カ所位あったのですが、例えば、以下のような所でした。「ここじゃない!ここ!(詳細はこちら)「日曜日は銀行はやっていない!(詳細はこちら)」It happens inevitably.

ここで、小さなどよめきや笑いが起こるのでは...

後日提出の受講レポートから反応を掴む
 ですが、この講義受講ではレポート提出が義務づけられているため、後で状況を掴むことができました。熱心によく受講してもらったことが分かりました。今後の参考にしたい。残念ながら(公式レポートにはそういうことは書かないものだが)、上記の笑いについて触れた学生はいませんでした!ちょっと残念。以下に、学生諸君からの反応をいくつか示します。(原文の意味を損なうことなく、抜粋、編集したところがあります。)
  1. メモは取ったが、講義資料が公開されていなければ、後で理解を深めることは困難だったが、それがあったので非常に助かった。((注)スライドが役立って良かった。)
  2. 資料を見返してしっかりとまとめたメモと見比べなんとなく理解するところまで行けたことは、個人的にとても大きかったです。((注)予習して臨んだようです。)
  3. 内容だけを見たらすごく難しいものを簡単に見せる工夫や見る側が興味を持つようなしゃべり方をしていたので参考にしたいと思いました。((注)よく分かってくれました!)
  4. 最初は基礎的な部分から、徐々に内容を複雑にしていって、尚且つ前のスライドでその話に持っていきやすいように、しっかりその情報の開示・整理を行っていたために理解しやすくて、((注)そこまで、よくぞ分かってくれました!「以心伝心」という言葉が頭に浮かんだ。)
  5. 退職後も自分の興味で調査や実験をしたという事を聞いて、私も自分自身で動く行動力や何にでも興味を持つ好奇心を忘れないようにしたいと思いました。((注)こんなところにも気がついてくれました!)
  6. 自身が気になったから実際に行ってみたという動機や実体験を元にした説明だったので、内容がわかりやすく伝えたい事も明確で、全体的にとても良かった((注)そのとおり。自分でやってみること!)
  7. Google翻訳を使っているが((注)そういう学生が非常に多かった!)、それに関連する技術や動向の概要が分かった。機械翻訳がこれほど凄い技術でなりたっているとは思わなかった。
  8. 数学の知識が不足しているのでそれを身に付けたい。((注)講義では、誤差逆伝播や微分等については直接言及しなかったのだが、学生は、数学的手法を感じ取った!)

時間配分に気を配る
 スライドは全部で62枚ありました。90分のうち、どの辺りにどの位時間をかけるのか、受講者もそれが分かると落ち着いて聴けるように思いした。少し余裕を持った時間配分とするのが良いと思います。結果としては、ある先生から(そして学生のレポートの中にも)、「ほぼ、時間配分どおりでしたね」と言われて、ちょっと安心。

事前に決めておいた時間配分(配布スライドにも記載)

2020年12月12日土曜日

Attention-Seq2Seq翻訳実験での隠れ層ノード数

  【what is this】日英翻訳実験を行う上で、手頃なサイズの日英対訳コーパスが必要です。ここでは、簡単なものですが独自に用意してみました。そして、これまでの記事に書いた方式(Attentionを用いた)での学習実験を行いました。約4万件の和文のうちからランダムに選んだ9割について対訳英文を学習させた結果、残りの1割の和文全てに対して、正解の英訳文を生成できました。その際の、LSTM隠れ層のノード数に対する和英翻訳正解率の違いを観察しました。

独自のミニ和英対訳コーパスを作成する
 図1のフローに従い、左端から右端までのあらゆるパスを辿ると、語彙数38の範囲で和文41,472件が生成できます。一方、図2に従うと、それらの和文に対する英訳文を生成できるようになっています。英文の場合は、人称に応じて動詞(例えばexpectかexpectsか)の形を選択します。また、この動詞を使う場合は、図2の赤丸に示すように"to"を付加する必要があります。


どのような対訳文が生成されるか
 上記にしたがって生成された和文とその英訳文の例を3つほど示します。
[J1] 私は白い小さな花が早春に一斉に咲くのならばそこへ行くだろう
[J2] 彼女は黄色い斑な花が真夏に密集して開くことを期待している
[J3] 我々は紫の丸い花が晩秋に徐々に咲くことを期待している

[E1] I would go there if white small flowers bloom all at once in early spring
[E2] She expects yellow mottled flowers to open densely in midsummer
[E3] We expect purple round flowers to bloom gradually in late autumn

Attentionを利用した翻訳に上記コーパスを適用
 今回の翻訳方式は前回、前々回の記事に述べたとおりです。つまり、Attention付きseq2seqによるものです。それを構成するLSTMの隠れ層のノード数について実験的に検討しました。以下の結果は、いずれの場合も、約4万件の和英文の対の9割を学習させ、残り1割(約4,000件)を検査に使った場合です。

隠れ層のノード数をどう決める
 実用的な翻訳処理では、入力one-hot vectorの次元(語彙数)は50,000前後であり、隠れ層ノード数は500前後とされているようです。しかし、今回のように語彙数38と非常に少ない場合はどうなのでしょうか。それを確認してみました。以下の図3(a)〜(c)では、隠れ層のノード数が違います。検査用の和文に対して生成された英文の正解率の推移を示しています。

 まず、図3(a)は、隠れ層ノード数を16とした場合です。乱数系列を変えた2つのケースについて示しています。なかなか正解率が上がらず、使えそうにありません。


 次の図3(b)は、隠れ層ノード数を32とした場合です。かなり良いようです。epoch = 20では、すでに検査用和文約4,000件の全てに対して妥当な英訳が得られています!正解率100%!


 図3(c)は、隠れ層ノード数を64に倍増した場合です。より早めに正解率が高まるものの、途中の局所解で停滞したり、誤差低減に不安定が生じたりする傾向があります。


一応の結論
 こんな簡単な実験だけで何が言える?という面もありますが、今後の参考になるように思います。隠れ層のノード数が少なすぎると、入力語彙に対するベクトルにその意味情報が正確に盛り込めない。逆に、隠れ層のノード数が多すぎると、該当の語彙のベクトルに雑音が混じりやすいのではないか。それゆえ、今回のように語彙数38くらいでは、語彙数と同程度の隠れ層ノード数を設定するのがよさそうです。こんな見解、どんなものでしょうか。

2020年12月8日火曜日

Attentionを用いたニューラル日英翻訳の実験(続)

 【what is this】Attention機能を利用した日英翻訳実験において、コーパスサイズ(入力データ量)を前回の3倍(約1万件→3万件)に増やしたところ、全検査データに対して100%正解翻訳出力するまでのepoch数は1/3(27回→8回)に激減した。

何をしたのか
 前回の実験結果について、かっての同僚の先生から、「入力データを1/3にしたらどうなる?」とのコメントを戴きました。これがヒントになりました。でも、1/3にしてみるのではなく、前回は本来の1/3でやったのだ、と考えました。したがって、1/3にするのではなく、3倍にして観測する方が意味があると考えました。つまり、本来は3倍のデータでやるべきだったと考え直しました。

Attentionの性能をあらためて実感
 詳細は略して結論を述べます。前回の日本語の(したがって英語の方も)語彙を少し増やして、コーパスサイズを10,368件から31,680件に3倍化しました。それぞれで、訓練用に8割、検査用に2割を使って学習させた結果が以下の図です。

 検査データの全てに対して正解英文を出力するまでに、前回27epochs、今回8epochsという著しい収束性能が明らかとなりました。小さなコーパスを何回も辿るよりも、大きなコーパスを使えば少ない走査で済む、という妥当な結果だと考えます。いずれにしても、Attention機能の素晴らしさを再確認できたように感じます。



 今回の収束状況の一例を示します。以下の図は、和文「夏に丸い赤い花がまばらに咲く」に対する翻訳状況です。epoch=1では、1単語が認識されているだけですが、epoch=2では、英単語は間違っていますがすでに英文の文型としてOKとなっています。つづくepoch=5では正解の英訳に達しました。




2020年12月7日月曜日

Attentionを用いたニューラル日英翻訳の実験

【what is this】Deep Learningでの重要度が高まっているAttention機能の仕組みを理解するため、独自作成の和英対訳コーパスを用いて、簡単な翻訳実験を行った。「はやぶさ2」の地球帰還ほどではないにしても、感動的な結果が得られた。極く限られた語彙だけを使う8,000件の日英対訳データの学習後には、例えば「盛夏に大きい赤い花が徐々に咲く」は、「large red flowers bloom gradually in midsummer」と自動翻訳された。

何をしたいのか
 機械翻訳において、Deep LearningでのAttetion機能を理解しようとしていました。なかなか、コードレベルで実験しながら理解できるような情報が見つからなかったのですが、実は、2年前に購入した「ゼロから作る...自然言語処理編」[参考文献1]全412頁の最後の方(P.325〜)に、素晴らしい解説があることに気づきました。これだ!ということです。

日英対訳コーパスを独自に用意する
 しかし、文献1には対訳コーパスを使った例はありませんでした。ならばと、極く簡単なものですが、図1に示すように、「花」に関して、開花時期、大きさ、形、色、密集の度合いなどを組み合わせて(語順も変えて)、約1万件の和英データを自作しました。なお、英訳の方は、図2に示すように、多様な日本語語順に対して、英文では語順は固定的にしてあります。(もちろん、日本語の単語が一つでも違えば、違う英文にしてあります。)


日英対訳コーパスを使った学習の実験
 詳細は省きますが、さっそく、文献1にあったRNN-AttentionのPythonコードを利用させていただき、上記の対訳コーパスで学習させました。図3に示すとおり、最初は検査データに対する正解率が上がりませんでしたが、epoch = 20を越えるあたりから、急速に上昇し、epoch = 27 では、検査データ2,000件(学習用データは8,000件)に対する英訳がすべて正解となりました!これには感動を覚えました。


 一例として、和文「早春に 大きい 白い 花が 密集して 咲く」に対する翻訳状況を図4に示します。例えば、epoch = 5くらいまでは、僅かに、幾つかの単語が英訳されているに過ぎませんが、epoch = 27では、期待どおりの正解「large white flowers bloom densely in early spring」に達しています。



Attention機能のビジュアル化で素晴らしさを実感
 このAttentionの美しさと能力は、以下の図5からも感じとることができます。学習が済んだ状態で、以下の和文を翻訳させた状況です。もちろん、正解が得られています。

 和文:紫の楕円の花が早春に一気に咲く
 正解:oval purple flowers bloom at once in early spring

 ここでは、何ら英語辞書は使っていません。上記のとおり、自前の対訳コーパスだけを使っています。それにも拘わらず、「紫の」「楕円の」「早春に」「一気に」等に対する英単語を自ら発見していることがわかります。驚異的です!



【参考文献】
斉藤康毅:ゼロから作るDeep Learning (2) 自然言語処理編、オライリージャパン、2018年7月

2020年12月2日水曜日

神奈川工科大学で講義:自然言語処理と機械学習(事前編)

 【what is this】情報工学科2年生向けの「入門:自然言語処理と機械学習」の概要です。90分のオンライン講義用です。(事後編はこちら

久しぶりの90分授業
 縁あって今回(2020-12-10)、神奈川工科大学情報工学科2年生向けに、90分のオンライン講義をすることになりました。全部で15回あるオムニバス形式の情報工学特別講義の1回分です。

 内容は、「自然言語処理と機械学習」です。ここ2,3年、興味をもって調べたり、自分で実験してみた事項に基づいています。自然言語処理の基本的な解析から機械翻訳までの重要と思われる技術について述べます。

 本当は学生諸君の顔を見ながらの対面授業でやりたいのですが、このコロナ禍のもとでは致し方ありません。しかし、自宅の机上から講義するのですから、やりやすい面もあります。

講義のタイトル

講義の全体構成と時間配分目安

講義にあたって留意したこと

  1. スライド枚数を適切に抑えて、講義時間を超過しないこと。最終的には、目次なども含めて、全62枚のスライドを準備し、(90分だが)85分で終了することをめざす。
  2. 全体を大きく4分割し、それぞれ20分程度の話として明確に区分すること。またそれら各部の相互関連も示すこと。
  3. できる限り、独自の例題、独自のプログラム、独自撮影の画像、身近な話題などを使って、当方の取り組み姿勢を示す。
  4. インパクトのある素晴らしい、他の人の成果は積極的に引用させていただく。
  5. 技術の詳細の講義ではないが、「ふわー」としたお話しに終わらずに、なるべく一定の深さまで掘り下げ、具体例をあげ、簡単な計算例なども加えること。
  6. 一方、詳細な技術内容には立ち入れないとしても、何か「凄いぞ!」「こんなことも考えられているのか!」と驚きを感じ興味を持ってもらう場面も作ること。

講義予定のスライド一覧
 以下は、4区分したスライドの縮刷版です。実寸スライドは(先生方にはすでにご覧いただいていますが)講義時までに学生諸君へ公開します。

part1 人工言語、自然言語、機械学習、サービス

part2 基本解析、形態素解析、係り受け解析、分類問題、コーパス

part3 単語の意味理解、共起語、単語の実数ベクトル空間への埋込み

part4 機械翻訳(用例的、統計的、ニューラル、Attention)、参考文献

このあとどうする
 この講義は、「入門」としています。このあとはどうするか、少しギャップがあると思いますが、技術的にさらに深めたものを作りたいと思っています。特に、最新の機械翻訳の仕組みを明確に説明できることを目指したい。

【参考文献】
 以下の文献等から、多くのことを学びました。また、それらにある例題や図表の一部を引用させていただきました。感謝致します。
  1. 黒橋禎夫改訂版 自然言語処理、放送大学教育振興会、2020年:基本概念とアルゴリズムを簡潔かつ精緻に叙述した定評の教科書。手計算できる小さな例題で理解を深める。改訂版では、最近の機械翻訳(20ページ)が追加された。(全202頁)
  2. 杉本徹・岩下志乃Javaで学ぶ自然言語処理と機械学習、オーム社、2018年:基本概念と基本技術が、幅広く丁寧に解説されている。明解なJavaプログラムとその解説があり、それを動かしながら理解を深められる。(全262頁)
  3. 斉藤康毅ゼロから作るDeep Learning(2)自然言語処理編、オライリー、2018年:定番の「ゼロから作る…」の第2弾、自然言語処理編。じっくり一歩づつ(Pythonでプログラムしながら)進む。最初の方にDeep Learningの一般的解説もある。(全412頁)
  4. 柴原一友自然言語解析アルゴリズムBERT(前編)、日経ソフトウェア2020年7月:情報検索や機械翻訳で注目されているBERTの考え方のやさしい解説。BERTの中核であるTransformerとAttentionがどんなものかをイメージすることができる。 (全13頁)
  5. 奥野陽他2自然言語処理の基本と技術、翔泳社、2016年:広範な話題を数式を使わずやさしく解説しようとしている。初心者が技術の概観を得るのに適す。機械翻訳の解説もあるが、発行が少し前のためか、ニューラル機械翻訳は含まれない。(全239頁)