「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
言語処理 ≒ 自然言語処理は、AI(機械学習・深層学習)最大の金脈と言われる。
自然言語処理 †
- 歴史は機械翻訳の歴史
- まだまだ未熟な分野
- AI完全問題と言われる
- MMIとしては非常に魅力的
分野ごとにマチマチ †
- 深層学習の導入で機械翻訳の性能が大幅に向上。
- 構文解析などは、精度は向上しているが、大きな進捗は無い。
- 文脈解析などは既存のアプローチでは実用的な精度が無い。
目的と学習のズレ †
- 自然言語処理では目的と学習にズレがあることが多い。
- ズレている気がするタスクで学習するが目的のタスクを達成できる的な。
詳細 †
体系 †
N-gram LM †
自然言語処理に革命を起こしたRNN LM。
- 深層学習以降は、RNNを言語モデル(LM)に適用し、次の単語を予測する。
- 特に主要な問題として過生成と生成不足が指摘されている。
- 音声データ → 文章候補 → 文書(Rescoring N-Best)で性能を大きく改善したのが始め。
- PPL : 迷い度、1/x の確率で正解できる
- WLR : 誤認識率(音声段階の間違いを含む)
| 言語学的に工夫したLM | RNN LM | 備考 |
PPL | 221 | 121 | 単語予測ではこんなモノ |
WLR | 13.5( - 9.5 = 4.0) | 11.1( - 9.5 = 1.6) | 9.5%は音声認識のエラー |
- inputは単語でOne-Hotエンコーディングしたベクトル。
(単語の数だけになるので数万から数十万次元になる)
- ht ≠ yt で、
- hidden の htは数十から数百次元のベクトル
- output の ytはinputと同じ数万から数十万次元のベクトル
手順 †
(特徴抽出とタグ推定)
クリーニング †
括弧、カンマ、ピリオドの削除
単語の分割と正規化 †
形態素解析、小文字などに統一するなど
ストップワードの除去 †
英語のa, the, of、日本語の「は」「の」「です」など。
活用例 †
変換 †
- 概要
入力された文字列を理解、推論、また学習して、効率的に変換を行なう。
テキストマイニング †
- お客様の声の分析
口語調は処理が難しい
- 略語や言葉の間違い
- 口語調の言い回し
- 顔文字の調整
- 口コミサイトの文章からの知識発見
- 口コミサイトの評価点が当てにならない。
- 話題(評価項目)の頻度でカテゴリが解ってくる。
- カテゴリ毎に評価項目のポジティブ・ネガティブを集計
- コールセンターのコンタクト履歴からの知識発見
- 問い合わせの増加内容の分析
- 共起による製品の問題の分析
- 問い合わせパターンの分析
- アナリスト・レポート分析(株価分析
- 輸出産業のデータベース化
- レポートのキーワードを抽出(円高・円安)
- レポートの属性情報を付与(誰が書いたか?上がる予測か?下がる予測か?)
- 上がるか下がるか属性で分類して実際の株価の推移と比較して集計した結果
アナリストのレポートを分析すれば、おおむね株価の予測できる事が解った。
・東証一部:正解値を出している。
・中企業:まぁまぁ当たり、上げ下げの幅が大きい(賭博性が強い)
・小企業:正解値を出していない。
- 銀行・金融業のデータベース化
アナリストレポートはあまり当たらない事が解った。
- 曖昧な動詞をつかっている計画の成功率は低い。
「やる」にどの様な表現を使っているか?
(行う、図る、実施する、整備する, etc.)
- 動詞の曖昧性や明確性を定義する。
- どの程度成功しているのかの成功率で並べる。
- 明確な動詞は成功率が高く、曖昧な動詞では成功率が低い。
- 「等」をつかている計画の成功率は低い。
等の出現率と成功率を表でまとめる。
- 後払い通信販売の未払い検知
- 未払い実績があると特定されたくない≒住所を偽る。
- 住所をゆらして記入してきた場合、未払いになる可能性が高い。
エンリッチメント系 †
テキスト・アノテーション
- エンティティ・アノテーション(情報ユニットに分解し、構造化)
- エンティティ・リンキング(エンティティアノテーション後、KBに結び付ける)
- 文節チャンキング(名詞や動詞、形容詞といった品詞にタグ付けを行う)
- 意図抽出(質問・要望などの情報をテキストから抽出)
- 意味的(セマンティック)アノテーション(文脈から判断できる情報の付加)
- 分類アノテーション(分類もアノテーション)
- センチメント・アノテーション(感情分析)
※ 文書検索、チャットボットで利用される。
文書検索 †
チャットボット †
(質問応答システム)
質問を特徴量に変換しパターン化された応答を提示する。
- プリセールス
- コールセンター
- スマートスピーカー
- バーチャルアシスタント
その他 †
文の構成性 †
統語的階層構造(句構造) †
系列の並び(現在主流) †
テキスト・コーパス †
自然言語の文章を構造化し大規模に集積したもの。
- 定義
- 機械可読なテキスト・データを収集したもの。
- ある目的のため
(現実の分布を考慮しサンプリングした)
テキスト・データを収集したもの。
- 注釈付きコーパス
人手 or 機械的にアノテーションが付与されたテキスト・データ
- 教師あり学習の学習データ
- 伝統的NLPシステムの評価データ
ベクトル化 †
- エンコード、エンコーディングとも言う。
- 分布仮説から分散(意味)表現とも言う。
単語のベクトル化 †
単語の意味 †
- 初期のRNN LMなどで、単語に意味付けしない場合は、
単語でOne-Hotエンコーディングしたベクトルを使用していた(高次元統計の問題)。
- シソーラスによる手法
言語資源(辞書)を作成する。
- 言語のクラス図のようなネットワークを作成
- 単語感の類似度の算出などができる。
- 最も有名なシソーラスはWordNet?(NLTKライブラリ)
- 問題点
- 人手によって作成するので作成コストが高い
- 時代によって変化する意味を負うことが難しい。
- ニュアンスを表現できない(シチュエーション毎の使い分けができない)。
TF-IDF †
(単語埋込(Word Embedding)モデルではない)
- 概要
文書中の単語を頻度と希少性を加味して評価
- 複数の文書に横断的に使用している単語は重要ではない
- 対象する文章内で頻度が高く出てくる単語は特徴的
- 用途
- 文書検索
- レコメンド
- 自然言語処理
文書の特徴をベクトル化
- 意味
文書と単語の「マッチ度」(頻度と希少性を加味して評価した値)を測定
- tf
文書中の単語の頻度
・文書中の単語の割合
・頻出単語 → 高ポイント
- idf
文書中の単語の希少性
・情報量(情報の珍しさ)
・希少単語(idf) → 高ポイント
- 何を表示させるか?
- 単語をバラして検索単語が含まれていたら対象とする。
- → 頻出する単語では、どの文書も対象になる。
BM25 †
- 概要
- tf-idfの進化系でtfの部分が進化している。
- 検索クエリに特化している。
- 意味
検索クエリに出てきた単語のスコアの合計。
- 文章の長さが平均の場合、単語1で1ポイント
- 単調増加で最大スコアのk+1に漸近する。
- 罰則項で短い文書の方がスコアが高くなる。
分散表現でベクトル化 †
分布仮説と分散表現 †
- 分布仮説:単語の意味は、周囲の単語によって形成
- 分散表現:単語の分散表現、単語埋込(Word Embedding)ベクトル表現
- 局所表現・分散表現
- (局所表現:ベクトル=単語)
- 分散表現:ベクトル空間上の点=単語
- 単語にベクトルを割り当てる。
- 単語の数だけの次元からはるかに低い次元へと数学的な埋込が行われる。
- 類似する単語同士はベクトル空間上で近くなり、異なる単語同士は遠くなる。
- この(意味をベクトルで表現する)モデルを
「単語埋込(Word Embedding)モデル」と言うらしい。
- 多義語
- 同じ単語の複数の意味が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のPMI:
= log2 (10*10,000) / (1,000 * 20) ≒ 2.32
driveのPMI:
= log2 (5 * 10,000) / (10 * 20) ≒ 7.97
- PPMI(Positive PMI)はPMIの正の値
PPMI = max(0, PMI)
- SVD(特異値分解)で低次元化
- SVDでスパース(疎)な大規模行列をデンス(密)な大規模行列に変換
- Uの先頭の次元が重要度が高いのでスライシングで切り捨てる。
- 𝑋=𝑈𝑆𝑉𝑇
・Sの中の特異値が小さいものは重要度が低い。
・小さい特異値を削除することでSの行方向と列方向を削減し、
・Uを列方向に削減したU'、Vを行方向に削減したV'が作成できる
- LSA(潜在意味解析)で低次元化
- LSAはTruncated SVDとも言う、SVDを使った次元削減法
- 特異値の大きなものに限定して計算することで高速化する。
文脈予測アプローチ †
コーパスの文脈から単語、単語から文脈を予測するような学習を行う。
- 各単語はベクトルで構成され、意味、文法上の活用形など関係を学習する。
- ベクトルのユークリッド距離や?コサイン類似度の計算で
意味的類似度・関連度を計量化できる(類似度・関連度は異なる)。
- 意味関係がベクトルの差分で表される(加法構成性)。
- 単語の意味合成(類推)がベクトルの加算により行える。
- 有名な例
・king - man + woman = queen
・queen - woman + man = king
- ちなみに、共起頻度アプローチの分散表現は、コサイン類似度などの類似性尺度を使用することが一般的で
ベクトル同士を加算することで、2つの単語の意味的な結合を得ることは難しく加法構成性は持たない。
word2vec †
- 自己教師あり学習の深層学習(2層のNN)により分散表現(ベクトル表現)を獲得する代表的な手法。
- 単語予測(分類)の2層DNNで分散表現(ベクトル表現)は重みとして学習される。
- 入力Iは単語数V中の単語でOne-HotエンコーディングしたV次元のベクトル
- このWiIの重みWiの各行(or 列)が各単語をV→hに次元圧縮した分散表現になっている。
- 単語予測(分類)DNNの性能は低くて(まともに機能しないレベルで)も分散表現(ベクトル表現)が獲得できればOK。
- モデル(2種類)
I have a big dream for future.
- CBOWモデル
文中の単語穴埋め問題タスクを解くモデル
・データ:I have (a) → [big] ← (dream) for future
・入力Iは単語のOne-Hotベクトルになっている。
・入力Iは1文章中のc個の単語の前後の=2c個の単語
・WiでV次元をh次元に圧縮(全結合)して、
・圧縮した後、ベクトルの平均を取る(前後の圧縮後のベクトルを足して1/2にする)。
・Woで再び、h次元をV次元に復元(全結合)。
・入力が行ベクトルか列ベクトルかは資料によって任意(Wの行と列が入れ替わる)。
・復元したベクトルをSoftmax関数で分類。
※ この学習の結果、重みWi、Woの行 or 列ベクトルが各単語を次元圧縮した分散表現になっている。
- Skip-gramモデル
単語から周辺の単語予測の問題タスクを解くモデル(CBOWの逆)
・データ:I have [a] ← (big) → [dream] for future
・入力Iは単語のOne-Hotベクトルになっている。
・入力Iは1文章中のc個の単語で、前後の単語を予測する。
・WiでV次元をh次元に圧縮(全結合)して、
・Woで再び、h次元をV次元に復元(全結合)。
・入力が行ベクトルか列ベクトルかは資料によって任意(Wの行と列が入れ替わる)。
・復元したベクトルをSoftmax関数で分類。
※ 複製でWoが共用なので単語が同じなら前後は全部同じ答えになる(が、Wiが計算できれば、それで良い)。
※ この学習の結果、重みWi、Woの行 or 列ベクトルが各単語を次元圧縮した分散表現になっている。
- 高速化(3パターン)
最小化スべきコードパス全体に対する損失関数
- 高速化なしモデル
重すぎて動かない(単語数≒分類が多過ぎるため)
- hierarchical softmax
・100万分類を100分類*3=300に落とし込む。300/100万≒3000倍以上の性能向上
・実際には2分類をlog2 V 回行う。
- Negative Sampling
・100万分類を[正例1, 負例10] (負例サンプリング)の2値分類に落とし込む。
・Softmax関数をSigmoid関数にしてロジスティック回帰する。1つの正例のロジスティック回帰と複数の負例のロジスティック回帰
- Gensimのデフォルトは、
- CBOW&Negative Samplingとのこと。
- 追加で、MatMul?レイヤ(厳密にはnp.dot, np.matmulは違うらしい)をEmbeddingレイヤ(ベクトル指定)に変更している。
ちなみに、Embeddingレイヤの逆伝播は前から伝えられるデータで該当する行に加算で更新(データが重なって戻って来る場合にも対応可)
- また、Negative Samplingの部分では、Embedding+dot積のEmbeddingDot?レイヤを使用している。
下図を見ると、順伝播に教師データ必要じゃないか。となるが、学習で分散表現を獲得する訳で、実際に推論する訳ではないのでOKか。
- Wi、Woのどちらを使うか?
- 基本的にWiだが、Woや、WiとWoの平均を使うなどのケースもある。
- CBOWのWo側のベクトルで加法構成性を説明するコンテンツもあるのでCBOWはWoも使う。
・Woの単語に対応したベクトルは「コンテキストのベクトル」(≒関連する意味を含むベクトル)の内積の値を大きくする。
・AIcia Solid Projectでは、「He is a man.」「He is a King.」「She is a woman.」「She is a Queen.」が例に上がっていた。
・これは、man、KingでHeを予測、woman、QueenでSheを予測、みたいな話。
・内積は、二つのベクトルがどれだけ同じ方向を向いているかの指標になる。
・同じベクトルの内積は大きくなり(+1)、反対のベクトルの内積は小さくなる(-1)。
・V(He) - V(She) = V(man) - V(woman) = V(King) - V(Queen)みたいな話。
・従って、Woの単語に対応したベクトルは加法構成性を獲得する。
- 特に、Skip-gramモデルでは、Wiの有効性が実証されているとのこと。
fastText †
- word2vecがベースの進化形で、Skip-gramモデル * Negative Sampling
- ワードをサブワード(tri-gram)に分割し
ワードをサブワードのベクトルの足し算でベクトル化する。
- 例えば、WhereはWhenと似たベクトルになり、未知語もベクトル化できる。
- 単語のベクトル表現の生成も高速化され、
- テキストの分類も高速で行える。
- 活用系をまとめることができる。
- 入力Iはワードと対応するサブワードが複数個
- Where
- <Where>
- <Wh, Whe, her, ere, re>
- WiIで列ベクトルに圧縮(全結合)
- ベクトルを足して
- Negative Samplingで分類(?)。
- 意味の類推
- CBOW < fastText
- 複合語・合成語のあるドイツ語で大きく改善
- 文法理解
- 加法構成性:longer - long + tall = taller
- 格変化、活用の多いドイツ語・チェコ語で大きく改善
- 未知語に強い
kindness = kind + ness
- 少データでOK
Wikipedia100%をCBOWで学習 < Wikipedia1%をfastTextで学習
ELMo †
- 単語埋込(Word Embedding)表現が可能な2層のLSTMを用いた言語モデル
- 文脈に応じた単語の意味を演算して表すことが可能
文のベクトル化 †
BOWモデル †
(Bag of Words)
単語の出現回数(学習は不要)で、
語順に依る意味の違いを表現しないが、
類似文書検索タスクでは十分精度が出る。
- 日本語は英語のように単語が空白で分かれていない場合、形態素解析で単語単位に分割
- 文章毎に各単語が何回出現したかを数え上げ、長さが語彙数、値が出現回数となるベクトルにする。
- 出現回数そのものでなく、TF-IDFといった手法を用いて単語の重みを調整する方法もある。
文の分散表現の構成法 †
- 副作用的に文の分散表現を獲得
- 転移可能性の問題がある。
doc2vec †
- 従来手法の問題
- BOWモデル:語順に依る意味の違いを表現しない。
- Parse tree:文1つならOKだが文章になるとNG
- word2vecのdoc版で、
- Document(文書)をWord(単語)の集合として見て
文書間の類似度やベクトル計算などを実現できる。
- PV-DM(Distributed Memory Model of Paragraph Vector)
文章中の次の単語予測のタスクを解くモデル
・データ:ドキュメントID+ドキュメント(単語列)
・word2vecのCBOWモデル的な2層のNN
・1層目では重みDI、WIでドキュメントID、単語のOne-Hotベクトルを次元圧縮
・2層目の前に次元圧縮したドキュメントIDベクトルと単語ベクトルの平均とを連結し
・それぞれ重みが分散表現を獲得する。
・WIの列ベクトルが単語の分散表現
・DIの列ベクトルが文の分散表現(フレーズ・ベクトル)
- PV-DBOW(Distributed Bag of Words version of Paragraph Vector)
文章中の単語予測のタスクを解くモデル
・データ:ドキュメントID+ドキュメント(単語列)
・word2vecのSkip-gramモデル的な2層のNN
・入力は単語ではなくドキュメントIDベクトルで重みDIで次元圧縮
・最終的にDIの列ベクトルが文の分散表現(フレーズ・ベクトル)
- PV-DM・PV-DBOW
・2つのフレーズ・ベクトルを縦に繋げる(400 + 400次元 = 800次元)。
・PV-DBOW単体では精度はそれほど良くないらしい(タスク的にも)。
- gensimのデフォルトは、
・PV-DMとのこと(単体で精度十分のため)。
・PV-DMは「Nが大きいN-gram」だから精度が良い?
- 感情分析
レビュー・コメント → フレーズ・ベクトル → レーティング
- 短文
Stanford Sentiment Treebank(高低2択)
| ErrorRate? |
今までのBEST(?) | 14.6% |
doc2vec | 12.2% |
- 長文
Large Movie Review Dataset - Imdb dataset(★1-5)
- 情報抽出
(多分、Googleの)同じ検索クエリの結果から2件、異なる検索クエリの結果から1件抽出
→ フレーズ・ベクトル → レーティング(同じクエリで近く異なるクエリで遠い)
| ErrorRate? |
BOW(長文なら使える) | 5.7% |
doc2vec | 3.8% |
NLPモデル †
自然言語処理(NLP)モデル
過渡期。
- 翻訳タスクの結果
- 英 → 仏
- The agreement on the European Economic Area was signed in August 1992.
- L’accord sur la zone économique européenne a été signé en août 1992.
- 精度(BLEU)
- 未知語無しで従来手法に勝利。
- 長文では単語数が増えても精度が落ちないを事を確認。
- 最近の自然言語処理のベースとなるモデルでGPTやBERTなど最新モデルに応用されている。
- Generative Pre-trained Transformer
- 2019年にGPT-2、2020年にGPT-3が発表
(中身は同じで、規模と学習データの量を大きくしたもの)
- 悪用リスクのためOSS化されていない
(OpenAIへAPIの利用申請が必要)
- Bidirectional Encoder Representations from Transformers
- GPT-nを少し改変しているので、高性能で汎用性が高く応用し易い。
T5、Switch、Meena †
Transformerの上に構築された自然言語処理(NLP)モデル
GLUEデータセット †
GPTやBERTなどのマルチタスク自然言語処理モデルの性能評価目的で開発された。
LLMの特徴 †
GPTやBERTなどがLLMに該当する。
ポイント †
超大規模化 †
- べき乗則で次単語予測の性能が向上、汎化性能も向上。
- ただし、GPT-4の辺りで頭打ちになった。
- 創発
- モデルを大規模化していくとある時点から急に解けるようになる現象
- 大規模言語モデル(LLM)の創発的な特性 ≒ コンテキスト内学習
- 構成属性文法仮説
言葉の背後の構造(コンテキスト)を理解できるようになる。
- 与えられたコンテキスト内で情報を学習し、その学習を元に出力を生成する。
- Zero-Shot学習とも呼ばれ、プロンプト(過去文脈)でパラメタ更新はしないが
Attention機構を変形して見方を変えると勾配降下法をシミュレーションしている。
順問題を学習できる。 †
- 学習するAIは基本的に逆問題的に学習する。
- LLMは順問題の定義を言語的&確率的に学習できる。
- ただし、
- この順問題の定義の学習は、あくまで言語的&確率的であって
- 学習で構築した論理をベースに質問に回答している訳ではない。
- 人間がどのように言葉の意味を理解しているのか不明。
- 直感的に思考して会話するケース
- 言語から学習したモデルを使って論理的に思考して会話するケース
- 恐らく、人間とLLMの言語理解能力の間に大きな違いがある。
ポランニーのパラドックス †
人間は言葉で表せる以上のことを知っている。
- LLMでは明文化されない暗黙知部分を学習できない。
- 言語的&確率的な学習で暗黙知を学習したように見える時もある。
汎用性と用途 †
エージェント †
サポート
- 翻訳・要約
- トレーニング
- カウンセリング
- コーチング
- 新たな発見(藤井聡太的な)
様々な文書生成 †
プログラミング †
プログラムを生成する。
検索エンジンの代替 †
人間が参照しきれないテキストから意図する情報を抽出
インターフェイス †
特に、音声インターフェースなど。
人間の言語理解能力の理解 †
LLMとの対比で人間の言語理解能力を理解する。
問題点 †
幻覚 †
誤った「解釈」が(存在しない)新事実を創出してしまう。
故障 †
記憶の機能がなく、破滅的忘却で壊れる可能性がある。
学習効率 †
- 人間と比べるとかなり効率が悪い(コストが高い)。
- ただし、繰り返し利用でコストは償却可能と言う考え。
リスク †
セキュリティ †
コレはChatGPTなどのシステム・アプリの問題。
偽情報の拡散 †
何を持って偽情報なのか?
機密情報の拡散 †
コレは、≒ セキュリティ。
倫理・道徳 †
何を持って倫理・道徳なのか?
ポリコレ †
目的駆動学習(人間のフィードバックによる強化学習)でポリコレにフィットさせたりする。
仕事の変化 †
Web検索で仕事が変化したように、LLMでも変化するものと考えられる。
参考 †
Wikipedia †
Qiita †
YouTube? †
ライブラリ †
オープンソース †
Python系
プロダクト †
Python系
サービス、ソリューション †
ゼロから作るDeep Learning †
自然言語処理編
https://www.oreilly.co.jp/books/9784873118369/
サンプル †
https://github.com/oreilly-japan/deep-learning-from-scratch-2
その他、参考 †
- 深層学習 / ゼロから作るDeep Learning2 - Qiita
- 「ゼロから作るDeep Learning」自習メモ - Qiita
- 「ゼロから作るディープラーニング②」を読む - FPGA開発日記