ML day 2: Hugging Face course 1-1~1-3 NLP と Transformer
モチベーション
前回 Hugging Face という機械学習界隈の GitHub っぽいものを見つけた。自分が探していたものっぽさがあるのでその使い方を学ぶために、Introduction - Hugging Face Course をみてみた。
コースの構成
Hugging Faceが提供するエコシステムでNLPやってみようとコースみたいだ。エコシステムとは以下を指すみたいだが、素人なのでなんのことかわからない。
- Hugging Face Hub
- Transformers
- Datasets
- Tokenizers
- Accelerate
コースは全 12 Chapter から構成され、それぞれの Chapter は6-8時間かかると想定されているとのことなので、単純に計算すると100時間くらいはかかる。
コースの Chapter 1 ~ 4 で Transformers ライブラリーの使い方を学ぶ。モデルがどのように動作するのか、Hugging Face Hubでどう使うのか、また結果をHugging Face Hub で共有する方法を学ぶらしい。Chapter 5 ~ 8 で Datasets とTokenizersを学ぶ。これが終われば基本的なNLPの問題をとけるようになるらしい。Chapter 9 ~ 12 ではNLPの他にTransformer モデルを使う方法を学ぶ。これは、音声認識やコンピュータビジョンなど。最終的にTransformerモデルが幅広い機械学習の問題に適用可能ということがわかるらしい。
コースに必要な事前知識
- Python
- 初歩的なディープラーニングの知識 (例えば、Practical Deep Learning for Coders - Practical Deep Learning)
Pythonはいいんだけど、ディープラーニングの知識はないので、ちょっとやって無理そうだったら1冊くらい機械学習の本を読んで戻ってこよう。PyTorch や TensorFlow は知らなくてもいいけど、知っていると理解を助けるとのこと
Chapter 1-2: Natural Language Processing (NLP)
from Natural Language Processing - Hugging Face Course
What is NLP?
自然言語処理のことで機械学習ではでは以下が一般的な自然言語処理タスク。
- Classifying whole sentences
- Classifying each word in a sentence
- Generating text content
- Extracting an answer from a text
- Generating a new sentence from an input text
NLPはテキストだけでなく音声認識、コンピュータビジョン、音声の字幕(transcript)、画像の説明文(description)も含む。
Why is it challenging?
学習するために機械が分かる形で言語を表現する必要があること。
Chapter 1-3: Transformers, what can they do?
Tesing on Colab
Transformers are everywhere!
Transformer モデルはあらゆる種類の NLP タスクで使われる。 Hugging Face や Transformer モデルを使っている企業や組織(Google, Microsoft, Meta を含む)がある。それらは、Hugging Face にてモデルをエコシステムと共有してくれている。
GitHub - huggingface/transformersがそのモデルにあたり、Model Hubでは学習済みのモデルが誰でも使えるように共有されている。
Transformers are everywhere!
Transformers ライブラリの最も基本的なオブジェクトは pipeline (pipeline()
で生成)。モデル、事前処理、事後処理を接続する役割を持つ。
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
classifier("I've been waiting for a HuggingFace course my whole life.")
# Out:
# [{'label': 'POSITIVE', 'score': 0.9598047137260437}]
上の pipeline はデフォルトでは英語の感情分析用にチューニングされた事前学習モデルを選択する。classifier
オブジェクト生成時にキャッシュするため、再度実行するときはモデルはキャッシュから取得する。pipeline は便利。
Available pipelines
Pipelines で共有されている。
- feature-extraction (get the vector representation of a text)
- fill-mask
- ner (named entity recognition)
- question-answering
- sentiment-analysis
- summarization
- text-generation
- translation
- zero-shot-classification
そのうち使いながらそれぞれがどのように使えるかわかればいいと思った。いくつかの利用方法を以下に示す。
Zero-shot classification pipeline
allows you to specify which labels to use for the classification, so you don’t have to rely on the labels of the pretrained model.
from transformers import pipeline
classifier = pipeline("zero-shot-classification")
classifier(
"This is a course about the Transformers library",
candidate_labels=["education", "politics", "business"],
)
# Out:
# {'sequence': 'This is a course about the Transformers library',
# 'labels': ['education', 'business', 'politics'],
# 'scores': [0.8445963859558105, 0.111976258456707, 0.043427448719739914]}
Text generation pipeline
provide a prompt and the model will auto-complete it by generating the remaining text.
from transformers import pipeline
generator = pipeline("text-generation")
generator("In this course, we will teach you how to")
# [{'generated_text': 'In this course, we will teach you how to understand and use '
# 'data flow and data interchange when handling user data. We '
# 'will be working with one or more of the most commonly used '
# 'data flows — data flows of various types, as seen by the '
# 'HTTP'}]
Mask filling pipeline
from transformers import pipeline
unmasker = pipeline("fill-mask")
unmasker("This course will teach you all about <mask> models.", top_k=2)
# Out:
# [{'sequence': 'This course will teach you all about mathematical models.',
# 'score': 0.19619831442832947,
# 'token': 30412,
# 'token_str': ' mathematical'},
# {'sequence': 'This course will teach you all about computational models.',
# 'score': 0.04052725434303284,
# 'token': 38163,
# 'token_str': ' computational'}]
Named entity recognition pipeline
Named entity recognition (NER) is a task where the model has to find which parts of the input text correspond to entities such as persons, locations, or organizations.
from transformers import pipeline
ner = pipeline("ner", grouped_entities=True)
ner("My name is Sylvain and I work at Hugging Face in Brooklyn.")
# Out:
# [{'entity_group': 'PER', 'score': 0.99816, 'word': 'Sylvain', 'start': 11, 'end': 18},
# {'entity_group': 'ORG', 'score': 0.97960, 'word': 'Hugging Face', 'start': 33, 'end': 45},
# {'entity_group': 'LOC', 'score': 0.99321, 'word': 'Brooklyn', 'start': 49, 'end': 57}
# ]
Question answering pipeline
The question-answering pipeline answers questions using information from a given context:
from transformers import pipeline
question_answerer = pipeline("question-answering")
question_answerer(
question="Where do I work?",
context="My name is Sylvain and I work at Hugging Face in Brooklyn",
)
# Out:
# {'score': 0.6385916471481323, 'start': 33, 'end': 45, 'answer': 'Hugging Face'}
Summarization pipeline
Summarization is the task of reducing a text into a shorter text while keeping all (or most) of the important aspects referenced in the text.
from transformers import pipeline
summarizer = pipeline("summarization")
summarizer(
"""
America has changed dramatically during recent years. Not only has the number of
graduates in traditional engineering disciplines such as mechanical, civil,
electrical, chemical, and aeronautical engineering declined, but in most of
the premier American universities engineering curricula now concentrate on
and encourage largely the study of engineering science. As a result, there
are declining offerings in engineering subjects dealing with infrastructure,
the environment, and related issues, and greater concentration on high
technology subjects, largely supporting increasingly complex scientific
developments. While the latter is important, it should not be at the expense
of more traditional engineering.
Rapidly developing economies such as China and India, as well as other
industrial countries in Europe and Asia, continue to encourage and advance
the teaching of engineering. Both China and India, respectively, graduate
six and eight times as many traditional engineers as does the United States.
Other industrial countries at minimum maintain their output, while America
suffers an increasingly serious decline in the number of engineering graduates
and a lack of well-educated engineers.
"""
)
# Out:
# [{'summary_text': ' America has changed dramatically during recent years . The '
# 'number of engineering graduates in the U.S. has declined in '
# 'traditional engineering disciplines such as mechanical, civil '
# ', electrical, chemical, and aeronautical engineering . Rapidly '
# 'developing economies such as China and India, as well as other '
# 'industrial countries in Europe and Asia, continue to encourage '
# 'and advance engineering .'}]
Translation pipeline
For translation, you can use a default model if you provide a language pair in the task name (such as “translation_en_to_fr”), but the easiest way is to pick the model you want to use on the Model Hub.
from transformers import pipeline
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-fr-en")
translator("Ce cours est produit par Hugging Face.")
# Out:
# [{'translation_text': 'This course is produced by Hugging Face.'}]
The Inference API
それぞれのモデルのページに Inference を試せる機能があり、モデルの使用感をWeb上で確認できる。
The Inference API that powers the widget is also available as a paid product, which comes in handy if you need it for your workflows. See the pricing page for more details.
お金を払うとウィジェットからHugging Faceにあるモデルを使ったInferenceができるようになるっぽい。
所感
Transformers ライブラリ便利すぎる・・・GitHub - huggingface/transformersはTransformerモデルを構築だけでなく、学習済みモデルをColabから使えるので便利そう。学習済みのモデルが置いてあるModel Hubも使っていきたい。それぞれの ModelはHugging Face の Inference API を使って Web 画面から使ってみることができるので手元で色々やる前に browser上で何ができるか確かめるのが良さそう。
読んでいる書籍
以下の本の”2.3 ADALINEと学習の収束”まで読んだ。
現在地
Hugging Face はコミュニティよりはエコシステムっぽいのでそのように変更。