More Related Content Similar to 東京大学2020年度深層学習(Deep learning基礎講座) 第9回「深層学習と自然言語処理」
Similar to 東京大学2020年度深層学習(Deep learning基礎講座) 第9回「深層学習と自然言語処理」 (6) 東京大学2020年度深層学習(Deep learning基礎講座) 第9回「深層学習と自然言語処理」4. 自然言語処理をもっと学びたい人に:参考資料
Stanford大学の講義資料
Natural Language Processing with Deep Learning
動画・演習のソースコードも充実
http://web.stanford.edu/class/cs224n/
Speech and Language Processing
Dan Jurafsky and James H. Martin
https://web.stanford.edu/~jurafsky/slp3/
東工大岡崎先生の講義資料
https://chokkan.github.io/deeplearning/
最新の研究は、Twitterも情報源
(NLPerの多くはTwitterにいる:ハッシュタグは#NLProc)
4
20. どうやって単語の意味を表すか(2)one-hotベクトル
文を単語分割し、各単語にID(次元)を振り、1-of-K表現でone-
hot(局所表現)ベクトルにする
今日 (1,0,0,0,0,0,0) 今日
(1,0,0,0,0,0,0)
は (0,1,0,0,0,0,0) は
(0,1,0,0,0,0,0)
晴れ (0,0,1,0,0,0,0) 休み
(0,0,0,0,0,1,0)
今日 は 晴れ て いる
1 2 3 4 5
今日 は 休み だ
1 2 6 7
20
単語
ID
22. 単語の分散表現 (単語埋め込み: word embedding)
密なベクトル はone-hotベクトル に行列 をかけて得られる
- の次元は語彙数
の次元は埋め込みたい数(ハイパーパラメータ)
- は重みを表す埋め込み行列(embedding matrix)
- 行列 において単語ID番目の列を抽出すると単語埋め込みベ
クトルが得られる。つまり、 は単語IDをルックアップして
単語埋め込みベクトルに変換する行列ともいえる
22
24. ● 分布仮説に基づき、埋め込み行列 を学習する言語モデル
● 周辺の単語から中心の単語を予測する
CBOW (Continuous Bag of Words)モデル(左)と、
ある単語が与えられた時にその周辺の単語を予測する
Skip-Gramモデル(右)から構成される
Word2Vec [Micolov+,2013]
入力
V次元
隠れ層
N次元
出力
V次元
入力
V次元
隠れ層
N次元
出力
V次元
V×N
次元
N×V
次元
N×V
次元
V×N
次元
24
33. h2
Encoderモデル
1. 符号化器埋め込み層(encoder embedding layer)
入力文中のi番目の単語のone-hotベクトルを埋め込みベクトル
xiに変換(前述の単語埋め込みと同じ処理)
2. 符号化器再帰層(encoder recurrent layer)
i番目の埋め込みベクトルxiを隠れ状態ベクトルhiに変換
33
今日 は 晴れ
i = 1 2
X
3
encoder embedding layer
encoder recurrent layer
h1 h3
35. h2
Encoderモデル
1. 符号化器埋め込み層(encoder embedding layer)
入力文中のi番目の単語のone-hotベクトルを埋め込みベクトル
xiに変換(前述の単語埋め込みと同じ処理)
2. 符号化器再帰層(encoder recurrent layer)
i番目の埋め込みベクトルxiを隠れ状態ベクトルhiに変換
35
今日 は 晴れ
i = 1 2
X
3
encoder embedding layer
encoder recurrent layer
h1 h3
36. h2
Encoderモデル
1. 符号化器埋め込み層(encoder embedding layer)
入力文中のi番目の単語のone-hotベクトルを埋め込みベクトル
xiに変換(前述の単語埋め込みと同じ処理)
2. 符号化器再帰層(encoder recurrent layer)
i番目の埋め込みベクトルxiを隠れ状態ベクトルhiに変換
36
今日 は 晴れ
i = 1 2
X
3
encoder embedding layer
encoder recurrent layer
h1 h3
・関数の種類はLSTM, GRU, CNN何でも良い
・単方向・双方向や層数などのモデル構成も変更できる
37. Decoderモデル
1. 復号化器埋め込み層 (decoder embedding layer)
復号化器出力層のj-1番目の出力を埋め込みベクトルyjに変換
2. 復号化器再帰層(decoder recurrent layer)
埋め込みベクトルyjを隠れ状態ベクトルhjに変換
3. 復号化器出力層(decoder output layer)
隠れ状態ベクトルhjからj番目の単語の生成確率を計算
37
<BOS> It is today
It is sunny today <EOS>
sunny
Y
decoder embedding layer
decoder recurrent layer
decoder output layer
j = 1 2 4 5
h1 h2 h3 h4
3
38. Decoderモデル
1. 復号化器埋め込み層 (decoder embedding layer)
復号化器出力層のj-1番目の出力を埋め込みベクトルyjに変換
位置jの処理に位置j-1の処理結果(自身の一つ前の出力単語)
を考慮して変換する構造になっていることに注意
38
<BOS> It is today
is sunny today <EOS>
sunny
Y
decoder embedding layer
j = 1 2 3 4 5
It
39. Decoderモデル
1. 復号化器埋め込み層 (decoder embedding layer)
復号化器出力層のj-1番目の出力を埋め込みベクトルyjに変換
2. 復号化器再帰層(decoder recurrent layer)
埋め込みベクトルyjを隠れ状態ベクトルhjに変換
ニューラルネットの種類はLSTM, GRU, CNN何でも良い
39
<BOS> It is today
It is sunny today <EOS>
sunny
Y
decoder embedding layer
decoder recurrent layer
j = 1 2 4 5
h1 h2 h3 h4
3
40. Decoderモデル
1. 復号化器埋め込み層 (decoder embedding layer)
復号化器出力層のj-1番目の出力を埋め込みベクトルyjに変換
2. 復号化器再帰層(decoder recurrent layer)
埋め込みベクトルyjを隠れ状態ベクトルhjに変換
40
<BOS> It is today
It is sunny today <EOS>
sunny
Y
decoder embedding layer
decoder recurrent layer
j = 1 2 4 5
h1 h2 h3 h4
3
h0
h0はEncoderの符号化器再帰層の最後の位置の隠れ状態ベクトルZ
41. Decoderモデル
1. 復号化器埋め込み層 (decoder embedding layer)
復号化器出力層のj-1番目の出力を埋め込みベクトルyjに変換
2. 復号化器再帰層(decoder recurrent layer)
埋め込みベクトルyjを隠れ状態ベクトルhjに変換
3. 復号化器出力層(decoder output layer)
隠れ状態ベクトルhjからj番目の単語の生成確率を計算
41
<BOS> It is today
It is sunny today <EOS>
sunny
Y
decoder embedding layer
decoder recurrent layer
decoder output layer
j = 1 2 4 5
h1 h2 h3 h4
3
42. RNNs, CNNによる文の意味表現
RNNs (Recurrent Neural Networks)
Pros:
・系列の情報を捉えられる
Cons:
・並列化が難しい
CNN (Convolutional Neural Network)
Pros:
・局所的な位置情報を捉えられる
・並列化しやすく高速
Cons:
・大局的な位置情報が失われる
42
43. RNNs, CNNによる文の意味表現
RNNs (Recurrent Neural Networks)
Pros:
・系列の情報を捉えられる
Cons:
・並列化が難しい
CNN (Convolutional Neural Network)
Pros:
・局所的な位置情報を捉えられる
・並列化しやすく高速
Cons:
・大局的な位置情報が失われる
43RNNs, CNNの両方の良い点を採用できないか?→Attention
53. GPT (Generative Pre-trained Transformer)
[Radford+2018]
元祖・Transformerによる事前学習に基づく汎用言語モデル
12層片方向(left-to-right)Transformerの自己回帰言語モデル
:逆方向の情報を利用できていないのが難点
53図は[Devlin+2019]から引用
54. BERT (Bidirectional Encoder Representations
from Transformers)[Devlin+ 2019]
24層の双方向Transformerをベースとした、
1. 大規模コーパスによる事前学習
2. タスクに応じたファインチューニング
によって様々なタスク・言語に応用できる汎用言語モデル
54
55. [CLS] 今日 の [MASK] は 雨 だ [SEP] 傘 を 持っ て [SEP]
BERTの事前学習
2つの事前学習タスクによって双方向Transformerの学習を実現
1. Masked Language Model
入力データの一部を[MASK]でマスキングし、前後の単語ではなく
マスキングされた単語を予測するタスクで双方向の情報を考慮
2. Next Sentence Prediction
文のペア(A, B)が入力として与えられた時、文Bが文Aの次に続く
か否かを予測する
55
…
文B文A
is_next 天気
58. 汎用言語モデルの評価ベンチマーク
General Language Understanding Evaluation Benchmark
(GLUE)[Wang+2019] https://gluebenchmark.com/
・文単位の理解(文法性評価、感情分析)
・文間の理解(質問応答、類似度、言い換え、推論、照応)
を問う9種類のデータセットを組み合わせている
SuperGLUE[Wang+2020] https://super.gluebenchmark.com/
・GLUEの後続。共参照などGLUEよりもハードなタスクを追加
58
61. 汎用言語モデルの課題:
言語の意味を真に理解しているか?
自然言語推論 (Natural Language Inference) a.k.a.
含意関係認識(Recognizing Textual Entailment)[Dagan,2013]
前提文が仮説文の意味を含むか否かを自動判定するタスク
61
前提文: 今年はある日本人がノーベル文学賞を受賞した
仮説文: 今年はある日本人がノーベル賞を受賞した 含意
前提文: 今年はある日本人がノーベル文学賞を受賞した
仮説文: 日本人は誰もノーベル賞を受賞しなかった 矛盾
前提文: 今年はある日本人がノーベル文学賞を受賞した
仮説文: 去年はある日本人がノーベル文学賞を受賞した 非含意 (中立)
Editor's Notes 他分野を大きく変えた経歴なので、そういうキャリアの質問も受け付けます。 まず伺いたいのですが、みなさん自然言語処理というと何を連想しますか。あるいはどういうことが自然言語処理で実現できると期待していますか。中にはもう何か自然言語処理のコードを実装している人というのも結構いらっしゃるのかもしれません。なんでもいいので自然言語処理に対して思うことについてキーワードをQ&Aに回答してみてください。いくつか紹介したいと思います。
どういうことが実現できると期待するか聞いておきたい(3分くらい) 華々しいがさまざまな前処理 言語は記号でもありますが、それを処理するためには言語のいろんな性質を考慮する必要があります。
タスクという単位で解く(処理する)
固有表現:単語に分割するための前処理ドナルド・トランプなら固有名詞として1語にしたいなど
固有表現抽出(named entity extraction) 人名・地名・日付などを抽出する処理
単語分割(word segmentation) 日本語など単語に分けられていないテキストを単語列に分割する処理
品詞タグ付け(part-of-speech tagging) 単語に名詞・動詞などの文法的な役割分類(品詞) を付与する処理
構文解析(syntactic parsing) 文法に基づく文の木構造を構築する処理
述語項構造認識(predicate-argument recognition) 述語を中心とした意味構造を抽出する処理
言語は記号でもありますが、それを処理するためには言語のいろんな性質を考慮する必要があります。
タスクという単位で解く(処理する)
固有表現:単語に分割するための前処理ドナルド・トランプなら固有名詞として1語にしたいなど
固有表現抽出(named entity extraction) 人名・地名・日付などを抽出する処理
単語分割(word segmentation) 日本語など単語に分けられていないテキストを単語列に分割する処理
品詞タグ付け(part-of-speech tagging) 単語に名詞・動詞などの文法的な役割分類(品詞) を付与する処理
構文解析(syntactic parsing) 文法に基づく文の木構造を構築する処理
述語項構造認識(predicate-argument recognition) 述語を中心とした意味構造を抽出する処理
言語は記号でもありますが、それを処理するためには言語のいろんな性質を考慮する必要があります。
タスクという単位で解く(処理する)
固有表現:単語に分割するための前処理ドナルド・トランプなら固有名詞として1語にしたいなど
固有表現抽出(named entity extraction) 人名・地名・日付などを抽出する処理
単語分割(word segmentation) 日本語など単語に分けられていないテキストを単語列に分割する処理
品詞タグ付け(part-of-speech tagging) 単語に名詞・動詞などの文法的な役割分類(品詞) を付与する処理
構文解析(syntactic parsing) 文法に基づく文の木構造を構築する処理
述語項構造認識(predicate-argument recognition) 述語を中心とした意味構造を抽出する処理
従来の言語処理では、品詞タグ付け、構文解析、意味解析、質問応答と部分問題ごとにモデルを用意して解析していました。ただこのパイプラインは各部分問題でエラーが蓄積する問題があり、そもそもタスクによっては部分問題に分解するのも大変でした。(動画から説明文を生成するマルチモーダルタスクでは連続表現と離散表現をどう組み合わせるか自明でないなど)
係り受け解析が単語同士の文法構造上の主従関係を解析するのに対して
述語項構造は出来事や状態を表現する単語:述語を中心として各単語の文章中の意味的な役割関係を表す
質問文の意味を解析してデータベースで検索して回答の候補を出すような感じ 各タスクにわけなくていいという利点に加え、それよりも精度がいいケースもある どうやって文をベクトルで表すか、いろいろなやり方が考えられますが、ベーシックな方法は文をある単位で区切り、…単位としては文字、サブワード、単語の3種類があります。
ベーシックなのは単語:これも日本語だと奥が深い…。
文字もベーシック。未知語に強い。だけど系列長が長くなり学習が大変
そこでいまホットなのはサブワード では代表的な単位として単語をどうやってベクトルで表すか考えていきたいと思います。 単語の意味をどうやってベクトルで表現するかを説明するにあたって、まず分布仮説について説明します。
この仮説は、意味が近い単語はその周辺の語も似ているという仮説です。 まず共起行列を作って単語のベクトルを導出する方法があります。
Bag-of-wordsともよばれるやつです。
文中のある単語の前後の語を文脈といいます。
文脈として考慮する前後の語の数をウインドウサイズといいモデル構築の際に指定することが多いです。ここでは前後1語をウインドウサイズとしてきょうき行列を作ってみます。 別の方法としてone-hotベクトルで表す方法をみてみましょう。これはニューラルネットの入力の単語ベクトルを用意する方法として一番基本的な方法でもあります。 単純に一単語に1IDを割り当てる方法では、ベクトルの次元数はコーパスの語彙数に相当することになり、コーパス全体における各単語の出現頻度は少ないのでスパースなベクトルになってしまう
埋め込みベクトルを学習することで、低次元で密なベクトルを獲得できる xは語彙数でたくさん、これに行列Wをかければhに圧縮できる
重みを表す埋め込み行列Wをニューラルで学習することになる
hの次元は埋め込みたい数でだいたい200ー300を指定することが多い
埋め込み行列Wは先ほどのきょうきぎょうれつと同様、単語ベクトルのIDをクエリとしてルックアップし単語ベクトルを得るための行列とみることもできる。 分布仮説に基づく代表的な言語モデルとしてWord2Vecを紹介します。
入力層から隠れそうへの重み行列Wを学習します。
CBOWとSkip-Gramモデルがあります。
さきほどあったようにWは単語のIDを指定するとその単語のベクトルを取り出す変換行列とみることができます。V次元の単語ベクトルを入力として、これを横に並べるとVかけるN次元の埋め込み行列Wができます。隠れ層の密なベクトルhはWかける単語ベクトルで得られてN次元となります。これに単語ベクトルを転置したものをすべて並べたNかけるV次元の行列W’をかけるとまたV次元に戻り、出力の単語ベクトルとなります。
ここではskip-gramの具体的なモデル化の方法をみていきます。skip-gramはある単語から周辺の語を予測するためのモデルですが、
ウインドウサイズjとして、ある時刻tの単語wtから周辺の語wt+jが予測される条件付き確率p(…)はこの式のようにsoftmax関数で定義できます。この目的関数を最大化することを考えます。
それにはこの損失関数が最小となるように誤差逆でんぱ法でモデルを学習することで確率をモデル化できます。
vは入力ベクトル、v’は出力ベクトル ここで、すべての語彙について学習を行うと分母の計算量が多くなります。学習のイテレーション毎に計算しなおさなければなりませんので、なかなか学習が終わりません。そのため、高速化の手法としてnegative samplingという手法があります。これは文脈語以外の語彙からランダムに擬似負例をピックアップし、それらについて確率が低くなるように学習を行う手法です。 というなかなか賢く単語の意味を学習するモデルですが、結局word2vecも単語の出現頻度や共起に基づいているので、分布仮説に起因する問題点があります。
よく言われるのは反義語も共起する単語としては似てしまうので、まったく反対の意味なのにベクトルとしては同じような表現になる点です。
たとえばつぎのかっこには合格・不合格も入り得るので、これらの文が含まれるテキストコーパスから学習した合格ベクトル・不合格ベクトルは似たようなベクトルになってしまいます。
また、多義語は前後の文脈を考慮しないと一意に定まらないという問題があります。 これに対して、文脈を考慮した単語ベクトルとして代表的なものにELMoがあります。
これは双方向LSTM(Bidirectional LSTM)を用いて大量のコーパスを学習することで,同じ単語でも文脈によって異なる埋め込み表現を獲得することができる手法で、2018年のNAACLという自然言語処理のトップ会議でBest paper awardを受賞した手法です。トップ会議とかにも論文をだしてみたいという人がいるのかもしれないですがELMoは2018年のBestのモデルだったということですね。。 では、単語埋め込みベクトルのまとめとして加法構成性という特性を紹介します。
有名な例ですが、…
とすると、単語ベクトルをうまく合成すればフレーズや文の意味を表現できるのではないかということで、その手法の一つとしてencoder decoderモデルについて次は見ていきたいと思います。
質問は最後にまとめて回答しようと思いますが何かあればQ&Aでお願いします。
26分 Encoder decoderの説明をするにあたり、機械翻訳という自然言語処理のタスクを紹介します。これは文を単語の系列とみなして、ある言語の文を別の言語の文に変換する系列変換タスクとして捉えることができます。
自然言語は最初にのべた通り可変長の記号の系列なので、これをどうやって有限次元のベクトルに埋め込むか、がEncoder decoderモデルのポイントとなります。 系列から別の系列に変換する確率をモデル化したものがEncoder-decoderモデルです。
今日は晴れという単語列Xを固定長のベクトルZに変換するEncoderモデルと固定長のベクトルZからIt is sunny todayという系列Yを出力するDecoderモデルから構成されます。
ここで<BOS>はbeginning of sentenceの略で文頭, <EOS>はending of sentenceと文末を表す記号で、よく実装で使う記号なので覚えておいてください。
ここでのポイントはEncoderの最後の位置の隠れ状態ベクトルをDecoderの初期状態の隠れ状態ベクトルhとして利用するところです。
Encoderモデルはベーシックにはこのふたつの層からなります。 Encoderモデルではまず、入力文中の単語のone-hotベクトルを埋め込みベクトルに変換します。
これは前にご説明した単語埋め込みと同じ処理になります。 次に、i番目の埋め込みベクトルxiを再帰層で隠れ状態ベクトルhiに変換します。 ここで関数の種類はLSTMでもGRUでもCNNでもなんでも大丈夫です。また、この例では左から右への方向しか見ていませんが、前後の文脈を考慮するために双方向にすることやネット数もいろいろな組み合わせが考えられます。このいろいろな組み合わせを試すのも実際のNLPの研究では大変であり面白いところでもあります。。 Decoderモデルの基本的なネットワークはこの3層からなります。 Decoderモデルでもまずは各単語の埋め込みを行います。このとき復号化器出力層の一つ前の出力を埋め込みベクトルに変換します。ここでのポイントは一つ前の出力単語を考慮して変換する構造になっていることに注意してください。 復号化器再帰層について説明します。これはEncoderの再帰層と同様に、埋め込みベクトルを隠れ状態ベクトルに変換します。
ここでも関数はなんでもよく工夫のしどころでもあります。
また、ここでのポイントはEncoderの符号化器再帰層の最後の位置の隠れ状態ベクトルつまり固定長ベクトルZを復号化器再帰層の初期状態の隠れ状態ベクトルh0として利用するところです。 最後に復号化器出力層です。j番目の隠れ状態ベクトルからj番目の単語の生成確率を計算します。 主な関数のアーキテクチャとしてはRNNとCNNがありますが、それぞれ利点と欠点があります。
よく特にNLPではRNNやLSTMが用いられますが、系列情報に強い一方で、並列化が難しいという欠点があります。
一方画像処理ではCNNが用いられますが、並列化できるものの、文全体の情報が失われるという欠点があります。 そこで、RNNとCNNの両方の良い点を組み合わせた技術にAttentionがあり、今はAttentionを使ったモデルが活発に提案されています。Attentionについて説明していきます。 AttentionつきEncoder-decoderモデルの紹介をします。
Attentionでは、文中の各位置、または時刻というときもありますが、Encoderの隠れ層のベクトルhiとある位置のDecoderの隠れ層のベクトルhj間で類似度スコアを計算し、位置jではどの入力単語に注視するかというスコアajを計算します。そのスコアはsoftmax関数で表すことができます。
https://qiita.com/ymym3412/items/c84e6254de89c9952c55 この類似度をつかってEncoderの隠れそうのベクトルの重みの平均、加重平均を求めます。これがDecoderの各位置jの隠れベクトルへの変換に必要な文脈情報をSoft attentionとして抽出する処理となります。 そしてこのSoft アテンションcjとj番目のDecoderの隠れそうhjを結合して変換することで、最終的なj番目のDecoderの隠れそうのベクトルを計算します。 Attentionを用いた代表的なモデルとしては、現在活発に研究されているTransformerというモデルがあります。これはAttention is all you needという論文のタイトルの通り、RNNやCNNを用いずAttentionのみを用いたEncoder-decoderモデルになっています。
Encoder, Decoderはそれぞれ6層あり、〜という3種類のAttentionを使用しています。順に説明します。
positional encoding: 一番最初にこのモデルに単語の分散表現を入力するときに単語位置に一意の値を各分散表現に加算する
masked decoder: 予測すべきターゲット単語の情報が予測前のデコーダにリークしないように自己注意にマスクをかけている TransformerではEncoderの隠れ層をmemory、Decoderの隠れ層を、Encoderから関連する情報を取り出すための検索クエリqueryとしてとらえAttentionを説明します。
さらにmemoryはKeyとValueという形で考えることができ、AttentionはQueryとKeyとの関連度を内積で計算し、それをsoftmaxで正規化し、関連度の高いKeyの位置に対応したValueを加重和として取り出す処理と考えることができます。
一般的な
Memoryをkeyとvalueに分けることでkeyとvalueの関係が自明でなくてもkeyからvalueを取り出すことができ、高い表現力を得られる。非自明な関係をkeyとvalueで切り離すことで考えなくて良くなった。
注意の重みは内積注意を取りあげているが、隠れ層のフィードフォワードで求める加法注意でもよい。でも一般に内積のほうが高速 さきほど紹介したsoft attentionも含めTransformer以前のattentionはsource-target-attentionと言われmemoryまたはsourceがEncoder,queryまたはtargetがDecoderに相当し、Decode時にEncoderの隠れそうの情報を参照するものでした。
Transformerではself-attention、自己注意というのを採用しており、これはEncoderもDecoderにも使えるもので、queryもmemoryも自分自身selfの下の隠れ層のすべての位置を参照しています。これによってCNNと異なり全部の位置を考慮して重みを学習できます。 また、transformerではmulti-head attentionというのが使われています。
これは言語には表層・統語・意味様々な特性を持っているので、各単語に1組のquery, key, valueを割り当てるのではなく複数のheadという単位にわけて用意します。これによって様々な側面からみた各単語の潜在表現を得ることができます。
質問は最後にまとめて回答しようと思いますが何かあればQ&Aでお願いします。
すらすらいえて46分 ここからは最近の研究の紹介ということで主にTransformerをベースにした汎用言語モデルについて説明します。 まず汎用言語モデルとは、大規模データの事前学習に基づき複数のタスクに応用できる言語モデルの総称を指します。Transformerに基づく元祖汎用言語モデルはOpenAIが開発したGPTです。最近は1750億のパラメータで構築した巨大な言語モデルGPT−3というのが話題になってますが、これは片方向のtransformerに基づくモデルで、逆方向の情報を利用できていないのが難点でした。 そこで出てきたのがBERTです、モデル名のフルネームを知っておくとだいたいのことがわかりますが、BERTのBはbidirectionalからきていて、双方向transformerであることがポイントです。 probing、もうちょっと他の最新の話も入れたほうがいいか 具体例をいれるか? この辺西田さんスライドなども参考に