Amazonプライム無料体験について
プライム無料体験をお試しいただけます
プライム無料体験で、この注文から無料配送特典をご利用いただけます。
非会員 | プライム会員 | |
---|---|---|
通常配送 | ¥460 - ¥500* | 無料 |
お急ぎ便 | ¥510 - ¥550 | |
お届け日時指定便 | ¥510 - ¥650 |
*Amazon.co.jp発送商品の注文額 ¥3,500以上は非会員も無料
無料体験はいつでもキャンセルできます。30日のプライム無料体験をぜひお試しください。
新品:
¥3,960¥3,960 税込
発送元: Amazon.co.jp 販売者: Amazon.co.jp
中古品 - 非常に良い
¥3,044¥3,044 税込
配送料 ¥240 3月19日-21日にお届け
発送元: バリューブックス 【防水梱包で、丁寧に発送します】 販売者: バリューブックス 【防水梱包で、丁寧に発送します】

無料のKindleアプリをダウンロードして、スマートフォン、タブレット、またはコンピューターで今すぐKindle本を読むことができます。Kindleデバイスは必要ありません。
ウェブ版Kindleなら、お使いのブラウザですぐにお読みいただけます。
携帯電話のカメラを使用する - 以下のコードをスキャンし、Kindleアプリをダウンロードしてください。
ゼロから作るDeep Learning ❷ ―自然言語処理編 単行本(ソフトカバー) – 2018/7/21
購入オプションとあわせ買い
第2弾の本書では、自然言語処理や時系列データ処理に焦点を当て、ディープラーニングを使ってさまざまな問題に挑みます。
word2vecやRNN(リカレントニューラルネットワーク)、LSTMやGRU、seq2seqやAttention……ディープラーニングを支えるこれら最先端の技術を実装レベルでマスターできます。
前作同様、やさしい言葉で分かりやすくをモットーに、高度に見える技術の裏側をじっくり説明し、実際に作ることで理解を深めます。
最後までコンセプトは変わらない。ゼロから作る!
- 本の長さ432ページ
- 言語日本語
- 出版社オライリージャパン
- 発売日2018/7/21
- 寸法21 x 15 x 2 cm
- ISBN-104873118360
- ISBN-13978-4873118369
よく一緒に購入されている商品

この商品をチェックした人はこんな商品もチェックしています
商品の説明
出版社からのコメント
本書のコンセプト
ディープラーニングを(もしくは、何らかの高度な技術を)深く理解するには、「ゼロから作る」という経験が重要だと筆者は考えます。ゼロから作るとは、自分の理解できる地点からスタートし、できるだけ外部の既製品は使わずに目的とする技術を完成させることです。そのような経験を通じて、表面的ではなく、しっかりとディープラーニングに精通すること――それが本書の目指すところです。
結局のところ、技術を深く理解するには、それを作れるだけの知識や技量が必要になります。本書では、ディープラーニングをゼロから作ります。そのためにさまざまなコードを書き、いろいろな実験を行います。それは時間のかかる作業であり、時に頭を悩ませることもあるでしょう。しかし、そのような時間のかかる作業には――むしろ、そのような作業にこそ――、技術を深く理解する上で重要なエッセンスが多く詰まっています。そのようにして得た知識は、既存のライブラリを使うにも、最先端の論文を読むにも、オリジナルのシステムを作るにも必ず役に立つはずです。そして何より、ディープラーニングの仕組みや原理をひとつずつ紐解きながら理解することは、純粋に楽しいものです。
自然言語処理の世界へ
本書の主なテーマは、ディープラーニングによる自然言語処理です。自然言語処理とは、簡単に言ってしまうと、私たちが普段話す言葉をコンピュータに理解させるための技術です。私たちの言葉をコンピュータに理解させることはとても難しい問題であり、そして同時に重要なテーマでもあります。実際に、この自然言語処理の技術によって、私たちの生活は大きく変わりました。Web 検索や機械翻訳、音声アシスタントなど、世の中に大きな影響を与えた技術の根幹には、自然言語処理の技術が使われています。
このように私たちの生活に欠かせない自然言語処理の技術ですが、この分野においても、ディープラーニングはきわめて重要な位置を占めています。実際、ディープラーニングによって、これまでの自然言語処理の性能が大きく向上してきました。たとえば、Googleの機械翻訳ひとつをとっても、ディープラーニングベースの手法によって、大きな進化を遂げたのは記憶に新しいところです。
(中略)
本書は、ディープラーニングを中心とした自然言語処理をめぐる冒険の書です。本書は全部で8章からなりますが、それらは一連の物語のように頭から順に読むように構成されています。問題が立ちはだかり、それを解決する新しい手法を考え、そしてさらに改良を加えます。そのような流れで、自然言語処理に関するさまざまな問題を、ディープラーニングという武器を手にひとつずつ解決していきます。そしてその冒険を通じて、ディープラーニングにおける重要なテクニックを深いレベルで習得し、そのおもしろさを体感していただきたいと思っています。
著者について
登録情報
- 出版社 : オライリージャパン (2018/7/21)
- 発売日 : 2018/7/21
- 言語 : 日本語
- 単行本(ソフトカバー) : 432ページ
- ISBN-10 : 4873118360
- ISBN-13 : 978-4873118369
- 寸法 : 21 x 15 x 2 cm
- Amazon 売れ筋ランキング: - 9,004位本 (本の売れ筋ランキングを見る)
- - 53位ソフトウェア開発・言語
- - 339位電気・通信 (本)
- カスタマーレビュー:
著者について

