Transformerによる感情分類をPython,Kerasで実装・実行

かなりのご無沙汰になりました。

プライベートではサイクリングやカフェ、そしてブルアカ三昧な日を過ごしてましたが、そうこうしているうちに、社会ではChatGPTやBing AI,Stable Diffusionに代表される生成系AIが目覚ましく発展し、これからどんどん社会実装されていく勢い。気づかないうちに置いてきぼりをくらいそうな感触です。

特に、chatGPTやGPT-4などの自然言語処理AIがここまで人間レベルまでに発達するとは、数年前には予想できなかったですね。言語をAIに取られたら、いよいよ人間は知的活動の関わる仕事(ホワイトカラー)や勉強で何をしていけばいいのか、路頭に迷いそうな予感がしています。

ここまで来たAIをいまさら、追いつこうと勉強して意味あるのかという気もします。しかし、今後AIが主役の社会になったら、もう意味があるとか、役に立つとかではなく、知りたいとか、やってみたいという好奇心が、人間の行動動機になっていくと思うので、そんなこと気にするのはナンセンスかなと。

というわけで、今世間を賑わしているGPT系のAIについて、今回取り上げて見たいと思います。

自然言語処理AI

自然言語処理系AIは、通常のディープニューラルネットワーク(DNN)や画像処理系の畳み込みニューラルネットワーク(CNN)に比べて複雑で、自分も勉強したり扱ったりするのを敬遠してました(苦笑)

自然言語処理AIといえば、再帰型ニューラルネットワーク(RNN)やLSTMなどが以前は主流でしたが結構複雑で、ある程度のものを作ってみたことはあるものの。

https://nine-num-98.blogspot.com/2020/08/ai-rnn-01.html

いまいち理解が難しく、気持ち悪さが正直ありました。ここで、最近になってこれらを押しのけてデファクトスタンダードとなってきたのが「Transformer」です。ChatGPTの名前の一部(GPT: Generative Pre-trained Transformer)にもなっています。このAIアーキテクチャですが、LSTMなどに比べてまだ分かりやすい印象を受けました。

Transformer

2017年にGoogleの研究者たちが発表した以下の論文。

Attention is All you Need

https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf

ここでTransformerというAIモデルが提案されました。
「Attentionが必要なもののすべて。」
「Attensionさえあれば、もう何もいらない。」
「Attentionしか勝たん!」

というちょっと大げさな意味のタイトルですが、今にしてみればAttention、それを採用したTransformerの威力はそう評しても過言ではないと思います。

Attentionとは「注意」という意味で、文章の単語同士の関連性に注目する手法を考案し文脈を理解した自然言語処理AI「Transformer」を作りあげました。

Transformerは「変成器、変圧器、変換器」などの意味をもち、関連があるらしいですが、某有名映画のタイトルでもありますね。その変換するという名の通り、入力された文章を翻訳したり、応答文を返したり、文章の感情分析を行えたりと、様々な自然言語処理を行う能力を持っています。


Attention is All you Need より引用

これが、Transformerのモデル図です。全体的にはエンコーダー&デコーダーの構成。エンコーダー側では、入力文を計算可能な数値ベクトルに変換したうえでAttention層、全結合層を通過させデコーダーに入力。デコーダー側では、エンコーダーの入力の他、入力文から得たい応答文を、同様にAttenttion層、全結合層を通過させたものをさらにAttention層等を通して、最終的な応答文を生成します。

このTransformerですが、スケーリング則(Scaling Raw)というものが存在し、それは
・Transformerのネットワーク規模が大きいほど
・学習データの数、種類が多いほど
・計算させるコンピュータの計算能力が高いほど(学習回数、速度が大きいほど)
AIの性能が向上するというものです。

ChatGPTでは、このTransformerのデコーダー部分のみを使っているそうですが、上記のような大規模なリソースを準備して作って動かしてみたら、あのようになったという経緯らしいです。

ターミネーターのような汎用人工知能(AGI: Artificial General Intelligence)や、人工の神ともいえる超知能(ASI: Artificial Super Intelligence)も、このTransformerの進化により、そう遠くない未来に出来てしまうのかもですね。

TransformerによるIMDB感情分類

Transformerを実際に組み上げて、使ってみるためのサンプルコードは、Web上にあふれていますが、比較的簡単なサンプルとしてKerasのドキュメントで紹介されているIMDB感情分析があります。

Text classification with Transformer
https://keras.io/examples/nlp/text_classification_with_transformer/

