8/5にオライリー・ジャパンから発行された「機械学習エンジニアのためのTransformers」を一通り読み終えたので、感想や勉強になったポイントなどをまとめようと思います。
この本は、「Natural Language Processing with Transformers」が原著で日本語翻訳されたものでになります。原著の存在は元々知っていたのですが、まとまった時間が取れるタイミングで読もうと先延ばしにしているうちに日本語に翻訳されました。。。(本当にありがとうございます🙏)
原著がHugging Faceの開発者の方々によって執筆されたというだけあって、Hugging Faceのライブラリを活用したい人にとっては読んでおいて損はない内容になっていると思います。
読んだ感想について
全体の構成に関してですが、transformerモデルを活用して何かのタスクに取り組むという実用的な内容が多いと思いました。11章で構成されているのですが、1,3,11章を除いた8つの章はコードを動かしてタスクに取り組む形となっています。本の導入部分でも書かれていた気がしますが、理論は必要なところのみ説明する形となっていて数式はほとんど出てこなかったと思います。(3章でTransformerの仕組みについて扱っているのですが、数式がなくても図やコードが豊富なので理解が進みやすいと思いました)
また、Hugging Faceの開発者の方々がコードを書いているので、Hugging Faceのライブラリでこんなに簡単にできるんだ・・・と驚くことが多かったです。一番驚いたのは、pipeline()が対応しているタスクの多さで、テキスト分類とか質問応答のような一般的なタスクしか対応しているイメージがなかったのですが、’zero-shot-classification’やViTを使った’image-classification’、TAPASを使った’table-question-answering’、wav2vec 2.0を使った’automatic-speech-recognition’などマルチモーダルなTransformerモデルの活用まで対応していることがわかりました。あとは、Trainer APIだったりHugging Face Hubの活用方法なども改めて勉強することができて、より有効活用できるようになったと思います。
あと、幅広いタスクについて扱っているので、このタスクにはこのデータセット・モデルが使えるとか聞いたことはあるが詳しく知らなかった用語についても知ることができたので、知識の幅が広がったと思います。
特に勉強になった部分について
自分は、kaggleのコンペ以外でTransformerモデルに触れる機会が少ないので、以下のパートが特に勉強になりました。
5章 テキスト生成
テキスト生成モデルでテキストをデコードしていく際の手法やサンプリング方法について順番に解説されていました。手法ごとに実際の生成結果も紹介されていて、理解が深めやすかったです。
6章 要約
要約文の評価について全然知らなかったので評価指標周りが勉強になりました。あと、with tokenizer.as_target_tokenizer():
とすることでデコーダに入力するために必要なspecial tokenなどを付与することができるなど、エンコーダ・デコーダモデルを扱う際に使える機能を知ることができました。
7章 質問応答
抽出型質問応答(質問の回答を含む文書を探し、回答となる部分を抜き出す)のシステムをHaystackというライブラリを使って構築する方法を学ぶことができました。kaggleでは回答となる部分を抜き出すところだけをやっていたりするので、システム全体について理解が深まってよかったです。最後の方に回答を抽出するのではなく、系列変換モデルを用いて生成するRAGについての紹介もあり、すごく勉強になりました。
8章 Transformersの高速化
知識蒸留(Distil系)・量子化・ONNX Runtime・重みの枝刈りについて、実際にベースとなる実装から速度がどれくらい改善して精度とのトレードオフがどうなるのかがわかりやすく紹介されていました。高速化とは関係ないのですが、途中にoptunaを使ったパラメータチューニングが行われていて、Trainer APIを使っているとtrainer.hyperparameter_search
() で想像よりも遥かに簡単にできることがわかってよかったです。(学習時間が短めなコンペだったら今後はパラメータチューニングしていきたいです)
9章 ラベルのないまたは少ない状況への対応方法
zero-shot learningやfew-shot learningが有名だと思うのですが、ラベルが少しある場合はどれくらいデータ量があるとファインチューニングした方がいいのかを調べたり、分類タスクであれば文章を埋め込みにして最近傍のラベルに割り当てる方法を扱っていたりで勉強になりました。Hugging Face datasetsに実装されているFAISSインデックスの活用方法や高度な手法としてUDA,USTという手法が紹介されていました。(全然知らなかった)
10章 Transformerをゼロから学習する
大規模コーパスを用いた事前学習のやり方について勉強する機会がなかったので、章全体の内容がすごく新鮮でした。途中でtokenizerを手元のコーパスで再学習し語彙を再定義するという内容があったのですが、これは事前学習以外でもkaggleで使えそうだと思いました。(Tweet Sentiment Extractionで近いトピックがあったような・・・)
おわりに
今回は、一通り読み終えた直後の備忘録的な意味合いも込めて感想などを書いてみました。今後は、この本の内容を実際に他のタスクで試してみたりしようと思っているので、記事として紹介できればと考えています。
最後まで、ご覧いただきありがとうございました。
コメント