🐮

AI界を席巻する「Transformer」をゆっくり解説(7日目) ~Training編~

2021/05/09に公開

AI界を席巻する「Transformer」を解説するシリーズ7日目です。

Attention Is All You Needの論文PDFはこちら

  • 1日目: Abstract
  • 2日目: Introduction / Background
  • 3日目: Model Architecture 1
  • 4日目: Model Architecture 2
  • 5日目: Model Architecture 3
  • 6日目: Why Self-Attention
  • 7日目: Training
  • 8日目: Results / Conclusion
  • 9日目: Source Code

シリーズ過去記事は一番下にリンク貼ってます。
それでは早速みていきましょう。

5 Training

This section describes the training regime for our models.

本章は、Training、学習方法についてです。

5.1 Training Data and Batching

We trained on the standard WMT 2014 English-German dataset consisting of about 4.5 million sentence pairs.

約450万の文章ペアからなる、標準的なWMT 2014英独データセットで学習しました。

WMT 2014はいまいち見つかりませんでしたが、2016ならありました。

https://google.github.io/seq2seq/data/

そのデータの説明は下記。

Data for the WMT'16 Translation Task English to German. Training data is combined from Europarl v7, Common Crawl, and News Commentary v11. Development data sets include newstest[2010-2015]. newstest2016 should serve as test data. All SGM files were converted to plain text.

このサイトを見ると、このデータセットはGoogleが提供しているようで、GoogleがGithubにあげたSeq2Seqモデルで使われているデータのようです。Europarlはよくわかりませんでしたが、WEBをクロールしたデータや、ニュースで使われた文章などで構成されているようです。言語も移り変わっていくものであることを加味しているのか、2010年から2016年くらいまでのデータで構成されているようです。

Sentences were encoded using byte-pair encoding [3], which has a shared sourcetarget vocabulary of about 37000 tokens.

文章はByte-Pairモデルを使って、ベクトルにエンコード=変換されており、37,000トークンの語彙が収録されているとのこと。

For English-French, we used the significantly larger WMT 2014 English-French dataset consisting of 36M sentences and split tokens into a 32000 word-piece vocabulary [38].

英語-フランス語については,3600万の文章ペアからなる、英独に比較して非常に大規模なWMT 2014 English-Frenchデータセットを使用した。トークンは32,000語の単語に分割して使用した。

だから英独翻訳に比較して、英仏翻訳に関して、BLEUスコアが大幅に高かったのかもしれません。

Sentence pairs were batched together by approximate sequence length.

文章ペアは、だいたいは、その文章の配列の長さに応じて、バッチにまとめた。

Each training batch contained a set of sentence pairs containing approximately 25000 source tokens and 25000 target tokens.

1つ1つの学習データのバッチは、色々な文章ペアからできていて、だいたい25,000の翻訳前後の単語トークンで出来ている。

5.2 Hardware and Schedule

We trained our models on one machine with 8 NVIDIA P100 GPUs.

学習に使用したGPUは、NVIDIA製のP100 GPUを8個使用した。

ここはシリーズの以前の回でもご紹介しましたので、割愛します。正確にはわかりませんが、640万円分くらいのお値段がした可能性があります・・・

https://zenn.dev/attentionplease/articles/c2dba490ccba3f

For our base models using the hyperparameters described throughout the paper, each training step took about 0.4 seconds.

本論文で紹介したハイパーパラメータを使ったベースモデルに関して、学習にかかった計算時間は、1ステップがだいたい0.4秒。

We trained the base models for a total of 100,000 steps or 12 hours.

その0.4秒かかる1ステップを10万回、時間にして12時間行った。

\begin{aligned} 学習時間 \ T &= 1ステップの計算時間 \ t \times ステップ数 \ S \\ &= 0.4 \times 100000 \ 秒 \\ &= 40000 \ 秒 \\ &= 40000 \div 60 \div 60 \ 時間 \\ &= 40000 \div 3600 \ 時間 \\ &\risingdotseq 10 \ 時間 \end{aligned}

For our big models,(described on the bottom line of table 3), step time was 1.0 seconds.

表3の一番下の行で示すようなBig Modelでは、1ステップの計算時間は1秒だった。

