PyTorchを用いたディープラーニング実装の学習方法 (Part 3)

PyTorchを用いて画像処理から自然言語処理など、様々なDeepLearningの実装手法を学習する方法を解説します(Part 3)。( I introduce how to learn PyTorch Implementation for Japanese people).

本シリーズの内容

[1] 機械学習そのものが初心者の方へ
[2] これからPyTorchを学びはじめる方へ
[3] 画像分類の転移学習とファインチューニング
[4] 物体検出(SSD)
[5] セマンティックセグメンテーション(PSPNet)
[6] 姿勢推定(OpenPose)
[7] GANによる画像生成(DCGAN、Self-Attention GAN)
[8] GANによる異常検知(AnoGAN、Efficient GAN)
[9] 自然言語処理による感情分析(Transformer)
[10] 自然言語処理による感情分析(BERT)
[11] 動画分類(3DCNN、ECO)
[12] さらに発展した内容を学びたい方へ
※本記事(Part 3)では、[9]~[12]を解説します

Part 1([1]~[3])はこちら
Part 2([4]~[8])はこちら

[9] 自然言語処理による感情分析(Transformer)

前記事まででは、データに画像を使用していました。

ここからはテキストデータ(文書データ)のディープラーニング手法について解説します。

引き続き、拙著
「つくりながら学ぶ! PyTorchによる発展ディープラーニング」を使用します。

本書の第7章「自然言語処理による感情分析(Transformer)」を使用します。

ここで最初に取り組むのは、単語の分散表現です。

ディープラーニング登場以前では、各単語にIDを振り、IDで単語を数値化することでテキストデータを扱っていました。

ディープラーニング登場後は、word2vecと呼ばれる技術が提案され、「単語を多次元の特徴量ベクトル(分散表現)」で表せるようになりました。

本章ではまず、このword2vecで単語の分散表現を獲得し、実際に単語の分散表現が機能していることを確認します。

ポイントとしては、
・word2vec(CBOW、Skip-gram)
・fastText(サブワード)

の概念を押さえることです。

これらを書籍では、図を用いて解説します。

word2vec(CBOWとSkip-gram)

続いて、東北大学 乾・岡崎研究室:日本語 Wikipedia エンティティベクトル「entity_vector.model.bin」を利用したword2vecを用いて、日本語の単語を分散表現で表し、

「姫−女性+男性」の単語ベクトルを計算した際に、「王子」となるのかを実際に確かめてみます。その際に、比較の対象として、「女王」、「王」、「王子」、「機械学習」の4単語を用意します。

なお、日本語の文章を扱う際には、文を単語に分割する「分かち書き(形態素解析)」を実施する必要があります。

日本語の形態素解析ライブラリとしては、Janome、MeCab、Juman、Sudachiなどが有名です。本書では一番手軽に使用できるJanomeを使用します。

同様に、fastTextでも「姫−女性+男性」の単語ベクトルを計算した際に、「王子」となるのかを実際に確かめてみます。

ここまでは日本語データを扱いましたが、ここからは英語のテキストデータで自然言語処理を学びます(日本語での自然言語処理手法についても後ほど紹介します)。

本章では文書データとして、IMDb(Internet Movie Database) と呼ばれる映画のレビュー文章を集めたデータを使用します。

そして、torchtextを利用して自然言語処理用のPyTorchのDatasetおよび、DataLoaderの作成方法を解説します。

本章で行いたいタスクは、IMDbの映画レビューの内容がPositve(高評価)なのか、Negative(低評価)なのかを、レビュー文章から判定するクラス分類問題です。

ここではディープラーニングモデルとして、論文「Attention Is All You Need」で提案された「Transformer」と呼ばれるモデルを実装しながら、解説します。

Transformerの特徴について解説します。これまでテキストデータのような順序データ(文章のように前から順番に意味を持って単語などのデータが次々と現れるようなデータ)には、LSTMなどのリカレント・ニューラルネットワークと呼ばれる手法を使用するのが一般的でした。

しかし、Transformerではリカレント・ニューラルネットワークを使用せず、全結合層と、Part 2で登場したSelf-Attention GANにも使用されていたSelf-Attentionを利用して文章を処理します。

本書では、はじめにTransformerの大きなモジュール構成と各モジュールの役割を解説します。

その後各モジュールの詳細を解説して、さらに各モジュールの各サブモジュールについて実装しながら、解説を行います。

実装しながらTransformerについて解説したのち、最後に、IMDb映画のレビュー文章のポジ・ネガクラス分類に挑戦します。本書の場合、85%程度の正解率となります。

最後に、Self-Attentionが実際にどのように機能して、文章がPositive、もしくはNegativeと判定されたのか、確認してみます。

なお本章もその他の章も、本書の実装コードは全て以下のGitHubに公開しています。

[10] 自然言語処理による感情分析(BERT)

