u++の備忘録

【書籍メモ】『機械学習・深層学習による自然言語処理入門 scikit-learnとTensorFlowを使った実践プログラミング』

2月26日に刊行された『機械学習・深層学習による自然言語処理入門 scikit-learnとTensorFlowを使った実践プログラミング』を読みました。

「日本語」のデータで、「今の自然言語処理」をイチから学ぶ!

公式サイトの宣言文句が、本書の特徴を言い得ています。日本語のデータセットを前提として前処理を含めた概念やコードが丁寧に解説されている点、伝統的な手法と近年発展するニューラルネットワークによる手法の両者が掲載されている点が、現時点で独自性があり優れている書籍だと感じました。

書籍情報

公式サイト

book.mynavi.jp

サポートページ

サポートページには、サンプルコードと訂正情報が記載されています。サンプルコードは、ローカル環境で実行するためのファイル群を圧縮したzipファイル形式と、Google Colaboratory形式の2パターン提供されています。

book.mynavi.jp

著者紹介

本書の著者は、(著者名だけ見ると分かりづらいかもしれませんが)定期的にQiitaはてなブログで特に日本語の自然言語処理に関する有益な情報を発信している方です。私も日本語の分散表現の事前学習モデルなど、有り難く活用しています。

普段は企業のR&D部門で自然言語処理/機械学習の研究開発をしている方らしく、本書でも2章でシステム化におけるパイプラインを明示している点など、実応用の視点が随所にうかがえます。

章別の所感

本書の章別に、私の雑感を記します。

Chapter 1 自然言語処理の基礎

自然言語」とは何か、具体的にどのようなタスクが存在するかを説明している章です。応用技術として機械翻訳・質問応答・対話システムなども紹介しており、本書全体の導入の立ち位置です。

Chapter 2 機械学習

近年の自然言語処理の急速な発展を下支えしている「機械学習」を概説する章です。規則性に基づく手法とは異なりルール自体を学ぶ機械学習について「教師あり学習」「教師なし学習」「強化学習」の枠組みに分けて紹介しています。本章は自然言語処理に限らない話を取り扱っていますが、具体例や図が豊富で汎用的に分かりやすいと感じました。

次章以降でコードが登場する前準備として、ローカルの開発環境の構築方法もスクリーンショット付きで初学者向けに説明しています。

Chapter 3 コーパス

自然言語で記述されたデータ集合「コーパス」について、1章分を割いてまとめています。csv, tsv, jsonというファイル形式の解説など基礎的な部分から網羅していました。実際に自分でデータセットを準備する際に必要になる「スクレイピング」や「アノテーション」にも触れられています。

Chapter 4 テキストの前処理

個人的に、本書が最も価値を持つと感じた章の一つです。自然言語処理に関する優れた文献は数多くありますが、日本語のデータセットを前提としてテキストの前処理についてコード付きで丁寧に解説している書籍は多くありません。HTMLタグの削除・単語分割・正規化・「ストップワード」の除去に加え、本書の後半で登場するニューラルネットワークを扱う上での全体と成る、単語のID化や系列長を揃える「パディング」も扱っています。

Chapter 5 特徴エンジニアリング

N-gram」「Bag of Words」「TF-IDF」などの伝統的な特徴ベクトル作成手法を解説している章です。近年でも十分に有用性がある手法を紹介しつつ、単語の順序情報を失っている問題点にも触れています。ここでは「おまけ」として掲載していますが、本書の後半部分で扱う要素にも関わるので、もう少し強調して記載しても良かったのではと個人的に感じた面もあります。スケーリングや特徴選択など、必ずしも自然言語処理の文脈に限らない話にも言及がありました。

Chapter 6 機械学習アルゴリズム

前章で獲得した特徴ベクトルを「ロジスティック回帰」に投入します。単なるパッケージの使い方にとどまらず、数式を交えて損失関数やオプティマイザといった内部構造にも言及があります。機械学習アルゴリズムを評価する文脈の中で「交差検証」「過学習」「正則化」といった要素も丁寧に紹介しており、その流れで実際にハイパーパラメータ調整も実行しています。決して自然言語処理特有の話題ではないにもかかわらず、機械学習を実運用する上で欠かせないこれらの概念が盛り込まれている点は、とても素晴らしいと感じました。

Chapter 7 ニューラルネットワーク

本章から、近年発展するニューラルネットワークによる手法を取り扱っていきます。シンプルな多層パーセプトロンを題材にニューラルネットワークの概念を紹介し、実際にkerasを用いて実装も進めます。モデルの保存・読込や、過学習を防ぐための「Early Stopping」、実行ログを可視化できる「TensorBoard」の紹介もあります。実用面が強く意識された書籍という印象を受けました。

Chapter 8 単語分散表現

自然言語処理の手法として著名な「Word2Vec」を解説している章です。単に単語をベクトル化するツールとして活用するのではなく、前章で解説したニューラルネットワークを用いて「分散表現」を獲得する過程を説明しています。分量は多くありませんが、単語の分散表現の評価手法に関する言及がある書籍は珍しいと感じました。

Chapter 9 テキスト分類

Chapter 6ではロジスティック回帰を用いて実装したテキスト分類タスクに対して、ニューラルネットワークの「RNN」「LSTM」「CNN」を適用します。前章で扱った単語分散表現についても、ニューラルネットワークのEmbedding層の初期値にする文脈で登場します。

Chapter 10 系列ラベリング

文ではなく単語などの系列単位でラベル付けする「系列ラベリング」について、特に「固有表現抽出」の話題を取り上げる章です。前章のLSTMを拡張した「双方向LSTM」、そして近年の自然言語処理に飛躍的な進歩を生み出した「BERT」が登場します。個人的に「BERT」の実装はPyTorchのtransformersを利用することが多いため、改めてkerasのコードを読むのは勉強になりました。予測ラベル間の制約を考慮できる「条件付き確率場」も紹介しています。

Chapter 11 系列変換

機械翻訳に代表される「系列変換」を扱う章です。Google翻訳など、多くの方に馴染みの深い話題だと思います。基礎となる「エンコーダ・デコーダ」について数式を交えて解説しつつ、実装の評価の中で「GLUE」も紹介しています。エンコーダ・デコーダの課題に応える形で「アテンション」が登場するので、コードの書き換えの過程も含めて理解が進む構成になっていると感じました。

Chapter 12 機械学習クラウド

最終章の題材は、Google Colaboratory、AutoML、自然言語処理用のAPIです。クラウドについて具体的に触れている点は、近年のデータサイエンスを取り巻く環境の変化を実感させられます。

おわりに

本記事では、『機械学習・深層学習による自然言語処理入門 scikit-learnとTensorFlowを使った実践プログラミング』を紹介しました。

私自身も業務の中で機械学習自然言語処理を取り扱っていますが、イマドキの日本語の自然言語処理について基礎から応用までを広く体系立てて書籍という形でまとめるのは、本当に骨の折れる作業だったと想像します。著者への感謝を述べて、本記事の結びとします。