自然言語処理についての入門メモ

Python, ML13 January 2021

前提

RNNなどのネットワークは値をベクトル(行列)で扱うので、単語をそのままモデルに渡すことができない。

  • 似ている単語や、関連のある単語は近いベクトルにしたい
    • 分散表現

Word2Vec

  • 教師なし学習の単語分散表現の代表的な手法

分布仮説

  • 求めたい単語の前後の単語を入力として与え、学習させる
    • CBOW (Continuous Bag-of-Words)
  • 求めたい単語を入力として与え、その前後の単語を学習させる
    • Skip-gram

形態素解析

  • 文章を形態素(トークン)に分ける
    • 機械が読みこみやすい単位は必ずしも単語になっているとは限らないので、呼び方が違う
  • そのまま使用するとメモリきつい
    • 文章が長いほど、その分メモリ食う
    • よく出てくる単語(日常でよく使われる)に絞るしかなくなる。。。

サブワード

  • よく出てくる単語はそのままに、よく出てこないやつはさらに分割していく

  • BPE(Byte Pair Encoding)

    • 実際には文字ベースから始めてよく出現する部分文字列を検知していく

SentencePiece

  • サブワード分割ができるライブラリ
  • 動作が高速

文脈モデル

昨今では、文脈モデルを事前学習することが主流

  • 同じ単語でも文脈によって異なるベクトルにする必要がある
  • Wikipediaとか使う
  • 文脈の次の単語を当てる推論で学習する
    • めちゃめちゃ時間がかかる

この文脈モデルを学習した後に、本来行いたい「翻訳」などの学習をすると、少ない学習ですごく精度が出る!!

Transformer

Attention is all you needという論文で出てきたモデル

RNNの問題

  • メモリ使用量が多い
  • 並列処理ができない
  • 安定感がない
    • 1度おかしな出力があると、それがループでまた返ってくる

Attention is all you need

  • Attentionのみで学習する
    • CNNやRNNなんていらない
  • 全ての単語を一気にみる

Attentionの解説

  • Attentionはquery: Q, key: K, value: Vの3つを使った辞書と同じである
    • これが定義になっている
    • 連想配列(ハッシュマップ)みたいな
  • queryを投げると、そのkeyに対応した(1つのkeyとは限らない)valueを取得する
    • keyにはkey1✖️0.7, key2✖️0.2, key3✖️0.1のようにsoftmaxになってる

self Attention

  • queryとメモリ(key, value)が同じAttention
  • 自分自身が何を指しているかを確認できると考えられている
  • 「it = this pen」みたいな

Multi-Head Attention

  • Q, K, Vをそれぞれ任意のN分割し、それぞれでAttentionを行う

Positional Encoding

  • 単語の順序を担保する
  • トークンがどこに合ったのかを判別する、位置情報を持たせる

Mask

  • 元々は、次の単語を推論するという事前学習がやりたかった
    • Attentionでは全ての単語が入力として入ってきてるから、単語がわかっちゃってる
  • マスクして入力を1部隠す

BERT

  • Attentionでは、次の単語を予測するという性質上、未来の(後ろの)単語は使えなかった
    • それでは不可能に近い推論がある
  • BERTは全ての情報を使う
  • Masked Language Model(MLM)
    • 次の単語ではなく、穴埋めにする
  • Next Sentence Prediction
    • 文章AとBが対応したものかを判定する
    • Q&Aや繋がった文章か等

ALBERT

  • BERTを大幅に改善した
  • パラメータ数を非常に減らしている
  • 実務ではめちゃめちゃ使う
  • Sentence Order Prediction
    • Next Sentence Predictionでは簡単すぎるので、文章の順番を入れ替えたものを判定する

tags: Python, ML