【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つのような感じでした。
→ナイーブベイズや、ロジスティック回帰、パーセプトロンアルゴリズムなど、基礎的な機械学習アルゴリズムをレビューし、それらが、実際の言語処理にどのように活用されているか、という内容です。また、ニューラルネットワークを使ったモデル、近年話題のTransformerモデルについても学びました。
<2 NLPに必要不可欠なタスクの理解>
→文章データのトークン化(単語などの小さな塊にデータ分割すること)、word representation(単語データの集まりを意味のある形で整理すること)、単語の分類ラベルづけ(人、場所、モノなど)、文章要約、などです。
<3 実際のデータを使った実践ワーク>
個人で取り組むプログラミング課題4つと、チームで取り組む言語処理プロジェクトが1つありました。
課題や試験、成績評価など
成績評価方法は、担当教員によって、異なるので参考にならないかもしれませんが、私の時は、グループプロジェクトが全体の40%, その他は個人課題(4つの個人プロジェクト)によって評価されました。
<個人課題>
先ほどのニューラルネットワークによるタスクのような、判定精度を高める課題に4種類取り組みました。与えられたデータセットをどれだけ高い精度で判定できたかどうかが、評価ポイントになります。提出後は、クラスメンバーの判定精度に関するリーダーズボードが示され、その順位によって採点されます。下記のグラフは、その採点資料の一部です。
ちなみに私は、この課題における判定精度は、83%でした。ご覧いただくとわかる通り、クラス内で下から1/4にも届かない順位になります…。。。。深夜まで頑張って提出しても、毎回こんな感じの結果を突きつけられるので、死にたくなります。おっと本音が出てしまった。
<グループプロジェクト>
メンバーと話し合って、研究課題を決め、自然言語処理のアルゴリズムを用いて、結果評価と考察を行うプロジェクトでした。私たちのグループは、映画の字幕データとIMDB(Internet Movie Database)に公開されている評価レーティングのセットを用いて、字幕データから評価レーティング予測を行うプロジェクトを行いました。最後の授業では、各グループがポスターセッションを行い、楽しい雰囲気で意見交換をすることができました。
グループメンバーがみんな優秀で、とてもスムーズにプロジェクトを進めることができました。インドから3人、ドバイから1人と私。最後の授業後に、スタバで打ち上げしたのは、今でも良い思い出です。4人のうち、2人はMeta、1人はAmazonで夏のインターンをすると言っていました。今も元気にしているかな〜
私にとっての学び
成績評価については、思わず暗い気持ちになるので、私なりの学びを最後にまとめます。
まず、チームプロジェクトや講義の過程で、様々な関連論文を読み込む機会に恵まれました。これによって、今の言語処理学会でどのようなトピックが議論されているのか、近年話題となった論文はどんな内容だったのか、など言語処理学会の入り口を覗けた気がします。(勘違いかもしれませんが)
例えば、講義で読んだ論文の中でも特に印象的だったのが、下記の論文です。
この論文は、現在話題となっているTransformer型大規模言語モデルの先祖とも言える論文です。ここ数年の言語処理系の学会においても、とても影響力のある論文だったそうです。内容については、ちっとも理解できませんでしたが、なんと言ってもタイトルがカッコイイ!!(感想が小学生)
この講義を受けて半年くらいが経った後、Chat-GPTが流行り始めました。その時、このTransformerの源流となった論文を思い出したのです。この論文を読んで、Transformerの前後を少し知っていたので、N L Pの歴史的なタイミングを身近に感じられて、少しテンションが上がりました。
他にも色々と学びになりましたが、まあこんな感じですかね。
以上、今回は、N L P(自然言語処理)の講義について紹介しました。参考になりましたでしょうか。
それでは!