The big models were trained for 300,000 steps
(3.5 days).

このBig Modelでは、30万ステップの計算を行い、3.5日かかった。

当時の超高性能なNVIDIA製のGPUを8個使ったら、このくらいの計算時間だった、ということです。余談ですが、2021年現在ではGoogleやSonyがこういった高性能なGPUを使えるサービスを無料で公開してたりします。

https://colab.research.google.com/notebooks/intro.ipynb?hl=ja
https://dl.sony.com/ja/

このあたりは、わたしもせっかくなので、実証実験をかねて使ってみたら、また紹介したいと思います。ご要望があれば順番を早めるので、Twitterやコメント欄等どこでもいいので教えてください。

5.3 Optimizer

We used the Adam optimizer [20] with β_1 = 0.9, β_2 = 0.98 and \epsilon = 10^{-9}.

Optimizer(最適化アルゴリズムのこと)にはAdamを使った。パラメータには、 β_1 = 0.9, β_2 = 0.98 and \epsilon = 10^{-9} を使用した。

パラメータの説明はKerasにも載ってますが、結局は本家の論文から来ています。

https://keras.io/ja/optimizers/#keras

Adamはよく使われる最適化アルゴリズムの1つで、説明は省きますが、詳しくは下記該当論文にもあります。もちろんたくさん記事も出ていますし、本でもよく紹介されているアルゴリズムです。

Adam: A method for stochastic optimization: 2017年にUniversity of Amsterdam, OpenAI and University of Torontoが公開

We varied the learning rate over the course of training, according to the formula:

また、Learning Rate(学習率)は下記の数式にのっとって、学習をしながら変えていった。

lrate = d^{−0.5}_{model} · \mathrm{min}(step\_num^{−0.5}, \ step\_num ·warmup\_steps^{−1.5})

This corresponds to increasing the learning rate linearly for the first warmup_steps training steps, and decreasing it thereafter proportionally to the inverse square root of the step number.

この数式が意味するところは、最初の学習時のステップをウォームアップ・ステップと定義していて、その間は線形的にリニアに学習率が上がっていくが、その後ステップ数の逆平方根に比例して減っていく動きを意味しています。

We used warmup\_steps = 4000.

ウォームアップ・ステップ数には4,000を使った。

この数式がぱっと見てわからないので数字を代入していきます。

\begin{aligned} lrate &= d^{−0.5}_{model} · \mathrm{min}(step\_num^{−0.5}, \ step\_num ·warmup\_steps^{−1.5}) \\ &= \frac{1}{\sqrt{d_{model}}} · \mathrm{min}(\frac{1}{\sqrt{step\_num}}, \ \frac{step\_num}{warmup\_steps \sqrt{warmup\_steps}}) \\ &= \frac{1}{\sqrt{512}} · \mathrm{min}(\frac{1}{\sqrt{step\_num}}, \ \frac{step\_num}{4000 \sqrt{4000}}) \\ &= \frac{1}{16\sqrt{2}} · \mathrm{min}(\frac{1}{\sqrt{step\_num}}, \ \frac{step\_num}{4000 · 20 \sqrt{10}}) \\ &= \frac{1}{16\sqrt{2}} · \mathrm{min}(\frac{1}{\sqrt{step\_num}}, \ \frac{step\_num}{80000 \sqrt{10}}) \end{aligned}

実際に、この非線形な数式のグラフを描いてみます。1 \leqq step\_num \leqq 100,000 です。

確かに、計算ステップがウォームアップ・ステップ=4000までは学習率がぐーっと上がっていきますが、それ以降は徐々に下がっていくような数式になっています。

学習率は値が大きいほど、どんどん学習する、つまり今回のAdamという最適化アルゴリズムが、モデルを最適化する過程でどのくらいパラメータを大胆に動かすのか、という数字で、ウォームアップ期間中は大胆に動かしていくことがわかります。ウォームアップ開始直後はそもそもパラメータを動かす意味があまりないから?なのか0から垂直スタートさせるようです。

ウォームアップが終わると、徐々にパラメータの動かし方を繊細にしていって、その分パラメータが動きにくくなるけど、正解に近づいていくであろうという目論見の元、微調整に変えていく、というイメージだとわかりやすいかもしれません。

