エンジニア未経験から米国大学院コンピューターサイエンス留学

コンピュータサイエンス全般に関して未経験な私が、米国大学院(南カリフォルニア大)CS修士課程に入学し、苦闘する様子をお届けします。

【CS授業紹介 #2】NLP :自然言語処理

前回は、私がUSCで受講した講義紹介として、アルゴリズム解析を取り上げました。今回は、いわゆるNLP(Natural Language Processing)と呼ばれる、自然言語処理の授業を紹介しようと思います。

 

そもそも自然言語処理ってなんだ?

自然言語処理とは、私なりに言い換えると、人間が使う英語や日本語、スペイン語などの言語を、コンピューターに認識させて処理する技術のことです。例えば、Google検索エンジンやチャットボット、DeepLといった自動翻訳アプリには、NLPアルゴリズムが用いられています。

 

授業の担当教授は、「自然言語処理の分野は、言語学とコンピューターサイエンスの複合領域だ」と言って授業をスタートしました。また、「そもそも人間が使う自然言語には、曖昧な部分が多々あるので、完璧な自然言語のモデルは存在しない」とも言っていたのが印象的でした。

 

例えば、英語でBankという単語があります。Bankというと、まずは「銀行」という訳が、思い浮かびますよね。実はBankには、銀行に加えて「川の岸、土手」という意味もあります。

 

私たち人間は、こうした異義語に対して、使われる文脈などから判断して、無意識にBankの意味を解釈しています。ところが、コンピューターは、自然に文脈を読んだりすることができません。では、どのようにしたらコンピューターが、言語の意味を高い精度で理解して処理できるのか?これが、自然言語処理の永遠のテーマなのだと思います

 

授業の進め方

では、実際の講義の進め方について紹介します。私がこの講義を受講したのは、2022年の春学期でした。講義は、週に2回、各2時間程度の長さで実施されます。学期通して合計15週です。担当教授は、 Ron Artstein先生とMuhao先生という方の2人体制で行われました。Ron先生は、元々言語学を研究し、その後コンピューターサイエンスの領域に研究を広げた方で、人間の自然言語の性質などをわかりやすく説明してくれました。

 

また、Muhao先生は、最近流行りのニューラルネットワークを使った言語処理を得意とされている研究者でした。二人の異なるバックグラウンドによって、授業内容がバランス良く補完され、個人的には、面白い授業だったなと感じています。

 

指定の教科書などは特になく、その都度、先生からテキストや論文がシェアされて、必要に応じて読み込むという感じです。基本的には、授業のスライド資料に沿って、進められました。

 

 

自然言語処理のタスク例

自然言語処理の基本的な流れは、かなりざっくり言うと、

1:文章や単語データを分割して蓄積

2:それらのデータをモデルに学習させる

3:学習したモデルに、新たなインプットを流し、判別処理する

(※教師なし学習などを使う場合は、異なる処理となりますが、ここでは省きます)

という流れです。

 

 

簡単な例をもとに考えてみましょう。ニューラルネットワークを用いて、簡単なテキストとその内容分類をするタスクを行うとします。

 

 

レーニングデータとしては、次のようなテキストと、ラベルのセットがあると仮定しましょう。

テキスト:今日は天気が良いですね  & ラベル:挨拶文

テキスト:今日の天気はどうですか  & ラベル:疑問文

 

 

こうしたトレーニングデータには、まず前処理として、句読点や、意味のない「は」や「が」などを除去する作業を施します。そして、残った単語を全て、コンピューターが扱える数字、数列などに変換します。例えば、下記のような具合になります。

 

テキスト:今日 天気 良いですね     ラベル:挨拶文

     [5       1         3]                   [3]

 

 

これで、トレーニングデータの「今日は天気が良いですね。(ラベル:挨拶文)」というテキストデータが、[5 1 3][3]という、1✖️3次元のベクトルと、数字ラベルに変換されました。あとは、同様の作業を、他のトレーニングデータにも施していき、第一ステップの前処理は完了です。

 

 

次に、前処理したデータをモデルに学習させるステップです。下の図は、ニューラルネットワークのモデルに前処理したデータを適用している例です。具体的には、モデルのinputデータに”今日 天気 良いですね”にあたる、[5 1 3]という数列を入れ、outputデータに挨拶文というラベルに該当する、[3]を入力します。

モデル学習のプロセス略図

 

“今日 天気 良いですね”&“挨拶文”というデータセットの他にも、たくさんのトレーニングデータを当てはめ、モデルの中間層の重み付けなどを調整していきます。そして、トレーニングデータによる学習を何度か繰り返し行い、判定精度を高めていきます

 

実際のコードにおいては、トレーニング段階での判定精度をチェックしながら、ある程度、判定精度が高まってきた段階で、トレーニングをストップさせるプログラムを書いています。下記は、私が課題で書いたプログラムの一例です。

筆者が書いたコードの一部

 