IMDbという映画レビューサイトに存在するレビュー文(英語)の感情分類を行うプログラムです。レビュー文をTransformerに読み込ませレビューが
「高評価(この映画よかった!)」をつけてるか
「低評価(いまいちだった……)」をつけてるか
を分類してもらうプログラムです。

上記のサンプルは勉強にはいいのですが、いまいち使いづらかったり、コードの見通しがあまり良くない印象だったのでこれを参考にして、Transformerによる自然言語処理を体験するサンプルコードを新たに作ってみました。

以下、開発環境とサンプルの使い方を説明します。

実行環境

◆OS
・Ubuntu 22.04.2 LTS (WSL上の仮想マシン)

または

・Windows 11

◆プログラミング言語、主なライブラリ

・Python 3.10.6
・tensorflow 2.12.0
・keras 2.12.0
・numpy 1.23.5

プログラム

GitHubにサンプルプログラムを公開します。
kotetsu99/imdb_classification (github.com)

■各プログラム等の概要

(1)01-imdb_train.py: レビュー学習プログラム
・IMDBのレビューを読み込み、高評価/低評価の分類をAIに学習させる。
・AIモデルは、TransformerのEncoder部分を主に使用

(2)02-imdb_test.py: レビュー分類プログラム
・(1)で学習させたAIモデルを使って、IMDBレビューの分類(高評価/低評価)の分類を行う。

(3)imdb_model: AIモデル保存ディレクトリ
・(1)で学習したAIモデルの保存先

chatGPTやBing AIのようにチャットできる自然言語処理AIではありませんが、Transformerを簡単に作って動かしてみる勉強程度にはなったかなという出来です。

■プログラム使用方法

(1)レビュー学習プログラムの実行

01-imdb_train.py

を実行して、IMDbレビューの感情分類をAIに学習させます。CUI上で、プログラムのあるディレクトリに移動し以下のコマンドを実行します。

python 01-imdb_train.py imdb_model

末尾の「imdb_model」が保存するAIモデル(ディレクトリ)になります。このAIモデル名が存在しない場合は新規作成。存在する場合はそれを読み込んで、再学習させるように実装しています。

(2)レビュー分類プログラムの実行

02-imdb_test.py

を実行して、AIによるIMDbレビューの感情分類を行います。以下のコマンドを実行します。

python 02-imdb_test.py imdb_model

末尾に(1)で生成したAIモデルを指定して実行します。すると、以下のメッセージが出現します。

レビュー番号を入力してください(1~25000の番号):


学習に利用したimdbレビュー25,000件中1件のレビューの番号を入力するように求められます。1を入力した際には、以下の結果が返されます。


レビュー番号を入力してください(1~25000の番号):1
[START] this film was just brilliant casting location scenery story direction everyone's really suited the part 
they played and you could just imagine being there robert 
[OOV] is an amazing actor and now the same being director 
[OOV] father came from the same scottish island as myself 
so i loved the fact there was a real connection with this film the witty remarks throughout the film were great 
it was just brilliant so much that i bought the film as soon as it was released for retail and would recommend 
it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what 
they say if you cry at a film it must have been good and this definitely was also congratulations to the two little boy's that played the 
[OOV] of norman and paul they were just brilliant children are often left out of the praising list 
i think because the stars that play them all grown up are such a big profile for the whole film but 
these children are amazing and should be praised for what they have done don't you think the whole story was so lovely 
because it was true and was someone's life after all that was shared with us all
スコア=99.88020658493042:高評価をつけたレビューです。

レビュー番号を入力してください(1~25000の番号):


imdbのレビュー(英語)1件が表示された後、レビューの感情分類の結果が返されます。レビュー文のうち、[START]は文頭を意味し、[OOV]は「Out-of-vocabulary」の略でAIに学習させていない単語(ある出現頻度に達していない単語)で伏字とされています。

スコアは、レビューでよくつけられている点数を100点満点で表したものです。厳密には、高評価をつけたレビューであることの確率を表すのですが
(↑の例では、99.88……%の確率でこれは高評価レビューである。逆に、0.119……%の確率で低評価のレビューである。)
これを、100点を満点とするスコアと解釈しました。

・50スコア以上で高評価
・50スコア未満で低評価

としています。

本プログラムは実行後、レビュー番号の入力⇒評価の確認を何度も行えます。プログラムを終了する際は、Ctrl + C を押下で終了します。


レビュー番号を入力してください(1~25000の番号):^C
Ctrl + C により強制終了


上記のプログラムの解説は、また別記事として公開したいと思います。

スポンサーリンク