ねほり.com

何もないから何かみつかる

fastText、word2vec、BERTまとめ(サンプル実装)

      2020/08/02

検見川浜突堤に釣りに行ってみましたがボウズ(朝6:00~8:00)でした。

YouTubeでは先週は100匹ぐらい、サッパやアジが釣れたと動画で言ってましたが、本日は

  • 小アジを2匹(子供連れの親子、サビキ)
  • 良型のコノシロ1匹(ジギング:サビキの最尻にブラクリ+ワームを付けた引き釣り)
  • 小さなイシモチ10匹(小さな針での投釣りで引き釣り、餌・小さなゴカイ)

でした。

家族が寝ている間に一人でコソッと行けるので、今後も定期的に行ってみようと思います。

自然言語処理はAI(人工知能)分野で今最も注目の集まる分野です。

一方で、一昨年にBERTが発表され注目を浴びたものの、XLNetやRoBERTaも出てきており、技術進歩の早さについていくのに大変な領域です。

GPUが使えるか確認する

グラフィックボードは、ほとんどが以下の3つ「NVIDIA GeForce」「AMD Radeon」「Intel HD Graphics」の製品となります。

Windows10なら、デスクトップで右クリック → 「ディスプレイの設定」 → 「ディスプレイの詳細設定」 → 「アダプタのプロパティの表示」でグラフィックボードの情報が表示されます。

NVIDIA社・AMD Radeonのグラフィック機能

グラフィック専用のCPU(GPU)を利用しており、高性能なグラフィックボードも多くあります。

従来のディープラーニングのGPU環境(計算環境)にはNVIDIAのGPUとCUDA(NVIDIAが提供するライブラリ)の一択でした。

近年は、UbuntuならAMD環境としてRocm(Radeon Open Compute)とRocm用TensorFlowを使ったり、OpenCL、TensorFlowの代わりにPlaidMLとKetasを使う選択肢もあります。

Intel社のCPU内臓グラフィック機能

グラフィックは専用のCPU(GPU)が使用されますが「Intel HD Graphics」は、CPU内にグラフィック機能も内蔵されています。

こっちは駄目だぁ〜。私のノートパソコンはこっち。開発用じゃないし。

自然言語処理の代表的なモデル・アルゴリズムまとめ

代表的なモデル・アルゴリズム

名前特徴
Word2Vec実際にはCBOW(Continuous Bag-of-Words)モデルとSkip-gramモデルの二つ
GloVe単語ベクトルを獲得する手法。共起行列を用いたカウントベースの手法と、Word2Vecのような推論ベースの手法を合わせた手法
fastTextWord2Vecとその類型のモデルでそれまで考慮されていなかったサブワード・活用形をまとめられるようなモデル
ELMo単語ベクトルを獲得する手法。Word2Vecと異なり、文脈を考慮した単語ベクトルを獲得できる
BERT近年の大きなブレイクスルー
MT-DNNMulti-Task Deep Neural Network。ロジック自体はBERTも参考にしており、性能はBERTを上回る
XLNetBERTの事前学習方法を改良したモデル。タスクの結果だけ見るとBERTの上位互換的な性能をしている
RoBERTaBERTの事前学習方法(パラメータチューニング)を改良したモデル。XLNetより高い性能を出している
ALBERTBERTの軽量版。論文によるとBERTと比較して軽量で高速で高精度

形態素解析器の比較

日本語で自然言語処理を行う場合、英語とは異なり区切りが明確でないため、分離するために利用します。

一昔はJUMAN をベースに解析速度と使い勝手の向上を目指した「ChaSen(茶筌)」が有名でした。

名前特徴
MeCab高速、システムと辞書は分離、mecab-python3の方が高速、辞書はIPA辞書推奨、Unidic辞書やNEologdも利用される
JUMAN京大黒橋研が開発した形態素解析器。Pythonから呼び出すにはPyKNPを使う
JUMAN++RNN言語モデルを使うことで非常に高精度な形態素解析を実現。解析速度がとても遅い
Sudachi徳島人工知能NLP研究所が開発した形態素解析器。MeCabと精度は同じ

辞書

辞書名特徴
IPA辞書学校文法に似た品詞体系なので分かりやすい
Unidic現代日本語書き言葉均衡コーパス。「短単位」を元に構築した辞書
NEologdWeb上のあらゆる新語が追加された巨大な辞書

BERT

BERTは、Bidirectional Encoder Representations from Transformers(Transformerを活用した双方向的エンコード表現)の略です。

ただ一番性能の高いBERTは安GPUではFine Tuningはおろか推論すらOut of memoryで動きません。

目の前に自然言語処理の最先端があるのにそれを使えないのは悔しい限りです。

民生向けコンピューター(GPU非搭載)を使ってBERTを試すために「bert-as-service」を使ってみました。

