Tips

torchtextのソースコードを読んでみた

はじめに

torchtextとは

torchtextは、pytorchのNLP用のデータローダです。
Pytorchとそのdataloaderについてはこちらでまとめているのぜひ見てみてください。

PytorchはWIPなためドキュメントもそこまでないので、今回はソースコードを読んでまとめてみました。違う点があれば教えていただければ幸いです。

torchtextでできること

torchtextは、言語周りの前処理と有名データセットのデータローダなどをしてくれます。
embeddingや語彙、index to string, string to indexの辞書などを自動でやってくれたりします。
現時点で使えるデータセットは下記のような感じです。
– 感情分析: SST and IMDb
– 質問分類: TREC
– 含意推論: SNLI
– 言語モデル: Wikitext-2

下記のようなデータセットにも対応予定とのことです。(10/16時点)
– 質問応答: SQuAD
– 機械翻訳: Multi30k, IWSLT, WMT

アーキテクチャ

torchtextの構造は下記のようになっています。

1つ1つのモジュールについて説明していきます。

Dataset

このDatasetクラスは、PytorchのDatasetクラスとは別物です。メソッドは下記の通りです。
initself.examplesself.fieldsをセット
splits: train, dev, validに関するpathを引数に取り、それぞれのデータを返す
get, getattr, iter, lenself.examplesの値を返す

TabularDataset, ZipDataset等データセットの拡張子ごとにサブクラスがあり、読み込みを行ないます

Example

Exampleは、前処理語のデータのオブジェクトです。
TextFieldが持つpreprocessを使って前処理され、Datasetのself.fieldsのkeyでアクセスできます。

Field

Fieldは、データの種類ごとの前処理とVocabオブジェクトを保持しています。メソッドは下記のようになっています。
preprocess(data):設定した前処理を行います。前処理の設定は、inittokenize引数で渡すことでできます。
build_vocab(data):引数のデータからVocabオブジェクトを作成します
pad(minibatch):paddingされたデータを作成します
numericalize(data):Variableに変換します

Vocab

Vocabは、与えられた生データからNLPの処理でよく使う辞書等を作成してくれます。
具体的には、init時にデータから下記を作成します。
– freqs:単語のカウンター
– itos:indexから文字の辞書
– stoi:文字からindexの辞書
– wordvectors:埋め込み行列(Tensor型)、wv_typeを引数で渡すと学習済みのモデルを使います

Iterator

data.Iterator.splits等でDatasetを引数にミニバッチを返すiteratorを作成します。
理由はわかりませんが、pytorchのでデフォルトのdataloaderとは全く関係ないです。
Padding最小にするBucketIteratorなど、
テキスト周り用に少しカスタマイズされています。
返り値は、Batchオブジェクトを返します。(Batchオブジェクトに関しては割愛します)

まとめ

Pytorchのデフォルトと全く別の発展をしていて、少し雑然としている気がします。
基本的に使い方は、下記のような順になります。
Datasetのサブクラスで読み込むソースなどを定義
– 使うデータセットに合わせて’Field’のインスタンス作成(label, textといったfieldを作る)
Datasetのサブクラスの引数に作成したFieldインスタンスを渡し、Datasetインスタンスを作成
Fieldインスタンスのbuild_vocabメソッドでVocabインスタンスを作成
data.Iterator等のメソッドを用いてiteratorを作成
– 処理の最中で必要に応じてFieldインスタンス下のVocabインスタンスメソッドを利用

やはりかなり複雑な感じになってしまっています。
Pytorchのdataloaderとかといつかマージされていくと使いやすくなるのかなーと妄想しつつ、当面はNLP周りでは結構お世話になりそうです。

発表資料

発表スライドを載せておくので、参考にしていただければ幸いです。

曽根岡 侑也

曽根岡 侑也

東京大学 松尾豊研究室 リサーチエンジニア
東京大学大学院工学系研究科, 松尾豊研究室卒. クロードテック株式会社CEO. IPA未踏クリエータ. Paypal Battle Hack Tokyo優勝.