「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>言語処理]]([[要素技術 > 非構造化データ処理 / 人工知能(AI)>要素技術#qa6076ee]]、[[データ分析 > 非構造化データ処理>データ分析#p79a1ae5]]、[[深層学習(deep learning)]]) --言語処理(AI) ---[[機械翻訳]] ---[[Transformer、GPT-n、BERT>自己符号化器(AE:オートエンコーダ)]] ---[[Transformer、GPT-n、BERT>テキスト生成系(Transformer系)]] --[[音声処理(AI)]] --[[画像処理(AI)>画像処理とコンピュータビジョン(AI)]] *目次 [#x6858239] #contents *概要 [#u0d6649c] 言語処理 ≒ 自然言語処理は、AI(機械学習・深層学習)最大の金脈と言われる。 -以前は、[[形態素解析、構文解析、意味解析、文脈解析>言語処理#y3bf95cb]](言語学的 -単語を高次元のベクトルに置き換える[[分散表現>#md350799]]という技術を用いる。 --単語の数が多いためデータが高次元かつスパース --単語データの並びのことをシーケンスと言い、これが文章にあたる。 **自然言語処理 [#a3290cad] -歴史は[[機械翻訳>言語処理(AI)#m6a099ad]]の歴史 -まだまだ未熟な分野 -AI完全問題と言われる -MMIとしては非常に魅力的 **分野ごとにマチマチ [#f3298528] -[[深層学習>深層学習(deep learning)]]の導入で[[機械翻訳>言語処理(AI)#m6a099ad]]の性能が大幅に向上。 -構文解析などは、精度は向上しているが、大きな進捗は無い。 -文脈解析などは既存のアプローチでは実用的な精度が無い。 **目的と学習のズレ [#x5b7e667] -自然言語処理では目的と学習にズレがあることが多い。 -ズレている気がするタスクで学習するが目的のタスクを達成できる的な。 *詳細 [#obdb6eb9] **体系 [#uf772e10] ***N-gram LM [#e233a5df] ***[[RNN>再帰型ニューラルネットワーク(RNN)]] LM [#j3b25298] 自然言語処理に革命を起こしたRNN LM。 -[[深層学習>深層学習(deep learning)]]以降は、[[RNN>再帰型ニューラルネットワーク(RNN)]]を言語モデル(LM)に適用し、次の単語を予測する。 -特に主要な問題として過生成と生成不足が指摘されている。 -音声データ ―①→ 文章候補 ―②→ 文書(Rescoring N-Best)で性能を大きく改善したのが始め。 --PPL : 迷い度、1/x の確率で正解できる --WLR : 誤認識率(音声段階の間違いを含む) ||言語学的に工夫したLM|RNN LM|備考|h |PPL|221|121|単語予測ではこんなモノ| |WLR|13.5( - 9.5 = 4.0)|11.1( - 9.5 = 1.6)|9.5%は音声認識①側のエラー| -初期のモデルの構造 --RNNは[[Simple RNN>再帰型ニューラルネットワーク(RNN)#nfc75d38]] --inputは単語でOne-Hotエンコーディングしたベクトル。~ (単語の数だけになるので数万から数十万次元になる) --ht ≠ yt で、 ---hidden の htは数十から数百次元のベクトル ---output の ytはinputと同じ数万から数十万次元のベクトル **手順 [#n98b67e4] (特徴抽出とタグ推定) ***クリーニング [#y0292aba] 括弧、カンマ、ピリオドの削除 ***単語の分割と正規化 [#a776ffe8] 形態素解析、小文字などに統一するなど ***ストップワードの除去 [#pf4a989f] 英語のa, the, of、日本語の「は」「の」「です」など。 ***[[テキストのベクトル化表現>#k2009143]] [#ie809371] **活用例 [#y95f540c] ***変換 [#a902e7a2] -概要~ 入力された文字列を理解、推論、また学習して、効率的に変換を行なう。 -事例 --かな漢字変換 --予測変換機能 ***テキストマイニング [#ec90b2d0] -お客様の声の分析~ 口語調は処理が難しい --略語や言葉の間違い --口語調の言い回し --顔文字の調整 -口コミサイトの文章からの知識発見 --口コミサイトの評価点が当てにならない。 --話題(評価項目)の頻度でカテゴリが解ってくる。 --カテゴリ毎に評価項目のポジティブ・ネガティブを集計 -コールセンターのコンタクト履歴からの知識発見 --問い合わせの増加内容の分析 --共起による製品の問題の分析 --問い合わせパターンの分析 -アナリスト・レポート分析(株価分析 --輸出産業のデータベース化 ---レポートのキーワードを抽出(円高・円安) ---レポートの属性情報を付与(誰が書いたか?上がる予測か?下がる予測か?) ---上がるか下がるか属性で分類して実際の株価の推移と比較して集計した結果~ アナリストのレポートを分析すれば、おおむね株価の予測できる事が解った。~ ・東証一部:正解値を出している。~ ・中企業:まぁまぁ当たり、上げ下げの幅が大きい(賭博性が強い)~ ・小企業:正解値を出していない。 --銀行・金融業のデータベース化~ アナリストレポートはあまり当たらない事が解った。 -行政文書の分析(政策計画書の玉虫色表現 --曖昧な動詞をつかっている計画の成功率は低い。~ 「やる」にどの様な表現を使っているか?~ (行う、図る、実施する、整備する, etc.) ---動詞の曖昧性や明確性を定義する。 ---どの程度成功しているのかの成功率で並べる。 ---明確な動詞は成功率が高く、曖昧な動詞では成功率が低い。 --「等」をつかている計画の成功率は低い。~ 等の出現率と成功率を表でまとめる。 -後払い通信販売の未払い検知 --未払い実績があると特定されたくない≒住所を偽る。 --住所をゆらして記入してきた場合、未払いになる可能性が高い。 ***エンリッチメント系 [#e6400ea2] テキスト・アノテーション -エンティティ・アノテーション(情報ユニットに分解し、構造化) -エンティティ・リンキング(エンティティアノテーション後、KBに結び付ける) -文節チャンキング(名詞や動詞、形容詞といった品詞にタグ付けを行う) -意図抽出(質問・要望などの情報をテキストから抽出) -意味的(セマンティック)アノテーション(文脈から判断できる情報の付加) -分類アノテーション(分類もアノテーション) -センチメント・アノテーション(感情分析) ※ [[文書検索>#l3a1f930]]、[[チャットボット>#zd35939d]]で利用される。 ***文書検索 [#l3a1f930] -文書を特徴量に変換し類似度の順に並べて提示する。 -[[TF-IDF>#hdbd22d6]]、[[BM25>#vade3462]] ***チャットボット [#zd35939d] (質問応答システム) 質問を特徴量に変換しパターン化された応答を提示する。 -プリセールス -コールセンター -スマートスピーカー -バーチャルアシスタント ***[[機械翻訳]] [#m6a099ad] ***その他 [#bbaf1710] -テキスト要約 -文書作成支援(文章校正) **文の構成性 [#ea3878be] ***統語的階層構造(句構造) [#l0d48862] ***系列の並び(現在主流) [#c99a31d7] ***テキスト・コーパス [#ee57ac60] 自然言語の文章を構造化し大規模に集積したもの。 -定義 --機械可読なテキスト・データを収集したもの。 --ある目的のため~ (現実の分布を考慮しサンプリングした)~ テキスト・データを収集したもの。 -分類 --生コーパス~ [[自己教師あり学習>機械学習(machine learning)#g6507d39]]における情報源 --注釈付きコーパス~ 人手 or 機械的にアノテーションが付与されたテキスト・データ ---教師あり学習の学習データ ---伝統的NLPシステムの評価データ *ベクトル化 [#k2009143] -エンコード、エンコーディングとも言う。 -[[分布仮説>#md350799]]から分散(意味)表現とも言う。 **単語のベクトル化 [#uf017108] ***単語の意味 [#y321e7cb] -[[初期のRNN LM>#j3b25298]]などで、単語に意味付けしない場合は、~ 単語でOne-Hotエンコーディングしたベクトルを使用していた(高次元統計の問題)。 -シソーラスによる手法~ 言語資源(辞書)を作成する。 --言語のクラス図のようなネットワークを作成 --単語感の類似度の算出などができる。 --最も有名なシソーラスはWordNet(NLTKライブラリ) --問題点 ---人手によって作成するので作成コストが高い ---時代によって変化する意味を負うことが難しい。 ---ニュアンスを表現できない(シチュエーション毎の使い分けができない)。 -[[テキスト・コーパス>#ee57ac60]]から知識を抽出、構造化する手法。 --[[TF-IDF>#hdbd22d6]]、[[BM25>#vade3462]](カウントベースの手法) --[[分布仮説>#md350799]] ---カウントベースの手法 > 共起頻度アプローチ ---推論ベースの手法 > 文脈予測アプローチ ***TF-IDF [#hdbd22d6] -概要 --文書中の単語を頻度と希少性を加味して評価 ---複数の文書に横断的に使用している単語は重要ではない ---対象する文章内で頻度が高く出てくる単語は特徴的 --単語埋込(Word Embedding)モデルではなく文書埋込(Text Embedding) ---各単語のTF-IDFスコアを計算、文書内の全単語のTF-IDFスコアを結合することで、文書全体を表すベクトルが得る。 ---TF-IDFは最終的には文書のベクトル化に使用される手法ですが、そのベースは単語ごとの重要度(重み)にある。 -用途~ --文書検索 --レコメンド --自然言語処理~ 文書の特徴をベクトル化 -意味・定義 --意味~ 文書と単語の「マッチ度」(頻度と希少性を加味して評価した値)を測定 ---tf~ 文書中の単語の頻度~ ・文書中の単語の割合~ ・頻出単語 → 高ポイント ---idf~ 文書中の単語の希少性~ ・[[情報量>機械学習(machine learning)#z83dd630]](情報の珍しさ)~ ・希少単語(idf) → 高ポイント --定義 idf(t) = log (#D) / (#{d∈D|t∈d}) = log(全文書数)/(単語tを含む文書数) ---t : 単語 ---d : 文章(単語の集合 ---#D : 全文章 ---#d : 文章中の単語数 t∈d d={t1, t2, ... tn} tf-idf(t, d) = tf(t, d) * idf(t) tf(t, d) = (#of t in d) / (#d) = (単語tの登場回数)/(文書dの単語数) -文書検索の例~ [[Elasticsearch]]で使われているらしい。 --何を表示させるか? ---単語をバラして検索単語が含まれていたら対象とする。 ---→ 頻出する単語では、どの文書も対象になる。 --表示順序をどうするか? ---単語が多く登場する。 ---→ 長文が有利になる。 ***BM25 [#vade3462] -概要 --[[tf-idf>#hdbd22d6]]の進化系でtfの部分が進化している。 --検索クエリに特化している。 -用途~ 文書検索 -意味・定義 --意味~ 検索クエリに出てきた単語のスコアの合計。 ---文章の長さが平均の場合、単語1で1ポイント ---単調増加で最大スコアのk+1に漸近する。 ---罰則項で短い文書の方がスコアが高くなる。 --定義~ https://blog.foresta.me/posts/bm25-fomula/~ https://qiita.com/KokiSakano/items/2a0f4c45caaa09cf1ab9 φ = score(q,d) = ∑ (idf(qi) * ((k1+1)f(qi,d)) / (f(qi,d) + k1(1−b+b(#d/avgdl)))) ---検索クエリ : g = {g1, g2, ...gn} ---idf : [[tf-idf>#hdbd22d6]]のidfと同じ。 ---f(qi,d) : 文書中の当該検索ワードのカウント(的なモノ、tf説もあるが違うっぽい) ---k : パラメタ、1.2 ---b : 文章の長さの罰則パラメタ、0.75 ---φ : f=0で0、f=1で1、2≦fでφ<fで最大値のk1+1に漸近していく曲線 ---avgdl : 単語数の平均 ---(#d/avgdl) : 文書の相対的な長さ ---(1−b+b(#d/avgdl)) : 平均で0、文が平均より長いほど大きくなる罰則項。 φ = (k1+1)f / f+k1 ※ 文書の長さが平均(#d = avgdl)の場合 φ = (k1+1) * (f / f+k1) ※ 0 ≦ (f / f+k1) < 1なので φ < k1+1 #ref(bm25.png,left,nowrap,イメージ,60%) **分散表現でベクトル化 [#c83e86b8] ***分布仮説と分散表現 [#md350799] -分布仮説:単語の意味は、周囲の単語によって形成 -分散表現:単語の分散表現、単語埋込(Word Embedding)ベクトル表現 --計算の効率化・精度の向上を図る。 --局所表現・分散表現 ---(局所表現:ベクトル=単語) ---分散表現:ベクトル空間上の点=単語 --単語にベクトルを割り当てる。 ---単語の数だけの次元からはるかに低い次元へと数学的な埋込が行われる。 ---類似する単語同士はベクトル空間上で近くなり、異なる単語同士は遠くなる。 -ベクトル化のアプローチ --[[カウントベースの手法 > 共起頻度アプローチ>#o8dc8c2b]]~ コーパスの共起関係を行列として表し行列分解の手法を適用。 --[[推論ベースの手法 > 文脈予測アプローチ>#t6fb7c98]]~ コーパスの文脈から単語、単語から文脈を予測するような学習を行う。 -問題点 --多義語 ---同じ単語の複数の意味が1つのベクトルに混じる。 ---与えられた文脈における単語の分散表現を動的に作る。 --反義語 ---反対の単語が似たベクトルになる。 ---モダリティの情報を統合する研究。 ***共起頻度アプローチ [#o8dc8c2b] コーパスの共起関係を行列として表し行列分解の手法を適用。 -共起行列 --縦軸:ベクトルを与えたい単語の集合 --横軸:縦軸の単語の属性として用いる単語群 --数字:n単語(文脈窓、周辺文脈)に何回出現するか? ||...|単語A|...|単語B|...|単語C|h |単語X|...|10|...|150|...|50| |単語Y|...|100|...|80|...|40| |単語Z|...|1|...|20|...|100| --例~ I waited for a while. | |I|waited|for|a|while|.|h |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を使った次元削減法 ---特異値の大きなものに限定して計算することで高速化する。 ***文脈予測アプローチ [#t6fb7c98] コーパスの文脈から単語、単語から文脈を予測するような学習を行う。 -各単語はベクトルで構成され、意味、文法上の活用形など関係を学習する。 --ベクトルの内積やコサイン類似度の計算で~ 意味的類似度・関連度を計量化できる(類似度・関連度は異なる)。 --意味関係がベクトルの差分で表される(加法構成性)。 ---単語の意味合成(類推)がベクトルの加算により行える。 ---有名な例~ ・king - man + woman = queen~ ・queen - woman + man = king #ref(AdditiveCompositionality.png,left,nowrap,イメージ,60%) ---ちなみに、~ 共起頻度アプローチの分散表現は、コサイン類似度などの類似性尺度を使用することが一般的だが、~ 共起頻度は単語の意味的な関係性を捉えようとするが単語の意味的情報を含まなたいめ、~ ベクトル同士を加算することで2つの単語の意味的な結合を得る様な加法構成性は持たない。 -この(意味をベクトルで表現する)モデルを~ 「単語埋込(Word Embedding)モデル」と言うらしい。 --[[word2vec>#r1c18d2a]] --[[fastText>#y7cb0b23]] --ELMo --[[BERT>#l0841a18]] ***word2vec [#r1c18d2a] -2013年に登場した技術 -[[文脈予測アプローチ>#t6fb7c98]]の代表例の「単語埋込(Word Embedding)モデル」 --[[元は(数万から数十万次元とか)スパース(疎)>#y321e7cb]]な単語のOne-Hotベクトル(V次元) --これを比較的低次元(300次元とか)のデンス(密)なベクトル(h次元)に変換する。 -[[自己教師あり学習>機械学習(machine learning)#g6507d39]]の[[深層学習>深層学習(deep learning)]](2層のNN)により分散表現(ベクトル表現)を獲得する代表的な手法。 --単語予測(分類)の2層DNNで分散表現(ベクトル表現)は重みとして学習される。 --入力Iは単語数V中の単語でOne-HotエンコーディングしたV次元のベクトル --このWiIの重みWiの各行(or 列)が各単語をV→hに次元圧縮した分散表現になっている。 --単語予測(分類)DNNの性能は低くて(まともに機能しないレベルで)も分散表現(ベクトル表現)が獲得できればOK。 |One-Hotベクトル|分散表現|h |#ref(one-hot_vector.jpg,left,nowrap,イメージ,30%)|#ref(distributed_representation.jpg,left,nowrap,イメージ,30%)| |>|https://deepage.net/bigdata/machine_learning/2016/09/02/word2vec_power_of_word_vector.html| |>|#ref(MatMul.png,left,nowrap,イメージ,75%)| |>|https://take-tech-engineer.com/zero-deep-learning/| -モデル~ I have a big dream for future. |#ref(w2vModel.jpg,left,nowrap,イメージ,60%)| --CBOWモデル~ [[文中の単語穴埋め問題タスクを解くモデル>#x5b7e667]] ---データ:I have (a) → [big] ← (dream) for future ---入力Iは単語のOne-Hotベクトルになっている。 ---入力Iは1文章中の単語のc個の前後(の=2c個)の単語で、 ---前後のc個の単語に囲まれた中心の単語を予測する。 ---WiでV次元のOne-Hotベクトルをh次元に圧縮(全結合)して、 ---圧縮した後、ベクトルの平均を取る(前後の圧縮後のベクトルを足して1/2cにする)。 ---このh次元のコンテキスト・ベクトルをWoで再びV次元に復元(全結合)する。 ---入力が行ベクトルか列ベクトルかは資料によって任意(Wの行と列が入れ替わる)。 ---復元したV次元のベクトルを[[Softmax関数>ニューラルネットワーク(推論)#b77bdfd7]]で分類。~ ※ この学習の結果、重みWi、Woの行 or 列ベクトルが各単語を次元圧縮した加法構成性を獲得した分散表現になっている。 |org|高速化|h |#ref(CBOW.png,left,nowrap,イメージ,50%)|#ref(CBOW2.png,left,nowrap,イメージ,50%)| |https://www.takapy.work/entry/2019/01/06/203042|https://take-tech-engineer.com/zero-deep-learning/| --Skip-gramモデル~ [[単語から周辺の単語予測の問題タスクを解くモデル>#x5b7e667]](CBOWの逆)~ ---データ:I have [a] ← (big) → [dream] for future ---入力Iは単語のOne-Hotベクトルになっている。 ---入力Iは1文章中の1単語で、 ---c個の前後(の=2c個)の単語を予測する。 ---WiでV次元のOne-Hotベクトルをh次元に圧縮(全結合)して、 ---Woで再び、c個の前後(の=2c個)のV次元のベクトルに復元(全結合)。 ---入力が行ベクトルか列ベクトルかは資料によって任意(Wの行と列が入れ替わる)。 ---復元したV次元のベクトルを[[Softmax関数>ニューラルネットワーク(推論)#b77bdfd7]]で分類。~ ※ Woが共用なので単語が同じなら前後は全部同じ答えになる(が、Wiが学習で計算できれば、推論の結果はソレでも良い)。~ ※ この学習の結果、重みWi、Woの行 or 列ベクトルが各単語を次元圧縮した加法構成性を獲得した分散表現になっている。 |#ref(Skip-gram.png,left,nowrap,イメージ,50%)| |https://www.takapy.work/entry/2019/01/06/203042| -高速化 --行列計算の高速化(前述のCBOW高速化の①の部分) ---行列の積の計算するレイヤ(MatMulレイヤ)から行列の行を抽出するレイヤ(Embeddingレイヤ)へ(厳密にはnp.dot, np.matmulは違うらしい)。 ---ちなみに、Embeddingレイヤの逆伝播は前から伝えられるデータで該当する行に加算で更新(データが重なって戻って来る場合にも対応可) |#ref(MatMul.png,left,nowrap,イメージ,50%)|#ref(Embedding.png,left,nowrap,イメージ,100%)| |https://take-tech-engineer.com/zero-deep-learning/|https://qiita.com/jun40vn/items/04a9adc2857f2a403cab| |#ref(Embedding1.png,left,nowrap,イメージ,50%)|#ref(Embedding2.png,left,nowrap,イメージ,50%)| |>|https://take-tech-engineer.com/zero-deep-learning/| --[[損失関数>ニューラルネットワーク(学習)#l7995afd]]高速化(前述のCBOW高速化の②の部分)~ ---高速化なしモデル~ 重すぎて動かない(単語数≒分類が多過ぎるため) ---hierarchical softmax~ 100万分類を100分類*3=300に落とし込む。~ ・300/100万≒3000倍以上の性能向上~ ・実際には2分類をlog2 V 回行う。~ ---Negative Sampling~ 100万分類を[正例1, 負例10] (負例サンプリング)の2値分類に落とし込む。~ ・[[Softmax関数>ニューラルネットワーク(推論)#b77bdfd7]]を[[Sigmoid関数>ニューラルネットワーク(推論)#u0ac8472]]にして1つの正例のロジスティック回帰と複数の負例のロジスティック回帰する。~ ・Woutから当該行を抜き出し(Embedding)て内積を計算(dot積)するEmbeddingDotレイヤを使用している。~ ・下図を見ると「順伝播に教師データ必要じゃないか。」となるが、学習で分散表現を獲得する訳で、実際に推論する訳ではないのでOKか。~ |#ref(NegativeSampling.png,left,nowrap,イメージ,75%)| |https://take-tech-engineer.com/zero-deep-learning/| -上記の学習手法の総称~ --6パターン(2 * 3 = 6) ---モデル(2種類) ---[[損失関数>ニューラルネットワーク(学習)#l7995afd]]高速化(2種類) --Gensimのデフォルトは、CBOW&Negative Samplingとのこと。 |#ref(Gensim.png,left,nowrap,イメージ,60%)| |https://qiita.com/jun40vn/items/04a9adc2857f2a403cab| -Wi、Woのどちらを使うか? --基本的にWiだが、Woや、WiとWoの平均を使うなどのケースもある。 --CBOWのWo側のベクトルで加法構成性を説明するコンテンツもあるのでCBOWはWoも使う。 ---CBOWの重みWoの単語に対応したベクトルは「中間層のコンテキスト(≒関連する意味を含む)ベクトル」との内積の値を大きくする。~ ・内積は、二つのベクトルがどれだけ同じ方向を向いているかの指標になる。~ ・同じベクトルの内積は大きくなり(+1)、反対のベクトルの内積は小さくなる(-1)。 ---この内積で、man、KingでHeを予測、woman、QueenでSheを予測できる。~ ・男を意味するベクトル同士の内積が大きくなる:「He is a man.」「He is a King.」~ ・女を意味するベクトル同士の内積が大きくなる:「She is a woman.」「She is a Queen.」 ---従って、Woの単語に対応したベクトルは加法構成性を獲得する。~ V(He) - V(She) = V(man) - V(woman) = V(King) - V(Queen) ---特に、Skip-gramモデルでは、Wiの有効性が実証されているとのこと。 ***fastText [#y7cb0b23] -[[word2vec>#r1c18d2a]]がベースの進化形で、Skip-gramモデル * Negative Sampling -発想 --[[文脈予測アプローチ>#t6fb7c98]]&color(red){ではなく};単語の内部構造に注目してベクトル化。 --ワードをサブワード([[tri-gram>言語処理#ude56875]])に分割し~ ワードをサブワードのベクトルの足し算でベクトル化する。 --例えば、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 [#h28a6b7f] -単語埋込(Word Embedding)表現が可能な2層のLSTMを用いた言語モデル -文脈に応じた単語の意味を演算して表すことが可能 **文のベクトル化 [#t1e47fdd] ***BOWモデル [#u69545ad] (Bag of Words) 単語の出現回数(学習は不要)で、~ 語順に依る意味の違いを表現しないが、~ 類似文書検索タスクでは十分精度が出る。 -日本語は英語のように単語が空白で分かれていない場合、[[形態素解析>言語処理#r6ede8fb]]で単語単位に分割 -文章毎に各単語が何回出現したかを数え上げ、長さが語彙数、値が出現回数となるベクトルにする。 -出現回数そのものでなく、[[TF-IDF>#hdbd22d6]]といった手法を用いて単語の重みを調整する方法もある。 ***文の分散表現の構成法 [#la545a06] -[[doc2vec>#u231057e]] -系列変換モデル --文を系列として文を見る([[文の構成性>#ea3878be]])。 --何らかのタスクの[[RNN>ニューラルネットワーク#sa1d8d21]]や[[LSTM>ニューラルネットワーク#o836d6ff]]に学習させる。 ---翻訳タスク ---自然言語推論タスク --副作用的に文の分散表現を獲得 --[[転移>深層学習のテクニック#ebe9edcc]]可能性の問題がある。 ***doc2vec [#u231057e] -2012年に登場した技術([[word2vec>#r1c18d2a]]の一年前) -従来手法の問題 --[[BOWモデル>#u69545ad]]:語順に依る意味の違いを表現しない。 --Parse tree:文1つならOKだが文章になるとNG -[[word2vec>#r1c18d2a]]のdoc版で、 --Document(文書)をWord(単語)の集合として見て~ 文書間の類似度やベクトル計算などを実現できる。 --モデルは以下の2つのモデルから構成されている。 ---PV-DM(Distributed Memory Model of Paragraph Vector)~ [[文章中の次の単語予測のタスクを解くモデル>#x5b7e667]]~ ・データ:ドキュメントID+ドキュメント(単語列)~ ・[[word2vec>#r1c18d2a]]のCBOWモデル的な2層のNN~ ・1層目では重みDI、WIでドキュメントID、単語のOne-Hotベクトルを次元圧縮~ ・2層目の前に次元圧縮したドキュメントIDベクトルと単語ベクトルの平均とを連結し~ ・それぞれ重みが分散表現を獲得する。~ ・WIの列ベクトルが単語の分散表現~ ・DIの列ベクトルが文の分散表現(フレーズ・ベクトル) ---PV-DBOW(Distributed Bag of Words version of Paragraph Vector)~ [[文章中の単語予測のタスクを解くモデル>#x5b7e667]]~ ・データ:ドキュメントID+ドキュメント(単語列)~ ・[[word2vec>#r1c18d2a]]の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>言語処理#ude56875]]」だから精度が良い? -タスクと結果 --感情分析~ レビュー・コメント → フレーズ・ベクトル → レーティング ---短文~ Stanford Sentiment Treebank(高低2択) ||ErrorRate|h |今までのBEST(?)|14.6%| |doc2vec|12.2%| ---長文~ Large Movie Review Dataset - Imdb dataset(★1-5) ||ErrorRate|h |[[BOW>#la545a06]](長文なら使える)|12.2%| |今までのBEST([[ボルツマン・マシン>ニューラルネットワーク#s93fc300]])|10.8%| |doc2vec|8.8%| --情報抽出~ (多分、Googleの)同じ検索クエリの結果から2件、異なる検索クエリの結果から1件抽出~ → フレーズ・ベクトル → レーティング(同じクエリで近く異なるクエリで遠い) ||ErrorRate|h |[[BOW>#la545a06]](長文なら使える)|5.7%| |doc2vec|3.8%| *NLPモデル [#vff8ca8d] 自然言語処理(NLP)モデル **[[Attention>RNN Encoder-Decoder(Sequence-to-Sequence)#oc99a385]] [#qc74fd48] -2014年に登場した技術で、[[Transformer>#a5995dbe]]の元ネタ -[[機械翻訳]]の分野で、 --[[統計的機械翻訳(SMT)>機械翻訳#m53ddda3]]から --[[ニューラル機械翻訳(NMT)>機械翻訳#m65ab882]]への >過渡期。 -翻訳に[[RNNの発展形のEnc-Dec、Seq2Seq>再帰型ニューラルネットワーク(RNN)#c141d604]]を使用する。 -翻訳タスクの結果 --英 → 仏 ---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) ---未知語無しで従来手法に勝利。 ---長文では単語数が増えても精度が落ちないを事を確認。 |モデル|全語|未知語無し|h |[[統計的機械翻訳(SMT)>機械翻訳#m53ddda3]] Moses|33.3|35.6| |[[ニューラル機械翻訳(NMT)>機械翻訳#m65ab882]] [[RNN encdec>RNN Encoder-Decoder(Sequence-to-Sequence)#h871aa88]]|21.5|31.4| |[[ニューラル機械翻訳(NMT)>機械翻訳#m65ab882]] [[RNN search>RNN Encoder-Decoder(Sequence-to-Sequence)#ree0369e]]|28.5|&color(red){36.2};| **[[Transformer>テキスト生成系(Transformer系)#vfdc9368]] [#a5995dbe] -同様に[[機械翻訳>#m6a099ad]]を目的タスクとする -2017年(6月)に登場した技術で、[[Attention>#qc74fd48]]が元ネタで、[[GPTやBERT>#k8328489]]の基礎、 -最近の自然言語処理のベースとなるモデルで[[GPTやBERT>#k8328489]]など最新モデルに応用されている。 -BLEU --英→独:28.4 --英→仏:41.8 **[[Transformer>#a5995dbe]]系 [#k8328489] ***[[GPT-n>テキスト生成系(Transformer系)#k3df315f]] [#a1d46512] -Generative Pre-trained Transformer -非営利団体[[OpenAI]]が開発したもので、~ 初代のGPT-1は[[BERT>#l0841a18]]と同じ2018年(6月)に発表~ -2019年にGPT-2、2020年にGPT-3が発表~ (中身は同じで、規模と学習データの量を大きくしたもの) -悪用リスクのためOSS化されていない~ ([[OpenAI]]へAPIの利用申請が必要) -2022年11月に[[ChatGPT]]が公開される。 ***[[BERT>テキスト生成系(Transformer系)#q79e0d9a]] [#l0841a18] -Bidirectional Encoder Representations from Transformers -2018年(10月)に論文によって提案された[[Transformer>#a5995dbe]]を発展させたモデル。 -[[GPT-n>#a1d46512]]を少し改変しているので、高性能で汎用性が高く応用し易い。 -BERT学:内部で何が行われているか? ***T5、Switch、Meena [#y9dc2d89] Transformerの上に構築された自然言語処理(NLP)モデル -T5 -Switch -Meena ***GLUEデータセット [#g24f3e22] [[GPTやBERT>#k8328489]]などのマルチタスク自然言語処理モデルの性能評価目的で開発された。 *LLMの特徴 [#x6414d9b] [[GPTやBERT>#k8328489]]などがLLMに該当する。 **ポイント [#tbf84f8f] ***超大規模化 [#u9abd63f] -べき乗則で次単語予測の性能が向上、汎化性能も向上。 -ただし、[[GPT-4>#a1d46512]]の辺りで頭打ちになった。 -創発 --モデルを大規模化していくとある時点から急に解けるようになる現象 -- 大規模言語モデル(LLM)の創発的な特性 ≒ [[コンテキスト内学習>#cc3ded39]] -仮説 --サブネットワークの発掘 ---宝くじ仮説 ---平坦な最小解仮説 --構成属性文法仮説~ 言葉の背後の構造(コンテキスト)を理解できるようになる。 ***[[コンテキスト内学習>テキスト生成系(Transformer系)#s981eea4]] [#cc3ded39] -与えられたコンテキスト内で情報を学習し、その学習を元に出力を生成する。 -Zero-Shot学習とも呼ばれ、プロンプト(過去文脈)でパラメタ更新はしないが~ Attention機構を変形して見方を変えると勾配降下法をシミュレーションしている。 ***順問題を学習できる。 [#i68cb977] -学習するAIは基本的に逆問題的に学習する。 -LLMは順問題の定義を言語的&確率的に学習できる。 -ただし、 --この順問題の定義の学習は、あくまで言語的&確率的であって --学習で構築した論理をベースに質問に回答している訳ではない。 -そもそも、 --LLMは言葉の意味を理解しているのか? --人間がどのように言葉の意味を理解しているのか不明。 ---直感的に思考して会話するケース ---言語から学習したモデルを使って論理的に思考して会話するケース -恐らく、人間とLLMの言語理解能力の間に大きな違いがある。 ***ポランニーのパラドックス [#qb153749] 人間は言葉で表せる以上のことを知っている。 -人間は言語化されないモデルを内包する(暗黙知)。 -LLMでは明文化されない暗黙知部分を学習できない。 --[[フレーム問題>人工知能(AI)#bd2791da]] --[[記号接地問題>人工知能(AI)#f2b272c2]] --[[身体性>人工知能(AI)#kd11c451]] --[[知識獲得のボトルネック>人工知能(AI)#o8dacbc6]](期待はある) -言語的&確率的な学習で暗黙知を学習したように見える時もある。 **汎用性と用途 [#uf3aa0db] ***エージェント [#u5dabcef] サポート -翻訳・要約 -トレーニング -カウンセリング -コーチング -新たな発見(藤井聡太的な) ***様々な文書生成 [#nc831b2b] -雛形生成 --シナリオ、脚本 --作詞 --契約書 ***プログラミング [#j59758ab] プログラムを生成する。 ***検索エンジンの代替 [#xe7f1636] 人間が参照しきれないテキストから意図する情報を抽出 ***インターフェイス [#n0b8a478] 特に、音声インターフェースなど。 ***人間の言語理解能力の理解 [#a87db3e5] LLMとの対比で人間の言語理解能力を理解する。 **問題点 [#ead0dee0] ***幻覚 [#fbc47daf] 誤った「解釈」が(存在しない)新事実を創出してしまう。 ***故障 [#qa81d418] 記憶の機能がなく、破滅的忘却で壊れる可能性がある。 ***学習効率 [#h51a5aa1] -人間と比べるとかなり効率が悪い(コストが高い)。 -ただし、繰り返し利用でコストは償却可能と言う考え。 **リスク [#o34b0150] ***セキュリティ [#h253bbcb] コレは[[ChatGPT]]などのシステム・アプリの問題。 ***偽情報の拡散 [#e17caf58] 何を持って偽情報なのか? ***機密情報の拡散 [#k6d0d440] コレは、≒ セキュリティ。 **倫理・道徳 [#r1a655ed] 何を持って倫理・道徳なのか? ***ポリコレ [#x041241b] 目的駆動学習(人間のフィードバックによる強化学習)でポリコレにフィットさせたりする。 ***仕事の変化 [#fdfe138a] Web検索で仕事が変化したように、LLMでも変化するものと考えられる。 *参考 [#rf0b1eb2] -コンテンツへのリンク - OSSコンソーシアム~ https://www.osscons.jp/joho108j0-537 --深層学習についてのレポート(LLM編)~ https://1drv.ms/p/s!Amfs5caPP9r5kAtLiKqOHge-zTzs --機械学習・深層学習についてのNotebook~ https://github.com/OpenTouryoProject/DxCommon/tree/master/Notebook/Jupyter -単語と図で理解する自然言語処理(word2vec, RNN, LSTM) --前編~ https://www.takapy.work/entry/2019/01/06/203042 --後編~ https://www.takapy.work/entry/2019/01/09/080338 -Yosuke00さんの記事一覧 | Zenn~ https://zenn.dev/yosuke00 --Transformerアーキテクチャと自然言語処理の発展~ https://zenn.dev/yosuke00/articles/ae21ccebf4e32a --BERTモデルとファインチューニング~ https://zenn.dev/yosuke00/articles/9d9d405e164198 --Stanford NLP with Deep Learning Lecture ---1のまとめ~ https://zenn.dev/yosuke00/articles/4084a7b691ff92 ---2のまとめ~ https://zenn.dev/yosuke00/articles/94817701b20059 ---3のまとめ~ https://zenn.dev/yosuke00/articles/d6384b31c8e162 ---4 & 5のまとめ~ https://zenn.dev/yosuke00/articles/ed8c5d4e1ee2f7 ---6のまとめ(前編)~ https://zenn.dev/yosuke00/articles/0f24ff440a970a ---6のまとめ(後編)~ https://zenn.dev/yosuke00/articles/fef6f9382eca24 ---7のまとめ(概要編)~ https://zenn.dev/yosuke00/articles/10dd52f2d19136 ---7のまとめ(モデル編)~ https://zenn.dev/yosuke00/articles/f06452bc80cbd3 ---8のまとめ~ https://zenn.dev/yosuke00/articles/14505ac0a694c4 ---9のまとめ(Self-Attention編)~ https://zenn.dev/yosuke00/articles/2d49f54f7f3599 ---9のまとめ(Transformer編)~ https://zenn.dev/yosuke00/articles/1949569ac2ee58 ---10のまとめ~ https://zenn.dev/yosuke00/articles/39160df2ff8dca ---11のまとめ~ https://zenn.dev/yosuke00/articles/9f4c5548ad347b ---12のまとめ~ https://zenn.dev/yosuke00/articles/ef66464c9287a6 **Wikipedia [#i6896aa3] -自然言語処理~ https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86 --形態素解析~ https://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90 --構文解析~ https://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90 --語義の曖昧性解消~ https://ja.wikipedia.org/wiki/%E8%AA%9E%E7%BE%A9%E3%81%AE%E6%9B%96%E6%98%A7%E6%80%A7%E8%A7%A3%E6%B6%88 --照応解析~ https://ja.wikipedia.org/wiki/%E7%85%A7%E5%BF%9C%E8%A7%A3%E6%9E%90 --格文法~ https://ja.wikipedia.org/wiki/%E6%A0%BC%E6%96%87%E6%B3%95 -テキストマイニング~ https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0 **Qiita [#d6195c7f] -Attentionを理解するためにRNN、Word2Vec、LSTM、Seq2Seq、Attentionの順に整理してみた~ https://qiita.com/ta2bonn/items/c645ecbcf9dabd0c4778 **YouTube [#sa59a86e] ***[[AIcia Solid Project>深層学習(deep learning)#z59ed24b]] [#x1ea3efe] -自然言語処理シリーズ~ https://www.youtube.com/playlist?list=PLhDAH9aTfnxL4XdCRjUCC0_flR00A6tJR -深層学習 ディープラーニングの世界(中にRNNも含まれる~ https://www.youtube.com/playlist?list=PLhDAH9aTfnxKXf__soUoAEOrbLAOnVHCP **ライブラリ [#uee229f9] ***オープンソース [#f199180d] [[Python系>データマイニング(DM)- Python#rf012a00]] ***プロダクト [#df2c27b8] [[Python系>データマイニング(DM)- Python#rf012a00]] **サービス、ソリューション [#gf45a1a1] ***[[Google翻訳]] [#o9ecb80e] ***[[DeepL翻訳]] [#l58b6184] ***[[ChatGPT]] [#v7b85d0b] ***[[OSSのLLM]] [#rd11cfdc] ***[[Azure OpenAI Service>https://techinfoofmicrosofttech.osscons.jp/index.php?Azure%20OpenAI%20Service]] [#p86cf9c5] **ゼロから作るDeep Learning [#s380107d] 自然言語処理編~ https://www.oreilly.co.jp/books/9784873118369/ ***サンプル [#p7b26a2d] https://github.com/oreilly-japan/deep-learning-from-scratch-2 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch01 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch02 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch03 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch04 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch05 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch06 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch07 -https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch08 ***その他、参考 [#jf83c861] -『ゼロから作るDeep Learning 2』の学習ノート:記事一覧 - からっぽのしょこ~ https://www.anarchive-beta.com/entry/2020/08/28/185900 --[[1章 ニューラルネットワークの復習>https://www.anarchive-beta.com/entry/2020/08/28/185900#1%E7%AB%A0-%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E5%BE%A9%E7%BF%92]] --[[2章 自然言語と単語の分散表現>https://www.anarchive-beta.com/entry/2020/08/28/185900#2%E7%AB%A0-%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E3%81%A8%E5%8D%98%E8%AA%9E%E3%81%AE%E5%88%86%E6%95%A3%E8%A1%A8%E7%8F%BE]] --[[3章 word2vec>https://www.anarchive-beta.com/entry/2020/08/28/185900#3%E7%AB%A0-word2vec]] --[[4章 word2vecの高速化>https://www.anarchive-beta.com/entry/2020/08/28/185900#4%E7%AB%A0-word2vec%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96]] --[[5章 リカレントニューラルネットワーク(RNN)>https://www.anarchive-beta.com/entry/2020/08/28/185900#5%E7%AB%A0-%E3%83%AA%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AFRNN]] --[[6章 ゲート付きRNN>https://www.anarchive-beta.com/entry/2020/08/28/185900#6%E7%AB%A0-%E3%82%B2%E3%83%BC%E3%83%88%E4%BB%98%E3%81%8DRNN]] --[[7章 RNNによる文章生成>https://www.anarchive-beta.com/entry/2020/08/28/185900#7%E7%AB%A0-RNN%E3%81%AB%E3%82%88%E3%82%8B%E6%96%87%E7%AB%A0%E7%94%9F%E6%88%90]] --[[8章 Attention>https://www.anarchive-beta.com/entry/2020/08/28/185900#8%E7%AB%A0-Attention]] -「ゼロから作るディープラーニング②」を読む - FPGA開発日記~ --1. ニューラルネットワークの復習~ https://msyksphinz.hatenablog.com/entry/2018/07/29/173306 --2. 自然言語と単語の分散表現~ https://msyksphinz.hatenablog.com/entry/2018/07/31/040000 --3. 第3章 word2vec~ https://msyksphinz.hatenablog.com/entry/2018/08/01/040000 --4. 第4章 word2vecの高速化~ https://msyksphinz.hatenablog.com/entry/2018/08/05/040000 --5. リカレントニューラルネットワーク(RNN)~ https://msyksphinz.hatenablog.com/entry/2018/08/10/040000 --6. ゲート付きRNN~ https://msyksphinz.hatenablog.com/entry/2018/08/12/040000 --7. RNNによる文章生成~ https://msyksphinz.hatenablog.com/entry/2018/08/13/040000 -Qiita --深層学習 / ゼロから作るDeep Learning2 ---3章:https://qiita.com/jun40vn/items/c4d1cef7daca3cdd2b35 ---4章:https://qiita.com/jun40vn/items/04a9adc2857f2a403cab ---5章:https://qiita.com/jun40vn/items/35f6f0d26f9e58f01e4e ---6章:https://qiita.com/jun40vn/items/e690dfe80faa6512049f ---7章:https://qiita.com/jun40vn/items/a6fb2069715fdbc65ae9 ---8章:https://qiita.com/jun40vn/items/ac86f1992b7beefa1f0c ---Transformer:https://qiita.com/jun40vn/items/9135bf982d73d9372238 --ゼロから作るDeep Learningで素人がつまずいたことメモ: まとめ(2)自然言語処理編~ https://qiita.com/segavvy/items/0f2980ad746d797dd8c1 ---1章:https://qiita.com/segavvy/items/91be1d4fc66f7e322f25 ---2章:https://qiita.com/segavvy/items/52feabbf7867020e117d ---3章:https://qiita.com/segavvy/items/1510d8c264edd291e0ef ---4章:https://qiita.com/segavvy/items/a286143dbcc5a93100b6 ---5章:https://qiita.com/segavvy/items/3e6a9f6bff103824598f ---6章:https://qiita.com/segavvy/items/fba1595cf64a2462b415 ---7章:https://qiita.com/segavvy/items/883671d07cd7ab26fbe0 ---8章:https://qiita.com/segavvy/items/69ca97ff2d4e8a7144fd --「ゼロから作るDeep Learning」自習メモ~ ---(19)Data Augmentation~ https://qiita.com/slow_learner/items/2ede37e1af655775cc1e ---(19の2)Data Augmentation 続き~ https://qiita.com/slow_learner/items/b705e5cf89a271b9f8d1 ---(20)2巻目 自然言語処理編~ https://qiita.com/slow_learner/items/bb0ce93a4577bc7f1105 ---(21)3、4章~ https://qiita.com/slow_learner/items/346f78ae415f649f54ed