Open14
GPT-2のファインチューニング試す
ピン留めされたアイテム
- なるべく手順通りにスクラップを並べたかったけど、スクラップの前後関係が動かせないので諦めている
- 終わったらtech記事化してArchiveする?
- 予備調査と本調査の分割
- スクレイピング本格的にやる前に1/10ぐらいで全体の流れを確認すると良いかも
- 色々アラが見つかるから
- スクレイピングツールの調整不足など
データスクレイピング
ツール設計
node でやる
- データ欠損の確認などはpandasでやるのでスクレイピング周りはpython実装のが良いかもしれん
構成
- node-fetch
- jsdom
- jsdomのtextContentとinnerText Chromeと挙動が違う?
- NeDB
- 自前でPromise化したけど、よく調べたらきちんとしたモジュールがあるじゃん…
jsdom
特殊なcssエラーへの対応
nedb
import文を使ったnedbの読み込み
import Database from 'nedb';
const db = new Database({ filename: "example.db"});
サイト分析
- Chrome developer consoleにてquery selectorで抽出データを取るコードを作る->プログラムに移植という流れ
- リンクをたどって全データを拾っていけるようなループを考える
- blog記事だとprev/nextのページネーションを利用すると全リンクをたどりやすい
スクレイピング
- 全データ数14101だけど、ある程度スクレイピングにwaitかけると19時間以上かかる。
- まずは1000件ぐらいのデータでとどめておく。
データチェック
- 欠損データの調査と取り直し
- パラメータ不足のデータの取り直し
- 取得済みデータから類推できなかったので、取り直したほうが早い
前処理
データ分析は前処理の時間が8割という警句あり
前処理の段階
- 前処理は広い意味を持つ。いくつかの段階がある
- クリーニング
- 単語分割
- 単語の正規化
- ストップワード除去
- 単語のベクトル表現
fine-tuning用のデータを考える
- クリーニング
- 制御文字と空白、url、定型文のカット
- ハズレ値データの除去
- このタイミング?
- 検討
- 単語分割(分かち書き)
- 形態素解析器で分かち書き化
- 結果が悪くなる?とりあえずやらない
- 単語の正規化
- 形態素解析結果を利用するパターン
- 計算上良くなるらしいのでやる
- ストップワード除去
- GPT-2での効果不明
- とりあえずやらない
- 単語のベクトル表現
- 日本語gpt-2にTokenizer含まれてるので手順通りで問題ない
メモ
- GPT-2を試してみた記事を見ると、クリーニング以降は、特に何も考えずにGPT-2にそのまま入れてもよさそうではある
- 改行表現は残すべきか?
-
芸能人のblog記事でfine-tuningしてたものでは、空行ありのまま使ってた。
- 文章の癖を表現するものとしては空行を残すのはありなのか?
- 後処理(GiNZAによる文分割等)で文章を適切に分割できるなら、入力データとしてはいらない気がする
-
芸能人のblog記事でfine-tuningしてたものでは、空行ありのまま使ってた。
- pandas使ったほうが良い?
- ハズレ値を含むデータの除外高度な分析やるなら必要そうだ
- 極端に漢字が少ないパターン等の雰囲気重視の文章の除外
- 不要データの除去ってどのタイミングだろう?
- データ分析に足を突っ込んでるので前処理が終わった後?
- GiNZAによるパイプライン処理でうまくできない?
- 知識不足で分からん。今はやらない。
- 形態素解析いる?
- 分かち書き化はあんまり良くないみたいなので、やらない
- https://qiita.com/kageazusa/items/fe7bdb08a0bbf77cf3ab
参考記事
概論
具体的な手法
- いくつか調べたが、記事によってさほど手順が変わるわけではない
- 新しい記事の方が、様々なツールを利用できている
- BARTでの前処理
- クリーニングと正規化のみ実施
- さしあたり行う前処理としてはこの2つが鉄板と考えて良さそうだ
新し目の技術
Encoder-Decoderモデルを用いた日本語崩れ表記の正規化
- 実装したもの見つからず
ツール
sudachiによる日本語文章の正規化
- しょう油->醤油
GiNZAによる文分割
- 参考があんまりよくない。単に句読点で区切ってるだけでは…?
辞書とか
崩れ表記の修正に使えそうだが、正規化のためにどうやって使うのか?
Fine-tuning
GPT-2のファインチューニングに必要なデータ量ってどれぐらいだろうか?
- 事例を調べたが、数百~数万まであるので特に決まりは無いっぽい
- データが多くなるとそんなに良くなるとも思えない
- そもそも少ないデータでタスクに適応させるみたいな思想じゃなかったか
- 品質と学習時間とのトレードオフ
- 最初は1000程度のデータでよい
- 良いfine tuning用データとは?調査する
- haggingfaceのfine-tuning記事では、IMDbのdataseを利用。こいつは数万のデータのようだ
少し突っ込んだ使い方
評価
ちょっと調べ方が甘いのであとでちゃんと調べる
- 文章生成モデルの評価方法について調べる
huggingfaceに評価ツールあるみたい。
使い方?
記事
モデル
rinna
gpt2-japanease
創作小説系はrinnaモデルじゃなくてこちらのモデルのほうが良いかもしれない
簡単に動かす
rinnaモデル
gpt2-japaneseモデル
その他
モデル??
ちゃんと動かす
- train と eval必要なパターンといらないパターンあるのはなんで?
Special Tokens
FineTuningでいるのか?
いるっぽい。
run_clm.py周り
訓練の加速などの説明有り
run_clm.pyオプションの確認
!python ./transformers/examples/pytorch/language-modeling/run_clm.py -h
顔文字の除去
NEologdにて顔文字登録有り(顔文字に手が付属してるのは無理っぽいが、ざっくりこれいいかも)
- NEologdによる前処理の検討
nagisaライブラリの利用
こっちは顔文字に手が付いてるやつの除去
実装が難しそう。手の表現は参考になるかも
Pandas
特定の文字列を含む行のインデックスを取得
df[df['title'].str.contains('怖い')].index.tolist()