筋トレ大学生によるアウトプット雑記

筋トレや読書のことをはじめとして、プログラミングその他日常生活における様々なことについて書いていきます。

Output Blog

主に筋トレ・プログラミングについて書きます

自然言語処理とは?【機械学習も解説】

スポンサーリンク

f:id:daimori1005:20190914104750j:plain



こんにちは。

昨今の第3次AIブームによって、機械学習深層学習といった技術がとても人気を博していますね。

僕は現在、大学の言語処理の卒業研究で使っています。

言語処理は音声や画像処理に比べて研究が進んでいないと言われています。

というのも、文字は2値で表すことができないため、コンピュータの学習が比較的むずかしいとされているからです。

今回は、言語処理を専攻している僕が、自然言語処理のあらゆる情報をまとめ、ここを見れば一通りの知識を得られる、そんな記事にしました。

 

言語処理ってなに?

f:id:daimori1005:20190923223823p:plain

 そもそも言語処理って?という方もいらっしゃるかもしれません。

言語処理とは、自然言語処理とも言われます。

自然言語とは

自然言語とは、人間が使う言葉を意味します。

我々が日常的に使う日本語も自然言語ですし、英語や中国語など人間が使うあらゆる言語はこの分野に属します。

 

人工言語とは

上記の自然言語と対をなす言葉でもある人工言語(形式言語)は、人間によって作り出された言葉などが当てはまります。

国際補助語であるエスペラントや、プログラミング言語などはこちらに属します。

 

自然言語処理

「自然言語をコンピュータで処理する」

これを自然言語処理と言います。

以下にどのような処理があるのか、示しました。

単語分割/分かち書き

 これは文章を単語に分割する処理です。

英語は単語の間に空白を入れ手続き型記憶書きます。これを分かち書きと言いますが、ご存じの通り日本語では分かち書きされません。

つまり、日本語に対し何らかの処理を加える際は、単語に区切る必要が出てきます。

コーパスを代表とする大容量データなどでは、この処理にコストがかかる場合があります。

 

形態素解析

分かち書きした文章に対して、品詞や読み、原形など様々な情報を解析・付与する処理です。

自然言語処理において、なくてはならない技術の1つと言えます。

辞書を参照して情報解析を行っているため、異なる辞書では異なる結果が出力されてしまうことが問題視されています。

現状では、略語や人工的に作られた言葉などに対応していない辞書も多く、その精度を高めることが必要とされています。

後述しますが、MeCabというライブラリがほとんどの場合使われます。

 

Mecabについてはこちら。

www.i-like-output.work

 

 

意味解析

意味の解析を行う技術です。

ベクトルを使うものやシソーラスを使うものなど多岐に渡ります。

最近では、Word2Vecと呼ばれるニューラルネットのネットワークの重みをベクトルとして扱う方法が考案され、これを用いた研究が盛んにおこなわれています。

 

自然言語処理の研究課題

自然言語処理は多くの研究課題を抱えています。

以下にその一部を示します。

 

語義の曖昧性の解消

僕の研究しているテーマの大枠でもあります。

一つの言葉で複数の意味を持つ多義語に対して、どの意味を使うべきなのかコンピュータで処理することが難しいとされています。

例えば、「時計」という言葉があったとき、掛け時計なのか腕時計なのかは単語単体ではわかりません。この状態を曖昧性がある、と言います。

「タクシーのドライバーが優しかった。」

 という文に対し人間は、これまで培った知識や経験で曖昧性の解消を行うことができます。この文の場合、コンピュータでも簡単だと思われるかもしれません。では次の場合はどうでしょうか?

「タクシーのドライバーがドライバーを使っていた。」

この文の場合、単純に「タクシー」があるからドライバー(運転手)という風に意味決定はできませんよね。

このような問題を語義の曖昧性と言います。

www.i-like-output.work

こちらで詳しく紹介しています。

 

感情推定

f:id:daimori1005:20190923223905p:plain

言葉には必ず感情がつきまといます。

コンピュータには感情がありません。よって人間がその状況かで抱くべき感情を理解できないため、文章の意味をとらえきれない場合があります。

特に皮肉などが当てはまります。皮肉では、あるポジティブな言葉が全く逆の意味で使われることがあります。

この問題も言語処理における障壁の1つとなっています。

 

略語や人工語の存在

最近では略語人工語が多く使われています。

略語 : コンビニ, KP, ワリカン

人工語 : やばい, ワンチャン

などがあります。

これらは辞書に登録されていない場合もあり、存在確認が困難です。

また存在確認ができても、「やばい」のように複数の意味を持つ場合もあります。

 