https://qiita.com/isaac-otao/items/6d44fdc0cfc8fed53657

5.4 Regularization

正規化について、です。

We employ three types of regularization during training:

学習時の正規化には、3種類用いた。

Residual Dropout We apply dropout [33] to the output of each sub-layer, before it is added to the sub-layer input and normalized.

図には載ってませんが、1種類目は、それぞれのMulti-Head Attentionなどのサブレイヤーの出力に対して、その出力が次のAdd & Normレイヤーに残差接続される前に、Dropoutレイヤーを入れた。

In addition, we apply dropout to the sums of the embeddings and the positional encodings in both the encoder and decoder stacks.

2種類目は、文章の単語をベクトル化したものに、位置エンコーディングを加算した出力に対して、Dropoutレイヤーを入れた。これはEncoderとDecoderの積み上げの両方に対して行った。

For the base model, we use a rate of P_{drop} = 0.1.

ベースモデルに関して言えば、Dropoutレイヤーのドロップ率は P_{drop} = 0.1 を使用した。

ドロップ率とは、過学習を防ぐために提案された手法で、ドロップ率に応じて、実際にデータをドロップさせて、失わさせて、次に渡さない、つまり忘れるような動きを行うことで、今の学習データを過学習して、過剰に適用してしまい、汎用性を失うことを防ぐ工夫です。

下記の記事はわかりやすかったです。

https://deepage.net/deep_learning/2016/10/17/deeplearning_dropout.html

Label Smoothing During training, we employed label smoothing of value \epsilon_{ls} = 0.1 [36].

学習時のLabel Smoothingは、\epsilon_{ls} = 0.1 を使用した。

これは一般的によく使われる値です。Label Smoothingとは、これも過学習を防ぐ仕組みや工夫の1つです。普通に考えると、例えば、0~9の手書き文字なんかは、どれだけ手書きの文字が汚くても一応正解がデータ上は必ずあります。でも現実世界では、実際書いた人にとっては正解は1つで、例えばそれは5かもしれないですが、見る人にとっては、3にも見えるし、2にも見える、なんてこともあります。

これに対して、Label Smoothingは、意図的に正解であるのが例えば5だとしても、その確率を100%=1.0ではなくて0.9とおいて、残った0.1の確率を均等にほかの数字である可能性としてまいておく、という考え方です。これをすると過学習が防がれ、実際の学習データにない推論時においても、汎用性をもって適用することができると経験的に知られています。

人間でいう、柔軟性、みたいなところでしょうか。

こちらの記事もわかりやすかったです。

https://qiita.com/T-STAR/items/a3bdcd1ae00150fe1402

This hurts perplexity, as the model learns to be more unsure, but improves accuracy and BLEU score.

これはモデルが曖昧さを学ぶことになり、実際、BLEUスコアは上がります。

おわり

AI界を席巻する「Transformer」を解説するシリーズ6日目は以上です。今までの章でも語られてきた内容の復習的なことも多かったですね。次回はTrainingです。

感想や要望・指摘等は、本記事へのコメントか、TwitterのリプライやDMでもお待ちしております!

https://twitter.com/hnishio0105/status/1391394602372894720?s=20

また、結構な時間を費やして書いていますので、投げ銭・サポートの程、よろしくお願いいたします!

シリーズ関連記事はこちら
https://zenn.dev/attentionplease/articles/2d4b2b55ba396e
https://zenn.dev/attentionplease/articles/c2dba490ccba3f
https://zenn.dev/attentionplease/articles/5b4133a4956578
https://zenn.dev/attentionplease/articles/5510331c45e16a
https://zenn.dev/attentionplease/articles/1a01887b783494
https://zenn.dev/attentionplease/articles/4e09c41d7a85db
https://zenn.dev/attentionplease/articles/d0d7f4e406b4ed
https://zenn.dev/attentionplease/articles/75316e7ad65cfc

【2023年5月追記】
また、Slack版ChatGPT「Q」というサービスを開発・運営しています。
こちらもぜひお試しください。
https://q-bot.suchica.com/

Discussion