「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
言語処理 ≒ 自然言語処理
自然言語処理 †
- 歴史は機械翻訳の歴史
- まだまだ未熟な分野
- AI完全問題と言われる
- MMIとしては非常に魅力的
分野ごとにマチマチ †
- 深層学習の導入で機械翻訳の性能が大幅に向上。
- 構文解析などは、精度は向上しているが、大きな進捗は無い。
- 文脈解析などは既存のアプローチでは実用的な精度が無い。
目的とやってることのズレ †
- 自然言語処理では目的と学習タスクにズレがあることが多い。
- ズレている気がするタスクで学習するが目的を達成できる的な。
詳細 †
- 単語を高次元のベクトルに置き換える分散表現という技術を用いる。
- 単語データの並びのことをシーケンスと言い、これが文章にあたる。
難しさ †
多義性 †
ある言語表現が伝える意味は一通りではない。
同犠牲 †
ある意味を伝える言語表現が一通りではない。
文脈依存性 †
言語表現の意味もコンテキスト次第
言外の意味 †
- 身体動作と同様に、実行的な効果を目的とする。
- 時計をお持ちですか? ≒ 今何時?
アプローチ †
理性主義 †
- 人間の言語知識や言語運用能力を明示的に計算機に実装する。
- 言語学・論理学などに基づいて知識をルール・手続き化する演繹的手法
経験主義 †
- 収集・観測できるデータに基づき入出力関係をモデル化する。
- 統計学、機械学習に基づく帰納的・データ駆動的手法
- システム構成:エンド・ツー・エンド(現在の方式)
- ブラックボックス、十分なデータがあれば学習可能
- 問題点:個別の調整や説明ができない。
歴史 †
基礎技術 †
形態素解析 †
- 文法や、辞書と呼ばれる単語の品詞等の情報に基づき、
形態素(≒言語で意味を持つ最小単位)の列に分割し、
それぞれの形態素の品詞等を判別する作業。
構文解析 †
- 基本的にはプログラミング言語などの形式言語の場合と同様
- どこが主語で、どこが述語か?係り受け(言葉と言葉の関係性)を解析
- ただし、自然言語の構文には
- 多くの言語で曖昧さ
- アドホックな変形が多いという複雑さ
- 意味を考えなければ構文が決定できない
など、独特の難しさがある。
意味解析 †
単語の意味という語彙の関連を見る
- 十分に上手く行えるシステムはまだ完成していない。
- 「意味素」という意味の基本となる情報を持たせることにより、
ある程度、意味解析ができる事が解っている。
文脈解析 †
複数の文の繋がりをチェックする
- 背景知識とか今のシチュエーションの関連性を見る
- 照応解析などを含む。
日本語処理 †
語義の曖昧性解消 †
- 語義識別、語義判別、語義確定などともいう。
- 文中のある単語に出会ったとき、その単語が、
どの語義を表しているのかを判断する過程
照応解析 †
- 省略された名詞句(ゼロ代名詞)を補完する処理
- 意味に踏み込まない処理には限界がある
その他 †
単語と単語の分かれ目が解り難い。
処理の例 †
形態素解析 †
- 「くるまでまつ」の形態素解析
- 「車で待つ」、「来るまで待つ」
- 最適な組み合わせを判定
構文構造の曖昧性 †
意味解析、文脈解析 †
- 「僕は鰻だ」
- 形態素解析、構文解析はできる。
- 意味解析、文脈解析が難しい。
意味の曖昧性 †
- 意味論的曖昧性
bankが土手なのか?銀行なのか?
Stay away from bank.
ライブラリ †
オープンソース †
ココにはAIではない言語処理のライブラリについて書く
プロダクト †
ココにはAIではない言語処理のライブラリについて書く
AIの活用 †
AI(機械学習・深層学習)最大の金脈と言われる。
体系 †
N-gram LM †
- 任意の文字数で文章を分割する手法
- 文脈を捉える素性として使われる
自然言語処理に革命を起こしたRNN LM。
- 深層学習以降は、RNNを言語モデル(LM)に適用し、次の単語を予測する。
- 特に主要な問題として過生成と生成不足が指摘されている。
- 音声データ → 文章候補 → 文書(Rescoring N-Best)で性能を大きく改善したのが始め。
- PPL : 迷い度、1/x の確率で正解できる(単語予測ではこんなモノ)
- WLR : 誤認識率(音声段階の間違いを含み、9.5%は音声認識のエラー)
| 言語学的に工夫したLM | RNN LM |
PPL | 221 | 121 |
WLR | 13.5( - 9.5 = 4.0) | 11.1( - 9.5 = 1.6) |
- inputは単語でOne-Hotエンコーディングしたベクトル。
(単語の数だけになるので数万から数十万次元になる)
- ht ≠ yt で、
- hidden の htは数十から数百次元のベクトル
- output の ytはinputと同じ数万から数十万次元のベクトル
手順 †
(特徴抽出とタグ推定)
クリーニング †
括弧、カンマ、ピリオドの削除
単語の分割と正規化 †
形態素解析、小文字などに統一するなど
ストップワードの除去 †
英語のa, the, of、日本語の「は」「の」「です」など。
活用例 †
変換 †
- 概要
入力された文字列を理解、推論、また学習して、効率的に変換を行なう。
テキストマイニング †
- お客様の声の分析
口語調は処理が難しい
- 略語や言葉の間違い
- 口語調の言い回し
- 顔文字の調整
- 口コミサイトの文章からの知識発見
- 口コミサイトの評価点が当てにならない。
- 話題(評価項目)の頻度でカテゴリが解ってくる。
- カテゴリ毎に評価項目のポジティブ・ネガティブを集計
- コールセンターのコンタクト履歴からの知識発見
- 問い合わせの増加内容の分析
- 共起による製品の問題の分析
- 問い合わせパターンの分析
- アナリスト・レポート分析(株価分析
- 輸出産業のデータベース化
- レポートのキーワードを抽出(円高・円安)
- レポートの属性情報を付与(誰が書いたか?上がる予測か?下がる予測か?)
- 上がるか下がるか属性で分類して実際の株価の推移と比較して集計した結果
アナリストのレポートを分析すれば、おおむね株価の予測できる事が解った。
・東証一部:正解値を出している。
・中企業:まぁまぁ当たり、上げ下げの幅が大きい(賭博性が強い)
・小企業:正解値を出していない。
- 銀行・金融業のデータベース化
アナリストレポートはあまり当たらない事が解った。
- 曖昧な動詞をつかっている計画の成功率は低い。
「やる」にどの様な表現を使っているか?
(行う、図る、実施する、整備する, etc.)
- 動詞の曖昧性や明確性を定義する。
- どの程度成功しているのかの成功率で並べる。
- 明確な動詞は成功率が高く、曖昧な動詞では成功率が低い。
- 「等」をつかている計画の成功率は低い。
等の出現率と成功率を表でまとめる。
- 後払い通信販売の未払い検知
- 未払い実績があると特定されたくない≒住所を偽る。
- 住所をゆらして記入してきた場合、未払いになる可能性が高い。
エンリッチメント系 †
テキスト・アノテーション
- エンティティ・アノテーション(情報ユニットに分解し、構造化)
- エンティティ・リンキング(エンティティアノテーション後、KBに結び付ける)
- 文節チャンキング(名詞や動詞、形容詞といった品詞にタグ付けを行う)
- 意図抽出(質問・要望などの情報をテキストから抽出)
- 意味的(セマンティック)アノテーション(文脈から判断できる情報の付加)
- 分類アノテーション(分類もアノテーション)
- センチメント・アノテーション(感情分析)
※ 文書検索、チャットボットで利用される。
文書検索 †
文書を特徴量に変換し類似度の順に並べて提示する。
チャットボット †
(質問応答システム)
質問を特徴量に変換しパターン化された応答を提示する。
- プリセールス
- コールセンター
- スマートスピーカー
- バーチャルアシスタント
その他 †
ライブラリ †
オープンソース †
Python系
プロダクト †
Python系
サービス、ソリューション †
ベクトル化 †
- エンコード、エンコーディングとも言う。
- 分布仮説から分散(意味)表現とも言う。
文の構成性 †
統語的階層構造(句構造) †
系列の並び(現在主流) †
テキスト・コーパス †
自然言語の文章を構造化し大規模に集積したもの。
- 定義
- 機械可読なテキスト・データを収集したもの。
- ある目的のため
(現実の分布を考慮しサンプリングした)
テキスト・データを収集したもの。
- 注釈付きコーパス
人手 or 機械的にアノテーションが付与されたテキスト・データ
- 教師あり学習の学習データ
- 伝統的NLPシステムの評価データ
単語のベクトル化 †
単語の意味 †
- シソーラスによる手法
言語資源(辞書)を作成する。
- 言語のクラス図のようなネットワークを作成
- 単語感の類似度の算出などができる。
- 最も有名なシソーラスはWordNet?(NLTKライブラリ)
- 問題点
- 人手によって作成するので作成コストが高い
- 時代によって変化する意味を負うことが難しい。
- ニュアンスを表現できない(シチュエーション毎の使い分けができない)。
TF-IDF †
(単語埋め込みモデルではない)
- 概要
文書中の単語を頻度と希少性を加味して評価
- 複数の文書に横断的に使用している単語は重要ではない
- 対象する文章内で頻度が高く出てくる単語は特徴的
- 用途
- 文書検索
- レコメンド
- 自然言語処理
文書の特徴をベクトル化
- 意味
文書と単語の「マッチ度」(頻度と希少性を加味して評価した値)を測定
- tf
文書中の単語の頻度
・文書中の単語の割合
・頻出単語 → 高ポイント
- idf
文書中の単語の希少性
・情報量(情報の珍しさ)
・希少単語(idf) → 高ポイント
- 何を表示させるか?
- 単語をバラして検索単語が含まれていたら対象とする。
- → 頻出する単語では、どの文書も対象になる。
BM25 †
- 概要
- tf-idfの進化系でtfの部分が進化している。
- 検索クエリに特化している。
- 意味
検索クエリに出てきた単語のスコアの合計。
- 文章の長さが平均の場合、単語1で1ポイント
- 単調増加で最大スコアのk+1に漸近する。
- 罰則項で短い文書の方がスコアが高くなる。
分布仮説、分散表現 †
- 単語の分散意味表現(単語の分散表現、単語埋込ベクトル表現)
- 単語にベクトルを割り当てる。
- 比較的低次元(300次元とか)で、
密なベクトルを与える(元は疎、スパース)。
- 各行はベクトルで構成され、ベクトルのコサイン類似度の計算で
意味的類似度・関連度を計量化できる(類似度・関連度は異なる)。
#ref(): File not found: "image.png" at page "言語処理"
- この(意味をベクトルで表現する)モデルを
「単語埋め込みモデル」と言うらしい。
- (局所表現:ベクトル=単語)
- 分散表現:ベクトル空間上の点=単語
- 多義語
- 同じ単語の複数の意味が1つのベクトルに混じる。
- 与えられた文脈における単語の分散表現を動的に作る。
- 反義語
- 反対の単語が似たベクトルになる。
- モダリティの情報を統合する研究。
共起頻度アプローチ †
- 共起行列
- 縦軸:ベクトルを与えたい単語の集合
- 横軸:縦軸の単語の属性として用いる単語群
- 数字:n単語(文脈窓、周辺文脈)に何回出現するか?
| ... | 単語A | ... | 単語B | ... | 単語C |
単語X | ... | 10 | ... | 150 | ... | 50 |
単語Y | ... | 100 | ... | 80 | ... | 40 |
単語Z | ... | 1 | ... | 20 | ... | 100 |
- 例
I waited for a while.
| I | waited | for | a | while | . |
I | 0 | 1 | 0 | 0 | 0 | 0 |
waited | 1 | 0 | 1 | 0 | 0 | 0 |
for | 0 | 1 | 0 | 1 | 0 | 0 |
a | 0 | 0 | 1 | 0 | 1 | 0 |
while | 0 | 0 | 0 | 1 | 0 | 1 |
. | 0 | 0 | 0 | 0 | 1 | 0 |
- 相互情報量(PMI)で正規化
単語と文脈語(the)など、重要で無いが共起し易い(不適切)
- carと関係が深い単語はtheか?driveか?
- 1000単語中でcarが20、theが1000、driveが10
- carとの共起がtheが10、driveが5の場合
- the:log2 (10*10,000)/(1,000*20)≒2.32
- drive:log2 (5*10,000)/(10*20)≒7.97
- 行列分解(LSA、SVD)で低次元化
疎、スパースな大規模行列を低次元化
文脈予測アプローチ †
- 意味関係がベクトルの差分で表される。
=単語の意味合成(類推)がベクトルの加算により行える。
- Japan(ベクトル)- Tokyo(ベクトル)= ~を首都とする国(ベクトル)
- パリ(ベクトル)+ ~を首都とする国(ベクトル)= フランス
- 北京(ベクトル)+ ~を首都とする国(ベクトル)= 中国
- fastText
- Word2Vecがベースで、
- 単語のベクトル表現の生成が高速化され、
- テキストの分類も高速で行える。
- 活用系をまとめることができる。
- ELMo
- 単語の埋め込み表現が可能な2層のLSTMを用いた言語モデル
- 文脈に応じた単語の意味を演算して表すことが可能
word2vec †
- 自己教師あり学習の深層学習(2層のNN)により
分散表現(ベクトル表現)を獲得する代表的な手法。
- 2層の分類DNNで分散表現(ベクトル表現)は重みとして学習される。
- 分類DNNの性能は低くても分散表現(ベクトル表現)が獲得できればOK。
- モデル(2種類)
I have a big dream for future.
- CBOWモデル
・文中の単語穴埋め問題タスクを解くモデル
・周辺文脈が与えられた時、
その中心になる単語を予測する学習により分散表現を結果的に得る。
・I have (a) → (big) ← (dream) for future
- Skip-gramモデル
・単語から周辺の単語予測の問題タスクを解くモデル(CBOWの逆)
・周辺文脈の中心になる単語が与えられた時、
周辺文脈の単語群を予測する学習により分散表現を結果的に得る。
・I have (a) ← (big) → (dream) for future
- 高速化なしモデル
重すぎて動かない(単語数≒分類が多過ぎるため)
- hierarchical softmax
・最小化スべきコードパス全体に対する損失関数
・100万分類を100分類*3に落とし込む。
・実際には2分類をlog2 V 回行う。
- Negative Sampling
・100万分類を[正例1, 負例10] (負例サンプリング)の2値分類に落とし込む。
・Softmax関数をSigmoid関数にしてロジスティック回帰
- 上記で学習したモデルの入力部分の重みを縦 or 横に読んだものが単語の分散表現になっている。
文のベクトル化 †
文の分散表現の構成法 †
- BoWモデル
- 単語の分散表現の和(学習は不要)
- 語順に依る意味の違いを表現しないが、目的によっては十分
- 副作用的に文の分散表現を獲得
- 転移可能性の問題がある。
doc2vec †
word2vecのdoc版で、
- Document(文書)をWord(単語)の集合として見て
- 文書間の類似度やベクトル計算などを実現できる。
Transformer / BERT †
- Transformer
- BERTの基礎、エンコーダ・デコーダ構造
- 機械翻訳を目的タスクとするオートエンコーダ以降のDNNでよく用いられる。
- 入出力を端として中央部の次元を低くし、その中央部の左右で対称形を成すネットワーク構造
- データを逐次処理する必要がなく、ビッグデータで効率的に学習できる。
- 自己Attention機構の重要性を示し、他の分野にも影響を与えた。
- Bidirectional Encoder Representations from Transformers
- 2018年に論文によって提案されたTransformerを発展させたモデル。
- Transformerのエンコーダーを双方向多層に積み重ねたアーキテクチャ
- 双方向(文頭と文末)から学習することによって「文脈を読むこと」が実現された。
- 膨大な量のテキストデータからテキストの単語の連なりの「言語らしさ」を学習
- 長く複雑な文章を読み取ることができ文脈を読むことが可能になった
- 上位の層では意味・文脈に関する抽象化された情報が獲得される事を期待。
- BERTの学習済みモデル(汎用事前学習モデル)はGoogleが無償で公開
- 得意なタスク
マスクされた単語の前後のテキストを使って単語を予測する。
- 質問応答(質問に対する回答を文書中から見つけてくる)
- 文の比較(片方の文がもう一方の文の内容を含んでいるか)
- 事前学習に工夫をしている。
リソースと時間が必要。
- マスクされた単語の予測を学習(MLM)
- 連続する2文であるか判断を学習(NSP)
- チューニング
実現したいタスクに応じた数百レベルの学習データを用意してファイン・チューニング
- 事前学習結果を実際に使う場合。
- BERTの上にタスク依存の層を重ねる。
- 数百件レベルの学習データで実施可能
- GLUEデータセット
BERTやGPTなどのマルチタスク自然言語処理モデルの性能評価目的で開発された。
- GPT-n
- 非営利団体OpenAIが開発したもので、初代のGPT-1はBERTと同じ2018年に発表
- 過去の単語列から次の単語を予測するように学習を行う
- エンコーダを持たず、Transformerのデコーダと似た構造を持つネットワーク
- 2019年にGPT-2、2020年にGPT-3が発表(中身は同じで、規模と学習データの量を大きくしたもの)
- GPT-3は1750億のパラメタ、約45TBのコーパスで事前学習とBERTに比べてあまりにも巨大
- 悪用リスクのためOSS化されていない(OpenAIへAPIの利用申請が必要)
- 得意なタスク
マスクされた単語より前のテキストを使って単語を予測する。
- 要約、対話生成
- 幅広い言語タスクを高精度で実現:
文章生成、翻訳、質疑応答、文章穴埋
- 計算(足し算・引き算)もできる。
- ソースコード生成、デザイン支援もできる。
- 苦手なタスク
- 比較が苦手
- 人間社会、物理現象の慣習や常識を認識、推論できない。
- チューニング
チューニングに数例のデータしか必要としない。
- GPT-3は、1回の学習に数億円の費用が掛かる。
- 代替手段となるfew-shot学習は、学習を行っているわけではなく、
巨大な汎用事前学習モデルの中の学習結果から求められている学習結果を引き出しているだけ。
- Self Attention, Source-Target Attention, Encoder-Decoder Attentionとも。
- RNNと違って並列計算ができるようになり、高速な学習が可能になったが、
背反として語順を考慮できないため、Positional Encoding(位置エンコーディング)
と呼ばれる方法を用いてベクトルに語順情報を付加して間接的にコレを可能にした。
- Attention機構を翻訳で活用する場合、
- 入力単語~出力単語、どれに対応しているか?(対応付けの良さ)の重みを計算する。
- 入力の各単語のベクトルの重み付けして足して、出力が注意を向けるべき入力からの情報を得る。
- コレを画像処理に応用したのが、Vision Transformer。
上記をRNNで処理? †
上記(ベクトル化された文)を、タスク毎のRNN(Seq2Seq)で処理?
参考 †
Wikipedia †
YouTube? †