照応の省略

「ボブは大学生になりました。経済を専攻するようです。」

この文章では、「経済を専攻する」対象が省略されています。

これを照応省略と言います。

この場合は識別が簡単です。ひとつ前の文を見るだけで格フレームである「ガ格」(つまりボブ)を取り出すことができるからです。

では、これが15文も前だった場合はどうなるでしょうか。

そこまでに他の人名(ガ格)が出てきた場合に、適切な選択が困難になります。

 

自然言語処理の応用例

機械翻訳

Google翻訳などを例に翻訳サイトが多く存在していますが、これらが機械翻訳の代表例です。

今までは、統計的手法を用いることで実現させていました。

Googleがニューラルネットを用いた機械翻訳を実装したことで、精度がかなり高まりました。

今後のグローバル社会を見据えて、機械翻訳が完全レベルまで発達すれば、異なる言語間でのコミュニケーションが容易になるため注目されている技術です。

 

文書分類

迷惑メール判定や、文章のカテゴリ分類などがこれに当てはまります。

文書をカテゴリに分けることで、求める文書を探しやすくなります。

 

自動要約

文章中の重要な要素を抽出し、自動で要約する技術です。

調べたい事柄について、冗長なウェブサイトも多数存在している現状ですが、自動要約技術を応用することで、読む時間の短縮要点理解といった手助けになります。

 

対話システム

Siriやチャットボット代表とした対話システムが世の中を席巻しつつあります。

「AIと会話してみたい」そう思う人も多くいると思いますが、未だ人間と同等の会話をするには至っていません。

ディープラーニング技術を使ってさらなる発展が見込まれる分野です。

 

自然言語処理に纏わる用語集と解説

ここでは、言語処理を理解するうえで必要とされる用語や知識を簡単に付けられるようにカテゴリごとにまとめて書いていきます。

データ編

f:id:daimori1005:20190923224407j:plain

データセット

データとデータセットの違いに戸惑うことがあるかもしれません。

機械学習においては、データは特徴とラベルのタプル (x,y) の形で表されます。

これをデータセットと呼びます。

ラベル

機械学習において、正解を意味するものです。

ここでいう正解とは、クラスかもしれないし語義かもしれません。

学習時は、例えば、背が高いを0,低いを1,普通を2に当てはめ普通の範囲を165-170cmとした場合、

180cmは0となり、140cmは1に、167cmは2に当てはまります。

このように学習時には、分類したいクラスを数字に対応させます。

ちなみにクラスの数は無数に設定できます。

 

コーパス

 言語処理で使われる「コーパス」というものは、大量の文章を集積したものとなります。有名なものは「Pen Tree Bank」や「現代日本語書き言葉均衡コーパス(BCCWJ)」などがあります。

コーパスは下記の2種類存在します。

  • タグ(ラベル)付きコーパス
  • タグなしコーパス

タグ付きコーパスは、文章そのものに加え、文章を分かち書きし、単語の品詞や意味、係り受けなどあらゆる情報を付与しています。

情報の付与を行うことにコストがかかり、これまでそこまで大きな規模のタグ付きコーパスは存在しませんでした。(EDRコーパス 約20万文程度が最大)

国語研 が大規模なタグ付きコーパスの開発を行っており、「BCCWJ」は現在約600万文ほどの規模を持っており、EDRコーパスを越して最大規模となっています。

現在、BCCWJは2019年9月30日まで消費税増税に伴う会計処理のため、配布を停止しています。

タグ無しコーパスは、文章そのものだけの場合が多いです。

 

コーパスを使うことで、大量の文章をすぐに手に入れることができます。

スクレイピングやもしくは人手で文章を確保するコストを削減できます。

また、タグ付きの場合は意味ラベルがあるため、意味解析などのツールやシステムの精度などを測ることができます。

 

シソーラス

言葉を意味によって分類したものです。類義語や対義語などの情報が記述されています。

Wordnetというとても精度が高いシソーラスがあり、研究にもよく利用されています。

wordnetに関しては、データベースをダウンロードすればSQLで扱うことができます。

 

学習編

分類

f:id:daimori1005:20190915003049p:plain

データをいくつかのカテゴリに分類するものです。

2つのカテゴリの場合は、2値分類 / 2クラス分類と呼ばれます。

それ以上の場合は多クラス分類と呼ばれます。

回帰

データの値を予測するものです。

株価や住宅価格などに使われます。

予測なので、回帰の出力は1つとなります。

機械学習

データ集合を使って、ある未知のデータを分類(または回帰)するモデルを自動で作る技術です。