1984年長崎県対馬市生まれ。東京工業大学卒、東京大学大学院修士課程修了。現在は、株式会社Preferred Networksにて人工知能に関する研究開発に従事。
2017年ITエンジニア本大賞(技術書部門大賞)、2019年ITエンジニア本大賞(審査員特別賞)受賞。
著書に『ゼロから作る Deep Learning』シリーズ、翻訳書に『コンピュータシステムの理論と実装』『実践機械学習システム』『実践 Python 3』(以上、オライリー・ジャパン)などがある。
カスタマーレビュー
お客様のご意見
お客様はこの書籍について、以下のような評価をしています: 説明がわかりやすく、数学的・構造的な解説が丁寧にされていると高く評価しています。ライブラリの使い方や数学的・構造的な解説が丁寧で、勾配が伝わりやすく学習効率が上がると好評です。また、フレームワークについても非常に良いという意見があります。 一方で、内容については意見が分かれています。良書であり、素晴らしい参考書だと感じています。章の構成がよく考えられており、続きが気になるページを進めることが多々あるようです。
お客様の投稿に基づきAIで生成されたものです。カスタマーレビューは、お客様自身による感想や意見であり、Amazon.co.jpの見解を示すものではありません。
お客様はこの書籍について、説明がわかりやすいと評価しています。ライブラリの使い方や数学的・構造的な解説が丁寧にされており、勾配が伝わりやすく学習効率が上がると好評です。また、前回の復習から入っているので入りやすいという意見もあります。
"...入力データの反転 による学習効果向上:57+5 → 5+75 変換後の各要素の距離が掴みやすくなるため、勾配が伝わりやすく学習効率が上がる。 ・..." もっと読む
"プログラミングができるので楽しい。が、自然言語処理の方法は既に古いので、他を当たる必要がある。" もっと読む
"そうそう、こういうことが知りたかった!ライブラリの使い方なんてちょっと検索すればわかる。数学的・構造的な解説が丁寧にされていて、とても良かったです!ありがとうございます!..." もっと読む
"RNNやAttentionなどについて、この本は処理を一歩一歩理解して、頭の中にモデルを作ることができます。 処理フローの概要がわかる本やYouTubeは多いですが、それでは何をどう機械が学習しているのか(どう逆伝播しているのか)分からないことが多いです。..." もっと読む
お客様はこのフレームワークについて、良いフレームワークだと評価しています。復習からできた導入として素晴らしいと感じており、サンプルコードも入手できる点も好評です。また、この本を読んで前へ進む決心がついたという声もあります。ただし、序盤を読み進めている方にとっては十分役に立つと感じるお客様もいます。
"自分の勉強のために購入してみました。序盤を読み進めているところですが、十分役に立つと感じました。" もっと読む
"...本書を読んで前へ進んでみる決心がつきました。 良いフレームワークがあり、サンプルコードも入手できますが、自分の抱える問題に応用するには やはりそのコードがどういう意味なのかある程度理解している必要があります。..." もっと読む
"前作で半分くらい使って説明していた内容が1章に簡潔にまとまっていて、復習から出来たのは導入として素晴らしいと思いました。逆にこちらの本から読み始めるのはオススメ出来ないです。" もっと読む
お客様はこの書籍の読みやすさを高く評価しています。前作と比較して、さらにブラッシュアップされており、理解しやすくなったと述べています。理論と実装が今でも読み返される名著ですが、読みごたえがあると感じています。また、言語処理の手法についても興味があるようです。
"...どこの本でもそうだけど、日本人が書いたのか訳書なのかという境目はある気がする。訳の良し悪しではなく、ツボが違う、みたいな。あと、本書は文字フォントが読みやすいです(書籍で購入)。" もっと読む
"前作の「ゼロから作るDeep Learning」は学習済み。 前作と比較して、かなりブラッシュアップされており、さらに読みやすく・理解しやすくなっていた。 章の構成がよく考えられており、参考書であることを忘れて、続きが気になってページを進めることが多々あった。..." もっと読む
"ゼロから作るディープラーニングの理論と実装はいまでも読み返す名著ですが、こちらも読みごたえがあります。もともと言語処理には興味はありませんが、その手法には興味があります。その応用範囲はほぼ無限と思います。..." もっと読む
お客様はこの書籍について、良書として高く評価しています。章の構成がよく考えられており、楽しく学習できると好評です。理論の例題が豊富で、楽しく学習できるという意見もあります。一方で、内容については意見が分かれています。一部のお客様は「内容が難しい」と指摘し、専門者を教育する本だと感じています。RNN/LSTMの説明は丁寧だが、アテンションは紹介程度だという指摘があります。
"...文字変換システムを構築するのに必要な理論が詰まっている 1冊です。 理論の例題が豊富にあり楽しく学習できます。" もっと読む
"Deep Learningの自然言語処理は難しく、現実の問題に応用するには敷居が高いと思っていましたが、 本書を読んで前へ進んでみる決心がつきました。 良いフレームワークがあり、サンプルコードも入手できますが、自分の抱える問題に応用するには..." もっと読む
"...前作と比較して、かなりブラッシュアップされており、さらに読みやすく・理解しやすくなっていた。 章の構成がよく考えられており、参考書であることを忘れて、続きが気になってページを進めることが多々あった。..." もっと読む
"自然言語処理に対するRNN/LSTMの説明は丁寧だが、アテンションは紹介程度..." もっと読む
イメージ付きのレビュー

