文章校正を究める
description
Transcript of 文章校正を究める
文章校正を究めるWITH DEEP LEARNING
僻地のプログラマ kmt-t
自己紹介• ハンドルネーム
• kmt-t
• 業務系プログラマ• 2 年前ぐらいまで組み込みやっていました• 心は未だに組み込み屋
• 得意分野• 画像処理• ファイルシステム• 仮想マシン
好評発売中!• Android の仮想マシン Dalvik 編
• 好評発売中!
• 遅れに遅れてますが近日改訂予定• 続刊で ART 編が出る予定
• 今日はこの本の校正の話• かなり長くなります
実践編やってみないとわからない
昔こんなの作りました• ニコニコ動画自動収集システム
• ニコニコ動画を機械学習で自動収集• アルゴリズムはベイジアンフィルタ
• 収集した動画を家庭内に配信• DLNA で TV に配信
ニコニコ動画
クローラ
ニコニコ動画配信システムで得た結果• 実はニコニコ動画のコメントに個性はない
• コメントを分析して動画を分類するのは難しい
•コンピュータビジョンの専門家 ( 博士 ) の某氏に聞いてみた• 「ベイジアンフィルタは弱いからね」とのコメント
自分の悩み事• 本が出たので読者アンケート取った• 「文章が悪い」、「未定義の語が出る」というコメント
• しかし文章校正作業は非常に面倒くさい• 人間の集中力がネックなります•ここは計算機に頼りましょう
なるほど、直しましょう!
一般的な校正ツール ( その 1)
• Tomarigi•http://www.pawel.jp/download/tomarigi/• 文法的に望ましくない文章を検出• 若干チェックが甘い
一般的な校正ツール ( その 2)
•ATOK クラウドチェッカー•https://jproofreading.atok.com• 誤検知が非常に少ない• 検出率も非常に良い• 個人的おすすめ
一般的なツールを使った感想• 個人的にはまあまあ満足
• 人の目から見ておかしい文章がたくさん残っている• 文章の校正は元々コンピュータ向けの仕事ではないし、こんなもの• 日本語の専門家の作ったソフトなんだから仕方ない
ここで気持ちの変化
• 最近は NLP 向けのライブラリがたくさんある• 形態素解析をする MeCab• 係り受けを解析する CaboCha• ライブラリを使えばツールの自作が可能
※ NLP = Natural Language Processing = 自然言語処理
自分の文章向けに自分が校正したいところに限定すれば一般的なツールで検出できない
文章の間違いを見つけることができるのでは?
レベル 1 : 用語の統一•MeCab で形態素解析
• 単語に分割する分かち書き• 単語の品詞の分類
• 文章から名詞のみを抜き出す• ” 仮想”と”マシン”が続いたら”仮想マシン”とする• 用語のリストができるので同じ意味を指す用語は統一
•2000 語ぐらいリストアップできたので手作業で修正
レベル 2 : 表記ゆれ検出•MeCab で形態素解析
• 単語に分割する分かち書き• 単語の品詞• 単語の読み
• 同じ品詞で同じ読みで違う表記は表記揺れの可能性が高い
• 非常に簡単に表記揺れを検出可能
レベル 3 : 未知語の初出検出• レベル 1 で作成した用語リストから解説が必要な語を抽出
• 解説が必要な語の初出をリスト化• 解説なしに使っている場所を修正
• 手作業が多くかなり面倒くさいので断念
やっぱりもっと楽したい
• コンピュータよ、もっと考えろ!• ここまできたら機械学習しかない!• ここはディープラーニング!
コンピュータよ、もっと考えろ!
ディープラーニングとは• 最近注目されている機械学習の手法•深い階層を持つニューラルネットワーク•従来は過学習の問題があり階層を深くできなかった
• コンピュータビジョン、 NLP では大きな成果• http://matome.naver.jp/odai/2140635573608360401•有名なところでは「 Google の猫」
Pylearn2
•http://deeplearning.net/software/pylearn2/
•Python製の機械学習ライブラリ•多数かつ最新のアルゴリズムを実装
• ただし使い方がかなり難しい• 一般プログラマには高機能すぎる?
• 今回はこれを使ってディープラーニングさせてみた
文章をベクトル化•入力データはベクトルデータである必要がある
• 品詞 ID をスカラ値とするのは間違い• 品詞を「 one hot 表現」でベクトル化する
• 品詞 ID が 80 個あるなら 80次元のベクトル用意する• 品詞 ID に対応する次元を 1 、それ以外を 0 とする
•ひとつの文を 80 品詞、 32 単語として 2次元の行列に変換
文章のベクトル化の補足•word2vec
•https://code.google.com/p/word2vec/• 言葉の意味で単語をベクトル化できる• 類似の意味の単語や、単語間の意味関係が同じ単語の組を見つける
ことができたり、結果だけ見ても面白い
• 係り受けのチェックであれば係り受けをベクトル化•隣接行列または係り受け距離を使用• 今回は係り受けの評価はしない
学習器の概要• DAE+AE+SoftMax
※ AE = Auto Encoder
※ DAE = Denosing Auto Encoder
• Auto Encoder とは出力から入力を復元できるように修正する学習器• Auto Encoder は初期値を設定するための事前学習が必要• SoftMax とは入力された信号を N 個のクラスタに分類する分類器
• 学習係数の設定が難しかったので自動調整を適用
事前学習データの概要•以下の 5 つのデータに分類することを期待
•普通の文章• 長すぎる文章• 未定義語に対し説明充分• 未定義語が説明不足• 意味がない文章 ( 文章ではない文字列 )
• 目的は単語の説明不足の検出•説明が必要な専門用語の辞書を作成する• 専門用語が初めて出現した場合、その語を未定義語とする• 未定義語には専用の品詞 ID を付けておく
結果は?•???
普通の文章• 分類された文章
• クラスローダは親子関係による階層構造を持つことが出来ます。 • 配列の初期化バイナリデータがバイトコード領域内かチェックします。 • basyura さん、 chinmo さん、 hamajyotan さん、 hilohiro さん、 ionis_h さ
ん、 suzumura_ss さん、ご協力ありがとうございました。• 本書と続巻を持って、 Android OS の仮想マシンの全体像がわかるようになっています。• 定数及び文字列、クラス情報をレジスタにロードする命令群です。
比較的短く、簡潔な文章が多い
長すぎる文章• 分類された文章
• バイトコードの各命令を順番にソフトウェアで「フェッチ ( 読み出し ) 」、「デコード ( 意味解釈 ) 」、「実行」するプログラムのことです。
• このように△パイプライン△が長くなるのにともなって発生する問題を軽減する分岐予測と投機実行△ですが、インタープリタのフェッチのジャンプ先は、予測することが困難 (次のバイトコード命令によってジャンプ先が変わるため ) です。
• 筆者は組み込み家電開発をしていたこともあり、すぐに興味を持ったのですが、筆者が特に注目したのは Android OS の中核をなす Dalvik 仮想マシンでした。
• ただし、 JIT コンパイラを採用するとこのようなオーバーヘッドは隠蔽されるため、どちらが有利とは断言出来ず、方式の違いというより実装の洗練度の方が重要になります。
長い文章がほとんど
意味がない文章 ( 文章ではない文字列 )
断片的な単語のみの文章がほとんど
未定義語が説明充分• 分類された文章
• Java 仮想マシンスタックとは、仮想マシンが Java プログラムの実行のために使用する専用のスタックメモリ領域です。
• DDMS ではメソッドの実行時間を計測出来るパフォーマンスプロファイラが用意されています。
• 実は DDMS の機能はデバッガ (JDWP) のプロトコル上でやり取りします。• SSA 形式の方が通常の形式より最適化が容易なためです。• ホットスポットプロファイラとは JIT コンパイラでコンパイルする箇所を解析するプログラ
ムのことを指します。
• 未定義語を含まない例文がほとんど
よくわからない?
未定義語が説明不足• 分類された文章
• Dalvik 仮想マシンの実行で使用するバイトコードや、その他プログラムのメタ情報などをパッケージにした実行ファイルです。
• Java 仮想マシンの実行で使用する、バイトコードやその他プログラムのメタ情報などをパッケージにした実行ファイルです。
• punt と呼ばれる例外を処理する基本ブロックを追加します。• DDMS のヒーププロファイラは、このデバイスファイルのパーサを持っており、パースした情報
を上位に渡します。• クラスが継承しているインターフェイスの配列です。
• 未定義語を含まない例文がほとんど
よくわからない?
未定義語に限定して見てみる• 未定義語の説明充分 /不足の分類がわかりづらかったので、未定義語
を含む文章に限定して見てみる
未定義語が説明充分( 未定義語限定 )• 分類された文章
• また 1 、 2 の処理を「 ×マークフェイズ× 」、 3 の処理を「 ×スイープフェイズ× 」と呼びます。• ある基本ブロック M の前に必ず通る基本ブロック N のことを、 N は M の ×支配ノード× と呼びま
す。• ×スクラッチレジスタ× でもあるので呼び出し先メソッドでレジスタの内容を退避せずに自由に書き換えてよいです。
• 命令セットは英語で「 Instruction Set Architecture 」、省略して「 ×ISA× 」と呼びます。• ×定数伝播× では、定数が格納されている変数を定数に置き換えます。
• 未定義語は ×部分
きちんと説明になっている
未定義語が説明不足( 未定義語限定 )• 分類された文章
• また ×昇格× されたブロックもこのフラグが設定されます。• その後、「 ×カードマーキング× 」で記録された並列マーキング中に書き換えられた参照を再度生存マークします。
• 例外格納領域、 ×戻り値格納領域× はスレッドごとに持つ専用の領域です。• スピンロックによるモニタの場合は、 ×CAS命令× を使ったロックとなります。• すると ×トレースファイル× が端末に保存されます。
• 未定義語は ×部分
定義なしにいきなり使われている
というわけでうまくいきました• ここで拍手!
文章校正ツールのチューニングフロー
データ作成 •入力データを学習しやすいフォーマットに変換
アルゴリズム選定 •自分のやりたいことに対し、直感で決める
パラメータチューニング •試行錯誤 (ここが大変)
学習データチューニング •とにかくわかりやすい事前学習データをつくる
パラメータ調整のコツ (1/2)
• 学習率は高めの方がいい結果が出る• 学習率が高すぎると NaN や Inf でプログラムが落ちる
•エラーがでないほどほどを狙う
• 一般的なノード重み初期値の乱数のレンジ
•線形活性関数の場合 : ぐらい?
• シグモイドの場合 :
パラメータ調整のコツ (2/2)
• 学習回数は多めにする ( 今回であれば 50~200回 )
• 今回は one hot 表現を使っているので情報がかなり疎•ノード数は上位レイヤに行くほど大きく絞る
事前学習データの調整のコツ• 今回は one hot 表現を使っているので情報がかなり疎
• 事前学習データは多めに用意する
• 事前学習データはデータ変換のついでにランダムにシャッフルしておく• シャッフルしたほうが良い結果が出る気がする
• 人間が判断に困る事前学習データは含めない•微妙な判断は計算機に任せる
•基本は事前学習データをがんばるより、パラメータの調整をがんばる
高速化のコツ•層を極力薄くする•ノードの数を絞る
• one hot 表現は入力層のノードが大きくなるので絞る
•バッチサイズは大きい方が速い•値の更新はバッチごとに行われる•バッチサイズは学習データの約数である必要がある•毎回約数計算するのが面倒くさいので N=8 ぐらいでアライメント
• save_freq はメモリの許す限り大きくする ( 理想は学習回数と同じ )
•高速化しないとパラメータの調整がしんどいのでがんばること
環境構築のコツ• AWS では Pylearn2 がセットアップ済みの AMI が公開
• 「 CUDA 」で検索すると引っかかる• Pylearn2 はセットアップが結構面倒なので AWS おすすめ
• g2.2xlarge クラスタを使えば NVIDIA GRID K520 による GPGPU 使える• ただし c3.8xlarge のようなコア数多いインスタンスの方がかなり速い• ただし自宅の Haswell+non GPU の方がもっと速い
理論編理屈がないとつかえない
ニューラルネットワーク•階層ごとにニューロンを配置•隣接する階層のニューロン同士は結合• ニューロン同士の結合度はそれぞれ違う
• 最下層のニューロンに情報を入力• 最上位のニューロンが情報を出力
下層レイヤ 中層レイヤ 上層レイヤ
入力
入力
入力
入力
接続の重み係数とバイアス
• がそのノードの活性• が入力ノードの活性• が入力ノードの重み• がバイアス• が活性関数• とを学習する
下層レイヤ 上層レイヤ
x1
x2
x3
x4
h1
W
W
W
W
活性関数•代表的な活性関数は以下の通り
シグモイド Rectified Linear Unit Maxout
活性関数の特徴• シグモイドの特徴
•標準的な活性関数• 学習が進むと微分が極端に小さくなる
• Rectified Linear Unit (ReLU)• 学習速度が速い•微分が簡単•微分が極端に小さくならない
• Maxout• ReLUより表現力が高い
学習方法確率的勾配降下法•=予想と正解との誤差の平均• が最小になるように学習
• の勾配をとする
•重みを以下の式で繰り返し更新する
• は学習率•式によりが最小となる点に重みが移動していく
活性関数の勾配と学習率•勾配は各でを偏微分したベクトル
• )
• 学習空間の等高線と断面図• との 2 変数のグラフと仮定•高さ成分が正しさ•以外のを定数として成分の微分を考える•以外のを定数として成分の微分を考える
• 学習空間における移動量のスケールが学習率• 学習率 ×勾配=移動量•勾配の方向に学習空間を移動して解を探す
W2
W1
L(W)
今の場所
勾配
目指す場所W1
等高線
誤差逆伝搬法(backpropagation)• ってどうやって求めるの?• 誤差伝搬法で計算する
• は前回の学習結果を評価した値を使用する• 誤差伝搬法は、ある種のフィードバックとして働く
学習率の調整• 学習は一回では終わらず何度もイテレーションする
•初期イテレーションは移動量が大きい方が良い•移動量を大きくするには学習率を上げる• イテレーションごとに学習率を一定率下げるのが定石
• Pylearn2 だと学習状況をみて自動調整する機能あり•基本的にイテレーションごとに下がる方向に調整• 一度に上がる量より下がる量を大きくする
モーメンタム• 学習空間の勾配ベクトルが不安定の場合、移動平均でなだらかにする•不安定とは目的関数の激しいアップダウン•移動平均でブレーキをかける量をモーメンタム係数と呼ぶ
• 学習が不安定な場合は強くするとよいかも?
ドロップアウト•過学習を防止するテクニック•過学習とは「 3 日データをとって全部雨なら明日も雨」
• あえてランダムなニューロンの結合を「忘れる」 ( 使わない )
•何故かこれでうまくいくらしい
まとめここまでやると何かがわかる
ディープラーニングと NLP
• 実は NLP に限定すると従来手法より精度が高いわけではない
•従来手法は歴史があり、定石や日本語の勉強が大変•ディープラーニングではそういった技術がほぼ不要
• 一般的にニューラルネットワークは扱いにくい• NLP を究めるよりよっぽど楽
ディープラーニングはつかえるか?• 結論としてはつかえます
• ただし何に使えるかはまだ謎
•研究→実用化→一般化• まだ研究段階• Pylearn2 は実用ソフトと言うより研究用
ディープラーニングのアプリケーション• 文章校正に関連するアプリケーション
• ソースコードの品質のチェック?
• iPhone の Siri の音声認識•デンソーが研究している車の自動運転•音声認識、コンピュータビジョンでは目覚ましい成果
•何でもつかえる可能性がある• 一回試してみる価値あり
ディープラーニングを学習したい人へ• Pylearn2 をつかうだけなら今日発表した内容レベルで理解でよい
• SlideShare (重要 )• PFI の人の発表資料が神過ぎる
• Pylearn2 のリファレンス
•英語の得意な人は情報は色々ある
ご清聴ありがとうございました