教師あり機械学習

あるデータと、そのラベル(正解)が付与されているデータを用いて機械学習をするものです。

迷惑メールフィルタなどはこの技術を使っていて、

メールの本文を素性にし、迷惑かそうでないかの2値分類を行うことで実現します。

教師無し機械学習

データのみで機械学習をするものです。

オンラインショップなどで、商品のおすすめをしてくれたり、「ほかの人はこの商品も見ています」といった表示を見かけることはありませんか?

これはクラスタリング技術と言って、教師なし機械学習によって実現されています。

 

SVM(Support Vector Machine)

教師あり機械学習のうちの一つです。

f:id:daimori1005:20190914121054p:plain

このように、データの集合に対して、クラスを分けることができる線を引くのが、SVMです。

SVMは分類問題を解くことにおいて、とても高い精度を誇ることが知られていて、自然言語処理でもよく使われる手法の1つです。近日中に使い方を載せようと思います。

 

 (2019年10月12日追記)実際に分類問題を実装しています。

www.i-like-output.work

ニューラルネットワーク(Neural Network)

f:id:daimori1005:20190914121516p:plain



上図のように、ニューラルネット(脳神経)に模したネットワークを使った機械学習の手法を言います。

丸いものを「ニューロン」と言い、矢印の線を「ネットワーク」と言います。

ネットワークにはそれぞれ、「重み」という値が付与されており、ニューラルネットワークが学習として行うことは、その値を調節し、正しい出力を得ることとなります。

www.i-like-output.work

こちらで機械学習による分類を実装してみました! 

 

パーセプトロン

複数入力から一つの入力となるネットワークをパーセプトロンと言います。

f:id:daimori1005:20190915092826p:plain

多層パーセプトロン

 パーセプトロンのユニットをいくつか組み合わせることで実現した、上に示したニューラルネットワークのような形のネットワークを多層パーセプトロン(Multi Layer Perceptron)と言います。

これを用いることで、線形識別不可能な問題も解決することができます。

フォワードプロパゲーション(順伝播)

入力値に対しネットワークの重みの値を乗算し、活性化関数で二値または確率に変換します。これを入力層から出力層にむかって行うことを順伝播といいます。

最終的に出力された値と、正解ラベルの差を取ったものが出力誤差となります。

バックプロパゲーション(誤差逆伝播法)

フォワードプロパゲーションによって得られた出力誤差を基に、ネットワークの重みの修正を行います。そうすることで、すべてのニューロンにおける出力を正すことができます。この際、向きは出力層から入力層に向かって処理が行われます。

逆向きに処理をすることから、逆伝播という言葉が使われています。 

 

ディープラーニング(Deep Learning)

f:id:daimori1005:20190923224135j:plain

ディープラーニングとニューラルネットワークは明確に区別されてはいませんが、ニューラルネットワークにおいて、隠れ層(Hidden Layer)が何層・何十層にも重なっているものをディープラーニングと呼ぶのが通説です。

ディープニューラルネットワークとも呼ばれます。

様々なタスクにおいて高い精度を誇っており、現在のAI技術の要となっています。

 

(多項)ロジスティック回帰

回帰と名前に付くことから、回帰なの?分類なの?

と思う方もいるかもしれません

ロジスティック回帰は分類・回帰どちらも可能です。

ロジスティック回帰では、出力に確率を使って分類を行います。

この分類が2クラス以上になると多項ロジスティック回帰と呼ばれます。

基本的には、以下のような中間層のないニューラルネットワークによって実装することができます。(活性化関数などについては省略します)

f:id:daimori1005:20190915003553p:plain

ライブラリ・フレームワーク編

ここでは有名どころのライブラリを押さえておきます。

MeCab

言語処理をやってる人なら誰しも1度は聞いたことがあるであろう形態素解析ライブラリです。対応言語も多く、最も使いやすいライブラリと言っても過言ではありません。

 

JUMAN++

今回はJUMANから進化したJUMAN++について紹介します。

こちらはリカレントニューラルネットによる言語モデルを使った形態素解析ライブラリです。

精度が高いと評判になっており、解析の遅さを除けばMeCab以上の精度にもなり得ます。

JUMAN++ - KUROHASHI-KAWAHARA LAB

 

scikit-learn

重回帰分析、SVM、分類/回帰、クラスタリング、グリッドサーチ(パラメータ最適化)などの機械学習に関する様々なツールがひとまとめになったライブラリです。

使っている感想としては、特にSVMが優秀で数行のコードを書くだけでSVMが実装できてしまう優れものです。

