はじめに
fasttextはやってますね。
簡単に試せてよいのですが、パラメータの意味や内部で何をしているのかとかよくわからなかったので、ソースを解析してみました。
前提条件
https://github.com/facebookresearch/fastText
の2017/11/30(520b59d722c09943625ede522577119bdd158403)を参考にしています。
.vec形式
単語のベクトル方式をテキスト形式で保存しています。スペース区切りです。
ヘッダは1行です。
単語数 次元数
単語ベクトル行
単語 ベクトル実数 ...
-pretrainedVectors で読み込むときに利用します。
他にも単語のベクトル表現を利用したいときに利用できます。
ただし、テキスト形式のため読み込みは遅くなりがちです。値もある程度丸めてあります。
.bin形式
バイナリ形式で保存しています。
以下の順番で保存されています。
- ヘッダ(固定長)
- 引数(固定長)
- 単語辞書(可変長)
- 入力層の重み(マトリクス)(可変長)
- 出力層の重み(マトリクス)(可変長)
ヘッダ(固定長)
データ型 | 内容 | 備考 |
---|---|---|
int32_t | FASTTEXT_FILEFORMAT_MAGIC_INT32 | マジックナンバー793712314 |
int32_t | FASTTEXT_VERSION | 12 |
バージョンはコマンドラインでは確認できません。
src/fasttext.hを確認してください。
マジックナンバーは同一チェック
バージョンは実行モジュールと同じか古い.binは読み込めます。
- 2017/10/4 にバージョンが11から12にあがりました。supervisedで-minn,-maxnが有効になりました。
- 2017/5/2 にマジックナンバーとバージョンが追加されました。
引数(固定長)
コマンドライン引数を保存しています。
supervised, skipgram, cbow 共通です。
(利用しないものもあり)
データ型 | 内容 | 備考 |
---|---|---|
int | dim | 次元数 |
int | ws | windowサイズ |
int | epoch | 学習回数 |
int | minCount | 単語の最低出現数 |
int | neg | ネガティブサンプル数 |
int | wordNgrams | ワードグラム数 |
loss_name(int) | loss | hs, ns, softmaxのどれか |
model_name(int) | model | supervised, skipgram, cbowのどれか |
int | bucket | バケットサイズ |
int | minn | 最少N-gram |
int | maxn | 最大N-gram |
int | lrUpdateRate | 進捗表示のレート |
double | t | トークンサンプリング閾値 |
ここにないオプション(minCountLabel,lrなど)は保存されません。
単語辞書
単語の辞書情報を保存しています。
ヘッダ(固定長)
データ型 | 内容 | 備考 |
---|---|---|
int32_t | size_ | 登録単語、ラベル数 |
int32_t | nwords_ | 登録単語数 |
int32_t | nlabels_ | 登録ラベル数 |
int64_t | ntokens_ | 延べ出現単語数 |
int64_t | pruneidx_size_ | quantize化した場合の変換表サイズ(デフォルト-1) |
単語データ部(可変長)
データ型 | 内容 | 備考 |
---|---|---|
string | word | 登録単語。0x00区切り |
int64_t | count | 単語出現数 |
entry_type(int8_t) | nlabels_ | word, labelのどちらか |
quantize変換表(可変長)
データ型 | 内容 | 備考 |
---|---|---|
int32_t | first | 変換元 |
int32_t | second | 変換先 |
マトリクス(可変長)
入力層の重み、出力層の重みは2次元マトリクスとして保存します。
フォーマットは同一です。
※ quantize化した場合はQマトリクスとして保存します。
データ型 | 内容 | 備考 |
---|---|---|
int64_t | m_ | 登録数 |
int64_t | n_ | 次元数と同じ |
real | data_ | 可変長 m_×n_サイズ |
※ m_について
- 入力層の重みの場合、gram指定(-minn,-maxn,-wordNgrams)がない場合は、登録単語数。gram指定がある場合は、登録単語数+bucket数
- 出力層の重みの場合、supervisedの場合はラベル数、その他は登録単語数。
Qマトリクス(可変長)
使っていないので省略
まとめ
fasttextどんどんcommitされています。
結構大きな変更もあるので、ちゃんとみといたほうがいいみたいですね。