インタフェースの主流が音声になる時代の到来に向けて
上位レビュー、対象国: 日本
レビューのフィルタリング中に問題が発生しました。後でもう一度試してください。
- 2018年7月30日に日本でレビュー済みAmazonで購入ゼロベースから実装(ブラックボックスの機械学習ライブラリ使用ゼロ)してディープラーニングの中身を理解できる著作の第2弾。
本書は主に、以下の3つの技術(word2vec, RNN, RNNのseq2seq)の紹介となっている。8章の最後にTransformerもアーキテクチャ概要を図を含めて軽く話題に触れていくれている。
・word2vec
自然言語処理におけるword2vecによる推論ベースの機械学習をスクラッチで実装を体験できる。紹介されるモデルの種類は、CBOWモデル(コンテキスト(前後の単語)が与えられたとき、その間にどの単語があてはまるかを推論する方法)、skip-gramモデル(コンテキスト(単語)に対して、前後の単語を推測する方法。CBOWのコンテキストとターゲットを逆転させたもの)である。CBOWモデルのみ実装と評価、および高速化の演習が含まれている。
・RNN
それまでの従来のフィードフォワードタイプのネットワークより改善され、閉じたループする系を持つRNN(リカレントニューラルネットワーク)を、時系列を踏まえた推論が可能となる点を踏まえて紹介。RNNの現状の問題点である時系列が長くなると計算量が増える問題には学習のトランケートで対処し、勾配爆発、勾配消失が起こる問題にはゲート付きRNNを使う対策なども紹介。さらなる精度向上の施策として、ゲート付きRNN(LSTM)の多層化、ドロップアウト(ニューロンをランダムで切断)、重み共有などにも言及してくれている。
・seq2seq(RNN)
EncoderとDecoder形式の学習モデル。レイヤには言語処理にはLSTM、画像処理にはCNNなどを使う。seq2seqのディープラーニングによる文章生成を紹介。反転データを学習させたり、peekyを行う事で学習効率と精度がよくなる改善方法も紹介。さらに、Attentionという必要情報に注意を向けさせる注意機構を備えた技術の導入を実装、学習、検証まで言及してくれている。
機械学習を平たく言えば、正解データを膨大な数解析し、その中から関係性、パターンをうまく数値化して評価できるように整理した状態にコンピュータシステムを保つことである。そこから、新たに評価したい入力を与えたとき、コンピュータシステムは、それまで蓄積されたデータの傾向から、もっとも評価値が高い値を選択して答えを出す。
扱うものが、文字であろうが、画像、動画であろうが、音楽であろうが、最終的に個々を数値で評価できるベクトルや行列などに、うまく数式を駆使して落とし込むことである。そのアーキテクチャがニューラルネットワークであったりするわけである。
そして、そこに至るまで最新の研究を踏まえた高度な技術がある。その知識欲を満たしてくれるのが本書。
今作では、主に自然言語処理で使用する機械学習の基盤となるアーキテクチャの実装方法、学習方法、評価方法をこの本を読むと理解することができる。
本書を読む事で、各レイヤ(全結合層、RNN, LSTM, Attention),活性化関数、損失関数の処理の流れ、役割をpythonの実装レベルで理解する事ができる。なお、本書に記載されている数式においても高校数学レベルをクリアしていれば十分に理解できる。(それ以外の数式記号は説明が入っている)
自然言語処理におけるディープラーニングの仕組みを知りたい人に価値が出てくる著作だと感じた。
概要、メモは以下の通り。
ーーーーーーー
●1.ニューラルネットワークの復習
・数学とPythonの復習(numpy)
行列とベクトル(行ベクトル、列ベクトル)
行列ごとの演算
ベクトルの内積と行列の積
・ニューラルネットワークの推論
活性化関数(非線形な効果を与えるの):sigmoid関数の紹介
ネットワークの順伝播の仕組み
全結合層>線形変換をする(隣接するニューロン間の全てに矢印による結びつきがある)
隠れ層:隠れ層のニューロンからの出力は、まとめられベクトル(列単位でまとめられ、列数と同じ要素に纏まる)となる。
活性化関数>非線形変換をする。
・ニューラルネットワークの学習
損失:学習がどれだけうまくいっているかの指標
ある時点のニューラルネットワークの性能を示す。
損失関数:交差エントロピー誤差など
微分と勾配:損失をできるだけ小さくするパラメータを探す。微分によりy=f(x)のxの値を極限まで小さく変化した時、yの変化の度合い(ベクトルの各要素の接線の傾き=勾配)が最小になるパラメータを探す。
順伝播の反対の流れをする逆伝播(誤差逆伝播法)で勾配を求め、勾配を使って重みパラメータを更新をくりかえすのが学習。
ベクトルの各要素に関する微分をまとめたものを勾配と呼ぶ。
逆伝播の仕組み:
単純な加算、乗算ノードの説明から入り、分岐、リピート、sum、MatMul、sigmoid、Affine、Softmax with Lossなどの計算グラフ、実装を紹介。
・ニューラルネットワークで非線形の問題を解く
スパイラルデータセットのクラス分け問題。
・計算の高速化
ニューラルネットワークの推論、学習は32bit演算で十分。>従来の64bitと比較し使用メモリを半分にできる。
pythonでの32bitデータ型宣言の方法。
pythonでGPU利用の方法の紹介
CuPyはNumPyと同じAPIを実装。そのためNumpyの実装をCuPy対応に簡単に変更できるメリットがある。
●2.自然言語と単語の分散表現
自然言語処理:コンピュータに言葉を理解させるための分野。
単語意味理解の手法の紹介:
・シソーラス(類語辞書)による手法
単語の同義語や階層構造の関係性を定義したもの
問題点:ラベル付けに膨大な手作業が必要、言葉の細かなニュアンスが表現できない、時代と共に変わる言葉の変化に対応できない
解決方法:
コーパス(大量のテキストデータ)を利用したカウントベースの手法の採用する
・カウントベースの手法
コーパス(大量のテキストデータ)を使用。
「単語の意味は、周囲の単語によって形成される」という仮説に基づき、その単語と周囲の単語の頻度をカウントする。>分布仮説
上述の手法で共起行列をつくり単語をベクトル表現にしたのち、単語ベクトル表現の類似度を計測するのに「コサイン類似度」を用いて評価する。二つのベクトルがどれだけ同じ方向を向いているかがわかる。
カウントベースの改善:
・隣接する単語同士の関連を計測するため、途中で冠詞「the」などが挟まれると、本来の単語より関連度が冠詞の方に高くなってしまう問題には、相互情報量という指標で対策する。
・次元削減(SVD):ベクトルの中のほとんどの要素が0である行列(疎な行列)から重要な軸をみつけて少ない次元に表現し直す>要素が0でない密なベクトルにする。
●3.word2vec
自然言語の「推論ベースの手法」
前章の「カウントベースの手法」の問題点:
大規模なコーパスを使う場合、巨大な語彙数は巨大な行列になってしまう。計算量的に次元削減(SVD)は現実的でない。
推論ベースでは、少量(ミニバッチ)ごとに重みを繰り返し更新して学習が出来る。(逐次学習が可能)
推論ベースでは、単語の意味を的確にとらえたベクトル表現=単語の「分散表現」を可能にする。
推論ベース:
・CBOWモデル
コンテキスト(前後の単語)が与えられたとき、その間にどの単語があてはまるかを推論する方法。
入力には、推論するための前後2つの単語のone-hot表現データが必要。つまり入力層は2つ。学習したい文章の単語数に応じて入力層のニューロン数が増える。
・skip-gramモデル
コンテキスト(単語)に対して、前後の単語を推測する方法。CBOWのコンテキストとターゲットを逆転させたもの。
入力は、対象コンテキスト単語のみの要素値を1として他を0と表現した「one-hot表現」の一つの入力だけで対応できる。(入力のニューロン数=one-hot表現の要素数)
実装:CBOW「コンテキストの単語穴埋め問題による単語の推論」
入力データの整形:
テキスト「you say goodbye and I say hello.」は、単語の種類はピリオドも含めて7単語となる。(sayが重複するため)
整形後:「you say goodbye and I hello .」
one-hot表現のyou [1, 0, 0, 0, 0, 0, 0]
one-hot表現のgoodbye [0, 0, 1 ,0 ,0 ,0 ,0]
モデル例:推論したいコンテキストは7単語なので入力層のニューロンは行数と合わして7とする。
入力層(行7、列5) ー>出力層(行5、列7)-> softmax with loss(7)
※入力層は「単語の意味は、周囲の単語によって形成される」という仮説に基づき、sayを推論させたい場合は、その前後の単語であるyou, goodbyeのone-hot表現(上述)のデータ2つを入力するため2つある。
実行手順(バッチでなく1データ単位の場合):
0:入力層2つ(それぞれ行7、列5)と出力層(行5、列7)のニューロン(行列の要素ごと)の持つ重みをランダムで初期化。
1:入力層:入力のone-hot表現データを「要素数7の列ベクトル」として、ニューロンの重み(行7、列5)と行列の積を計算する。入力が二つあるのでそれぞれの入力層で計算。その結果を足して2で割ったもの次の層への出力とする(=要素数5の列ベクトル)。その出力を活性化関数で処理する。(その出力も要素数5の列ベクトル)
2:出力層:1で出力されたデータ(要素5の列ベクトル)とニューロンの重みを持つ行列(行5、列7)の積を計算し出力する(=要素数7の列ベクトル:この層は出力結果につなげるため、活性化関数は使わない)。
3:softmax with loss:2で出力された結果(要素数7の列ベクトル)を、ソフトマックス関数で分類結果(7つの要素を持つ列ベクトルの中で、一番スコアが高い要素が推論結果となる。)を出力する。また、損失関数で正解ラベルのone-hot表現(sayの単語を示すもの[0, 1, 0, 0, 0, 0, 0])と比較し誤差を求め、入力層2つと出力層のニューロンの重みを更新して学習する。
4:学習の場合は1〜3を学習データ文繰り返す。推論の場合は1〜3まで実施し、3の損失関数によるニューロンの重みの更新はしない。
※層のニューロン(行列要素)に保存され維持されているそれぞれの重みこそが、単語の分散表現の正体。これによりうまく推測できるように各単語の分散表現が更新されていく。単語の意味もエンコードされていく。
●4.word2vecの高速化
問題点:
大きなコーパスを扱うときに計算量が増える
改善:
・Embeddingレイヤの追加
入力〜中間層の計算:当該単語IDの行だけ処理すればいい。行列全体の計算は不要。特定単語のベクトルのみが出力データとなる。
・多値分類を2値分類で近似する
中間層以降の計算:多値分類では出力も語彙数に比例して増える問題を、「推測する単語をyes/noで確率表現する」方式に変更する。それによって中間層の次のニューロンは一つで良くなる。従って、前の層から渡ってきた特定単語のベクトルデータと中間層の行列の内積を、次の一つのニューロンに与えれば良い。
確率を得る活性化関数:sigmoid関数
損失関数には、交差エントロピー誤差を使う。
sigmoid、交差エントロピーの逆伝播と学習効果
正解ラベルが1、正解確率が0〜1の実数。正解確率ー正解ラベルの誤差が大きい場合は、大きく学習する、小さい場合は小さく学習する。
負例(不正解)の学習は全て実施すると語彙数が増えると手に追えなくなるので少数をサンプリングして行う。
ネガティブサンプリング:
ネガティブな例(負例)を少数サンプリング(単語の出現率から確率分布を求めてサンプリング)して用いる。>コーパスで多く登場した単語が抽出されやすくなる。元の確率分布の各要素を0.75乗する(変換後も確率の総和が1になるよう分母を調整)することで、確率の低い単語に対して確率を少し高く調整ができる。
word2vecの単語分散表現を使えば、類推問題をベクトルの加算と減算で解く事ができる。
例:king-man+woman=queenなど。
例2:king:man = queen: ? の正解はwoman
次の計算で導き出せる模様:man - king + queen
似たような単語はベクトル値表現で似たような数値を持つ。
単語の似たような表現の変化は、他の単語でも似たようなベクトル値の変化で導き出せるのが面白い。
●5.リカレントニューラルネットワーク(RNN)
前章までのフィードフォワードタイプのネットワークの問題点
・時系列系のデータを正しく学習できない
与えられたコンテキストよりさらに左側(文脈でいう過去)にある単語は所定コンテキスト数から溢れ出て無視されてしまう。CBOWモデルはコンテキスト数を増やして文脈で言う所の過去のコンテキストも含められるようにできるが、単語の並びが無視されてしまう。(ネットワークの中間層では単語のベクトルの和が求められているだけのため。)
RNN=循環するニューラルネットワーク
ループする経路(閉じた経路)を持ち、隠れ状態を内部に記憶できる
RNNレイヤを展開すると、再帰でRNNが複数(時系列の数だけ)繋がった状態とみなすことができる。
1000個の時系列データを扱うとき、RNNレイヤを展開すると再帰で1000個のRNNが並んだネットワークになる。
実装(TimeRNNレイヤの場合)イメージ、
1:時系列データ数だけ(1000個の時系列データなら1000個)RNNのリストを持っている。これで一つのTimeRNNレイヤとなる。
2:時系列データ一の順番1つずつに一つのRNNが順番に対応する。時系列のデータの先頭から処理され、一つのRNNから出力されるデータは分岐し、次の層へ(Affine層など)のアウトプットデータと、次の内部のRNNに渡される(再帰)データとなる。(分岐されるデータは双方同じ値)
3:次のRNNでは次の順番の時系列データと、前のRNNから渡ってきた出力データが入力情報となる。
4:2〜3を時系列データ数分繰り返す
TImeRNNレイヤに対する誤差逆伝播法も行える:BPTT(Backpropagation Through Time)
問題点:
時系列データが大きいと、比例して計算量も大きくなる。
時間サイズが長くなると逆伝播時の勾配が不安定になる
対策:
・Truncated BPTT
逆伝播のつながりを一定間隔で断ち切る。
※逆伝播のみ断ち切り、順伝播はそのまま変えない
RNN Language Model(RNNLM)の全容
層構成:
TimeEmbedding -> TimeRNN -> TimeAffine -> Time softmax with loss
※Embedding:単語IDを単語分散表現(単語ベクトル)へ変換する層
※時系列に対応するため、Embedding, Affine, Softmaxも時系列対応した層にする。時系列データT個に対応してT個のレイヤを用意して実装する。>TImeEmbedding, TimeAffine, TimeSoftmax
各RNNレイヤごとの出力は、再帰でRNNに再入力される一方、もう一つの出力はAffine層,Softmax関数を経て、次の単語予測が出力結果となる。これで過去の情報をエンコードして記憶できている。
「you say goodbye I say hello」の場合、最初のsayの次の予測は、goodbye、hellloが推論確率が高いが、過去を記憶しているのでgoodbyeの方が確率が高く出る。
言語モデルの評価にはパープレキシティ(perplexity:確率の逆数を表す)を用いる。
確率0.8の逆数は1.25, 確率0.2の逆数は5。数値として、前者は推論がほぼ1つに絞られ、後者は5個にしか絞られてない意味を表す。(これはあくまで入力が一つでのパープレキシティ)
●6.ゲート付きRNN
前章RNNの問題点:
・時系列データの長期の依存関係をうまく学習できない
・勾配消失、または勾配爆発がおきてしまう
tanh;y=tanh(x)の微分の値は1.0以下でxが0から遠ざかるにつれて値が小さくなる。つまり、tanhを逆伝播で通過するたび値が小さくなり勾配消失する。
matmal:逆伝播で繰り返し通過するごとに、重みが1より大きいと勾配爆発、1より小さいと勾配消失する。
勾配爆発対策:
・勾配クリッピング:閾値を超えたら勾配を修正する。
勾配消失対策:
・ゲート付きRNN(LSTM,GRUなど。ゲート:開くか閉じるかだけでなく、どの割合(0~1の実数)で開くかをゲートでコントロールする)
LSTM:記憶セルがあり それはLSTM層自身だけでデータ受渡する。他の層に出力しない。過去から時刻Tまでの必要な情報が格納されている。※従来の他の層にデータ受け渡しする出力もある。
ゲートはsigmoid関数でコントロール:出力が0〜1.0の実数
outputゲート:LSTMの出力のゲートを調節(sigmoid関数)
tanhノード:入力情報から新たに何を記憶セルに追加するか調節(tanh関数)
inputゲート:tanhノートからの出力をどれだけ価値があるか判断し追加情報の取捨選択をする(sigmoid関数)
forgetゲート:入力の記憶セル情報から何を忘れるかでゲートを調節(sigmoid関数)
これにより勾配の劣化(消失や爆発)が起きない理由
・逆伝播時には「+」と「✖️」ノードだけを通る。「+」は情報をそのまま流すので劣化は起きない。「✖️」は行列の積でなく要素ごとの積(アダマール積)であるため劣化は起きない。
・逆伝播時にforgetゲートが忘れるべきと判断した記憶セルの要素の勾配を小さくし、忘れてはいけないと判断した要素に対しては勾配の要素は劣化することなく過去に伝わる。そのため、長期にわたって勾配消失などは起こさずに伝播することが期待できる。
以上を踏まえLSTMを実装し、TimeLSTMに拡張実装する。
LSTMのさらなる改善:
・LSTMレイヤの多層化:PTBデータセットの場合2〜4層が適す。
・Dropoutによる過学習の抑制:ネットワークのニューロンをランダムで切断。
時間軸と独立して、深さ方向にDropoutレイヤを追加する。
・重み共有:embeddingレイヤとAffineレイヤで重み共有。学習パラメータを減らせる。
以上を踏まえて改良されたRNNLMの実装をする。
●7.RNNによる文章作成
時系列データを別の時系列データに変換するモデルとしてのseq2seq。RNNを2つ組み合わせたもの。Encoder-Decoderモデルとも言われる。
時系列データ:言語データ、音声データ、動画データなど
時系列データを別の時系列データに変換する例:翻訳、音声認識、チャットボットの対話、コンパイル
RNNによる文章生成の手順
seq2seq翻訳モデル例:(Encoder Decoderモデル)
レイヤ構成
Encoderを構成するレイヤ: TimeEmbedding -> TimeLSTM
Decoderを構成するレイヤ: TimeEmbedding -> TimeLSTM -> TimeAffine -> TimeSoftmax
翻訳の流れ:
入力「吾輩は猫である」-> Encoder -> Decoder -> 出力「I am a cat」
Encoderは時系列データhというベクトルを出力(固定調のベクトル:これはLSTMレイヤの最後の隠れ状態)入力文章を翻訳するために必要な情報(「吾輩は猫である」を固定調のベクトルに変換したもの)がエンコードされている。
Decoderは上述のデータhを最初のTimeLSTMが受け取る。最初のTimeEmbdeddingには<eos>(文章区切り文字)が入力で与えられる。一番目の最後のTimeSoftmaxを経て最初の翻訳文字が出力されるー>「I(私)」。その出力は、次のTimeEmbeddingの入力になる。
これを再び<eos>が出力されるまで繰り返す。最終的に「I am a cat<eos>」と出力される
※TimeLSTMレイヤ間においても、前述で説明した時系列のデータのやり取り、ゲート情報のやり取りがされている。
逆伝播ではDecoder->Encoderへと勾配が伝わる
時系列変換seq2seqの実装:「足し算を解けるか」
足し算のロジックを知らなくても解けるのか。>桁数の異なる計算はパディングにより空白で埋めて各計算、答えの桁数を統一する。(一番長い文字列に合わす)>Decoderでパティングの場合は損失計上をしないようにしたり、Encoderではパティングを前時刻の入力をそのまま出力するなどの実装をする。
入力:57+5の場合、1文字ずつ文字ベクトルに変換し、TimeLSTMに読み込ませていく(正確には一番手間にあるのはTimeEmbedding)。
Decoderは、学習時に正解値62を('_','6','2',' ')をそれぞれ1文字ずつTimeLSTM(正確にはTimeEmbedding)に与え、正解ラベルで('6','2',' ',' ')と出力するよう各TimeSoftmaxで与えて損失関数で誤差を出し逆伝播でパラメータ(重み)の更新をする。Softmaxで出力された値のうち最もスコアが高いものを選ぶ(確率的でなく決定的に選ぶ)
seq2seqのさらなる改良:
・入力データの反転 による学習効果向上:57+5 → 5+75
変換後の各要素の距離が掴みやすくなるため、勾配が伝わりやすく学習効率が上がる。
・Peeky:覗き見
Encoderから出力された直後のデータはDecoderにとっての全てが詰まっているので、それをTimeLSTM全体の層にも共有する。>正確には、TimeLSTM,TimeAffineに時系列ごとにベクトルを結合させる。
seq2seqを用いたアプリケーション
・機械翻訳:「ある言語の文章」を「別の言語の文章」に変換
・自動要約:「長い文章」を「短い文章」に変換
・質疑応答:「質問」を「答え」に変換 >応用チャットボット
・メール自動返信:「受け取った文」から、「返信文」に変換
seq2seqは音声、動画などでも利用可能。
seq2seqのEncoder部分をCNN+Affiineに置き換えるだけで画像を扱える。>画像にキャプションを行える。
●8.Attention
seq2seqを更に強力にする「注意機構(attention mechanism)=重要な情報に注意を向けさせる」
・seq2seqには問題点がある。Encoderは時系列データhというベクトルを出力しているが、入力分の長さに関わらず、出力が固定長のベクトルである。そのため、入力が長くなっていくと必要な情報が収まり切れなくなる。
・従来はEncoderから出力されたデータhベクトルは、Decoderの最初のLSTMに入力されるのみだった。
改良:
・Encoder:出力は固定長でなく、LSTMレイヤの隠れ状態のベクトルをすべて(単語列と同じ数:5つの単語なら5つのベクトル)利用できるようにする>hsベクトルとする
従来のデータhベクトルは「吾輩は猫である」のベクトルだったが、hsは「吾輩」「は」「猫」「で」「ある」の5つの単語ベクトルを持ったデータ
・Decoderの各時系列ごとにAttention(注意機構)層にデータhsを利用できるようにする。従来の処理である先頭のLSTM層には、hsの最後のデータ(従来のhと同じ値)を入力する。
Attention(注意機構):
・Attention Weight
各単語の重みを求める。その重みも設定するのでなくて自動で学習させたい。そのためにベクトルの内積を利用。これで単語のベクトル表現で類似度を測れるようにする。
LSTMから渡ってきたhsの末尾のデータ=hをhsのすべての単語ごとにベクトルの内積を出す。それを足し合わせてsoftmax関数で正規化したものを出力する(=aとする)
・Attention Sum
上記で出力された重みaを、hsのそれぞれの単語ごとにベクトルの内積を求め足し合わせる。それをコンテキストベクトルとして出力。これにより、コンテキストベクトルは、hsの対応する単語ベクトルと似た値となる。例:時系列「吾輩」の時にはhs上の単語ベクトル「吾輩」に近いコンテキストベクトルとなり、それを元に翻訳処理に利用できるようになる。
Attention付きseq2seqの実装、学習と評価
・層構成
Encoder:TimeEmbedding -> TimeLSTM
Decoder:TimeEmbeddint -> TimeLSTM -> TimeAttention -> TimeAffine -> TImeSoftmax with Loss
Attentionに関する残りのテーマ
・双方向RNN:LSTMレイヤに逆向きの流れ用の層とネットワークを追加する。
左右の両方向の情報を集約してバランスのとれた情報がエンコードできるようになる。
・skipコネクション
層を深くするときの重要テクニック。層をまたぐ接続を追加する。skipのコネクション接続は「加算」。加算は逆伝播の時は情報を加工せず受け流すだけなので、これによって層を深くしても勾配が爆発、消失に影響を及ぼす事なく学習ができる。
Attentionの応用
・ニューラル翻訳:Google Neural Machine Translation(GNMT)はseq2seqのAttentionで構成。
・Transformer:RNNの欠点である並列処理化に対応。TransformerはAttentionによって構成される。
Feed Forwardレイヤを新たに実装:時間方向に独立して処理するネットワーク
翻訳性能スコアは、GNMTより高い。
●付録A.sigmoid関数とtanh関数の微分
●付録B.WordNetを動かす
●付録C.GRU
以上。
- 2024年11月30日に日本でレビュー済みAmazonで購入基礎から段階を踏んで説明しているので、イメージがつかみやすい。pythonコードがついているので、自分でも動作確認しながら理解出来るのが、初学者にはありがたい、
- 2025年2月24日に日本でレビュー済みAmazonで購入プログラミングができるので楽しい。が、自然言語処理の方法は既に古いので、他を当たる必要がある。
- 2024年6月14日に日本でレビュー済みAmazonで購入良い買い物ができました
- 2018年10月31日に日本でレビュー済みAmazonで購入I bought this for learning word2vec.
But this book aim at the theory of word2vec or etc not the practical usage of those and doesn't pick up how to use any library like Gensim and nltk.
- 2018年12月15日に日本でレビュー済みAmazonで購入そうそう、こういうことが知りたかった!ライブラリの使い方なんてちょっと検索すればわかる。数学的・構造的な解説が丁寧にされていて、とても良かったです!ありがとうございます!
最初この本から読み始めましたが1章に時間がかかり過ぎ、「ゼロから作るDeep Leaning」(1の方)から出直しました。1日8時間くらいとして
ゼロから作るDeep Leaning 5日
ゼロから作るDeep Leaning 2(本書) 10日
くらいで読了しました。最初から1の方を読んでいれば、2はもうちょっと早く読めたと思います。最後の方で、一見同じに見える変数が関数によって異なることに気づき、だーっと戻って確認したので、そこに最初から気づいている人は更に早く読み終えられると思います。"先に言ってよ"的な部分は1に比べると2の方がちょっと多いかな(汗)。最終的にはわかります。数学的には、線形代数と微分積分、ちょっとだけ情報理論、の知識があった方がわかりやすいです。
ポイントは配列の出てくる形を確認すること。git hubから落としてきたスクリプトを全て解読し、printを挿入しながら動かして確認しました。また、本スクリプト以外に、端末でインタプリタ or spyderを起動しておいて、ちょっとした関数の出力結果などを確認しながら読み進めました。pythonのcopyの性質を生かして作った部分がとっても参考になりました。「そうかー、こうやって書くんだ!」って、うなっちゃいました。さらっと解読しただけだと、ものすごくよくわかってる人以外は気付かないと思います。
「ん?」って思ったところはあるので、まとめてオライリーにメールしてみようと思っています。もしかしたらもう改訂されてるかな?
オライリーさん、ごめんなさい。私は今までオライリーの本の良い評判を一度も聞いたことがなかったので、1冊も持っていませんでした。これを機に考え方を改めます(笑)。どこの本でもそうだけど、日本人が書いたのか訳書なのかという境目はある気がする。訳の良し悪しではなく、ツボが違う、みたいな。あと、本書は文字フォントが読みやすいです(書籍で購入)。
- 2023年1月19日に日本でレビュー済みAmazonで購入自分の勉強のために購入してみました。序盤を読み進めているところですが、十分役に立つと感じました。