練習用のデータも充実しているため、初心者でも取り組みやすくなっています。

 

Chainer

f:id:daimori1005:20190914101320p:plain

株式会社Preferred Networksさんが開発したニューラルネットワーク用フレームワークです。

最近、機械学習のチュートリアルを公開したことで話題になりました。

チュートリアルはこちらで見れます。

僕はニューラルネットワークの構築にChainerを使っています。

ディープラーニングやニューラルネットのライブラリの中では、最もわかりやすいと言っても過言ではないと考えています。

バージョンが上がり、Trainerが実装されてからは、初心者がより一層学習をしやすくなっています。

「直観的でシンプルなコード」「豊富なチュートリアル」「Pythonライクでわかりやすい」

Chainerを表すとしたらこんなところでしょうか。

しかしながら計算速度が遅いというデメリットもあります。

 

Keras

f:id:daimori1005:20190915094735p:plain

Kerasも同様、ニューラルネットワーク用のライブラリです。

自分の主観では、直観的なわかりやすさはChainerに劣ると思います。

また巷では、プログラミング経験不要と言われるくらいコードを書くのが簡単で、初心者向けであると言えます。

僕はKerasの出力の仕方があまり好きではないので使ってません。

 

Tensorflow

f:id:daimori1005:20190915100043p:plain

グーグルが開発した機械学習のライブラリです。

ニューラルネットだけでなく、機械学習、数値計算など多岐に渡る処理をカバーしています。

利用者数はこの類のライブラリの中では最も多いと言えます。

TPU(Tensor Processing  Unit)やGPUの利用も簡単で、デバイスを複数利用した並列処理によって大規模データの処理も可能です。

計算グラフの理解と、それによる記述が必須とされるため、いささか初心者に対する難易度は高めと言われています。

 

Word2Vec

グーグルのTOMAS MIKOLOV氏が提案した手法や、それを基にしたモデルのことを言います。

 「単語をベクトル化」することで文章や単語の特徴を表すことができます。

この単語のベクトル化を Word Embedding(単語埋め込み)分散表現(構築)と言ったりします。

類似度計算などを容易にできるようになります。

最近では、この分散表現を素性として言語処理を行う研究が多くみられ、菅原氏らの研究では特に高い精度を示しています。

Word2Vecは隠れ層が1層のニューラルネットワークで実装され、 CBOWモデルSkig-gramモデルが存在します。

今回は前提知識とともに簡単に解説します。

One-hotベクトル

「私 は 幸せ です」

という文章があったとします。

ベクトルの次元数を文章中の言葉の数と合わせ、対応する単語を1、それ以外を0とする手法です。例を示します。

私 : [1,0,0,0]

幸せ : [0,0,1,0]

というような形です。これをOne-hotベクトルと言います。

Skip-gram

Skip-gramは文章中のある単語に対して、その周辺単語の生起確率のようなものを最大化するように訓練します。

入力の次元数は文章中の言葉の数、出力次元数は(入力次元数-1)です。

入力には、すべての単語のOne-hotベクトルをひとつずつ入力します。

出力では、入力単語の周辺に存在する確率がすべての単語に対して出力されます。

この出力が最も適するように訓練します。

訓練が終わった後の 入力層--中間層のネットワークの重みが単語の分散表現となります。

CBOW

CBOW(Continuous Bag of Words)は、skip-gramの逆と捉えるのが良いかもしれません。

入力次元数は(文章中の言葉の数-1)です。

出力では一つの単語の確率を出力します。

つまり、周辺単語から入力単語の確率を算出するイメージです。

こちらも同様に 入力層と中間層のネットワーク重みが分散表現となります。

 

Word2Vecの欠点

Word2Vecの欠点としては、訓練させたデータに出現していない単語は学習できない点にあります。

Word2Vecを用いて何らかのアプリケーションを作る場合、実用性を高めるためには、あらゆる単語を網羅している必要があります。

これを防ぐには訓練するデータを増やさなければならず、その結果コストがかかります。

まとめ

いかがでしたでしょうか?

言語処理について僕の持つ知識を可能な限り簡潔にまとめました。

今後、言語処理の分野はさらなる発展が見込まれます。

こちらの記事ではミコロフ氏への取材や、新しい技術「Dynamic Memory Network」などについても紹介されています。

「AIが人間と同等に会話できる社会」

実現されるといいですね!

 

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

ゼロから作るDeep Learning 2 自然言語処理編 [ 斎藤 康毅 ]
価格:3888円(税込、送料無料) (2019/9/15時点)

楽天で購入

 

 

 

スポンサーリンク