次に、Transformerをベースとしてさらに進化した自然言語処理モデルであるBERT(Pre-training of Deep Bidirectional Transformerを解説、実装します。

BERTは自然言語処理のディープラーニングのなかでも、非常に重要なモデルです。

例えば以下に示すように、Google検索でもBERTが適用されるようになりました。

https://www.itmedia.co.jp/news/articles/1910/27/news014.html

このBERTはTransformerをベースとしたディープラーニングモデルです。

BERTには実用上、次に示す3つの特徴があります。
・文脈に依存した単語ベクトル表現を作れるようになった
・自然言語処理タスクでファインチューニングが可能になった
・Attentionにより説明性と可視化が簡便(Attentionによる説明性の完璧さはともかく・・・)
です。

このようなBERTの特徴は、事前学習(Pre-training)を実施することで実現されています。

BERTの事前学習は2種類実施され、Masked Language Model とNext Sentence Predictionを実施します。

本書ではこれら2つの事前学習について解説します。最新のBERTの進化系手法では事前学習にこれらの亜種を使用するように変化していますが、事前学習をするという点は同じです。

なぜ事前学習をするのかというと、「文脈に応じた単語ベクトルを獲得するため」です。

例えば、英単語のbankは銀行という意味と、川の土手という2通りの意味があります。通常のTransformerではどちらの意味でも同じ単語の分散表現をword2vecやfastTextから獲得して使用します。

ですが、BERTでは、この単語bankを含む文章全体を考慮して、単語の分散表現を加工します

そして加工された単語の分散表現を利用してクラス分類などを実施します。この点が上記で引用した記事のように、意図をくんで答えると呼ばれたる所以です。

そして、この単語ベクトルを文脈に応じて変化させたBERTの出力を使って、ファインチューニングすることで、様々な自然言語処理タスクを解くことができるようになりました。

本書では最初のBERTの全体像、モジュール構成を説明したあと、各モジュールを解説し、そのサブモジュールを実装しながら、動作を解説します。

続いてBERTの単語分散表現の加工を確かめるために、単語「bank」を用いた文章を3つ用意します。

  • 文章1: 銀行口座にアクセスしました。(”[CLS] I accessed the bank account. [SEP]”)
  • 文章2: 彼は敷金を銀行口座に振り込みました。(”[CLS] He transferred the deposit money into the bank account. [SEP]”)
  • 文章3: 川岸でサッカーをします。(”[CLS] We play soccer at the bank of the river. [SEP]”)

上記3つの文章の単語bankの、BERTでの最終的な分散表現を比較し、文章1と2のbankは意味が似ている(分散表現が似ている)が、文章3のbankは似ていない(分散表現が異なる)ことを確かめます。

このようにして、BERTの文脈依存な単語の分散表現の特徴を確認したあと、本書の第7章と同様に、IMDb映画のレビュー文章のポジ・ネガクラス分類に挑戦します。

本書の場合、BERTでは90%ほどの正解率となります(Transformerが85%程度だったので、5%も改善されます)。

本書内では英語のIMDbデータを扱っていますが、日本語でのLivedoorニュースでのBERTの実装については、以下のQiita記事で解説しています

【実装解説】日本語版BERTをGoogle Colaboratoryで使う方法(PyTorch)
https://qiita.com/sugulu/items/e522a38b812b8edb8a54

【実装解説】日本語版BERTでlivedoorニュース分類:Google Colaboratoryで(PyTorch)
https://qiita.com/sugulu/items/697bd03499c1de9cf082

BERTは2018年に発表され、2020年現在では様々な進化系が登場し活躍しています。ですが、それらのベースとなる基本的なBERTを、まずはぜひ理解し、自分で実装できるように押さえてください。

[11] 動画分類(3DCNN、ECO)

書籍では最終章となります。ここまで、画像データ、テキストデータを扱ってきました。最後に動画データの扱いを解説します。

画像データでは物体が縦、横の2次元にぶれる(位置が微妙に変化したりする)ため、2次元の畳み込みとPoolingを利用して、位置のズレを吸収する工夫を実施していました。

動画の場合にはさらに動作の開始や終了の時刻が時間方向にもズレるので、画像の2次元+時間の、3次元の畳み込み(3D Convolution)を利用するのが特徴的です。

本書ではECO(Efficient Convolutional Network for Online Video Understanding)と呼ばれる手法を解説・実装します。

ECOでは動画をフレームごとに画像に分解し、画像処理を実施したのちに、時間の順序を守って3D Convolutionで処理して、クラス分類を実施します。

ECOでは3D Convolutionの部分は、Resnet_3Dで実現されます。本書ではResnet_3Dの各モジュールを実装しながら、解説します。

ECOのモデルを実装、解説したのちに、Kinetics( The Kinetics Human Action Video Dataset) と呼ばれる、人物の動作に関する動画のデータセットを利用して、動作の分類タスクをECOで実施します。

動画のディープラーニングモデルを0から学習するのは大変なので(計算量が莫大)、本書では学習は雰囲気を確かめるに留めます。

そして、学習済みのECOモデルのパラメータをロードして、動画データに対する推論を実施します。

以上、画像データ、テキストデータ、動画データに対するディープラーニングの各種手法の実装方法を、拙著「つくりながら学ぶ! PyTorchによる発展ディープラーニング」を用いて自己学習する流れを解説しました。

とくに本書の第1章、第2章ではPyTorchでの実装の流れを丁寧に記載しているので、最初の2章はしっかりと取り組み、その他は自分の興味がある対象のデータ形式の章に挑戦するのも良いかもしれません。

ですが、本書では様々なディープラーニングのテクニックが出現し、前の章から順番に解説するため、可能であれば、最初から順番に一通りやり切ることをおすすめします。

https://www.amazon.co.jp/dp/4839970254/

[12] さらに発展した内容を学びたい方へ

最後に、先の書籍では取り扱わなかった内容を学ぶ手法を案内します。ここでは「深層強化学習」と「因果分析」の学習方法を解説します。

先の書籍では深層強化学習(Deep Reinforcement Learning)は取り挙げていません。

深層強化学習は別途書籍を用意しており、拙著「つくりながら学ぶ! 深層強化学習 ~PyTorchによる実践プログラミング~」を活用ください。

この書籍では、ニューラルネットワークを使用しない表形式の単純な強化学習で迷路の解く問題から解説を始めています。

深層強化学習以前に、強化学習をまず理解するところから解説しています。

迷路の次にCartPole(倒立振子)と呼ばれる、バランス良く棒を立てる制御を表形式の強化学習で実現します。

表形式の強化学習を実装できるようになったあと、強化学習にニューラルネットワークを使用する深層強化学習について解説し、初期の代表的手法である、DQN(Deep Q-Network)を実装しながら解説します。

DQNを実装できるようになったあとは、以下の「深層強化学習の発展の歴史図」に従い、DQNの進化系である、

  • DDQN(Double-DQN)
  • Dueling Network
  • Prioritized Experience Replay
  • A2C

を、同じくCartPole問題に対して実装しながら、解説します。

そして、本書では最後にDQNが有名になったきっかけである、「ブロック崩しゲーム」をA2Cで攻略する手法を、実装しながら、解説します。

なお、注意点として、拙著「つくりながら学ぶ! 深層強化学習 ~PyTorchによる実践プログラミング~」は2018年と2年前に出版された書籍です(そのころ、PyTorchのバージョンは0.4でした。2020年8月現在ではPyTorchのバージョンは1.6です!!)

バージョンの違いによる問題点などはGitHubのIssueをご確認ください。

またこの2年間で深層強化学習のアルゴリズムも進化しており、最近ではSoft Actor-Critic(SAC)などが良く使われています。

先日も「グランツーリスモSPORT最速完走をAIで 達人を凌駕する技術、ソニーなどが開発」https://www.itmedia.co.jp/news/articles/2008/21/news082.html
のニュースが流れましたが、こちらでもSACが使用されています。

最近の深層強化学習アルゴリズムの発展を私は以下のように整理しています。

これらの発展的手法の実装についても、ゆくゆく解説の記事を執筆したいと思います。

ここまで「深層強化学習」を解説しました。

ディープラーニングの応用的手法はまだまだたくさんあります。例えば、グラフデータに対する「グラフニューラルネットワーク」などもあります。

その他の発展的な手法としては、機械学習やディープラーニングを因果分析、因果推論、因果探索に導入する試みです。

とくに因果推論への機械学習の導入はかなり盛んです。非線形な効果を扱いやすいのでスタンダードになりつつあります。

一方、因果探索にも少しずつディープラーニングが使用されつつあります。

拙著「つくりながら学ぶ! Pythonによる因果分析 ~因果推論・因果探索の実践入門」では、因果分析の初歩の初歩から解説をはじめ、あまり数式を使わずに、実装しながら、因果推論、因果探索を学べるように執筆いたしました。

こちらの第8章「ディープラーニングを用いた因果探索」にて、SAM(Structural Agnostic Model)と呼ばれる、GANの技術を用いた因果探索手法を実装しながら解説しています。

SAMの識別器と生成器のモジュール図

因果探索や因果分析へのディープラーニングの適用、また逆にディープラーニングや機械学習への因果分析の導入は、これから発展していく分野です。

ぜひ、データサイエンティストの皆さまにはディープラーニングを因果分析に使う手法も押さえておいてください。

以上、本シリーズではPart 1からPart 3の、3つの記事で、日本語のコンテンツでPyTorchによるディープラーニング実装手法を学ぶ手段を案内しました。

日本でのPyTorch活用がさらに活発化し、日本社会・企業でのAI活用、そして産業促進の一助となれば幸いです。

--

--

小川 雄太郎(電通国際情報サービスISID)
PyTorch
Writer for

電通国際情報サービス(通称ISID)、AIトランスフォーメーションセンターに所属。AI系の研究・開発、コンサル、アジャイルでのソフトウェア開発に従事。Datascientist at Dentsu-ISID, Ltd. GitHub: https://github.com/YutaroOgawa/about_me