図の中段付近にある、”Epoch 1/3”というのが、モデルを学習させた結果表示で、学習1周目という意味です。学習1周目では、判定精度(Accuracy)が0.6462でしたが、3周目になると0.8544まで高くなりました。十分な判定精度だと考えたので、私は、3周でトレーニングを終了しました。

 

 

最後に、新たなデータを用いて、このモデルによる判定を実験します。例えば、”明日はどんな天気になりますか?“などのインプットデータを複数与えて、文章ラベルを判定させ、精度をチェックします。

 

モデルによる判定結果の例

図の下の方に、結果が出ています。新たなデータで判定を試したところ、精度は、0.829でした。三流プログラマーの私にとっては、まずまずの精度だったと思います。。

 

 

以上が、ニューラルネットワークを使った、自然言語処理の一例です。

なお、授業においては、ニューラルネットワーク以外にも、様々なアルゴリズムや言語処理のタスクに触れて学びました。授業で扱った内容は、大きく分けて下記の3つのような感じでした。

 

 

<1 NLPでよく活用される機械学習アルゴリズム

→ナイーブベイズや、ロジスティック回帰、パーセプトロンアルゴリズムなど、基礎的な機械学習アルゴリズムをレビューし、それらが、実際の言語処理にどのように活用されているか、という内容です。また、ニューラルネットワークを使ったモデル、近年話題のTransformerモデルについても学びました。

 

<2 NLPに必要不可欠なタスクの理解>

→文章データのトークン化(単語などの小さな塊にデータ分割すること)、word representation(単語データの集まりを意味のある形で整理すること)、単語の分類ラベルづけ(人、場所、モノなど)、文章要約、などです。

 

<3 実際のデータを使った実践ワーク>

個人で取り組むプログラミング課題4つと、チームで取り組む言語処理プロジェクトが1つありました。

 

 

課題や試験、成績評価など

成績評価方法は、担当教員によって、異なるので参考にならないかもしれませんが、私の時は、グループプロジェクトが全体の40%, その他は個人課題(4つの個人プロジェクト)によって評価されました。

 

<個人課題>

先ほどのニューラルネットワークによるタスクのような、判定精度を高める課題に4種類取り組みました。与えられたデータセットどれだけ高い精度で判定できたかどうかが、評価ポイントになります。提出後は、クラスメンバーの判定精度に関するリーダーズボードが示され、その順位によって採点されます。下記のグラフは、その採点資料の一部です。

 

クラスメートがみんな優秀すぎる...

 

ちなみに私は、この課題における判定精度は、83%でした。ご覧いただくとわかる通り、クラス内で下から1/4にも届かない順位になります…。。。。深夜まで頑張って提出しても、毎回こんな感じの結果を突きつけられるので、死にたくなります。おっと本音が出てしまった。

 

 

 

<グループプロジェクト>

メンバーと話し合って、研究課題を決め、自然言語処理アルゴリズムを用いて、結果評価と考察を行うプロジェクトでした。私たちのグループは、映画の字幕データとIMDB(Internet Movie Database)に公開されている評価レーティングのセットを用いて、字幕データから評価レーティング予測を行うプロジェクトを行いました。最後の授業では、各グループがポスターセッションを行い、楽しい雰囲気で意見交換をすることができました。

 

ポスターセッションにてチームで撮影。筆者は左から3人目

 

グループメンバーがみんな優秀で、とてもスムーズにプロジェクトを進めることができました。インドから3人、ドバイから1人と私。最後の授業後に、スタバで打ち上げしたのは、今でも良い思い出です。4人のうち、2人はMeta、1人はAmazonで夏のインターンをすると言っていました。今も元気にしているかな〜

 

私にとっての学び

成績評価については、思わず暗い気持ちになるので、私なりの学びを最後にまとめます。

 

まず、チームプロジェクトや講義の過程で、様々な関連論文を読み込む機会に恵まれました。これによって、今の言語処理学会でどのようなトピックが議論されているのか、近年話題となった論文はどんな内容だったのか、など言語処理学会の入り口を覗けた気がします。(勘違いかもしれませんが)

 

例えば、講義で読んだ論文の中でも特に印象的だったのが、下記の論文です。

arxiv.org

 

この論文は、現在話題となっているTransformer型大規模言語モデルの先祖とも言える論文です。ここ数年の言語処理系の学会においても、とても影響力のある論文だったそうです。内容については、ちっとも理解できませんでしたが、なんと言ってもタイトルがカッコイイ!!(感想が小学生)

 

 

この講義を受けて半年くらいが経った後、Chat-GPTが流行り始めました。その時、このTransformerの源流となった論文を思い出したのです。この論文を読んで、Transformerの前後を少し知っていたので、N L Pの歴史的なタイミングを身近に感じられて、少しテンションが上がりました

 

 

他にも色々と学びになりましたが、まあこんな感じですかね。

 

以上、今回は、N L P(自然言語処理)の講義について紹介しました。参考になりましたでしょうか。

それでは!