以下のような機能を持っています。

  • 事前トレーニング済みの12/24レイヤーのBERTモデルを利用して構築(独自の学習済みモデルでも運用可能
  • 少量のコードでテキストを固定長のベクトルとして取得が可能。
  • 低遅延、高速処理に最適化されている

サーバ側(bert-as-service)

クライアント側(bert-as-service)

結果、1つの要約を768次元のベクトルに変換するのに、13分かかりました・・・。

fastText

「fastText」というFacebook AI Researchが2016年に開発した自然言語処理向けアルゴリズムがあります。

fastTextの利用方法は二つあり、「単語表現学習(Word representation learning)」と「文章分類(Text classification)」です。

教師データを作る・モデルを作る

教師データは、先頭に__label__(数字)で、あとは分かち書きされたテキスト列になっています。

結果は次のとおりです。

fastTextは、テキストの分類にCBOW(Continuous Bag-of-Words )、skip-gramの2種類のアルゴリズムを使い、あるコーパスを入力とし、単語の分散表現(単語をベクトル化したもの)を取得します。

日本語処理の場合は、単語の切れ目が明確でないため、MeCab(めかぶ)などのオープンソースの形態素解析エンジンを利用して「分かち書き処理」が必要です。

word2vec

当時Googleに在籍していたTomas Mikolov(fastText開発者の一人)によって2013年に発表されました。

単語をベクトル化することで類似語を抽出したり、単語の意味の足し算・引き算ができる

Word2Vec では、Skip-gram や CBOW といったタスクを学習させたニューラルネットワークの隠れ層の重みを使って単語を特徴ベクトルにエンコードする。

Kaggleコンペ上位の手法

「Toxic Comment Classification Challenge」というAlphabet 傘下の Jigsaw が主催する、荒らしコメントを分類するコンペティションがありました。

Wikipedia の編集議論板で書き込まれた約15万のコメントを1つずつ

  • 荒らし( toxic )
  • ひどい荒らし ( severe toxic )
  • 卑猥( obscene )
  • 脅迫( threat )
  • 侮辱( insult )
  • 個人攻撃( identity_hate )

であるか分類します。

[Tips1] 同じ単語は同じベクトルとして表現

英単語を学習済みワードベクトル (FastText, Glove 等)でタグ付けするときに、(大・小文字関係なく)“同じ単語は同じベクトルとして表現した方が良い性能が出る”と判断したようです。

しかし、英語で大文字を羅列するということは、その「文を強調している」という重要な情報が含まれています。

このため、この情報を特徴量として入れようと考え、次のようなルールを定めて大文字・小文字の変換処理を行いました。

  • 単語に2文字以上大文字が含まれている場合は、大文字に変換する(例: TOXICやToXiC → TOXIC)
  • 大文字が2文字未満の場合は、小文字に変換する(例: Toxicやtoxic → toxic)

[Tips2] 英語コメントを別の言語に翻訳して、さらに英語に再翻訳

前項の翻訳手法を考えているうちに、“英語コメントを別の言語に翻訳して、さらに英語に再翻訳 すればデータの水増しができるのでは?”と考えました。

という感じになります。文章が破綻せずに、元の文章とは異なる文を生成できる ことを上手く利用しよう、という発想です。

この再翻訳によるデータの水増しはとても有効な手法だったようです。

翻訳のソースコードは、 Translation API の pythonクライアントライブラリ を利用して作成しました。

エラー

ValueError: 1 is not in range

split関数を利用した際にpandasのdataframe上にsplitするべきアイテムが存在しない場合に発生

まとめ

強力なGPUが無くてもメモリさえ十分に積んでいるマシンがあれば自然言語処理の最先端に至れます。

が、メモリも少なければ非力なライブラリを使うしかありません。

 - 2020年(社会人16年), 機械学習, テクノロジー

  関連記事

機械学習で株価予測(Pythonのバックテストライブラリ調査)

前回、機械学習で解いた予測結果がどれだけ利益が出ているのか詳しく知ることが出来ま …

千葉市周辺の初夏(6月)の小さな雑草の花まとめ(外来種か食用か?)

「帰化植物」とは、人為的な手段で持ち込まれた植物のうちで、野外で勝手に生育するよ …

twitter・ニコニコ・2ちゃんねる実況をテレビ連動してみる

2011年09月04日(日) twitter・ニコニコ・2ちゃんねる実況をテレビ …

6月中旬の検見川浜突堤・稲毛海浜公園の釣果は・・・?潮干狩りは?

以前稲毛周辺の釣り情報をまとめましたが、とりあえず現地に行ってみないと釣れている …

PHP5→PHP7に変更(php7ccを使った動作確認)

PHPの新しいバージョンであるPHP7が2015年12月に正式リリースされました …

ソニーウォークマンNW-X1060 購入

2009年06月23日(火) SONY NW-X1060 購入しました 買ってし …

花見川で初めてのミミズでテナガエビ釣り(千葉市花見川区)

日経平均株価は2万3000円まで到達し、10日で25万円稼いだという同僚が言って …

はじめてのKerasを使った株価予測(ディープラーニング)

毎年年末年始やGWに技術学習・Webサイト構築してきたのに、今年は何もしていない …

Bootswatchによる2rowデザイン&軽量化の検討

この2ヶ月間で「ランキング出力のOAuth 2.0対応」「Yahooコメントラン …

Turbolinuxが利用できる音楽プレーヤー「wizpy 4GB」購入

2009年04月10日(金) wizpy 4GB(3,980円)購入 wizpy …