LoginSignup
1
1

More than 5 years have passed since last update.

【fast.ai】 text learner API解説

Posted at

概要

本記事はfast.aiのwikiのtext.learnerページの要約となります。

筆者の理解した範囲内で記載します。

NLP モデル作成とtraining

一番大事なのが RNN Learner で、その周りに様々な関数やテキストモデルが存在する。

learnerを素早く作成する

language_model_learner

language_model_learner(data:DataBunch, arch, config:dict=None, drop_mult:float=1.0, pretrained:bool=True, pretrained_fnames:OptStrTuple=None, **learn_kwargs)  LanguageLearner

Language Model の Learnerdataarchから作成する
モデルはarchconfigから指定できる。

それぞれ{lower_case_class_name}_lm_configにて規定されているデフォルトのパラメーターがある。現段階では、AWD LSTM に関しては、pretrained=Trueしかサポートされていないが、drop_multによりdropouts weightsに全て適用でき、dropouts weightsは Learner に引き渡されます。

注記:QRNNを用いるにはcudaのインストールが必須です。

例:

path = untar_data(URLs.IMDB_SAMPLE)
data = TextLMDataBunch.from_csv(path, 'texts.csv')
learn = language_model_learner(data, AWD_LSTM, drop_mult=0.5)

text_classifier_learner

text_classifier_learner(data:DataBunch, arch:Callable, bptt:int=70, max_len:int=1400, config:dict=None, pretrained:bool=True, drop_mult:float=1.0, lin_ftrs:Collection[int]=None, ps:Collection[float]=None, **learn_kwargs)  TextClassifierLearner

Learnerdataarchから作成する
こちらでも、モデルはarchconfigから指定できる。
入力されるテキストはbpttのバッチとして処理され、max_lenactivationしか考慮されません。これがモデルのbackboneで、head は

  • RNNの最終的なアウトプットの最大値と中間層のアウトプットの平均(sequence length dimension)を連結させるlayer
  • nn.BatchNorm1d, nn.Dropout, nn.Linear, nn.ReLUブロックの 複数のlayer

ブロックは全てlin_ftrsdropsによって規定されており、最初のブロックのbackboneであり、最後はdata.cによりクラス数が規定され、lin_ftrsにより中間層のインプットとアウトプットが規定されています。(当然前のブロックのoutputが口のブロックのinputの数と同じになります。)dropoutに関しては 浮動小数点のpsを引き渡して、リスト形式にすることができます。デフォルトでは中間層はサイズが50で、(2つのブロックのmodel_activation -> 50 -> n_classes)でドロップアウトが0.1となっております。

path = untar_data(URLs.IMDB_SAMPLE)
data = TextClasDataBunch.from_csv(path, 'texts.csv')
learn = text_classifier_learner(data, AWD_LSTM, drop_mult=0.5)

class RNNLearner

RNNLearner(data:DataBunch, model:Module, split_func:OptSplitFunc=None, clip:float=None, alpha:float=2.0, beta:float=1.0, metrics=None, **learn_kwargs) :: Learner

NLPのための基礎的なクラス。

テキストデータからのモデル作成を一定のbpttを用いて行う。split_funcによりモデルを違うグループに仕分けたりgradual unfreezingとdifferential learning ratesを用いることができる。Gradient clippingも同様にclipで適用可能。alphabetaはRNNTrainerインスタンスを作成するために用いられる。language modelもしくはRNN Classifierを作成するのに使うことができ、またpretrained modelから重みを用いたりencoder を保存したりロードする用途にも適用することができる。

get_preds

get_preds(ds_type:DatasetType=<DatasetType.Valid: 2>, with_loss:bool=False, n_batch:Optional[int]=None, pbar:Union[MasterBar, ProgressBar, NoneType]=None, ordered:bool=False)  List[Tensor]

予測とターゲットをvalid train or test setds_typeに応じて返す。

ordered=True の場合、データセットの順番ごとに予測がはじき出されるが、そうではない場合samplerにより長いテキストから短いテキストに組み替えられる。 Learner.get_predsも同様に引数として用いることができる。

保存とロード

load_encoder(name:str)

nameでエンコーダーをモデルフォルダからロードする。

save_encoder(name:str)

nameでエンコーダーをモデルフォルダに保存する。

load_pretrained(wgts_fname:str, itos_fname:str, strict:bool=True)

pretrained modelをロードし、data vocabularyに適応させる。

self.model_dirwgts_fnameのweightsとitos_fnameのdictionaryを開いて、pretrained_weightsをデータのvocabularyに適応させる。二つのファイルはlearner.pathにおいて同じフォルダになければいけない。

Utility 関数

convert_weights(wgts:Weights, stoi_wgts:Dict[str, int], itos_new:StrList)  Weights

モデルwgtsを新しいvocabularyに変換させる。

stoi_wgts(string/word to id)の重みを新しいdictionaryitos_new(mapping id to word)に変換する。

予測する

LanguageLearner(data:DataBunch, model:Module, split_func:OptSplitFunc=None, clip:float=None, alpha:float=2.0, beta:float=1.0, metrics=None, **learn_kwargs) :: RNNLearner

予測のためのRNNLearnerのサブクラス。

predict(text:str, n_words:int=1, no_unk:bool=True, temperature:float=1.0, min_p:float=None, sep:str=' ', decoder='decode_spec_tokens')

n_wordsに指定された単語数をtextの後から予測として返す。

もし、no_unk=Trueであればunknown token、つまり知らない単語は予測されない。単語はモデルの確率の分布よりランダムに抽出され、min_pNoneではない場合、そのあたいは単語のpoolに当たって、それより低い値の単語は予測されない。また、temperatureを低めることでテキストのランダム性は下がる。

beam_search(text:str, n_words:int, no_unk:bool=True, top_k:int=10, beam_sz:int=1000, temperature:float=1.0, sep:str=' ', decoder='decode_spec_tokens')

beam search を用いて、n_wordsに指定された単語数をtextの後から予測として返す。

モデルを用いるための基礎的な関数

get_language_model(arch:Callable, vocab_sz:int, config:dict=None, drop_mult:float=1.0)

Language Model の Learnerdataarchから作成する

get_text_classifier(arch:Callable, vocab_sz:int, n_class:int, bptt:int=70, max_len:int=1400, config:dict=None, drop_mult:float=1.0, lin_ftrs:Collection[int]=None, ps:Collection[float]=None, pad_idx:int=1)  Module

Text classifier をarchconfigから作成する(pretrainedは任意)

このモデルはarchconfigからのencoderを用いる。encoderは連続的なサイズのbpttから用いられるが、最後のmax_seqをpooling layerとして保存されない。

decoderは最後のoutput, 全てのoutputのmaxpoolingと全てのoutputのAveragePoolingの連結体が用いられる。その後に、BatchNorm, Dropout, Linear, ReLUブロック(最後のブロックはReLUなし)が用いられ、3*emb_szの最初のlayerサイズにn_layersが連続するようになっている。dropout確率はdropsにて表記されている。

モデルは3つの、最初の実際のoutput、他二つは中間層のdropout前後の層(RNNTrainerによって用いられる)のリストを返り値としている。大概のloss functionはただ一つのoutputを必要とするので、 RNNTrainerを用いない場合は、Callbackを用いて他の二つを削除する必要がある。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1